import pathlib,json,subprocess,re,concurrent.futures
R=pathlib.Path('/tmp/lead-27909-r1/capture');mapping=json.loads((R/'upload-map.json').read_text())
errors=json.loads((R/'upload-errors.json').read_text())
files=[pathlib.Path(f) for error in errors for f in error['files'] if pathlib.Path(f).name not in mapping]
files.append(pathlib.Path(__file__))
def upload(f):
    result=subprocess.run(['ghdrop','upload','-m',str(f)],text=True,capture_output=True)
    return f,result
failed=[]
with concurrent.futures.ThreadPoolExecutor(max_workers=3) as pool:
    for task in concurrent.futures.as_completed([pool.submit(upload,f) for f in files]):
        f,result=task.result()
        if result.returncode:
            failed.append({'files':[str(f)],'stderr':result.stderr,'stdout':result.stdout})
            print('FAILED',f.name,result.stderr,flush=True)
        else:
            line=result.stdout.strip();match=re.fullmatch(r'!?\[([^\]]+)\]\((https://[^)]+)\)',line)
            assert match and match[1]==f.name,(f,result.stdout)
            mapping[f.name]={'path':str(f),'url':match[2],'markdown':line}
            with (R/'uploads.md').open('a') as out:out.write(result.stdout)
            print(result.stdout,end='',flush=True)
        (R/'upload-map.json').write_text(json.dumps(mapping,indent=2))
        (R/'resume-errors.json').write_text(json.dumps(failed,indent=2))
assert not failed,failed
