grab-url 1.0.16 → 1.0.17

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"download.cjs.js","sources":["../src/icons/cli/spinners.js","log.es.js","grab-api.es.js","../node_modules/cli-progress/lib/terminal.js","../node_modules/string-width/node_modules/strip-ansi/index.js","../node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js","../node_modules/string-width/index.js","../node_modules/is-fullwidth-code-point/index.js","../node_modules/emoji-regex/index.js","../node_modules/cli-progress/lib/format-value.js","../node_modules/cli-progress/lib/format-bar.js","../node_modules/cli-progress/lib/format-time.js","../node_modules/cli-progress/lib/formatter.js","../node_modules/cli-progress/lib/options.js","../node_modules/cli-progress/lib/generic-bar.js","../node_modules/cli-progress/lib/eta.js","../node_modules/cli-progress/presets/index.js","../node_modules/cli-progress/presets/legacy.js","../node_modules/cli-progress/presets/shades-classic.js","../node_modules/cli-progress/presets/shades-grey.js","../node_modules/cli-progress/presets/rect.js","../node_modules/cli-progress/cli-progress.js","../node_modules/cli-progress/lib/single-bar.js","../node_modules/cli-progress/lib/multi-bar.js","../node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/chalk/source/vendor/supports-color/browser.js","../node_modules/chalk/source/utilities.js","../node_modules/chalk/source/index.js","../src/grab-url.js"],"sourcesContent":["export default {\n\tdots: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠹\",\n\t\t\"⠸\",\n\t\t\"⠼\",\n\t\t\"⠴\",\n\t\t\"⠦\",\n\t\t\"⠧\",\n\t\t\"⠇\",\n\t\t\"⠏\"\n\t],\n\tdots2: [\n\t\t\"⣾\",\n\t\t\"⣽\",\n\t\t\"⣻\",\n\t\t\"⢿\",\n\t\t\"⡿\",\n\t\t\"⣟\",\n\t\t\"⣯\",\n\t\t\"⣷\"\n\t],\n\tdots3: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠞\",\n\t\t\"⠖\",\n\t\t\"⠦\",\n\t\t\"⠴\",\n\t\t\"⠲\",\n\t\t\"⠳\",\n\t\t\"⠓\"\n\t],\n\tdots4: [\n\t\t\"⠄\",\n\t\t\"⠆\",\n\t\t\"⠇\",\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠸\",\n\t\t\"⠰\",\n\t\t\"⠠\",\n\t\t\"⠰\",\n\t\t\"⠸\",\n\t\t\"⠙\",\n\t\t\"⠋\",\n\t\t\"⠇\",\n\t\t\"⠆\"\n\t],\n\tdots5: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\"\n\t],\n\tdots6: [\n\t\t\"⠁\",\n\t\t\"⠉\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠤\",\n\t\t\"⠄\",\n\t\t\"⠄\",\n\t\t\"⠤\",\n\t\t\"⠴\",\n\t\t\"⠲\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠚\",\n\t\t\"⠙\",\n\t\t\"⠉\",\n\t\t\"⠁\"\n\t],\n\tdots7: [\n\t\t\"⠈\",\n\t\t\"⠉\",\n\t\t\"⠋\",\n\t\t\"⠓\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠖\",\n\t\t\"⠦\",\n\t\t\"⠤\",\n\t\t\"⠠\",\n\t\t\"⠠\",\n\t\t\"⠤\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\",\n\t\t\"⠉\",\n\t\t\"⠈\"\n\t],\n\tdots8: [\n\t\t\"⠁\",\n\t\t\"⠁\",\n\t\t\"⠉\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠤\",\n\t\t\"⠄\",\n\t\t\"⠄\",\n\t\t\"⠤\",\n\t\t\"⠠\",\n\t\t\"⠠\",\n\t\t\"⠤\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\",\n\t\t\"⠉\",\n\t\t\"⠈\",\n\t\t\"⠈\"\n\t],\n\tdots9: [\n\t\t\"⢹\",\n\t\t\"⢺\",\n\t\t\"⢼\",\n\t\t\"⣸\",\n\t\t\"⣇\",\n\t\t\"⡧\",\n\t\t\"⡗\",\n\t\t\"⡏\"\n\t],\n\tdots10: [\n\t\t\"⢄\",\n\t\t\"⢂\",\n\t\t\"⢁\",\n\t\t\"⡁\",\n\t\t\"⡈\",\n\t\t\"⡐\",\n\t\t\"⡠\"\n\t],\n\tdots11: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⡀\",\n\t\t\"⢀\",\n\t\t\"⠠\",\n\t\t\"⠐\",\n\t\t\"⠈\"\n\t],\n\tdots12: [\n\t\t\"⢀⠀\",\n\t\t\"⡀⠀\",\n\t\t\"⠄⠀\",\n\t\t\"⢂⠀\",\n\t\t\"⡂⠀\",\n\t\t\"⠅⠀\",\n\t\t\"⢃⠀\",\n\t\t\"⡃⠀\",\n\t\t\"⠍⠀\",\n\t\t\"⢋⠀\",\n\t\t\"⡋⠀\",\n\t\t\"⠍⠁\",\n\t\t\"⢋⠁\",\n\t\t\"⡋⠁\",\n\t\t\"⠍⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠩\",\n\t\t\"⠈⢙\",\n\t\t\"⠈⡙\",\n\t\t\"⢈⠩\",\n\t\t\"⡀⢙\",\n\t\t\"⠄⡙\",\n\t\t\"⢂⠩\",\n\t\t\"⡂⢘\",\n\t\t\"⠅⡘\",\n\t\t\"⢃⠨\",\n\t\t\"⡃⢐\",\n\t\t\"⠍⡐\",\n\t\t\"⢋⠠\",\n\t\t\"⡋⢀\",\n\t\t\"⠍⡁\",\n\t\t\"⢋⠁\",\n\t\t\"⡋⠁\",\n\t\t\"⠍⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠩\",\n\t\t\"⠈⢙\",\n\t\t\"⠈⡙\",\n\t\t\"⠈⠩\",\n\t\t\"⠀⢙\",\n\t\t\"⠀⡙\",\n\t\t\"⠀⠩\",\n\t\t\"⠀⢘\",\n\t\t\"⠀⡘\",\n\t\t\"⠀⠨\",\n\t\t\"⠀⢐\",\n\t\t\"⠀⡐\",\n\t\t\"⠀⠠\",\n\t\t\"⠀⢀\",\n\t\t\"⠀⡀\"\n\t],\n\tdots13: [\n\t\t\"⣼\",\n\t\t\"⣹\",\n\t\t\"⢻\",\n\t\t\"⠿\",\n\t\t\"⡟\",\n\t\t\"⣏\",\n\t\t\"⣧\",\n\t\t\"⣶\"\n\t],\n\tdots14: [\n\t\t\"⠉⠉\",\n\t\t\"⠈⠙\",\n\t\t\"⠀⠹\",\n\t\t\"⠀⢸\",\n\t\t\"⠀⣰\",\n\t\t\"⢀⣠\",\n\t\t\"⣀⣀\",\n\t\t\"⣄⡀\",\n\t\t\"⣆⠀\",\n\t\t\"⡇⠀\",\n\t\t\"⠏⠀\",\n\t\t\"⠋⠁\"\n\t],\n\tdotsCircle: [\n\t\t\"⢎ \",\n\t\t\"⠎⠁\",\n\t\t\"⠊⠑\",\n\t\t\"⠈⠱\",\n\t\t\" ⡱\",\n\t\t\"⢀⡰\",\n\t\t\"⢄⡠\",\n\t\t\"⢆⡀\"\n\t],\n\tsand: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⡀\",\n\t\t\"⡈\",\n\t\t\"⡐\",\n\t\t\"⡠\",\n\t\t\"⣀\",\n\t\t\"⣁\",\n\t\t\"⣂\",\n\t\t\"⣄\",\n\t\t\"⣌\",\n\t\t\"⣔\",\n\t\t\"⣤\",\n\t\t\"⣥\",\n\t\t\"⣦\",\n\t\t\"⣮\",\n\t\t\"⣶\",\n\t\t\"⣷\",\n\t\t\"⣿\",\n\t\t\"⡿\",\n\t\t\"⠿\",\n\t\t\"⢟\",\n\t\t\"⠟\",\n\t\t\"⡛\",\n\t\t\"⠛\",\n\t\t\"⠫\",\n\t\t\"⢋\",\n\t\t\"⠋\",\n\t\t\"⠍\",\n\t\t\"⡉\",\n\t\t\"⠉\",\n\t\t\"⠑\",\n\t\t\"⠡\",\n\t\t\"⢁\"\n\t],\n\tline: [\n\t\t\"-\",\n\t\t\"\\\\\",\n\t\t\"|\",\n\t\t\"/\"\n\t],\n\tline2: [\n\t\t\"⠂\",\n\t\t\"-\",\n\t\t\"–\",\n\t\t\"—\",\n\t\t\"–\",\n\t\t\"-\"\n\t],\n\tpipe: [\n\t\t\"┤\",\n\t\t\"┘\",\n\t\t\"┴\",\n\t\t\"└\",\n\t\t\"├\",\n\t\t\"┌\",\n\t\t\"┬\",\n\t\t\"┐\"\n\t],\n\tsimpleDots: [\n\t\t\". \",\n\t\t\".. \",\n\t\t\"...\",\n\t\t\" \"\n\t],\n\tsimpleDotsScrolling: [\n\t\t\". \",\n\t\t\".. \",\n\t\t\"...\",\n\t\t\" ..\",\n\t\t\" .\",\n\t\t\" \"\n\t],\n\tstar: [\n\t\t\"✶\",\n\t\t\"✸\",\n\t\t\"✹\",\n\t\t\"✺\",\n\t\t\"✹\",\n\t\t\"✷\"\n\t],\n\tstar2: [\n\t\t\"+\",\n\t\t\"x\",\n\t\t\"*\"\n\t],\n\tflip: [\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"-\",\n\t\t\"`\",\n\t\t\"`\",\n\t\t\"'\",\n\t\t\"´\",\n\t\t\"-\",\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"_\"\n\t],\n\thamburger: [\n\t\t\"☱\",\n\t\t\"☲\",\n\t\t\"☴\"\n\t],\n\tgrowVertical: [\n\t\t\"▁\",\n\t\t\"▃\",\n\t\t\"▄\",\n\t\t\"▅\",\n\t\t\"▆\",\n\t\t\"▇\",\n\t\t\"▆\",\n\t\t\"▅\",\n\t\t\"▄\",\n\t\t\"▃\"\n\t],\n\tgrowHorizontal: [\n\t\t\"▏\",\n\t\t\"▎\",\n\t\t\"▍\",\n\t\t\"▌\",\n\t\t\"▋\",\n\t\t\"▊\",\n\t\t\"▉\",\n\t\t\"▊\",\n\t\t\"▋\",\n\t\t\"▌\",\n\t\t\"▍\",\n\t\t\"▎\"\n\t],\n\tballoon: [\n\t\t\" \",\n\t\t\".\",\n\t\t\"o\",\n\t\t\"O\",\n\t\t\"@\",\n\t\t\"*\",\n\t\t\" \"\n\t],\n\tballoon2: [\n\t\t\".\",\n\t\t\"o\",\n\t\t\"O\",\n\t\t\"°\",\n\t\t\"O\",\n\t\t\"o\",\n\t\t\".\"\n\t],\n\tnoise: [\n\t\t\"▓\",\n\t\t\"▒\",\n\t\t\"░\"\n\t],\n\tbounce: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⠂\"\n\t],\n\tboxBounce: [\n\t\t\"▖\",\n\t\t\"▘\",\n\t\t\"▝\",\n\t\t\"▗\"\n\t],\n\tboxBounce2: [\n\t\t\"▌\",\n\t\t\"▀\",\n\t\t\"▐\",\n\t\t\"▄\"\n\t],\n\ttriangle: [\n\t\t\"◢\",\n\t\t\"◣\",\n\t\t\"◤\",\n\t\t\"◥\"\n\t],\n\tbinary: [\n\t\t\"010010\",\n\t\t\"001100\",\n\t\t\"100101\",\n\t\t\"111010\",\n\t\t\"111101\",\n\t\t\"010111\",\n\t\t\"101011\",\n\t\t\"111000\",\n\t\t\"110011\",\n\t\t\"110101\"\n\t],\n\tarc: [\n\t\t\"◜\",\n\t\t\"◠\",\n\t\t\"◝\",\n\t\t\"◞\",\n\t\t\"◡\",\n\t\t\"◟\"\n\t],\n\tcircle: [\n\t\t\"◡\",\n\t\t\"⊙\",\n\t\t\"◠\"\n\t],\n\tsquareCorners: [\n\t\t\"◰\",\n\t\t\"◳\",\n\t\t\"◲\",\n\t\t\"◱\"\n\t],\n\tcircleQuarters: [\n\t\t\"◴\",\n\t\t\"◷\",\n\t\t\"◶\",\n\t\t\"◵\"\n\t],\n\tcircleHalves: [\n\t\t\"◐\",\n\t\t\"◓\",\n\t\t\"◑\",\n\t\t\"◒\"\n\t],\n\tsquish: [\n\t\t\"╫\",\n\t\t\"╪\"\n\t],\n\ttoggle: [\n\t\t\"⊶\",\n\t\t\"⊷\"\n\t],\n\ttoggle2: [\n\t\t\"▫\",\n\t\t\"▪\"\n\t],\n\ttoggle3: [\n\t\t\"□\",\n\t\t\"■\"\n\t],\n\ttoggle4: [\n\t\t\"■\",\n\t\t\"□\",\n\t\t\"▪\",\n\t\t\"▫\"\n\t],\n\ttoggle5: [\n\t\t\"▮\",\n\t\t\"▯\"\n\t],\n\ttoggle6: [\n\t\t\"ဝ\",\n\t\t\"၀\"\n\t],\n\ttoggle7: [\n\t\t\"⦾\",\n\t\t\"⦿\"\n\t],\n\ttoggle8: [\n\t\t\"◍\",\n\t\t\"◌\"\n\t],\n\ttoggle9: [\n\t\t\"◉\",\n\t\t\"◎\"\n\t],\n\ttoggle10: [\n\t\t\"㊂\",\n\t\t\"㊀\",\n\t\t\"㊁\"\n\t],\n\ttoggle11: [\n\t\t\"⧇\",\n\t\t\"⧆\"\n\t],\n\ttoggle12: [\n\t\t\"☗\",\n\t\t\"☖\"\n\t],\n\ttoggle13: [\n\t\t\"=\",\n\t\t\"*\",\n\t\t\"-\"\n\t],\n\tarrow: [\n\t\t\"←\",\n\t\t\"↖\",\n\t\t\"↑\",\n\t\t\"↗\",\n\t\t\"→\",\n\t\t\"↘\",\n\t\t\"↓\",\n\t\t\"↙\"\n\t],\n\tarrow2: [\n\t\t\"⬆️ \",\n\t\t\"↗️ \",\n\t\t\"➡️ \",\n\t\t\"↘️ \",\n\t\t\"⬇️ \",\n\t\t\"↙️ \",\n\t\t\"⬅️ \",\n\t\t\"↖️ \"\n\t],\n\tarrow3: [\n\t\t\"▹▹▹▹▹\",\n\t\t\"▸▹▹▹▹\",\n\t\t\"▹▸▹▹▹\",\n\t\t\"▹▹▸▹▹\",\n\t\t\"▹▹▹▸▹\",\n\t\t\"▹▹▹▹▸\"\n\t],\n\tbouncingBar: [\n\t\t\"[ ]\",\n\t\t\"[= ]\",\n\t\t\"[== ]\",\n\t\t\"[=== ]\",\n\t\t\"[====]\",\n\t\t\"[ ===]\",\n\t\t\"[ ==]\",\n\t\t\"[ =]\",\n\t\t\"[ ]\",\n\t\t\"[ =]\",\n\t\t\"[ ==]\",\n\t\t\"[ ===]\",\n\t\t\"[====]\",\n\t\t\"[=== ]\",\n\t\t\"[== ]\",\n\t\t\"[= ]\"\n\t],\n\tbouncingBall: [\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ●)\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"(● )\"\n\t],\n\tsmiley: [\n\t\t\"😄 \",\n\t\t\"😝 \"\n\t],\n\tmonkey: [\n\t\t\"🙈 \",\n\t\t\"🙈 \",\n\t\t\"🙉 \",\n\t\t\"🙊 \"\n\t],\n\thearts: [\n\t\t\"💛 \",\n\t\t\"💙 \",\n\t\t\"💜 \",\n\t\t\"💚 \",\n\t\t\"❤️ \"\n\t],\n\tclock: [\n\t\t\"🕛 \",\n\t\t\"🕐 \",\n\t\t\"🕑 \",\n\t\t\"🕒 \",\n\t\t\"🕓 \",\n\t\t\"🕔 \",\n\t\t\"🕕 \",\n\t\t\"🕖 \",\n\t\t\"🕗 \",\n\t\t\"🕘 \",\n\t\t\"🕙 \",\n\t\t\"🕚 \"\n\t],\n\tearth: [\n\t\t\"🌍 \",\n\t\t\"🌎 \",\n\t\t\"🌏 \"\n\t],\n\tmoon: [\n\t\t\"🌑 \",\n\t\t\"🌒 \",\n\t\t\"🌓 \",\n\t\t\"🌔 \",\n\t\t\"🌕 \",\n\t\t\"🌖 \",\n\t\t\"🌗 \",\n\t\t\"🌘 \"\n\t],\n\trunner: [\n\t\t\"🚶 \",\n\t\t\"🏃 \"\n\t],\n\tdqpb: [\n\t\t\"d\",\n\t\t\"q\",\n\t\t\"p\",\n\t\t\"b\"\n\t],\n\tweather: [\n\t\t\"☀️ \",\n\t\t\"☀️ \",\n\t\t\"☀️ \",\n\t\t\"🌤 \",\n\t\t\"⛅️ \",\n\t\t\"🌥 \",\n\t\t\"☁️ \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"⛈ \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"☁️ \",\n\t\t\"🌥 \",\n\t\t\"⛅️ \",\n\t\t\"🌤 \",\n\t\t\"☀️ \",\n\t\t\"☀️ \"\n\t],\n\tchristmas: [\n\t\t\"🌲\",\n\t\t\"🎄\"\n\t],\n\tgrenade: [\n\t\t\"، \",\n\t\t\"′ \",\n\t\t\" ´ \",\n\t\t\" ‾ \",\n\t\t\" ⸌\",\n\t\t\" ⸊\",\n\t\t\" |\",\n\t\t\" ⁎\",\n\t\t\" ⁕\",\n\t\t\" ෴ \",\n\t\t\" ⁓\",\n\t\t\" \",\n\t\t\" \",\n\t\t\" \"\n\t],\n\tpoint: [\n\t\t\"∙∙∙\",\n\t\t\"●∙∙\",\n\t\t\"∙●∙\",\n\t\t\"∙∙●\",\n\t\t\"∙∙∙\"\n\t],\n\tlayer: [\n\t\t\"-\",\n\t\t\"=\",\n\t\t\"≡\"\n\t],\n\tbetaWave: [\n\t\t\"ρββββββ\",\n\t\t\"βρβββββ\",\n\t\t\"ββρββββ\",\n\t\t\"βββρβββ\",\n\t\t\"ββββρββ\",\n\t\t\"βββββρβ\",\n\t\t\"ββββββρ\"\n\t],\n\tfingerDance: [\n\t\t\"🤘 \",\n\t\t\"🤟 \",\n\t\t\"🖖 \",\n\t\t\"✋ \",\n\t\t\"🤚 \",\n\t\t\"👆 \"\n\t],\n\tmindblown: [\n\t\t\"😐 \",\n\t\t\"😐 \",\n\t\t\"😮 \",\n\t\t\"😮 \",\n\t\t\"😦 \",\n\t\t\"😦 \",\n\t\t\"😧 \",\n\t\t\"😧 \",\n\t\t\"🤯 \",\n\t\t\"💥 \",\n\t\t\"✨ \",\n\t\t\"\\u3000 \",\n\t\t\"\\u3000 \",\n\t\t\"\\u3000 \"\n\t],\n\tspeaker: [\n\t\t\"🔈 \",\n\t\t\"🔉 \",\n\t\t\"🔊 \",\n\t\t\"🔉 \"\n\t],\n\torangePulse: [\n\t\t\"🔸 \",\n\t\t\"🔶 \",\n\t\t\"🟠 \",\n\t\t\"🟠 \",\n\t\t\"🔶 \"\n\t],\n\tbluePulse: [\n\t\t\"🔹 \",\n\t\t\"🔷 \",\n\t\t\"🔵 \",\n\t\t\"🔵 \",\n\t\t\"🔷 \"\n\t],\n\torangeBluePulse: [\n\t\t\"🔸 \",\n\t\t\"🔶 \",\n\t\t\"🟠 \",\n\t\t\"🟠 \",\n\t\t\"🔶 \",\n\t\t\"🔹 \",\n\t\t\"🔷 \",\n\t\t\"🔵 \",\n\t\t\"🔵 \",\n\t\t\"🔷 \"\n\t],\n\ttimeTravel: [\n\t\t\"🕛 \",\n\t\t\"🕚 \",\n\t\t\"🕙 \",\n\t\t\"🕘 \",\n\t\t\"🕗 \",\n\t\t\"🕖 \",\n\t\t\"🕕 \",\n\t\t\"🕔 \",\n\t\t\"🕓 \",\n\t\t\"🕒 \",\n\t\t\"🕑 \",\n\t\t\"🕐 \"\n\t],\n\taesthetic: [\n\t\t\"▰▱▱▱▱▱▱\",\n\t\t\"▰▰▱▱▱▱▱\",\n\t\t\"▰▰▰▱▱▱▱\",\n\t\t\"▰▰▰▰▱▱▱\",\n\t\t\"▰▰▰▰▰▱▱\",\n\t\t\"▰▰▰▰▰▰▱\",\n\t\t\"▰▰▰▰▰▰▰\",\n\t\t\"▰▱▱▱▱▱▱\"\n\t]\n}\n","function log(message = \"\", options = {}) {\n let {\n color,\n style = \"color:rgb(54, 165, 220); font-size: 10pt;\",\n hideInProduction = void 0,\n startSpinner = false,\n stopSpinner = false\n } = options;\n const colors = getColors();\n if (typeof hideInProduction === \"undefined\")\n hideInProduction = typeof window !== \"undefined\" && window?.location.hostname.includes(\"localhost\");\n if (typeof message === \"object\")\n message = printJSONStructure(message) + \"\\n\\n\" + JSON.stringify(message, null, 2);\n if (Array.isArray(color) && color.length == 1) color = color[0];\n if (color && typeof process !== void 0) {\n if (message.includes(\"%c\") && Array.isArray(color))\n message = message.replace(/%c/g, (match, index) => colors[color[index]] || \"\");\n else if (color && typeof color === \"string\")\n message = (colors[color] || \"\") + message + colors.reset;\n }\n var i = 0;\n if (startSpinner)\n (global || globalThis).interval = setInterval(() => {\n process.stdout.write(\n (Array.isArray(color) ? colors[color[0]] : colors[color] || \"\") + \"\\r\" + \"⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏\".split(\"\")[i = ++i % 10] + \" \" + message + colors.reset\n );\n }, 50);\n else if (stopSpinner) {\n clearInterval((global || globalThis).interval);\n process.stdout.write(\n \"\\r\" + (message || \" \") + \" \".repeat(message.length + 20) + \"\\n\"\n );\n } else if (typeof style === \"string\") {\n if (style.split(\" \").length == 1 || color) {\n style = `color: ${color || style}; font-size: 11pt;`;\n } else {\n if (style.match(/^#[0-9a-fA-F]{6}$/)) {\n style = `color: ${style}; font-size: 11pt;`;\n }\n }\n if (hideInProduction)\n console.debug((style ? \"%c\" : \"\") + (message || \"\"), style);\n else console.log((style ? \"%c\" : \"\") + (message || \"\"), style);\n } else if (typeof style === \"object\") console.log(message, ...style);\n return true;\n}\nvar ColorName = /* @__PURE__ */ ((ColorName2) => {\n ColorName2[\"RESET\"] = \"reset\";\n ColorName2[\"BLACK\"] = \"black\";\n ColorName2[\"RED\"] = \"red\";\n ColorName2[\"GREEN\"] = \"green\";\n ColorName2[\"YELLOW\"] = \"yellow\";\n ColorName2[\"BLUE\"] = \"blue\";\n ColorName2[\"MAGENTA\"] = \"magenta\";\n ColorName2[\"CYAN\"] = \"cyan\";\n ColorName2[\"WHITE\"] = \"white\";\n ColorName2[\"GRAY\"] = \"gray\";\n ColorName2[\"BRIGHT_RED\"] = \"brightRed\";\n ColorName2[\"BRIGHT_GREEN\"] = \"brightGreen\";\n ColorName2[\"BRIGHT_YELLOW\"] = \"brightYellow\";\n ColorName2[\"BRIGHT_BLUE\"] = \"brightBlue\";\n ColorName2[\"BRIGHT_MAGENTA\"] = \"brightMagenta\";\n ColorName2[\"BRIGHT_CYAN\"] = \"brightCyan\";\n ColorName2[\"BRIGHT_WHITE\"] = \"brightWhite\";\n ColorName2[\"BG_RED\"] = \"bgRed\";\n ColorName2[\"BG_GREEN\"] = \"bgGreen\";\n ColorName2[\"BG_YELLOW\"] = \"bgYellow\";\n ColorName2[\"BG_BLUE\"] = \"bgBlue\";\n ColorName2[\"BG_MAGENTA\"] = \"bgMagenta\";\n ColorName2[\"BG_CYAN\"] = \"bgCyan\";\n ColorName2[\"BG_WHITE\"] = \"bgWhite\";\n ColorName2[\"BG_GRAY\"] = \"bgGray\";\n ColorName2[\"BG_BLACK\"] = \"bgBlack\";\n ColorName2[\"BG_BRIGHT_RED\"] = \"bgBrightRed\";\n ColorName2[\"BG_BRIGHT_GREEN\"] = \"bgBrightGreen\";\n ColorName2[\"BG_BRIGHT_YELLOW\"] = \"bgBrightYellow\";\n ColorName2[\"BG_BRIGHT_BLUE\"] = \"bgBrightBlue\";\n ColorName2[\"BG_BRIGHT_MAGENTA\"] = \"bgBrightMagenta\";\n ColorName2[\"BG_BRIGHT_CYAN\"] = \"bgBrightCyan\";\n ColorName2[\"BG_BRIGHT_WHITE\"] = \"bgBrightWhite\";\n return ColorName2;\n})(ColorName || {});\nconst colorMap = {\n [\n \"reset\"\n /* RESET */\n ]: [0, \"000000\"],\n [\n \"black\"\n /* BLACK */\n ]: [30, \"000000\"],\n [\n \"red\"\n /* RED */\n ]: [31, \"ff0000\"],\n [\n \"green\"\n /* GREEN */\n ]: [32, \"00ff00\"],\n [\n \"yellow\"\n /* YELLOW */\n ]: [33, \"ffff00\"],\n [\n \"blue\"\n /* BLUE */\n ]: [34, \"0000ff\"],\n [\n \"magenta\"\n /* MAGENTA */\n ]: [35, \"ff00ff\"],\n [\n \"cyan\"\n /* CYAN */\n ]: [36, \"00ffff\"],\n [\n \"white\"\n /* WHITE */\n ]: [37, \"ffffff\"],\n [\n \"gray\"\n /* GRAY */\n ]: [90, \"808080\"],\n [\n \"brightRed\"\n /* BRIGHT_RED */\n ]: [91, \"ff5555\"],\n [\n \"brightGreen\"\n /* BRIGHT_GREEN */\n ]: [92, \"55ff55\"],\n [\n \"brightYellow\"\n /* BRIGHT_YELLOW */\n ]: [93, \"ffff55\"],\n [\n \"brightBlue\"\n /* BRIGHT_BLUE */\n ]: [94, \"5555ff\"],\n [\n \"brightMagenta\"\n /* BRIGHT_MAGENTA */\n ]: [95, \"ff55ff\"],\n [\n \"brightCyan\"\n /* BRIGHT_CYAN */\n ]: [96, \"55ffff\"],\n [\n \"brightWhite\"\n /* BRIGHT_WHITE */\n ]: [97, \"ffffff\"],\n [\n \"bgBlack\"\n /* BG_BLACK */\n ]: [40, \"000000\"],\n [\n \"bgRed\"\n /* BG_RED */\n ]: [41, \"ff0000\"],\n [\n \"bgGreen\"\n /* BG_GREEN */\n ]: [42, \"00ff00\"],\n [\n \"bgYellow\"\n /* BG_YELLOW */\n ]: [43, \"ffff00\"],\n [\n \"bgBlue\"\n /* BG_BLUE */\n ]: [44, \"0000ff\"],\n [\n \"bgMagenta\"\n /* BG_MAGENTA */\n ]: [45, \"ff00ff\"],\n [\n \"bgCyan\"\n /* BG_CYAN */\n ]: [46, \"00ffff\"],\n [\n \"bgWhite\"\n /* BG_WHITE */\n ]: [47, \"ffffff\"],\n [\n \"bgGray\"\n /* BG_GRAY */\n ]: [100, \"808080\"],\n [\n \"bgBrightRed\"\n /* BG_BRIGHT_RED */\n ]: [101, \"ff8888\"],\n [\n \"bgBrightGreen\"\n /* BG_BRIGHT_GREEN */\n ]: [102, \"88ff88\"],\n [\n \"bgBrightYellow\"\n /* BG_BRIGHT_YELLOW */\n ]: [103, \"ffff88\"],\n [\n \"bgBrightBlue\"\n /* BG_BRIGHT_BLUE */\n ]: [104, \"8888ff\"],\n [\n \"bgBrightMagenta\"\n /* BG_BRIGHT_MAGENTA */\n ]: [105, \"ff88ff\"],\n [\n \"bgBrightCyan\"\n /* BG_BRIGHT_CYAN */\n ]: [106, \"88ffff\"],\n [\n \"bgBrightWhite\"\n /* BG_BRIGHT_WHITE */\n ]: [107, \"ffffff\"]\n};\nfunction getColors(format = \"ansi\") {\n const colors = {};\n for (const [name, [ansiCode, hexCode]] of Object.entries(colorMap)) {\n colors[name] = format === \"html\" ? \"#\" + hexCode : \"\\x1B[\" + ansiCode + \"m\";\n }\n return colors;\n}\nfunction getColorForType(value) {\n const colors = getColors();\n if (typeof value === \"string\") return colors.yellow;\n if (typeof value === \"number\") return colors.cyan;\n if (typeof value === \"boolean\") return colors.magenta;\n if (typeof value === \"function\") return colors.red;\n if (value === null) return colors.gray;\n if (Array.isArray(value)) return colors.blue;\n if (typeof value === \"object\") return colors.green;\n return colors.white;\n}\nfunction getTypeString(value) {\n if (typeof value === \"string\") return '\"\"';\n if (typeof value === \"number\") return \"number\";\n if (typeof value === \"boolean\") return \"bool\";\n if (typeof value === \"function\") return \"function\";\n if (value === null) return \"null\";\n if (Array.isArray(value)) {\n if (value.length) return \"[\" + getTypeString(value[0]) + \"]\";\n else return \"[]\";\n }\n if (typeof value === \"object\") return \"{...}\";\n return typeof value;\n}\nfunction printJSONStructure(obj, indent = 0, colorFormat = \"ansi\") {\n const colors = getColors(colorFormat);\n const pad = \" \".repeat(indent);\n var result = \"\";\n if (typeof obj !== \"object\" || obj === null) {\n const color = getColorForType(obj);\n return color + getTypeString(obj) + colors.reset;\n }\n if (Array.isArray(obj)) {\n result = colors.blue + \"[\" + colors.reset;\n if (obj.length) result += \"\\n\";\n if (obj.every((item) => typeof item === typeof obj[0])) {\n result += pad + \" \" + printJSONStructure(obj[0], indent + 1);\n result += \",\";\n result += \"\\n\";\n } else {\n obj.forEach((item, idx) => {\n result += pad + \" \" + printJSONStructure(item, indent + 1);\n if (idx < obj.length - 1) result += \",\";\n result += \"\\n\";\n });\n result += pad + colors.blue + \"]\" + colors.reset;\n return result;\n }\n }\n result = colors.green + \"{\" + colors.reset;\n const keys = Object.keys(obj);\n if (keys.length) result += \"\\n\";\n keys.forEach((key, index) => {\n const value = obj[key];\n const color = getColorForType(value);\n result += pad + \" \";\n if (typeof value === \"object\" && value !== null && !Array.isArray(value)) {\n result += color + key + colors.reset + \": \" + printJSONStructure(value, indent + 1);\n } else if (Array.isArray(value)) {\n result += color + key + colors.reset + \": \" + printJSONStructure(value, indent + 1);\n } else {\n result += color + key + \": \" + getTypeString(value) + colors.reset;\n }\n if (index < keys.length - 1) result += \",\";\n result += \"\\n\";\n });\n result += pad + colors.green + \"}\" + colors.reset;\n return result;\n}\nexport {\n ColorName,\n getColors,\n log,\n printJSONStructure\n};\n//# sourceMappingURL=log.es.js.map\n","import { log, printJSONStructure } from \"./log.es.js\";\nasync function grab(path, options) {\n var {\n headers,\n response = {},\n // Pre-initialized object to set the response in. isLoading and error are also set on this object.\n method = options.post ? \"POST\" : options.put ? \"PUT\" : options.patch ? \"PATCH\" : \"GET\",\n cache = false,\n // Enable/disable frontend caching\n cacheForTime = 60,\n // Seconds to consider data stale and invalidate cache\n timeout = 30,\n // Request timeout in seconds\n baseURL = typeof process !== \"undefined\" && process.env.SERVER_API_URL || \"/api/\",\n // Use env var or default to /api/\n cancelOngoingIfNew = false,\n // Cancel previous request for same path\n cancelNewIfOngoing = false,\n // Don't make new request if one is ongoing\n rateLimit = 0,\n // Minimum seconds between requests\n debug = false,\n // Auto-enable debug on localhost\n // typeof window !== \"undefined\" && window?.location?.hostname?.includes(\"localhost\"),\n infiniteScroll = null,\n // page key, response field to concatenate, element with results\n setDefaults = false,\n // Set these options as defaults for future requests\n retryAttempts = 0,\n // Retry failed requests once\n logger = log,\n // Custom logger to override the built-in color JSON log()\n onRequest = null,\n // Hook to modify request data before request is made\n onResponse = null,\n // Hook to modify request data after request is made\n onError = null,\n // Hook to modify request data after request is made\n onStream = null,\n // Hook to process the response as a stream (i.e., for instant unarchiving)\n repeatEvery = null,\n // Repeat request every seconds\n repeat = 0,\n // Repeat request this many times\n debounce = 0,\n // Seconds to debounce request, wait to execute so that other requests may override\n regrabOnStale = false,\n // Refetch when cache is past cacheForTime\n regrabOnFocus = false,\n // Refetch on window refocus\n regrabOnNetwork = false,\n // Refetch on network change\n post = false,\n put = false,\n patch = false,\n body = null,\n ...params\n // All other params become request params/query\n } = {\n // Destructure options with defaults, merging with any globally set defaults\n ...typeof window !== \"undefined\" ? window?.grab?.defaults : (global || globalThis)?.grab?.defaults || {},\n ...options\n };\n let s = (t) => path.startsWith(t);\n if (s(\"http:\") || s(\"https:\")) baseURL = \"\";\n else if (!s(\"/\") && !baseURL.endsWith(\"/\")) path = \"/\" + path;\n else if (s(\"/\") && baseURL.endsWith(\"/\")) path = path.slice(1);\n try {\n if (debounce > 0)\n return await debouncer(async () => {\n await grab(path, { ...options, debounce: 0 });\n }, debounce * 1e3);\n if (repeat > 1) {\n for (let i = 0; i < repeat; i++) {\n await grab(path, { ...options, repeat: 0 });\n }\n return response;\n }\n if (repeatEvery) {\n setInterval(async () => {\n await grab(path, { ...options, repeat: 0, repeatEvery: null });\n }, repeatEvery * 1e3);\n return response;\n }\n if (options?.setDefaults) {\n if (typeof window !== \"undefined\")\n window.grab.defaults = { ...options, setDefaults: void 0 };\n else if (typeof (global || globalThis).grab !== \"undefined\")\n (global || globalThis).grab.defaults = {\n ...options,\n setDefaults: void 0\n };\n return;\n }\n if (typeof window !== \"undefined\") {\n const regrab = async () => await grab(path, { ...options, cache: false });\n if (regrabOnStale && cache) setTimeout(regrab, 1e3 * cacheForTime);\n if (regrabOnNetwork) window.addEventListener(\"online\", regrab);\n if (regrabOnFocus) {\n window.addEventListener(\"focus\", regrab);\n document.addEventListener(\"visibilitychange\", async () => {\n if (document.visibilityState === \"visible\") await regrab();\n });\n }\n }\n let resFunction = typeof response === \"function\" ? response : null;\n if (!response || resFunction) response = {};\n var [paginateKey, paginateResult, paginateElement] = infiniteScroll || [];\n if (infiniteScroll?.length && typeof paginateElement !== \"undefined\" && typeof window !== \"undefined\") {\n let paginateDOM = typeof paginateElement === \"string\" ? document.querySelector(paginateElement) : paginateElement;\n if (!paginateDOM) log(\"paginateDOM not found\", { color: \"red\" });\n else if (window.scrollListener && typeof paginateDOM !== \"undefined\" && typeof paginateDOM.removeEventListener === \"function\")\n paginateDOM.removeEventListener(\"scroll\", window.scrollListener);\n window.scrollListener = async (event) => {\n const t = event.target;\n localStorage.setItem(\n \"scroll\",\n JSON.stringify([t.scrollTop, t.scrollLeft, paginateElement])\n );\n if (t.scrollHeight - t.scrollTop <= t.clientHeight + 200) {\n await grab(path, {\n ...options,\n cache: false,\n [paginateKey]: priorRequest?.currentPage + 1\n });\n }\n };\n if (paginateDOM)\n paginateDOM.addEventListener(\"scroll\", window.scrollListener);\n }\n let paramsAsText = JSON.stringify(\n paginateKey ? { ...params, [paginateKey]: void 0 } : params\n );\n let priorRequest = grab?.log?.find(\n (e) => e.request == paramsAsText && e.path == path\n );\n if (!paginateKey) {\n for (let key of Object.keys(response)) response[key] = void 0;\n if (cache && (!cacheForTime || priorRequest?.lastFetchTime > Date.now() - 1e3 * cacheForTime)) {\n for (let key of Object.keys(priorRequest.res))\n response[key] = priorRequest.res[key];\n if (resFunction) response = resFunction(response);\n }\n } else {\n let pageNumber = priorRequest?.currentPage + 1 || params?.[paginateKey] || 1;\n if (!priorRequest) {\n response[paginateResult] = [];\n pageNumber = 1;\n }\n if (priorRequest) priorRequest.currentPage = pageNumber;\n params = { ...params, [paginateKey]: pageNumber };\n }\n if (resFunction) resFunction({ isLoading: true });\n else if (typeof response === \"object\") response.isLoading = true;\n if (resFunction) response = resFunction(response);\n if (rateLimit > 0 && priorRequest?.lastFetchTime && priorRequest.lastFetchTime > Date.now() - 1e3 * rateLimit)\n throw new Error(`Fetch rate limit exceeded for ${path}. \n Wait ${rateLimit}s between requests.`);\n if (priorRequest?.controller) {\n if (cancelOngoingIfNew) priorRequest.controller.abort();\n else if (cancelNewIfOngoing) return { isLoading: true };\n }\n if (typeof grab.log != \"undefined\")\n grab.log?.unshift({\n path,\n request: paramsAsText,\n lastFetchTime: Date.now(),\n controller: new AbortController()\n });\n let fetchParams = {\n method,\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n ...headers\n },\n body: params.body,\n redirect: \"follow\",\n cache: cache ? \"force-cache\" : \"no-store\",\n signal: cancelOngoingIfNew ? grab.log[0]?.controller?.signal : AbortSignal.timeout(timeout * 1e3)\n };\n let paramsGETRequest = \"\";\n if ([\"POST\", \"PUT\", \"PATCH\"].includes(method))\n fetchParams.body = params.body || JSON.stringify(params);\n else\n paramsGETRequest = (Object.keys(params).length ? \"?\" : \"\") + new URLSearchParams(params).toString();\n if (typeof onRequest === \"function\")\n [path, response, params, fetchParams] = onRequest(\n path,\n response,\n params,\n fetchParams\n );\n let res = null, startTime = /* @__PURE__ */ new Date(), mockHandler = grab.mock?.[path];\n let wait = (s2) => new Promise((res2) => setTimeout(res2, s2 * 1e3 || 0));\n if (mockHandler && (!mockHandler.params || mockHandler.method == method) && (!mockHandler.params || paramsAsText == JSON.stringify(mockHandler.params))) {\n await wait(mockHandler.delay);\n res = typeof mockHandler.response === \"function\" ? mockHandler.response(params) : mockHandler.response;\n } else {\n res = await fetch(baseURL + path + paramsGETRequest, fetchParams).catch(\n (e) => {\n throw new Error(e.message);\n }\n );\n if (!res.ok)\n throw new Error(`HTTP error: ${res.status} ${res.statusText}`);\n let type = res.headers.get(\"content-type\");\n if (onStream) await onStream(res.body);\n else\n res = await (type ? type.includes(\"application/json\") ? res && res.json() : type.includes(\"application/pdf\") || type.includes(\"application/octet-stream\") ? res.blob() : res.text() : res.json()).catch((e) => {\n throw new Error(\"Error parsing response: \" + e);\n });\n }\n if (typeof onResponse === \"function\")\n [path, response, params, fetchParams] = onResponse(\n path,\n response,\n params,\n fetchParams\n );\n if (resFunction) resFunction({ isLoading: void 0 });\n else if (typeof response === \"object\") delete response?.isLoading;\n delete priorRequest?.controller;\n const elapsedTime = ((Number(/* @__PURE__ */ new Date()) - Number(startTime)) / 1e3).toFixed(1);\n if (debug) {\n logger(\n \"Path:\" + baseURL + path + paramsGETRequest + \"\\n\" + JSON.stringify(options, null, 2) + \"\\nTime: \" + elapsedTime + \"s\\nResponse: \" + printJSONStructure(res)\n );\n }\n if (typeof res === \"object\") {\n for (let key of Object.keys(res))\n response[key] = paginateResult == key && response[key]?.length ? [...response[key], ...res[key]] : res[key];\n if (typeof response !== \"undefined\") response.data = res;\n } else if (resFunction) resFunction({ data: res, ...res });\n else if (typeof response === \"object\") response.data = res;\n if (typeof grab.log != \"undefined\")\n grab.log?.unshift({\n path,\n request: JSON.stringify({ ...params, paginateKey: void 0 }),\n response,\n lastFetchTime: Date.now()\n });\n if (resFunction) response = resFunction(response);\n return response;\n } catch (error) {\n let errorMessage = \"Error: \" + error.message + \"\\nPath:\" + baseURL + path + \"\\n\";\n if (typeof onError === \"function\")\n onError(error.message, baseURL + path, params);\n if (options.retryAttempts > 0)\n return await grab(path, {\n ...options,\n retryAttempts: --options.retryAttempts\n });\n if (!error.message.includes(\"signal\") && options.debug) {\n logger(errorMessage, { color: \"red\" });\n if (debug && typeof document !== \"undefined\") showAlert(errorMessage);\n }\n response.error = error.message;\n if (typeof response === \"function\") {\n response.data = response({ isLoading: void 0, error: error.message });\n response = response.data;\n } else delete response?.isLoading;\n if (typeof grab.log != \"undefined\")\n grab.log?.unshift({\n path,\n request: JSON.stringify(params),\n error: error.message\n });\n return response;\n }\n}\ngrab.instance = (defaults = {}) => (path, options = {}) => grab(path, { ...defaults, ...options });\nconst debouncer = async (func, wait) => {\n let timeout;\n return async function executedFunction(...args) {\n const later = async () => {\n clearTimeout(timeout);\n await func(...args);\n };\n clearTimeout(timeout);\n timeout = setTimeout(later, wait);\n };\n};\nif (typeof window !== \"undefined\") {\n window.log = log;\n window.grab = grab;\n window.grab.log = [];\n window.grab.mock = {};\n window.grab.defaults = {};\n setupDevTools();\n document.addEventListener(\"DOMContentLoaded\", () => {\n let [scrollTop, scrollLeft, paginateElement] = JSON.parse(localStorage.getItem(\"scroll\")) || [];\n if (!scrollTop) return;\n document.querySelector(paginateElement).scrollTop = scrollTop;\n document.querySelector(paginateElement).scrollLeft = scrollLeft;\n });\n} else if (typeof global !== \"undefined\") {\n grab.log = [];\n grab.mock = {};\n grab.defaults = {};\n global.log = log;\n global.grab = grab.instance();\n} else if (typeof globalThis !== \"undefined\") {\n grab.log = [];\n grab.mock = {};\n grab.defaults = {};\n globalThis.log = log;\n globalThis.grab = grab.instance();\n}\nfunction showAlert(msg) {\n if (typeof document === \"undefined\") return;\n let o = document.getElementById(\"alert-overlay\"), list;\n if (!o) {\n o = document.body.appendChild(document.createElement(\"div\"));\n o.id = \"alert-overlay\";\n o.setAttribute(\n \"style\",\n \"position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\"\n );\n o.innerHTML = `<div id=\"alert-box\" style=\"background:#fff;padding:1.5em 2em;border-radius:8px;box-shadow:0 2px 16px #0003;min-width:220px;max-height:80vh;position:relative;display:flex;flex-direction:column;\">\n <button id=\"close-alert\" style=\"position:absolute;top:12px;right:20px;font-size:1.5em;background:none;border:none;cursor:pointer;color:black;\">&times;</button>\n <div id=\"alert-list\" style=\"overflow:auto;flex:1;\"></div>\n </div>`;\n o.addEventListener(\"click\", (e) => e.target == o && o.remove());\n document.getElementById(\"close-alert\").onclick = () => o.remove();\n }\n list = o.querySelector(\"#alert-list\");\n list.innerHTML += `<div style=\"border-bottom:1px solid #333; font-size:1.2em;margin:0.5em 0;\">${msg}</div>`;\n}\nfunction setupDevTools() {\n document.addEventListener(\"keydown\", (e) => {\n if (e.key === \"i\" && e.ctrlKey && e.altKey) {\n let html = \" \";\n for (let request of grab.log) {\n html += `<div style=\"margin-bottom:1em; border-bottom:1px solid #ccc; padding-bottom:1em;\">\n <b>Path:</b> ${request.path}<br>\n <b>Request:</b> ${printJSONStructure(request.request, 0, \"html\")}<br>\n <b>Response:</b> ${printJSONStructure(request.response, 0, \"html\")}<br> \n <b>Time:</b> ${new Date(request.lastFetchTime).toLocaleString()}\n </div>`;\n }\n showAlert(html);\n }\n });\n}\nexport {\n grab as default,\n grab,\n log,\n printJSONStructure,\n setupDevTools,\n showAlert\n};\n//# sourceMappingURL=grab-api.es.js.map\n","const _readline = require('readline');\n\n// low-level terminal interactions\nclass Terminal{\n\n constructor(outputStream){\n this.stream = outputStream;\n\n // default: line wrapping enabled\n this.linewrap = true;\n\n // current, relative y position\n this.dy = 0;\n }\n\n // save cursor position + settings\n cursorSave(){\n if (!this.stream.isTTY){\n return;\n }\n\n // save position\n this.stream.write('\\x1B7');\n }\n\n // restore last cursor position + settings\n cursorRestore(){\n if (!this.stream.isTTY){\n return;\n }\n\n // restore cursor\n this.stream.write('\\x1B8');\n }\n\n // show/hide cursor\n cursor(enabled){\n if (!this.stream.isTTY){\n return;\n }\n\n if (enabled){\n this.stream.write('\\x1B[?25h');\n }else{\n this.stream.write('\\x1B[?25l');\n }\n }\n\n // change cursor positionn\n cursorTo(x=null, y=null){\n if (!this.stream.isTTY){\n return;\n }\n\n // move cursor absolute\n _readline.cursorTo(this.stream, x, y);\n }\n\n // change relative cursor position\n cursorRelative(dx=null, dy=null){\n if (!this.stream.isTTY){\n return;\n }\n\n // store current position\n this.dy = this.dy + dy;\n \n // move cursor relative\n _readline.moveCursor(this.stream, dx, dy);\n }\n\n // relative reset\n cursorRelativeReset(){\n if (!this.stream.isTTY){\n return;\n }\n\n // move cursor to initial line\n _readline.moveCursor(this.stream, 0, -this.dy);\n\n // first char\n _readline.cursorTo(this.stream, 0, null);\n\n // reset counter\n this.dy = 0;\n }\n\n // clear to the right from cursor\n clearRight(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearLine(this.stream, 1);\n }\n\n // clear the full line\n clearLine(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearLine(this.stream, 0);\n }\n\n // clear everyting beyond the current line\n clearBottom(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearScreenDown(this.stream);\n }\n\n // add new line; increment counter\n newline(){\n this.stream.write('\\n');\n this.dy++;\n }\n\n // write content to output stream\n // @TODO use string-width to strip length\n write(s, rawWrite=false){\n // line wrapping enabled ? trim output\n // this is just a fallback mechanism in case user enabled line-wrapping via options or set it to auto\n if (this.linewrap === true && rawWrite === false){\n this.stream.write(s.substr(0, this.getWidth()));\n\n // standard behaviour with disabled linewrapping\n }else{\n this.stream.write(s);\n }\n }\n\n // control line wrapping\n lineWrapping(enabled){\n if (!this.stream.isTTY){\n return;\n }\n\n // store state\n this.linewrap = enabled;\n if (enabled){\n this.stream.write('\\x1B[?7h');\n }else{\n this.stream.write('\\x1B[?7l');\n }\n }\n\n // tty environment ?\n isTTY(){\n return (this.stream.isTTY === true);\n }\n\n // get terminal width\n getWidth(){\n // set max width to 80 in tty-mode and 200 in notty-mode\n return this.stream.columns || (this.stream.isTTY ? 80 : 200);\n }\n}\n\nmodule.exports = Terminal;\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","// default value format (apply autopadding)\n\n// format valueset\nmodule.exports = function formatValue(v, options, type){\n // no autopadding ? passthrough\n if (options.autopadding !== true){\n return v;\n }\n\n // padding\n function autopadding(value, length){\n return (options.autopaddingChar + value).slice(-length);\n }\n\n switch (type){\n case 'percentage':\n return autopadding(v, 3);\n\n default:\n return v;\n }\n}","// format bar\nmodule.exports = function formatBar(progress, options){\n // calculate barsize\n const completeSize = Math.round(progress*options.barsize);\n const incompleteSize = options.barsize-completeSize;\n\n // generate bar string by stripping the pre-rendered strings\n return options.barCompleteString.substr(0, completeSize) +\n options.barGlue +\n options.barIncompleteString.substr(0, incompleteSize);\n}","// default time format\n\n// format a number of seconds into hours and minutes as appropriate\nmodule.exports = function formatTime(t, options, roundToMultipleOf){\n function round(input) {\n if (roundToMultipleOf) {\n return roundToMultipleOf * Math.round(input / roundToMultipleOf);\n } else {\n return input\n }\n }\n\n // leading zero padding\n function autopadding(v){\n return (options.autopaddingChar + v).slice(-2);\n }\n\n // > 1h ?\n if (t > 3600) {\n return autopadding(Math.floor(t / 3600)) + 'h' + autopadding(round((t % 3600) / 60)) + 'm';\n\n // > 60s ?\n } else if (t > 60) {\n return autopadding(Math.floor(t / 60)) + 'm' + autopadding(round((t % 60))) + 's';\n\n // > 10s ?\n } else if (t > 10) {\n return autopadding(round(t)) + 's';\n\n // default: don't apply round to multiple\n }else{\n return autopadding(t) + 's';\n }\n}","const _stringWidth = require('string-width');\nconst _defaultFormatValue = require('./format-value');\nconst _defaultFormatBar = require('./format-bar');\nconst _defaultFormatTime = require('./format-time');\n\n// generic formatter\nmodule.exports = function defaultFormatter(options, params, payload){\n\n // copy format string\n let s = options.format;\n\n // custom time format set ?\n const formatTime = options.formatTime || _defaultFormatTime;\n \n // custom value format set ?\n const formatValue = options.formatValue || _defaultFormatValue;\n\n // custom bar format set ?\n const formatBar = options.formatBar || _defaultFormatBar;\n\n // calculate progress in percent\n const percentage = Math.floor(params.progress*100) + '';\n\n // bar stopped and stopTime set ?\n const stopTime = params.stopTime || Date.now();\n\n // calculate elapsed time\n const elapsedTime = Math.round((stopTime - params.startTime)/1000);\n\n // merges data from payload and calculated\n const context = Object.assign({}, payload, {\n bar: formatBar(params.progress, options),\n\n percentage: formatValue(percentage, options, 'percentage'),\n total: formatValue(params.total, options, 'total'),\n value: formatValue(params.value, options, 'value'),\n\n eta: formatValue(params.eta, options, 'eta'),\n eta_formatted: formatTime(params.eta, options, 5),\n \n duration: formatValue(elapsedTime, options, 'duration'),\n duration_formatted: formatTime(elapsedTime, options, 1)\n });\n\n // assign placeholder tokens\n s = s.replace(/\\{(\\w+)\\}/g, function(match, key){\n // key exists within payload/context\n if (typeof context[key] !== 'undefined') {\n return context[key];\n }\n\n // no changes to unknown values\n return match;\n });\n\n // calculate available whitespace (2 characters margin of error)\n const fullMargin = Math.max(0, params.maxWidth - _stringWidth(s) -2);\n const halfMargin = Math.floor(fullMargin / 2);\n\n // distribute available whitespace according to position\n switch (options.align) {\n\n // fill start-of-line with whitespaces\n case 'right':\n s = (fullMargin > 0) ? ' '.repeat(fullMargin) + s : s;\n break;\n\n // distribute whitespaces to left+right\n case 'center':\n s = (halfMargin > 0) ? ' '.repeat(halfMargin) + s : s;\n break;\n\n // default: left align, no additional whitespaces\n case 'left':\n default:\n break;\n }\n\n return s;\n}\n","// utility to merge defaults\nfunction mergeOption(v, defaultValue){\n if (typeof v === 'undefined' || v === null){\n return defaultValue;\n }else{\n return v;\n }\n}\n\nmodule.exports = {\n // set global options\n parse: function parse(rawOptions, preset){\n\n // options storage\n const options = {};\n\n // merge preset\n const opt = Object.assign({}, preset, rawOptions);\n\n // the max update rate in fps (redraw will only triggered on value change)\n options.throttleTime = 1000 / (mergeOption(opt.fps, 10));\n\n // the output stream to write on\n options.stream = mergeOption(opt.stream, process.stderr);\n\n // external terminal provided ?\n options.terminal = mergeOption(opt.terminal, null);\n\n // clear on finish ?\n options.clearOnComplete = mergeOption(opt.clearOnComplete, false);\n\n // stop on finish ?\n options.stopOnComplete = mergeOption(opt.stopOnComplete, false);\n\n // size of the progressbar in chars\n options.barsize = mergeOption(opt.barsize, 40);\n\n // position of the progress bar - 'left' (default), 'right' or 'center'\n options.align = mergeOption(opt.align, 'left');\n\n // hide the cursor ?\n options.hideCursor = mergeOption(opt.hideCursor, false);\n\n // disable linewrapping ?\n options.linewrap = mergeOption(opt.linewrap, false);\n\n // glue sequence (control chars) between bar elements ?\n options.barGlue = mergeOption(opt.barGlue, '');\n\n // bar chars\n options.barCompleteChar = mergeOption(opt.barCompleteChar, '=');\n options.barIncompleteChar = mergeOption(opt.barIncompleteChar, '-');\n\n // the bar format\n options.format = mergeOption(opt.format, 'progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}');\n\n // external time-format provided ?\n options.formatTime = mergeOption(opt.formatTime, null);\n\n // external value-format provided ?\n options.formatValue = mergeOption(opt.formatValue, null);\n\n // external bar-format provided ?\n options.formatBar = mergeOption(opt.formatBar, null);\n\n // the number of results to average ETA over\n options.etaBufferLength = mergeOption(opt.etaBuffer, 10);\n\n // automatic eta updates based on fps\n options.etaAsynchronousUpdate = mergeOption(opt.etaAsynchronousUpdate, false);\n\n // progress calculation relative to start value ? default start at 0\n options.progressCalculationRelative = mergeOption(opt.progressCalculationRelative, false);\n\n // allow synchronous updates ?\n options.synchronousUpdate = mergeOption(opt.synchronousUpdate, true);\n\n // notty mode\n options.noTTYOutput = mergeOption(opt.noTTYOutput, false);\n\n // schedule - 2s\n options.notTTYSchedule = mergeOption(opt.notTTYSchedule, 2000);\n \n // emptyOnZero - false\n options.emptyOnZero = mergeOption(opt.emptyOnZero, false);\n\n // force bar redraw even if progress did not change\n options.forceRedraw = mergeOption(opt.forceRedraw, false);\n\n // automated padding to fixed width ?\n options.autopadding = mergeOption(opt.autopadding, false);\n\n // stop bar on SIGINT/SIGTERM to restore cursor settings ?\n options.gracefulExit = mergeOption(opt.gracefulExit, false);\n\n return options;\n },\n\n // derived options: instance specific, has to be created for every bar element\n assignDerivedOptions: function assignDerivedOptions(options){\n // pre-render bar strings (performance)\n options.barCompleteString = options.barCompleteChar.repeat(options.barsize + 1);\n options.barIncompleteString = options.barIncompleteChar.repeat(options.barsize + 1);\n\n // autopadding character - empty in case autopadding is disabled\n options.autopaddingChar = options.autopadding ? mergeOption(options.autopaddingChar, ' ') : '';\n\n return options;\n }\n};","const _ETA = require('./eta');\nconst _Terminal = require('./terminal');\nconst _formatter = require('./formatter');\nconst _options = require('./options');\nconst _EventEmitter = require('events');\n\n// Progress-Bar constructor\nmodule.exports = class GenericBar extends _EventEmitter{\n\n constructor(options){\n super();\n\n // store options and assign derived ones (instance specific)\n this.options = _options.assignDerivedOptions(options);\n\n // store terminal instance\n this.terminal = (this.options.terminal) ? this.options.terminal : new _Terminal(this.options.stream);\n\n // the current bar value\n this.value = 0;\n\n // bar start value (used for progress calculation)\n this.startValue = 0;\n\n // the end value of the bar\n this.total = 100;\n\n // last drawn string - only render on change!\n this.lastDrawnString = null;\n\n // start time (used for eta calculation)\n this.startTime = null;\n\n // stop time (used for duration calculation)\n this.stopTime = null;\n\n // last update time\n this.lastRedraw = Date.now();\n\n // default eta calculator (will be re-create on start)\n this.eta = new _ETA(this.options.etaBufferLength, 0, 0);\n\n // payload data\n this.payload = {};\n\n // progress bar active ?\n this.isActive = false;\n\n // use default formatter or custom one ?\n this.formatter = (typeof this.options.format === 'function') ? this.options.format : _formatter;\n }\n\n // internal render function\n render(forceRendering=false){\n\n // formatter params\n const params = {\n progress: this.getProgress(),\n eta: this.eta.getTime(),\n startTime: this.startTime,\n stopTime: this.stopTime,\n total: this.total,\n value: this.value,\n maxWidth: this.terminal.getWidth()\n };\n\n // automatic eta update ? (long running processes)\n if (this.options.etaAsynchronousUpdate){\n this.updateETA();\n }\n\n // format string\n const s = this.formatter(this.options, params, this.payload);\n\n const forceRedraw = forceRendering || this.options.forceRedraw\n // force redraw in notty-mode!\n || (this.options.noTTYOutput && !this.terminal.isTTY());\n\n // string changed ? only trigger redraw on change!\n if (forceRedraw || this.lastDrawnString != s){\n // trigger event\n this.emit('redraw-pre');\n\n // set cursor to start of line\n this.terminal.cursorTo(0, null);\n\n // write output\n this.terminal.write(s);\n\n // clear to the right from cursor\n this.terminal.clearRight();\n\n // store string\n this.lastDrawnString = s;\n\n // set last redraw time\n this.lastRedraw = Date.now();\n\n // trigger event\n this.emit('redraw-post');\n }\n }\n\n // start the progress bar\n start(total, startValue, payload){\n // set initial values\n this.value = startValue || 0;\n this.total = (typeof total !== 'undefined' && total >= 0) ? total : 100;\n\n // set start value for progress calculation\n this.startValue = (startValue || 0);\n\n // store payload (optional)\n this.payload = payload || {};\n\n // store start time for duration+eta calculation\n this.startTime = Date.now();\n\n // reset stop time for 're-start' scenario (used for duration calculation)\n this.stopTime = null;\n\n // reset string line buffer (redraw detection)\n this.lastDrawnString = '';\n\n // initialize eta buffer\n this.eta = new _ETA(this.options.etaBufferLength, this.startTime, this.value);\n\n // set flag\n this.isActive = true;\n\n // start event\n this.emit('start', total, startValue);\n }\n\n // stop the bar\n stop(){\n // set flag\n this.isActive = false;\n \n // store stop timestamp to get total duration\n this.stopTime = Date.now();\n\n // stop event\n this.emit('stop', this.total, this.value);\n }\n\n // update the bar value\n // update(value, payload)\n // update(payload)\n update(arg0, arg1 = {}){\n // value set ?\n // update(value, [payload]);\n if (typeof arg0 === 'number') {\n // update value\n this.value = arg0;\n\n // add new value; recalculate eta\n this.eta.update(Date.now(), arg0, this.total);\n }\n\n // extract payload\n // update(value, payload)\n // update(payload)\n const payloadData = ((typeof arg0 === 'object') ? arg0 : arg1) || {};\n\n // update event (before stop() is called)\n this.emit('update', this.total, this.value);\n\n // merge payload\n for (const key in payloadData){\n this.payload[key] = payloadData[key];\n }\n\n // limit reached ? autostop set ?\n if (this.value >= this.getTotal() && this.options.stopOnComplete) {\n this.stop();\n }\n }\n\n // calculate the actual progress value\n getProgress(){\n // calculate the normalized current progress\n let progress = (this.value/this.total);\n\n // use relative progress calculation ? range between startValue and total is then used as 100%\n // startValue (offset) is ignored for calculations\n if (this.options.progressCalculationRelative){\n progress = (this.value-this.startValue)/(this.total-this.startValue);\n }\n\n // handle NaN Errors caused by total=0. Set to complete in this case\n if (isNaN(progress)){\n progress = (this.options && this.options.emptyOnZero) ? 0.0 : 1.0;\n }\n\n // limiter\n progress = Math.min(Math.max(progress, 0.0), 1.0);\n\n return progress;\n }\n\n // update the bar value\n // increment(delta, payload)\n // increment(payload)\n increment(arg0 = 1, arg1 = {}){\n // increment([payload]) => step=1\n // handle the use case when `step` is omitted but payload is passed\n if (typeof arg0 === 'object') {\n this.update(this.value + 1, arg0);\n \n // increment([step=1], [payload={}])\n }else{\n this.update(this.value + arg0, arg1);\n }\n }\n\n // get the total (limit) value\n getTotal(){\n return this.total;\n }\n\n // set the total (limit) value\n setTotal(total){\n if (typeof total !== 'undefined' && total >= 0){\n this.total = total;\n }\n }\n\n // force eta calculation update (long running processes)\n updateETA(){\n // add new value; recalculate eta\n this.eta.update(Date.now(), this.value, this.total);\n }\n}\n","\n// ETA calculation\nclass ETA{\n\n constructor(length, initTime, initValue){\n // size of eta buffer\n this.etaBufferLength = length || 100;\n\n // eta buffer with initial values\n this.valueBuffer = [initValue];\n this.timeBuffer = [initTime];\n\n // eta time value\n this.eta = '0';\n }\n\n // add new values to calculation buffer\n update(time, value, total){\n this.valueBuffer.push(value);\n this.timeBuffer.push(time);\n\n // trigger recalculation\n this.calculate(total-value);\n }\n\n // fetch estimated time\n getTime(){\n return this.eta;\n }\n\n // eta calculation - request number of remaining events\n calculate(remaining){\n // get number of samples in eta buffer\n const currentBufferSize = this.valueBuffer.length;\n const buffer = Math.min(this.etaBufferLength, currentBufferSize);\n\n const v_diff = this.valueBuffer[currentBufferSize - 1] - this.valueBuffer[currentBufferSize - buffer];\n const t_diff = this.timeBuffer[currentBufferSize - 1] - this.timeBuffer[currentBufferSize - buffer];\n\n // get progress per ms\n const vt_rate = v_diff/t_diff;\n\n // strip past elements\n this.valueBuffer = this.valueBuffer.slice(-this.etaBufferLength);\n this.timeBuffer = this.timeBuffer.slice(-this.etaBufferLength);\n\n // eq: vt_rate *x = total\n const eta = Math.ceil(remaining/vt_rate/1000);\n\n // check values\n if (isNaN(eta)){\n this.eta = 'NULL';\n\n // +/- Infinity --- NaN already handled\n }else if (!isFinite(eta)){\n this.eta = 'INF';\n\n // > 10M s ? - set upper display limit ~115days (1e7/60/60/24)\n }else if (eta > 1e7){\n this.eta = 'INF';\n\n // negative ?\n }else if (eta < 0){\n this.eta = 0;\n\n }else{\n // assign\n this.eta = eta;\n }\n }\n}\n\nmodule.exports = ETA;","const _legacy = require('./legacy');\nconst _shades_classic = require('./shades-classic');\nconst _shades_grey = require('./shades-grey');\nconst _rect = require('./rect');\n\nmodule.exports = {\n legacy: _legacy,\n shades_classic: _shades_classic,\n shades_grey: _shades_grey,\n rect: _rect\n};","// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: 'progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '=',\n barIncompleteChar: '-'\n};","// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: ' {bar} {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591'\n};","\n// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: ' \\u001b[90m{bar}\\u001b[0m {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591'\n};","module.exports = {\n format: ' {bar}\\u25A0 {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u25A0',\n barIncompleteChar: ' '\n};","const _SingleBar = require('./lib/single-bar');\nconst _MultiBar = require('./lib/multi-bar');\nconst _Presets = require('./presets/index');\nconst _Formatter = require('./lib/formatter');\nconst _defaultFormatValue = require('./lib/format-value');\nconst _defaultFormatBar = require('./lib/format-bar');\nconst _defaultFormatTime = require('./lib/format-time');\n\n// sub-module access\nmodule.exports = {\n Bar: _SingleBar,\n SingleBar: _SingleBar,\n MultiBar: _MultiBar,\n Presets: _Presets,\n Format: {\n Formatter: _Formatter,\n BarFormat: _defaultFormatBar,\n ValueFormat: _defaultFormatValue,\n TimeFormat: _defaultFormatTime\n }\n};","const _GenericBar = require('./generic-bar');\nconst _options = require('./options');\n\n// Progress-Bar constructor\nmodule.exports = class SingleBar extends _GenericBar{\n\n constructor(options, preset){\n super(_options.parse(options, preset));\n\n // the update timer\n this.timer = null;\n\n // disable synchronous updates in notty mode\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.options.synchronousUpdate = false;\n }\n\n // update interval\n this.schedulingRate = (this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule);\n\n // callback used for gracefulExit\n this.sigintCallback = null;\n }\n\n // internal render function\n render(){\n // stop timer\n if (this.timer){\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n // run internal rendering\n super.render();\n\n // add new line in notty mode!\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.terminal.newline();\n }\n\n // next update\n this.timer = setTimeout(this.render.bind(this), this.schedulingRate);\n }\n\n update(current, payload){\n // timer inactive ?\n if (!this.timer) {\n return;\n }\n\n super.update(current, payload);\n\n // trigger synchronous update ?\n // check for throttle time \n if (this.options.synchronousUpdate && (this.lastRedraw + this.options.throttleTime*2) < Date.now()){\n // force update\n this.render();\n }\n }\n\n // start the progress bar\n start(total, startValue, payload){\n // progress updates are only visible in TTY mode!\n if (this.options.noTTYOutput === false && this.terminal.isTTY() === false){\n return;\n }\n\n // add handler to restore cursor settings (stop the bar) on SIGINT/SIGTERM ?\n if (this.sigintCallback === null && this.options.gracefulExit){\n this.sigintCallback = this.stop.bind(this);\n process.once('SIGINT', this.sigintCallback);\n process.once('SIGTERM', this.sigintCallback);\n }\n\n // save current cursor settings\n this.terminal.cursorSave();\n\n // hide the cursor ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(false);\n }\n\n // disable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(false);\n }\n\n // initialize bar\n super.start(total, startValue, payload);\n\n // redraw on start!\n this.render();\n }\n\n // stop the bar\n stop(){\n // timer inactive ?\n if (!this.timer) {\n return;\n }\n \n // remove sigint listener\n if (this.sigintCallback){\n process.removeListener('SIGINT', this.sigintCallback);\n process.removeListener('SIGTERM', this.sigintCallback);\n this.sigintCallback = null;\n }\n\n // trigger final rendering\n this.render();\n\n // restore state\n super.stop();\n\n // stop timer\n clearTimeout(this.timer);\n this.timer = null;\n\n // cursor hidden ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(true);\n }\n\n // re-enable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(true);\n }\n\n // restore cursor on complete (position + settings)\n this.terminal.cursorRestore();\n\n // clear line on complete ?\n if (this.options.clearOnComplete){\n this.terminal.cursorTo(0, null);\n this.terminal.clearLine();\n }else{\n // new line on complete\n this.terminal.newline();\n }\n }\n}","const _Terminal = require('./terminal');\nconst _BarElement = require('./generic-bar');\nconst _options = require('./options');\nconst _EventEmitter = require('events');\n\n// Progress-Bar constructor\nmodule.exports = class MultiBar extends _EventEmitter{\n\n constructor(options, preset){\n super();\n\n // list of bars\n this.bars = [];\n\n // parse+store options\n this.options = _options.parse(options, preset);\n\n // disable synchronous updates\n this.options.synchronousUpdate = false;\n\n // store terminal instance\n this.terminal = (this.options.terminal) ? this.options.terminal : new _Terminal(this.options.stream);\n\n // the update timer\n this.timer = null;\n\n // progress bar active ?\n this.isActive = false;\n\n // update interval\n this.schedulingRate = (this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule);\n\n // logging output buffer\n this.loggingBuffer = [];\n\n // callback used for gracefulExit\n this.sigintCallback = null;\n }\n\n // add a new bar to the stack\n create(total, startValue, payload, barOptions={}){\n // create new bar element and merge global options + overrides\n // use the same global terminal instance for all instances\n const bar = new _BarElement(Object.assign(\n {}, \n\n // global options\n this.options, \n\n // terminal instance\n {\n terminal: this.terminal\n },\n\n // overrides\n barOptions,\n ));\n\n // store bar\n this.bars.push(bar);\n\n // progress updates are only visible in TTY mode!\n if (this.options.noTTYOutput === false && this.terminal.isTTY() === false){\n return bar;\n }\n\n // add handler to restore cursor settings (stop the bar) on SIGINT/SIGTERM ?\n if (this.sigintCallback === null && this.options.gracefulExit){\n this.sigintCallback = this.stop.bind(this);\n process.once('SIGINT', this.sigintCallback);\n process.once('SIGTERM', this.sigintCallback);\n }\n \n // multiprogress already active ?\n if (!this.isActive){\n // hide the cursor ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(false);\n }\n\n // disable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(false);\n }\n \n // initialize update timer\n this.timer = setTimeout(this.update.bind(this), this.schedulingRate);\n }\n\n // set flag\n this.isActive = true;\n\n // start progress bar\n bar.start(total, startValue, payload);\n\n // trigger event\n this.emit('start');\n\n // return new instance\n return bar;\n }\n\n // remove a bar from the stack\n remove(bar){\n // find element\n const index = this.bars.indexOf(bar);\n\n // element found ?\n if (index < 0){\n return false;\n }\n\n // remove element\n this.bars.splice(index, 1);\n\n // force update\n this.update();\n\n // clear bottom\n this.terminal.newline();\n this.terminal.clearBottom();\n\n return true;\n }\n\n // internal update routine\n update(){\n // stop timer\n if (this.timer){\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n // trigger event\n this.emit('update-pre');\n \n // reset cursor\n this.terminal.cursorRelativeReset();\n\n // trigger event\n this.emit('redraw-pre');\n\n // content within logging buffer ?\n if (this.loggingBuffer.length > 0){\n this.terminal.clearLine();\n\n // flush logging buffer and write content to terminal\n while (this.loggingBuffer.length > 0){\n this.terminal.write(this.loggingBuffer.shift(), true);\n }\n }\n\n // update each bar\n for (let i=0; i< this.bars.length; i++){\n // add new line ?\n if (i > 0){\n this.terminal.newline();\n }\n\n // render\n this.bars[i].render();\n }\n\n // trigger event\n this.emit('redraw-post');\n\n // add new line in notty mode!\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.terminal.newline();\n this.terminal.newline();\n }\n\n // next update\n this.timer = setTimeout(this.update.bind(this), this.schedulingRate);\n\n // trigger event\n this.emit('update-post');\n\n // stop if stopOnComplete and all bars stopped\n if (this.options.stopOnComplete && !this.bars.find(bar => bar.isActive)) {\n this.stop();\n }\n }\n\n stop(){\n\n // stop timer\n clearTimeout(this.timer);\n this.timer = null;\n\n // remove sigint listener\n if (this.sigintCallback){\n process.removeListener('SIGINT', this.sigintCallback);\n process.removeListener('SIGTERM', this.sigintCallback);\n this.sigintCallback = null;\n }\n\n // set flag\n this.isActive = false;\n\n // cursor hidden ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(true);\n }\n\n // re-enable line wrpaping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(true);\n }\n\n // reset cursor\n this.terminal.cursorRelativeReset();\n\n // trigger event\n this.emit('stop-pre-clear');\n\n // clear line on complete ?\n if (this.options.clearOnComplete){\n // clear all bars\n this.terminal.clearBottom();\n \n // or show final progress ?\n }else{\n // update each bar\n for (let i=0; i< this.bars.length; i++){\n // add new line ?\n if (i > 0){\n this.terminal.newline();\n }\n\n // trigger final rendering\n this.bars[i].render();\n\n // stop\n this.bars[i].stop();\n }\n\n // new line on complete\n this.terminal.newline();\n }\n\n // trigger event\n this.emit('stop');\n }\n\n log(s){\n // push content into logging buffer\n this.loggingBuffer.push(s);\n }\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","/* eslint-env browser */\n\nconst level = (() => {\n\tif (!('navigator' in globalThis)) {\n\t\treturn 0;\n\t}\n\n\tif (globalThis.navigator.userAgentData) {\n\t\tconst brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium');\n\t\tif (brand && brand.version > 93) {\n\t\t\treturn 3;\n\t\t}\n\t}\n\n\tif (/\\b(Chrome|Chromium)\\//.test(globalThis.navigator.userAgent)) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n})();\n\nconst colorSupport = level !== 0 && {\n\tlevel,\n\thasBasic: true,\n\thas256: level >= 2,\n\thas16m: level >= 3,\n};\n\nconst supportsColor = {\n\tstdout: colorSupport,\n\tstderr: colorSupport,\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","#!/usr/bin/env node\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { Readable } from 'stream';\nimport readline from 'readline';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport spinners from './icons/cli/spinners.js';\nimport grab, { log } from '../dist/grab-api.es.js';\nimport { pathToFileURL, fileURLToPath } from 'url';\n\nimport cliProgress from 'cli-progress';\nimport chalk from 'chalk';\n// Use cli-spinners for spinner animations\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// --- ArgParser from grab-cli.js ---\nclass ArgParser {\n constructor() {\n this.commands = {};\n this.options = {};\n this.examples = [];\n this.helpText = '';\n this.versionText = '1.0.0';\n }\n usage(text) { this.helpText = text; return this; }\n command(pattern, desc, handler) {\n const match = pattern.match(/\\$0 <(\\w+)>/);\n if (match) this.commands[match[1]] = { desc, handler, required: true };\n return this;\n }\n option(name, opts = {}) { this.options[name] = opts; return this; }\n example(cmd, desc) { this.examples.push({ cmd, desc }); return this; }\n help() { return this; }\n alias(short, long) { if (this.options[long]) this.options[long].alias = short; return this; }\n version(v) { if (v) this.versionText = v; return this; }\n strict() { return this; }\n parseSync() {\n const args = process.argv.slice(2);\n const result = {};\n const positional = [];\n if (args.includes('--help') || args.includes('-h')) { this.showHelp(); process.exit(0); }\n if (args.includes('--version')) { console.log(this.versionText); process.exit(0); }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n const [key, value] = arg.split('=');\n const optName = key.slice(2);\n if (value !== undefined) {\n result[optName] = this.coerceValue(optName, value);\n } else if (this.options[optName]?.type === 'boolean') {\n result[optName] = true;\n } else {\n const nextArg = args[i + 1];\n if (nextArg && !nextArg.startsWith('-')) {\n result[optName] = this.coerceValue(optName, nextArg);\n i++;\n } else {\n result[optName] = true;\n }\n }\n } else if (arg.startsWith('-') && arg.length === 2) {\n const shortFlag = arg[1];\n const longName = this.findLongName(shortFlag);\n if (longName) {\n if (this.options[longName]?.type === 'boolean') {\n result[longName] = true;\n } else {\n const nextArg = args[i + 1];\n if (nextArg && !nextArg.startsWith('-')) {\n result[longName] = this.coerceValue(longName, nextArg);\n i++;\n }\n }\n }\n } else {\n positional.push(arg);\n }\n }\n if (positional.length > 0) result.urls = positional;\n Object.keys(this.options).forEach(key => {\n if (result[key] === undefined && this.options[key].default !== undefined) {\n result[key] = this.options[key].default;\n }\n });\n if ((!result.urls || result.urls.length === 0) && this.commands.url?.required) {\n console.error('Error: Missing required argument: url');\n this.showHelp();\n process.exit(1);\n }\n return result;\n }\n coerceValue(optName, value) {\n const opt = this.options[optName];\n if (!opt) return value;\n if (opt.coerce) return opt.coerce(value);\n switch (opt.type) {\n case 'number': return Number(value);\n case 'boolean': return value === 'true' || value === '1';\n default: return value;\n }\n }\n findLongName(shortFlag) {\n return Object.keys(this.options).find(key => this.options[key].alias === shortFlag);\n }\n showHelp() {\n console.log(this.helpText || 'Usage: grab <url> [options]');\n console.log('\\nPositional arguments:');\n Object.keys(this.commands).forEach(cmd => {\n console.log(` ${cmd.padEnd(20)} ${this.commands[cmd].desc}`);\n });\n console.log('\\nOptions:');\n Object.keys(this.options).forEach(key => {\n const opt = this.options[key];\n const flags = opt.alias ? `-${opt.alias}, --${key}` : `--${key}`;\n console.log(` ${flags.padEnd(20)} ${opt.describe || ''}`);\n });\n if (this.examples.length > 0) {\n console.log('\\nExamples:');\n this.examples.forEach(ex => {\n console.log(` ${ex.cmd}`);\n console.log(` ${ex.desc}`);\n });\n }\n }\n}\n\n// --- Helper: Detect if a URL is a file download ---\nfunction isFileUrl(url) {\n // Heuristic: ends with a file extension (e.g., .zip, .mp4, .tar.gz, .pdf, etc)\n return /\\.[a-zA-Z0-9]{1,5}(?:\\.[a-zA-Z0-9]{1,5})*$/.test(url.split('?')[0]);\n}\n\nexport class ColorFileDownloader {\nconstructor() {\n this.progressBar = null;\n this.multiBar = null;\n this.loadingSpinner = null;\n this.abortController = null;\n \n // Column width constants for alignment\n this.COL_FILENAME = 25;\n this.COL_SPINNER = 2;\n this.COL_BAR = 15;\n this.COL_PERCENT = 4;\n this.COL_DOWNLOADED = 16;\n this.COL_TOTAL = 10;\n this.COL_SPEED = 10;\n this.COL_ETA = 10;\n \n this.colors = {\n primary: chalk.cyan,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n info: chalk.blue,\n purple: chalk.magenta,\n pink: chalk.magentaBright,\n yellow: chalk.yellowBright,\n cyan: chalk.cyanBright,\n green: chalk.green,\n gradient: [\n chalk.blue,\n chalk.magenta,\n chalk.cyan,\n chalk.green,\n chalk.yellow,\n chalk.red\n ]\n };\n\n // ANSI color codes for progress bars\n this.barColors = [\n '\\u001b[32m', // green\n '\\u001b[33m', // yellow\n '\\u001b[34m', // blue\n '\\u001b[35m', // magenta\n '\\u001b[36m', // cyan\n '\\u001b[91m', // bright red\n '\\u001b[92m', // bright green\n '\\u001b[93m', // bright yellow\n '\\u001b[94m', // bright blue\n '\\u001b[95m', // bright magenta\n '\\u001b[96m' // bright cyan\n ];\n\n this.barGlueColors = [\n '\\u001b[31m', // red\n '\\u001b[33m', // yellow\n '\\u001b[35m', // magenta\n '\\u001b[37m', // white\n '\\u001b[90m', // gray\n '\\u001b[93m', // bright yellow\n '\\u001b[97m' // bright white\n ];\n \n // Available spinner types for random selection (from spinners.json)\n this.spinnerTypes = Object.keys(spinners.default || spinners);\n \n // Initialize state directory\n this.stateDir = this.getStateDirectory();\n this.ensureStateDirectoryExists();\n this.isPaused = false;\n this.pauseCallback = null;\n this.resumeCallback = null;\n this.abortControllers = [];\n \n // Initialize global keyboard listener\n this.keyboardListener = null;\n this.isAddingUrl = false;\n}\n\n/**\n * Get state directory from environment variable or use default\n * @returns {string} State directory path\n */\ngetStateDirectory() {\n return process.env.GRAB_DOWNLOAD_STATE_DIR || path.join(process.cwd(), '.grab-downloads');\n}\n\n/**\n * Ensure state directory exists\n */\nensureStateDirectoryExists() {\n try {\n if (!fs.existsSync(this.stateDir)) {\n fs.mkdirSync(this.stateDir, { recursive: true });\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not create state directory, using current directory'));\n this.stateDir = process.cwd();\n }\n}\n\n/**\n * Get state file path for a given output path\n * @param {string} outputPath - The output file path\n * @returns {string} State file path\n */\ngetStateFilePath(outputPath) {\n const stateFileName = path.basename(outputPath) + '.download-state';\n return path.join(this.stateDir, stateFileName);\n}\n\n/**\n * Clean up state file\n * @param {string} stateFilePath - Path to state file\n */\ncleanupStateFile(stateFilePath) {\n try {\n if (fs.existsSync(stateFilePath)) {\n fs.unlinkSync(stateFilePath);\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not clean up state file'));\n }\n}\n\n/**\n * Print aligned header row for progress bars\n */\nprintHeaderRow() {\n console.log(\n this.colors.success('📈 %'.padEnd(this.COL_PERCENT)) +\n this.colors.yellow('📁 Files'.padEnd(this.COL_FILENAME)) +\n this.colors.cyan('🔄'.padEnd(this.COL_SPINNER)) +\n ' ' +\n this.colors.green('📊 Progress'.padEnd(this.COL_BAR + 1)) +\n this.colors.info('📥 Downloaded'.padEnd(this.COL_DOWNLOADED)) +\n this.colors.info('📦 Total'.padEnd(this.COL_TOTAL)) +\n this.colors.purple('⚡ Speed'.padEnd(this.COL_SPEED)) +\n this.colors.pink('⏱️ ETA'.padEnd(this.COL_ETA))\n );\n}\n\n/**\n * Get random ora spinner type (for ora spinners)\n * @returns {string} Random ora spinner name\n */\ngetRandomOraSpinner() {\n return this.spinnerTypes[Math.floor(Math.random() * this.spinnerTypes.length)];\n}\n\n/**\n * Get random bar color\n * @returns {string} ANSI color code\n */\ngetRandomBarColor() {\n return this.barColors[Math.floor(Math.random() * this.barColors.length)];\n}\n\n/**\n * Get random bar glue color\n * @returns {string} ANSI color code\n */\ngetRandomBarGlueColor() {\n return this.barGlueColors[Math.floor(Math.random() * this.barGlueColors.length)];\n}\n\n/**\n * Get random spinner type\n */\ngetRandomSpinner() {\n return this.spinnerTypes[Math.floor(Math.random() * this.spinnerTypes.length)];\n}\n\n/**\n * Get spinner frames for a given spinner type\n * @param {string} spinnerType - The spinner type name\n * @returns {array} Array of spinner frame characters\n */\ngetSpinnerFrames(spinnerType) {\n const spinnerData = spinners.default || spinners;\n const spinner = spinnerData[spinnerType];\n \n if (spinner && spinner.frames) {\n return spinner.frames;\n }\n \n // Fallback to dots if spinner not found\n return spinnerData.dots?.frames || ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n}\n\n/**\n * Get the visual width of a spinner frame (accounting for multi-char emojis)\n * @param {string} frame - The spinner frame\n * @returns {number} Visual width\n */\ngetSpinnerWidth(frame) {\n // Count visual width - emojis and some unicode chars take 2 spaces\n let width = 0;\n for (const char of frame) {\n const code = char.codePointAt(0);\n // Emoji range check and other wide characters\n if ((code >= 0x1F000 && code <= 0x1F6FF) || // Miscellaneous Symbols and Pictographs\n (code >= 0x1F300 && code <= 0x1F5FF) || // Miscellaneous Symbols\n (code >= 0x1F600 && code <= 0x1F64F) || // Emoticons\n (code >= 0x1F680 && code <= 0x1F6FF) || // Transport and Map\n (code >= 0x1F700 && code <= 0x1F77F) || // Alchemical Symbols\n (code >= 0x1F780 && code <= 0x1F7FF) || // Geometric Shapes Extended\n (code >= 0x1F800 && code <= 0x1F8FF) || // Supplemental Arrows-C\n (code >= 0x2600 && code <= 0x26FF) || // Miscellaneous Symbols\n (code >= 0x2700 && code <= 0x27BF)) { // Dingbats\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\n/**\n * Calculate dynamic bar size based on spinner width and terminal width\n * @param {string} spinnerFrame - Current spinner frame\n * @param {number} baseBarSize - Base bar size\n * @returns {number} Adjusted bar size\n */\ncalculateBarSize(spinnerFrame, baseBarSize = 20) {\n const terminalWidth = process.stdout.columns || 120;\n const spinnerWidth = this.getSpinnerWidth(spinnerFrame);\n \n // Account for other UI elements: percentage (4), progress (20), speed (10), ETA (15), spaces and colors (10)\n const otherElementsWidth = 59;\n const filenameWidth = 20; // Truncated filename width\n \n const availableWidth = terminalWidth - otherElementsWidth - filenameWidth - spinnerWidth;\n \n // Ensure minimum bar size\n const adjustedBarSize = Math.max(10, Math.min(baseBarSize, availableWidth));\n \n return adjustedBarSize;\n}\n\n/**\n * Check if server supports resumable downloads\n * @param {string} url - The URL to check\n * @returns {Object} - Server support info and headers\n */\nasync checkServerSupport(url) {\n try {\n const response = await fetch(url, { \n method: 'HEAD',\n signal: this.abortController?.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n \n const acceptRanges = response.headers.get('accept-ranges');\n const contentLength = response.headers.get('content-length');\n const lastModified = response.headers.get('last-modified');\n const etag = response.headers.get('etag');\n \n return {\n supportsResume: acceptRanges === 'bytes',\n totalSize: contentLength ? parseInt(contentLength, 10) : 0,\n lastModified,\n etag,\n headers: response.headers\n };\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not check server resume support, proceeding with regular download'));\n return {\n supportsResume: false,\n totalSize: 0,\n lastModified: null,\n etag: null,\n headers: null\n };\n }\n}\n\n/**\n * Load download state from file\n * @param {string} stateFilePath - Path to state file\n * @returns {Object} - Download state\n */\nloadDownloadState(stateFilePath) {\n try {\n if (fs.existsSync(stateFilePath)) {\n const stateData = fs.readFileSync(stateFilePath, 'utf8');\n return JSON.parse(stateData);\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not load download state, starting fresh'));\n }\n return null;\n}\n\n/**\n * Save download state to file\n * @param {string} stateFilePath - Path to state file\n * @param {Object} state - Download state\n */\nsaveDownloadState(stateFilePath, state) {\n try {\n fs.writeFileSync(stateFilePath, JSON.stringify(state, null, 2));\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not save download state'));\n }\n}\n\n/**\n * Get partial file size\n * @param {string} filePath - Path to partial file\n * @returns {number} - Size of partial file\n */\ngetPartialFileSize(filePath) {\n try {\n if (fs.existsSync(filePath)) {\n const stats = fs.statSync(filePath);\n return stats.size;\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not read partial file size'));\n }\n return 0;\n}\n\n/**\n * Get random gradient color\n */\ngetRandomColor() {\n return this.colors.gradient[Math.floor(Math.random() * this.colors.gradient.length)];\n}\n\n/**\n * Format bytes into human readable format with proper MB/GB units using 1024 base\n * @param {number} bytes - Number of bytes\n * @param {number} decimals - Number of decimal places\n * @returns {string} Formatted string\n */\nformatBytes(bytes, decimals = 2) {\n if (bytes === 0) return this.colors.info('0 B');\n \n const k = 1024; // Use 1024 for binary calculations\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\n { unit: 'B', color: this.colors.info },\n { unit: 'KB', color: this.colors.cyan },\n { unit: 'MB', color: this.colors.yellow },\n { unit: 'GB', color: this.colors.purple },\n { unit: 'TB', color: this.colors.pink },\n { unit: 'PB', color: this.colors.primary }\n ];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n const size = sizes[i] || sizes[sizes.length - 1];\n \n return size.color.bold(`${value} ${size.unit}`);\n}\n\n/**\n * Format bytes for progress display (without colors for progress bar)\n * @param {number} bytes - Number of bytes\n * @param {number} decimals - Number of decimal places\n * @returns {string} Formatted string without colors\n */\nformatBytesPlain(bytes, decimals = 1) {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n \n return `${value} ${sizes[i] || sizes[sizes.length - 1]}`;\n}\n\n/**\n * Format bytes for progress display (compact version for tight layouts)\n * @param {number} bytes - Number of bytes\n * @returns {string} Formatted string in compact format\n */\nformatBytesCompact(bytes) {\n if (bytes === 0) return '0B';\n \n const k = 1024;\n const kb = bytes / k;\n \n // If below 100KB, show in KB with whole numbers\n if (kb < 100) {\n const value = Math.round(kb);\n return `${value}KB`;\n }\n \n // Otherwise show in MB with 1 decimal place (without \"MB\" text)\n const mb = bytes / (k * k);\n const value = mb.toFixed(1);\n return `${value}`;\n}\n\n/**\n * Truncate filename for display\n * @param {string} filename - Original filename\n * @param {number} maxLength - Maximum length\n * @returns {string} Truncated filename\n */\ntruncateFilename(filename, maxLength = 25) {\n if (filename.length <= maxLength) return filename.padEnd(maxLength);\n \n const extension = path.extname(filename);\n const baseName = path.basename(filename, extension);\n \n if (baseName.length <= 3) {\n return filename.padEnd(maxLength);\n }\n \n // Show first few and last few characters with ellipsis in middle\n const firstPart = Math.ceil((maxLength - extension.length - 3) / 2);\n const lastPart = Math.floor((maxLength - extension.length - 3) / 2);\n \n const truncatedBase = baseName.substring(0, firstPart) + '...' + baseName.substring(baseName.length - lastPart);\n return `${truncatedBase}${extension}`.padEnd(maxLength);\n}\n\n/**\n * Format ETA time in hours:minutes:seconds format\n * @param {number} seconds - ETA in seconds\n * @returns {string} Formatted ETA string (padded to consistent width)\n */\nformatETA(seconds) {\n if (!seconds || seconds === Infinity || seconds < 0) return ' -- ';\n \n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.round(seconds % 60);\n \n return `${hours}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`.padEnd(this.COL_ETA);\n}\n\n/**\n * Format progress for master bar showing sum of all downloads\n * @param {number} totalDownloaded - Total downloaded bytes across all files\n * @param {number} totalSize - Total size bytes across all files\n * @returns {string} Formatted progress string showing sums in MB\n */\nformatMasterProgress(totalDownloaded, totalSize) {\n const k = 1024;\n const totalDownloadedMB = totalDownloaded / (k * k);\n const totalSizeMB = totalSize / (k * k);\n \n if (totalSizeMB >= 1024) {\n const totalDownloadedGB = totalDownloadedMB / 1024;\n const totalSizeGB = totalSizeMB / 1024;\n return `${totalDownloadedGB.toFixed(1)}GB`.padEnd(this.COL_DOWNLOADED);\n }\n \n return `${totalDownloadedMB.toFixed(1)}MB`.padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format progress display with consistent width\n * @param {number} downloaded - Downloaded bytes\n * @param {number} total - Total bytes\n * @returns {string} Formatted progress string\n */\nformatProgress(downloaded, total) {\n const downloadedStr = this.formatBytesCompact(downloaded);\n return downloadedStr.padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format downloaded bytes for display\n * @param {number} downloaded - Downloaded bytes\n * @returns {string} Formatted downloaded string\n */\nformatDownloaded(downloaded) {\n return this.formatBytesCompact(downloaded).padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format total bytes for display (separate column)\n * @param {number} total - Total bytes\n * @returns {string} Formatted total string\n */\nformatTotalDisplay(total) {\n if (total === 0) return '0MB'.padEnd(this.COL_TOTAL);\n \n const k = 1024;\n const mb = total / (k * k);\n \n if (mb >= 1024) {\n const gb = mb / 1024;\n return `${gb.toFixed(1)}GB`.padEnd(this.COL_TOTAL);\n }\n \n // For files smaller than 1MB, show in MB with decimal\n if (mb < 1) {\n return `${mb.toFixed(2)}MB`.padEnd(this.COL_TOTAL);\n }\n \n return `${mb.toFixed(1)}MB`.padEnd(this.COL_TOTAL);\n}\n\n/**\n * Format total bytes for display (MB/GB format)\n * @param {number} total - Total bytes\n * @returns {string} Formatted total string\n */\nformatTotal(total) {\n if (total === 0) return '0MB'.padEnd(this.COL_TOTAL);\n \n const k = 1024;\n const mb = total / (k * k);\n \n if (mb >= 1024) {\n const gb = mb / 1024;\n return `${gb.toFixed(1)}GB`.padEnd(this.COL_TOTAL);\n }\n \n // For files smaller than 1MB, show in MB with decimal\n if (mb < 1) {\n return `${mb.toFixed(2)}MB`.padEnd(this.COL_TOTAL);\n }\n \n return `${mb.toFixed(1)}MB`.padEnd(this.COL_TOTAL);\n}\n\n/**\n * Format speed display with consistent width\n * @param {string} speed - Speed string\n * @returns {string} Formatted speed string\n */\nformatSpeed(speed) {\n return speed.padEnd(this.COL_SPEED);\n}\n\n/**\n * Format speed for display (MB/s without \"MB\" text unless below 100KB/s)\n * @param {number} bytesPerSecond - Speed in bytes per second\n * @returns {string} Formatted speed string\n */\nformatSpeedDisplay(bytesPerSecond) {\n if (bytesPerSecond === 0) return '0B';\n \n const k = 1024;\n const kbPerSecond = bytesPerSecond / k;\n \n // If below 100KB/s, show in KB with whole numbers\n if (kbPerSecond < 100) {\n const formattedValue = Math.round(kbPerSecond);\n return `${formattedValue}KB`;\n }\n \n // Otherwise show in MB with 1 decimal place (without \"MB\" text)\n const mbPerSecond = bytesPerSecond / (k * k);\n const formattedValue = mbPerSecond.toFixed(1);\n return `${formattedValue}`;\n}\n\n/**\n * Format speed for total display (MB/s without \"MB\" text unless below 100KB/s)\n * @param {number} bytesPerSecond - Speed in bytes per second\n * @returns {string} Formatted speed string\n */\nformatTotalSpeed(bytesPerSecond) {\n return this.formatSpeedDisplay(bytesPerSecond).padEnd(this.COL_SPEED);\n}\n\n/**\n * Download multiple files with multibar progress tracking\n * @param {Array} downloads - Array of {url, outputPath, filename} objects\n */\nasync downloadMultipleFiles(downloads) {\n try {\n // Set up global keyboard listener for pause/resume and add URL BEFORE starting downloads\n this.setupGlobalKeyboardListener();\n \n // Print header row with emojis\n // this.printHeaderRow();\n\n // Show keyboard shortcut info for pause/resume in multibar view\n // console.log(this.colors.info('💡 [p] pause/resume downloads, [a] add URL.'));\n\n // Get random colors for the multibar\n const masterBarColor = this.getRandomBarColor();\n const masterBarGlue = this.getRandomBarGlueColor();\n\n // Create multibar container with compact format and random colors\n this.multiBar = new cliProgress.MultiBar({\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n masterBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n hideCursor: true,\n clearOnComplete: false,\n stopOnComplete: true,\n autopadding: false,\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: masterBarGlue,\n barsize: this.COL_BAR\n });\n\n // Track overall progress for master bar\n let totalDownloaded = 0;\n let totalSize = 0;\n let individualSpeeds = new Array(downloads.length).fill(0);\n let individualSizes = new Array(downloads.length).fill(0);\n let individualDownloaded = new Array(downloads.length).fill(0);\n let individualStartTimes = new Array(downloads.length).fill(Date.now());\n let lastSpeedUpdate = Date.now();\n let lastIndividualDownloaded = new Array(downloads.length).fill(0);\n let lastTotalUpdate = Date.now();\n let lastTotalDownloaded = 0;\n \n // Calculate total size from all downloads\n const totalSizeFromDownloads = downloads.reduce((sum, download) => {\n // Estimate size based on filename or use a default\n const estimatedSize = download.estimatedSize || 1024 * 1024 * 100; // 100MB default\n return sum + estimatedSize;\n }, 0);\n totalSize = totalSizeFromDownloads;\n \n // Track actual total size as we discover file sizes\n let actualTotalSize = 0;\n\n // Set up interval to update speeds every second\n const speedUpdateInterval = setInterval(() => {\n const now = Date.now();\n const timeSinceLastUpdate = (now - lastSpeedUpdate) / 1000; // seconds\n \n // Update individual speeds based on incremental download since last update\n for (let i = 0; i < downloads.length; i++) {\n if (timeSinceLastUpdate > 0) {\n const incrementalDownloaded = individualDownloaded[i] - lastIndividualDownloaded[i];\n individualSpeeds[i] = incrementalDownloaded / timeSinceLastUpdate;\n \n if (fileBars[i] && fileBars[i].bar) {\n const speed = this.formatSpeed(this.formatSpeedDisplay(individualSpeeds[i]));\n const eta = individualSizes[i] > 0 ? \n this.formatETA((individualSizes[i] - individualDownloaded[i]) / individualSpeeds[i]) : \n this.formatETA(0);\n \n fileBars[i].bar.update(individualDownloaded[i], {\n speed: speed,\n progress: this.formatProgress(individualDownloaded[i], individualSizes[i]),\n downloadedDisplay: this.formatBytesCompact(individualDownloaded[i]),\n totalDisplay: this.formatTotalDisplay(individualSizes[i]),\n etaFormatted: eta\n });\n }\n }\n }\n \n // Update last values for next calculation\n lastSpeedUpdate = now;\n lastIndividualDownloaded = [...individualDownloaded];\n \n // Calculate total speed\n const totalSpeedBps = individualSpeeds.reduce((sum, speed) => sum + speed, 0);\n \n // Calculate total downloaded from individual files\n const totalDownloadedFromFiles = individualDownloaded.reduce((sum, downloaded) => sum + downloaded, 0);\n \n // Calculate time elapsed since start\n const timeElapsed = (now - individualStartTimes[0]) / 1000; // seconds since first download started\n \n // Update master bar\n const totalEta = totalSize > 0 && totalSpeedBps > 0 ? \n this.formatETA((totalSize - totalDownloadedFromFiles) / totalSpeedBps) : \n this.formatETA(0);\n \n const totalPercentage = totalSize > 0 ? \n Math.round((totalDownloadedFromFiles / totalSize) * 100) : 0;\n \n // Calculate actual total size from discovered individual file sizes\n const discoveredTotalSize = individualSizes.reduce((sum, size) => sum + size, 0);\n const displayTotalSize = discoveredTotalSize > 0 ? discoveredTotalSize : totalSize;\n \n masterBar.update(totalDownloadedFromFiles, {\n speed: this.formatTotalSpeed(totalSpeedBps),\n progress: this.formatMasterProgress(totalDownloadedFromFiles, displayTotalSize),\n downloadedDisplay: this.formatBytesCompact(totalDownloadedFromFiles),\n totalDisplay: this.formatTotalDisplay(displayTotalSize),\n etaFormatted: this.formatETA(timeElapsed), // Show time elapsed instead of ETA\n percentage: displayTotalSize > 0 ? \n Math.round((totalDownloadedFromFiles / displayTotalSize) * 100) : 0\n });\n }, 1000);\n \n // Create master progress bar with more compact format and special colors\n const masterSpinnerWidth = this.getSpinnerWidth('⬇️');\n const masterMaxFilenameLength = this.COL_FILENAME - masterSpinnerWidth;\n const masterBarSize = this.calculateBarSize('⬇️', this.COL_BAR);\n const masterBar = this.multiBar.create(totalSize, 0, {\n filename: 'Total'.padEnd(masterMaxFilenameLength),\n spinner: '⬇️',\n speed: '0B'.padEnd(this.COL_SPEED),\n progress: this.formatMasterProgress(0, totalSize),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(totalSize),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(this.COL_PERCENT - 1)\n }, {\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.yellow.bold('{filename}') + ' ' +\n this.colors.success('{spinner}') + ' ' + \n '\\u001b[92m{bar}\\u001b[0m' + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '▶',\n barIncompleteChar: '▷',\n barGlue: '\\u001b[33m',\n barsize: masterBarSize\n });\n\n // Create individual progress bars for each download\n const fileBars = downloads.map((download, index) => {\n const spinnerType = this.getRandomSpinner();\n const spinnerFrames = this.getSpinnerFrames(spinnerType);\n \n // Calculate spinner width to adjust filename padding\n const spinnerWidth = this.getSpinnerWidth(spinnerFrames[0]);\n const maxFilenameLength = this.COL_FILENAME - spinnerWidth; // Adjust filename length based on spinner width\n const truncatedName = this.truncateFilename(download.filename, maxFilenameLength);\n \n // Get random colors for this file's progress bar\n const fileBarColor = this.getRandomBarColor();\n const fileBarGlue = this.getRandomBarGlueColor();\n \n // Calculate bar size based on spinner width\n const barSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n \n return {\n bar: this.multiBar.create(100, 0, {\n filename: truncatedName,\n spinner: spinnerFrames[0],\n speed: this.formatSpeed('0B'),\n progress: this.formatProgress(0, 0),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(3)\n }, {\n format: this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n fileBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.success('{percentage}%') + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: fileBarGlue,\n barsize: barSize\n }),\n spinnerFrames,\n spinnerIndex: 0,\n lastSpinnerUpdate: Date.now(),\n lastFrameUpdate: Date.now(),\n download: { ...download, index }\n };\n });\n\n // Start all downloads concurrently\n const downloadPromises = fileBars.map(async (fileBar, index) => {\n try {\n await this.downloadSingleFileWithBar(fileBar, masterBar, downloads.length, {\n totalDownloaded,\n totalSize,\n individualSpeeds,\n individualSizes,\n individualDownloaded,\n individualStartTimes,\n lastTotalUpdate,\n lastTotalDownloaded,\n actualTotalSize\n });\n return { success: true, index, filename: fileBar.download.filename };\n } catch (error) {\n return { success: false, index, filename: fileBar.download.filename, error };\n }\n });\n\n // Wait for all downloads to complete\n const results = await Promise.allSettled(downloadPromises);\n\n // Clear the speed update interval\n clearInterval(speedUpdateInterval);\n\n // Stop multibar\n this.multiBar.stop();\n\n // Display results\n const successful = results.filter(r => r.status === 'fulfilled' && r.value.success).length;\n const failed = results.length - successful;\n\n if (failed > 0) {\n console.log(this.colors.error(`❌ Failed: ${failed}/${downloads.length}`));\n \n results.forEach((result, index) => {\n if (result.status === 'rejected' || !result.value.success) {\n const filename = downloads[index].filename;\n const error = result.reason || result.value?.error || 'Unknown error';\n console.log(this.colors.error(` • ${filename}: ${error.message || error}`));\n }\n });\n }\n \n // Random celebration emoji\n const celebrationEmojis = ['🥳', '🎊', '🎈', '🌟', '💯', '🚀', '✨', '🔥'];\n const randomEmoji = celebrationEmojis[Math.floor(Math.random() * celebrationEmojis.length)];\n console.log(this.colors.green(`${randomEmoji} Success: ${successful}/${downloads.length}`));\n\n this.clearAbortControllers();\n \n let pausedMessageShown = false;\n \n this.setPauseCallback(() => {\n if (!pausedMessageShown) {\n this.multiBar.stop();\n console.log(this.colors.warning('⏸️ Paused. Press p to resume, a to add URL.'));\n pausedMessageShown = true;\n }\n });\n \n this.setResumeCallback(() => {\n if (pausedMessageShown) {\n console.log(this.colors.success('▶️ Resumed. Press p to pause, a to add URL.'));\n pausedMessageShown = false;\n }\n });\n\n } catch (error) {\n if (this.multiBar) {\n this.multiBar.stop();\n }\n console.error(this.colors.error.bold('💥 Batch download failed: ') + this.colors.warning(error.message));\n throw error;\n }\n}\n\n/**\n * Download a single file with multibar integration and resume capability\n * @param {Object} fileBar - File bar object with progress bar and spinner info\n * @param {Object} masterBar - Master progress bar\n * @param {number} totalFiles - Total number of files being downloaded\n * @param {Object} totalTracking - Object to track total progress\n */\nasync downloadSingleFileWithBar(fileBar, masterBar, totalFiles, totalTracking) {\n const { bar, spinnerFrames, download } = fileBar;\n const { url, outputPath, filename } = download;\n const stateFilePath = this.getStateFilePath(outputPath);\n const tempFilePath = outputPath + '.tmp';\n\n try {\n // Create abort controller for this download\n const abortController = new AbortController();\n this.setAbortController(abortController);\n \n // Check server support and get file info\n const serverInfo = await this.checkServerSupport(url);\n \n // Load previous download state\n const previousState = this.loadDownloadState(stateFilePath);\n \n // Check if we have a partial file\n const partialSize = this.getPartialFileSize(tempFilePath);\n \n let startByte = 0;\n let resuming = false;\n \n if (serverInfo.supportsResume && partialSize > 0 && previousState) {\n // Validate that the file hasn't changed on server\n const fileUnchanged = \n (!serverInfo.lastModified || serverInfo.lastModified === previousState.lastModified) &&\n (!serverInfo.etag || serverInfo.etag === previousState.etag) &&\n (serverInfo.totalSize === previousState.totalSize);\n \n if (fileUnchanged && partialSize < serverInfo.totalSize) {\n startByte = partialSize;\n resuming = true;\n } else {\n // Clean up partial file and state\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n this.cleanupStateFile(stateFilePath);\n }\n } else if (partialSize > 0) {\n // Server doesn't support resume, clean up partial file\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n }\n\n // Prepare request headers\n const headers = {};\n if (resuming && startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n // Make the fetch request\n const response = await fetch(url, {\n headers,\n signal: abortController.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Get the total file size\n const contentLength = response.headers.get('content-length');\n const totalSize = resuming ? serverInfo.totalSize : (contentLength ? parseInt(contentLength, 10) : 0);\n\n // Save download state\n const downloadState = {\n url,\n outputPath,\n totalSize,\n startByte,\n lastModified: serverInfo.lastModified,\n etag: serverInfo.etag,\n timestamp: new Date().toISOString()\n };\n this.saveDownloadState(stateFilePath, downloadState);\n\n // Update bar with file size info\n bar.setTotal(totalSize || 100);\n bar.update(startByte, {\n progress: this.formatProgress(startByte, totalSize),\n downloadedDisplay: this.formatBytesCompact(startByte),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n\n // Create write stream (append mode if resuming)\n const writeStream = fs.createWriteStream(tempFilePath, { \n flags: resuming ? 'a' : 'w' \n });\n \n // Track progress\n let downloaded = startByte;\n let lastTime = Date.now();\n let lastDownloaded = downloaded;\n\n // Create progress stream\n const progressStream = new Readable({\n read() {}\n });\n\n const reader = response.body.getReader();\n \n const processChunk = async () => {\n try {\n while (true) {\n // Check for pause state\n while (this.isPaused) {\n await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100ms before checking again\n }\n \n const { done, value } = await reader.read();\n \n if (done) {\n progressStream.push(null);\n break;\n }\n\n downloaded += value.length;\n \n const now = Date.now();\n const timeDiff = (now - lastTime) / 1000;\n\n // Update spinner frame every 150ms for smooth animation\n if (now - fileBar.lastFrameUpdate >= 150) {\n fileBar.spinnerIndex = (fileBar.spinnerIndex + 1) % spinnerFrames.length;\n fileBar.lastFrameUpdate = now;\n \n // Recalculate bar size when spinner changes\n const currentSpinner = spinnerFrames[fileBar.spinnerIndex];\n const newBarSize = this.calculateBarSize(currentSpinner, this.COL_BAR);\n bar.options.barsize = newBarSize;\n }\n\n // Change spinner type every 45 seconds\n if (now - fileBar.lastSpinnerUpdate >= 45000) {\n const newSpinnerType = this.getRandomSpinner();\n fileBar.spinnerFrames = this.getSpinnerFrames(newSpinnerType);\n fileBar.spinnerIndex = 0;\n fileBar.lastSpinnerUpdate = now;\n }\n\n if (timeDiff >= 0.3) { // Update every 300ms for smoother animation\n bar.update(downloaded, {\n spinner: spinnerFrames[fileBar.spinnerIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n \n // Update total tracking\n if (totalTracking) {\n const bytesDiff = downloaded - lastDownloaded;\n totalTracking.totalDownloaded += bytesDiff;\n \n // Update individual downloaded amount and size for this file\n const fileIndex = fileBar.download.index || 0;\n totalTracking.individualDownloaded[fileIndex] = downloaded;\n totalTracking.individualSizes[fileIndex] = totalSize;\n \n // Calculate total size from all individual sizes\n totalTracking.totalSize = totalTracking.individualSizes.reduce((sum, size) => sum + size, 0);\n \n // Update actual total size for master bar display\n if (totalTracking.actualTotalSize !== undefined) {\n totalTracking.actualTotalSize = totalTracking.totalSize;\n }\n \n // Update master bar total if this is the first time we're getting the actual size\n if (totalSize > 0 && totalTracking.individualSizes[fileIndex] === totalSize) {\n masterBar.setTotal(totalTracking.totalSize);\n }\n }\n \n lastTime = now;\n lastDownloaded = downloaded;\n } else {\n bar.update(downloaded, {\n spinner: spinnerFrames[fileBar.spinnerIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n }\n\n progressStream.push(Buffer.from(value));\n }\n } catch (error) {\n progressStream.destroy(error);\n }\n };\n\n processChunk();\n await pipeline(progressStream, writeStream);\n\n // Move temp file to final location\n if (fs.existsSync(outputPath)) {\n fs.unlinkSync(outputPath);\n }\n fs.renameSync(tempFilePath, outputPath);\n \n // Clean up state file\n this.cleanupStateFile(stateFilePath);\n\n // Update master progress\n const currentCompleted = masterBar.value + 1;\n const finalTotalSize = totalTracking.actualTotalSize || totalTracking.totalSize;\n const discoveredTotalSize = totalTracking.individualSizes.reduce((sum, size) => sum + size, 0);\n const displayTotalSize = discoveredTotalSize > 0 ? discoveredTotalSize : finalTotalSize;\n \n masterBar.update(totalTracking.totalDownloaded, {\n progress: this.formatMasterProgress(totalTracking.totalDownloaded, displayTotalSize),\n downloadedDisplay: this.formatBytesCompact(totalTracking.totalDownloaded),\n totalDisplay: this.formatTotalDisplay(displayTotalSize),\n etaFormatted: this.formatETA((Date.now() - (totalTracking.individualStartTimes?.[0] || Date.now())) / 1000) // Show time elapsed\n });\n\n } catch (error) {\n // Update bar to show error state\n bar.update(bar.total, {\n spinner: '❌',\n speed: this.formatSpeed('FAILED'),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0)\n });\n \n // Don't clean up partial file on error - allow resume\n console.log(this.colors.info(`💾 Partial download saved for ${filename}. Restart to resume.`));\n throw error;\n }\n}\n\n/**\n * Download a file with colorful progress tracking and resume capability\n * @param {string} url - The URL to download\n * @param {string} outputPath - The local path to save the file\n */\nasync downloadFile(url, outputPath) {\n const stateFilePath = this.getStateFilePath(outputPath);\n const tempFilePath = outputPath + '.tmp';\n \n try {\n // Create abort controller for cancellation\n this.abortController = new AbortController();\n \n // Start with a random ora spinner animation\n const randomOraSpinner = this.getRandomOraSpinner();\n this.loadingSpinner = ora({\n text: this.colors.primary('🌐 Checking server capabilities...'),\n spinner: randomOraSpinner,\n color: 'cyan'\n }).start();\n\n // Check server support and get file info\n const serverInfo = await this.checkServerSupport(url);\n \n // Load previous download state\n const previousState = this.loadDownloadState(stateFilePath);\n \n // Check if we have a partial file\n const partialSize = this.getPartialFileSize(tempFilePath);\n \n let startByte = 0;\n let resuming = false;\n \n if (serverInfo.supportsResume && partialSize > 0 && previousState) {\n // Validate that the file hasn't changed on server\n const fileUnchanged = \n (!serverInfo.lastModified || serverInfo.lastModified === previousState.lastModified) &&\n (!serverInfo.etag || serverInfo.etag === previousState.etag) &&\n (serverInfo.totalSize === previousState.totalSize);\n \n if (fileUnchanged && partialSize < serverInfo.totalSize) {\n startByte = partialSize;\n resuming = true;\n this.loadingSpinner.succeed(this.colors.success(`✅ Found partial download: ${this.formatBytes(partialSize)} of ${this.formatTotal(serverInfo.totalSize)}`));\n console.log(this.colors.info(`🔄 Resuming download from ${this.formatBytes(startByte)}`));\n } else {\n this.loadingSpinner.warn(this.colors.warning('⚠️ File changed on server, starting fresh download'));\n // Clean up partial file and state\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n this.cleanupStateFile(stateFilePath);\n }\n } else {\n this.loadingSpinner.stop();\n if (partialSize > 0) {\n console.log(this.colors.warning('⚠️ Server does not support resumable downloads, starting fresh'));\n // Clean up partial file\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n }\n }\n\n // Prepare request headers\n const headers = {};\n if (resuming && startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n // Make the fetch request\n const response = await fetch(url, {\n headers,\n signal: this.abortController.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Get the total file size\n const contentLength = response.headers.get('content-length');\n const totalSize = resuming ? serverInfo.totalSize : (contentLength ? parseInt(contentLength, 10) : 0);\n const remainingSize = contentLength ? parseInt(contentLength, 10) : 0;\n\n if (!resuming) {\n if (totalSize === 0) {\n console.log(this.colors.warning('⚠️ Warning: Content-Length not provided, progress will be estimated'));\n } else {\n console.log(this.colors.info(`📦 File size: ${this.formatTotal(totalSize)}`));\n }\n }\n\n // Save download state\n const downloadState = {\n url,\n outputPath,\n totalSize,\n startByte,\n lastModified: serverInfo.lastModified,\n etag: serverInfo.etag,\n timestamp: new Date().toISOString()\n };\n this.saveDownloadState(stateFilePath, downloadState);\n\n // Get random colors for single file progress bar\n const singleBarColor = this.getRandomBarColor();\n const singleBarGlue = this.getRandomBarGlueColor();\n\n // Get initial spinner frames\n let currentSpinnerType = this.getRandomSpinner();\n let spinnerFrames = this.getSpinnerFrames(currentSpinnerType);\n let spinnerFrameIndex = 0;\n \n // Calculate initial bar size\n const initialBarSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n\n // Print header row with emojis for single file download\n console.log(\n this.colors.success('📈 %'.padEnd(this.COL_PERCENT)) +\n this.colors.cyan('🔄'.padEnd(this.COL_SPINNER)) +\n ' ' +\n this.colors.green('📊 Progress'.padEnd(this.COL_BAR + 1)) +\n this.colors.info('📥 Downloaded'.padEnd(this.COL_DOWNLOADED)) +\n this.colors.info('📦 Total'.padEnd(this.COL_TOTAL)) +\n this.colors.purple('⚡ Speed'.padEnd(this.COL_SPEED)) +\n this.colors.pink('⏱️ ETA'.padEnd(this.COL_ETA))\n );\n\n // Set up keyboard listeners for single file download\n const keyboardRl = this.setupSingleFileKeyboardListeners(url, outputPath);\n\n // Create compact colorful progress bar with random colors\n this.progressBar = new cliProgress.SingleBar({\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.cyan('{spinner}') + ' ' +\n singleBarColor + '{bar}\\u001b[0m' + ' ' + \n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: singleBarGlue,\n hideCursor: true,\n barsize: initialBarSize,\n stopOnComplete: true,\n clearOnComplete: false\n });\n\n // Initialize progress bar with spinner\n this.progressBar.start(totalSize || 100, startByte, {\n speed: this.formatSpeed('0B/s'),\n etaFormatted: this.formatETA(0),\n spinner: spinnerFrames[0],\n progress: this.formatProgress(startByte, totalSize),\n downloadedDisplay: this.formatBytesCompact(startByte),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n\n // Create write stream (append mode if resuming)\n const writeStream = fs.createWriteStream(tempFilePath, { \n flags: resuming ? 'a' : 'w' \n });\n \n // Track progress\n let downloaded = startByte;\n let sessionDownloaded = 0;\n let lastTime = Date.now();\n let lastDownloaded = downloaded;\n let lastSpinnerUpdate = Date.now();\n let lastSpinnerFrameUpdate = Date.now();\n\n // Create a transform stream to track progress\n const progressStream = new Readable({\n read() {} // No-op, we'll push data manually\n });\n\n // Process the response body stream\n const reader = response.body.getReader();\n \n const processChunk = async () => {\n try {\n while (true) {\n // Check for pause state\n while (this.isPaused) {\n await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100ms before checking again\n }\n \n const { done, value } = await reader.read();\n \n if (done) {\n progressStream.push(null); // Signal end of stream\n break;\n }\n\n // Update progress tracking\n sessionDownloaded += value.length;\n downloaded += value.length;\n \n // Calculate download speed and update display\n const now = Date.now();\n const timeDiff = (now - lastTime) / 1000;\n \n // Update spinner type every 45 seconds for variety\n if (now - lastSpinnerUpdate >= 45000) {\n currentSpinnerType = this.getRandomSpinner();\n spinnerFrames = this.getSpinnerFrames(currentSpinnerType);\n spinnerFrameIndex = 0;\n lastSpinnerUpdate = now;\n }\n \n // Update spinner frame every 120ms for smooth animation\n if (now - lastSpinnerFrameUpdate >= 120) {\n spinnerFrameIndex = (spinnerFrameIndex + 1) % spinnerFrames.length;\n lastSpinnerFrameUpdate = now;\n \n // Recalculate bar size when spinner changes\n const currentSpinner = spinnerFrames[spinnerFrameIndex];\n const newBarSize = this.calculateBarSize(currentSpinner, this.COL_BAR);\n this.progressBar.options.barsize = newBarSize;\n }\n \n if (timeDiff >= 0.3) { // Update every 300ms for smooth animation\n const bytesDiff = downloaded - lastDownloaded;\n const speedBps = bytesDiff / timeDiff;\n const speed = this.formatSpeed(this.formatSpeedDisplay(speedBps));\n const eta = totalSize > 0 ? this.formatETA((totalSize - downloaded) / speedBps) : this.formatETA(0);\n \n this.progressBar.update(downloaded, {\n speed: speed,\n etaFormatted: eta,\n spinner: spinnerFrames[spinnerFrameIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n \n lastTime = now;\n lastDownloaded = downloaded;\n } else {\n // Update progress and spinner without speed calculation\n this.progressBar.update(downloaded, {\n spinner: spinnerFrames[spinnerFrameIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n }\n\n // Push the chunk to our readable stream\n progressStream.push(Buffer.from(value));\n }\n } catch (error) {\n progressStream.destroy(error);\n }\n };\n\n // Start processing chunks\n processChunk();\n\n // Use pipeline to handle the stream properly\n await pipeline(progressStream, writeStream);\n\n // Complete the progress bar\n this.progressBar.stop();\n \n // Move temp file to final location\n if (fs.existsSync(outputPath)) {\n fs.unlinkSync(outputPath);\n }\n fs.renameSync(tempFilePath, outputPath);\n \n // Clean up state file\n this.cleanupStateFile(stateFilePath);\n \n // Success celebration\n console.log(this.colors.success('✅ Download completed!'));\n console.log(this.colors.primary('📁 File saved to: ') + chalk.underline(outputPath));\n console.log(this.colors.purple('📊 Total size: ') + this.formatBytes(downloaded));\n \n if (resuming) {\n console.log(this.colors.info('🔄 Resumed from: ') + this.formatBytes(startByte));\n console.log(this.colors.info('📥 Downloaded this session: ') + this.formatBytes(sessionDownloaded));\n }\n \n // Random success emoji\n const celebrationEmojis = ['🥳', '🎊', '🎈', '🌟', '💯', '🚀', '✨', '🔥'];\n const randomEmoji = celebrationEmojis[Math.floor(Math.random() * celebrationEmojis.length)];\n console.log(this.colors.success(`${randomEmoji} Successfully downloaded! ${randomEmoji}`));\n\n } catch (error) {\n if (this.loadingSpinner && this.loadingSpinner.isSpinning) {\n this.loadingSpinner.fail(this.colors.error('❌ Connection failed'));\n }\n if (this.progressBar) {\n this.progressBar.stop();\n }\n \n // Don't clean up partial file on error - allow resume\n console.error(this.colors.error.bold('💥 Download failed: ') + this.colors.warning(error.message));\n \n if (error.name === 'AbortError') {\n console.log(this.colors.info('💾 Download state saved. You can resume later by running the same command.'));\n } else {\n console.log(this.colors.info('💾 Partial download saved. Restart to resume from where it left off.'));\n }\n \n throw error;\n }\n}\n\n/**\n * Clean up resources\n */\ncleanup() {\n if (this.loadingSpinner && this.loadingSpinner.isSpinning) {\n this.loadingSpinner.stop();\n }\n if (this.progressBar) {\n this.progressBar.stop();\n }\n if (this.multiBar) {\n this.multiBar.stop();\n }\n if (this.abortController) {\n this.abortController.abort();\n }\n if (this.keyboardListener) {\n try {\n this.keyboardListener.kill();\n } catch (error) {\n // Ignore cleanup errors\n }\n }\n \n // Clean up stdin listener\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n}\n\n/**\n * Set up global keyboard listener for pause/resume and add URL functionality\n */\nsetupGlobalKeyboardListener() {\n // Use the fallback keyboard listener which works better in terminal environments\n this.setupFallbackKeyboardListener();\n}\n\n/**\n * Handle global key press events\n * @param {string} keyName - The name of the pressed key\n */\nasync handleGlobalKeyPress(keyName) {\n if (keyName === 'P') {\n console.log(this.colors.info('P key pressed - toggling pause/resume'));\n if (!this.isPaused) {\n this.pauseAll();\n } else {\n this.resumeAll();\n }\n } else if (keyName === 'A' && !this.isAddingUrl) {\n console.log(this.colors.info('A key pressed - adding URL'));\n await this.promptForNewUrl();\n }\n}\n\n/**\n * Prompt user for a new URL to download\n */\nasync promptForNewUrl() {\n this.isAddingUrl = true;\n \n try {\n console.log(this.colors.cyan('\\n📥 Enter URL to add (or press Enter to cancel):'));\n \n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n \n const newUrl = await new Promise((resolve) => {\n rl.question('', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n \n if (newUrl && this.isValidUrl(newUrl)) {\n console.log(this.colors.success(`✅ Adding URL: ${newUrl}`));\n \n // Generate filename for new URL\n const newFilename = this.generateFilename(newUrl);\n const newOutputPath = path.isAbsolute(newFilename) ? newFilename : path.join(process.cwd(), newFilename);\n \n // Ensure output directory exists\n const outputDir = path.dirname(newOutputPath);\n try {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n } catch (error) {\n console.error(this.colors.red.bold('❌ Could not create output directory: ') + error.message);\n return;\n }\n \n // Check if we're in multiple download mode (multiBar exists)\n if (this.multiBar) {\n // Add to multiple downloads\n await this.addToMultipleDownloads(newUrl, newOutputPath, newFilename);\n } else {\n // Start new single download in background\n this.downloadFile(newUrl, newOutputPath).catch(error => {\n console.error(this.colors.error(`❌ Failed to download ${newFilename}: ${error.message}`));\n });\n }\n \n console.log(this.colors.success('🚀 New download started!'));\n } else if (newUrl) {\n console.log(this.colors.red('❌ Invalid URL provided.'));\n } else {\n console.log(this.colors.yellow('⚠️ No URL provided, cancelling.'));\n }\n } catch (error) {\n console.error(this.colors.red('❌ Error adding URL: ') + error.message);\n } finally {\n this.isAddingUrl = false;\n \n if (this.isPaused) {\n console.log(this.colors.warning('⏸️ Still paused. Press p to resume, a to add URL.'));\n } else {\n console.log(this.colors.success('▶️ Downloads active. Press p to pause, a to add URL.'));\n }\n }\n}\n\n/**\n * Add a new download to the multiple downloads queue\n * @param {string} url - The URL to download\n * @param {string} outputPath - The output path\n * @param {string} filename - The filename\n */\nasync addToMultipleDownloads(url, outputPath, filename) {\n // Create new progress bar for the added download\n const spinnerType = this.getRandomSpinner();\n const spinnerFrames = this.getSpinnerFrames(spinnerType);\n const spinnerWidth = this.getSpinnerWidth(spinnerFrames[0]);\n const maxFilenameLength = this.COL_FILENAME - spinnerWidth;\n const truncatedName = this.truncateFilename(filename, maxFilenameLength);\n const fileBarColor = this.getRandomBarColor();\n const fileBarGlue = this.getRandomBarGlueColor();\n const barSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n \n const newDownload = {\n url: url,\n outputPath: outputPath,\n filename: filename\n };\n \n const newFileBar = {\n bar: this.multiBar.create(100, 0, {\n filename: truncatedName,\n spinner: spinnerFrames[0],\n speed: this.formatSpeed('0B'),\n progress: this.formatProgress(0, 0),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(3)\n }, {\n format: this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n fileBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.success('{percentage}%') + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: fileBarGlue,\n barsize: barSize\n }),\n spinnerFrames,\n spinnerIndex: 0,\n lastSpinnerUpdate: Date.now(),\n lastFrameUpdate: Date.now(),\n download: { ...newDownload, index: this.getCurrentDownloadCount() }\n };\n \n // Start the new download\n this.downloadSingleFileWithBar(newFileBar, this.getMasterBar(), this.getCurrentDownloadCount() + 1, {\n totalDownloaded: 0,\n totalSize: 0,\n individualSpeeds: [],\n individualSizes: [],\n individualDownloaded: [],\n individualStartTimes: [],\n lastTotalUpdate: Date.now(),\n lastTotalDownloaded: 0,\n actualTotalSize: 0\n }).catch(error => {\n console.error(this.colors.error(`❌ Failed to download ${newDownload.filename}: ${error.message}`));\n });\n}\n\n/**\n * Get current download count (for multiple downloads)\n * @returns {number} Current number of downloads\n */\ngetCurrentDownloadCount() {\n // This is a placeholder - in a real implementation, you'd track this\n return 1;\n}\n\n/**\n * Get master bar (for multiple downloads)\n * @returns {Object} Master progress bar\n */\ngetMasterBar() {\n // This is a placeholder - in a real implementation, you'd return the actual master bar\n return null;\n}\n\n/**\n * Set up fallback keyboard listener using readline\n */\nsetupFallbackKeyboardListener() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n \n const handleKeypress = async (str) => {\n // Handle Ctrl+C to exit\n if (str === '\\u0003') {\n console.log(this.colors.yellow.bold('\\n🛑 Download cancelled by user'));\n process.exit(0);\n }\n \n // Handle 'p' key for pause/resume\n if (str.toLowerCase() === 'p') {\n console.log(this.colors.info('P key pressed - toggling pause/resume'));\n if (!this.isPaused) {\n this.pauseAll();\n } else {\n this.resumeAll();\n }\n }\n \n // Handle 'a' key for adding URL\n if (str.toLowerCase() === 'a' && !this.isAddingUrl) {\n console.log(this.colors.info('A key pressed - adding URL'));\n await this.promptForNewUrl();\n }\n };\n \n process.stdin.on('data', handleKeypress);\n // console.log(this.colors.info('💡 Keyboard listener active: [p] pause/resume, [a] add URL'));\n }\n}\n\n/**\n * Set up keyboard listeners for single file download (legacy method)\n * @param {string} url - The URL being downloaded\n * @param {string} outputPath - The output path\n */\nsetupSingleFileKeyboardListeners(url, outputPath) {\n // Use the global keyboard listener instead\n this.setupGlobalKeyboardListener();\n return null; // Return null since we're using global listener\n}\n\n/**\n * Validate URL format\n * @param {string} url - URL to validate\n * @returns {boolean} - Whether URL is valid\n */\nisValidUrl(url) {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get file extension from URL\n * @param {string} url - URL to extract extension from\n * @returns {string} - File extension or empty string\n */\ngetFileExtension(url) {\n try {\n const pathname = new URL(url).pathname;\n return path.extname(pathname).toLowerCase();\n } catch {\n return '';\n }\n}\n\n/**\n * Generate filename from URL\n * @param {string} url - Download URL\n * @returns {string} - Generated filename\n */\ngenerateFilename(url) {\n try {\n const filename = path.basename(new URL(url).pathname);\n return filename || 'downloaded-file';\n } catch (error) {\n return 'downloaded-file';\n }\n}\n\nsetPauseCallback(cb) {\n this.pauseCallback = cb;\n}\n\nsetResumeCallback(cb) {\n this.resumeCallback = cb;\n}\n\nsetAbortController(controller) {\n this.abortControllers.push(controller);\n}\n\nclearAbortControllers() {\n this.abortControllers = [];\n}\n\npauseAll() {\n this.isPaused = true;\n console.log(this.colors.warning('⏸️ Pausing all downloads...'));\n // Don't abort controllers on pause, just set the flag\n if (this.pauseCallback) this.pauseCallback();\n}\n\nresumeAll() {\n this.isPaused = false;\n console.log(this.colors.success('▶️ Resuming all downloads...'));\n if (this.resumeCallback) this.resumeCallback();\n}\n}\n\n// --- Main CLI logic ---\n// Only run CLI when this file is executed directly, not when imported\nconst __isMain = (typeof import.meta.main === 'boolean' && import.meta.main) || (() => {\n try {\n const scriptArg = process.argv[1] ? path.resolve(process.argv[1]) : '';\n if (!scriptArg) return false;\n const href = pathToFileURL(scriptArg).href;\n return import.meta.url === href;\n } catch {\n return false;\n }\n})();\n\nif (__isMain) {\n const argv = new ArgParser()\n .usage('Usage: grab-url <url...> [options]')\n .command('$0 <url>', 'Fetch data or download files; pass one or more URLs')\n .option('no-save', {\n type: 'boolean',\n default: false,\n describe: 'Don\\'t save output to file, just print to console'\n })\n .option('output', {\n alias: 'o',\n type: 'string',\n describe: 'Output filename (default: output.json)',\n default: null\n })\n .option('params', {\n alias: 'p',\n type: 'string',\n describe: 'JSON string of query parameters (e.g., \\'{\"key\":\"value\"}\\')',\n coerce: (arg) => {\n if (!arg) return {};\n try { return JSON.parse(arg); } catch (e) { throw new Error(`Invalid JSON in params: ${arg}`); }\n }\n })\n .help()\n .alias('h', 'help')\n .example('grab-url https://api.example.com/data', 'Fetch JSON/text from an API and save to output.json')\n .example('grab-url https://example.com/file1.zip https://example.com/file2.zip', 'Download multiple files concurrently')\n .example('grab-url https://example.com/file.iso -o ubuntu.iso', 'Save the first URL to a custom filename')\n .version('1.0.0')\n .strict()\n .parseSync();\n\n const urls = argv.urls || [];\n const params = argv.params || {};\n const outputFile = argv.output;\n const noSave = argv['no-save'];\n\n // --- Mode detection ---\n const anyFileUrl = urls.some(isFileUrl);\n const isDownloadMode = urls.length > 1 || anyFileUrl;\n\n (async () => {\n if (isDownloadMode) {\n // --- Download Mode ---\n const downloader = new ColorFileDownloader();\n // Prepare download objects\n const downloads = urls.map((url, i) => {\n let filename = null;\n // If user provided output, use it for the first file\n if (i === 0 && outputFile) filename = outputFile;\n return { url, outputPath: filename };\n });\n // Prepare download objects with filenames\n const downloadObjects = downloads.map((download, index) => {\n let actualUrl = download.url;\n let filename = download.outputPath;\n if (!filename) filename = downloader.generateFilename(actualUrl);\n const outputPath = path.isAbsolute(filename) ? filename : path.join(process.cwd(), filename);\n const outputDir = path.dirname(outputPath);\n try { if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true }); } catch (error) {\n console.error(chalk.red.bold('❌ Could not create output directory: ') + error.message);\n process.exit(1);\n }\n return {\n url: actualUrl,\n outputPath,\n filename: path.basename(filename)\n };\n });\n \n try {\n await downloader.downloadMultipleFiles(downloadObjects);\n // Display individual file stats in a table\n const statsTable = new Table({\n head: ['Filename', 'Size', 'Created'],\n colWidths: [32, 14, 25],\n colAligns: ['left', 'right', 'left'],\n style: { 'padding-left': 1, 'padding-right': 1, head: [], border: [] }\n });\n downloadObjects.forEach((downloadObj) => {\n try {\n const stats = fs.statSync(downloadObj.outputPath);\n statsTable.push([\n downloadObj.filename,\n downloader.formatBytes(stats.size),\n stats.birthtime.toLocaleString()\n ]);\n } catch (error) {\n statsTable.push([\n downloadObj.filename,\n 'Error',\n 'Could not read'\n ]);\n }\n });\n console.log(chalk.cyan.bold('\\nFile Details:'));\n console.log(statsTable.toString());\n } catch (error) {\n console.error(chalk.red.bold('Failed to download files: ') + chalk.yellow(error.message));\n process.exit(1);\n }\n downloader.cleanup();\n } else {\n // --- API Mode ---\n const url = urls[0];\n const startTime = process.hrtime();\n try {\n const res = await grab(url, params);\n if (res.error) log(`\\n\\nStatus: ❌ ${res.error}`);\n let filePath = null;\n let outputData;\n let isTextData = false;\n if (typeof res.data === 'string') { outputData = res.data; isTextData = true; }\n else if (Buffer.isBuffer(res.data) || res.data instanceof Uint8Array) { outputData = res.data; isTextData = false; }\n else if (res.data instanceof Blob) { const arrayBuffer = await res.data.arrayBuffer(); outputData = Buffer.from(arrayBuffer); isTextData = false; }\n else if (res.data && typeof res.data === 'object') { outputData = JSON.stringify(res.data, null, 2); isTextData = true; }\n else { outputData = String(res.data); isTextData = true; }\n if (!noSave) {\n const urlPath = new URL(url).pathname;\n const urlExt = path.extname(urlPath);\n const defaultExt = isTextData ? '.json' : (urlExt || '.bin');\n filePath = outputFile ? path.resolve(outputFile) : path.resolve(process.cwd(), `output${defaultExt}`);\n if (isTextData) fs.writeFileSync(filePath, outputData, 'utf8');\n else fs.writeFileSync(filePath, outputData);\n const [seconds, nanoseconds] = process.hrtime(startTime);\n const elapsedMs = (seconds + nanoseconds / 1e9).toFixed(2);\n const stats = fs.statSync(filePath);\n const fileSizeMB = (stats.size / (1024 * 1024)).toFixed(1);\n log(`⏱️ ${elapsedMs}s 📦 ${fileSizeMB}MB ✅ Saved to: ${filePath}`);\n } else {\n if (isTextData) {\n log(outputData);\n } else {\n log(`Binary data received (${outputData.length} bytes). Use --output to save to file.`);\n }\n }\n } catch (error) {\n log(`Error: ${error.message}`, {color: 'red'});\n process.exit(1);\n }\n }\n })();\n}"],"names":["spinners","dots","dots2","dots3","dots4","dots5","dots6","dots7","dots8","dots9","dots10","dots11","dots12","dots13","dots14","dotsCircle","sand","line","line2","pipe","simpleDots","simpleDotsScrolling","star","star2","flip","hamburger","growVertical","growHorizontal","balloon","balloon2","noise","bounce","boxBounce","boxBounce2","triangle","binary","arc","circle","squareCorners","circleQuarters","circleHalves","squish","toggle","toggle2","toggle3","toggle4","toggle5","toggle6","toggle7","toggle8","toggle9","toggle10","toggle11","toggle12","toggle13","arrow","arrow2","arrow3","bouncingBar","bouncingBall","smiley","monkey","hearts","clock","earth","moon","runner","dqpb","weather","christmas","grenade","point","layer","betaWave","fingerDance","mindblown","speaker","orangePulse","bluePulse","orangeBluePulse","timeTravel","aesthetic","log","message","options","color","style","hideInProduction","startSpinner","stopSpinner","colors","getColors","window","location","hostname","includes","printJSONStructure","JSON","stringify","Array","isArray","length","process","replace","match","index","reset","i","global","globalThis","interval","setInterval","stdout","write","split","clearInterval","repeat","console","debug","colorMap","black","red","green","yellow","blue","magenta","cyan","white","gray","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","bgGray","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite","format","name","ansiCode","hexCode","Object","entries","getColorForType","value","getTypeString","obj","indent","colorFormat","pad","result","every","item","forEach","idx","keys","key","async","grab","path","headers","response","method","post","put","patch","cache","cacheForTime","timeout","baseURL","env","SERVER_API_URL","cancelOngoingIfNew","cancelNewIfOngoing","rateLimit","infiniteScroll","setDefaults","retryAttempts","logger","onRequest","onResponse","onError","onStream","repeatEvery","debounce","regrabOnStale","regrabOnFocus","regrabOnNetwork","body","params","defaults","s","t","startsWith","endsWith","slice","debouncer","regrab","setTimeout","addEventListener","document","visibilityState","resFunction","paginateKey","paginateResult","paginateElement","paginateDOM","querySelector","scrollListener","removeEventListener","event","target","localStorage","setItem","scrollTop","scrollLeft","scrollHeight","clientHeight","priorRequest","currentPage","paramsAsText","find","e","request","pageNumber","lastFetchTime","Date","now","res","isLoading","Error","controller","abort","unshift","AbortController","fetchParams","Accept","redirect","signal","AbortSignal","paramsGETRequest","URLSearchParams","toString","startTime","mockHandler","mock","wait","s2","Promise","res2","fetch","catch","ok","status","statusText","type","get","json","blob","text","delay","elapsedTime","Number","toFixed","data","error","errorMessage","instance","func","args","clearTimeout","showAlert","msg","list","o","getElementById","appendChild","createElement","id","setAttribute","innerHTML","remove","onclick","_readline","require$$0","terminal","constructor","outputStream","this","stream","linewrap","dy","cursorSave","isTTY","cursorRestore","cursor","enabled","cursorTo","x","y","cursorRelative","dx","moveCursor","cursorRelativeReset","clearRight","clearLine","clearBottom","clearScreenDown","newline","rawWrite","substr","getWidth","lineWrapping","columns","ctrlKey","altKey","html","toLocaleString","parse","getItem","ansiRegex","onlyFirst","pattern","join","RegExp","stripAnsi","string","isFullwidthCodePoint","codePoint","isNaN","isFullwidthCodePointModule","exports","default","require$$1","emojiRegex","stringWidth","width","code","codePointAt","stringWidthModule","formatValue","v","autopadding","autopaddingChar","formatBar","progress","completeSize","Math","round","barsize","incompleteSize","barCompleteString","barGlue","barIncompleteString","formatTime","roundToMultipleOf","input","floor","_stringWidth","_defaultFormatValue","_defaultFormatBar","require$$2","_defaultFormatTime","require$$3","formatter","payload","percentage","stopTime","context","assign","bar","total","eta","eta_formatted","duration","duration_formatted","fullMargin","max","maxWidth","halfMargin","align","mergeOption","defaultValue","rawOptions","preset","opt","throttleTime","fps","stderr","clearOnComplete","stopOnComplete","hideCursor","barCompleteChar","barIncompleteChar","etaBufferLength","etaBuffer","etaAsynchronousUpdate","progressCalculationRelative","synchronousUpdate","noTTYOutput","notTTYSchedule","emptyOnZero","forceRedraw","gracefulExit","assignDerivedOptions","_ETA","initTime","initValue","valueBuffer","timeBuffer","update","time","push","calculate","getTime","remaining","currentBufferSize","buffer","min","vt_rate","ceil","isFinite","_Terminal","_formatter","_options","_EventEmitter","require$$4","genericBar","super","startValue","lastDrawnString","lastRedraw","isActive","render","forceRendering","getProgress","updateETA","emit","start","stop","arg0","arg1","payloadData","getTotal","increment","setTotal","_legacy","legacy","_shades_classic","shadesClassic","_shades_grey","shadesGrey","_rect","rect","presets","shades_classic","shades_grey","_SingleBar","_GenericBar","singleBar","timer","schedulingRate","sigintCallback","bind","current","once","removeListener","_MultiBar","_BarElement","multiBar","bars","loggingBuffer","create","barOptions","indexOf","splice","shift","_Presets","_Formatter","require$$5","require$$6","cliProgress","Bar","SingleBar","MultiBar","Presets","Format","Formatter","BarFormat","ValueFormat","TimeFormat","wrapAnsi16","offset","wrapAnsi256","wrapAnsi16m","styles","modifier","bold","dim","italic","underline","overline","inverse","hidden","strikethrough","blackBright","grey","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgColor","bgBlackBright","bgGrey","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","ansiStyles","codes","Map","groupName","group","styleName","open","close","set","defineProperty","enumerable","ansi","ansi256","ansi16m","defineProperties","rgbToAnsi256","hexToRgb","hex","matches","exec","colorString","map","character","integer","parseInt","hexToAnsi256","ansi256ToAnsi","remainder","rgbToAnsi","hexToAnsi","assembleStyles","level","navigator","userAgentData","brand","brands","version","test","userAgent","colorSupport","supportsColor","stringReplaceAll","substring","replacer","substringLength","endIndex","returnValue","stdoutColor","stderrColor","GENERATOR","STYLER","IS_EMPTY","levelMapping","chalkFactory","chalk","strings","object","isInteger","colorLevel","applyOptions","setPrototypeOf","createChalk","prototype","Function","builder","createBuilder","createStyler","visible","getModelAnsi","model","arguments_","usedModels","styler","toUpperCase","proto","parent","openAll","closeAll","self","_styler","_isEmpty","applyStyle","lfIndex","prefix","postfix","gotCR","stringEncaseCRLFWithFirstIndex","dirname","fileURLToPath","ArgParser","commands","examples","helpText","versionText","usage","command","desc","handler","required","option","opts","example","cmd","help","alias","short","long","strict","parseSync","argv","positional","showHelp","exit","arg","optName","coerceValue","nextArg","shortFlag","longName","findLongName","urls","url","coerce","padEnd","flags","describe","ex","ColorFileDownloader","progressBar","loadingSpinner","abortController","COL_FILENAME","COL_SPINNER","COL_BAR","COL_PERCENT","COL_DOWNLOADED","COL_TOTAL","COL_SPEED","COL_ETA","primary","success","warning","info","purple","pink","gradient","barColors","barGlueColors","spinnerTypes","stateDir","getStateDirectory","ensureStateDirectoryExists","isPaused","pauseCallback","resumeCallback","abortControllers","keyboardListener","isAddingUrl","GRAB_DOWNLOAD_STATE_DIR","cwd","fs","existsSync","mkdirSync","recursive","getStateFilePath","outputPath","stateFileName","basename","cleanupStateFile","stateFilePath","unlinkSync","printHeaderRow","getRandomOraSpinner","random","getRandomBarColor","getRandomBarGlueColor","getRandomSpinner","getSpinnerFrames","spinnerType","spinnerData","spinner","frames","getSpinnerWidth","frame","char","calculateBarSize","spinnerFrame","baseBarSize","availableWidth","checkServerSupport","acceptRanges","contentLength","lastModified","etag","supportsResume","totalSize","loadDownloadState","stateData","readFileSync","saveDownloadState","state","writeFileSync","getPartialFileSize","filePath","statSync","size","getRandomColor","formatBytes","bytes","decimals","dm","sizes","unit","parseFloat","pow","formatBytesPlain","formatBytesCompact","k","kb","truncateFilename","filename","maxLength","extension","extname","baseName","firstPart","lastPart","formatETA","seconds","Infinity","hours","mins","secs","padStart","formatMasterProgress","totalDownloaded","totalDownloadedMB","formatProgress","downloaded","formatDownloaded","formatTotalDisplay","mb","formatTotal","formatSpeed","speed","formatSpeedDisplay","bytesPerSecond","kbPerSecond","formatTotalSpeed","downloadMultipleFiles","downloads","setupGlobalKeyboardListener","masterBarColor","masterBarGlue","individualSpeeds","fill","individualSizes","individualDownloaded","individualStartTimes","lastSpeedUpdate","lastIndividualDownloaded","lastTotalUpdate","lastTotalDownloaded","totalSizeFromDownloads","reduce","sum","download","estimatedSize","actualTotalSize","speedUpdateInterval","timeSinceLastUpdate","incrementalDownloaded","fileBars","downloadedDisplay","totalDisplay","etaFormatted","totalSpeedBps","totalDownloadedFromFiles","timeElapsed","discoveredTotalSize","displayTotalSize","masterBar","masterSpinnerWidth","masterMaxFilenameLength","masterBarSize","spinnerFrames","spinnerWidth","maxFilenameLength","truncatedName","fileBarColor","fileBarGlue","barSize","spinnerIndex","lastSpinnerUpdate","lastFrameUpdate","downloadPromises","fileBar","downloadSingleFileWithBar","results","allSettled","successful","filter","r","failed","reason","celebrationEmojis","randomEmoji","clearAbortControllers","pausedMessageShown","setPauseCallback","setResumeCallback","totalFiles","totalTracking","tempFilePath","setAbortController","serverInfo","previousState","partialSize","startByte","resuming","downloadState","timestamp","toISOString","writeStream","createWriteStream","lastTime","lastDownloaded","progressStream","Readable","read","reader","getReader","resolve","done","timeDiff","currentSpinner","newBarSize","newSpinnerType","bytesDiff","fileIndex","Buffer","from","destroy","processChunk","pipeline","renameSync","finalTotalSize","downloadFile","randomOraSpinner","ora","succeed","warn","singleBarColor","singleBarGlue","currentSpinnerType","spinnerFrameIndex","initialBarSize","setupSingleFileKeyboardListeners","sessionDownloaded","lastSpinnerFrameUpdate","speedBps","isSpinning","fail","cleanup","kill","stdin","setRawMode","pause","setupFallbackKeyboardListener","handleGlobalKeyPress","keyName","resumeAll","pauseAll","promptForNewUrl","rl","readline","createInterface","output","newUrl","question","answer","trim","isValidUrl","newFilename","generateFilename","newOutputPath","isAbsolute","outputDir","addToMultipleDownloads","newDownload","newFileBar","getCurrentDownloadCount","getMasterBar","resume","setEncoding","handleKeypress","str","toLowerCase","on","URL","getFileExtension","pathname","cb","scriptArg","href","pathToFileURL","require","__filename","_documentCurrentScript","tagName","src","baseURI","outputFile","noSave","anyFileUrl","some","isDownloadMode","downloader","downloadObjects","actualUrl","statsTable","Table","head","colWidths","colAligns","border","downloadObj","stats","birthtime","hrtime","outputData","isTextData","isBuffer","Uint8Array","Blob","arrayBuffer","String","urlPath","urlExt","defaultExt","nanoseconds","elapsedMs"],"mappings":";mSAAA,MAAAA,EAAe,CACdC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,WAAY,CACX,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,KAAM,CACL,IACA,KACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,KAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,WAAY,CACX,MACA,MACA,MACA,OAEDC,oBAAqB,CACpB,MACA,MACA,MACA,MACA,MACA,OAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,KAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,UAAW,CACV,IACA,IACA,KAEDC,aAAc,CACb,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,eAAgB,CACf,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,QAAS,CACR,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,SAAU,CACT,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,KAEDC,UAAW,CACV,IACA,IACA,IACA,KAEDC,WAAY,CACX,IACA,IACA,IACA,KAEDC,SAAU,CACT,IACA,IACA,IACA,KAEDC,OAAQ,CACP,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEDC,IAAK,CACJ,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,KAEDC,cAAe,CACd,IACA,IACA,IACA,KAEDC,eAAgB,CACf,IACA,IACA,IACA,KAEDC,aAAc,CACb,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,KAEDC,OAAQ,CACP,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,IACA,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,SAAU,CACT,IACA,IACA,KAEDC,SAAU,CACT,IACA,KAEDC,SAAU,CACT,IACA,KAEDC,SAAU,CACT,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,OAAQ,CACP,QACA,QACA,QACA,QACA,QACA,SAEDC,YAAa,CACZ,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEDC,aAAc,CACb,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YAEDC,OAAQ,CACP,MACA,OAEDC,OAAQ,CACP,MACA,MACA,MACA,OAEDC,OAAQ,CACP,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,MACA,MACA,OAEDC,KAAM,CACL,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,OAAQ,CACP,MACA,OAEDC,KAAM,CACL,IACA,IACA,IACA,KAEDC,QAAS,CACR,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,UAAW,CACV,KACA,MAEDC,QAAS,CACR,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,IACA,IACA,KAEDC,SAAU,CACT,UACA,UACA,UACA,UACA,UACA,UACA,WAEDC,YAAa,CACZ,MACA,MACA,MACA,KACA,MACA,OAEDC,UAAW,CACV,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,KACA,KACA,MAEDC,QAAS,CACR,MACA,MACA,MACA,OAEDC,YAAa,CACZ,MACA,MACA,MACA,MACA,OAEDC,UAAW,CACV,MACA,MACA,MACA,MACA,OAEDC,gBAAiB,CAChB,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,WAAY,CACX,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,UAAW,CACV,UACA,UACA,UACA,UACA,UACA,UACA,UACA,YC/yBF,SAASC,EAAIC,EAAU,GAAIC,EAAU,CAAA,GACnC,IAAIC,MACFA,EAAAC,MACAA,EAAQ,4CAAAC,iBACRA,EAAmBC,aACnBA,GAAe,EAAAC,YACfA,GAAc,GACZL,EACJ,MAAMM,EAASC,SACiB,IAArBJ,IACTA,EAAqC,oBAAXK,QAA0BA,QAAQC,SAASC,SAASC,SAAS,cAClE,iBAAZZ,IACTA,EAAUa,EAAmBb,GAAW,OAASc,KAAKC,UAAUf,EAAS,KAAM,IAC7EgB,MAAMC,QAAQf,IAA0B,GAAhBA,EAAMgB,SAAahB,EAAQA,EAAM,IACzDA,QAA4B,WAAZiB,UACdnB,EAAQY,SAAS,OAASI,MAAMC,QAAQf,GAC1CF,EAAUA,EAAQoB,QAAQ,MAAO,CAACC,EAAOC,IAAUf,EAAOL,EAAMoB,KAAW,IACpEpB,GAA0B,iBAAVA,IACvBF,GAAWO,EAAOL,IAAU,IAAMF,EAAUO,EAAOgB,QAEvD,IAAIC,EAAI,EAwBR,OAvBInB,GACDoB,QAAUC,YAAYC,SAAWC,YAAY,KAC5CT,QAAQU,OAAOC,OACZd,MAAMC,QA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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]}
1
+ {"version":3,"file":"download.cjs.js","sources":["../src/icons/cli/spinners.js","log.es.js","grab-api.es.js","../node_modules/cli-progress/lib/terminal.js","../node_modules/string-width/node_modules/strip-ansi/index.js","../node_modules/string-width/node_modules/strip-ansi/node_modules/ansi-regex/index.js","../node_modules/string-width/index.js","../node_modules/is-fullwidth-code-point/index.js","../node_modules/emoji-regex/index.js","../node_modules/cli-progress/lib/format-value.js","../node_modules/cli-progress/lib/format-bar.js","../node_modules/cli-progress/lib/format-time.js","../node_modules/cli-progress/lib/formatter.js","../node_modules/cli-progress/lib/options.js","../node_modules/cli-progress/lib/generic-bar.js","../node_modules/cli-progress/lib/eta.js","../node_modules/cli-progress/presets/index.js","../node_modules/cli-progress/presets/legacy.js","../node_modules/cli-progress/presets/shades-classic.js","../node_modules/cli-progress/presets/shades-grey.js","../node_modules/cli-progress/presets/rect.js","../node_modules/cli-progress/cli-progress.js","../node_modules/cli-progress/lib/single-bar.js","../node_modules/cli-progress/lib/multi-bar.js","../node_modules/chalk/source/vendor/ansi-styles/index.js","../node_modules/chalk/source/vendor/supports-color/browser.js","../node_modules/chalk/source/utilities.js","../node_modules/chalk/source/index.js","../src/grab-url.js"],"sourcesContent":["export default {\n\tdots: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠹\",\n\t\t\"⠸\",\n\t\t\"⠼\",\n\t\t\"⠴\",\n\t\t\"⠦\",\n\t\t\"⠧\",\n\t\t\"⠇\",\n\t\t\"⠏\"\n\t],\n\tdots2: [\n\t\t\"⣾\",\n\t\t\"⣽\",\n\t\t\"⣻\",\n\t\t\"⢿\",\n\t\t\"⡿\",\n\t\t\"⣟\",\n\t\t\"⣯\",\n\t\t\"⣷\"\n\t],\n\tdots3: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠞\",\n\t\t\"⠖\",\n\t\t\"⠦\",\n\t\t\"⠴\",\n\t\t\"⠲\",\n\t\t\"⠳\",\n\t\t\"⠓\"\n\t],\n\tdots4: [\n\t\t\"⠄\",\n\t\t\"⠆\",\n\t\t\"⠇\",\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠸\",\n\t\t\"⠰\",\n\t\t\"⠠\",\n\t\t\"⠰\",\n\t\t\"⠸\",\n\t\t\"⠙\",\n\t\t\"⠋\",\n\t\t\"⠇\",\n\t\t\"⠆\"\n\t],\n\tdots5: [\n\t\t\"⠋\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\"\n\t],\n\tdots6: [\n\t\t\"⠁\",\n\t\t\"⠉\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠤\",\n\t\t\"⠄\",\n\t\t\"⠄\",\n\t\t\"⠤\",\n\t\t\"⠴\",\n\t\t\"⠲\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠚\",\n\t\t\"⠙\",\n\t\t\"⠉\",\n\t\t\"⠁\"\n\t],\n\tdots7: [\n\t\t\"⠈\",\n\t\t\"⠉\",\n\t\t\"⠋\",\n\t\t\"⠓\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠖\",\n\t\t\"⠦\",\n\t\t\"⠤\",\n\t\t\"⠠\",\n\t\t\"⠠\",\n\t\t\"⠤\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\",\n\t\t\"⠉\",\n\t\t\"⠈\"\n\t],\n\tdots8: [\n\t\t\"⠁\",\n\t\t\"⠁\",\n\t\t\"⠉\",\n\t\t\"⠙\",\n\t\t\"⠚\",\n\t\t\"⠒\",\n\t\t\"⠂\",\n\t\t\"⠂\",\n\t\t\"⠒\",\n\t\t\"⠲\",\n\t\t\"⠴\",\n\t\t\"⠤\",\n\t\t\"⠄\",\n\t\t\"⠄\",\n\t\t\"⠤\",\n\t\t\"⠠\",\n\t\t\"⠠\",\n\t\t\"⠤\",\n\t\t\"⠦\",\n\t\t\"⠖\",\n\t\t\"⠒\",\n\t\t\"⠐\",\n\t\t\"⠐\",\n\t\t\"⠒\",\n\t\t\"⠓\",\n\t\t\"⠋\",\n\t\t\"⠉\",\n\t\t\"⠈\",\n\t\t\"⠈\"\n\t],\n\tdots9: [\n\t\t\"⢹\",\n\t\t\"⢺\",\n\t\t\"⢼\",\n\t\t\"⣸\",\n\t\t\"⣇\",\n\t\t\"⡧\",\n\t\t\"⡗\",\n\t\t\"⡏\"\n\t],\n\tdots10: [\n\t\t\"⢄\",\n\t\t\"⢂\",\n\t\t\"⢁\",\n\t\t\"⡁\",\n\t\t\"⡈\",\n\t\t\"⡐\",\n\t\t\"⡠\"\n\t],\n\tdots11: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⡀\",\n\t\t\"⢀\",\n\t\t\"⠠\",\n\t\t\"⠐\",\n\t\t\"⠈\"\n\t],\n\tdots12: [\n\t\t\"⢀⠀\",\n\t\t\"⡀⠀\",\n\t\t\"⠄⠀\",\n\t\t\"⢂⠀\",\n\t\t\"⡂⠀\",\n\t\t\"⠅⠀\",\n\t\t\"⢃⠀\",\n\t\t\"⡃⠀\",\n\t\t\"⠍⠀\",\n\t\t\"⢋⠀\",\n\t\t\"⡋⠀\",\n\t\t\"⠍⠁\",\n\t\t\"⢋⠁\",\n\t\t\"⡋⠁\",\n\t\t\"⠍⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠩\",\n\t\t\"⠈⢙\",\n\t\t\"⠈⡙\",\n\t\t\"⢈⠩\",\n\t\t\"⡀⢙\",\n\t\t\"⠄⡙\",\n\t\t\"⢂⠩\",\n\t\t\"⡂⢘\",\n\t\t\"⠅⡘\",\n\t\t\"⢃⠨\",\n\t\t\"⡃⢐\",\n\t\t\"⠍⡐\",\n\t\t\"⢋⠠\",\n\t\t\"⡋⢀\",\n\t\t\"⠍⡁\",\n\t\t\"⢋⠁\",\n\t\t\"⡋⠁\",\n\t\t\"⠍⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠋⠉\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠙\",\n\t\t\"⠉⠩\",\n\t\t\"⠈⢙\",\n\t\t\"⠈⡙\",\n\t\t\"⠈⠩\",\n\t\t\"⠀⢙\",\n\t\t\"⠀⡙\",\n\t\t\"⠀⠩\",\n\t\t\"⠀⢘\",\n\t\t\"⠀⡘\",\n\t\t\"⠀⠨\",\n\t\t\"⠀⢐\",\n\t\t\"⠀⡐\",\n\t\t\"⠀⠠\",\n\t\t\"⠀⢀\",\n\t\t\"⠀⡀\"\n\t],\n\tdots13: [\n\t\t\"⣼\",\n\t\t\"⣹\",\n\t\t\"⢻\",\n\t\t\"⠿\",\n\t\t\"⡟\",\n\t\t\"⣏\",\n\t\t\"⣧\",\n\t\t\"⣶\"\n\t],\n\tdots14: [\n\t\t\"⠉⠉\",\n\t\t\"⠈⠙\",\n\t\t\"⠀⠹\",\n\t\t\"⠀⢸\",\n\t\t\"⠀⣰\",\n\t\t\"⢀⣠\",\n\t\t\"⣀⣀\",\n\t\t\"⣄⡀\",\n\t\t\"⣆⠀\",\n\t\t\"⡇⠀\",\n\t\t\"⠏⠀\",\n\t\t\"⠋⠁\"\n\t],\n\tdotsCircle: [\n\t\t\"⢎ \",\n\t\t\"⠎⠁\",\n\t\t\"⠊⠑\",\n\t\t\"⠈⠱\",\n\t\t\" ⡱\",\n\t\t\"⢀⡰\",\n\t\t\"⢄⡠\",\n\t\t\"⢆⡀\"\n\t],\n\tsand: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⡀\",\n\t\t\"⡈\",\n\t\t\"⡐\",\n\t\t\"⡠\",\n\t\t\"⣀\",\n\t\t\"⣁\",\n\t\t\"⣂\",\n\t\t\"⣄\",\n\t\t\"⣌\",\n\t\t\"⣔\",\n\t\t\"⣤\",\n\t\t\"⣥\",\n\t\t\"⣦\",\n\t\t\"⣮\",\n\t\t\"⣶\",\n\t\t\"⣷\",\n\t\t\"⣿\",\n\t\t\"⡿\",\n\t\t\"⠿\",\n\t\t\"⢟\",\n\t\t\"⠟\",\n\t\t\"⡛\",\n\t\t\"⠛\",\n\t\t\"⠫\",\n\t\t\"⢋\",\n\t\t\"⠋\",\n\t\t\"⠍\",\n\t\t\"⡉\",\n\t\t\"⠉\",\n\t\t\"⠑\",\n\t\t\"⠡\",\n\t\t\"⢁\"\n\t],\n\tline: [\n\t\t\"-\",\n\t\t\"\\\\\",\n\t\t\"|\",\n\t\t\"/\"\n\t],\n\tline2: [\n\t\t\"⠂\",\n\t\t\"-\",\n\t\t\"–\",\n\t\t\"—\",\n\t\t\"–\",\n\t\t\"-\"\n\t],\n\tpipe: [\n\t\t\"┤\",\n\t\t\"┘\",\n\t\t\"┴\",\n\t\t\"└\",\n\t\t\"├\",\n\t\t\"┌\",\n\t\t\"┬\",\n\t\t\"┐\"\n\t],\n\tsimpleDots: [\n\t\t\". \",\n\t\t\".. \",\n\t\t\"...\",\n\t\t\" \"\n\t],\n\tsimpleDotsScrolling: [\n\t\t\". \",\n\t\t\".. \",\n\t\t\"...\",\n\t\t\" ..\",\n\t\t\" .\",\n\t\t\" \"\n\t],\n\tstar: [\n\t\t\"✶\",\n\t\t\"✸\",\n\t\t\"✹\",\n\t\t\"✺\",\n\t\t\"✹\",\n\t\t\"✷\"\n\t],\n\tstar2: [\n\t\t\"+\",\n\t\t\"x\",\n\t\t\"*\"\n\t],\n\tflip: [\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"-\",\n\t\t\"`\",\n\t\t\"`\",\n\t\t\"'\",\n\t\t\"´\",\n\t\t\"-\",\n\t\t\"_\",\n\t\t\"_\",\n\t\t\"_\"\n\t],\n\thamburger: [\n\t\t\"☱\",\n\t\t\"☲\",\n\t\t\"☴\"\n\t],\n\tgrowVertical: [\n\t\t\"▁\",\n\t\t\"▃\",\n\t\t\"▄\",\n\t\t\"▅\",\n\t\t\"▆\",\n\t\t\"▇\",\n\t\t\"▆\",\n\t\t\"▅\",\n\t\t\"▄\",\n\t\t\"▃\"\n\t],\n\tgrowHorizontal: [\n\t\t\"▏\",\n\t\t\"▎\",\n\t\t\"▍\",\n\t\t\"▌\",\n\t\t\"▋\",\n\t\t\"▊\",\n\t\t\"▉\",\n\t\t\"▊\",\n\t\t\"▋\",\n\t\t\"▌\",\n\t\t\"▍\",\n\t\t\"▎\"\n\t],\n\tballoon: [\n\t\t\" \",\n\t\t\".\",\n\t\t\"o\",\n\t\t\"O\",\n\t\t\"@\",\n\t\t\"*\",\n\t\t\" \"\n\t],\n\tballoon2: [\n\t\t\".\",\n\t\t\"o\",\n\t\t\"O\",\n\t\t\"°\",\n\t\t\"O\",\n\t\t\"o\",\n\t\t\".\"\n\t],\n\tnoise: [\n\t\t\"▓\",\n\t\t\"▒\",\n\t\t\"░\"\n\t],\n\tbounce: [\n\t\t\"⠁\",\n\t\t\"⠂\",\n\t\t\"⠄\",\n\t\t\"⠂\"\n\t],\n\tboxBounce: [\n\t\t\"▖\",\n\t\t\"▘\",\n\t\t\"▝\",\n\t\t\"▗\"\n\t],\n\tboxBounce2: [\n\t\t\"▌\",\n\t\t\"▀\",\n\t\t\"▐\",\n\t\t\"▄\"\n\t],\n\ttriangle: [\n\t\t\"◢\",\n\t\t\"◣\",\n\t\t\"◤\",\n\t\t\"◥\"\n\t],\n\tbinary: [\n\t\t\"010010\",\n\t\t\"001100\",\n\t\t\"100101\",\n\t\t\"111010\",\n\t\t\"111101\",\n\t\t\"010111\",\n\t\t\"101011\",\n\t\t\"111000\",\n\t\t\"110011\",\n\t\t\"110101\"\n\t],\n\tarc: [\n\t\t\"◜\",\n\t\t\"◠\",\n\t\t\"◝\",\n\t\t\"◞\",\n\t\t\"◡\",\n\t\t\"◟\"\n\t],\n\tcircle: [\n\t\t\"◡\",\n\t\t\"⊙\",\n\t\t\"◠\"\n\t],\n\tsquareCorners: [\n\t\t\"◰\",\n\t\t\"◳\",\n\t\t\"◲\",\n\t\t\"◱\"\n\t],\n\tcircleQuarters: [\n\t\t\"◴\",\n\t\t\"◷\",\n\t\t\"◶\",\n\t\t\"◵\"\n\t],\n\tcircleHalves: [\n\t\t\"◐\",\n\t\t\"◓\",\n\t\t\"◑\",\n\t\t\"◒\"\n\t],\n\tsquish: [\n\t\t\"╫\",\n\t\t\"╪\"\n\t],\n\ttoggle: [\n\t\t\"⊶\",\n\t\t\"⊷\"\n\t],\n\ttoggle2: [\n\t\t\"▫\",\n\t\t\"▪\"\n\t],\n\ttoggle3: [\n\t\t\"□\",\n\t\t\"■\"\n\t],\n\ttoggle4: [\n\t\t\"■\",\n\t\t\"□\",\n\t\t\"▪\",\n\t\t\"▫\"\n\t],\n\ttoggle5: [\n\t\t\"▮\",\n\t\t\"▯\"\n\t],\n\ttoggle6: [\n\t\t\"ဝ\",\n\t\t\"၀\"\n\t],\n\ttoggle7: [\n\t\t\"⦾\",\n\t\t\"⦿\"\n\t],\n\ttoggle8: [\n\t\t\"◍\",\n\t\t\"◌\"\n\t],\n\ttoggle9: [\n\t\t\"◉\",\n\t\t\"◎\"\n\t],\n\ttoggle10: [\n\t\t\"㊂\",\n\t\t\"㊀\",\n\t\t\"㊁\"\n\t],\n\ttoggle11: [\n\t\t\"⧇\",\n\t\t\"⧆\"\n\t],\n\ttoggle12: [\n\t\t\"☗\",\n\t\t\"☖\"\n\t],\n\ttoggle13: [\n\t\t\"=\",\n\t\t\"*\",\n\t\t\"-\"\n\t],\n\tarrow: [\n\t\t\"←\",\n\t\t\"↖\",\n\t\t\"↑\",\n\t\t\"↗\",\n\t\t\"→\",\n\t\t\"↘\",\n\t\t\"↓\",\n\t\t\"↙\"\n\t],\n\tarrow2: [\n\t\t\"⬆️ \",\n\t\t\"↗️ \",\n\t\t\"➡️ \",\n\t\t\"↘️ \",\n\t\t\"⬇️ \",\n\t\t\"↙️ \",\n\t\t\"⬅️ \",\n\t\t\"↖️ \"\n\t],\n\tarrow3: [\n\t\t\"▹▹▹▹▹\",\n\t\t\"▸▹▹▹▹\",\n\t\t\"▹▸▹▹▹\",\n\t\t\"▹▹▸▹▹\",\n\t\t\"▹▹▹▸▹\",\n\t\t\"▹▹▹▹▸\"\n\t],\n\tbouncingBar: [\n\t\t\"[ ]\",\n\t\t\"[= ]\",\n\t\t\"[== ]\",\n\t\t\"[=== ]\",\n\t\t\"[====]\",\n\t\t\"[ ===]\",\n\t\t\"[ ==]\",\n\t\t\"[ =]\",\n\t\t\"[ ]\",\n\t\t\"[ =]\",\n\t\t\"[ ==]\",\n\t\t\"[ ===]\",\n\t\t\"[====]\",\n\t\t\"[=== ]\",\n\t\t\"[== ]\",\n\t\t\"[= ]\"\n\t],\n\tbouncingBall: [\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ●)\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"( ● )\",\n\t\t\"(● )\"\n\t],\n\tsmiley: [\n\t\t\"😄 \",\n\t\t\"😝 \"\n\t],\n\tmonkey: [\n\t\t\"🙈 \",\n\t\t\"🙈 \",\n\t\t\"🙉 \",\n\t\t\"🙊 \"\n\t],\n\thearts: [\n\t\t\"💛 \",\n\t\t\"💙 \",\n\t\t\"💜 \",\n\t\t\"💚 \",\n\t\t\"❤️ \"\n\t],\n\tclock: [\n\t\t\"🕛 \",\n\t\t\"🕐 \",\n\t\t\"🕑 \",\n\t\t\"🕒 \",\n\t\t\"🕓 \",\n\t\t\"🕔 \",\n\t\t\"🕕 \",\n\t\t\"🕖 \",\n\t\t\"🕗 \",\n\t\t\"🕘 \",\n\t\t\"🕙 \",\n\t\t\"🕚 \"\n\t],\n\tearth: [\n\t\t\"🌍 \",\n\t\t\"🌎 \",\n\t\t\"🌏 \"\n\t],\n\tmoon: [\n\t\t\"🌑 \",\n\t\t\"🌒 \",\n\t\t\"🌓 \",\n\t\t\"🌔 \",\n\t\t\"🌕 \",\n\t\t\"🌖 \",\n\t\t\"🌗 \",\n\t\t\"🌘 \"\n\t],\n\trunner: [\n\t\t\"🚶 \",\n\t\t\"🏃 \"\n\t],\n\tdqpb: [\n\t\t\"d\",\n\t\t\"q\",\n\t\t\"p\",\n\t\t\"b\"\n\t],\n\tweather: [\n\t\t\"☀️ \",\n\t\t\"☀️ \",\n\t\t\"☀️ \",\n\t\t\"🌤 \",\n\t\t\"⛅️ \",\n\t\t\"🌥 \",\n\t\t\"☁️ \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"⛈ \",\n\t\t\"🌨 \",\n\t\t\"🌧 \",\n\t\t\"🌨 \",\n\t\t\"☁️ \",\n\t\t\"🌥 \",\n\t\t\"⛅️ \",\n\t\t\"🌤 \",\n\t\t\"☀️ \",\n\t\t\"☀️ \"\n\t],\n\tchristmas: [\n\t\t\"🌲\",\n\t\t\"🎄\"\n\t],\n\tgrenade: [\n\t\t\"، \",\n\t\t\"′ \",\n\t\t\" ´ \",\n\t\t\" ‾ \",\n\t\t\" ⸌\",\n\t\t\" ⸊\",\n\t\t\" |\",\n\t\t\" ⁎\",\n\t\t\" ⁕\",\n\t\t\" ෴ \",\n\t\t\" ⁓\",\n\t\t\" \",\n\t\t\" \",\n\t\t\" \"\n\t],\n\tpoint: [\n\t\t\"∙∙∙\",\n\t\t\"●∙∙\",\n\t\t\"∙●∙\",\n\t\t\"∙∙●\",\n\t\t\"∙∙∙\"\n\t],\n\tlayer: [\n\t\t\"-\",\n\t\t\"=\",\n\t\t\"≡\"\n\t],\n\tbetaWave: [\n\t\t\"ρββββββ\",\n\t\t\"βρβββββ\",\n\t\t\"ββρββββ\",\n\t\t\"βββρβββ\",\n\t\t\"ββββρββ\",\n\t\t\"βββββρβ\",\n\t\t\"ββββββρ\"\n\t],\n\tfingerDance: [\n\t\t\"🤘 \",\n\t\t\"🤟 \",\n\t\t\"🖖 \",\n\t\t\"✋ \",\n\t\t\"🤚 \",\n\t\t\"👆 \"\n\t],\n\tmindblown: [\n\t\t\"😐 \",\n\t\t\"😐 \",\n\t\t\"😮 \",\n\t\t\"😮 \",\n\t\t\"😦 \",\n\t\t\"😦 \",\n\t\t\"😧 \",\n\t\t\"😧 \",\n\t\t\"🤯 \",\n\t\t\"💥 \",\n\t\t\"✨ \",\n\t\t\"\\u3000 \",\n\t\t\"\\u3000 \",\n\t\t\"\\u3000 \"\n\t],\n\tspeaker: [\n\t\t\"🔈 \",\n\t\t\"🔉 \",\n\t\t\"🔊 \",\n\t\t\"🔉 \"\n\t],\n\torangePulse: [\n\t\t\"🔸 \",\n\t\t\"🔶 \",\n\t\t\"🟠 \",\n\t\t\"🟠 \",\n\t\t\"🔶 \"\n\t],\n\tbluePulse: [\n\t\t\"🔹 \",\n\t\t\"🔷 \",\n\t\t\"🔵 \",\n\t\t\"🔵 \",\n\t\t\"🔷 \"\n\t],\n\torangeBluePulse: [\n\t\t\"🔸 \",\n\t\t\"🔶 \",\n\t\t\"🟠 \",\n\t\t\"🟠 \",\n\t\t\"🔶 \",\n\t\t\"🔹 \",\n\t\t\"🔷 \",\n\t\t\"🔵 \",\n\t\t\"🔵 \",\n\t\t\"🔷 \"\n\t],\n\ttimeTravel: [\n\t\t\"🕛 \",\n\t\t\"🕚 \",\n\t\t\"🕙 \",\n\t\t\"🕘 \",\n\t\t\"🕗 \",\n\t\t\"🕖 \",\n\t\t\"🕕 \",\n\t\t\"🕔 \",\n\t\t\"🕓 \",\n\t\t\"🕒 \",\n\t\t\"🕑 \",\n\t\t\"🕐 \"\n\t],\n\taesthetic: [\n\t\t\"▰▱▱▱▱▱▱\",\n\t\t\"▰▰▱▱▱▱▱\",\n\t\t\"▰▰▰▱▱▱▱\",\n\t\t\"▰▰▰▰▱▱▱\",\n\t\t\"▰▰▰▰▰▱▱\",\n\t\t\"▰▰▰▰▰▰▱\",\n\t\t\"▰▰▰▰▰▰▰\",\n\t\t\"▰▱▱▱▱▱▱\"\n\t]\n}\n","function e(e=\"\",t={}){let{color:r,style:n=\"color:rgb(54, 165, 220); font-size: 10pt;\",hideInProduction:o,startSpinner:l=!1,stopSpinner:i=!1}=t;const a=f();void 0===o&&(o=\"undefined\"!=typeof window&&window?.location.hostname.includes(\"localhost\")),\"object\"==typeof e&&(e=g(e)+\"\\n\\n\"+JSON.stringify(e,null,2)),Array.isArray(r)&&1==r.length&&(r=r[0]),r&&void 0!==typeof process&&(e.includes(\"%c\")&&Array.isArray(r)?e=e.replace(/%c/g,(e,t)=>a[r[t]]||\"\"):r&&\"string\"==typeof r&&(e=(a[r]||\"\")+e+a.reset));var b=0;return l?(global||globalThis).interval=setInterval(()=>{process.stdout.write((Array.isArray(r)?a[r[0]]:a[r]||\"\")+\"\\r\"+\"⠋⠙⠹⠸⠼⠴⠦⠧⠇⠏\".split(\"\")[b=++b%10]+\" \"+e+a.reset)},50):i?(clearInterval((global||globalThis).interval),process.stdout.write(\"\\r\"+(e||\" \")+\" \".repeat(e.length+20)+\"\\n\")):\"string\"==typeof n?(1==n.split(\" \").length||r?n=`color: ${r||n}; font-size: 11pt;`:n.match(/^#[0-9a-fA-F]{6}$/)&&(n=`color: ${n}; font-size: 11pt;`),o?console.debug((n?\"%c\":\"\")+(e||\"\"),n):console.log((n?\"%c\":\"\")+(e||\"\"),n)):\"object\"==typeof n&&console.log(e,...n),!0}var t=/* @__PURE__ */(e=>(e.RESET=\"reset\",e.BLACK=\"black\",e.RED=\"red\",e.GREEN=\"green\",e.YELLOW=\"yellow\",e.BLUE=\"blue\",e.MAGENTA=\"magenta\",e.CYAN=\"cyan\",e.WHITE=\"white\",e.GRAY=\"gray\",e.BRIGHT_RED=\"brightRed\",e.BRIGHT_GREEN=\"brightGreen\",e.BRIGHT_YELLOW=\"brightYellow\",e.BRIGHT_BLUE=\"brightBlue\",e.BRIGHT_MAGENTA=\"brightMagenta\",e.BRIGHT_CYAN=\"brightCyan\",e.BRIGHT_WHITE=\"brightWhite\",e.BG_RED=\"bgRed\",e.BG_GREEN=\"bgGreen\",e.BG_YELLOW=\"bgYellow\",e.BG_BLUE=\"bgBlue\",e.BG_MAGENTA=\"bgMagenta\",e.BG_CYAN=\"bgCyan\",e.BG_WHITE=\"bgWhite\",e.BG_GRAY=\"bgGray\",e.BG_BLACK=\"bgBlack\",e.BG_BRIGHT_RED=\"bgBrightRed\",e.BG_BRIGHT_GREEN=\"bgBrightGreen\",e.BG_BRIGHT_YELLOW=\"bgBrightYellow\",e.BG_BRIGHT_BLUE=\"bgBrightBlue\",e.BG_BRIGHT_MAGENTA=\"bgBrightMagenta\",e.BG_BRIGHT_CYAN=\"bgBrightCyan\",e.BG_BRIGHT_WHITE=\"bgBrightWhite\",e))(t||{});const r={reset:[0,\"000000\"],black:[30,\"000000\"],red:[31,\"ff0000\"],green:[32,\"00ff00\"],yellow:[33,\"ffff00\"],blue:[34,\"0000ff\"],magenta:[35,\"ff00ff\"],cyan:[36,\"00ffff\"],white:[37,\"ffffff\"],gray:[90,\"808080\"],brightRed:[91,\"ff5555\"],brightGreen:[92,\"55ff55\"],brightYellow:[93,\"ffff55\"],brightBlue:[94,\"5555ff\"],brightMagenta:[95,\"ff55ff\"],brightCyan:[96,\"55ffff\"],brightWhite:[97,\"ffffff\"],bgBlack:[40,\"000000\"],bgRed:[41,\"ff0000\"],bgGreen:[42,\"00ff00\"],bgYellow:[43,\"ffff00\"],bgBlue:[44,\"0000ff\"],bgMagenta:[45,\"ff00ff\"],bgCyan:[46,\"00ffff\"],bgWhite:[47,\"ffffff\"],bgGray:[100,\"808080\"],bgBrightRed:[101,\"ff8888\"],bgBrightGreen:[102,\"88ff88\"],bgBrightYellow:[103,\"ffff88\"],bgBrightBlue:[104,\"8888ff\"],bgBrightMagenta:[105,\"ff88ff\"],bgBrightCyan:[106,\"88ffff\"],bgBrightWhite:[107,\"ffffff\"]};function f(e=\"ansi\"){const t={};for(const[f,[n,o]]of Object.entries(r))t[f]=\"html\"===e?\"#\"+o:\"\u001b[\"+n+\"m\";return t}function n(e){const t=f();return\"string\"==typeof e?t.yellow:\"number\"==typeof e?t.cyan:\"boolean\"==typeof e?t.magenta:\"function\"==typeof e?t.red:null===e?t.gray:Array.isArray(e)?t.blue:\"object\"==typeof e?t.green:t.white}function o(e){return\"string\"==typeof e?'\"\"':\"number\"==typeof e?\"number\":\"boolean\"==typeof e?\"bool\":\"function\"==typeof e?\"function\":null===e?\"null\":Array.isArray(e)?e.length?\"[\"+o(e[0])+\"]\":\"[]\":\"object\"==typeof e?\"{...}\":typeof e}function g(e,t=0,r=\"ansi\"){const l=f(r),i=\" \".repeat(t);var a=\"\";if(\"object\"!=typeof e||null===e){return n(e)+o(e)+l.reset}if(Array.isArray(e)){if(a=l.blue+\"[\"+l.reset,e.length&&(a+=\"\\n\"),!e.every(t=>typeof t==typeof e[0]))return e.forEach((r,f)=>{a+=i+\" \"+g(r,t+1),f<e.length-1&&(a+=\",\"),a+=\"\\n\"}),a+=i+l.blue+\"]\"+l.reset;a+=i+\" \"+g(e[0],t+1),a+=\",\",a+=\"\\n\"}a=l.green+\"{\"+l.reset;const b=Object.keys(e);return b.length&&(a+=\"\\n\"),b.forEach((r,f)=>{const s=e[r],y=n(s);a+=i+\" \",\"object\"!=typeof s||null===s||Array.isArray(s)?Array.isArray(s)?a+=y+r+l.reset+\": \"+g(s,t+1):a+=y+r+\": \"+o(s)+l.reset:a+=y+r+l.reset+\": \"+g(s,t+1),f<b.length-1&&(a+=\",\"),a+=\"\\n\"}),a+=i+l.green+\"}\"+l.reset}export{t as ColorName,f as getColors,e as log,g as printJSONStructure};\n//# sourceMappingURL=log.es.js.map\n","import{log as e,printJSONStructure as t}from\"./log.es.js\";async function o(r,a={}){var{headers:s,response:l={},method:d=(a.post?\"POST\":a.put?\"PUT\":a.patch?\"PATCH\":\"GET\"),cache:c=!1,cacheForTime:u=60,timeout:f=30,baseURL:p=\"undefined\"!=typeof process&&process.env.SERVER_API_URL||\"/api/\",cancelOngoingIfNew:g=!1,cancelNewIfOngoing:m=!1,rateLimit:y=0,debug:b=!1,infiniteScroll:w=null,setDefaults:h=!1,retryAttempts:v=0,logger:T=e,onRequest:L=null,onResponse:S=null,onError:E=null,onStream:x=null,repeatEvery:O=null,repeat:k=0,debounce:P=0,regrabOnStale:j=!1,regrabOnFocus:D=!1,regrabOnNetwork:N=!1,post:q=!1,put:A=!1,patch:F=!1,body:R=null,...$}={...\"undefined\"!=typeof window?window?.grab?.defaults:globalThis?.grab?.defaults||{},...a};let I=e=>r.startsWith(e);I(\"http:\")||I(\"https:\")?p=\"\":I(\"/\")||p.endsWith(\"/\")?I(\"/\")&&p.endsWith(\"/\")&&(r=r.slice(1)):r=\"/\"+r;try{if(P>0)return await n(async()=>{await o(r,{...a,debounce:0})},1e3*P);if(k>1){for(let e=0;e<k;e++)await o(r,{...a,repeat:0});return l}if(O)return setInterval(async()=>{await o(r,{...a,repeat:0,repeatEvery:null})},1e3*O),l;if(a?.setDefaults)return void(\"undefined\"!=typeof window?window.grab.defaults={...a,setDefaults:void 0}:void 0!==globalThis.grab&&(globalThis.grab.defaults={...a,setDefaults:void 0}));if(\"undefined\"!=typeof window){const e=async()=>await o(r,{...a,cache:!1});j&&c&&setTimeout(e,1e3*u),N&&window.addEventListener(\"online\",e),D&&(window.addEventListener(\"focus\",e),document.addEventListener(\"visibilitychange\",async()=>{\"visible\"===document.visibilityState&&await e()}))}let i=\"function\"==typeof l?l:null;l&&!i||(l={});var[J,H,C]=w||[];if(w?.length&&void 0!==C&&\"undefined\"!=typeof window){let t=\"string\"==typeof C?document.querySelector(C):C;t?window.scrollListener&&void 0!==t&&\"function\"==typeof t.removeEventListener&&t.removeEventListener(\"scroll\",window.scrollListener):e(\"paginateDOM not found\",{color:\"red\"}),window.scrollListener=async e=>{const t=e.target;localStorage.setItem(\"scroll\",JSON.stringify([t.scrollTop,t.scrollLeft,C])),t.scrollHeight-t.scrollTop<=t.clientHeight+200&&await o(r,{...a,cache:!1,[J]:v?.currentPage+1})},t&&t.addEventListener(\"scroll\",window.scrollListener)}let h=JSON.stringify(J?{...$,[J]:void 0}:$),v=o?.log?.find(e=>e.request==h&&e.path==r);if(J){let e=v?.currentPage+1||$?.[J]||1;v||(l[H]=[],e=1),v&&(v.currentPage=e),$={...$,[J]:e}}else{for(let e of Object.keys(l))l[e]=void 0;if(c&&(!u||v?.lastFetchTime>Date.now()-1e3*u)){for(let e of Object.keys(v.res))l[e]=v.res[e];i&&(l=i(l))}}if(i?i({isLoading:!0}):\"object\"==typeof l&&(l.isLoading=!0),i&&(l=i(l)),y>0&&v?.lastFetchTime&&v.lastFetchTime>Date.now()-1e3*y)throw new Error(`Fetch rate limit exceeded for ${r}. \\n Wait ${y}s between requests.`);if(v?.controller)if(g)v.controller.abort();else if(m)return{isLoading:!0};void 0!==o.log&&o.log?.unshift({path:r,request:h,lastFetchTime:Date.now(),controller:new AbortController});let E={method:d,headers:{\"Content-Type\":\"application/json\",Accept:\"application/json\",...s},body:$.body,redirect:\"follow\",cache:c?\"force-cache\":\"no-store\",signal:g?o.log[0]?.controller?.signal:AbortSignal.timeout(1e3*f)},q=\"\";[\"POST\",\"PUT\",\"PATCH\"].includes(d)?E.body=$.body||JSON.stringify($):q=(Object.keys($).length?\"?\":\"\")+new URLSearchParams($).toString(),\"function\"==typeof L&&([r,l,$,E]=L(r,l,$,E));let A=null,F=/* @__PURE__ */new Date,R=o.mock?.[r],I=e=>new Promise(t=>setTimeout(t,1e3*e||0));if(!R||R.params&&R.method!=d||R.params&&h!=JSON.stringify(R.params)){if(A=await fetch(p+r+q,E).catch(e=>{throw new Error(e.message)}),!A.ok)throw new Error(`HTTP error: ${A.status} ${A.statusText}`);let e=A.headers.get(\"content-type\");x?await x(A.body):A=await(e?e.includes(\"application/json\")?A&&A.json():e.includes(\"application/pdf\")||e.includes(\"application/octet-stream\")?A.blob():A.text():A.json()).catch(e=>{throw new Error(\"Error parsing response: \"+e)})}else await I(R.delay),A=\"function\"==typeof R.response?R.response($):R.response;\"function\"==typeof S&&([r,l,$,E]=S(r,l,$,E)),i?i({isLoading:void 0}):\"object\"==typeof l&&delete l?.isLoading,delete v?.controller;const U=((Number(/* @__PURE__ */new Date)-Number(F))/1e3).toFixed(1);if(b&&T(\"Path:\"+p+r+q+\"\\n\"+JSON.stringify(a,null,2)+\"\\nTime: \"+U+\"s\\nResponse: \"+t(A)),\"object\"==typeof A){for(let e of Object.keys(A))l[e]=H==e&&l[e]?.length?[...l[e],...A[e]]:A[e];void 0!==l&&(l.data=A)}else i?i({data:A,...A}):\"object\"==typeof l&&(l.data=A);return void 0!==o.log&&o.log?.unshift({path:r,request:JSON.stringify({...$,paginateKey:void 0}),response:l,lastFetchTime:Date.now()}),i&&(l=i(l)),l}catch(U){let e=\"Error: \"+U.message+\"\\nPath:\"+p+r+\"\\n\";return\"function\"==typeof E&&E(U.message,p+r,$),a.retryAttempts>0?await o(r,{...a,retryAttempts:--a.retryAttempts}):(!U.message.includes(\"signal\")&&a.debug&&(T(e,{color:\"red\"}),b&&\"undefined\"!=typeof document&&i(e)),l.error=U.message,\"function\"==typeof l?(l.data=l({isLoading:void 0,error:U.message}),l=l.data):delete l?.isLoading,void 0!==o.log&&o.log?.unshift({path:r,request:JSON.stringify($),error:U.message}),l)}}o.instance=(e={})=>(t,n={})=>o(t,{...e,...n});const n=async(e,t)=>{let o;return async function(...n){clearTimeout(o),o=setTimeout(async()=>{clearTimeout(o),await e(...n)},t)}};function i(e){if(\"undefined\"==typeof document)return;let t,o=document.getElementById(\"alert-overlay\");o||(o=document.body.appendChild(document.createElement(\"div\")),o.id=\"alert-overlay\",o.setAttribute(\"style\",\"position:fixed;inset:0;z-index:9999;background:rgba(0,0,0,0.5);display:flex;align-items:center;justify-content:center\"),o.innerHTML='<div id=\"alert-box\" style=\"background:#fff;padding:1.5em 2em;border-radius:8px;box-shadow:0 2px 16px #0003;min-width:220px;max-height:80vh;position:relative;display:flex;flex-direction:column;\">\\n <button id=\"close-alert\" style=\"position:absolute;top:12px;right:20px;font-size:1.5em;background:none;border:none;cursor:pointer;color:black;\">&times;</button>\\n <div id=\"alert-list\" style=\"overflow:auto;flex:1;\"></div>\\n </div>',o.addEventListener(\"click\",e=>e.target==o&&o.remove()),document.getElementById(\"close-alert\").onclick=()=>o.remove()),t=o.querySelector(\"#alert-list\"),t.innerHTML+=`<div style=\"border-bottom:1px solid #333; font-size:1.2em;margin:0.5em 0;\">${e}</div>`}function r(){document.addEventListener(\"keydown\",e=>{if(\"i\"===e.key&&e.ctrlKey&&e.altKey){let e=\" \";for(let n of o.log)e+=`<div style=\"margin-bottom:1em; border-bottom:1px solid #ccc; padding-bottom:1em;\">\\n <b>Path:</b> ${n.path}<br>\\n <b>Request:</b> ${t(n.request,0,\"html\")}<br>\\n <b>Response:</b> ${t(n.response,0,\"html\")}<br> \\n <b>Time:</b> ${new Date(n.lastFetchTime).toLocaleString()}\\n </div>`;i(e)}})}\"undefined\"!=typeof window?(window.log=e,window.grab=o,window.grab.log=[],window.grab.mock={},window.grab.defaults={},r(),document.addEventListener(\"DOMContentLoaded\",()=>{let[e,t,o]=JSON.parse(localStorage.getItem(\"scroll\"))||[];e&&(document.querySelector(o).scrollTop=e,document.querySelector(o).scrollLeft=t)})):\"undefined\"!=typeof globalThis&&(o.log=[],o.mock={},o.defaults={},globalThis.log=e,globalThis.grab=o.instance());export{o as default,o as grab,e as log,t as printJSONStructure,r as setupDevTools,i as showAlert};\n//# sourceMappingURL=grab-api.es.js.map\n","const _readline = require('readline');\n\n// low-level terminal interactions\nclass Terminal{\n\n constructor(outputStream){\n this.stream = outputStream;\n\n // default: line wrapping enabled\n this.linewrap = true;\n\n // current, relative y position\n this.dy = 0;\n }\n\n // save cursor position + settings\n cursorSave(){\n if (!this.stream.isTTY){\n return;\n }\n\n // save position\n this.stream.write('\\x1B7');\n }\n\n // restore last cursor position + settings\n cursorRestore(){\n if (!this.stream.isTTY){\n return;\n }\n\n // restore cursor\n this.stream.write('\\x1B8');\n }\n\n // show/hide cursor\n cursor(enabled){\n if (!this.stream.isTTY){\n return;\n }\n\n if (enabled){\n this.stream.write('\\x1B[?25h');\n }else{\n this.stream.write('\\x1B[?25l');\n }\n }\n\n // change cursor positionn\n cursorTo(x=null, y=null){\n if (!this.stream.isTTY){\n return;\n }\n\n // move cursor absolute\n _readline.cursorTo(this.stream, x, y);\n }\n\n // change relative cursor position\n cursorRelative(dx=null, dy=null){\n if (!this.stream.isTTY){\n return;\n }\n\n // store current position\n this.dy = this.dy + dy;\n \n // move cursor relative\n _readline.moveCursor(this.stream, dx, dy);\n }\n\n // relative reset\n cursorRelativeReset(){\n if (!this.stream.isTTY){\n return;\n }\n\n // move cursor to initial line\n _readline.moveCursor(this.stream, 0, -this.dy);\n\n // first char\n _readline.cursorTo(this.stream, 0, null);\n\n // reset counter\n this.dy = 0;\n }\n\n // clear to the right from cursor\n clearRight(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearLine(this.stream, 1);\n }\n\n // clear the full line\n clearLine(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearLine(this.stream, 0);\n }\n\n // clear everyting beyond the current line\n clearBottom(){\n if (!this.stream.isTTY){\n return;\n }\n\n _readline.clearScreenDown(this.stream);\n }\n\n // add new line; increment counter\n newline(){\n this.stream.write('\\n');\n this.dy++;\n }\n\n // write content to output stream\n // @TODO use string-width to strip length\n write(s, rawWrite=false){\n // line wrapping enabled ? trim output\n // this is just a fallback mechanism in case user enabled line-wrapping via options or set it to auto\n if (this.linewrap === true && rawWrite === false){\n this.stream.write(s.substr(0, this.getWidth()));\n\n // standard behaviour with disabled linewrapping\n }else{\n this.stream.write(s);\n }\n }\n\n // control line wrapping\n lineWrapping(enabled){\n if (!this.stream.isTTY){\n return;\n }\n\n // store state\n this.linewrap = enabled;\n if (enabled){\n this.stream.write('\\x1B[?7h');\n }else{\n this.stream.write('\\x1B[?7l');\n }\n }\n\n // tty environment ?\n isTTY(){\n return (this.stream.isTTY === true);\n }\n\n // get terminal width\n getWidth(){\n // set max width to 80 in tty-mode and 200 in notty-mode\n return this.stream.columns || (this.stream.isTTY ? 80 : 200);\n }\n}\n\nmodule.exports = Terminal;\n","'use strict';\nconst ansiRegex = require('ansi-regex');\n\nmodule.exports = string => typeof string === 'string' ? string.replace(ansiRegex(), '') : string;\n","'use strict';\n\nmodule.exports = ({onlyFirst = false} = {}) => {\n\tconst pattern = [\n\t\t'[\\\\u001B\\\\u009B][[\\\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]+)*|[a-zA-Z\\\\d]+(?:;[-a-zA-Z\\\\d\\\\/#&.:=?%@~_]*)*)?\\\\u0007)',\n\t\t'(?:(?:\\\\d{1,4}(?:;\\\\d{0,4})*)?[\\\\dA-PR-TZcf-ntqry=><~]))'\n\t].join('|');\n\n\treturn new RegExp(pattern, onlyFirst ? undefined : 'g');\n};\n","'use strict';\nconst stripAnsi = require('strip-ansi');\nconst isFullwidthCodePoint = require('is-fullwidth-code-point');\nconst emojiRegex = require('emoji-regex');\n\nconst stringWidth = string => {\n\tif (typeof string !== 'string' || string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = stripAnsi(string);\n\n\tif (string.length === 0) {\n\t\treturn 0;\n\t}\n\n\tstring = string.replace(emojiRegex(), ' ');\n\n\tlet width = 0;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst code = string.codePointAt(i);\n\n\t\t// Ignore control characters\n\t\tif (code <= 0x1F || (code >= 0x7F && code <= 0x9F)) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Ignore combining characters\n\t\tif (code >= 0x300 && code <= 0x36F) {\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Surrogates\n\t\tif (code > 0xFFFF) {\n\t\t\ti++;\n\t\t}\n\n\t\twidth += isFullwidthCodePoint(code) ? 2 : 1;\n\t}\n\n\treturn width;\n};\n\nmodule.exports = stringWidth;\n// TODO: remove this in the next major version\nmodule.exports.default = stringWidth;\n","/* eslint-disable yoda */\n'use strict';\n\nconst isFullwidthCodePoint = codePoint => {\n\tif (Number.isNaN(codePoint)) {\n\t\treturn false;\n\t}\n\n\t// Code points are derived from:\n\t// http://www.unix.org/Public/UNIDATA/EastAsianWidth.txt\n\tif (\n\t\tcodePoint >= 0x1100 && (\n\t\t\tcodePoint <= 0x115F || // Hangul Jamo\n\t\t\tcodePoint === 0x2329 || // LEFT-POINTING ANGLE BRACKET\n\t\t\tcodePoint === 0x232A || // RIGHT-POINTING ANGLE BRACKET\n\t\t\t// CJK Radicals Supplement .. Enclosed CJK Letters and Months\n\t\t\t(0x2E80 <= codePoint && codePoint <= 0x3247 && codePoint !== 0x303F) ||\n\t\t\t// Enclosed CJK Letters and Months .. CJK Unified Ideographs Extension A\n\t\t\t(0x3250 <= codePoint && codePoint <= 0x4DBF) ||\n\t\t\t// CJK Unified Ideographs .. Yi Radicals\n\t\t\t(0x4E00 <= codePoint && codePoint <= 0xA4C6) ||\n\t\t\t// Hangul Jamo Extended-A\n\t\t\t(0xA960 <= codePoint && codePoint <= 0xA97C) ||\n\t\t\t// Hangul Syllables\n\t\t\t(0xAC00 <= codePoint && codePoint <= 0xD7A3) ||\n\t\t\t// CJK Compatibility Ideographs\n\t\t\t(0xF900 <= codePoint && codePoint <= 0xFAFF) ||\n\t\t\t// Vertical Forms\n\t\t\t(0xFE10 <= codePoint && codePoint <= 0xFE19) ||\n\t\t\t// CJK Compatibility Forms .. Small Form Variants\n\t\t\t(0xFE30 <= codePoint && codePoint <= 0xFE6B) ||\n\t\t\t// Halfwidth and Fullwidth Forms\n\t\t\t(0xFF01 <= codePoint && codePoint <= 0xFF60) ||\n\t\t\t(0xFFE0 <= codePoint && codePoint <= 0xFFE6) ||\n\t\t\t// Kana Supplement\n\t\t\t(0x1B000 <= codePoint && codePoint <= 0x1B001) ||\n\t\t\t// Enclosed Ideographic Supplement\n\t\t\t(0x1F200 <= codePoint && codePoint <= 0x1F251) ||\n\t\t\t// CJK Unified Ideographs Extension B .. Tertiary Ideographic Plane\n\t\t\t(0x20000 <= codePoint && codePoint <= 0x3FFFD)\n\t\t)\n\t) {\n\t\treturn true;\n\t}\n\n\treturn false;\n};\n\nmodule.exports = isFullwidthCodePoint;\nmodule.exports.default = isFullwidthCodePoint;\n","\"use strict\";\n\nmodule.exports = function () {\n // https://mths.be/emoji\n return /\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68\\uD83C\\uDFFB|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFE])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D[\\uDC68\\uDC69])\\u200D(?:\\uD83D[\\uDC66\\uDC67])|[\\u2695\\u2696\\u2708]\\uFE0F|\\uD83D[\\uDC66\\uDC67]|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|(?:\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708])\\uFE0F|\\uD83C\\uDFFB\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFB\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)\\uD83C\\uDFFB|\\uD83E\\uDDD1(?:\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1)|(?:\\uD83E\\uDDD1\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFF\\u200D\\uD83E\\uDD1D\\u200D(?:\\uD83D[\\uDC68\\uDC69]))(?:\\uD83C[\\uDFFB-\\uDFFE])|(?:\\uD83E\\uDDD1\\uD83C\\uDFFC\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB\\uDFFC])|\\uD83D\\uDC69(?:\\uD83C\\uDFFE\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB-\\uDFFD\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFC\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFD-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFB\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFC-\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFD\\u200D(?:\\uD83E\\uDD1D\\u200D\\uD83D\\uDC68(?:\\uD83C[\\uDFFB\\uDFFC\\uDFFE\\uDFFF])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD])|\\uD83C\\uDFFF\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\uD83E[\\uDDAF-\\uDDB3\\uDDBC\\uDDBD]))|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67]))|(?:\\uD83E\\uDDD1\\uD83C\\uDFFD\\u200D\\uD83E\\uDD1D\\u200D\\uD83E\\uDDD1|\\uD83D\\uDC69\\uD83C\\uDFFE\\u200D\\uD83E\\uDD1D\\u200D\\uD83D\\uDC69)(?:\\uD83C[\\uDFFB-\\uDFFD])|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC69\\u200D(?:\\uD83D[\\uDC66\\uDC67])|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C\\uDFFF\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFE\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFC\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFB\\u200D[\\u2695\\u2696\\u2708]|\\uD83C\\uDFFD\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708])|(?:(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)\\uFE0F|\\uD83D\\uDC6F|\\uD83E[\\uDD3C\\uDDDE\\uDDDF])\\u200D[\\u2640\\u2642]|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642]|\\u200D[\\u2640\\u2642])|\\uD83C\\uDFF4\\u200D\\u2620)\\uFE0F|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|\\uD83D\\uDC15\\u200D\\uD83E\\uDDBA|\\uD83D\\uDC69\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D\\uD83D\\uDC67|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDF6\\uD83C\\uDDE6|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83E\\uDDD1(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDB8\\uDDB9\\uDDCD-\\uDDCF\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC6B-\\uDC6D\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDB5\\uDDB6\\uDDBB\\uDDD2-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDED5\\uDEEB\\uDEEC\\uDEF4-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u265F\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267E\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDED5\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEFA\\uDFE0-\\uDFEB]|\\uD83E[\\uDD0D-\\uDD3A\\uDD3C-\\uDD45\\uDD47-\\uDD71\\uDD73-\\uDD76\\uDD7A-\\uDDA2\\uDDA5-\\uDDAA\\uDDAE-\\uDDCA\\uDDCD-\\uDDFF\\uDE70-\\uDE73\\uDE78-\\uDE7A\\uDE80-\\uDE82\\uDE90-\\uDE95])\\uFE0F|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDC8F\\uDC91\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD0F\\uDD18-\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3C-\\uDD3E\\uDDB5\\uDDB6\\uDDB8\\uDDB9\\uDDBB\\uDDCD-\\uDDCF\\uDDD1-\\uDDDD])/g;\n};\n","// default value format (apply autopadding)\n\n// format valueset\nmodule.exports = function formatValue(v, options, type){\n // no autopadding ? passthrough\n if (options.autopadding !== true){\n return v;\n }\n\n // padding\n function autopadding(value, length){\n return (options.autopaddingChar + value).slice(-length);\n }\n\n switch (type){\n case 'percentage':\n return autopadding(v, 3);\n\n default:\n return v;\n }\n}","// format bar\nmodule.exports = function formatBar(progress, options){\n // calculate barsize\n const completeSize = Math.round(progress*options.barsize);\n const incompleteSize = options.barsize-completeSize;\n\n // generate bar string by stripping the pre-rendered strings\n return options.barCompleteString.substr(0, completeSize) +\n options.barGlue +\n options.barIncompleteString.substr(0, incompleteSize);\n}","// default time format\n\n// format a number of seconds into hours and minutes as appropriate\nmodule.exports = function formatTime(t, options, roundToMultipleOf){\n function round(input) {\n if (roundToMultipleOf) {\n return roundToMultipleOf * Math.round(input / roundToMultipleOf);\n } else {\n return input\n }\n }\n\n // leading zero padding\n function autopadding(v){\n return (options.autopaddingChar + v).slice(-2);\n }\n\n // > 1h ?\n if (t > 3600) {\n return autopadding(Math.floor(t / 3600)) + 'h' + autopadding(round((t % 3600) / 60)) + 'm';\n\n // > 60s ?\n } else if (t > 60) {\n return autopadding(Math.floor(t / 60)) + 'm' + autopadding(round((t % 60))) + 's';\n\n // > 10s ?\n } else if (t > 10) {\n return autopadding(round(t)) + 's';\n\n // default: don't apply round to multiple\n }else{\n return autopadding(t) + 's';\n }\n}","const _stringWidth = require('string-width');\nconst _defaultFormatValue = require('./format-value');\nconst _defaultFormatBar = require('./format-bar');\nconst _defaultFormatTime = require('./format-time');\n\n// generic formatter\nmodule.exports = function defaultFormatter(options, params, payload){\n\n // copy format string\n let s = options.format;\n\n // custom time format set ?\n const formatTime = options.formatTime || _defaultFormatTime;\n \n // custom value format set ?\n const formatValue = options.formatValue || _defaultFormatValue;\n\n // custom bar format set ?\n const formatBar = options.formatBar || _defaultFormatBar;\n\n // calculate progress in percent\n const percentage = Math.floor(params.progress*100) + '';\n\n // bar stopped and stopTime set ?\n const stopTime = params.stopTime || Date.now();\n\n // calculate elapsed time\n const elapsedTime = Math.round((stopTime - params.startTime)/1000);\n\n // merges data from payload and calculated\n const context = Object.assign({}, payload, {\n bar: formatBar(params.progress, options),\n\n percentage: formatValue(percentage, options, 'percentage'),\n total: formatValue(params.total, options, 'total'),\n value: formatValue(params.value, options, 'value'),\n\n eta: formatValue(params.eta, options, 'eta'),\n eta_formatted: formatTime(params.eta, options, 5),\n \n duration: formatValue(elapsedTime, options, 'duration'),\n duration_formatted: formatTime(elapsedTime, options, 1)\n });\n\n // assign placeholder tokens\n s = s.replace(/\\{(\\w+)\\}/g, function(match, key){\n // key exists within payload/context\n if (typeof context[key] !== 'undefined') {\n return context[key];\n }\n\n // no changes to unknown values\n return match;\n });\n\n // calculate available whitespace (2 characters margin of error)\n const fullMargin = Math.max(0, params.maxWidth - _stringWidth(s) -2);\n const halfMargin = Math.floor(fullMargin / 2);\n\n // distribute available whitespace according to position\n switch (options.align) {\n\n // fill start-of-line with whitespaces\n case 'right':\n s = (fullMargin > 0) ? ' '.repeat(fullMargin) + s : s;\n break;\n\n // distribute whitespaces to left+right\n case 'center':\n s = (halfMargin > 0) ? ' '.repeat(halfMargin) + s : s;\n break;\n\n // default: left align, no additional whitespaces\n case 'left':\n default:\n break;\n }\n\n return s;\n}\n","// utility to merge defaults\nfunction mergeOption(v, defaultValue){\n if (typeof v === 'undefined' || v === null){\n return defaultValue;\n }else{\n return v;\n }\n}\n\nmodule.exports = {\n // set global options\n parse: function parse(rawOptions, preset){\n\n // options storage\n const options = {};\n\n // merge preset\n const opt = Object.assign({}, preset, rawOptions);\n\n // the max update rate in fps (redraw will only triggered on value change)\n options.throttleTime = 1000 / (mergeOption(opt.fps, 10));\n\n // the output stream to write on\n options.stream = mergeOption(opt.stream, process.stderr);\n\n // external terminal provided ?\n options.terminal = mergeOption(opt.terminal, null);\n\n // clear on finish ?\n options.clearOnComplete = mergeOption(opt.clearOnComplete, false);\n\n // stop on finish ?\n options.stopOnComplete = mergeOption(opt.stopOnComplete, false);\n\n // size of the progressbar in chars\n options.barsize = mergeOption(opt.barsize, 40);\n\n // position of the progress bar - 'left' (default), 'right' or 'center'\n options.align = mergeOption(opt.align, 'left');\n\n // hide the cursor ?\n options.hideCursor = mergeOption(opt.hideCursor, false);\n\n // disable linewrapping ?\n options.linewrap = mergeOption(opt.linewrap, false);\n\n // glue sequence (control chars) between bar elements ?\n options.barGlue = mergeOption(opt.barGlue, '');\n\n // bar chars\n options.barCompleteChar = mergeOption(opt.barCompleteChar, '=');\n options.barIncompleteChar = mergeOption(opt.barIncompleteChar, '-');\n\n // the bar format\n options.format = mergeOption(opt.format, 'progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}');\n\n // external time-format provided ?\n options.formatTime = mergeOption(opt.formatTime, null);\n\n // external value-format provided ?\n options.formatValue = mergeOption(opt.formatValue, null);\n\n // external bar-format provided ?\n options.formatBar = mergeOption(opt.formatBar, null);\n\n // the number of results to average ETA over\n options.etaBufferLength = mergeOption(opt.etaBuffer, 10);\n\n // automatic eta updates based on fps\n options.etaAsynchronousUpdate = mergeOption(opt.etaAsynchronousUpdate, false);\n\n // progress calculation relative to start value ? default start at 0\n options.progressCalculationRelative = mergeOption(opt.progressCalculationRelative, false);\n\n // allow synchronous updates ?\n options.synchronousUpdate = mergeOption(opt.synchronousUpdate, true);\n\n // notty mode\n options.noTTYOutput = mergeOption(opt.noTTYOutput, false);\n\n // schedule - 2s\n options.notTTYSchedule = mergeOption(opt.notTTYSchedule, 2000);\n \n // emptyOnZero - false\n options.emptyOnZero = mergeOption(opt.emptyOnZero, false);\n\n // force bar redraw even if progress did not change\n options.forceRedraw = mergeOption(opt.forceRedraw, false);\n\n // automated padding to fixed width ?\n options.autopadding = mergeOption(opt.autopadding, false);\n\n // stop bar on SIGINT/SIGTERM to restore cursor settings ?\n options.gracefulExit = mergeOption(opt.gracefulExit, false);\n\n return options;\n },\n\n // derived options: instance specific, has to be created for every bar element\n assignDerivedOptions: function assignDerivedOptions(options){\n // pre-render bar strings (performance)\n options.barCompleteString = options.barCompleteChar.repeat(options.barsize + 1);\n options.barIncompleteString = options.barIncompleteChar.repeat(options.barsize + 1);\n\n // autopadding character - empty in case autopadding is disabled\n options.autopaddingChar = options.autopadding ? mergeOption(options.autopaddingChar, ' ') : '';\n\n return options;\n }\n};","const _ETA = require('./eta');\nconst _Terminal = require('./terminal');\nconst _formatter = require('./formatter');\nconst _options = require('./options');\nconst _EventEmitter = require('events');\n\n// Progress-Bar constructor\nmodule.exports = class GenericBar extends _EventEmitter{\n\n constructor(options){\n super();\n\n // store options and assign derived ones (instance specific)\n this.options = _options.assignDerivedOptions(options);\n\n // store terminal instance\n this.terminal = (this.options.terminal) ? this.options.terminal : new _Terminal(this.options.stream);\n\n // the current bar value\n this.value = 0;\n\n // bar start value (used for progress calculation)\n this.startValue = 0;\n\n // the end value of the bar\n this.total = 100;\n\n // last drawn string - only render on change!\n this.lastDrawnString = null;\n\n // start time (used for eta calculation)\n this.startTime = null;\n\n // stop time (used for duration calculation)\n this.stopTime = null;\n\n // last update time\n this.lastRedraw = Date.now();\n\n // default eta calculator (will be re-create on start)\n this.eta = new _ETA(this.options.etaBufferLength, 0, 0);\n\n // payload data\n this.payload = {};\n\n // progress bar active ?\n this.isActive = false;\n\n // use default formatter or custom one ?\n this.formatter = (typeof this.options.format === 'function') ? this.options.format : _formatter;\n }\n\n // internal render function\n render(forceRendering=false){\n\n // formatter params\n const params = {\n progress: this.getProgress(),\n eta: this.eta.getTime(),\n startTime: this.startTime,\n stopTime: this.stopTime,\n total: this.total,\n value: this.value,\n maxWidth: this.terminal.getWidth()\n };\n\n // automatic eta update ? (long running processes)\n if (this.options.etaAsynchronousUpdate){\n this.updateETA();\n }\n\n // format string\n const s = this.formatter(this.options, params, this.payload);\n\n const forceRedraw = forceRendering || this.options.forceRedraw\n // force redraw in notty-mode!\n || (this.options.noTTYOutput && !this.terminal.isTTY());\n\n // string changed ? only trigger redraw on change!\n if (forceRedraw || this.lastDrawnString != s){\n // trigger event\n this.emit('redraw-pre');\n\n // set cursor to start of line\n this.terminal.cursorTo(0, null);\n\n // write output\n this.terminal.write(s);\n\n // clear to the right from cursor\n this.terminal.clearRight();\n\n // store string\n this.lastDrawnString = s;\n\n // set last redraw time\n this.lastRedraw = Date.now();\n\n // trigger event\n this.emit('redraw-post');\n }\n }\n\n // start the progress bar\n start(total, startValue, payload){\n // set initial values\n this.value = startValue || 0;\n this.total = (typeof total !== 'undefined' && total >= 0) ? total : 100;\n\n // set start value for progress calculation\n this.startValue = (startValue || 0);\n\n // store payload (optional)\n this.payload = payload || {};\n\n // store start time for duration+eta calculation\n this.startTime = Date.now();\n\n // reset stop time for 're-start' scenario (used for duration calculation)\n this.stopTime = null;\n\n // reset string line buffer (redraw detection)\n this.lastDrawnString = '';\n\n // initialize eta buffer\n this.eta = new _ETA(this.options.etaBufferLength, this.startTime, this.value);\n\n // set flag\n this.isActive = true;\n\n // start event\n this.emit('start', total, startValue);\n }\n\n // stop the bar\n stop(){\n // set flag\n this.isActive = false;\n \n // store stop timestamp to get total duration\n this.stopTime = Date.now();\n\n // stop event\n this.emit('stop', this.total, this.value);\n }\n\n // update the bar value\n // update(value, payload)\n // update(payload)\n update(arg0, arg1 = {}){\n // value set ?\n // update(value, [payload]);\n if (typeof arg0 === 'number') {\n // update value\n this.value = arg0;\n\n // add new value; recalculate eta\n this.eta.update(Date.now(), arg0, this.total);\n }\n\n // extract payload\n // update(value, payload)\n // update(payload)\n const payloadData = ((typeof arg0 === 'object') ? arg0 : arg1) || {};\n\n // update event (before stop() is called)\n this.emit('update', this.total, this.value);\n\n // merge payload\n for (const key in payloadData){\n this.payload[key] = payloadData[key];\n }\n\n // limit reached ? autostop set ?\n if (this.value >= this.getTotal() && this.options.stopOnComplete) {\n this.stop();\n }\n }\n\n // calculate the actual progress value\n getProgress(){\n // calculate the normalized current progress\n let progress = (this.value/this.total);\n\n // use relative progress calculation ? range between startValue and total is then used as 100%\n // startValue (offset) is ignored for calculations\n if (this.options.progressCalculationRelative){\n progress = (this.value-this.startValue)/(this.total-this.startValue);\n }\n\n // handle NaN Errors caused by total=0. Set to complete in this case\n if (isNaN(progress)){\n progress = (this.options && this.options.emptyOnZero) ? 0.0 : 1.0;\n }\n\n // limiter\n progress = Math.min(Math.max(progress, 0.0), 1.0);\n\n return progress;\n }\n\n // update the bar value\n // increment(delta, payload)\n // increment(payload)\n increment(arg0 = 1, arg1 = {}){\n // increment([payload]) => step=1\n // handle the use case when `step` is omitted but payload is passed\n if (typeof arg0 === 'object') {\n this.update(this.value + 1, arg0);\n \n // increment([step=1], [payload={}])\n }else{\n this.update(this.value + arg0, arg1);\n }\n }\n\n // get the total (limit) value\n getTotal(){\n return this.total;\n }\n\n // set the total (limit) value\n setTotal(total){\n if (typeof total !== 'undefined' && total >= 0){\n this.total = total;\n }\n }\n\n // force eta calculation update (long running processes)\n updateETA(){\n // add new value; recalculate eta\n this.eta.update(Date.now(), this.value, this.total);\n }\n}\n","\n// ETA calculation\nclass ETA{\n\n constructor(length, initTime, initValue){\n // size of eta buffer\n this.etaBufferLength = length || 100;\n\n // eta buffer with initial values\n this.valueBuffer = [initValue];\n this.timeBuffer = [initTime];\n\n // eta time value\n this.eta = '0';\n }\n\n // add new values to calculation buffer\n update(time, value, total){\n this.valueBuffer.push(value);\n this.timeBuffer.push(time);\n\n // trigger recalculation\n this.calculate(total-value);\n }\n\n // fetch estimated time\n getTime(){\n return this.eta;\n }\n\n // eta calculation - request number of remaining events\n calculate(remaining){\n // get number of samples in eta buffer\n const currentBufferSize = this.valueBuffer.length;\n const buffer = Math.min(this.etaBufferLength, currentBufferSize);\n\n const v_diff = this.valueBuffer[currentBufferSize - 1] - this.valueBuffer[currentBufferSize - buffer];\n const t_diff = this.timeBuffer[currentBufferSize - 1] - this.timeBuffer[currentBufferSize - buffer];\n\n // get progress per ms\n const vt_rate = v_diff/t_diff;\n\n // strip past elements\n this.valueBuffer = this.valueBuffer.slice(-this.etaBufferLength);\n this.timeBuffer = this.timeBuffer.slice(-this.etaBufferLength);\n\n // eq: vt_rate *x = total\n const eta = Math.ceil(remaining/vt_rate/1000);\n\n // check values\n if (isNaN(eta)){\n this.eta = 'NULL';\n\n // +/- Infinity --- NaN already handled\n }else if (!isFinite(eta)){\n this.eta = 'INF';\n\n // > 10M s ? - set upper display limit ~115days (1e7/60/60/24)\n }else if (eta > 1e7){\n this.eta = 'INF';\n\n // negative ?\n }else if (eta < 0){\n this.eta = 0;\n\n }else{\n // assign\n this.eta = eta;\n }\n }\n}\n\nmodule.exports = ETA;","const _legacy = require('./legacy');\nconst _shades_classic = require('./shades-classic');\nconst _shades_grey = require('./shades-grey');\nconst _rect = require('./rect');\n\nmodule.exports = {\n legacy: _legacy,\n shades_classic: _shades_classic,\n shades_grey: _shades_grey,\n rect: _rect\n};","// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: 'progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '=',\n barIncompleteChar: '-'\n};","// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: ' {bar} {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591'\n};","\n// cli-progress legacy style as of 1.x\nmodule.exports = {\n format: ' \\u001b[90m{bar}\\u001b[0m {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u2588',\n barIncompleteChar: '\\u2591'\n};","module.exports = {\n format: ' {bar}\\u25A0 {percentage}% | ETA: {eta}s | {value}/{total}',\n barCompleteChar: '\\u25A0',\n barIncompleteChar: ' '\n};","const _SingleBar = require('./lib/single-bar');\nconst _MultiBar = require('./lib/multi-bar');\nconst _Presets = require('./presets/index');\nconst _Formatter = require('./lib/formatter');\nconst _defaultFormatValue = require('./lib/format-value');\nconst _defaultFormatBar = require('./lib/format-bar');\nconst _defaultFormatTime = require('./lib/format-time');\n\n// sub-module access\nmodule.exports = {\n Bar: _SingleBar,\n SingleBar: _SingleBar,\n MultiBar: _MultiBar,\n Presets: _Presets,\n Format: {\n Formatter: _Formatter,\n BarFormat: _defaultFormatBar,\n ValueFormat: _defaultFormatValue,\n TimeFormat: _defaultFormatTime\n }\n};","const _GenericBar = require('./generic-bar');\nconst _options = require('./options');\n\n// Progress-Bar constructor\nmodule.exports = class SingleBar extends _GenericBar{\n\n constructor(options, preset){\n super(_options.parse(options, preset));\n\n // the update timer\n this.timer = null;\n\n // disable synchronous updates in notty mode\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.options.synchronousUpdate = false;\n }\n\n // update interval\n this.schedulingRate = (this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule);\n\n // callback used for gracefulExit\n this.sigintCallback = null;\n }\n\n // internal render function\n render(){\n // stop timer\n if (this.timer){\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n // run internal rendering\n super.render();\n\n // add new line in notty mode!\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.terminal.newline();\n }\n\n // next update\n this.timer = setTimeout(this.render.bind(this), this.schedulingRate);\n }\n\n update(current, payload){\n // timer inactive ?\n if (!this.timer) {\n return;\n }\n\n super.update(current, payload);\n\n // trigger synchronous update ?\n // check for throttle time \n if (this.options.synchronousUpdate && (this.lastRedraw + this.options.throttleTime*2) < Date.now()){\n // force update\n this.render();\n }\n }\n\n // start the progress bar\n start(total, startValue, payload){\n // progress updates are only visible in TTY mode!\n if (this.options.noTTYOutput === false && this.terminal.isTTY() === false){\n return;\n }\n\n // add handler to restore cursor settings (stop the bar) on SIGINT/SIGTERM ?\n if (this.sigintCallback === null && this.options.gracefulExit){\n this.sigintCallback = this.stop.bind(this);\n process.once('SIGINT', this.sigintCallback);\n process.once('SIGTERM', this.sigintCallback);\n }\n\n // save current cursor settings\n this.terminal.cursorSave();\n\n // hide the cursor ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(false);\n }\n\n // disable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(false);\n }\n\n // initialize bar\n super.start(total, startValue, payload);\n\n // redraw on start!\n this.render();\n }\n\n // stop the bar\n stop(){\n // timer inactive ?\n if (!this.timer) {\n return;\n }\n \n // remove sigint listener\n if (this.sigintCallback){\n process.removeListener('SIGINT', this.sigintCallback);\n process.removeListener('SIGTERM', this.sigintCallback);\n this.sigintCallback = null;\n }\n\n // trigger final rendering\n this.render();\n\n // restore state\n super.stop();\n\n // stop timer\n clearTimeout(this.timer);\n this.timer = null;\n\n // cursor hidden ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(true);\n }\n\n // re-enable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(true);\n }\n\n // restore cursor on complete (position + settings)\n this.terminal.cursorRestore();\n\n // clear line on complete ?\n if (this.options.clearOnComplete){\n this.terminal.cursorTo(0, null);\n this.terminal.clearLine();\n }else{\n // new line on complete\n this.terminal.newline();\n }\n }\n}","const _Terminal = require('./terminal');\nconst _BarElement = require('./generic-bar');\nconst _options = require('./options');\nconst _EventEmitter = require('events');\n\n// Progress-Bar constructor\nmodule.exports = class MultiBar extends _EventEmitter{\n\n constructor(options, preset){\n super();\n\n // list of bars\n this.bars = [];\n\n // parse+store options\n this.options = _options.parse(options, preset);\n\n // disable synchronous updates\n this.options.synchronousUpdate = false;\n\n // store terminal instance\n this.terminal = (this.options.terminal) ? this.options.terminal : new _Terminal(this.options.stream);\n\n // the update timer\n this.timer = null;\n\n // progress bar active ?\n this.isActive = false;\n\n // update interval\n this.schedulingRate = (this.terminal.isTTY() ? this.options.throttleTime : this.options.notTTYSchedule);\n\n // logging output buffer\n this.loggingBuffer = [];\n\n // callback used for gracefulExit\n this.sigintCallback = null;\n }\n\n // add a new bar to the stack\n create(total, startValue, payload, barOptions={}){\n // create new bar element and merge global options + overrides\n // use the same global terminal instance for all instances\n const bar = new _BarElement(Object.assign(\n {}, \n\n // global options\n this.options, \n\n // terminal instance\n {\n terminal: this.terminal\n },\n\n // overrides\n barOptions,\n ));\n\n // store bar\n this.bars.push(bar);\n\n // progress updates are only visible in TTY mode!\n if (this.options.noTTYOutput === false && this.terminal.isTTY() === false){\n return bar;\n }\n\n // add handler to restore cursor settings (stop the bar) on SIGINT/SIGTERM ?\n if (this.sigintCallback === null && this.options.gracefulExit){\n this.sigintCallback = this.stop.bind(this);\n process.once('SIGINT', this.sigintCallback);\n process.once('SIGTERM', this.sigintCallback);\n }\n \n // multiprogress already active ?\n if (!this.isActive){\n // hide the cursor ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(false);\n }\n\n // disable line wrapping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(false);\n }\n \n // initialize update timer\n this.timer = setTimeout(this.update.bind(this), this.schedulingRate);\n }\n\n // set flag\n this.isActive = true;\n\n // start progress bar\n bar.start(total, startValue, payload);\n\n // trigger event\n this.emit('start');\n\n // return new instance\n return bar;\n }\n\n // remove a bar from the stack\n remove(bar){\n // find element\n const index = this.bars.indexOf(bar);\n\n // element found ?\n if (index < 0){\n return false;\n }\n\n // remove element\n this.bars.splice(index, 1);\n\n // force update\n this.update();\n\n // clear bottom\n this.terminal.newline();\n this.terminal.clearBottom();\n\n return true;\n }\n\n // internal update routine\n update(){\n // stop timer\n if (this.timer){\n clearTimeout(this.timer);\n this.timer = null;\n }\n\n // trigger event\n this.emit('update-pre');\n \n // reset cursor\n this.terminal.cursorRelativeReset();\n\n // trigger event\n this.emit('redraw-pre');\n\n // content within logging buffer ?\n if (this.loggingBuffer.length > 0){\n this.terminal.clearLine();\n\n // flush logging buffer and write content to terminal\n while (this.loggingBuffer.length > 0){\n this.terminal.write(this.loggingBuffer.shift(), true);\n }\n }\n\n // update each bar\n for (let i=0; i< this.bars.length; i++){\n // add new line ?\n if (i > 0){\n this.terminal.newline();\n }\n\n // render\n this.bars[i].render();\n }\n\n // trigger event\n this.emit('redraw-post');\n\n // add new line in notty mode!\n if (this.options.noTTYOutput && this.terminal.isTTY() === false){\n this.terminal.newline();\n this.terminal.newline();\n }\n\n // next update\n this.timer = setTimeout(this.update.bind(this), this.schedulingRate);\n\n // trigger event\n this.emit('update-post');\n\n // stop if stopOnComplete and all bars stopped\n if (this.options.stopOnComplete && !this.bars.find(bar => bar.isActive)) {\n this.stop();\n }\n }\n\n stop(){\n\n // stop timer\n clearTimeout(this.timer);\n this.timer = null;\n\n // remove sigint listener\n if (this.sigintCallback){\n process.removeListener('SIGINT', this.sigintCallback);\n process.removeListener('SIGTERM', this.sigintCallback);\n this.sigintCallback = null;\n }\n\n // set flag\n this.isActive = false;\n\n // cursor hidden ?\n if (this.options.hideCursor === true){\n this.terminal.cursor(true);\n }\n\n // re-enable line wrpaping ?\n if (this.options.linewrap === false){\n this.terminal.lineWrapping(true);\n }\n\n // reset cursor\n this.terminal.cursorRelativeReset();\n\n // trigger event\n this.emit('stop-pre-clear');\n\n // clear line on complete ?\n if (this.options.clearOnComplete){\n // clear all bars\n this.terminal.clearBottom();\n \n // or show final progress ?\n }else{\n // update each bar\n for (let i=0; i< this.bars.length; i++){\n // add new line ?\n if (i > 0){\n this.terminal.newline();\n }\n\n // trigger final rendering\n this.bars[i].render();\n\n // stop\n this.bars[i].stop();\n }\n\n // new line on complete\n this.terminal.newline();\n }\n\n // trigger event\n this.emit('stop');\n }\n\n log(s){\n // push content into logging buffer\n this.loggingBuffer.push(s);\n }\n}\n","const ANSI_BACKGROUND_OFFSET = 10;\n\nconst wrapAnsi16 = (offset = 0) => code => `\\u001B[${code + offset}m`;\n\nconst wrapAnsi256 = (offset = 0) => code => `\\u001B[${38 + offset};5;${code}m`;\n\nconst wrapAnsi16m = (offset = 0) => (red, green, blue) => `\\u001B[${38 + offset};2;${red};${green};${blue}m`;\n\nconst styles = {\n\tmodifier: {\n\t\treset: [0, 0],\n\t\t// 21 isn't widely supported and 22 does the same thing\n\t\tbold: [1, 22],\n\t\tdim: [2, 22],\n\t\titalic: [3, 23],\n\t\tunderline: [4, 24],\n\t\toverline: [53, 55],\n\t\tinverse: [7, 27],\n\t\thidden: [8, 28],\n\t\tstrikethrough: [9, 29],\n\t},\n\tcolor: {\n\t\tblack: [30, 39],\n\t\tred: [31, 39],\n\t\tgreen: [32, 39],\n\t\tyellow: [33, 39],\n\t\tblue: [34, 39],\n\t\tmagenta: [35, 39],\n\t\tcyan: [36, 39],\n\t\twhite: [37, 39],\n\n\t\t// Bright color\n\t\tblackBright: [90, 39],\n\t\tgray: [90, 39], // Alias of `blackBright`\n\t\tgrey: [90, 39], // Alias of `blackBright`\n\t\tredBright: [91, 39],\n\t\tgreenBright: [92, 39],\n\t\tyellowBright: [93, 39],\n\t\tblueBright: [94, 39],\n\t\tmagentaBright: [95, 39],\n\t\tcyanBright: [96, 39],\n\t\twhiteBright: [97, 39],\n\t},\n\tbgColor: {\n\t\tbgBlack: [40, 49],\n\t\tbgRed: [41, 49],\n\t\tbgGreen: [42, 49],\n\t\tbgYellow: [43, 49],\n\t\tbgBlue: [44, 49],\n\t\tbgMagenta: [45, 49],\n\t\tbgCyan: [46, 49],\n\t\tbgWhite: [47, 49],\n\n\t\t// Bright color\n\t\tbgBlackBright: [100, 49],\n\t\tbgGray: [100, 49], // Alias of `bgBlackBright`\n\t\tbgGrey: [100, 49], // Alias of `bgBlackBright`\n\t\tbgRedBright: [101, 49],\n\t\tbgGreenBright: [102, 49],\n\t\tbgYellowBright: [103, 49],\n\t\tbgBlueBright: [104, 49],\n\t\tbgMagentaBright: [105, 49],\n\t\tbgCyanBright: [106, 49],\n\t\tbgWhiteBright: [107, 49],\n\t},\n};\n\nexport const modifierNames = Object.keys(styles.modifier);\nexport const foregroundColorNames = Object.keys(styles.color);\nexport const backgroundColorNames = Object.keys(styles.bgColor);\nexport const colorNames = [...foregroundColorNames, ...backgroundColorNames];\n\nfunction assembleStyles() {\n\tconst codes = new Map();\n\n\tfor (const [groupName, group] of Object.entries(styles)) {\n\t\tfor (const [styleName, style] of Object.entries(group)) {\n\t\t\tstyles[styleName] = {\n\t\t\t\topen: `\\u001B[${style[0]}m`,\n\t\t\t\tclose: `\\u001B[${style[1]}m`,\n\t\t\t};\n\n\t\t\tgroup[styleName] = styles[styleName];\n\n\t\t\tcodes.set(style[0], style[1]);\n\t\t}\n\n\t\tObject.defineProperty(styles, groupName, {\n\t\t\tvalue: group,\n\t\t\tenumerable: false,\n\t\t});\n\t}\n\n\tObject.defineProperty(styles, 'codes', {\n\t\tvalue: codes,\n\t\tenumerable: false,\n\t});\n\n\tstyles.color.close = '\\u001B[39m';\n\tstyles.bgColor.close = '\\u001B[49m';\n\n\tstyles.color.ansi = wrapAnsi16();\n\tstyles.color.ansi256 = wrapAnsi256();\n\tstyles.color.ansi16m = wrapAnsi16m();\n\tstyles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET);\n\tstyles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET);\n\n\t// From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js\n\tObject.defineProperties(styles, {\n\t\trgbToAnsi256: {\n\t\t\tvalue(red, green, blue) {\n\t\t\t\t// We use the extended greyscale palette here, with the exception of\n\t\t\t\t// black and white. normal palette only has 4 greyscale shades.\n\t\t\t\tif (red === green && green === blue) {\n\t\t\t\t\tif (red < 8) {\n\t\t\t\t\t\treturn 16;\n\t\t\t\t\t}\n\n\t\t\t\t\tif (red > 248) {\n\t\t\t\t\t\treturn 231;\n\t\t\t\t\t}\n\n\t\t\t\t\treturn Math.round(((red - 8) / 247) * 24) + 232;\n\t\t\t\t}\n\n\t\t\t\treturn 16\n\t\t\t\t\t+ (36 * Math.round(red / 255 * 5))\n\t\t\t\t\t+ (6 * Math.round(green / 255 * 5))\n\t\t\t\t\t+ Math.round(blue / 255 * 5);\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToRgb: {\n\t\t\tvalue(hex) {\n\t\t\t\tconst matches = /[a-f\\d]{6}|[a-f\\d]{3}/i.exec(hex.toString(16));\n\t\t\t\tif (!matches) {\n\t\t\t\t\treturn [0, 0, 0];\n\t\t\t\t}\n\n\t\t\t\tlet [colorString] = matches;\n\n\t\t\t\tif (colorString.length === 3) {\n\t\t\t\t\tcolorString = [...colorString].map(character => character + character).join('');\n\t\t\t\t}\n\n\t\t\t\tconst integer = Number.parseInt(colorString, 16);\n\n\t\t\t\treturn [\n\t\t\t\t\t/* eslint-disable no-bitwise */\n\t\t\t\t\t(integer >> 16) & 0xFF,\n\t\t\t\t\t(integer >> 8) & 0xFF,\n\t\t\t\t\tinteger & 0xFF,\n\t\t\t\t\t/* eslint-enable no-bitwise */\n\t\t\t\t];\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi256: {\n\t\t\tvalue: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t\tansi256ToAnsi: {\n\t\t\tvalue(code) {\n\t\t\t\tif (code < 8) {\n\t\t\t\t\treturn 30 + code;\n\t\t\t\t}\n\n\t\t\t\tif (code < 16) {\n\t\t\t\t\treturn 90 + (code - 8);\n\t\t\t\t}\n\n\t\t\t\tlet red;\n\t\t\t\tlet green;\n\t\t\t\tlet blue;\n\n\t\t\t\tif (code >= 232) {\n\t\t\t\t\tred = (((code - 232) * 10) + 8) / 255;\n\t\t\t\t\tgreen = red;\n\t\t\t\t\tblue = red;\n\t\t\t\t} else {\n\t\t\t\t\tcode -= 16;\n\n\t\t\t\t\tconst remainder = code % 36;\n\n\t\t\t\t\tred = Math.floor(code / 36) / 5;\n\t\t\t\t\tgreen = Math.floor(remainder / 6) / 5;\n\t\t\t\t\tblue = (remainder % 6) / 5;\n\t\t\t\t}\n\n\t\t\t\tconst value = Math.max(red, green, blue) * 2;\n\n\t\t\t\tif (value === 0) {\n\t\t\t\t\treturn 30;\n\t\t\t\t}\n\n\t\t\t\t// eslint-disable-next-line no-bitwise\n\t\t\t\tlet result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red));\n\n\t\t\t\tif (value === 2) {\n\t\t\t\t\tresult += 60;\n\t\t\t\t}\n\n\t\t\t\treturn result;\n\t\t\t},\n\t\t\tenumerable: false,\n\t\t},\n\t\trgbToAnsi: {\n\t\t\tvalue: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)),\n\t\t\tenumerable: false,\n\t\t},\n\t\thexToAnsi: {\n\t\t\tvalue: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)),\n\t\t\tenumerable: false,\n\t\t},\n\t});\n\n\treturn styles;\n}\n\nconst ansiStyles = assembleStyles();\n\nexport default ansiStyles;\n","/* eslint-env browser */\n\nconst level = (() => {\n\tif (!('navigator' in globalThis)) {\n\t\treturn 0;\n\t}\n\n\tif (globalThis.navigator.userAgentData) {\n\t\tconst brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium');\n\t\tif (brand && brand.version > 93) {\n\t\t\treturn 3;\n\t\t}\n\t}\n\n\tif (/\\b(Chrome|Chromium)\\//.test(globalThis.navigator.userAgent)) {\n\t\treturn 1;\n\t}\n\n\treturn 0;\n})();\n\nconst colorSupport = level !== 0 && {\n\tlevel,\n\thasBasic: true,\n\thas256: level >= 2,\n\thas16m: level >= 3,\n};\n\nconst supportsColor = {\n\tstdout: colorSupport,\n\tstderr: colorSupport,\n};\n\nexport default supportsColor;\n","// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`.\nexport function stringReplaceAll(string, substring, replacer) {\n\tlet index = string.indexOf(substring);\n\tif (index === -1) {\n\t\treturn string;\n\t}\n\n\tconst substringLength = substring.length;\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\treturnValue += string.slice(endIndex, index) + substring + replacer;\n\t\tendIndex = index + substringLength;\n\t\tindex = string.indexOf(substring, endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n\nexport function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) {\n\tlet endIndex = 0;\n\tlet returnValue = '';\n\tdo {\n\t\tconst gotCR = string[index - 1] === '\\r';\n\t\treturnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\\r\\n' : '\\n') + postfix;\n\t\tendIndex = index + 1;\n\t\tindex = string.indexOf('\\n', endIndex);\n\t} while (index !== -1);\n\n\treturnValue += string.slice(endIndex);\n\treturn returnValue;\n}\n","import ansiStyles from '#ansi-styles';\nimport supportsColor from '#supports-color';\nimport { // eslint-disable-line import/order\n\tstringReplaceAll,\n\tstringEncaseCRLFWithFirstIndex,\n} from './utilities.js';\n\nconst {stdout: stdoutColor, stderr: stderrColor} = supportsColor;\n\nconst GENERATOR = Symbol('GENERATOR');\nconst STYLER = Symbol('STYLER');\nconst IS_EMPTY = Symbol('IS_EMPTY');\n\n// `supportsColor.level` → `ansiStyles.color[name]` mapping\nconst levelMapping = [\n\t'ansi',\n\t'ansi',\n\t'ansi256',\n\t'ansi16m',\n];\n\nconst styles = Object.create(null);\n\nconst applyOptions = (object, options = {}) => {\n\tif (options.level && !(Number.isInteger(options.level) && options.level >= 0 && options.level <= 3)) {\n\t\tthrow new Error('The `level` option should be an integer from 0 to 3');\n\t}\n\n\t// Detect level if not set manually\n\tconst colorLevel = stdoutColor ? stdoutColor.level : 0;\n\tobject.level = options.level === undefined ? colorLevel : options.level;\n};\n\nexport class Chalk {\n\tconstructor(options) {\n\t\t// eslint-disable-next-line no-constructor-return\n\t\treturn chalkFactory(options);\n\t}\n}\n\nconst chalkFactory = options => {\n\tconst chalk = (...strings) => strings.join(' ');\n\tapplyOptions(chalk, options);\n\n\tObject.setPrototypeOf(chalk, createChalk.prototype);\n\n\treturn chalk;\n};\n\nfunction createChalk(options) {\n\treturn chalkFactory(options);\n}\n\nObject.setPrototypeOf(createChalk.prototype, Function.prototype);\n\nfor (const [styleName, style] of Object.entries(ansiStyles)) {\n\tstyles[styleName] = {\n\t\tget() {\n\t\t\tconst builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]);\n\t\t\tObject.defineProperty(this, styleName, {value: builder});\n\t\t\treturn builder;\n\t\t},\n\t};\n}\n\nstyles.visible = {\n\tget() {\n\t\tconst builder = createBuilder(this, this[STYLER], true);\n\t\tObject.defineProperty(this, 'visible', {value: builder});\n\t\treturn builder;\n\t},\n};\n\nconst getModelAnsi = (model, level, type, ...arguments_) => {\n\tif (model === 'rgb') {\n\t\tif (level === 'ansi16m') {\n\t\t\treturn ansiStyles[type].ansi16m(...arguments_);\n\t\t}\n\n\t\tif (level === 'ansi256') {\n\t\t\treturn ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_));\n\t\t}\n\n\t\treturn ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_));\n\t}\n\n\tif (model === 'hex') {\n\t\treturn getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_));\n\t}\n\n\treturn ansiStyles[type][model](...arguments_);\n};\n\nconst usedModels = ['rgb', 'hex', 'ansi256'];\n\nfor (const model of usedModels) {\n\tstyles[model] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n\n\tconst bgModel = 'bg' + model[0].toUpperCase() + model.slice(1);\n\tstyles[bgModel] = {\n\t\tget() {\n\t\t\tconst {level} = this;\n\t\t\treturn function (...arguments_) {\n\t\t\t\tconst styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]);\n\t\t\t\treturn createBuilder(this, styler, this[IS_EMPTY]);\n\t\t\t};\n\t\t},\n\t};\n}\n\nconst proto = Object.defineProperties(() => {}, {\n\t...styles,\n\tlevel: {\n\t\tenumerable: true,\n\t\tget() {\n\t\t\treturn this[GENERATOR].level;\n\t\t},\n\t\tset(level) {\n\t\t\tthis[GENERATOR].level = level;\n\t\t},\n\t},\n});\n\nconst createStyler = (open, close, parent) => {\n\tlet openAll;\n\tlet closeAll;\n\tif (parent === undefined) {\n\t\topenAll = open;\n\t\tcloseAll = close;\n\t} else {\n\t\topenAll = parent.openAll + open;\n\t\tcloseAll = close + parent.closeAll;\n\t}\n\n\treturn {\n\t\topen,\n\t\tclose,\n\t\topenAll,\n\t\tcloseAll,\n\t\tparent,\n\t};\n};\n\nconst createBuilder = (self, _styler, _isEmpty) => {\n\t// Single argument is hot path, implicit coercion is faster than anything\n\t// eslint-disable-next-line no-implicit-coercion\n\tconst builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' '));\n\n\t// We alter the prototype because we must return a function, but there is\n\t// no way to create a function with a different prototype\n\tObject.setPrototypeOf(builder, proto);\n\n\tbuilder[GENERATOR] = self;\n\tbuilder[STYLER] = _styler;\n\tbuilder[IS_EMPTY] = _isEmpty;\n\n\treturn builder;\n};\n\nconst applyStyle = (self, string) => {\n\tif (self.level <= 0 || !string) {\n\t\treturn self[IS_EMPTY] ? '' : string;\n\t}\n\n\tlet styler = self[STYLER];\n\n\tif (styler === undefined) {\n\t\treturn string;\n\t}\n\n\tconst {openAll, closeAll} = styler;\n\tif (string.includes('\\u001B')) {\n\t\twhile (styler !== undefined) {\n\t\t\t// Replace any instances already present with a re-opening code\n\t\t\t// otherwise only the part of the string until said closing code\n\t\t\t// will be colored, and the rest will simply be 'plain'.\n\t\t\tstring = stringReplaceAll(string, styler.close, styler.open);\n\n\t\t\tstyler = styler.parent;\n\t\t}\n\t}\n\n\t// We can move both next actions out of loop, because remaining actions in loop won't have\n\t// any/visible effect on parts we add here. Close the styling before a linebreak and reopen\n\t// after next line to fix a bleed issue on macOS: https://github.com/chalk/chalk/pull/92\n\tconst lfIndex = string.indexOf('\\n');\n\tif (lfIndex !== -1) {\n\t\tstring = stringEncaseCRLFWithFirstIndex(string, closeAll, openAll, lfIndex);\n\t}\n\n\treturn openAll + string + closeAll;\n};\n\nObject.defineProperties(createChalk.prototype, styles);\n\nconst chalk = createChalk();\nexport const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});\n\nexport {\n\tmodifierNames,\n\tforegroundColorNames,\n\tbackgroundColorNames,\n\tcolorNames,\n\n\t// TODO: Remove these aliases in the next major version\n\tmodifierNames as modifiers,\n\tforegroundColorNames as foregroundColors,\n\tbackgroundColorNames as backgroundColors,\n\tcolorNames as colors,\n} from './vendor/ansi-styles/index.js';\n\nexport {\n\tstdoutColor as supportsColor,\n\tstderrColor as supportsColorStderr,\n};\n\nexport default chalk;\n","#!/usr/bin/env node\n\nimport fs from 'fs';\nimport path from 'path';\nimport { pipeline } from 'stream/promises';\nimport { Readable } from 'stream';\nimport readline from 'readline';\nimport { readFileSync } from 'fs';\nimport { join } from 'path';\nimport spinners from './icons/cli/spinners.js';\nimport grab, { log } from '../dist/grab-api.es.js';\nimport { pathToFileURL, fileURLToPath } from 'url';\n\nimport cliProgress from 'cli-progress';\nimport chalk from 'chalk';\n// Use cli-spinners for spinner animations\nconst __dirname = path.dirname(fileURLToPath(import.meta.url));\n\n// --- ArgParser from grab-cli.js ---\nclass ArgParser {\n constructor() {\n this.commands = {};\n this.options = {};\n this.examples = [];\n this.helpText = '';\n this.versionText = '1.0.0';\n }\n usage(text) { this.helpText = text; return this; }\n command(pattern, desc, handler) {\n const match = pattern.match(/\\$0 <(\\w+)>/);\n if (match) this.commands[match[1]] = { desc, handler, required: true };\n return this;\n }\n option(name, opts = {}) { this.options[name] = opts; return this; }\n example(cmd, desc) { this.examples.push({ cmd, desc }); return this; }\n help() { return this; }\n alias(short, long) { if (this.options[long]) this.options[long].alias = short; return this; }\n version(v) { if (v) this.versionText = v; return this; }\n strict() { return this; }\n parseSync() {\n const args = process.argv.slice(2);\n const result = {};\n const positional = [];\n if (args.includes('--help') || args.includes('-h')) { this.showHelp(); process.exit(0); }\n if (args.includes('--version')) { console.log(this.versionText); process.exit(0); }\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n if (arg.startsWith('--')) {\n const [key, value] = arg.split('=');\n const optName = key.slice(2);\n if (value !== undefined) {\n result[optName] = this.coerceValue(optName, value);\n } else if (this.options[optName]?.type === 'boolean') {\n result[optName] = true;\n } else {\n const nextArg = args[i + 1];\n if (nextArg && !nextArg.startsWith('-')) {\n result[optName] = this.coerceValue(optName, nextArg);\n i++;\n } else {\n result[optName] = true;\n }\n }\n } else if (arg.startsWith('-') && arg.length === 2) {\n const shortFlag = arg[1];\n const longName = this.findLongName(shortFlag);\n if (longName) {\n if (this.options[longName]?.type === 'boolean') {\n result[longName] = true;\n } else {\n const nextArg = args[i + 1];\n if (nextArg && !nextArg.startsWith('-')) {\n result[longName] = this.coerceValue(longName, nextArg);\n i++;\n }\n }\n }\n } else {\n positional.push(arg);\n }\n }\n if (positional.length > 0) result.urls = positional;\n Object.keys(this.options).forEach(key => {\n if (result[key] === undefined && this.options[key].default !== undefined) {\n result[key] = this.options[key].default;\n }\n });\n if ((!result.urls || result.urls.length === 0) && this.commands.url?.required) {\n console.error('Error: Missing required argument: url');\n this.showHelp();\n process.exit(1);\n }\n return result;\n }\n coerceValue(optName, value) {\n const opt = this.options[optName];\n if (!opt) return value;\n if (opt.coerce) return opt.coerce(value);\n switch (opt.type) {\n case 'number': return Number(value);\n case 'boolean': return value === 'true' || value === '1';\n default: return value;\n }\n }\n findLongName(shortFlag) {\n return Object.keys(this.options).find(key => this.options[key].alias === shortFlag);\n }\n showHelp() {\n console.log(this.helpText || 'Usage: grab <url> [options]');\n console.log('\\nPositional arguments:');\n Object.keys(this.commands).forEach(cmd => {\n console.log(` ${cmd.padEnd(20)} ${this.commands[cmd].desc}`);\n });\n console.log('\\nOptions:');\n Object.keys(this.options).forEach(key => {\n const opt = this.options[key];\n const flags = opt.alias ? `-${opt.alias}, --${key}` : `--${key}`;\n console.log(` ${flags.padEnd(20)} ${opt.describe || ''}`);\n });\n if (this.examples.length > 0) {\n console.log('\\nExamples:');\n this.examples.forEach(ex => {\n console.log(` ${ex.cmd}`);\n console.log(` ${ex.desc}`);\n });\n }\n }\n}\n\n// --- Helper: Detect if a URL is a file download ---\nfunction isFileUrl(url) {\n // Heuristic: ends with a file extension (e.g., .zip, .mp4, .tar.gz, .pdf, etc)\n return /\\.[a-zA-Z0-9]{1,5}(?:\\.[a-zA-Z0-9]{1,5})*$/.test(url.split('?')[0]);\n}\n\nexport class ColorFileDownloader {\nconstructor() {\n this.progressBar = null;\n this.multiBar = null;\n this.loadingSpinner = null;\n this.abortController = null;\n \n // Column width constants for alignment\n this.COL_FILENAME = 25;\n this.COL_SPINNER = 2;\n this.COL_BAR = 15;\n this.COL_PERCENT = 4;\n this.COL_DOWNLOADED = 16;\n this.COL_TOTAL = 10;\n this.COL_SPEED = 10;\n this.COL_ETA = 10;\n \n this.colors = {\n primary: chalk.cyan,\n success: chalk.green,\n warning: chalk.yellow,\n error: chalk.red,\n info: chalk.blue,\n purple: chalk.magenta,\n pink: chalk.magentaBright,\n yellow: chalk.yellowBright,\n cyan: chalk.cyanBright,\n green: chalk.green,\n gradient: [\n chalk.blue,\n chalk.magenta,\n chalk.cyan,\n chalk.green,\n chalk.yellow,\n chalk.red\n ]\n };\n\n // ANSI color codes for progress bars\n this.barColors = [\n '\\u001b[32m', // green\n '\\u001b[33m', // yellow\n '\\u001b[34m', // blue\n '\\u001b[35m', // magenta\n '\\u001b[36m', // cyan\n '\\u001b[91m', // bright red\n '\\u001b[92m', // bright green\n '\\u001b[93m', // bright yellow\n '\\u001b[94m', // bright blue\n '\\u001b[95m', // bright magenta\n '\\u001b[96m' // bright cyan\n ];\n\n this.barGlueColors = [\n '\\u001b[31m', // red\n '\\u001b[33m', // yellow\n '\\u001b[35m', // magenta\n '\\u001b[37m', // white\n '\\u001b[90m', // gray\n '\\u001b[93m', // bright yellow\n '\\u001b[97m' // bright white\n ];\n \n // Available spinner types for random selection (from spinners.json)\n this.spinnerTypes = Object.keys(spinners.default || spinners);\n \n // Initialize state directory\n this.stateDir = this.getStateDirectory();\n this.ensureStateDirectoryExists();\n this.isPaused = false;\n this.pauseCallback = null;\n this.resumeCallback = null;\n this.abortControllers = [];\n \n // Initialize global keyboard listener\n this.keyboardListener = null;\n this.isAddingUrl = false;\n}\n\n/**\n * Get state directory from environment variable or use default\n * @returns {string} State directory path\n */\ngetStateDirectory() {\n return process.env.GRAB_DOWNLOAD_STATE_DIR || path.join(process.cwd(), '.grab-downloads');\n}\n\n/**\n * Ensure state directory exists\n */\nensureStateDirectoryExists() {\n try {\n if (!fs.existsSync(this.stateDir)) {\n fs.mkdirSync(this.stateDir, { recursive: true });\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not create state directory, using current directory'));\n this.stateDir = process.cwd();\n }\n}\n\n/**\n * Get state file path for a given output path\n * @param {string} outputPath - The output file path\n * @returns {string} State file path\n */\ngetStateFilePath(outputPath) {\n const stateFileName = path.basename(outputPath) + '.download-state';\n return path.join(this.stateDir, stateFileName);\n}\n\n/**\n * Clean up state file\n * @param {string} stateFilePath - Path to state file\n */\ncleanupStateFile(stateFilePath) {\n try {\n if (fs.existsSync(stateFilePath)) {\n fs.unlinkSync(stateFilePath);\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not clean up state file'));\n }\n}\n\n/**\n * Print aligned header row for progress bars\n */\nprintHeaderRow() {\n console.log(\n this.colors.success('📈 %'.padEnd(this.COL_PERCENT)) +\n this.colors.yellow('📁 Files'.padEnd(this.COL_FILENAME)) +\n this.colors.cyan('🔄'.padEnd(this.COL_SPINNER)) +\n ' ' +\n this.colors.green('📊 Progress'.padEnd(this.COL_BAR + 1)) +\n this.colors.info('📥 Downloaded'.padEnd(this.COL_DOWNLOADED)) +\n this.colors.info('📦 Total'.padEnd(this.COL_TOTAL)) +\n this.colors.purple('⚡ Speed'.padEnd(this.COL_SPEED)) +\n this.colors.pink('⏱️ ETA'.padEnd(this.COL_ETA))\n );\n}\n\n/**\n * Get random ora spinner type (for ora spinners)\n * @returns {string} Random ora spinner name\n */\ngetRandomOraSpinner() {\n return this.spinnerTypes[Math.floor(Math.random() * this.spinnerTypes.length)];\n}\n\n/**\n * Get random bar color\n * @returns {string} ANSI color code\n */\ngetRandomBarColor() {\n return this.barColors[Math.floor(Math.random() * this.barColors.length)];\n}\n\n/**\n * Get random bar glue color\n * @returns {string} ANSI color code\n */\ngetRandomBarGlueColor() {\n return this.barGlueColors[Math.floor(Math.random() * this.barGlueColors.length)];\n}\n\n/**\n * Get random spinner type\n */\ngetRandomSpinner() {\n return this.spinnerTypes[Math.floor(Math.random() * this.spinnerTypes.length)];\n}\n\n/**\n * Get spinner frames for a given spinner type\n * @param {string} spinnerType - The spinner type name\n * @returns {array} Array of spinner frame characters\n */\ngetSpinnerFrames(spinnerType) {\n const spinnerData = spinners.default || spinners;\n const spinner = spinnerData[spinnerType];\n \n if (spinner && spinner.frames) {\n return spinner.frames;\n }\n \n // Fallback to dots if spinner not found\n return spinnerData.dots?.frames || ['⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'];\n}\n\n/**\n * Get the visual width of a spinner frame (accounting for multi-char emojis)\n * @param {string} frame - The spinner frame\n * @returns {number} Visual width\n */\ngetSpinnerWidth(frame) {\n // Count visual width - emojis and some unicode chars take 2 spaces\n let width = 0;\n for (const char of frame) {\n const code = char.codePointAt(0);\n // Emoji range check and other wide characters\n if ((code >= 0x1F000 && code <= 0x1F6FF) || // Miscellaneous Symbols and Pictographs\n (code >= 0x1F300 && code <= 0x1F5FF) || // Miscellaneous Symbols\n (code >= 0x1F600 && code <= 0x1F64F) || // Emoticons\n (code >= 0x1F680 && code <= 0x1F6FF) || // Transport and Map\n (code >= 0x1F700 && code <= 0x1F77F) || // Alchemical Symbols\n (code >= 0x1F780 && code <= 0x1F7FF) || // Geometric Shapes Extended\n (code >= 0x1F800 && code <= 0x1F8FF) || // Supplemental Arrows-C\n (code >= 0x2600 && code <= 0x26FF) || // Miscellaneous Symbols\n (code >= 0x2700 && code <= 0x27BF)) { // Dingbats\n width += 2;\n } else {\n width += 1;\n }\n }\n return width;\n}\n\n/**\n * Calculate dynamic bar size based on spinner width and terminal width\n * @param {string} spinnerFrame - Current spinner frame\n * @param {number} baseBarSize - Base bar size\n * @returns {number} Adjusted bar size\n */\ncalculateBarSize(spinnerFrame, baseBarSize = 20) {\n const terminalWidth = process.stdout.columns || 120;\n const spinnerWidth = this.getSpinnerWidth(spinnerFrame);\n \n // Account for other UI elements: percentage (4), progress (20), speed (10), ETA (15), spaces and colors (10)\n const otherElementsWidth = 59;\n const filenameWidth = 20; // Truncated filename width\n \n const availableWidth = terminalWidth - otherElementsWidth - filenameWidth - spinnerWidth;\n \n // Ensure minimum bar size\n const adjustedBarSize = Math.max(10, Math.min(baseBarSize, availableWidth));\n \n return adjustedBarSize;\n}\n\n/**\n * Check if server supports resumable downloads\n * @param {string} url - The URL to check\n * @returns {Object} - Server support info and headers\n */\nasync checkServerSupport(url) {\n try {\n const response = await fetch(url, { \n method: 'HEAD',\n signal: this.abortController?.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n \n const acceptRanges = response.headers.get('accept-ranges');\n const contentLength = response.headers.get('content-length');\n const lastModified = response.headers.get('last-modified');\n const etag = response.headers.get('etag');\n \n return {\n supportsResume: acceptRanges === 'bytes',\n totalSize: contentLength ? parseInt(contentLength, 10) : 0,\n lastModified,\n etag,\n headers: response.headers\n };\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not check server resume support, proceeding with regular download'));\n return {\n supportsResume: false,\n totalSize: 0,\n lastModified: null,\n etag: null,\n headers: null\n };\n }\n}\n\n/**\n * Load download state from file\n * @param {string} stateFilePath - Path to state file\n * @returns {Object} - Download state\n */\nloadDownloadState(stateFilePath) {\n try {\n if (fs.existsSync(stateFilePath)) {\n const stateData = fs.readFileSync(stateFilePath, 'utf8');\n return JSON.parse(stateData);\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not load download state, starting fresh'));\n }\n return null;\n}\n\n/**\n * Save download state to file\n * @param {string} stateFilePath - Path to state file\n * @param {Object} state - Download state\n */\nsaveDownloadState(stateFilePath, state) {\n try {\n fs.writeFileSync(stateFilePath, JSON.stringify(state, null, 2));\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not save download state'));\n }\n}\n\n/**\n * Get partial file size\n * @param {string} filePath - Path to partial file\n * @returns {number} - Size of partial file\n */\ngetPartialFileSize(filePath) {\n try {\n if (fs.existsSync(filePath)) {\n const stats = fs.statSync(filePath);\n return stats.size;\n }\n } catch (error) {\n console.log(this.colors.warning('⚠️ Could not read partial file size'));\n }\n return 0;\n}\n\n/**\n * Get random gradient color\n */\ngetRandomColor() {\n return this.colors.gradient[Math.floor(Math.random() * this.colors.gradient.length)];\n}\n\n/**\n * Format bytes into human readable format with proper MB/GB units using 1024 base\n * @param {number} bytes - Number of bytes\n * @param {number} decimals - Number of decimal places\n * @returns {string} Formatted string\n */\nformatBytes(bytes, decimals = 2) {\n if (bytes === 0) return this.colors.info('0 B');\n \n const k = 1024; // Use 1024 for binary calculations\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = [\n { unit: 'B', color: this.colors.info },\n { unit: 'KB', color: this.colors.cyan },\n { unit: 'MB', color: this.colors.yellow },\n { unit: 'GB', color: this.colors.purple },\n { unit: 'TB', color: this.colors.pink },\n { unit: 'PB', color: this.colors.primary }\n ];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n const size = sizes[i] || sizes[sizes.length - 1];\n \n return size.color.bold(`${value} ${size.unit}`);\n}\n\n/**\n * Format bytes for progress display (without colors for progress bar)\n * @param {number} bytes - Number of bytes\n * @param {number} decimals - Number of decimal places\n * @returns {string} Formatted string without colors\n */\nformatBytesPlain(bytes, decimals = 1) {\n if (bytes === 0) return '0 B';\n \n const k = 1024;\n const dm = decimals < 0 ? 0 : decimals;\n const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n const i = Math.floor(Math.log(bytes) / Math.log(k));\n const value = parseFloat((bytes / Math.pow(k, i)).toFixed(dm));\n \n return `${value} ${sizes[i] || sizes[sizes.length - 1]}`;\n}\n\n/**\n * Format bytes for progress display (compact version for tight layouts)\n * @param {number} bytes - Number of bytes\n * @returns {string} Formatted string in compact format\n */\nformatBytesCompact(bytes) {\n if (bytes === 0) return '0B';\n \n const k = 1024;\n const kb = bytes / k;\n \n // If below 100KB, show in KB with whole numbers\n if (kb < 100) {\n const value = Math.round(kb);\n return `${value}KB`;\n }\n \n // Otherwise show in MB with 1 decimal place (without \"MB\" text)\n const mb = bytes / (k * k);\n const value = mb.toFixed(1);\n return `${value}`;\n}\n\n/**\n * Truncate filename for display\n * @param {string} filename - Original filename\n * @param {number} maxLength - Maximum length\n * @returns {string} Truncated filename\n */\ntruncateFilename(filename, maxLength = 25) {\n if (filename.length <= maxLength) return filename.padEnd(maxLength);\n \n const extension = path.extname(filename);\n const baseName = path.basename(filename, extension);\n \n if (baseName.length <= 3) {\n return filename.padEnd(maxLength);\n }\n \n // Show first few and last few characters with ellipsis in middle\n const firstPart = Math.ceil((maxLength - extension.length - 3) / 2);\n const lastPart = Math.floor((maxLength - extension.length - 3) / 2);\n \n const truncatedBase = baseName.substring(0, firstPart) + '...' + baseName.substring(baseName.length - lastPart);\n return `${truncatedBase}${extension}`.padEnd(maxLength);\n}\n\n/**\n * Format ETA time in hours:minutes:seconds format\n * @param {number} seconds - ETA in seconds\n * @returns {string} Formatted ETA string (padded to consistent width)\n */\nformatETA(seconds) {\n if (!seconds || seconds === Infinity || seconds < 0) return ' -- ';\n \n const hours = Math.floor(seconds / 3600);\n const mins = Math.floor((seconds % 3600) / 60);\n const secs = Math.round(seconds % 60);\n \n return `${hours}:${mins.toString().padStart(2, '0')}:${secs.toString().padStart(2, '0')}`.padEnd(this.COL_ETA);\n}\n\n/**\n * Format progress for master bar showing sum of all downloads\n * @param {number} totalDownloaded - Total downloaded bytes across all files\n * @param {number} totalSize - Total size bytes across all files\n * @returns {string} Formatted progress string showing sums in MB\n */\nformatMasterProgress(totalDownloaded, totalSize) {\n const k = 1024;\n const totalDownloadedMB = totalDownloaded / (k * k);\n const totalSizeMB = totalSize / (k * k);\n \n if (totalSizeMB >= 1024) {\n const totalDownloadedGB = totalDownloadedMB / 1024;\n const totalSizeGB = totalSizeMB / 1024;\n return `${totalDownloadedGB.toFixed(1)}GB`.padEnd(this.COL_DOWNLOADED);\n }\n \n return `${totalDownloadedMB.toFixed(1)}MB`.padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format progress display with consistent width\n * @param {number} downloaded - Downloaded bytes\n * @param {number} total - Total bytes\n * @returns {string} Formatted progress string\n */\nformatProgress(downloaded, total) {\n const downloadedStr = this.formatBytesCompact(downloaded);\n return downloadedStr.padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format downloaded bytes for display\n * @param {number} downloaded - Downloaded bytes\n * @returns {string} Formatted downloaded string\n */\nformatDownloaded(downloaded) {\n return this.formatBytesCompact(downloaded).padEnd(this.COL_DOWNLOADED);\n}\n\n/**\n * Format total bytes for display (separate column)\n * @param {number} total - Total bytes\n * @returns {string} Formatted total string\n */\nformatTotalDisplay(total) {\n if (total === 0) return '0MB'.padEnd(this.COL_TOTAL);\n \n const k = 1024;\n const mb = total / (k * k);\n \n if (mb >= 1024) {\n const gb = mb / 1024;\n return `${gb.toFixed(1)}GB`.padEnd(this.COL_TOTAL);\n }\n \n // For files smaller than 1MB, show in MB with decimal\n if (mb < 1) {\n return `${mb.toFixed(2)}MB`.padEnd(this.COL_TOTAL);\n }\n \n return `${mb.toFixed(1)}MB`.padEnd(this.COL_TOTAL);\n}\n\n/**\n * Format total bytes for display (MB/GB format)\n * @param {number} total - Total bytes\n * @returns {string} Formatted total string\n */\nformatTotal(total) {\n if (total === 0) return '0MB'.padEnd(this.COL_TOTAL);\n \n const k = 1024;\n const mb = total / (k * k);\n \n if (mb >= 1024) {\n const gb = mb / 1024;\n return `${gb.toFixed(1)}GB`.padEnd(this.COL_TOTAL);\n }\n \n // For files smaller than 1MB, show in MB with decimal\n if (mb < 1) {\n return `${mb.toFixed(2)}MB`.padEnd(this.COL_TOTAL);\n }\n \n return `${mb.toFixed(1)}MB`.padEnd(this.COL_TOTAL);\n}\n\n/**\n * Format speed display with consistent width\n * @param {string} speed - Speed string\n * @returns {string} Formatted speed string\n */\nformatSpeed(speed) {\n return speed.padEnd(this.COL_SPEED);\n}\n\n/**\n * Format speed for display (MB/s without \"MB\" text unless below 100KB/s)\n * @param {number} bytesPerSecond - Speed in bytes per second\n * @returns {string} Formatted speed string\n */\nformatSpeedDisplay(bytesPerSecond) {\n if (bytesPerSecond === 0) return '0B';\n \n const k = 1024;\n const kbPerSecond = bytesPerSecond / k;\n \n // If below 100KB/s, show in KB with whole numbers\n if (kbPerSecond < 100) {\n const formattedValue = Math.round(kbPerSecond);\n return `${formattedValue}KB`;\n }\n \n // Otherwise show in MB with 1 decimal place (without \"MB\" text)\n const mbPerSecond = bytesPerSecond / (k * k);\n const formattedValue = mbPerSecond.toFixed(1);\n return `${formattedValue}`;\n}\n\n/**\n * Format speed for total display (MB/s without \"MB\" text unless below 100KB/s)\n * @param {number} bytesPerSecond - Speed in bytes per second\n * @returns {string} Formatted speed string\n */\nformatTotalSpeed(bytesPerSecond) {\n return this.formatSpeedDisplay(bytesPerSecond).padEnd(this.COL_SPEED);\n}\n\n/**\n * Download multiple files with multibar progress tracking\n * @param {Array} downloads - Array of {url, outputPath, filename} objects\n */\nasync downloadMultipleFiles(downloads) {\n try {\n // Set up global keyboard listener for pause/resume and add URL BEFORE starting downloads\n this.setupGlobalKeyboardListener();\n \n // Print header row with emojis\n // this.printHeaderRow();\n\n // Show keyboard shortcut info for pause/resume in multibar view\n // console.log(this.colors.info('💡 [p] pause/resume downloads, [a] add URL.'));\n\n // Get random colors for the multibar\n const masterBarColor = this.getRandomBarColor();\n const masterBarGlue = this.getRandomBarGlueColor();\n\n // Create multibar container with compact format and random colors\n this.multiBar = new cliProgress.MultiBar({\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n masterBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n hideCursor: true,\n clearOnComplete: false,\n stopOnComplete: true,\n autopadding: false,\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: masterBarGlue,\n barsize: this.COL_BAR\n });\n\n // Track overall progress for master bar\n let totalDownloaded = 0;\n let totalSize = 0;\n let individualSpeeds = new Array(downloads.length).fill(0);\n let individualSizes = new Array(downloads.length).fill(0);\n let individualDownloaded = new Array(downloads.length).fill(0);\n let individualStartTimes = new Array(downloads.length).fill(Date.now());\n let lastSpeedUpdate = Date.now();\n let lastIndividualDownloaded = new Array(downloads.length).fill(0);\n let lastTotalUpdate = Date.now();\n let lastTotalDownloaded = 0;\n \n // Calculate total size from all downloads\n const totalSizeFromDownloads = downloads.reduce((sum, download) => {\n // Estimate size based on filename or use a default\n const estimatedSize = download.estimatedSize || 1024 * 1024 * 100; // 100MB default\n return sum + estimatedSize;\n }, 0);\n totalSize = totalSizeFromDownloads;\n \n // Track actual total size as we discover file sizes\n let actualTotalSize = 0;\n\n // Set up interval to update speeds every second\n const speedUpdateInterval = setInterval(() => {\n const now = Date.now();\n const timeSinceLastUpdate = (now - lastSpeedUpdate) / 1000; // seconds\n \n // Update individual speeds based on incremental download since last update\n for (let i = 0; i < downloads.length; i++) {\n if (timeSinceLastUpdate > 0) {\n const incrementalDownloaded = individualDownloaded[i] - lastIndividualDownloaded[i];\n individualSpeeds[i] = incrementalDownloaded / timeSinceLastUpdate;\n \n if (fileBars[i] && fileBars[i].bar) {\n const speed = this.formatSpeed(this.formatSpeedDisplay(individualSpeeds[i]));\n const eta = individualSizes[i] > 0 ? \n this.formatETA((individualSizes[i] - individualDownloaded[i]) / individualSpeeds[i]) : \n this.formatETA(0);\n \n fileBars[i].bar.update(individualDownloaded[i], {\n speed: speed,\n progress: this.formatProgress(individualDownloaded[i], individualSizes[i]),\n downloadedDisplay: this.formatBytesCompact(individualDownloaded[i]),\n totalDisplay: this.formatTotalDisplay(individualSizes[i]),\n etaFormatted: eta\n });\n }\n }\n }\n \n // Update last values for next calculation\n lastSpeedUpdate = now;\n lastIndividualDownloaded = [...individualDownloaded];\n \n // Calculate total speed\n const totalSpeedBps = individualSpeeds.reduce((sum, speed) => sum + speed, 0);\n \n // Calculate total downloaded from individual files\n const totalDownloadedFromFiles = individualDownloaded.reduce((sum, downloaded) => sum + downloaded, 0);\n \n // Calculate time elapsed since start\n const timeElapsed = (now - individualStartTimes[0]) / 1000; // seconds since first download started\n \n // Update master bar\n const totalEta = totalSize > 0 && totalSpeedBps > 0 ? \n this.formatETA((totalSize - totalDownloadedFromFiles) / totalSpeedBps) : \n this.formatETA(0);\n \n const totalPercentage = totalSize > 0 ? \n Math.round((totalDownloadedFromFiles / totalSize) * 100) : 0;\n \n // Calculate actual total size from discovered individual file sizes\n const discoveredTotalSize = individualSizes.reduce((sum, size) => sum + size, 0);\n const displayTotalSize = discoveredTotalSize > 0 ? discoveredTotalSize : totalSize;\n \n masterBar.update(totalDownloadedFromFiles, {\n speed: this.formatTotalSpeed(totalSpeedBps),\n progress: this.formatMasterProgress(totalDownloadedFromFiles, displayTotalSize),\n downloadedDisplay: this.formatBytesCompact(totalDownloadedFromFiles),\n totalDisplay: this.formatTotalDisplay(displayTotalSize),\n etaFormatted: this.formatETA(timeElapsed), // Show time elapsed instead of ETA\n percentage: displayTotalSize > 0 ? \n Math.round((totalDownloadedFromFiles / displayTotalSize) * 100) : 0\n });\n }, 1000);\n \n // Create master progress bar with more compact format and special colors\n const masterSpinnerWidth = this.getSpinnerWidth('⬇️');\n const masterMaxFilenameLength = this.COL_FILENAME - masterSpinnerWidth;\n const masterBarSize = this.calculateBarSize('⬇️', this.COL_BAR);\n const masterBar = this.multiBar.create(totalSize, 0, {\n filename: 'Total'.padEnd(masterMaxFilenameLength),\n spinner: '⬇️',\n speed: '0B'.padEnd(this.COL_SPEED),\n progress: this.formatMasterProgress(0, totalSize),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(totalSize),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(this.COL_PERCENT - 1)\n }, {\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.yellow.bold('{filename}') + ' ' +\n this.colors.success('{spinner}') + ' ' + \n '\\u001b[92m{bar}\\u001b[0m' + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '▶',\n barIncompleteChar: '▷',\n barGlue: '\\u001b[33m',\n barsize: masterBarSize\n });\n\n // Create individual progress bars for each download\n const fileBars = downloads.map((download, index) => {\n const spinnerType = this.getRandomSpinner();\n const spinnerFrames = this.getSpinnerFrames(spinnerType);\n \n // Calculate spinner width to adjust filename padding\n const spinnerWidth = this.getSpinnerWidth(spinnerFrames[0]);\n const maxFilenameLength = this.COL_FILENAME - spinnerWidth; // Adjust filename length based on spinner width\n const truncatedName = this.truncateFilename(download.filename, maxFilenameLength);\n \n // Get random colors for this file's progress bar\n const fileBarColor = this.getRandomBarColor();\n const fileBarGlue = this.getRandomBarGlueColor();\n \n // Calculate bar size based on spinner width\n const barSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n \n return {\n bar: this.multiBar.create(100, 0, {\n filename: truncatedName,\n spinner: spinnerFrames[0],\n speed: this.formatSpeed('0B'),\n progress: this.formatProgress(0, 0),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(3)\n }, {\n format: this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n fileBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.success('{percentage}%') + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: fileBarGlue,\n barsize: barSize\n }),\n spinnerFrames,\n spinnerIndex: 0,\n lastSpinnerUpdate: Date.now(),\n lastFrameUpdate: Date.now(),\n download: { ...download, index }\n };\n });\n\n // Start all downloads concurrently\n const downloadPromises = fileBars.map(async (fileBar, index) => {\n try {\n await this.downloadSingleFileWithBar(fileBar, masterBar, downloads.length, {\n totalDownloaded,\n totalSize,\n individualSpeeds,\n individualSizes,\n individualDownloaded,\n individualStartTimes,\n lastTotalUpdate,\n lastTotalDownloaded,\n actualTotalSize\n });\n return { success: true, index, filename: fileBar.download.filename };\n } catch (error) {\n return { success: false, index, filename: fileBar.download.filename, error };\n }\n });\n\n // Wait for all downloads to complete\n const results = await Promise.allSettled(downloadPromises);\n\n // Clear the speed update interval\n clearInterval(speedUpdateInterval);\n\n // Stop multibar\n this.multiBar.stop();\n\n // Display results\n const successful = results.filter(r => r.status === 'fulfilled' && r.value.success).length;\n const failed = results.length - successful;\n\n if (failed > 0) {\n console.log(this.colors.error(`❌ Failed: ${failed}/${downloads.length}`));\n \n results.forEach((result, index) => {\n if (result.status === 'rejected' || !result.value.success) {\n const filename = downloads[index].filename;\n const error = result.reason || result.value?.error || 'Unknown error';\n console.log(this.colors.error(` • ${filename}: ${error.message || error}`));\n }\n });\n }\n \n // Random celebration emoji\n const celebrationEmojis = ['🥳', '🎊', '🎈', '🌟', '💯', '🚀', '✨', '🔥'];\n const randomEmoji = celebrationEmojis[Math.floor(Math.random() * celebrationEmojis.length)];\n console.log(this.colors.green(`${randomEmoji} Success: ${successful}/${downloads.length}`));\n\n this.clearAbortControllers();\n \n let pausedMessageShown = false;\n \n this.setPauseCallback(() => {\n if (!pausedMessageShown) {\n this.multiBar.stop();\n console.log(this.colors.warning('⏸️ Paused. Press p to resume, a to add URL.'));\n pausedMessageShown = true;\n }\n });\n \n this.setResumeCallback(() => {\n if (pausedMessageShown) {\n console.log(this.colors.success('▶️ Resumed. Press p to pause, a to add URL.'));\n pausedMessageShown = false;\n }\n });\n\n } catch (error) {\n if (this.multiBar) {\n this.multiBar.stop();\n }\n console.error(this.colors.error.bold('💥 Batch download failed: ') + this.colors.warning(error.message));\n throw error;\n }\n}\n\n/**\n * Download a single file with multibar integration and resume capability\n * @param {Object} fileBar - File bar object with progress bar and spinner info\n * @param {Object} masterBar - Master progress bar\n * @param {number} totalFiles - Total number of files being downloaded\n * @param {Object} totalTracking - Object to track total progress\n */\nasync downloadSingleFileWithBar(fileBar, masterBar, totalFiles, totalTracking) {\n const { bar, spinnerFrames, download } = fileBar;\n const { url, outputPath, filename } = download;\n const stateFilePath = this.getStateFilePath(outputPath);\n const tempFilePath = outputPath + '.tmp';\n\n try {\n // Create abort controller for this download\n const abortController = new AbortController();\n this.setAbortController(abortController);\n \n // Check server support and get file info\n const serverInfo = await this.checkServerSupport(url);\n \n // Load previous download state\n const previousState = this.loadDownloadState(stateFilePath);\n \n // Check if we have a partial file\n const partialSize = this.getPartialFileSize(tempFilePath);\n \n let startByte = 0;\n let resuming = false;\n \n if (serverInfo.supportsResume && partialSize > 0 && previousState) {\n // Validate that the file hasn't changed on server\n const fileUnchanged = \n (!serverInfo.lastModified || serverInfo.lastModified === previousState.lastModified) &&\n (!serverInfo.etag || serverInfo.etag === previousState.etag) &&\n (serverInfo.totalSize === previousState.totalSize);\n \n if (fileUnchanged && partialSize < serverInfo.totalSize) {\n startByte = partialSize;\n resuming = true;\n } else {\n // Clean up partial file and state\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n this.cleanupStateFile(stateFilePath);\n }\n } else if (partialSize > 0) {\n // Server doesn't support resume, clean up partial file\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n }\n\n // Prepare request headers\n const headers = {};\n if (resuming && startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n // Make the fetch request\n const response = await fetch(url, {\n headers,\n signal: abortController.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Get the total file size\n const contentLength = response.headers.get('content-length');\n const totalSize = resuming ? serverInfo.totalSize : (contentLength ? parseInt(contentLength, 10) : 0);\n\n // Save download state\n const downloadState = {\n url,\n outputPath,\n totalSize,\n startByte,\n lastModified: serverInfo.lastModified,\n etag: serverInfo.etag,\n timestamp: new Date().toISOString()\n };\n this.saveDownloadState(stateFilePath, downloadState);\n\n // Update bar with file size info\n bar.setTotal(totalSize || 100);\n bar.update(startByte, {\n progress: this.formatProgress(startByte, totalSize),\n downloadedDisplay: this.formatBytesCompact(startByte),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n\n // Create write stream (append mode if resuming)\n const writeStream = fs.createWriteStream(tempFilePath, { \n flags: resuming ? 'a' : 'w' \n });\n \n // Track progress\n let downloaded = startByte;\n let lastTime = Date.now();\n let lastDownloaded = downloaded;\n\n // Create progress stream\n const progressStream = new Readable({\n read() {}\n });\n\n const reader = response.body.getReader();\n \n const processChunk = async () => {\n try {\n while (true) {\n // Check for pause state\n while (this.isPaused) {\n await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100ms before checking again\n }\n \n const { done, value } = await reader.read();\n \n if (done) {\n progressStream.push(null);\n break;\n }\n\n downloaded += value.length;\n \n const now = Date.now();\n const timeDiff = (now - lastTime) / 1000;\n\n // Update spinner frame every 150ms for smooth animation\n if (now - fileBar.lastFrameUpdate >= 150) {\n fileBar.spinnerIndex = (fileBar.spinnerIndex + 1) % spinnerFrames.length;\n fileBar.lastFrameUpdate = now;\n \n // Recalculate bar size when spinner changes\n const currentSpinner = spinnerFrames[fileBar.spinnerIndex];\n const newBarSize = this.calculateBarSize(currentSpinner, this.COL_BAR);\n bar.options.barsize = newBarSize;\n }\n\n // Change spinner type every 45 seconds\n if (now - fileBar.lastSpinnerUpdate >= 45000) {\n const newSpinnerType = this.getRandomSpinner();\n fileBar.spinnerFrames = this.getSpinnerFrames(newSpinnerType);\n fileBar.spinnerIndex = 0;\n fileBar.lastSpinnerUpdate = now;\n }\n\n if (timeDiff >= 0.3) { // Update every 300ms for smoother animation\n bar.update(downloaded, {\n spinner: spinnerFrames[fileBar.spinnerIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n \n // Update total tracking\n if (totalTracking) {\n const bytesDiff = downloaded - lastDownloaded;\n totalTracking.totalDownloaded += bytesDiff;\n \n // Update individual downloaded amount and size for this file\n const fileIndex = fileBar.download.index || 0;\n totalTracking.individualDownloaded[fileIndex] = downloaded;\n totalTracking.individualSizes[fileIndex] = totalSize;\n \n // Calculate total size from all individual sizes\n totalTracking.totalSize = totalTracking.individualSizes.reduce((sum, size) => sum + size, 0);\n \n // Update actual total size for master bar display\n if (totalTracking.actualTotalSize !== undefined) {\n totalTracking.actualTotalSize = totalTracking.totalSize;\n }\n \n // Update master bar total if this is the first time we're getting the actual size\n if (totalSize > 0 && totalTracking.individualSizes[fileIndex] === totalSize) {\n masterBar.setTotal(totalTracking.totalSize);\n }\n }\n \n lastTime = now;\n lastDownloaded = downloaded;\n } else {\n bar.update(downloaded, {\n spinner: spinnerFrames[fileBar.spinnerIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n }\n\n progressStream.push(Buffer.from(value));\n }\n } catch (error) {\n progressStream.destroy(error);\n }\n };\n\n processChunk();\n await pipeline(progressStream, writeStream);\n\n // Move temp file to final location\n if (fs.existsSync(outputPath)) {\n fs.unlinkSync(outputPath);\n }\n fs.renameSync(tempFilePath, outputPath);\n \n // Clean up state file\n this.cleanupStateFile(stateFilePath);\n\n // Update master progress\n const currentCompleted = masterBar.value + 1;\n const finalTotalSize = totalTracking.actualTotalSize || totalTracking.totalSize;\n const discoveredTotalSize = totalTracking.individualSizes.reduce((sum, size) => sum + size, 0);\n const displayTotalSize = discoveredTotalSize > 0 ? discoveredTotalSize : finalTotalSize;\n \n masterBar.update(totalTracking.totalDownloaded, {\n progress: this.formatMasterProgress(totalTracking.totalDownloaded, displayTotalSize),\n downloadedDisplay: this.formatBytesCompact(totalTracking.totalDownloaded),\n totalDisplay: this.formatTotalDisplay(displayTotalSize),\n etaFormatted: this.formatETA((Date.now() - (totalTracking.individualStartTimes?.[0] || Date.now())) / 1000) // Show time elapsed\n });\n\n } catch (error) {\n // Update bar to show error state\n bar.update(bar.total, {\n spinner: '❌',\n speed: this.formatSpeed('FAILED'),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0)\n });\n \n // Don't clean up partial file on error - allow resume\n console.log(this.colors.info(`💾 Partial download saved for ${filename}. Restart to resume.`));\n throw error;\n }\n}\n\n/**\n * Download a file with colorful progress tracking and resume capability\n * @param {string} url - The URL to download\n * @param {string} outputPath - The local path to save the file\n */\nasync downloadFile(url, outputPath) {\n const stateFilePath = this.getStateFilePath(outputPath);\n const tempFilePath = outputPath + '.tmp';\n \n try {\n // Create abort controller for cancellation\n this.abortController = new AbortController();\n \n // Start with a random ora spinner animation\n const randomOraSpinner = this.getRandomOraSpinner();\n this.loadingSpinner = ora({\n text: this.colors.primary('🌐 Checking server capabilities...'),\n spinner: randomOraSpinner,\n color: 'cyan'\n }).start();\n\n // Check server support and get file info\n const serverInfo = await this.checkServerSupport(url);\n \n // Load previous download state\n const previousState = this.loadDownloadState(stateFilePath);\n \n // Check if we have a partial file\n const partialSize = this.getPartialFileSize(tempFilePath);\n \n let startByte = 0;\n let resuming = false;\n \n if (serverInfo.supportsResume && partialSize > 0 && previousState) {\n // Validate that the file hasn't changed on server\n const fileUnchanged = \n (!serverInfo.lastModified || serverInfo.lastModified === previousState.lastModified) &&\n (!serverInfo.etag || serverInfo.etag === previousState.etag) &&\n (serverInfo.totalSize === previousState.totalSize);\n \n if (fileUnchanged && partialSize < serverInfo.totalSize) {\n startByte = partialSize;\n resuming = true;\n this.loadingSpinner.succeed(this.colors.success(`✅ Found partial download: ${this.formatBytes(partialSize)} of ${this.formatTotal(serverInfo.totalSize)}`));\n console.log(this.colors.info(`🔄 Resuming download from ${this.formatBytes(startByte)}`));\n } else {\n this.loadingSpinner.warn(this.colors.warning('⚠️ File changed on server, starting fresh download'));\n // Clean up partial file and state\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n this.cleanupStateFile(stateFilePath);\n }\n } else {\n this.loadingSpinner.stop();\n if (partialSize > 0) {\n console.log(this.colors.warning('⚠️ Server does not support resumable downloads, starting fresh'));\n // Clean up partial file\n if (fs.existsSync(tempFilePath)) {\n fs.unlinkSync(tempFilePath);\n }\n }\n }\n\n // Prepare request headers\n const headers = {};\n if (resuming && startByte > 0) {\n headers['Range'] = `bytes=${startByte}-`;\n }\n\n // Make the fetch request\n const response = await fetch(url, {\n headers,\n signal: this.abortController.signal\n });\n \n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n // Get the total file size\n const contentLength = response.headers.get('content-length');\n const totalSize = resuming ? serverInfo.totalSize : (contentLength ? parseInt(contentLength, 10) : 0);\n const remainingSize = contentLength ? parseInt(contentLength, 10) : 0;\n\n if (!resuming) {\n if (totalSize === 0) {\n console.log(this.colors.warning('⚠️ Warning: Content-Length not provided, progress will be estimated'));\n } else {\n console.log(this.colors.info(`📦 File size: ${this.formatTotal(totalSize)}`));\n }\n }\n\n // Save download state\n const downloadState = {\n url,\n outputPath,\n totalSize,\n startByte,\n lastModified: serverInfo.lastModified,\n etag: serverInfo.etag,\n timestamp: new Date().toISOString()\n };\n this.saveDownloadState(stateFilePath, downloadState);\n\n // Get random colors for single file progress bar\n const singleBarColor = this.getRandomBarColor();\n const singleBarGlue = this.getRandomBarGlueColor();\n\n // Get initial spinner frames\n let currentSpinnerType = this.getRandomSpinner();\n let spinnerFrames = this.getSpinnerFrames(currentSpinnerType);\n let spinnerFrameIndex = 0;\n \n // Calculate initial bar size\n const initialBarSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n\n // Print header row with emojis for single file download\n console.log(\n this.colors.success('📈 %'.padEnd(this.COL_PERCENT)) +\n this.colors.cyan('🔄'.padEnd(this.COL_SPINNER)) +\n ' ' +\n this.colors.green('📊 Progress'.padEnd(this.COL_BAR + 1)) +\n this.colors.info('📥 Downloaded'.padEnd(this.COL_DOWNLOADED)) +\n this.colors.info('📦 Total'.padEnd(this.COL_TOTAL)) +\n this.colors.purple('⚡ Speed'.padEnd(this.COL_SPEED)) +\n this.colors.pink('⏱️ ETA'.padEnd(this.COL_ETA))\n );\n\n // Set up keyboard listeners for single file download\n const keyboardRl = this.setupSingleFileKeyboardListeners(url, outputPath);\n\n // Create compact colorful progress bar with random colors\n this.progressBar = new cliProgress.SingleBar({\n format: this.colors.success('{percentage}%') + ' ' +\n this.colors.cyan('{spinner}') + ' ' +\n singleBarColor + '{bar}\\u001b[0m' + ' ' + \n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: singleBarGlue,\n hideCursor: true,\n barsize: initialBarSize,\n stopOnComplete: true,\n clearOnComplete: false\n });\n\n // Initialize progress bar with spinner\n this.progressBar.start(totalSize || 100, startByte, {\n speed: this.formatSpeed('0B/s'),\n etaFormatted: this.formatETA(0),\n spinner: spinnerFrames[0],\n progress: this.formatProgress(startByte, totalSize),\n downloadedDisplay: this.formatBytesCompact(startByte),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n\n // Create write stream (append mode if resuming)\n const writeStream = fs.createWriteStream(tempFilePath, { \n flags: resuming ? 'a' : 'w' \n });\n \n // Track progress\n let downloaded = startByte;\n let sessionDownloaded = 0;\n let lastTime = Date.now();\n let lastDownloaded = downloaded;\n let lastSpinnerUpdate = Date.now();\n let lastSpinnerFrameUpdate = Date.now();\n\n // Create a transform stream to track progress\n const progressStream = new Readable({\n read() {} // No-op, we'll push data manually\n });\n\n // Process the response body stream\n const reader = response.body.getReader();\n \n const processChunk = async () => {\n try {\n while (true) {\n // Check for pause state\n while (this.isPaused) {\n await new Promise(resolve => setTimeout(resolve, 100)); // Wait 100ms before checking again\n }\n \n const { done, value } = await reader.read();\n \n if (done) {\n progressStream.push(null); // Signal end of stream\n break;\n }\n\n // Update progress tracking\n sessionDownloaded += value.length;\n downloaded += value.length;\n \n // Calculate download speed and update display\n const now = Date.now();\n const timeDiff = (now - lastTime) / 1000;\n \n // Update spinner type every 45 seconds for variety\n if (now - lastSpinnerUpdate >= 45000) {\n currentSpinnerType = this.getRandomSpinner();\n spinnerFrames = this.getSpinnerFrames(currentSpinnerType);\n spinnerFrameIndex = 0;\n lastSpinnerUpdate = now;\n }\n \n // Update spinner frame every 120ms for smooth animation\n if (now - lastSpinnerFrameUpdate >= 120) {\n spinnerFrameIndex = (spinnerFrameIndex + 1) % spinnerFrames.length;\n lastSpinnerFrameUpdate = now;\n \n // Recalculate bar size when spinner changes\n const currentSpinner = spinnerFrames[spinnerFrameIndex];\n const newBarSize = this.calculateBarSize(currentSpinner, this.COL_BAR);\n this.progressBar.options.barsize = newBarSize;\n }\n \n if (timeDiff >= 0.3) { // Update every 300ms for smooth animation\n const bytesDiff = downloaded - lastDownloaded;\n const speedBps = bytesDiff / timeDiff;\n const speed = this.formatSpeed(this.formatSpeedDisplay(speedBps));\n const eta = totalSize > 0 ? this.formatETA((totalSize - downloaded) / speedBps) : this.formatETA(0);\n \n this.progressBar.update(downloaded, {\n speed: speed,\n etaFormatted: eta,\n spinner: spinnerFrames[spinnerFrameIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n \n lastTime = now;\n lastDownloaded = downloaded;\n } else {\n // Update progress and spinner without speed calculation\n this.progressBar.update(downloaded, {\n spinner: spinnerFrames[spinnerFrameIndex],\n progress: this.formatProgress(downloaded, totalSize),\n downloadedDisplay: this.formatBytesCompact(downloaded),\n totalDisplay: this.formatTotalDisplay(totalSize)\n });\n }\n\n // Push the chunk to our readable stream\n progressStream.push(Buffer.from(value));\n }\n } catch (error) {\n progressStream.destroy(error);\n }\n };\n\n // Start processing chunks\n processChunk();\n\n // Use pipeline to handle the stream properly\n await pipeline(progressStream, writeStream);\n\n // Complete the progress bar\n this.progressBar.stop();\n \n // Move temp file to final location\n if (fs.existsSync(outputPath)) {\n fs.unlinkSync(outputPath);\n }\n fs.renameSync(tempFilePath, outputPath);\n \n // Clean up state file\n this.cleanupStateFile(stateFilePath);\n \n // Success celebration\n console.log(this.colors.success('✅ Download completed!'));\n console.log(this.colors.primary('📁 File saved to: ') + chalk.underline(outputPath));\n console.log(this.colors.purple('📊 Total size: ') + this.formatBytes(downloaded));\n \n if (resuming) {\n console.log(this.colors.info('🔄 Resumed from: ') + this.formatBytes(startByte));\n console.log(this.colors.info('📥 Downloaded this session: ') + this.formatBytes(sessionDownloaded));\n }\n \n // Random success emoji\n const celebrationEmojis = ['🥳', '🎊', '🎈', '🌟', '💯', '🚀', '✨', '🔥'];\n const randomEmoji = celebrationEmojis[Math.floor(Math.random() * celebrationEmojis.length)];\n console.log(this.colors.success(`${randomEmoji} Successfully downloaded! ${randomEmoji}`));\n\n } catch (error) {\n if (this.loadingSpinner && this.loadingSpinner.isSpinning) {\n this.loadingSpinner.fail(this.colors.error('❌ Connection failed'));\n }\n if (this.progressBar) {\n this.progressBar.stop();\n }\n \n // Don't clean up partial file on error - allow resume\n console.error(this.colors.error.bold('💥 Download failed: ') + this.colors.warning(error.message));\n \n if (error.name === 'AbortError') {\n console.log(this.colors.info('💾 Download state saved. You can resume later by running the same command.'));\n } else {\n console.log(this.colors.info('💾 Partial download saved. Restart to resume from where it left off.'));\n }\n \n throw error;\n }\n}\n\n/**\n * Clean up resources\n */\ncleanup() {\n if (this.loadingSpinner && this.loadingSpinner.isSpinning) {\n this.loadingSpinner.stop();\n }\n if (this.progressBar) {\n this.progressBar.stop();\n }\n if (this.multiBar) {\n this.multiBar.stop();\n }\n if (this.abortController) {\n this.abortController.abort();\n }\n if (this.keyboardListener) {\n try {\n this.keyboardListener.kill();\n } catch (error) {\n // Ignore cleanup errors\n }\n }\n \n // Clean up stdin listener\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(false);\n process.stdin.pause();\n }\n}\n\n/**\n * Set up global keyboard listener for pause/resume and add URL functionality\n */\nsetupGlobalKeyboardListener() {\n // Use the fallback keyboard listener which works better in terminal environments\n this.setupFallbackKeyboardListener();\n}\n\n/**\n * Handle global key press events\n * @param {string} keyName - The name of the pressed key\n */\nasync handleGlobalKeyPress(keyName) {\n if (keyName === 'P') {\n console.log(this.colors.info('P key pressed - toggling pause/resume'));\n if (!this.isPaused) {\n this.pauseAll();\n } else {\n this.resumeAll();\n }\n } else if (keyName === 'A' && !this.isAddingUrl) {\n console.log(this.colors.info('A key pressed - adding URL'));\n await this.promptForNewUrl();\n }\n}\n\n/**\n * Prompt user for a new URL to download\n */\nasync promptForNewUrl() {\n this.isAddingUrl = true;\n \n try {\n console.log(this.colors.cyan('\\n📥 Enter URL to add (or press Enter to cancel):'));\n \n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout\n });\n \n const newUrl = await new Promise((resolve) => {\n rl.question('', (answer) => {\n rl.close();\n resolve(answer.trim());\n });\n });\n \n if (newUrl && this.isValidUrl(newUrl)) {\n console.log(this.colors.success(`✅ Adding URL: ${newUrl}`));\n \n // Generate filename for new URL\n const newFilename = this.generateFilename(newUrl);\n const newOutputPath = path.isAbsolute(newFilename) ? newFilename : path.join(process.cwd(), newFilename);\n \n // Ensure output directory exists\n const outputDir = path.dirname(newOutputPath);\n try {\n if (!fs.existsSync(outputDir)) {\n fs.mkdirSync(outputDir, { recursive: true });\n }\n } catch (error) {\n console.error(this.colors.red.bold('❌ Could not create output directory: ') + error.message);\n return;\n }\n \n // Check if we're in multiple download mode (multiBar exists)\n if (this.multiBar) {\n // Add to multiple downloads\n await this.addToMultipleDownloads(newUrl, newOutputPath, newFilename);\n } else {\n // Start new single download in background\n this.downloadFile(newUrl, newOutputPath).catch(error => {\n console.error(this.colors.error(`❌ Failed to download ${newFilename}: ${error.message}`));\n });\n }\n \n console.log(this.colors.success('🚀 New download started!'));\n } else if (newUrl) {\n console.log(this.colors.red('❌ Invalid URL provided.'));\n } else {\n console.log(this.colors.yellow('⚠️ No URL provided, cancelling.'));\n }\n } catch (error) {\n console.error(this.colors.red('❌ Error adding URL: ') + error.message);\n } finally {\n this.isAddingUrl = false;\n \n if (this.isPaused) {\n console.log(this.colors.warning('⏸️ Still paused. Press p to resume, a to add URL.'));\n } else {\n console.log(this.colors.success('▶️ Downloads active. Press p to pause, a to add URL.'));\n }\n }\n}\n\n/**\n * Add a new download to the multiple downloads queue\n * @param {string} url - The URL to download\n * @param {string} outputPath - The output path\n * @param {string} filename - The filename\n */\nasync addToMultipleDownloads(url, outputPath, filename) {\n // Create new progress bar for the added download\n const spinnerType = this.getRandomSpinner();\n const spinnerFrames = this.getSpinnerFrames(spinnerType);\n const spinnerWidth = this.getSpinnerWidth(spinnerFrames[0]);\n const maxFilenameLength = this.COL_FILENAME - spinnerWidth;\n const truncatedName = this.truncateFilename(filename, maxFilenameLength);\n const fileBarColor = this.getRandomBarColor();\n const fileBarGlue = this.getRandomBarGlueColor();\n const barSize = this.calculateBarSize(spinnerFrames[0], this.COL_BAR);\n \n const newDownload = {\n url: url,\n outputPath: outputPath,\n filename: filename\n };\n \n const newFileBar = {\n bar: this.multiBar.create(100, 0, {\n filename: truncatedName,\n spinner: spinnerFrames[0],\n speed: this.formatSpeed('0B'),\n progress: this.formatProgress(0, 0),\n downloadedDisplay: this.formatBytesCompact(0),\n totalDisplay: this.formatTotalDisplay(0),\n etaFormatted: this.formatETA(0),\n percentage: ' 0'.padStart(3)\n }, {\n format: this.colors.yellow('{filename}') + ' ' +\n this.colors.cyan('{spinner}') + ' ' + \n fileBarColor + '{bar}\\u001b[0m' + ' ' +\n this.colors.success('{percentage}%') + ' ' +\n this.colors.info('{downloadedDisplay}') + ' ' +\n this.colors.info('{totalDisplay}') + ' ' +\n this.colors.purple('{speed}') + ' ' +\n this.colors.pink('{etaFormatted}'),\n barCompleteChar: '█',\n barIncompleteChar: '░',\n barGlue: fileBarGlue,\n barsize: barSize\n }),\n spinnerFrames,\n spinnerIndex: 0,\n lastSpinnerUpdate: Date.now(),\n lastFrameUpdate: Date.now(),\n download: { ...newDownload, index: this.getCurrentDownloadCount() }\n };\n \n // Start the new download\n this.downloadSingleFileWithBar(newFileBar, this.getMasterBar(), this.getCurrentDownloadCount() + 1, {\n totalDownloaded: 0,\n totalSize: 0,\n individualSpeeds: [],\n individualSizes: [],\n individualDownloaded: [],\n individualStartTimes: [],\n lastTotalUpdate: Date.now(),\n lastTotalDownloaded: 0,\n actualTotalSize: 0\n }).catch(error => {\n console.error(this.colors.error(`❌ Failed to download ${newDownload.filename}: ${error.message}`));\n });\n}\n\n/**\n * Get current download count (for multiple downloads)\n * @returns {number} Current number of downloads\n */\ngetCurrentDownloadCount() {\n // This is a placeholder - in a real implementation, you'd track this\n return 1;\n}\n\n/**\n * Get master bar (for multiple downloads)\n * @returns {Object} Master progress bar\n */\ngetMasterBar() {\n // This is a placeholder - in a real implementation, you'd return the actual master bar\n return null;\n}\n\n/**\n * Set up fallback keyboard listener using readline\n */\nsetupFallbackKeyboardListener() {\n if (process.stdin.isTTY) {\n process.stdin.setRawMode(true);\n process.stdin.resume();\n process.stdin.setEncoding('utf8');\n \n const handleKeypress = async (str) => {\n // Handle Ctrl+C to exit\n if (str === '\\u0003') {\n console.log(this.colors.yellow.bold('\\n🛑 Download cancelled by user'));\n process.exit(0);\n }\n \n // Handle 'p' key for pause/resume\n if (str.toLowerCase() === 'p') {\n console.log(this.colors.info('P key pressed - toggling pause/resume'));\n if (!this.isPaused) {\n this.pauseAll();\n } else {\n this.resumeAll();\n }\n }\n \n // Handle 'a' key for adding URL\n if (str.toLowerCase() === 'a' && !this.isAddingUrl) {\n console.log(this.colors.info('A key pressed - adding URL'));\n await this.promptForNewUrl();\n }\n };\n \n process.stdin.on('data', handleKeypress);\n // console.log(this.colors.info('💡 Keyboard listener active: [p] pause/resume, [a] add URL'));\n }\n}\n\n/**\n * Set up keyboard listeners for single file download (legacy method)\n * @param {string} url - The URL being downloaded\n * @param {string} outputPath - The output path\n */\nsetupSingleFileKeyboardListeners(url, outputPath) {\n // Use the global keyboard listener instead\n this.setupGlobalKeyboardListener();\n return null; // Return null since we're using global listener\n}\n\n/**\n * Validate URL format\n * @param {string} url - URL to validate\n * @returns {boolean} - Whether URL is valid\n */\nisValidUrl(url) {\n try {\n new URL(url);\n return true;\n } catch {\n return false;\n }\n}\n\n/**\n * Get file extension from URL\n * @param {string} url - URL to extract extension from\n * @returns {string} - File extension or empty string\n */\ngetFileExtension(url) {\n try {\n const pathname = new URL(url).pathname;\n return path.extname(pathname).toLowerCase();\n } catch {\n return '';\n }\n}\n\n/**\n * Generate filename from URL\n * @param {string} url - Download URL\n * @returns {string} - Generated filename\n */\ngenerateFilename(url) {\n try {\n const filename = path.basename(new URL(url).pathname);\n return filename || 'downloaded-file';\n } catch (error) {\n return 'downloaded-file';\n }\n}\n\nsetPauseCallback(cb) {\n this.pauseCallback = cb;\n}\n\nsetResumeCallback(cb) {\n this.resumeCallback = cb;\n}\n\nsetAbortController(controller) {\n this.abortControllers.push(controller);\n}\n\nclearAbortControllers() {\n this.abortControllers = [];\n}\n\npauseAll() {\n this.isPaused = true;\n console.log(this.colors.warning('⏸️ Pausing all downloads...'));\n // Don't abort controllers on pause, just set the flag\n if (this.pauseCallback) this.pauseCallback();\n}\n\nresumeAll() {\n this.isPaused = false;\n console.log(this.colors.success('▶️ Resuming all downloads...'));\n if (this.resumeCallback) this.resumeCallback();\n}\n}\n\n// --- Main CLI logic ---\n// Only run CLI when this file is executed directly, not when imported\nconst __isMain = (typeof import.meta.main === 'boolean' && import.meta.main) || (() => {\n try {\n const scriptArg = process.argv[1] ? path.resolve(process.argv[1]) : '';\n if (!scriptArg) return false;\n const href = pathToFileURL(scriptArg).href;\n return import.meta.url === href;\n } catch {\n return false;\n }\n})();\n\nif (__isMain) {\n const argv = new ArgParser()\n .usage('Usage: grab-url <url...> [options]')\n .command('$0 <url>', 'Fetch data or download files; pass one or more URLs')\n .option('no-save', {\n type: 'boolean',\n default: false,\n describe: 'Don\\'t save output to file, just print to console'\n })\n .option('output', {\n alias: 'o',\n type: 'string',\n describe: 'Output filename (default: output.json)',\n default: null\n })\n .option('params', {\n alias: 'p',\n type: 'string',\n describe: 'JSON string of query parameters (e.g., \\'{\"key\":\"value\"}\\')',\n coerce: (arg) => {\n if (!arg) return {};\n try { return JSON.parse(arg); } catch (e) { throw new Error(`Invalid JSON in params: ${arg}`); }\n }\n })\n .help()\n .alias('h', 'help')\n .example('grab-url https://api.example.com/data', 'Fetch JSON/text from an API and save to output.json')\n .example('grab-url https://example.com/file1.zip https://example.com/file2.zip', 'Download multiple files concurrently')\n .example('grab-url https://example.com/file.iso -o ubuntu.iso', 'Save the first URL to a custom filename')\n .version('1.0.0')\n .strict()\n .parseSync();\n\n const urls = argv.urls || [];\n const params = argv.params || {};\n const outputFile = argv.output;\n const noSave = argv['no-save'];\n\n // --- Mode detection ---\n const anyFileUrl = urls.some(isFileUrl);\n const isDownloadMode = urls.length > 1 || anyFileUrl;\n\n (async () => {\n if (isDownloadMode) {\n // --- Download Mode ---\n const downloader = new ColorFileDownloader();\n // Prepare download objects\n const downloads = urls.map((url, i) => {\n let filename = null;\n // If user provided output, use it for the first file\n if (i === 0 && outputFile) filename = outputFile;\n return { url, outputPath: filename };\n });\n // Prepare download objects with filenames\n const downloadObjects = downloads.map((download, index) => {\n let actualUrl = download.url;\n let filename = download.outputPath;\n if (!filename) filename = downloader.generateFilename(actualUrl);\n const outputPath = path.isAbsolute(filename) ? filename : path.join(process.cwd(), filename);\n const outputDir = path.dirname(outputPath);\n try { if (!fs.existsSync(outputDir)) fs.mkdirSync(outputDir, { recursive: true }); } catch (error) {\n console.error(chalk.red.bold('❌ Could not create output directory: ') + error.message);\n process.exit(1);\n }\n return {\n url: actualUrl,\n outputPath,\n filename: path.basename(filename)\n };\n });\n \n try {\n await downloader.downloadMultipleFiles(downloadObjects);\n // Display individual file stats in a table\n const statsTable = new Table({\n head: ['Filename', 'Size', 'Created'],\n colWidths: [32, 14, 25],\n colAligns: ['left', 'right', 'left'],\n style: { 'padding-left': 1, 'padding-right': 1, head: [], border: [] }\n });\n downloadObjects.forEach((downloadObj) => {\n try {\n const stats = fs.statSync(downloadObj.outputPath);\n statsTable.push([\n downloadObj.filename,\n downloader.formatBytes(stats.size),\n stats.birthtime.toLocaleString()\n ]);\n } catch (error) {\n statsTable.push([\n downloadObj.filename,\n 'Error',\n 'Could not read'\n ]);\n }\n });\n console.log(chalk.cyan.bold('\\nFile Details:'));\n console.log(statsTable.toString());\n } catch (error) {\n console.error(chalk.red.bold('Failed to download files: ') + chalk.yellow(error.message));\n process.exit(1);\n }\n downloader.cleanup();\n } else {\n // --- API Mode ---\n const url = urls[0];\n const startTime = process.hrtime();\n try {\n const res = await grab(url, params);\n if (res.error) log(`\\n\\nStatus: ❌ ${res.error}`);\n let filePath = null;\n let outputData;\n let isTextData = false;\n if (typeof res.data === 'string') { outputData = res.data; isTextData = true; }\n else if (Buffer.isBuffer(res.data) || res.data instanceof Uint8Array) { outputData = res.data; isTextData = false; }\n else if (res.data instanceof Blob) { const arrayBuffer = await res.data.arrayBuffer(); outputData = Buffer.from(arrayBuffer); isTextData = false; }\n else if (res.data && typeof res.data === 'object') { outputData = JSON.stringify(res.data, null, 2); isTextData = true; }\n else { outputData = String(res.data); isTextData = true; }\n if (!noSave) {\n const urlPath = new URL(url).pathname;\n const urlExt = path.extname(urlPath);\n const defaultExt = isTextData ? '.json' : (urlExt || '.bin');\n filePath = outputFile ? path.resolve(outputFile) : path.resolve(process.cwd(), `output${defaultExt}`);\n if (isTextData) fs.writeFileSync(filePath, outputData, 'utf8');\n else fs.writeFileSync(filePath, outputData);\n const [seconds, nanoseconds] = process.hrtime(startTime);\n const elapsedMs = (seconds + nanoseconds / 1e9).toFixed(2);\n const stats = fs.statSync(filePath);\n const fileSizeMB = (stats.size / (1024 * 1024)).toFixed(1);\n log(`⏱️ ${elapsedMs}s 📦 ${fileSizeMB}MB ✅ Saved to: ${filePath}`);\n } else {\n if (isTextData) {\n log(outputData);\n } else {\n log(`Binary data received (${outputData.length} bytes). Use --output to save to file.`);\n }\n }\n } catch (error) {\n log(`Error: ${error.message}`, {color: 'red'});\n process.exit(1);\n }\n }\n })();\n}"],"names":["spinners","dots","dots2","dots3","dots4","dots5","dots6","dots7","dots8","dots9","dots10","dots11","dots12","dots13","dots14","dotsCircle","sand","line","line2","pipe","simpleDots","simpleDotsScrolling","star","star2","flip","hamburger","growVertical","growHorizontal","balloon","balloon2","noise","bounce","boxBounce","boxBounce2","triangle","binary","arc","circle","squareCorners","circleQuarters","circleHalves","squish","toggle","toggle2","toggle3","toggle4","toggle5","toggle6","toggle7","toggle8","toggle9","toggle10","toggle11","toggle12","toggle13","arrow","arrow2","arrow3","bouncingBar","bouncingBall","smiley","monkey","hearts","clock","earth","moon","runner","dqpb","weather","christmas","grenade","point","layer","betaWave","fingerDance","mindblown","speaker","orangePulse","bluePulse","orangeBluePulse","timeTravel","aesthetic","e","t","color","r","style","n","hideInProduction","o","startSpinner","l","stopSpinner","i","a","f","window","location","hostname","includes","g","JSON","stringify","Array","isArray","length","process","replace","reset","b","global","globalThis","interval","setInterval","stdout","write","split","clearInterval","repeat","match","console","debug","log","black","red","green","yellow","blue","magenta","cyan","white","gray","brightRed","brightGreen","brightYellow","brightBlue","brightMagenta","brightCyan","brightWhite","bgBlack","bgRed","bgGreen","bgYellow","bgBlue","bgMagenta","bgCyan","bgWhite","bgGray","bgBrightRed","bgBrightGreen","bgBrightYellow","bgBrightBlue","bgBrightMagenta","bgBrightCyan","bgBrightWhite","Object","entries","every","forEach","keys","s","y","async","headers","response","method","d","post","put","patch","cache","c","cacheForTime","u","timeout","baseURL","p","env","SERVER_API_URL","cancelOngoingIfNew","cancelNewIfOngoing","m","rateLimit","infiniteScroll","w","setDefaults","h","retryAttempts","v","logger","T","onRequest","L","onResponse","S","onError","E","onStream","x","repeatEvery","O","k","debounce","P","regrabOnStale","j","regrabOnFocus","D","regrabOnNetwork","N","q","A","F","body","R","$","grab","defaults","I","startsWith","endsWith","slice","setTimeout","addEventListener","document","visibilityState","J","H","C","querySelector","scrollListener","removeEventListener","target","localStorage","setItem","scrollTop","scrollLeft","scrollHeight","clientHeight","currentPage","find","request","path","lastFetchTime","Date","now","res","isLoading","Error","controller","abort","unshift","AbortController","Accept","redirect","signal","AbortSignal","URLSearchParams","toString","mock","Promise","params","fetch","catch","message","ok","status","statusText","get","json","blob","text","delay","U","Number","toFixed","data","paginateKey","error","instance","clearTimeout","getElementById","appendChild","createElement","id","setAttribute","innerHTML","remove","onclick","_readline","require$$0","terminal","constructor","outputStream","this","stream","linewrap","dy","cursorSave","isTTY","cursorRestore","cursor","enabled","cursorTo","cursorRelative","dx","moveCursor","cursorRelativeReset","clearRight","clearLine","clearBottom","clearScreenDown","newline","rawWrite","substr","getWidth","lineWrapping","columns","key","ctrlKey","altKey","toLocaleString","parse","getItem","ansiRegex","onlyFirst","pattern","join","RegExp","stripAnsi","string","isFullwidthCodePoint","codePoint","isNaN","isFullwidthCodePointModule","exports","default","require$$1","emojiRegex","stringWidth","width","code","codePointAt","stringWidthModule","formatValue","options","type","autopadding","value","autopaddingChar","formatBar","progress","completeSize","Math","round","barsize","incompleteSize","barCompleteString","barGlue","barIncompleteString","formatTime","roundToMultipleOf","input","floor","_stringWidth","_defaultFormatValue","_defaultFormatBar","require$$2","_defaultFormatTime","require$$3","formatter","payload","format","percentage","stopTime","elapsedTime","startTime","context","assign","bar","total","eta","eta_formatted","duration","duration_formatted","fullMargin","max","maxWidth","halfMargin","align","mergeOption","defaultValue","rawOptions","preset","opt","throttleTime","fps","stderr","clearOnComplete","stopOnComplete","hideCursor","barCompleteChar","barIncompleteChar","etaBufferLength","etaBuffer","etaAsynchronousUpdate","progressCalculationRelative","synchronousUpdate","noTTYOutput","notTTYSchedule","emptyOnZero","forceRedraw","gracefulExit","assignDerivedOptions","_ETA","initTime","initValue","valueBuffer","timeBuffer","update","time","push","calculate","getTime","remaining","currentBufferSize","buffer","min","vt_rate","ceil","isFinite","_Terminal","_formatter","_options","_EventEmitter","require$$4","genericBar","super","startValue","lastDrawnString","lastRedraw","isActive","render","forceRendering","getProgress","updateETA","emit","start","stop","arg0","arg1","payloadData","getTotal","increment","setTotal","_legacy","legacy","_shades_classic","shadesClassic","_shades_grey","shadesGrey","_rect","rect","presets","shades_classic","shades_grey","_SingleBar","_GenericBar","singleBar","timer","schedulingRate","sigintCallback","bind","current","once","removeListener","_MultiBar","_BarElement","multiBar","bars","loggingBuffer","create","barOptions","index","indexOf","splice","shift","_Presets","_Formatter","require$$5","require$$6","cliProgress","Bar","SingleBar","MultiBar","Presets","Format","Formatter","BarFormat","ValueFormat","TimeFormat","wrapAnsi16","offset","wrapAnsi256","wrapAnsi16m","styles","modifier","bold","dim","italic","underline","overline","inverse","hidden","strikethrough","blackBright","grey","redBright","greenBright","yellowBright","blueBright","magentaBright","cyanBright","whiteBright","bgColor","bgBlackBright","bgGrey","bgRedBright","bgGreenBright","bgYellowBright","bgBlueBright","bgMagentaBright","bgCyanBright","bgWhiteBright","ansiStyles","codes","Map","groupName","group","styleName","open","close","set","defineProperty","enumerable","ansi","ansi256","ansi16m","defineProperties","rgbToAnsi256","hexToRgb","hex","matches","exec","colorString","map","character","integer","parseInt","hexToAnsi256","ansi256ToAnsi","remainder","result","rgbToAnsi","hexToAnsi","assembleStyles","level","navigator","userAgentData","brand","brands","version","test","userAgent","colorSupport","supportsColor","stringReplaceAll","substring","replacer","substringLength","endIndex","returnValue","stdoutColor","stderrColor","GENERATOR","STYLER","IS_EMPTY","levelMapping","chalkFactory","chalk","strings","object","isInteger","colorLevel","applyOptions","setPrototypeOf","createChalk","prototype","Function","builder","createBuilder","createStyler","visible","getModelAnsi","model","arguments_","usedModels","styler","toUpperCase","proto","parent","openAll","closeAll","self","_styler","_isEmpty","applyStyle","lfIndex","prefix","postfix","gotCR","stringEncaseCRLFWithFirstIndex","dirname","fileURLToPath","ArgParser","commands","examples","helpText","versionText","usage","command","desc","handler","required","option","name","opts","example","cmd","help","alias","short","long","strict","parseSync","args","argv","positional","showHelp","exit","arg","optName","coerceValue","nextArg","shortFlag","longName","findLongName","urls","url","coerce","padEnd","flags","describe","ex","ColorFileDownloader","progressBar","loadingSpinner","abortController","COL_FILENAME","COL_SPINNER","COL_BAR","COL_PERCENT","COL_DOWNLOADED","COL_TOTAL","COL_SPEED","COL_ETA","colors","primary","success","warning","info","purple","pink","gradient","barColors","barGlueColors","spinnerTypes","stateDir","getStateDirectory","ensureStateDirectoryExists","isPaused","pauseCallback","resumeCallback","abortControllers","keyboardListener","isAddingUrl","GRAB_DOWNLOAD_STATE_DIR","cwd","fs","existsSync","mkdirSync","recursive","getStateFilePath","outputPath","stateFileName","basename","cleanupStateFile","stateFilePath","unlinkSync","printHeaderRow","getRandomOraSpinner","random","getRandomBarColor","getRandomBarGlueColor","getRandomSpinner","getSpinnerFrames","spinnerType","spinnerData","spinner","frames","getSpinnerWidth","frame","char","calculateBarSize","spinnerFrame","baseBarSize","availableWidth","checkServerSupport","acceptRanges","contentLength","lastModified","etag","supportsResume","totalSize","loadDownloadState","stateData","readFileSync","saveDownloadState","state","writeFileSync","getPartialFileSize","filePath","statSync","size","getRandomColor","formatBytes","bytes","decimals","dm","sizes","unit","parseFloat","pow","formatBytesPlain","formatBytesCompact","kb","truncateFilename","filename","maxLength","extension","extname","baseName","firstPart","lastPart","formatETA","seconds","Infinity","hours","mins","secs","padStart","formatMasterProgress","totalDownloaded","totalDownloadedMB","formatProgress","downloaded","formatDownloaded","formatTotalDisplay","mb","formatTotal","formatSpeed","speed","formatSpeedDisplay","bytesPerSecond","kbPerSecond","formatTotalSpeed","downloadMultipleFiles","downloads","setupGlobalKeyboardListener","masterBarColor","masterBarGlue","individualSpeeds","fill","individualSizes","individualDownloaded","individualStartTimes","lastSpeedUpdate","lastIndividualDownloaded","lastTotalUpdate","lastTotalDownloaded","totalSizeFromDownloads","reduce","sum","download","estimatedSize","actualTotalSize","speedUpdateInterval","timeSinceLastUpdate","incrementalDownloaded","fileBars","downloadedDisplay","totalDisplay","etaFormatted","totalSpeedBps","totalDownloadedFromFiles","timeElapsed","discoveredTotalSize","displayTotalSize","masterBar","masterSpinnerWidth","masterMaxFilenameLength","masterBarSize","spinnerFrames","spinnerWidth","maxFilenameLength","truncatedName","fileBarColor","fileBarGlue","barSize","spinnerIndex","lastSpinnerUpdate","lastFrameUpdate","downloadPromises","fileBar","downloadSingleFileWithBar","results","allSettled","successful","filter","failed","reason","celebrationEmojis","randomEmoji","clearAbortControllers","pausedMessageShown","setPauseCallback","setResumeCallback","totalFiles","totalTracking","tempFilePath","setAbortController","serverInfo","previousState","partialSize","startByte","resuming","downloadState","timestamp","toISOString","writeStream","createWriteStream","lastTime","lastDownloaded","progressStream","Readable","read","reader","getReader","resolve","done","timeDiff","currentSpinner","newBarSize","newSpinnerType","bytesDiff","fileIndex","Buffer","from","destroy","processChunk","pipeline","renameSync","finalTotalSize","downloadFile","randomOraSpinner","ora","succeed","warn","singleBarColor","singleBarGlue","currentSpinnerType","spinnerFrameIndex","initialBarSize","setupSingleFileKeyboardListeners","sessionDownloaded","lastSpinnerFrameUpdate","speedBps","isSpinning","fail","cleanup","kill","stdin","setRawMode","pause","setupFallbackKeyboardListener","handleGlobalKeyPress","keyName","resumeAll","pauseAll","promptForNewUrl","rl","readline","createInterface","output","newUrl","question","answer","trim","isValidUrl","newFilename","generateFilename","newOutputPath","isAbsolute","outputDir","addToMultipleDownloads","newDownload","newFileBar","getCurrentDownloadCount","getMasterBar","resume","setEncoding","handleKeypress","str","toLowerCase","on","URL","getFileExtension","pathname","cb","scriptArg","href","pathToFileURL","require","__filename","_documentCurrentScript","tagName","src","baseURI","outputFile","noSave","anyFileUrl","some","isDownloadMode","downloader","downloadObjects","actualUrl","statsTable","Table","head","colWidths","colAligns","border","downloadObj","stats","birthtime","hrtime","outputData","isTextData","isBuffer","Uint8Array","Blob","arrayBuffer","String","urlPath","urlExt","defaultExt","nanoseconds","elapsedMs"],"mappings":";mSAAA,MAAAA,EAAe,CACdC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,OAAQ,CACP,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,WAAY,CACX,KACA,KACA,KACA,KACA,KACA,KACA,KACA,MAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,KAAM,CACL,IACA,KACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,KAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,WAAY,CACX,MACA,MACA,MACA,OAEDC,oBAAqB,CACpB,MACA,MACA,MACA,MACA,MACA,OAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,KAEDC,KAAM,CACL,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,UAAW,CACV,IACA,IACA,KAEDC,aAAc,CACb,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,eAAgB,CACf,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,QAAS,CACR,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,SAAU,CACT,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,IACA,KAEDC,UAAW,CACV,IACA,IACA,IACA,KAEDC,WAAY,CACX,IACA,IACA,IACA,KAEDC,SAAU,CACT,IACA,IACA,IACA,KAEDC,OAAQ,CACP,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEDC,IAAK,CACJ,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,IACA,KAEDC,cAAe,CACd,IACA,IACA,IACA,KAEDC,eAAgB,CACf,IACA,IACA,IACA,KAEDC,aAAc,CACb,IACA,IACA,IACA,KAEDC,OAAQ,CACP,IACA,KAEDC,OAAQ,CACP,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,IACA,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,QAAS,CACR,IACA,KAEDC,SAAU,CACT,IACA,IACA,KAEDC,SAAU,CACT,IACA,KAEDC,SAAU,CACT,IACA,KAEDC,SAAU,CACT,IACA,IACA,KAEDC,MAAO,CACN,IACA,IACA,IACA,IACA,IACA,IACA,IACA,KAEDC,OAAQ,CACP,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,OAAQ,CACP,QACA,QACA,QACA,QACA,QACA,SAEDC,YAAa,CACZ,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,SACA,UAEDC,aAAc,CACb,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,WACA,YAEDC,OAAQ,CACP,MACA,OAEDC,OAAQ,CACP,MACA,MACA,MACA,OAEDC,OAAQ,CACP,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,MAAO,CACN,MACA,MACA,OAEDC,KAAM,CACL,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,OAAQ,CACP,MACA,OAEDC,KAAM,CACL,IACA,IACA,IACA,KAEDC,QAAS,CACR,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,KACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,MACA,OAEDC,UAAW,CACV,KACA,MAEDC,QAAS,CA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","x_google_ignoreList":[3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]}