diff --git a/dev_requirements.txt b/dev_requirements.txt index e09fe8f..d238f42 100644 --- a/dev_requirements.txt +++ b/dev_requirements.txt @@ -15,83 +15,83 @@ aiofiles==23.2.1 \ --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 \ --hash=sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a # via -r requirements.in -aiohttp[speedups]==3.9.0 \ - --hash=sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994 \ - --hash=sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded \ - --hash=sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d \ - --hash=sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8 \ - --hash=sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc \ - --hash=sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454 \ - --hash=sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8 \ - --hash=sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9 \ - --hash=sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208 \ - --hash=sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3 \ - --hash=sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76 \ - --hash=sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d \ - --hash=sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4 \ - --hash=sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8 \ - --hash=sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986 \ - --hash=sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e \ - --hash=sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea \ - --hash=sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2 \ - --hash=sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7 \ - --hash=sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8 \ - --hash=sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d \ - --hash=sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814 \ - --hash=sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218 \ - --hash=sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8 \ - --hash=sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075 \ - --hash=sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982 \ - --hash=sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31 \ - --hash=sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b \ - --hash=sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30 \ - --hash=sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9 \ - --hash=sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94 \ - --hash=sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8 \ - --hash=sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253 \ - --hash=sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c \ - --hash=sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113 \ - --hash=sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911 \ - --hash=sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787 \ - --hash=sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11 \ - --hash=sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd \ - --hash=sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe \ - --hash=sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029 \ - --hash=sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192 \ - --hash=sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b \ - --hash=sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff \ - --hash=sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f \ - --hash=sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b \ - --hash=sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456 \ - --hash=sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73 \ - --hash=sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf \ - --hash=sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d \ - --hash=sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f \ - --hash=sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f \ - --hash=sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985 \ - --hash=sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb \ - --hash=sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940 \ - --hash=sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f \ - --hash=sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd \ - --hash=sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd \ - --hash=sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896 \ - --hash=sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d \ - --hash=sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202 \ - --hash=sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40 \ - --hash=sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411 \ - --hash=sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735 \ - --hash=sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305 \ - --hash=sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80 \ - --hash=sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932 \ - --hash=sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b \ - --hash=sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7 \ - --hash=sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af \ - --hash=sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3 \ - --hash=sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf \ - --hash=sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4 \ - --hash=sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844 \ - --hash=sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318 \ - --hash=sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887 +aiohttp[speedups]==3.9.1 \ + --hash=sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f \ + --hash=sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c \ + --hash=sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af \ + --hash=sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4 \ + --hash=sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a \ + --hash=sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489 \ + --hash=sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213 \ + --hash=sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01 \ + --hash=sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5 \ + --hash=sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361 \ + --hash=sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26 \ + --hash=sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0 \ + --hash=sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4 \ + --hash=sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8 \ + --hash=sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1 \ + --hash=sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7 \ + --hash=sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6 \ + --hash=sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a \ + --hash=sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd \ + --hash=sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4 \ + --hash=sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499 \ + --hash=sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183 \ + --hash=sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544 \ + --hash=sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821 \ + --hash=sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501 \ + --hash=sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f \ + --hash=sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe \ + --hash=sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f \ + --hash=sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672 \ + --hash=sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5 \ + --hash=sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2 \ + --hash=sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57 \ + --hash=sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87 \ + --hash=sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0 \ + --hash=sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f \ + --hash=sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7 \ + --hash=sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed \ + --hash=sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70 \ + --hash=sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0 \ + --hash=sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f \ + --hash=sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d \ + --hash=sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f \ + --hash=sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d \ + --hash=sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431 \ + --hash=sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff \ + --hash=sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf \ + --hash=sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83 \ + --hash=sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690 \ + --hash=sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587 \ + --hash=sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e \ + --hash=sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb \ + --hash=sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3 \ + --hash=sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66 \ + --hash=sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014 \ + --hash=sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35 \ + --hash=sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f \ + --hash=sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0 \ + --hash=sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449 \ + --hash=sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23 \ + --hash=sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5 \ + --hash=sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd \ + --hash=sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4 \ + --hash=sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b \ + --hash=sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558 \ + --hash=sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd \ + --hash=sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766 \ + --hash=sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a \ + --hash=sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636 \ + --hash=sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d \ + --hash=sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590 \ + --hash=sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e \ + --hash=sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d \ + --hash=sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c \ + --hash=sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28 \ + --hash=sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065 \ + --hash=sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca # via -r requirements.in aiosignal==1.3.1 \ --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ @@ -424,30 +424,30 @@ coverage[toml]==7.3.2 \ --hash=sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a \ --hash=sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4 # via pytest-cov -cryptography==41.0.5 \ - --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ - --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ - --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ - --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ - --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ - --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ - --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ - --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ - --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ - --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ - --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ - --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ - --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ - --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ - --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ - --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ - --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ - --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ - --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ - --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ - --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ - --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ - --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via # jwcrypto # pki-tools @@ -605,15 +605,15 @@ httptools==0.6.1 \ --hash=sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185 \ --hash=sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3 # via uvicorn -httpx==0.25.1 \ - --hash=sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a \ - --hash=sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0 +httpx==0.25.2 \ + --hash=sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8 \ + --hash=sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118 # via # -r test_requirements.in # pki-tools -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.6 \ + --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ + --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via # anyio # httpx @@ -627,9 +627,9 @@ iniconfig==2.0.0 \ --hash=sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3 \ --hash=sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374 # via pytest -ipython==8.17.2 \ - --hash=sha256:126bb57e1895594bb0d91ea3090bbd39384f6fe87c3d57fd558d0670f50339bb \ - --hash=sha256:1e4d1d666a023e3c93585ba0d8e962867f7a111af322efff6b9c58062b3e5444 +ipython==8.18.1 \ + --hash=sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27 \ + --hash=sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397 # via -r dev_requirements.in jedi==0.19.1 \ --hash=sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd \ @@ -800,34 +800,34 @@ multidict==6.0.4 \ # via # aiohttp # yarl -mypy==1.7.0 \ - --hash=sha256:0e81ffd120ee24959b449b647c4b2fbfcf8acf3465e082b8d58fd6c4c2b27e46 \ - --hash=sha256:185cff9b9a7fec1f9f7d8352dff8a4c713b2e3eea9c6c4b5ff7f0edf46b91e41 \ - --hash=sha256:1e280b5697202efa698372d2f39e9a6713a0395a756b1c6bd48995f8d72690dc \ - --hash=sha256:1fe46e96ae319df21359c8db77e1aecac8e5949da4773c0274c0ef3d8d1268a9 \ - --hash=sha256:2b53655a295c1ed1af9e96b462a736bf083adba7b314ae775563e3fb4e6795f5 \ - --hash=sha256:551d4a0cdcbd1d2cccdcc7cb516bb4ae888794929f5b040bb51aae1846062901 \ - --hash=sha256:55d28d7963bef00c330cb6461db80b0b72afe2f3c4e2963c99517cf06454e665 \ - --hash=sha256:5da84d7bf257fd8f66b4f759a904fd2c5a765f70d8b52dde62b521972a0a2357 \ - --hash=sha256:6cb8d5f6d0fcd9e708bb190b224089e45902cacef6f6915481806b0c77f7786d \ - --hash=sha256:7a7b1e399c47b18feb6f8ad4a3eef3813e28c1e871ea7d4ea5d444b2ac03c418 \ - --hash=sha256:870bd1ffc8a5862e593185a4c169804f2744112b4a7c55b93eb50f48e7a77010 \ - --hash=sha256:87c076c174e2c7ef8ab416c4e252d94c08cd4980a10967754f91571070bf5fbe \ - --hash=sha256:96650d9a4c651bc2a4991cf46f100973f656d69edc7faf91844e87fe627f7e96 \ - --hash=sha256:a3637c03f4025f6405737570d6cbfa4f1400eb3c649317634d273687a09ffc2f \ - --hash=sha256:a79cdc12a02eb526d808a32a934c6fe6df07b05f3573d210e41808020aed8b5d \ - --hash=sha256:b633f188fc5ae1b6edca39dae566974d7ef4e9aaaae00bc36efe1f855e5173ac \ - --hash=sha256:bf7a2f0a6907f231d5e41adba1a82d7d88cf1f61a70335889412dec99feeb0f8 \ - --hash=sha256:c1b06b4b109e342f7dccc9efda965fc3970a604db70f8560ddfdee7ef19afb05 \ - --hash=sha256:cddee95dea7990e2215576fae95f6b78a8c12f4c089d7e4367564704e99118d3 \ - --hash=sha256:d01921dbd691c4061a3e2ecdbfbfad029410c5c2b1ee88946bf45c62c6c91210 \ - --hash=sha256:d0fa29919d2e720c8dbaf07d5578f93d7b313c3e9954c8ec05b6d83da592e5d9 \ - --hash=sha256:d6ed9a3997b90c6f891138e3f83fb8f475c74db4ccaa942a1c7bf99e83a989a1 \ - --hash=sha256:d93e76c2256aa50d9c82a88e2f569232e9862c9982095f6d54e13509f01222fc \ - --hash=sha256:df67fbeb666ee8828f675fee724cc2cbd2e4828cc3df56703e02fe6a421b7401 \ - --hash=sha256:f29386804c3577c83d76520abf18cfcd7d68264c7e431c5907d250ab502658ee \ - --hash=sha256:f65f385a6f43211effe8c682e8ec3f55d79391f70a201575def73d08db68ead1 \ - --hash=sha256:fc9fe455ad58a20ec68599139ed1113b21f977b536a91b42bef3ffed5cce7391 +mypy==1.7.1 \ + --hash=sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340 \ + --hash=sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49 \ + --hash=sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82 \ + --hash=sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce \ + --hash=sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb \ + --hash=sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51 \ + --hash=sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5 \ + --hash=sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e \ + --hash=sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7 \ + --hash=sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33 \ + --hash=sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9 \ + --hash=sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1 \ + --hash=sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6 \ + --hash=sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a \ + --hash=sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe \ + --hash=sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7 \ + --hash=sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200 \ + --hash=sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7 \ + --hash=sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a \ + --hash=sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28 \ + --hash=sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea \ + --hash=sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120 \ + --hash=sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d \ + --hash=sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42 \ + --hash=sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea \ + --hash=sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2 \ + --hash=sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a # via -r test_requirements.in mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ @@ -843,9 +843,9 @@ parso==0.8.3 \ --hash=sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0 \ --hash=sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75 # via jedi -pexpect==4.8.0 \ - --hash=sha256:0b48a55dcb3c05f3329815901ea4fc1537514d6ba867a152b581d69ae3710937 \ - --hash=sha256:fc65a43959d153d0114afe13997d439c22823a27cefceb5ff35c2178c6784c0c +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f # via ipython pki-tools==0.0.29 \ --hash=sha256:45463992355eb902b61ad6182933f2e36680828653c032c08bbb77d07b6026e9 \ @@ -924,120 +924,120 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.1 \ - --hash=sha256:0b8be5413c06aadfbe56f6dc1d45c9ed25fd43264414c571135c97dd77c2bedb \ - --hash=sha256:dc5244a8939e0d9a68f1f1b5f550b2e1c879912033b1becbedb315accc75441b +pydantic==2.5.2 \ + --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ + --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd # via # fastapi # pki-tools # pydantic-settings # pysaml2 -pydantic-core==2.14.3 \ - --hash=sha256:056ea7cc3c92a7d2a14b5bc9c9fa14efa794d9f05b9794206d089d06d3433dc7 \ - --hash=sha256:0653fb9fc2fa6787f2fa08631314ab7fc8070307bd344bf9471d1b7207c24623 \ - --hash=sha256:076edc972b68a66870cec41a4efdd72a6b655c4098a232314b02d2bfa3bfa157 \ - --hash=sha256:0a3e51c2be472b7867eb0c5d025b91400c2b73a0823b89d4303a9097e2ec6655 \ - --hash=sha256:0c7f8e8a7cf8e81ca7d44bea4f181783630959d41b4b51d2f74bc50f348a090f \ - --hash=sha256:10904368261e4509c091cbcc067e5a88b070ed9a10f7ad78f3029c175487490f \ - --hash=sha256:113752a55a8eaece2e4ac96bc8817f134c2c23477e477d085ba89e3aa0f4dc44 \ - --hash=sha256:12e05a76b223577a4696c76d7a6b36a0ccc491ffb3c6a8cf92d8001d93ddfd63 \ - --hash=sha256:136bc7247e97a921a020abbd6ef3169af97569869cd6eff41b6a15a73c44ea9b \ - --hash=sha256:1582f01eaf0537a696c846bea92082082b6bfc1103a88e777e983ea9fbdc2a0f \ - --hash=sha256:1767bd3f6370458e60c1d3d7b1d9c2751cc1ad743434e8ec84625a610c8b9195 \ - --hash=sha256:1e2979dc80246e18e348de51246d4c9b410186ffa3c50e77924bec436b1e36cb \ - --hash=sha256:1ea992659c03c3ea811d55fc0a997bec9dde863a617cc7b25cfde69ef32e55af \ - --hash=sha256:1f2d4516c32255782153e858f9a900ca6deadfb217fd3fb21bb2b60b4e04d04d \ - --hash=sha256:2494d20e4c22beac30150b4be3b8339bf2a02ab5580fa6553ca274bc08681a65 \ - --hash=sha256:260692420028319e201b8649b13ac0988974eeafaaef95d0dfbf7120c38dc000 \ - --hash=sha256:2646f8270f932d79ba61102a15ea19a50ae0d43b314e22b3f8f4b5fabbfa6e38 \ - --hash=sha256:27828f0227b54804aac6fb077b6bb48e640b5435fdd7fbf0c274093a7b78b69c \ - --hash=sha256:2bc736725f9bd18a60eec0ed6ef9b06b9785454c8d0105f2be16e4d6274e63d0 \ - --hash=sha256:2c08ac60c3caa31f825b5dbac47e4875bd4954d8f559650ad9e0b225eaf8ed0c \ - --hash=sha256:2c83892c7bf92b91d30faca53bb8ea21f9d7e39f0ae4008ef2c2f91116d0464a \ - --hash=sha256:354db020b1f8f11207b35360b92d95725621eb92656725c849a61e4b550f4acc \ - --hash=sha256:364dba61494e48f01ef50ae430e392f67ee1ee27e048daeda0e9d21c3ab2d609 \ - --hash=sha256:37dad73a2f82975ed563d6a277fd9b50e5d9c79910c4aec787e2d63547202315 \ - --hash=sha256:38113856c7fad8c19be7ddd57df0c3e77b1b2336459cb03ee3903ce9d5e236ce \ - --hash=sha256:38aed5a1bbc3025859f56d6a32f6e53ca173283cb95348e03480f333b1091e7d \ - --hash=sha256:3ad083df8fe342d4d8d00cc1d3c1a23f0dc84fce416eb301e69f1ddbbe124d3f \ - --hash=sha256:3c1bf1a7b05a65d3b37a9adea98e195e0081be6b17ca03a86f92aeb8b110f468 \ - --hash=sha256:3d1dde10bd9962b1434053239b1d5490fc31a2b02d8950a5f731bc584c7a5a0f \ - --hash=sha256:44aaf1a07ad0824e407dafc637a852e9a44d94664293bbe7d8ee549c356c8882 \ - --hash=sha256:44afa3c18d45053fe8d8228950ee4c8eaf3b5a7f3b64963fdeac19b8342c987f \ - --hash=sha256:4a70d23eedd88a6484aa79a732a90e36701048a1509078d1b59578ef0ea2cdf5 \ - --hash=sha256:4aa89919fbd8a553cd7d03bf23d5bc5deee622e1b5db572121287f0e64979476 \ - --hash=sha256:4cc6bb11f4e8e5ed91d78b9880774fbc0856cb226151b0a93b549c2b26a00c19 \ - --hash=sha256:536e1f58419e1ec35f6d1310c88496f0d60e4f182cacb773d38076f66a60b149 \ - --hash=sha256:5402ee0f61e7798ea93a01b0489520f2abfd9b57b76b82c93714c4318c66ca06 \ - --hash=sha256:56814b41486e2d712a8bc02a7b1f17b87fa30999d2323bbd13cf0e52296813a1 \ - --hash=sha256:5b73441a1159f1fb37353aaefb9e801ab35a07dd93cb8177504b25a317f4215a \ - --hash=sha256:61beaa79d392d44dc19d6f11ccd824d3cccb865c4372157c40b92533f8d76dd0 \ - --hash=sha256:6c2d118d1b6c9e2d577e215567eedbe11804c3aafa76d39ec1f8bc74e918fd07 \ - --hash=sha256:6e2f9d76c00e805d47f19c7a96a14e4135238a7551a18bfd89bb757993fd0933 \ - --hash=sha256:71ed769b58d44e0bc2701aa59eb199b6665c16e8a5b8b4a84db01f71580ec448 \ - --hash=sha256:7349f99f1ef8b940b309179733f2cad2e6037a29560f1b03fdc6aa6be0a8d03c \ - --hash=sha256:75f3f534f33651b73f4d3a16d0254de096f43737d51e981478d580f4b006b427 \ - --hash=sha256:76fc18653a5c95e5301a52d1b5afb27c9adc77175bf00f73e94f501caf0e05ad \ - --hash=sha256:7cb0c397f29688a5bd2c0dbd44451bc44ebb9b22babc90f97db5ec3e5bb69977 \ - --hash=sha256:7cc24728a1a9cef497697e53b3d085fb4d3bc0ef1ef4d9b424d9cf808f52c146 \ - --hash=sha256:7e63a56eb7fdee1587d62f753ccd6d5fa24fbeea57a40d9d8beaef679a24bdd6 \ - --hash=sha256:832d16f248ca0cc96929139734ec32d21c67669dcf8a9f3f733c85054429c012 \ - --hash=sha256:8488e973547e8fb1b4193fd9faf5236cf1b7cd5e9e6dc7ff6b4d9afdc4c720cb \ - --hash=sha256:849cff945284c577c5f621d2df76ca7b60f803cc8663ff01b778ad0af0e39bb9 \ - --hash=sha256:88ec906eb2d92420f5b074f59cf9e50b3bb44f3cb70e6512099fdd4d88c2f87c \ - --hash=sha256:8d3b9c91eeb372a64ec6686c1402afd40cc20f61a0866850f7d989b6bf39a41a \ - --hash=sha256:8f5624f0f67f2b9ecaa812e1dfd2e35b256487566585160c6c19268bf2ffeccc \ - --hash=sha256:905a12bf088d6fa20e094f9a477bf84bd823651d8b8384f59bcd50eaa92e6a52 \ - --hash=sha256:92486a04d54987054f8b4405a9af9d482e5100d6fe6374fc3303015983fc8bda \ - --hash=sha256:96eb10ef8920990e703da348bb25fedb8b8653b5966e4e078e5be382b430f9e0 \ - --hash=sha256:96fb679c7ca12a512d36d01c174a4fbfd912b5535cc722eb2c010c7b44eceb8e \ - --hash=sha256:98d8b3932f1a369364606417ded5412c4ffb15bedbcf797c31317e55bd5d920e \ - --hash=sha256:9dbab442a8d9ca918b4ed99db8d89d11b1f067a7dadb642476ad0889560dac79 \ - --hash=sha256:9ef3e2e407e4cad2df3c89488a761ed1f1c33f3b826a2ea9a411b0a7d1cccf1b \ - --hash=sha256:9ff737f24b34ed26de62d481ef522f233d3c5927279f6b7229de9b0deb3f76b5 \ - --hash=sha256:a1a39fecb5f0b19faee9a8a8176c805ed78ce45d760259a4ff3d21a7daa4dfc1 \ - --hash=sha256:a402ae1066be594701ac45661278dc4a466fb684258d1a2c434de54971b006ca \ - --hash=sha256:a5c51460ede609fbb4fa883a8fe16e749964ddb459966d0518991ec02eb8dfb9 \ - --hash=sha256:a8ca13480ce16daad0504be6ce893b0ee8ec34cd43b993b754198a89e2787f7e \ - --hash=sha256:ab4a2381005769a4af2ffddae74d769e8a4aae42e970596208ec6d615c6fb080 \ - --hash=sha256:aeafc7f5bbddc46213707266cadc94439bfa87ecf699444de8be044d6d6eb26f \ - --hash=sha256:aecd5ed096b0e5d93fb0367fd8f417cef38ea30b786f2501f6c34eabd9062c38 \ - --hash=sha256:af452e69446fadf247f18ac5d153b1f7e61ef708f23ce85d8c52833748c58075 \ - --hash=sha256:af46f0b7a1342b49f208fed31f5a83b8495bb14b652f621e0a6787d2f10f24ee \ - --hash=sha256:b02b5e1f54c3396c48b665050464803c23c685716eb5d82a1d81bf81b5230da4 \ - --hash=sha256:b28996872b48baf829ee75fa06998b607c66a4847ac838e6fd7473a6b2ab68e7 \ - --hash=sha256:b7692f539a26265cece1e27e366df5b976a6db6b1f825a9e0466395b314ee48b \ - --hash=sha256:ba44fad1d114539d6a1509966b20b74d2dec9a5b0ee12dd7fd0a1bb7b8785e5f \ - --hash=sha256:bf15145b1f8056d12c67255cd3ce5d317cd4450d5ee747760d8d088d85d12a2d \ - --hash=sha256:c3dc2920cc96f9aa40c6dc54256e436cc95c0a15562eb7bd579e1811593c377e \ - --hash=sha256:c54af5069da58ea643ad34ff32fd6bc4eebb8ae0fef9821cd8919063e0aeeaab \ - --hash=sha256:c5ea0153482e5b4d601c25465771c7267c99fddf5d3f3bdc238ef930e6d051cf \ - --hash=sha256:c9ffd823c46e05ef3eb28b821aa7bc501efa95ba8880b4a1380068e32c5bed47 \ - --hash=sha256:ca55c9671bb637ce13d18ef352fd32ae7aba21b4402f300a63f1fb1fd18e0364 \ - --hash=sha256:caa94726791e316f0f63049ee00dff3b34a629b0d099f3b594770f7d0d8f1f56 \ - --hash=sha256:cc956f78651778ec1ab105196e90e0e5f5275884793ab67c60938c75bcca3989 \ - --hash=sha256:ccbf355b7276593c68fa824030e68cb29f630c50e20cb11ebb0ee450ae6b3d08 \ - --hash=sha256:cf08b43d1d5d1678f295f0431a4a7e1707d4652576e1d0f8914b5e0213bfeee5 \ - --hash=sha256:d06c78074646111fb01836585f1198367b17d57c9f427e07aaa9ff499003e58d \ - --hash=sha256:d2b53e1f851a2b406bbb5ac58e16c4a5496038eddd856cc900278fa0da97f3fc \ - --hash=sha256:d41df8e10b094640a6b234851b624b76a41552f637b9fb34dc720b9fe4ef3be4 \ - --hash=sha256:d7abd17a838a52140e3aeca271054e321226f52df7e0a9f0da8f91ea123afe98 \ - --hash=sha256:de52ddfa6e10e892d00f747bf7135d7007302ad82e243cf16d89dd77b03b649d \ - --hash=sha256:df33902464410a1f1a0411a235f0a34e7e129f12cb6340daca0f9d1390f5fe10 \ - --hash=sha256:e16aaf788f1de5a85c8f8fcc9c1ca1dd7dd52b8ad30a7889ca31c7c7606615b8 \ - --hash=sha256:e3ad4968711fb379a67c8c755beb4dae8b721a83737737b7bcee27c05400b047 \ - --hash=sha256:e483b8b913fcd3b48badec54185c150cb7ab0e6487914b84dc7cde2365e0c892 \ - --hash=sha256:e71f666c3bf019f2490a47dddb44c3ccea2e69ac882f7495c68dc14d4065eac2 \ - --hash=sha256:ea1498ce4491236d1cffa0eee9ad0968b6ecb0c1cd711699c5677fc689905f00 \ - --hash=sha256:eaab9dc009e22726c62fe3b850b797e7f0e7ba76d245284d1064081f512c7226 \ - --hash=sha256:ec79dbe23702795944d2ae4c6925e35a075b88acd0d20acde7c77a817ebbce94 \ - --hash=sha256:f1b92e72babfd56585c75caf44f0b15258c58e6be23bc33f90885cebffde3400 \ - --hash=sha256:f1f46700402312bdc31912f6fc17f5ecaaaa3bafe5487c48f07c800052736289 \ - --hash=sha256:f518eac285c9632be337323eef9824a856f2680f943a9b68ac41d5f5bad7df7c \ - --hash=sha256:f86f20a9d5bee1a6ede0f2757b917bac6908cde0f5ad9fcb3606db1e2968bcf5 \ - --hash=sha256:f8fc652c354d3362e2932a79d5ac4bbd7170757a41a62c4fe0f057d29f10bebb \ - --hash=sha256:fe272a72c7ed29f84c42fedd2d06c2f9858dc0c00dae3b34ba15d6d8ae0fbaaf \ - --hash=sha256:fe863491664c6720d65ae438d4efaa5eca766565a53adb53bf14bc3246c72fe0 +pydantic-core==2.14.5 \ + --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ + --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ + --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ + --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ + --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ + --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ + --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ + --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ + --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ + --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ + --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ + --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ + --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ + --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ + --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ + --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ + --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ + --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ + --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ + --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ + --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ + --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ + --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ + --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ + --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ + --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ + --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ + --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ + --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ + --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ + --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ + --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ + --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ + --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ + --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ + --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ + --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ + --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ + --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ + --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ + --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ + --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ + --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ + --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ + --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ + --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ + --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ + --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ + --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ + --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ + --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ + --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ + --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ + --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ + --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ + --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ + --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ + --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ + --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ + --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ + --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ + --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ + --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ + --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ + --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ + --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ + --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ + --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ + --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ + --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ + --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ + --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ + --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ + --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ + --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ + --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ + --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ + --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ + --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ + --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ + --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ + --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ + --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ + --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ + --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ + --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ + --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ + --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ + --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ + --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ + --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ + --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ + --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ + --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ + --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ + --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ + --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ + --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ + --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ + --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ + --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ + --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ + --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ + --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ + --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 # via pydantic pydantic-settings==2.1.0 \ --hash=sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c \ @@ -1257,9 +1257,9 @@ tomli==2.0.1 \ # coverage # mypy # pytest -traitlets==5.13.0 \ - --hash=sha256:9b232b9430c8f57288c1024b34a8f0251ddcc47268927367a0dd3eeaca40deb5 \ - --hash=sha256:baf991e61542da48fe8aef8b779a9ea0aa38d8a54166ee250d5af5ecf4486619 +traitlets==5.14.0 \ + --hash=sha256:f14949d23829023013c47df20b4a76ccd1a85effb786dc060f34de7948361b33 \ + --hash=sha256:fcdaa8ac49c04dfa0ed3ee3384ef6dfdb5d6f3741502be247279407679296772 # via # ipython # matplotlib-inline diff --git a/mypy.ini b/mypy.ini new file mode 100644 index 0000000..ff37064 --- /dev/null +++ b/mypy.ini @@ -0,0 +1,2 @@ +[mypy] +plugins = pydantic.mypy diff --git a/requirements.txt b/requirements.txt index 04036b3..a63b6b4 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,83 +15,83 @@ aiofiles==23.2.1 \ --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 \ --hash=sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a # via -r requirements.in -aiohttp[speedups]==3.9.0 \ - --hash=sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994 \ - --hash=sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded \ - --hash=sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d \ - --hash=sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8 \ - --hash=sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc \ - --hash=sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454 \ - --hash=sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8 \ - --hash=sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9 \ - --hash=sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208 \ - --hash=sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3 \ - --hash=sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76 \ - --hash=sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d \ - --hash=sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4 \ - --hash=sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8 \ - --hash=sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986 \ - --hash=sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e \ - --hash=sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea \ - --hash=sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2 \ - --hash=sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7 \ - --hash=sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8 \ - --hash=sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d \ - --hash=sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814 \ - --hash=sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218 \ - --hash=sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8 \ - --hash=sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075 \ - --hash=sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982 \ - --hash=sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31 \ - --hash=sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b \ - --hash=sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30 \ - --hash=sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9 \ - --hash=sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94 \ - --hash=sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8 \ - --hash=sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253 \ - --hash=sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c \ - --hash=sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113 \ - --hash=sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911 \ - --hash=sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787 \ - --hash=sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11 \ - --hash=sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd \ - --hash=sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe \ - --hash=sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029 \ - --hash=sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192 \ - --hash=sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b \ - --hash=sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff \ - --hash=sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f \ - --hash=sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b \ - --hash=sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456 \ - --hash=sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73 \ - --hash=sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf \ - --hash=sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d \ - --hash=sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f \ - --hash=sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f \ - --hash=sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985 \ - --hash=sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb \ - --hash=sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940 \ - --hash=sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f \ - --hash=sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd \ - --hash=sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd \ - --hash=sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896 \ - --hash=sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d \ - --hash=sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202 \ - --hash=sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40 \ - --hash=sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411 \ - --hash=sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735 \ - --hash=sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305 \ - --hash=sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80 \ - --hash=sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932 \ - --hash=sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b \ - --hash=sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7 \ - --hash=sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af \ - --hash=sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3 \ - --hash=sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf \ - --hash=sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4 \ - --hash=sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844 \ - --hash=sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318 \ - --hash=sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887 +aiohttp[speedups]==3.9.1 \ + --hash=sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f \ + --hash=sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c \ + --hash=sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af \ + --hash=sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4 \ + --hash=sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a \ + --hash=sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489 \ + --hash=sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213 \ + --hash=sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01 \ + --hash=sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5 \ + --hash=sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361 \ + --hash=sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26 \ + --hash=sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0 \ + --hash=sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4 \ + --hash=sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8 \ + --hash=sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1 \ + --hash=sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7 \ + --hash=sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6 \ + --hash=sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a \ + --hash=sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd \ + --hash=sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4 \ + --hash=sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499 \ + --hash=sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183 \ + --hash=sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544 \ + --hash=sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821 \ + --hash=sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501 \ + --hash=sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f \ + --hash=sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe \ + --hash=sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f \ + --hash=sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672 \ + --hash=sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5 \ + --hash=sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2 \ + --hash=sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57 \ + --hash=sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87 \ + --hash=sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0 \ + --hash=sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f \ + --hash=sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7 \ + --hash=sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed \ + --hash=sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70 \ + --hash=sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0 \ + --hash=sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f \ + --hash=sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d \ + --hash=sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f \ + --hash=sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d \ + --hash=sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431 \ + --hash=sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff \ + --hash=sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf \ + --hash=sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83 \ + --hash=sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690 \ + --hash=sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587 \ + --hash=sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e \ + --hash=sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb \ + --hash=sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3 \ + --hash=sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66 \ + --hash=sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014 \ + --hash=sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35 \ + --hash=sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f \ + --hash=sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0 \ + --hash=sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449 \ + --hash=sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23 \ + --hash=sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5 \ + --hash=sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd \ + --hash=sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4 \ + --hash=sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b \ + --hash=sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558 \ + --hash=sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd \ + --hash=sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766 \ + --hash=sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a \ + --hash=sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636 \ + --hash=sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d \ + --hash=sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590 \ + --hash=sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e \ + --hash=sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d \ + --hash=sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c \ + --hash=sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28 \ + --hash=sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065 \ + --hash=sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca # via -r requirements.in aiosignal==1.3.1 \ --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ @@ -366,30 +366,30 @@ click==8.1.7 \ --hash=sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28 \ --hash=sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de # via uvicorn -cryptography==41.0.5 \ - --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ - --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ - --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ - --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ - --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ - --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ - --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ - --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ - --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ - --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ - --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ - --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ - --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ - --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ - --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ - --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ - --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ - --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ - --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ - --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ - --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ - --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ - --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via # jwcrypto # pki-tools @@ -536,13 +536,13 @@ httptools==0.6.1 \ --hash=sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185 \ --hash=sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3 # via uvicorn -httpx==0.25.1 \ - --hash=sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a \ - --hash=sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0 +httpx==0.25.2 \ + --hash=sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8 \ + --hash=sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118 # via pki-tools -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.6 \ + --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ + --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via # anyio # httpx @@ -774,120 +774,120 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.1 \ - --hash=sha256:0b8be5413c06aadfbe56f6dc1d45c9ed25fd43264414c571135c97dd77c2bedb \ - --hash=sha256:dc5244a8939e0d9a68f1f1b5f550b2e1c879912033b1becbedb315accc75441b +pydantic==2.5.2 \ + --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ + --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd # via # fastapi # pki-tools # pydantic-settings # pysaml2 -pydantic-core==2.14.3 \ - --hash=sha256:056ea7cc3c92a7d2a14b5bc9c9fa14efa794d9f05b9794206d089d06d3433dc7 \ - --hash=sha256:0653fb9fc2fa6787f2fa08631314ab7fc8070307bd344bf9471d1b7207c24623 \ - --hash=sha256:076edc972b68a66870cec41a4efdd72a6b655c4098a232314b02d2bfa3bfa157 \ - --hash=sha256:0a3e51c2be472b7867eb0c5d025b91400c2b73a0823b89d4303a9097e2ec6655 \ - --hash=sha256:0c7f8e8a7cf8e81ca7d44bea4f181783630959d41b4b51d2f74bc50f348a090f \ - --hash=sha256:10904368261e4509c091cbcc067e5a88b070ed9a10f7ad78f3029c175487490f \ - --hash=sha256:113752a55a8eaece2e4ac96bc8817f134c2c23477e477d085ba89e3aa0f4dc44 \ - --hash=sha256:12e05a76b223577a4696c76d7a6b36a0ccc491ffb3c6a8cf92d8001d93ddfd63 \ - --hash=sha256:136bc7247e97a921a020abbd6ef3169af97569869cd6eff41b6a15a73c44ea9b \ - --hash=sha256:1582f01eaf0537a696c846bea92082082b6bfc1103a88e777e983ea9fbdc2a0f \ - --hash=sha256:1767bd3f6370458e60c1d3d7b1d9c2751cc1ad743434e8ec84625a610c8b9195 \ - --hash=sha256:1e2979dc80246e18e348de51246d4c9b410186ffa3c50e77924bec436b1e36cb \ - --hash=sha256:1ea992659c03c3ea811d55fc0a997bec9dde863a617cc7b25cfde69ef32e55af \ - --hash=sha256:1f2d4516c32255782153e858f9a900ca6deadfb217fd3fb21bb2b60b4e04d04d \ - --hash=sha256:2494d20e4c22beac30150b4be3b8339bf2a02ab5580fa6553ca274bc08681a65 \ - --hash=sha256:260692420028319e201b8649b13ac0988974eeafaaef95d0dfbf7120c38dc000 \ - --hash=sha256:2646f8270f932d79ba61102a15ea19a50ae0d43b314e22b3f8f4b5fabbfa6e38 \ - --hash=sha256:27828f0227b54804aac6fb077b6bb48e640b5435fdd7fbf0c274093a7b78b69c \ - --hash=sha256:2bc736725f9bd18a60eec0ed6ef9b06b9785454c8d0105f2be16e4d6274e63d0 \ - --hash=sha256:2c08ac60c3caa31f825b5dbac47e4875bd4954d8f559650ad9e0b225eaf8ed0c \ - --hash=sha256:2c83892c7bf92b91d30faca53bb8ea21f9d7e39f0ae4008ef2c2f91116d0464a \ - --hash=sha256:354db020b1f8f11207b35360b92d95725621eb92656725c849a61e4b550f4acc \ - --hash=sha256:364dba61494e48f01ef50ae430e392f67ee1ee27e048daeda0e9d21c3ab2d609 \ - --hash=sha256:37dad73a2f82975ed563d6a277fd9b50e5d9c79910c4aec787e2d63547202315 \ - --hash=sha256:38113856c7fad8c19be7ddd57df0c3e77b1b2336459cb03ee3903ce9d5e236ce \ - --hash=sha256:38aed5a1bbc3025859f56d6a32f6e53ca173283cb95348e03480f333b1091e7d \ - --hash=sha256:3ad083df8fe342d4d8d00cc1d3c1a23f0dc84fce416eb301e69f1ddbbe124d3f \ - --hash=sha256:3c1bf1a7b05a65d3b37a9adea98e195e0081be6b17ca03a86f92aeb8b110f468 \ - --hash=sha256:3d1dde10bd9962b1434053239b1d5490fc31a2b02d8950a5f731bc584c7a5a0f \ - --hash=sha256:44aaf1a07ad0824e407dafc637a852e9a44d94664293bbe7d8ee549c356c8882 \ - --hash=sha256:44afa3c18d45053fe8d8228950ee4c8eaf3b5a7f3b64963fdeac19b8342c987f \ - --hash=sha256:4a70d23eedd88a6484aa79a732a90e36701048a1509078d1b59578ef0ea2cdf5 \ - --hash=sha256:4aa89919fbd8a553cd7d03bf23d5bc5deee622e1b5db572121287f0e64979476 \ - --hash=sha256:4cc6bb11f4e8e5ed91d78b9880774fbc0856cb226151b0a93b549c2b26a00c19 \ - --hash=sha256:536e1f58419e1ec35f6d1310c88496f0d60e4f182cacb773d38076f66a60b149 \ - --hash=sha256:5402ee0f61e7798ea93a01b0489520f2abfd9b57b76b82c93714c4318c66ca06 \ - --hash=sha256:56814b41486e2d712a8bc02a7b1f17b87fa30999d2323bbd13cf0e52296813a1 \ - --hash=sha256:5b73441a1159f1fb37353aaefb9e801ab35a07dd93cb8177504b25a317f4215a \ - --hash=sha256:61beaa79d392d44dc19d6f11ccd824d3cccb865c4372157c40b92533f8d76dd0 \ - --hash=sha256:6c2d118d1b6c9e2d577e215567eedbe11804c3aafa76d39ec1f8bc74e918fd07 \ - --hash=sha256:6e2f9d76c00e805d47f19c7a96a14e4135238a7551a18bfd89bb757993fd0933 \ - --hash=sha256:71ed769b58d44e0bc2701aa59eb199b6665c16e8a5b8b4a84db01f71580ec448 \ - --hash=sha256:7349f99f1ef8b940b309179733f2cad2e6037a29560f1b03fdc6aa6be0a8d03c \ - --hash=sha256:75f3f534f33651b73f4d3a16d0254de096f43737d51e981478d580f4b006b427 \ - --hash=sha256:76fc18653a5c95e5301a52d1b5afb27c9adc77175bf00f73e94f501caf0e05ad \ - --hash=sha256:7cb0c397f29688a5bd2c0dbd44451bc44ebb9b22babc90f97db5ec3e5bb69977 \ - --hash=sha256:7cc24728a1a9cef497697e53b3d085fb4d3bc0ef1ef4d9b424d9cf808f52c146 \ - --hash=sha256:7e63a56eb7fdee1587d62f753ccd6d5fa24fbeea57a40d9d8beaef679a24bdd6 \ - --hash=sha256:832d16f248ca0cc96929139734ec32d21c67669dcf8a9f3f733c85054429c012 \ - --hash=sha256:8488e973547e8fb1b4193fd9faf5236cf1b7cd5e9e6dc7ff6b4d9afdc4c720cb \ - --hash=sha256:849cff945284c577c5f621d2df76ca7b60f803cc8663ff01b778ad0af0e39bb9 \ - --hash=sha256:88ec906eb2d92420f5b074f59cf9e50b3bb44f3cb70e6512099fdd4d88c2f87c \ - --hash=sha256:8d3b9c91eeb372a64ec6686c1402afd40cc20f61a0866850f7d989b6bf39a41a \ - --hash=sha256:8f5624f0f67f2b9ecaa812e1dfd2e35b256487566585160c6c19268bf2ffeccc \ - --hash=sha256:905a12bf088d6fa20e094f9a477bf84bd823651d8b8384f59bcd50eaa92e6a52 \ - --hash=sha256:92486a04d54987054f8b4405a9af9d482e5100d6fe6374fc3303015983fc8bda \ - --hash=sha256:96eb10ef8920990e703da348bb25fedb8b8653b5966e4e078e5be382b430f9e0 \ - --hash=sha256:96fb679c7ca12a512d36d01c174a4fbfd912b5535cc722eb2c010c7b44eceb8e \ - --hash=sha256:98d8b3932f1a369364606417ded5412c4ffb15bedbcf797c31317e55bd5d920e \ - --hash=sha256:9dbab442a8d9ca918b4ed99db8d89d11b1f067a7dadb642476ad0889560dac79 \ - --hash=sha256:9ef3e2e407e4cad2df3c89488a761ed1f1c33f3b826a2ea9a411b0a7d1cccf1b \ - --hash=sha256:9ff737f24b34ed26de62d481ef522f233d3c5927279f6b7229de9b0deb3f76b5 \ - --hash=sha256:a1a39fecb5f0b19faee9a8a8176c805ed78ce45d760259a4ff3d21a7daa4dfc1 \ - --hash=sha256:a402ae1066be594701ac45661278dc4a466fb684258d1a2c434de54971b006ca \ - --hash=sha256:a5c51460ede609fbb4fa883a8fe16e749964ddb459966d0518991ec02eb8dfb9 \ - --hash=sha256:a8ca13480ce16daad0504be6ce893b0ee8ec34cd43b993b754198a89e2787f7e \ - --hash=sha256:ab4a2381005769a4af2ffddae74d769e8a4aae42e970596208ec6d615c6fb080 \ - --hash=sha256:aeafc7f5bbddc46213707266cadc94439bfa87ecf699444de8be044d6d6eb26f \ - --hash=sha256:aecd5ed096b0e5d93fb0367fd8f417cef38ea30b786f2501f6c34eabd9062c38 \ - --hash=sha256:af452e69446fadf247f18ac5d153b1f7e61ef708f23ce85d8c52833748c58075 \ - --hash=sha256:af46f0b7a1342b49f208fed31f5a83b8495bb14b652f621e0a6787d2f10f24ee \ - --hash=sha256:b02b5e1f54c3396c48b665050464803c23c685716eb5d82a1d81bf81b5230da4 \ - --hash=sha256:b28996872b48baf829ee75fa06998b607c66a4847ac838e6fd7473a6b2ab68e7 \ - --hash=sha256:b7692f539a26265cece1e27e366df5b976a6db6b1f825a9e0466395b314ee48b \ - --hash=sha256:ba44fad1d114539d6a1509966b20b74d2dec9a5b0ee12dd7fd0a1bb7b8785e5f \ - --hash=sha256:bf15145b1f8056d12c67255cd3ce5d317cd4450d5ee747760d8d088d85d12a2d \ - --hash=sha256:c3dc2920cc96f9aa40c6dc54256e436cc95c0a15562eb7bd579e1811593c377e \ - --hash=sha256:c54af5069da58ea643ad34ff32fd6bc4eebb8ae0fef9821cd8919063e0aeeaab \ - --hash=sha256:c5ea0153482e5b4d601c25465771c7267c99fddf5d3f3bdc238ef930e6d051cf \ - --hash=sha256:c9ffd823c46e05ef3eb28b821aa7bc501efa95ba8880b4a1380068e32c5bed47 \ - --hash=sha256:ca55c9671bb637ce13d18ef352fd32ae7aba21b4402f300a63f1fb1fd18e0364 \ - --hash=sha256:caa94726791e316f0f63049ee00dff3b34a629b0d099f3b594770f7d0d8f1f56 \ - --hash=sha256:cc956f78651778ec1ab105196e90e0e5f5275884793ab67c60938c75bcca3989 \ - --hash=sha256:ccbf355b7276593c68fa824030e68cb29f630c50e20cb11ebb0ee450ae6b3d08 \ - --hash=sha256:cf08b43d1d5d1678f295f0431a4a7e1707d4652576e1d0f8914b5e0213bfeee5 \ - --hash=sha256:d06c78074646111fb01836585f1198367b17d57c9f427e07aaa9ff499003e58d \ - --hash=sha256:d2b53e1f851a2b406bbb5ac58e16c4a5496038eddd856cc900278fa0da97f3fc \ - --hash=sha256:d41df8e10b094640a6b234851b624b76a41552f637b9fb34dc720b9fe4ef3be4 \ - --hash=sha256:d7abd17a838a52140e3aeca271054e321226f52df7e0a9f0da8f91ea123afe98 \ - --hash=sha256:de52ddfa6e10e892d00f747bf7135d7007302ad82e243cf16d89dd77b03b649d \ - --hash=sha256:df33902464410a1f1a0411a235f0a34e7e129f12cb6340daca0f9d1390f5fe10 \ - --hash=sha256:e16aaf788f1de5a85c8f8fcc9c1ca1dd7dd52b8ad30a7889ca31c7c7606615b8 \ - --hash=sha256:e3ad4968711fb379a67c8c755beb4dae8b721a83737737b7bcee27c05400b047 \ - --hash=sha256:e483b8b913fcd3b48badec54185c150cb7ab0e6487914b84dc7cde2365e0c892 \ - --hash=sha256:e71f666c3bf019f2490a47dddb44c3ccea2e69ac882f7495c68dc14d4065eac2 \ - --hash=sha256:ea1498ce4491236d1cffa0eee9ad0968b6ecb0c1cd711699c5677fc689905f00 \ - --hash=sha256:eaab9dc009e22726c62fe3b850b797e7f0e7ba76d245284d1064081f512c7226 \ - --hash=sha256:ec79dbe23702795944d2ae4c6925e35a075b88acd0d20acde7c77a817ebbce94 \ - --hash=sha256:f1b92e72babfd56585c75caf44f0b15258c58e6be23bc33f90885cebffde3400 \ - --hash=sha256:f1f46700402312bdc31912f6fc17f5ecaaaa3bafe5487c48f07c800052736289 \ - --hash=sha256:f518eac285c9632be337323eef9824a856f2680f943a9b68ac41d5f5bad7df7c \ - --hash=sha256:f86f20a9d5bee1a6ede0f2757b917bac6908cde0f5ad9fcb3606db1e2968bcf5 \ - --hash=sha256:f8fc652c354d3362e2932a79d5ac4bbd7170757a41a62c4fe0f057d29f10bebb \ - --hash=sha256:fe272a72c7ed29f84c42fedd2d06c2f9858dc0c00dae3b34ba15d6d8ae0fbaaf \ - --hash=sha256:fe863491664c6720d65ae438d4efaa5eca766565a53adb53bf14bc3246c72fe0 +pydantic-core==2.14.5 \ + --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ + --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ + --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ + --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ + --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ + --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ + --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ + --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ + --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ + --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ + --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ + --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ + --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ + --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ + --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ + --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ + --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ + --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ + --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ + --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ + --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ + --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ + --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ + --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ + --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ + --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ + --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ + --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ + --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ + --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ + --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ + --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ + --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ + --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ + --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ + --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ + --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ + --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ + --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ + --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ + --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ + --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ + --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ + --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ + --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ + --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ + --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ + --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ + --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ + --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ + --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ + --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ + --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ + --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ + --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ + --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ + --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ + --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ + --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ + --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ + --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ + --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ + --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ + --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ + --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ + --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ + --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ + --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ + --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ + --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ + --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ + --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ + --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ + --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ + --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ + --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ + --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ + --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ + --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ + --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ + --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ + --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ + --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ + --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ + --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ + --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ + --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ + --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ + --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ + --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ + --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ + --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ + --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ + --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ + --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ + --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ + --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ + --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ + --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ + --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ + --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ + --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ + --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ + --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ + --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 # via pydantic pydantic-settings==2.1.0 \ --hash=sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c \ diff --git a/src/auth_server/api.py b/src/auth_server/api.py index 43279e4..24973e1 100644 --- a/src/auth_server/api.py +++ b/src/auth_server/api.py @@ -8,7 +8,7 @@ from auth_server.config import AuthServerConfig, ConfigurationError, FlowName, load_config from auth_server.context import ContextRequestRoute -from auth_server.flows import BaseAuthFlow, ConfigFlow, InteractionFlow, MDQFlow, TestFlow, TLSFEDFlow +from auth_server.flows import BaseAuthFlow, CAFlow, ConfigFlow, InteractionFlow, MDQFlow, TestFlow, TLSFEDFlow from auth_server.log import init_logging from auth_server.middleware import JOSEMiddleware from auth_server.routers.interaction import interaction_router @@ -28,10 +28,11 @@ def __init__(self): # Load flows self.builtin_flow: Dict[FlowName, Type[BaseAuthFlow]] = { - FlowName.TESTFLOW: TestFlow, - FlowName.INTERACTIONFLOW: InteractionFlow, + FlowName.CAFLOW: CAFlow, FlowName.CONFIGFLOW: ConfigFlow, + FlowName.INTERACTIONFLOW: InteractionFlow, FlowName.MDQFLOW: MDQFlow, + FlowName.TESTFLOW: TestFlow, FlowName.TLSFEDFLOW: TLSFEDFlow, } self.auth_flows = self.load_flows(config=config) diff --git a/src/auth_server/cert_utils.py b/src/auth_server/cert_utils.py new file mode 100644 index 0000000..b25c326 --- /dev/null +++ b/src/auth_server/cert_utils.py @@ -0,0 +1,237 @@ +# -*- coding: utf-8 -*- +__author__ = "lundberg" + +from base64 import b64encode +from datetime import datetime +from enum import Enum +from functools import lru_cache +from pathlib import Path +from typing import Optional + +from cryptography.exceptions import InvalidSignature +from cryptography.hazmat.bindings._rust import ObjectIdentifier +from cryptography.hazmat.primitives._serialization import Encoding +from cryptography.hazmat.primitives.hashes import SHA256 +from cryptography.x509 import Certificate, ExtensionNotFound, load_der_x509_certificate, load_pem_x509_certificate +from loguru import logger +from pki_tools import Certificate as PKIToolCertificate +from pki_tools import Chain +from pki_tools import Error as PKIToolsError +from pki_tools import is_revoked + +from auth_server.config import ConfigurationError, load_config + +OID_ORGANIZATION_NAME = ObjectIdentifier("2.5.4.10") +OID_COMMON_NAME = ObjectIdentifier("2.5.4.3") +OID_SERIAL_NUMBER = ObjectIdentifier("2.5.4.5") +OID_ENHANCED_KEY_USAGE_CLIENT_AUTHENTICATION = ObjectIdentifier("1.3.6.1.5.5.7.3.2") + + +class SupportedOrgIdCA(str, Enum): + EFOS = "Swedish Social Insurance Agency" + EXPITRUST = "Expisoft AB" + SITHS = "Inera AB" + + +def cert_within_validity_period(cert: Certificate) -> bool: + """ + check if certificate is within the validity period + """ + cert_fingerprint = rfc8705_fingerprint(cert) + now = datetime.utcnow() + if now < cert.not_valid_before: + logger.error(f"Certificate {cert_fingerprint} not valid before {cert.not_valid_before}") + return False + if now > cert.not_valid_after: + logger.error(f"Certificate {cert_fingerprint} not valid after {cert.not_valid_after}") + return False + return True + + +def cert_signed_by_ca(cert: Certificate) -> Optional[str]: + """ + check if the cert is signed by any on our loaded CA certs + """ + cert_fingerprint = rfc8705_fingerprint(cert) + for ca_name, ca_cert in load_ca_certs().items(): + try: + cert.verify_directly_issued_by(ca_cert) + logger.debug(f"Certificate {cert_fingerprint} signed by CA cert {ca_name}") + return ca_name + except (ValueError, TypeError, InvalidSignature): + continue + + logger.error(f"Certificate {cert_fingerprint} did NOT match any loaded CA cert") + return None + + +async def is_cert_revoked(cert: Certificate, ca_name: str) -> bool: + """ + check if cert is revoked + """ + ca_cert = load_ca_certs().get(ca_name) + if ca_cert is None: + raise ConfigurationError(f"CA cert {ca_name} not found") + try: + return is_revoked( + cert=PKIToolCertificate.from_cryptography(cert=cert), chain=Chain.from_cryptography([ca_cert]) + ) + except PKIToolsError as e: + logger.error(f"Certificate {rfc8705_fingerprint(cert)} failed revoke check: {e}") + return True + + +def get_org_id_from_cert(cert: Certificate, ca_name: str) -> Optional[str]: + ca_cert = load_ca_certs().get(ca_name) + if not ca_cert: + raise ConfigurationError(f"CA cert {ca_name} not found") + try: + ca_org_name = ca_cert.issuer.get_attributes_for_oid(OID_ORGANIZATION_NAME)[0].value + except IndexError: + logger.error(f"CA certificate {ca_name} has no org name") + return None + try: + supported_ca = SupportedOrgIdCA(ca_org_name) + except ValueError: + logger.info(f"CA {ca_name} is not supported for org id extraction") + return None + + if supported_ca is SupportedOrgIdCA.EXPITRUST: + return get_org_id_expitrust(cert=cert) + elif supported_ca is SupportedOrgIdCA.EFOS: + return get_org_id_efos(cert=cert) + elif supported_ca is SupportedOrgIdCA.SITHS: + return get_org_id_siths(cert=cert) + else: + logger.info(f"CA {ca_name} / {ca_org_name} is not implemented for org id extraction") + return None + + +def get_org_id_expitrust(cert: Certificate) -> Optional[str]: + """ + The org number is just the serial number of the certificate. + """ + cert_fingerprint = rfc8705_fingerprint(cert) + try: + ret = cert.subject.get_attributes_for_oid(OID_SERIAL_NUMBER)[0].value + if isinstance(ret, bytes): + ret = ret.decode("utf-8") + return ret + except IndexError: + logger.error(f"certificate {cert_fingerprint} has no subject serial number") + return None + + +def get_org_id_siths(cert: Certificate) -> Optional[str]: + """ + The org number is the first part of the serial number of the certificate with a prefix of SE. + ex. SE5565594230-AAAA -> 5565594230 + """ + cert_fingerprint = rfc8705_fingerprint(cert) + + # Check that the certificate has enhancedKeyUsage clientAuthentication + try: + cert.extensions.get_extension_for_oid(OID_ENHANCED_KEY_USAGE_CLIENT_AUTHENTICATION) + except ExtensionNotFound: + logger.error(f"certificate {cert_fingerprint} has no enhancedKeyUsage clientAuthentication") + return None + + # Check that the certificate has a subject serial number and parse the org id + try: + serial_number = cert.subject.get_attributes_for_oid(OID_SERIAL_NUMBER)[0].value + if isinstance(serial_number, bytes): + serial_number = serial_number.decode("utf-8") + org_id, _ = serial_number.split("-") + return org_id.removeprefix("SE") + except IndexError: + logger.error(f"certificate {cert_fingerprint} has no subject serial number") + return None + + +def get_org_id_efos(cert: Certificate): + """ + The org number is the first part of the serial number of the certificate with a prefix of EFOS16. + ex. EFOS165565594230-012345 -> 5565594230 + """ + cert_fingerprint = rfc8705_fingerprint(cert) + # Check that the certificate has a subject serial number and parse the org id + try: + serial_number = cert.subject.get_attributes_for_oid(OID_SERIAL_NUMBER)[0].value + if isinstance(serial_number, bytes): + serial_number = serial_number.decode("utf-8") + org_id, _ = serial_number.split("-") + return org_id.removeprefix("EFOS16") + except IndexError: + logger.error(f"certificate {cert_fingerprint} has no subject serial number") + return None + + +def get_subject_cn(cert: Certificate) -> Optional[str]: + cert_fingerprint = rfc8705_fingerprint(cert) + try: + ret = cert.subject.get_attributes_for_oid(OID_COMMON_NAME)[0].value + if isinstance(ret, bytes): + ret = ret.decode("utf-8") + return ret + except IndexError: + logger.error(f"certificate {cert_fingerprint} has no subject common name") + return None + + +def get_issuer_cn(ca_name: str) -> Optional[str]: + ca_cert = load_ca_certs().get(ca_name) + if ca_cert is None: + logger.error(f"CA {ca_name} not found") + return None + try: + ret = ca_cert.subject.get_attributes_for_oid(OID_COMMON_NAME)[0].value + if isinstance(ret, bytes): + ret = ret.decode("utf-8") + return ret + except IndexError: + logger.error(f"CA {ca_name} has no subject common name") + return None + + +@lru_cache() +def load_ca_certs() -> dict[str, Certificate]: + config = load_config() + if config.ca_certs_path is None: + raise ConfigurationError("no CA certs path specified in config") + certs = {} + path = Path(config.ca_certs_path) + for crt in path.glob("**/*.c*"): # match .crt and .cer files + if crt.is_dir(): + continue + try: + with open(crt, "rb") as f: + content = f.read() + try: + cert = load_pem_x509_certificate(content) + except ValueError: + cert = load_der_x509_certificate(content) + if cert_within_validity_period(cert): + certs[cert.subject.rfc4514_string()] = cert + except (IOError, ValueError) as e: + logger.error(f"Failed to load CA cert {crt}: {e}") + logger.info(f"Loaded {len(certs)} CA certs") + logger.debug(f"Certs loaded: {certs.keys()}") + return certs + + +def load_pem_from_str(cert: str) -> Certificate: + if not cert.startswith("-----BEGIN CERTIFICATE-----"): + cert = f"-----BEGIN CERTIFICATE-----\n{cert}\n-----END CERTIFICATE-----" + return load_pem_x509_certificate(cert.encode()) + + +def serialize_certificate(cert: Certificate, encoding: Encoding = Encoding.PEM) -> str: + public_bytes = cert.public_bytes(encoding=encoding) + if encoding == Encoding.DER: + return b64encode(public_bytes).decode("ascii") + else: + return public_bytes.decode("ascii") + + +def rfc8705_fingerprint(cert: Certificate): + return b64encode(cert.fingerprint(algorithm=SHA256())).decode("ascii") diff --git a/src/auth_server/config.py b/src/auth_server/config.py index 8068419..2a6b215 100644 --- a/src/auth_server/config.py +++ b/src/auth_server/config.py @@ -30,9 +30,10 @@ class Environment(str, Enum): class FlowName(str, Enum): + CAFLOW = "CAFlow" CONFIGFLOW = "ConfigFlow" - MDQFLOW = "MDQFlow" INTERACTIONFLOW = "InteractionFlow" + MDQFLOW = "MDQFlow" TESTFLOW = "TestFlow" TLSFEDFLOW = "TLSFEDFlow" @@ -65,21 +66,22 @@ class AuthServerConfig(BaseSettings): auth_flows: List[str] = Field(default_factory=list) mdq_server: Optional[str] = Field(default=None) tls_fed_metadata: List[TLSFEDMetadata] = Field(default_factory=list) - tls_fed_metadata_max_age: timedelta = Field(default="PT1H") - keystore_path: Path = Field(default="keystore.jwks") + tls_fed_metadata_max_age: timedelta = Field(default=timedelta(hours=1)) + keystore_path: Path = Field(default=Path("keystore.jwks")) signing_key_id: str = Field(default="default") auth_token_issuer: str auth_token_audience: Optional[str] = Field(default=None) - auth_token_expires_in: timedelta = Field(default="PT10H") - proof_jws_max_age: timedelta = Field(default="PT5M") + auth_token_expires_in: timedelta = Field(default=timedelta(hours=10)) + proof_jws_max_age: timedelta = Field(default=timedelta(minutes=5)) client_keys: Dict[str, ClientKey] = Field(default_factory=dict) mongo_uri: Optional[str] = None - transaction_state_expires_in: timedelta = Field(default="PT10M") + transaction_state_expires_in: timedelta = Field(default=timedelta(minutes=10)) pysaml2_config_path: Optional[Path] = Field(default=None) pysaml2_config_name: str = "SAML_CONFIG" saml2_discovery_service_url: Optional[AnyUrl] = None saml2_single_idp: Optional[str] = None - ca_certs_path: Optional[Path] = None # all files ending with .crt will be loaded recursively. PEM and DER supported + ca_certs_path: Optional[Path] = None # all files ending with .c* will be loaded recursively. PEM and DER supported + ca_certs_mandatory_org_id: bool = False # fail grant requests where no org id is found in the certificate @field_validator("application_root") @classmethod @@ -112,7 +114,7 @@ def load_config() -> AuthServerConfig: config = AuthServerConfig.parse_obj(data) else: # config will be instantiated with env vars if there is no config file - config = AuthServerConfig() # type: ignore[call-arg] + config = AuthServerConfig() # Save config to a file in /dev/shm for introspection fd_int = os.open(f"/dev/shm/{config.app_name}_config.yaml", os.O_WRONLY | os.O_CREAT | os.O_TRUNC, 0o600) with open(fd_int, "w") as fd: diff --git a/src/auth_server/db/transaction_state.py b/src/auth_server/db/transaction_state.py index e049a7a..4b24d10 100644 --- a/src/auth_server/db/transaction_state.py +++ b/src/auth_server/db/transaction_state.py @@ -41,6 +41,7 @@ class AuthSource(str, Enum): CONFIG = "config" MDQ = "mdq" TLSFED = "tlsfed" + CA = "ca" TEST = "test" @@ -96,6 +97,13 @@ class TLSFEDState(TransactionState): entity: Optional[MetadataEntity] = None +class CAState(TransactionState): + auth_source: AuthSource = AuthSource.CA + issuer_common_name: Optional[str] = None + client_common_name: Optional[str] = None + organization_id: Optional[str] = None + + class TransactionStateDB(BaseDB): def __init__(self, db_client: AsyncIOMotorClient): super().__init__(db_client=db_client, db_name="auth_server", collection="transaction_states") diff --git a/src/auth_server/flows.py b/src/auth_server/flows.py index 99b60e1..04bf3b3 100644 --- a/src/auth_server/flows.py +++ b/src/auth_server/flows.py @@ -9,9 +9,19 @@ from jwcrypto.jwk import JWK from loguru import logger +from auth_server.cert_utils import ( + cert_signed_by_ca, + cert_within_validity_period, + get_issuer_cn, + get_org_id_from_cert, + get_subject_cn, + is_cert_revoked, + load_pem_from_str, +) from auth_server.config import AuthServerConfig from auth_server.context import ContextRequest from auth_server.db.transaction_state import ( + CAState, ConfigState, FlowState, InteractionState, @@ -21,7 +31,7 @@ get_transaction_state_db, ) from auth_server.mdq import mdq_data_to_key, xml_mdq_get -from auth_server.models.claims import Claims, ConfigClaims, MDQClaims, SAMLAssertionClaims, TLSFEDClaims +from auth_server.models.claims import CAClaims, Claims, ConfigClaims, MDQClaims, SAMLAssertionClaims, TLSFEDClaims from auth_server.models.gnap import ( AccessTokenFlags, AccessTokenResponse, @@ -551,7 +561,7 @@ async def create_claims(self) -> MDQClaims: source = self.config.mdq_server # Default source to mdq server if registrationAuthority is not set base_claims = await super().create_claims() - return MDQClaims(**base_claims.dict(exclude_none=True), entity_id=entity_id, scopes=scopes, source=source) + return MDQClaims(**base_claims.model_dump(exclude_none=True), entity_id=entity_id, scopes=scopes, source=source) class TLSFEDFlow(OnlyMTLSProofFlow): @@ -594,9 +604,51 @@ async def create_claims(self) -> TLSFEDClaims: base_claims = await super().create_claims() return TLSFEDClaims( - **base_claims.dict(exclude_none=True), + **base_claims.model_dump(exclude_none=True), entity_id=self.state.entity.entity_id, scopes=scopes, organization_id=self.state.entity.organization_id, source=self.state.entity.issuer, ) + + +class CAFlow(OnlyMTLSProofFlow): + @classmethod + def load_state(cls, state: Mapping[str, Any]) -> CAState: + return CAState.from_dict(state=state) + + async def validate_proof(self) -> Optional[GrantResponse]: + await super().validate_proof() + if not self.state.proof_ok: + raise NextFlowException(status_code=401, detail="client certificate does not match grant request") + + client_cert = load_pem_from_str(self.request.context.client_cert) + if not cert_within_validity_period(cert=client_cert): + raise StopTransactionException(status_code=401, detail="client certificate expired or not yet valid") + + ca_name = cert_signed_by_ca(cert=client_cert) + if ca_name is None: + raise StopTransactionException(status_code=401, detail="client certificate not signed by CA") + + if await is_cert_revoked(cert=client_cert, ca_name=ca_name) is True: + raise StopTransactionException(status_code=401, detail="client certificate revoked") + + # set client CN and issuer CN in state for use in claims + self.state.client_common_name = get_subject_cn(cert=client_cert) + self.state.issuer_common_name = get_issuer_cn(ca_name=ca_name) + # try to get an organization id from the client certificate + self.state.organization_id = get_org_id_from_cert(cert=client_cert, ca_name=ca_name) + + return None + + async def create_claims(self) -> CAClaims: + if self.config.ca_certs_mandatory_org_id and self.state.organization_id is None: + raise StopTransactionException(status_code=401, detail="missing organization id in client certificate") + + base_claims = await super().create_claims() + return CAClaims( + **base_claims.model_dump(exclude_none=True), + organization_id=self.state.organization_id, + common_name=self.state.client_common_name, + source=self.state.issuer_common_name, + ) diff --git a/src/auth_server/mdq.py b/src/auth_server/mdq.py index 91cfd86..ef5e8ee 100644 --- a/src/auth_server/mdq.py +++ b/src/auth_server/mdq.py @@ -12,8 +12,9 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator, model_serializer from pyexpat import ExpatError +from auth_server.cert_utils import load_pem_from_str, serialize_certificate from auth_server.models.gnap import Key, Proof, ProofMethod -from auth_server.utils import get_values, hash_with, load_cert_from_str, serialize_certificate +from auth_server.utils import get_values, hash_with __author__ = "lundberg" @@ -36,7 +37,7 @@ class MDQCert(MDQBase): def deserialize_cert(cls, v: str) -> Certificate: if isinstance(v, Certificate): return v - return load_cert_from_str(v) + return load_pem_from_str(v) @model_serializer def serialize_mdq_cert(self) -> dict[str, Any]: @@ -83,7 +84,7 @@ async def xml_mdq_get(entity_id: str, mdq_url: str) -> MDQData: for key_descriptor in get_values(key="urn:oasis:names:tc:SAML:2.0:metadata:KeyDescriptor", obj=entity): use = list(get_values(key="@use", obj=key_descriptor))[0] raw_cert = list(get_values(key="http://www.w3.org/2000/09/xmldsig#:X509Certificate", obj=key_descriptor))[0] - cert = load_cert_from_str(raw_cert) + cert = load_pem_from_str(raw_cert) certs.append(MDQCert(use=KeyUse(use), cert=cert)) return MDQData(certs=certs, metadata=entity) except (ExpatError, ValueError): # TODO: handle exceptions properly @@ -96,7 +97,7 @@ async def mdq_data_to_key(mdq_data: MDQData) -> Optional[Key]: # There should only be one or zero signing certs if signing_cert: logger.info("Found cert in metadata") - return Key( # type: ignore[call-arg] + return Key( proof=Proof(method=ProofMethod.MTLS), cert_S256=b64encode(signing_cert[0].fingerprint(algorithm=SHA256())).decode("utf-8"), ) diff --git a/src/auth_server/models/claims.py b/src/auth_server/models/claims.py index f4cd9b3..adab3a2 100644 --- a/src/auth_server/models/claims.py +++ b/src/auth_server/models/claims.py @@ -21,6 +21,10 @@ class ConfigClaims(Claims): model_config = ConfigDict(extra="allow") +class CAClaims(Claims): + common_name: str + organization_id: Optional[str] = None + class MDQClaims(Claims): entity_id: str diff --git a/src/auth_server/models/tls_fed_metadata.py b/src/auth_server/models/tls_fed_metadata.py index 676d2a4..6a7c075 100644 --- a/src/auth_server/models/tls_fed_metadata.py +++ b/src/auth_server/models/tls_fed_metadata.py @@ -30,7 +30,7 @@ class SAMLScopeExtension(BaseModel): class Extensions(BaseModel): model_config = ConfigDict(extra="allow", populate_by_name=True) - saml_scope: Optional[SAMLScopeExtension] = Field(default=None, alias=RegisteredExtensions.SAML_SCOPE.value) # type: ignore[literal-required] + saml_scope: Optional[SAMLScopeExtension] = Field(default=None, alias=RegisteredExtensions.SAML_SCOPE.value) class CertIssuers(BaseModel): diff --git a/src/auth_server/proof/common.py b/src/auth_server/proof/common.py index c2f6efa..41d75b9 100644 --- a/src/auth_server/proof/common.py +++ b/src/auth_server/proof/common.py @@ -37,7 +37,7 @@ async def load_config_key(client_key: ClientKey) -> Key: elif client_key.cert_S256: logger.info("Loading cert_S256 from config") logger.debug(f"client_key.cert_S256: {client_key.cert_S256}") - return Key(proof=client_key.proof, cert_S256=client_key.cert_S256) # type: ignore[call-arg] + return Key(proof=client_key.proof, cert_S256=client_key.cert_S256) raise ConfigurationError(f"malformed client key in config") diff --git a/src/auth_server/proof/mtls.py b/src/auth_server/proof/mtls.py index 222da15..d670439 100644 --- a/src/auth_server/proof/mtls.py +++ b/src/auth_server/proof/mtls.py @@ -1,24 +1,21 @@ # -*- coding: utf-8 -*- -from base64 import b64encode - -from cryptography.hazmat.primitives.hashes import SHA256 from loguru import logger +from auth_server.cert_utils import load_pem_from_str, rfc8705_fingerprint from auth_server.models.gnap import Key -from auth_server.utils import load_cert_from_str __author__ = "lundberg" async def check_mtls_proof(gnap_key: Key, cert: str) -> bool: try: - tls_cert = load_cert_from_str(cert) + tls_cert = load_pem_from_str(cert) except ValueError: logger.error(f"could not load client cert: {cert}") return False - tls_fingerprint = b64encode(tls_cert.fingerprint(algorithm=SHA256())).decode("utf-8") + tls_fingerprint = rfc8705_fingerprint(tls_cert) logger.debug(f"tls cert fingerprint: {str(tls_fingerprint)}") if gnap_key.cert_S256 is not None: @@ -28,8 +25,8 @@ async def check_mtls_proof(gnap_key: Key, cert: str) -> bool: return True logger.info("TLS cert fingerprint does NOT match grant request cert#S256") elif gnap_key.cert is not None: - grant_cert = load_cert_from_str(gnap_key.cert) - grant_cert_fingerprint = b64encode(grant_cert.fingerprint(algorithm=SHA256())).decode("utf-8") + grant_cert = load_pem_from_str(gnap_key.cert) + grant_cert_fingerprint = rfc8705_fingerprint(grant_cert) logger.debug(f"grant cert fingerprint: {grant_cert_fingerprint}") if tls_fingerprint == grant_cert_fingerprint: logger.info("TLS cert fingerprint matches grant request cert fingerprint") diff --git a/src/auth_server/routers/root.py b/src/auth_server/routers/root.py index e5be74e..f4afebb 100644 --- a/src/auth_server/routers/root.py +++ b/src/auth_server/routers/root.py @@ -67,7 +67,7 @@ async def transaction( # init a new transaction state state = TransactionState( flow_name=auth_flow_name, - grant_request=grant_req.copy(deep=True), # let every flow have their own copy of the grant request, + grant_request=grant_req.model_copy(deep=True), # let every flow have their own copy of the grant request, ) flow = auth_flow(request=request, config=config, signing_key=signing_key, state=state.to_dict()) diff --git a/src/auth_server/routers/status.py b/src/auth_server/routers/status.py index 9d89a33..a722df7 100644 --- a/src/auth_server/routers/status.py +++ b/src/auth_server/routers/status.py @@ -2,7 +2,6 @@ import asyncio from fastapi import APIRouter -from loguru import logger from pymongo.errors import ConnectionFailure from auth_server.config import load_config diff --git a/src/auth_server/saml2.py b/src/auth_server/saml2.py index 59a8047..b4f48aa 100644 --- a/src/auth_server/saml2.py +++ b/src/auth_server/saml2.py @@ -95,7 +95,7 @@ def from_pysaml2(cls, ava: Dict[str, List[str]]) -> SAMLAttributes: result.update(ava) result.update(single_values) # what's up with pydantic typing, hopefully an upgrade to 2 will solve this - return cls(**result) # type: ignore[arg-type] + return cls(**result) class SessionInfo(BaseModel): diff --git a/src/auth_server/tests/data/ca/README b/src/auth_server/tests/data/ca/README new file mode 100644 index 0000000..8a992eb --- /dev/null +++ b/src/auth_server/tests/data/ca/README @@ -0,0 +1,12 @@ +Test certs: +https://eid.expisoft.se/expitrust-test-certifikat/ + +Convert p12 to x509 PEM certificate AND key format, use these commands: + + openssl pkcs12 -in path.p12 -out newfile.crt.pem -clcerts -nokeys + openssl pkcs12 -in path.p12 -out newfile.key.pem -nocerts -nodes + +Test CA certs: +https://eid.expisoft.se/expitrust-test-certifikat/ +https://inera.atlassian.net/wiki/spaces/IAM/pages/289082989/PKI-struktur+och+rotcertifikat +https://repository.efos.se/ diff --git a/src/auth_server/tests/data/ca/bolag_a.crt b/src/auth_server/tests/data/ca/bolag_a.crt new file mode 100644 index 0000000..083c4a3 --- /dev/null +++ b/src/auth_server/tests/data/ca/bolag_a.crt @@ -0,0 +1,36 @@ +Bag Attributes + friendlyName: auth + localKeyID: 01 01 01 01 +subject=C = SE, O = Bolag A, CN = Bolag A + serialNumber = 165560000167 +issuer=C = SE, O = Expisoft AB, CN = ExpiTrust Test CA v8 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgICBOwwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0V4cGlzb2Z0IEFCMR0wGwYDVQQDExRFeHBpVHJ1c3QgVGVzdCBD +QSB2ODAeFw0yMzAxMDIxNTEyMzhaFw0yNTAxMDIxNTEyMzhaMEYxCzAJBgNVBAYT +AlNFMRAwDgYDVQQKEwdCb2xhZyBBMSUwDgYDVQQDEwdCb2xhZyBBMBMGA1UEBRMM +MTY1NTYwMDAwMTY3MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsdSA +88iUeAOe1O2nDWVSXrT3+YVjQPg35MysBx1kmxvwpANSXDwFauyKHFl44jqN/UzV +siBAi2ICdoRQfrEs66XEU0zNiz61ZDg4P/L2C14IN1aRWF//8MQo2zrQs44iy/HU +1oXB3SfMo4KIbPgJwQd7JHnqYiOtfLO/iMH5an+fCtbj3+pwhtb64lfkdVQx+Ntq +eEygmzl1SCZBmdqUR4vupajhY42hlKM/6+U6DY/Cbvo3KwJ1GsuQKD5Iww/92bVx +6loJY0/hAmEsXFX8DGHQCxvivmbFP7cL2qA9e+xp03cqvW/qBMuXDmBUgwRaXcAT +mBxADHi5R1MlkMuVkQIDAQABo4IBYzCCAV8wHwYDVR0jBBgwFoAURHCpiqHBraqR +s0LNTz6+wG3iXKQwHQYDVR0OBBYEFAoBVE/ejxgmB5rj+lxWtVQr0e4cMA4GA1Ud +DwEB/wQEAwIFoDAVBgNVHSAEDjAMMAoGCCqFcDYJAiIDMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjCBnQYDVR0fBIGVMIGSMEegRaBDhkFodHRwOi8vY2Rw +Mi5jZXJ0c2VydmljZS5zZS9jZHAvZWlkL0V4cGlUcnVzdCUyMFRlc3QlMjBDQSUy +MHY4LmNybDBHoEWgQ4ZBaHR0cDovL2NkcDEuY2VydHNlcnZpY2Uuc2UvY2RwL2Vp +ZC9FeHBpVHJ1c3QlMjBUZXN0JTIwQ0ElMjB2OC5jcmwwNwYIKwYBBQUHAQEEKzAp +MCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5jZXJ0c2VydmljZS5zZS8wDQYJKoZI +hvcNAQELBQADggIBABfA3RvhYB5fmrZXyoZA47rtDWfR4TAaT/Ddy3iHaVaEOsQ/ +57Zg/IRKXjIB7Us0Vu7Tt2ld5z5coBTHOJtXWUZnn7Olm5tmnnseE2wjHhEqEJCH +oJEa2+4rO7MDtechAQRYnNmWF0bU+WoOFWcNbHTORc5umsHdM3XTTdXADOnS0y6e +Rpn0W/TDncLx9QLLV3A83GmHyZR1SBDT/VZ0oJiO+2xFJHhDL0oTDzHseRaOEfJi +4BhCIjXoZnckYB/vyz9TwR8J2hy1a32NyVinMMssW4Chqalry20oMPB/hk3+D3Bl +oiWcQEuWHwHV/Bhwgm4KFn6ywQsLDEH97HizNfokZ02BKg/Hrn/FKnBxvXmwX3I5 +LC9tLz015hX9pvulqaERKIRR2aohghRr+jz17u3MOeGUEBJbVaC8+wQBmW3/E7Er +2oYcjNYCbG5vZWcO0P7Kv18esWg4yYDz6l0dVVeHx9TSegcd5LUc22uoM4OsH1fE +ST2z3QwcMQC6q4OFxmKutrMat7MXaQA75MTc693gdxqqWuj3Qydm5qO7lcfXkEJh +ltw4+FAUEZZzNFjV1j+KO4DL17VUA2srXhVKLrncSfzCnbBxV/QFGlQFA9lFvTQr +4lVpN55UOwGdKndpoSvICKQgkit+rvbmAmEnHfEkYvsDWOi1fLG7VP8ZtAfD +-----END CERTIFICATE----- diff --git a/src/auth_server/tests/data/ca/bolag_b.crt b/src/auth_server/tests/data/ca/bolag_b.crt new file mode 100644 index 0000000..09934db --- /dev/null +++ b/src/auth_server/tests/data/ca/bolag_b.crt @@ -0,0 +1,36 @@ +Bag Attributes + friendlyName: auth + localKeyID: 01 01 01 01 +subject=C = SE, O = Bolag B, CN = Bolag B + serialNumber = 165560000282 +issuer=C = SE, O = Expisoft AB, CN = ExpiTrust Test CA v8 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgICBPMwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0V4cGlzb2Z0IEFCMR0wGwYDVQQDExRFeHBpVHJ1c3QgVGVzdCBD +QSB2ODAeFw0yMzAxMDIxNTQ2MjlaFw0yNTAxMDIxNTQ2MjlaMEYxCzAJBgNVBAYT +AlNFMRAwDgYDVQQKEwdCb2xhZyBCMSUwDgYDVQQDEwdCb2xhZyBCMBMGA1UEBRMM +MTY1NTYwMDAwMjgyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtS+M +1eBuZz+9oD+it7R4JWStmqUPr4h+e/txby5YjzjdXyuDfI5vtqZPZM+/n3tkJA5a +r3fb0jrT7gcsiFFgnJB3Zfp0+smtJ14YGvum19GHOfonIm4dCryu0wEj1WhcU4cZ +1Gkjl2tCpKHbu2T6uiG6VmuWFucQFiStpPGyBpkBiuPCnUWamXodFp8xq1oCo7Wo +DEDmek7vdW5YNKY7snxfTE5EmMv3KS4twH8bOffUXMKkJmaU60fSu0vpgN6ycLWl +pfDszASn74ewBU6S8ENFWlGCCGQOYAmBKmMWgu7h6j0026ploGPYkHLiQxWn57qK +/gVw8ygTw2zl1sWfNQIDAQABo4IBYzCCAV8wHwYDVR0jBBgwFoAURHCpiqHBraqR +s0LNTz6+wG3iXKQwHQYDVR0OBBYEFMF2RKAIo0vsWOu3paRUH/Wl8K9BMA4GA1Ud +DwEB/wQEAwIFoDAVBgNVHSAEDjAMMAoGCCqFcDYJAiIDMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjCBnQYDVR0fBIGVMIGSMEegRaBDhkFodHRwOi8vY2Rw +Mi5jZXJ0c2VydmljZS5zZS9jZHAvZWlkL0V4cGlUcnVzdCUyMFRlc3QlMjBDQSUy +MHY4LmNybDBHoEWgQ4ZBaHR0cDovL2NkcDEuY2VydHNlcnZpY2Uuc2UvY2RwL2Vp +ZC9FeHBpVHJ1c3QlMjBUZXN0JTIwQ0ElMjB2OC5jcmwwNwYIKwYBBQUHAQEEKzAp +MCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5jZXJ0c2VydmljZS5zZS8wDQYJKoZI +hvcNAQELBQADggIBACLfiLCu5h4uefhKiQxj6XplNJmPC3ZG8uKjoW/z9QzuOs0n +FJr7avJbyYAYJiV2B+eYwNWvVmCY8BGEuarbJHpHOxA0k3GAqV2pCFT1/VBPRAxd +xnT9SuKr7OQzSztSQkvn3DBlK3WKjRDQtW7LprKZNl4czEoJb3tLxOKvfmTReWCg +gb2Em2xXG2pARzTeSuAlO/ZDGp/1O8lrmXuMHZFfP+BwoXonlngOXHhQKE/r60j/ +OY1yEXS47Ft02LzervY6ufE59zGK3wQ80vuIaHVzkyUpPutkwdtc9Qnintkds27X +8vh+WUZH23q25YUy9EyUT6WLDoyiih0krU/vFND6DOdCgx3HyY/3ygeDwyd1jupK +pxa+ZdI3QfrUQNJadGU0e+2SSebDYIxJFSg49CSR81r4Z6NBM3PkXYWU9OleMYmj +xhb3PMVErrUYCEu7DgWgZOmcaOGrDi1kLxzbO1wvVHISmyWrkZCWcrgiMbjQey+8 +zCrMYJyJ3ug5NrtgH8HQCGS2ZUl0XsvvB+XWg8JJfuLX5mO12Tp6xxPykzUWJnsy +mgVhFVEpepDqz3OjqIk5P3/QwOncQuYcAqPvD+xUd1aIDX5w0tsvA0G3aNE+aDlP +OtWAAFaehCABSfTpTDfzca0M210q32gZr25Yu58rwAlEaRFbI6a5X2CLz3pP +-----END CERTIFICATE----- diff --git a/src/auth_server/tests/data/ca/bolag_c.crt b/src/auth_server/tests/data/ca/bolag_c.crt new file mode 100644 index 0000000..dffcdac --- /dev/null +++ b/src/auth_server/tests/data/ca/bolag_c.crt @@ -0,0 +1,36 @@ +Bag Attributes + friendlyName: auth + localKeyID: 01 01 01 01 +subject=C = SE, O = Bolag C, CN = Bolag C + serialNumber = 165560001124 +issuer=C = SE, O = Expisoft AB, CN = ExpiTrust Test CA v8 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgICBPgwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0V4cGlzb2Z0IEFCMR0wGwYDVQQDExRFeHBpVHJ1c3QgVGVzdCBD +QSB2ODAeFw0yMzAxMDIxNjAzMDZaFw0yMzAxMDMxNjAzMDlaMEYxCzAJBgNVBAYT +AlNFMRAwDgYDVQQKEwdCb2xhZyBDMSUwDgYDVQQDEwdCb2xhZyBDMBMGA1UEBRMM +MTY1NTYwMDAxMTI0MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAunhn +WRZbHu53JNwENiQQANbm0rkeNvbz4rMdAYxlevyFo5gM7fQ5PNqm9JRPUtypeZYR +VwkDuYdmx4rdsVIdCr9DMGjADkjQzmDakUen3O5Q7AbtGT/tRuhqjfFYYDActbu/ +Vxealxgv7rCy/9XoMIB/3cTeDoxH/MDWdo84KCDKGVVSivKVi2nDBJsurpmqklQo +bZ5VO7vQyOVXDaPJiq0QnQumtE5xzqZ2Zx7dKM007lTjhMCV5zMiYbiHDaAQdlZI +M7KGjiBzxqAzMrNhZibckGcu0Ihvu42LKfhzWRuo8EezKX3rjKIsxk4JzCAw+4+l +wWdvc2nh0rlBBiETxwIDAQABo4IBYzCCAV8wHwYDVR0jBBgwFoAURHCpiqHBraqR +s0LNTz6+wG3iXKQwHQYDVR0OBBYEFP5g2Sn2nbTr/PAFccd4p1KY+1QaMA4GA1Ud +DwEB/wQEAwIFoDAVBgNVHSAEDjAMMAoGCCqFcDYJAiIDMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjCBnQYDVR0fBIGVMIGSMEegRaBDhkFodHRwOi8vY2Rw +Mi5jZXJ0c2VydmljZS5zZS9jZHAvZWlkL0V4cGlUcnVzdCUyMFRlc3QlMjBDQSUy +MHY4LmNybDBHoEWgQ4ZBaHR0cDovL2NkcDEuY2VydHNlcnZpY2Uuc2UvY2RwL2Vp +ZC9FeHBpVHJ1c3QlMjBUZXN0JTIwQ0ElMjB2OC5jcmwwNwYIKwYBBQUHAQEEKzAp +MCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5jZXJ0c2VydmljZS5zZS8wDQYJKoZI +hvcNAQELBQADggIBAHMnn3iLSX0eSjqwHMBOkqkr+78CCtwCzZlpBbSChy6HumDk +7VGS61HBgVl/zpRNKC6ovkMO4wEzHsTVNIAt4LezUeYun0Ahpd09VUkIYQKpSEJM +yQXgfZpgf7Da1HNj60BtGcA/13vARij9JV0Kqlct44961yfuWYLKzgq+Jdi8lJuP +DM+cxnjSnCZrX6Al5HD0/kGHYvuLu5LgF8+8M2AWmHx9ssoPKG6WhK7dTqdBpJmu +HsIWPGBcLUJAJ28srylU0Bq2RPup17wARNRVP89UJ7eBiL3/3uUD5S7/5zfBgzcn +JjLjHAPc+XmhS64+gTF3vZMQbGQu++i/DAMGNTId5e2+y5tc2cMDaZ84s2f+fZ9W +s8yiTfS3HfhnwHt7TLe4TXaIdUCA6TzZLwmi4bOGDb8MeCybkdWilFG4ypEHdhb5 ++SnIaFjURuhjTNob+XPLkkNgw/BwLxAC6xvh34JOsuoXZpM/54Asx7jgPyLEQ5kx +hYcq+SWvIkwm2PjthRxJwRRkl50kyfgoQpqG6rLZ4IUYnI4YInLiIC9s0HS2hYbj +QBD49yd4ylanVM+6s5BMpo9Eu97jH2/1moRtHrN+GOBALssCj1GA/C2GM4uuJ63O +QRadKQ8DzXJXG1Ra7IUIVk6zWXFYa+uIQfUd4oirmN8gNzi/bfd3bziN69QR +-----END CERTIFICATE----- diff --git a/src/auth_server/tests/data/ca/bolag_e.crt b/src/auth_server/tests/data/ca/bolag_e.crt new file mode 100644 index 0000000..c109c77 --- /dev/null +++ b/src/auth_server/tests/data/ca/bolag_e.crt @@ -0,0 +1,36 @@ +Bag Attributes + friendlyName: auth + localKeyID: 01 01 01 01 +subject=C = SE, O = Bolag E, CN = Bolag E + serialNumber = 194801301872 +issuer=C = SE, O = Expisoft AB, CN = ExpiTrust Test CA v8 +-----BEGIN CERTIFICATE----- +MIIFaTCCA1GgAwIBAgICBPYwDQYJKoZIhvcNAQELBQAwQjELMAkGA1UEBhMCU0Ux +FDASBgNVBAoTC0V4cGlzb2Z0IEFCMR0wGwYDVQQDExRFeHBpVHJ1c3QgVGVzdCBD +QSB2ODAeFw0yNTAxMDExNTU3NDJaFw0yNTAxMDIxNTU3NDhaMEYxCzAJBgNVBAYT +AlNFMRAwDgYDVQQKEwdCb2xhZyBFMSUwDgYDVQQDEwdCb2xhZyBFMBMGA1UEBRMM +MTk0ODAxMzAxODcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxI+g +1VaCX333baJD+J0ItgyYfZRpqFnfoTe3r61LY/EoPSRF/KekPOBFmALjSRG3Vo8P +i1tabDGCTeRZMO1KbV+ONdfSay0dckqmJK3cuK52uqzVaaI6AxteUCWskK2H5t/N +T+Eebq8IhGQ+7cwvgntHrl1ERZPfUuO/22h1+JF/zBgSjvGKGQ9lAM0qW2M1vjJj +Nl+hoyy8xNUJT77Kooh1r2Prd0uZHlfl9udzplORU2dVwW3Jtc7fCKtCzFdWUf6Z +RS9Gy85XqTbi/8CYr9+5t4V95IuhocOWS2IJxIC0awGDqN0poYSLCc82S51I7W6K +5mWbum4PWWnJdBJqFwIDAQABo4IBYzCCAV8wHwYDVR0jBBgwFoAURHCpiqHBraqR +s0LNTz6+wG3iXKQwHQYDVR0OBBYEFLLZzQ9x3LxvVrjbNbrjA5PVn+leMA4GA1Ud +DwEB/wQEAwIFoDAVBgNVHSAEDjAMMAoGCCqFcDYJAiIDMB0GA1UdJQQWMBQGCCsG +AQUFBwMBBggrBgEFBQcDAjCBnQYDVR0fBIGVMIGSMEegRaBDhkFodHRwOi8vY2Rw +Mi5jZXJ0c2VydmljZS5zZS9jZHAvZWlkL0V4cGlUcnVzdCUyMFRlc3QlMjBDQSUy +MHY4LmNybDBHoEWgQ4ZBaHR0cDovL2NkcDEuY2VydHNlcnZpY2Uuc2UvY2RwL2Vp +ZC9FeHBpVHJ1c3QlMjBUZXN0JTIwQ0ElMjB2OC5jcmwwNwYIKwYBBQUHAQEEKzAp +MCcGCCsGAQUFBzABhhtodHRwOi8vb2NzcC5jZXJ0c2VydmljZS5zZS8wDQYJKoZI +hvcNAQELBQADggIBAEENx8DIVkZ/Wm4YXR/axY+EhaHr8wqINyiuLhWZs0+zxcsm +4TdRw3TZi2iLDsHqLY67SxZ+QmtOiELDxLug9xNPwZArZLHxuJQX2ek0N/gMogvZ +no7enf/mb7BU3ievAeIkhQ+BDe4lMD7qYITGAKijQa0z3zZQ/aCjx8Vu1LWY8l/Z +/2BrfJs4FPPVpLtwzhr0Q+UuxY2scnNQDTQLZrC/2atDVXekfeQ50JrlOLP8nBFG +HpljGeE2lCHCPGSKV1w1l3jICLyPeQcBmdqfrNILv+a9nYGTCLjy//qhizRxaUMp +nS299guu0/ajtOHIBtFf6vnVLe0NrvPdM7U8d2fUBiJKrby5R2/i6u4DxUdI6+mG +weLYp3nqkqwCe3XP0QHDqtdhPLajW+Fn6HjX0DpvvP2cc1wIvhYOYKtjEySKtmH9 +Hh4fz49NZEv8Ptpzl3Y6hdb25eTrzdpgAzLdG49eRZVFoRlLIzpugpVM2p6/aZOx +jo2DxWKtAphrQkEw3UlTUed2OIFqQEy/vRmurnOMah9AqJH/vtw//bueGzUwYJkQ +Dg3ERgADzMrNvmtj4PKvUbCkjBMXq1zmBQLWp9PCO9DIZr7I6dh68oRphLBcKDje +29QCyTq0cOQT/jx0K1Lk65VfQXneusBLvjXxc2dRt59OkU0Z+k+7Q9aOr20M +-----END CERTIFICATE----- diff --git a/src/auth_server/tests/data/ca/ca_cert/ExpiTrust-Test-CA-v8.crt b/src/auth_server/tests/data/ca/ca_cert/ExpiTrust-Test-CA-v8.crt new file mode 100644 index 0000000..95eb44b Binary files /dev/null and b/src/auth_server/tests/data/ca/ca_cert/ExpiTrust-Test-CA-v8.crt differ diff --git a/src/auth_server/tests/data/ca/ca_cert/SwedishPublicSectorFunctionCAv3SAT.crt b/src/auth_server/tests/data/ca/ca_cert/SwedishPublicSectorFunctionCAv3SAT.crt new file mode 100644 index 0000000..1af376f Binary files /dev/null and b/src/auth_server/tests/data/ca/ca_cert/SwedishPublicSectorFunctionCAv3SAT.crt differ diff --git a/src/auth_server/tests/data/ca/ca_cert/testsithseidfunctioncav1.cer b/src/auth_server/tests/data/ca/ca_cert/testsithseidfunctioncav1.cer new file mode 100644 index 0000000..52ac703 Binary files /dev/null and b/src/auth_server/tests/data/ca/ca_cert/testsithseidfunctioncav1.cer differ diff --git a/src/auth_server/tests/test_app.py b/src/auth_server/tests/test_app.py index 63f3a64..aabed82 100644 --- a/src/auth_server/tests/test_app.py +++ b/src/auth_server/tests/test_app.py @@ -13,11 +13,11 @@ import yaml from cryptography import x509 from cryptography.hazmat.primitives.hashes import SHA256 -from cryptography.hazmat.primitives.serialization import Encoding from jwcrypto import jwk, jws, jwt from starlette.testclient import TestClient from auth_server.api import init_auth_server_api +from auth_server.cert_utils import serialize_certificate from auth_server.config import ClientKey, load_config from auth_server.db.transaction_state import AuthSource, TransactionState from auth_server.models.gnap import ( @@ -88,7 +88,7 @@ def setUp(self) -> None: with open(f"{self.datadir}/test.cert", "rb") as f: self.client_cert = x509.load_pem_x509_certificate(data=f.read()) - self.client_cert_str = base64.b64encode(self.client_cert.public_bytes(encoding=Encoding.DER)).decode("utf-8") + self.client_cert_str = serialize_certificate(cert=self.client_cert) with open(f"{self.datadir}/test_mdq.xml", "rb") as f: self.mdq_response = f.read() self.client_jwk = jwk.JWK.generate(kid="default", kty="EC", crv="P-256") @@ -154,7 +154,7 @@ def _fake_saml_authentication(self, transaction_id: str): "https://refeds.org/assurance/IAP/medium", ], entitlement=["some-entitlement"], - ) # type: ignore[call-arg] + ) name_id = NameID( format="urn:oasis:names:tc:SAML:2.0:nameid-format:transient", sp_name_qualifier="http://test.localhost/saml2-metadata", diff --git a/src/auth_server/tests/test_ca_flow.py b/src/auth_server/tests/test_ca_flow.py new file mode 100644 index 0000000..f6a6026 --- /dev/null +++ b/src/auth_server/tests/test_ca_flow.py @@ -0,0 +1,201 @@ +# -*- coding: utf-8 -*- +import json +from os import environ +from pathlib import Path +from typing import Any, Dict, Optional +from unittest import IsolatedAsyncioTestCase, TestCase + +from cryptography import x509 +from cryptography.x509 import Certificate +from httpx import Response +from jwcrypto import jwk, jwt +from starlette.testclient import TestClient + +from auth_server.api import init_auth_server_api +from auth_server.cert_utils import ( + cert_signed_by_ca, + cert_within_validity_period, + get_subject_cn, + is_cert_revoked, + load_ca_certs, + rfc8705_fingerprint, + serialize_certificate, +) +from auth_server.config import load_config +from auth_server.db.transaction_state import AuthSource +from auth_server.models.gnap import AccessTokenFlags, AccessTokenRequest, Client, GrantRequest, Key, Proof, ProofMethod +from auth_server.tls_fed_auth import get_tls_fed_metadata +from auth_server.utils import get_signing_key, load_jwks + +__author__ = "lundberg" + + +class MockResponse: + def __init__(self, content: bytes = b"", status_code: int = 200): + self._content = content + self._status_code = status_code + self.accessed_status = 0 + + @property + def content(self): + return self._content + + @property + def status(self): + self.accessed_status += 1 + return self._status_code + + async def text(self): + return self._content.decode("utf-8") + + +class TestAuthServer(TestCase): + def setUp(self) -> None: + self.datadir = Path(__file__).with_name("data") + self.config: Dict[str, Any] = { + "testing": "true", + "log_level": "DEBUG", + "keystore_path": f"{self.datadir}/testing_jwks.json", + "ca_certs_path": f"{self.datadir}/ca/ca_cert/", + "signing_key_id": "test-kid", + "auth_token_issuer": "http://testserver", + "auth_token_audience": "some_audience", + "auth_flows": json.dumps(["CAFlow"]), + } + environ.update(self.config) + self.app = init_auth_server_api() + self.client = TestClient(self.app) + + def _update_app_config(self, config: Optional[Dict] = None): + if config is not None: + environ.clear() + environ.update(config) + self._clear_lru_cache() + self.app = init_auth_server_api() + self.client = TestClient(self.app) + + def _load_cert(self, filename: str) -> Certificate: + with open(f"{self.datadir}/ca/{filename}", "rb") as f: + cert = x509.load_pem_x509_certificate(data=f.read()) + return cert + + def _get_access_token_claims(self, access_token: Dict, client: Optional[TestClient]) -> Dict[str, Any]: + if client is None: + client = self.client + response = client.get("/.well-known/jwk.json") + assert response.status_code == 200 + token = jwt.JWT(key=jwk.JWK(**response.json()), jwt=access_token["value"]) + return json.loads(token.claims) + + @staticmethod + def _clear_lru_cache(): + # Clear lru_cache to allow config update + load_config.cache_clear() + load_jwks.cache_clear() + get_signing_key.cache_clear() + get_tls_fed_metadata.cache_clear() + + def tearDown(self) -> None: + self.app = None # type: ignore + self.client = None # type: ignore + self._clear_lru_cache() + # Clear environment variables + environ.clear() + + def test_load_ca_certs(self): + ca_certs = load_ca_certs() + assert len(ca_certs) == 3 + + def test_cert_signed_by_ca(self): + parameters = [ + ("bolag_a.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE"), + ("bolag_b.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE"), + ("bolag_c.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE"), + ("bolag_e.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE"), + ] + for cert_name, expected_ca_name in parameters: + cert = self._load_cert(filename=cert_name) + ca_name = cert_signed_by_ca(cert) + assert ca_name == expected_ca_name + + def test_cert_within_validity_period(self): + parameters = [ + ("bolag_a.crt", True), + ("bolag_b.crt", True), + ("bolag_c.crt", False), + ("bolag_e.crt", False), + ] + for cert_name, within_validity_period in parameters: + cert = self._load_cert(filename=cert_name) + assert ( + cert_within_validity_period(cert) is within_validity_period + ), f"{cert_name} should be {not within_validity_period}" + + def _do_mtls_transaction(self, cert: Certificate) -> Response: + client_cert_str = serialize_certificate(cert=cert) + req = GrantRequest( + client=Client(key=Key(proof=Proof(method=ProofMethod.MTLS), cert_S256=rfc8705_fingerprint(cert=cert))), + access_token=[AccessTokenRequest(flags=[AccessTokenFlags.BEARER])], + ) + client_header = {"Client-Cert": client_cert_str} + return self.client.post("/transaction", json=req.model_dump(exclude_none=True), headers=client_header) + + def test_mtls_transaction(self): + parameters = [ + ("bolag_a.crt", True, "165560000167"), + ("bolag_b.crt", False, "client certificate revoked"), + ("bolag_c.crt", False, "client certificate expired or not yet valid"), + ("bolag_e.crt", False, "client certificate expired or not yet valid"), + ] + for cert_name, expect_success, expected_result in parameters: + cert = self._load_cert(filename=cert_name) + response = self._do_mtls_transaction(cert=cert) + + if expect_success: + assert response.status_code == 200 + assert "access_token" in response.json() + access_token = response.json()["access_token"] + assert AccessTokenFlags.BEARER.value in access_token["flags"] + assert access_token["value"] is not None + # Verify token and check claims + claims = self._get_access_token_claims(access_token=access_token, client=self.client) + assert claims["auth_source"] == AuthSource.CA + assert claims is not None + assert claims["organization_id"] == expected_result, f"{cert_name} has wrong org id" + assert claims["common_name"] == get_subject_cn(cert=cert), f"{cert_name} has wrong common name" + assert claims["source"] is not None + else: + assert response.status_code == 401 + assert response.json()["detail"] == expected_result + + +class TestAuthServerAsync(IsolatedAsyncioTestCase): + def setUp(self) -> None: + self.datadir = Path(__file__).with_name("data") + self.config: Dict[str, Any] = { + "testing": "true", + "log_level": "DEBUG", + "keystore_path": f"{self.datadir}/testing_jwks.json", + "ca_certs_path": f"{self.datadir}/ca/ca_cert/", + "signing_key_id": "test-kid", + "auth_token_issuer": "http://testserver", + "auth_token_audience": "some_audience", + "auth_flows": json.dumps(["TestFlow"]), + } + environ.update(self.config) + self.app = init_auth_server_api() + self.client = TestClient(self.app) + + def _load_cert(self, filename: str) -> Certificate: + with open(f"{self.datadir}/ca/{filename}", "rb") as f: + cert = x509.load_pem_x509_certificate(data=f.read()) + return cert + + async def test_cert_is_revoked(self): + parameters = [ + ("bolag_a.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE", False), + ("bolag_b.crt", "CN=ExpiTrust Test CA v8,O=Expisoft AB,C=SE", True), + ] + for cert_name, ca_name, revoked_status in parameters: + cert = self._load_cert(filename=cert_name) + assert await is_cert_revoked(cert, ca_name) is revoked_status, f"{cert_name} should be {not revoked_status}" diff --git a/src/auth_server/tests/test_saml_sp.py b/src/auth_server/tests/test_saml_sp.py index 8be8702..28b5a4b 100644 --- a/src/auth_server/tests/test_saml_sp.py +++ b/src/auth_server/tests/test_saml_sp.py @@ -71,7 +71,7 @@ def setUp(self) -> None: sp_provided_id=None, id="1f87035b4c1325b296a53d92097e6b3fa36d7e30ee82e3fcb0680d60243c1f03", ), - attributes=SAMLAttributes( # type: ignore[call-arg] + attributes=SAMLAttributes( assurance=[ "http://www.swamid.se/policy/assurance/al1", "http://www.swamid.se/policy/assurance/al2", diff --git a/src/auth_server/tests/utils.py b/src/auth_server/tests/utils.py index 493e616..849f0f6 100644 --- a/src/auth_server/tests/utils.py +++ b/src/auth_server/tests/utils.py @@ -59,9 +59,7 @@ def create_tls_fed_metadata( entity_id=entity_id, organization="Test Org", organization_id=organization_id, - issuers=[ - CertIssuers(x509certificate=f"-----BEGIN CERTIFICATE-----\n{client_cert}\n-----END CERTIFICATE-----") - ], + issuers=[CertIssuers(x509certificate=client_cert)], extensions=Extensions(saml_scope=SAMLScopeExtension(scope=scopes)), ) ] diff --git a/src/auth_server/tls_fed_auth.py b/src/auth_server/tls_fed_auth.py index 076ade3..3f4f6a6 100644 --- a/src/auth_server/tls_fed_auth.py +++ b/src/auth_server/tls_fed_auth.py @@ -1,6 +1,5 @@ # -*- coding: utf-8 -*- import asyncio -import base64 import json from datetime import datetime, timedelta from pathlib import Path @@ -9,12 +8,12 @@ import aiohttp from aiofiles import open as async_open from async_lru import alru_cache -from cryptography.hazmat.primitives.hashes import SHA256 from cryptography.x509 import load_pem_x509_certificate from jwcrypto import jwk, jws from loguru import logger from pydantic import BaseModel, ConfigDict, ValidationError +from auth_server.cert_utils import rfc8705_fingerprint from auth_server.config import load_config from auth_server.models.gnap import Key, Proof, ProofMethod from auth_server.models.tls_fed_metadata import Entity @@ -262,8 +261,8 @@ async def entity_to_key(entity: Optional[MetadataEntity]) -> Optional[Key]: if certs: # TODO: how do we handle multiple certs? logger.info("Found cert in metadata") - return Key( # type: ignore[call-arg] + return Key( proof=Proof(method=ProofMethod.MTLS), - cert_S256=base64.b64encode(certs[0].fingerprint(algorithm=SHA256())).decode("utf-8"), + cert_S256=rfc8705_fingerprint(certs[0]), ) return None diff --git a/src/auth_server/utils.py b/src/auth_server/utils.py index a30f8df..b95946d 100644 --- a/src/auth_server/utils.py +++ b/src/auth_server/utils.py @@ -9,19 +9,15 @@ import aiohttp from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.hashes import SHA3_256, SHA3_384, SHA3_512, SHA256, SHA512, HashAlgorithm -from cryptography.hazmat.primitives.serialization import Encoding -from cryptography.x509 import Certificate, load_pem_x509_certificate from jwcrypto import jwk from loguru import logger from auth_server.config import ConfigurationError, load_config +from auth_server.models.gnap import HashMethod __author__ = "lundberg" -from auth_server.models.gnap import HashMethod - - @lru_cache() def load_jwks() -> jwk.JWKSet: config = load_config() @@ -50,16 +46,6 @@ def get_signing_key() -> jwk.JWK: return signing_key -def load_cert_from_str(cert: str) -> Certificate: - if not cert.startswith("-----BEGIN CERTIFICATE-----"): - cert = f"-----BEGIN CERTIFICATE-----\n{cert}\n-----END CERTIFICATE-----" - return load_pem_x509_certificate(cert.encode()) - - -def serialize_certificate(cert: Certificate) -> str: - return cert.public_bytes(encoding=Encoding.PEM).decode("utf-8") - - def import_class(class_path: str) -> Callable: path_split = class_path.split(".") module_path = ".".join(path_split[:-1]) diff --git a/test_requirements.txt b/test_requirements.txt index 6e2b589..eed820e 100644 --- a/test_requirements.txt +++ b/test_requirements.txt @@ -15,83 +15,83 @@ aiofiles==23.2.1 \ --hash=sha256:19297512c647d4b27a2cf7c34caa7e405c0d60b5560618a29a9fe027b18b0107 \ --hash=sha256:84ec2218d8419404abcb9f0c02df3f34c6e0a68ed41072acfb1cef5cbc29051a # via -r requirements.in -aiohttp[speedups]==3.9.0 \ - --hash=sha256:05857848da443c8c12110d99285d499b4e84d59918a21132e45c3f0804876994 \ - --hash=sha256:05a183f1978802588711aed0dea31e697d760ce9055292db9dc1604daa9a8ded \ - --hash=sha256:09f23292d29135025e19e8ff4f0a68df078fe4ee013bca0105b2e803989de92d \ - --hash=sha256:11ca808f9a6b63485059f5f6e164ef7ec826483c1212a44f268b3653c91237d8 \ - --hash=sha256:1736d87dad8ef46a8ec9cddd349fa9f7bd3a064c47dd6469c0d6763d3d49a4fc \ - --hash=sha256:1df43596b826022b14998f0460926ce261544fedefe0d2f653e1b20f49e96454 \ - --hash=sha256:23170247ef89ffa842a02bbfdc425028574d9e010611659abeb24d890bc53bb8 \ - --hash=sha256:2779f5e7c70f7b421915fd47db332c81de365678180a9f3ab404088f87ba5ff9 \ - --hash=sha256:28185e36a78d247c55e9fbea2332d16aefa14c5276a582ce7a896231c6b1c208 \ - --hash=sha256:2cbc14a13fb6b42d344e4f27746a4b03a2cb0c1c3c5b932b0d6ad8881aa390e3 \ - --hash=sha256:2d71abc15ff7047412ef26bf812dfc8d0d1020d664617f4913df2df469f26b76 \ - --hash=sha256:2d820162c8c2bdbe97d328cd4f417c955ca370027dce593345e437b2e9ffdc4d \ - --hash=sha256:317719d7f824eba55857fe0729363af58e27c066c731bc62cd97bc9c3d9c7ea4 \ - --hash=sha256:35a68cd63ca6aaef5707888f17a70c36efe62b099a4e853d33dc2e9872125be8 \ - --hash=sha256:3607375053df58ed6f23903aa10cf3112b1240e8c799d243bbad0f7be0666986 \ - --hash=sha256:366bc870d7ac61726f32a489fbe3d1d8876e87506870be66b01aeb84389e967e \ - --hash=sha256:3abf0551874fecf95f93b58f25ef4fc9a250669a2257753f38f8f592db85ddea \ - --hash=sha256:3d7f6235c7475658acfc1769d968e07ab585c79f6ca438ddfecaa9a08006aee2 \ - --hash=sha256:3dd8119752dd30dd7bca7d4bc2a92a59be6a003e4e5c2cf7e248b89751b8f4b7 \ - --hash=sha256:42fe4fd9f0dfcc7be4248c162d8056f1d51a04c60e53366b0098d1267c4c9da8 \ - --hash=sha256:45820ddbb276113ead8d4907a7802adb77548087ff5465d5c554f9aa3928ae7d \ - --hash=sha256:4790e44f46a4aa07b64504089def5744d3b6780468c4ec3a1a36eb7f2cae9814 \ - --hash=sha256:4afa8f71dba3a5a2e1e1282a51cba7341ae76585345c43d8f0e624882b622218 \ - --hash=sha256:4b777c9286b6c6a94f50ddb3a6e730deec327e9e2256cb08b5530db0f7d40fd8 \ - --hash=sha256:4ee1b4152bc3190cc40ddd6a14715e3004944263ea208229ab4c297712aa3075 \ - --hash=sha256:51a4cd44788ea0b5e6bb8fa704597af3a30be75503a7ed1098bc5b8ffdf6c982 \ - --hash=sha256:536b01513d67d10baf6f71c72decdf492fb7433c5f2f133e9a9087379d4b6f31 \ - --hash=sha256:571760ad7736b34d05597a1fd38cbc7d47f7b65deb722cb8e86fd827404d1f6b \ - --hash=sha256:5a2eb5311a37fe105aa35f62f75a078537e1a9e4e1d78c86ec9893a3c97d7a30 \ - --hash=sha256:5ab16c254e2312efeb799bc3c06897f65a133b38b69682bf75d1f1ee1a9c43a9 \ - --hash=sha256:65b0a70a25456d329a5e1426702dde67be0fb7a4ead718005ba2ca582d023a94 \ - --hash=sha256:673343fbc0c1ac44d0d2640addc56e97a052504beacd7ade0dc5e76d3a4c16e8 \ - --hash=sha256:6777a390e41e78e7c45dab43a4a0196c55c3b8c30eebe017b152939372a83253 \ - --hash=sha256:6896b8416be9ada4d22cd359d7cb98955576ce863eadad5596b7cdfbf3e17c6c \ - --hash=sha256:694df243f394629bcae2d8ed94c589a181e8ba8604159e6e45e7b22e58291113 \ - --hash=sha256:70e851f596c00f40a2f00a46126c95c2e04e146015af05a9da3e4867cfc55911 \ - --hash=sha256:7276fe0017664414fdc3618fca411630405f1aaf0cc3be69def650eb50441787 \ - --hash=sha256:76a86a9989ebf82ee61e06e2bab408aec4ea367dc6da35145c3352b60a112d11 \ - --hash=sha256:7a94bde005a8f926d0fa38b88092a03dea4b4875a61fbcd9ac6f4351df1b57cd \ - --hash=sha256:7ae5f99a32c53731c93ac3075abd3e1e5cfbe72fc3eaac4c27c9dd64ba3b19fe \ - --hash=sha256:7e8a3b79b6d186a9c99761fd4a5e8dd575a48d96021f220ac5b5fa856e5dd029 \ - --hash=sha256:816f4db40555026e4cdda604a1088577c1fb957d02f3f1292e0221353403f192 \ - --hash=sha256:8303531e2c17b1a494ffaeba48f2da655fe932c4e9a2626c8718403c83e5dd2b \ - --hash=sha256:8488519aa05e636c5997719fe543c8daf19f538f4fa044f3ce94bee608817cff \ - --hash=sha256:87c8b0a6487e8109427ccf638580865b54e2e3db4a6e0e11c02639231b41fc0f \ - --hash=sha256:8c9e5f4d7208cda1a2bb600e29069eecf857e6980d0ccc922ccf9d1372c16f4b \ - --hash=sha256:94697c7293199c2a2551e3e3e18438b4cba293e79c6bc2319f5fd652fccb7456 \ - --hash=sha256:9623cfd9e85b76b83ef88519d98326d4731f8d71869867e47a0b979ffec61c73 \ - --hash=sha256:98d21092bf2637c5fa724a428a69e8f5955f2182bff61f8036827cf6ce1157bf \ - --hash=sha256:99ae01fb13a618b9942376df77a1f50c20a281390dad3c56a6ec2942e266220d \ - --hash=sha256:9c196b30f1b1aa3363a69dd69079ae9bec96c2965c4707eaa6914ba099fb7d4f \ - --hash=sha256:a00ce44c21612d185c5275c5cba4bab8d7c1590f248638b667ed8a782fa8cd6f \ - --hash=sha256:a1b66dbb8a7d5f50e9e2ea3804b01e766308331d0cac76eb30c563ac89c95985 \ - --hash=sha256:a1d7edf74a36de0e5ca50787e83a77cf352f5504eb0ffa3f07000a911ba353fb \ - --hash=sha256:a1e3b3c107ccb0e537f309f719994a55621acd2c8fdf6d5ce5152aed788fb940 \ - --hash=sha256:a486ddf57ab98b6d19ad36458b9f09e6022de0381674fe00228ca7b741aacb2f \ - --hash=sha256:ac9669990e2016d644ba8ae4758688534aabde8dbbc81f9af129c3f5f01ca9cd \ - --hash=sha256:b1a2ea8252cacc7fd51df5a56d7a2bb1986ed39be9397b51a08015727dfb69bd \ - --hash=sha256:c5b7bf8fe4d39886adc34311a233a2e01bc10eb4e842220235ed1de57541a896 \ - --hash=sha256:c67a51ea415192c2e53e4e048c78bab82d21955b4281d297f517707dc836bf3d \ - --hash=sha256:ca4fddf84ac7d8a7d0866664936f93318ff01ee33e32381a115b19fb5a4d1202 \ - --hash=sha256:d5b9345ab92ebe6003ae11d8092ce822a0242146e6fa270889b9ba965457ca40 \ - --hash=sha256:d97c3e286d0ac9af6223bc132dc4bad6540b37c8d6c0a15fe1e70fb34f9ec411 \ - --hash=sha256:db04d1de548f7a62d1dd7e7cdf7c22893ee168e22701895067a28a8ed51b3735 \ - --hash=sha256:dcf71c55ec853826cd70eadb2b6ac62ec577416442ca1e0a97ad875a1b3a0305 \ - --hash=sha256:de3cc86f4ea8b4c34a6e43a7306c40c1275e52bfa9748d869c6b7d54aa6dad80 \ - --hash=sha256:deac0a32aec29608eb25d730f4bc5a261a65b6c48ded1ed861d2a1852577c932 \ - --hash=sha256:e18d92c3e9e22553a73e33784fcb0ed484c9874e9a3e96c16a8d6a1e74a0217b \ - --hash=sha256:eb6dfd52063186ac97b4caa25764cdbcdb4b10d97f5c5f66b0fa95052e744eb7 \ - --hash=sha256:f09960b5bb1017d16c0f9e9f7fc42160a5a49fa1e87a175fd4a2b1a1833ea0af \ - --hash=sha256:f1e4f254e9c35d8965d377e065c4a8a55d396fe87c8e7e8429bcfdeeb229bfb3 \ - --hash=sha256:f32c86dc967ab8c719fd229ce71917caad13cc1e8356ee997bf02c5b368799bf \ - --hash=sha256:f50b4663c3e0262c3a361faf440761fbef60ccdde5fe8545689a4b3a3c149fb4 \ - --hash=sha256:f8e05f5163528962ce1d1806fce763ab893b1c5b7ace0a3538cd81a90622f844 \ - --hash=sha256:f929f4c9b9a00f3e6cc0587abb95ab9c05681f8b14e0fe1daecfa83ea90f8318 \ - --hash=sha256:f9e09a1c83521d770d170b3801eea19b89f41ccaa61d53026ed111cb6f088887 +aiohttp[speedups]==3.9.1 \ + --hash=sha256:02ab6006ec3c3463b528374c4cdce86434e7b89ad355e7bf29e2f16b46c7dd6f \ + --hash=sha256:04fa38875e53eb7e354ece1607b1d2fdee2d175ea4e4d745f6ec9f751fe20c7c \ + --hash=sha256:0b0a6a36ed7e164c6df1e18ee47afbd1990ce47cb428739d6c99aaabfaf1b3af \ + --hash=sha256:0d406b01a9f5a7e232d1b0d161b40c05275ffbcbd772dc18c1d5a570961a1ca4 \ + --hash=sha256:0e49b08eafa4f5707ecfb321ab9592717a319e37938e301d462f79b4e860c32a \ + --hash=sha256:0e7ba7ff228c0d9a2cd66194e90f2bca6e0abca810b786901a569c0de082f489 \ + --hash=sha256:11cb254e397a82efb1805d12561e80124928e04e9c4483587ce7390b3866d213 \ + --hash=sha256:11ff168d752cb41e8492817e10fb4f85828f6a0142b9726a30c27c35a1835f01 \ + --hash=sha256:176df045597e674fa950bf5ae536be85699e04cea68fa3a616cf75e413737eb5 \ + --hash=sha256:219a16763dc0294842188ac8a12262b5671817042b35d45e44fd0a697d8c8361 \ + --hash=sha256:22698f01ff5653fe66d16ffb7658f582a0ac084d7da1323e39fd9eab326a1f26 \ + --hash=sha256:237533179d9747080bcaad4d02083ce295c0d2eab3e9e8ce103411a4312991a0 \ + --hash=sha256:289ba9ae8e88d0ba16062ecf02dd730b34186ea3b1e7489046fc338bdc3361c4 \ + --hash=sha256:2c59e0076ea31c08553e868cec02d22191c086f00b44610f8ab7363a11a5d9d8 \ + --hash=sha256:2c9376e2b09895c8ca8b95362283365eb5c03bdc8428ade80a864160605715f1 \ + --hash=sha256:3135713c5562731ee18f58d3ad1bf41e1d8883eb68b363f2ffde5b2ea4b84cc7 \ + --hash=sha256:3b9c7426923bb7bd66d409da46c41e3fb40f5caf679da624439b9eba92043fa6 \ + --hash=sha256:3c0266cd6f005e99f3f51e583012de2778e65af6b73860038b968a0a8888487a \ + --hash=sha256:41473de252e1797c2d2293804e389a6d6986ef37cbb4a25208de537ae32141dd \ + --hash=sha256:4831df72b053b1eed31eb00a2e1aff6896fb4485301d4ccb208cac264b648db4 \ + --hash=sha256:49f0c1b3c2842556e5de35f122fc0f0b721334ceb6e78c3719693364d4af8499 \ + --hash=sha256:4b4c452d0190c5a820d3f5c0f3cd8a28ace48c54053e24da9d6041bf81113183 \ + --hash=sha256:4ee8caa925aebc1e64e98432d78ea8de67b2272252b0a931d2ac3bd876ad5544 \ + --hash=sha256:500f1c59906cd142d452074f3811614be04819a38ae2b3239a48b82649c08821 \ + --hash=sha256:5216b6082c624b55cfe79af5d538e499cd5f5b976820eac31951fb4325974501 \ + --hash=sha256:54311eb54f3a0c45efb9ed0d0a8f43d1bc6060d773f6973efd90037a51cd0a3f \ + --hash=sha256:54631fb69a6e44b2ba522f7c22a6fb2667a02fd97d636048478db2fd8c4e98fe \ + --hash=sha256:565760d6812b8d78d416c3c7cfdf5362fbe0d0d25b82fed75d0d29e18d7fc30f \ + --hash=sha256:598db66eaf2e04aa0c8900a63b0101fdc5e6b8a7ddd805c56d86efb54eb66672 \ + --hash=sha256:5c4fa235d534b3547184831c624c0b7c1e262cd1de847d95085ec94c16fddcd5 \ + --hash=sha256:69985d50a2b6f709412d944ffb2e97d0be154ea90600b7a921f95a87d6f108a2 \ + --hash=sha256:69da0f3ed3496808e8cbc5123a866c41c12c15baaaead96d256477edf168eb57 \ + --hash=sha256:6c93b7c2e52061f0925c3382d5cb8980e40f91c989563d3d32ca280069fd6a87 \ + --hash=sha256:70907533db712f7aa791effb38efa96f044ce3d4e850e2d7691abd759f4f0ae0 \ + --hash=sha256:81b77f868814346662c96ab36b875d7814ebf82340d3284a31681085c051320f \ + --hash=sha256:82eefaf1a996060602f3cc1112d93ba8b201dbf5d8fd9611227de2003dddb3b7 \ + --hash=sha256:85c3e3c9cb1d480e0b9a64c658cd66b3cfb8e721636ab8b0e746e2d79a7a9eed \ + --hash=sha256:8a22a34bc594d9d24621091d1b91511001a7eea91d6652ea495ce06e27381f70 \ + --hash=sha256:8cef8710fb849d97c533f259103f09bac167a008d7131d7b2b0e3a33269185c0 \ + --hash=sha256:8d44e7bf06b0c0a70a20f9100af9fcfd7f6d9d3913e37754c12d424179b4e48f \ + --hash=sha256:8d7f98fde213f74561be1d6d3fa353656197f75d4edfbb3d94c9eb9b0fc47f5d \ + --hash=sha256:8d8e4450e7fe24d86e86b23cc209e0023177b6d59502e33807b732d2deb6975f \ + --hash=sha256:8fc49a87ac269d4529da45871e2ffb6874e87779c3d0e2ccd813c0899221239d \ + --hash=sha256:90ec72d231169b4b8d6085be13023ece8fa9b1bb495e4398d847e25218e0f431 \ + --hash=sha256:91c742ca59045dce7ba76cab6e223e41d2c70d79e82c284a96411f8645e2afff \ + --hash=sha256:9b05d33ff8e6b269e30a7957bd3244ffbce2a7a35a81b81c382629b80af1a8bf \ + --hash=sha256:9b05d5cbe9dafcdc733262c3a99ccf63d2f7ce02543620d2bd8db4d4f7a22f83 \ + --hash=sha256:9c5857612c9813796960c00767645cb5da815af16dafb32d70c72a8390bbf690 \ + --hash=sha256:a34086c5cc285be878622e0a6ab897a986a6e8bf5b67ecb377015f06ed316587 \ + --hash=sha256:ab221850108a4a063c5b8a70f00dd7a1975e5a1713f87f4ab26a46e5feac5a0e \ + --hash=sha256:b796b44111f0cab6bbf66214186e44734b5baab949cb5fb56154142a92989aeb \ + --hash=sha256:b8c3a67eb87394386847d188996920f33b01b32155f0a94f36ca0e0c635bf3e3 \ + --hash=sha256:bcb6532b9814ea7c5a6a3299747c49de30e84472fa72821b07f5a9818bce0f66 \ + --hash=sha256:bcc0ea8d5b74a41b621ad4a13d96c36079c81628ccc0b30cfb1603e3dfa3a014 \ + --hash=sha256:bea94403a21eb94c93386d559bce297381609153e418a3ffc7d6bf772f59cc35 \ + --hash=sha256:bff7e2811814fa2271be95ab6e84c9436d027a0e59665de60edf44e529a42c1f \ + --hash=sha256:c72444d17777865734aa1a4d167794c34b63e5883abb90356a0364a28904e6c0 \ + --hash=sha256:c7b5d5d64e2a14e35a9240b33b89389e0035e6de8dbb7ffa50d10d8b65c57449 \ + --hash=sha256:c7e939f1ae428a86e4abbb9a7c4732bf4706048818dfd979e5e2839ce0159f23 \ + --hash=sha256:c88a15f272a0ad3d7773cf3a37cc7b7d077cbfc8e331675cf1346e849d97a4e5 \ + --hash=sha256:c9110c06eaaac7e1f5562caf481f18ccf8f6fdf4c3323feab28a93d34cc646bd \ + --hash=sha256:ca7ca5abfbfe8d39e653870fbe8d7710be7a857f8a8386fc9de1aae2e02ce7e4 \ + --hash=sha256:cae4c0c2ca800c793cae07ef3d40794625471040a87e1ba392039639ad61ab5b \ + --hash=sha256:cdefe289681507187e375a5064c7599f52c40343a8701761c802c1853a504558 \ + --hash=sha256:cf2a0ac0615842b849f40c4d7f304986a242f1e68286dbf3bd7a835e4f83acfd \ + --hash=sha256:cfeadf42840c1e870dc2042a232a8748e75a36b52d78968cda6736de55582766 \ + --hash=sha256:d737e69d193dac7296365a6dcb73bbbf53bb760ab25a3727716bbd42022e8d7a \ + --hash=sha256:d7481f581251bb5558ba9f635db70908819caa221fc79ee52a7f58392778c636 \ + --hash=sha256:df9cf74b9bc03d586fc53ba470828d7b77ce51b0582d1d0b5b2fb673c0baa32d \ + --hash=sha256:e1f80197f8b0b846a8d5cf7b7ec6084493950d0882cc5537fb7b96a69e3c8590 \ + --hash=sha256:ecca113f19d5e74048c001934045a2b9368d77b0b17691d905af18bd1c21275e \ + --hash=sha256:ee2527134f95e106cc1653e9ac78846f3a2ec1004cf20ef4e02038035a74544d \ + --hash=sha256:f27fdaadce22f2ef950fc10dcdf8048407c3b42b73779e48a4e76b3c35bca26c \ + --hash=sha256:f694dc8a6a3112059258a725a4ebe9acac5fe62f11c77ac4dcf896edfa78ca28 \ + --hash=sha256:f800164276eec54e0af5c99feb9494c295118fc10a11b997bbb1348ba1a52065 \ + --hash=sha256:ffcd828e37dc219a72c9012ec44ad2e7e3066bec6ff3aaa19e7d435dbf4032ca # via -r requirements.in aiosignal==1.3.1 \ --hash=sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc \ @@ -420,30 +420,30 @@ coverage[toml]==7.3.2 \ --hash=sha256:fa28e909776dc69efb6ed975a63691bc8172b64ff357e663a1bb06ff3c9b589a \ --hash=sha256:fe494faa90ce6381770746077243231e0b83ff3f17069d748f645617cefe19d4 # via pytest-cov -cryptography==41.0.5 \ - --hash=sha256:0c327cac00f082013c7c9fb6c46b7cc9fa3c288ca702c74773968173bda421bf \ - --hash=sha256:0d2a6a598847c46e3e321a7aef8af1436f11c27f1254933746304ff014664d84 \ - --hash=sha256:227ec057cd32a41c6651701abc0328135e472ed450f47c2766f23267b792a88e \ - --hash=sha256:22892cc830d8b2c89ea60148227631bb96a7da0c1b722f2aac8824b1b7c0b6b8 \ - --hash=sha256:392cb88b597247177172e02da6b7a63deeff1937fa6fec3bbf902ebd75d97ec7 \ - --hash=sha256:3be3ca726e1572517d2bef99a818378bbcf7d7799d5372a46c79c29eb8d166c1 \ - --hash=sha256:573eb7128cbca75f9157dcde974781209463ce56b5804983e11a1c462f0f4e88 \ - --hash=sha256:580afc7b7216deeb87a098ef0674d6ee34ab55993140838b14c9b83312b37b86 \ - --hash=sha256:5a70187954ba7292c7876734183e810b728b4f3965fbe571421cb2434d279179 \ - --hash=sha256:73801ac9736741f220e20435f84ecec75ed70eda90f781a148f1bad546963d81 \ - --hash=sha256:7d208c21e47940369accfc9e85f0de7693d9a5d843c2509b3846b2db170dfd20 \ - --hash=sha256:8254962e6ba1f4d2090c44daf50a547cd5f0bf446dc658a8e5f8156cae0d8548 \ - --hash=sha256:88417bff20162f635f24f849ab182b092697922088b477a7abd6664ddd82291d \ - --hash=sha256:a48e74dad1fb349f3dc1d449ed88e0017d792997a7ad2ec9587ed17405667e6d \ - --hash=sha256:b948e09fe5fb18517d99994184854ebd50b57248736fd4c720ad540560174ec5 \ - --hash=sha256:c707f7afd813478e2019ae32a7c49cd932dd60ab2d2a93e796f68236b7e1fbf1 \ - --hash=sha256:d38e6031e113b7421db1de0c1b1f7739564a88f1684c6b89234fbf6c11b75147 \ - --hash=sha256:d3977f0e276f6f5bf245c403156673db103283266601405376f075c849a0b936 \ - --hash=sha256:da6a0ff8f1016ccc7477e6339e1d50ce5f59b88905585f77193ebd5068f1e797 \ - --hash=sha256:e270c04f4d9b5671ebcc792b3ba5d4488bf7c42c3c241a3748e2599776f29696 \ - --hash=sha256:e886098619d3815e0ad5790c973afeee2c0e6e04b4da90b88e6bd06e2a0b1b72 \ - --hash=sha256:ec3b055ff8f1dce8e6ef28f626e0972981475173d7973d63f271b29c8a2897da \ - --hash=sha256:fba1e91467c65fe64a82c689dc6cf58151158993b13eb7a7f3f4b7f395636723 +cryptography==41.0.7 \ + --hash=sha256:079b85658ea2f59c4f43b70f8119a52414cdb7be34da5d019a77bf96d473b960 \ + --hash=sha256:09616eeaef406f99046553b8a40fbf8b1e70795a91885ba4c96a70793de5504a \ + --hash=sha256:13f93ce9bea8016c253b34afc6bd6a75993e5c40672ed5405a9c832f0d4a00bc \ + --hash=sha256:37a138589b12069efb424220bf78eac59ca68b95696fc622b6ccc1c0a197204a \ + --hash=sha256:3c78451b78313fa81607fa1b3f1ae0a5ddd8014c38a02d9db0616133987b9cdf \ + --hash=sha256:43f2552a2378b44869fe8827aa19e69512e3245a219104438692385b0ee119d1 \ + --hash=sha256:48a0476626da912a44cc078f9893f292f0b3e4c739caf289268168d8f4702a39 \ + --hash=sha256:49f0805fc0b2ac8d4882dd52f4a3b935b210935d500b6b805f321addc8177406 \ + --hash=sha256:5429ec739a29df2e29e15d082f1d9ad683701f0ec7709ca479b3ff2708dae65a \ + --hash=sha256:5a1b41bc97f1ad230a41657d9155113c7521953869ae57ac39ac7f1bb471469a \ + --hash=sha256:68a2dec79deebc5d26d617bfdf6e8aab065a4f34934b22d3b5010df3ba36612c \ + --hash=sha256:7a698cb1dac82c35fcf8fe3417a3aaba97de16a01ac914b89a0889d364d2f6be \ + --hash=sha256:841df4caa01008bad253bce2a6f7b47f86dc9f08df4b433c404def869f590a15 \ + --hash=sha256:90452ba79b8788fa380dfb587cca692976ef4e757b194b093d845e8d99f612f2 \ + --hash=sha256:928258ba5d6f8ae644e764d0f996d61a8777559f72dfeb2eea7e2fe0ad6e782d \ + --hash=sha256:af03b32695b24d85a75d40e1ba39ffe7db7ffcb099fe507b39fd41a565f1b157 \ + --hash=sha256:b640981bf64a3e978a56167594a0e97db71c89a479da8e175d8bb5be5178c003 \ + --hash=sha256:c5ca78485a255e03c32b513f8c2bc39fedb7f5c5f8535545bdc223a03b24f248 \ + --hash=sha256:c7f3201ec47d5207841402594f1d7950879ef890c0c495052fa62f58283fde1a \ + --hash=sha256:d5ec85080cce7b0513cfd233914eb8b7bbd0633f1d1703aa28d1dd5a72f678ec \ + --hash=sha256:d6c391c021ab1f7a82da5d8d0b3cee2f4b2c455ec86c8aebbc84837a631ff309 \ + --hash=sha256:e3114da6d7f95d2dee7d3f4eec16dacff819740bbab931aff8648cb13c5ff5e7 \ + --hash=sha256:f983596065a18a2183e7f79ab3fd4c475205b839e02cbc0efbbf9666c4b3083d # via # jwcrypto # pki-tools @@ -592,15 +592,15 @@ httptools==0.6.1 \ --hash=sha256:e57997ac7fb7ee43140cc03664de5f268813a481dff6245e0075925adc6aa185 \ --hash=sha256:fe467eb086d80217b7584e61313ebadc8d187a4d95bb62031b7bab4b205c3ba3 # via uvicorn -httpx==0.25.1 \ - --hash=sha256:fec7d6cc5c27c578a391f7e87b9aa7d3d8fbcd034f6399f9f79b45bcc12a866a \ - --hash=sha256:ffd96d5cf901e63863d9f1b4b6807861dbea4d301613415d9e6e57ead15fc5d0 +httpx==0.25.2 \ + --hash=sha256:8b8fcaa0c8ea7b05edd69a094e63a2094c4efcb48129fb757361bc423c0ad9e8 \ + --hash=sha256:a05d3d052d9b2dfce0e3896636467f8a5342fb2b902c819428e1ac65413ca118 # via # -r test_requirements.in # pki-tools -idna==3.4 \ - --hash=sha256:814f528e8dead7d329833b91c5faa87d60bf71824cd12a7530b5526063d02cb4 \ - --hash=sha256:90b77e79eaa3eba6de819a0c442c0b4ceefc341a7a2ab77d7562bf49f425c5c2 +idna==3.6 \ + --hash=sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca \ + --hash=sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f # via # anyio # httpx @@ -775,34 +775,34 @@ multidict==6.0.4 \ # via # aiohttp # yarl -mypy==1.7.0 \ - --hash=sha256:0e81ffd120ee24959b449b647c4b2fbfcf8acf3465e082b8d58fd6c4c2b27e46 \ - --hash=sha256:185cff9b9a7fec1f9f7d8352dff8a4c713b2e3eea9c6c4b5ff7f0edf46b91e41 \ - --hash=sha256:1e280b5697202efa698372d2f39e9a6713a0395a756b1c6bd48995f8d72690dc \ - --hash=sha256:1fe46e96ae319df21359c8db77e1aecac8e5949da4773c0274c0ef3d8d1268a9 \ - --hash=sha256:2b53655a295c1ed1af9e96b462a736bf083adba7b314ae775563e3fb4e6795f5 \ - --hash=sha256:551d4a0cdcbd1d2cccdcc7cb516bb4ae888794929f5b040bb51aae1846062901 \ - --hash=sha256:55d28d7963bef00c330cb6461db80b0b72afe2f3c4e2963c99517cf06454e665 \ - --hash=sha256:5da84d7bf257fd8f66b4f759a904fd2c5a765f70d8b52dde62b521972a0a2357 \ - --hash=sha256:6cb8d5f6d0fcd9e708bb190b224089e45902cacef6f6915481806b0c77f7786d \ - --hash=sha256:7a7b1e399c47b18feb6f8ad4a3eef3813e28c1e871ea7d4ea5d444b2ac03c418 \ - --hash=sha256:870bd1ffc8a5862e593185a4c169804f2744112b4a7c55b93eb50f48e7a77010 \ - --hash=sha256:87c076c174e2c7ef8ab416c4e252d94c08cd4980a10967754f91571070bf5fbe \ - --hash=sha256:96650d9a4c651bc2a4991cf46f100973f656d69edc7faf91844e87fe627f7e96 \ - --hash=sha256:a3637c03f4025f6405737570d6cbfa4f1400eb3c649317634d273687a09ffc2f \ - --hash=sha256:a79cdc12a02eb526d808a32a934c6fe6df07b05f3573d210e41808020aed8b5d \ - --hash=sha256:b633f188fc5ae1b6edca39dae566974d7ef4e9aaaae00bc36efe1f855e5173ac \ - --hash=sha256:bf7a2f0a6907f231d5e41adba1a82d7d88cf1f61a70335889412dec99feeb0f8 \ - --hash=sha256:c1b06b4b109e342f7dccc9efda965fc3970a604db70f8560ddfdee7ef19afb05 \ - --hash=sha256:cddee95dea7990e2215576fae95f6b78a8c12f4c089d7e4367564704e99118d3 \ - --hash=sha256:d01921dbd691c4061a3e2ecdbfbfad029410c5c2b1ee88946bf45c62c6c91210 \ - --hash=sha256:d0fa29919d2e720c8dbaf07d5578f93d7b313c3e9954c8ec05b6d83da592e5d9 \ - --hash=sha256:d6ed9a3997b90c6f891138e3f83fb8f475c74db4ccaa942a1c7bf99e83a989a1 \ - --hash=sha256:d93e76c2256aa50d9c82a88e2f569232e9862c9982095f6d54e13509f01222fc \ - --hash=sha256:df67fbeb666ee8828f675fee724cc2cbd2e4828cc3df56703e02fe6a421b7401 \ - --hash=sha256:f29386804c3577c83d76520abf18cfcd7d68264c7e431c5907d250ab502658ee \ - --hash=sha256:f65f385a6f43211effe8c682e8ec3f55d79391f70a201575def73d08db68ead1 \ - --hash=sha256:fc9fe455ad58a20ec68599139ed1113b21f977b536a91b42bef3ffed5cce7391 +mypy==1.7.1 \ + --hash=sha256:12cce78e329838d70a204293e7b29af9faa3ab14899aec397798a4b41be7f340 \ + --hash=sha256:1484b8fa2c10adf4474f016e09d7a159602f3239075c7bf9f1627f5acf40ad49 \ + --hash=sha256:204e0d6de5fd2317394a4eff62065614c4892d5a4d1a7ee55b765d7a3d9e3f82 \ + --hash=sha256:2643d145af5292ee956aa0a83c2ce1038a3bdb26e033dadeb2f7066fb0c9abce \ + --hash=sha256:2c6e4464ed5f01dc44dc9821caf67b60a4e5c3b04278286a85c067010653a0eb \ + --hash=sha256:2f7f6985d05a4e3ce8255396df363046c28bea790e40617654e91ed580ca7c51 \ + --hash=sha256:31902408f4bf54108bbfb2e35369877c01c95adc6192958684473658c322c8a5 \ + --hash=sha256:40716d1f821b89838589e5b3106ebbc23636ffdef5abc31f7cd0266db936067e \ + --hash=sha256:4b901927f16224d0d143b925ce9a4e6b3a758010673eeded9b748f250cf4e8f7 \ + --hash=sha256:4fc3d14ee80cd22367caaaf6e014494415bf440980a3045bf5045b525680ac33 \ + --hash=sha256:5cf3f0c5ac72139797953bd50bc6c95ac13075e62dbfcc923571180bebb662e9 \ + --hash=sha256:6dbdec441c60699288adf051f51a5d512b0d818526d1dcfff5a41f8cd8b4aaf1 \ + --hash=sha256:72cf32ce7dd3562373f78bd751f73c96cfb441de147cc2448a92c1a308bd0ca6 \ + --hash=sha256:75aa828610b67462ffe3057d4d8a4112105ed211596b750b53cbfe182f44777a \ + --hash=sha256:75c4d2a6effd015786c87774e04331b6da863fc3fc4e8adfc3b40aa55ab516fe \ + --hash=sha256:78e25b2fd6cbb55ddfb8058417df193f0129cad5f4ee75d1502248e588d9e0d7 \ + --hash=sha256:84860e06ba363d9c0eeabd45ac0fde4b903ad7aa4f93cd8b648385a888e23200 \ + --hash=sha256:8c5091ebd294f7628eb25ea554852a52058ac81472c921150e3a61cdd68f75a7 \ + --hash=sha256:944bdc21ebd620eafefc090cdf83158393ec2b1391578359776c00de00e8907a \ + --hash=sha256:9c7ac372232c928fff0645d85f273a726970c014749b924ce5710d7d89763a28 \ + --hash=sha256:d9b338c19fa2412f76e17525c1b4f2c687a55b156320acb588df79f2e6fa9fea \ + --hash=sha256:ee5d62d28b854eb61889cde4e1dbc10fbaa5560cb39780c3995f6737f7e82120 \ + --hash=sha256:f2c2521a8e4d6d769e3234350ba7b65ff5d527137cdcde13ff4d99114b0c8e7d \ + --hash=sha256:f6efc9bd72258f89a3816e3a98c09d36f079c223aa345c659622f056b760ab42 \ + --hash=sha256:f7c5d642db47376a0cc130f0de6d055056e010debdaf0707cd2b0fc7e7ef30ea \ + --hash=sha256:fcb6d9afb1b6208b4c712af0dafdc650f518836065df0d4fb1d800f5d6773db2 \ + --hash=sha256:fcd2572dd4519e8a6642b733cd3a8cfc1ef94bafd0c1ceed9c94fe736cb65b6a # via -r test_requirements.in mypy-extensions==1.0.0 \ --hash=sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d \ @@ -879,120 +879,120 @@ pycparser==2.21 \ --hash=sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9 \ --hash=sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206 # via cffi -pydantic==2.5.1 \ - --hash=sha256:0b8be5413c06aadfbe56f6dc1d45c9ed25fd43264414c571135c97dd77c2bedb \ - --hash=sha256:dc5244a8939e0d9a68f1f1b5f550b2e1c879912033b1becbedb315accc75441b +pydantic==2.5.2 \ + --hash=sha256:80c50fb8e3dcecfddae1adbcc00ec5822918490c99ab31f6cf6140ca1c1429f0 \ + --hash=sha256:ff177ba64c6faf73d7afa2e8cad38fd456c0dbe01c9954e71038001cd15a6edd # via # fastapi # pki-tools # pydantic-settings # pysaml2 -pydantic-core==2.14.3 \ - --hash=sha256:056ea7cc3c92a7d2a14b5bc9c9fa14efa794d9f05b9794206d089d06d3433dc7 \ - --hash=sha256:0653fb9fc2fa6787f2fa08631314ab7fc8070307bd344bf9471d1b7207c24623 \ - --hash=sha256:076edc972b68a66870cec41a4efdd72a6b655c4098a232314b02d2bfa3bfa157 \ - --hash=sha256:0a3e51c2be472b7867eb0c5d025b91400c2b73a0823b89d4303a9097e2ec6655 \ - --hash=sha256:0c7f8e8a7cf8e81ca7d44bea4f181783630959d41b4b51d2f74bc50f348a090f \ - --hash=sha256:10904368261e4509c091cbcc067e5a88b070ed9a10f7ad78f3029c175487490f \ - --hash=sha256:113752a55a8eaece2e4ac96bc8817f134c2c23477e477d085ba89e3aa0f4dc44 \ - --hash=sha256:12e05a76b223577a4696c76d7a6b36a0ccc491ffb3c6a8cf92d8001d93ddfd63 \ - --hash=sha256:136bc7247e97a921a020abbd6ef3169af97569869cd6eff41b6a15a73c44ea9b \ - --hash=sha256:1582f01eaf0537a696c846bea92082082b6bfc1103a88e777e983ea9fbdc2a0f \ - --hash=sha256:1767bd3f6370458e60c1d3d7b1d9c2751cc1ad743434e8ec84625a610c8b9195 \ - --hash=sha256:1e2979dc80246e18e348de51246d4c9b410186ffa3c50e77924bec436b1e36cb \ - --hash=sha256:1ea992659c03c3ea811d55fc0a997bec9dde863a617cc7b25cfde69ef32e55af \ - --hash=sha256:1f2d4516c32255782153e858f9a900ca6deadfb217fd3fb21bb2b60b4e04d04d \ - --hash=sha256:2494d20e4c22beac30150b4be3b8339bf2a02ab5580fa6553ca274bc08681a65 \ - --hash=sha256:260692420028319e201b8649b13ac0988974eeafaaef95d0dfbf7120c38dc000 \ - --hash=sha256:2646f8270f932d79ba61102a15ea19a50ae0d43b314e22b3f8f4b5fabbfa6e38 \ - --hash=sha256:27828f0227b54804aac6fb077b6bb48e640b5435fdd7fbf0c274093a7b78b69c \ - --hash=sha256:2bc736725f9bd18a60eec0ed6ef9b06b9785454c8d0105f2be16e4d6274e63d0 \ - --hash=sha256:2c08ac60c3caa31f825b5dbac47e4875bd4954d8f559650ad9e0b225eaf8ed0c \ - --hash=sha256:2c83892c7bf92b91d30faca53bb8ea21f9d7e39f0ae4008ef2c2f91116d0464a \ - --hash=sha256:354db020b1f8f11207b35360b92d95725621eb92656725c849a61e4b550f4acc \ - --hash=sha256:364dba61494e48f01ef50ae430e392f67ee1ee27e048daeda0e9d21c3ab2d609 \ - --hash=sha256:37dad73a2f82975ed563d6a277fd9b50e5d9c79910c4aec787e2d63547202315 \ - --hash=sha256:38113856c7fad8c19be7ddd57df0c3e77b1b2336459cb03ee3903ce9d5e236ce \ - --hash=sha256:38aed5a1bbc3025859f56d6a32f6e53ca173283cb95348e03480f333b1091e7d \ - --hash=sha256:3ad083df8fe342d4d8d00cc1d3c1a23f0dc84fce416eb301e69f1ddbbe124d3f \ - --hash=sha256:3c1bf1a7b05a65d3b37a9adea98e195e0081be6b17ca03a86f92aeb8b110f468 \ - --hash=sha256:3d1dde10bd9962b1434053239b1d5490fc31a2b02d8950a5f731bc584c7a5a0f \ - --hash=sha256:44aaf1a07ad0824e407dafc637a852e9a44d94664293bbe7d8ee549c356c8882 \ - --hash=sha256:44afa3c18d45053fe8d8228950ee4c8eaf3b5a7f3b64963fdeac19b8342c987f \ - --hash=sha256:4a70d23eedd88a6484aa79a732a90e36701048a1509078d1b59578ef0ea2cdf5 \ - --hash=sha256:4aa89919fbd8a553cd7d03bf23d5bc5deee622e1b5db572121287f0e64979476 \ - --hash=sha256:4cc6bb11f4e8e5ed91d78b9880774fbc0856cb226151b0a93b549c2b26a00c19 \ - --hash=sha256:536e1f58419e1ec35f6d1310c88496f0d60e4f182cacb773d38076f66a60b149 \ - --hash=sha256:5402ee0f61e7798ea93a01b0489520f2abfd9b57b76b82c93714c4318c66ca06 \ - --hash=sha256:56814b41486e2d712a8bc02a7b1f17b87fa30999d2323bbd13cf0e52296813a1 \ - --hash=sha256:5b73441a1159f1fb37353aaefb9e801ab35a07dd93cb8177504b25a317f4215a \ - --hash=sha256:61beaa79d392d44dc19d6f11ccd824d3cccb865c4372157c40b92533f8d76dd0 \ - --hash=sha256:6c2d118d1b6c9e2d577e215567eedbe11804c3aafa76d39ec1f8bc74e918fd07 \ - --hash=sha256:6e2f9d76c00e805d47f19c7a96a14e4135238a7551a18bfd89bb757993fd0933 \ - --hash=sha256:71ed769b58d44e0bc2701aa59eb199b6665c16e8a5b8b4a84db01f71580ec448 \ - --hash=sha256:7349f99f1ef8b940b309179733f2cad2e6037a29560f1b03fdc6aa6be0a8d03c \ - --hash=sha256:75f3f534f33651b73f4d3a16d0254de096f43737d51e981478d580f4b006b427 \ - --hash=sha256:76fc18653a5c95e5301a52d1b5afb27c9adc77175bf00f73e94f501caf0e05ad \ - --hash=sha256:7cb0c397f29688a5bd2c0dbd44451bc44ebb9b22babc90f97db5ec3e5bb69977 \ - --hash=sha256:7cc24728a1a9cef497697e53b3d085fb4d3bc0ef1ef4d9b424d9cf808f52c146 \ - --hash=sha256:7e63a56eb7fdee1587d62f753ccd6d5fa24fbeea57a40d9d8beaef679a24bdd6 \ - --hash=sha256:832d16f248ca0cc96929139734ec32d21c67669dcf8a9f3f733c85054429c012 \ - --hash=sha256:8488e973547e8fb1b4193fd9faf5236cf1b7cd5e9e6dc7ff6b4d9afdc4c720cb \ - --hash=sha256:849cff945284c577c5f621d2df76ca7b60f803cc8663ff01b778ad0af0e39bb9 \ - --hash=sha256:88ec906eb2d92420f5b074f59cf9e50b3bb44f3cb70e6512099fdd4d88c2f87c \ - --hash=sha256:8d3b9c91eeb372a64ec6686c1402afd40cc20f61a0866850f7d989b6bf39a41a \ - --hash=sha256:8f5624f0f67f2b9ecaa812e1dfd2e35b256487566585160c6c19268bf2ffeccc \ - --hash=sha256:905a12bf088d6fa20e094f9a477bf84bd823651d8b8384f59bcd50eaa92e6a52 \ - --hash=sha256:92486a04d54987054f8b4405a9af9d482e5100d6fe6374fc3303015983fc8bda \ - --hash=sha256:96eb10ef8920990e703da348bb25fedb8b8653b5966e4e078e5be382b430f9e0 \ - --hash=sha256:96fb679c7ca12a512d36d01c174a4fbfd912b5535cc722eb2c010c7b44eceb8e \ - --hash=sha256:98d8b3932f1a369364606417ded5412c4ffb15bedbcf797c31317e55bd5d920e \ - --hash=sha256:9dbab442a8d9ca918b4ed99db8d89d11b1f067a7dadb642476ad0889560dac79 \ - --hash=sha256:9ef3e2e407e4cad2df3c89488a761ed1f1c33f3b826a2ea9a411b0a7d1cccf1b \ - --hash=sha256:9ff737f24b34ed26de62d481ef522f233d3c5927279f6b7229de9b0deb3f76b5 \ - --hash=sha256:a1a39fecb5f0b19faee9a8a8176c805ed78ce45d760259a4ff3d21a7daa4dfc1 \ - --hash=sha256:a402ae1066be594701ac45661278dc4a466fb684258d1a2c434de54971b006ca \ - --hash=sha256:a5c51460ede609fbb4fa883a8fe16e749964ddb459966d0518991ec02eb8dfb9 \ - --hash=sha256:a8ca13480ce16daad0504be6ce893b0ee8ec34cd43b993b754198a89e2787f7e \ - --hash=sha256:ab4a2381005769a4af2ffddae74d769e8a4aae42e970596208ec6d615c6fb080 \ - --hash=sha256:aeafc7f5bbddc46213707266cadc94439bfa87ecf699444de8be044d6d6eb26f \ - --hash=sha256:aecd5ed096b0e5d93fb0367fd8f417cef38ea30b786f2501f6c34eabd9062c38 \ - --hash=sha256:af452e69446fadf247f18ac5d153b1f7e61ef708f23ce85d8c52833748c58075 \ - --hash=sha256:af46f0b7a1342b49f208fed31f5a83b8495bb14b652f621e0a6787d2f10f24ee \ - --hash=sha256:b02b5e1f54c3396c48b665050464803c23c685716eb5d82a1d81bf81b5230da4 \ - --hash=sha256:b28996872b48baf829ee75fa06998b607c66a4847ac838e6fd7473a6b2ab68e7 \ - --hash=sha256:b7692f539a26265cece1e27e366df5b976a6db6b1f825a9e0466395b314ee48b \ - --hash=sha256:ba44fad1d114539d6a1509966b20b74d2dec9a5b0ee12dd7fd0a1bb7b8785e5f \ - --hash=sha256:bf15145b1f8056d12c67255cd3ce5d317cd4450d5ee747760d8d088d85d12a2d \ - --hash=sha256:c3dc2920cc96f9aa40c6dc54256e436cc95c0a15562eb7bd579e1811593c377e \ - --hash=sha256:c54af5069da58ea643ad34ff32fd6bc4eebb8ae0fef9821cd8919063e0aeeaab \ - --hash=sha256:c5ea0153482e5b4d601c25465771c7267c99fddf5d3f3bdc238ef930e6d051cf \ - --hash=sha256:c9ffd823c46e05ef3eb28b821aa7bc501efa95ba8880b4a1380068e32c5bed47 \ - --hash=sha256:ca55c9671bb637ce13d18ef352fd32ae7aba21b4402f300a63f1fb1fd18e0364 \ - --hash=sha256:caa94726791e316f0f63049ee00dff3b34a629b0d099f3b594770f7d0d8f1f56 \ - --hash=sha256:cc956f78651778ec1ab105196e90e0e5f5275884793ab67c60938c75bcca3989 \ - --hash=sha256:ccbf355b7276593c68fa824030e68cb29f630c50e20cb11ebb0ee450ae6b3d08 \ - --hash=sha256:cf08b43d1d5d1678f295f0431a4a7e1707d4652576e1d0f8914b5e0213bfeee5 \ - --hash=sha256:d06c78074646111fb01836585f1198367b17d57c9f427e07aaa9ff499003e58d \ - --hash=sha256:d2b53e1f851a2b406bbb5ac58e16c4a5496038eddd856cc900278fa0da97f3fc \ - --hash=sha256:d41df8e10b094640a6b234851b624b76a41552f637b9fb34dc720b9fe4ef3be4 \ - --hash=sha256:d7abd17a838a52140e3aeca271054e321226f52df7e0a9f0da8f91ea123afe98 \ - --hash=sha256:de52ddfa6e10e892d00f747bf7135d7007302ad82e243cf16d89dd77b03b649d \ - --hash=sha256:df33902464410a1f1a0411a235f0a34e7e129f12cb6340daca0f9d1390f5fe10 \ - --hash=sha256:e16aaf788f1de5a85c8f8fcc9c1ca1dd7dd52b8ad30a7889ca31c7c7606615b8 \ - --hash=sha256:e3ad4968711fb379a67c8c755beb4dae8b721a83737737b7bcee27c05400b047 \ - --hash=sha256:e483b8b913fcd3b48badec54185c150cb7ab0e6487914b84dc7cde2365e0c892 \ - --hash=sha256:e71f666c3bf019f2490a47dddb44c3ccea2e69ac882f7495c68dc14d4065eac2 \ - --hash=sha256:ea1498ce4491236d1cffa0eee9ad0968b6ecb0c1cd711699c5677fc689905f00 \ - --hash=sha256:eaab9dc009e22726c62fe3b850b797e7f0e7ba76d245284d1064081f512c7226 \ - --hash=sha256:ec79dbe23702795944d2ae4c6925e35a075b88acd0d20acde7c77a817ebbce94 \ - --hash=sha256:f1b92e72babfd56585c75caf44f0b15258c58e6be23bc33f90885cebffde3400 \ - --hash=sha256:f1f46700402312bdc31912f6fc17f5ecaaaa3bafe5487c48f07c800052736289 \ - --hash=sha256:f518eac285c9632be337323eef9824a856f2680f943a9b68ac41d5f5bad7df7c \ - --hash=sha256:f86f20a9d5bee1a6ede0f2757b917bac6908cde0f5ad9fcb3606db1e2968bcf5 \ - --hash=sha256:f8fc652c354d3362e2932a79d5ac4bbd7170757a41a62c4fe0f057d29f10bebb \ - --hash=sha256:fe272a72c7ed29f84c42fedd2d06c2f9858dc0c00dae3b34ba15d6d8ae0fbaaf \ - --hash=sha256:fe863491664c6720d65ae438d4efaa5eca766565a53adb53bf14bc3246c72fe0 +pydantic-core==2.14.5 \ + --hash=sha256:038c9f763e650712b899f983076ce783175397c848da04985658e7628cbe873b \ + --hash=sha256:074f3d86f081ce61414d2dc44901f4f83617329c6f3ab49d2bc6c96948b2c26b \ + --hash=sha256:079206491c435b60778cf2b0ee5fd645e61ffd6e70c47806c9ed51fc75af078d \ + --hash=sha256:09b0e985fbaf13e6b06a56d21694d12ebca6ce5414b9211edf6f17738d82b0f8 \ + --hash=sha256:0f6116a558fd06d1b7c2902d1c4cf64a5bd49d67c3540e61eccca93f41418124 \ + --hash=sha256:103ef8d5b58596a731b690112819501ba1db7a36f4ee99f7892c40da02c3e189 \ + --hash=sha256:16e29bad40bcf97aac682a58861249ca9dcc57c3f6be22f506501833ddb8939c \ + --hash=sha256:206ed23aecd67c71daf5c02c3cd19c0501b01ef3cbf7782db9e4e051426b3d0d \ + --hash=sha256:2248485b0322c75aee7565d95ad0e16f1c67403a470d02f94da7344184be770f \ + --hash=sha256:27548e16c79702f1e03f5628589c6057c9ae17c95b4c449de3c66b589ead0520 \ + --hash=sha256:2d0ae0d8670164e10accbeb31d5ad45adb71292032d0fdb9079912907f0085f4 \ + --hash=sha256:3128e0bbc8c091ec4375a1828d6118bc20404883169ac95ffa8d983b293611e6 \ + --hash=sha256:3387277f1bf659caf1724e1afe8ee7dbc9952a82d90f858ebb931880216ea955 \ + --hash=sha256:34708cc82c330e303f4ce87758828ef6e457681b58ce0e921b6e97937dd1e2a3 \ + --hash=sha256:35613015f0ba7e14c29ac6c2483a657ec740e5ac5758d993fdd5870b07a61d8b \ + --hash=sha256:3ad873900297bb36e4b6b3f7029d88ff9829ecdc15d5cf20161775ce12306f8a \ + --hash=sha256:40180930807ce806aa71eda5a5a5447abb6b6a3c0b4b3b1b1962651906484d68 \ + --hash=sha256:439c9afe34638ace43a49bf72d201e0ffc1a800295bed8420c2a9ca8d5e3dbb3 \ + --hash=sha256:45e95333b8418ded64745f14574aa9bfc212cb4fbeed7a687b0c6e53b5e188cd \ + --hash=sha256:4641e8ad4efb697f38a9b64ca0523b557c7931c5f84e0fd377a9a3b05121f0de \ + --hash=sha256:49b08aae5013640a3bfa25a8eebbd95638ec3f4b2eaf6ed82cf0c7047133f03b \ + --hash=sha256:4bc536201426451f06f044dfbf341c09f540b4ebdb9fd8d2c6164d733de5e634 \ + --hash=sha256:4ce601907e99ea5b4adb807ded3570ea62186b17f88e271569144e8cca4409c7 \ + --hash=sha256:4e40f2bd0d57dac3feb3a3aed50f17d83436c9e6b09b16af271b6230a2915459 \ + --hash=sha256:4e47a76848f92529879ecfc417ff88a2806438f57be4a6a8bf2961e8f9ca9ec7 \ + --hash=sha256:513b07e99c0a267b1d954243845d8a833758a6726a3b5d8948306e3fe14675e3 \ + --hash=sha256:531f4b4252fac6ca476fbe0e6f60f16f5b65d3e6b583bc4d87645e4e5ddde331 \ + --hash=sha256:57d52fa717ff445cb0a5ab5237db502e6be50809b43a596fb569630c665abddf \ + --hash=sha256:59986de5710ad9613ff61dd9b02bdd2f615f1a7052304b79cc8fa2eb4e336d2d \ + --hash=sha256:5baab5455c7a538ac7e8bf1feec4278a66436197592a9bed538160a2e7d11e36 \ + --hash=sha256:5c7d5b5005f177764e96bd584d7bf28d6e26e96f2a541fdddb934c486e36fd59 \ + --hash=sha256:60b7607753ba62cf0739177913b858140f11b8af72f22860c28eabb2f0a61937 \ + --hash=sha256:615a0a4bff11c45eb3c1996ceed5bdaa2f7b432425253a7c2eed33bb86d80abc \ + --hash=sha256:61ea96a78378e3bd5a0be99b0e5ed00057b71f66115f5404d0dae4819f495093 \ + --hash=sha256:652c1988019752138b974c28f43751528116bcceadad85f33a258869e641d753 \ + --hash=sha256:6637560562134b0e17de333d18e69e312e0458ee4455bdad12c37100b7cad706 \ + --hash=sha256:678265f7b14e138d9a541ddabbe033012a2953315739f8cfa6d754cc8063e8ca \ + --hash=sha256:699156034181e2ce106c89ddb4b6504c30db8caa86e0c30de47b3e0654543260 \ + --hash=sha256:6b9ff467ffbab9110e80e8c8de3bcfce8e8b0fd5661ac44a09ae5901668ba997 \ + --hash=sha256:6c327e9cd849b564b234da821236e6bcbe4f359a42ee05050dc79d8ed2a91588 \ + --hash=sha256:6d30226dfc816dd0fdf120cae611dd2215117e4f9b124af8c60ab9093b6e8e71 \ + --hash=sha256:6e227c40c02fd873c2a73a98c1280c10315cbebe26734c196ef4514776120aeb \ + --hash=sha256:6e4d090e73e0725b2904fdbdd8d73b8802ddd691ef9254577b708d413bf3006e \ + --hash=sha256:70f4b4851dbb500129681d04cc955be2a90b2248d69273a787dda120d5cf1f69 \ + --hash=sha256:70f947628e074bb2526ba1b151cee10e4c3b9670af4dbb4d73bc8a89445916b5 \ + --hash=sha256:774de879d212db5ce02dfbf5b0da9a0ea386aeba12b0b95674a4ce0593df3d07 \ + --hash=sha256:77fa384d8e118b3077cccfcaf91bf83c31fe4dc850b5e6ee3dc14dc3d61bdba1 \ + --hash=sha256:79e0a2cdbdc7af3f4aee3210b1172ab53d7ddb6a2d8c24119b5706e622b346d0 \ + --hash=sha256:7e88f5696153dc516ba6e79f82cc4747e87027205f0e02390c21f7cb3bd8abfd \ + --hash=sha256:7f8210297b04e53bc3da35db08b7302a6a1f4889c79173af69b72ec9754796b8 \ + --hash=sha256:81982d78a45d1e5396819bbb4ece1fadfe5f079335dd28c4ab3427cd95389944 \ + --hash=sha256:823fcc638f67035137a5cd3f1584a4542d35a951c3cc68c6ead1df7dac825c26 \ + --hash=sha256:853a2295c00f1d4429db4c0fb9475958543ee80cfd310814b5c0ef502de24dda \ + --hash=sha256:88e74ab0cdd84ad0614e2750f903bb0d610cc8af2cc17f72c28163acfcf372a4 \ + --hash=sha256:8aa1768c151cf562a9992462239dfc356b3d1037cc5a3ac829bb7f3bda7cc1f9 \ + --hash=sha256:8c8a8812fe6f43a3a5b054af6ac2d7b8605c7bcab2804a8a7d68b53f3cd86e00 \ + --hash=sha256:95b15e855ae44f0c6341ceb74df61b606e11f1087e87dcb7482377374aac6abe \ + --hash=sha256:96581cfefa9123accc465a5fd0cc833ac4d75d55cc30b633b402e00e7ced00a6 \ + --hash=sha256:9bd18fee0923ca10f9a3ff67d4851c9d3e22b7bc63d1eddc12f439f436f2aada \ + --hash=sha256:a33324437018bf6ba1bb0f921788788641439e0ed654b233285b9c69704c27b4 \ + --hash=sha256:a6a16f4a527aae4f49c875da3cdc9508ac7eef26e7977952608610104244e1b7 \ + --hash=sha256:a717aef6971208f0851a2420b075338e33083111d92041157bbe0e2713b37325 \ + --hash=sha256:a71891847f0a73b1b9eb86d089baee301477abef45f7eaf303495cd1473613e4 \ + --hash=sha256:aae7ea3a1c5bb40c93cad361b3e869b180ac174656120c42b9fadebf685d121b \ + --hash=sha256:ab1cdb0f14dc161ebc268c09db04d2c9e6f70027f3b42446fa11c153521c0e88 \ + --hash=sha256:ab4ea451082e684198636565224bbb179575efc1658c48281b2c866bfd4ddf04 \ + --hash=sha256:abf058be9517dc877227ec3223f0300034bd0e9f53aebd63cf4456c8cb1e0863 \ + --hash=sha256:af36f36538418f3806048f3b242a1777e2540ff9efaa667c27da63d2749dbce0 \ + --hash=sha256:b53e9ad053cd064f7e473a5f29b37fc4cc9dc6d35f341e6afc0155ea257fc911 \ + --hash=sha256:b7851992faf25eac90bfcb7bfd19e1f5ffa00afd57daec8a0042e63c74a4551b \ + --hash=sha256:b9b759b77f5337b4ea024f03abc6464c9f35d9718de01cfe6bae9f2e139c397e \ + --hash=sha256:ba39688799094c75ea8a16a6b544eb57b5b0f3328697084f3f2790892510d144 \ + --hash=sha256:ba6b6b3846cfc10fdb4c971980a954e49d447cd215ed5a77ec8190bc93dd7bc5 \ + --hash=sha256:bb4c2eda937a5e74c38a41b33d8c77220380a388d689bcdb9b187cf6224c9720 \ + --hash=sha256:c0b97ec434041827935044bbbe52b03d6018c2897349670ff8fe11ed24d1d4ab \ + --hash=sha256:c1452a1acdf914d194159439eb21e56b89aa903f2e1c65c60b9d874f9b950e5d \ + --hash=sha256:c2027d05c8aebe61d898d4cffd774840a9cb82ed356ba47a90d99ad768f39789 \ + --hash=sha256:c2adbe22ab4babbca99c75c5d07aaf74f43c3195384ec07ccbd2f9e3bddaecec \ + --hash=sha256:c2d97e906b4ff36eb464d52a3bc7d720bd6261f64bc4bcdbcd2c557c02081ed2 \ + --hash=sha256:c339dabd8ee15f8259ee0f202679b6324926e5bc9e9a40bf981ce77c038553db \ + --hash=sha256:c6eae413494a1c3f89055da7a5515f32e05ebc1a234c27674a6956755fb2236f \ + --hash=sha256:c949f04ecad823f81b1ba94e7d189d9dfb81edbb94ed3f8acfce41e682e48cef \ + --hash=sha256:c97bee68898f3f4344eb02fec316db93d9700fb1e6a5b760ffa20d71d9a46ce3 \ + --hash=sha256:ca61d858e4107ce5e1330a74724fe757fc7135190eb5ce5c9d0191729f033209 \ + --hash=sha256:cb4679d4c2b089e5ef89756bc73e1926745e995d76e11925e3e96a76d5fa51fc \ + --hash=sha256:cb774298da62aea5c80a89bd58c40205ab4c2abf4834453b5de207d59d2e1651 \ + --hash=sha256:ccd4d5702bb90b84df13bd491be8d900b92016c5a455b7e14630ad7449eb03f8 \ + --hash=sha256:cf9d3fe53b1ee360e2421be95e62ca9b3296bf3f2fb2d3b83ca49ad3f925835e \ + --hash=sha256:d2ae91f50ccc5810b2f1b6b858257c9ad2e08da70bf890dee02de1775a387c66 \ + --hash=sha256:d37f8ec982ead9ba0a22a996129594938138a1503237b87318392a48882d50b7 \ + --hash=sha256:d81e6987b27bc7d101c8597e1cd2bcaa2fee5e8e0f356735c7ed34368c471550 \ + --hash=sha256:dcf4e6d85614f7a4956c2de5a56531f44efb973d2fe4a444d7251df5d5c4dcfd \ + --hash=sha256:de790a3b5aa2124b8b78ae5faa033937a72da8efe74b9231698b5a1dd9be3405 \ + --hash=sha256:e47e9a08bcc04d20975b6434cc50bf82665fbc751bcce739d04a3120428f3e27 \ + --hash=sha256:e60f112ac88db9261ad3a52032ea46388378034f3279c643499edb982536a093 \ + --hash=sha256:e87fc540c6cac7f29ede02e0f989d4233f88ad439c5cdee56f693cc9c1c78077 \ + --hash=sha256:eac5c82fc632c599f4639a5886f96867ffced74458c7db61bc9a66ccb8ee3113 \ + --hash=sha256:ebb4e035e28f49b6f1a7032920bb9a0c064aedbbabe52c543343d39341a5b2a3 \ + --hash=sha256:ec1e72d6412f7126eb7b2e3bfca42b15e6e389e1bc88ea0069d0cc1742f477c6 \ + --hash=sha256:ef98ca7d5995a82f43ec0ab39c4caf6a9b994cb0b53648ff61716370eadc43cf \ + --hash=sha256:f0cbc7fff06a90bbd875cc201f94ef0ee3929dfbd5c55a06674b60857b8b85ed \ + --hash=sha256:f4791cf0f8c3104ac668797d8c514afb3431bc3305f5638add0ba1a5a37e0d88 \ + --hash=sha256:f5e412d717366e0677ef767eac93566582518fe8be923361a5c204c1a62eaafe \ + --hash=sha256:fb2ed8b3fe4bf4506d6dab3b93b83bbc22237e230cba03866d561c3577517d18 \ + --hash=sha256:fe0a5a1025eb797752136ac8b4fa21aa891e3d74fd340f864ff982d649691867 # via pydantic pydantic-settings==2.1.0 \ --hash=sha256:26b1492e0a24755626ac5e6d715e9077ab7ad4fb5f19a8b7ed7011d52f36141c \