#!/bin/bash
set -euo pipefail
ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
cd "$ROOT"
export PATH="$HOME/.local/bin:$PATH"
mkdir -p scripts
echo 'IyEvdXNyL2Jpbi9lbnYgcHl0aG9uMwoiIiIK2YPYqtin2KjYqS/Yp9iz2KrYqNiv2KfZhCDZhti1INmB2YogUERGINmF2Lkg2KfZhNit2YHYp9i4INi52YTZiSDYo9mC2LXZiSDZgtiv2LEg2YXZhdmD2YYg2YXZhiDYp9mE2KrZhtiz2YrZggrYqNin2LPYqtiu2K/Yp9mFIFB5TXVQREYgKGZpdHopLiDZhdmP2LnYr9mR2Ywg2YTZgCBQREZOaW8g2KPZiCDZhNij2Yog2LPZitix2YHYsSBQeXRob24uCgrZhdiz2KfYsSDCq9mC2LHZitioINmF2YYgU2VqZGHCuyAo2LnZhtivINiq2YjZgdixINiu2Lcg2YXYttmF2ZHZhik6CiAgRG9jdW1lbnQuZ2V0X3BhZ2VfZm9udHMg4oaSINmF2LfYp9io2YLYqSDYp9iz2YUg2KfZhNmAIHNwYW4g2YXYuSBiYXNlZm9udCDihpIgZXh0cmFjdF9mb250CiAg4oaSIGZpdHouRm9udChmb250YnVmZmVyPeKApikg4oaSIFRleHRXcml0ZXIuYXBwZW5kIC8gd3JpdGVfdGV4dCDYqNmG2YHYsyDYqNix2YbYp9mF2Kwg2KfZhNiu2LcuCgrYp9mE2K3Yr9mI2K8gKNmF2YfZhSk6Ci0g2K7Yt9mI2Lcgc3Vic2V0OiDZgtivINmE2Kcg2KrYqti22YXZhiDZg9mEINin2YTYrdix2YjZgSDZhNmE2YbYtSDYp9mE2KzYr9mK2K8gKNmG2YHYsyDYrdiv2YjYryDYp9mE2YXYrdix2LHZitmGINin2YTYp9it2KrYsdin2YHZitmK2YYpLgotIEJhc2UgMTQg2KjYr9mI2YYg2KrYttmF2YrZhjog2YbYsdis2Lkg2YTZhNiu2LfZiNi3INin2YTZhdiv2YXYrNipIChIZWx2ZXRpY2EgLyDigKYpLgotIHBkZi1saWIg2YHZiiDYp9mE2YXYqti12YHYrTog2LHYp9is2LkgdG9vbC1wZGYtZWRpdG9yIChmb250c291cmNlICsgZm9udGtpdCkg2YPYqNiv2YrZhCDZiNin2KzZh9ipLgoK2YXYqti32YTYqNin2Ko6IHBpcCBpbnN0YWxsIHB5bXVwZGYKIiIiCgpmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFubm90YXRpb25zCgppbXBvcnQgcmUKaW1wb3J0IHN5cwpmcm9tIGRhdGFjbGFzc2VzIGltcG9ydCBkYXRhY2xhc3MKZnJvbSB0eXBpbmcgaW1wb3J0IEFueSwgSXRlcmFibGUsIEl0ZXJhdG9yLCBMaXN0LCBPcHRpb25hbCwgVHVwbGUKCmltcG9ydCBmaXR6ICAjIFB5TXVQREYKCiMg2KfYs9iq2K7Ysdin2KwgZGljdCDZhdi5INmD2LTZgSDYqtmG2LPZitmC2KfYqiDYo9iv2YIgKNio2YXYpyDZgdmK2YfYpyAiZmFrZSBib2xkIiDYudmG2K8g2KfZhNiq2YjZgdixKQpfRVhUUkFDVF9ESUNUX0ZMQUdTID0gaW50KGdldGF0dHIoZml0eiwgIlRFWFRGTEFHU19ESUNUIiwgMTk5KSkgfCBpbnQoCiAgICBnZXRhdHRyKGZpdHosICJURVhUX0NPTExFQ1RfU1RZTEVTIiwgMSA8PCAxNSkKKQoKCkBkYXRhY2xhc3MKY2xhc3MgVGV4dFNwYW5Qcm9wZXJ0aWVzOgogICAgIiIi2K7Ytdin2KbYtSBzcGFuINmI2KfYrdivINmI2YXZiNmC2LnZhyAo2YbZgtin2Lcg2KfZhNmF2LPYqtiu2K/ZhSBQREYpLiIiIgoKICAgIHRleHQ6IHN0cgogICAgZm9udDogc3RyCiAgICBzaXplOiBmbG9hdAogICAgIyDZhNmI2YYgc1JHQjog2LnYr9ivINi12K3ZititIDB4UlJHR0JCIChQeU11UERGIGRpY3QpINij2YggMAogICAgY29sb3I6IGludAogICAgIyDYo9i52YTYp9mFIFB5TXVQREYg2YTZhNmAIHNwYW46INi52LHZiti2L9mF2KfYptmEL9iu4oCmCiAgICBmbGFnczogaW50CiAgICBiYm94OiBmaXR6LlJlY3QKICAgICMg2YXZiNi22Lkg2KfZhNil2K/Ysdin2Kw6INiy2KfZiNmK2Kkg2YrYs9in2LEt2KPYs9mB2YQg2YTZhNmG2LUg2LnYp9iv2KnZiyBvcmlnaW4g2YXZhiDYp9mE2LPYt9ixCiAgICBvcmlnaW46IFR1cGxlW2Zsb2F0LCBmbG9hdF0KICAgICMg2YXYudix2YEgKNin2K7YqtmK2KfYsdmKKSDZhNix2KjYtyDYp9mE2YAgbGluZQogICAgbGluZV9kaXI6IE9wdGlvbmFsW1R1cGxlW2Zsb2F0LCBmbG9hdF1dID0gTm9uZQogICAgIyDZhdix2KjYuSDYp9mE2LPYt9ixINmD2KfZhdmE2KfZiyAo2YTYqti22YrZitmCINin2YTZgCByZWRhY3Qg2LnZhdmI2K/Zitin2Ysg4oCUINmK2YHYp9ivINiq2K/Yp9iu2YQg2YXYuSDYp9mE2LPYt9ixINmB2YjZgi/Yqtit2KopCiAgICBsaW5lX2Jib3g6IE9wdGlvbmFsW2ZpdHouUmVjdF0gPSBOb25lCgoKZGVmIF9zcGFuX2NvbG9yX3RvX3JnYjAxKGNvbG9yOiBpbnQpIC0+IFR1cGxlW2Zsb2F0LCBmbG9hdCwgZmxvYXRdOgogICAgaWYgY29sb3IgaXMgTm9uZSBvciBjb2xvciA8IDA6CiAgICAgICAgcmV0dXJuICgwLjAsIDAuMCwgMC4wKQogICAgciA9ICgoY29sb3IgPj4gMTYpICYgMHhGRikgLyAyNTUuMAogICAgZyA9ICgoY29sb3IgPj4gOCkgJiAweEZGKSAvIDI1NS4wCiAgICBiID0gKGNvbG9yICYgMHhGRikgLyAyNTUuMAogICAgcmV0dXJuIChyLCBnLCBiKQoKCmRlZiBfaXRlcl90ZXh0X3NwYW5zKHBhZ2U6IGZpdHouUGFnZSkgLT4gSXRlcmF0b3JbVGV4dFNwYW5Qcm9wZXJ0aWVzXToKICAgICIiItmK2YXYsdmRINi52YTZiSDZg9mEINin2YTZgCB0ZXh0IHNwYW5zINmB2Yog2LXZgdit2KkuIiIiCiAgICB0ZCA9IHBhZ2UuZ2V0X3RleHQoImRpY3QiLCBmbGFncz1fRVhUUkFDVF9ESUNUX0ZMQUdTKQogICAgZm9yIGJsb2NrIGluIHRkLmdldCgiYmxvY2tzIiwgW10pOgogICAgICAgIGlmIGJsb2NrLmdldCgidHlwZSIpICE9IDA6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgZm9yIGxpbmUgaW4gYmxvY2suZ2V0KCJsaW5lcyIsIFtdKToKICAgICAgICAgICAgbGRpciA9IGxpbmUuZ2V0KCJkaXIiKQogICAgICAgICAgICBkaXJfdHVwbGU6IE9wdGlvbmFsW1R1cGxlW2Zsb2F0LCBmbG9hdF1dID0gTm9uZQogICAgICAgICAgICBpZiBpc2luc3RhbmNlKGxkaXIsIChsaXN0LCB0dXBsZSkpIGFuZCBsZW4obGRpcikgPj0gMjoKICAgICAgICAgICAgICAgIGRpcl90dXBsZSA9IChmbG9hdChsZGlyWzBdKSwgZmxvYXQobGRpclsxXSkpCiAgICAgICAgICAgIGxiYiA9IGxpbmUuZ2V0KCJiYm94IikKICAgICAgICAgICAgbGluZV9yZWN0OiBPcHRpb25hbFtmaXR6LlJlY3RdID0gTm9uZQogICAgICAgICAgICBpZiBsYmIgYW5kIGxlbihsYmIpID49IDQ6CiAgICAgICAgICAgICAgICBsaW5lX3JlY3QgPSBmaXR6LlJlY3QoCiAgICAgICAgICAgICAgICAgICAgZmxvYXQobGJiWzBdKSwgZmxvYXQobGJiWzFdKSwgZmxvYXQobGJiWzJdKSwgZmxvYXQobGJiWzNdKQogICAgICAgICAgICAgICAgKQogICAgICAgICAgICBmb3Igc3AgaW4gbGluZS5nZXQoInNwYW5zIiwgW10pOgogICAgICAgICAgICAgICAgdHh0ID0gc3AuZ2V0KCJ0ZXh0IiwgIiIpCiAgICAgICAgICAgICAgICBpZiBub3QgdHh0OgogICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgICAgICAgICBvcmlnaW4gPSBzcC5nZXQoIm9yaWdpbiIpCiAgICAgICAgICAgICAgICBpZiBub3Qgb3JpZ2luIG9yIGxlbihvcmlnaW4pIDwgMjoKICAgICAgICAgICAgICAgICAgICBiYm94ID0gZml0ei5SZWN0KHNwLmdldCgiYmJveCIsICgwLCAwLCAwLCAwKSkpCiAgICAgICAgICAgICAgICAgICAgb3JpZ2luID0gKGJib3gueDAsIGJib3gueTApCiAgICAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgICAgIG9yaWdpbiA9IChmbG9hdChvcmlnaW5bMF0pLCBmbG9hdChvcmlnaW5bMV0pKQogICAgICAgICAgICAgICAgYmJveCA9IGZpdHouUmVjdChzcC5nZXQoImJib3giLCAoMCwgMCwgMCwgMCkpKQogICAgICAgICAgICAgICAgeWllbGQgVGV4dFNwYW5Qcm9wZXJ0aWVzKAogICAgICAgICAgICAgICAgICAgIHRleHQ9dHh0LAogICAgICAgICAgICAgICAgICAgIGZvbnQ9c3RyKHNwLmdldCgiZm9udCIsICJoZWx2IikpLAogICAgICAgICAgICAgICAgICAgIHNpemU9ZmxvYXQoc3AuZ2V0KCJzaXplIiwgMTIpKSwKICAgICAgICAgICAgICAgICAgICBjb2xvcj1pbnQoc3AuZ2V0KCJjb2xvciIsIDApIG9yIDApLAogICAgICAgICAgICAgICAgICAgIGZsYWdzPWludChzcC5nZXQoImZsYWdzIiwgMCkgb3IgMCksCiAgICAgICAgICAgICAgICAgICAgYmJveD1iYm94LAogICAgICAgICAgICAgICAgICAgIG9yaWdpbj1vcmlnaW4sCiAgICAgICAgICAgICAgICAgICAgbGluZV9kaXI9ZGlyX3R1cGxlLAogICAgICAgICAgICAgICAgICAgIGxpbmVfYmJveD1saW5lX3JlY3QsCiAgICAgICAgICAgICAgICApCgoKZGVmIGdldF90ZXh0X3Byb3BlcnRpZXMocGFnZTogZml0ei5QYWdlKSAtPiBMaXN0W1RleHRTcGFuUHJvcGVydGllc106CiAgICAiIiIKICAgINin2LPYqtiu2LHYp9isINmD2YQg2K7Ytdin2KbYtSDYp9mE2YbYtSAo2K7Yt9iMINit2KzZhdiMINmE2YjZhtiMINij2LnZhNin2YXYjCDZhdix2KjYudiMINmF2YjYtti5KQogICAg4oCUINmK2LnYp9iv2YQg2YjYuNmK2YHYqSBnZXRfdGV4dF9wcm9wZXJ0aWVzKCkg2KfZhNmF2LfZhNmI2KjYqSDZhNmF2LHYrdmE2Kkg2KfZhNiq2K3ZhNmK2YQuCiAgICAiIiIKICAgIHJldHVybiBsaXN0KF9pdGVyX3RleHRfc3BhbnMocGFnZSkpCgoKZGVmIGdldF90ZXh0X3Byb3BlcnRpZXNfZm9yX3N1YnN0cmluZygKICAgIHBhZ2U6IGZpdHouUGFnZSwgc3Vic3RyaW5nOiBzdHIsIG1heF9oaXRzOiBpbnQgPSAxCikgLT4gTGlzdFtUZXh0U3BhblByb3BlcnRpZXNdOgogICAgIiIiCiAgICDZiti52YrYryDYp9mE2YAgc3BhbihzKSDYp9mE2KrZiiDYqtiq2LbZhdmGIHN1YnN0cmluZyAo2KPZiNmR2YQgbtmP2KrZjti32KfYqNmP2YLYp9iqKS4KICAgICIiIgogICAgaWYgbm90IHN1YnN0cmluZzoKICAgICAgICByZXR1cm4gW10KICAgIGhpdHM6IExpc3RbVGV4dFNwYW5Qcm9wZXJ0aWVzXSA9IFtdCiAgICBmb3Igc3AgaW4gX2l0ZXJfdGV4dF9zcGFucyhwYWdlKToKICAgICAgICBpZiBzdWJzdHJpbmcgaW4gc3AudGV4dCBhbmQgbGVuKGhpdHMpIDwgbWF4X2hpdHM6CiAgICAgICAgICAgIGhpdHMuYXBwZW5kKHNwKQogICAgcmV0dXJuIGhpdHMKCgpkZWYgX2ZsYWdzX2l0YWxpYyhmbGFnczogaW50KSAtPiBib29sOgogICAgcmV0dXJuIGJvb2woZmxhZ3MgJiAyKioxKSAgIyBiaXQgMSDZgdmKIFB5TXVQREYg2LnYp9iv2KnZiyDZhdin2KbZhCAo2K3Ys9ioINin2YTZhdit2LHZgykKCgpkZWYgX2ZsYWdzX2JvbGQoZmxhZ3M6IGludCkgLT4gYm9vbDoKICAgIHJldHVybiBib29sKGZsYWdzICYgMioqNCkgICMgYml0IDQg2LnYsdmK2LYgKFRFWFRfRk9OVF9CT0xEKQoKCmRlZiBfYm9sZF9pdGFsaWNfZnJvbV9mb250bmFtZShyYXc6IHN0cikgLT4gdHVwbGVbYm9vbCwgYm9vbF06CiAgICAiIiIKICAgINij2LPZhdin2KEg2YXYq9mEIFhYWFhYK0FyaWFsLUJvbGRNVCDYo9mIIENhbGlicmktQm9sZCDYo9i62YTYqCBQREYg2KfZhNiq2Yog2YTYpyDYqti22KjYtyBmbGFncy4KICAgICIiIgogICAgZmwgPSAocmF3IG9yICIiKS5sb3dlcigpCiAgICBpc19iID0gYm9vbCgKICAgICAgICByZS5zZWFyY2goCiAgICAgICAgICAgIHIiYm9sZHxibGFja3xoZWF2eXxzZW1pYm9sZHxkZW1pfGJvbGRtdHxjbWJ4fFstX11iZFxiIiwKICAgICAgICAgICAgZmwsCiAgICAgICAgKQogICAgKQogICAgaXNfaSA9IGJvb2wocmUuc2VhcmNoKHIiaXRhbGljfG9ibGlxdWV8c2xhbnRlZHxbLV9daXRcYiIsIGZsKSkKICAgIHJldHVybiBpc19iLCBpc19pCgoKZGVmIF9zdHJpcF9zdWJzZXRfcHJlZml4KG5hbWU6IHN0cikgLT4gc3RyOgogICAgcmV0dXJuIHJlLnN1YihyIl5bQS1aMC05XXs0LDZ9XCsiLCAiIiwgbmFtZSBvciAiIiwgY291bnQ9MSkKCgpkZWYgX2ZpbmRfZW1iZWRkZWRfZm9udF94cmVmKGRvYzogZml0ei5Eb2N1bWVudCwgcGFnZV9pbmRleDogaW50LCBzcGFuX2ZvbnQ6IHN0cikgLT4gaW50OgogICAgIiIieHJlZiDZhNmD2KfYptmGINin2YTYrti3INil2YYg2YjZj9is2K/YqiDZhdi32KfYqNmC2Kkg2YTZgCBiYXNlZm9udCDZgdmKINi12YHYrdipLiIiIgogICAgaWYgbm90IHNwYW5fZm9udCBvciBwYWdlX2luZGV4IDwgMDoKICAgICAgICByZXR1cm4gMAogICAgdHJ5OgogICAgICAgIGZvbnRzID0gZG9jLmdldF9wYWdlX2ZvbnRzKHBhZ2VfaW5kZXgsIGZ1bGw9RmFsc2UpCiAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgIHJldHVybiAwCiAgICBzX25vcm0gPSBfc3RyaXBfc3Vic2V0X3ByZWZpeChzcGFuX2ZvbnQpLnN0cmlwKCkubG93ZXIoKQogICAgc19zaG9ydCA9IHNfbm9ybVs6MjhdIGlmIGxlbihzX25vcm0pID4gMjggZWxzZSBzX25vcm0KICAgIGZvciBlbnRyeSBpbiBmb250czoKICAgICAgICBpZiBub3QgZW50cnkgb3IgbGVuKGVudHJ5KSA8IDQ6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgdHJ5OgogICAgICAgICAgICB4cmVmID0gaW50KGVudHJ5WzBdKQogICAgICAgIGV4Y2VwdCAoVHlwZUVycm9yLCBWYWx1ZUVycm9yKToKICAgICAgICAgICAgY29udGludWUKICAgICAgICBpZiB4cmVmIDw9IDA6CiAgICAgICAgICAgIGNvbnRpbnVlCiAgICAgICAgYmFzZWZvbnQgPSBzdHIoZW50cnlbM10gb3IgIiIpCiAgICAgICAgYl9ub3JtID0gX3N0cmlwX3N1YnNldF9wcmVmaXgoYmFzZWZvbnQpLnN0cmlwKCkubG93ZXIoKQogICAgICAgIGJfc2hvcnQgPSBiX25vcm1bOjI4XSBpZiBsZW4oYl9ub3JtKSA+IDI4IGVsc2UgYl9ub3JtCiAgICAgICAgaWYgc19ub3JtIGFuZCBzX25vcm0gPT0gYl9ub3JtOgogICAgICAgICAgICByZXR1cm4geHJlZgogICAgICAgIGlmIHNfbm9ybSBhbmQgKHNfbm9ybSBpbiBiX25vcm0gb3IgYl9ub3JtIGluIHNfbm9ybSk6CiAgICAgICAgICAgIHJldHVybiB4cmVmCiAgICAgICAgaWYgc19zaG9ydCBhbmQgc19zaG9ydCA9PSBiX3Nob3J0OgogICAgICAgICAgICByZXR1cm4geHJlZgogICAgcmV0dXJuIDAKCgpkZWYgX2xvYWRfZW1iZWRkZWRfZml0el9mb250KGRvYzogZml0ei5Eb2N1bWVudCwgeHJlZjogaW50KSAtPiBPcHRpb25hbFtmaXR6LkZvbnRdOgogICAgIiIi2YrYrdmF2ZHZhCDYp9mE2KjYsdmG2KfZhdisINin2YTZhdi22YXZkdmGINmE2YTYrti3INil2YYg2YjZj9is2K8gKHR0Zi9vdGYv4oCmKS4iIiIKICAgIGlmIHhyZWYgPD0gMDoKICAgICAgICByZXR1cm4gTm9uZQogICAgdHJ5OgogICAgICAgIHR1cCA9IGRvYy5leHRyYWN0X2ZvbnQoeHJlZikKICAgIGV4Y2VwdCBFeGNlcHRpb246CiAgICAgICAgcmV0dXJuIE5vbmUKICAgIGlmIG5vdCB0dXAgb3IgbGVuKHR1cCkgPCA0OgogICAgICAgIHJldHVybiBOb25lCiAgICBfbmFtZSwgX2V4dCwgX2Z0eXBlLCBjb250ZW50ID0gdHVwWzBdLCB0dXBbMV0sIHR1cFsyXSwgdHVwWzNdCiAgICBpZiBub3QgY29udGVudDoKICAgICAgICByZXR1cm4gTm9uZQogICAgdHJ5OgogICAgICAgIHJldHVybiBmaXR6LkZvbnQoZm9udGJ1ZmZlcj1jb250ZW50KQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICByZXR1cm4gTm9uZQoKCmRlZiBfd3JpdGVfdGV4dF9wcmVzZXJ2ZSgKICAgIHBhZ2U6IGZpdHouUGFnZSwKICAgIHBvczogVHVwbGVbZmxvYXQsIGZsb2F0XSwKICAgIHRleHQ6IHN0ciwKICAgIGZvbnRzaXplOiBmbG9hdCwKICAgIHJnYjogVHVwbGVbZmxvYXQsIGZsb2F0LCBmbG9hdF0sCiAgICBlbWJlZGRlZDogT3B0aW9uYWxbZml0ei5Gb250XSwKICAgIGZvbnRuYW1lOiBzdHIsCiAgICBpc19ib2xkX2VmZmVjdGl2ZTogYm9vbCwKKSAtPiBOb25lOgogICAgIiIi2YrZj9mB2LbZkdmEINin2YTYrti3INin2YTZhdiz2KrYrtix2Kwg2YXZhiDYp9mE2YXYs9iq2YbYr9ibINmI2KXZhNinIGluc2VydF90ZXh0INio2K7YtyDZhdiv2YXYrC4iIiIKICAgIGlmIHRleHQgYW5kIGVtYmVkZGVkIGlzIG5vdCBOb25lOgogICAgICAgIHRyeToKICAgICAgICAgICAgdHcgPSBmaXR6LlRleHRXcml0ZXIocGFnZS5yZWN0KQogICAgICAgICAgICB0dy5hcHBlbmQocG9zLCB0ZXh0LCBmb250PWVtYmVkZGVkLCBmb250c2l6ZT1mb250c2l6ZSkKICAgICAgICAgICAgdHcud3JpdGVfdGV4dChwYWdlLCBjb2xvcj1yZ2IsIHJlbmRlcl9tb2RlPTAsIG92ZXJsYXk9VHJ1ZSkKICAgICAgICAgICAgcmV0dXJuCiAgICAgICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICAgICAgcGFzcwogICAgZmFsbGJhY2sgPSAiaGVibyIgaWYgaXNfYm9sZF9lZmZlY3RpdmUgZWxzZSAiaGVsdiIKICAgIHRyeToKICAgICAgICBwYWdlLmluc2VydF90ZXh0KAogICAgICAgICAgICBwb3MsIHRleHQsIGZvbnRzaXplPWZvbnRzaXplLCBmb250bmFtZT1mb250bmFtZSwgY29sb3I9cmdiLCByZW5kZXJfbW9kZT0wCiAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICB0cnk6CiAgICAgICAgICAgIHBhZ2UuaW5zZXJ0X3RleHQoCiAgICAgICAgICAgICAgICBwb3MsIHRleHQsIGZvbnRzaXplPWZvbnRzaXplLCBmb250bmFtZT1mYWxsYmFjaywgY29sb3I9cmdiLCByZW5kZXJfbW9kZT0wCiAgICAgICAgICAgICkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICBwYWdlLmluc2VydF90ZXh0KAogICAgICAgICAgICAgICAgcG9zLCB0ZXh0LCBmb250c2l6ZT1mb250c2l6ZSwgZm9udG5hbWU9ImhlbHYiLCBjb2xvcj1yZ2IsIHJlbmRlcl9tb2RlPTAKICAgICAgICAgICAgKQoKCmRlZiBfbWFwX2ZvbnRfdG9fYnVpbHRfaW4ocHJvcHM6IFRleHRTcGFuUHJvcGVydGllcykgLT4gc3RyOgogICAgIiIiCiAgICDZitix2KjYtyDYp9iz2YUg2KfZhNiu2Lcg2KfZhNi42KfZh9ixINmB2YogUERGICjZgtivINmK2YPZiNmGIHN1YnNldCkg2KjYp9iz2YUg2YXYr9mF2Kwg2YTZgCBpbnNlcnRfdGV4dC4KICAgICIiIgogICAgZiA9IF9zdHJpcF9zdWJzZXRfcHJlZml4KHByb3BzLmZvbnQpICAjINil2LLYp9mE2Kkg2KjYp9iv2KbYqSBzdWJzZXQKICAgIGZsID0gZi5sb3dlcigpCiAgICBuYW1lX2IsIG5hbWVfaSA9IF9ib2xkX2l0YWxpY19mcm9tX2ZvbnRuYW1lKHByb3BzLmZvbnQpCiAgICBpc19ib2xkID0gX2ZsYWdzX2JvbGQocHJvcHMuZmxhZ3MpIG9yIG5hbWVfYiBvciAiYm9sZCIgaW4gZmwgb3IgImJsYWNrIiBpbiBmbAogICAgaXNfaXRhbCA9IF9mbGFnc19pdGFsaWMocHJvcHMuZmxhZ3MpIG9yIG5hbWVfaSBvciAiaXRhbGljIiBpbiBmbCBvciAib2JsaXF1ZSIgaW4gZmwKICAgIGlzX21vbm8gPSAiY291cmllciIgaW4gZmwgb3IgIm1vbm8iIGluIGZsIG9yICJjb25zb2xhcyIgaW4gZmwKICAgIGlzX3NlcmlmID0gYW55KAogICAgICAgIHggaW4gZmwKICAgICAgICBmb3IgeCBpbiAoInRpbWVzIiwgInJvbWFuIiwgInNlcmlmIiwgImdhcmFtb25kIiwgIm1pbmlvbiIsICJnZW9yZ2lhIikKICAgICkKCiAgICBpZiBpc19tb25vOgogICAgICAgIGlmIGlzX2JvbGQgYW5kIGlzX2l0YWw6CiAgICAgICAgICAgIHJldHVybiAiY29iaSIKICAgICAgICBpZiBpc19ib2xkOgogICAgICAgICAgICByZXR1cm4gImNvYm8iCiAgICAgICAgaWYgaXNfaXRhbDoKICAgICAgICAgICAgcmV0dXJuICJjb2l0IgogICAgICAgIHJldHVybiAiY291ciIKICAgIGlmIGlzX3NlcmlmOgogICAgICAgIGlmIGlzX2JvbGQgYW5kIGlzX2l0YWw6CiAgICAgICAgICAgIHJldHVybiAidGliaSIKICAgICAgICBpZiBpc19ib2xkOgogICAgICAgICAgICByZXR1cm4gInRpYm8iCiAgICAgICAgaWYgaXNfaXRhbDoKICAgICAgICAgICAgcmV0dXJuICJ0aWl0IgogICAgICAgIHJldHVybiAidGlybyIKICAgICMgc2FucyBwYXIgZMOpZmF1dAogICAgaWYgaXNfYm9sZCBhbmQgaXNfaXRhbDoKICAgICAgICByZXR1cm4gImhlYmkiCiAgICBpZiBpc19ib2xkOgogICAgICAgIHJldHVybiAiaGVibyIKICAgIGlmIGlzX2l0YWw6CiAgICAgICAgcmV0dXJuICJoZWl0IgogICAgcmV0dXJuICJoZWx2IgoKCmRlZiBfcmVkYWN0X3JlY3RfZm9yX3NwYW4oCiAgICByOiBmaXR6LlJlY3QsCiAgICAqLAogICAgaHBhZDogZmxvYXQgPSAwLjUsCiAgICB2cGFkOiBmbG9hdCA9IDAuMSwKICAgIGxpbmVfcmVjdDogT3B0aW9uYWxbZml0ei5SZWN0XSA9IE5vbmUsCikgLT4gZml0ei5SZWN0OgogICAgIiIiCiAgICDZhdix2KjYuSDYpdiu2YHYp9ihOiDYqtmI2LPZiti5INij2YHZgtmK2Iwg2LbZitmCINi52YXZiNiv2YrYp9mL2Jsg2YjYpdmGINmI2Y/YrNivIGxpbmVfcmVjdCDZhtmP2KjZgtmKINin2YTYudmF2YIg2K/Yp9iu2YQg2YbZgdizINin2YTYs9i32LEKICAgICjZitmP2YLZhNmR2YQg2KfZhNio2YrYtiDYp9mE2YTZiiDCq9mK2KfZg9mEwrsg2KfZhNiz2LfYsSDZgdmI2YIv2KrYrdiqKS4KICAgICIiIgogICAgcnIgPSBmaXR6LlJlY3QoCiAgICAgICAgci54MCAtIGhwYWQsIHIueTAgLSB2cGFkLCByLngxICsgaHBhZCwgci55MSArIHZwYWQKICAgICkKICAgIGlmIGxpbmVfcmVjdCBpcyBub3QgTm9uZSBhbmQgbGluZV9yZWN0LmlzX3ZhbGlkOgogICAgICAgIHkwID0gbWF4KHJyLnkwLCBsaW5lX3JlY3QueTApCiAgICAgICAgeTEgPSBtaW4ocnIueTEsIGxpbmVfcmVjdC55MSkKICAgICAgICBpZiB5MCA8IHkxIC0gMC4wMToKICAgICAgICAgICAgcnIgPSBmaXR6LlJlY3QocnIueDAsIHkwLCByci54MSwgeTEpCiAgICByZXR1cm4gcnIKCgpkZWYgX3JlZGFjdF9yZWdpb24oCiAgICBwYWdlOiBmaXR6LlBhZ2UsIHI6IGZpdHouUmVjdCwgbGluZV9yZWN0OiBPcHRpb25hbFtmaXR6LlJlY3RdID0gTm9uZQopIC0+IE5vbmU6CiAgICByciA9IF9yZWRhY3RfcmVjdF9mb3Jfc3BhbihyLCBsaW5lX3JlY3Q9bGluZV9yZWN0KQogICAgcGFnZS5hZGRfcmVkYWN0X2Fubm90KHJyLCBmaWxsPSgxLCAxLCAxKSkKCgpkZWYgcmVwbGFjZV90ZXh0X3ByZXNlcnZlX2Zvcm1hdCgKICAgIGlucHV0X3BkZjogc3RyLAogICAgb3V0cHV0X3BkZjogc3RyLAogICAgb2xkX3RleHQ6IHN0ciwKICAgIG5ld190ZXh0OiBzdHIsCiAgICBwYWdlX2luZGV4OiBpbnQgPSAwLAopIC0+IGJvb2w6CiAgICAiIiIKICAgINin2LPYqtio2K/Yp9mEINij2YjZhCDYqti32KfYqNmCINmE2YAgb2xkX3RleHQg2K/Yp9iu2YQg2YbYtSBzcGFuINmI2KfYrdivICjYo9mIINio2K/Yp9mK2KkgcnVuKS4KICAgIC0g2YrYqNmK2ZHZhiDYp9mE2YXZhti32YLYqSAocmVkYWN0INij2KjZiti2KSDYq9mFINmK2YTYtdmCIG5ld190ZXh0INio2K7Ytdin2KbYtSDYp9mE2YAgc3Bhbi4KICAgIC0g2KXZhiDZg9in2YYgbmV3X3RleHQg2KPYt9mI2YQg2KjZg9ir2YrYsdiMINix2KfZgtioINiq2K/Yp9iu2YTYp9iqINmK2K/ZiNmK2YvYpyAo2YrZhdmD2YYg2KrZiNiz2YrYuSByZWN0INmE2KfYrdmC2KfZiykuCiAgICAiIiIKICAgIGRvYyA9IGZpdHoub3BlbihpbnB1dF9wZGYpCiAgICBpZiBwYWdlX2luZGV4IDwgMCBvciBwYWdlX2luZGV4ID49IGxlbihkb2MpOgogICAgICAgIGRvYy5jbG9zZSgpCiAgICAgICAgcmV0dXJuIEZhbHNlCiAgICBwYWdlID0gZG9jW3BhZ2VfaW5kZXhdCiAgICBwcm9wc19saXN0ID0gZ2V0X3RleHRfcHJvcGVydGllc19mb3Jfc3Vic3RyaW5nKHBhZ2UsIG9sZF90ZXh0LCBtYXhfaGl0cz0xKQogICAgaWYgbm90IHByb3BzX2xpc3Q6CiAgICAgICAgZG9jLmNsb3NlKCkKICAgICAgICByZXR1cm4gRmFsc2UKICAgIHAgPSBwcm9wc19saXN0WzBdCiAgICAjINmE2YjZhiArINiu2Lcg2YXYr9mF2KwgKNmC2KjZhCDZgtmK2KfYsyDYp9mE2LnYsdi2KQogICAgcmdiID0gX3NwYW5fY29sb3JfdG9fcmdiMDEocC5jb2xvcikKICAgIGZvbnRuYW1lID0gX21hcF9mb250X3RvX2J1aWx0X2luKHApCiAgICBpc19ib2xkX2VmZmVjdGl2ZSA9IGZvbnRuYW1lIGluICgKICAgICAgICAiaGVibyIsCiAgICAgICAgImhlYmkiLAogICAgICAgICJ0aWJvIiwKICAgICAgICAidGliaSIsCiAgICAgICAgImNvYm8iLAogICAgICAgICJjb2JpIiwKICAgICkKICAgIGZ4ID0gX2ZpbmRfZW1iZWRkZWRfZm9udF94cmVmKGRvYywgcGFnZV9pbmRleCwgcC5mb250KQogICAgZW1iZWRkZWQgPSBfbG9hZF9lbWJlZGRlZF9maXR6X2ZvbnQoZG9jLCBmeCkgaWYgZnggZWxzZSBOb25lCgogICAgIyDYudix2LYg2YXZj9mC2K/ZkdixOiDYqNmG2YHYsyDYp9mE2KjYsdmG2KfZhdisINin2YTZhdi22YXZkdmGINil2YYg2YjZj9is2K8gKNij2K/ZgiDZhdmGIEhlbHZldGljYSDYp9mE2KjYr9mK2YQpCiAgICB0cnk6CiAgICAgICAgaWYgZW1iZWRkZWQgaXMgbm90IE5vbmU6CiAgICAgICAgICAgIHdfb2xkID0gZmxvYXQoZW1iZWRkZWQudGV4dF9sZW5ndGgob2xkX3RleHQsIHAuc2l6ZSkpCiAgICAgICAgICAgIHdfbmV3ID0gZmxvYXQoZW1iZWRkZWQudGV4dF9sZW5ndGgobmV3X3RleHQsIHAuc2l6ZSkpCiAgICAgICAgZWxzZToKICAgICAgICAgICAgd19vbGQgPSBmbG9hdCgKICAgICAgICAgICAgICAgIGZpdHouZ2V0X3RleHRfbGVuZ3RoKG9sZF90ZXh0LCBmb250bmFtZT1mb250bmFtZSwgZm9udHNpemU9cC5zaXplKQogICAgICAgICAgICApCiAgICAgICAgICAgIHdfbmV3ID0gZmxvYXQoCiAgICAgICAgICAgICAgICBmaXR6LmdldF90ZXh0X2xlbmd0aChuZXdfdGV4dCwgZm9udG5hbWU9Zm9udG5hbWUsIGZvbnRzaXplPXAuc2l6ZSkKICAgICAgICAgICAgKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICB3X29sZCA9IG1heCgxLjAsIHAuYmJveC54MSAtIHAuYmJveC54MCkgKiAwLjk1CiAgICAgICAgdHJ5OgogICAgICAgICAgICB3X25ldyA9IHdfb2xkIGlmIGVtYmVkZGVkIGlzIE5vbmUgZWxzZSBmbG9hdChlbWJlZGRlZC50ZXh0X2xlbmd0aChuZXdfdGV4dCwgcC5zaXplKSkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uOgogICAgICAgICAgICB3X25ldyA9IHdfb2xkCiAgICBleHRyYV93ID0gbWF4KDAuMCwgZmxvYXQod19uZXcpIC0gZmxvYXQod19vbGQpKSArIDAuNzUKICAgIHIgPSBmaXR6LlJlY3QoCiAgICAgICAgcC5iYm94LngwLCBwLmJib3gueTAsIHAuYmJveC54MSArIGV4dHJhX3csIHAuYmJveC55MQogICAgKQoKICAgICMgMSkgcmVkYWN0OiDYr9in2K7ZhCDYp9ix2KrZgdin2Lkg2KfZhNiz2LfYsSDZgdmC2LcgKGxpbmVfYmJveCkgKyDYqtmI2LPZiti5INij2YHZgtmKCiAgICBfcmVkYWN0X3JlZ2lvbihwYWdlLCByLCBwLmxpbmVfYmJveCkKICAgIHRyeToKICAgICAgICBwYWdlLmFwcGx5X3JlZGFjdGlvbnMoKQogICAgZXhjZXB0IEV4Y2VwdGlvbjoKICAgICAgICBkb2MuY2xvc2UoKQogICAgICAgIHJldHVybiBGYWxzZQoKICAgICMgMikg2KXYr9ix2KfYrCDYudmE2Ykg2YbZgdizINin2YTZgCBvcmlnaW4gKGJhc2VsaW5lKSDigJQg2K7YtyDZhdi22YXZkdmGINmF2YYg2KfZhNmF2LPYqtmG2K8g2KXZhiDZiNmP2KzYrwogICAgeDAsIHkwID0gcC5vcmlnaW5bMF0sIHAub3JpZ2luWzFdCiAgICBwb3MgPSAoeDAsIHkwKQogICAgX3dyaXRlX3RleHRfcHJlc2VydmUoCiAgICAgICAgcGFnZSwKICAgICAgICBwb3MsCiAgICAgICAgbmV3X3RleHQsCiAgICAgICAgcC5zaXplLAogICAgICAgIHJnYiwKICAgICAgICBlbWJlZGRlZCwKICAgICAgICBmb250bmFtZSwKICAgICAgICBpc19ib2xkX2VmZmVjdGl2ZSwKICAgICkKICAgIGRvYy5zYXZlKG91dHB1dF9wZGYsIGdhcmJhZ2U9MywgZGVmbGF0ZT1UcnVlLCBjbGVhbj1UcnVlKQogICAgZG9jLmNsb3NlKCkKICAgIHJldHVybiBUcnVlCgoKZGVmIF9kZW1vX2NsaSgpIC0+IE5vbmU6CiAgICBpZiBsZW4oc3lzLmFyZ3YpIDwgNToKICAgICAgICBwcmludCgKICAgICAgICAgICAgItin2YTYp9iz2KrYudmF2KfZhDpcbiAgcGRmX3RleHRfc21hcnRfZWRpdC5weSBpbnB1dC5wZGYgb3V0LnBkZiAn2YbYtV/Zgtiv2YrZhScgJ9mG2LVf2KzYr9mK2K8nIFvYsdmC2YVf2LXZgdit2KldIiwKICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLAogICAgICAgICkKICAgICAgICBzeXMuZXhpdCgxKQogICAgaW5wLCBvdXRwLCBvbGRfdCwgbmV3X3QgPSBzeXMuYXJndlsxXSwgc3lzLmFyZ3ZbMl0sIHN5cy5hcmd2WzNdLCBzeXMuYXJndls0XQogICAgaWYgbGVuKHN5cy5hcmd2KSA+IDU6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBwaSA9IGludChzeXMuYXJndls1XSkKICAgICAgICBleGNlcHQgVmFsdWVFcnJvcjoKICAgICAgICAgICAgcHJpbnQoCiAgICAgICAgICAgICAgICAi2LHZgtmFX9in2YTYtdmB2K3YqSDZitis2Kgg2KPZhiDZitmD2YjZhiDYsdmC2YXYp9mLICjZhdir2KfZhDogMCkuINin2YTZiNiz2KfYpti3OiBpbnB1dCBvdXQgb2xkIG5ldyBbcGFnZV0iLAogICAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyLAogICAgICAgICAgICApCiAgICAgICAgICAgIHN5cy5leGl0KDEpCiAgICBlbHNlOgogICAgICAgIHBpID0gMAogICAgb2sgPSByZXBsYWNlX3RleHRfcHJlc2VydmVfZm9ybWF0KGlucCwgb3V0cCwgb2xkX3QsIG5ld190LCBwYWdlX2luZGV4PXBpKQogICAgaWYgbm90IG9rOgogICAgICAgIHByaW50KCLZgdi02YQ6INmE2YUg2YrZj9i52KvYsSDYudmE2Ykg2KfZhNmG2LUg2KPZiCDYrti32KMg2KrYt9io2YrZgi4iLCBmaWxlPXN5cy5zdGRlcnIpCiAgICAgICAgc3lzLmV4aXQoMikKICAgIHByaW50KCLYqtmFINin2YTYrdmB2Lg6Iiwgb3V0cCkKCgojIC0tLSDZiNin2KzZh9ipINmF2KvYp9mEOiDYp9iz2KrYrtix2KfYrCDYrti12KfYpti1INiv2YjZhiDYqti52K/ZitmEIC0tLQoKZGVmIGdldF90ZXh0X3Byb3BlcnRpZXNfanNvbmFibGUocGFnZTogZml0ei5QYWdlKSAtPiBMaXN0W2RpY3Rbc3RyLCBBbnldXToKICAgICIiItmE2YTYqtmD2KfZhdmEIEpTT04gLyBBUEk6INiq2K3ZiNmK2YQg2KfZhNiu2LXYp9im2LUg2KXZhNmJINmC2YjYp9mF2YrYsyDYqNiz2YrYt9ipLiIiIgogICAgb3V0OiBMaXN0W2RpY3Rbc3RyLCBBbnldXSA9IFtdCiAgICBmb3IgcCBpbiBnZXRfdGV4dF9wcm9wZXJ0aWVzKHBhZ2UpOgogICAgICAgIHIsIGcsIGIgPSBfc3Bhbl9jb2xvcl90b19yZ2IwMShwLmNvbG9yKQogICAgICAgIG91dC5hcHBlbmQoCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICJ0ZXh0IjogcC50ZXh0LAogICAgICAgICAgICAgICAgImZvbnQiOiBwLmZvbnQsCiAgICAgICAgICAgICAgICAic2l6ZV9wdCI6IHJvdW5kKHAuc2l6ZSwgNCksCiAgICAgICAgICAgICAgICAiY29sb3JfaW50IjogcC5jb2xvciwKICAgICAgICAgICAgICAgICJjb2xvcl9oZXgiOiBmIiN7cC5jb2xvcjowNlh9IiBpZiBwLmNvbG9yID49IDAgZWxzZSAiIzAwMDAwMCIsCiAgICAgICAgICAgICAgICAiY29sb3JfcmdiXzBfMSI6IFtyLCBnLCBiXSwKICAgICAgICAgICAgICAgICJmbGFncyI6IHAuZmxhZ3MsCiAgICAgICAgICAgICAgICAiYm9sZCI6IF9mbGFnc19ib2xkKHAuZmxhZ3MpIG9yIF9ib2xkX2l0YWxpY19mcm9tX2ZvbnRuYW1lKHAuZm9udClbMF0sCiAgICAgICAgICAgICAgICAiaXRhbGljIjogX2ZsYWdzX2l0YWxpYyhwLmZsYWdzKSBvciBfYm9sZF9pdGFsaWNfZnJvbV9mb250bmFtZShwLmZvbnQpWzFdLAogICAgICAgICAgICAgICAgImJib3giOiBbcC5iYm94LngwLCBwLmJib3gueTAsIHAuYmJveC54MSwgcC5iYm94LnkxXSwKICAgICAgICAgICAgICAgICJvcmlnaW4iOiBbcC5vcmlnaW5bMF0sIHAub3JpZ2luWzFdXSwKICAgICAgICAgICAgfQogICAgICAgICkKICAgIHJldHVybiBvdXQKCgppZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICAgX2RlbW9fY2xpKCkK' | tr -d ' \n' | base64 -d > scripts/pdf_text_smart_edit.py
chmod +x scripts/pdf_text_smart_edit.py
printf '%s\n' 'pymupdf>=1.24.0' > requirements.txt
echo "Installing PyMuPDF (--user, no venv)..."
python3 -m pip install --user -r requirements.txt
echo ""
echo "Done. Examples:"
echo "  python3 scripts/pdf_text_smart_edit.py"
echo "  python3 scripts/pdf_text_smart_edit.py input.pdf out.pdf 'old' 'new' 0"
