Wiki
Wiki

Research notes on every problem, and a library of the papers behind them. Built from the open erdos repository.

formal_source.json

json
{
  "source_html": "e820_claim64_comments.html",
  "project": "mathlib-v4.28.0",
  "source_bytes": 109932,
  "decoding": "lzstring 1.0.4 decompressFromBase64 after URL query decoding; exact recompression round trip modulo base64 padding",
  "scope": "Decoded public linked source; not built or mathematically reviewed.",
  "title": "Proposed Lean formalization of Coprime Power Differences",
  "public_comment": "https://www.erdosproblems.com/forum/thread/proof-claim:2e58a1390acd4e6b89490b881ad2c77a#post-7756",
  "accessed": "2026-09-05",
  "original_playground_url": "https://live.lean-lang.org/#project=mathlib-v4.28.0&codez=PQWgUAogTgJg9gZwBwCYAMBlAlgOwOYA2ApgHTECGOABICgEVCuhRIAZlsVQG5FQNzVwWVAC4ALIlQAyRSlQAsVFnCgBbcgSwAvcsKz8qgsACIAwnAAOULCokAFOAHceVACJYWLHkRwBjIgiMqAApoeAQqSzgAI2IVKgBiVDQAGgjyKF11ejgCAFddfgBueiIJJJBzdMyCEmEiAA8AShIwMAAhXPZhKnI8clwEbulZORIUJBI0KmAqAFkdUQ0orlHxyZIqKgxlKABPVihS4rVcKkOEXIJhBAAuME3QxCSyODwAfQBpN%2BJUx%2BR0F7vAAS3wkm3BEKCABVxMoiHEAIwkBGpExUAC8VAArGg0I17lQ%2Fs8GERuBDyRTKVTwUFpCo1FQUMj8Q9YE8AQRXm8fOkYG8YFhOFgEMoEKDqdTafCGQBmMapADqWDwPGELMJbP%2BaEBnPeXx%2BGrCz11ureIJ%2BBKJAP1wjeDXMv01z3NRE%2Bb0ofJtdvqDsN7O15tt9s2QTMUByBHSuyoSJQ%2BLAZl8Om8Oj0AiEVrQwAA3i4iCwEMkMLt6W04LkcDBC2YK7p8MkAEpwODXMsVmBFrCkojJea4ZJKlUZZJhiNRgC%2BZBkODAIGAYGs5mU3XmYiWrRw5BsCEqfj9WtaoAAhAl4lQAGLhuKZ4B5gtT2Rzw%2FgUKARUBwpEYvCEklaFRTBYVg2FQ9hOFArjuJ4hy%2BP4RipDA%2Ba4FgBQ4OEHpUFE5AMD4ijkD41wtGA57KFQAAG1CAKZEjKkXcABUZEfFQOCkVQwoiOIVAUIMZEANZUFRKAsRcPiiOxOhkXgPgwMEPEAHrUCAMaNMEKDyVQikIspmIIqRhRgPRpFAkxLFsWIEhcd0pHLFRMpCbkIliZZknSUE5BqRpylBFE7lKRiMakQSSjgSKwGkSgVCACZEPRUAAPBhpGETCbFsBwCFsDg%2FgYS2oksBW%2BFpmhlYROG3DhGI4lmdG6QSE4BAEFQaW4EQHZgOVlkypFVCMcxqToW1ZFGdQUXdQls7zs%2BikwhI5AwCowoMF%2BJTdEFDHGTcrE4HUQ7hKRfECSxDjIaJu0%2BTpVA%2BIB1gSMIcBkapCn%2BRsT5pV1GBEN0QTUOtgCohMp61vd031UDcmLZnxP1UAAPoynV8YA5ERUAAcjoJDOTJVCyUx6m%2BUE4WYw9ml%2BQi44TatzGsWVHEWbx%2FHUfQ9mif1pFo0EckE6k93Y4T2kBUECE4C2zUDYAgQSfY0LFRNGb4IM06nzgLvhwCo5j5OQi0vYxn3A1Qv3a0DIP0AAkjgQhBB8ANMfGoCTRxM1zQgC0cAg72KCRhlrRtW08Dt1lULZ9MOf1IUSGFnXkLF8VgKIWFkW5BMsRdlhXSIt1WadCVy2AL1AhbWs%2FX9Wwu%2Fr6IEtmywQ9DHVRcsCOAMBE0U%2FRzYdUAj4dxTXSMoyz4f41znnLL3HlEyTYDWwNxkU%2Bx5kyNxVm0%2F7dvIXWeDRUYidARIlQZBlUCBKHUVt%2FFT3y%2FwF3K6r6v5lQRl5zrBfF0bJvBDnLs4FbICKWF6esdcRAEEIbFF4OywItFapERpUAcOIag5FaaCTuN2PYxVk4CiFCKcCpFzAsUEGRAAgn5TmGkWKoKwAhHauD5KkVSNAvcAtLIUPjsfVqsJDhxFwW8GwKhPgW2zF9HW45giiD4eFKKb9ta4wxljIegAIIleq%2FYGmJJYEmjmSUQCh1pBHUXfTqeMsYGyURCHkBAcKaL1lpGGmNwr6OjALVQbwcC5BUASTYbwdGSK%2BpiZGwgSBLgcKCN4vi3hWDwKID6ksmLKC4Q4lQykhEEguqhYQUB7I3SgASAA7QYGwfQMlLSoPgg2uiCaQKOlQUQuDnFlPIKo3BHV1pV3yQojC0YlZEByRCFREhym%2BO1giTq%2BDe4Gy8SQfgrpiABMcFQVxrivItOyeQdUmxOllJgH09awyWYDKkb5fBgBiIkaYPGMTSNlSX5JwPkxAWDdGmZU5ZogYBWM7t4zZ7i%2B6NP2VsjxlSQwnL5DAc5QTlShKmVM5oSTKDhD5gCwJzt%2F6NNmVktpCzFlVNUWsp5qMpLBE%2BW8vZBztlBBxUPIZKN%2Fl8guMse54V7kIkqVABwVAADawyKVvFZbCoQ3THAAF0ejdFELSiEDQ8LdGGWSt4oySDKzKbS5hRA4RxHNu9exozlbCGjLwvWAighCO1iIy24ilXdDfiQRGqrzDqoUQSQAF%2BRFK5qkdhnDuEuyEYAS%2FJWhmQVV1Dh8JnXdE1T9bVur1r6rEetbqVBZFGr0SXTYLLjYsB9XEM2AMVUZTVdGIR8ZPWsO9RwTV4N%2BGCMLXxKNFsw1dSxlFcGniUYIATeKUQPEPUsO%2FMIBwcB%2FGMQDUWnVwjOoVv1RGg2Zsk1%2BrKSa2VY9wETzYuvZOpwzINUQjgRgJRUKkEzjm78Xx53AR7d9IN%2FbREF1%2BcEM2BrDmEwkVe8xazY3BC%2BE66NWaxikxnZRP2NENoISFrtAhLEWD9AIOEBgMEJJYtxvJEAKJGTQe5nB4pAA%2BR6W7W1xDEIcMZrpu18MPYI49Br6mdWHYo3YyjqldMeUOmNIgO1donRR1RWjTH5zcYMsjlSjEmK0brTEuirFkYiXY6JlTXFRTtSS7xgTxmBOCcChFtiomONiTOTYUAeTO3CMMq4EqoBvBVI%2Bg1HVDpiDKVDMpuSGhAZA3AW5lGykfEeRG%2FjTTwmtPaeCZZBtd2XWAnEiE9KmWiCc6kX5bK%2F4sF5RVUQwpKkefIFZ%2BoIrLOjw%2FlQAAquYcwzgojliKocC6sAhaLo4pUHLUB1ofp0enJh27FX%2BPwQeo9eqB0FwjRJ15Gkmn6gkISsdL637vogaZjKDtMqcKiN7WL5gDBCCXZULAGDcapG6uLDaU9l3pTXc7boODDIZyfPV71TqX7%2Brwy1kNbXtYRtkWd2jBizgrokNazDpQGNCI5qkcZhwWD1RQKkAA%2FG8IHbx3WbEyd5zEb3sOfAncUBLuSgvMq7qcs%2BKhuWVOFfhb1e6ukzjlV6s7ab4QWo1RdgjrWT3iPuyas16aydWs2Na7qq2x33bdS2%2BVuaQSnZ4RTvtVOiPXyxnd8tTOMX1pNkm5%2BqaFak8tVmrnXqYf%2BKMs1ynV3qfEaioNJpQRee%2Bo55O0mU0MJYSwDhM%2BW9hT6HdkNStzE6voevgxjXgutfC718NWj8bpccFHXzl1Q3nwnniGeS8St9xJGAMWUs%2BWqwPgUuNUAYBcGbgILsXQOF0JnyiLgHQygsBZBujkPL9RXbgSXSSMksQ1B3H0lQP%2B8JvDCCjPQEsNgkmW%2FpioHa%2FhO8gUUFQAAVtg7gGCx8gGbzYTa9Moi7cKtJMyBI8vtjIiPk89FXQj6CCwZSUUgiAEQiRQjRZJj70vRBb4YYApM4o4XLCeyKAHgiYIfTFLkACcpKiwYgggBQIAMPA62YCUwB8ASnUCIwAgkl%2Bm29ooym0xeBAIAbe7ATegw1gyYZER%2Bbw2YI%2BtMKgAiAB5%2BwAm%2BnUv%2B%2F%2BQBUBgGygBIpEcQAkaAQQABAA1JpLpI3tHKoPwJbsgbsDlr3rcFgTgSPuiCgOOLJNmB8AIpAXgVFLqF1FQj0EVEukBjjv1OHBcHEIYOpkQD4FgJEEYuEDggKOgb4N0LgF7LwGRPtJPOJCoIgN0EukVucEuJWIwASEhNUCAM7HgLPt0JoS0E%2BK0BYN4BeAMO9KHqeGeBALEK3u3nARlAgVkE1AAI65DqDIRdjhBBHTrBgV6H7v5UBNCADeBAAJ3UEYIV5xQ6RMJ17hz2j%2BK4CcASoZRsq5DLDZgV7rSAC4hEGl0UURHITOtA2DIDUHkZ1EEIUSUaUW5uRksg5gKtrFMNUdjF0UJhoJuFYGIASMjk0XaCkS0a6Kgt9kcYKG8JBIAAEEMqmO8xqijyUxnUIx6gJA5BTQsxnEBeWxokjKTxNQM0fIoy%2FirxjQNx506gOEvxLxPoAx9EkxqxB%2BVAkJ4x9ESJ0Jf%2BbxIM3y4IKglw%2FiOJBAEqiaCsGU7wly%2FK4UQQqJ5gaaJJRR6ori2k7xyOgACYSImjFQnUn%2FHcrFAMDKzvrkEoBvFRRTEVFkSgEDHClUG1HSj1E%2Bj2JtJvDtqdr4niidHay9GCJTDrTilvE6qPL5ExhQF%2FSVJUnBAgASL0RNAIkPHWI7EMo%2FHskNEkmpB7FEAHGAnHENRnHjKXHBBUkTLhBvAglMZdLBjrR9LMEwyWmPGOlonhSWl%2FTrGfGlIOnPH%2FGHFAlxlUAJmgl3I8REDRjhkTFTHKSwkRlRl0nvE4AbHpBHQhllL2ECziIlnZlv5UCRnxmVkFHwmtmmkWmVmYkQgqnjIqmCA0kKlkllK%2F7hI1lfHqizl1lpZh7h6EixGbTt4ICd7vRWA4SaHZEp7pZm6kRT5mYz5xFIKbn0jbk96aFzZkQsDj7OAqGeESC7ZkS2CHbzgvQD70jBC2DaznjhGAyeRCAQyABJhFQN0Z5HgWxj0RLifgAFKRogQ%2BIP68DvQmC8ij6pCv6zayIIWpBCDmCtAAACjKvJ5gvKdRaBnebwmgPAt0QQ%2F560gFG6wFwQoFOsVAEFUF2sP5cQ%2F5QgUwjJtpmwFFTK%2FFmOYA1F%2FF%2BxdFDFhJ3IvI3w%2FqzFYRbFRa2YnFQMPFAiuBWqgi2s8Q%2F5cUI%2BxpQql5Alw%2BeBmIWpnG6m9p%2FFqQrFu2qFYEu2mFsAclCuuwUqlgZSzlQFJAmhdoGaUlMlll45K82YalLlRcel2l3FkFQanFgAAEQRDIW2CpDilEXQVmLAyVLin8VD5CAwX2U9DZaZ7qWuUhXEltIeGbThhUBIWiAIX1mtVqVIWABhREPiOnFd4k6r4t7BhbyH5WUghc0IKk3sljjv1T4jflFYoBWBlaILNuiChqIERYIghf%2Bate%2FIpBAD6BCmmHebIGeeuReVud3ruY4gYBPmROERkAMR%2BdKfSPUZFY9f6v0fhjFQBUBb2qIP0RXoAJBEIEIFesSVvFQQMF2idwFlg%2BQQn1z1ykpseBkZCGxVglwQaNvkkZQgFe2%2BllJVo%2Bsx8SkYwCRi7VJhMNbgCAI%2BcAFhf5blw1wgnlLkONmknkTFzN6FrNWFZlJAGBhmiNG6T1VppNgW9pc11NDNm0oIVyoJmwFhTVLVCFfSrVKA8WUQKB1A1qCFAA5NQgbakFAH9q6k0nNU6kLaQNKhrfZqovUEhetBXrIkjRXgbRbUFVbaLbaBygMQbfbV0hStrG7c1frVQD1cxZiEEJbb6kNbzWzWNa1ZpMiFjjNfyhXjqsHYDRNe1bgDDelWrZlTzR5fzakIXeFLIrYCXSNbANhViaHUXZiI3eFBBU3c1YJs0pUsrbdEXYsQhdStSm6YHWUvUOiiDc1fektdQKIJwhiBtZnTHV7XHWhaXbAEnSnerZwiincvUPqVQKDQPU0rlDPXPetaPeerHVwvHWvTAEnXGMiA2fCCiiydVe9C8VAFhK6EjYDbBuICkYFWxR%2FV%2FecT7aPSgKCcjk5W%2FdJqvbXeSvZD4KA87E9YDYAzVY4m8BWCdfcsKCPskJUnNSFdbWUvnaCQkngOBFNVA5Zeg%2B%2FSqZoaCeQJVdGEQ5gxQ%2BBKbQQA1Ukr3eNe1Y7drBPU7ZiCfU%2FXEOfYDZfcvdfXA3zevbbRNY%2FbPc%2FXaUynNZEHyD%2FY7VJWPG0LgErIgbwfwakekRoOqlVkQdDawcpJGdY5pOkj4OkkQbIcECwT4GfvY8AW7AAakDhFRGgJ%2BdJTKREI4G0T4Eg%2FngLHNOoKqeEDhD0UGuENqZ1DLIIgk1QOKR49jflXDeCOEJjNDe2bjTk%2BjeqaWedK2QUyTYfuEJGdk4UxzYmV3UrZWCkidXgaZqIASNDPRU1efUpvYo4j0wHDhHgVgKJOtSPYsRolqZBQiXU5U9Yh8ZsXWR0gseYDDUEHM7xVFNU2VaE34nVSvKIOECPtMyPnwts%2BUxMTDbxVJiQJpraMc6PpUirAgKIEpYMCPYMEQLNutNU0U2U%2BjbY%2Benc6C%2BWYTPRDhPRIC001iZsLU8U9k7CXC8U4THY0Uz0RCxUzC%2FQJImZRLeSMskQOimi8C75JiOEKi1UwS80%2BElYPgFiSS48uS5S%2Fi7CwS0ye4RSFA7BkQBA1idWcmWZoyiqS80EOK%2FwLSaIJc8EFKzgDKzhKIB47EpswQ1SAq7SZK7iS8yq2Utk6tSPorWCcYvi40%2Bi%2Bi6C0EFi%2FM5ayC62Xi2y5pAixMYsyi8EM69a7a7xQ69C7S5jISwbL88RRCOJp68ixU0EO68pBaw6wbMOa6KOUSdKxOfmOYaJAKmJn5NG5G5IkC0cvG0Joy3gKbhxPmdGOdW3pdVeddWgboGoHUFVqQZkjvnvgicfqfufqKaREIAE0E9RaoakogRwribJQHolTxZ5LFf9brHkyGOlXhSBNlZ1LlUlelTDd9Bq%2BSNDSQEO0XlkNi62ZjdZRMSfku1lcPuYLGyTaJedOTdhOoA1bfvlPoP%2BbkGBivHNbgC%2ByhC0SUtsZsNDD5fPd3Y1bdK4uc4Yl%2FWcwB90xCL0wxfPfQIuJUtDMJGM6B7y45ZFW6fJeGIpTyF5VcMEOEhRcGRSBRSMyRaHeEFIxM1h%2BCD3WUqVdMywP0TlQMQbJtQMUvUA97Sg77ZFgMTLGx8k1QIu8hYWJk6uxlQbGI7Nqtchzx7Nnx65QJ6qIpXPXtdM%2BJ%2BKee1J4RXJ5iGw1EqmycwWFxjByTV02h1QH07dOfVRwh6MyTVM9hxJR9WA2gzA8FZg9oya7cV0lPQx5tZCvCxSHcp3aFwWK85Fw5hW%2BIgZ7ItJ2u3GyUwW%2BirxfRPja2Z20u6lxEDe1B9SIfsl%2FQEZ7NnjZWel0MZiDCog28FE4Y7ExwKcyxxXiV%2Bs6okO%2BIpl80Pu1YIe3a9HRzTc7CSPnuyKge%2FVEe3ex5yjt4oNyOxh9yREB%2B58088UCW8yw5gK31001N%2FhDN%2BNxxTCTRb%2BeEKVSihSIfmN0ezl%2Bd%2Fl4Z1e8V0Swt5tSKoF%2BCNxqU0cg99jUd8O8N9l2dwTRd3EFd6Pjd5SKN5awD7l7Cbu8tyDxU8VVD0G8Wzy5SOG5l6d4j8EOV4V9e1y%2FN9SMw%2BYFVYm6OwSWOcc%2FLeSa6xCEuAwLoEKOqlib9za4dyj7N3a7Cej8Pv18UwT4L9d0zzm%2F10DydwD2L39y6xKJsJizz9N0N3z6D3vud3L5j80mcNj2G2exlSl5Vze8L3Y%2Fd%2Fz8PuD898b696Tw%2BlSOmeMv8TKk3prRSLj0T5VyLzV%2FL80xW1iQyWD8U173b7V%2FS9GMjumejro%2BlqOHVFGFVm2%2Fvob%2FvuftMKPkeAOyE%2BO66IEqgm8Lz1QFpRDbpcXzOxpYepUjqmlUb8uzJ1FGu7a3O1jkTVja4zb%2FX2lyTTMMj6r4gTc3e3ciwP88EDs8pHFH38d2r4P0JtjraPYXyE86PtL2rwGWo4yuMgX76ZtZRfEuCRD8TXgRN6vwP0e6N6f6j8e236e8szty4obxeyb%2Fb7hNPyOyqbn8Prtax2lopLYDfnfk5BgQso6%2BUiK%2FjhIf4v8tMAUlQBPyf5r2B0aBE3jwjHR4ByFRlCkENIQNs%2Bb1aatSVkwLVASwdX6ixVnZ6Vw44FZKtX1EBzNJOVdFdgfCK6CJHkdA%2BvuHFmySk4wBVCEH2XNKdlyul7dgY0ARK4VMqqQCAdFBJ5D8FiQWdaHwNbICDeoTAzEIoPUj9khB73M4FLS9q4lNCqQVkqZ3lLvATC3eKIJA3tKiB6UqQf0owwJDz9fOmjfxJow4rLVZsDJFDJSVjLUkWeoKKcCij3yuCyka1FDE6QVJKkae4oHVFMEU4k89SK1a9u%2FGXIR5%2B%2BWQPqMBnrYYE6g%2B5d9CoFkhxAooKgE8K2zyE4CGQMKSLP4l54RDf8cQWCtX1qF2tMY%2BQ%2BVpf3V4VNTSfSJoUSx%2FbtN9AcQWzkB3s5IcnOqHQYRhyoBxAGO7nLzAsXtDoo4SR7KKB0PeILlRWkJdMoCXGS%2F4suFHcEBpms7DI8ODnPTAGQmFwczgf2CzLPUqSZJnO4ISHAsRUDzCdhExBofczn7p0OEcAJflhH5ROJ4uqiZWIgHETj8I4krWfrr1WHwdiWCXAsn1zeE4tJEzQ5YbCQRFIjNB3XLpHUkLZHJe%2BaIpYV4LbJ4jymEfCXlCKZTrCYAAJVolsLRJ9JiR2LXYQCK6QsZIWGfcEYyPREEjni2w9kQiJva1CHelIGTHnzCZkkriCKFnpkXZ67BYkHUf4ZSDuRYhtYfZekfKxJHojMQywsngt1ZL%2BlNwC%2FS4N90MT8BKGMYCXmwD%2FjkpRhiohYgADZ4RNzB1l0OjpoiuhZZS1gyPmYCiMR5IV%2BiqV8TGifupoqhhaK7AEBrRfJKkFzw5F2tnRZw10Tc3dFtkymXoqCj6O452jXWuPN0WcJRKEip6j2CUBTyp64kRyuJOnuZwZ4gpJRiAaUchFlES8HKTKVkqICxBrd7BaibMX5BRHqij2XQu%2FvrxmE9cUsGicESC1aE3No6sY31r5FRGTi5u5VBbsMiqGrdig7zTbr8O25DjNgMYuIGU1gqND1RDracWiL9bnozxvkAcUuOpAbivmwgbcUyw94TEZxiI2Er2NfFIjEyEvansmyirVjEutY1noKAbEw9cen488Z4J5HQk%2BkSPFQAuMt7LCmhwg30RCBLHRhfxFYlNoqzTZXIax4SKUWz1AkS97BmE2nthJJLViGOUEsYnKReYK9yQQfG1vuKUgITQeSE48b5B1F%2BiLBQ7Nbjt1%2F5kQiCcQGYIUImJEAoCeIEocVDgBCgEI0kUiOKXQAAFOoKgUoewLCYF8qh%2BacThqWzAND8MWdJYqk08iz09UUwTlofn5HcD8m6IvEWxI7bLCZg6ADMeVWH6j9rmR7SfvBKL6Ljde8%2FL4T8O4g%2BSUhBJFnu1XQAgibmk%2FSKf2LOHLNCJIEjns2MZQF9fE8Eb0qcWaI78R%2BZSdAOQwP7VM4g9ESKS6JUgWT6Ark3XsjgDE8pHx7wE2ASBzFJj4p9XMUaKL8TijSO0YRKTKNiRxAFROYhyb2QLHoiDY5Q%2F%2BJUNCnVDoSg0nsaNOTGSthpg4ploJKhDpC18lYdaO4DIj0FGQjBFgmwSngwJsC%2BlWRGK1SBtBGghBdPjMFIJRQBSlBQSK9QZAoECSIVHSeqSSbGS9mykfSQZR1QNDIpNLB1lZI1FBA2guTSpCfjwKyI5qhsC6GcLaCpB9m7Iybr5LtbcjaJqneQbCxQnOSiWdyFQLFPKk3MwZfkmciK2hFEz0UfSAoe8QCmL97xnEV0OClQjdThMymBoZMRuC7N9p%2FU9AO1SBHidPJdrbyRCMpmrNAO6kRSHUFUCHRnY60KxioGYIwBGgwASVqrMaAngoowk4AGJMySTEjSskGAO1TlkND0q0kRuOa04lqz2R44hqAN1CnlMsSezOyS0Ixka9ICjyXipjCtk3jmOpsiED0NfbUBpIAw8EIh36YoY7hYwxBg1FYj3JGOmIljjgE0COjIyas4aYAAMiGTtxM2CMzvhzMh2VnKqEs8SAGUfWrt1USrIopXkvsXGOCBWzG5hYuYraLJCzNeZHbGAF3OOQownmi1IOZSChHVyukpCfoixL5hWsc2LEu2QeKEyI5mRLHEWcxOKZzzWJnsmHhCFPFOim5u8qFheLXlOy3%2BV%2FfOVoKZQrjppa49bh83vH1TR5ZST%2BgUG1jhBe%2BEEveUe1BlYDUJ581KZlPOIeAriNKIMd5jH69zD8Pc94RigHkvMh5FIEeUvNOaU9kIL8%2FNpPOkggtlIb89BVa2PnA82hEvaOq%2FMPmfyP5LclCTS0KazysFh8zOXgpl7eif5yOWLDAHqDUICwqQBrhEyDGWiIxbKG0RSCSSR8dxv8pBeY2%2B5c9iFq80hVPNIWc08ugLahfbOoUOSt54IAolAVO65suh9kzeXl29ktS7ZZ8tCSwwmFlik2lwR%2BamFugTMXIBEusURPVT9wbEkSIZjEkD5%2BQipfI4aWWU0VxSp5Rbaqdj3Sy3kl0KoVpHW02lDy7kt5daDDOQrwzEZcQZGTbLwK990Zzs7Fq7JtkiSPZmSy3p3SLGmscI8SuGUFQRm3RklKMrlukocmusVBCcspUA0%2Fr4A%2BskMxSDEmqVUKj5yio%2BctJvELdDBFSuSiFRaUqgTW4bE%2FNJCaWuUxlbS7GJ0pyXeK9Fvin2Te39mutDB4yW8mI2kjuCyk5shqNmypbuylpKy2AY0t85zLgg7SiYY0HEEGK4p%2FslppSGRyW1dBjiCZak1OUhST5bQ1soUrbkUh0JZigkuWPIn%2FjJy0bTBuEq7w7lFS9GDgEGQ5m9TiJmwdLHrLEkaK7RZ%2BOIK2x9B%2F5ACHbSAjiqoD4rzAhKoAu1US4Asflw07Fad14H9kZYpIlOTMyWW6L8lfMmiRyVxH8yxpQozYPnzOLaSg6HMqETvQWKPIeVwYNUS5PRH5joJqnTsmkwZVxTBRLytlfaBQDic%2ByKqhEqqOAAIhQR14zVeSF%2B56qqmBqwkdIst5GzjVKEwcor02D%2BlaR5gPyuBARQSruxWom1ZAWNUtSNV%2BonQDTxBQKi2VmEZ2CqNGnOSKphqgNYsMNIOiz5dyUltGqVVHIJMJAAAOwIhUASAPNeMGTWYhxkY5Ejv6U2G2gYAAATldapqE1bJDNfatBHCksw1an%2BUF3MwGwGiPpHAM0SIHtFggaxN%2FF3KNV4gOZgzaJGos7X%2F0%2BuCIXuRpDHWNAyiRMNtVWVcWiYJQzCt0tFn5QkT06lmKkMKylnfF%2FSPg5teU2sFeDThCw%2BZhIoP4yqYJGfeVcmMtV4yJeh%2BJyfytfV%2Bqx1gajteCBBVkTFK9PScuIB9A6qUVDipKY2OfHR0v1wMxtdjLfx%2FrORpqhlvaVqkOBvuuPElf%2BvGntSJknU9NhKPsXAS%2BpZSSNRIHDWoosRzZYAMmqPHNCjZjG32f90FWHMnBYTMta6FGQTqN1KmfjSJkE2z0pqM6ljAhvHVdC1ViEm1bjMqmsqYRqiP5nXLFlIbeVzK5pmeuBFvAsSyOfUW0m%2B6v0t%2BZxHfn813V5TOeD6yTT6Jk1sbclb6yqU0lEDu9GJxZBjS1LVGOa0myzSSCGI8XR08NAPR9cqqtXLqZixi3%2BYElGQZTmieHFUk0RNb2DxkbMujurTkDtUVNszaKepvIKaatN16nwbpt3EH9SlvnCpUjK6U99Aem87JV4s5V%2FLTundU5sMwf52b2hcm%2FLQCt9FAbzFEQysThPeDyZ%2BUgE8JJOpUxNSYyTa%2BTSyufUrCqZkRcPGeCBDpBGyPBdVPwT3KZxBJpEU6SITEISEpChpVxvIQ%2BDqTe8bwBGUgz2LjJ5CF6OoRCDK2JKcI4UD4A8puZ3SptNQU7d0LaahzK0EcqOY5xjk2j0O8cxiBM0YjTD1MmmTKDpltDKADMfWRiA63ChdNzM0MaERDlo2OY5mUOvOQvPmRYkKU3EELGgD03aCgGV27yhmg5kJZ7lvnEKj5W%2B7jaaNDw1RB8FpkkZ3ii8pTV0g%2BA%2BDst9c%2B7Xa2WaFygp%2FKTnQ%2FLEUoK4lJNGZe%2FSu0wwL0ILd7UezumELCe8u8rRExhhva2y6u6Hp6PPSMQ5FimwZUFRCrU6MOipCwHTvmRC4UdSkIMXeKeaut7%2BfOspCG2bIfaTd%2B861c8Tu0i7ZxhMRSJCR%2B0pqFiY9H3Ybptam7yFgxADcjgL66Y%2BNXqqmUyOHkLaqQqa6Et2rlK9r%2B1rRbOmPTrWzCUiPu7rG%2FPj0h7hBK66cTXsREzBTdAyniUygHVRB%2BQgocVVTMNT7yqAucvEEGJSl7FUEw%2BvXvgHsQsB3dFgndXyinI%2Bgy9qieQgbHD1chbtrwP0oVp02xJ7QM%2BikeyVND2gr1gerkKgh70nrnFKzWsmIBBLz7FgrwV1ggrb2MoZdwgb7ncmX5jind6KOdiNyMxyL3irurcRPtLYfcnm33EeYJPwS3kcEhWfQuGEMJ3kTBuAHHBYTaTexrCdMQBN0HsLcRq8t1WSU%2BXEALhV01QEoL4VbxkRswAOKgIADICVIPEAABq6LccOduIZ9r%2FEVu3XUEBYOkDK%2B5lGkOlTiCyImDTcAocpDApYkT8IhqgGIYN12tRJnUJ7eUt10UlmDVrNXYodvblUQ5KEOQ1QA%2FZroiGvDfAMbF%2FYnVAdIKFg1MKQxgdeGZSJg3Slh3hAmDLxA4j5ROHy5ad6OrhlcIyg3CUOUY%2B4TjtECcA5660Nw2oHqDh0hEEgUQ00iiPkAYjMuOI8TpdicBEjUqZI7EYyjnCwjaUaXZwGoydRMj3HFg5kbCOcJpdwdSIxHR10vauAx9ZanEDMnQ7yQV9S7REw9VUBrUogFg60ZUB0NvEI5HIwYcGPg5PdKrLCutA0NRRMj3WSPWiiMosGoo8QNTorrUNcBmmc1IjhcldB7Gvd7RGfeHEW6PNlKV2izVm0QVMHBdmahIHwZM5BU9jAZHo2kcQWcBDMsxlg2U3mM86idS8iZuHQNjUS3DPAL%2BtseCBzVwTzsNlCTpdThHVGVIAIdQEGPKcBjUJmRlp19QwmukMSGHp%2Ft5C4mjKvB4BlGs4DmINDixp40AxeO4nsTrRxEzRpSnTHisn9Z2BZqBPS6mDbpFY1zEtaYgNDyzXnZLWCw8mUinJ0QFXMQV7lkF3QOXbIfkO3reKokzXWqKCBlHG5Mh5CmCfZMSBOAWhlU61NdYbHvE6ZJnXqYMOuIqjz9YKp3ml28A5T2sFQ1Tq2NBANDquhQ0aa66w8tdsMhozDGYOGmaFhLVMeeiFMJ6z5byy3Zg2t2NcboqndzA7s9wenndrrYA98ypAe62VLAT%2Bhk2VM0LMjwpe2RGdr0%2FyQVHpf%2BZWf7WJoA8ZG%2BsU4tdbi7mZYRlUBTuCyynzG1CR0%2BIqxJQGlyp4C8FeGjzoBgANYBAvgCTzbbU8455eJ7AwNWFTgsgdA1AE4BZAEAqYBACwF2BroOGuQbwHuASQCgUIaEYQGAG2x1AqelAHqRvAQCEQDIPgDINyHyzCBv0RB8COHFyh1QIgPAPQApIr2Yhn8OBJdghQERYJUgS6aJFNnAhwH%2FApCfcwgFoKcADopSUiJkYACkdfQAJXAEQUUuoHqiYJkKCFEyOEHn5VUwBwFoiwInWM4WEBBIUMLFjGwSARiJwSsM4CmgKpmgjeUiBdFrDPn8AySA866CiUIBv0kFxxNBbvKkRugcUAABooWzM0lqgJhaXa0W8LdUWgiBeISQRMDuZqPKRFktkqqA4A%2BILRYz4IDdedhBwi%2FgSBBBaL4sQIuNDAAhFqA%2FVUmCYAbBQhzoL5tdO%2Beihfn6oFWP8y9PDiPnbQvFufHZdL4wNYalSQun9Ur7iDWBBFDFP%2F2Tgk8IKQQZK6kDMs9VrlGVrEusezCZHZE1yoIKIPwqcLlI0MbK00ZUvIVaL44cxBVeaqMGorUg3Q%2BB2arPteh1AJCkYfwC%2Bc9DaYf9lYZA7tHmONyCEHcOhg0cwGs2FquYCQq2H7DTVVahvCONRBpmo%2FYZGleAj%2FNMQ619K%2FK19SfUIscKBa5KtUQIUk4wEdaOlQr2VXUrG1ivfJ2WoV7RAAFjardYkAV7JWp1n2gybKQpErrXSBCrUYk5UBHrrVqgDhYr15XKAhmV66I3evA3lOwdP6xpyfNjltOIN6ZlhdH65WzgiNzeM5uDqqcsbQnC681VBvA27jyxYy2cCIsm1PaQDRwT4LEbgRLByHHVDdY2tc2oAzQcKWyuyzAiUmcUA60ENQqIW2VicbWMMjMA%2FWMq5Vpm09cFs9bTFCtvzKQEcHDaG6XVgW3puezBBhkeOAJLeaCHbUlbAt4QT0eBx6bmOXDLEp2KWuPztrKRemxHFmz0RX84ENW33IGq4kfBq1YOx7cQB0pKdrlRwT%2FSWvDH5qRcmOyldZKhc%2BbycVqhShNbpZ88I%2BXQvocyOAAywmCAYWIgqQYuyDYwjvQnAoRJdEqRQ5kII7LY3zi8c0YpITWIK3Y8pRwDZ3ggWAZo9QEyPn0NTylku3VeCC%2B3mbZwYQSikyTpY1A5gMqHZgpDMdKjnAYnYuAMDVlowjKXY3AFdApQ5Zcdp1HMtSAAwpUvqXbAAHlE0c%2B8SGEaxLRAdavRsI1cGoScAjz5tbjqvco7r3%2BAVVbe88d3vm3vhKSE%2B%2FQzjo35D7vqC6D2F85Op97PAbdhSE6NzKjNxtvo2%2Ff4DSQKbANwTuda2oTUwsKMJmSR2tNh3pOwOSY8HINtu3lxRDouUzLHJkomjppkgOKkcE43vw1pwW9907EYOCsJ1rhGdY4etHBbgR9LPnVzuCgiA%2BthwyvcgRlIGUYRhwGvelS%2F2t7O9ve10AQewPfUx9wuANXPvvQr7%2BxK45UeUeIL0UxdtavI%2Fqsjp%2F%2B3wqVDxEFo4AR8EACvdMhBRBkk6nABlJDCQyp1EFjyYuyrb9sw31bmIBlJhZCcT31bdjm%2FI4%2BceuP3Hnj3wbbR8dQx%2FHrmtlYv21jBPvbjN0JylfCc2Pgg%2BT8e2re%2FHInhki%2FNx%2B6ErCBTankEBpwcXxIGsLAzQaVH0b%2FooBKHewhwKceqdFy8OZa%2FlJwGRCEOBqQz90rWf5QOBkQVxxfmI8UgXAoAOd%2FKNwBkdNU1YVSLa9%2FdUeb31GADvPgAPwigODH19CBzo64TQPIHXCeB1AEQcdGsTKD%2B%2FWrHvva1%2BgutaONQhiDCAfn795zW88QXqB5TPQKII%2FQlus31Oujkm2NR1QE2qkMPB%2B5896M%2BBqEPgP%2Bj4B6cB3HmjF%2FwEQBYufOEIXNuW2rEfpkusn%2BTDI00hwhROynqtsJ8pHR0FH8wRRkjutEyOQufbDLopzi%2BIfXIghZDooxk0yOABDIkqaMpZgF9lwBlW5eFOTavKB5kzJqcV6cIxWqY2udyfD3rHZL1uUvro0cvtXfkXV0a6dXImwjPgEZImiYdQo%2BQKpYbRlSDJgoWldHDFycYvl0O%2BQwzmZ1UiuBXGZQRR8uKPeicVPjX4LwFfq7KTYjgn5Txl2G7GDD2Q3cbs15SB1Rv2rXZyFyOKkTZ4TXECQ2oC64NaUvJaAzz13JRGeUa%2FX9%2BgN7yzQcGmqAwOUHL0%2Bx3iU1Hhz2k4A%2Fue3OgkJNs52fa4SX3r7Ep93Wg%2Bft%2FOG3YOV1o7ZoevKXDVz5BqqCTrgRfDlwzHVADapUhMkzCtcx2IPXRxXW7OrpLAHOTaxwI%2ByV%2FC7RhvDrpa0KQgYmjnoomBi59N4pYI3fUhX6gzu10XMYcnvKjx7jsGUk4BmD91KWUQFECPNM3X3WJW4T%2Fc3v77X9a51%2B8B8EmHUUsEVvbEIA0KMAOA5weCxIB8APsNspEDAakFkviw7gpEeINmBktUBDL60boJhYAtcABEmIWS8AAr12M%2BkO0zl7R%2BHsV6%2F4UavEIoTAQ8eUi529D9yEI9BBDLFezU7rB1SvWZOcUcu2m61fKfBDmwIq90FKsk3eP0MBj1Db8icAmrfkQyzMA4%2BsQhAPHwy4x%2BOlHIBPEgOyi8ruTzDTbL54IJknFeZHJX0rqG9ymUhkfTPGfCz9x748RwbPhnsyNQD6QOeCdlSNz3xZVdKU66hlz61wA34Je5aeHF4%2Fc57etKrj1De0p%2B%2FLc%2BuwjBXjfq2IRDkMQx5ozYO3aCq5eOGPDJqtcgJAfNJkBnpj5kcAAphCICoBeemUUrmV8O82AVglAEYjFLMG%2BFuOMvZb71ypUA%2Bx8bYEgKC84H2w0f5LG2cOLh9vz4fCPOT0iGJ9sLdBqYBl9jyxHQhWXvmZ3iz2dCCDo60LEcMT7LCfDUUJPBHrCGKBEvBAZPTRtjAp%2BMnqfBEmp0Txp94%2FmfOoWn5CtcsMv6ewvmIYz8pDhiFWgg1H6H7p9h99fbPCPkz1FDM%2BGf55Ly5HO98I%2B%2FfKjH1zgNV8STJJp%2BuSHcOY1iiFAUMvO24U6ZihM%2FEUOSQSbObXToHtoFdoAWRE28bndAW5nc4NfwveWBL%2B58DEecyL8AjCQgUiMRbuAbnKwh0ByFNnbSlAYEDYdJNJ%2FY%2FrZ0IpEPXwb9u%2FixUgUCLwGRAbB%2BRX8NForhd6KiHe7fuFkK95b4t7mhLbKD0Br9EjSf8qUVygf1W0RBAnaMV36NQJuvaxaru1ja7ENEA4X7rdfFK0Tfytg%2BVbIFtq%2FZajb4%2FM%2FE9hIZFFdZQ%2BdPrSvT5Daz9Y%2FsLEQEz8j4pAl%2FibZfzH7VYM%2BqWa%2FB%2BE0y1ZSsO%2FC%2FsJPP136qvTy72H3imk%2BzEouxkbjNyv7NmZcpFCjM6sh4D8M8GwNGC1Dm8tQFs83Wqs2G29LYJDpYnCmD%2BXwIAOcIQcslYIwtQCXQ7f9zEw74VDfaoVYY%2FfX62VlZT8QWjXsiey1QF69v%2FK%2FQQTr2Uh6rL%2FyYEyeZjjPMTRanxSQSIdnxQxmOUSBiFAjZHGK8GHa1xPcPoG9z5B2He904cghTPQLk93eIUCMocczEQDsOUt0mcv3AEjQDl8TEyAY2HO9xlxrTa9gs0xAOLHRVFINgGgsFZCQAQhrcaDX0A%2FLIBEdgJAG%2F38AhZZhnE50qbT2CA0fUv0Mxm%2Fd%2Fyr82%2FcwCatHnTYE69kKVHxKtG%2FJGwsxarKxwat2%2FTQXACDlBu3%2Ft%2BOX1HucrjboEAAiojToUsa1GQdYXZWE9VivEhzptEABnR1Qn%2FNUCTpvEHp3aouAqF3fo6TA4hCocvEBB4AeA6vlAoUbK%2F2Q5AA6vmSZQYGQJh99ApQNb8jA1QP8F5TUGB0DrlCvRqslAwwJACcg2IOWoK8KRnPpOjaBx6NAZSQN45ag3eyTorSdUHSwZAByC4DnAQBCWpvzMQJAAR%2FeJhfMggkBHQ9n%2FHQO0D0fMvyKCK%2FCe1KDYbdv3UDbLOQOL40gjHwyDK%2FLILKCBEOH2x9mPNRUFNUfdYKb8LMTQJx9zdT2CaoV7cwM6NrA%2B%2FS%2FtgxAS1q8%2Bndt1cpcvawMqR6vIBka9%2FNKhwcNWvSAMGAafVJCQDmOa1BBw8pV1GKBOxSl0yR4A4tyex0oF7EbcoQ9s1f1fA6hEFYKQXhzfQOAnoHGwVAL8HaowrGlyfNxgnC1VpFOLC3iQFfJJGgC0kbHWYUuAuOwiCavPw02oxgl8xNYueAf1ssc%2FPLnx88bKkAaU3gSYOKtpgvQOKDK%2FBYMatvAoUMuCLdIBjZDEkdF2HB6AD%2FhacjRbNiigT8cUIKDdPWYIMDP%2FRYJyC2rVYPSC9gwzwuCANb4IwYuEbZVa1qQZe0A8JeaM0sC7nLRygBTHEDxxwggEn0%2B8muBPHCAyfTwMhRnA1pW8dmQSaiRxeJEBFZD2GdkMuFOQ8D25CrOM1j1CtAiUPkDfrTYPmCTQuUPNCTghQLOD4fA4NdZdQqZH1DJQ3MOlD8w4ANNC1An72C8h%2FVvRMVKeVhhjMHQ10E0IJeF0Lvst1SOzAdPQq4B4AfQiUHsF%2FQl80k9Aw771DDPrc9QjCVQKMM5o8Q8ECYk%2BQnvwoVmwiH0CUilJUPtD%2BLQYDVDx3BAE1CaeJbyQ1K8FQHo8OIcYIQghQZMCu5hzAyyMsTLdq3VkLLcJCu9LIe3w%2FDxPacK98YIIMPbBIUOj1D8k%2FLiggoQ%2FeT3D8YI%2FwW39n%2FSvzj90rUyUgjarNP108pBNDndNjgmsPL8W%2FAsOMCslKkEUgA%2FAHj5CbWLcN90ggUfnTFIYbJUojqIimTblkXU4D6NOQahFiwP7TEHe8QxGXz8AffdX0txRIQy0pDxqakLa8J%2FJpD5CZ%2FUpE%2Bt5%2FPJFt8DYTcI%2FD8jBsEUi7kRf3Ftl%2FGkyjs1%2FYEU5tH5Lf2j9d%2FYW1CMUiZSLAVeKSfkU8oFcJGbNl%2BBcPDsZ1BsEVYQRcBT9IIRU21%2BFFqBsH39FIEyzMsZgEni1FgvR%2FxvxtYSiNwjv%2FWPToiUJeDRoi7Iy4PdD9IouQL4TBKwCiBqEDSPzBqEOf3zATWDMwgC9hP7A351rb4VBJ0sA0RAASEPgGoA1fGAD98NsboippBQDgDHEhQ3Jkxlmw2PWSicXAeRT1pHGdVQQ8AUF3IjtDIIH6jusQ%2FAD8IfQ8XsigVUI3AjDLSfi6jzxSf33DQjdFC6j6ICzwi8mPOj1rRvEAvnTJF%2BcOhk9pdR5AOinvPlyLkSOVLyFcKQX7kMtWPFsL2jimG6O44kQSyg8U5Ld6IJ9dI3XhFN1wnNnWi5xIGIZYhxO5FksrIiaJsjz0OaOX9YaBPVhJ%2Bo7iUcjfhMpFktpmbEXhiaFKaJy0bWLqIWiIWX0WT1vSW0B35LInhz3dYYypGf07kTkDhirIjXiRjFPP%2FW5UG%2FS0LmCnrbYMbCC4RaIcD8IQKRbNOQdqliw4Y7mI2C6wvmKIicgl2Vu4vI4LWJiWw0mNbCzVTGNJ1YsdqgbAWYqcSn8J7GKNADRdG8WYVcoqLDeYNue8TpQyolKTVgxQYgCp9gQhkNyR0sIAR4B1ocYMAAkIlo8Gwdj1phvY%2FyLZV5hVmKjZ8Y9kWmjfIT9S0V2Y7qPeEsSYDQG1KJMDVGj%2BUNyLUxhxKjHEQw4vLgjje%2BKOIYkKQaOnAi2Y3OILiNRMiNziVpMA3BByRV%2FT1jQSGe0UhcgbLE9iPfOfF9jYYgOKWFpmUONji449WK%2FlKSWONLiCY%2FqL3Clour1MUk4iiVwkBXUQAzi%2BzbPSzi8pHONHiko%2F3XqVeou1RHi%2BojUTsZq4rHifE643vQbiGwKSgHMVySPGvAnQUcybAWwBADbBKwKcxyJwAM3E5AjEM4GbBugdD3WgVodgQ2tMEBS2OhZsQABIiOYEUJxLIkLW8hAMQMQtHvHJywRzhUiCCBZgdJApM1IcVz6RJWe%2FwsscDO%2F1nhnIT6E4UYMBy1aB7HQQCqwC7OYAwSSLDaDWc2eCQH0B4El0muBWINQEMwEkBgEGBFfMiGYhkCUSHDBH45yyEBsGS1FOBSIAAC1gALBBhCUBAOCESf4siHqAhITc0tEdoeoFkhaIshKJgWIGOh4BG2BnRoRpHUiGUBiXK%2BwGJ9kYhJwBSE7mHWgYARQhFBNsEhg0BMoLcFNFNsYRPYT9sWSxNkuYKhFETIEWLEDhxAQ4B6Bwkn8LIhHEjbGfIrRMiBkSsERy1aBnLc%2Fxit7ATPGiZECUmEkA4AL%2BO8TBg9zyiVggD9iFgVoavHegdoLCwCQTIK%2Fw4hWLKeE4t3fF428SgkOC129HYvrFmxqAWYHypt7FLHdU9rIgF5QPcJTwNQdUXpPWgAAGoyp9kWYDB91jFh3T892L0JcF%2B7CGkHs0E7WCkSpvLByjZNTHZLwSUJXuG0hhBbJTPRqAWiLeRpBGuTmYGbC5NKdrk46MxQsAxAEUoWeasWtNM4omUaDk%2FSYLmplk%2B5yxJH3OTx5stk9aEOS9kvLgOTdkorhvZqAU5OWDwUqgEhSmBWEhhSjk11lkQmKHIF2Ask54k2hF4n%2BMhQHkq5I8hPIdFFRT83G6BD8wArqxuDRTCwOhcRwuWXHDwQNiN1pIQ1akcAeI10LZV6gOZmRSqU%2FZO2TYUknkH1fReAPJ0PuTAWOEekIRArkiAfWiuNfEZ2wPVjhVoj41uU8x1Xj2VcxJ4BLEm1kmSUUsVJFSIU01OUh9kL5ApB9UqAGMdxUMckCRhnPI21TpmR5FtTDUoVNNToU0VKOTLUjKmpN77Nk3tSAUR1LCZnUvrEhS3KZLwQZO9QEgjTR6PEFxjtYD1NNgvUo5J9TzUv1KoB9kUlNmxiUDjTFQAUNGEWIXNaZhYx00qFPRTfUvZNN480vuDvQJcCEFTTM3ABUTQnU90gygk6Gt1eDJXS4FF9hw23X6pUgDJLxSWuGoCdRCUh%2BPYT7kNACS093DLRnV86bWFPtjYEfAvtLksRlBTB7Y1OFTM0k1L9TgUm1gBSsIgbi9CTTLdI2SPBStLRSi7GtLhTXkU5ISs3yP%2FQtg52AOXpTAPeR1EBFHYemmtYPP%2Bw0dC%2BL0L7cnUQd32Ju3F51vszHaZlmBBU3dO9SJU7iWQCYHKNINFMKQYDkpjhSCFpjQPWYGmZ0nDRAxSoU6OgZQs0qFITZzFK5CUoYIAgCAU4MqchSICMw9l4iQxXBCgAV4KNLXN6oJRwjtTjLjNiYB5CtzCNxnA9LvpuM%2B8UUoSOH9PmcHgsf2KVbLJZNPSVk0cM9VL0iGE2SEMjNOrTyMh9JOSlIGHjWMbWUdPxSagKdOJSTbVHGkhLk%2FNIMyFDYVLBQ4AfqkqdKQDu2I4DjZSjHJ86DdIl4QUq9OCAtMqtLvTdMwv1npGgxixK5w2WYH7ThQUIKwocUzJPHSK5MQGnSSUqzKxgyUuzNvUHMptPJBosq4FizvEGlKAoY08UHVdw2etILSQIXFNMzzjLynMzH4zxxSTjwQcxviRzLMGwBuwV%2BIPIwAM3AvNXyLsFrwQmKUFwEmQPpBwQFsZhh4AuLMAAABxKR2oBPzF8jyRSID8jvIfrJfErx88KkVCIxApaCqSMqHqkSSQEsAFIhIYWi2hgoocwCoIILMJIkBeg3qXuzNoBczIhXzHoE4AGaAUEGtEEaMFIg1LODlOz5CboFbUpgJgmnk7tQABTgYpjjBFCK33CTSIFSQaVzsiIEhhZEp3wUkocpHIuzRoXrLKxhEuBIrAyoZJCTA6gaSFQM8geqMABkAgaACPIw30AIZfgCghwwVdGUhxIWQG%2BFpIYgG4BuGUiEkAqAQAAkifaSYIbGRQlKTKYCQA8svLdDzXR%2FABtifDFAF8J59JzCgB6gp4MACrYNyK6h3IQBC%2FwVz9LOPBUBn4xPBVzFCdCHMBLcHiAQTXoqgEAAIYnCgiACQkAJxwG1kkAbGIIAhybGWSD5yOyRoEABIYlGggiVJNCI3LMAF2wJUC1BOpojIEBkAMgKbB0BwgBEDtFcQZPI2hCcXNBrw%2BsCvhfTTJNSlYFL2FCP2t%2FBSCJ0oI%2FNCKQixBU0PqMT0sv2vZqBaODhRk%2FJ%2FgrJqIq7LB964UFy3Yxk7oARg%2F%2FCvKyDQab%2Fzr9yQNfRXhgcmMFxA841QWNipBbQxJ4QWV1kVVvtTfRtYp85iMYUfcolg5TejXxjKQACNKA%2FsqAeuBUkeiVIERyLlJvOnzBYmhUlsIQk2jNoCQLfOtQIch5zKQIc%2FfO1h64Z%2FPVJUgL%2FIaUL8tfKgVb8i4QIBJjV%2BlEA98vKKoBWxN%2FMKiAo83GwhQmcjQbFX%2Ba4HapyAWgTr5L2cUkvzfdSWyKVmOMgPBBUVZKVCNyAFgUwLxBAAuvyICPxQ%2FSHDQgpnVRbEWTQBe5SFzF1PhJmWX4dUf8hiEhbFyN7ShottKAUmCk1hc8%2BuTsjXzOYjtniiGZDgqLknI%2BvK2pVqK2Nvll%2BW%2BzE1r9L4napAAQeAMCpvOwKqCvu0ddkOHyMwyXmdVzuQACO5M6hj8s2IsEICy2KFQD1QwT1Z0C9qghzrCqKC%2FyyeZhRgLHC8EHsEXC8zjKRdCuAprticnkH0Mucv%2BCkBggDnNSBBc9AGFzOaB%2FI%2Bd2IyQGoRJAd%2FPWh64PnOtk%2Bc1zHogbcgNVhIVJEFl9zAAKIJ4eTECAKuGSYzuRJAL%2FWCA8i%2F%2FU7IggYooqkwc8oqqLADHwosEsi2AuZ5rYt3UCxseBoqR1zJPLjKLo45oolklosQvDJOi6YsJhD8DoqmKrWSou8iUYcZD8BUCdVxZNGi34RNZGYhYkkBxQDRBaK%2BZRDWmKUAOpBvEoucRDWLSijYp6K1NEorcZp5eeSxJTbIgHYAVKd0CpFDiKDSQLGzRlNEBDiwYGOKV48Yo5ztYC%2BypFYig2GtQnij4u6LUgJMyRRJjA%2Fw4geAcMHAgogXIBgAVQboAgAlCZfA4ga8NdGIB8AMzBxjNgR%2FOgBqEUIHzAD8%2BuGgBv8jUEl5Lit8WCAv8%2BMTyKaiyELqL3C3xGeFPI93PAh%2BSzQS5551XikZJMYAUriLWiHpEkBmgX6IN5D8PkqvFEStqWI0iNBnlI0XFYTRiQL9G%2FVEBlISQHapoAMUr5l2SvouCxmS%2FwpnV5hFgu5VuSgaN8iXmS0ohBj1M0vapZLdIDwBBU10oRJOyRzSAI8udko3yU3LVjaR5WXVmCLFMATRNKQtU4S8diAK%2FW9V6StIt1pZLahFktsiw%2FN49rZa3LtyRpJtU7IIy2EijLGQP3J6LBSu%2FJAL%2FSr4wrJwyqNhrKuBQ%2FDHjNBZhQLLComEIPUdMA41%2BL6oCwoWJZLdlx3iEYsMptVKy9sslLay6orNVeytKF3cUsH4r%2BLdMDYRdSAyjjOlSZZKIi2A6gWbHnVQmCwh4CqAMsBNhcS7gg2g3SMxgbFH%2FWWlBdpAvWGWCXTWZV09aQTQ18yYMXuUDY8uRZOzAL2UsIbC5QmunkZpIINnmYKwnuyEA88j%2F3qsB8jKii8R1Xili9x1OlIBDKkVtwOcmUuLK8ob6eBhNZJYL5kygVWTB3Lz6BZQIPpTQpAPtJ3AU4QorKwD%2FQWJcgOZiKsQKq0JUCTPWyiYUhw7xDCD8OOADjtcvPDk8McMqdy6sGC8kE7EIPGSpZN2KozQEq%2FOLhDw5P2DgDnToPTmTcVtK5jjwJrTEfH3LaHQStEBmwWEyOEFKCtwRR6dIMVZ09KrqxoEmzA9QdjcgOuhYcj7FwP8obK%2BZBQknKiEC3cGKokjjLmKmAG%2B47xWklvsjzd50ftrUcwAuJqEeKsvZVqC4l5TQq6XVyAudIzOArMqUCur8FYlNwhA3M15LvNXA3o3iru3e5x6M%2BjJKsSrUq5twMAcy3o1yBDaMpBarWSww1arOK3Ku4rsg3is6rqi11mtRuqqujyqeK5SA0h0SuZExL0Q0QBarWK1RGNhxok%2FFLQrlL8u9ylIcQT%2Fx51QABJCG9j4gkeFqqtZcXcyokBC0ParOSJQaOl0SFSvLhaqTqxAAkAWivatyyIQJapIAQXHgANFGANoi4Q5lbkDMrHquShEhTq6XV%2BIkuKgFWrq84Wg2rNILar%2FK2NA6vPQjqicRBrHqyGpJFp1HNgRqb2PnNhJ7qtGqjV3S9gpFRRYpyKWrZq34kyKJUKkUVT3gQEkDFpdYMvFKCawGqJqtiwSs9Lgi%2FYtPiT1OAqW0jylTRQB1oe0GOpBAoijkY2aDuPYS%2BoDiHgB2iYgG8JbqBAH6dQ2UI1FqioZPw7zy6W9h1gkUoCq4qaKnYL4L3KeBiN0SI300Qpi6IisgrsKOCt5iYbfmLMtUKnmXQqQMRz0uDTAn01Sj36EKjywcgYZN053oXkw0Qcq0at6rjaiCqlqfTbeWL4kKKuijr%2BaPMLliwKmv19EGgboDfd%2F0%2FZ0AysTG2rZpKqr0IkU6QkEJoIKQLd3BDWqFJVZMYABqpnUdqbWG6peqQ6wQo2gAtwhQ6A94K9C2iBfBdhpkNRXsFrUPox2p0XXkFdRCKQISU5B7O4K9C4XKurwDmgQIPLqJ9BwyHqOqUetgBx631ybKqQQeoU5LbGoKxMqqsquHrdqX0HrzArIIS3qa63p2YVdsHdXaoVa5hmdM%2BvBXW8QYfVIA%2FL36Mq1hr7lE0xxquWWEgNqeqo2oFjE6uumgqoKLEgaV%2FTaGr6xf68QQAaAK2iAl4rahOvzqy6JsWCAG%2FOBoIjMg%2BWJM8WI24K7DnzekDbtTFQwQ4ZgC1a1ugDK9MJKVX6taqb9lgyECQaSaIBptYw6ofAjqwGjBogar87eJPwZA3BrzKLleOpQo%2BGqCpYad2NhuP57awiNTrZsF2tlLlIDCsVDyQO0N9rEw54KdsJQUwJ5qPuDWtoD8GWBw%2BUMcY5TEbrayWrLoLlYRqCoP6rBu2r%2Fy9hvkb8GxRrs9Xa1RvdrMmFzKpBKGpWBo0g%2BNBokbrGiBsQaVGwBscacG%2BxpliHalKydriI02LNVgVChpIaqG3RudCurJCgMaX9AwR0F3pRxATCuEf2qdiLGpxrY05G4JurpJG%2BumdVcI1YJEbk6x2oIar8pPRUqGGT5RJD3PDRGibmlWJoQqaK5CoKqYK4uNsaElGJuYbXGpvP7zK85Rt7k1GnspUq%2Fa5sFKaZ1D2PAg5dWBomaYazQzNIIm5BtdYqm8BqkbsGvCLfqSAHmIUb8qwhpGbyQQ%2FF6bPy04Nlj6%2BGZrlC5i8wIorawfQS91Va%2BdJSwtlHsNuoxGAV0kYlwRmhKj0sAWowBjyv2HWhDgSnjwgJAToNEhcAHeF7xdeZCHCAGk82Ut9SkG8owQ22bQvFhH648oLptdXBu%2FLVdYFNka842S17lCaQfH%2FJH3YIVObYo2fOUgzKCXkUgT2Zlp5sqCjltgrymt7nogjmmpvwYoms5qYaSw55viaWm95v%2BCmqOhrZUHY7WEhhO2cRuqbQmqRt8yHm7%2Bv6a3G65qvy1FMiLpbQeHlv3rB7QwpCiOWhiKpAHpG%2Fl5bLWtSM5EDmLaNwq%2F7SSnRD3lApqGMoCxnUwZWUTKJARUHZEM7r36B2N%2BquDTBhVb%2B69uvZkWHD6UBa4gYHBh5mOVWml0G69aCbqo6MNvOciNFmkTpFGGMJxCD1PiOl9vfOcMWCs6ndn3qp6jah4LtqM%2BpQleWutrKQzLXmybaUUR%2FIwAUrUQB7bCy%2BuB7aOSodoaUNW45tqad2XVvfr9WrYLla%2FJWovvzGU1sX7bCo15wXwqAewLZVHkNVppbYSIdpNb6Ww%2FiZaLWjwStamBMyltbfTSGH3afvQ9vNbAhJ1rZajTEnhHxoYZDPtII2%2FEl6gF8IjW%2FaxQZ0jBcxQGLQ3sOpVIEBJ8SUQoWI7ipiAVII24gCPTd24IBvbpPO9odaT21lpNjn2jlsurdUljEQ6ggZDtNa0eNDofbT251vZboebeKFbAGrYGraKQMiPw6UOs1pI7qAFlpwLDdF9vUbszURQgZq3D5rkB%2FXBmJXjIWlcmhaVNOQABZHEOaEGsl0bFsMSZbUIwwAWypjqjYv66drL9KWzav%2Fr9mlxvvbWOvlvI6sOyjvo6%2FTcZr6aNOhBqPa1kjKkfbMOlCU5alY%2BprsbzO6VodrL2V5sSahYrdpCDvERNt%2BqvdUluTTNmszseadmqluRNqO5BvPQiO6%2FkZbrOtjrPbOOrlqs7HWsjqfb7Ow4NvaNeNToub1qn8rqbEOvTps60uuzvMtsO5Lpy6f63ZqK6Euwzvs7yYpZoDb2iLvWBD4w0xp9bi654I0Lp4jsP9brnJMO4Yl7LqyVa%2FRIcWYUZQK40pcueGLthJKuvLvC7JQQrpY7iujDpnyjOhzspAyIubos7qu5btq70u8rrtaLlLZpc74G3Zsi72GrBtFatWidrqap23Lqea4mxCsNaIRMtI1KQUbjnWb%2Ba0TphasQW8OmhVM76sGtYDJXzbYFkehPEhTve0EpV1ZQSCCDLgPnm27haYyny7U3Jbri7Uu1btabrWuLnJBALCgrbIyIxLsuCFiw2OoqJBdjvZbt4lq0vY4SOxnNJKerDsdVW9TRukwFqdJrtjyQAgqmQHbE%2BJZNYMVf2%2FdWiLkmmY57KQOaorG02vHd4gcRopaUeyeM2c%2BGVqjVT%2Fm55y8rGQ1N3h1wmJBh41c2urP2MY0vXsGo5GJOgmocOlKTyblQzBm6D6UWLK05JA23QbJJA8ht67%2FGnRs57WmBwxG6Z1e521hswMdptqLMGXr8gR8FjxCape6OteqHBLVrkoqq9Ut7TOQ1TJNZ3Wre09bGU71t%2BqXeqqjd6zRDJs96VafhjZUEKQ41mMkKTEAOYPKlegj7RqItrXCxKe02g4zWSiIZ7iezLuijdEpHlb7bQ1JrZt2egbr7DpKnnq3UhxDcKmR%2F%2FHGoqZoo4np8747O11xIg23Z1BjrqnTrkap%2BurrK7%2BKt4PfpHBbhPHdWqPY1zINmG%2FBbKmVOcpEECeinun6yeO5CaQe1Y5yF7AW5YCYomkWwE8gKBeIJW7Ge6%2FNiR0CqpEpd6UU41bEHCq43aoCkXLTRJ5NIAhoV9UJHrO6Fu1hpX7Yu38mPbSOrHtwKOWzQVIq53aYyjVZjf8iihvSkIzuQHOZ%2FxO7XKCrXdN%2FyB1k064a38sQGGW5Afi6DO9Lo36bKAnWSamOYbrKQY63VNsAYaFHtMoANEgMr6uECpSToBabrvJAQYxlNkpLKgjjHIXjaTL4HUgFUgc4FqoOidNgu85qq74BxbvoGUu9Dq%2F7WBzXVgHsGqga06Cu%2FQZq7mB0rpx7XWqeN7S4GuSgqVpGzYEt7Dw4ZW4TdCfICkcaxYZGOEA8eXoMzHGjEr6AjKcwbplYi3QaQcSGuQduhRABzl6hAStQdmr6fZCHYUEe9QYX0mCpf1P7WyKAaaRtNQMmXi%2BagKpvlPmSKv5RYdGo00HjukLr1aNOoIdoHLB5xrkbrB2zrW7v%2B3HpFDTO7Qfm6LB51T2bWhpAaspMeowbsGsapXjqHzmigd%2FqzB1HpaGKmkYaHwxh6fvsH4PJwbw4XBiXncGtG0QYugjw7waYS%2FBlGACG4B4IbqbQhigSiH7jJofwDQjN6VVacu2YenlKBhYb0HhhhgdGHDBtYcvajuvIfogChgmSjNjbFhwja%2FOkKhjbfBVLQndI3UJEMTSB%2Boe8QXh6gbuHXByOQu62hvbpsHOh1gb%2BHFeXWRqUatLlXUaFW2hqH733D9p%2Fav2wDt%2FbaRgDojbgOhmscAwO1oi%2FasGxkbniV4IIFkpXCqYDMpx9G%2Fu7VIqWTE0kRVZ2U143rfTo6Hseorkcac21%2FqqR%2BRt0P6dG7cAtXL79Ed1DaE2zBkdDWjc2WdcO6%2B20d5TFN6Uja2uKwprE7h9M2GLfhJ%2FRXiQ4l%2BrIGGhsLoGGJQTEeWGUB6UZK7cRuwc118%2FcnsKJxhuFKwbFIZ4cRkaBzyDRGsGkMHR7GB1YfX67BzfsZRWxAK2oQ0h9%2FXd0RFZhSq8roppGd4f2v2k7ZnR5EYjG5ht4eiGaQOMe%2BHUB4MaS74FYTsUgoWmFrtF1oYpKXR8W9FvCRoAK0qdGkRh7tdG4agwdrH%2BWmpk5Lr%2BhYkOVk%2FEsYHHzh5ocpB2hn0aNaxxiUunlbq7iX0ruB6XRHwWi1xkVKtoztRX81eyMNtoeB%2BkoBMpjKelz59SrSQlG4g6ek%2F7Rx5%2FoNhFR0QF0Luh3tOgKNR9Qul0h2G0o7YMlRrSIbd6uQol0V%2BMuX4LvO9aC%2FyAK2pT0UvC8CAArCq8EEEKix%2Bs0cVZRFjhFRJBu5GxEYJlca1LCYJCd1KuNYjSuQgFDwtNK5yD8fE1xEQibe5NShcqImdSzjVFG%2FEYbUNLNCo6FiQdxkob9LG%2BhhpnGdBzauHHvRtAZdbYKk%2FDeAhJ%2FoaHHVxqUqPGre7sP874R1QDKbaQXuUgl6JyRH3GHBlKTd7jwpu2Uo9HVCHPCIOm0dUK7RrMxH6%2FIO0sOtHSu03pBvus8DE7ZsbNX%2B7IkyJJO8Z4Rwg7R6YVc0FBRQdqgwBpVYWq5jJWxpueb3Oo1yGabmrzt1TZLO422ZxSmLoeYYFYIrpLdU%2BYRm6t9abX7IgR2ssFacp4sf7HhJ%2BcfdHqxlYZ%2BHEx89t8bsSPrT%2FFQNdNjKR8EUQESnIJ5aPzwV4daA7KJiYqYBGqAAqa4FuJXPXMB0UNsvLLkNP%2FHymEo9jQ4GLe8Ac5IqROyuTLpdEOpUhJpjTTnLIyhcrjAo2AaaGmsazEF6mz5DYhjzSGqJmsVLkjsoqZwNMael1WnDRBnKKy%2FIfnLoc7cJC0zSGaegGsarssPbPp6abP7n1UkYqpeu2eP%2FEHXNqbbMqQYgocHn9TYHri%2B2lUCZLqEXMZnUQp4Exhhsq5ztC6JARQOmaYpgWM0EtY%2FlBCnUi2Kr37hAThGoRhANAA6qZAiKe2a8ZppuimkKgWI%2F8kM%2B4oWIudOKHu7Lmgno86CqwnSRQtaCmeFgaZ8WZEBAAIIIaZmWYnQiAXlLmpK1UrKacFYbvEfCJ0xTg0KsB6zlCRhYOZmEBhYPyGMqjLQeuEA5Z0JDlmrh3p3xVHAw2YlmJZumY34Z61TMgySbGwOqMdCUNtewJnaWxA1XQEgdCRMBUJE4R5QCdyxKmxn7pU0kAf7pQ56KHXOiVJxjqOCBhATyOempp7aerLdpknu5nxEVOZD0%2Bp3uRJqRYzgqxiQ5%2BEACdea%2FiYeGkpkMrBF85iPmmpSa0ue4hhkD5Lp4A5pDiDn2qXUFBcR8vryxlAQDacXytp16Z2n3puqZHz%2FEeQlCRg7YQHg61m14AzH01JfO5H050ecBG3pn3Jh5fVU%2FRXhwoDsnyHimfuZCBs5xZoP0950NSAkGzQsmsiJ%2BVstnLXp5oErkTTSWTNKPIhGJunFUw2ixIp51pyTLjS8RDCnlIQfU8gDNYStBRlgqeftBD%2B5fVeBSS4YkP1l8m6a%2B0h5l3M0m%2FYa1kkBD2k%2Ba1LhprmdUQIAR5F6nZo7BdnEZQKNm0n1x1vWYVHSlnXrjTC55kTLAARuAmkXikkBIO1REkAekTuQRj5J7Ut0muJ6WRK0zWE%2BZunYKk%2BfQXyFyhaYncagrUvmN9bkbfnqJ0QCIWLGyRbIXQWCheKYNJ9iSQXuR7SajN7SP%2BcsVr5jCY%2Fn753Ra0Xn5pVLKRuFxwG%2Fn0RqecZr3ujRYwXtFuxk0XNpyHLPmljA13U0fF6eUHnAl6Mo40eBfRennl85Re4mqJ7ibhGWMOucPwvFtKa5rBtKQFdZfSrQsXm8AForcXpFnRGVFnihXsdHV9CJcdC40zVPbTgRIIGHUrF4pm0WzFmDRRQTiuBbwBHkfuf1Q9XCEHrip58pYzIw0yFDG1kyixYjg4wWBa6RdQCHOlVvZTyNwXfFgheC4V5oef1Q5l96aj7elsZCiWjSrmUzKM9ITpPUL51eYRVO0MaP5Bq1cZbKRJl2udmX9F3kvmXIRFeItVblsfI6Xoco%2BcjIxF%2B5YPHf5VsV1AMxoMU7Fe5ybWCXN9A%2BYrJpinlSD0vFyMg8XminBduX%2BFvaZ%2Fln9cNnLJKy6HMKXUSjLmuLoc7RZHmQlxcr8WykZUQuL4VvebuW1lw%2FBxWOyPFYCXl8vBbqmKQcGfp5IZs4ra4rljqe6WV41FYnyiliGNWXQl%2BadCNGNXGAqkbi2lYFXCp51QkwOoPlYPlJV%2FBZ%2FEGprCQhmgUMJGjAJVS5deAIc8yMQUkAbWCxAFAOVajZvZBEkNX1i88QVXGV8kGZWqxMDUmWKSaJdv04R9tV4WESFSXxX6V%2B5djKTmS0Yf08AHVc5XwQTJcXIr4iPGHMbwPsBwBus58FxzqNFF2OxoQF3CRBxs%2BbDKwpswWwbxNgUiFO0xYTqBxApgTJEAAR4DzXDZO7RwBmCPaYAAmliErwegb81gR9oAhjAA4ckOBLWxEI4LqjRQO8jfgM4RMGdg0iVvCqpq8LcAkBiksyojEruN2EGgccyhKEByweeaagOKCMEcA10SbIqxGgOiHoAnTa%2FBQQQJdBD4TSIfBH4xv4CwlThbAC4n0SxAdGoe9zAGDBzTjIdUGN9bAYWCvWOIc4DVAYCUiEmTALSiyroLiMCwmIK1zSFkh219bDAw9wQi0Ls71s6DF73yS9YYTJHbnLbkz1zbC7WrCfbGYgYCMBAvZX127IkAgobbP5gnsBgA6SyIapOscJQjRFmBME6gGwS7%2FLBzYMmICSx4ACQKJOZgpIEhIiBdEw%2FBg3Ye9ggMgz8k%2FHOyAkVHI4EqAMDfSR5CcmHCRZOmLOQU9CS1EDLHEKg1chcDay1IgwNgKCFULbD5mqhooPAAWyobXIBbAuwOfDoJwCaOj43gAZyFIgGdY3yhzREGtZgJq8QbM3gTnTKGksQEmmExBZgN7JF9hQbczXQONmAFZhToB1DvQA8pyxcsYGVoDDyLAfQyjyY84QDjz2ExPOTyJ83AEElaIWiCjXGk1hBy3ggDi1zQU1zdbIhc1sRCigC1iTbzWggctcrXhBGtedxucb8FNBesYvgFxg0LGaIwTSBFbWx813lewbo19Dd0kOtclZtY%2BEWcS4FLEQmQWIcAOZmoBOZ4GIvG3yMAYfg7UbrGZdcETSKlU%2BEBQE6wOMM1S54JOvjAsQYYZZnsr3uyTGeSRRfUodcAFnZcYwZ1WpG1gGkApGFnPMO5FwQ5mfBCW2rh0AdhLpkmGA%2BRNBUnvCh9ka7YahoUMJj9pqUebfiwVtl2C8sIYA2HiBht%2Fde7XmXKEB23VEKECyqqAZHbsLgsbHcGKAi5wueNlKcuRPrYMap19QRt6qo9IT3WxInQ6ZiOeQRgIDMeXgpI7oAvXn0ouCaQuG3BHmoroc8FV5wgaGEyzCYK1IERmXC9cUi3yF9b53AYAXaXYhdn61F3p%2BcXaoAZkyXf9ScAGXfkiX1nHa6QfrI2cbzMqSWYLzSbKUfiFk5DFB%2BsGTc2xF2xdo3qsDZ622mvZK5u5EB2HatXY3gNd1JGk4GkPAqWjue5QpFslbdaEGSNrB5gd3hHJ3ZsAA97tfD3dU8wCYco9h9fe2MUB1JwCLnZ3c12ghba0eRZsXOQjdeWR2w96yd0D1wRYS1ajJQR6bjmywN4WoERVho9lMR2VwCGhUjMChKoypmXWYGN2ykWYHRQGbH9eXKLBAfdJ2CA1Xt76i5df306624FLbmN4R3fV2XdkQeAzVMpOk92U6cyPSwY6OMA1lzwChfWhediR3whwgVDZG3igXpMPxgNs%2FChB2qC9eTm883vfE3qAQn3wLB%2BlPedLxEWzKl3aMDfePreCuvtCNi9%2Fk1EQcXUtRoD7dJFFiQNC3nUJNYAXnbwGriKKEJ3x94ndXKvgnvtcpFBjzK8ovMlxw3SmB8%2Bn%2F3p7K4NugFK0I3MBMZi9iuJG9lXpxxadrhHp2T6oA%2Fd2YhfWkXrqEebZtnKD23Y%2BsPrP9KmNaD7WHoPnNNWrZUUiTGehsUDw6yYzEFN0joP%2BTTEAr1qTRjOl1zAbEWD3nNWEtU4XZuWW33uDyuekOdDzqEn8zKhEr%2BtDDngCToZD4tqkGLxu5FmBk55FO5Vb4Ms0xgMDopVJ7b94IA%2F3tS4ygYOaFifewPnog%2Fhp639zqFfxwCf9fEFAjurgcEFqAgW%2BFYjZ%2Fbb2DeaOkSOb2YI5n6d%2BukIpGZ1aVRyPJEPI7v21xgnZxdbtuTDVXYDvoFiQ9jC9foaAssmURjSj7w%2FjjG5kmZZlFSQt1LTKXJiU8PERTo4SlbRwYHvl8QmOjkAyt8BLmA613DfapZgOW3N2q6SWZmTZsOZJMDv9xTnr2I9mPcOtTdogLBLJ9qLHv09j9lKarrUABmBtEqlIl5SmKZvfFR0oMPOjsPAIIR%2Bthd4CC8dbaC44X9I9qGxIAhk6o5X349tfYL2ODrfdtoQbUw5oOZD8Q78hJ%2FIIGX2roVtId2mnXkxDsNrBcI3gOnGIUUP8mdolJ1zAGQ%2BFiMAo%2Bs4O8AhN0hOjD6E8Xq4CwjdIRiNvbMXxudxYOD9Z2XLMMHcGz3aBSKQPzI0zr0wLNvSh7ELOOSsYJ9OZcsLQfcT8IbPPMlmibHk6MK3BZDjmpcveEwFcxymuVzzMCyWZbyMUNGBsynks1TD2pD2jUNgAKFLGROUYYE46sn7I45iFenewRaSf4tpNI2ELcUG6T5jnyrgPBEZY7t1eCuApsS7E5SAezwwJ%2F3Q31s%2B9bfZhYdqmcgFvVY5AhJZzskqyZi%2F%2Fe2P6CwvZFtzDq7L0OESgw4pOoTkA40K7kP5BPd1kdLKNOh4fZHTOHmeM%2FFQHXKa11S%2BQPIwrPnkLFCrPfIXOVrPW9eAJEOnCq09sOoAbfcXrBEXk0AAO0gNPTkcVEnJOzlIubSrjniGoQeINKrLO4FUIxgBrCuKFTOkj8LHbmqlzpNzd6jhZGmYeIdFD4hc5LpdG6DbSvZSlRyDKCuNm0EttA8WzrpCcd4%2BmdR4g5mC8%2FYGtoxlgcM8%2B3tNUGGKR8%2FvsLxkRcaN6IHc%2FMRoL7rRridQqc%2BszHkoeHoga0DFGA1JyGZCuGUUIPh7Oykd84b7QjRQqoqkzpuHoh9TkPZobjjrKec0YABtp%2F2wD5zXjOSOGSt51sS36xM3dAVvCxbLN0pzISbNzjdsS%2BNiJIkABIXqCKhr6dJDRh6uGDCFlQ1RM5fXxBcg4z5YLqC8rPkL9lh7PKkfev2UxUM4hVIeQWjMsz2ztc8BQQkTU%2FVAiZcgtw3xDDS8JgZgWC6wqmqGStLOtzxC4yzlLus9OR9zgMk%2BTjzpfyGwBzv0KHKu9bKQ8AIhNrk3O8Tz1XCQSA0QGYvugGIQRxfKuAoqwKgDa1zMRUE6iiV1oETfMAxNmguvoggvMxIvFL4FMS6ICe2V12VL9S%2Bqv1Ypy6oOsz1PZzPjOMpH0PXdllLsOPdxw5nUVANy%2BquHL2q88vW9OK%2BJlqL5tPAuaD65b4WZCkaYcwdIkPc59EsZ85Ln5CrGLYCFO3q%2BmvLFm1mUvBrky48vrklGPimgrhfjWvSdPq%2FMDBC7fkAUPj4EVnoWeThZZESTb%2FyR49r9y7nOUJXM%2B4lfuaiLeu3kfa5eTDr8lI%2FUPruy%2FDj3r6C%2BtWKQap2VWCSRs8EQ6L%2BITAk%2FIPC%2B%2BW7z3Ehj5fQv4VDVqD8NkWuQYrnkMKkeAa7Bu6r468y6qItSP%2Buh4QG8NPwb%2B%2BFaaxjyyYmPQDBC6uSWIpudWuwJrsSyOjkWElmvo6cDssUvHePvSwbevhNmxC7a%2Bhx0GAeOaiTH9n3qiCNmyGzk9lgkaqTOLMUm9gubQ9A4zPrgj5pJ2nS0Gez6Kd9zNKyiD9dM3TUBqG8CNTTpg9FQiHOnYx3eAaqvCwZz5qemReDp2bKHTTwzzS9%2F6FR1mw23fCsErO3EDP0d%2B3CLGEBjHG%2B35RFOAk61V4Tts6BvPrvyFJT1DriUOt%2Bz1PbUpcNyQ9hOF%2FNSjkOzdhQ8LuaDlq8lsrDrBw6vN92k5iFX%2B8u60iWryw9hKbDws%2FrvgbRu5wnc5w1zUuDrtO%2Fq5%2BTIxbVH3VbEIXG93LhFacG7vMb7uybzO4QwF75MdbEUiMYABXJ70NSEPbAWauUPyvG1IvH0scCEFNFduKG%2BSZBPhGMojZ0%2B9B3e7v2HzZL78%2FpsvWrraN%2B4OoTGEvvXfOI9Iu77vqiCoCjxJEwXHJ5kxBQooGnslmDrCXkF6DezRnDpa2llurvlbIc5HPYTh4vWgwHzhUz3fRX7nQfZksnvyQvjogCT3eADB%2BQmYh2fdMvsAnurfIPHGZDVPu6jU88cUbkHdj21%2Ff3bF3M3fJCC68HxS4yoooLPZCuf3OxWmqGjyzTZUtEN%2B4SAT7u%2B8O2X7g%2FgkeP7vh%2FzHWZfo%2FVoe0g3jihId%2F7efEooCR48R7dwjRFE8JB7bcVlITOOn3grlGBkxbQQJCad7toZeNLbbW2kXSDylST1vpN9qgAJikuXSfu6xiYmR3ZNclb0ffDx4V%2BS3O8WZNNIboa7eQ1jwWk4S%2BsQwcieB7hm6j64H1U6xNraIG2YDpmShnLBJbQwRt6eA%2B3vntHesLPntSDpcfQHzA1sRyfW4p65Y4QEWJVVuLd2J96B4n2scSfU7hm%2BkbyuVH3zuJdjp%2Fpvqri4MoKaps08c7%2FHr2XZFNTdMUlTP0gcKkGrjiqqCFe9lKs4BFZ9J7ifvHIoxKM%2FjRvYuJMjSc9npwoeKuWeijZmr4XpnkGdAUGbMow%2B3lrie%2BbnzrxwlixNrn7lK06%2BXp4t2tbgZ47PwbozybC6x0G6kml2T57WPvngG7JvlL4Z75VRTpJvRvANXA72Go24B6G7Mzhi6zN2mt3aT779MZ%2FbkukZzUyucIGIXLuPuMe5AHnVTsQC1TmrhsV3%2BniF51uDgrRXVNLnkGfT60mukNSBTJsdi1CCAHDT8emXqZ41FItHrtLEwVCxQhUWVuo6wuepaDT6ksGno5TDnAR4IguLlHQJfWWn4WgSf6XqJ%2FJT0Rnp5pejZul9pvIXt5GhfAXo7szCYnkhjGGfnpC913vAiZ5NXBXzkVIfwQAFpUmuA3sL5voQU7ktekzjV7aexJ7W51eDM4Mwz5bnoVZ9rA7DrvZvHXhQXJbVDRo1wj1X6161fjXqG5xZ0Rgswz51hk0bBm4bkDTtXPb4Epvm1FEFQ4NmiPUa6MfAKSocNBjV1kfylnlKrqq1nmfqtpNn22hReub%2BO%2F2eqAQ57GuTnlKtjfGVBFeTfhYAN%2FKe%2Fnum9%2Bf7X1puKXKQXrTFf%2BtLkb8vGluV5z0FiJpG4NrtTg0UXTmlN7ifJ34N6SfZ3q1ndczjAeX%2BJfZoTIfPNR97p9eAefuaCe9Jk24wkC35OPnj8JGV5BLYNBd9MUNl74Ef1N3RApvmD3baJJMD31p6PfbX4G4MyESD%2B9deiqs260Y4n0EAl5UH2y0g%2FNX9p%2B1eT38g5QlfjB7GEf7nkCceeeb1zXSxHNpiCrX3Crx%2FPyLdkZ5YGKjuKTL2aLhS8lmjB5j7heHB%2B28CcXrpgSihHLw6yRvqD3CflsQ3lYt9xti3jRgOfTkR%2BtOTL1tMwvQUB27JqsYlLX6PqUNR4UyBBDj8MLKwr%2B54fhjmfohHbqa4yX6zBs3btVJtxuajfVKo8PHcuXgkni1tQ%2B95s%2B8udz7PlF3vEhVXJX8y6%2FeQPjCYHrQJ5mWgOFvSwTMeQUbI5alAVNm%2FxCQVVze7ByZlFx9mDlYObbwPs0hBpndQXlIzzNbo6xsAjZnC1lPB1UQEUK2TwtAfhekq%2FHyMeIGU7POl%2FNC9huwpe6%2BH20v6lVFLekWGFeQHmTYQ6kUnJtCmp0sPdAyJLUHBDZh%2BTdCAqQZ1PHHE%2BDr1mC6wdkImEwHdgfi3BR5Z0WZS%2BbjnE6uh8oslF5TDheoGFBrgBPddAPQDh%2FeNdUlInRQK9fZD4gr0ZzTn9zkONrSzFPj26POgyaZhSJHkW78aRuOJ77voYRhT5eTW0hG8%2B%2FpD2wHPBtYaGz9389wPb5dwHOH9FBqqnb5sB8o2g3KQfb8EB1mtMLu4YPggBe713iAhYhSIIjQz3%2FW23rF%2FrvwIPoxSJIf%2FKIvWGqrSONTfvsfe%2BXmFU4%2FXuZ91ygYDv3XPes6K8Z91iRSf%2BEGl1ZgQtF6S7v5MabRwjh55xxs3XEgddekkqOkPC0X7%2Fu%2FADz61mAXvofZ4hDR%2BNrYcYd4Tj4ghEJNMQUUiPjXWh1fxb4W%2Fb0HF3FRs6FIhN%2Frv9EJZRmu9lGE4m0UUquMLfgI0QUSV55LC%2BbXex8e3PrUZGl1i1Om2b3whBeacORZsoa0iyfku8p%2FOr4c5PrPren7x%2BmfyjAtOWKK06t2obZplp%2BfrbP9UQmim1g1%2FikQ8VRTy7PipHQ0MnQAwygwA4mwz3j2NrKrPrSQeQD%2B5XyOzoeIb3%2Fv0Ri8kGKjB%2FqyamMeIHAHmFC0Gv%2FhTlvoldEBs1Ld%2Ba64hpOiH%2BVr%2FlGzVpdKmfv96PMLxADNol95T7gsaU6n2NGxF7zbgDjXtrdvZpcJtpvK9wIXiPbZvZZ4GdChzhGSV89E0Dq%2F2FNr%2BU5%2B9PLsDYA38%2BaJhkcnN0BE7i%2Fo2xCAp7ROIhhTuXZYSKC4Z%2Fjmxp%2Fj%2F9WXqIo6vqf8KQMVE3QiIoWTHaIufjjgm0JP8HbgcpqkJ9l%2FbiL99Ros58Qh1hIal00frJjMz0Lb9tkNegNtuywrzgtNykLL9zHlUNtbNSodnhjUfCnO4teojpDMHxA0dPJESOJjpoZiEZrMOoARQNLozzpjM%2BICJQ7nrNVFAayNQOpLh3fpFhfZvGczhgrRB%2FrwD97vH8ZAXu5pAXcgPgMnMaAWhd2tn0YeIBj88cPrQ2drqAzSnNAc8ISEYgG3ILAdtcwRMOhuPg3tocK3s4cAFhdUm5dSMMtsTAdwC1PqTp9ykzFXgPHoT5v1sQVivAa0L1sFFpssTmALpqlg5EQvk5FLAUQBLLgsRZgHDE65pPxjUotFu3tED%2BUMPszZCUDWCn%2F9Obgq9aZj3NXgIWh%2B5soC6VivBekh8tnlufNX9OgDjblgDTrp0DQ1KIBigd%2FMDlA2Bv5i0C8ADgBpljctxtsZ9BVsE9VEHMDxEBJ1uVO59D5nNdVEEAtxSp58PhGR8WzJF8EZg6NwPogsM1JEMlgedsRrvNdd5tjIMyLpga1HxMslrqlO6AB87tEUNfIOZ8HKKcZoFj6BJujMDjUv3N%2FDg%2B8AnqvNz0FsDCVgstXeBcCIQf4dJFtcDmJlCB5Fkcs93mMDbfGMDY%2FilJnFjyh79CWcpVEssg9FCDJPpIsoQYqsKQB8CtloF8mlrEtnVgJNOgfMdD8HG9PVtyMkQc0wfgSA8itiO9FgeSDobqCofPhK8i3nhIXNCW8gvnAUEkBPhnngNluwAnN2qDgAGwKFN9gXMVKgS3N%2BUGfdVEAAR5hLp9GPrYMmBIR82iiyDGQRNtd5PgszVKT0n3qgtiQaaDrVlSClFhqsM9HSDzSm6lxEEaDLQcyCeQRCCTQaQoKQTat33iu8wNDgl0Jk0tpmHjs4YhE0PQY0DcgWXM8dlw9PGvy9H3qO8%2BQVWR4ZkItviOAUolBcsWtCoAsLOc8ESDqDxJqbFCGCQ0XmDpcTCj38zCtzV3Cu0tR3gWCv%2BqCxOyg%2FNeQTaCb7ssYNEHWDRxofNZosmCZttxIQ1qKxRABDlMwS0dJFh2C6ug2C1FMkD2ji2DLEKiDAQJEt7QWmD4DhY115taCfQSDN9NBEsXFsKJxjir9rzrXFLCu5E3VsoZdTrqDfRsZxiwUpNFqKk9z6MGCZRDMCIckeC75laDl8p3wjPp2DoQWkCjlhKwnVs6DslsIAaweSsx8nIBBtmCC9Fs2D1wZIhWPjOoogLTJQIW%2BC9PqM8cWLBVjVJ0VDQZ6C0FtcCkVssxUwXcgogHmCICPBCxwSwMcepPE0wSODnlihCiIaeDCwUZ158hKBWQeehiIXZ0Jwc5p55kB9QYiDk8uOhDEwRBDG5EitYSKuDXwXyCQZt59wVJRp1aFMstVgGtFWHCMoQARDIwUk1GFotRFbpSB%2BwVjoovvIBQIW6CkwTOCbgUEoT4k8txtkkDGQWhd%2FVh8BJtPcCh5t0DGQXkFpIU%2BcuQWBCxtl6CsIaCwQIZ0UdIXxCptjexoIVXNXgeGxqtrCRPIS5CewfpCtonch5ISMtFIVAplIS8xVIT6VEZrqA5gZeEzcMUkwEECBv0DmtN9ECA81lVsJ8mBtggPVtq1kExjsKaAXQB1sAZF1tQ0GD4T5oNAzVqBC0dqw4XbqNtvFsJC9Iax8LQQis6oS%2BDuRv1syeCCo7QcT8O5NDhLBO9hxkEZAQgWyo3LnrhhTJNcogWqCykCbNbZtzdmZC6BggZnFOxEiAgfm1tG0CHgw1kOYo8DeBBwIu4VctOZwAMdCMgPrRwgK3En%2FGlCSIEuhIzifR%2FtCNlZQAm4JsumsN1lms61j9kyIIAB24CoAKGECYqQG7Am0DMYVVHK2m%2BgKhh%2BHkIYK1%2BhykEyQ0mwz48hGk2OOTNwkQBwQ43iAE4uTSAFWHWgD3kAALcB%2BQHwBXEGYDIwzfTkwe7x3ZMiDEwvyAww4pi%2FQqgh%2F1Zea7rYCDLcbQD6GTDYXeSyDmAWSCEw%2FaAbAKQCBldzZXQYYKNUEBD5AaaBnmPAyWQHAC8w3SDICByBnhSXxK2BJCmCCWFoQFAokQdjYSCVSDZgEAD4wpqxlEU3KVgOVCeTSWGEJSyC6wyAgGwoSBqAb8wbZZJLBENJIh%2BQCiqZUmD2Ac8qxZKgAXQ4QDGMMdYJ4f%2BJuwBmz4wwJKabXKFMQXmFGWG1iFEXWH6ww2GlEM%2FCAAKGIrYcAADYYABoYnO0beFyA%2FiCgAPSFvg8ni62i2x8axfEJhiTEEQ%2BMLcu%2BMIz8jUJG2isTuaARxakhMKR4QY2AW%2BbH1hdegThkiEThuMGcaRsirhacPrKLyizsFuBwgQ7DQga%2BEthEhDjh2mzAO%2BMJ8BMUl7h7cMKG7JFzhYTB8u56hD%2BJjwpGUXHxhVwHmErcMKYS8JWIKbkhIq8M6kCOkqWjwIR0wVUXBrOl2Wl%2BhJC88MJ6KkEXhVcPC0mghBUexCp2lgH2W1c0%2F0%2F42LI2MB7hbGj%2Fwb8JXU9pUZQfX1AYYVxYAFxB5CJdVdiZQ1TBCMMbGmsKsA7MJOoMAB0A9zzuQRa3EQNcOahdcNjqLVmjW4J0D2W1WjWbMKumGVAPEFNz6BPkS8otcKEQRUV3BtsUG6oRhNgo4gbh5%2FDwepCLYemuy2qMhUKYlCP74GCP0AhfjJ4koO%2BA7XHPoH7hRgVCL%2FY7NnDS4QU9%2BOABNYqURuhs%2FV9mFwFFsT5gURaYBYRLNz3BGTTuQZ8PEQ7n0xg%2BMOgavCIIeRD2k4u1xakn0FP4YiNY64p1LhRO1f0nCNOcfrUhILx2VQuth6QHjl5a%2ByjvBoEioA%2BMKqissjKwPAHSuycEG4coJ96eEBIufCKR%2BxD0hBziOoRVXH%2B4FN2yUDiP8UIiLf4LiL0y4SIXy9tVoizjUJhGjw8aLcNfhHcKbw3jSSOX%2BzReZpzuQTe2TgLD1ROYJ34R8PwYurSP4BVdzaRNgBb2naGxBNBwIhk%2FHMARc1uBw0I%2BOz%2FyDWPRw2u0zHRwfXEmRICIKRw7CKRhfksRkvFWRN7Crh%2BbHWRReE2RXHXtIeohXhgSHQyWMXKRUNEOR6CMyRDOjORzxDPhowPMA2oAtAmrExuATRP0NQGeRrTlWobyJgcp8IuRjfyOK21jnhYtmfBEyIqRy8KeRgSHXh911eRJSIhAOP3IqsOj%2F20KI0e9FSZQjFWDssOnRcATW%2B4ISjthgVg3g60FhU15F3Iv5ncSHGRU2m0C0O%2BMIARUKLY07iKFWUXA8krcN42UyP8k0YOJOiIRVe8YIXhzKIA07YSqokJGVmzyKacAyyE0j2z8cHqhjG3byoAF9mHOuAHqg1qE3h0SGoQFcLrqjkN2RkiBZRQKMI0ZiOMeU6jykinArhU4Gl0AqRGWk%2FGuReyPfhCUllej5UQU0ejHEuqMsR78OPhzdF3eF8Jk%2BV8OEKDKKxI%2B%2B3IANjHSQWiXDgBRBAA0xGCS1vkF%2BpTl5h4WiUEojFERV02l0sKj64tyK0AmSP90ecVtReqPC0pvAzRxyNBuFPVzR7qLKI9qLbC5wPSR%2BiPER2aJJubqPCR%2BaIORGSP0MteWdUooRkmGnULRWaMrG7o12uFSKbRwiJbRJ1DtO8Lzs%2BKoUMmxVTy8yMyYgZ4W5eF4Ql4QwPfcOAMYucumkmpUy%2FK3aNbR7wz7RpaMbR5aObRNaNcRWDUrCnaOFoW6JHR53X7RzKMHROhiFWIr07CV4L1GA%2FS96W4wnCB6hqO3GlrMvGhdSAqSnAo9CRAoyKqc2xV9ojXEggcLlv%2B4g3N6UxmxEpgycRR6JoRIkxtYe6KrhB6MDYJ6Ofh16LtR5aPARlaJSksKkjavJnT0By1dRA6JXUl53uGYjz64WGLzRaGICOw6NrRDrGNeyGIbRqGJmIHkHlRgWiARNGLLRncKHRCGKyR8il74QYxQxTaOFePyxg67wGDo8YOQxomLox8GOTR26MwU6IwhArJEok0mIiaLGLIxCcM5eCpAL4lEgfqEoFLOoRGPBKxDIicmIi0SZFKGlI2CwcgBdInBgjSoV0wxFmIZ0111M0t13uQoRE8xaiIl46kKZQFyOCKgNABR9GIExVrCDEqYPxClQAdgeuTiAqCQRAkaPC0LEBugZEEmI%2F%2BCnhBsMSxlqLcOFmImIB8LNI%2ByJHuqZB%2BRFyLjKxqNuox4IkwlGNnh7KOhRnKKFRiH3U0zyJ%2BwecPVRgmgRQCr3MAXAlEA5qKAxbwIrh1qJfh9WKshzyPhRgy22WW8KsRGL2xRDmM7SWUnPQrGIZ0rpFmxTmJtYeWKrh%2BAL2wrREEK1ZikyVGH6xLmjnh0uiaIbhxExC2JwxMxG7IZETyxoCLqRhWKWxGZHP0JaLOxOmI2gcWmWxj2JqRICPbhVWIrMW2KrMf2JrMaH2A%2BEWJCMIOPSwn3nhAxIX9%2B6aIYx%2BnTN0OaNExh6MUxI6I7hv00wx12O%2BxuGMjepyNexRGg2xZSFhUOv0YsnAF6xrSJ4WkKPmxA6KRxhSPuRQBkdRJBVlsWMTHEF6MYx2SKkKObBZxcOJbkP8iXR5ez56CfQgMVmjNYCmJpx26LkU%2FoxFxGyKzR8OJJuiOP4xyOPERqOKwab1ypx8uNFxKOOFRigHDEkYlxeuGiARGOLARMxBVxN6OpxUuNbR%2FIKHI%2FoNVW%2FnzbEd1zmcvWKGOC2NNxRyNpxHoiuxtSIrRBkNriTISCqRggNYX9BUGFYgyg%2BKLIaWJAiqcZSiqX9Cui1wwm2sOLk4CeipWvcM5xoAUrRQo0D%2BtoHCEE0lNgej2TxbaLxeZSExmueMtYB2xCxCuNcRzmmcqRwKci0pimMKAEqAewLWRceJJ4s0SdxauLNxGuNden6LImwgE4md8P9xUahyavOKIKu4Pv0KABI%2BfkLWYB5XxIugF66KhFV4CcwU6rSJvwbhwIRaCG7WFtQhAXHyFR3LiXYKSMT2YuyzeO0hQxoy2qR%2BuI9xK6li8jSKWizCiLW3ZnSkfrSgeEQgX6fzVmof9xSO9%2FRcgZYPPosUO5qsSFUIYRTvCR%2FhQgWQBbsaBg1h8dDvIh%2FkSQlABKidyGQgEgDQedfD3xhDwPxJpiPxrGJPxyjTPxX2MNx9SKjURcXBA04k%2BxpvExxCcIl479ycRZCOR%2BvvV5agp1KcGKNrKKURUq0djqAcdn%2Fuk6Lfx8hTpChxEDxtPAfOEoPc8OCCVh9sNvMj9WJRJJmQJdiJUycsiYGdBOPxGj2gxiLCoA3cOux1sMaAA8NbBQdEHU60EkJYu2kJzgFoJXFEHsGBIUJrrB6oz2iOQKhN7hahI0JG4x2OXrQ7uY4RxeWh0j2N21BOue1O%2BdiKlsPd1UQiKNMx9BJOunukb2nx11WslR5Rzz3YCohzcOuqMTxICLUJP8lJ6PGMbR%2BbHiJsRNN48RIaxBqL1KRqNCRTiilsTIDrM371Le570eRxWLCYfyNeRU4F4JD2MFAsWjwcZSHNRlcicW5yO40t7x%2FGB4UHSlxmIBNVU%2BOlaiqJGKHGQf2GbAXNkp4CsxaO6xl0Jmu30JamUCEchJMJjBNgq6xgsJfSCsJcRNTh6hIqKOxmQ%2B%2FiEOMLWkX6D%2FExAqxPSJ6xNsJlaO7%2BnNS8oXRKpAvOiJu6OzXxVhA3x6im4RR4ibh56GIJbcMNxWNQoJkxMD20xNkJRhI8E8xOwhZxJxxsWDqA%2BOIqiMAFj%2BuPAsR4SLzi7xMPhnxK7hwCOOJ%2FcMHh3yzEh4r0Leg2lXeuRN%2Fe6%2F1YmHUjMuoSCAUGLi90xKJySrwFcBPeCCgWhDTWm8GfKF5Ryuda0UkEcEJhwpFDh8hChhcJMRhHZAkI1sO1Q8hAUAikHkIVcPO0poCzhkQjwwpkkIwYiGzApcOSo5cMrhpkgZR2sHZJXEi%2FBaC1XxtuF4AhmThJjEMCOKJJSJ6xLy4%2Fc2FJjIIKxbkjm2C2wH0v52I%2B7VCLW%2BO21JB61yyU6O%2FhNPxp2Tt1YOzUIZ2W2KZ23t1dQ9RQWIRayfh7pjuJOpJahxczOuPN0dJAhOgJm0EXxUqnBRzBXqBRpMRJc4JGxbySlRZWJNKWpz2xe8IbxJBP2RnqM1JTWJ9RilGVmHc1vhyZXvhZpUKBqiD6Ao%2FEJhMwH22RyHdxOBMuC6WBjh6WIEQVEHxhUm1BW6SFjhBsNpg%2BMOAAzj2yW0yygICwIhBvkNOBByyKx84PCEpyxrUdTwOxxFw0QMy25UBuPUaiRLWxbiHn%2BMKLKJ2ROi019h9A8BFtAhRJ0q0SGbIac1iQAaIxefwJaJfiFGQ5L1rxA2LTJcJNKWsKLXhWZIPO0qImx6ISyJfuJzJUUNrK9mLexNRMp8xAJ2xpagBxu2LXinILzIcInWgrxNeWgkNqRlV3bJRZPUa6WHR0uQD8ghMJhh60EMMTeCnhuQAEQxZm5a5FIEQVAEAAX%2BSbAcsgEUh6SyQXIAZVQskfE8xBMqNCm3LYEnY4w5YXNfPj5gd5LZA8bE3k%2FwljLV1hUNSQbqYERSjTNUmtQ%2FebF4xabBAHinkrX0GUg9kjblWHDBgHJqpqJ%2BHcUxSmMEo8kckNMpaHSKJwgjTRqU2cnOQjTTmkaynLLWabsA3JqLTAEphVDJarTD7i5AehZnAmJTHldFDNk7rYOUumF9g%2BuI%2BrBonBY4jHvzCrGMg8KCLqSSlsqJKFXMRJb6k2Kkpg3ykLEENjSqQKlcCVZQdsYKmgrKNg7kqPpkSALp%2FMdWgoAfGHEXHMmxIJKmVIPzH9AgsjpjY8rj3O5CNkp%2BGBU9RBWYv%2BELEY7EIE9HHn4i7HyADPgsolYGLLTcnYEnCnvww%2FBjkmY5Y4v84MVGbFQUiCnluAHG4ZHHCwUn9FZSBCnxXCnj3XRskugscT4w0dRzUmYiYgOQCpwhrrTY5ohj6X%2BGvAz%2FShkhEn5Y27E3iT%2BGcGd0l3UyfH%2Fw28ncqJ6k3Yz3FFKZHBQIvYiXEF%2FHdANVEOgk9RTVNMFs7NvD5ke%2FB4AS%2FYwISUnNYxwAzwn5KnAA2Ao010BmImejzbCKnyg0Mk4ALlFjUgK7%2FGSIGqgp57sQSIlxA7qZWQ00DogkMn3XViwb8Exb1QHlSZkoDr%2FkoRA%2BCKuETA2iK%2Fk11xFaGxY%2FzcJaXzMxE80xADfI%2BcGBie%2FS6gOArtjHEpQAPEoiAQxJBBTkAkQDRBHE40lokto6fkvuF1TFcQa0%2FTBXk2Gb1kiZavADJiSLP6mkEgPQQg80n9zUanzFW%2B7W0yamcUptFTgzRAmk5CZ2gg1jB2Pql8ZASmmgR7GtYk0rdY7UCVyPe6hGXUA%2BAHwGe0ino7ksTFCiKeZ6sN1wzqXEriIbWmFMGwmvFcCEuQm2mfE3JGqEk0nviW5YO025aWks1SYk0YFDEkiD%2BrZVgx0jeFFE8UHzkv0rZbWiA%2Bwq6H5beECFbIIA3QmJHjrdQD74QOHgQH6GkQf6GAwxQggw4QBgw6MCSJHqCA5SGHhwuragremHwwhGlYwUmGb6FGHNbL1CmgF4wjbVUj%2FQsuE6oY%2BljJOGE2STYCpUQAAFuHoguKKcBXYUYcdAFCALAFAsEVs6TRQJODcprOS16aaTbltQAZgCfMn3sz1nPAsRdQNKpSgWlTvyUcsm6deSJtNmVYqsTD0XBcQB2udB8ft0Q%2FGFcR6aavTIyP9DgRg2VgCkGSy%2Fvj8GbDTC7%2BBYJiYauVigM%2FpH8oAAm4GoQtDNQZtDI5KzDOwZSlJmAZDIIZwpRnUtDLcuzDPIZwWEYZ%2FZRpB94J4Zk5WYZnqMwOr%2BiEZLADqJqehdSSDINYKDNP%2BNDKuOgAFbgahBqM1BlqMjko6MrjGKQWhk0KLqm9GIUqLtUIxqMty46MgRmv6LRnCM1RmxVEwAWzRxmoMxxkclVxmYgSGBmk7GD9zYmHQwQnwLtHeqhGRxn47VxkQI0QDOMlRlnxCNoSsLxlh6W5bEw3YSP5EwCAAYIJqECkyXGcky3GZkzCilQBXGb3x%2FofRAdGbOCmkAEyiGV0gUmW5cUmX0DwmckyuASIynUQeUNAHNBloCKhEya0s6gLrlSBFvsoQN4AqwMljH3HhhkOMAywiFvtn6XbpH6XYcxmRA8xaTUAOmX0yRkVyApmY8wlYEo1emYMBO0JcjMMlMz3QMIAX6WrVaaSvoRmUYcemRf5%2BmWIxBmefQgGf%2FTFCUczJmbszxmbPUpmSZS5meszAPu8AlmdbhpIS8z2qGfDQXBMzhzicz5mdZ0LmR4JhmYUwJBIYy%2FFN6IsSP8yPqvczZsLCynmSm4AAmsyboEEhAkE8yoqV8QPyYURIWXtNlmbbRe5mszAoN3VW4v05YAOEBX9CaBXgC8RuAKDD8LKt8VQDsy9mfKxkjGgy3Rl8y1mbSzW8LPSkdMyy7dCiBbkL8zuWfSy6oIyyzvvCzcmakziwVvtp6byymWU8zeOujoZ6JmhAAMiEZSBSZeNIo%2BH%2BCiAUQEOAj4RPMyX3YiqrOoQqrNQZ6rJPyVAHVZbDNowpTKNZutF2A1CF2AqDNvmGDKoA0YBtZkK3JhRf1MZgTLAKZrNXat9nVZNTMziYBWdZgbP5QXgIWIuwAtZ7rPmk5KwtZxbAsE4bNkZZSADZ%2FhTDZaUG%2BaogHTZWYNVZT8MTZDy2sxdyF2AACKighZBLUyjw7qdWyTYyRmJJFlzKQUbNUQuwDIZ7LPLZSjz6O1bNGM9QD8uyKlEATbK6QfBAhRyUwRiFbKLZ1c3Yu50DMqluGYSQgEmxjVViq%2BMM1RqDIVJbrMJhvERJhcbKRKvrLKZEVKX8TtNEU%2BMKoZ9TJIKdyFVJqFMquYTKPZkBW2xLqSHZCADBpjbOJhcBQS%2BZWEZJXsKiUEgUxpJai5A2NKxgQiGpQ%2B2IfJEmJzZ34z%2BEnzjgKpCFbw7gF%2ByKcJthKCVVZskFoZ6NKTJHFOzpJpMxA6rMKYtDJJp1%2BOMWz5P5AwlOzJodIGxcYDfpP5L8QaUBEpdHHzZUtL9a%2FbJNZDRKzZZSBkZ8CK662l21x%2FCmCMGgSQQHuizsT%2BA7GytJIgg3BmBCpMdp8bIhBNMLiZ5KzHZgNIsE17NTZU83P0KrAuIEwP7Z5ckjpMwNvm%2Fc2jA7bLJ4PSzKWj%2FX6W3NPvZWYNxKqhCJBm%2BnLp5K3VJrjPogsnLw5wWF1AESL7ilnJXg1nMk5aByhgsTMZBvjI7Z4I2E4PNQw%2BnjLLp3jPiZFxGhg9EEiGIXPJWHnKHmfnPs5JVKtxTUxFBpbOCA0TN%2FxHzQiZxtwapGXLSWXrPc5YXPJWCTLzZtDILZ%2BbBw5UCmApo2LTZRWky0ytLQ5KGn2RpdNi5RXIhB%2ByKigWHOCAlXKjYdnPdZTBOCwlVMfZtqxxJYGnM5SSJzZZXMQAFqPxCpEF05VrNkgajOAAajJQ5zbKsZcbM65%2BbDUZvchmAVjI8RDHMfZAH2eRynNo5d5ja4FjPaoqrLUZ5XMKY23Kq5BHJq5ObLq5%2BIXSgWQGiQv5itwKzNrIIoGJpTeCE54EES5h%2BAZhXAlVZ1KhQpVrIq5%2F0z65mE0B5wQGB5FTELZpNJzZoTOfBm3Ow5h7VCZmIHCpk3PLkV5KzKbHwh56PI140PIqY83K65QQB65rZD65QQHJ5d3PVkajKjYtPNHUDPN9EeEPRQ5PMp59EGh5rZDJ5kPNB41PKZ5UFGW5pPPLMM8WS5VYgRu6nOm5vWO4BAoPBU2JJTizU37ZOjOR5Us2l0UQEeQHPIx5Uszy4gvPp5pPNBuWvP55OvNhIevOF5uvK25zPNEhYvKXejU2FBkbLUZrrG8%2BerFVZjjPTM9OIcGv3CN5vXJN5%2FXJ55fkG95VPN950YES58F20ehPO652vIt5t3Kt5%2FvO44sEI8UaPMj5xvOj5wQDp55vNN5lvKF5LPPj5lLgw%2BgfK55vvJp5WfP15qfKCA6fIZ5VHUcZy3NkguVOCABfIj55fMPaevPUavCh1xWJCEUcX11S2Igb5evNbIffMw5FXOKYOjMjI63MCJC02ApLvCe5dHNKJglLCYU%2FNO5a5K0QHPOH5q%2FIB45PIhZsPQNiiPIcGr9En5CJWn5D7Ol00VKoAzDNH5q%2FM482MDxZc%2FxBJwWFsZxt1GK%2FOJZMZpWlpzyNfJ0zA%2F%2BoYClmNfLr5K%2FPP55%2FMTUQQHh5%2FfNZ5GzEmQ%2FhL%2F5VABH5UAohE1XL%2FJTFVO5RR11SKTPWmQAqNIVPOyZuTO%2F5ajNr50v3SZGAPBAbfK45uLx45wiif5oRkX%2B60Gr5OAv1QaAt%2F5%2BbE35ULPH5n4w1ZyTMMxcv1wM4vNG5SvM1ZToJh4XPGoFtfIR5Q%2FP%2F5MAseJjnToFwgvBZuLK35nInogkAugFY%2FItx9U1t5vnwl5dRwX%2BQQgcWDuJzYwAsz52HIv5Ygst4G%2FJkFTApAZUMXIFTEj0FEPOsZaiB5CB%2FAb5X%2FJ55BvKO6DfIF5JfIz59fI8FOfMOsGhSYkggrr5xfKJ5UgrT5zfJL5HIMGOObACFIQop5hgqUFTJAsEE3XZu1gsLZbYjgKnYyB5RpH18qrOAAv71TUytNe5fPH1p8RJa59tLa5Q8w65cPPQFpvNyFOczbBjfM55wQBJ5ExBSFGfAc56IRM0MCKAUpnOIBTaALILR2KFJdO%2FpQ8zi5opIRIjguaF3HFxKyQuqFEPJmAY7M5BVgtmFNPNqF3LBPis9gTWatN6unzinGqVOtZ7LJqFmEyvZdTKIFdwiMhXoI%2FpupOyUrxPVZdjGLpzXOGFQpPKFYwuc0LNLa0Bwvr5qwrsY1gpWFRwtCOao1Ys5skgMZ8TCSptALwvL0shwQBphuDOWFOQr%2BFXuMhFBXJhguDMZ5qwvfawWEoZBAoEk%2B0LayN4Hj4kYD2AMazSwCYGUAY4CQQsYEgJH0LsOmwDMARISQgMnXqSCaxdw6Ok7p4QByurQAMgZMJXgHwGXpdMNH569MRhW9JXgKMILkdLJnpDLMIoJEDHpOjMnpMBC8Gg602g5FhyhlWy6geazigv%2BFlh2YBXpSlP5FwAC5FTECasLEDlZDLMdhQeVcsqyRDyY8EAovAH5QQ9LvI%2BIvbwsYAo8%2Bop5FKou1FyIqgFykEFFG9JFFxorFZu9NzQ1LL1AqpDH5QaHW5DNhz5cVlvpgzKXM8LPI5XoMSBlsC%2FpSIrBWLPNKFQ8wAZxoOAZimlppLzL%2Bo3TNRZjFHOZ%2FmWGZiLMlZZYpZZJ8PZILzLRZpoA%2BZKzNVppzI2ZIKK2Z8LP5Z%2BzLAZrwEOZsLMBZ6zOBZJYoRW2YphZjzPLFI4srFVkJrFCzPeZ8LIJZinCJZF%2Fh%2BZviD%2BZs9V7FZzOWoILMeF3rIYFKjSNIMPArFDzNGZkrORZk4vRZ8%2FMlZoFP8Jpq2aAnzP9W3zM2AuXjJZvIEpZ%2B9OUoh9IDwihSYqDPMec%2Fq11AIrPFFYrL5ZTzMFZHSHnFieD9FmeEAlkrOAlXmGFZ4EvFZ7YrfwdogRA4wAz4X4plZRhzglkEpZZSrNKQM9DwR%2FbLTZXuhSIqDDmBL7N1Z%2BrOLwhrIQZKX0Y5oHJZKH%2BRsFkFFSA%2BwstB27MbKkxkfyjrMbZLrI5KHrKzF1zJKZO7Iq8abLA5hEtOYxEpKimbIjZjbOEl%2FbOY5rYlzZ9%2BjwRm7VCMMbO1gfEv7mO%2FNEUKbNNZsvzuQiAogF82mLZ0bKfhDnPIhkWI95KBXHhC60dw7VA%2BALV3CBquHGQjEAA5dkrhiMoHFKfgIqBCr3slMwM50P1PvmiYrDQMIPZUAqMZB0HQWpQdMvJXIAxOBenVWcDO5kkDIoWwIoXJFahpEVanOWh1PClPUKMwwUpGBe7xqpjmGDiE%2BOlktNKyBKZIRiQUsbmz%2BndirwE%2BgDW1pgU1FppawM3JM5MwhyYInGqwJQAcMQ5RzxO8l4RInQefJdpo0i3xDYN9EBnKVUV8LOWa5PeBhnLeZwwoaIPgkJgnIIAGQdK5AMC1HxMwLmBBlN0hkEJwhqCLwRVECal1pO1gRcKc8Wj1CMjpK6%2BaxnDJLpJTcbpOm51O19mTqDYO%2FlGtQjO2syAZN3ZogCZpFUssWlwsjJhwJWhTkVjJ%2BIThp5kCXmsSUZFpWBa2Cogxpejx2hbXFIl2S11ACQMHFfWyTF2Sn7m1Wx6B42wBlY0sYhSIu9B%2FEPMFztLbBbDIXB0kPKlTvSy2UE2NBgUKG2TUPuJLUMJlrkKghmXWxlE%2BVxlFwtuln9Il4h80JlZIJtBJyLWl7wH%2FmeJIGxDMrDJTMojJJImmB7owll%2FhKFlkENnBji1dYbNIAp4lOCABa17koCzKQv0rVlVIFxB2GjDxrCL5x3uJA5491l55n3456%2BH1F9Uq4EM5BwZ7rJmBSUMAhCYt2lJMrtpyy2KY7QrZUcwJ6lyoKjBVeLLmyMoJ5WEKA2MX3Sp1mOKObnMhBLYM6w8gtAFqiGg6vtKxZpSH8JbMs5BOIK3BeINvs2nxZMubNNlRiL46DYxjloRi0QVzK8hE4O9ld2k7IqrNtBc0pnmbsuDs%2F%2FXw5l83FlYlPKxg2JAWxcMP5ji3o5MbKuME5IVRvNwPK73O1ynY2ZJ8hBxlMMD5FMMHm55fPQFvwvNpU5H%2B5cctnlQkJ1FFZEXlS3MCFcIrqFXSGq2llJnlE%2BSigcgGrUrq1b0E0rRBRnMBIxHK7liUvqBBa0z0UXExmry2LM3Ehvl84L6W98v%2FJF4opxCVPBA6WHm5CgEQ52YEgIcgBJgbKl2AWiFAVIAukFJ1N3JdwPylONOFUlRlO5%2F6IAVI7PvmkCph4YbNVZrAReeLwMnxC%2FnUlUEIgIDoiTliCqF5ZoPChCxA%2F%2B0YBm2h%2BCNWjfM8a45PFOc5IRevXS7xBpUbZuPMHZI8pnUIq1YVJgqQVPkKJgVCq8FNCvVkMxwQVbxPEVTCjkpCxEoFbCp3FciuoVCiqF5cisH5MivQFhWNn5zyIX5j1w8pxpVmqdomoQ2aiuMWIF6FNiohA6WBxACgF2AVawmIe8uUgoPLZUNKmxAaAFYVTCu62S8voFOwK6Q%2Bq3WgYitoVMQvYVXAkH5BisaxGLIP5i%2FNMVXMhqMKRHGRaitHUZoLgFXNIQFz3KmMrq0QlyEv1Wu3IiVO4sbBYSth6xSvSV%2FIJG5lEkhmCAAklREoBR0ugbUjiv0UUirKVu4tcVywsmISEvGAngvaVfFO%2BWoCgCV4cUTyBSr6V24sqV5iCQAaADtEoiomV4SoA0pwoEUryhXRyOA2udlURmdSq0qERzNYLSsS5zCu8VrCu6V8iujhkyujl1c3vebivhJPSqQA4yr0VfFIFQJs3eFwyrL5kSoqV4StQB1dLt53ApFB7anTl9ILc00dCuVSctsFSADXJCIHGmty03lRlLBWnZHm5eyq3ZQmHUhfcUeQCKt3lsIrRF%2FwvIoZlQZQLysOF5iBtYwKqtZ6smjAeljiAFgrwAJxFCuQhX4ViAB8pC5L6FuwChK1mOG%2BSsCiYbe3OFaCyqlepM5lUwG5lWpN5lVwqpAAsv4l1conmzmiDFFkPeFvKp0Wry1H5GKswmIqpTFvsuQVaKGxEW8s3FbIJEhbiHTF88vhF3yxBxiMyLWoJFx4cqqgFCqutYRKpXl40pBF%2BLRNVObDNVaYs%2BF%2BqrIFpbEEkb0Ag8xFxwQDovJFYwAo8rovvmGookI7otTF6sn1F%2Bu3WwcEoDFO6H%2BKwYGzAoYsEQ4YojgkYohAN9LvpQMFjFezKRSXksClNqmM%2B4LMdVNCirlEILfgpMpmBeYq6ZxzMLF%2FYroJpYrHFB4qfpR4uTp1YsLFbzPbFs4sbF8zPsQLYttA2zKmZrss30larsOq4qLF64oHF42yHFMQ0PFLLP3FktkhIJ4rrFM4pvFoEoU6D4vMA5LKrATKCDFboHfFQ9M%2FFf9RAlXYppZmEoVZUEu%2FFK6r%2FF8rIlZLLOglmwFhZJ6uvVduhwlZmBno6tDVZg0su5O0sCeRkp6pzbK%2FVHssCe1UuhKc2yJp8rVXiOkWfeS1zJOVQOppbTP50DktowTkpwwH6pnUHwDqBfCxzVmhKX84QIul80KppiyOyW%2FktallUoxleUqR5MeIiacUH7mEUt357cu%2B00UveAsUvwE8UtZ0A2OSlJCrWE16mVmq5OmYQbmo1OUovQwUt%2FmTcupBfePaxA0pCwFC0%2BppUs7FeAGplSstI1QGpZVyzmuo5hAygaRFG%2BLSDqSSLXPJiRH8IRiDb2flJ3Ifc3RlxkMxlFIEn4har%2Fp36sAZpmpLVZapzMJVwU1NmtFV9mrpxP7yylyqvlVgQstBtmonV1zLUUlmt4pw%2FP2m%2F9Iz4xaozFDmrP%2B%2BbzBUhoghUHyUl5hLw41GkOS018P8QwmQqpkHP5gugG3MXiVVSM6jMRGiFhJNrCs1fmoA19mp3mKlJK1wWv5F1mpLV4Wrs1kWqi1Ocoo5hHMTQUqMlpR%2FMgCZog0KfHMUgCSFpyCED8lk5SqlWJEn4xWq81nooa1%2FmsA1h8qjcccsE1XFJtUEWru0a2GZ6wKVdUm%2BnMhL%2FyAeHzRlAd%2BJ5QZJ1cpumHtAbxla6%2BEH34wuMw1VkN%2Fw3Kv1wm2syBDYDVKhF1cQVGrzVE2tK1rmqa1jcsmlJ2p9AbxlRlVwFJg54AR6uTNJFCfF9VwtSbwYotnp48AdwECA9Ap2QjQ6orRImopDVIWr1F29PJhhoujVcQDWhXwHO%2BXoDjVCap1QSarigKavBAaapjFi2TjFIuHh1WMCHykIEw1b2qbU%2BavPQn2pW13rKi1a6o3VlLKJ10JFEAGjNuZw5wfVCEufVokFfVKGoVR1qHx1g0tRm7qG58CvnvKQ61%2ByeuBR1qnDR188oZ5mOuFF2OsjVMOpNFaGFhlruD%2B1s2HjVX0kTVS%2Fgp1V9OjFENEzVr9OBSM0LU0fZDZ11WvUpIWum15Wu%2B1RLB51T4qZQ%2BOrqcnoFjVAurUZvKGVZT9m6cu7I0QTuu5UmGqjJMGvM%2BUBjHgR5Ayh3hCg5lIoI2S2G4gJhARaLSCEAPqujATosXpuupXgyoo7YWuq9F5MKRhWOpXg5MCjVRur3pR6uBAIYot1pOqt1YPip1dupp1WauE1M2q9BdUOTFVmt1VVerK1XKoC1PutJZ66r91m%2FCb1O6q6QQuvvVBuoAlp6uwlYetwlrvFclM6iBALVxmhI0KwwauCl1dyCBA8em9wjuCaQsus31oRiBAoZJj1c2p0iu%2BoiBnmDw1YEwI1q6ONB3UM9pfUObV6QPmlogGv1olMppPN2P1q8tEAeMUgZtUKIwr1P%2FeucteeQyo8l3Klv1shRDlpOm310mupkCxErljWru0A%2BoE1d2qrFP%2BpnmHUDe65ENaAvTPayQAA",
  "decoded_source_utf8": "/-\nErdos820Single.lean — single-file version of the Lean 4 formalization of\n\"Coprime Power Differences\" (Erdos problem #820, partial solution; see 820-partial.tex).\n\nBuilt against Lean 4.28.0 / Mathlib v4.28.0.  Sorry-free; main results:\n  Erdos820.log_K_le, Erdos820.log_H_le          (Theorem 1.1, C = 500)\n  Erdos820.sieve                                 (Lemma 2.1)\n  Erdos820.log_card_divisors_le                  (Lemma 3.2, Wigert)\n  Erdos820.loglog_K_le, Erdos820.loglog_H_le,\n  Erdos820.K_lt_exp, Erdos820.H_le_K_and_K_lt_exp, Erdos820.H_lt_exp  (Corollary 1.2)\n\nConcatenation of Erdos820/{Defs,SymmBounds,Counting,RootsBound,Sieve,Main,Wigert,Corollary}.lean\n-/\nimport Mathlib\n\nnamespace Erdos820\n\n/-! ## From Erdos820/Defs.lean -/\n\n/-\nErdős problem #820 — \"Coprime Power Differences\", definitions and basic facts.\n\nFor `n ≥ 2`:\n* `K n` is the least `k ≥ 2` such that `gcd (k^n - 1) (2^n - 1) = 1`;\n* `H n` is the least `b ≥ 3` such that `gcd (a^n - 1) (b^n - 1) = 1`\n  for some `2 ≤ a < b`.\n\nThis file defines both functions and proves that they are well defined,\nthat `3 ≤ K n`, and that `H n ≤ K n`.\n-/\n\n\n/-- The admissible set for `K n`: integers `k ≥ 2` with `k^n - 1` coprime to `2^n - 1`. -/\ndef KSet (n : ℕ) : Set ℕ := {k : ℕ | 2 ≤ k ∧ Nat.gcd (k ^ n - 1) (2 ^ n - 1) = 1}\n\n/-- `K n` is the least `k ≥ 2` such that `gcd (k^n - 1, 2^n - 1) = 1`\n(denoted `H₁(n)` by Erdős). -/\nnoncomputable def K (n : ℕ) : ℕ := sInf (KSet n)\n\n/-- The admissible set for `H n`: integers `b ≥ 3` such that some `2 ≤ a < b`\nhas `a^n - 1` coprime to `b^n - 1`. -/\ndef HSet (n : ℕ) : Set ℕ :=\n  {b : ℕ | 3 ≤ b ∧ ∃ a : ℕ, 2 ≤ a ∧ a < b ∧ Nat.gcd (a ^ n - 1) (b ^ n - 1) = 1}\n\n/-- `H n` is the least `b ≥ 3` admitting a \"coprime partner\" `2 ≤ a < b`. -/\nnoncomputable def H (n : ℕ) : ℕ := sInf (HSet n)\n\n/-- `2^n - 1` itself is admissible for `K n` when `n ≥ 2`:\nevery prime divisor `p` of `A = 2^n - 1` divides `A^n`, hence not `A^n - 1`. -/\ntheorem A_mem_KSet {n : ℕ} (hn : 2 ≤ n) : (2 ^ n - 1) ∈ KSet n := by\n  have h4 : (4 : ℕ) ≤ 2 ^ n := by\n    calc (4 : ℕ) = 2 ^ 2 := by norm_num\n    _ ≤ 2 ^ n := Nat.pow_le_pow_right (by norm_num) hn\n  constructor\n  · omega\n  · set A := 2 ^ n - 1 with hA\n    have hA3 : 3 ≤ A := by omega\n    have hApow : 1 ≤ A ^ n := Nat.one_le_pow _ _ (by omega)\n    have hd1 : Nat.gcd (A ^ n - 1) A ∣ A ^ n - 1 := Nat.gcd_dvd_left _ _\n    have hd2 : Nat.gcd (A ^ n - 1) A ∣ A ^ n :=\n      (Nat.gcd_dvd_right _ _).trans (dvd_pow_self A (by omega))\n    have h1 : Nat.gcd (A ^ n - 1) A ∣ A ^ n - (A ^ n - 1) := Nat.dvd_sub hd2 hd1\n    rw [Nat.sub_sub_self hApow] at h1\n    exact Nat.dvd_one.mp h1\n\ntheorem KSet_nonempty {n : ℕ} (hn : 2 ≤ n) : (KSet n).Nonempty :=\n  ⟨2 ^ n - 1, A_mem_KSet hn⟩\n\ntheorem K_mem_KSet {n : ℕ} (hn : 2 ≤ n) : K n ∈ KSet n :=\n  Nat.sInf_mem (KSet_nonempty hn)\n\ntheorem K_le {n k : ℕ} (hk : k ∈ KSet n) : K n ≤ k := Nat.sInf_le hk\n\ntheorem two_le_K {n : ℕ} (hn : 2 ≤ n) : 2 ≤ K n := (K_mem_KSet hn).1\n\n/-- `K n` is coprime in the defining sense. -/\ntheorem K_coprime {n : ℕ} (hn : 2 ≤ n) : Nat.gcd ((K n) ^ n - 1) (2 ^ n - 1) = 1 :=\n  (K_mem_KSet hn).2\n\n/-- `K n ≥ 3`: indeed `k = 2` fails since `gcd (2^n-1, 2^n-1) = 2^n - 1 > 1`. -/\ntheorem three_le_K {n : ℕ} (hn : 2 ≤ n) : 3 ≤ K n := by\n  have h2 : 2 ≤ K n := two_le_K hn\n  have h4 : (4 : ℕ) ≤ 2 ^ n := by\n    calc (4 : ℕ) = 2 ^ 2 := by norm_num\n    _ ≤ 2 ^ n := Nat.pow_le_pow_right (by norm_num) hn\n  rcases Nat.lt_or_ge (K n) 3 with h | h\n  · exfalso\n    have hK2 : K n = 2 := by omega\n    have := K_coprime hn\n    rw [hK2, Nat.gcd_self] at this\n    omega\n  · exact h\n\n/-- Upper bound recorded in the paper: `K n ≤ 2^n - 1`. -/\ntheorem K_le_A {n : ℕ} (hn : 2 ≤ n) : K n ≤ 2 ^ n - 1 := K_le (A_mem_KSet hn)\n\n/-- `K n` witnesses membership of the pair `(2, K n)` in the defining set of `H`. -/\ntheorem K_mem_HSet {n : ℕ} (hn : 2 ≤ n) : K n ∈ HSet n := by\n  refine ⟨three_le_K hn, 2, le_refl 2, ?_, ?_⟩\n  · have := three_le_K hn; omega\n  · rw [Nat.gcd_comm]\n    exact K_coprime hn\n\ntheorem HSet_nonempty {n : ℕ} (hn : 2 ≤ n) : (HSet n).Nonempty :=\n  ⟨K n, K_mem_HSet hn⟩\n\ntheorem H_mem_HSet {n : ℕ} (hn : 2 ≤ n) : H n ∈ HSet n :=\n  Nat.sInf_mem (HSet_nonempty hn)\n\ntheorem three_le_H {n : ℕ} (hn : 2 ≤ n) : 3 ≤ H n := (H_mem_HSet hn).1\n\n/-- The basic comparison `H n ≤ K n`. -/\ntheorem H_le_K {n : ℕ} (hn : 2 ≤ n) : H n ≤ K n := Nat.sInf_le (K_mem_HSet hn)\n\n\n/-! ## From Erdos820/SymmBounds.lean -/\n\n/-\nAnalytic and combinatorial toolbox for the sieve lemma:\n\n* elementary symmetric sums `esymm P f j` over `j`-element subsets and the\n  bound `j! * e_j(f) ≤ (∑ f)^j`;\n* the product lower bound `∏ (1 - a_p) ≥ exp (-2σ)` for `0 ≤ a_p ≤ 1/2`;\n* the exponential-tail estimate `∑_{j ≥ m} σ^j/j! ≤ exp (-2σ)/2` for\n  `m ≥ 20(σ+1)`;\n* harmonic-type sums: `∑_{j=2}^{K} 1/j ≤ log K`, and the fact that a sum of\n  reciprocals of distinct integers `≥ 2` is at most the corresponding\n  initial-segment sum.\n-/\n\n\nopen Finset\n\n/-! ### Elementary exponential inequalities -/\n\n/-- `exp x ≤ (1 - x)⁻¹` for `x < 1`. -/\nlemma exp_le_inv_one_sub {x : ℝ} (hx : x < 1) : Real.exp x ≤ (1 - x)⁻¹ := by\n  have h1 : 0 < 1 - x := by linarith\n  rw [inv_eq_one_div, le_div_iff₀ h1]\n  have h2 : 1 - x ≤ Real.exp (-x) := by linarith [Real.add_one_le_exp (-x)]\n  calc Real.exp x * (1 - x) ≤ Real.exp x * Real.exp (-x) :=\n        mul_le_mul_of_nonneg_left h2 (Real.exp_nonneg x)\n  _ = 1 := by rw [← Real.exp_add]; simp\n\n/-- `exp (-2x) ≤ 1 - x` for `0 ≤ x ≤ 1/2`. -/\nlemma exp_neg_two_mul_le {x : ℝ} (h0 : 0 ≤ x) (h2 : x ≤ 1/2) :\n    Real.exp (-(2 * x)) ≤ 1 - x := by\n  rw [Real.exp_neg, inv_eq_one_div, div_le_iff₀ (Real.exp_pos _)]\n  have hexp : 1 + 2 * x ≤ Real.exp (2 * x) := by linarith [Real.add_one_le_exp (2 * x)]\n  have hkey : 1 ≤ (1 - x) * (1 + 2 * x) := by nlinarith\n  have hmono : (1 - x) * (1 + 2 * x) ≤ (1 - x) * Real.exp (2 * x) :=\n    mul_le_mul_of_nonneg_left hexp (by linarith)\n  linarith\n\n/-! ### Elementary symmetric sums -/\n\n/-- The `j`-th elementary symmetric sum of `f` over the finite set `P`. -/\ndef esymm (P : Finset ℕ) (f : ℕ → ℝ) (j : ℕ) : ℝ :=\n  ∑ J ∈ P.powersetCard j, ∏ p ∈ J, f p\n\n@[simp] lemma esymm_zero (P : Finset ℕ) (f : ℕ → ℝ) : esymm P f 0 = 1 := by\n  simp [esymm]\n\nlemma esymm_eq_zero_of_card_lt {P : Finset ℕ} {f : ℕ → ℝ} {j : ℕ} (h : #P < j) :\n    esymm P f j = 0 := by\n  rw [esymm, Finset.powersetCard_eq_empty.mpr h, Finset.sum_empty]\n\nlemma esymm_nonneg {P : Finset ℕ} {f : ℕ → ℝ} (hf : ∀ p ∈ P, 0 ≤ f p) (j : ℕ) :\n    0 ≤ esymm P f j := by\n  apply Finset.sum_nonneg\n  intro J hJ\n  have hJP : J ⊆ P := (Finset.mem_powersetCard.mp hJ).1\n  exact Finset.prod_nonneg fun p hp => hf p (hJP hp)\n\n/-- Expansion of an elementary symmetric sum over `insert x P`. -/\nlemma esymm_insert {x : ℕ} {P : Finset ℕ} (hx : x ∉ P) (f : ℕ → ℝ) (j : ℕ) :\n    esymm (insert x P) f (j + 1) = esymm P f (j + 1) + f x * esymm P f j := by\n  classical\n  have hdisj : Disjoint (P.powersetCard (j + 1)) ((P.powersetCard j).image (insert x)) := by\n    rw [Finset.disjoint_left]\n    intro J hJ1 hJ2\n    obtain ⟨J', hJ', rfl⟩ := Finset.mem_image.mp hJ2\n    have hxJ : x ∈ insert x J' := Finset.mem_insert_self x J'\n    have hsub : insert x J' ⊆ P := (Finset.mem_powersetCard.mp hJ1).1\n    exact hx (hsub hxJ)\n  have hinj : ∀ J1 ∈ P.powersetCard j, ∀ J2 ∈ P.powersetCard j,\n      insert x J1 = insert x J2 → J1 = J2 := by\n    intro J1 h1 J2 h2 heq\n    have hx1 : x ∉ J1 := fun hmem => hx ((Finset.mem_powersetCard.mp h1).1 hmem)\n    have hx2 : x ∉ J2 := fun hmem => hx ((Finset.mem_powersetCard.mp h2).1 hmem)\n    rw [← Finset.erase_insert hx1, heq, Finset.erase_insert hx2]\n  rw [esymm, Finset.powersetCard_succ_insert hx, Finset.sum_union hdisj,\n    Finset.sum_image hinj]\n  congr 1\n  rw [esymm, Finset.mul_sum]\n  apply Finset.sum_congr rfl\n  intro J hJ\n  have hxJ : x ∉ J := fun hmem => hx ((Finset.mem_powersetCard.mp hJ).1 hmem)\n  rw [Finset.prod_insert hxJ]\n\n/-- Binomial-type inequality: `σ^(j+1) + (j+1)·c·σ^j ≤ (σ+c)^(j+1)` for `σ, c ≥ 0`. -/\nlemma pow_succ_binomial_le {s c : ℝ} (hs : 0 ≤ s) (hc : 0 ≤ c) (j : ℕ) :\n    s ^ (j + 1) + (j + 1 : ℝ) * c * s ^ j ≤ (s + c) ^ (j + 1) := by\n  induction j with\n  | zero => norm_num\n  | succ j ih =>\n    have h1 : (0 : ℝ) ≤ s + c := by linarith\n    have hpj : (0 : ℝ) ≤ s ^ j := pow_nonneg hs j\n    have hjn : (0 : ℝ) ≤ (j : ℝ) := Nat.cast_nonneg j\n    push_cast\n    have step : s ^ (j + 1 + 1) + ((j : ℝ) + 1 + 1) * c * s ^ (j + 1)\n        ≤ (s + c) * (s ^ (j + 1) + ((j : ℝ) + 1) * c * s ^ j) := by\n      have e1 : s ^ (j + 1 + 1) = s * (s * s ^ j) := by ring\n      have e2 : s ^ (j + 1) = s * s ^ j := by ring\n      rw [e1, e2]\n      nlinarith [mul_nonneg (mul_nonneg hjn (mul_nonneg hc hc)) hpj,\n        mul_nonneg (mul_nonneg hc hc) hpj]\n    calc s ^ (j + 1 + 1) + ((j : ℝ) + 1 + 1) * c * s ^ (j + 1)\n        ≤ (s + c) * (s ^ (j + 1) + ((j : ℝ) + 1) * c * s ^ j) := step\n    _ ≤ (s + c) * (s + c) ^ (j + 1) := mul_le_mul_of_nonneg_left ih h1\n    _ = (s + c) ^ (j + 1 + 1) := by ring\n\n/-- The key elementary symmetric estimate: `j! · e_j(f) ≤ (∑ f)^j` for `f ≥ 0`. -/\nlemma factorial_mul_esymm_le (f : ℕ → ℝ) (P : Finset ℕ) :\n    (∀ p ∈ P, 0 ≤ f p) → ∀ j : ℕ,\n      (j.factorial : ℝ) * esymm P f j ≤ (∑ p ∈ P, f p) ^ j := by\n  classical\n  induction P using Finset.induction_on with\n  | empty =>\n    intro _ j\n    cases j with\n    | zero => simp\n    | succ j =>\n      rw [esymm_eq_zero_of_card_lt (by simp)]\n      simp\n  | @insert x s hx ih =>\n    intro hf j\n    have hfx : 0 ≤ f x := hf x (Finset.mem_insert_self x s)\n    have hfs : ∀ p ∈ s, 0 ≤ f p := fun p hp => hf p (Finset.mem_insert_of_mem hp)\n    have hs : 0 ≤ ∑ p ∈ s, f p := Finset.sum_nonneg hfs\n    cases j with\n    | zero => simp\n    | succ j =>\n      rw [esymm_insert hx, Finset.sum_insert hx]\n      have h1 := ih hfs (j + 1)\n      have h2 := ih hfs j\n      have key : (∑ p ∈ s, f p) ^ (j + 1) + (j + 1 : ℝ) * f x * (∑ p ∈ s, f p) ^ j\n          ≤ (∑ p ∈ s, f p + f x) ^ (j + 1) := pow_succ_binomial_le hs hfx j\n      have hfact : ((j + 1).factorial : ℝ) = (j + 1 : ℝ) * (j.factorial : ℝ) := by\n        rw [Nat.factorial_succ]; push_cast; ring\n      have e2 : ((j + 1).factorial : ℝ) * (f x * esymm s f j)\n          ≤ (j + 1 : ℝ) * f x * (∑ p ∈ s, f p) ^ j := by\n        rw [hfact]\n        calc (j + 1 : ℝ) * (j.factorial : ℝ) * (f x * esymm s f j)\n            = (j + 1 : ℝ) * f x * ((j.factorial : ℝ) * esymm s f j) := by ring\n        _ ≤ (j + 1 : ℝ) * f x * (∑ p ∈ s, f p) ^ j := by\n            apply mul_le_mul_of_nonneg_left h2\n            positivity\n      calc ((j + 1).factorial : ℝ) * (esymm s f (j + 1) + f x * esymm s f j)\n          = ((j + 1).factorial : ℝ) * esymm s f (j + 1)\n            + ((j + 1).factorial : ℝ) * (f x * esymm s f j) := by ring\n      _ ≤ (∑ p ∈ s, f p) ^ (j + 1) + (j + 1 : ℝ) * f x * (∑ p ∈ s, f p) ^ j :=\n          add_le_add h1 e2\n      _ ≤ (∑ p ∈ s, f p + f x) ^ (j + 1) := key\n      _ = (f x + ∑ p ∈ s, f p) ^ (j + 1) := by rw [add_comm]\n\n/-- Corollary: `e_j(f) ≤ (∑ f)^j / j!`. -/\nlemma esymm_le_pow_div_factorial {f : ℕ → ℝ} {P : Finset ℕ}\n    (hf : ∀ p ∈ P, 0 ≤ f p) (j : ℕ) :\n    esymm P f j ≤ (∑ p ∈ P, f p) ^ j / (j.factorial : ℝ) := by\n  have hfp : (0 : ℝ) < (j.factorial : ℝ) := by exact_mod_cast j.factorial_pos\n  rw [le_div_iff₀ hfp]\n  calc esymm P f j * (j.factorial : ℝ) = (j.factorial : ℝ) * esymm P f j := by ring\n  _ ≤ (∑ p ∈ P, f p) ^ j := factorial_mul_esymm_le f P hf j\n\n/-- Product lower bound `∏ (1 - a_p) ≥ exp (-2 ∑ a_p)` when each `a_p ∈ [0, 1/2]`. -/\nlemma exp_le_prod_one_sub {P : Finset ℕ} {a : ℕ → ℝ}\n    (h0 : ∀ p ∈ P, 0 ≤ a p) (h2 : ∀ p ∈ P, a p ≤ 1/2) :\n    Real.exp (-(2 * ∑ p ∈ P, a p)) ≤ ∏ p ∈ P, (1 - a p) := by\n  have hrw : -(2 * ∑ p ∈ P, a p) = ∑ p ∈ P, -(2 * a p) := by\n    rw [Finset.mul_sum, ← Finset.sum_neg_distrib]\n  rw [hrw, Real.exp_sum]\n  exact Finset.prod_le_prod (fun p _ => (Real.exp_pos _).le)\n    (fun p hp => exp_neg_two_mul_le (h0 p hp) (h2 p hp))\n\n/-! ### Factorial and tail estimates -/\n\n/-- `m^m ≤ m! · e^m`. -/\nlemma pow_self_le_factorial_mul_exp (m : ℕ) :\n    (m : ℝ) ^ m ≤ (m.factorial : ℝ) * Real.exp 1 ^ m := by\n  induction m with\n  | zero => simp\n  | succ m ih =>\n    have hexp1 : (1 : ℝ) ≤ Real.exp 1 := by linarith [Real.add_one_le_exp (1 : ℝ)]\n    rcases Nat.eq_zero_or_pos m with rfl | hm\n    · simp\n    · have hm1 : (1 : ℝ) ≤ (m : ℝ) := by exact_mod_cast hm\n      have hmpos : (0 : ℝ) < (m : ℝ) := by linarith\n      have key : ((m : ℝ) + 1) ^ m ≤ Real.exp 1 * (m : ℝ) ^ m := by\n        have h3 : 1 + 1 / (m : ℝ) ≤ Real.exp (1 / (m : ℝ)) := by\n          linarith [Real.add_one_le_exp (1 / (m : ℝ))]\n        have h4 : (1 + 1 / (m : ℝ)) ^ m ≤ Real.exp (1 / (m : ℝ)) ^ m :=\n          pow_le_pow_left₀ (by positivity) h3 m\n        have h5 : Real.exp (1 / (m : ℝ)) ^ m = Real.exp 1 := by\n          rw [← Real.exp_nat_mul]\n          congr 1\n          field_simp\n        have h6 : ((m : ℝ) + 1) ^ m = (m : ℝ) ^ m * (1 + 1 / (m : ℝ)) ^ m := by\n          rw [← mul_pow]\n          congr 1\n          field_simp\n        calc ((m : ℝ) + 1) ^ m = (m : ℝ) ^ m * (1 + 1 / (m : ℝ)) ^ m := h6\n        _ ≤ (m : ℝ) ^ m * Real.exp 1 := by\n            apply mul_le_mul_of_nonneg_left _ (by positivity)\n            rw [← h5]; exact h4\n        _ = Real.exp 1 * (m : ℝ) ^ m := by ring\n      have hfact : ((m + 1).factorial : ℝ) = ((m : ℝ) + 1) * (m.factorial : ℝ) := by\n        rw [Nat.factorial_succ]; push_cast; ring\n      calc ((m + 1 : ℕ) : ℝ) ^ (m + 1) = ((m : ℝ) + 1) * ((m : ℝ) + 1) ^ m := by\n            push_cast; ring\n      _ ≤ ((m : ℝ) + 1) * (Real.exp 1 * (m : ℝ) ^ m) :=\n          mul_le_mul_of_nonneg_left key (by positivity)\n      _ ≤ ((m : ℝ) + 1) * (Real.exp 1 * ((m.factorial : ℝ) * Real.exp 1 ^ m)) := by\n          apply mul_le_mul_of_nonneg_left _ (by positivity)\n          exact mul_le_mul_of_nonneg_left ih (Real.exp_nonneg 1)\n      _ = ((m + 1).factorial : ℝ) * Real.exp 1 ^ (m + 1) := by\n          rw [hfact]; ring\n\n/-- `σ^m / m! ≤ (e/20)^m` provided `0 ≤ 20σ ≤ m`. -/\nlemma pow_div_factorial_le {s : ℝ} {m : ℕ} (hs : 0 ≤ s) (hm : 20 * s ≤ (m : ℝ)) :\n    s ^ m / (m.factorial : ℝ) ≤ (Real.exp 1 / 20) ^ m := by\n  have hfp : (0 : ℝ) < (m.factorial : ℝ) := by exact_mod_cast m.factorial_pos\n  have h20 : (0 : ℝ) < (20 : ℝ) ^ m := by positivity\n  rw [div_pow, div_le_div_iff₀ hfp h20]\n  calc s ^ m * 20 ^ m = (20 * s) ^ m := by rw [mul_pow]; ring_nf\n  _ ≤ (m : ℝ) ^ m := pow_le_pow_left₀ (by positivity) hm m\n  _ ≤ (m.factorial : ℝ) * Real.exp 1 ^ m := pow_self_le_factorial_mul_exp m\n  _ = Real.exp 1 ^ m * (m.factorial : ℝ) := by ring\n\n/-- Tail bound: if `m ≥ 20(σ+1)` then `∑_{j ∈ [m, B)} σ^j / j! ≤ exp (-2σ)/2`. -/\nlemma tail_sum_le {s : ℝ} (hs : 0 ≤ s) {m : ℕ} (hm : 20 * (s + 1) ≤ (m : ℝ)) (B : ℕ) :\n    ∑ j ∈ Finset.Ico m B, s ^ j / (j.factorial : ℝ) ≤ Real.exp (-(2 * s)) / 2 := by\n  have hm20 : (20 : ℝ) ≤ (m : ℝ) := by linarith\n  have hm1 : 1 ≤ m := by exact_mod_cast le_trans (by norm_num : (1:ℝ) ≤ 20) hm20\n  have hmpos : (0 : ℝ) < (m : ℝ) := by linarith\n  -- termwise: σ^(m+d)/(m+d)! ≤ σ^m/m! · (1/2)^d\n  have hterm : ∀ d : ℕ, s ^ (m + d) / ((m + d).factorial : ℝ)\n      ≤ s ^ m / (m.factorial : ℝ) * (1/2 : ℝ) ^ d := by\n    intro d\n    induction d with\n    | zero => simp\n    | succ d ihd =>\n      have hfnz : ((m + d).factorial : ℝ) ≠ 0 := by\n        exact_mod_cast (m + d).factorial_pos.ne'\n      have hd1 : (0 : ℝ) < (m : ℝ) + (d : ℝ) + 1 := by\n        have : (0:ℝ) ≤ (d:ℝ) := Nat.cast_nonneg d\n        linarith\n      have hidx : m + (d + 1) = (m + d) + 1 := by omega\n      have hfs : (((m + d) + 1).factorial : ℝ)\n          = ((m : ℝ) + (d : ℝ) + 1) * ((m + d).factorial : ℝ) := by\n        rw [Nat.factorial_succ]; push_cast; ring\n      have hratio : s / ((m : ℝ) + (d : ℝ) + 1) ≤ 1/2 := by\n        rw [div_le_iff₀ hd1]\n        have : (0:ℝ) ≤ (d:ℝ) := Nat.cast_nonneg d\n        linarith\n      have hsplit : s ^ (m + (d + 1)) / ((m + (d + 1)).factorial : ℝ)\n          = (s / ((m : ℝ) + (d : ℝ) + 1)) * (s ^ (m + d) / ((m + d).factorial : ℝ)) := by\n        rw [hidx, hfs, pow_succ]\n        field_simp\n        try ring\n      rw [hsplit]\n      calc (s / ((m : ℝ) + (d : ℝ) + 1)) * (s ^ (m + d) / ((m + d).factorial : ℝ))\n          ≤ (1/2 : ℝ) * (s ^ m / (m.factorial : ℝ) * (1/2 : ℝ) ^ d) := by\n            apply mul_le_mul hratio ihd (by positivity) (by norm_num)\n      _ = s ^ m / (m.factorial : ℝ) * (1/2 : ℝ) ^ (d + 1) := by ring\n  -- sum the geometric bound\n  have hsum : ∑ j ∈ Finset.Ico m B, s ^ j / (j.factorial : ℝ)\n      ≤ s ^ m / (m.factorial : ℝ) * 2 := by\n    calc ∑ j ∈ Finset.Ico m B, s ^ j / (j.factorial : ℝ)\n        = ∑ d ∈ Finset.range (B - m), s ^ (m + d) / ((m + d).factorial : ℝ) := by\n          rw [Finset.sum_Ico_eq_sum_range]\n    _ ≤ ∑ d ∈ Finset.range (B - m), s ^ m / (m.factorial : ℝ) * (1/2 : ℝ) ^ d :=\n        Finset.sum_le_sum fun d _ => hterm d\n    _ = s ^ m / (m.factorial : ℝ) * ∑ d ∈ Finset.range (B - m), (1/2 : ℝ) ^ d := by\n        rw [Finset.mul_sum]\n    _ ≤ s ^ m / (m.factorial : ℝ) * 2 := by\n        apply mul_le_mul_of_nonneg_left (sum_geometric_two_le _) (by positivity)\n  -- σ^m/m! ≤ (1/6)^m · exp(-2σ) ≤ (1/6) · exp(-2σ)\n  have hkey : s ^ m / (m.factorial : ℝ) ≤ (1/6 : ℝ) * Real.exp (-(2 * s)) := by\n    have h1 : s ^ m / (m.factorial : ℝ) ≤ (Real.exp 1 / 20) ^ m :=\n      pow_div_factorial_le hs (by linarith)\n    have h2 : (Real.exp 1 / 20) ^ m * Real.exp (2 * s) ≤ (1/6 : ℝ) ^ m := by\n      have hexp2s : Real.exp (2 * s) ≤ Real.exp (1/10 : ℝ) ^ m := by\n        calc Real.exp (2 * s) ≤ Real.exp ((m : ℝ) * (1/10)) :=\n              Real.exp_le_exp.mpr (by linarith)\n        _ = Real.exp (1/10 : ℝ) ^ m := Real.exp_nat_mul _ m\n      have hbase : Real.exp 1 / 20 * Real.exp (1/10 : ℝ) ≤ 1/6 := by\n        have he1 : Real.exp 1 ≤ 2.7182818286 := le_of_lt Real.exp_one_lt_d9\n        have he10 : Real.exp (1/10 : ℝ) ≤ 10/9 := by\n          have h := exp_le_inv_one_sub (x := (1:ℝ)/10) (by norm_num)\n          have heq : ((1:ℝ) - 1/10)⁻¹ = 10/9 := by norm_num\n          rw [heq] at h\n          exact h\n        nlinarith [Real.exp_pos (1/10 : ℝ), Real.exp_pos (1 : ℝ)]\n      calc (Real.exp 1 / 20) ^ m * Real.exp (2 * s)\n          ≤ (Real.exp 1 / 20) ^ m * Real.exp (1/10 : ℝ) ^ m := by\n            apply mul_le_mul_of_nonneg_left hexp2s (by positivity)\n      _ = (Real.exp 1 / 20 * Real.exp (1/10 : ℝ)) ^ m := by rw [mul_pow]\n      _ ≤ (1/6 : ℝ) ^ m := pow_le_pow_left₀ (by positivity) hbase m\n    have h3 : (1/6 : ℝ) ^ m ≤ (1/6 : ℝ) ^ 1 :=\n      pow_le_pow_of_le_one (by norm_num) (by norm_num) hm1\n    have h4 : (Real.exp 1 / 20) ^ m ≤ (1/6 : ℝ) * Real.exp (-(2 * s)) := by\n      have hep : (0 : ℝ) < Real.exp (2 * s) := Real.exp_pos _\n      rw [Real.exp_neg]\n      rw [← le_div_iff₀ hep] at h2\n      calc (Real.exp 1 / 20) ^ m ≤ (1/6 : ℝ) ^ m / Real.exp (2 * s) := h2\n      _ ≤ (1/6 : ℝ) ^ 1 / Real.exp (2 * s) := by gcongr\n      _ = (1/6 : ℝ) * (Real.exp (2 * s))⁻¹ := by\n          rw [pow_one, div_eq_mul_inv]\n    exact le_trans h1 h4\n  have hep : (0 : ℝ) < Real.exp (-(2 * s)) := Real.exp_pos _\n  calc ∑ j ∈ Finset.Ico m B, s ^ j / (j.factorial : ℝ)\n      ≤ s ^ m / (m.factorial : ℝ) * 2 := hsum\n  _ ≤ (1/6 : ℝ) * Real.exp (-(2 * s)) * 2 := by\n      apply mul_le_mul_of_nonneg_right hkey (by norm_num)\n  _ ≤ Real.exp (-(2 * s)) / 2 := by linarith\n\n/-! ### Harmonic-type sums -/\n\n/-- `∑_{j=2}^{K} 1/j ≤ log K`. -/\nlemma sum_Icc_inv_le_log (K : ℕ) :\n    ∑ j ∈ Finset.Icc 2 K, (1 : ℝ) / j ≤ Real.log K := by\n  induction K with\n  | zero => simp\n  | succ K ihK =>\n    rcases Nat.lt_or_ge (K + 1) 2 with h | h\n    · have hK0 : K = 0 := by omega\n      subst hK0\n      rw [Finset.Icc_eq_empty (by omega), Finset.sum_empty]\n      norm_num\n    · have hK1 : 1 ≤ K := by omega\n      have hKpos : (0 : ℝ) < (K : ℝ) := by exact_mod_cast hK1\n      have hsplit : ∑ j ∈ Finset.Icc 2 (K + 1), (1 : ℝ) / j\n          = (∑ j ∈ Finset.Icc 2 K, (1 : ℝ) / j) + 1 / ((K : ℝ) + 1) := by\n        rw [Finset.sum_Icc_succ_top (by omega : 2 ≤ K + 1)]\n        push_cast\n        ring\n      have hstep : (1 : ℝ) / ((K : ℝ) + 1) ≤ Real.log ((K : ℝ) + 1) - Real.log K := by\n        have hx1 : (1 : ℝ) / ((K : ℝ) + 1) < 1 := by\n          rw [div_lt_one (by linarith)]\n          linarith\n        have hexp := exp_le_inv_one_sub hx1\n        have heq : (1 - 1 / ((K : ℝ) + 1))⁻¹ = ((K : ℝ) + 1) / K := by\n          rw [one_sub_div (by linarith : (K : ℝ) + 1 ≠ 0)]\n          rw [inv_div]\n          ring_nf\n        rw [heq] at hexp\n        have hlog := Real.log_le_log (Real.exp_pos _) hexp\n        rw [Real.log_exp, Real.log_div (by linarith) (by linarith)] at hlog\n        linarith\n      rw [hsplit]\n      have hcast : ((K + 1 : ℕ) : ℝ) = (K : ℝ) + 1 := by push_cast; ring\n      rw [hcast]\n      linarith\n\n/-- A sum of reciprocals of distinct integers `≥ 2` is at most the sum over the\ninitial segment `{2, …, #V + 1}`. -/\nlemma sum_inv_le_sum_Icc (V : Finset ℕ) :\n    (∀ m ∈ V, 2 ≤ m) →\n      ∑ m ∈ V, (1 : ℝ) / m ≤ ∑ j ∈ Finset.Icc 2 (#V + 1), (1 : ℝ) / j := by\n  induction V using Finset.strongInduction with\n  | _ V ih =>\n    intro hV\n    rcases V.eq_empty_or_nonempty with rfl | hne\n    · simp\n    · have hvmem : V.max' hne ∈ V := V.max'_mem hne\n      set v := V.max' hne with hvdef\n      have hv2 : 2 ≤ v := hV v hvmem\n      have hsub : V ⊆ Finset.Icc 2 v := fun m hm =>\n        Finset.mem_Icc.mpr ⟨hV m hm, Finset.le_max' V m hm⟩\n      have hcard : #V ≤ v - 1 := by\n        have h1 : #V ≤ #(Finset.Icc 2 v) := Finset.card_le_card hsub\n        rwa [Nat.card_Icc] at h1\n      have hVpos : 1 ≤ #V := Finset.card_pos.mpr hne\n      have hvge : #V + 1 ≤ v := by omega\n      have ih' := ih (V.erase v) (Finset.erase_ssubset hvmem)\n        (fun m hm => hV m (Finset.mem_of_mem_erase hm))\n      have hcarderase : #(V.erase v) = #V - 1 := Finset.card_erase_of_mem hvmem\n      rw [hcarderase] at ih'\n      have hVeq : #V - 1 + 1 = #V := by omega\n      rw [hVeq] at ih'\n      have hsumsplit : ∑ m ∈ V, (1 : ℝ) / m\n          = 1 / (v : ℝ) + ∑ m ∈ V.erase v, (1 : ℝ) / m :=\n        (Finset.add_sum_erase V _ hvmem).symm\n      have hrsplit : ∑ j ∈ Finset.Icc 2 (#V + 1), (1 : ℝ) / j\n          = (∑ j ∈ Finset.Icc 2 #V, (1 : ℝ) / j) + 1 / ((#V : ℝ) + 1) := by\n        rw [Finset.sum_Icc_succ_top (by omega : 2 ≤ #V + 1)]\n        push_cast\n        ring\n      have hfrac : (1 : ℝ) / v ≤ 1 / ((#V : ℝ) + 1) := by\n        apply one_div_le_one_div_of_le (by positivity)\n        exact_mod_cast hvge\n      rw [hsumsplit, hrsplit]\n      linarith\n\n\n/-! ## From Erdos820/Counting.lean -/\n\n/-\nCounting integers in an interval satisfying congruence conditions at\nfinitely many primes.\n\n* `crt_count`: over a full period `q = ∏_{p ∈ J} p`, the number of residues\n  `v` with `v % p ∈ Ω p` for all `p ∈ J` is exactly `∏_{p ∈ J} #(Ω p)`\n  (Chinese Remainder Theorem).\n* `count_congruence_bounds`: the number of `t < X` with `t % p ∈ Ω p` for all\n  `p ∈ J` differs from `X · ∏ (#Ω p / p)` by at most `∏ #(Ω p)`.\n-/\n\n\nopen Finset\n\n/-- CRT counting over a full period. -/\nlemma crt_count (Ω : ℕ → Finset ℕ) :\n    ∀ J : Finset ℕ, (∀ p ∈ J, Nat.Prime p) → (∀ p ∈ J, Ω p ⊆ range p) →\n      #({v ∈ range (∏ p ∈ J, p) | ∀ p ∈ J, v % p ∈ Ω p}) = ∏ p ∈ J, #(Ω p) := by\n  intro J\n  induction J using Finset.induction_on with\n  | empty =>\n    intro _ _\n    simp\n  | @insert p J hpJ ih =>\n    intro hprime hsub\n    have hp : Nat.Prime p := hprime p (mem_insert_self p J)\n    have hJprime : ∀ q ∈ J, Nat.Prime q := fun q hq => hprime q (mem_insert_of_mem hq)\n    have hJsub : ∀ q ∈ J, Ω q ⊆ range q := fun q hq => hsub q (mem_insert_of_mem hq)\n    have hΩp : Ω p ⊆ range p := hsub p (mem_insert_self p J)\n    have hqpos : 0 < ∏ r ∈ J, r := Finset.prod_pos fun r hr => (hJprime r hr).pos\n    have hppos : 0 < p := hp.pos\n    have hcop : Nat.Coprime p (∏ r ∈ J, r) := by\n      apply Nat.Coprime.prod_right\n      intro r hr\n      refine (Nat.coprime_primes hp (hJprime r hr)).mpr ?_\n      rintro rfl\n      exact hpJ hr\n    have hpqpos : 0 < p * ∏ r ∈ J, r := Nat.mul_pos hppos hqpos\n    rw [Finset.prod_insert hpJ, Finset.prod_insert hpJ, ← ih hJprime hJsub]\n    -- bijection v ↦ (v % p, v % q) between the two sides\n    rw [← Finset.card_product]\n    apply Finset.card_nbij (i := fun v => (v % p, v % (∏ r ∈ J, r)))\n    · -- maps to\n      intro v hv\n      simp only [Finset.coe_filter, Finset.mem_range, Set.mem_setOf_eq] at hv\n      obtain ⟨hvlt, hvcond⟩ := hv\n      simp only [Finset.coe_product, Set.mem_prod, Finset.mem_coe, Finset.mem_filter,\n        Finset.mem_range]\n      refine ⟨hvcond p (mem_insert_self p J), Nat.mod_lt _ hqpos, ?_⟩\n      intro r hr\n      rw [Nat.mod_mod_of_dvd v (Finset.dvd_prod_of_mem _ hr)]\n      exact hvcond r (mem_insert_of_mem hr)\n    · -- injective\n      intro v hv w hw hvw\n      simp only [Finset.coe_filter, Finset.mem_range, Set.mem_setOf_eq] at hv hw\n      have h1 : v % p = w % p := (Prod.mk.injEq _ _ _ _).mp hvw |>.1\n      have h2 : v % (∏ r ∈ J, r) = w % (∏ r ∈ J, r) := (Prod.mk.injEq _ _ _ _).mp hvw |>.2\n      have hmod : v % (p * ∏ r ∈ J, r) = w % (p * ∏ r ∈ J, r) :=\n        (Nat.modEq_and_modEq_iff_modEq_mul hcop).mp ⟨h1, h2⟩\n      rwa [Nat.mod_eq_of_lt hv.1, Nat.mod_eq_of_lt hw.1] at hmod\n    · -- surjective\n      intro ab hab\n      simp only [Finset.coe_product, Set.mem_prod, Finset.mem_coe, Finset.mem_filter,\n        Finset.mem_range] at hab\n      obtain ⟨ha, hblt, hbcond⟩ := hab\n      have halt : ab.1 < p := Finset.mem_range.mp (hΩp ha)\n      obtain ⟨c, hc1, hc2⟩ := Nat.chineseRemainder hcop ab.1 ab.2\n      set v := c % (p * ∏ r ∈ J, r) with hvdef\n      have hvlt : v < p * ∏ r ∈ J, r := Nat.mod_lt _ hpqpos\n      have hvc : v ≡ c [MOD p * ∏ r ∈ J, r] := Nat.mod_modEq c _\n      have hva : v % p = ab.1 := by\n        have h3 : v % p = ab.1 % p :=\n          (hvc.of_dvd (dvd_mul_right p _)).trans hc1\n        rwa [Nat.mod_eq_of_lt halt] at h3\n      have hvb : v % (∏ r ∈ J, r) = ab.2 := by\n        have h3 : v % (∏ r ∈ J, r) = ab.2 % (∏ r ∈ J, r) :=\n          (hvc.of_dvd (dvd_mul_left _ p)).trans hc2\n        rwa [Nat.mod_eq_of_lt hblt] at h3\n      refine ⟨v, ?_, ?_⟩\n      · simp only [Finset.coe_filter, Finset.mem_range, Set.mem_setOf_eq]\n        refine ⟨hvlt, ?_⟩\n        intro r hr\n        rcases Finset.mem_insert.mp hr with rfl | hrJ\n        · rw [hva]; exact ha\n        · have hrdvd : r ∣ ∏ x ∈ J, x := Finset.dvd_prod_of_mem (fun x => x) hrJ\n          rw [← Nat.mod_mod_of_dvd v hrdvd, hvb]\n          exact hbcond r hrJ\n      · simp only\n        rw [hva, hvb]\n\n/-- Exact count of a single residue class in `[0, X)`:\n`#{t < X : t % q = v} = X/q + (1 if v < X % q else 0)`, for `v < q`. -/\nlemma count_class (X q v : ℕ) (hq : 0 < q) (hv : v < q) :\n    #({t ∈ range X | t % q = v}) = X / q + if v < X % q then 1 else 0 := by\n  have h1 : (Nat.count (· ≡ v [MOD q]) X) = X / q + if v % q < X % q then 1 else 0 :=\n    Nat.count_modEq_card X hq v\n  rw [Nat.count_eq_card_filter_range] at h1\n  rw [Nat.mod_eq_of_lt hv] at h1\n  rw [← h1]\n  congr 1\n  apply Finset.filter_congr\n  intro t _\n  show t % q = v ↔ t ≡ v [MOD q]\n  unfold Nat.ModEq\n  rw [Nat.mod_eq_of_lt hv]\n\n/-- The number of `t < X` in a residue class mod `q` is at least `X/q` and at most\n`X/q + 1` (with `v < q`). -/\nlemma count_class_bounds (X q v : ℕ) (hq : 0 < q) (hv : v < q) :\n    X / q ≤ #({t ∈ range X | t % q = v}) ∧\n      #({t ∈ range X | t % q = v}) ≤ X / q + 1 := by\n  rw [count_class X q v hq hv]\n  constructor\n  · split <;> omega\n  · split <;> omega\n\n/-- Counting integers below `X` satisfying all congruence conditions of `J`:\nsandwich between `R·(X/q)` and `R·(X/q + 1)`, where `R = ∏ #(Ω p)` and `q = ∏ p`. -/\nlemma count_congruence_sandwich (X : ℕ) (Ω : ℕ → Finset ℕ) (J : Finset ℕ)\n    (hJp : ∀ p ∈ J, Nat.Prime p) (hΩ : ∀ p ∈ J, Ω p ⊆ range p) :\n    (∏ p ∈ J, #(Ω p)) * (X / (∏ p ∈ J, p)) ≤\n        #({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}) ∧\n      #({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}) ≤\n        (∏ p ∈ J, #(Ω p)) * (X / (∏ p ∈ J, p) + 1) := by\n  classical\n  set q := ∏ p ∈ J, p with hqdef\n  have hqpos : 0 < q := Finset.prod_pos fun r hr => (hJp r hr).pos\n  -- the condition only depends on the residue mod q\n  have hper : ∀ t : ℕ, (∀ p ∈ J, t % p ∈ Ω p) ↔ (∀ p ∈ J, (t % q) % p ∈ Ω p) := by\n    intro t\n    constructor <;> intro h p hp\n    · rw [Nat.mod_mod_of_dvd t (Finset.dvd_prod_of_mem _ hp)]\n      exact h p hp\n    · have := h p hp\n      rwa [Nat.mod_mod_of_dvd t (Finset.dvd_prod_of_mem _ hp)] at this\n  -- fiberwise decomposition over admissible residues\n  have hmaps : ∀ t ∈ ({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}),\n      t % q ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}) := by\n    intro t ht\n    rw [Finset.mem_filter] at ht ⊢\n    exact ⟨Finset.mem_range.mpr (Nat.mod_lt _ hqpos), (hper t).mp ht.2⟩\n  have hfib := Finset.card_eq_sum_card_fiberwise\n    (f := fun t => t % q)\n    (s := {t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p})\n    (t := {v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p})\n    (fun x hx => Finset.mem_coe.mpr (hmaps x (Finset.mem_coe.mp hx)))\n  -- each fiber is a full residue-class count\n  have hfibcount : ∀ v ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}),\n      #({t ∈ {t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p} | t % q = v})\n        = #({t ∈ range X | t % q = v}) := by\n    intro v hv\n    rw [Finset.mem_filter] at hv\n    congr 1\n    rw [Finset.filter_filter]\n    apply Finset.filter_congr\n    intro t _\n    constructor\n    · rintro ⟨_, h2⟩; exact h2\n    · intro h2\n      refine ⟨?_, h2⟩\n      rw [hper t, h2]\n      exact hv.2\n  -- assemble\n  have hcrt := crt_count Ω J hJp hΩ\n  constructor\n  · rw [hfib, Finset.sum_congr rfl hfibcount]\n    calc (∏ p ∈ J, #(Ω p)) * (X / q)\n        = ∑ _v ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}), (X / q) := by\n          rw [Finset.sum_const, hcrt, smul_eq_mul]\n    _ ≤ ∑ v ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}), #({t ∈ range X | t % q = v}) := by\n          apply Finset.sum_le_sum\n          intro v hv\n          rw [Finset.mem_filter] at hv\n          exact (count_class_bounds X q v hqpos (Finset.mem_range.mp hv.1)).1\n  · rw [hfib, Finset.sum_congr rfl hfibcount]\n    calc ∑ v ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}), #({t ∈ range X | t % q = v})\n        ≤ ∑ _v ∈ ({v ∈ range q | ∀ p ∈ J, v % p ∈ Ω p}), (X / q + 1) := by\n          apply Finset.sum_le_sum\n          intro v hv\n          rw [Finset.mem_filter] at hv\n          exact (count_class_bounds X q v hqpos (Finset.mem_range.mp hv.1)).2\n    _ = (∏ p ∈ J, #(Ω p)) * (X / q + 1) := by\n          rw [Finset.sum_const, hcrt, smul_eq_mul]\n\n/-- Real form: the count deviates from `X · ∏ (#(Ω p)/p)` by at most `∏ #(Ω p)`. -/\nlemma count_congruence_bounds (X : ℕ) (Ω : ℕ → Finset ℕ) (J : Finset ℕ)\n    (hJp : ∀ p ∈ J, Nat.Prime p) (hΩ : ∀ p ∈ J, Ω p ⊆ range p) :\n    |(#({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ)\n        - (X : ℝ) * ∏ p ∈ J, ((#(Ω p) : ℝ) / (p : ℝ))|\n      ≤ ∏ p ∈ J, (#(Ω p) : ℝ) := by\n  obtain ⟨hlo, hhi⟩ := count_congruence_sandwich X Ω J hJp hΩ\n  set q := ∏ p ∈ J, p with hqdef\n  set R := ∏ p ∈ J, #(Ω p) with hRdef\n  have hqpos : 0 < q := Finset.prod_pos fun r hr => (hJp r hr).pos\n  have hqR : (0:ℝ) < (q : ℝ) := by exact_mod_cast hqpos\n  have hRnn : (0:ℝ) ≤ (R : ℝ) := Nat.cast_nonneg R\n  -- ∏ (#Ω p / p) = R / q\n  have hprod : ∏ p ∈ J, ((#(Ω p) : ℝ) / (p : ℝ)) = (R : ℝ) / (q : ℝ) := by\n    rw [Finset.prod_div_distrib, hRdef, hqdef]\n    push_cast\n    rfl\n  rw [hprod]\n  -- nat-division sandwich in ℝ\n  have hdivle : ((X / q : ℕ) : ℝ) ≤ (X : ℝ) / (q : ℝ) := Nat.cast_div_le\n  have hdivgt : (X : ℝ) / (q : ℝ) - 1 ≤ ((X / q : ℕ) : ℝ) := by\n    have hX : X < (X / q + 1) * q := by\n      have h1 : X / q * q + X % q = X := Nat.div_add_mod' X q\n      have h2 : X % q < q := Nat.mod_lt X hqpos\n      calc X = X / q * q + X % q := h1.symm\n      _ < X / q * q + q := by omega\n      _ = (X / q + 1) * q := by ring\n    have hXR : (X : ℝ) < (((X / q : ℕ) : ℝ) + 1) * (q : ℝ) := by\n      exact_mod_cast hX\n    have h3 : (X : ℝ) / (q : ℝ) < ((X / q : ℕ) : ℝ) + 1 := by\n      rw [div_lt_iff₀ hqR]\n      exact hXR\n    linarith\n  have hloR : (R : ℝ) * ((X / q : ℕ) : ℝ) ≤ (#({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := by\n    exact_mod_cast hlo\n  have hhiR : (#({t ∈ range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ)\n      ≤ (R : ℝ) * (((X / q : ℕ) : ℝ) + 1) := by\n    exact_mod_cast hhi\n  have hRR : (R : ℝ) = ∏ p ∈ J, (#(Ω p) : ℝ) := by\n    rw [hRdef]\n    push_cast\n    rfl\n  rw [abs_le]\n  constructor\n  · -- lower: count − XR/q ≥ −R\n    have h1 : (R : ℝ) * ((X : ℝ) / (q : ℝ) - 1) ≤ (R : ℝ) * ((X / q : ℕ) : ℝ) :=\n      mul_le_mul_of_nonneg_left hdivgt hRnn\n    have h2 : (R : ℝ) * ((X : ℝ) / (q : ℝ) - 1)\n        = (X : ℝ) * ((R : ℝ) / (q : ℝ)) - (R : ℝ) := by ring\n    linarith [hRR]\n  · -- upper: count − XR/q ≤ R\n    have h1 : (R : ℝ) * (((X / q : ℕ) : ℝ) + 1) ≤ (R : ℝ) * ((X : ℝ) / (q : ℝ) + 1) := by\n      apply mul_le_mul_of_nonneg_left _ hRnn\n      linarith\n    have h2 : (R : ℝ) * ((X : ℝ) / (q : ℝ) + 1)\n        = (X : ℝ) * ((R : ℝ) / (q : ℝ)) + (R : ℝ) := by ring\n    linarith [hRR]\n\n\n/-! ## From Erdos820/RootsBound.lean -/\n\n/-\nThe local root count: for a prime `p` with `p ∤ M`, the number of residues\n`v mod p` with `(M·v)^n ≡ 1 (mod p)` is at most `gcd(n, p-1)`.\n\nProof: `v ↦ M·v` is injective on residues, its image consists of `n`-th roots\nof unity in `Z/p`; each such root `x` satisfies `x^(p-1) = 1` (Fermat), hence\n`orderOf x ∣ gcd(n, p-1) =: d`, so the image lies among the roots of `X^d - 1`,\nof which there are at most `d` in the field `Z/p`.\n-/\n\n\nopen Finset Polynomial\n\n/-- Local root-count bound (used for the sets `Ω_p` in the main theorem). -/\nlemma card_root_residues_le (p n M : ℕ) [Fact p.Prime] (hn : 0 < n) (hM : ¬ p ∣ M) :\n    #((Finset.range p).filter (fun v : ℕ => ((M : ZMod p) * (v : ZMod p)) ^ n = 1))\n      ≤ Nat.gcd n (p - 1) := by\n  have hd0 : 0 < Nat.gcd n (p - 1) := Nat.gcd_pos_of_pos_left _ hn\n  have hmaps : ∀ v ∈ (Finset.range p).filter\n      (fun v : ℕ => ((M : ZMod p) * (v : ZMod p)) ^ n = 1),\n      (M : ZMod p) * (v : ZMod p)\n        ∈ (Polynomial.nthRoots (Nat.gcd n (p - 1)) (1 : ZMod p)).toFinset := by\n    intro v hv\n    rw [Finset.mem_filter] at hv\n    obtain ⟨_, hpow⟩ := hv\n    have hx0 : (M : ZMod p) * (v : ZMod p) ≠ 0 := by\n      intro h0\n      rw [h0, zero_pow hn.ne'] at hpow\n      exact zero_ne_one hpow\n    have h1 : orderOf ((M : ZMod p) * (v : ZMod p)) ∣ n :=\n      orderOf_dvd_of_pow_eq_one hpow\n    have h2 : orderOf ((M : ZMod p) * (v : ZMod p)) ∣ p - 1 :=\n      orderOf_dvd_of_pow_eq_one (ZMod.pow_card_sub_one_eq_one hx0)\n    have h3 : orderOf ((M : ZMod p) * (v : ZMod p)) ∣ Nat.gcd n (p - 1) :=\n      Nat.dvd_gcd h1 h2\n    have h4 : ((M : ZMod p) * (v : ZMod p)) ^ (Nat.gcd n (p - 1)) = 1 :=\n      orderOf_dvd_iff_pow_eq_one.mp h3\n    rw [Multiset.mem_toFinset, Polynomial.mem_nthRoots hd0]\n    exact h4\n  have hinj : Set.InjOn (fun v : ℕ => (M : ZMod p) * (v : ZMod p))\n      (((Finset.range p).filter\n        (fun v : ℕ => ((M : ZMod p) * (v : ZMod p)) ^ n = 1) : Finset ℕ) : Set ℕ) := by\n    intro v hv w hw heq\n    simp only [Finset.coe_filter, Set.mem_setOf_eq, Finset.mem_range] at hv hw\n    have hM0 : (M : ZMod p) ≠ 0 := by\n      rw [Ne, ZMod.natCast_eq_zero_iff]\n      exact hM\n    have hvw : (v : ZMod p) = (w : ZMod p) := mul_left_cancel₀ hM0 heq\n    have hval := congrArg ZMod.val hvw\n    rwa [ZMod.val_cast_of_lt hv.1, ZMod.val_cast_of_lt hw.1] at hval\n  calc #((Finset.range p).filter (fun v : ℕ => ((M : ZMod p) * (v : ZMod p)) ^ n = 1))\n      ≤ #((Polynomial.nthRoots (Nat.gcd n (p - 1)) (1 : ZMod p)).toFinset) :=\n        Finset.card_le_card_of_injOn\n          (fun v : ℕ => (M : ZMod p) * (v : ZMod p)) hmaps hinj\n  _ ≤ Multiset.card (Polynomial.nthRoots (Nat.gcd n (p - 1)) (1 : ZMod p)) :=\n        Multiset.toFinset_card_le _\n  _ ≤ Nat.gcd n (p - 1) := Polynomial.card_nthRoots _ _\n\n\n/-! ## From Erdos820/Sieve.lean -/\n\n/-\nThe finite sieve lemma (Lemma 2.1 of the paper).\n\nGiven a finite set `P` of primes and forbidden residue sets `Ω p ⊆ Z/p` with\n`|Ω p| ≤ p/2`, there is a positive integer `t` avoiding every `Ω p` with\n`log t ≤ 100 (σ + 1) log (Δ + 2)`, where `σ = ∑ |Ω p|/p` and `Δ = ∑ |Ω p|`.\n\nThe proof runs truncated inclusion–exclusion (Bonferroni) at an odd level\n`L ≈ 20(σ+1)`, uses the CRT counting estimates from `Counting.lean`, the\nelementary symmetric bounds from `SymmBounds.lean`, and picks\n`X = ⌈2 e^{2σ}((L+1)(Δ+1)^L + 2)⌉`.\n-/\n\n\nopen Finset\n\nset_option maxHeartbeats 1600000 in\ntheorem sieve (P : Finset ℕ) (hP : ∀ p ∈ P, Nat.Prime p)\n    (Ω : ℕ → Finset ℕ) (hΩ : ∀ p ∈ P, Ω p ⊆ Finset.range p)\n    (hhalf : ∀ p ∈ P, 2 * #(Ω p) ≤ p) :\n    ∃ t : ℕ, 0 < t ∧ (∀ p ∈ P, t % p ∉ Ω p) ∧\n      Real.log t ≤ 100 * ((∑ p ∈ P, (#(Ω p) : ℝ) / p) + 1)\n        * Real.log ((∑ p ∈ P, (#(Ω p) : ℝ)) + 2) := by\n  obtain ⟨σ, hσdef⟩ : ∃ σ : ℝ, σ = ∑ p ∈ P, (#(Ω p) : ℝ) / p := ⟨_, rfl⟩\n  obtain ⟨Δr, hΔdef⟩ : ∃ Δr : ℝ, Δr = ∑ p ∈ P, (#(Ω p) : ℝ) := ⟨_, rfl⟩\n  rw [← hσdef, ← hΔdef]\n  -- basic positivity facts\n  have ha0 : ∀ p ∈ P, 0 ≤ (#(Ω p) : ℝ) / p := by\n    intro p hp\n    positivity\n  have ha2 : ∀ p ∈ P, (#(Ω p) : ℝ) / p ≤ 1/2 := by\n    intro p hp\n    have hppos : (0:ℝ) < p := by exact_mod_cast (hP p hp).pos\n    rw [div_le_iff₀ hppos]\n    have h1 : ((2 * #(Ω p) : ℕ) : ℝ) ≤ (p : ℝ) := by exact_mod_cast hhalf p hp\n    push_cast at h1\n    linarith\n  have hρ0 : ∀ p ∈ P, 0 ≤ (#(Ω p) : ℝ) := fun p _ => Nat.cast_nonneg _\n  have hσ0 : 0 ≤ σ := by\n    rw [hσdef]\n    exact Finset.sum_nonneg ha0\n  have hΔ0 : 0 ≤ Δr := by\n    rw [hΔdef]\n    exact Finset.sum_nonneg hρ0\n  -- the truncation level L (odd, ≈ 20(σ+1))\n  obtain ⟨L, hLdef⟩ : ∃ L : ℕ, L = 2 * ⌈10 * (σ + 1)⌉₊ + 1 := ⟨_, rfl⟩\n  have hLcast : (L : ℝ) = 2 * (⌈10 * (σ + 1)⌉₊ : ℝ) + 1 := by\n    rw [hLdef]\n    push_cast\n    ring\n  have hL_ge : 20 * (σ + 1) ≤ (L : ℝ) := by\n    have h1 : 10 * (σ + 1) ≤ (⌈10 * (σ + 1)⌉₊ : ℝ) := Nat.le_ceil _\n    rw [hLcast]\n    linarith\n  have hL_le : (L : ℝ) ≤ 20 * σ + 23 := by\n    have h2 : (⌈10 * (σ + 1)⌉₊ : ℝ) < 10 * (σ + 1) + 1 :=\n      Nat.ceil_lt_add_one (by positivity)\n    rw [hLcast]\n    linarith\n  have hL_odd : Odd L := ⟨⌈10 * (σ + 1)⌉₊, by omega⟩\n  -- the error budget E and the sieving length X\n  obtain ⟨Er, hErdef⟩ : ∃ Er : ℝ, Er = ((L : ℝ) + 1) * (Δr + 1) ^ L := ⟨_, rfl⟩\n  have hΔpow1 : (1:ℝ) ≤ (Δr + 1) ^ L := by\n    calc (1:ℝ) = 1 ^ L := (one_pow L).symm\n    _ ≤ (Δr + 1) ^ L := pow_le_pow_left₀ (by norm_num) (by linarith) L\n  have hEr1 : (1:ℝ) ≤ Er := by\n    rw [hErdef]\n    have h1 : (0:ℝ) ≤ (L : ℝ) := Nat.cast_nonneg L\n    nlinarith\n  have hXarg0 : (0:ℝ) ≤ 2 * Real.exp (2 * σ) * (Er + 2) :=\n    mul_nonneg (mul_nonneg (by norm_num) (Real.exp_pos _).le) (by linarith)\n  obtain ⟨X, hXdef⟩ : ∃ X : ℕ, X = ⌈2 * Real.exp (2 * σ) * (Er + 2)⌉₊ := ⟨_, rfl⟩\n  have hXge : 2 * Real.exp (2 * σ) * (Er + 2) ≤ (X : ℝ) := by\n    rw [hXdef]; exact Nat.le_ceil _\n  have hXlt : (X : ℝ) < 2 * Real.exp (2 * σ) * (Er + 2) + 1 := by\n    rw [hXdef]; exact Nat.ceil_lt_add_one hXarg0\n  -- ### Step 1: pointwise Bonferroni inequality\n  have hpoint : ∀ t : ℕ,\n      ∑ j ∈ Finset.range (L + 1),\n          (-1:ℝ) ^ j * (#(({p ∈ P | t % p ∈ Ω p}).powersetCard j) : ℝ)\n        ≤ (if ∀ p ∈ P, t % p ∉ Ω p then (1:ℝ) else 0) := by\n    intro t\n    simp only [Finset.card_powersetCard]\n    by_cases hcond : ∀ p ∈ P, t % p ∉ Ω p\n    · rw [if_pos hcond]\n      have hu0 : #({p ∈ P | t % p ∈ Ω p}) = 0 := by\n        rw [Finset.card_eq_zero, Finset.filter_eq_empty_iff]\n        intro p hp\n        exact hcond p hp\n      rw [hu0]\n      rw [Finset.sum_eq_single 0]\n      · norm_num\n      · intro j _ hj0\n        rw [Nat.choose_eq_zero_of_lt (by omega)]\n        norm_num\n      · intro h0\n        exact absurd (Finset.mem_range.mpr (by omega)) h0\n    · rw [if_neg hcond]\n      push_neg at hcond\n      obtain ⟨p₀, hp₀P, hp₀⟩ := hcond\n      have hu1 : 1 ≤ #({p ∈ P | t % p ∈ Ω p}) :=\n        Finset.card_pos.mpr ⟨p₀, Finset.mem_filter.mpr ⟨hp₀P, hp₀⟩⟩\n      obtain ⟨u', hu'⟩ : ∃ u', #({p ∈ P | t % p ∈ Ω p}) = u' + 1 :=\n        ⟨#({p ∈ P | t % p ∈ Ω p}) - 1, by omega⟩\n      rw [hu']\n      have hInt : (∑ k ∈ Finset.range (L + 1), ((-1:ℤ) ^ k * ((u' + 1).choose k : ℤ)))\n          = (-1) ^ L * (u'.choose L : ℤ) :=\n        Int.alternating_sum_range_choose_eq_choose\n      have hReal : (∑ k ∈ Finset.range (L + 1), ((-1:ℝ) ^ k * ((u' + 1).choose k : ℝ)))\n          = (-1:ℝ) ^ L * (u'.choose L : ℝ) := by exact_mod_cast hInt\n      rw [hReal, hL_odd.neg_one_pow]\n      have h0 : (0:ℝ) ≤ (u'.choose L : ℝ) := Nat.cast_nonneg _\n      linarith\n  -- ### Step 2: expansion of powersetCard counts and the double-sum swap\n  have hexpand : ∀ t : ℕ, ∀ j : ℕ,\n      (#(({p ∈ P | t % p ∈ Ω p}).powersetCard j) : ℝ)\n        = ∑ J ∈ P.powersetCard j, (if ∀ p ∈ J, t % p ∈ Ω p then (1:ℝ) else 0) := by\n    intro t j\n    rw [Finset.sum_boole]\n    have hseteq : ({p ∈ P | t % p ∈ Ω p}).powersetCard j\n        = {J ∈ P.powersetCard j | ∀ p ∈ J, t % p ∈ Ω p} := by\n      ext J\n      simp only [Finset.mem_powersetCard, Finset.mem_filter]\n      constructor\n      · rintro ⟨hJB, hcard⟩\n        have hJP : J ⊆ P := hJB.trans (Finset.filter_subset _ _)\n        exact ⟨⟨hJP, hcard⟩, fun p hp => (Finset.mem_filter.mp (hJB hp)).2⟩\n      · rintro ⟨⟨hJP, hcard⟩, hall⟩\n        exact ⟨fun p hp => Finset.mem_filter.mpr ⟨hJP hp, hall p hp⟩, hcard⟩\n    rw [hseteq]\n  have hswap : ∑ t ∈ Finset.range X, ∑ j ∈ Finset.range (L + 1),\n        (-1:ℝ) ^ j * (#(({p ∈ P | t % p ∈ Ω p}).powersetCard j) : ℝ)\n      = ∑ j ∈ Finset.range (L + 1), (-1:ℝ) ^ j *\n          ∑ J ∈ P.powersetCard j,\n            (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := by\n    rw [Finset.sum_comm]\n    apply Finset.sum_congr rfl\n    intro j _\n    calc ∑ t ∈ Finset.range X,\n          (-1:ℝ) ^ j * (#(({p ∈ P | t % p ∈ Ω p}).powersetCard j) : ℝ)\n        = ∑ t ∈ Finset.range X, ∑ J ∈ P.powersetCard j,\n            (-1:ℝ) ^ j * (if ∀ p ∈ J, t % p ∈ Ω p then (1:ℝ) else 0) := by\n          apply Finset.sum_congr rfl\n          intro t _\n          rw [hexpand t j, Finset.mul_sum]\n    _ = ∑ J ∈ P.powersetCard j, ∑ t ∈ Finset.range X,\n            (-1:ℝ) ^ j * (if ∀ p ∈ J, t % p ∈ Ω p then (1:ℝ) else 0) :=\n          Finset.sum_comm\n    _ = ∑ J ∈ P.powersetCard j, (-1:ℝ) ^ j *\n            (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := by\n          apply Finset.sum_congr rfl\n          intro J _\n          rw [← Finset.mul_sum, Finset.sum_boole]\n    _ = (-1:ℝ) ^ j * ∑ J ∈ P.powersetCard j,\n            (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := by\n          rw [Finset.mul_sum]\n  have hcount : (#({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) : ℝ)\n      = ∑ t ∈ Finset.range X, (if ∀ p ∈ P, t % p ∉ Ω p then (1:ℝ) else 0) := by\n    rw [Finset.sum_boole]\n  have hlower : ∑ j ∈ Finset.range (L + 1), (-1:ℝ) ^ j *\n        ∑ J ∈ P.powersetCard j, (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ)\n      ≤ (#({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) : ℝ) := by\n    rw [hcount, ← hswap]\n    exact Finset.sum_le_sum fun t _ => hpoint t\n  -- ### Step 3: replace each inner sum by its main term, with error `e_j(ρ)`\n  have hstepj : ∀ j ∈ Finset.range (L + 1),\n      (-1:ℝ) ^ j * ((X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n          - esymm P (fun p => (#(Ω p) : ℝ)) j\n        ≤ (-1:ℝ) ^ j * ∑ J ∈ P.powersetCard j,\n            (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := by\n    intro j _\n    have habs : |(∑ J ∈ P.powersetCard j,\n          (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ))\n        - (X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j|\n        ≤ esymm P (fun p => (#(Ω p) : ℝ)) j := by\n      simp only [esymm]\n      rw [Finset.mul_sum, ← Finset.sum_sub_distrib]\n      refine (Finset.abs_sum_le_sum_abs _ _).trans (Finset.sum_le_sum ?_)\n      intro J hJ\n      have hJP : J ⊆ P := (Finset.mem_powersetCard.mp hJ).1\n      exact count_congruence_bounds X Ω J\n        (fun p hp => hP p (hJP hp)) (fun p hp => hΩ p (hJP hp))\n    obtain ⟨SJ, hSJdef⟩ : ∃ SJ : ℝ, SJ = ∑ J ∈ P.powersetCard j,\n      (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := ⟨_, rfl⟩\n    rw [← hSJdef] at habs ⊢\n    have h2 : |(-1:ℝ) ^ j * (SJ - (X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j)|\n        = |SJ - (X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j| := by\n      rw [abs_mul, abs_pow, abs_neg, abs_one, one_pow, one_mul]\n    have h3 := neg_abs_le\n      ((-1:ℝ) ^ j * (SJ - (X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j))\n    have h4 : (-1:ℝ) ^ j * (SJ - (X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n        = (-1:ℝ) ^ j * SJ\n          - (-1:ℝ) ^ j * ((X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j) := by\n      ring\n    rw [h2] at h3\n    rw [h4] at h3\n    linarith\n  -- ### Step 4: summing the main terms\n  have hSge : (X:ℝ) * (∑ j ∈ Finset.range (L + 1),\n        (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n      - (∑ j ∈ Finset.range (L + 1), esymm P (fun p => (#(Ω p) : ℝ)) j)\n      ≤ (#({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) : ℝ) := by\n    have h2 := Finset.sum_le_sum hstepj\n    have h3 : ∑ j ∈ Finset.range (L + 1),\n        ((-1:ℝ) ^ j * ((X:ℝ) * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n          - esymm P (fun p => (#(Ω p) : ℝ)) j)\n        = (X:ℝ) * (∑ j ∈ Finset.range (L + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n          - ∑ j ∈ Finset.range (L + 1), esymm P (fun p => (#(Ω p) : ℝ)) j := by\n      rw [Finset.sum_sub_distrib, Finset.mul_sum]\n      congr 1\n      apply Finset.sum_congr rfl\n      intro j _\n      ring\n    rw [h3] at h2\n    calc (X:ℝ) * (∑ j ∈ Finset.range (L + 1),\n          (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n        - (∑ j ∈ Finset.range (L + 1), esymm P (fun p => (#(Ω p) : ℝ)) j)\n        ≤ ∑ j ∈ Finset.range (L + 1), (-1:ℝ) ^ j *\n            ∑ J ∈ P.powersetCard j,\n              (#({t ∈ Finset.range X | ∀ p ∈ J, t % p ∈ Ω p}) : ℝ) := h2\n    _ ≤ _ := hlower\n  -- ### Step 5: the alternating sum of `e_j(a)` is at least `exp(-2σ)/2`\n  have hfull : ∑ j ∈ Finset.range (#P + 1),\n        (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j\n      = ∏ p ∈ P, (1 - (#(Ω p) : ℝ) / p) := by\n    have h1 : ∏ p ∈ P, (1 - (#(Ω p) : ℝ) / p)\n        = ∏ p ∈ P, (1 + (-((#(Ω p) : ℝ) / p))) := by\n      apply Finset.prod_congr rfl\n      intro p _\n      ring\n    rw [h1, Finset.prod_one_add]\n    have hmaps : ∀ J ∈ P.powerset, #J ∈ Finset.range (#P + 1) := by\n      intro J hJ\n      exact Finset.mem_range.mpr\n        (Nat.lt_succ_of_le (Finset.card_le_card (Finset.mem_powerset.mp hJ)))\n    rw [← Finset.sum_fiberwise_of_maps_to hmaps]\n    apply Finset.sum_congr rfl\n    intro j _\n    have hfilter : {J ∈ P.powerset | #J = j} = P.powersetCard j :=\n      Finset.powersetCard_eq_filter.symm\n    rw [hfilter]\n    simp only [esymm]\n    rw [Finset.mul_sum]\n    apply Finset.sum_congr rfl\n    intro J hJ\n    have hJcard : #J = j := (Finset.mem_powersetCard.mp hJ).2\n    symm\n    calc ∏ p ∈ J, (-((#(Ω p) : ℝ) / p))\n        = ∏ p ∈ J, ((-1) * ((#(Ω p) : ℝ) / p)) := by\n          apply Finset.prod_congr rfl\n          intro p _\n          ring\n    _ = (∏ _p ∈ J, (-1:ℝ)) * ∏ p ∈ J, ((#(Ω p) : ℝ) / p) := Finset.prod_mul_distrib\n    _ = (-1:ℝ) ^ j * ∏ p ∈ J, ((#(Ω p) : ℝ) / p) := by\n        rw [Finset.prod_const, hJcard]\n  have hprodge : Real.exp (-(2 * σ)) ≤ ∏ p ∈ P, (1 - (#(Ω p) : ℝ) / p) := by\n    have h := exp_le_prod_one_sub (P := P) (a := fun p => (#(Ω p) : ℝ) / p) ha0 ha2\n    rwa [← hσdef] at h\n  have hA : Real.exp (-(2 * σ)) / 2 ≤ ∑ j ∈ Finset.range (L + 1),\n      (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j := by\n    by_cases hcase : #P ≤ L\n    · have hzero : ∀ j ∈ Finset.Ico (#P + 1) (L + 1),\n          (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j = 0 := by\n        intro j hj\n        have hPj : #P < j := by\n          have := (Finset.mem_Ico.mp hj).1\n          omega\n        rw [esymm_eq_zero_of_card_lt hPj, mul_zero]\n      have hsplit : ∑ j ∈ Finset.range (L + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j\n          = ∑ j ∈ Finset.range (#P + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j := by\n        rw [Finset.range_eq_Ico,\n          ← Finset.sum_Ico_consecutive _ (Nat.zero_le (#P + 1))\n            (by omega : #P + 1 ≤ L + 1),\n          Finset.sum_eq_zero hzero, add_zero]\n      rw [hsplit, hfull]\n      have hexppos : 0 < Real.exp (-(2 * σ)) := Real.exp_pos _\n      linarith\n    · push_neg at hcase\n      have hsplit : ∑ j ∈ Finset.range (#P + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j\n          = (∑ j ∈ Finset.range (L + 1),\n              (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n            + ∑ j ∈ Finset.Ico (L + 1) (#P + 1),\n              (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j := by\n        rw [Finset.range_eq_Ico,\n          ← Finset.sum_Ico_consecutive _ (Nat.zero_le (L + 1))\n            (by omega : L + 1 ≤ #P + 1)]\n      have htail : |∑ j ∈ Finset.Ico (L + 1) (#P + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j|\n          ≤ Real.exp (-(2 * σ)) / 2 := by\n        refine (Finset.abs_sum_le_sum_abs _ _).trans ?_\n        have hterm : ∀ j ∈ Finset.Ico (L + 1) (#P + 1),\n            |(-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j|\n              ≤ σ ^ j / (j.factorial : ℝ) := by\n          intro j _\n          rw [abs_mul, abs_pow, abs_neg, abs_one, one_pow, one_mul,\n            abs_of_nonneg (esymm_nonneg ha0 j)]\n          have h := esymm_le_pow_div_factorial (f := fun p => (#(Ω p) : ℝ) / p)\n            (P := P) ha0 j\n          rwa [← hσdef] at h\n        refine (Finset.sum_le_sum hterm).trans ?_\n        apply tail_sum_le hσ0 _ (#P + 1)\n        push_cast\n        linarith\n      have h1 : ∑ j ∈ Finset.range (L + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j\n          = (∏ p ∈ P, (1 - (#(Ω p) : ℝ) / p))\n            - ∑ j ∈ Finset.Ico (L + 1) (#P + 1),\n              (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j := by\n        rw [← hfull, hsplit]\n        ring\n      rw [h1]\n      have h2 := le_abs_self (∑ j ∈ Finset.Ico (L + 1) (#P + 1),\n        (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j)\n      linarith\n  -- ### Step 6: bound the error sum by Er\n  have hE : ∑ j ∈ Finset.range (L + 1), esymm P (fun p => (#(Ω p) : ℝ)) j ≤ Er := by\n    have hterm : ∀ j ∈ Finset.range (L + 1),\n        esymm P (fun p => (#(Ω p) : ℝ)) j ≤ (Δr + 1) ^ L := by\n      intro j hj\n      have hjL : j ≤ L := by\n        have := Finset.mem_range.mp hj\n        omega\n      have h1 := esymm_le_pow_div_factorial (f := fun p => (#(Ω p) : ℝ)) (P := P) hρ0 j\n      rw [← hΔdef] at h1\n      have hfact1 : (1:ℝ) ≤ (j.factorial : ℝ) := by\n        exact_mod_cast j.factorial_pos\n      have h2 : Δr ^ j / (j.factorial : ℝ) ≤ Δr ^ j :=\n        div_le_self (by positivity) hfact1\n      have h3 : Δr ^ j ≤ (Δr + 1) ^ j := pow_le_pow_left₀ hΔ0 (by linarith) j\n      have h4 : (Δr + 1) ^ j ≤ (Δr + 1) ^ L := pow_le_pow_right₀ (by linarith) hjL\n      linarith\n    calc ∑ j ∈ Finset.range (L + 1), esymm P (fun p => (#(Ω p) : ℝ)) j\n        ≤ ∑ _j ∈ Finset.range (L + 1), (Δr + 1) ^ L := Finset.sum_le_sum hterm\n    _ = ((L:ℝ) + 1) * (Δr + 1) ^ L := by\n        rw [Finset.sum_const, Finset.card_range, nsmul_eq_mul]\n        push_cast\n        ring\n    _ = Er := hErdef.symm\n  -- ### Step 7: there are at least two survivors\n  have hS2 : (2:ℝ) ≤ (#({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) : ℝ) := by\n    have hXpos : (0:ℝ) ≤ (X:ℝ) := Nat.cast_nonneg X\n    have h1 : (X:ℝ) * (Real.exp (-(2 * σ)) / 2)\n        ≤ (X:ℝ) * (∑ j ∈ Finset.range (L + 1),\n            (-1:ℝ) ^ j * esymm P (fun p => (#(Ω p) : ℝ) / p) j) :=\n      mul_le_mul_of_nonneg_left hA hXpos\n    have hXbig : Er + 2 ≤ (X:ℝ) * (Real.exp (-(2 * σ)) / 2) := by\n      have hexp1 : Real.exp (2 * σ) * Real.exp (-(2 * σ)) = 1 := by\n        rw [← Real.exp_add]\n        norm_num\n      have heq : (2 * Real.exp (2 * σ) * (Er + 2)) * (Real.exp (-(2 * σ)) / 2)\n          = Er + 2 := by\n        linear_combination (Er + 2) * hexp1\n      have hmul : (2 * Real.exp (2 * σ) * (Er + 2)) * (Real.exp (-(2 * σ)) / 2)\n          ≤ (X:ℝ) * (Real.exp (-(2 * σ)) / 2) := by\n        apply mul_le_mul_of_nonneg_right hXge\n        positivity\n      linarith\n    linarith [hSge, hE, h1]\n  have hS2' : 2 ≤ #({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) := by\n    exact_mod_cast hS2\n  obtain ⟨t, htmem, ht0⟩ : ∃ t ∈ ({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}), t ≠ 0 := by\n    have h1 : 1 < #({t ∈ Finset.range X | ∀ p ∈ P, t % p ∉ Ω p}) := by omega\n    obtain ⟨t₁, ht₁, t₂, ht₂, hne⟩ := Finset.one_lt_card_iff_nontrivial.mp h1\n    by_cases ht₁0 : t₁ = 0\n    · exact ⟨t₂, ht₂, by omega⟩\n    · exact ⟨t₁, ht₁, ht₁0⟩\n  rw [Finset.mem_filter, Finset.mem_range] at htmem\n  refine ⟨t, Nat.pos_of_ne_zero ht0, htmem.2, ?_⟩\n  -- ### Step 8: the size bound\n  have htle : (t:ℝ) ≤ 2 * Real.exp (2 * σ) * (Er + 2) := by\n    have h1 : (t:ℝ) + 1 ≤ (X:ℝ) := by exact_mod_cast htmem.1\n    linarith\n  have htpos : (0:ℝ) < (t:ℝ) := by exact_mod_cast Nat.pos_of_ne_zero ht0\n  have hlogt : Real.log t ≤ Real.log (2 * Real.exp (2 * σ) * (Er + 2)) :=\n    Real.log_le_log htpos htle\n  have hlogsplit : Real.log (2 * Real.exp (2 * σ) * (Er + 2))\n      = Real.log 2 + 2 * σ + Real.log (Er + 2) := by\n    rw [Real.log_mul (by positivity : (0:ℝ) < 2 * Real.exp (2 * σ)).ne'\n        (by linarith : (0:ℝ) < Er + 2).ne',\n      Real.log_mul (by norm_num : (2:ℝ) ≠ 0) (Real.exp_ne_zero _),\n      Real.log_exp]\n  have hlogE : Real.log (Er + 2) ≤ Real.log ((L:ℝ) + 3) + (L:ℝ) * Real.log (Δr + 2) := by\n    have hE2 : Er + 2 ≤ ((L:ℝ) + 3) * (Δr + 1) ^ L := by\n      rw [hErdef]\n      nlinarith [Nat.cast_nonneg (α := ℝ) L]\n    have hLpow : (0:ℝ) < (Δr + 1) ^ L := by linarith\n    calc Real.log (Er + 2)\n        ≤ Real.log (((L:ℝ) + 3) * (Δr + 1) ^ L) := Real.log_le_log (by linarith) hE2\n    _ = Real.log ((L:ℝ) + 3) + (L:ℝ) * Real.log (Δr + 1) := by\n        rw [Real.log_mul (by positivity : (0:ℝ) < (L:ℝ) + 3).ne' hLpow.ne',\n          Real.log_pow]\n    _ ≤ Real.log ((L:ℝ) + 3) + (L:ℝ) * Real.log (Δr + 2) := by\n        have h3 : Real.log (Δr + 1) ≤ Real.log (Δr + 2) :=\n          Real.log_le_log (by linarith) (by linarith)\n        have h4 : (0:ℝ) ≤ (L:ℝ) := Nat.cast_nonneg L\n        nlinarith\n  have hlogL : Real.log ((L:ℝ) + 3) ≤ 25 * (σ + 1) := by\n    have h1 := Real.log_le_sub_one_of_pos (x := (L:ℝ) + 3) (by positivity)\n    linarith\n  have hlog2 : Real.log 2 ≤ 1 := by\n    linarith [Real.log_le_sub_one_of_pos (by norm_num : (0:ℝ) < 2)]\n  have hlogΔ2 : (1/2:ℝ) ≤ Real.log (Δr + 2) := by\n    have h1 : Real.log 2 ≤ Real.log (Δr + 2) :=\n      Real.log_le_log (by norm_num) (by linarith)\n    linarith [Real.log_two_gt_d9]\n  have hlogΔpos : (0:ℝ) ≤ Real.log (Δr + 2) := by linarith\n  calc Real.log t ≤ Real.log 2 + 2 * σ + Real.log (Er + 2) := by\n        rw [← hlogsplit]\n        exact hlogt\n  _ ≤ Real.log 2 + 2 * σ + (Real.log ((L:ℝ) + 3) + (L:ℝ) * Real.log (Δr + 2)) := by\n        linarith\n  _ ≤ 1 + 2 * σ + 25 * (σ + 1) + (20 * σ + 23) * Real.log (Δr + 2) := by\n        have h5 : (L:ℝ) * Real.log (Δr + 2) ≤ (20 * σ + 23) * Real.log (Δr + 2) :=\n          mul_le_mul_of_nonneg_right hL_le hlogΔpos\n        linarith\n  _ ≤ 100 * (σ + 1) * Real.log (Δr + 2) := by\n        have h6 : (20 * σ + 23) * Real.log (Δr + 2)\n            ≤ 23 * (σ + 1) * Real.log (Δr + 2) :=\n          mul_le_mul_of_nonneg_right (by linarith) hlogΔpos\n        have h8 : 54 * (σ + 1) * (1/2) ≤ 54 * (σ + 1) * Real.log (Δr + 2) :=\n          mul_le_mul_of_nonneg_left hlogΔ2 (by linarith)\n        have h9 : (0:ℝ) ≤ σ * Real.log (Δr + 2) := mul_nonneg hσ0 hlogΔpos\n        nlinarith\n\n\n/-! ## From Erdos820/Main.lean -/\n\n/-\nThe main theorem (Theorem 1.1 of the paper):\n\n  `log K(n) ≤ 500 · τ(n) · (log (n+2))²`  for all `n ≥ 2`,\n\nwhere `τ(n) = #(divisors of n)`. Consequently the same bound holds for `H n`.\n\nProof outline (following the paper):\n* split the prime divisors of `A = 2^n - 1` into `P₀` (those with `p-1 ∣ n`)\n  and `P₁` (the rest);\n* `M := ∏_{p ∈ P₀} p ≤ (n+1)^τ(n)` since `p ↦ p-1` maps `P₀` injectively\n  into the divisors of `n`;\n* for `p ∈ P₁`, the forbidden residues `Ω_p = {v : (Mv)^n ≡ 1 mod p}` number\n  at most `gcd(n, p-1) ≤ (p-1)/2`;\n* `σ = ∑ |Ω_p|/p ≤ τ(n)·log n` by the multiplicity argument (at most `τ(n)`\n  primes share a given quotient `m_p = (p-1)/gcd`), and `Δ ≤ n²`;\n* the sieve produces `t` with `k = Mt` satisfying `gcd(k^n - 1, A) = 1`.\n-/\n\n\nopen Finset\n\nset_option maxHeartbeats 1600000 in\n/-- **Main theorem** (Theorem 1.1): `log K(n) ≤ 500 τ(n) (log (n+2))²`. -/\ntheorem log_K_le {n : ℕ} (hn : 2 ≤ n) :\n    Real.log (K n) ≤ 500 * (#n.divisors : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by\n  have hn0 : n ≠ 0 := by omega\n  set A : ℕ := 2 ^ n - 1 with hAdef\n  have h2n : 4 ≤ 2 ^ n := by\n    calc (4:ℕ) = 2 ^ 2 := by norm_num\n    _ ≤ 2 ^ n := Nat.pow_le_pow_right (by norm_num) hn\n  have hA3 : 3 ≤ A := by omega\n  have hA0 : A ≠ 0 := by omega\n  have hAodd : ¬ 2 ∣ A := by\n    have h1 : 2 ∣ 2 ^ n := dvd_pow_self 2 hn0\n    omega\n  set T : ℕ := #n.divisors with hTdef\n  have hT1 : 1 ≤ T := by\n    rw [hTdef]\n    exact Finset.card_pos.mpr ⟨1, Nat.mem_divisors.mpr ⟨one_dvd n, hn0⟩⟩\n  -- prime splitting\n  set P₀ : Finset ℕ := {p ∈ A.primeFactors | (p - 1) ∣ n} with hP₀def\n  set P₁ : Finset ℕ := {p ∈ A.primeFactors | ¬ (p - 1) ∣ n} with hP₁def\n  have hprime₁ : ∀ p ∈ P₁, Nat.Prime p := fun p hp =>\n    Nat.prime_of_mem_primeFactors (Finset.mem_filter.mp hp).1\n  have hodd : ∀ p ∈ A.primeFactors, 3 ≤ p := by\n    intro p hp\n    have hpprime : p.Prime := Nat.prime_of_mem_primeFactors hp\n    have hpdvd : p ∣ A := Nat.dvd_of_mem_primeFactors hp\n    have hp2 : p ≠ 2 := by\n      rintro rfl\n      exact hAodd hpdvd\n    have := hpprime.two_le\n    omega\n  set M : ℕ := ∏ p ∈ P₀, p with hMdef\n  have hM1 : 0 < M := by\n    rw [hMdef]\n    exact Finset.prod_pos fun p hp =>\n      (Nat.prime_of_mem_primeFactors (Finset.mem_filter.mp hp).1).pos\n  -- (F2)/(F3): P₀ injects into divisors; M ≤ (n+1)^T\n  have hP₀le : ∀ p ∈ P₀, p ≤ n + 1 := by\n    intro p hp\n    have h1 : (p - 1) ∣ n := (Finset.mem_filter.mp hp).2\n    have h2 : p - 1 ≤ n := Nat.le_of_dvd (by omega) h1\n    omega\n  have hcardP₀ : #P₀ ≤ T := by\n    rw [hTdef]\n    apply Finset.card_le_card_of_injOn (fun p => p - 1)\n    · intro p hp\n      have hp' : p ∈ P₀ := hp\n      exact Nat.mem_divisors.mpr ⟨(Finset.mem_filter.mp hp').2, hn0⟩\n    · intro p hp q hq heq\n      have hp' : p ∈ P₀ := hp\n      have hq' : q ∈ P₀ := hq\n      have heq' : p - 1 = q - 1 := heq\n      have hp3 : 3 ≤ p := hodd p (Finset.mem_filter.mp hp').1\n      have hq3 : 3 ≤ q := hodd q (Finset.mem_filter.mp hq').1\n      omega\n  have hMle : (M : ℝ) ≤ ((n : ℝ) + 1) ^ T := by\n    have h1 : M ≤ (n + 1) ^ #P₀ := by\n      rw [hMdef]\n      calc ∏ p ∈ P₀, p ≤ ∏ _p ∈ P₀, (n + 1) := Finset.prod_le_prod' hP₀le\n      _ = (n + 1) ^ #P₀ := Finset.prod_const _\n    have h2 : (n + 1) ^ #P₀ ≤ (n + 1) ^ T := Nat.pow_le_pow_right (by omega) hcardP₀\n    calc (M : ℝ) ≤ (((n + 1) ^ T : ℕ) : ℝ) := by exact_mod_cast le_trans h1 h2\n    _ = ((n : ℝ) + 1) ^ T := by push_cast; ring\n  -- (F4): p ∤ M for p ∈ P₁\n  have hMcop : ∀ p ∈ P₁, ¬ p ∣ M := by\n    intro p hp hdvd\n    have hpprime := hprime₁ p hp\n    rw [hMdef] at hdvd\n    obtain ⟨q, hq, hpq⟩ := (Prime.dvd_finset_prod_iff hpprime.prime _).mp hdvd\n    have hqprime : q.Prime := Nat.prime_of_mem_primeFactors (Finset.mem_filter.mp hq).1\n    have hpq' : p = q := (Nat.prime_dvd_prime_iff_eq hpprime hqprime).mp hpq\n    subst hpq'\n    exact (Finset.mem_filter.mp hp).2 (Finset.mem_filter.mp hq).2\n  -- forbidden residue sets\n  set Ω : ℕ → Finset ℕ :=\n    fun p => (Finset.range p).filter\n      (fun v : ℕ => ((M : ZMod p) * (v : ZMod p)) ^ n = 1) with hΩdef\n  have hΩsub : ∀ p ∈ P₁, Ω p ⊆ Finset.range p := fun p _ => Finset.filter_subset _ _\n  have hdP : ∀ p ∈ P₁, #(Ω p) ≤ Nat.gcd n (p - 1) := by\n    intro p hp\n    haveI : Fact (Nat.Prime p) := ⟨hprime₁ p hp⟩\n    exact card_root_residues_le p n M (by omega) (hMcop p hp)\n  -- gcd(n, p-1) is a proper divisor of p-1 on P₁\n  have hgcd_lt : ∀ p ∈ P₁, 2 * Nat.gcd n (p - 1) ≤ p - 1 := by\n    intro p hp\n    have hp3 : 3 ≤ p := hodd p (Finset.mem_filter.mp hp).1\n    have hd_dvd : Nat.gcd n (p - 1) ∣ p - 1 := Nat.gcd_dvd_right _ _\n    have hd_ne : Nat.gcd n (p - 1) ≠ p - 1 := by\n      intro heq\n      exact (Finset.mem_filter.mp hp).2 (heq ▸ Nat.gcd_dvd_left n (p - 1))\n    obtain ⟨k, hk⟩ := hd_dvd\n    have hd0 : 0 < Nat.gcd n (p - 1) := Nat.gcd_pos_of_pos_left _ (by omega)\n    have hk1 : k ≠ 1 := by\n      rintro rfl\n      rw [mul_one] at hk\n      exact hd_ne hk.symm\n    have hk0 : k ≠ 0 := by\n      rintro rfl\n      rw [mul_zero] at hk\n      omega\n    calc 2 * Nat.gcd n (p - 1) = Nat.gcd n (p - 1) * 2 := by ring\n    _ ≤ Nat.gcd n (p - 1) * k := Nat.mul_le_mul_left _ (by omega)\n    _ = p - 1 := hk.symm\n  have hhalf : ∀ p ∈ P₁, 2 * #(Ω p) ≤ p := by\n    intro p hp\n    have h1 := hdP p hp\n    have h2 := hgcd_lt p hp\n    omega\n  -- the quotients m_p = (p-1)/gcd(n,p-1) are ≥ 2, and m_p·gcd = p-1\n  have hm_mul : ∀ p ∈ P₁, (p - 1) / Nat.gcd n (p - 1) * Nat.gcd n (p - 1) = p - 1 :=\n    fun p _ => Nat.div_mul_cancel (Nat.gcd_dvd_right _ _)\n  have hm2 : ∀ p ∈ P₁, 2 ≤ (p - 1) / Nat.gcd n (p - 1) := by\n    intro p hp\n    have hd0 : 0 < Nat.gcd n (p - 1) := Nat.gcd_pos_of_pos_left _ (by omega : 0 < n)\n    exact (Nat.le_div_iff_mul_le hd0).mpr (by have := hgcd_lt p hp; omega)\n  -- per-prime fraction bound: |Ω_p|/p ≤ 1/m_p\n  have hfrac : ∀ p ∈ P₁,\n      (#(Ω p) : ℝ) / p ≤ 1 / (((p - 1) / Nat.gcd n (p - 1) : ℕ) : ℝ) := by\n    intro p hp\n    have hp3 : 3 ≤ p := hodd p (Finset.mem_filter.mp hp).1\n    have hm0 : 0 < (p - 1) / Nat.gcd n (p - 1) := by\n      have := hm2 p hp\n      omega\n    have hppos : (0:ℝ) < (p : ℝ) := by\n      have : 0 < p := by omega\n      exact_mod_cast this\n    have hmpos : (0:ℝ) < (((p - 1) / Nat.gcd n (p - 1) : ℕ) : ℝ) := by\n      exact_mod_cast hm0\n    rw [div_le_div_iff₀ hppos hmpos]\n    have h4 : #(Ω p) * ((p - 1) / Nat.gcd n (p - 1)) ≤ p := by\n      calc #(Ω p) * ((p - 1) / Nat.gcd n (p - 1))\n          ≤ Nat.gcd n (p - 1) * ((p - 1) / Nat.gcd n (p - 1)) :=\n            Nat.mul_le_mul_right _ (hdP p hp)\n      _ = p - 1 := by\n          rw [mul_comm]\n          exact hm_mul p hp\n      _ ≤ p := by omega\n    calc (#(Ω p) : ℝ) * (((p - 1) / Nat.gcd n (p - 1) : ℕ) : ℝ)\n        = ((#(Ω p) * ((p - 1) / Nat.gcd n (p - 1)) : ℕ) : ℝ) := by push_cast; ring\n    _ ≤ (p : ℝ) := by exact_mod_cast h4\n    _ = 1 * (p : ℝ) := (one_mul _).symm\n  -- fibers of p ↦ m_p have size at most T\n  have hfiber : ∀ v : ℕ,\n      #({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}) ≤ T := by\n    intro v\n    rw [hTdef]\n    apply Finset.card_le_card_of_injOn (fun p => Nat.gcd n (p - 1))\n    · intro p hp\n      exact Nat.mem_divisors.mpr ⟨Nat.gcd_dvd_left _ _, hn0⟩\n    · intro p hp q hq heq\n      simp only [Finset.coe_filter, Set.mem_setOf_eq] at hp hq\n      have heq' : Nat.gcd n (p - 1) = Nat.gcd n (q - 1) := heq\n      have hpP : p ∈ P₁ := hp.1\n      have hqP : q ∈ P₁ := hq.1\n      have hp3 : 3 ≤ p := hodd p (Finset.mem_filter.mp hpP).1\n      have hq3 : 3 ≤ q := hodd q (Finset.mem_filter.mp hqP).1\n      have h1 : v * Nat.gcd n (p - 1) = p - 1 := by\n        rw [← hp.2]\n        exact hm_mul p hpP\n      have h2 : v * Nat.gcd n (q - 1) = q - 1 := by\n        rw [← hq.2]\n        exact hm_mul q hqP\n      rw [heq'] at h1\n      omega\n  -- r = #P₁ < n\n  have hrn : #P₁ < n := by\n    have h1 : 3 ^ (#P₁) ≤ ∏ p ∈ P₁, p := by\n      calc 3 ^ #P₁ = ∏ _p ∈ P₁, 3 := (Finset.prod_const 3).symm\n      _ ≤ ∏ p ∈ P₁, p :=\n          Finset.prod_le_prod' fun p hp => hodd p (Finset.mem_filter.mp hp).1\n    have h2 : ∏ p ∈ P₁, p ∣ A := by\n      calc ∏ p ∈ P₁, p ∣ ∏ p ∈ A.primeFactors, p :=\n            Finset.prod_dvd_prod_of_subset _ _ _ (Finset.filter_subset _ _)\n      _ ∣ A := Nat.prod_primeFactors_dvd A\n    have h3 : ∏ p ∈ P₁, p ≤ A := Nat.le_of_dvd (by omega) h2\n    have h4 : 3 ^ #P₁ < 3 ^ n := by\n      calc 3 ^ #P₁ ≤ A := le_trans h1 h3\n      _ < 2 ^ n := by omega\n      _ ≤ 3 ^ n := Nat.pow_le_pow_left (by norm_num) n\n    exact (Nat.pow_lt_pow_iff_right (by norm_num)).mp h4\n  -- σ ≤ T log n\n  have hσbound : ∑ p ∈ P₁, (#(Ω p) : ℝ) / p ≤ (T : ℝ) * Real.log n := by\n    have hmaps : ∀ p ∈ P₁,\n        (p - 1) / Nat.gcd n (p - 1) ∈ P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1)) :=\n      fun p hp => Finset.mem_image_of_mem _ hp\n    have hgroup := Finset.sum_fiberwise_of_maps_to hmaps (fun p => (#(Ω p) : ℝ) / p)\n    rw [← hgroup]\n    have hfibsum : ∀ v ∈ P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1)),\n        ∑ p ∈ ({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}), (#(Ω p) : ℝ) / p\n          ≤ (T : ℝ) * (1 / (v : ℝ)) := by\n      intro v hv\n      obtain ⟨p₀, hp₀, hp₀v⟩ := Finset.mem_image.mp hv\n      have hv2 : 2 ≤ v := hp₀v ▸ hm2 p₀ hp₀\n      have hv0 : (0:ℝ) < (v : ℝ) := by\n        have : 0 < v := by omega\n        exact_mod_cast this\n      calc ∑ p ∈ ({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}), (#(Ω p) : ℝ) / p\n          ≤ ∑ _p ∈ ({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}), 1 / (v : ℝ) := by\n            apply Finset.sum_le_sum\n            intro p hp\n            rw [Finset.mem_filter] at hp\n            have h := hfrac p hp.1\n            rw [hp.2] at h\n            exact h\n      _ = (#({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}) : ℝ) * (1 / (v : ℝ)) := by\n            rw [Finset.sum_const, nsmul_eq_mul]\n      _ ≤ (T : ℝ) * (1 / (v : ℝ)) := by\n            apply mul_le_mul_of_nonneg_right _ (by positivity)\n            exact_mod_cast hfiber v\n    calc ∑ v ∈ P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1)),\n          ∑ p ∈ ({p ∈ P₁ | (p - 1) / Nat.gcd n (p - 1) = v}), (#(Ω p) : ℝ) / p\n        ≤ ∑ v ∈ P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1)), (T : ℝ) * (1 / (v : ℝ)) :=\n          Finset.sum_le_sum hfibsum\n    _ = (T : ℝ) * ∑ v ∈ P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1)), (1 : ℝ) / v := by\n        rw [Finset.mul_sum]\n    _ ≤ (T : ℝ) * ∑ j ∈ Finset.Icc 2 (#(P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1))) + 1),\n          (1 : ℝ) / j := by\n        apply mul_le_mul_of_nonneg_left _ (by positivity)\n        apply sum_inv_le_sum_Icc\n        intro m hm\n        obtain ⟨p₀, hp₀, hp₀v⟩ := Finset.mem_image.mp hm\n        exact hp₀v ▸ hm2 p₀ hp₀\n    _ ≤ (T : ℝ) * Real.log ((#(P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1))) : ℝ) + 1) := by\n        apply mul_le_mul_of_nonneg_left _ (by positivity)\n        have h := sum_Icc_inv_le_log (#(P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1))) + 1)\n        rwa [Nat.cast_add, Nat.cast_one] at h\n    _ ≤ (T : ℝ) * Real.log n := by\n        apply mul_le_mul_of_nonneg_left _ (by positivity)\n        apply Real.log_le_log\n        · positivity\n        · have h1 : #(P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1))) ≤ #P₁ :=\n            Finset.card_image_le\n          have h2 : #(P₁.image (fun p => (p - 1) / Nat.gcd n (p - 1))) + 1 ≤ n := by omega\n          exact_mod_cast h2\n  -- Δ ≤ n²\n  have hΔbound : ∑ p ∈ P₁, (#(Ω p) : ℝ) ≤ (n : ℝ) ^ 2 := by\n    have h1 : ∀ p ∈ P₁, (#(Ω p) : ℝ) ≤ (n : ℝ) := by\n      intro p hp\n      have h2 : #(Ω p) ≤ Nat.gcd n (p - 1) := hdP p hp\n      have h3 : Nat.gcd n (p - 1) ≤ n := Nat.le_of_dvd (by omega) (Nat.gcd_dvd_left _ _)\n      exact_mod_cast le_trans h2 h3\n    calc ∑ p ∈ P₁, (#(Ω p) : ℝ) ≤ ∑ _p ∈ P₁, (n : ℝ) := Finset.sum_le_sum h1\n    _ = (#P₁ : ℝ) * (n : ℝ) := by rw [Finset.sum_const, nsmul_eq_mul]\n    _ ≤ (n : ℝ) * (n : ℝ) := by\n        apply mul_le_mul_of_nonneg_right _ (by positivity)\n        exact_mod_cast le_of_lt hrn\n    _ = (n : ℝ) ^ 2 := by ring\n  -- apply the sieve\n  obtain ⟨t, ht0, htavoid, htlog⟩ := sieve P₁ hprime₁ Ω hΩsub hhalf\n  set k : ℕ := M * t with hkdef\n  have hk1 : 0 < k := Nat.mul_pos hM1 ht0\n  have hkpow1 : 1 ≤ k ^ n := Nat.one_le_pow _ _ hk1\n  -- coprimality of k^n - 1 and A\n  have hcoprime : Nat.gcd (k ^ n - 1) A = 1 := by\n    by_contra hne\n    obtain ⟨q, hqprime, hqdvd⟩ := Nat.exists_prime_and_dvd hne\n    have hq1 : q ∣ k ^ n - 1 := hqdvd.trans (Nat.gcd_dvd_left _ _)\n    have hq2 : q ∣ A := hqdvd.trans (Nat.gcd_dvd_right _ _)\n    have hqPF : q ∈ A.primeFactors := Nat.mem_primeFactors.mpr ⟨hqprime, hq2, hA0⟩\n    by_cases hqP₀ : (q - 1) ∣ n\n    · have hqmem : q ∈ P₀ := Finset.mem_filter.mpr ⟨hqPF, hqP₀⟩\n      have hqM : q ∣ M := by\n        rw [hMdef]\n        exact Finset.dvd_prod_of_mem (fun x => x) hqmem\n      have hMk : M ∣ k := by\n        rw [hkdef]\n        exact dvd_mul_right M t\n      have hqk : q ∣ k ^ n := (hqM.trans hMk).trans (dvd_pow_self k hn0)\n      have hqone : q ∣ k ^ n - (k ^ n - 1) := Nat.dvd_sub hqk hq1\n      rw [Nat.sub_sub_self hkpow1] at hqone\n      have h5 := Nat.le_of_dvd (by norm_num) hqone\n      have h6 := hqprime.two_le\n      omega\n    · have hqmem : q ∈ P₁ := Finset.mem_filter.mpr ⟨hqPF, hqP₀⟩\n      haveI : Fact (Nat.Prime q) := ⟨hqprime⟩\n      have hcast : ((k ^ n - 1 : ℕ) : ZMod q) = 0 := (ZMod.natCast_eq_zero_iff _ _).mpr hq1\n      rw [Nat.cast_sub hkpow1] at hcast\n      push_cast at hcast\n      have hkn1 : (k : ZMod q) ^ n = 1 := by\n        have h7 := sub_eq_zero.mp hcast\n        exact h7\n      have htmod : t % q ∈ Ω q := by\n        simp only [hΩdef]\n        apply Finset.mem_filter.mpr\n        refine ⟨Finset.mem_range.mpr (Nat.mod_lt _ hqprime.pos), ?_⟩\n        have h5 : ((t % q : ℕ) : ZMod q) = (t : ZMod q) := ZMod.natCast_mod t q\n        rw [h5]\n        have h6 : (M : ZMod q) * (t : ZMod q) = (k : ZMod q) := by\n          rw [hkdef]\n          push_cast\n          ring\n        rw [h6]\n        exact hkn1\n      exact htavoid q hqmem htmod\n  -- K n ≤ k\n  have hcoprime' : Nat.gcd (k ^ n - 1) (2 ^ n - 1) = 1 := by\n    rw [← hAdef]\n    exact hcoprime\n  have hk2 : 2 ≤ k := by\n    rcases Nat.lt_or_ge k 2 with hlt | hge\n    · exfalso\n      have hk1' : k = 1 := by omega\n      rw [hk1', one_pow, Nat.sub_self, Nat.gcd_zero_left] at hcoprime\n      omega\n    · exact hge\n  have hKle : K n ≤ k := K_le ⟨hk2, hcoprime'⟩\n  -- logarithmic assembly\n  have hKpos : (0:ℝ) < (K n : ℝ) := by\n    have := two_le_K hn\n    have h0 : 0 < K n := by omega\n    exact_mod_cast h0\n  have hlogK : Real.log (K n) ≤ Real.log k :=\n    Real.log_le_log hKpos (by exact_mod_cast hKle)\n  have hMR : (0:ℝ) < (M : ℝ) := by exact_mod_cast hM1\n  have htR : (0:ℝ) < (t : ℝ) := by exact_mod_cast ht0\n  have hlogk : Real.log k = Real.log M + Real.log t := by\n    rw [hkdef]\n    push_cast\n    exact Real.log_mul hMR.ne' htR.ne'\n  have hlogn2 : (1:ℝ) ≤ Real.log ((n : ℝ) + 2) := by\n    have hn2 : (4:ℝ) ≤ (n : ℝ) + 2 := by\n      have h : (2:ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\n      linarith\n    have h1 : Real.exp 1 ≤ (n : ℝ) + 2 := by\n      have := Real.exp_one_lt_d9\n      linarith\n    have h2 := Real.log_le_log (Real.exp_pos 1) h1\n    rwa [Real.log_exp] at h2\n  have hlogM : Real.log M ≤ (T : ℝ) * Real.log ((n : ℝ) + 2) := by\n    have h1 : Real.log M ≤ Real.log (((n : ℝ) + 1) ^ T) := Real.log_le_log hMR hMle\n    rw [Real.log_pow] at h1\n    have h2 : Real.log ((n : ℝ) + 1) ≤ Real.log ((n : ℝ) + 2) :=\n      Real.log_le_log (by positivity) (by linarith)\n    calc Real.log M ≤ (T : ℝ) * Real.log ((n : ℝ) + 1) := h1\n    _ ≤ (T : ℝ) * Real.log ((n : ℝ) + 2) :=\n        mul_le_mul_of_nonneg_left h2 (by positivity)\n  -- convert the sieve bound\n  have hnR2 : (2:ℝ) ≤ (n : ℝ) := by exact_mod_cast hn\n  have hσ1 : (∑ p ∈ P₁, (#(Ω p) : ℝ) / p) + 1 ≤ 2 * (T : ℝ) * Real.log ((n : ℝ) + 2) := by\n    have h1 : Real.log n ≤ Real.log ((n : ℝ) + 2) :=\n      Real.log_le_log (by linarith) (by linarith)\n    have h2 : (T : ℝ) * Real.log n ≤ (T : ℝ) * Real.log ((n : ℝ) + 2) :=\n      mul_le_mul_of_nonneg_left h1 (by positivity)\n    have hT1R : (1:ℝ) ≤ (T : ℝ) := by exact_mod_cast hT1\n    have h3 : (1:ℝ) ≤ (T : ℝ) * Real.log ((n : ℝ) + 2) := by nlinarith\n    linarith [hσbound]\n  have hsumΩ0 : (0:ℝ) ≤ ∑ p ∈ P₁, (#(Ω p) : ℝ) :=\n    Finset.sum_nonneg fun p _ => Nat.cast_nonneg _\n  have hΔ2 : Real.log ((∑ p ∈ P₁, (#(Ω p) : ℝ)) + 2) ≤ 2 * Real.log ((n : ℝ) + 2) := by\n    have h1 : (∑ p ∈ P₁, (#(Ω p) : ℝ)) + 2 ≤ ((n : ℝ) + 2) ^ 2 := by\n      nlinarith [hΔbound]\n    calc Real.log ((∑ p ∈ P₁, (#(Ω p) : ℝ)) + 2)\n        ≤ Real.log (((n : ℝ) + 2) ^ 2) := Real.log_le_log (by linarith) h1\n    _ = 2 * Real.log ((n : ℝ) + 2) := by\n        rw [Real.log_pow]\n        push_cast\n        ring\n  have hσnn : (0:ℝ) ≤ ∑ p ∈ P₁, (#(Ω p) : ℝ) / p :=\n    Finset.sum_nonneg fun p hp => by positivity\n  have hlogΔnn : (0:ℝ) ≤ Real.log ((∑ p ∈ P₁, (#(Ω p) : ℝ)) + 2) :=\n    Real.log_nonneg (by linarith)\n  have hlogt2 : Real.log t ≤ 400 * (T : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by\n    have hb1 : 100 * ((∑ p ∈ P₁, (#(Ω p) : ℝ) / p) + 1)\n        ≤ 100 * (2 * (T : ℝ) * Real.log ((n : ℝ) + 2)) := by linarith\n    have hb0 : (0:ℝ) ≤ 100 * ((∑ p ∈ P₁, (#(Ω p) : ℝ) / p) + 1) := by linarith\n    calc Real.log t\n        ≤ 100 * ((∑ p ∈ P₁, (#(Ω p) : ℝ) / p) + 1)\n          * Real.log ((∑ p ∈ P₁, (#(Ω p) : ℝ)) + 2) := htlog\n    _ ≤ 100 * (2 * (T : ℝ) * Real.log ((n : ℝ) + 2)) * (2 * Real.log ((n : ℝ) + 2)) := by\n        apply mul_le_mul hb1 hΔ2 hlogΔnn\n        have hT0 : (0:ℝ) ≤ (T : ℝ) := Nat.cast_nonneg T\n        nlinarith\n    _ = 400 * (T : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by ring\n  calc Real.log (K n) ≤ Real.log k := hlogK\n  _ = Real.log M + Real.log t := hlogk\n  _ ≤ (T : ℝ) * Real.log ((n : ℝ) + 2) + 400 * (T : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by\n      linarith\n  _ ≤ 500 * (T : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by\n      have hT0 : (0:ℝ) ≤ (T : ℝ) := Nat.cast_nonneg T\n      nlinarith [hlogn2]\n\n/-- The bound for `H`: `log H(n) ≤ 500 τ(n) (log (n+2))²`. -/\ntheorem log_H_le {n : ℕ} (hn : 2 ≤ n) :\n    Real.log (H n) ≤ 500 * (#n.divisors : ℝ) * Real.log ((n : ℝ) + 2) ^ 2 := by\n  have h1 : Real.log (H n) ≤ Real.log (K n) := by\n    apply Real.log_le_log\n    · have := three_le_H hn\n      have h0 : 0 < H n := by omega\n      exact_mod_cast h0\n    · exact_mod_cast H_le_K hn\n  exact h1.trans (log_K_le hn)\n\n\n/-! ## From Erdos820/Wigert.lean -/\n\n/-\nWigert's upper bound for the divisor function (Lemma 3.2 of the paper):\n\n  for every `η > 0`, eventually  `log τ(n) ≤ (log 2 + η) · log n / log log n`.\n\nThe proof follows the paper: with `δ = c₀ / log log n` (where `c₀ = log 2 + η/2`),\nsplit the prime factorization of `n` at `p^δ ≥ 2`.  Large primes contribute at\nmost `n^δ`; each small prime contributes a factor at most `(1 - 2^{-δ})⁻¹`, and\nthere are at most `2^{1/δ}` small primes.\n-/\n\n\nopen Finset Filter\n\n/-- Pointwise Wigert-type bound: for `0 < δ`,\n`τ(n) ≤ n^δ · ((1 - 2^{-δ})⁻¹)^⌊2^{1/δ}⌋`. -/\nlemma tau_le_rpow (n : ℕ) (hn : n ≠ 0) {δ : ℝ} (hδ0 : 0 < δ) :\n    (#n.divisors : ℝ)\n      ≤ (n : ℝ) ^ δ * ((1 - (2:ℝ) ^ (-δ))⁻¹) ^ ⌊(2:ℝ) ^ (1/δ)⌋₊ := by\n  -- basic facts about `2^{-δ}`\n  have h2δpos : (0:ℝ) < (2:ℝ) ^ (-δ) := Real.rpow_pos_of_pos (by norm_num) _\n  have h2δlt1 : (2:ℝ) ^ (-δ) < 1 :=\n    Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith)\n  have hcpos : (0:ℝ) < (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n    apply inv_pos.mpr\n    linarith\n  have hc1 : (1:ℝ) ≤ (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n    rw [one_le_inv_iff₀]\n    constructor\n    · linarith\n    · linarith\n  -- factorization data\n  have hτ : (#n.divisors : ℝ)\n      = ∏ p ∈ n.primeFactors, ((n.factorization p + 1 : ℕ) : ℝ) := by\n    rw [Nat.card_divisors hn]\n    push_cast\n    rfl\n  have hnfact : (n : ℝ) = ∏ p ∈ n.primeFactors, ((p : ℝ) ^ (n.factorization p)) := by\n    conv_lhs => rw [← Nat.factorization_prod_pow_eq_self hn]\n    rw [Finsupp.prod, Nat.support_factorization]\n    push_cast\n    rfl\n  have hrpow : (n : ℝ) ^ δ\n      = ∏ p ∈ n.primeFactors, ((p : ℝ) ^ (n.factorization p)) ^ δ := by\n    rw [hnfact, ← Real.finset_prod_rpow _ _ (fun p _ => by positivity) δ]\n  -- the per-prime factor bound\n  have hfac : ∀ p ∈ n.primeFactors, ((n.factorization p + 1 : ℕ) : ℝ)\n      ≤ ((p : ℝ) ^ (n.factorization p)) ^ δ\n        * (if (p:ℝ) ^ δ < 2 then (1 - (2:ℝ) ^ (-δ))⁻¹ else 1) := by\n    intro p hp\n    have hpprime := Nat.prime_of_mem_primeFactors hp\n    have hp2 : 2 ≤ p := hpprime.two_le\n    have hp0 : (0:ℝ) < (p:ℝ) := by\n      have := hpprime.pos\n      exact_mod_cast this\n    have hcomm : ((p:ℝ) ^ (n.factorization p)) ^ δ = ((p:ℝ) ^ δ) ^ (n.factorization p) := by\n      rw [← Real.rpow_natCast (p:ℝ) (n.factorization p), ← Real.rpow_mul hp0.le,\n        mul_comm, Real.rpow_mul hp0.le, Real.rpow_natCast]\n    have hpδpos : (0:ℝ) < (p:ℝ) ^ δ := Real.rpow_pos_of_pos hp0 δ\n    by_cases hcase : (p:ℝ) ^ δ < 2\n    · rw [if_pos hcase, hcomm]\n      -- small prime: geometric series argument\n      have hpδ1 : (1:ℝ) < (p:ℝ) ^ δ := by\n        have h2p : (2:ℝ) ≤ (p:ℝ) := by exact_mod_cast hp2\n        calc (1:ℝ) < (2:ℝ) ^ δ := by\n              apply Real.one_lt_rpow_iff_of_pos (by norm_num) |>.mpr\n              exact Or.inl ⟨by norm_num, hδ0⟩\n        _ ≤ (p:ℝ) ^ δ := Real.rpow_le_rpow (by norm_num) h2p hδ0.le\n      have hx0 : (0:ℝ) < ((p:ℝ) ^ δ)⁻¹ := by positivity\n      have hx1 : ((p:ℝ) ^ δ)⁻¹ < 1 := inv_lt_one_of_one_lt₀ hpδ1\n      -- (a+1)·x^a ≤ (1-x)⁻¹ where x = (p^δ)⁻¹, a = factorization\n      have hgeom : ((n.factorization p : ℝ) + 1) * (((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p)\n          ≤ (1 - ((p:ℝ) ^ δ)⁻¹)⁻¹ := by\n        have h1 : ((n.factorization p : ℝ) + 1) * (((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p)\n            = ∑ _j ∈ Finset.range (n.factorization p + 1),\n                (((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p) := by\n          rw [Finset.sum_const, Finset.card_range, nsmul_eq_mul]\n          push_cast\n          ring\n        have h2 : ∑ _j ∈ Finset.range (n.factorization p + 1),\n              (((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p)\n            ≤ ∑ j ∈ Finset.range (n.factorization p + 1), (((p:ℝ) ^ δ)⁻¹) ^ j := by\n          apply Finset.sum_le_sum\n          intro j hj\n          exact pow_le_pow_of_le_one hx0.le hx1.le\n            (Nat.lt_succ_iff.mp (Finset.mem_range.mp hj))\n        have h3 : ∑ j ∈ Finset.range (n.factorization p + 1), (((p:ℝ) ^ δ)⁻¹) ^ j\n            ≤ (1 - ((p:ℝ) ^ δ)⁻¹)⁻¹ := by\n          rw [geom_sum_eq (by linarith : ((p:ℝ) ^ δ)⁻¹ ≠ 1)]\n          have h4 : ((((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p + 1) - 1) / (((p:ℝ) ^ δ)⁻¹ - 1)\n              = (1 - (((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p + 1)) / (1 - ((p:ℝ) ^ δ)⁻¹) := by\n            rw [← neg_sub (1:ℝ) ((((p:ℝ) ^ δ)⁻¹) ^ (n.factorization p + 1)),\n              ← neg_sub (1:ℝ) (((p:ℝ) ^ δ)⁻¹), neg_div_neg_eq]\n          have hden : (0:ℝ) < 1 - ((p:ℝ) ^ δ)⁻¹ := by linarith\n          rw [h4, inv_eq_one_div (1 - ((p:ℝ) ^ δ)⁻¹), div_le_div_iff₀ hden hden]\n          nlinarith [pow_nonneg hx0.le (n.factorization p + 1)]\n        linarith\n      -- pass from `(1-x)⁻¹` to `(1-2^{-δ})⁻¹`\n      have hxle : ((p:ℝ) ^ δ)⁻¹ ≤ (2:ℝ) ^ (-δ) := by\n        rw [Real.rpow_neg (by norm_num : (0:ℝ) ≤ 2)]\n        have h2δp : (2:ℝ) ^ δ ≤ (p:ℝ) ^ δ :=\n          Real.rpow_le_rpow (by norm_num) (by exact_mod_cast hp2) hδ0.le\n        have h2δ0 : (0:ℝ) < (2:ℝ) ^ δ := Real.rpow_pos_of_pos (by norm_num) δ\n        rw [inv_eq_one_div ((p:ℝ) ^ δ), inv_eq_one_div ((2:ℝ) ^ δ)]\n        exact one_div_le_one_div_of_le h2δ0 h2δp\n      have hinvle : (1 - ((p:ℝ) ^ δ)⁻¹)⁻¹ ≤ (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n        rw [inv_eq_one_div (1 - ((p:ℝ) ^ δ)⁻¹), inv_eq_one_div (1 - (2:ℝ) ^ (-δ))]\n        apply one_div_le_one_div_of_le\n        · linarith\n        · linarith\n      -- assemble\n      have h5 : ((n.factorization p : ℝ) + 1) * ((((p:ℝ) ^ δ) ^ (n.factorization p))⁻¹)\n          ≤ (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n        rw [← inv_pow]\n        exact hgeom.trans hinvle\n      have hppow : (0:ℝ) < ((p:ℝ) ^ δ) ^ (n.factorization p) := by positivity\n      have hcast : ((n.factorization p + 1 : ℕ) : ℝ) = (n.factorization p : ℝ) + 1 := by\n        push_cast\n        ring\n      rw [hcast]\n      calc (n.factorization p : ℝ) + 1\n          = ((n.factorization p : ℝ) + 1) * ((((p:ℝ) ^ δ) ^ (n.factorization p))⁻¹)\n            * ((p:ℝ) ^ δ) ^ (n.factorization p) := by\n            field_simp\n      _ ≤ (1 - (2:ℝ) ^ (-δ))⁻¹ * ((p:ℝ) ^ δ) ^ (n.factorization p) :=\n            mul_le_mul_of_nonneg_right h5 hppow.le\n      _ = ((p:ℝ) ^ δ) ^ (n.factorization p) * (1 - (2:ℝ) ^ (-δ))⁻¹ := by ring\n    · rw [if_neg hcase, mul_one, hcomm]\n      push_neg at hcase\n      have h2a : ((n.factorization p : ℝ) + 1) ≤ (2:ℝ) ^ (n.factorization p) := by\n        have h := Nat.lt_two_pow_self (n := n.factorization p)\n        have h' : n.factorization p + 1 ≤ 2 ^ (n.factorization p) := h\n        exact_mod_cast h'\n      have h2pa : (2:ℝ) ^ (n.factorization p) ≤ ((p:ℝ) ^ δ) ^ (n.factorization p) :=\n        pow_le_pow_left₀ (by norm_num) hcase _\n      push_cast\n      push_cast at h2a\n      linarith\n  -- multiply the factor bounds\n  have hprodle : (#n.divisors : ℝ)\n      ≤ (n : ℝ) ^ δ * ∏ p ∈ n.primeFactors,\n          (if (p:ℝ) ^ δ < 2 then (1 - (2:ℝ) ^ (-δ))⁻¹ else 1) := by\n    rw [hτ, hrpow, ← Finset.prod_mul_distrib]\n    exact Finset.prod_le_prod (fun p _ => Nat.cast_nonneg _) hfac\n  -- the conditional product is a power of the constant\n  have hite : ∏ p ∈ n.primeFactors,\n        (if (p:ℝ) ^ δ < 2 then (1 - (2:ℝ) ^ (-δ))⁻¹ else 1)\n      = ((1 - (2:ℝ) ^ (-δ))⁻¹)\n          ^ #(n.primeFactors.filter (fun p : ℕ => (p:ℝ) ^ δ < 2)) := by\n    rw [Finset.prod_ite, Finset.prod_const, Finset.prod_const_one, mul_one]\n  -- count of small primes\n  have hsmall : #(n.primeFactors.filter (fun p : ℕ => (p:ℝ) ^ δ < 2))\n      ≤ ⌊(2:ℝ) ^ (1/δ)⌋₊ := by\n    have hsub : n.primeFactors.filter (fun p : ℕ => (p:ℝ) ^ δ < 2)\n        ⊆ Finset.Icc 1 ⌊(2:ℝ) ^ (1/δ)⌋₊ := by\n      intro p hp\n      rw [Finset.mem_filter] at hp\n      have hpprime := Nat.prime_of_mem_primeFactors hp.1\n      have hp0 : (0:ℝ) < (p:ℝ) := by\n        have := hpprime.pos\n        exact_mod_cast this\n      have hple : (p:ℝ) ≤ (2:ℝ) ^ (1/δ) := by\n        have h1 : ((p:ℝ) ^ δ) ^ (1/δ) ≤ (2:ℝ) ^ (1/δ) :=\n          Real.rpow_le_rpow (by positivity) hp.2.le (by positivity)\n        rwa [← Real.rpow_mul hp0.le, mul_one_div, div_self hδ0.ne',\n          Real.rpow_one] at h1\n      rw [Finset.mem_Icc]\n      exact ⟨hpprime.one_lt.le, Nat.le_floor hple⟩\n    calc #(n.primeFactors.filter (fun p : ℕ => (p:ℝ) ^ δ < 2))\n        ≤ #(Finset.Icc 1 ⌊(2:ℝ) ^ (1/δ)⌋₊) := Finset.card_le_card hsub\n    _ = ⌊(2:ℝ) ^ (1/δ)⌋₊ := by\n        rw [Nat.card_Icc]\n        omega\n  calc (#n.divisors : ℝ)\n      ≤ (n : ℝ) ^ δ * ((1 - (2:ℝ) ^ (-δ))⁻¹)\n          ^ #(n.primeFactors.filter (fun p : ℕ => (p:ℝ) ^ δ < 2)) := by\n        rw [← hite]\n        exact hprodle\n  _ ≤ (n : ℝ) ^ δ * ((1 - (2:ℝ) ^ (-δ))⁻¹) ^ ⌊(2:ℝ) ^ (1/δ)⌋₊ := by\n        apply mul_le_mul_of_nonneg_left _ (by positivity)\n        exact pow_le_pow_right₀ hc1 hsmall\n\n/-- Logarithmic form of the pointwise bound: for `0 < δ ≤ 1`,\n`log τ(n) ≤ δ log n + 2^{1/δ} (log 4 - log δ)`. -/\nlemma log_tau_le (n : ℕ) (hn : 2 ≤ n) {δ : ℝ} (hδ0 : 0 < δ) (hδ1 : δ ≤ 1) :\n    Real.log (#n.divisors)\n      ≤ δ * Real.log n + (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) := by\n  have hn0 : n ≠ 0 := by omega\n  have hτ1 : 1 ≤ #n.divisors :=\n    Finset.card_pos.mpr ⟨1, Nat.mem_divisors.mpr ⟨one_dvd n, hn0⟩⟩\n  have hτpos : (0:ℝ) < (#n.divisors : ℝ) := by exact_mod_cast hτ1\n  -- constants\n  have h2δpos : (0:ℝ) < (2:ℝ) ^ (-δ) := Real.rpow_pos_of_pos (by norm_num) _\n  have h2δlt1 : (2:ℝ) ^ (-δ) < 1 :=\n    Real.rpow_lt_one_of_one_lt_of_neg (by norm_num) (by linarith)\n  have hgap : δ / 4 ≤ 1 - (2:ℝ) ^ (-δ) := by\n    -- 1 - 2^{-δ} ≥ δ·log 2·2^{-δ} ≥ δ/4\n    have hlog2 : (1/2:ℝ) ≤ Real.log 2 := by\n      linarith [Real.log_two_gt_d9]\n    have h2δhalf : (1/2:ℝ) ≤ (2:ℝ) ^ (-δ) := by\n      have h1 : (2:ℝ) ^ δ ≤ 2 := by\n        have h := Real.rpow_le_rpow_of_exponent_le (by norm_num : (1:ℝ) ≤ 2) hδ1\n        rwa [Real.rpow_one] at h\n      have h2 : (0:ℝ) < (2:ℝ) ^ δ := Real.rpow_pos_of_pos (by norm_num) δ\n      rw [Real.rpow_neg (by norm_num : (0:ℝ) ≤ 2), inv_eq_one_div]\n      exact one_div_le_one_div_of_le h2 h1\n    have hkey : δ * Real.log 2 * (2:ℝ) ^ (-δ) ≤ 1 - (2:ℝ) ^ (-δ) := by\n      -- with u = δ log 2:  u e^{-u} ≤ 1 - e^{-u}  ⟺  1 + u ≤ e^u\n      have hu : (2:ℝ) ^ (-δ) = Real.exp (-(δ * Real.log 2)) := by\n        rw [Real.rpow_def_of_pos (by norm_num : (0:ℝ) < 2)]\n        congr 1\n        ring\n      have hexp : δ * Real.log 2 + 1 ≤ Real.exp (δ * Real.log 2) :=\n        Real.add_one_le_exp _\n      have hepos : (0:ℝ) < Real.exp (-(δ * Real.log 2)) := Real.exp_pos _\n      have hprod : Real.exp (δ * Real.log 2) * Real.exp (-(δ * Real.log 2)) = 1 := by\n        rw [← Real.exp_add]\n        norm_num\n      rw [hu]\n      nlinarith\n    have hstep1 : δ / 2 ≤ δ * Real.log 2 := by\n      nlinarith [mul_nonneg hδ0.le (by linarith : (0:ℝ) ≤ Real.log 2 - 1/2)]\n    have hlognn : (0:ℝ) ≤ δ * Real.log 2 := by nlinarith\n    have hstep2 : (δ / 2) * (1/2) ≤ (δ * Real.log 2) * (2:ℝ) ^ (-δ) :=\n      mul_le_mul hstep1 h2δhalf (by norm_num) hlognn\n    nlinarith [hkey, hstep2]\n  have hgappos : (0:ℝ) < δ / 4 := by linarith\n  have hinvle : (1 - (2:ℝ) ^ (-δ))⁻¹ ≤ 4 / δ := by\n    have h1 : (1 - (2:ℝ) ^ (-δ))⁻¹ ≤ (δ/4)⁻¹ := by\n      rw [inv_eq_one_div, inv_eq_one_div]\n      exact one_div_le_one_div_of_le hgappos hgap\n    have h2 : ((δ:ℝ)/4)⁻¹ = 4/δ := by\n      rw [inv_div]\n    linarith\n  have hcpos : (0:ℝ) < (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n    apply inv_pos.mpr\n    linarith\n  have hc1 : (1:ℝ) ≤ (1 - (2:ℝ) ^ (-δ))⁻¹ := by\n    rw [one_le_inv_iff₀]\n    exact ⟨by linarith, by linarith⟩\n  -- take logs in `tau_le_rpow`\n  have hmain := tau_le_rpow n hn0 hδ0\n  have hnpos : (0:ℝ) < (n:ℝ) := by\n    have : 0 < n := by omega\n    exact_mod_cast this\n  have hlog := Real.log_le_log hτpos hmain\n  rw [Real.log_mul (Real.rpow_pos_of_pos hnpos δ).ne' (pow_pos hcpos _).ne',\n    Real.log_rpow hnpos, Real.log_pow] at hlog\n  -- bound the error term\n  have hfloor : (⌊(2:ℝ) ^ (1/δ)⌋₊ : ℝ) ≤ (2:ℝ) ^ (1/δ) :=\n    Nat.floor_le (by positivity)\n  have hlogc : Real.log ((1 - (2:ℝ) ^ (-δ))⁻¹) ≤ Real.log 4 - Real.log δ := by\n    have h1 : Real.log ((1 - (2:ℝ) ^ (-δ))⁻¹) ≤ Real.log (4/δ) :=\n      Real.log_le_log hcpos hinvle\n    rwa [Real.log_div (by norm_num) hδ0.ne'] at h1\n  have hlogcpos : (0:ℝ) ≤ Real.log ((1 - (2:ℝ) ^ (-δ))⁻¹) :=\n    Real.log_nonneg hc1\n  have herr : (⌊(2:ℝ) ^ (1/δ)⌋₊ : ℝ) * Real.log ((1 - (2:ℝ) ^ (-δ))⁻¹)\n      ≤ (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) := by\n    apply mul_le_mul hfloor hlogc hlogcpos (by positivity)\n  linarith\n\n/-- **Wigert's theorem** (upper-bound half): for every `η > 0`, eventually in `n`,\n`log τ(n) ≤ (log 2 + η) · log n / log log n`. -/\ntheorem log_card_divisors_le {η : ℝ} (hη : 0 < η) :\n    ∀ᶠ n : ℕ in Filter.atTop,\n      Real.log (#n.divisors)\n        ≤ (Real.log 2 + η) * (Real.log n / Real.log (Real.log n)) := by\n  have hlog2 : (0:ℝ) < Real.log 2 := Real.log_pos (by norm_num)\n  obtain ⟨c₀, hc₀def⟩ : ∃ c₀ : ℝ, c₀ = Real.log 2 + η / 2 := ⟨_, rfl⟩\n  have hc₀ : 0 < c₀ := by rw [hc₀def]; linarith\n  obtain ⟨β, hβdef⟩ : ∃ β : ℝ, β = Real.log 2 / c₀ := ⟨_, rfl⟩\n  have hβ0 : 0 < β := by rw [hβdef]; positivity\n  have hβlt : β < 1 := by\n    rw [hβdef, div_lt_one hc₀, hc₀def]\n    linarith\n  obtain ⟨ε, hεdef⟩ : ∃ ε : ℝ, ε = (1 - β) / 4 := ⟨_, rfl⟩\n  have hε0 : 0 < ε := by rw [hεdef]; linarith\n  obtain ⟨C₂, hC₂def⟩ : ∃ C₂ : ℝ, C₂ = |Real.log 4 - Real.log c₀| + 1 := ⟨_, rfl⟩\n  have hC₂1 : 1 ≤ C₂ := by\n    rw [hC₂def]\n    linarith [abs_nonneg (Real.log 4 - Real.log c₀)]\n  obtain ⟨C₃, hC₃def⟩ : ∃ C₃ : ℝ, C₃ = 2 * C₂ / (η * ε ^ 2) := ⟨_, rfl⟩\n  have hC₃0 : 0 < C₃ := by\n    rw [hC₃def]\n    positivity\n  -- limit facts\n  have hlogtends : Filter.Tendsto (fun n : ℕ => Real.log n) Filter.atTop Filter.atTop :=\n    Real.tendsto_log_atTop.comp tendsto_natCast_atTop_atTop\n  have hloglog : Filter.Tendsto (fun n : ℕ => Real.log (Real.log n))\n      Filter.atTop Filter.atTop := Real.tendsto_log_atTop.comp hlogtends\n  have hrpowt : Filter.Tendsto (fun n : ℕ => (Real.log n) ^ ((1 - β)/2 : ℝ))\n      Filter.atTop Filter.atTop :=\n    (tendsto_rpow_atTop (by linarith : (0:ℝ) < (1 - β)/2)).comp hlogtends\n  filter_upwards [hloglog.eventually_ge_atTop (max c₀ 1),\n    hlogtends.eventually_ge_atTop 1,\n    hrpowt.eventually_ge_atTop C₃,\n    Filter.eventually_ge_atTop 2] with n hy hℓ hC₃n hn2\n  -- abbreviations\n  obtain ⟨ℓ, hℓdef⟩ : ∃ ℓ : ℝ, ℓ = Real.log n := ⟨_, rfl⟩\n  obtain ⟨y, hydef⟩ : ∃ y : ℝ, y = Real.log (Real.log n) := ⟨_, rfl⟩\n  rw [← hℓdef] at hℓ hC₃n\n  rw [← hydef] at hy\n  have hyℓ : y = Real.log ℓ := by rw [hydef, hℓdef]\n  rw [← hydef, ← hℓdef]\n  have hℓpos : (0:ℝ) < ℓ := by linarith\n  have hy1 : (1:ℝ) ≤ y := le_trans (le_max_right _ _) hy\n  have hyc₀ : c₀ ≤ y := le_trans (le_max_left _ _) hy\n  have hypos : (0:ℝ) < y := by linarith\n  -- the choice of δ\n  obtain ⟨δ, hδdef⟩ : ∃ δ : ℝ, δ = c₀ / y := ⟨_, rfl⟩\n  have hδ0 : 0 < δ := by rw [hδdef]; positivity\n  have hδ1 : δ ≤ 1 := by\n    rw [hδdef, div_le_one hypos]\n    exact hyc₀\n  -- apply the pointwise bound\n  have hmain := log_tau_le n hn2 hδ0 hδ1\n  rw [← hℓdef] at hmain\n  -- identify `2^{1/δ}` with `ℓ^β`\n  have h2δ : (2:ℝ) ^ (1/δ) = ℓ ^ (β:ℝ) := by\n    rw [Real.rpow_def_of_pos (by norm_num : (0:ℝ) < 2),\n      Real.rpow_def_of_pos hℓpos, ← hyℓ, hδdef, hβdef]\n    congr 1\n    field_simp\n    try ring\n  -- bound the error factor\n  have hlogδ : Real.log δ = Real.log c₀ - Real.log y := by\n    rw [hδdef, Real.log_div hc₀.ne' hypos.ne']\n  have hlogy : Real.log y ≤ y := by\n    linarith [Real.log_le_sub_one_of_pos hypos]\n  have herrfac : Real.log 4 - Real.log δ ≤ C₂ * y := by\n    rw [hlogδ]\n    have h1 : Real.log 4 - Real.log c₀ ≤ |Real.log 4 - Real.log c₀| := le_abs_self _\n    have h2 : |Real.log 4 - Real.log c₀| * 1 ≤ |Real.log 4 - Real.log c₀| * y :=\n      mul_le_mul_of_nonneg_left hy1 (abs_nonneg _)\n    rw [hC₂def]\n    nlinarith [abs_nonneg (Real.log 4 - Real.log c₀)]\n  have hℓβpos : (0:ℝ) < ℓ ^ (β:ℝ) := Real.rpow_pos_of_pos hℓpos _\n  have herr : (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) ≤ ℓ ^ (β:ℝ) * (C₂ * y) := by\n    rw [h2δ]\n    exact mul_le_mul_of_nonneg_left herrfac hℓβpos.le\n  -- `y ≤ ℓ^ε/ε`\n  have hyε : y ≤ ℓ ^ (ε:ℝ) / ε := by\n    rw [hyℓ]\n    exact Real.log_le_rpow_div hℓpos.le hε0\n  have hℓεpos : (0:ℝ) < ℓ ^ (ε:ℝ) := Real.rpow_pos_of_pos hℓpos _\n  -- final numeric comparison: error * y ≤ (η/2) ℓ\n  have hkey : ℓ ^ (β:ℝ) * (C₂ * y) * y ≤ (η/2) * ℓ := by\n    have hℓC₂ : (0:ℝ) ≤ ℓ ^ (β:ℝ) * C₂ := mul_nonneg hℓβpos.le (by linarith)\n    have h1 : ℓ ^ (β:ℝ) * (C₂ * y) * y ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * (ℓ ^ (ε:ℝ)/ε) := by\n      have hb1 : ℓ ^ (β:ℝ) * C₂ * y * y ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * y := by\n        apply mul_le_mul_of_nonneg_right _ hypos.le\n        exact mul_le_mul_of_nonneg_left hyε hℓC₂\n      have hb2 : ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * y\n          ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * (ℓ ^ (ε:ℝ)/ε) := by\n        apply mul_le_mul_of_nonneg_left hyε\n        apply mul_nonneg hℓC₂\n        positivity\n      calc ℓ ^ (β:ℝ) * (C₂ * y) * y = ℓ ^ (β:ℝ) * C₂ * y * y := by ring\n      _ ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * y := hb1\n      _ ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * (ℓ ^ (ε:ℝ)/ε) := hb2\n    have h2 : ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * (ℓ ^ (ε:ℝ)/ε)\n        = (C₂/ε^2) * (ℓ ^ (β:ℝ) * ℓ ^ (ε:ℝ) * ℓ ^ (ε:ℝ)) := by\n      field_simp\n      try ring\n    have h3 : ℓ ^ (β:ℝ) * ℓ ^ (ε:ℝ) * ℓ ^ (ε:ℝ) = ℓ ^ (β + ε + ε : ℝ) := by\n      rw [← Real.rpow_add hℓpos, ← Real.rpow_add hℓpos]\n    have h4 : ℓ ^ (β + ε + ε : ℝ) * ℓ ^ ((1 - β)/2 : ℝ) = ℓ := by\n      rw [← Real.rpow_add hℓpos]\n      have harith : β + ε + ε + (1 - β)/2 = 1 := by\n        rw [hεdef]\n        ring\n      rw [harith, Real.rpow_one]\n    have h5 : (C₂/ε^2) * ℓ ^ (β + ε + ε : ℝ) ≤ (η/2) * ℓ := by\n      have hpow : (0:ℝ) < ℓ ^ (β + ε + ε : ℝ) := Real.rpow_pos_of_pos hℓpos _\n      have hC₃eq : (η/2) * C₃ = C₂/ε^2 := by\n        rw [hC₃def]\n        field_simp\n        try ring\n      have h7 : C₂/ε^2 ≤ (η/2) * ℓ ^ ((1 - β)/2 : ℝ) := by\n        rw [← hC₃eq]\n        exact mul_le_mul_of_nonneg_left hC₃n (by linarith)\n      calc (C₂/ε^2) * ℓ ^ (β + ε + ε : ℝ)\n          ≤ ((η/2) * ℓ ^ ((1 - β)/2 : ℝ)) * ℓ ^ (β + ε + ε : ℝ) :=\n            mul_le_mul_of_nonneg_right h7 hpow.le\n      _ = (η/2) * (ℓ ^ (β + ε + ε : ℝ) * ℓ ^ ((1 - β)/2 : ℝ)) := by ring\n      _ = (η/2) * ℓ := by rw [h4]\n    calc ℓ ^ (β:ℝ) * (C₂ * y) * y\n        ≤ ℓ ^ (β:ℝ) * C₂ * (ℓ ^ (ε:ℝ)/ε) * (ℓ ^ (ε:ℝ)/ε) := h1\n    _ = (C₂/ε^2) * (ℓ ^ (β:ℝ) * ℓ ^ (ε:ℝ) * ℓ ^ (ε:ℝ)) := h2\n    _ = (C₂/ε^2) * ℓ ^ (β + ε + ε : ℝ) := by rw [h3]\n    _ ≤ (η/2) * ℓ := h5\n  -- error ≤ (η/2)·(ℓ/y)\n  have herrfinal : (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) ≤ (η/2) * (ℓ/y) := by\n    have h1 : ℓ ^ (β:ℝ) * (C₂ * y) ≤ (η/2) * ℓ / y := by\n      rw [le_div_iff₀ hypos]\n      exact hkey\n    calc (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) ≤ ℓ ^ (β:ℝ) * (C₂ * y) := herr\n    _ ≤ (η/2) * ℓ / y := h1\n    _ = (η/2) * (ℓ/y) := by ring\n  -- main term\n  have hmainterm : δ * ℓ = c₀ * (ℓ/y) := by\n    rw [hδdef]\n    field_simp\n  calc Real.log (#n.divisors)\n      ≤ δ * ℓ + (2:ℝ) ^ (1/δ) * (Real.log 4 - Real.log δ) := hmain\n  _ ≤ c₀ * (ℓ/y) + (η/2) * (ℓ/y) := by\n      rw [← hmainterm]\n      linarith [herrfinal]\n  _ = (c₀ + η/2) * (ℓ/y) := by ring\n  _ = (Real.log 2 + η) * (ℓ/y) := by\n      rw [hc₀def]\n      ring\n\n\n/-! ## From Erdos820/Corollary.lean -/\n\n/-\nCorollary 1.2 of the paper.  Combining the main theorem with Wigert's bound:\n\n* `log log K(n) ≤ (log 2 + ε) · log n / log log n`  eventually, for every `ε > 0`;\n* consequently `H(n) ≤ K(n) < exp (n^{(log 2 + ε)/log log n})` eventually.\n-/\n\n\nopen Filter Finset\n\n/-- First half of Corollary 1.2:\n`log log K(n) ≤ (log 2 + ε) log n / log log n` eventually. -/\ntheorem loglog_K_le {ε : ℝ} (hε : 0 < ε) :\n    ∀ᶠ n : ℕ in atTop,\n      Real.log (Real.log (K n))\n        ≤ (Real.log 2 + ε) * (Real.log n / Real.log (Real.log n)) := by\n  have hlogtends : Filter.Tendsto (fun n : ℕ => Real.log n) Filter.atTop Filter.atTop :=\n    Real.tendsto_log_atTop.comp tendsto_natCast_atTop_atTop\n  have hloglog : Filter.Tendsto (fun n : ℕ => Real.log (Real.log n))\n      Filter.atTop Filter.atTop := Real.tendsto_log_atTop.comp hlogtends\n  have hrpowt : Filter.Tendsto (fun n : ℕ => (Real.log n) ^ ((1:ℝ)/2))\n      Filter.atTop Filter.atTop :=\n    (tendsto_rpow_atTop (by norm_num : (0:ℝ) < 1/2)).comp hlogtends\n  filter_upwards [log_card_divisors_le (half_pos hε),\n    hloglog.eventually_ge_atTop 1,\n    hlogtends.eventually_ge_atTop 1,\n    hrpowt.eventually_ge_atTop (16128 / ε),\n    Filter.eventually_ge_atTop 2] with n hτ hy hℓ hsqrt hn2\n  -- abbreviations\n  obtain ⟨ℓ, hℓdef⟩ : ∃ ℓ : ℝ, ℓ = Real.log n := ⟨_, rfl⟩\n  obtain ⟨y, hydef⟩ : ∃ y : ℝ, y = Real.log (Real.log n) := ⟨_, rfl⟩\n  rw [← hℓdef] at hℓ hsqrt\n  rw [← hydef] at hy\n  rw [← hydef, ← hℓdef] at hτ ⊢\n  have hyℓ : y = Real.log ℓ := by rw [hydef, hℓdef]\n  have hℓpos : (0:ℝ) < ℓ := by linarith\n  have hypos : (0:ℝ) < y := by linarith\n  -- positivity facts about K n\n  have hK3 : 3 ≤ K n := three_le_K hn2\n  have hKR : (3:ℝ) ≤ (K n : ℝ) := by exact_mod_cast hK3\n  have hlogK1 : (1:ℝ) < Real.log (K n) := by\n    have h1 : (1:ℝ) < Real.log 3 := by\n      rw [Real.lt_log_iff_exp_lt (by norm_num : (0:ℝ) < 3)]\n      linarith [Real.exp_one_lt_d9]\n    have h2 : Real.log 3 ≤ Real.log (K n) := Real.log_le_log (by norm_num) hKR\n    linarith\n  have hlogKpos : (0:ℝ) < Real.log (K n) := by linarith\n  -- log(n+2) ≥ 1\n  have hlogn2 : (1:ℝ) ≤ Real.log ((n : ℝ) + 2) := by\n    have hn2R : (2:ℝ) ≤ (n : ℝ) := by exact_mod_cast hn2\n    have h1 : Real.exp 1 ≤ (n : ℝ) + 2 := by\n      linarith [Real.exp_one_lt_d9]\n    have h2 := Real.log_le_log (Real.exp_pos 1) h1\n    rwa [Real.log_exp] at h2\n  have hlogn2pos : (0:ℝ) < Real.log ((n : ℝ) + 2) := by linarith\n  -- τ ≥ 1\n  have hn0 : n ≠ 0 := by omega\n  have hτ1 : 1 ≤ #n.divisors :=\n    Finset.card_pos.mpr ⟨1, Nat.mem_divisors.mpr ⟨one_dvd n, hn0⟩⟩\n  have hτpos : (0:ℝ) < (#n.divisors : ℝ) := by exact_mod_cast hτ1\n  -- take logs in the main theorem\n  have hmain := log_K_le hn2\n  have hloglogK : Real.log (Real.log (K n))\n      ≤ Real.log 500 + Real.log (#n.divisors) + 2 * Real.log (Real.log ((n : ℝ) + 2)) := by\n    have h1 := Real.log_le_log hlogKpos hmain\n    have h2 : Real.log (500 * (#n.divisors : ℝ) * Real.log ((n : ℝ) + 2) ^ 2)\n        = Real.log 500 + Real.log (#n.divisors)\n          + 2 * Real.log (Real.log ((n : ℝ) + 2)) := by\n      rw [Real.log_mul (by positivity : (0:ℝ) < 500 * (#n.divisors : ℝ)).ne'\n          (by positivity : (0:ℝ) < Real.log ((n : ℝ) + 2) ^ 2).ne',\n        Real.log_mul (by norm_num : (500:ℝ) ≠ 0) hτpos.ne',\n        Real.log_pow]\n      push_cast\n      ring\n    rw [← h2]\n    exact h1\n  -- bound log log (n+2) by log 2 + y\n  have hloglogn2 : Real.log (Real.log ((n : ℝ) + 2)) ≤ Real.log 2 + y := by\n    have hn2R : (2:ℝ) ≤ (n : ℝ) := by exact_mod_cast hn2\n    have h1 : (n : ℝ) + 2 ≤ (n : ℝ) ^ 2 := by nlinarith\n    have h2 : Real.log ((n : ℝ) + 2) ≤ 2 * ℓ := by\n      have h3 := Real.log_le_log (by linarith : (0:ℝ) < (n : ℝ) + 2) h1\n      rw [Real.log_pow] at h3\n      rw [hℓdef]\n      push_cast at h3\n      linarith\n    have h4 : Real.log (Real.log ((n : ℝ) + 2)) ≤ Real.log (2 * ℓ) :=\n      Real.log_le_log hlogn2pos h2\n    rw [Real.log_mul (by norm_num : (2:ℝ) ≠ 0) hℓpos.ne', ← hyℓ] at h4\n    exact h4\n  -- numeric error bound: log 500 + 2 log 2 + 2 y ≤ (ε/2) (ℓ/y)\n  have herror : Real.log 500 + 2 * Real.log 2 + 2 * y ≤ (ε/2) * (ℓ/y) := by\n    have h500 : Real.log 500 ≤ 499 := by\n      linarith [Real.log_le_sub_one_of_pos (by norm_num : (0:ℝ) < 500)]\n    have h2' : Real.log 2 ≤ 1 := by\n      linarith [Real.log_le_sub_one_of_pos (by norm_num : (0:ℝ) < 2)]\n    -- y ≤ 4 ℓ^{1/4}\n    have hy4 : y ≤ 4 * ℓ ^ ((1:ℝ)/4) := by\n      have := Real.log_le_rpow_div hℓpos.le (by norm_num : (0:ℝ) < 1/4)\n      rw [← hyℓ] at this\n      linarith\n    have hq : y ^ 2 ≤ 16 * ℓ ^ ((1:ℝ)/2) := by\n      have h5 : y ^ 2 ≤ (4 * ℓ ^ ((1:ℝ)/4)) ^ 2 := by\n        apply pow_le_pow_left₀ hypos.le hy4\n      have h6 : (4 * ℓ ^ ((1:ℝ)/4)) ^ 2 = 16 * (ℓ ^ ((1:ℝ)/4) * ℓ ^ ((1:ℝ)/4)) := by\n        ring\n      have h7 : ℓ ^ ((1:ℝ)/4) * ℓ ^ ((1:ℝ)/4) = ℓ ^ ((1:ℝ)/2) := by\n        rw [← Real.rpow_add hℓpos]\n        norm_num\n      rw [h6, h7] at h5\n      exact h5\n    -- 504 y² ≤ (ε/2) ℓ\n    have hkey : 504 * y ^ 2 ≤ (ε/2) * ℓ := by\n      have h8 : ℓ ^ ((1:ℝ)/2) * ℓ ^ ((1:ℝ)/2) = ℓ := by\n        rw [← Real.rpow_add hℓpos]\n        norm_num\n      have hsq0 : (0:ℝ) < ℓ ^ ((1:ℝ)/2) := Real.rpow_pos_of_pos hℓpos _\n      have h9 : (16128 / ε) * ℓ ^ ((1:ℝ)/2) ≤ ℓ ^ ((1:ℝ)/2) * ℓ ^ ((1:ℝ)/2) :=\n        mul_le_mul_of_nonneg_right hsqrt hsq0.le\n      have h10 : 504 * (16 * ℓ ^ ((1:ℝ)/2)) ≤ (ε/2) * ((16128/ε) * ℓ ^ ((1:ℝ)/2)) := by\n        have : (ε/2) * ((16128/ε) * ℓ ^ ((1:ℝ)/2)) = 8064 * ℓ ^ ((1:ℝ)/2) := by\n          field_simp\n          ring\n        rw [this]\n        nlinarith [hsq0]\n      calc 504 * y ^ 2 ≤ 504 * (16 * ℓ ^ ((1:ℝ)/2)) := by nlinarith\n      _ ≤ (ε/2) * ((16128/ε) * ℓ ^ ((1:ℝ)/2)) := h10\n      _ ≤ (ε/2) * (ℓ ^ ((1:ℝ)/2) * ℓ ^ ((1:ℝ)/2)) := by\n          apply mul_le_mul_of_nonneg_left h9 (by linarith)\n      _ = (ε/2) * ℓ := by rw [h8]\n    have h11 : Real.log 500 + 2 * Real.log 2 + 2 * y ≤ 504 * y := by nlinarith\n    have h12 : 504 * y ≤ (ε/2) * (ℓ/y) := by\n      rw [show (ε/2) * (ℓ/y) = ((ε/2) * ℓ)/y from by ring, le_div_iff₀ hypos]\n      nlinarith [hkey]\n    linarith\n  -- combine\n  calc Real.log (Real.log (K n))\n      ≤ Real.log 500 + Real.log (#n.divisors)\n        + 2 * Real.log (Real.log ((n : ℝ) + 2)) := hloglogK\n  _ ≤ Real.log 500 + (Real.log 2 + ε/2) * (ℓ/y) + 2 * (Real.log 2 + y) := by\n      have h13 : 2 * Real.log (Real.log ((n : ℝ) + 2)) ≤ 2 * (Real.log 2 + y) := by\n        linarith\n      linarith [hτ]\n  _ ≤ (Real.log 2 + ε/2) * (ℓ/y) + (ε/2) * (ℓ/y) := by\n      linarith [herror]\n  _ = (Real.log 2 + ε) * (ℓ/y) := by ring\n\n/-- Second half of Corollary 1.2:\n`K(n) < exp (n^{(log 2 + ε)/log log n})` eventually. -/\ntheorem K_lt_exp {ε : ℝ} (hε : 0 < ε) :\n    ∀ᶠ n : ℕ in atTop,\n      (K n : ℝ) < Real.exp ((n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n))) := by\n  have hlogtends : Filter.Tendsto (fun n : ℕ => Real.log n) Filter.atTop Filter.atTop :=\n    Real.tendsto_log_atTop.comp tendsto_natCast_atTop_atTop\n  have hloglog : Filter.Tendsto (fun n : ℕ => Real.log (Real.log n))\n      Filter.atTop Filter.atTop := Real.tendsto_log_atTop.comp hlogtends\n  filter_upwards [loglog_K_le (half_pos hε),\n    hloglog.eventually_ge_atTop 1,\n    hlogtends.eventually_ge_atTop 1,\n    Filter.eventually_ge_atTop 2] with n h1 hy hℓ hn2\n  have hℓpos : (0:ℝ) < Real.log n := by linarith\n  have hypos : (0:ℝ) < Real.log (Real.log n) := by linarith\n  have hnpos : (0:ℝ) < (n : ℝ) := by\n    have : 0 < n := by omega\n    exact_mod_cast this\n  have hK3 : 3 ≤ K n := three_le_K hn2\n  have hKR : (0:ℝ) < (K n : ℝ) := by\n    have : 0 < K n := by omega\n    exact_mod_cast this\n  have hlogK1 : (1:ℝ) < Real.log (K n) := by\n    have ha : (1:ℝ) < Real.log 3 := by\n      rw [Real.lt_log_iff_exp_lt (by norm_num : (0:ℝ) < 3)]\n      linarith [Real.exp_one_lt_d9]\n    have hb : Real.log 3 ≤ Real.log (K n) :=\n      Real.log_le_log (by norm_num) (by exact_mod_cast hK3)\n    linarith\n  have hlogKpos : (0:ℝ) < Real.log (K n) := by linarith\n  -- strict inequality on the exponent scale\n  have hstrict : Real.log (Real.log (K n))\n      < (Real.log 2 + ε) * (Real.log n / Real.log (Real.log n)) := by\n    have hfrac : (0:ℝ) < Real.log n / Real.log (Real.log n) := by positivity\n    have h2 : (Real.log 2 + ε/2) * (Real.log n / Real.log (Real.log n))\n        < (Real.log 2 + ε) * (Real.log n / Real.log (Real.log n)) := by\n      apply mul_lt_mul_of_pos_right _ hfrac\n      linarith\n    exact lt_of_le_of_lt h1 h2\n  -- identify the rpow\n  have hrpow : (n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n))\n      = Real.exp ((Real.log 2 + ε) * (Real.log n / Real.log (Real.log n))) := by\n    rw [Real.rpow_def_of_pos hnpos]\n    congr 1\n    ring\n  -- conclude\n  have hlogKlt : Real.log (K n)\n      < (n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n)) := by\n    have h3 : Real.log (K n) = Real.exp (Real.log (Real.log (K n))) :=\n      (Real.exp_log hlogKpos).symm\n    rw [h3, hrpow]\n    exact Real.exp_lt_exp.mpr hstrict\n  calc (K n : ℝ) = Real.exp (Real.log (K n)) := (Real.exp_log hKR).symm\n  _ < Real.exp ((n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n))) :=\n      Real.exp_lt_exp.mpr hlogKlt\n\n/-- Full Corollary 1.2: eventually `H n ≤ K n` and\n`K n < exp (n^{(log 2 + ε)/log log n})`. -/\ntheorem H_le_K_and_K_lt_exp {ε : ℝ} (hε : 0 < ε) :\n    ∀ᶠ n : ℕ in atTop, H n ≤ K n ∧\n      (K n : ℝ) < Real.exp ((n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n))) := by\n  filter_upwards [K_lt_exp hε, Filter.eventually_ge_atTop 2] with n h1 hn2\n  exact ⟨H_le_K hn2, h1⟩\n\n/-- Consequently `H n < exp (n^{(log 2 + ε)/log log n})` eventually. -/\ntheorem H_lt_exp {ε : ℝ} (hε : 0 < ε) :\n    ∀ᶠ n : ℕ in atTop,\n      (H n : ℝ) < Real.exp ((n : ℝ) ^ ((Real.log 2 + ε) / Real.log (Real.log n))) := by\n  filter_upwards [H_le_K_and_K_lt_exp hε] with n ⟨h1, h2⟩\n  have : (H n : ℝ) ≤ (K n : ℝ) := by exact_mod_cast h1\n  linarith\n\n/-- The `H`-side of the first display of Corollary 1.2:\n`log log H(n) ≤ (log 2 + ε) log n / log log n` eventually. -/\ntheorem loglog_H_le {ε : ℝ} (hε : 0 < ε) :\n    ∀ᶠ n : ℕ in atTop,\n      Real.log (Real.log (H n))\n        ≤ (Real.log 2 + ε) * (Real.log n / Real.log (Real.log n)) := by\n  filter_upwards [loglog_K_le hε, Filter.eventually_ge_atTop 2] with n h1 hn2\n  have hH3 : 3 ≤ H n := three_le_H hn2\n  have hHK : H n ≤ K n := H_le_K hn2\n  have hHpos : (0:ℝ) < (H n : ℝ) := by\n    have : 0 < H n := by omega\n    exact_mod_cast this\n  have h2 : Real.log (H n) ≤ Real.log (K n) :=\n    Real.log_le_log hHpos (by exact_mod_cast hHK)\n  have h3 : (0:ℝ) < Real.log (H n) := by\n    apply Real.log_pos\n    have : (3:ℝ) ≤ (H n : ℝ) := by exact_mod_cast hH3\n    linarith\n  have h4 : Real.log (Real.log (H n)) ≤ Real.log (Real.log (K n)) :=\n    Real.log_le_log h3 h2\n  linarith\n\n\nend Erdos820",
  "verification_scope": "Exact decoding and recompression only. No local Lean build or complete code review; numerical constant500 not certified."
}