diff --git a/Cargo.lock b/Cargo.lock index f35f433b..96fd28f9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -159,6 +159,7 @@ dependencies = [ "nom", "pathdiff", "serde", + "serde_json", "toml", ] diff --git a/Cargo.toml b/Cargo.toml index 475cd770..74699331 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,7 +22,7 @@ clap = { version = "3.2.6", features = ["derive"] } log = "0.4.14" env_logger = "0.9.0" merge = "0.1.0" -config = { version = "0.13.0", default-features = false, features = ["toml"] } +config = { version = "0.13.0", default-features = false, features = ["toml", "json"] } serde = { version = "1.0.136", features = ["derive"] } serde_json = "1.0.79" minicbor = "0.14.1" diff --git a/assets/test.block b/assets/test.block new file mode 100644 index 00000000..cb7d22c9 --- /dev/null +++ b/assets/test.block @@ -0,0 +1 @@ +820585828f1a0063c41d1a02bf7eb85820de087ca8f2d27f45da73863b571723d859349ae259855ec319455cbc03f6f49158205dd4f2fbd7e6e351e74f78ed8da28abf42c55341c56bbe4582865df8a4b3b17f58206a1ddacbb20ea943c1acf8edb44816cee823afe749b2abdd99d6462195f42736825840185f40eab06509be9a9ba9e681c5e27f77921d0b768303bd3400d4517b52712cb38466e3bdf86e7ee2a79017378c6f6c727d293c07d79fe58bf8be521d5a7a2a58509fb367acaa76ca6fcf056bc9da177a70e889716d0a46e84ec4f03ad615d7d76a5e475617986fa62a532e3c8008246371631786be1a5905927b38cc5ea380c739db7f9e0126c06c4a1c2cd5ff832315008258400002dd30d9c778474ba398c2a03d590797938ab66d6ae830e27fa14db0bfac9ad6780bdfe5d05aa64c65ce4024a32b9e403ac593d9e304cf4e6a50a033783a9a5850d5c7d7aeb122957b4993ca62b84374f35fa4fb6e42761ecddd4cf0e2d84f21cbc6de379b8498e8069847d26f40e7d0f872c7812bb15270db7fd9013e1e5bc8607748d280711d32081bb2bb8a8ae9be0019f8d458207727cdc51bc0101a1f12f37a416e86c8ef7dcadda77bcbe3a3db121e3cbb82555820397b4da7203fdc96404046663fcd3f84279a216f2087ad6d5067cc3babfefd030619014f58406e269b0980b7f3ca7a5921af07009e72696bb78b97f68b85d7894e62b42d9b22d230c0042834a489efa8d128130e9003f99e79a1f5a58b8525349f54a9e0400606005901c0b53f9dc3e774db6ea1e6f92e18512b8bed3c91c3b25733feb4726d193d4879df0207fca886418a2905017f9c188cc374e1308940f2067fad4c4a7e9fa81a4b06a1be2717136c04c1bd46c959e07791a368d47758bf354137004c2bade771c6c2e559b45310bc4d4a7525af20a975ba73160c9cec3d4d75b8d9a61f573626307b38a76e9fee13a0bb1c57a431e84d7bc4daac38d1a7d2739145c59f9a687b27d9eaf02ea19489975de62c79d2a24f9784ad61ba70de38ae05a367462b461df71542f4c952ed348f1a7492f8478a3e14bbb0a8b19fa3514596597fe81c770f6063d52d4b80912079c1fc79e9664b9305d1bf66a2646ac710696b679753879f7e24e19812c17d272568b761ed23fc707efbf9028e611d5deda7bbe9d0699702f20e29f3d3ed84c8002c0272471847341e3d096d29e5aa6d6ab6dfb1c9f5957f9f756222648ad08bac893d884a5a6325ae62133d8d0d02f46915283dde57d95b6d4d110b8e951f9db8dfcf4924451d5af9abff8e7ea712d50ff90bd5872e46b5408cb761620225533c957ec6cbea6a2acac345555a43d71907234065870c6b5f67a382c2db6b30c4892af1a1b9e9852799487125a044d189f4ffc90588a68bbef3069fa600828258202b7477352414ffbd07435257f4f224dcc1fe68f220d8b02c6367e852994514e818578258204ddea0589dbb0bfa613c2c8fa974fba72d437cbb79f279c765a75a094462983b010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901d3cb308d19f74245025af316d57373d94d9190bf21be5681ba54fbc4b4b0264460964489556d455da1b74daf941e23863076e9358c974f0f821a001b3584a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a23a583d9021a0002afe9031a02bf9a660e80a600838258202b7477352414ffbd07435257f4f224dcc1fe68f220d8b02c6367e852994514e81282582076f2020a539401e9c8b35ee358addbb2dccb50f1e41d5be2c1e0e7e7540852f9182d8258209e8698f556c09be9c8be07ecee99bd826b450bb64d785981f029b371ae9d338918490d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901cff3844b1b5b6fb9ed88ecc135432c1983e401c73e0304612fea4be292e932e3d77310d28d0d978005b3ac5ab033e9511344ead1f042a577821a00235d7ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a07753154021a0002c825031a02bf9a680e80a40081825820ceb1cc9d9bf271bac0eb7de571bc840366b2609bc2e23473e391882c2af31c6801018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839011e210f3eb82fe023b7171dbce23cd2138aae81c96670c019fc2bcac231ac8e3fe171954c1566f6219a3c8d462cac5632f4ef0935e40fb3251a2723ee3a021a00028cad031a02bf9a34a6008182582013e11076a9ac1f5de98bf8baed4eb7782a2a765abffde4585b71a4c27e8270dc010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839014121f3897c3927db0ccce297a621dca7640fcbd226b33aab8c5689c17386dd36b7356e09eeec8175886ae8c706dad6c0cd25a27519479ad01a0409db7a021a00028f6d031a02bf9a6c0e80a4008382582048dde423e9941d554f5987f78325901256b605b8cebe4065ecb30cb560f657fe181f825820a0c4e5e14fbe48e7c13463f84fc5617f3acb320c31670c489eca90aa979599ba1835825820043f1896bbea84f30b78c959fbe1254ba4d589a206eaf716094c912701d69ad3181f018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390163470272e88607b053fcbfbb0907cd85624dfa058d9cb4ea0c1c5462200d434ed9c9761ae2afcddbc1f76fcd14418b711468955704eec4e7821a002361f3a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a09858d08021a0002c3ad031a02bf98f0a40081825820a2e41b6f29780481623fedb83a1fef83959a3031a5ffcff6a05cfa4e5ea5123c01018282583901fb437351f97724e2876d5c45e412a19b9b78ec55e188d2f3b905869a3c12e9a1f36d4daf677c1699f1107555801c1cc9069cf83a77c23f371a000f424082583901e378d427ec6f84c060117f9e88190d250102a293c776a871fb27586f73a78c20d7a13e421f84ae885a203b6ac12de3d4f49c89bad18d71c3821a02fe9092a8581c4c9f7d6c24ba8e2b12f3269ac38d706025e39a50a524afe6eaf79d95a14f5665676769656d617465303234363801581c547ceed647f57e64dc40a29b16be4f36b0d38b5aa3cd7afb286fc094a1476262486f736b791a00030d40581c5d5b205252b9f5016422d0eace869d7fd45074a4ea4b6c1dc78d1705a14e4d6f636f73736949746f3833383201581c9e3d7540365ebda2f15a55b15bda02f2ffe24ed3150a57a226714357a25243727970746f526167676965733031353934015243727970746f52616767696573303935333401581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0f41a78f581cca942cb8bb5d1ef750766ded355f320880539111f10efa2b1a478ff9a14352414705581cdc3dea5a07d4bac37ac932997ec81e0e8d7df9ac3b669d7f17097c1ba152476f6c64666973685469636b65743231323201581cf555c46bad0731d080c9381d7fff6f82839946a66bd070d185e1ea2fa14542444f47451901f4021a0002d2f9031a02bf9a34a40081825820400a7a1213d9480dccb50efcda5a2ad3307ed7958e139c11cee14081a82d92ac01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901e3baeb4c895b74dedef3ae4d01ce16a0ad2d7d89555f5c45e434f97758240e27b25f53a6b09da4ba4ab0d6c1df3aa5de0cb7ab6e2becee11821a06d86220a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a35ea1537021a0002943d031a02bf9a65a5008182582049deaa495cdf509217836a42409f73c067dafa351bbf7fededd4a11ebf4d868a000181825839011afd85b1f84fd638dacb454431ef095361939e4a97bc33ee1c422150d12961711c56c030d9d559f0ca71fd41e576b2c2a01c24a11f8867441a00c15b6c021a0002bdd5031a02bf815e05a1581de1d12961711c56c030d9d559f0ca71fd41e576b2c2a01c24a11f8867441b00000000000064b2a40081825820e07bc8d2f77eae1e7846cd64c596b39ec61c4d98e4a7b36bbdf43b2c7a7b7e0401018282583901837593c38c99b0fc87d31769a206222dec132879a98e8221e4970b69662b3b28b2c12cb56b32710a1fa7431adb36f76a1482a47859198ec6821a00169b08a1581cca3aeaa53c0b21fccf28c8c724141473d325fe9ea8d0314f7c3b4240a14f4269746c616e64733078303039393801825839015f9718cf2dd88baa62f1f5e65a1ec5fcecd939c122e481aecb69cae1e869fa33daec51e5c1d7d848b3b15363ab18aa92433e9923e99a4fcc821a010da937af581c28a9ffc30a5f4e18315fc6c5d192c349efb5b259bccb40b703999de9a14f44656570566973696f6e303835383901581c35f912bdb04c84d947ab32fcdc6dd924ce0abf8318af8f34aff01bc4a155526567696e616c64476f6c64656e5469636b65743102581c3b7311c9dafc32161be4eacc2b29f5baf92fb0c1500455be79141c04a34f445648616c6c6f7765656e31383438014f445648616c6c6f7765656e31383634014f445648616c6c6f7765656e3230323701581c4a7f6db810294738dae82fdb201230f32ac18c0640d02fa0100756c0a14b63617264696e6f3436323801581c56af1016943d18a253c7e2eff9e48dc7c39c977181b8ccb0d8b9b0b2a14b736b7964696e6f3334363101581c65c11924b9a77bc3f10c47a5dd5cd7a16c2ef95efce887ea38f42fcca65042554c4c5a7673424541525a31323836015042554c4c5a7673424541525a32393730015042554c4c5a7673424541525a32393833015042554c4c5a7673424541525a35363237015042554c4c5a7673424541525a36333631015042554c4c5a7673424541525a3734323201581c66cef027da1a22f537874f4192fc7e09189b552ae47ed4e03e27261ca1434d495501581c6901cbc9478c3bd2669565f94df757faebd4320d36f9f3d9c80f7e85a2524a756c69614265617473434e465438373439014d4a756c6961434e46543837343901581c6cf6b5cf0fefbe9e69d640d8be84912bb2c9e132671954548790bcfba14f6d65736d6572697a6572303131313901581ca0f347b21a9dacb689e5e42122ceadc28b0b215caaaa6ae83b520470a14941444156323035323301581cb9d660d6e74946fb04ae4cef4e6cb6817ebc6de2bbe679afed95566aa24c526567696e616c6434383332014b526567696e616c6439393801581cbd3602618dc1d4aec509e3532032ef204e0583ff6d5ad4ea81e96145a14b73656164696e6f3138353701581cca3aeaa53c0b21fccf28c8c724141473d325fe9ea8d0314f7c3b4240a94f4269746c616e647330783031303332014f4269746c616e647330783031303334014f4269746c616e647330783031323639014f4269746c616e647330783031333539014f4269746c616e647330783031363432014f4269746c616e647330783031373535014f4269746c616e647330783031383035014f4269746c616e647330783035393035014f4269746c616e64733078303638333101581cf3f81430a626ceec075cf71553d01a9ce3c34a4edf155af6b3d0267da1464d52534d4f4701581cfde909e751c20f82314deb637a36061d86e68d84210d6235cb05c7a1a14a45636c6970736530303401021a00034125031a02bf9a61a40081825820f564456e128aa0ea8ea45765d3f6313844b1d489339d001c304795a50b3b234c01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901c39790a276fe5a6534d96290645c163585fa8e73479ed73673da9a8ecdaf0275b70326ff213eb935c8a32de071399308718272ae85d2f7ed1a0cacd590021a00028c81031a02bf9a47a60081825820f3d8792042250885b76ab034960a7774f54f8c87e94a8c9a2c78bb6bee36a764010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839015e65c1b88ab2389b6c5b1fcb67a6454ecdc52c85e217091661463058307fb8b02269efa670354572e0497e9b6c2da76628ddb5c93ffca1df1a0390685b021a00028f6d031a02bf9a6b0e80a40087825820cd8586900af611e52a0b3b1a306475d3511af954f148216c4b4ef292bc683b0201825820fe5ff81dd87d0ba58e16e44fead0c7923865be32161de7508ff3249bdfabb38d18428258203146bf1050f972219eb362567b2aa42daa30b3bfca1a124784fbae30da3f8caf1851825820a1346b0ccfe3108bdb2b11db9db3ce84234e872b0a362ab7e0ec9054489bf58318348258201351bdd01638c7fc8b31b4c140c744399464a9313241a9d0ec00d4dab140df48008258207c6eb2d58581176673afee454c1b8a80fd0dbba591a71aa89bb459d0d1f638be00825820d59491a448c2f1d6d3ee76d3e15cada62a59c9a027254417e085128f3043387b00018282583901715c1f40f70c1cdb00208fec2e597acbd234f2acaac65a479369c2d7ebfc19e8649cdf8feca51b2ceb59b4a76a7cfbe340cfdd062f911404821a00160a5ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591ae27f66008258390193e1278c950351f3784762d492dfe9972f92aeec7901428c2768e5dfaead4dc0183f9518808ee0b932c4e6982d65789c1e3857a5c67df802821a009283e0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a00394d8d021a00031ce1031a02bf99efa400828258207bb28bd4d9f015163637768ac79b12202d8618119ed70a24c54d6e6c8614376a00825820dc822bf2f0d6ca4c587d2736da6dcafac934ea9d7bab0ba2b550b7d122ea958400018382583901735f7ce0994781ff2e0fe508ec719fa256a0d4b2b72487f3eab5e2aadab17577e6d8b11fe8818350098be9c96daa04cb8724a9cea1d323aa1a025006c88258390106628b3460652b83bd6f8780ea80a0af005b2bc2a65382f8d424c0c007231c74332ca2872e6b0cb33bd8d589c923d71c5a84458d9720a501821a00172bb5a1581c13a8b644670a6e77690dc774dcf0b00b4e2e769533cded62a9321e64a15343617264616e6f4170654c616e6431323137370182583901815f778a2ba10aa0fdc4acf1436e701f78d6f717361d4164c95dcfb77e9edebd75b1908b72519186c997cd98e6d62e5636f0e3aea1ee51401a000f4240021a000310f8031a032d5b45a40082825820101dbf7fc8dd384a9d455efdf6760c6ba762c0534456d51d1f97999e39508af400825820157ba5ae146fc3a8a08b4716f346f0eec403d901631ed160cc5bf6259d6d5e0c000183825839017ce8addc1cdf0b5c6e0d009030cb3f8379cdb5a22b6dc0c44ca0a61f10dd0fa85542c3ca4bc64efaf6caa1f0beb8443431ba91b41e0466fa1a05cfbb60825839013df451f7c0d912bf7bb773523f6bcd47e990434e03890ec1cf4509ac541014920f8188c862421c908053f1217f45c2b23c1895eea4c6be8b821a00169b08a1581c7a3b4cef5cee62f67626b0db635af0c727001841198435ba64dc627ca14f436869626964616e676f30323235370182583901815f778a2ba10aa0fdc4acf1436e701f78d6f717361d4164c95dcfb77e9edebd75b1908b72519186c997cd98e6d62e5636f0e3aea1ee51401a00231573021a0003102d031a032d5b45a60083825820396f170dd8b8fdce84ca73c7b2fbc065ae554a1d26d683166a335e47663e54ff0a8258206b7c94335f3aaba3a36ebc2fe9ab4476199776c997357c1374b6110bc2f12fae0b825820875dc3ff56435981f5fb50d0829a0ffa06f8c63fc7d6b8ff5cfc7fce734fafac120d800188825839014eb41a35dc0435d5111a69d5b2e42d34e8e8fc813e1cb8543283460d94d39a6fe536c2f673cf4860a1428d60cc4dab67c6c05dbeb8d0f9311a06516e8082581d6128bf092a2581162a40c3fc2e12450b560b77f161a4f7191496fe2b371a51199879825839018b8e9250e230f7c691c4120e58a911b179b92fde97ab828f81cdf29b5b2ee6826a9ff706f89708844a75b3c8777ceb697552d53a879217e11b000000020dc6a8a4825839014e3ad8d65952914a4ff2430c62c8bbcd4ee6a733bad003921daa6c2d29c3b13b70a932b38117c090120ac3a470e15a5c1f4f60fd8394eb1f1a0089544082583901cfb6ad65b36d8fd0925473bd3715bbae4189593e5ec191c9cfe657150e045d73930d8cebcfa372837c4414adc9b6394e92601ea14da4fd231a10bff2a282583901b00f845ed688525d2b5dcd0d47f46225ae6bb4b940959f9ed2e70c9a0e045d73930d8cebcfa372837c4414adc9b6394e92601ea14da4fd231ad64c24078258390162f794095d9f2054d5dc6e81aa01b17d67cb98525ed02e19b3a5beb60e045d73930d8cebcfa372837c4414adc9b6394e92601ea14da4fd231b000000056cf9e43382583901e7ad56642f4841fb29f2ee5984bb82936073424153fe5a074a9e37b50e045d73930d8cebcfa372837c4414adc9b6394e92601ea14da4fd231a017a08b2021a000306b5031a02bf9a6a0e80a50081825820bc3d902f91109173883a47fa1af083d71abf8ba7a1680d47c3c724fa96703c2600018182583901fecd69d4464456e84d2d4421294fd4212152470bcabda4ab666636d9534d793e7dbb6d30b3a4026bd13971f789bd964675db7fe710cc5e051b00000001a99e1ef2021a0002a389031a02bf9a49048183028200581c534d793e7dbb6d30b3a4026bd13971f789bd964675db7fe710cc5e05581cfa58244068bef886049b3e8fbba8aa39f227ce78168efdf7629111c5a50081825820ae4ec698a1d3df49dfd06f99f35ec06a235e75a66e007fe73ca36beb5bd4bb8a000181825839015d845bafcfbdbe64aafbae255d991f62c5d94025f1904e703f6a86806f1388e64fa7f667fbe6cdbdcb7025a862158035a2468bac419797831a0100bd8f021a0002a8b1031a02bf9a62048282008200581c6f1388e64fa7f667fbe6cdbdcb7025a862158035a2468bac4197978383028200581c6f1388e64fa7f667fbe6cdbdcb7025a862158035a2468bac41979783581c7f6c103302f96390d478a170fe80938b76fccd8a23490e3b6ddebcf7a5008182582054604e3e95d8c78ecc50b27c70d6f783e8f3f530f4496832da50c0a9d42493e7000181825839017320c74b40058b344240a80adb1a5bc726695196e686686acf1f74cb0637d34ee4282779ff2b793a8ec8f64128468014349813060c13fa541a06032729021a0002a8b1031a02bf9a28048282008200581c0637d34ee4282779ff2b793a8ec8f64128468014349813060c13fa5483028200581c0637d34ee4282779ff2b793a8ec8f64128468014349813060c13fa54581ca89b86373838360143aba3911eaae54bf9420868965d48d447e4510aa600898258203448c33e03e95c0230266cf3c82f8d001aa7a248a796c13c6a2d1ad7e919ad120f8258203c29f4fd989f514d82573be8f744d2845a9ab913ebb564a9e9149a370edf34b90f8258203cc450529b474827a3100f2460f1f666c5bef52e43b5ca2bf5928cdbdbc939ff0182582042e45b7a86b0cc71286c70357147345a8f970fbf91439ccd2f4c39b15c3aa49e13825820433afd623ad1b3cbc62baf039e77a27aee660af424cb6d068913c163646a33c10d8258207873ef30899aac98a8fa4200160fb69fcf7a082de04cba2b2a4a376150a061a611825820d0010e5e16b9ff8fe7cbb0ac3dc208c079feab0064cde00c2a62a9271c7530d80b825820d28a819bc76ed9c0f387656bde8df6bc88d64269530ab9bc6333a2370368497110825820ffa653c0b1983394cf34ffc3b79d93e58f17cceea90f42bff43f81685f58b901120d80019482583901dc41752e06e329996d93a929346e820fe9587c008c243aa206b1afee930e9df30b5fcf0d00d23806fa8f702174f5fed1f653812eccdc89fa1adee3913882583901fa7f71090e3a07d4d1fae500b24b773767a795bbbba99e7e6bc1e2804fa46e41a1111c816ca03188dee83445cd3b0b2fd5ab7a18367836011a60ed629082583901d9fd74baafe96cba8de55ec300dc1213d20354ef3ec71d79e3e18df26f9f78fda42367f79afe0ebd24f969b3c811b2c3efdc6e778af97d7f1a4f927bc08258390135e991bf3accac5c859f579e75e1e160fd60de5ecc773a78b6703ba235e991bf3accac5c859f579e75e1e160fd60de5ecc773a78b6703ba21a0be6cc2382583901c3178d7b7324d23aeeb430d02322eaef273e59e3287590978a76d5fdb3cd2d20cb5821c5a0999a235b7d791a489c71d571b34242cd84be6f1a1930c5cb82583901cc824e3e72e0e5cc33c1bfd9250c40567804af2e24901b5fc2f9da5ecc824e3e72e0e5cc33c1bfd9250c40567804af2e24901b5fc2f9da5e1a058b114082584c82d818584283581ccf196eaec4f2042faaa7c2ffc0abc14dd5f8f47e58938f06798daff2a101581e581c27f23dda51fdf95731df7e0d95d2af920f5032e1dd31f9e0c9f7b45d001a1e4271811a033b06c082583901666ab9ee63c25418f1324ab3412ec221ea0dab43f5df0818dda4435bb20344cce51864021e9bb891d9feb7d62412efa4781f4d59fc81c64e1a6b3a8fc082581d61ce6ec9dfc16703231d3a031ab434ebeabb20233e059f432be02ae1ad1a6411fb2082583901c5fc1c880b91f91da999048ef6eb6bf857df5459eff707d44af38e6be8314d67d705a0bb2d8f5c0a33c09eeb545966457e01f6cd098af1eb1b0000000124035310825839014c7c056f6eefd45b4c738d5892ba64ca24edaef26288bf98e0ed5cad678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421b000000011d71f4158258390163d88f4f4c9cba38690b74b46224cb8458a486b45a4567cb7586a080678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a7c2a275182583901b12a311a68a991d7b616326637701cbcf376a65b8633e24219c195a4678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a65f17dd6825839018661f44c06aa2ab954464129929ccd83a3e1d13cbca7c474f7648149678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a0f4c5b9b825839014c9873779002137fe4fb796ec329bed0df262b1b50318ea87a70a554678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a2050397c825839013f93957f85fb647a3df3cfeb1c99ff0ed2ae3f444010bd8d85a3dea7678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a0728391782583901d6fc8f070ef5d12b05e668b5ea4240f4b5f58f2f273ff8e0c6f04e13678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a04322d76825839016ea75b5bd66c8be405356f3ba2b04914fe8e9e94343001fdd635db78678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a895ac6ed82583901f6f306fb62445b92d658d0ea5ec3446a216374c501193954f3510af1678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421a80305a5a82583901b734f548921ea770edb72ca8bb7023f21cc0bb785589ace7c90cd758678509aca97249edf282cd59d7ce66bd9a5fb55e4d999e537a0e6a421b0000000175f37c14021a000427a1031a02bf9a6a0e80a400818258208a0391bd9efed3b7da0f811bc474f8c8851251cc36876bf5bb5e669924856a2801018282583901d86317c2cfa6529016ae08033690590fb798c17aacffb89ca4d94ede1c63b2abd341b89b48c89567bad1c82fddcaf6be1e19c0955c545bb91a001e84808258390144071f64b7f39af188b8a9e321bb6e72a415e72c927237457a1d6af0d503f1529613357e4e5d0abf4f5ff39da2d9d729e5c4620fde3e2ff3821a01bc20b5a8581c20ff04da680249a01e4bb70228ebc4c4207dda7305b04532c84aacf8a1524e656f6e426c6f636b73533130344333343101581c3352d182856ba195248e745843b3aec5c03c6ef1437f1c05f39c4e55a14e4e616e6f4368657373303431353801581c3ae8bd433d2ca69131d16586d03c0531528cff5c83607dac17586842a15548616c6c6f7765656e44616564616c75733037313601581c547ceed647f57e64dc40a29b16be4f36b0d38b5aa3cd7afb286fc094a1476262486f736b791a000927c0581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a45d0e6bc581cc281975562f394761771f13f599881517fa8455946e7e30454de22daa14e474f41545472696265303932353601581cd4cdb1ba9933ca9737afe8873bb6448f85aaeb8b3194b74bebd1fb8ba14a4164614567677330323501581cd894897411707efa755a76deb66d26dfd50593f2e70863e1661e98a0a14a7370616365636f696e731832021a0002d199031a02bf9a55a400838258209a9e6d7fe4b23b0cf3768a59725304765e0af6afcdd941b4eac3e14231f05d941825825820e7c0bdda04736bf3565de61923e9e13f30b2d556e527660f34f06b86b259462f183e825820c38ccc5802148d3b572dfb71761e1847efb338843b119bf5fce8077f3b09ef7d01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839019e9e32cb8b4fc2bd005d8843a208124f76e260b7955404074f8bc36786e00e48219807dbd5c0d2029cc70fb9dbb43aa2f04fc109cf62e38a821a003025f6a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0ba50b37021a0002a0f5031a02bf9a34a60082825820126d8e9824b53c330817a9324aceba3626f2926afc29c583f8855dd1be2550e1018258204eb6a6d07323150c40c4b6cfb94f41182fdaf1e4d73545dbbbd25033efacd6fc120d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390179d01a6c459ddeec7b40a5383cdf1fd56b77f5fcae5e5027cebf4561d86b83d43a98c99ab2bfcb389958fafea98702b669365e19a9ea5867821a00158fe6a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b000000029ba0fd3b021a0002afe9031a02bf9a690e80a4008282582068c016be52c8b6befe5b02ac91835d81f2e5390069a2dead116948ad8ee11b26018258200bea5f0aba9cef1b47924ce43455faf8f8e6059c08367c417e9f4a584542347201018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901e4affe361db60613a729488f380d2e1b1b0dd312720392fdde9e66798ea79f1942d134a7f68688aea411375f6076bf63e0d5f4d7093e0f0f821a0025c861a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a095b2eb7021a00029a41031a02bf9a55a40083825820b62e3ab09c2af6274cc2bb5d5e584fa18b96fcc5d53abb0f696a6743208775d40d825820615a4edfc200918c25741271535453eb47ede4c788aa13b1b6ac067ef550974f18328258206276049bffbae9ed9af11fc09d2b47dab5a1008519e039885a159fdcf2a080b01825018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901d07fad7e35f21c3479c910b92fb6d6308881f7ce14a4599533dd95e2a63c6273e634c4ba8878ada98e35b3dacaf6ca38caf89a6c3f1f7961821a002384aba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a06eb3944021a0002a0f5031a02bf9a34a40081825820b3e5ebb57c6194d498716a0b2f1520363d4f31eef13446d88441e1c54fafb4cc01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390149b2f43fc3c5e24a60d7ee12257c17a50748ccc9e568912fa2f01ff605e99e0ee67b16e8effc98c3bc081c9db0b9420bf7106b5260c3aa16821a0088c828a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03f19404021a0002943d031a02bf9a65a40082825820f10af17c942c719b8064a24368452b5ffac4cac124f36b0c42d036729c7eb01a01825820b62e3ab09c2af6274cc2bb5d5e584fa18b96fcc5d53abb0f696a6743208775d4185c018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901717eb38a9b2a76a2884c5fe3721474e3d0f4b84c9e7d9234461c077b4fbe3eb0b63a3d77ea9e12bdc187b9e9d9655ef6e24d710d5400a6d8821a0025ea69a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0ab5fe72021a00029a99031a02bf9a34a400838258204dfe7bc85936db8f12092d2cb94b31132b03475b119d89bc2774b4fb2f409101184c8258205f8005d2691009ee3a35b135115f81151b888e4398090d5abdd308c7b9ed1985185982582036daef9eea9a60b858f7da7cfa9948413604b9784eacf58de42a00b9eaf7fc1e1856018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839015e42a87507a601099d1db5ce2e3f50c37424be108f4cf9a601621746cb10085b6c72e4b22bc3ac49b337ceac3accb2c90d56c3aa815504d3821a0023847fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04850675021a0002a121031a02bf9a65a40081825820da9b354d32f702810ad0e8387ea7babb656c5c844751c44eb1b3c3f1303a53c901018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901bcf74d2e651889a0810340c99905ffc6aea73fdf77bd88576d1363b563807aecd5f9f6cb16480b0f2d2c12c9053f15451861da0db85ba82e821a0077db2fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02ae0827021a00029411031a02bf9a58a400838258208e5ca200e61b25120b743c3eff5fc5ed3d825f6ff9f2ca69eead8f8bd6186305018258206276049bffbae9ed9af11fc09d2b47dab5a1008519e039885a159fdcf2a080b0168258205d30727703c3e66a25dca2537da7739c597e8c361d5fa1c0dd17fa29447682e9182a018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839019382574e8375e8fbf59493f421365af4fd2b361c3759e1d0933cfb1325e363a23e5a1945f4b1ea6e5e8c61baa17290bb4a5060a49406f631821a002d6f14a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0f0f86ca021a0002a0c9031a02bf99faa6008282582063ab5e715219fdb2a250f2732f4634a02a2e6d66acc700aa968016dd1780d58f01825820b62e3ab09c2af6274cc2bb5d5e584fa18b96fcc5d53abb0f696a6743208775d418530d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839014e1396818bbcd84cd532ebe50951c3441a8af7171d63b9e17916d9aec8428c2022054380d6850fb7fa6321aefaee450d3effc4ef21284902821a001f83dca1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b00000002cb45df7e021a0002afe9031a02bf9a690e80a60081825820fcff7b8b9c6b4686236c07950285210c15b8ef1b2f30eef339c71faf313df079010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901923614654eecee46fce942013f6f8048a2a80f90f636af2c12185d7014a5e97eca1be8debee149dbb7d567e314dc52bdd7303c0c74ec79891a2f41a08a021a00028f6d031a02bf9a690e80a400838258202507a8fd674e2d2ddbb0703c944415b87bd5ff192e53746a40552ad9278299a018508258209de7d7fcc908f852c6692a165a4cadb7223d2297e30ffa07698037dc33d0d7661852825820c2da5aea56e6b4eee41a20c5c34d7af4cd3cc44c0009c50cb9e9dfa8b5ef44c2182f018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390148db0ac3416e4e3573810d1b49710a61788e2d7fafd5f36614368055b1bf4022d3c85780ca52a7cfc37ebde7e13bb8579552c02969ac2b6b821a0023847fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a06c2fd1e021a0002a121031a02bf9a65a6008282582078c2a1b83ef090cf636d4c07f36781ebff236065fbbe78d137fa8a7c78c5bd7500825820ccaf7e083c0c3e428657b1087fabad47223326edb365acaf1436a956baaa23aa010d800182825839012b6d11d6c2690ea5ba6dbe490019547c21ae7a1fafbca3fc621c5e3798189a8d5f3575e3b662c44eb3fae4be426e5a8b2940099a1b1824cb821a0016e360a1581c4cb48d60d1f7823d1307c61b9ecf472ff78cf22d1ccc5786d59461f8a1474144414d4f4f4e1967bb82583901f835598e3b217b76c6e350b0168e397a8e1ccb3967922dedfb6ade17d315ddff5a83e9974f2546553fe72434b8e4fc408275b9bd82a3556e821a0031c4eda1581c4cb48d60d1f7823d1307c61b9ecf472ff78cf22d1ccc5786d59461f8a1474144414d4f4f4e1a272f03ea021a0002bda9031a02bf9a630e80a40081825820c91f073eca7123d2c47bff88f37db389fd07a2f5538a20524c159ac993af9bd701018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390191f462819589692957cb110c3be84aa47113edd2100ee298bd8dcdda6364618a6450e5b288515772db86a4d201f73e36db7a55a780d19f461a05717a30021a00029534031a02bf8c55a400838258201bb5ac4717dde716da8cfb3ab47bad8c59477abd3d3b929963792bfcef96e9ed184c82582000700259eafec3e764c5a452d30d442d1be156831451b28fc01580fe2a8bd4791830825820d57a6eddbe03f5e30ff6a793458af81e0093146c55ee1ac5dd1be6df0229220e1828018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901da6c51f355af687ee9807f423932d2fafc70aa6c5313e601d1bd89dd76794387de432d1911a0c8d60eb25b872cd80a8855107cf3e79110b0821a0023734fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a07788b0c021a0002b251031a02bf9a59a400838258206d67afac23599a986c7201ab2373aacb0822c86ae357294628c521c2481bfe1718258258208ab073ced4226133b4f7948a2dba6b05dc274b79b0be8b579a92f6baa3a4405218498258206e60dfdc6052ce859bb23eadb08a4ce2a4ce450153c65cd03f690decb4fd31c5185e018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901060bafd88341b97247640b7c5d5067b3015fdffb23edb259e6efb0141c38bdc1da39e09651cac016e41781d63936267bf4d23c3b5e2cd817821a0023847fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0c18a516021a0002a121031a02bf9a34a4008182582065f53dc93468fd90277daafaaa9f3e286b5b764e4ca18b066cff573815e0087b01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390180c60fe28b9027065bc72e572e26a7960fc9f291b1ff1d9fff54e9d71299301eac2d02c08eb89f4ce19a0db56f786da6ebba2e712ac209af821a498c71faa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a370c0e68021a00029411031a02bf9a04a40081825820d100df0ce02c84e8de765e72029a4576a424e784aadc319eeb00dc268787465b010182825839013378e37481ca8dff7022f55b7b62171c1a33111679d9fc12a5954796a9509596a90dedd25945a35943c447eec3d32b93d0259c6429901c121a001e848082583901ce98d2b2f1886c17d614f22ef0bbd5c67d2fba0591300e711f4286187fd0df9c933f23e9f013d40d92b785b56657c2c4cc8e545f95b081831a003db354021a00029151031a02bf9a22a60081825820f44ba3077e0c03db94a52fc92f2fc4beba032ab66e6e03181e1f0b94e7353fef010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901b008addb6afb29b09e290d8db9b00bf2032dd6d9e1fb7e6b9f0a52fe017a27749ff1f33158aae748fe55aad50fdae9e68e2e72c4dd0476641a3a35dae2021a00028f6d031a02bf9a7a0e80a40081825820f796f912ff4e0c69d0c2f93e67ad157f4abf1b7f2655a0cde9a0d840934f5e69000181825839013816f8364082ad014c2a517c8aad918d39e5248527e919fca18c69b67f642e2b61e75b0ce99de615cc83790e7e99c23147abe1ca77091fd11a0094f6ed021a00028625031a02bf9a4aa40083825820972ae47dda017cffa0167424c43baeb231001c759af125cdc2c2be507989e891181e8258205ade0ec96ec99e07654ca67831055ac92420e4b7d589bbcd62a2a98c741f595f028258201aba398f4ddbe16350fc7c8b27d36692e21de3f59ec981f4892980b4260356201829018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901beac3975ca8057ec3006589865f552d4797ea74e63890b01c6dfbfba791ce0dc63cca9737e5f9d0c852688317f616f942259c5e64d4b27fa821a002384aba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a10b7d65e021a0002a0f5031a02bf9a34a60082825820272121b3d137440c2a1d431944d549446b9f3e2938da32b514b1084eb06296df018258202b7477352414ffbd07435257f4f224dcc1fe68f220d8b02c6367e852994514e818440d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390155e2811f839b7da499261c95540e02cbb24f57f80b32124e7152467375e80cdf7706046555504298455e01c9b7cab44a7e8cba7be71cc0b3821a001b3584a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a2465b826021a0002afe9031a02bf9a7c0e80a4008282582005a944d264bec15e42ac8ab5d05eb9234f2e9ea72874811bed60270c9b87d4bb018258202f79bd538f7a11bd4fd50b1fbb143368168adb51ee6cb4de581d1685d31cd34900018282583901d587693bf8af1d9f843e0dfd437d228725d4892343449abcd2057de252f453b44644fff139d203bb2f0d18870c76c4c7a02f8a5dcce336711a001e84808258390105587fed49ea57c39758dd562fdfcc096d974eb7124526758336df52289cbe814433e577a20acad253da2e8ba13a5c8587471718542a30f8821a0055dc17a1581c4344643837cc686f3123d0203c768f758e1c50a0d210bc67d96dad56a14a496e7465726265696e6701021a0002b099031a02bf9994a60081825820babdd38f9b79f388231490c5aac3e7b41b7b4e0fd48e081fcac1de387425d320010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901607a1171111fc818f73612c0b1482c61c2283e1c914096b3b8e94a3f10149af36b7c60b2fcca81f36e12bc1d74d10ad8a77e86de935e1fe41a002a093a021a00028f6d031a02bf9a7d0e80a50081825820037ba13c9b629e60704adbdcae3090110fd9b65d08988af7a92f48644b50e548000181825839017de8cb1c06a4708cb91410236d214da878bb07493b774dfdf4b38fb5fb02bb238fb075211a83e83311b3d097ebce26e44a07fc9b7a4e06cf1a033c4df3021a00060d9c031a02bf9a7605a1581de1fb02bb238fb075211a83e83311b3d097ebce26e44a07fc9b7a4e06cf00a4008382582093e5ed7d5977668472c4ffc6c231a782662757a103aee96740fd36f47b7cfdeb183e82582099333c414873914a3a85e5e7d58015fd22b08fef23d23bfa0b1edf76551b70bd03825820abd0071106ccf888c50041dad20b6e8d671a83516b119bb1eaa676679f00f74c00018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901fcb4d7b490ceac8fbd7310c059b3f0af1694692ac611e580b42d67c6cb6f8cdc579c2b2e471a2b8c67923243e60faed48965471d4f02e88b821a0023624ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0fc8fc3f021a0002c355031a02bf9941a40083825820661a9f29d9dc6bc4fbc87916ca0066ac168ac43fb684ebf6747aa8f664244f9118388258201cdc58959c5054ba4302f5c3247a1a7b8b145cffe0f94dc8239e23fbfda66813185982582090f997f6e1a5f0333360140fac4a4cbb3db63f485da6944dd5c1933894ac737d14018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901bc97cf5b73220085221ab8d48a00508a823d8122a94e768cc2084f4320de669fb2ef0c096a2fc7a1aeb3a1a086c55e356253ce6eb32cd667821a002384d7a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a06856c5d021a0002a0c9031a02bf9a27a600838258204a8450fc0da0f7ea9c176decef030c18ce6dffbf7f545c30cc8d5c1fe50b7103068258204eef12793a22ced9d77c5e023fda62dc374c3129bc28f0b2e7823f675056b216185e825820bf2bfe4ccb357887f159353cde0a23366db0801671df1bef3b8cd4e40fe19aaa0c0d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839011f5a59cf1bcee6ee69a3c7ab5c91f5a6558d3d8ad36a012aac65d4ee275f3f17ddc08a6ff8d6790da6fdeb302e301ab48e3022a8227bc421821a00235d7ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a08bc9349021a0002c825031a02bf9a7f0e80a50081825820f6e00378edb98ffe4926a6a23b7df2a51f0d2f352a8dd7dc3be51c1fdcd97cea01018282583901373b96400a8873c7f6e4b7720ac5c7740cb5c8b1b3360c8621b901d9373b96400a8873c7f6e4b7720ac5c7740cb5c8b1b3360c8621b901d91a000f424082583901373b96400a8873c7f6e4b7720ac5c7740cb5c8b1b3360c8621b901d9373b96400a8873c7f6e4b7720ac5c7740cb5c8b1b3360c8621b901d91a3b8daf1c021a0003595c031a05f5e10005a1581de1373b96400a8873c7f6e4b7720ac5c7740cb5c8b1b3360c8621b901d91a005e9e0ca6008282582041dbeb6052036f077b940e0bd060ee189cd2c7faf4e2a594e6c7333bd9bd8cc601825820c78f7f1b44b6e5a997f2a1d5b8662f20cf7fc765e3efa0f30c193309738f312c010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839012b90f2e13d833ff60b60f9b7c54791813215b1785403d9cb06e0aad3f0c7e94181652378b03aef71e4b42d325e32ddfe1e111c36a0f249b9821a001988c3a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a396d841f021a0002afe9031a02bf9a810e80a400828258206bba7c7c4d7fea41f4c910724c819446c39eb48e5a6e7f02a5af5c9c774709e501825820eb4da448fc00f12f085042dfbca697f3526d1ef313063c573d55c5788f862c0e1861018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901eb0c5d4906d1817d9b5398789ed2b94e5890684a4746d3e5687c43c7700d3d7fc137bd10544bfcecee1230bd44c86ab4e9a0525992b96b40821a0025ea3da1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a2bd37d39021a00029a99031a02bf9a65a400828258203500f6320e446435e3c5a72eede0e95a0f2f54e1863ed306cf4bf1c0748c581f0f8258202c8e634bcdc49bef5c57f0a003fb9e092b028bb2c22434e95b9157f89511638101018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901cf1acf339943e35793ee64e0490f45ad4ee0d3ff9e4ad06adec8287179da27ea66c4422a6ea3426868b12521674ca95965da2044b19eac55821a00285d0ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a16c6fd32021a00029a6d031a02bf9a76a6008182582035ef0c94d90d19521ab814a2d9abe75523da6997ebd901720e2067c9fb545d7d010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901a55e0742854e90e3700a5a571ef088f7eeabc6b77cbd4d645b616fcf292b193fa0c2eef5d50f73c452ac4063003b1083237e3a4d224088ac1a06294cda021a00028f6d031a02bf9a7e0e80a30081825820d6f7b2990a190f75b1a935b81b997f6326bcfbd7c447fd75ce5981ccad70a04e010182825839016fbfdd1b4fe24f4f5f19c3a2a6f57459765e5ca4c87179c09ffe27929b1448b7e751ee5ae30d45e121d540d8d10d0f90c7b78bc74ea7e4321a00a7d8c082583901279538fa3e8768ad07280b1e95bb28c3f0fd5989f09f0651fc5d26959f9c232194a58b6275b4f8977b4e69a780b07f3dc3499c8223f7cd56821a04d00b08a5581c01d63b5dc783794a49d8369ec754306660c6ef1c18310c1ceb350b28ac4c43617264656e69616e383133014d43617264656e69616e32303633014d43617264656e69616e32313130014d43617264656e69616e32333633014d43617264656e69616e33333633014d43617264656e69616e33333634014d43617264656e69616e35313137014d43617264656e69616e36313532014d43617264656e69616e36353134014d43617264656e69616e39333736014d43617264656e69616e39353530014d43617264656e69616e3939353901581c22b38c9d58710cdddf0205731dc67c916f6737e5e8f99a90bd9213eea84b41444150554e4b31393938014b41444150554e4b32323139014b41444150554e4b34393635014b41444150554e4b35323231014b41444150554e4b37333139014b41444150554e4b39303332014b41444150554e4b39303334014b41444150554e4b3935313701581c3d41ef39b9f7cc5b10e5a963ab6b10ba429bffbac2166a5584b0bcd3a14b41646150756e6b3139373001581c9adf6f57e659452d244d65ea3580316c9886d5270ee15f61610b4fe1a24e43617264616e6f546f61647a3234014f43617264616e6f546f61647a38343501581caa90884d0b792120c8a3ce4be4689e1e4eb6e004bf4751101509fc15a44e5075737379476c616d3032343034014e5075737379476c616d3035383432014e5075737379476c616d3036333337014e5075737379476c616d303737363001021a0002eefda400818258201ddc2838143fcdec403388701560e5eebbc2a5d1f4b3387fc0c2ef6c705a004001018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901ecb5f0a3035fbdedd03c3b23fea9d647a16de386a04bfb7eeb5fe1f47439817787068e0585fe516d57cc57241d4627907acc79ca665acaf21a181e78d4021a00028c81031a02bf9a63a400838258208950d7190bd0fc6e87bee4c67d75985a4258759f414b66e534de540470bc31d61848825820ce0d79b8ceec07d8569207bf624f8fff2e4727049e76dea5d7292e8d204c15e4186282582088d5aeb2b9740dbe5eb7bc6cf48580b862ffe13f462d616f2c3655ec30790c7201018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901fc2b5147da9909018f91813f246fc3b9d5a2b99eb5e6e5b465777e04e1f9ed8a763c2a061843ff8d6c11c5807b9a890916536829310b8c24821a003025caa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0ca36db4021a0002a0f5031a02bf9a76a4008182582022d3a882ecd5cdaaa680a48c7ea779826604fed11723c291370059e160f9d2f300018282584c82d818584283581cda581707c400dde78d916d70c08013d0a8c4cf6e19b396bf15dcbd90a101581e581cb54b464472395612004e1602e8e71f1420b6e1421f39fd8a369d25a3001a087623a71a001a3b0c82581d6179e67550b2ff311da1883ad0ccc6fb2bb7c75e5489acff735fcc68781a03eda6a1021a00029cd5031a02bf8c66a600818258209feaece7f19370cd5aba91264139fc3e3d98053063742ba6b1006aeb82bb7b53010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901d008890051faaf2cc3612099a5448e042e910869da0bc05ecb7a673ff06ae3c84e9f0b1ec9dfa1d1c6cd43b153e302b1824a285b543b76461b00000015ecb5eb52021a00028f6d031a02bf9a870e80a400838258201b02880f1f171a0d788eb5840299cdb600266c778f815631cb37285726119a4a18508258205b5d3bf4016abe953c9ae5d4a236ee183f1bba994f490d0ebfbea3175033b511182d8258204eb6a6d07323150c40c4b6cfb94f41182fdaf1e4d73545dbbbd25033efacd6fc1836018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901e3baeb4c895b74dedef3ae4d01ce16a0ad2d7d89555f5c45e434f97758240e27b25f53a6b09da4ba4ab0d6c1df3aa5de0cb7ab6e2becee11821a003a67dfa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a057bf977021a0002a121031a02bf9a76a40082825820137865e9f6106de141e5ef0af0539227052018673b4f159007ea7cf84b2c07ab01825820d6de1832a0949316a740f917e40dafb4b023120191350cbc84e5d600f5b55b9d01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390180ce0afaafa45a3c103ca47e2c7d0812a2a40a98b8a240b3e8b7901cf9294d0102be1112a55e94aa071e5a6fd67004de53ede0ea6d7c9894821a001fbd48a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a2d948860021a0002ab9d031a02bf9a40a4008282582094af3f86d3d3a1d5ba49783e1733ef27e009002119b0b56f825ee79456bb81350082582094af3f86d3d3a1d5ba49783e1733ef27e009002119b0b56f825ee79456bb813501018282581d61cd40ac69f01a94806afd16c5052adcbed0d2af6998a16c1d5d6f871b1a05f5e10082583901fefc8f5aa3ff23095683b1ed35eaf73c72a634b61fd4d5a3a2e316dcfefc8f5aa3ff23095683b1ed35eaf73c72a634b61fd4d5a3a2e316dc1a0c3d973e021a00036be6031a05f5e100a400838258200e787bf75f0f6757a4a0e5633401da2752fafb72e13bff8babca147984ba05841846825820a677522ecb51390168f2b9d2525ad265dfb09124d1d5e5df2aa23e71689ccdfb018258201b05dd7a98268cf0dbaaa48fb647459804b3deaf962591a4347de90ab3c9491a01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901c4bcd3184fbceae99ae95f26e4c801435e61b6bdb667356970787dd329b557f3e85f1aa9b84f5f3faa8a7b76a8d44a3fa653063b620635fb821a004e4c31a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b00000003521fafd1021a0002a179031a02bf9a76a4008282582060a5944ea2263025f9077845f57a434f341dfcfed9f4c861b6f2728be2de7cbd0182582097c1c52ffb70ab5688ec497c63b1b57d138bd2bec96dcf2fcf6a01b193ba6ffb01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901ba917ca4951cd98a767f6de57dc9eca98b66ac24faec4262df8dd30997e12615afa12073bd9bf77afe61cfac6bd11130567bce69152bc051821a01c09b7fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0d961cfa021a0002ab9d031a02bf9a4ca3009f825820015753055eb2885a1e06a703f4255d60055fa736be4597a971d1607b70f71e320082582003032a4dca083e2c7d05d1150fd03346970b1d2f8abf73101743bea80a1de62f008258200322f11f1906d70b96f4c411a4a67e6187f8d66985866a6bcc26832ecab7df420082582007ae69b9c4fda7790a91484be8362bb66960ffc5246a2673b947c4b85802de24008258200e0163deb99ed2fd4c4208bcaccef21a3a6b0eb6a3ca54352faa8d39cc39a92e0082582012fa29adbd7c57cbab7bbfa472e8a9f92ca898f73f9bf9507e3759b0549fda2001825820190f515a6b8a2541102bb2d4c51ee8df21462b529e267db093a489dd5ee9bb9800825820191f527e052e40c46090f7330e9a388303e2f350d59f8b640af09f36892499c1008258201acb07490161501dbfd26b56881622258597901bffc07e94729cec522a60d320008258201c5d6048ebf0f70b9d8f37b2bea62130afa2f109b5d3f06a83e65d81720b4fd4008258201eae472f0ec34cb71c7d40a3c76fed0e4c9c7632235c237ed9dc6df3f25ca595008258201f4657ebeb03cc3cc4be1fd4d495a0bdcd68b88caf7b61a8d37196f7f16eeec3008258202477148e914233dd7f6807449db12dc7975db7cffc21874bce4f35277223740500825820261042c71ba43a6b20d4b99ddab4befd34b88ed162dc543309b01108215defff008258202691bb2a27c2741a9f06c893a8003187516e5b0bf76f42bd24b954be07800a53008258202c47e378cca70a7a58c4b252e42e2a831184cf9d5b27bc01f8204cdc6c7ac76d008258202f0a762275285867b64d29e68ce3ea6b1f05bb4295faf37a62616daf150477970082582030fdf60d244b877a190ecc3a3b745a7d9d67a17037a9a911216549080bf61919008258203132f16330750de117d796b3be8655e584bde7d3c38590a17c7315a75b4551e100825820333327bde3cab5d24ccaff06b3d01531aba21c5a7f342335fe3cd054260e3b1b0082582035362c378c2c0d39eaa533caebee416435a83cd1d45c7332edeb8d21deb91bfc00825820375d41c1dd55599cbca7146ea3755bba79097ef7853a6695e599c6645fa08d13008258203c0c15ae180bfff490793e506bb867366ce47db17c352da83d88a415a89ea9a9008258203dd9d0e9e76745b2732b5072bf5d136686a10e5b5bc5da75b0dd3b0316627e73008258203f639ab1824914c3d6fbbe91e06bdf8fddf5ce5210bbf40182b82ec21b1e43de00825820417aab61b39dc4e44ba953e061dd9ea4cac4d686d1d8f5fba8d3dd7fae92245700825820431c94f45ec89aa16476bf22aa9d792530283b2fbca9c603d3bc8af128d6785100825820471d11f9d120bcf9b1d14ea155c80a3e73e64030c8b956d5904326d5e7363a1d008258204b95da53b4af6cf96d52c061226e12b9030fcc2804c8555de1c7419d4bdbbebc008258204c11f93392a85bb4c0a7e64fd6fd673b00493413639b418d51eb06f30d74e912008258204eb6a6d07323150c40c4b6cfb94f41182fdaf1e4d73545dbbbd25033efacd6fc186182582051ee7a855b082ef1e8614242a3a4bf65c7af5ef6630ebe42700066dc55ba691300825820556f5d288a60be5e23e43ddef9b716716c86ea6a23b01446491913700ae122ee00825820571b73dc279e64fe0668d5b891590034051db75f33281dacb0ba4d242cd0e3b90082582057965c33bab78fbafc7ec3b878815112a2b4013dbb509f55a8d00748c5e759550082582063aa344960a05c8a21c2f309a7ba22db384b4389464de247e70b3d5d3e7be78b00825820651b97c5aadc9ae3e4e778c1aca23c218670a3356f56a3fb1a36b34eb809415d0082582066ccff3013d133fd57fb022e0c032c8f78dc0614a3b1530e1573c31d219b06220082582066ecf04019ceb40f5439fac3ec6b67a156e9fee069f26aa530c7c1de84c4b94d0082582073f650acefd560f33138454717d1d7e71ea64cc1d27da087195055f6ed3bc645008258207856c13bc048b5f8f830f1d1c6201f1d630fe74b8f8f8b6ad8cb884747a21fec008258207a57165288d7db1a160b68426edb825310ef1b4a8d5faf27be171967d30db1dc008258207c806776c79ea1ee93fee48f2e3d891badaff184bc2d5f8518f0c9ab5ef6dcd0008258207c851d731b014f964a8f64f1fef3456dc9d8097e672bd443e44eaffa5a28b1d3008258207d81866978f1680ea69be752a0878bf01a2636f49fe19a1919675c81b46be3d0008258207d85d577227c7e8bf5f775767e9c7b1635269825030c54d17030bdab58891da6008258207d93db0c6dc9b924fb4c4fcec8f7e574096ef42e75f69179ac8d10f4fc853599008258207dc7e9d7a4f9f876e4888ccbb663cf03636619374866617e0c9499553dbd144000825820825d9f9b19ab7d8160bbadf5ec74901329773ae4f08d432c3088dbd94faa20e70082582083724b594788a4a3858122b13cacc6391f98bceddea9d6084557f145e8c0bef700825820865b4e8d69160f0b188b0e36f554fc811d235a3163b95cb8506ae5680d92b0c70082582087f8e9dea6d64a7d069a5431d007bbf498476cf79697d60afed76254430e0fb6008258208a8b9b02b6108756d82778edef080e8c12d9331595385c79827690a81388d16e0082582091a1c2c9e69b0bd258700139c9fb06bc5a494c20248fa9a301318d947b402c0f0082582094149af15dd5f2848d65ad2bbc73edb74d0e64309cabe81f4389a4a652e21ce80082582098a8c8a60816c499b75e2ec0b93e0640ba74cee43f60420ecdb0546bd8fc4096008258209910a5bc99ec102d335ebcb558f887420c3f8ffcf5c5daf8c0faf394596845f0008258209a5a22c2f5a793f3708ff75a8c2ac5886d1544d571711096d21dea5f5a57dbf700825820a10264090eebfb095c3f62a525bf2bd9a38297d7a1af491a9a26f9ae705d237200825820a2d77484d8a524ad39706f5cdaaaa359f573bab92121a8d4e82a7bc34b62f77200825820a2feaa20597e9352459c29877cff36a7afea0a22f0e32a739d9d5b22b1a8890800825820a78d5913d147fbeae66d7765c809869d3074db6cd316b79f47b5e4384d2ff60b00825820a7dff5676e8995ffac025745638193c74787c02c44d13d0fbefe7b81e2351a3000825820a852840d7006629524f4c9c5cc82d3022b208cc7189f461657e77c33cc299c6500825820ac765de2f9625477b9e761c07756d2e58e7bafc6452eff0939b27604a1b9b51f00825820b0405dba2a26d0f5ff2fcd0589ccd077acf51496bc39e055e89315f6a6f929c100825820b0f61019b6920d6647dc461c75244db6ca83a52a94c7ca9649341b89ecc19e5500825820b3df2b23c009a072eb07ae0820a07c15d1476ecc577248ff7594dd60288d000500825820b4b60f6720e007061e34c3bd59097cad9101c8dbfe89e3e90e4c9744d4920e7600825820b53608ea8b3d87e931d7e706e51eb16f5077ec3c9019588e0d1312e72e1a961300825820b980b0c5e7a44bb687176d32e5d53c3ed9ce84f6c0f8c3374737ebd14c027cd400825820bb37245b34e4a1fcd9c7e6324cc327b38f56ee542f88dbbfaa93f65dccc140a500825820bf6393896f408268ac0939ce2ec0aa5abf53dd5580db093a294b1c52831f0bd200825820c143537b0d268ab42dd9568a7b4977326cbb18c3c4c5923b250964e34436d08400825820c38f5882f0decd3a025d4fda90b94dd10dad9c46aa5bc726a3c0dd9567804d1f00825820c49bc1a95759ef45e1e2981d3ed277a81e726ea754777d1784425db89676edac00825820c6f5fc6d96804e1b3d436c6637ce36616a041ef917adf349cda36898dd0b7c0f00825820c98b6c9ec93fc9da44729829511c88a357309a966162687fad9dab9cb672e56a00825820cf4cb3dafd4d6a72f6e517a9ae6cfe35fd7d6fa520248039339f1bf011dd647700825820cfcb5eb36c88995aa81ee4b5a6a106945341609b02c0524c338cf90c72ad525c00825820d3482a6a49817a338331cc01b4b766130f8c14a662f5188b2277d3ac1e08044000825820d402fb9fe5de1636fe8dd47dae4aac8dfc76aad68fb80784460f2d420f79c8a700825820d610ffc960d6e6f70d23c8869e825241eeb8cab07586917686c5eaba8a17b47100825820d85f92a32319b354ccbe1111a9ceb2e0eece58e489f1208cf30ea03b6ee3179000825820da73bea4cf04c2f67b88a058c11399cd6929504e2c5032921754596ecdddbf3900825820dcd0a560a8e5acb5656ca2fb6db658a7696ca3da9b74b789ae6e4a61d6f1ed2300825820dd52718dc37a2c816f64db4d2c2662a1553c9165f63bf7013a5fbf3b4c37285f00825820de4b92391f7e738ecaa0b1a93e642c70e910220c646e62094420a77a2a48ed1c00825820deb3f80b03d6c09b34ea0f85a9483458620b2d366224f7b2da79a15e48fbc9f400825820e06a64f50fc5d39d1635a01cc99ed698d46d284a1b6d36dbd82479171021f37300825820e2506078a33f9725138b9a0fc46228e20870065cc70acafd401be04ae16a378c00825820e379a13b63758c905acbef6f396d2ed7a8d2ffa306d1e1dd3f4ad9c8f4aef37700825820e38f89b55bef1fb490aa9b1b3a54b569cd32087a87224bcbe22998080657a42b00825820e3f05ac4eace0bc382905648a0582942aca59bbc6aa8bfaf677795f97194c16d00825820e734b3d35ec51cbd47b6418f410d6379dd533ec69a4df3b5bd559db0f1c0035c00825820e76764d5c1d2202c8ae7db4f917ce1c1e050375cf3a7ea6b89fe950921ebefb200825820e8daee42a804ea7cdfdc1006d4fd26047ad80090e37fe79a64ddd695146e3a6000825820ea556744168e8ecf82892843034a6f71190674e38b814cbd0d2c7c2de0b6760200825820ed6c21913d05e19e27771fb6e64411835c3d52d117dfdef7ee937ae18c71e79d00825820ee8e749cb99381e3a046fcec6f16611210911dacd44314bbc45f90a17e8ac85c00825820f24e263b79773c6b0a0fab8b09cafed3e0fc3c60bb53a2318bc348ade923a13700825820f733245009777c9ec89e8cbbcf727708890c0f5634530fefd64e0c4c6c2f29d500825820f73c939f4a6257ee5440c0a2d095dfa38ae0da559b6bbc7be7b517be7152dcbd00825820f857079a9dc8166d448711ac8f359a2ff10df5e2faeb5662cf29075a7e83654800825820f91029ebc12e68b53c9eb767513729532e6b7e616d984e24a23bf1843fdedaa900825820fd6d35cf99f8ab3b54a0ba2b1160ca3e9098a442b8261fc9cd8bff01690cfcac00ff019f82583901531f9b3315f5fb065c24f80259dcc379cdc343e9a9c79dcf9889ed36b79a858ba931bcea963087c7e64cfb5010f1292afa150d75f4f143e7821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0271a0bb825839015b49137d9381c83d83df89cf4e470371754e8040fb2759002570df6ed66ed1da1a5e784481ee8e969206a97741c4f496f2c05836c093e42a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a067099d782583901478ac8c521b2b2c3c1ec21eccaa4985fb154ccd5c5ec596bbb020a05619b5d68a1ed18eaa4924403e503219bb632a5f7781427aea95a3c20821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02b70ad2825839015029ac650919080c329a65cc009cdfe75929aa9bd88ba0f942e6d3b7a5497a54446a034f39cd816173face495d1e34a514e4eccdca8a069c821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a011a51f78258390120509766d7a9efc49b31147c958d68914a6612d2451b76656194643ae6efd88af3c446a9f0748ecd99b272093ead79a14aa5c03aade926a7821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02a6e48182583901bcb733e2d98399abe3fdc35968c700df6a529186769c74577147d069c26b48eb17cf4e6de5e23fc359379f929339951581403d7e686701ae821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a025702708258390177f626f60e70349e7a42442a68bce95827b209384f10d91cb300fdc8bd509d2b4873d6fc93c8dccb3129a378406f0c1acb0b54da36579ade821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a036db82282581d61d9ff213627190f48d05a099dab7aa5decff4560aa76ed2a3c20eb77a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0321fc938258390142038f251f29f66fa3fa0364590d758960717c1179a686555d88c3c34fe36c0093b45928481fc808502f17e2a400535bf504aef5328deac2821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04a035008258390147fb21fcb89ece5fad3039c61a046415d0affdfa079537604cadc9cc6dcf9925a0f9526f09df193b52794ff90e6a498dc3dcac4c23188704821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0273e63b82583901f3d7813ab16e1b44d1e6007994acd2cb7816171798cc24af3b220a9f2dae917c0c5ebd13a5a0cfb492828cf3621456b00f239dc4e89ad2c8821a005b8d80a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a07f9e1258258390186d1b4a6708d00c099bdc46740bdb41fabcb5bef4c1113e2149b2ab275e80cdf7706046555504298455e01c9b7cab44a7e8cba7be71cc0b3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0284ac47825839016154c08c409000494b021a369c77e49ceff5e71ea213323d42b97031878e101a9f847c8a2ac42ec2fe3d37264a6ceb7d511bb1ec1a96947a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03a6f1e782583901aa89d1d489fd11c0767ec2c4309071c94e4b351f0474b88deab09a111aa2312880a23fcbcd2d24537eef4a8ac1d14daf786ce3538ce9d6f3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0383edd3825839016f33dc85bc5dad5940f7593363a5be97d49a88be3bac8fe057707e1492e932e3d77310d28d0d978005b3ac5ab033e9511344ead1f042a577821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02e44aff825839018454af02ec84d6fbf2fcc90b2f3acd7bf3283f54259ef03f898fcca99d2d5795fa980ebbdc50eeb188184ebc78b9fca1f7c70f81e5438405821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0314d34f825839014e705a92c1e4d8b94db732d2418220837214498b1390051eff608a58eb1f3b3a78a23723029ab21dd1290b92545b56ee0531f4874c69a346821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02a1562e825839010e531ebec2385945da7256ce3e541a84f1263579a853d742016cdfe48bbac7bb50ba8bcc9dc4688967042e460994c446963072f5dfa8eae3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03a9820d825839015592d8513e55ab5d81c04eb7c167a7cb07d25d6bc518649ce2ec00bd26d2fb8d5a43f59c484dbeb04fd387860a4d63fc7d82a50a0b700f0a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02b39439825839015bdb3b078991c13d773eef6737aef0eb1da4cb985d739b0d1f26179011856df7f4314ce63bffdd5eddd905b04eef00b310f2fe2bdb50e4b2821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a024e5eec8258390124301a4a06b5e81354a72d0fcd65d98cb30fe9b60dbaf4c8396f83354889243d824b586a094d86faadf57fe3a23b41a253d64eceeb46de2f821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02f4d04e82583901b5b1a4d03bbc6cba9255d09d654d276b5a01883da7b251d1f96be559ee52a131864b9975602c9037c1400aa89f22d0b0b782c8830efbf949821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04c9a4c3825839017c61512a088cd4fc9d319c0223b79afbbdc1d9f9494476092649d3bb44366cd4d6f906cbf8f70f13acdbf3cad92a7a3e688a62189b1d1d4e821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0b4ad0ae82583901d8fdbb09a4faf391a2b6fbf6102d199e41f23c60cc4ce6ed06142f84b9240d997a87b9c66aac9b979be09ec68430988d3790382032bf5f04821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0753cfe78258390147bea267a330359533c283d74e86e55418a4387d6cb6d9ef772b69c924e7d8d259989c7d4976ea1c505468b534cf6456cbea699cf1a0c2f7821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a028d2a9d825839014436b162c38c801b01e7a1da5c8ed6d1628527b80b404bd57bbab88434c6812a28393b54cba0f55a17bcd2a968907c6cdc359bb96f3b63a6821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a018d1e1782583901a2fdcb218e7920076f0dd0cd39e05d07e1e71d9798684b14a88667a3b255c7b135c384ffab23a7c08bd9936c00b7c60bb58ec18b6479f510821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0341c192825839018d5eea02e67d2d51e09bd25f56460bb1901afba541683156ff696e8a688717be9380bd612bd9e5d362e494653e38a3e54020192f194ad1c4821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0394a86e825839018f337c0116ef1afcfcbfabfffa3465f16899cb6a927cbbe3744aaca54d4c8c0e9db3fc24484a1aa4443d399aa38e11a97ecacd1f6d9539e8821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01e17d7f82583901d8d74209ac63ad6c4d87b0d06d61f7e2c70c7ade060870ea76c46127629cb47f0d061e160fe8701c66702485aee0cfc97167580e7e6b54ea821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01987e3082581d61668e222b0562ec25de736dd5f33356b623d275be668ec3429ef6c008821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a038b3453825839015165122118b4216d511114e993416dd588149f1ecf51f8767619baf30a61786c68d388581a496fdb1e9e17e0683eaecdc21fc4c0aa2e77c6821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01b5224682583901fbd935fe9f7c26350d8061153d61814bebd9ca6c7b83226e47ca9bee32bde58f62a2cff0b8bc8322368d060e61fda153bb33a6306b7dcea2821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01278e4d825839016c95236db935190069a206ba49fc66e6e98cb4ead06d0fce50c1597176794387de432d1911a0c8d60eb25b872cd80a8855107cf3e79110b0821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0164e8cf82581d6133f1147e895d5b0e91dc4f593df19d8d7503e863726702177354acd1821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0149053c82581d61ad667f7e36278e8b5f8b6609633f68b4d7b82331f0a08d45559ef2cc821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0456599e8258390160839e76e5a03fb898ded51f0c96a77576c91338977541e8724b893e472851e21a820707d7bc126798878106413504fb9b221f2fd5f31767821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a06fc6ffe82583901c4bcd3184fbceae99ae95f26e4c801435e61b6bdb667356970787dd329b557f3e85f1aa9b84f5f3faa8a7b76a8d44a3fa653063b620635fb821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02e8bfd4825839018ffa0f2493430f21c65402dfe8b26bf82b5be02eb8e5563b7d449f858f334508df5622f03f0ea5540cb4eb3fddc5c35fed427077da9cbcd0821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02b6883a82581d6124dff3679da2f1584f906e0f376b9cfceca403b8a441797e80a7535f821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a029f897e8258390136c0dfb34835f14e1da736f60b33381edaa22944e30b5966d8dd264a9998bd6aae131306d0170d51917a8eefd5c0a00761a278540d39ce2b821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01b99c89825839018d6672ac48cf9d78a4ed4014cb9dbfe2f5cd1ec19930d0e96b8b8af5bab1a3a3d76d45781ff375d2edee8d617b0e0868bbc54f5ca36c5145821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0270f1a782583901d7bee25398ad97035f65ecc3c35e08a503a18d336910f3e0e1c060c47a5bb5dd17eb03803d970bd59965fd5f1ab715f0a5c3d17712300eb6821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0fa8d3d582583901f51d84744ac717eab2ab84aca41e46ef6c2144a7dc7b953d219fcf0d572f4bbd3e9ae47e5a968beef1b55b6134882ee63bc6ec8be53247d5821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01a7b858825839019b574a52498102584f1c1b494f23a8466f28e9b06d165014ef46ca0f6dcf9925a0f9526f09df193b52794ff90e6a498dc3dcac4c23188704821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a061b7d6582581d614db70c5c90e76a75cadb600e78e03d4eeb5b0e99e8da7229f92cf79b821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a087445778258390192c34900f4c438bc151011ba49388fed463f2a2b7b74a4310cc63466ae4d582a8d93c04369dbb6abf02941a9614394045286c116e1103149821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02fc2bda82583901717eb38a9b2a76a2884c5fe3721474e3d0f4b84c9e7d9234461c077b4fbe3eb0b63a3d77ea9e12bdc187b9e9d9655ef6e24d710d5400a6d8821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02198c7e82583901745ff3bcb3f4e499f625e6b62f36f8a7bbe9a4dde412bf1ab109c74ac0a631fa7b2872fc39b848cef3a4c155e0946c7cb896fc5a5336b1e0821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0cdfe0f6825839013f02459d589e2c136c2b047275efcf5058dabad6091bbcdc7106ade77a3873a7d28ae1933d3709b47e95cd6ee9ba1a49f316bc6b01082a50821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02577f6082583901c73086ca696e1b4c62854ab11d787bd33491b9a3c7f0bfab30e63dc165cfbba5a1ef455312fa88582cb70a49ced6f836b09ec39e39dc5c89821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a019ef8ac82583901f770345e1ab79bb9062c509fdc3ba63394d83cc410bbcb7b178d3c018f348dfb9010b8e40476f6b2342e7c34ad5c46226ca47f8fad0a8499821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01fb612b82583901e83f2b85de293071cea3354f8df64f5bb83b73acae04e93085e04faaa899e9dc0c75d65f89a9ae9e301cf974209c1a479d3805a637264da9821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0107b68b8258390109957f9c7735d059f92d85cbbdfd0e79efe56e8817831399e1aad855474b726e14c5592c5c34b3da38d8fd928c15c01750a7f62e52e1ceeb821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01d4c5358258390180b8fa1a1c923116ce2cd9155ec08259c849dce52ee5757571ebf0b4d8fc1fe3244b3f0908dd445c259ce9b9948ace29fbbad171d07b7b96821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a031555b982583901de7b0faf6fcc5cfb44198c1eace2fa68954c6cda1ad5ed522ee93b13878e101a9f847c8a2ac42ec2fe3d37264a6ceb7d511bb1ec1a96947a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01c91b67825839016c4e511a695bca4a3619294be8d2896a509ad31f9b2ce8a0019a504c1aa2312880a23fcbcd2d24537eef4a8ac1d14daf786ce3538ce9d6f3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03693a198258390112b7cc34708f2817997ba819c92b353a7370f4e96f48b19a81520054d86b83d43a98c99ab2bfcb389958fafea98702b669365e19a9ea5867821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02a07b3882583901fc2b5147da9909018f91813f246fc3b9d5a2b99eb5e6e5b465777e04e1f9ed8a763c2a061843ff8d6c11c5807b9a890916536829310b8c24821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02ee9ef982581d61df281de065c8c5e8d0908ba82c910910b9f7d6f2f0b4bb7c3f94b7a2821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01c6e351825839013b1a1979dbb1989cc64b19b5cfb0c5cc93fec527f17826d004a43b4903e5ad5eb87bf14185eefcb06628de3341155a91f693e46f3e4b0a20821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a05811a5682583901ef84cf56c5c297989d416e496922446e52b52219f244c796cd289cb17dbd4f2269fe038794ab1b32222a67aae4e56ed77fe983a8e9b458a1821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a021d5fcf82583901e464ca681869a64084332bbe32bf67d195999aa6697718f821d71855be75d979e77149ae29ff2b7340b85beaaa1c5061fd7e3e9695e99d3f821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02d404d482583901c0db9d2d9600f44f3243f029e0dd2c5486eb12c2d32967f2f477dd38b415d908bd6180adce3de7c152c44db59a76c86627b6288f90c1ec7e821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04caea2f8258390129998febdff2f5fab2dcd519c15f71c503e88387f2cd80405805a198bd70db087ac4eef9b7ba19e01dd9f882a56f3c0237d457afd93f2ef1821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0161cefb8258390198566294c6846a4ee83a70319278eda6212cef18af500ed763fcc64f2485a9652a93fabb941fe85475f4bf731c98a22add447af01b0d3cd8821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0279cfa482583901b45831346c8721e095dad1341d12c1a21eb2c952522f9d9cae708cc4629cb47f0d061e160fe8701c66702485aee0cfc97167580e7e6b54ea821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a027235ab82581d6197e1a50fb456383d3d23768d8dd9f624f5c4500c1ac3025dbae149ba821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03038a9c82583901a20c383c5211ab42adee558a42b970100d50df06aaaf57f189db82e81210dccf1a92f5659a6416b22c55c4fcc08a0d3b27a7bc3ae3dbc666821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02ae08e382583901cdc7c7d63946f5733efe001c304204d8ee600048236447149480313ceb1f3b3a78a23723029ab21dd1290b92545b56ee0531f4874c69a346821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02f4294782583901d07fad7e35f21c3479c910b92fb6d6308881f7ce14a4599533dd95e2a63c6273e634c4ba8878ada98e35b3dacaf6ca38caf89a6c3f1f7961821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a013c233882583901c4a16bef014275bcae5480ff156b56b83b93e2188ff57166a4066e03af4f4285786ff15105ee240d21f4bf90dd529eb8fc0d1d07b8df10e8821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0175b53982583901cf4ef1493a2c434ecf456fa94714dfc2cd5b246964528e26f40368f9bab1a3a3d76d45781ff375d2edee8d617b0e0868bbc54f5ca36c5145821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03906a8782581d614bf1b58e0e9e2b6d760990b9ba8166dde9aba00c28b013112d447e69821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02d1516482583901493c0759026af67318a758878856780294741965cc50d2a721f1591c0fd130aff834be9af7bcf1ac07f50cfb4cc7fb75e66de912d08a05c1821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a039fdaad82583901976212280a4c1a88e3a6922d0ec93474ae07a7129994ea5494399e642301f8a220837889c4bb4c99e865c6c71d4a8e5df25f134ee6b39494821a002dc6c0a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03fe1d718258390134fa30819d48e5385b754db9af18638ee24c696fa0c24e498ec3c8681f2eaeef5f9c6aeb106dd8d5651ccaa23ef3795b1894d4c853d4b2f6821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0250e6778258390149857b76d27b08829b8c53f21ee85cc908fa57159d3f78cf00f2cfa279127e3afe385c066d28d398d796f9a1d13749a2cbffaba208f1f942821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a011cb67182583901fad403108ab9d06ba891e4a239578c3d8ea2a37b33a66d95b1e9710e2beb161928749c62522b75e590994dd532b58925ac4e32b5f86a064c821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a03f1640382583901824ab4317b67f4f3083512c07f36391539e2979fa4286262c5e3677782252449f5d9682d3fd1dd50be0a6a1c5bf5000ef8a1240d821e283a821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01fdb04382581d61cf2857c3fe41a9d5fbdf11c2cbf032228d4f477e171ea1ad80dfee5f821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02acb7808258390150f909665d770d85d68d1032bec42bb6fe232a08d4ffa61dc891c8788aabfda06cd4d7278d7151252b8e99190bd65f9ce838351d465d0c1d821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0cd96c6282583901af9c19414fd89110073af7c784014e25ab58acf17023aed188a525d7de519ea54e3f28da879b034dc9ad1e3bb825ce230719dfebcc598858821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02b3a5d6825839013aafd586626272c492f4907467e32d83cfc9cfcb0ea527fbc37e81a8d0ab618a994b955ec0102e27fd4cded74d6d947caf41855f0609f367821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0711523a82583901e6cf36f5ea5d34283c283c5f25436969a45d6b567c9389c39fb24158e2e7c64ffebf83f7d430a81356048de475bf5c899f5c8f535dfc7497821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04e150aa8258390190ca4e65315b8a92cb738bf4ac03116f33c20ca81def20f059199af811856df7f4314ce63bffdd5eddd905b04eef00b310f2fe2bdb50e4b2821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01d9039182581d61d5c3ceed16ffbca456c2605428c6c3579850481bdd7ff5f027c66f17821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02634b2e825839010783b157b6c5e0fd537947b4cc44d3d24d459e337f00d7072276242a4ab162c1f4b03f276799adb703741ae1e7ddf0dd7db9b5acc57a8ff3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a01bd2e2282583901c85841d1975ab1e4704f8f2869a011059e3c850bec25489e586aae845675c22a52784e512342b126445819e18efffbc19ffe5ec6d7495ca0821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a020209ec82583901ec70a04cc218c19d291388937bcc7370fa69f006413214008727e2d2f7d342c37391d30dab1469c551ffc83c9329c8f4e89a8fb0527995d3821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0173b23882583901ec093ed3a4bba32c3bbf488a92d1e30ce05fcfd38fce316b2c1bd0e77a3873a7d28ae1933d3709b47e95cd6ee9ba1a49f316bc6b01082a50821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02abde1582583901014da756d14e352a1b95d1b10ffcccfad8c26848ed9174fbdf68b583643dcb5d74c1f620ec1a9acc2535efe76cd55cab5d34fc3af66506a2821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a04036f25825839017a6f6b1f4f420f914e411cdeb5afcb77339fb5cd0ecf8e09969256b53f3d990b4d58a8e8c3068d0a129ab40110896a7a8b84c2f5047ad98b821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a07cdb4c782581d61ab4568aab4a285f6ba9cf0fe7955360dbec12baceff1da53d0ddd7ae821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a09141c7f825839013d372aec1c0fca44cfcdf97f08c0a4efeddbed9547680df248bab81f057db3396cab8751c0172442c2697446a0d8baa01b530d6279cacac8821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0268f505825839015b6f65336e7443a754b891cb330910f772f343b440e20e57040062670a61786c68d388581a496fdb1e9e17e0683eaecdc21fc4c0aa2e77c6821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02468e1382583901ce7c46071c7c7b75a4bbd9b32544f20e67a4c4712a79e38f6d6ff60e1880a7af76692d552f43eee590bc0fc88fc41dc09c54861fbeed5a28821a0016e360a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a02ddba3182581d617cd4ce2933a9230cf5f4419b9d1c48d4d6b8da0dbbace50cc5789b38821b00000003037fb29ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b000000af4e4c2206ff021a0013219da6008282582061297384c03e293f359f85b2ef67210e8d07cf16c5a7eebc61fc45807595d0d701825820a6ad4e026e56f3e553e47ca191b296ea6613de37cfce909641895851062ab2bd000d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839015873954078daff007986484e905af2524008add639889543c6503029347977d989db50bd86de0c79faeec7b5210f6ef0497d6a64a4a4abd41a00551015021a0002a7a9031a02bf9a870e80a40081825820c0cd6df154ea577ff095c90a3c13446f5d84c8602a19bcdd2dd501d042ebbf5c01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901f51c47fce6069d575a2d73e2564f2fdae55215c30fef4154d7b97e811b0003152f0ed29561d1e019e1ca536a9e5a45d016045e139c0b23531a0880c5a6021a00028c81031a02bf9a53a40082825820e9983a15398fa7dc042392a8139737e19e3498b25d7455e65be021e8017b5edc01825820a34591f7ef9f5c44c3d6369f2ac07becb8f65869ad72493c1d239b4e3990ba6e185c018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901ea2fab4a028e1d15168d0bb4730d0c91a9ae26d54cbcf2ba70469004130d43b03504c917d088f41ea7b68ce2b637c24d8845cedb3e5147ce821a001e580fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a036065e6021a0002abc9031a02bf9a26a40081825820c44d163053fc74ca2ef5e38acdd6fd6e9c00916e66b121d7fec4a7637b645a4e01018182583901a52056d19fe8b5ee9c4ab8ede7dbdb6f8c9e478cfaf6bb30917d1426e41dc3e5f4c153a19122e126d3568feaf93dcdbac7ae7ca906e2edcc1a028c9298021a00028847031a02bf9a48a400818258201302a09b619eb9f45dfb9cccbca8e6e31c6afe36ea0f26138b25f8d63636907401018282584c82d818584283581c5aaaa6c4aa45b782ace7c8612ebbb2726c5dd29728c58e161da1e78da101581e581cabbf051bdee353d27c460da62fd246dcdf6e049a4e7e346bc3b66de1001a7d5dbcb51b0000000826299e0082583901c26d1f1c13b7d32629aba0fea3b98be8d824abd60eb810f383687d8a21c156c1e55f90421f0fc4678cc8e9658f68558c75b683c81ff980bf1b00000001009408ef021a000295f5031a02bf9a57a40081825820f1bf2cc4cffb904a220168fba0d91dc9ec64cc75ce9ef20949a642cfbdd58ef801018282583901fbf3f8e3518537869916af2322d209b30e54319b9fb570b60660a2687ec3f5cd2c7fd3957bbfa7fe207c421aefbe78705684a62ee6c54a661a03a00a0b82581d610237be10f5ec0ccb6cbd226b112f0940fed44ae0466d9b53962ba8b11b000000018a920461021a00029cd5031a02bf8c66a400818258204d000cf9d45f0167a944045147acb2b363361d4c5a1eecca065d81ecd9714df300018182583901c6764203fe1181477f98ba8ab6501c9bc25e53f816a1394ea4adbbdb62a9090b6fea9353f37478b86235146f1e428b535315cb606370d1931a75ce2a3c021a0005d750031a02bf9a76a4008382582040e0ee4ba2d1e3448e4cfe7db9117d0765b240133fccaed7c1aacc96e5c8fe2e182d825820f29e3cb1d62026ac52ec600cf53e53e9e28670188520b410cd6974f736f3eee918388258204521433c5693241ffa379ee0d2e717eea4c1eb60bf2dc184f07a356bb8eef91701018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839015658eac7d9618b8686b9e1262853064c73a3266d0334b681aac51dbb928f9eca0d626ad9527ea46bd0902f8db9f375ee6130aec4a0674414821a002fe0b2a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0e24a32b021a0002c381031a02bf9a29a5008182582022c0f045ead9870c815dcbaa4376e08909f2657471de463b5d3c1aa6463e1ee3020181825839011d553efba67b6cb1f39c200488d6c90f4b7b5a1451cbb92fae25bb058037f763da312b59a394f64776f87aed8735be8729860b86f14a3e9d1a0068270f021a0002a8b1031a02bf9a4f048282008200581c8037f763da312b59a394f64776f87aed8735be8729860b86f14a3e9d83028200581c8037f763da312b59a394f64776f87aed8735be8729860b86f14a3e9d581c2d10d9ee5a86c5cedb75cacd033a2945cfd80315eb978858244cec1ca40083825820192abe98be03ed94ef387c0f45c4d0a75f2ff7b91aa3edc7e8c5c707e01805381834825820eada4e8166811fa9bd55ed8289ffec51aeb18a5b9b3e3a7d680046c556b902621832825820c7f6b7e425c6eb9926dae7b7a8cf5f62b78d2b23e0f627dc337c51d5724938341866018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901be753403644bbae4e9e2b383f97fd673507b3bc40eba1e88435d2566ad3978de0f1c5d3d27313f22a8822a74149154382436935f4878634b821a0023847fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0cbae690021a0002a121031a02bf9a76a600818258208932074981005b4787e3ede3bbae65a590455bba8061bd07b32f18a8fa34e4cb010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901dc6faa1e4c1abcabce3793217a322043adf512be1c22baaf228e281d8ac041bcd5ba0deddc9ff62144392cd5fcc1eafe94217e4bcb4486881a04ff1345021a00028f6d031a02bf9a8a0e80a400828258201b02880f1f171a0d788eb5840299cdb600266c778f815631cb37285726119a4a183f825820baa3070271c91bb19279cf495ade55d94bfe039bfdde072e3c6dd9f538661ee000018282581d6124dff3679da2f1584f906e0f376b9cfceca403b8a441797e80a7535f821a0019629ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b000000044a94e60182581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480021a0002a98d031a02bf823ea400838258204fb7489b5795ab6afdabde92468aaa66e606a88b62ebf2d6720bb17a4557800b18468258202d634a33d4ba74e8445356c03bce3f6eb7232f6b0ed910ad56b955ee370907d918248258200378370af96524a23889aaec7d4be7a5d8aff454ddde7a73d7e38d33d886630d1856018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839013aabb103eae1a2612bfa344e66e3d3e22d4e2be77692f20e14b23765ae286268d4074b5691400d11c68cf9823fda4647729c4e507a92cdc0821a002361f3a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0dcdfe39021a0002c3ad031a02bf9001a4008182582051af57f0bc691716fd645a6cc97263a205edde4ad75fdedc05fef21526857a7901018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901898b12a5cde1d4380fc1a365b566aebaaf6179d6b8bcd75744c8c32f1e61be1affe097e8c63e36c8bcbda58dab887aaaa443f6fefc1683a41a006b37ce021a00028cad031a02bf9a76a600838258204dfe7bc85936db8f12092d2cb94b31132b03475b119d89bc2774b4fb2f409101183e825820b62a8139773605dadbab4602bd19373b768902c1f473a0fe4a2bc3d537ff37f100825820f4a39b00b059e0307d4bda90a95146b1cc94b5d91b4d7484588281644612cb8918420d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901238d01ca0eddb8ce41e7fbabd8e4ad5b7a720010ad7a2d06afb88f5a017a27749ff1f33158aae748fe55aad50fdae9e68e2e72c4dd047664821a00228476a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a55d364f4021a0002c825031a02bf9a8c0e80a60082825820c5147a11b2ce708e19b1052a83c7a8b5a9bc2bb23b1c49c8171a1a8b7799b8df15825820c9cf17b67af21b6ff21870f027b89f49ddb2eaeea8e60563ad8f6d20192d27cc010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390172e2f5307198f03755b13caa79260fe9725f45ab8b8ea97fb2b09b1c0806f240869a67aa2b9e27167e1e488fb8bde8a410e7d7b5866d14e1821a00190c72a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0d4532ba021a0002afe9031a02bf9a480e80a4008382582048d848e0c82c8f956afafc695c7fc4497fd517996e2d20cc2dae87d3fb8145e41840825820f18b2c9181d73a8d16284e33c359d51e31529992aab6df76ce112fce2849d0ed018258204eb6a6d07323150c40c4b6cfb94f41182fdaf1e4d73545dbbbd25033efacd6fc0f018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839014df51771b3f334c7df99263add74c3737a00def27aa7e202f58cfc75a31cedae05bb97d117df3200dc3dd2e72879ba0a9f2dd73e7ab0c2c2821a0034f7cea1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a199a8057021a0002a0c9031a02bf9a76a400838258207733c096a3e46016c1a903bba72c756106abaccf8240eaa9c3727c8796b7a2d203825820ad25550045f657db336956ea7c3409bf7d41e3e2cc0b9a9b45c71b5cf86131fe18418258206d67afac23599a986c7201ab2373aacb0822c86ae357294628c521c2481bfe17181a018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901039a187330b1f2ade4ff27892138741578335970d7634845a1924a616ca0ddc4284624d6172a992fb109f1017aa3a1872f32f5503ecb695c821a0023737ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a05b84330021a0002b225031a02bf9a39a40082825820c7206d951eb2efbd8f4be3e3302293a9db604e36f0d309a0b355ca781fbbebaa183f8258205d3591687a0868cdc1e2fbac39cc453d66c6f557d2f8968f0bb33b21225d25a201018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901cf1acf339943e35793ee64e0490f45ad4ee0d3ff9e4ad06adec8287179da27ea66c4422a6ea3426868b12521674ca95965da2044b19eac55821a0039cfaaa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a3f808e0b021a00029a99031a02bf9a76a4008182582057cf9bb7940f2ed6ef870101c22cb900c259831635a416cd964a62d87dbb151501018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839019faa17c1251e8ef2c346d4f3f24b2c295938c8c3f3facd1fabb65535d0f5910cd833d293faf134485fc3dd492e43ff76974270a4d48106621a107b7a78021a00028c81031a02bf9a7ca400838258205c94d20578854c5b00ea59cec0ccb91f86575d8c8f94060ab4e649eb9590f72b11825820a66b35ae1c2fe8f3a083289032f6c3bbc9884981fdb87fd7c20dd2e6c793ec4e058258205b7348f189289fe840c7f610c5da770d8dab536b4a4ad4b52adb030223c7e8ca1858018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390148db0ac3416e4e3573810d1b49710a61788e2d7fafd5f36614368055b1bf4022d3c85780ca52a7cfc37ebde7e13bb8579552c02969ac2b6b821a002384d7a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0e65fb58021a0002a0c9031a02bf9a76a400818258205f007003bd1bf1b72d51c7a30dc431aff69aac5cf95561a60f12249bdb11f79d01018282581d61f6fc877abe01c2479dfbc98a2e89c884948e68e96f88dc52098066351a05c4eb0582581d610237be10f5ec0ccb6cbd226b112f0940fed44ae0466d9b53962ba8b11a0349c68f021a00029cd5031a02bf8c66a60081825820d5067e145739734442baa924f584d754294f4c5fbedba004f66e708d66b01fd800018382583901df08e82fe781e3a188e8b7430e0e06d4e6f2bb4ad9ec8a1d7bc1a0851e75457e5ac980a374fa80e4a594155dcde3674a7f9370840bd5fb0c821a001e8480a1581c4c9f7d6c24ba8e2b12f3269ac38d706025e39a50a524afe6eaf79d95a14f5665676769656d61746530353934380182581d6106284cc5e82c55b2eafc50d82b9a29de343064a3d2b0ef4f4a866c431a02bac57782581d6187be476ac6296d1bebe0647d755c1638038eb3b8a63ba40f0d9dfadd1a001e8480021a00032209031a02bf91de075820d486b86e7fa1a26317935445055de914d0a0bfc92851a37a82d770a2a030150709a1581c4c9f7d6c24ba8e2b12f3269ac38d706025e39a50a524afe6eaf79d95a14f5665676769656d617465303539343801a40081825820e4ac6d1500d54daa41e3718c7b4290c74d5f616c90d407586f8f348146152f4701018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839019b90591c66645606264f60bfc667840fb29b532aede3def3e316f00f97a1bdb3cf1b1e612c57e2a2e66b52aacc8d2adea946f7c6317b230f1a097c51bf021a00028c81031a02bf9a70a40081825820db716b0bc8ed47fe7a23b12b290c1d3dcc56b60ed9dee23e87c170ab6a55417f01018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839011c5e49b92df460633e7940b002fd854f3204dd29937605d6c9a6a1b102d467f67e847f49e32f0b3f4eece0baf306ce5780ba057cb3c05e9e1a006835a9021a00028c81031a02bf9a1ea600838258201b02880f1f171a0d788eb5840299cdb600266c778f815631cb37285726119a4a068258201e5210a7b8d1e3c60214124e084939d850245878e09050ce7736871a2cbbc5db01825820c7206d951eb2efbd8f4be3e3302293a9db604e36f0d309a0b355ca781fbbebaa18470d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390196b5d11506156b8e1e97ba150f5c29b77a52041a301ccf0420d2fe15e26c05d89ad9a9391b89924fc4bb8df701946e007d17431e6d6c018d821a0025868da1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a1020eb0f021a0002c825031a02bf9a920e80a60083825820638df27c5dce84afcc58bc80d6b63fd2da0ce4d2a0a4bf33b8f474ef815ab582181e82582064cccc6d0d81ac74486a5c32231b3acd95ba4898049d11db0fd7d22ba332a1ef01825820ff00420cb194bab9b412c6a14142bc0e1461b66451b89594fcb8e64203b34c67182c0d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839017df9aa0052b1a6ab8d20cc2b83680e45feea763526ae7f88fb89f949e2e7c64ffebf83f7d430a81356048de475bf5c899f5c8f535dfc7497821a0025868da1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0b971f2b021a0002c825031a02bf9a930e80a4008182582021c2111934a35337227e8ceca54cfc85af80f0bc06727c2db6959e8d920df82801018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901a3bef6e0fc8d6752183647567aa99823d6b3ea33f57c0beb9bcb377e8f32b769c97fe56bb16308b753a30cf32651b77661e7bf14e2b700601a1caf9f1b021a00028c81031a02bf9a3aa400828258201b02880f1f171a0d788eb5840299cdb600266c778f815631cb37285726119a4a038258200e787bf75f0f6757a4a0e5633401da2752fafb72e13bff8babca147984ba0584182f018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901eb0c5d4906d1817d9b5398789ed2b94e5890684a4746d3e5687c43c7700d3d7fc137bd10544bfcecee1230bd44c86ab4e9a0525992b96b40821a00238b07a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0cc802a4021a00029a99031a02bf9a76a400838258203059fdde693091a8989e5d02605fc135d1e07637ce72000103430f3773c81e8a01825820ff00420cb194bab9b412c6a14142bc0e1461b66451b89594fcb8e64203b34c67184c82582095e53a22348182c384f75478242258b06f03df0f73e4905d0b1fd11e666e15ad185e018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839014817a02eb7a12d1c3340ffa56e99523d6b938fcd3c08109e7b268e51a7c1fa0fdad33606ff8da8f181874ddce39a4622f43a2d347d71a6fb821a003025caa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0ee285b7021a0002a0f5031a02bf9a76a400818258203852ea1e2bfb291cf2162252c7137a23a15f458ac5471c839de14785b2ffabb001018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839016db7b1c7d47bc9691df22dffe8b3ff2430b921a00929d9dad6e9054ca16355a9e69bda2200efd87306fc4fe2252e59dfe34229755f5f5150821adf95aa45a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591b00000005096d3688021a000294ed031a02bf9a76a40083825820d4048df78677cf0939cf6c67fe880022e0083d827ee7f125e4c693ac80da59f501825820fca7b5cc3569b50310f27bafd9d56a580334ec730c2a8228626efa62c7fc7a1f17825820d7a9ab9c38fe93a63f4c0f32bd4f733b6f54a9995c4a384a4672b117fa071fd015018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901717eb38a9b2a76a2884c5fe3721474e3d0f4b84c9e7d9234461c077b4fbe3eb0b63a3d77ea9e12bdc187b9e9d9655ef6e24d710d5400a6d8821a0047100aa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a161ede93021a0002a09d031a02bf9a76a4008282582078c69d69f66c2660e385e3bf51b5edc5e0c1d1026554c7c659c9833144e0872b01825820cc3a88e67dca86a2028700d84720a40f0b661d88fa309c3826044b2c112528bb00018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901e3d1d4603dd14d8fb99600c0c85e3369967c47169c2323a91e47888e19fee37f913dc58f86059426145c1ee5afe04c59c0425f9a363566a71a06707db4021a0002a40d031a02bf8c7ca40081825820445e43f27450f627be4cdeb77a32fe734d2efefae12646536a0e972c5a41b90801018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390181f311015965c997f1e587b19d823afd1289e00d214a0049869139f7943c7407a15d94ccdc7b9808c38a7e1e7621728ee60926d4354044e11a001e155f021a00029534031a02bf8c66a4008382582089fe0fcea99abc9940b2fa85066963924efcb105a6c5bc6e00318a6a2bc0fa0b1851825820212eadb663558563eae0d5aaf6ae8dd8eedf13f2fbbde0c1dcb15a4f71c5afd21582582027a19a67c00adfa7a52c754c00282b2b08ad7592df54d54b6fc6180badf7a915182c018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901d71fb0b059a14ee62d0909ec482970c2b8aee2ccfb8185f75ce13db201e3c56363fcd7f95e7eb6f042720a1446f2da03550149ac037c98ec821a0023621fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0956c3ae021a0002c381031a02bf9a84a600838258202b7477352414ffbd07435257f4f224dcc1fe68f220d8b02c6367e852994514e8008258205b5d3bf4016abe953c9ae5d4a236ee183f1bba994f490d0ebfbea3175033b511182b825820ff51bc3c44553126eb9f386fde7db5da2fb215e243540720d96f881a5879184718300d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901995a95fe88f19d670c90ff600cab012c2462df28eafe1bb5553f66da619b5d68a1ed18eaa4924403e503219bb632a5f7781427aea95a3c20821a00235d7ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a108fe02d021a0002c825031a02bf9a990e80a4008182582033c795ad2a295e1ded002e59955d0550e8aebaa2490adcba3ccbcea3e99a831f01018282581d6161624436de90fb716e9f38fe3b3fabc359c1efe16c8076786f1e75351a01312d008258390147bf41cc2db3eaadafe458155ba5c88814b943c24e769de5c5943f7c986d2412cc8d8f7941a459d4c0ace29d833706a709503308bb53a113821a0c1aa6c2aa581c321668648736a09a40bc3ef5fbd05590530be624e39af84fab3bc6bba7581b425345647761726473536c616d6d696e48616e647330303034383501581c42697a61727265537461727344726561646c696f6e526f7365323832014d435033503050726f6d6f313336015143727970746f6d626f50726f6d6f353631014f4b696e67447572616e747574323837015053616d757257686950726f6d6f3337320156536b756c6c62616c6c4c6f676f50726f6d6f3132383001581c3c2cfd4f1ad33678039cfd0347cca8df363c710067d739624218abc0a151576f726c647357697468696e303932323201581c49d87796a0281b417c478fea3ebb61bfb948f3026e2e5b295ac3edf9a14f4e696674795465646479303336343501581c776f700a98d35c4deeaa4ede7697ca45d7947d9e63b028924db6ebcaa456456e6456696f6c656e636547726166666974693031370155456e6456696f6c656e6365506c61737469633038320155456e6456696f6c656e6365506c61737469633038350155456e6456696f6c656e6365506c617374696330393701581c98dc68b04026544619a251bc01aad2075d28433524ac36cbc75599a1a144686f736b18c8581c9d3e9e2243d4310e034fd775febc9ed5a03beded6b6b312d9954bed0a34d436f6c6f726564436f696e3139014d436f6c6f726564436f696e3239014c436f6c6f726564436f696e3401581cbbd09e4d0c32ba4f60d86b279d114f85d1563e51624d988f5183fe76a15741737472616c476c6974636856656e7573526973696e6701581ce8cbb1b8b76f275e9f738c9fcb56505c067c5683fbf405dfa4ec627fa1581c53696c7665725469636b657448617368477561726469616e7332383801581cf11ddbdadbc7b78b7110293281844ba8acac918f1ed5767539d7d52ea14d476f6f667947616e673239323901581cff1463bdfaf9268cafba9918a4b389723a90a21b3a4068d36b2fe405a54f47696e676572427265616432353839014f47696e676572427265616433363937014f47696e676572427265616433383530014f47696e676572427265616436303439014f47696e67657242726561643735393301021a00031659031a02bf9a4ba400828258208b2b2ecc46e395b732e2a92ad4804263687dda4b9449047acaf13a69d2ffdaf101825820bfa4d375524f2abcc84affd83949ba4aa36cc89a1ef2f13978ec3a17ec5ef83301018282583901f1389b7c1601ac20644c23db888e19a0aab599dcc70a20d85cd37dcce928198932d72a69f2881b3fb43d7d888106688e7e6b94c77419e0f51a006acfc0825839017942868515def96833679b5eca67d5d1f292c787cb047855e79004643d12a3b721e514af17c3072f8e467624eca9f241791bb0b80fa4effe1a0013f8ed021a000297ad031a02bf9a76a40083825820ded9641ba8d277e48fa9ebfadce16e40a57adf0f65d0061d9ebdc26cfb537902184f825820219aa0bc7fb7389a46e02de8b56eb58e2e8d608b483810ff0dee5451c4c3da58181c8258207d519bc21949a6927b10197235e2036a412a9e33b4fdb8fc23e06643ded93c240d018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901060bafd88341b97247640b7c5d5067b3015fdffb23edb259e6efb0141c38bdc1da39e09651cac016e41781d63936267bf4d23c3b5e2cd817821a002384aba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a08e39f59021a0002a0f5031a02bf9a76a400828258208514e1bbde039f7eb034688fa69f29308f00e81a5b6ae79e1c5706006416ccc918288258204a6023c7297726c077d81c7375c1dd0c07b6291587e232f5d29d2c80859246d901018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901e3baeb4c895b74dedef3ae4d01ce16a0ad2d7d89555f5c45e434f97758240e27b25f53a6b09da4ba4ab0d6c1df3aa5de0cb7ab6e2becee11821a00285657a1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a22d64688021a00029a99031a02bf9a76a600838258208fc41958bcd2bb96410c8eac1b5b8e1f5d6029e95f580e95adcd5a28fa82db4e0982582090b78500a1c592a2751476b23f72570a77e6249451ebe65587db5694064fe026184c825820e3717f2be9ecb10f4166ce386ae842924dbda88dc997eaafecb83297d4145c49185c0d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901261c3b85ae6f5d9b6a132cffe22b3fe400efa90d5e60f58190112362a63e77f114bfd07d48717540fb0e5c3c7e96bf9f057e632159825705821a00235d7ba1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a0e92d2e5021a0002c825031a02bf9a970e80a400838258204fbb2b533f9054ca7b72f09d27223b62b075a73859769d6a579e3b0c5c8dd8f1181f825820208ea7439d53983e86415e099632ebf9985536b188b5891a3e88c120778fafa0181d825820b682c3fb0bdf2b1ef967e0936da619af9be75ab322bd8445687879a8ea3440a3184a018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839018bbaeab26ebfb4fb96c4538f47fbc6635996f45f8c33a399660e413e15faab7b0a177eb9e5cd5429a5d050dfdc375baf45476d5ec75a7d12821a0023847fa1581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a07cc72ee021a0002a121031a02bf9a76a40081825820b4ce6369ee42a34b6aec27d95e78e1e4847766b0576cbc2354b5a64cb9adbfd001018282584c82d818584283581ca1f4d3100f110f03bbd990d92e8d3776fd2ab5aea6f5ca685315d4ffa101581e581c83d3e2df30edf931b98dfc85ebac5857f4ac515af06679859866ba33001a4cfe02db1a2016e87f82581d610237be10f5ec0ccb6cbd226b112f0940fed44ae0466d9b53962ba8b11b0000000209728f95021a00029cd5031a02bf8c66a40081825820cca215b9db4ba32de72b0779135202c8b61e8cea94549846505a14f3757697c900018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e848082583901ddb8c9a21371f96c1ac5ee5b25fec3a5c52b1a7f72cea72006804e515e2973e8e867612035dd4c00552f2bc438c99838c7aa9b0102c8f2991a0032ac4f021a00028cad031a02bf9a76a40082825820161040a2cbc1e4847693fa9a161ebe5d129433de9634854f766b02a6ff235bce00825820161040a2cbc1e4847693fa9a161ebe5d129433de9634854f766b02a6ff235bce01018182581d61699380b298cb02f7c3568820c7bb7f0422c7bf5dec42a2a46eaf9d0e1a07193676021a00036be6031a05f5e100a60083825820219aa0bc7fb7389a46e02de8b56eb58e2e8d608b483810ff0dee5451c4c3da580c82582074b5966e661c4f61c296a5797df42397f503177ee075c1951d6c7501f5b4ef821845825820d379b741c69c589367caae02fe37b1baad6ef2b7d0d57643e9319c57ad3b9d5a0c0d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390190e17a9f3fbe9a6b7ccf44c5e6a41402fadb6bfd22af84f0ab8d86d4017a27749ff1f33158aae748fe55aad50fdae9e68e2e72c4dd047664821a00239baca2581c1d7f33bd23d85e1a25d87d86fac4f199c3197a2f7afeb662a0f34e1ea150776f726c646d6f62696c65746f6b656e1b000000012a05f200581ca0028f350aaabe0545fdcb56b039bfb08e4bb4d8c4d7c3c7d481c235a145484f534b591a18c1beb6021a0002d249031a02bf9a9d0e80a5008182582053393361dd6e2ce1b03205e37c12866e6e48257b683066a94129f48eb1895add00018282581d61924b86ac349594fb8d62729290e0bae42a4e079d0deda0ccb1e9dc361a0019d9f882583901e44dba07eb8a7896c12c640eb7ea69489390e43a488919efdb71684290618c6ae2d08adb7302e46f7dcd78252abd41456fc4e169362bc0df1a018ebd17021a0002a7f1031a02bf823e0758201faf47caaa516084cc52d934867de0557631267b1497c4f711f6088276fdd605a60081825820ce914c505f2d479939204d13de21a1e31c5fe3104c2728b78f46da64b9c1ef26010d80018282583901c992066ccff68adb5e29c439d8203f9c3a2fc9017ef9c28b11e01aac35d6eb5eaabc101e44c704e811ff1e22361f5fc397d89f5453157aa3821a0014851ea1581cc88bbd1848db5ea665b1fffbefba86e8dcd723b5085348e8a8d2260fa14444414e411a04db976082584c82d818584283581c0e77c78b8a1ad2582be241d76031c48ce29f2b4fd5afd921015a19cda101581e581cbeab7b5c6b45ef715654f7a88366ae1d3d62cc2667f1c5d51141fde3001ae518e4e5821b00000002297bc8d4a1581cc88bbd1848db5ea665b1fffbefba86e8dcd723b5085348e8a8d2260fa14444414e411a3e53df20021a0002b671031a02bf9a9e0e80a6008182582092151bf8e31fcf69bc28510daea36467192bb85c062bb8c293c18a51321028b3010d80018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e8480825839011df25fdcc24a7029d6bbc176b2dd70887c47d200c488c47fbe50e1087cdcbd680df44cd820c65d7fbb803e17cd72549d3a1f3aeaf03083c01a274910f0021a00028f6d031a02bf9a9f0e80a4008182582068a0455f649480ef442ea46556c62f60c2eaafeee1c1649cee08c7dcfb02187501018282581d613d578fd1329d16f14632fdac42b76eff513958a5fcb6b7044c65de121a001e84808258390151ff1d7ccb6ea3df62a0207601ef558126681ded874acfd421a4bf1fcb660370651fe3dab94bc8c076b42f04d258d5bd1325876cc469a3771a0243ae54021a00029534031a02bf8c66a400818258200ebce433f9ead9aed473d03749e6a5f49b2ca8adbb0668a88cecacfb12ef034001018282583901f90011f9546a71399130893a700292761249304a2eb6f4096b9676db8e307d3c9c8f8db7d74a3fe2424a41ad2ff12d4f49f9a52a0cc72d6b1a007a120082583901defea977fe110adb48fd3e446caa5cef7c4385299f0e763e079eca5c1f744f16189d1570bf081eac56d52bea9cf1a11344db310db0d43ed41a8ccb3dcc021a00029151031a02bf8c8cff9fa1008282582036a2f85845ef83092d4b026d084501cbad87998c3bcce1495047171f5d0e83825840c492216cb0f535f1cc78772a8c93e4e59c39be403c284f4a029b7317e45f81cc9f6cedb481b354b19874f81be4caf017fcd386357644b10ce427ef18a74f3207825820d60ce8babc71943b845c45bb8179181269666e90bcba58643162320b83db139358402e64ad4fd32127af503f63711e5150a43bd1046fd53581214203094ee7acd66a53c7e4da3fce515fdfb8d15627a52a6b3237384bf1af0cea977c7c984955620ca100838258209844ceb7f89dd905e0db096830f1d4c14f3f9429a2d1660be6d01c0ec22bc8ae5840f58344e1106932f54c3af3ad5ef3f16c28bfc1667048b0ae89de89aa3e9e7002dbf12fa88ea68ef37d62d80a19bcf72686d8df38abb8b917ce0d7213579ad700825820ac62c6e854b5234779a71fbc4ef8f3cd47d0f8d127624e70fb8485f15b67a2625840d8021d1f6447bc5294d25a798117c7dab1836de32ce4e4fdacba3182a3f97a1f6896d52b86b4b790aef6a82b4a0384e53d2cf0039dd2cac2ef5737e1fd224f0d825820555855aa3015428963a697bf6a3fe9e7988c70853568c009ac897b0c08d1eea458405d53acb6ea51caf80dbbec6393d72cc13823b79141be007298d2811639d6acc993148bdd208766693ca7213e451661ac14f9ecc022c81a0e62afb2560bf55a0fa100818258209ecd3f51ee9c72cca306d896fce1b7a78b7d06f36ded3a9fb866f46ce8dc9fc35840b72811546765b964c6f532a63a8f9776f118ea81650e26a58e80ef669ac0dfa846e3ecbabee08614af0ccf60f3fba77794d0cae2bfebbb41b27a84dd047f0c00a10081825820831048a1fc323e87499ee8417077061075bda8b858df6284815012e1767d5c1d58404e167f8a4846f9086034227f60f06c10f660c9103695d36c8cd90c17e86a2c8c9fcabc648e801a17026d23a5f75f01ef702020b8b4210182bc15edd32ce7a907a1008382582074b31fbc3d467a68e64deb46bc62863276eff54cd6945a7e5baca6e12267605e58409312d130e61916e32fe956fbab1f505080fccc093f31e5edb5709d30d293a5c0bac16a1781f9f8aa1da1aa8b0a0065c0c2b4aa3681263b3f8901f35076ab39018258200f1ab8f5caca06ef48537a396da84e516a5085c236c38aae7b70ac5528c6cc5c5840373dd12c59132de67483a336a28ff5559bcfe51d232dae469a2ad99d929f9f702d9fcaa620b18b6da7f8ef08636c4fd9357738763cf101c2158ff1831136860a82582038f654daa7167831f75de7b25bab2e75773e00150a947869d25a3dc5d1ca80de58404bd01ceff1a6b3988db64ba07a896c04570c9e8ab937f328dda491221331c18a8555dcbacbdfae36e3d7300e13953a2bb44758981cd4e5b26779e8f38d832605a1008182582078fd7534f68fc43fdb9d95fa707316d2765bab800538a3c342aebc39e3caea13584001e442975a1dbd868824980478fb8bde0fe22ca410ebfd4e48349f0c83820249bd90eaa15b4fe6d863c1e4b7f512d4abf417e867c3a7968e77cf5a74058a6201a1008182582055019ca54aaad3a659e0715bb4a05315030abe3ffe0f1fdd0aa388e3fc2a6a645840b988c336ad328f2cbbfa54a1a07b295e2f1915ca01743e20419b4639c35a855886e1619a2cfcde5e51a96e21936343753873e764cab10b9f955c771f5f6a4609a100828258204589aaa6510d1e240800390d809cde9d11fed22cdc9907c02be5f0ec2273688b58402cda160acbffefe8b2e9a190e5b07301262f48ea5049c77d53f243388560413ce8797bbd2ed40b877464a3f97b74caae89e6a608925e3e38c80b624219fcf603825820847931a23a3559b829ba248b6263daa4e4ef7a3f4cc3e61ccf345b7caf6d483f58401055de0ec99228fb53ec4df36342d25048d04233102cf89a2213c9f46ab74341ae5d1c44867c53a7c0d5ede5047a43b8fbb224d3906068fdcd47a535f031bb02a10081825820c0b0365ceef3dded8bf38fa50f8391583015008e90d71b739c0662f9d3d0e5d35840310f077a347399e14172eeedf5db26117c0e079847e8e13b46ac52513733b2ce5404f100ccc50e91ec7043a7cb6b67c1fbb2a30cfd9d60ade7ed293d6406a309a10081825820f0beef2cc924693f62b239d282e88e9068a29344840316ff0e96a451761697f25840f3f7816458587e22172c45e702498aa35459c9989dcfa43581461f8c8ff41cff00472570de446632e7cf4c020cf53ee78a8863e34ca915d15ad4d4f37ae62d04a1008182582086f7a703096e7a6127a90ce0ac64f8b457a1ca49a79602c77d89766761c44c4e58402e738353addf3895e069be03e947baa219311cc9f1ec358bc44f533905246237173fb914539388b44d65190d8eb1ca3dc48121ac69b9b6ea6a7279428305a100a10086825820266eb198665cfbb4917bbebf2c027a8ddba7ee5287cb1335b9d7e438c793ff225840972ff5d97fcc9a1b8f97e42254ec0e7bc03bf1ca58d5bed54333da4dc18608debf04defe283bc8ef608dcc3d13833c97b8dd52ab3009fa4278655d99db5e8f038258201cbfd240db8aac3c2b09e0b49431c4bdf43431aab48240bcbe8e60a39e0f03005840adf535b5b4d05d8eebee0c3bfb65c60f021bfb61297fb90ee06a39cc9e6486832f6c76b0901e84ee90cd47f70b76b001362a9b984de67a9aef4018b44f33980d825820733a504a29c23a5212240706eae13bc1e5097f96af76bb8d8114c42df0874afe5840a9fcf67cbb731eb67f46ac482d8669b2a836c83538ca1eb034dcd192551b667bab4aa1362cfe760f423fdceea7bdb603137e9cb8ce510b2654a9b515bff22805825820fdaf27b13edfc67eb17b97d256af7259c1fce13a737abced025369d8d07a26d7584039959c3587f32f6a88510f41ede7c5b614727de09bb8a018ec5e5ee0d33f7265e0e6d2e98a46dc015d852840d9de2c8a2e415a02cd7a0325bac47aba4357c30c82582076d46abc72fa0497139994345350cb2869a3331c1ef5e083a6af6991b19e9558584034c5e270d6f91a2bb1d4f165e69bd13ea4110ff794e8c71e61f23f46afe3398b933d6eb8e5e6cdd051283d600aaf58812e45ac4e5d83e7d4a04c4e7f09b0400b8258204530405601f8dc2d23d857a3d0acb634df8f35bde85a2b9b8705f15f3fe66286584099156c5a6ffbb03195a848f5e324286ccf83e5814eedbe251d7e419e248ee5a4c8ada58da3a5e43844e89bbc41f133d93f3c50f194d96553055d7d839f3a8a08a100818258207b4480dd972aadf6b6d3cbd315da689ff1787122c7154dc407219a048ac4569058400f45ea0f406945020d1f0f688642b58127ef8340e9db4e2e34051173c6a0210d26ecd2027622ce2eaf602f83ab68d61992a5218fa37ab2b285df96d27a706d06a10081825820480de73489276576533f829794e1244abaee03e082276b9abb91e63e3f7c741958401d6e0cfff77e8608100ba31aebeeb5ae8c151763ab40f2b2e6afde3f33f3b876b4cdabcaced98bb0dcf2678381dfb1dd61dd8b15f85f702fd5362a4744738503a10083825820e21da765af1d58fe601de2e3773cead92d53394bd099f068d6b4b3a05aa49241584043f26b66d46160cd5d71255680415c2c8c6212cc33f20460db5a47c01fe70d49ebd87092572c2922c629cc6efa265dfa44d46cc543b9425f72e0ecdc6b29e0048258202beb1b504334616b7b520d747215a77f1dc0827d0739f6b5ead9bb9f23c0b32b58409350bdd95fb7c00b9142d64d6cb633ac40c803682d1bc70beeb94e8eaae9530d8f407938c3dbceafd457bdb781e393e66db4d97aaa3d930b54bc94ad0bc7af02825820b7cede65455a5f1ccad5b8f6c8e7bb90f5c8700a0d69898a46fde787cc17ad9958409f4d76490b18c100013a78dfdf6e95860e69fa316c0db79bb7a1af8ee144b3946fa3fa65b4581cba1349ade3ae830dfd976aa41e4aee58787b59818648e3b508a10082825820ed17941e3d7372ecb154c2d720f551499d99329407b43ca467066a107722e06a5840c7271c500a147c5eefc785b562c4b8b62ecab9d9402d29392ada0ef2d7b7c6500610dd1e6468a57b535529cb71f0e3d151ec67e844f1211b3ea2992313f2a9028258209475fe1688e128c3c9c0570d8e45ea2f22dd50971296f3146f4f5666f4bce5425840b50e43869c5f17ea7a7d50789e4660f3feb5b003154d0dd2cd0addc054803b292d0ad18d6c334111b0b834f7ac74dcfe6a10ccf3e640a88125da6ab0a67cbb0fa100828258204a5e844e9fcb082611093834c2396fb31af1e3c10aaac2ced5dad12da25a801d5840b08aa3da4237208bbe145e8f02a5deb9d499d831bcfd2240fe0a23f6fe28aa738c2b8b4741add1ec414b43d2e3b466f158183c98dd5dbfe83dcade94af18fb0a82582004f47e15d9b626b7b8aa2f4d8eb6ef4db28eb88d0aa7fca62a16613871f9e4245840e26d24342d2ed5e2a1435e251d8b3034e0a86f3ee1d2fa2c7d988ec67df03e2d6b6e3dfff24ff855e6ce8896c172c3f7d0665a4c21d11e86edfdc8c4c8d1cf03a10082825820656d0d7d651b1b433e997de898b793a4f9c65fbd6fcaef7a0a48aa2782cf05215840576e6a5390587a7d8b0090cda5821d4097af7f2ae5014fd636e07c9c72a88bd7b01564bea2fa0497dd92817c89e76cc307e5befd3ddf895f2a7a19cf2c92880c825820b3e1c9b30cd03372d75c621b593c2f5d178915a61dbaf313207c66ef30c3cffa584085bf538b6cb64d1fa96332213f07d3a5cc25775984ff0d7a6cf417ddb51703d379ed146d7f8008e543c912d8c2a4874fe7b5d9c7f959a8d19418c9b08a70d203a10089825820e50d6eed62738a253e54755cc4abd3cb214d2f36fc2c5a524df5e4bbf562954458408ec298daa5fad5f6948426162a92c8dc3a9c5cadf3fadb65dbcf47002209724d6579aa110331d1c3cf62f1124f508064c961d4ece943c64aee1b6b34d070a50e8258205a8fffafe3dc149c7a57b7d9dd1fb8cac7d10983ee19cb15da359cf0696300c6584092a49118d2819b4db2fe794618a4aa18559818c6821340372c0f839a77ed1e181676c37b83256aca910cf8ab397d608e8765799c07f55025739c512aef358b0c8258202d0073e1986d87dc6e229ffd8c0bc8a74cbb01eff6f7e5c3fe08bfe5d83bff0758400d0e250c55a10c26db07d8e816cda931b892635a5b4f2fbfc5a21c48e79e89f4efcf53f87667134b9bf9a41d16fe6f806f95c3443f9cee508343fdbc529b0605825820ffbf31a04d608e2e30c1b63db42b871ffc868596f7cd921de5461033707c7d8f5840c8157654efdf53f016e40f3f26724751beca28bc9b77cd3e3ae51b7a88ba630e09cc9dc9fc38d4de8662f9508b13b7735f636fba94dac6425f3a60554276e0028258206d9a9e0adf2f72e936f14c366d9ac4a32e0136c07d154a483e3943b24130ac9e584016663febbbef7c9e99ed45d7e9498248fc0f98a4a4bab85361eb825bb48a559a9b74ee188084dce2500ca20c6d661900f73b774d1fc52d461f3812118aa65505825820a677787e447cd614ea3c24bb0c7aa543a3ed1bda24a00fae7596ce875bf4481d58406ab2f63f62cb47e68df5e37e8c9d96bca1b54223eadd5aeb711f937de1cf03e4751c5d3d17c4732784420d07a5c76703dc19e0dff6afca79d729e550ff3de801825820b79ccd3293a85b085cfbaded7049df4195ade260c16f95de75ae1efa342ed2d358405ca46f0c1282c0e8e15d948fb6c12d0d260a30d0b6431f5c76284b9d3230472b02a6ad003a79dd273a710cd67ffc8b957aa8217de9524415a7a0dd7458e0ba0d825820ca9d1ad5f357d7a96399d1602c6b93740f572616f40edff23333931b8dfe17dc584063fe7924100cc6916e2a296e003edb2fe78bf6384409067327fb150362bc3959168b5a1b402b9c333a837ecbd2621ade13866ced6ee3d52cd6ca45d301afed04825820f7c3bbc6055405c1152767d2bd9a9897d3f559c0877f020ceda5e1c4d9f8b0b85840ec923dd5b750698cadac440980bbd73c2054f84228ebad7e429ba6507922bef9cbfbfffa06aeeda704b7295cb75fa9a62a0407a518330a3c964ae211378e4b03a1008182582003f5afec693a9b7fa1f9d8aa1735e45828a522b1f2a8179049f3bf72f2077cd458404c310b536a30a3da17535896dd9ea3d50398f4fb22291345a250674e0f7b4d2ddee4a13b3e22011bb802dd21ad1f835d4a6cbf3661615bd49607ff0c99aea402a10081825820f38a3933b3d69c1b6861c8a0d0a682fd6ab078692d96a8acfa36eda9ff34f5345840ef890b08d0982cceff795e5ecb7d6632ba0cee73a46f8291eca3cc7f38534f74f5eaa84c062ef75d9b90ecbefd3d210ec0cfd12d8ce28cc80aed3db553ed6509a10082825820be627d5f650c41641c2d59113e82ee85cc4635f298cd9a05dfbe0359c9fef1d658401efdb9cfb499cb25b3a0de74c29f3b6d3eb11e278a7ad8faa49511d26c119e049796ce2c433cff1c42fde44397ee00e1f205ad28e0756e9b51e2f4cd911f9607825820d63b7f8219e2c02d49154d7f76280c11db03268d269b0b2aa9a32356fb89eb4758404258db08b892a8d6edac6eb07cbab6228a240d6de6faaffb8b9073c65f45ef6d23a1596e351875d0c37d398bbfa9341646ce6cde56e8a89baae6dbcd606bc306a10081825820cbfe0bb9bcdf06c1bbf76aa2d620891d9adfcbeef810b6f4732f19eb7157049d5840adeec75330ef36e241d49931b15dee630ef4f6a84f7fa70dce09c7b59edc38a4da4d833487581fed08b594d6e6d6005f8219ac65dabbb46a2dc54d7d619f900ca100818258206366828f1de7ce834fe8ab2b06d239a562bcc4d9201b788a74c6c6e8dd0580ac5840feeb6e8107d27303c3faccdfaf05ffc547afb2294dc0656348dd29e1bc72f460654f1f2ec6ae79a9c80b5aad104dcc37bd903c01d44683a8a599032d7b7b530fa10081825820ba20d7e2a43cc6cf32e0be9c7f69a500b10947cc26ada6b2d22cf5c798d3f9995840787d1093773ce36ec43b54a779692d62b206e62e88ca96b83a7cde8da078d8c4ab6977a7cb31b26ea33548562862cfe540714d9d3ba26bba7c971c265ad15a05a10081825820f63e75708b9dac726d03c5cce372f7083beb79ee4bf9692360cdba21ee53fcf658404197e44209bc9a3daf7fe3654655f3ed0c20e933e3346ba5bfbb1889eed0ab50c046b85107be0ce9d65303da71c5d0235194453fcd1d5e37a5047d5ae1b5da04a1008182582030a6f32a2ce36aba1f3c530cdcab323fe0e4efbf9bc7e95c7e76976d8b344b3258401898e551a15e4330255d10bcb160a851312962a81e5231a8937f1a0c0fec240ccc5459b1d27d1f1539028d21de14d21281e1dd9e36570382aed872f3661b440da1008182582078227809cb993f04fa5279a34e983f9339827ddcc43d54460c53abcac4a939d258401e31ef026807846c79b6e0a65fba7734dd03979eaed162598177c4604f5572a03ff29ae6a9b176e0aceadecbfe432a56d83e53f0de9fcf965b8131f98d3ee70ca1008182582089ec4635655f66cb53e59eb967fed27a85ed0f7e9c47135096e132200715b4c95840a02f6962bead61452b764e3fa8465a959742149e24ece5cd732cd66d1e861dd3595bb41759b59596627882378fa3ad26ab1f3bce3337705f37fd9b6a7d1cd004a100828258208cf33ab2edaa98cf2e4de2a5f4f8e1439adf8a6aab369557449db940faa9eda658401ae0256339faff6cc855c1640873be702991c7b3c7cfad602c743f6c17c4b4ffa392804c3d6a64aad99fa1590b1d65c04958a71c6821bce43c39b168eae9f0048258202e0527b6b5ac0b13771582fbadfd992f812a8fe3cae3c2d22e6d7337e733ff74584006a755079c809b520401d47d1007179a7d7119068413fb4c75e8c5a781efc7a5160dcf8e3cec78b4b07e4577fe2f9b59fb20872c7d0b359cd43d4bfbbd891806a10081825820c1a5c61ba3abb08ccddfd7e502ac88280a6cdda0a73ed269e0219e82d1a1769758409b6be4ddeda7f523f92abfa30c17a3b9fc0f55a77734425c44fcdb66cd9931a380a8bf7a215d4c085dd70f524333c16e6c7909348e214258d697e72eb194b50ca100818258201c516a01c6568160bf69d6e88fc14e6139bcf65ec4640bbf995a8c1ca23421a15840b6dbe9fb9184d610452487f56d60deaaed4aacb4e6ac0630f5edf679c450eccd4c627c4e1a456d8b1568c34cdb5509636e6410df4e24d51f84062eb4cd2d9f0ea1008282582015123e033b428c0b8a4bd20a89e83487a6c29f9f36ef658efef54cd4ce9c23e958402267d3407d64126b6097180f26b524e70c9ae8abbf75d6fcbd20dc26d8b1bbef52bc94b16da8fefefe1af7573d7b97be5e07d98ede14024ec2880fec3f39a40982582063ebbe96ef6f90a7775fceb4f3dd68645a67277ef7156c901f25bde7cafa7e29584068e194e2cdfa97051b1cf7c13533d15f6d3c998b0be27bcf9b35935eab2443588d112bf273f76fd21e3c742693598da6e3eb825cfc285fc998ac091e28af660aa100818258207f7560b2e1c583898d141c7111e0b734b7f3ec31f2495fcfaf084d37f353598d584091b7bcc553cef36f144c93361d5adee3bedad57dbc2251353ee045dd1d2121d926afdab4746e61af03ae0d20c7a235624251d8cc0b4185571d9083bb488b8101a1008282582094536dd35aeddd5f73470519b8e3bebae42e37e5c87a272831653056ca8a1b565840d97839593d58b5d0dd5e33bbe3258f299f88b18062d17ae274f72856365b7e8d65382186496c3f6a168143b62063563e764a3864a68d1bd342eb734ba53db108825820683242d80926e27453a51a1865e0d1e23d2aaa043ecb1ccff464845b8819c0165840054a0a3a3b848b8a5ba2c6c53b5915cdc1e67efc5afefc5db7e26f661012048fbf43cd0325d8ebbc8894d41b7920e5f9940d5274421bc2c0f65bd4cbec754308a1008182582017766b9b772bbea18a6b8123b8f0ca256850ce033e9a1bc1c0b38805672e3aba5840b8b964ad1e6c89a96f713814edd50d74e447c1f2130d2fe5383ba7672fd33805494394fce309148f1565428270b1ad89b5a892fca77c04eb163a7308ce4ce800a1008182582041f62a38f8c0a66412fa02297adae288dee6ba72eb17d8c70b2bb2b62581e9a75840df42e5d4958617e9655eacaf20cc5a62d0db33008b5af1fe0c402d86c8e0f19ab1d9d608a8c3fae1aeeec7444e05eaf9b40775df685b2bab33cc23fd1bcc6e0fa1008182582067a13eb6781175784ba6bb8e9b018e9e53a22a22b406851c2bafd96d2921ffcf58401f868a24b00a31398b5751f050945ba374fd21bcfeaa37069c40131cf7099fc98d88016fe5562e4785f13183f5014c7f32dae56d848a5a196b04bb10c2a87600a10081825820dd1ff92df0781c46662ab1e8a049cc201e1c4e43818d2d1553328030027e087a58400204644861f873a89b34aedac7ad869aa0aae514aa414e72cdae4e9d8ec763c83aef69837e144135c81e4ff769c12381dcdf4488100256c905f3c39d3baa8506a1008182582061f0156e418b51b8d330080f7bdd84c11636b410bf7a653d49949e83fba860115840f12660c9a00b5fa83f6f1385cabfb2a9decf3d17f0587b89024143f6b7b5fff4be3f7d7c32d0faf061a46119ed2701c965a737df1c5776a19d360c7623daed00a100818258200ca156e9191a9ba0be999e6ea1b11919b7861eebc90a63e148fedda0a4a46e3b5840ab6ea6d6631392dd276afa10dd1a1e3d2d9a37c3fdd5290a02fd410f9b7e5ebcaabd08d564ad968b85ddac82c3258b76320815beeedae810a5fbf2383dff4c01a10082825820ad1573be366b8c584e674b56f5749f028fec2547c442d2e9a6653caea71fd2e3584005a729235f12a987993224ce4f9c3e5b6bb1f737e8e97d9feb89f594598a1cee9e0455a024c7dca5339fe3c4fdd848b4fccdcb584252891ee84d381aecf99a09825820e2187aadd50d24747509cb2b0a6dafa6b47d60ee9346544d739b58edbb9480cd5840cff84f991c4167ef5d20f7cf94c9c63871c36f6c9a17a88703dced91b7e93f71e572265334c50c232cbf73264b4f2e690c9c8c8d9ad58fb959e1ed49aba64a0fa100828258200ffbb076c603661de19534fa065d0dbee084a81cbb02a89977ebf579d691b18e5840a881d0086c7db886c2a662d70bf11ee740e7ddd97c279878d1495a2296a94b3d17805af0f97cec39b7b7a9e25398f4509c971ad2908bf9f386aa5d86d6f3d8028258204eee7124659c53e2a05ed5d6b72e1a185ef400bb0dd492fc3619d7e4f75243ac5840b9aa744e3f7fa90ffa3e2879c82885807725e5cc007634967925484a7031e2a4b29ce1577f0a6acef11d6929baa6739800c2bee0e7f12c3477d4f9bc12e91e0aa100818258200c0a5e38d658b551d45e7a7b0349a98ac40713f3f5bf5be97e7d215f076037965840f27c38d3a32ca0d13f2f1d2017029119daee1b5c0fc501f5465a1b2ee17b3dd5ea44a2b61effbfd8e7731d1e1e6644978354a8b0bfe0b631015370395553350da100828258207c6763ac0d8ca41c39d396bc08310e1a8791b2b8fcff576ae983a23877d306f05840b99cd72e83b4164e3fb0215aeb4ee82e4e6660070c6af3117dcae5771f645ac16149b3322114f85d622e1116c1f0c862c89eb0d7f2dcbda8df63ee34c5d8750c8258207df5da7cb61c0f164aa0e387617303eb4c06073474fca34f284c90b822946c1c5840383cb3e437f22f9cd76649c4ccf77104674a53cc6e9a2b30d7badc074ddc527100b4d3a741a7fa99df65a173935ff8bef39a439f69e6728aef22c6f7bdc28204a1008382582079e000393817ce69dd367180f8ffb795aae2a3a6f058c3eb0e1a666e6afb85745840fbff192dd1b9857de9db0241f403d4ba5832e28d424b35653deff450cfb350715ee688d90bf213aaf975868a04648eb05f61c2dd1f4f829010d009efdddfe503825820af2de66783468ee8e93f385826dec7727459a2404f4ff2e943ebf1751284d724584067f8920919f4f190ed91a22b1125c282832dd8b01650572ad37c5946b199b66c8b0f3236e4f93d5aa4ea3d199fbd47a2eb1bbdafdc7e19b10c42dae1889477058258208812a4cbd448d749c3d8117e40fb203beee66450b16029960c9e42973adedecf58405899925e2a099391768530a9057e02d76bf4124242cca279c3a5d51c93a4696264a4ed676d488c63fb9ff6df5198e2daf760d883cf12264fb2c9a4601a3d7303a1008182582042eeeab3a543e0c33426fff0b95b4eb0b4a67a956766c13661f356a1fd4395545840b6a16a3409b76f9945b3c458879e6e980571f695851da81ae3c9a985718a51ca12e0819e1407b47842823334624845b52eeaf697033679dc737ecb1346898304a10083825820878dd61b69d2b22771da89a8a105ecf9d7ad784d546e5379ba42ec4632be1ca85840c67798c79ec556e15d64dc95fa08f5f0f923d58d4839770dde6f987a1fc9d9379cb008026bb91c0ba8478dda8f19634e87de271fe6575cc0f5da0b5734c1f10b8258207721dbe9aa847ce3d86e4dd1ae87a3910d9eb887f1470fe2f3993d318aea701e5840d47b2fa451f7f98d4d2272890f48a24679ae1db4cf29f36143da8c966061e21a91f3eb2fbaef45399cf13d2c737289bc5718600504ff45cf600fbd4ff01e2703825820ffc225084ca5478a9493b1d0c4e597aff68e2e2e5aaf4718c46785359503720358407a8a8b2e32db48221ab953cf8076a022ea80e9e4ba318388ab67432e44582362babfb112aa0b1bf50dc67daaa592882d3f9f36398cc46214b3c6b95f047c7b00a100828258204b5d5ce3421ed52b32bace4afad15246090a77892f52b8d34c1dfe3be8c5d1505840285ea489aaf43d8ec7c3eaf0bf6efd9afa562aad57963601874e2b540e373a2f6deb936a8a87f30059fce72f52213b5c110a2d298a6be4cd9cc50440488e51088258204b5d5ce3421ed52b32bace4afad15246090a77892f52b8d34c1dfe3be8c5d1505840285ea489aaf43d8ec7c3eaf0bf6efd9afa562aad57963601874e2b540e373a2f6deb936a8a87f30059fce72f52213b5c110a2d298a6be4cd9cc50440488e5108a100828258205bbbc864082fab561549ad0d89340e919bb11481ac5cdbe90f31d261f94e9a0c5840d46ba4df65bce9c344ab53c453198556a44aae6e0c56774f6e7d2391e3af934e8cfe48a4d8850feb746c2167f69122e2cc060f095946c982d1423555f4ae3e0c8258201f4af7ee145cb50ddc2f8675e93bcda2542a8edeab17a07fff0d4d82d78f28805840cadaea61547c138242d34b4920eb0dd7ca35de2340fb26e995bc3ffa59abf4eb72ad061b894fd42df4d9d6a7b03712a14a6c11761b95bf7a4cb77511876e7900a10081825820c983f9ec2a7a013ae7c54387f2335526e0af4ac6584e2e6faad8d01e5ece79f858405689cdd5559a47584afb1e599f7802b4e1a65f55f39518bb002c621ac1f3228b213d407d4ae2938bc717fc958959e6a2c4a8395a846735797d66cb22dec8520ea10081825820e894b35015113df5cc5bfd8a931a5f68c2c2393ef2c6d02b7b316dfa7ba213b95840859059eb5e326d10f80d761011f216ecc10e6d61c91d9ae0366f87507d5d20eb531c11d2c53016d563cbf901ff43c13d6d3b3fdc6288a9b6b7d5addf8a70fc0ea10081825820cfe40a539a49b739130eaa627fd9ddac5857be167b7bc3be62e20a7021285ad6584011ad022e8d82d7fd9363c5cb9c3881f92c7bd8a724eb6c51fa0b1192e15dc796d768931e899f11cefce6a8c15244f7d5227bd051db5144a553f7878a9a39d30ea10081825820e8245770c90c9283102ab8948142ab1be6a6877c22a29a3a6846af8e3681f5fa5840222fbc79bf5dab3c56f6ef6edf503aab05831efaacf2ab4d9e92af36b747d84cd3099869b36d836ce1747817d80d6a72ad37e73ee854267aa0aa0355bdd44305a100818258205dee92afbf688dfa67608584c9d87863c841fb3811ccdce93525b72055e28ea258400902545f38c3ce088b6593a1ea0bf45bd24a236d90b801fe26200da5387b8f6d5996e7e42fb872670d0b9271a8caa9edb671a178846c14b3c0b16cf895f7540aa1008182582008baa5ce3ab92e3b2435adee25984f4fd37a891ac432126515bac4ca6b6b6c5c584032bdedb16f1b0854b7f1ed4d3f3c041ba1d5365e5126d5ba059262e527b28bd8f53d00e0504957ce03f5044eb3d8031dca4ad3d353aed497d5a2bfe4fe8a040ea10081825820434f2fe055990dadd6f8b815335b42a7ce1c278dc673be72e5a813a5fffdbc7a5840e29ef5474a33de380ead6ecf8ad0b2ba7bce615920813627a9da14adf21ddebd84389472052e0c356c688b31f5cbfbca917c9629ef7bbb2b4d3c0e3d59fe4f0aa100818258208e63b525ad66fcdd37b0bd7aeb486e6880c7bc62b01ecc65334225e1d4017e0758402631d20c12a95eb5feea9c4d2215a6fda1dd42eb92069465ddd22e230de9302bb17dcdaba3c806410082fd7c7b9e717163fbd732f43d86a6720bf06d52675a0da1008182582055019ca54aaad3a659e0715bb4a05315030abe3ffe0f1fdd0aa388e3fc2a6a645840210029efb79ab15d640d6415566067195474f788c3d2b86102afba3195c8460bbed09ec2e9b51b0247bc99569e5b22d370eb9bf18c9956239bbecc235d380f09a100828258205c86409bace22f9faeb42cdc45916085798fe380b0bfb3b0cf62229838bf361658407b6a454adb35034585ab77ae9cd92ff3147c8fb0f62eb35e1f83dc94a2b655c24843f04044499682e3150d148f673fda3586cf522ccd2bcf2a51e9c905943701825820d20dc2e19297e1bcbe3e7775f6ce4ab70eb4d4890cf8787b12d9d37b3fa8723d58401b37ff2cf581fa80a8ae92512db9accfd47eb7f894d22a983672558b8ae299da4cc25ed74f72cc82e5415073f671b0b80ea62aa15ee2ab342a23d2bad7f30004a10082825820fcfe411d6ff70851a5b97ad8d7ffa29d1d8bc98c398476d0e6a52e5500a6b2c658409250dc2e0e3b7d10e084346f5fd7573734227b835820241f6fb357cf777ea700868221f8be5755942cee13c425ac59cab2d66ccdb78d600eb91a1eb762098a0d825820fcfe411d6ff70851a5b97ad8d7ffa29d1d8bc98c398476d0e6a52e5500a6b2c658409250dc2e0e3b7d10e084346f5fd7573734227b835820241f6fb357cf777ea700868221f8be5755942cee13c425ac59cab2d66ccdb78d600eb91a1eb762098a0da100818258205e195843fa9f2c5b3c8ef96cba41d27c3f0387837107bd99adc2b5003ef73fbf58408f13dbf8320948b4ce974b4f2da050f6b3c12a164617b46752beeb28ef55d8b62392da86bcfa8adf8611198623683ce1e176bae68c16e340a08b55a4a67f1c04a100828258205f8394a2abb3ee43c825c54bc0dd39176f83dfdea147766a20d80fb94571c32e5840a833363dc98b590c3df22efba0adbd042e0222abe4e58fa7b897c2960c66b45862d6a74b0736b58ea826f22e46bec50d1a83ee64ed57b33ee67ae950a87a850d825820fecd1119879a4a7b5ef28dad5a6e5b8e523670b4277cde8ece21ab988f4d3c985840eae1a336d9b00c0aabf2a96bf5db6f34ceb49e233c3b68e25494781aa9808a23f8b370127b1b4a6460c0cab30dc166a3e9f1513a36649acab6e301670413ae0aa100828258203e9c556c0dd32615166dc28dded1f633409cd1c0cb71b6d2a441466a05e9146858409f14adc70dc8e004b4754ad6b4725b793e610f7b9fd5bdac0badb2d3d87e2eb56a6d21e68cc8c3bbc71838b76abb90eef8eb0b7acc3df80337c121e3ce285c0f825820c0c19fad21788560e60d7a107512850c5c9b2c00e2d516c58244022ddbdbad66584072731abaf09fc8566a0f251dc4662efe40c012d9710d760204eabec7a4b8351ea24ff0ac12059c5849ca5d47acbf1560d7697eeba15fa4ea6675ef985d391609a10082825820f19d7ac69e53a8fcc7144ea64d2327d427f22ef25060980c83e77441c7b095f15840ced01668ceeb3dfc4e2bb9502d00b599e9a36d46e5c0d39737c8ee9853ee75ec185d2ae9513af07b3614600ef6795a11310da66f746f9a25971c1bf9d79ca30f8258201ad7728680b102def3e8fdfc02836970babd9896165ad987f02888ffa9728e8158404ee635ed0dae0906b0cec0d7601625e444da397bd049fdf7e14e9d50c3fb477beaa26dfc4b8601efd48425ac551cfb9ed07cb660d164f931658cae0082068c06a10081825820c8cd2f12dda444a136695107d8c99c7a55140c9aaf7dc2917d13aba8b878521e5840a05662cd8a7b65de79bbe1a07727e3265b28da1aa56126aed9caae789ecfc0abc918d37c7d309c34d3c5acc03b3fbb49e8c689586f8f36f5d44493317008a903a100828258207717fd4e6722f1c2199bf2cbffcd02b85ec6687aa57261afcb186e86fa58375258409c401002debbd821af1405187d93ed1f1561fcb1a9244308eded656492f2b20e00fdca8d3aca031fb96f8768a9360570be2e1cee881690f0b47b4547958b1e0c8258206247eee7e4493e9983411fe4805709892229ed8c31ac5b3e43380609f541c8cc58404c1a2fb813fdea5984c008946eb275f442e7277da8851af134efb2754fa479ce5a12b837ab5c92c371b5a2bae34aed4597b28c1f9a03166157ddcda9b5e41700a10081825820c8965b2cee16988a0e18e91199bfa210d6d56ac885dfe2a486dcd902a1c875415840e7c9598b510db85d493c2cae6438ba090337b6fe3d20320a9df2cf927f79f590bc452a5957e5a5a6a76928d8cba6e3f6b4b833e057d87a13279f4f56e86f8807a10081825820d4d423e6b3b70f8800b90fcde76ea5876eb1eb3b85ba2a4d20443af028d4b1aa58406e57c6e140f252bb5780578e041efc6fb7b2d84f92957426cb4cbbd6c00a2fffcac742b40b6fa62e61a40bdb42942e769605adc9a1bee229fa7b478cf3e0b40fa100818258206c0180db688a9e477b10a7792e3c4efd749cddbe0e05068b6cb586dee5405697584034099d37c57f1e9197a890a6d91874b0c3d2f8aae9e18ecc55d7c9031c70a34c72d39c37323a2e5eec305527136b7e1f5940d19e7e37817a1c8d71fd4718cc0ca10082825820381725fc6cf42c9d29bf8b97959e99850012468f78e2a31f3d770a030c02d05c58400a97450d6aec2af86530c67c8cd3a0500846fc77f802e3588c9a58df3d2f45243a93f5bb4e296b3323bb00193e4c0aa39a2c5c02646682e4311aed0b6a52b40a825820cb2758a630a624338d9fcc53ad153ea99172448e98d742621582ce258b1ae3f458402d9723385bc73f778a0289d15afc2577d1e1bce1aa4babeff046a40d8373e668d3bf4effa194f09a5876a719eec2ab1d69dd5854e1597bc0cc0a4b4df56b3406a10083825820cc7aaf6225699d1ceffd26b79107e36d73791a301bb513d12732af5648c753ce584040c490b9499e0e6b1cbce225efe7b4a7932bb57fda7c92a117b67acde94b403e5fd3c1e463241e343569b9214fc4474fc76891774c21298312940948fb635e0d825820c5b6e998dbe75eebed290ee2d93b35bc06cd61c6c5a4a278482f129595ace98c5840a2e99572b48be8190445fcca565b350c33f7b25c725ef6b9aa5ce9985bbe09bfb84c3d18b1870e652dbaa6fa0e0c4b46e2d5506b588695bd9deb37cbe36ad9088258209c60d95ef095d510e8f814e2a2c96f1a8abd51fe3c09c336c5fc3850467b9f7c5840e74adb2615c3c2b46b80b4790ebf19300e32707d8f49201c747e356296bfcb8a208f5afe1e362aa8fbfd149dfe28785eb991f484fe2d4e032468956f2d0f8705a1008282582094d8fb68143a84dbba1be5313a60948357317c44f47ae5d75989bd87b23799515840b339d645edba5e7dfa992f792965dbca4bf9c58087360b26ae13f9213e767197aad8ffd7b9d03e86961c887f54919cddde9a0d981df0777b4afa49512bf8bf08825820b4bc1cd5bcfa782b3f78f932fa90bfe1f513497c7edf4e839ae94313443868ca5840dabeabbfb27919fcfbcb3279034b02199d61f4a59515720b6c49deb5b7ce741adaa3eba0469c34ae5416dcd8fe04d5aa355f4a056d885b9a521f1431f6992e03a10081825820b9e6b6399c004a55ec74ae4a5900ff63f35cd2ff3ea74de35a88febe1d80d637584067f23fb1d0ffef74e4414b318e4f966bb3fa123f4cc76a04de7ff30f76efbdc99bb2d622d83800a9a7fe1c116f54c80e4d52d1cc5586b30967e2005596aa6a04a100818258200ea2e04400f7e2ccdd9789a3acd440a738679baf918c5f5d80ae31ea67602f4f5840cafb53e882c86a937c12d1b074b6767383248df98f602ab3050b834073c7a7c67caea9fd05861e4728a06182bf526d86d2a9607892a22a00540953edfdb6e900a10081825820a4b7881f8b6e22941410c59890ad6f2403f085eeff653b6f796cc8a5648c07b15840dfa7bb0326a18ba71a844238a8359f26cefc4db0a25caf25495ac79bf942b74931dc3cf58f2e56f244dcc2a5af100414f052f173d02974ebf4b672eebcfade07a100838258202fbe0fcec735ad5c3b1f144a9315900b5e59e8dfe5ea2055c62eba9e981f43735840eade856a1104ad8113ced645d792418cea08abd3f7f6dc7738714cc9e7ddc9395b461068960fd68fc6ad7627aba685c8b032def1b39434d962973f02fedacc0f8258200763528d131bbe22613200222ac6772402d53dc9e07f813f8b62418a5e6e13bf584014a69ee7e7af3fc951f62ec9aabca81d73b682e746d5487eabf1794b4c132827c93e6207d95de9610872a213686d0fe3b41d2a1282b7479618e7590fcf82ec05825820cebaa245c40e4029931455880a346e4b4e44b8c90eb7f5b9a4cb607ad60c1eb558403d8de5c6a0cd7e6a4e9763c7bc2a3bbdc18b06a31c8b45357a86b335fd44a70c2c30084de37ec9f5e67a3d6ebc47f8d370f3906b0b07594f5192ffdf5a183903a10081825820bb4ea79725e3314024d3aa961b16db2a1515a6f9382553e6872e4a28180664c358408dbea3c848be7540de29364b5b2f31cc189b8d7ecd775da9458bd35d3042749f0e506c377f40fd034e33a1f222bbdf4b085be8b236bcfb0f43eeddc03d26da0fa10083825820b49883e13286158cc4cc7a0cdcb810e3dc51e47f9267a814a318acbfc544b7c158405dec8ba8c00c9ad40443af6070e14dff7963a371d5fe504a281af7ee925eb6f023ae88939dc070bf91047999d6906d637f188a879263534f6fb155a7b747b10a8258200a78906b009e4e36878207f5cc149036b98be4aff39b41cd2896bc5e07e879655840782a6ec6be998e115e1a2375cb70c460bd988c4a7dcd6414519dcd2fc14ab3ed6489aa8d8eabada798c0b940fc43c647b3babcf5cc1f53f71f23f7bf27191b0a825820b13fe7577803a259d3db9b22d0893b5b07be857017723a2a73466d4ba74bd6dd5840b813987a2185915db4ad6f9ddddb5efe5e2ab7ff0d12cd0c3ab1d3537aca79cecbdfa80575f26417048df98025bc8f6eb653ace85cc350e8044082c3f1c6960ba100828258205c6782f380954b5761a186a95fe4aebffe7cd6805741d219a6edd9e3f77a2a425840342f79ec799457164e2d3fc04d16917b16a03573209692e1336bae732dbeb0b40482861e3f180d89d14764518582434e665d6df01f047482a1abe9de0c84af09825820b1fc4ccb896ac806f0f81f6182931a9eabf7d01ad5e750abf97d747fc9634b9c5840258908f5b062e175d053ba32b169341f77b1a5368afce4481477aa4ba7e920330deb98066dc18610b8bbd0bf626ebf2d8d74ad3ac2cb68b03ba9b0a8072daa0da10081825820d8e1b74b3530f4e7bbda71898e95e09d69dd674693bded2de8379d547876123b58408624f15078e2cc50696f17161ba38849312525ace3ea6ee6bda7a1007f8e6a7d1b7b8a55bd00f8d6bbe2d5a093acfa9baf6e0b3f6f017cdbc27f739fc3dce10da100828258205edfa2c75a7c0625df27bf632d641669b396853035274b09b48a38a3dab416ff584041f0670e02f898152b71f777d5de602c72e02298931c8b3f81d782f58e2cee605ea85a1e1a8c1237c4b16a67856050d5eeea73e70931d41b6418fae097c6cf03825820cd6579d633c24d90ac87ec2600e73aacfc847654c993bb10831690b11d95b72a5840e039a88c1023a65057b6676c6ee6bb5a1f9314c0f3223bea530225eb1f0508ec68876bf8b8d76bde4d93c50fea4897317b503b3f46e4a52edf50e54f214ec60da10081825820e894b35015113df5cc5bfd8a931a5f68c2c2393ef2c6d02b7b316dfa7ba213b95840064437f0c53bdc3e95fa2c4cbb9f1665e0d96a24bbcfb477ccc0990f368e05ca1a62c8c3a12bd1b8b129191e5d367db9620cbae3eca6de578184abd6eb3fba06a100818258203aacf7b25f1c7c63b9cac5926fc95e1fa7b5c7861f037fb2eddc7d15fc1bddc058409509b1225c220dda5e9b595f7c31c96a17b8e7f816eb25700c684f89c729ba8d6276cc4d4b5263b12c3e1a6811394402a069be275fca822b7b8d6d019e4dde06a100818258201c516a01c6568160bf69d6e88fc14e6139bcf65ec4640bbf995a8c1ca23421a1584083ba0bd2048a5a1c6a27ba4294024e492a3ba253040f10ad110b8e4db4cd48860bbf85519ec54e58c06ea06898eed2daaaaa0d29baa2a36cefffaee476c6930ba100818258206687a36f0a4b8abf2671f8affb7febeb8940e9ee83548d2a2924dbc74679c4665840bf82961b37609bf2789079000a076754e3a9175fd41a0252f0b537243d11ca9e6ca3ea2286a51dd5c75997743e16a05d4d3dd5ad6c63519a60fd4473020a9000a20081825820db31b42d22a4a0df3d6f422467068f6307caca38efe971ed81eb7b95670155565840d2537c5730349023c6faf8cb1fd4e42fc8f345a59352d0dfcfe39a62efeaae29b5230f00b2b816391a381fcca5125f63de7f2035850b9bbb3574cafa56f5de0201818201828200581cf59b63ca9a070f71705137d4cea7db1e66ea406433d7d46d5574c8d582051a038b1424a1008182582016be3618ca81eeb812f5014c138cb8f3094c11274e3cb17ca3b26b0dde94c8175840292e066c96960b2d4f76a80983b16f8d0a1012eaadba4cd829dd5260321c8264573959bcb8860af7d076f81001f5863ce22f4401b1120e6c452c4bb06f7bf00aa10081825820eb047f9aad506609153972db9ba10ffa5f97dd5ca81f2fa1aaa4169eb95944d95840cc814a3ed2fb1c2dcb19fbc6c195021f465bf023640d4d6df75f34e19709636ce8a2ecc58aa8312a0149945855d502d371a8188e2de43bab070fbe974555dd06a100838258203971b7f74477924424a4dd12cc03aa7340f3d0e9f0099b780b9c9bf89a6048fd584000d7f79892ff28ce9346f9ab0a5cfda30a688e8b2b9bbf521fb3be8bcb49936d6e004aef124fb9ceed92a4b5c344a66cdb1273280336e7638e45735c4b20d900825820463ba23e4ddc09795a8173b8b2e08c90c8aa94be54e5e54afd94c4652b0804a25840dc8afd8e29349a9afa09cac1406a0b9caa87aa1ca8bd4b63ccf92b5d147a2f96afa1796cee5e6c1e1296c0b244bced3bf84d1774fbe05cad553390ff9f5d6a0482582042d75640bd9a2d1d4916ae24404697548a0b8c98330b13150fb1be3a4bfeb6fa5840a6c2fc3271a946f80e1c7721fc165f6cbe2ee01f094d770163b11a54bfb5bb50acd3df8118b60d5d1910564bc6508dacf437318d4433811b17d89ab4fb329d0ea10083825820e495b27ed8ed2128fe4e6820c4fad09a94411bae24325bd2ddcbf47fb57169ca5840c003ccd0de68d8e41ba8c0a6dbb00793071384994ef61a75462084cd7be116f8824718907a4286d0b08d9a9a1312d15c195f8df982527ef0bca677676df2a703825820fa98b29558a8ee4a59ecc5bbff79a02d9e4435161b73de7a677fd10cdd1ff2a658401f81e6bcae941c00b1174c1bbe65f839add3d8ca476566716e67ee80e56bd86ec143807f583e05d73c5982011dcb8cca4dfb127b5791416300d3393df8b6ae0682582063dce386dda6d1144a4411652fc456a235dc6ca9f7962898252f04ea228734d75840748b2d85dedb13e689c1ea8771f2d0814e354edcb55268df7a81a076c17dd7c828bac3d43ee532d6dfe074c13c34263dd08c36813989ece0498a269d0bbba608a1008182582039a8571b65b0872f0753308feb8a167e00a7ac1ffef59bbe9b3fdd8ea4f5347b58407f50e78b7a4f1591c8698438549b816f27be65e46afd878922f66a2409832649317b0e75b2cf0900f7ad0713439a9dbfb4c7dd460a5208889a9a7d22d1806606a10081825820c983f9ec2a7a013ae7c54387f2335526e0af4ac6584e2e6faad8d01e5ece79f858404842a167da595521b65b2b0b7305c8832f23f188338dbb45d7f83f0fb1a067e60726e8f5837c46aa6085d05e7bf5abe65f8c89d566fd7cc4bb57d6e9a161d802a100818258207ac5c71c95cee1b1c9fe43af6bcd6b6e5de5253d4b29cf07bcb2f8885dfbb423584070ea822c3b6915f11b4edeeeb08d9577278de427c7621f945c74a6451c694a2685a88d1c1c7109896e4bc3b963e98d2c304bc9c94d998eb566c9a79aef737f0ba10081825820d3f4c3237e01861439e9502d07a13f2632ea5e653bd43ff754d8f1717177489c58403c22934a39ba55085a7a09be933bfcaf8181426915ba486ef2a06f7d2b1ec5b92927fb889348289a24fa810a4a42a65541618b010b4de94bc765ea339ac08205a10081825820f63e75708b9dac726d03c5cce372f7083beb79ee4bf9692360cdba21ee53fcf65840fbf5dd440ef185b6da148897a443239e35ae50769692f9d18b4dd2c0ff2dc101d0b17acb0b032fae1960bc48e96c9dd16bca1184b832fe9dbd70597f3f3f9e05a100828258206aaa8eb7eeb9597d4167c96194ecf7c60f732718ff5b508c950e9bea3df2c7a65840edc44b4500b8bf482a3fb7244e924eb4535d81adc96c39c9d08ce2c431779780f8f9fa4ab7292b62283cf953caa3491bdd83b38f8502243eb8ffe9efccf69401825820b0820b717d4c47e17c1fdd00a36644b57c97bd17dfc6b2acb9692c9e40ad16ab5840678b2ae8a43756d90ffab2a54747c51b92e0f680846565a421a1f8e64c43f35e66c819b0b2e54af52141d9d4a2e037212b53eb04f1476a60a5f60555cf523202a10081825820038d2b69fa93f4265e173115c2b963c181bf77a73bfafa78cb98e3ca0a311c005840e5097288b21553c6b067a7a037d015df039bda27e87e1394ea8dfaf6e2f3c1d139ffedb74bb2a4622c66ceff2e73a7fe75ac165bf1b2bd7a2645f5ea1179ca0fa10083825820cb1e37c96bb7fcfcdb19c5548cee501449071547bcf66a8890fdc9cb36443fe75840467389c4c295e3bc389401b3745ab707eef8de65fd5a568ab393965993876a2e06465c3aae8607514123539560a8bfa62bd3c86b872a204ba9eb20421b7379048258201c89cb0226d3ab122da16ff42d7ec4714290a7e2a1a8f702751eac353cb0202c584059d13ff7a696e618f8df64134bfb0df050e987bb400b98ee741e3832c97afd4c793a96d8f74807d56f7e4faa0704826eb9a3d1f911b6f3353571ebdd9f2a3100825820357128c7ff4c8e83dc05093b3e72d03fa4acbd72d6fe60b3e001823dd0c17a68584085b300a0ff8ca962b680615fc7bae5d50f447fa75ec89769e154ab72bbd39dc478cc8baac2c8901d8f170fff5f3c485c23ea34d584249f35942ad7576c6e5a04a10083825820f7654b5549c3a288b1481b43209f05dd51497e0561565ec2e26a8dd8ead4520658406428cbd6ad1566442f0d1084a509096ce85d6c569a429a321138571ed2a730b8e778bc8ba2ea58896da5e70f4d67d0cae3cad443835d7d9a549bd0981a665306825820669384bd6f8488edc53af7efaeffe0f7dfd328c9cf0a275566a99d083d42384758409f306aea3c03c57eecd3127cc259f34fc5136bdac0c7fde7628d5e5112b699b244111d41e4cf50ae4334131b9a86b6cf2a46f3612d76f9dd6427c398e5cc530c8258206ee50e48b8b627eeec41675fc8376f6cdc24342bb9c8420210db5438bfa708055840c5ada5685e5fa2cd59a14792fd6d8de0d11b04f7062910007a104c3b298d71536a53d1f511c8f5e5cd410bd1d42f6fc49529cfbb7ee362a87742cb86e407dc02a100818258207ff5102e7b0ec8e5b4374993408de354b2d0b5f608b787760e5496df820b108b58406ff593ab6fd07918aa57228afd71ac2ba924e8f64afb7c6832180a6ea8ff328d7e6d109a25674cb071a3154f5c35269d8d6be9664f036501fdda14e15e2f5604a10081825820dceb46d478497ae0dd7a8fd7e01729fc26344e4e91ceda16686a95213abe35ad584069600858f4e55cf5b5d6a9a3b090c7b84ac72c1305d30789355b64dcc7201d2579291d9e6e4ce1ee893beea96b48b9290b7ab66194120643b8f4b12d2815ef04a1008182582017766b9b772bbea18a6b8123b8f0ca256850ce033e9a1bc1c0b38805672e3aba58408c7e646e3a924b64c3953268f7908456903dce0ae36247fc6c609f1849a0e7a8ae0328120349a1e6b66a4b7394b038fdcf003e7a8483b5af55c954054e35d405a1008182582055019ca54aaad3a659e0715bb4a05315030abe3ffe0f1fdd0aa388e3fc2a6a64584071ae5514609c5466def83a37053414b80a2c381f9f831e8e7b88becdcc54e9f7cd20fcbce7c20b8466feba9edaa34eb228544d755c84a04a571a9c15d8fc1a03a100838258201857264e46f9e7d8baf30d82565653b1caf5b323b567cb0330dba5dfbdeec4da58400fc328df80d49cff3e16dea9e7d57c6bcdbb3a935f5168cdba316ba4879bac5982cbe2306719c76f494c73a20b4b350685bf8d47ab5bfd60735b55fc1c496204825820b61d08c5329f33d8f482236fd8228bea5a848162df3f18d1bf9f6399f5eb9f21584042b0287a410a1bdedd8c4a8291e5a72a9a6f27dc024e10727a08f2d4f38b897587830ee6e23d3fa785bf8a71d916ca274a163fcd023529c26b0a15fbf35d3808825820c1ce9b3c3f4c2b95a21760c024bf74fe448cd774c55ab7d07770296a68a6b9325840699ffb535e096e177ba09607513051caf61401f4b6826b6dedf56772c6a6fdcaf0ac34053685aeaf3bea1d68c05b054db688114ba7455e4c962c56bdbb6b1209a100818258202428035b0b209ebd87a055612cf89a05c02b358c47e3341db5f4325993197e4c5840e8f421f369acd8feacabfbed0a447a0444945523ff80dbee9afa3d1e95bbd6fc6f03d12a43bb62903ee079b0c4314460aee064ca8c1d8ee4b5f17dc2ce5c550ca100818258206c0180db688a9e477b10a7792e3c4efd749cddbe0e05068b6cb586dee5405697584046939c3b00bb757394be16652f10a96380b7db5bdee28f60d1fe5d38d7850801e9b109c4a406d7d8900b0639b3cf9ad645db84a31352bd19974bad524c28dd0ba10081825820f0247b624970dd67ac1abf2a1ce5b15e43634310a3175a2d6b6f875c1e16f215584097ae91b5c56e76b19d323bf6b1fd3b277c24d4fee0d8309b7a045f539b4ad7666901f87b86511dcbec3de45465ab9c2a4ea67bcda9cc981908fa21ff14ea8a04a100828258200df4ee08e1d88ff3b5b6c903f403332854678d1fd303dcda0203beebead4ff35584067405600d117e382b1186e85ff1b2c4d6a71b7f55ffa7a505f6e3a4aa0281a7cd45ab6994a04b40c2c2540a15e77fc913340298fd691fb34613f3e71edd613098258200df4ee08e1d88ff3b5b6c903f403332854678d1fd303dcda0203beebead4ff35584067405600d117e382b1186e85ff1b2c4d6a71b7f55ffa7a505f6e3a4aa0281a7cd45ab6994a04b40c2c2540a15e77fc913340298fd691fb34613f3e71edd61309a100838258207b9bcfa92bc955d5d40641b3308838782fa3e49145013ec04b5fc050236297c45840ae9ded15aee3476ca27206fc49585d54264a7412661f80cfdade4805586ee6e08fba275c7a9a034cd7013f01021da0e968fbedba51089978462bcd152ee0420b825820dc559fac097404924b3aac4cd8e3aee33f22e092c412d6c6dbb7d474608329c3584092f77a226717a95f8b7ce1120b2a36a8bd3fb8cfff9e366de0af386b284b84f9cbd9ba79c07938bc44d1331c94d7d0656704b63867266024a5413a987ab57b0f8258201b58f117c56040cc07a9046634672a58794733617a9edbef78630e7867ecaf215840d3979e786446580cf846272a686abcf50fea7b04030e3fad720b38c6dc0275a104184a8c82e1f0ca21cf34716768193bfe4baecf3a36c12f03beed0c32980f00a20081825820b16e356f294093de5eda9cb123e51b5041c60b5537c994a6c84f995b46f48b645840ffb374000a36896e8584a02d7ed49856fa82214e83d5f562998c851f53eb70eb880733a2f5b36b64f1b9c7e5c3f2248c0a8a8da15f1f79d9e984f57208306b020180a102818458200ac3f920fd84c40929eea4e19c8c41ea3fdb3cc9c8dcb6176f224ed1a74b8b425840fda3562e110c6331fd0476294e2b785d3cf5c045d68e75dcc1ab57ac3f1a9a41626b417ca6f05ea5cccaf9cf119a59b0a3d3c830bcec100679b30a62b1a4e80e5820e5529e2604670cdb838f3c652e98a923bb0a36e4a2006bd25c9f590439a1c3f55822a101581e581cbeab7b5c6b45ef03078ca5a8694ba5d1183e5a29e22d1ca2787b04fea100818258202da5a6bf2774061c26bf3e325e0714e8313ea2d14cebfd3e70fb20ef14dc0d355840694ce9baa143150fc351b2153db205701ff90356ae2250dbd68755d2fed7b5c5bc1bb042e96bfa0ff3299dfeea1e674d085147a38cafccf08856a42cbfe5010ca10081825820127b0d7a79c985941437aa18bc5698a4dabfc65ba22468bd1b446579380e04d25840a39e8c23a7d0a3e24aaddc1a1737ddbd3b0e96250715fe1711ff89554b634747d7508528b83e14c6f9df4b15383ef1ed5a18190efcf3404caf1f3c0e9e83b605a1008182582002bce9638549bf0d76207b9851a7c3abaaf06aa7b5ae327c813673062f96de2c58401976cce2f079b7c30a6d5a2a2befb43ea5e5564689bb4f785db5f379f0f882c86e70877d7c32c0182c2a90bea88941b5a3ad909d28f4158fd662c41da0e19f0bffa2185682a11902d1a278383463396637643663323462613865326231326633323639616333386437303630323565333961353061353234616665366561663739643935a16f5665676769656d6174653035393438ab6a6261636b67726f756e6465477265656e64626f6479675469636b6c65726b6465736372697074696f6e6064657965736852656420457965736566696c657381a3696d656469615479706569696d6167652f706e67646e616d656f5665676769656d6174653035393438637372637835697066733a2f2f516d556f636a3943477068553859617834565439664c7967657354656144536d3559576863595471624363777645646865616466436f77626f7965696d6167657835697066733a2f2f516d556f636a3943477068553859617834565439664c7967657354656144536d3559576863595471624363777645696d656469615479706569696d6167652f706e67656d6f75746866447261676f6e646e616d656f5665676769656d61746530353934386974797065436c61737366506f7461746f6776657273696f6e63312e3080186ea1191c73a166616374696f6e6663616e63656c80 \ No newline at end of file diff --git a/src/crosscut/addresses.rs b/src/crosscut/addresses.rs deleted file mode 100644 index acd79295..00000000 --- a/src/crosscut/addresses.rs +++ /dev/null @@ -1,13 +0,0 @@ -fn get_bit_at(input: u8, n: u8) -> bool { - if n < 32 { - input & (1 << n) != 0 - } else { - false - } -} - -// https://github.com/input-output-hk/cardano-ledger/blob/master/eras/alonzo/test-suite/cddl-files/alonzo.cddl#L135 -pub fn is_smart_contract(address: &[u8]) -> bool { - let byte_1 = address[0]; - return get_bit_at(byte_1, 4); -} diff --git a/src/crosscut/filters.rs b/src/crosscut/filters.rs new file mode 100644 index 00000000..4f7e3365 --- /dev/null +++ b/src/crosscut/filters.rs @@ -0,0 +1,223 @@ +use pallas::ledger::{ + addresses::Address, + traverse::{MultiEraBlock, MultiEraTx}, +}; +use serde::Deserialize; + +use crate::prelude::*; +use crate::{crosscut, model}; + +#[derive(Deserialize, Clone, Default)] +pub struct AddressPattern { + pub exact: Option, + pub payment: Option, + pub stake: Option, + pub is_script: Option, +} + +impl AddressPattern { + pub fn matches(&self, addr: Address) -> bool { + if let Some(x) = &self.exact { + if addr.to_string().eq(x) { + return true; + } + } + + if let Some(_) = &self.payment { + todo!(); + } + + if let Some(_) = &self.stake { + todo!(); + } + + if let Some(x) = &self.is_script { + return addr.has_script() == *x; + } + + false + } +} + +#[derive(Deserialize, Clone)] +pub struct AssetPattern { + pub policy: Option, + pub name: Option, + pub subject: Option, +} + +#[derive(Deserialize, Clone)] +pub struct BlockPattern { + pub slot_before: Option, + pub slot_after: Option, +} + +#[derive(Deserialize, Clone)] +#[serde(rename_all = "snake_case")] +pub enum Predicate { + AllOf(Vec), + AnyOf(Vec), + Not(Box), + InputAddress(AddressPattern), + OutputAddress(AddressPattern), + WithdrawalTo(AddressPattern), + InputAsset(AssetPattern), + OutputAsset(AssetPattern), + Block(BlockPattern), +} + +impl Predicate { + pub fn and(&self, other: &Self) -> Self { + Predicate::AllOf(vec![self.clone(), other.clone()]) + } +} + +#[inline] +fn eval_payment_to(tx: &MultiEraTx, pattern: &AddressPattern) -> Result { + let x = tx + .outputs() + .iter() + .filter_map(|o| o.address().ok()) + .any(|a| pattern.matches(a)); + + Ok(x) +} + +#[inline] +fn eval_payment_from( + tx: &MultiEraTx, + ctx: &model::BlockContext, + pattern: &AddressPattern, + policy: &crosscut::policies::RuntimePolicy, +) -> Result { + for input in tx.inputs() { + let utxo = ctx.find_utxo(&input.output_ref()).apply_policy(policy)?; + if let Some(utxo) = utxo { + if let Some(addr) = utxo.address().ok() { + if pattern.matches(addr) { + return Ok(true); + } + } + } + } + + Ok(false) +} + +#[inline] +fn eval_any_of( + predicates: &[Predicate], + block: &MultiEraBlock, + tx: &MultiEraTx, + ctx: &model::BlockContext, + policy: &crosscut::policies::RuntimePolicy, +) -> Result { + for p in predicates.iter() { + if eval_predicate(p, block, tx, ctx, policy)? { + return Ok(true); + } + } + + Ok(false) +} + +#[inline] +fn eval_all_of( + predicates: &[Predicate], + block: &MultiEraBlock, + tx: &MultiEraTx, + ctx: &model::BlockContext, + policy: &crosscut::policies::RuntimePolicy, +) -> Result { + for p in predicates.iter() { + if !eval_predicate(p, block, tx, ctx, policy)? { + return Ok(false); + } + } + + Ok(true) +} + +pub fn eval_predicate( + predicate: &Predicate, + block: &MultiEraBlock, + tx: &MultiEraTx, + ctx: &model::BlockContext, + policy: &crosscut::policies::RuntimePolicy, +) -> Result { + match predicate { + Predicate::Not(x) => eval_predicate(x, block, tx, ctx, policy).map(|x| !x), + Predicate::AnyOf(x) => eval_any_of(x, block, tx, ctx, policy), + Predicate::AllOf(x) => eval_all_of(x, block, tx, ctx, policy), + Predicate::OutputAddress(x) => eval_payment_to(tx, x), + Predicate::InputAddress(x) => eval_payment_from(tx, ctx, x, policy), + Predicate::WithdrawalTo(_) => todo!(), + Predicate::InputAsset(_) => todo!(), + Predicate::OutputAsset(_) => todo!(), + Predicate::Block(_) => todo!(), + } +} + +#[cfg(test)] +mod tests { + use pallas::ledger::traverse::MultiEraBlock; + + use crate::{crosscut::policies::RuntimePolicy, model::BlockContext}; + + use super::{eval_predicate, AddressPattern, Predicate}; + + fn test_predicate_in_block(predicate: &Predicate, expected_txs: &[usize]) { + let cbor = include_str!("../../assets/test.block"); + let bytes = hex::decode(cbor).unwrap(); + let block = MultiEraBlock::decode(&bytes).unwrap(); + let ctx = BlockContext::default(); + let policy = RuntimePolicy::default(); + + let idxs: Vec<_> = block + .txs() + .iter() + .enumerate() + .filter(|(_, tx)| eval_predicate(predicate, &block, tx, &ctx, &policy).unwrap()) + .map(|(idx, _)| idx) + .collect(); + + assert_eq!(idxs, expected_txs); + } + + #[test] + fn payment_to_exact_address() { + let x = Predicate::OutputAddress(AddressPattern { + exact: Some("addr1q8fukvydr8m5y3gztte3d4tnw0v5myvshusmu45phf20h395kqnygcykgjy42m29tksmwnd0js0z8p3swm5ntryhfu8sg7835c".into()), + ..Default::default() + }); + + test_predicate_in_block(&x, &[0]); + } + + #[test] + fn payment_to_script_address() { + let x = Predicate::OutputAddress(AddressPattern { + is_script: Some(true), + ..Default::default() + }); + + test_predicate_in_block(&x, &[]); + } + + #[test] + fn any_of() { + let a = Predicate::OutputAddress(AddressPattern { + exact: Some("addr1q8fukvydr8m5y3gztte3d4tnw0v5myvshusmu45phf20h395kqnygcykgjy42m29tksmwnd0js0z8p3swm5ntryhfu8sg7835c".into()), + ..Default::default() + }); + + let b = Predicate::OutputAddress(AddressPattern { + is_script: Some(true), + ..Default::default() + }); + + let x = Predicate::AnyOf(vec![a, b]); + + test_predicate_in_block(&x, &[0]); + } +} diff --git a/src/crosscut/mod.rs b/src/crosscut/mod.rs index e1b35a79..a7cd4e37 100644 --- a/src/crosscut/mod.rs +++ b/src/crosscut/mod.rs @@ -1,6 +1,6 @@ -pub mod addresses; mod args; pub mod epochs; +pub mod filters; pub mod policies; pub use args::*; diff --git a/src/prelude.rs b/src/prelude.rs index 5e3d8bfe..94f442f5 100644 --- a/src/prelude.rs +++ b/src/prelude.rs @@ -1,2 +1,3 @@ pub use crate::crosscut::policies::AppliesPolicy; +pub(crate) use crate::reducers::macros::*; pub use gasket::error::AsWorkError; diff --git a/src/reducers/address_by_txo.rs b/src/reducers/address_by_txo.rs index c4c415b8..f9abad18 100644 --- a/src/reducers/address_by_txo.rs +++ b/src/reducers/address_by_txo.rs @@ -3,16 +3,18 @@ use pallas::crypto::hash::Hash; use pallas::ledger::traverse::MultiEraBlock; use serde::Deserialize; -use crate::model; +use crate::prelude::*; +use crate::{crosscut, model}; #[derive(Deserialize)] pub struct Config { pub key_prefix: Option, - pub filter: Option>, + pub filter: Option, } pub struct Reducer { config: Config, + policy: crosscut::policies::RuntimePolicy, } impl Reducer { @@ -24,12 +26,6 @@ impl Reducer { output_idx: usize, output: &mut super::OutputPort, ) -> Result<(), gasket::error::Error> { - if let Some(addresses) = &self.config.filter { - if let Err(_) = addresses.binary_search(&address.to_string()) { - return Ok(()); - } - } - let crdt = model::CRDTCommand::last_write_wins( self.config.key_prefix.as_deref(), &format!("{}#{}", tx_hash, output_idx), @@ -45,17 +41,20 @@ impl Reducer { pub fn reduce_block( &mut self, block: &MultiEraBlock, + ctx: &model::BlockContext, output: &mut super::OutputPort, ) -> Result<(), gasket::error::Error> { let slot = block.slot(); for tx in block.txs() { - let tx_hash = tx.hash(); + if filter_matches!(self, block, &tx, ctx) { + let tx_hash = tx.hash(); - for (output_idx, tx_out) in tx.outputs().iter().enumerate() { - let address = tx_out.address().map(|x| x.to_string()).or_panic()?; + for (output_idx, tx_out) in tx.outputs().iter().enumerate() { + let address = tx_out.address().map(|x| x.to_string()).or_panic()?; - self.send(slot, &address, tx_hash, output_idx, output)?; + self.send(slot, &address, tx_hash, output_idx, output)?; + } } } @@ -64,8 +63,12 @@ impl Reducer { } impl Config { - pub fn plugin(self) -> super::Reducer { - let reducer = Reducer { config: self }; + pub fn plugin(self, policy: &crosscut::policies::RuntimePolicy) -> super::Reducer { + let reducer = Reducer { + config: self, + policy: policy.clone(), + }; + super::Reducer::AddressByTxo(reducer) } } diff --git a/src/reducers/balance_by_address.rs b/src/reducers/balance_by_address.rs index 18668d0e..f8a303b1 100644 --- a/src/reducers/balance_by_address.rs +++ b/src/reducers/balance_by_address.rs @@ -7,7 +7,7 @@ use crate::{crosscut, model, prelude::*}; #[derive(Deserialize)] pub struct Config { pub key_prefix: Option, - pub filter: Option>, + pub filter: Option, } pub struct Reducer { @@ -37,12 +37,6 @@ impl Reducer { let address = utxo.address().map(|x| x.to_string()).or_panic()?; - if let Some(addresses) = &self.config.filter { - if let Err(_) = addresses.binary_search(&address.to_string()) { - return Ok(()); - } - } - let key = match &self.config.key_prefix { Some(prefix) => format!("{}.{}", prefix, address), None => format!("{}.{}", "balance_by_address".to_string(), address), @@ -68,12 +62,6 @@ impl Reducer { let address = tx_output.address().map(|x| x.to_string()).or_panic()?; - if let Some(addresses) = &self.config.filter { - if let Err(_) = addresses.binary_search(&address) { - return Ok(()); - } - } - let key = match &self.config.key_prefix { Some(prefix) => format!("{}.{}", prefix, address), None => format!("{}.{}", "balance_by_address".to_string(), address), @@ -93,12 +81,14 @@ impl Reducer { output: &mut super::OutputPort, ) -> Result<(), gasket::error::Error> { for tx in block.txs().into_iter() { - for input in tx.inputs().iter().map(|i| i.output_ref()) { - self.process_inbound_txo(&ctx, &input, output)?; - } - - for (_idx, tx_output) in tx.outputs().iter().enumerate() { - self.process_outbound_txo(tx_output, output)?; + if filter_matches!(self, block, &tx, ctx) { + for input in tx.inputs().iter().map(|i| i.output_ref()) { + self.process_inbound_txo(&ctx, &input, output)?; + } + + for (_idx, tx_output) in tx.outputs().iter().enumerate() { + self.process_outbound_txo(tx_output, output)?; + } } } diff --git a/src/reducers/macros.rs b/src/reducers/macros.rs new file mode 100644 index 00000000..cace91a4 --- /dev/null +++ b/src/reducers/macros.rs @@ -0,0 +1,12 @@ +macro_rules! filter_matches { + ($reducer:ident, $block:expr, $tx:expr, $ctx:expr) => { + match &$reducer.config.filter { + Some(x) => crosscut::filters::eval_predicate(x, $block, $tx, $ctx, &$reducer.policy) + .or_panic()?, + // if we don't have a filter, everything goes through + None => true, + } + }; +} + +pub(crate) use filter_matches; diff --git a/src/reducers/mod.rs b/src/reducers/mod.rs index 72f0f367..cfc86d72 100644 --- a/src/reducers/mod.rs +++ b/src/reducers/mod.rs @@ -9,6 +9,7 @@ use crate::{bootstrap, crosscut, model}; type InputPort = gasket::messaging::InputPort; type OutputPort = gasket::messaging::OutputPort; +pub mod macros; pub mod point_by_tx; pub mod pool_by_stake; pub mod utxo_by_address; @@ -77,7 +78,7 @@ impl Config { Config::PoolByStake(c) => c.plugin(), #[cfg(feature = "unstable")] - Config::AddressByTxo(c) => c.plugin(), + Config::AddressByTxo(c) => c.plugin(policy), #[cfg(feature = "unstable")] Config::TotalTransactionsCount(c) => c.plugin(), #[cfg(feature = "unstable")] @@ -187,7 +188,7 @@ impl Reducer { Reducer::PoolByStake(x) => x.reduce_block(block, output), #[cfg(feature = "unstable")] - Reducer::AddressByTxo(x) => x.reduce_block(block, output), + Reducer::AddressByTxo(x) => x.reduce_block(block, ctx, output), #[cfg(feature = "unstable")] Reducer::TotalTransactionsCount(x) => x.reduce_block(block, output), #[cfg(feature = "unstable")]