commit 28c0df63db7044b25523c9f2454a4c86e69851b8 Author: BeneKenobi Date: Wed Sep 1 18:29:11 2021 +0200 Initial commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..7b8eeeb --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +.DS_Store +.vscode/ diff --git a/Pipfile b/Pipfile new file mode 100644 index 0000000..cc17bad --- /dev/null +++ b/Pipfile @@ -0,0 +1,15 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] +selenium = "*" +playsound = "*" +pyobjc = "*" +requests = "*" + +[dev-packages] + +[requires] +python_version = "3.9" diff --git a/Pipfile.lock b/Pipfile.lock new file mode 100644 index 0000000..78d8031 --- /dev/null +++ b/Pipfile.lock @@ -0,0 +1,1219 @@ +{ + "_meta": { + "hash": { + "sha256": "009581d6bc3a878e2b10db013d3c4e0024e8f18360dae5ddc2e67d134bb2ed96" + }, + "pipfile-spec": 6, + "requires": { + "python_version": "3.9" + }, + "sources": [ + { + "name": "pypi", + "url": "https://pypi.org/simple", + "verify_ssl": true + } + ] + }, + "default": { + "certifi": { + "hashes": [ + "sha256:2bbf76fd432960138b3ef6dda3dde0544f27cbf8546c458e60baf371917ba9ee", + "sha256:50b1e4f8446b06f41be7dd6338db18e0990601dce795c2b1686458aa7e8fa7d8" + ], + "version": "==2021.5.30" + }, + "charset-normalizer": { + "hashes": [ + "sha256:0c8911edd15d19223366a194a513099a302055a962bca2cec0f54b8b63175d8b", + "sha256:f23667ebe1084be45f6ae0538e4a5a865206544097e4e8bbcacf42cd02a348f3" + ], + "markers": "python_version >= '3'", + "version": "==2.0.4" + }, + "idna": { + "hashes": [ + "sha256:14475042e284991034cb48e06f6851428fb14c4dc953acd9be9a5e95c7b6dd7a", + "sha256:467fbad99067910785144ce333826c71fb0e63a425657295239737f7ecd125f3" + ], + "markers": "python_version >= '3'", + "version": "==3.2" + }, + "playsound": { + "hashes": [ + "sha256:cc6ed11d773034b0ef624e6bb4bf50f4b76b8414a59ce6d38afb89b423297ced" + ], + "index": "pypi", + "version": "==1.3.0" + }, + "pyobjc": { + "hashes": [ + "sha256:322b07420f91b2dd7f624823e53046b922cab4aad28baab01a62463728b7e0c5", + "sha256:8a42710a73e6a7e4c332619aa3ea6d9981edadefafe4492f295c10fb7f14c4d2" + ], + "index": "pypi", + "version": "==7.3" + }, + "pyobjc-core": { + "hashes": [ + "sha256:4e93ad769a20b908778fe950f62a843a6d8f0fa71996e5f3cc9fab5ae7d17771", + "sha256:5081aedf8bb40aac1a8ad95adac9e44e148a882686ded614adf46bb67fd67574", + "sha256:8d5e12a0729dfd1d998a861998b422d0a3e41923d75ea229bacf31372c831d7b", + "sha256:9f63fd37bbf3785af4ddb2f86cad5ca81c62cfc7d1c0099637ca18343c3656c1", + "sha256:e9b1311f72f2e170742a7ee3a8149f52c35158dc024a21e88d6f1e52ba5d718b", + "sha256:efdee8c4884405e0c0186c57f87d7bfaa0abc1f50b18e865db3caea3a1f329b9" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-accessibility": { + "hashes": [ + "sha256:75f11e49a5fdb871da7b86f2363aef9d4ce01975549b3ad70d67bdc53c94c365", + "sha256:bc23152da5ddff4c60a316effcdba43ed664db07f7c4713cb7342a5620cfa04d", + "sha256:d91afc44bff2a29fd33ff1269317e0c8e6413864d1a8a5f5c60d24ca859b8a45" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-accounts": { + "hashes": [ + "sha256:8c706252c2c01882277555d7e8b53762895dbb41b76501d33ded1c8a16f1902e", + "sha256:f35634b7f334a2ce11f8838af1045ec4bf0374000c9296a0f7bbf1b315d81afc" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-addressbook": { + "hashes": [ + "sha256:2c5036369ee78b68337c6524b6a35060891f94d5ef24beacd8abb9c034f6f201", + "sha256:3e84749937c58776d9157aebbe4599c304f8e5f7e8aa31937c25ba5c0704dd81", + "sha256:bcf0386a2d26069fe49f5ed1364d9d4c67abe5ae338e91255f713c83c253da16" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-adservices": { + "hashes": [ + "sha256:2506d71835258bf52605a8e1f93a1f33d6293c3fe864b3eaa020267860125188", + "sha256:a17ff248bbe8da5bc0afa63d00dddbb4e7ed09daf417aa66f5d41236d6879234" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-adsupport": { + "hashes": [ + "sha256:3db51bbd09d0b2c77b810765aa3588ca88e7be5aa2a716697d04fc5bcdca4235", + "sha256:c668c66d4ca0565279a2e8d0c496f63110be8dd6b7fc888438aebd7921e9c773" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-applescriptkit": { + "hashes": [ + "sha256:2862cc29e5c2141ba8b35ff85508e0f1616572080dc57732f96eb85b3e8c803b", + "sha256:7c9adfc047222ce4c56dab7182b8408da48ec08c03a57463334f2a122a300aaf" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-applescriptobjc": { + "hashes": [ + "sha256:ac6dc66ae55c627182c3e873e58ed6ea1aecf4fc837ffc9321b7d70f9514c193", + "sha256:e3cfe17d43eb4a8a8c07c9a77fadbf16540c189c99351484d6a189564fda3bc4" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-applicationservices": { + "hashes": [ + "sha256:167aa21ee47b0ee6e4e399915371d183ae84880dc3813c27519e759acb9d20c9", + "sha256:1925ac30a817e557d1c08450005103bbf76ebd3ff473631fe9875070377b0b4d", + "sha256:2d55796610e6293e83cc40183347e7f75a7c0682775cc19e5986945efa9cac1b", + "sha256:7a98f0f1e21465868f9dd32588ae71e5e6a4cb5c434d4158c9e12273fd7b8f27", + "sha256:afd1ef147447fe7b06a271458eabb37ece6436705abf86265d7fb57310eca45f", + "sha256:daa4a9c51a927630fdd3d3f627e03ebc370aee3c397305db85a0a8ba4c28ae93" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-apptrackingtransparency": { + "hashes": [ + "sha256:3623e3f81b3a1e140e82ba86376d50cf25e781d3eca64b0b63b35a7dc03d0870", + "sha256:e29f193ca3b302394d8d1305daf592fefca290e521d6b0150abb83a7e5ac059c" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-authenticationservices": { + "hashes": [ + "sha256:610b2e02a6a9027e85bb7f0e232fbfb93348cff2ce3528e4c35bd4834c9ce164", + "sha256:8b6de4109e7cd825cb1016e5d826af63dd37ed2d0331e8bcad7c7d1f26185a0e", + "sha256:c238cb2cfe0c8d5d2d606804aba47d9cecb0f78994072ab419bd5ac823bd3e78" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-automaticassessmentconfiguration": { + "hashes": [ + "sha256:7a43f01bcf83f0959359394dba4844ac4c1ba4be3ef8599358bb50fb79963c79", + "sha256:c932b31d3620c391e68a16afad85216cf9cc84e8efd938ff285563236890c09a", + "sha256:e31272d8b344f4ce192e99d620d074e554948f8cacb6eaef3514baea6cad8c2c" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-automator": { + "hashes": [ + "sha256:37b9ba85dcb138fd2e6a0ff373e88dd33cab3a3137b11bf15dfb40c67f4934d0", + "sha256:c793a740649253c9d1bc70fc757fd95a946004ae386dbf937b9f4290c47b43ac" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-avfoundation": { + "hashes": [ + "sha256:12b642df505240d6bb493cd10ca34e7785782eda6aba7e361cb1128b29866092", + "sha256:8b7e0e1413f3e627a4668c738a308b54324a781b437d064733c71713977b299f", + "sha256:e187591b31c2b053d65aef8b8e3de3cd9ad53496b1ec9144e712dbfb2cded20b" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-avkit": { + "hashes": [ + "sha256:00aa57ebe7068dccf53e571870bfffe8e9b0857f99f5225795dbe224b412d22f", + "sha256:59030a44d79533c096bbff5dd6a82c51f4c0730878d58d4eb9ec2cb57f828d7f", + "sha256:a07645592759ecc438beb37bc9b6e3c527647423e7327d325f84380e198e34d2" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-businesschat": { + "hashes": [ + "sha256:a0a777c1b6404d7e15a8fdc856178be71a6ad89138dba833f76bf267ba83653e", + "sha256:d1e3b16fe25deee3ba39fda17948d98c327523914eef7d16e30582f072442b79" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-calendarstore": { + "hashes": [ + "sha256:a1371e0e9137c9d566836e63f8a927ad2fd0a2b076c722c8fff6d48a73a94382", + "sha256:fb19a8bb059fb84505ff427cea69df604ab4755ed3fee08278c7d94c34dc3cf2" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-callkit": { + "hashes": [ + "sha256:5167f17b90ac765774213826af6ce025864ea1643c27ff2f91c76201ada886c3", + "sha256:b0ba781bdd02966810b7106f889bd5838d60ac4b25df6fe21d08ece4f6503a8c" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-cfnetwork": { + "hashes": [ + "sha256:018e4a4eabc58ded583fe8ea250ad0533ed2c57fd8bfa9a658c867b1826867de", + "sha256:24392f6505c243eba7bd2399730bfb39631401796f9f82508c726e723016865e", + "sha256:50f0041ee9803857a57827e1995794f8824a4bb7c685d736e1337853c64e741d" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-classkit": { + "hashes": [ + "sha256:2b3b1d3d1da7f5a752bb7d32a09c283db49e9281f4702517c10bf66b3bf226be", + "sha256:7da8a38f9a939738092145c3455d1e8917b0e98e9140bdd5ac70dec87e7965c7", + "sha256:e1c014caeb6d675dfe606a6c77ccd93df7ffca3be0fd6697bb86e6703d66717c" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-cloudkit": { + "hashes": [ + "sha256:137c605a288a14f4b10bd2cce69b6897e5b2978b621e334ca83b407831084700", + "sha256:76efef08830d83c44bdaa9e20dfc652c065f2f8d6c7d1f10ee8dd29cba301869" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-cocoa": { + "hashes": [ + "sha256:2e8e7a1a82cca21d9bfac9115baf065305f3da577bf240085964dfb9c9fff337", + "sha256:35a6340437a4e0109a302150b7d1f6baf57004ccf74834f9e6062fcafe2fd8d7", + "sha256:6c15f43077c9a2ba1853eb402ff7a9515df9e584315bc2fcb779d4c95ef46dc5", + "sha256:7c3886f2608ab3ed02482f8b2ebf9f782b324c559e84b52cfd92dba8a1109872", + "sha256:9edffdfa6dd1f71f21b531c3e61fdd3e4d5d3bf6c5a528c98e88828cd60bac11", + "sha256:b18d05e7a795a3455ad191c3e43d6bfa673c2a4fd480bb1ccf57191051b80b7e" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-collaboration": { + "hashes": [ + "sha256:43a1d85e5d418265f18a4c5d77f33eea6d7ad701482a7796f1986e0ef6f39d9d", + "sha256:86724cb8776c5b9045c80307c0a196432515098a9a4a648f7efca0054fdada1b" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-colorsync": { + "hashes": [ + "sha256:23cafb502ac251e363f0128ece1d1fe7df92c2e8ca2545cd502c0030e0da36f6", + "sha256:7f95964f1290739642da32a40a6668e5b32d1477635435f3b6eb86689751c80f" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-contacts": { + "hashes": [ + "sha256:7ae50f3eb2d241bca80c0ab52a99ce0eda5e29b4f6a1ec1432cd1d24d1df7209", + "sha256:8504649f8fedaf0d319fd0dfe42214ed060299e080fbe8e8c9111168640d6cfd", + "sha256:912fccc3b44b9d3b53043df433729344a71ff7652bf18d22c8da4d41c11e444e" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-contactsui": { + "hashes": [ + "sha256:c35b9f10395ef822bcb418541cca4d972fd4f54d064d29b247702e5deee77f0c", + "sha256:e623da9b07c03a2869d9d2d921a4debe5649cde41474fbbea57e32641beae8eb", + "sha256:ee9c704f1738a291c114c72815c17af1a150c6124b84b23fdef7f09e4f6d5d51" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-coreaudio": { + "hashes": [ + "sha256:11876f4eb434a492674f8b61a5e9ebd6d9f5bc5ba49a2dd56e5e8dcfee92138f", + "sha256:2c6a6641d4c6bf0464db014b9406566cebad86ae59401e356e09552b2cd478fc", + "sha256:37d161dc459ba309fa5f46655662cd63ff850b5edddde463c58594bdf4b4dee4", + "sha256:6eb67ccecdf488e9369706727f8b90623dea35159f8193a59c04d2cd4d752067", + "sha256:b4fec7d9be1c094caefea862782960d7ee4e33526e31896fee5838b8fe95d01f", + "sha256:f2ef8d2b1a2aab20f12fe978adcdcc21f5c83f5c0374e0cc908e13c49d3a2d69" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-coreaudiokit": { + "hashes": [ + "sha256:355ac0a26b896c2d024ed8ae92092a17a39b862fc48e58af3f9a27763f8e4a08", + "sha256:8c8853478f12521750f2c1251c51b5094b8c00970f8337a674f3006fb32e777f", + "sha256:9f0ad55dedbff8539c89990a74bb57c452273ac32a5676acbc22becae677b683" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-corebluetooth": { + "hashes": [ + "sha256:86537978052481023cd378714c5e01a337794435aa1981db60c75517f7dc7fca", + "sha256:f197fd9c13815c1f41997b7eaadee704a54e9f0bd8a0a2ba75bf549d0889caca", + "sha256:f9f4e9ce79d1933ca7c046348319ec332bf8e95383bc7af70f26accd9167b5c4" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-coredata": { + "hashes": [ + "sha256:20fd74440c777f57f4f58ea21a8bd14112d853f4b210c1dd6e2c7d0b93d89e1c", + "sha256:e30504bb316e836b0b7ed49035e4443cd95e04af91745a3f6d5656ccb68c0964", + "sha256:e7bb263a38ab0acfb931d8a116bde6d928a17a284d1ffa78eebb2d87f62da9b5" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-corehaptics": { + "hashes": [ + "sha256:8263ce87459038e4e6c648dcd127abb55811dd532abfa1d3526f12f52defbc64", + "sha256:e0ff9800e2ffe93c42583bb4f9cb29ebddd6c36f8c93aa12d5ffcf3ad942d788" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-corelocation": { + "hashes": [ + "sha256:30060bf97e6cd858192e3cf6ad2725496838062b1750392d6f3c227a8b39bdf8", + "sha256:489df752c94d2e51af4881d0a1a5d87ebc1561df17d26ba3a9b177caf90f824d", + "sha256:f537af08363281b12ecf1aeed77a2928474a978209ee827cd00d4b3346f411a3" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-coremedia": { + "hashes": [ + "sha256:089c2cd1eddd9d8a6b3cd624cd44c9f0b222127280d13daacd45ccb0afcda6db", + "sha256:2b911875f1630da6d918c02ca5617e8b5692cc2c8a222874befea19c453fcad7", + "sha256:38a86c24e337b895fa4832323085f2cc84fb5bffaf1c6c4f54173e9774d4017d", + "sha256:53e874af4c5cedcbb21a52b6482f98afb402798062326efef0f08de37f7af002", + "sha256:b6a05656db2dbfb9e27b2a0ee354528a46cf9d2791a398e60db14c93d6f1c089", + "sha256:c95a09979709241e50a2b000f6772751fed99850f1aaa2cacafd039f3a6b3e99" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-coremediaio": { + "hashes": [ + "sha256:2723c2d994fa1604e2d44719adcc3dda938867aadba565ffecc613b5606e608b", + "sha256:4d2b6106456219d8e74a0dcd9fd4ed1c9be50220b559a266f1048bfe0250a5df", + "sha256:ffa8e5b48bc3b5dfcacd5f8b7f89fe3f02e888f1fcf8597ef41f4767499ee071" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-coremidi": { + "hashes": [ + "sha256:0ffc7eeb7f3295baa40f477dd2de955dc7b02512ed963dbe6256d0d32250ec16", + "sha256:60e99c2a18becad80864801394afc5755c982ebc2877e6c71a95e799de1467be", + "sha256:6e333eeddb136579128c8e61476eb638d1db5b7a3bcf2f79ac6f32b00c39ad16" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-coreml": { + "hashes": [ + "sha256:3b4e1848fbe7d765946a385dc1bdece6c79aed8f59fd426ecc6a32c1f0d8562d", + "sha256:3f40f91a32769cb9e5550498f95eb272b06a90a0467f528adbf4db9e1273eebb", + "sha256:dd6810f920e4b6aba14d3e9a471ea3e6cd36b315e324b76a92c46d7ca8ef7700" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-coremotion": { + "hashes": [ + "sha256:4338c0f24d99d6dac0555a4df1a9265da5164e8603af37eb8345a7e1785624e3", + "sha256:78afc91a500472ee7a7b9b16a7035aa45ddb83e11339675303d8b86900f3f727" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-coreservices": { + "hashes": [ + "sha256:08cac5b662640772e02c8bc62e4a1e21a39794a21826ffe257b48cfe587083f7", + "sha256:148cc460d9f94ad200d22151c35bf985422790b0cbf1f147f9c1127c5fea23e0", + "sha256:68240e0314e144e8cccef52c5db112bc4098cb0841c36e747b2f35eeee739e96" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-corespotlight": { + "hashes": [ + "sha256:0cf4dc2091a75efbdce804a2b3e1e5eb2fe98daaa4ce495f93db47f94ea47eb7", + "sha256:5cb0f25f3c48753a355e1f90c7bd94ea5549d03fa33edf92053fb69d8cb0a9de", + "sha256:90a14bd7f1083b9f237d88a22eda22f043f86671416273dc70c73480fe1febc5" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-coretext": { + "hashes": [ + "sha256:5b5fc91bcbd2fe5199f6b65971d62bea02f942c76d6acb59168c041c7af435d9", + "sha256:862e5c2c1bd6f5d276321c9a2d557dd8fb62ab1da55722a582b9e6621b05c1bd", + "sha256:a3ae27d5756b9d62d113e7c4f12022f8812bc95bc277f920f0fe2ca45b5272be", + "sha256:b172b22f51625a0f92c9730b9d9a193f12bd5e56552d77b6841dfaac0d16bab0", + "sha256:d290880894256497425a1abd116076e7a74c8b92a2b1b27d899ede16f52e5f20", + "sha256:fd3f11b3358cbf5a56d4a01e736322daa5b6ce6e3701d41cc9eafcede0267faa" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-corewlan": { + "hashes": [ + "sha256:63ab61cd28cd1d61619150e1eff85e3c953f28b4240ec4011229100bb4749657", + "sha256:8bb19b278c56f9d5dc52ebe7a0f45565a26dcaea24f127e06234c8d75e66a6b1", + "sha256:f102cdc76b1715b85376f80b11d27034458083cd589a161926904dabbe04a41b" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-cryptotokenkit": { + "hashes": [ + "sha256:904ea3ee27135a2fa4b139ed8aed0a50f0c2ce7d3633c7e1e79d317aa5c4e9f8", + "sha256:bab35918d7d29bf8264c99b6eba3bfaacaef52f7be28039e8fda955e6b6540f2", + "sha256:c2cfbdbb424a8fee16ed76ab558d121e681bb32ea33d4361c5d4fe618ad66c6f" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-devicecheck": { + "hashes": [ + "sha256:12eceb3f9bffa9bdd0a8948bfd9e27ff6be34a8f72a4d72dbe117efbcf13870c", + "sha256:9f65aa882367a367d8f05bbed52ad822f883970bc0afd7ae0bfb9941e16f13bc" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-dictionaryservices": { + "hashes": [ + "sha256:3187b7c24f3fb8e6f5aea89eefacf3657a4bd4fa0f589a69836fb5aeafe2733b", + "sha256:c3bc44a4383add1505b348d3a1a99c49708eb8360f44655ba726312d76451421" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-discrecording": { + "hashes": [ + "sha256:690621c0bc25ff2b8c6e227e6294cd9469e8208179d79a7fcf79e580159f582e", + "sha256:9a1dc83f44227e1522643ec3c0fa774dee9e42b501fce7e1e39ba1e4907e1e22", + "sha256:e531c82e35986eb984e2613ef5fc37c1cb0e3b3174c60cbe2e34860052423259" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-discrecordingui": { + "hashes": [ + "sha256:5db083a92bc9513a818d1bc4574a3313f9b967f2aa8dce888ebe436b9a948673", + "sha256:c30d3000885be80aded9f4517946fed3ab6c43dce89923ad62ebadb7f5135ebc" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-diskarbitration": { + "hashes": [ + "sha256:edac3e6a8daa20cd39d3295b253b0118d6fb1e757357f1fcb384b2abda12cca0", + "sha256:f34d28226760fdce865487b2ea6835e5256f0df00deb68154515e51dc36ea352" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-dvdplayback": { + "hashes": [ + "sha256:4e71fafed5901652ad7540f1f25e9250c5c6522039bf74681e850c6241bfe497", + "sha256:523bb58d41b972514187ef0dddadc5033f739074e5a89002d677282575b1e777" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-eventkit": { + "hashes": [ + "sha256:08034245c385f31d93eddd181f48defefd9f97fcfff7d01ae47dc5dd3aacd424", + "sha256:826e04c0211c781ce85b4efb0de4b72d833a66e8475e3f1728f318253fd9ffea" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-exceptionhandling": { + "hashes": [ + "sha256:1843f8e48d88c8518280c0daf23247a4f12897cb3b7b9b77ee014cf0b4a145bd", + "sha256:f5c04dfb0178c983e60e6a19d1ff75ee74898d79d87916005a562bceb941d469" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-executionpolicy": { + "hashes": [ + "sha256:27f1bd941320238eaebf933b30b401cf0af5b581af2d4197554ef6977125a2ef", + "sha256:b042788483b40178bfaabe7bde4a4db76e340877d1525074a2e3812cceafe9d0" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-externalaccessory": { + "hashes": [ + "sha256:74b5c2cce8f2a7a70c2e57e6ecf773ac5e083887e27b5acb86e97eb5c4f1d472", + "sha256:b72bf6d62aaefb7ad5a7997b3ef8be4a270861edbb1c4546a82963c3d09ae5a0", + "sha256:ff6727bc5b1d2894e7a8e350272a19be6d4b70621a22a488e9efe64971b01086" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-fileprovider": { + "hashes": [ + "sha256:370dfde069494818f077ff06ee02cdedc9c3733add6df5336800c5f14c6519ff", + "sha256:55537492938356fb0d2034327d39e84c46b2e7340b923177ba249baf0ce43b38", + "sha256:71170dd3fb5b9abfe59bf441568b31b8059284054501419c06c94871006cb5cb", + "sha256:7b3649e1ddfa2c936a27d8d4c811d72786c911809909d0367ca08cae740d81f2", + "sha256:a427f2f560b8568f7992467b4f8acde9dd9de716979a71484cea06ad9e3465ef", + "sha256:cec94c9e2eef09e624834a358da7c0827938eb0825c2804b09a2bf20858a6615" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-fileproviderui": { + "hashes": [ + "sha256:2cf6f7182bde330ee018233014549f24ed89002f543364f55ca99fd5ee51051e", + "sha256:df4babeb6ca03575f8488a4bd999d6a62b2825706ef8438960fe299938c05d54" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-findersync": { + "hashes": [ + "sha256:51ef8c0ae97575a9aa2c5abf9c9739bf40ec2482371fdf40baa13f58ad05fd79", + "sha256:f68c6920a1a8445c170dfc6c345243e772e331ff01f5a2eef04b330ab5ae8c42" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-fsevents": { + "hashes": [ + "sha256:3d12df35cc0b18c3f7c677d6bc870a7ea13a5d1c2f16456c1f445e0b894ddb55", + "sha256:65d2fed30225c9de9678f68cf41e56f0e1afaaac6e3ae82075e874e93e42a823", + "sha256:dc9e2b8ed3dc2f6acffacd52681ece8141711acd5e02d23638f6a48af9bcfc5a" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-gamecenter": { + "hashes": [ + "sha256:1a13c35fa7f109d043e5d0d8cd5f808d061a4ce525580550dceca2697270beaf", + "sha256:5f6a5d673b767372f60603a5f370d46ea3895168dd9efd501bb34d64a66844e9", + "sha256:fee0d1bf927daefbf6dea6c980ffc04d54df03041f01e0895999c82be5cb27ea" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-gamecontroller": { + "hashes": [ + "sha256:6d88715544ef6159ba5d10e6e9148cab1d7c94e572ee23e06d8d95262ac05425", + "sha256:745088df9c3d127e0949f5ee19d12c8c88f305c8406769f12da4299338320d91", + "sha256:ae38efcce1dcba570fb97a377a2af8372e2dee5129466193b52a7ab3996306aa" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-gamekit": { + "hashes": [ + "sha256:6bb7b60b638026c2c5dca0f2ed92e0710e83d7b2ac5393387cbe3b80f1f46c6b", + "sha256:899c5a98d1c86d918c2d4ff2928974d3f177a3bd1db2cdd1362ac1978c7746f9", + "sha256:eac5768f71e8d78edef9ac3d660bb55ccda911e42fd13a5ca157c10342848a5c" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-gameplaykit": { + "hashes": [ + "sha256:2a93a9eaef10c693c37764d8b73702036f85ad733dfb84b7e2569e1d64efb4be", + "sha256:6138e5e7eb16c0f6dc1d9d9d570589f6dd19746be7a5a84ef69f3288e8f87cbb", + "sha256:e90fa8213580990ff982664b71fbc414d3015d83b5819c2dbed967dca9352cf7" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-imagecapturecore": { + "hashes": [ + "sha256:a292eddc7db0bb57cd40ac32fe16c85be21e0dbad99f1f414d520456e0ae9f70", + "sha256:adc2e0b6ac1a60adc778a56a0f5b6b53631f441f46c592e693c79b64b47bf229", + "sha256:e0143ae9d33d5dae5427b1823444a83f89fbdbcc5f0d42b3c3fe5e6dd17ec4e5" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-imserviceplugin": { + "hashes": [ + "sha256:04faa56cdf2899bba8d7d397d9cd77a8bf12aa631d979b005365201611a0712f", + "sha256:7d41664b7fe6059cf311d589d6b7ab35726b74d7e10fd0d61e270954818c39c6", + "sha256:b2b297f68891a3be1120767a6509ec3eba81cf74fc550974362140820c9def82" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-inputmethodkit": { + "hashes": [ + "sha256:5984ed9239ca8f5e8d29d76cc7a218570f8c6a29b0705b6853fa2eda65e3542e", + "sha256:c96d51bdbdf55c05ca53ed50691c9e7258265c700126f25498f293d708dbb601", + "sha256:fda4b2fc8fa989f5f59fe7abed42d42784a12b5731a93636609bd2d6014715bb" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-installerplugins": { + "hashes": [ + "sha256:8b770f0d5633cc04a5aea376766ed5d18aa75806275f3e9579e4b2093c29ca18", + "sha256:d1bd6b8df714a6f7dd7dc19e5a96c13434732ff6a17dcc3bb21f88ea7cd9cdf2" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-instantmessage": { + "hashes": [ + "sha256:dbc907cbdd4ae0766f568c709460381846fb57852496177dafb323960e52f22f", + "sha256:dfbed891b064bae5fa4cb6c205d9820e49002dac3b49021f526c9d0360c0bd14" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-intents": { + "hashes": [ + "sha256:1220eeaad2849f7ba75f947c94343087f33495b678bf3bdb695a22ba23520a4d", + "sha256:b6ac38cb878cce0caac161e2529ae79c82eac2a658e0323da52df8626fe94cbe", + "sha256:e25038fbf70c1b3f55c17067601f28d06745e9fb6874e7a03672c5639ee0fd70" + ], + "markers": "platform_release >= '16.0'", + "version": "==7.3" + }, + "pyobjc-framework-iosurface": { + "hashes": [ + "sha256:28a02d8ade66ab6c02c64e002c92f4b5ac2b0590d7b0b3a0dcb57d415f44f4a1", + "sha256:bbaa566eb2972cfd44531875aefb7c0622f31743b4d85bd957348edc7eab21d5" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-ituneslibrary": { + "hashes": [ + "sha256:340c5aa952871aa34a7dcad677fb537252d4ecedde499d88f89de0093b117ac3", + "sha256:cac84e32b338fcc68ab80befc51460e9adc5181e19c4d07b319b50dde93c3cbc" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-kernelmanagement": { + "hashes": [ + "sha256:7f04f73ec4dbaab3402f5c45b716ce35d34a595f9cf87bcb62573ee9beb2a00b", + "sha256:d5efc836aac83df2f71e3e20f0e5ab877640897f79f81a65bb5e0c9a82023280" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-latentsemanticmapping": { + "hashes": [ + "sha256:67abdb884a5114887d10c7528711eef9501843c14188a150c915339d796defd0", + "sha256:f252083f5321222726597938685c31e9b53b6e6cd3db9c84a9b54426291bb0c5" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-launchservices": { + "hashes": [ + "sha256:53cdb7c7566b169c6c373512b8e5a6b3ad8cdf540ad56eb36c9a424e5228fb1b", + "sha256:95bd4a68f4a5d098e2e4619d7d392753fa0978acba482384aaa441a6c82c4f6d" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-libdispatch": { + "hashes": [ + "sha256:2262ab83c6236d168c4e595ecdb1973c1f845dd0dc21840f4a8ce6f900d7e357", + "sha256:57acf9136ad53794c2303dc0f055491270cf70b85f89cef79493c09b60f60f59", + "sha256:69137492b4564d739f9b4eb56f8823a32fab47d13e809ca401b0c66240be929c", + "sha256:7bc56539ac0761519d6f68149a012ed9b4250781156dbeeeeb8920146125222a", + "sha256:be032ce5d05ac23e82c18a6d25459b45ceac3f3073949a439584a99fc26582a5", + "sha256:c3e63ce294e50a36c17bc9e65ccf3e448995931fc10fc0c15f899d27c438e25f" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-linkpresentation": { + "hashes": [ + "sha256:b0c572fab75789b5775d5ce941e4e1a53ebe438846996f148b12e1ba2b585e02", + "sha256:ba06355eedbbd83b703171d53d7cda2ff2294c4eb8ececd431a10683bf09bdbe" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-localauthentication": { + "hashes": [ + "sha256:0c7ac94f90e3e5e1797980dca08548f5e7ce38ba1578d10b45dd2b611c41183a", + "sha256:3d2c7d7b945ec6b635a61adcb493bc5130abfbb7bbf2dc779ec7b7edba4efc72" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-mapkit": { + "hashes": [ + "sha256:0f9a95f2d6edac843de545df8d00280ef222ed8508ef4ee940a34d56d7b11352", + "sha256:8b946a4b204895dd380a09e8bd28f543475714c3a5bf63913cd2436986d07932", + "sha256:efb836c7a9e97c971cec4549043bfdbf4088164f75b177ac3de67a3a98817d2f" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-mediaaccessibility": { + "hashes": [ + "sha256:687403801f89805710c8de0a3a41811614e772776f19c9e041c06eb4fb529c24", + "sha256:91b61f99521fea516affae23b0a208204b3326d5ad90b8cf32dac786287cb84f" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-medialibrary": { + "hashes": [ + "sha256:63449f7109d292c4179f169cb5e9c114141683c2a95ab260f870339f616f38d8", + "sha256:d23b9f80ca63cd8e2471e64794df30231e1b71eb9f0259c986225b1a58face22" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-mediaplayer": { + "hashes": [ + "sha256:76e3746cad7c1f0fa2f08ae3ba922316c634fc85c4c7616b573e79bd781c30be", + "sha256:e6133a4cc293b98e6f0c9ffff3aa2becf3cccc6c89b79a04ab976459f62be5dd" + ], + "markers": "platform_release >= '16.0'", + "version": "==7.3" + }, + "pyobjc-framework-mediatoolbox": { + "hashes": [ + "sha256:52013a09fc7d1cab5613d2044f14016f7b6b504c5ed50cca80894f93de59008e", + "sha256:8a17cdb1a8d69b6104ff901cb335f085f6549b03de30d40fba319bf6ec1b8257", + "sha256:92ab0d38fb9036499399f27091f123d73f28618a1cda0b2eb6745f798843366b" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-metal": { + "hashes": [ + "sha256:1ad907a5432809eb807ebda843ed44b07d389d09d0c29a678ac88fee06558d56", + "sha256:249d996476cee9e8762839b16d6fcfedd4acd3195fe1ef436aa6e3806177db37", + "sha256:e69a7780edeab17fee4662e62f0a62c70c613051b27d3ac2813b2fc445ebee38" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-metalkit": { + "hashes": [ + "sha256:37644b9a27f6ea481eb2d6f1db71b603c49e3789d62fdccb7dfe9c18d4eb84ad", + "sha256:7e6ed417fccd1d2467fa65ebb57770f621cf05ea6075462425de33434a3262e7", + "sha256:a834a881fef2f4986384423a3393ebd934719ca436e2e9df76519ef424162278" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-metalperformanceshaders": { + "hashes": [ + "sha256:aab31f039b4236a7799cf36ea9343c04065856f0257b874e8bfd653d35069007", + "sha256:d1a2d86a679a8db75ca35bd8f614430b7d8aa4de8e73205327abb140da917db2", + "sha256:e73270a94b6ae4500eb56d9ce8a7dd0484195314ed96196aaf9c6c23b72b0442" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-metalperformanceshadersgraph": { + "hashes": [ + "sha256:432f4a542c1037c7fd65041d21d2e51684bea0649b308d0054e45c3d7df4176b", + "sha256:a81d957f0cfb7901ef6698d892df1432bd9d84bc2ef814319e91faf0663e0586" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-mlcompute": { + "hashes": [ + "sha256:113c78b4decb48e6c46a8e8037476b26869a7ac4439ed7e83e5a92224ee39beb", + "sha256:c1d68f402d70751a18cda5d5644cbf808e7b5f38a568002de50cfbbea4604ec3" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-modelio": { + "hashes": [ + "sha256:095d10162aeb8810576506b02a3891056fdc12d1deac478f57bb633bc4af67bd", + "sha256:d151e5888300d533e23939df79be04563925fe9620d2698173b5e05b9e721678", + "sha256:fae27754371cb8c20939cdf2cbb792aaf995633804d1fb51101f9f8c737c5d10" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-multipeerconnectivity": { + "hashes": [ + "sha256:a5b42dede182ad3e42d0e5bc764d55d3b75741383508f88c914d9559b8a6cfae", + "sha256:a63ad18c91cde6c447c84bbcadc31ea054d027af5312e462d267746ceb6acdc1", + "sha256:e3298250a9ab97cb1dda6010311c4c7aee79ca5642e52025b468608f4b97ce0c" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-naturallanguage": { + "hashes": [ + "sha256:a69dfdb67a9385aa37877046d42660f7da040beb182fd082dac6c203442911eb", + "sha256:b48390651b857f6ed3fb3eeeb843f77cac033c32ad2bc367d4aeed17b63b1527" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-netfs": { + "hashes": [ + "sha256:a5f6fb8ab739c9466ba9a81e3a742f92a8808e6716385aa15078630110f2ca6f", + "sha256:b48377bf8490f0ce2f78c7f6dbc8e280d7c8a58d73e64c2a888d3f951a991a58" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-network": { + "hashes": [ + "sha256:094b2c63fcf1d29684fc2a0ab9c629620775ce1ac89026dbaafb22144e78304f", + "sha256:565761bada95e0d7912d4b2e5d17a201bb57be73321031a388bb301487a41b7d", + "sha256:c40fe885fcfc9e35680d81eb5a3b0bfc07e51b68039e928884da770bb0e45a78" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-networkextension": { + "hashes": [ + "sha256:099044b5846c5097c0b71b53511c6e6de9db68dfd2ddd62dc1d4253ea60ec76d", + "sha256:0bd2422628be9848297aa58c3b53af2da5c4dac8022d55684dae37e0264bfcf7", + "sha256:f3b37e0cc7ff7d8adb10d85bacea1a3883379f01bb77de1e9155bd4395ddae09" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-notificationcenter": { + "hashes": [ + "sha256:2186d4dcd6f56b567e72abc009b2c69f9bcb0ba42d61a987c057a257953a90be", + "sha256:5765d0afb9716643d15ce52c66f3460898994b13084508c778c73430c8d2816d", + "sha256:64866915bf4c20429fe27c2ab5ab86cab74fa0e557b24382c77a6a6d3d8878ea" + ], + "markers": "platform_release >= '14.0'", + "version": "==7.3" + }, + "pyobjc-framework-opendirectory": { + "hashes": [ + "sha256:2e60807e4385a0c781f4535af733a0ff38fc2c4fd29cb0622c0829b0e4ae34ac", + "sha256:fc12ec43d0faa7e83c45870ad5e58062a7299571bede4463a790a6e4bedaa5c4" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-osakit": { + "hashes": [ + "sha256:5e8ab0fb3c5ebd10cd1d2a1496e4517110f119e6947556546dc8121ba4d2f730", + "sha256:eff377c2c5c8f498ee4522aff406dac17381fe88bf93bad474ba92f77cff6082" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-oslog": { + "hashes": [ + "sha256:102ac6b834fc5e28f9c81f9760389d8d431001ecd12942d4464c24680084c09f", + "sha256:251afa4a571f03a73b48807e95972eda9016746c08d55dcffad72454db485f86", + "sha256:734d1662b781e69e6096d24d908c52211ba3a54f97a21e30e5f22737269e709e" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-passkit": { + "hashes": [ + "sha256:10548941a9139bdd4469aeece4bb0aad7c5c28f57a19c54d7d78af6e779c5016", + "sha256:15fd2f0675428a40b0a64d672d3f33b8c708e13217cb3473c48d969d39d47c8f", + "sha256:1e80b0b52d4fec532c5d3d9065a5a14f731a35270038058be4f45be915ab2759" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-pencilkit": { + "hashes": [ + "sha256:4a065cb1dcd9ca92818fd045fc861f841b3204fb8ead95d2dda003553dbc0a47", + "sha256:b2c12217c742e5acbffeb8d8b27f8a684ddfdbd0ade617db0865ae3c1955368a" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-photos": { + "hashes": [ + "sha256:69d755187ec2e57a5005c49fb7f0aadbe4a6b1782c1a40c46a06762379deb51e", + "sha256:835465b9be2c65afb13bad3b16056321b454c152426af1f3e05ec37165166c7f", + "sha256:cf96b97b94f3f3c922966fa7637436adcfb72c24acd3a21bda327fd151e8b4f1" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-photosui": { + "hashes": [ + "sha256:34da58779d560949e9443ea79b26f36deb6e2a6ab17a8fc4f4d39d0190ba87a8", + "sha256:b8e0839b5907619cc4071b012bcc942372be0ce0e6bfa63e32537faa6b48a620", + "sha256:e2f879d61e81e281770a681e3f5e9c38b61a051400ca45b3cf4abc5680bf1e8b" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-preferencepanes": { + "hashes": [ + "sha256:8aa2710d96d3d18f637ba53748225ed47ebc474fd0874cf8734c25d9c69f48f3", + "sha256:cf8cd47f615cce6b29da8ba4b44962b92aaebd27dcf20168e20999ababc25a81" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-pushkit": { + "hashes": [ + "sha256:063579734da899a19fd0b67f75085c2b4c2295793889594a66dcdb2a5bd8fd9a", + "sha256:6dcf7c040727932ea68faf6509c06b7e505c1b4489114f3ba0d79267c9288ca4", + "sha256:8cf280fc616dfc01072b774803b59ab2d444223f8fa53e8c3750bcff3f1fd63d" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-quartz": { + "hashes": [ + "sha256:1ef18f5a16511ded65980bf4f5983ea5d35c88224dbad1b3112abd29c60413ea", + "sha256:2c65456ed045dfe1711d0298734e5a3ad670f8c770f7eb3b19979256c388bdd2", + "sha256:3b41eec8d4b10c7c7e011e2f9051367f5499ef315ba52dfbae573c3a2e05469c", + "sha256:7aba3cd966a0768dd58a35680742820f0c5ac596a9cd11014e2057818e65b0af", + "sha256:8ddbca6b466584c3dc0e5b701b1c2a9b5d97ddc1d79a949927499ebb1be1f210", + "sha256:98812844c34262def980bdf60923a875cd43428a8375b6fd53bd2cd800eccf0b" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-quicklookthumbnailing": { + "hashes": [ + "sha256:2308898f9c94370a99ab17fde0b713da0c9449ac22163cdb15e51a539834c3c7", + "sha256:699962a6c10168e7d59ec8467ef63fc0d50342545eb899215823551e4845040f" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-replaykit": { + "hashes": [ + "sha256:0457177b6bc5a2d88e7015a33835fea98d5d73e1c36e8fb78c8a88f6927058ff", + "sha256:4f85103fcbf10e09504405c58879637641d1112d165997e8c1a7825c7d90c75f", + "sha256:aec8f34fbbeb7aca9b4f1b285a4f2119035e4100249b8a64e84b144bb47a650d" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-safariservices": { + "hashes": [ + "sha256:5544485ddb68aa617a16a42200f345be95ef209af1a82a2f89a9d281b327219e", + "sha256:ee66f939d96b853b70dda6e2b24b7b59dbc17ce10ffa225de3a1d124ba9fb784", + "sha256:fd3d6878f0fd80a03ff343f8379af8060e5f33058ce279047ecb6e12304216cb" + ], + "markers": "platform_release >= '15.0'", + "version": "==7.3" + }, + "pyobjc-framework-scenekit": { + "hashes": [ + "sha256:14d2c4af8324e34c71d1fdb5a1af4c85b644c7142d61ebb30b495e12edd068e1", + "sha256:4adc7e82784f5277f24305c08761936a329020f664fb7da4dc9b9b7a64990b1a", + "sha256:977fa65fcf5d8012b0d7c8f3d7a2bd9aa7c685a83b6850d74faddab04e6fdab3" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-screensaver": { + "hashes": [ + "sha256:9bbb9ef9db8c73bbdb92c5ddca21e64f2f414b2e50dab3f143539834b11982d0", + "sha256:b4d13cc2d54675893aed6d2fa60cf8d134fa821e9cce7b224756fa3e260a548f", + "sha256:ed8968225a6a84249cd984baeb09b03ac372c03195f99114673400ec617ccb8e" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-screentime": { + "hashes": [ + "sha256:7dbb5225ccf97ef809a147ad1785b45aba3e76d7a8e0aceac92e7293ae680fc5", + "sha256:96f25c23321f92eb4da9a75e10d778484e5a99e74e14971783354a5047f765ea" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-scriptingbridge": { + "hashes": [ + "sha256:903d70ed128709e3be06c033cc6c421b26658f67dc628b92e6190b1fd1150e59", + "sha256:b8f071751845253469d7a2cd8e2fae9c35ea0015789030e1ad1b958fb53dc82f", + "sha256:f09f4cad708d3c946bbcf7fdc5e623bbb512e4e0b085536fc22fe1131b517ca9" + ], + "markers": "platform_release >= '9.0'", + "version": "==7.3" + }, + "pyobjc-framework-searchkit": { + "hashes": [ + "sha256:80fc90c95cf14a0f4cc589764f329211e20e02f51840e880c802603c9dc41497", + "sha256:9619b301411b2d0f9436758691b8f4dae8bf8b95a85fd6c66a422cfd15750943" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-security": { + "hashes": [ + "sha256:1a048e42ddca426ac02838e8f4093f138b1fd88f9de8c3c5f087fbaa60cd1987", + "sha256:379287b0a01abc047bee7d2632fa34f038faa8f566c3de6978141bfcf3fc6128", + "sha256:4109ab15faf2dcf89646330a4f0a6584410d7134418fae0814858cab4ab76347", + "sha256:77d0c4b68d1409719f7bc023719b1f1a066e48f270bcfedb700b342523b191be", + "sha256:966a59f59b57da0cbea0b9d0e59bae0d61e631b5cd0a336982e50705dfaf37a5", + "sha256:b6bd5ba1443f2c7d47fa9f4e1257e7e32e00f452a251b5955fa2ba03c032c11d" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-securityfoundation": { + "hashes": [ + "sha256:b37b2ebc737cf79dece2afadaeb1a93a2a1346280f38ffe4baa7681a9c3298ce", + "sha256:f7518fa4be99e4dac5c967fcf190777fc54f6c9f1e1917222f7d3f073ad19d7f" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-securityinterface": { + "hashes": [ + "sha256:7aae7ca82bad629ef620f99b5c696bd011bec5354d29c933715dc49e9a19536b", + "sha256:da76ffd44a26cf56a194cbc02bf28ef71753ad8ce2beb69a1281fa71d6f6e246", + "sha256:e240be5bd5de8783bd98a36018a51a104a267459ce527af8b28b22f66ee299ce" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-servicemanagement": { + "hashes": [ + "sha256:9fff8afbcb69c5509485c9df457b79ee7c79850e9099964458f5fc921a4f3b8f", + "sha256:f3106b96347c7bf60045ffaee917235442cd1d9254a03e10f9bc648ccbbc3b55" + ], + "markers": "platform_release >= '10.0'", + "version": "==7.3" + }, + "pyobjc-framework-social": { + "hashes": [ + "sha256:ba03559d4e6837e3454440011b1310b4f9f127faf7bb111f00b6572db8325770", + "sha256:bc6f5e1566ae47d2083d9dc9d0903210b934e5abdc81a211f10ff0fa05df1e0d" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-soundanalysis": { + "hashes": [ + "sha256:702cd6a3ff022370421182244161310551fe4927aea20b89f66615c7abc859eb", + "sha256:8c29f61010a53b2da7a9f394fc52618be1c3f30e4a2359958a574fbd4705ab31" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-speech": { + "hashes": [ + "sha256:467320a7dd6e2eb3328c61c106bc41971e256feeed523d42895eee69a08f3fa0", + "sha256:9c6ef27d8381a065e43c23101c24d23d4f2a3d1ae62ee8afd5d36de1781f3e64", + "sha256:da52b8860375108807604ca947ede123123a07b70cf0ee063728233ba57cfb77" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-spritekit": { + "hashes": [ + "sha256:0a6a6a0821e8eacf56f847a1b68c62db6484b37588a84677aca44e2a41c39c67", + "sha256:1d0d7afa295d8926b2b8bd69f700b9039c35ac95323c1b3cc5023d312d60ec6f", + "sha256:b47beedfd4f15a517b0f162ccf752d1367c24190e89239da961e8681a6f8a35c" + ], + "markers": "platform_release >= '13.0'", + "version": "==7.3" + }, + "pyobjc-framework-storekit": { + "hashes": [ + "sha256:1980195a5f4ab6277eb4a52e7ad0995af613c0cd4e13e43f1435f567c1a3ec37", + "sha256:4e77ef9da46a12bc43294a053853b53c3dd026f68b2df6e779bca13ca80a2b13", + "sha256:b9542b8a2a3ef7feb27ef6de7819b0657ec51db78235a5004f7d1444c0f19f56" + ], + "markers": "platform_release >= '11.0'", + "version": "==7.3" + }, + "pyobjc-framework-syncservices": { + "hashes": [ + "sha256:85d7519646d0faaee9b188d7f733d7629f292043eb1e37a840b1e3f785e13884", + "sha256:e63bba4e855d1683d249017fbbbb09a8699f9258f3214014aa3ba4341506e165", + "sha256:efef2c69b1dc0c9d558ee04e161dc937e02329a2451f002d3455b21ea1da11d3" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-systemconfiguration": { + "hashes": [ + "sha256:05293ef0a358fbefd41d4470a98c7c08f70ace3d09245b7c7370228d8068b328", + "sha256:92cbe14d9efcf1c52328ab1ba4cc359879c22e2f390179ec4713af176bc19dc6", + "sha256:c5b5e9d852a15165507a46b8c8974e6d99aff3d1edda4d77443530b604adb520" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "pyobjc-framework-systemextensions": { + "hashes": [ + "sha256:85810b03a7b1a4034bb0cd39eac5d0d38be7e602aa5805759944972bd50ce44d", + "sha256:d175f0fba9a571af78c333285f5b1cd310e83453dc018ae5663adcd53aef4d0d", + "sha256:d45297f24cf411d62367c706d080b594620359195eb623bd3f9ea523dfb79b54" + ], + "markers": "platform_release >= '19.0'", + "version": "==7.3" + }, + "pyobjc-framework-uniformtypeidentifiers": { + "hashes": [ + "sha256:62f043d566b3bf37b8324c98a6ae4b449b523cb3027d17eb5d2d8c4ce119f99c", + "sha256:f827ca61d5dcd82343178d1d6a6a5e9be8f721f51a4feba4c3a3a39afaa674d5" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-usernotifications": { + "hashes": [ + "sha256:40f60d4d0eb575e5d23d3d0bb5fcbdf444cf80ce91f5235c634e336416f91934", + "sha256:814891723e45c380fa4d619bc77b23f8d3b846ddf4059488b2424d8b085e9105", + "sha256:88a74333013bd921af44d11211c1a6198f66add2ac506e6ce4b5c09991f3f024" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-usernotificationsui": { + "hashes": [ + "sha256:02b639f06d0a394b4fd45068c6b74250f1033049d74f1a2b2533822aa114605b", + "sha256:36b17214c55bd38988c9f039029a4faf49c15071ffc586664474a2c8190c1f2c" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-videosubscriberaccount": { + "hashes": [ + "sha256:0dddf8bbfe70e1fd1e5ef4d29fff097c00f33357807a958676d3b52944eaebfa", + "sha256:deef5975537cce391915f93434b5d67b4788f08e3e91de802c48966b22643a52" + ], + "markers": "platform_release >= '18.0'", + "version": "==7.3" + }, + "pyobjc-framework-videotoolbox": { + "hashes": [ + "sha256:326fe057c65ec8df3198488e4e5250e0f6a9ab7fa2b0a5378ab6137f4377a47e", + "sha256:8dd4dae4c34085ea8bbcf65ea63358859f5621c55ac7db9ab37d6c45719d117d", + "sha256:e32eb1374dd42f4dc8d8bddb7f7f48dde0d7e1fde7181effdf15df8144b85c8e" + ], + "markers": "platform_release >= '12.0'", + "version": "==7.3" + }, + "pyobjc-framework-virtualization": { + "hashes": [ + "sha256:195fda568a0eebac87aa515232f2db765845c74daf903774616acbe8cb61263e", + "sha256:57f8ec5386f063d281a2c235cf1f1ef5181f2376cd53bd484018e50b4dcf2eb8", + "sha256:5e7b183ee22c914fc203def08abcab74daab0bebbd6f0cfc53251321dffc2f07" + ], + "markers": "platform_release >= '20.0'", + "version": "==7.3" + }, + "pyobjc-framework-vision": { + "hashes": [ + "sha256:09b1f55b731aaf3cad68a27b47c3bd93d2c88d8cf16d0c0157dd51151f5f0bbd", + "sha256:a81ac37e5f4c89d56046b9c551d16d16d0fcfe077678d0f2bd5bf62f418d00f0", + "sha256:cab1fdf6b02a1767646cf6353a118c0fa5d420fca4ab3904ce5054332f59f424" + ], + "markers": "platform_release >= '17.0'", + "version": "==7.3" + }, + "pyobjc-framework-webkit": { + "hashes": [ + "sha256:89e0fcc10eb09e4203b1ace02808ae9b1882b6c8a55bbfaff20213e2a62ce974", + "sha256:bec3a985c0f5e4263d6e28e2c551c1b5ec7b63950e0e3cb5409abdbf61f11f01", + "sha256:cd388df8fde96db724a42745395998b6d5a98740fb29bac95f76884e2fa6bf27" + ], + "markers": "python_version >= '3.6'", + "version": "==7.3" + }, + "requests": { + "hashes": [ + "sha256:6c1246513ecd5ecd4528a0906f910e8f0f9c6b8ec72030dc9fd154dc1a6efd24", + "sha256:b8aa58f8cf793ffd8782d3d8cb19e66ef36f7aba4353eec859e74678b01b07a7" + ], + "index": "pypi", + "version": "==2.26.0" + }, + "selenium": { + "hashes": [ + "sha256:2d7131d7bc5a5b99a2d9b04aaf2612c411b03b8ca1b1ee8d3de5845a9be2cb3c", + "sha256:deaf32b60ad91a4611b98d8002757f29e6f2c2d5fcaf202e1c9ad06d6772300d" + ], + "index": "pypi", + "version": "==3.141.0" + }, + "urllib3": { + "hashes": [ + "sha256:39fb8672126159acb139a7718dd10806104dec1e2f0f6c88aab05d17df10c8d4", + "sha256:f57b4c16c62fa2760b7e3d97c35b255512fb6b59a259730f36ba32ce9f8e342f" + ], + "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4' and python_version < '4'", + "version": "==1.26.6" + } + }, + "develop": {} +} diff --git a/alarm.mp3 b/alarm.mp3 new file mode 100644 index 0000000..97af76e Binary files /dev/null and b/alarm.mp3 differ diff --git a/known_bikes b/known_bikes new file mode 100644 index 0000000..62e4209 --- /dev/null +++ b/known_bikes @@ -0,0 +1,3 @@ +Hybride ASX Essential 130 +Hybride ASX Essential 160 +E-Riot Trail CF Advanced (Green/Black) diff --git a/main.py b/main.py new file mode 100644 index 0000000..3aefcac --- /dev/null +++ b/main.py @@ -0,0 +1,88 @@ +import re +import sys +from datetime import datetime +from time import sleep + +# from playsound import playsound +from requests import post +from selenium import webdriver +from selenium.webdriver.chrome.options import Options +from selenium.webdriver.common.keys import Keys + + +def main(): + + wanted_bikes = read_bike_file('wanted_bikes') + known_bikes = read_bike_file('known_bikes') + + chrome_options = Options() + chrome_options.add_argument("--headless") + chrome_options.add_argument("--disable-gpu") + driver = webdriver.Chrome(options=chrome_options) + driver.get('https://telekom.company-bike.com') + pw = driver.find_element_by_id('password') + pw.send_keys("#Magenta-only") + pw.send_keys(Keys.RETURN) + driver.get('https://telekom.company-bike.com/shop?filter=1&type=Pedelec&groups=MTB/Cross&fed=1') + + bikes = driver.find_elements_by_css_selector('div.product-info > h4') + bikes.pop() + + print(f'Found {len(bikes)} bikes.') + + check_links = [] + + for bike in bikes: + if bike.text in known_bikes: + if bike.text in wanted_bikes: + check_links.append(bike.find_element_by_css_selector('a').get_property('href')) + else: + print(f'{bike.text} known but not wanted.') + else: + alert(f'Unknown bike found: {bike.text}!') + + for link in check_links: + driver.get(link) + name = driver.find_element_by_css_selector('h1.mb-0') + print(f'Checking {name.text}:') + sizes = driver.find_elements_by_css_selector('div.size-list-wrapper > ul > li > div > div > h3') + for size in sizes: + if size.text != 'L': + print(f'Not caring for size {size.text}.') + continue + availability = size.find_element_by_xpath('..').find_element_by_css_selector('span').get_attribute("class") + availability = re.search(r'ado-(?!light)(\w+)-bulb', availability) + if not availability: + alert(f'Error in availability check for {name.text} in size {size.text}') + continue + availability = availability.group(1) + print(f'Availability of size {size.text}: {availability}') + if availability != 'red': + alert(f'We got availability for {name.text} in size {size.text}!') + driver.close() + +def read_bike_file(filename): + with open(filename, 'r') as bike_file: + return bike_file.read().splitlines() + +def alert(text = 'Alarm!'): + print(text) + url = "https://hass.schnur.cloud/api/services/notify/mobile_app_benes_iphone" + headers = { + "Authorization": "Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiI3MmQzZjA3YzA3NTg0MWU5YThmNzYxNjg1YzJjYzFmOCIsImlhdCI6MTYzMDQ4MDEyNSwiZXhwIjoxOTQ1ODQwMTI1fQ.DoyyMdjGlzavcLIjWXKk3Oqp1PgQQj0_DrbCzYNsLIE", + "content-type": "application/json", + } + data = f'{{"message": "{text}"}}' + post(url, data=data, headers=headers) + # playsound('alarm.mp3') + +alert('Starting Telekom Bike Checker...') +try: + while(True): + print(f'{datetime.now().strftime("%X")}: Starting new check.') + main() + print('Sleeping for 15 minutes...') + sleep(60*15) + print('Ihr wollt den selben Song nochmal? Okay, hier kommt der selbe Song nochmal!') +except: + alert(f'Error in Bike Checker! {sys.exc_info()}') diff --git a/wanted_bikes b/wanted_bikes new file mode 100644 index 0000000..ea39039 --- /dev/null +++ b/wanted_bikes @@ -0,0 +1,2 @@ +Hybride ASX Essential 160 +E-Riot Trail CF Advanced (Green/Black)