#!/usr/bin/env node import{createRequire as NF}from"node:module";var WF=Object.create;var{getPrototypeOf:_F,defineProperty:iD,getOwnPropertyNames:QF}=Object;var HF=Object.prototype.hasOwnProperty;var FD=(u,D,C)=>{C=u!=null?WF(_F(u)):{};let F=D||!u||!u.__esModule?iD(C,"default",{value:u,enumerable:!0}):C;for(let E of QF(u))if(!HF.call(F,E))iD(F,E,{get:()=>u[E],enumerable:!0});return F};var x=(u,D)=>()=>(D||u((D={exports:{}}).exports,D),D.exports);var d=NF(import.meta.url);var _u=x((W3,Wu)=>{class ku{constructor(u,D,C){this.etaBufferLength=u||100,this.valueBuffer=[C],this.timeBuffer=[D],this.eta="0"}update(u,D,C){this.valueBuffer.push(D),this.timeBuffer.push(u),this.calculate(C-D)}getTime(){return this.eta}calculate(u){let D=this.valueBuffer.length,C=Math.min(this.etaBufferLength,D),F=this.valueBuffer[D-1]-this.valueBuffer[D-C],E=this.timeBuffer[D-1]-this.timeBuffer[D-C],B=F/E;this.valueBuffer=this.valueBuffer.slice(-this.etaBufferLength),this.timeBuffer=this.timeBuffer.slice(-this.etaBufferLength);let A=Math.ceil(u/B/1000);if(isNaN(A))this.eta="NULL";else if(!isFinite(A))this.eta="INF";else if(A>1e7)this.eta="INF";else if(A<0)this.eta=0;else this.eta=A}}Wu.exports=ku});var VD=x((_3,Hu)=>{var c=d("readline");class Qu{constructor(u){this.stream=u,this.linewrap=!0,this.dy=0}cursorSave(){if(!this.stream.isTTY)return;this.stream.write("\x1B7")}cursorRestore(){if(!this.stream.isTTY)return;this.stream.write("\x1B8")}cursor(u){if(!this.stream.isTTY)return;if(u)this.stream.write("\x1B[?25h");else this.stream.write("\x1B[?25l")}cursorTo(u=null,D=null){if(!this.stream.isTTY)return;c.cursorTo(this.stream,u,D)}cursorRelative(u=null,D=null){if(!this.stream.isTTY)return;this.dy=this.dy+D,c.moveCursor(this.stream,u,D)}cursorRelativeReset(){if(!this.stream.isTTY)return;c.moveCursor(this.stream,0,-this.dy),c.cursorTo(this.stream,0,null),this.dy=0}clearRight(){if(!this.stream.isTTY)return;c.clearLine(this.stream,1)}clearLine(){if(!this.stream.isTTY)return;c.clearLine(this.stream,0)}clearBottom(){if(!this.stream.isTTY)return;c.clearScreenDown(this.stream)}newline(){this.stream.write(` `),this.dy++}write(u,D=!1){if(this.linewrap===!0&&D===!1)this.stream.write(u.substr(0,this.getWidth()));else this.stream.write(u)}lineWrapping(u){if(!this.stream.isTTY)return;if(this.linewrap=u,u)this.stream.write("\x1B[?7h");else this.stream.write("\x1B[?7l")}isTTY(){return this.stream.isTTY===!0}getWidth(){return this.stream.columns||(this.stream.isTTY?80:200)}}Hu.exports=Qu});var zu=x((Q3,Nu)=>{Nu.exports=({onlyFirst:u=!1}={})=>{let D=["[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]+)*|[a-zA-Z\\d]+(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)","(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))"].join("|");return new RegExp(D,u?void 0:"g")}});var Iu=x((H3,qu)=>{var cF=zu();qu.exports=(u)=>typeof u==="string"?u.replace(cF(),""):u});var Vu=x((N3,LD)=>{var xu=(u)=>{if(Number.isNaN(u))return!1;if(u>=4352&&(u<=4447||u===9001||u===9002||11904<=u&&u<=12871&&u!==12351||12880<=u&&u<=19903||19968<=u&&u<=42182||43360<=u&&u<=43388||44032<=u&&u<=55203||63744<=u&&u<=64255||65040<=u&&u<=65049||65072<=u&&u<=65131||65281<=u&&u<=65376||65504<=u&&u<=65510||110592<=u&&u<=110593||127488<=u&&u<=127569||131072<=u&&u<=262141))return!0;return!1};LD.exports=xu;LD.exports.default=xu});var Mu=x((z3,Lu)=>{Lu.exports=function(){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}});var Ru=x((q3,MD)=>{var lF=Iu(),dF=Vu(),pF=Mu(),Ou=(u)=>{if(typeof u!=="string"||u.length===0)return 0;if(u=lF(u),u.length===0)return 0;u=u.replace(pF()," ");let D=0;for(let C=0;C=127&&F<=159)continue;if(F>=768&&F<=879)continue;if(F>65535)C++;D+=dF(F)?2:1}return D};MD.exports=Ou;MD.exports.default=Ou});var OD=x((I3,ju)=>{ju.exports=function(D,C,F){if(C.autopadding!==!0)return D;function E(B,A){return(C.autopaddingChar+B).slice(-A)}switch(F){case"percentage":return E(D,3);default:return D}}});var RD=x((x3,wu)=>{wu.exports=function(D,C){let F=Math.round(D*C.barsize),E=C.barsize-F;return C.barCompleteString.substr(0,F)+C.barGlue+C.barIncompleteString.substr(0,E)}});var jD=x((V3,Su)=>{Su.exports=function(D,C,F){function E(A){if(F)return F*Math.round(A/F);else return A}function B(A){return(C.autopaddingChar+A).slice(-2)}if(D>3600)return B(Math.floor(D/3600))+"h"+B(E(D%3600/60))+"m";else if(D>60)return B(Math.floor(D/60))+"m"+B(E(D%60))+"s";else if(D>10)return B(E(D))+"s";else return B(D)+"s"}});var wD=x((L3,Tu)=>{var nF=Ru(),sF=OD(),aF=RD(),rF=jD();Tu.exports=function(D,C,F){let E=D.format,B=D.formatTime||rF,A=D.formatValue||sF,$=D.formatBar||aF,J=Math.floor(C.progress*100)+"",G=C.stopTime||Date.now(),X=Math.round((G-C.startTime)/1000),Y=Object.assign({},F,{bar:$(C.progress,D),percentage:A(J,D,"percentage"),total:A(C.total,D,"total"),value:A(C.value,D,"value"),eta:A(C.eta,D,"eta"),eta_formatted:B(C.eta,D,5),duration:A(X,D,"duration"),duration_formatted:B(X,D,1)});E=E.replace(/\{(\w+)\}/g,function(_,U){if(typeof Y[U]<"u")return Y[U];return _});let Z=Math.max(0,C.maxWidth-nF(E)-2),K=Math.floor(Z/2);switch(D.align){case"right":E=Z>0?" ".repeat(Z)+E:E;break;case"center":E=K>0?" ".repeat(K)+E:E;break;case"left":default:break}return E}});var $D=x((M3,bu)=>{function z(u,D){if(typeof u>"u"||u===null)return D;else return u}bu.exports={parse:function(D,C){let F={},E=Object.assign({},C,D);return F.throttleTime=1000/z(E.fps,10),F.stream=z(E.stream,process.stderr),F.terminal=z(E.terminal,null),F.clearOnComplete=z(E.clearOnComplete,!1),F.stopOnComplete=z(E.stopOnComplete,!1),F.barsize=z(E.barsize,40),F.align=z(E.align,"left"),F.hideCursor=z(E.hideCursor,!1),F.linewrap=z(E.linewrap,!1),F.barGlue=z(E.barGlue,""),F.barCompleteChar=z(E.barCompleteChar,"="),F.barIncompleteChar=z(E.barIncompleteChar,"-"),F.format=z(E.format,"progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}"),F.formatTime=z(E.formatTime,null),F.formatValue=z(E.formatValue,null),F.formatBar=z(E.formatBar,null),F.etaBufferLength=z(E.etaBuffer,10),F.etaAsynchronousUpdate=z(E.etaAsynchronousUpdate,!1),F.progressCalculationRelative=z(E.progressCalculationRelative,!1),F.synchronousUpdate=z(E.synchronousUpdate,!0),F.noTTYOutput=z(E.noTTYOutput,!1),F.notTTYSchedule=z(E.notTTYSchedule,2000),F.emptyOnZero=z(E.emptyOnZero,!1),F.forceRedraw=z(E.forceRedraw,!1),F.autopadding=z(E.autopadding,!1),F.gracefulExit=z(E.gracefulExit,!1),F},assignDerivedOptions:function(D){return D.barCompleteString=D.barCompleteChar.repeat(D.barsize+1),D.barIncompleteString=D.barIncompleteChar.repeat(D.barsize+1),D.autopaddingChar=D.autopadding?z(D.autopaddingChar," "):"",D}}});var SD=x((O3,vu)=>{var yu=_u(),iF=VD(),oF=wD(),tF=$D(),eF=d("events");vu.exports=class extends eF{constructor(D){super();this.options=tF.assignDerivedOptions(D),this.terminal=this.options.terminal?this.options.terminal:new iF(this.options.stream),this.value=0,this.startValue=0,this.total=100,this.lastDrawnString=null,this.startTime=null,this.stopTime=null,this.lastRedraw=Date.now(),this.eta=new yu(this.options.etaBufferLength,0,0),this.payload={},this.isActive=!1,this.formatter=typeof this.options.format==="function"?this.options.format:oF}render(D=!1){let C={progress:this.getProgress(),eta:this.eta.getTime(),startTime:this.startTime,stopTime:this.stopTime,total:this.total,value:this.value,maxWidth:this.terminal.getWidth()};if(this.options.etaAsynchronousUpdate)this.updateETA();let F=this.formatter(this.options,C,this.payload);if(D||this.options.forceRedraw||this.options.noTTYOutput&&!this.terminal.isTTY()||this.lastDrawnString!=F)this.emit("redraw-pre"),this.terminal.cursorTo(0,null),this.terminal.write(F),this.terminal.clearRight(),this.lastDrawnString=F,this.lastRedraw=Date.now(),this.emit("redraw-post")}start(D,C,F){this.value=C||0,this.total=typeof D<"u"&&D>=0?D:100,this.startValue=C||0,this.payload=F||{},this.startTime=Date.now(),this.stopTime=null,this.lastDrawnString="",this.eta=new yu(this.options.etaBufferLength,this.startTime,this.value),this.isActive=!0,this.emit("start",D,C)}stop(){this.isActive=!1,this.stopTime=Date.now(),this.emit("stop",this.total,this.value)}update(D,C={}){if(typeof D==="number")this.value=D,this.eta.update(Date.now(),D,this.total);let F=(typeof D==="object"?D:C)||{};this.emit("update",this.total,this.value);for(let E in F)this.payload[E]=F[E];if(this.value>=this.getTotal()&&this.options.stopOnComplete)this.stop()}getProgress(){let D=this.value/this.total;if(this.options.progressCalculationRelative)D=(this.value-this.startValue)/(this.total-this.startValue);if(isNaN(D))D=this.options&&this.options.emptyOnZero?0:1;return D=Math.min(Math.max(D,0),1),D}increment(D=1,C={}){if(typeof D==="object")this.update(this.value+1,D);else this.update(this.value+D,C)}getTotal(){return this.total}setTotal(D){if(typeof D<"u"&&D>=0)this.total=D}updateETA(){this.eta.update(Date.now(),this.value,this.total)}}});var hu=x((R3,Pu)=>{var D8=SD(),u8=$D();Pu.exports=class extends D8{constructor(D,C){super(u8.parse(D,C));if(this.timer=null,this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.options.synchronousUpdate=!1;this.schedulingRate=this.terminal.isTTY()?this.options.throttleTime:this.options.notTTYSchedule,this.sigintCallback=null}render(){if(this.timer)clearTimeout(this.timer),this.timer=null;if(super.render(),this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.terminal.newline();this.timer=setTimeout(this.render.bind(this),this.schedulingRate)}update(D,C){if(!this.timer)return;if(super.update(D,C),this.options.synchronousUpdate&&this.lastRedraw+this.options.throttleTime*2{var F8=VD(),C8=SD(),E8=$D(),B8=d("events");fu.exports=class extends B8{constructor(D,C){super();this.bars=[],this.options=E8.parse(D,C),this.options.synchronousUpdate=!1,this.terminal=this.options.terminal?this.options.terminal:new F8(this.options.stream),this.timer=null,this.isActive=!1,this.schedulingRate=this.terminal.isTTY()?this.options.throttleTime:this.options.notTTYSchedule,this.loggingBuffer=[],this.sigintCallback=null}create(D,C,F,E={}){let B=new C8(Object.assign({},this.options,{terminal:this.terminal},E));if(this.bars.push(B),this.options.noTTYOutput===!1&&this.terminal.isTTY()===!1)return B;if(this.sigintCallback===null&&this.options.gracefulExit)this.sigintCallback=this.stop.bind(this),process.once("SIGINT",this.sigintCallback),process.once("SIGTERM",this.sigintCallback);if(!this.isActive){if(this.options.hideCursor===!0)this.terminal.cursor(!1);if(this.options.linewrap===!1)this.terminal.lineWrapping(!1);this.timer=setTimeout(this.update.bind(this),this.schedulingRate)}return this.isActive=!0,B.start(D,C,F),this.emit("start"),B}remove(D){let C=this.bars.indexOf(D);if(C<0)return!1;return this.bars.splice(C,1),this.update(),this.terminal.newline(),this.terminal.clearBottom(),!0}update(){if(this.timer)clearTimeout(this.timer),this.timer=null;if(this.emit("update-pre"),this.terminal.cursorRelativeReset(),this.emit("redraw-pre"),this.loggingBuffer.length>0){this.terminal.clearLine();while(this.loggingBuffer.length>0)this.terminal.write(this.loggingBuffer.shift(),!0)}for(let D=0;D0)this.terminal.newline();this.bars[D].render()}if(this.emit("redraw-post"),this.options.noTTYOutput&&this.terminal.isTTY()===!1)this.terminal.newline(),this.terminal.newline();if(this.timer=setTimeout(this.update.bind(this),this.schedulingRate),this.emit("update-post"),this.options.stopOnComplete&&!this.bars.find((D)=>D.isActive))this.stop()}stop(){if(clearTimeout(this.timer),this.timer=null,this.sigintCallback)process.removeListener("SIGINT",this.sigintCallback),process.removeListener("SIGTERM",this.sigintCallback),this.sigintCallback=null;if(this.isActive=!1,this.options.hideCursor===!0)this.terminal.cursor(!0);if(this.options.linewrap===!1)this.terminal.lineWrapping(!0);if(this.terminal.cursorRelativeReset(),this.emit("stop-pre-clear"),this.options.clearOnComplete)this.terminal.clearBottom();else{for(let D=0;D0)this.terminal.newline();this.bars[D].render(),this.bars[D].stop()}this.terminal.newline()}this.emit("stop")}log(D){this.loggingBuffer.push(D)}}});var cu=x((w3,mu)=>{mu.exports={format:"progress [{bar}] {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"=",barIncompleteChar:"-"}});var du=x((S3,lu)=>{lu.exports={format:" {bar} {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"█",barIncompleteChar:"░"}});var nu=x((T3,pu)=>{pu.exports={format:" \x1B[90m{bar}\x1B[0m {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"█",barIncompleteChar:"░"}});var au=x((b3,su)=>{su.exports={format:" {bar}■ {percentage}% | ETA: {eta}s | {value}/{total}",barCompleteChar:"■",barIncompleteChar:" "}});var iu=x((y3,ru)=>{var A8=cu(),Z8=du(),$8=nu(),J8=au();ru.exports={legacy:A8,shades_classic:Z8,shades_grey:$8,rect:J8}});var eu=x((v3,tu)=>{var ou=hu(),K8=gu(),X8=iu(),Y8=wD(),G8=OD(),U8=RD(),k8=jD();tu.exports={Bar:ou,SingleBar:ou,MultiBar:K8,Presets:X8,Format:{Formatter:Y8,BarFormat:U8,ValueFormat:G8,TimeFormat:k8}}});import{join as ZD,basename as Yu,extname as Gu}from"node:path";import{randomUUID as fF}from"node:crypto";import{rm as Uu}from"node:fs/promises";import{spawn as e}from"node:child_process";import{appendFile as zF}from"node:fs/promises";var WD=null;function _D(u){WD=u}async function P(u){if(WD)try{await zF(WD,u,"utf-8")}catch(D){}}async function p(){return new Promise((u)=>{let D=e("ffmpeg",["-version"]);D.on("error",()=>u(!1)),D.on("close",(C)=>u(C===0))})}async function n(){return new Promise((u)=>{let D=e("MP4Box",["-version"]);D.on("error",()=>u(!1)),D.on("close",(C)=>u(C===0))})}async function s(){let u=await new Promise((E)=>{let B=e("ffmpeg",["-hide_banner","-encoders"]),A="";B.stdout.on("data",($)=>{A+=$.toString()}),B.on("error",()=>E("")),B.on("close",()=>E(A))}),D=(E)=>u.includes(E),C=[],F=[{acc:"nvenc",h264:D("h264_nvenc")?"h264_nvenc":void 0,av1:D("av1_nvenc")?"av1_nvenc":void 0},{acc:"qsv",h264:D("h264_qsv")?"h264_qsv":void 0,av1:D("av1_qsv")?"av1_qsv":void 0},{acc:"amf",h264:D("h264_amf")?"h264_amf":void 0,av1:D("av1_amf")?"av1_amf":void 0},{acc:"vaapi",h264:D("h264_vaapi")?"h264_vaapi":void 0,av1:D("av1_vaapi")?"av1_vaapi":void 0},{acc:"videotoolbox",h264:D("h264_videotoolbox")?"h264_videotoolbox":void 0,av1:D("av1_videotoolbox")?"av1_videotoolbox":void 0},{acc:"v4l2",h264:D("h264_v4l2m2m")?"h264_v4l2m2m":void 0,av1:D("av1_v4l2m2m")?"av1_v4l2m2m":void 0}];for(let E of F)if(E.h264||E.av1)C.push({accelerator:E.acc,h264Encoder:E.h264,av1Encoder:E.av1});return C}async function g(u,D,C){let E=` === FFmpeg Command [${new Date().toISOString()}] === ffmpeg ${u.join(" ")} `;return await P(E),new Promise((B,A)=>{let $=e("ffmpeg",u),J="";$.stderr.on("data",(G)=>{let X=G.toString();if(J+=X,D&&C){let Y=X.match(/time=(\d{2}):(\d{2}):(\d{2}\.\d{2})/);if(Y){let Z=parseInt(Y[1]),K=parseInt(Y[2]),_=parseFloat(Y[3]),U=Z*3600+K*60+_,q=Math.min(100,U/C*100);D(q)}}}),$.on("error",(G)=>{P(`ERROR: ${G.message} `),A(Error(`FFmpeg error: ${G.message}`))}),$.on("close",(G)=>{if(G===0){let Y=J.split(` `).filter((Z)=>Z.trim()).slice(-10).join(` `);P(`SUCCESS: Exit code ${G} --- Last 10 lines of output --- ${Y} `),B()}else P(`FAILED: Exit code ${G} --- Full error output --- ${J} `),A(Error(`FFmpeg failed with exit code ${G} ${J}`))})})}async function QD(u){let C=` === MP4Box Command [${new Date().toISOString()}] === MP4Box ${u.join(" ")} `;return await P(C),new Promise((F,E)=>{let B=e("MP4Box",u),A="",$="";B.stdout.on("data",(J)=>{A+=J.toString()}),B.stderr.on("data",(J)=>{$+=J.toString()}),B.on("error",(J)=>{P(`ERROR: ${J.message} `),E(Error(`MP4Box error: ${J.message}`))}),B.on("close",(J)=>{if(J===0){let Y=(A||$).split(` `).filter((Z)=>Z.trim()).slice(-10).join(` `);P(`SUCCESS: Exit code ${J} --- Last 10 lines of output --- ${Y} `),F()}else{let G=$||A;P(`FAILED: Exit code ${J} --- Full error output --- ${G} `),E(Error(`MP4Box failed with exit code ${J} ${G}`))}})})}import{spawn as qF}from"node:child_process";async function a(u){return new Promise((D,C)=>{let F=qF("ffprobe",["-v","error","-show_entries","stream=width,height,duration,r_frame_rate,codec_name,codec_type,bit_rate","-show_entries","format=duration","-of","json",u]),E="";F.stdout.on("data",(B)=>{E+=B.toString()}),F.on("error",(B)=>{C(Error(`ffprobe error: ${B.message}`))}),F.on("close",(B)=>{if(B!==0){C(Error(`ffprobe failed with exit code ${B}`));return}try{let A=JSON.parse(E),$=A.streams.find((U)=>U.codec_type==="video"),J=A.streams.find((U)=>U.codec_type==="audio"),G=A.format;if(!$){C(Error("No video stream found in input file"));return}let X=30;if($.r_frame_rate){let[U,q]=$.r_frame_rate.split("/").map(Number);if(U&&q&&q!==0)X=U/q}let Y=parseFloat($.duration||G.duration||"0"),Z=A.streams.find((U)=>U.codec_type==="audio"&&U.bit_rate),K=Z?.bit_rate?Math.round(parseInt(Z.bit_rate)/1000):void 0,_=$.bit_rate?Math.round(parseInt($.bit_rate)/1000):void 0;D({width:$.width,height:$.height,duration:Y,fps:X,codec:$.codec_name,hasAudio:Boolean(J),audioBitrate:K,videoBitrate:_})}catch(A){C(Error(`Failed to parse ffprobe output: ${A}`))}})})}function CD(u,D=256){if(!u)return`${D}k`;let C=Math.min(u,D);if(C<=64)return"64k";if(C<=96)return"96k";if(C<=128)return"128k";if(C<=192)return"192k";return"256k"}function ED(u){let D=Math.floor(u/3600),C=Math.floor(u%3600/60),F=u%60;return`${String(D).padStart(2,"0")}:${String(C).padStart(2,"0")}:${F.toFixed(3).padStart(6,"0")}`}import{mkdir as IF,access as xF,constants as VF}from"node:fs/promises";async function m(u){try{await xF(u,VF.F_OK)}catch{await IF(u,{recursive:!0})}}function OF(u,D){let C=u*D;if(C<=230400)return 0.08;if(C<=409920)return 0.075;if(C<=921600)return 0.07;if(C<=2073600)return 0.065;if(C<=3686400)return 0.06;return 0.055}function y(u,D,C=30,F){let E=OF(u,D),B=Math.round(u*D*C*E/1000);if(F&&B>F)B=F;return`${B}k`}var HD=[{name:"360p",width:640,height:360,videoBitrate:y(640,360,30),audioBitrate:"192k"},{name:"480p",width:854,height:480,videoBitrate:y(854,480,30),audioBitrate:"192k"},{name:"720p",width:1280,height:720,videoBitrate:y(1280,720,30),audioBitrate:"192k"},{name:"1080p",width:1920,height:1080,videoBitrate:y(1920,1080,30),audioBitrate:"256k"},{name:"1440p",width:2560,height:1440,videoBitrate:y(2560,1440,30),audioBitrate:"256k"},{name:"2160p",width:3840,height:2160,videoBitrate:y(3840,2160,30),audioBitrate:"256k"}];function DD(u,D,C=30,F){let E=[],B=HD.filter((A)=>{return A.width<=u&&A.height<=D});for(let A of B)E.push({...A,videoBitrate:y(A.width,A.height,30,F),fps:30});return E}function RF(u,D,C){return{...u,name:`${u.name}-${D}`,videoBitrate:y(u.width,u.height,D,C),fps:D}}function oD(u){let C=u.trim().match(/^(\d+)p?(?:[@-](\d+))?$/i);if(!C)return null;let F=C[1]+"p",E=C[2]?parseInt(C[2]):30;return{resolution:F,fps:E}}function tD(u,D=30,C){let F=HD.find((E)=>E.name===u);if(!F)return null;if(D===30)return{...F,videoBitrate:y(F.width,F.height,30,C),fps:30};return RF(F,D,C)}function jF(u,D,C,F){let E=oD(u);if(!E)return{error:`Invalid profile format: ${u}. Use format like: 360, 720@60, 1080-60`};let B=tD(E.resolution,E.fps);if(!B)return{error:`Unknown resolution: ${E.resolution}. Available: 360, 480, 720, 1080, 1440, 2160`};if(B.width>D||B.height>C)return{error:`Source resolution (${D}x${C}) is lower than ${u} (${B.width}x${B.height})`};let A=120,$=E.fps,J;if(E.fps>F)$=Math.min(F,A),J=`Requested ${E.fps} FPS in ${u}, but source is ${F} FPS. Using ${$} FPS instead`;else if(E.fps>A)$=A,J=`Requested ${E.fps} FPS in ${u} exceeds maximum ${A} FPS. Using ${$} FPS instead`;return J?{warning:J,adjustedFps:$}:{}}function BD(u,D,C,F,E){let B=[],A=[],$=[];for(let J of u){let G=jF(J,D,C,F);if(G.error){A.push(G.error);continue}if(G.warning)$.push(G.warning);let X=oD(J);if(!X)continue;let Y=G.adjustedFps!==void 0?G.adjustedFps:X.fps,Z=tD(X.resolution,Y,E);if(Z)B.push(Z)}return{profiles:B,errors:A,warnings:$}}import{join as h}from"node:path";import{readdir as wF,unlink as eD,rmdir as SF,writeFile as Du}from"node:fs/promises";async function uu(u,D,C="00:00:00"){let F=h(D,"poster.jpg"),E=/^\d+(\.\d+)?$/.test(C)?C:C;return await g(["-ss",E,"-i",u,"-vframes","1","-q:v","2","-y",F]),F}async function Fu(u,D,C,F){let{width:E,height:B,interval:A,columns:$}=F,J=h(D,".thumbnails_temp");await m(J),await Du(h(J,".keep"),"");let G=h(J,"thumb_%04d.jpg");await g(["-i",u,"-vf",`fps=1/${A},scale=${E}:${B}`,"-q:v","5",G]);let Y=(await wF(J)).filter((W)=>W.startsWith("thumb_")&&W.endsWith(".jpg")).sort();if(Y.length===0)throw Error("No thumbnails generated");let Z=Y.length,K=Math.ceil(Z/$),_=h(D,"thumbnails.jpg"),U=`tile=${$}x${K}`;await g(["-i",G,"-filter_complex",U,"-q:v","5",_]);let q=h(D,"thumbnails.vtt"),k=TF(Z,A,E,B,$,"thumbnails.jpg");await Du(q,k);for(let W of Y)await eD(h(J,W));return await eD(h(J,".keep")),await SF(J),{spritePath:_,vttPath:q}}function TF(u,D,C,F,E,B){let A=`WEBVTT `;for(let $=0;$ ${ED(G)} `,A+=`${B}#xywh=${Z},${K},${C},${F} `}return A}import{join as bF}from"node:path";function yF(u,D,C){if(C)if(D==="h264")return 32;else return 42;else if(D==="h264"){if(u<=360)return 25;if(u<=480)return 24;if(u<=720)return 23;if(u<=1080)return 22;if(u<=1440)return 21;return 20}else{if(u<=360)return 40;if(u<=480)return 38;if(u<=720)return 35;if(u<=1080)return 32;if(u<=1440)return 30;return 28}}async function Cu(u,D,C,F,E,B,A,$,J,G,X,Y){let Z=bF(D,`video_${J}_${C.name}.mp4`),K=["-y","-i",u,"-c:v",F],_=F.includes("nvenc")||F.includes("qsv")||F.includes("amf")||F.includes("vaapi")||F.includes("videotoolbox")||F.includes("v4l2"),U;if(_&&G?.cq!==void 0)U=G.cq;else if(!_&&G?.crf!==void 0)U=G.crf;else U=yF(C.height,J,_);if(F==="h264_nvenc")K.push("-rc:v","vbr"),K.push("-cq",String(U)),K.push("-preset",E),K.push("-2pass","0");else if(F==="av1_nvenc")K.push("-rc:v","vbr"),K.push("-cq",String(U)),K.push("-preset",E),K.push("-2pass","0");else if(F==="av1_qsv")K.push("-preset",E),K.push("-global_quality",String(U));else if(F==="h264_qsv")K.push("-preset",E),K.push("-global_quality",String(U));else if(F==="av1_amf")K.push("-quality","balanced"),K.push("-rc","cqp"),K.push("-qp_i",String(U)),K.push("-qp_p",String(U));else if(F==="h264_amf")K.push("-quality","balanced"),K.push("-rc","cqp"),K.push("-qp_i",String(U)),K.push("-qp_p",String(U));else if(F==="libsvtav1")K.push("-crf",String(U)),K.push("-preset",E),K.push("-svtav1-params","tune=0:enable-overlays=1");else if(F==="libx264")K.push("-crf",String(U)),K.push("-preset",E);else K.push("-preset",E);let q=J==="av1"?0.6:1,k=Math.round(parseInt(C.videoBitrate)*q*1.5);K.push("-maxrate",`${k}k`),K.push("-bufsize",`${k*2}k`);let W=C.fps||30,N=Math.round(W*A);K.push("-g",String(N),"-keyint_min",String(N),"-sc_threshold","0");let V=[`scale=${C.width}:${C.height}`];if(X){if(X.deinterlace)V.push("yadif");if(X.denoise)V.push("hqdn3d");if(X.customFilters)V.push(...X.customFilters)}K.push("-vf",V.join(","));let b=parseInt(C.audioBitrate)||256,R=CD($,b);if(K.push("-c:a","aac","-b:a",R),X?.audioNormalize)K.push("-af","loudnorm");return K.push("-f","mp4",Z),await g(K,Y,B),Z}async function Eu(u,D,C,F,E,B,A,$,J,G,X,Y,Z,K){let _=new Map;if(J&&C.length>1)for(let U=0;UCu(u,D,N,F,E,B,A,$,X,Y,Z,(V)=>{if(K)K(N.name,V)}));(await Promise.all(k)).forEach((N,V)=>{let b=q[V];_.set(b.name,N)})}else for(let U of C){let q=await Cu(u,D,U,F,E,B,A,$,X,Y,Z,(k)=>{if(K)K(U.name,k)});_.set(U.name,q)}return _}import{join as M}from"node:path";import{readdir as Ju,rename as e8,mkdir as D3,writeFile as ID}from"node:fs/promises";import{readFile as ND,writeFile as zD}from"node:fs/promises";async function Bu(u){let D=await ND(u,"utf-8");D=D.replace(/\/\/>/g,"/>"),D=D.replace(/\/\s+\/>/g,"/>"),D=D.replace(/(]+)\s+\/>/g,"$1/>"),D=D.replace(/]+)\/>\s*<\/Representation>/g,""),D=D.replace(/]+)\/>\s*(]*\/>)/g,` $2 `),D=D.replace(/]+)>\s*(?=<(?:Representation|\/AdaptationSet))/g,` `),await zD(u,D,"utf-8")}async function Au(u,D,C){let F=await ND(u,"utf-8");F=F.replace(/media="\$RepresentationID\$_\$Number\$\.m4s"/g,'media="$RepresentationID$/$RepresentationID$_$Number$.m4s"'),F=F.replace(/initialization="\$RepresentationID\$_\.mp4"/g,'initialization="$RepresentationID$/$RepresentationID$_.mp4"'),await zD(u,F,"utf-8")}async function Zu(u){let C=(await ND(u,"utf-8")).split(` `),F=[],E=0;while(E")){let Z=C[E];if(Z.includes(""))Y=!1}else if(Z.includes("0&&X.length>0)F.push(B),J.forEach((Z)=>F.push(Z)),G.forEach((Z)=>F.push(Z)),F.push(" "),F.push(B),J.forEach((Z)=>F.push(Z)),X.forEach((Z)=>F.push(Z)),F.push(" ");else{F.push(B);for(let Z=A+1;ZN.endsWith(".m4s")).sort((N,V)=>{let b=parseInt(N.match(/_(\d+)\.m4s$/)?.[1]||"0"),R=parseInt(V.match(/_(\d+)\.m4s$/)?.[1]||"0");return b-R}),U=K.find((N)=>N.endsWith("_.mp4"));if(!U||_.length===0)continue;let q=qD(_,U,C),k=M(Z,"playlist.m3u8");await ID(k,q,"utf-8");let W=parseInt(X.videoBitrate)*1000;A.push({path:`${Y}/playlist.m3u8`,bandwidth:W,resolution:`${X.width}x${X.height}`,fps:X.fps||30})}let $,J=[];if(E){let X=M(u,"audio"),Y=[];try{Y=await Ju(X)}catch{Y=[]}if(J=Y.filter((Z)=>Z.endsWith(".m4s")).sort((Z,K)=>{let _=parseInt(Z.match(/_(\d+)\.m4s$/)?.[1]||"0"),U=parseInt(K.match(/_(\d+)\.m4s$/)?.[1]||"0");return _-U}),$=Y.find((Z)=>Z.endsWith("_.mp4")),$&&J.length>0){let Z=qD(J,$,C);await ID(M(X,"playlist.m3u8"),Z,"utf-8")}}let G=$u(A,E&&$!==void 0&&J.length>0);return await ID(B,G,"utf-8"),B}async function xD(u){let{input:D,outputDir:C,segmentDuration:F=2,profiles:E,customProfiles:B,codec:A="dual",format:$="both",useNvenc:J,hardwareAccelerator:G,quality:X,generateThumbnails:Y=!0,thumbnailConfig:Z={},generatePoster:K=!0,posterTimecode:_="00:00:00",parallel:U=!0,onProgress:q}=u,k=ZD("/tmp",`dash-converter-${fF()}`);await m(k);let W=Yu(D,Gu(D)),N=ZD(C,W);await m(N);let V=ZD(N,"conversion.log");_D(V);let{writeFile:b}=await import("node:fs/promises"),R=`=========================================== DASH Conversion Log Started: ${new Date().toISOString()} Input: ${D} Output: ${N} Codec: ${A} Format: ${$} =========================================== `;await b(V,R,"utf-8");try{return await gF(D,C,k,F,E,B,A,$,J,G,X,Y,Z,K,_,U,q)}finally{let{appendFile:XD}=await import("node:fs/promises");try{await XD(V,` Completed: ${new Date().toISOString()} `,"utf-8")}catch(YD){}try{await Uu(k,{recursive:!0,force:!0})}catch(YD){console.warn(`Warning: Failed to cleanup temp directory: ${k}`)}}}async function gF(u,D,C,F,E,B,A,$,J,G,X,Y,Z,K,_,U,q){if(!await p())throw Error("FFmpeg is not installed or not in PATH");if(!await n())throw Error("MP4Box is not installed or not in PATH. Install gpac package.");let k=(H,I,UD,kD)=>{if(q)q({stage:H,percent:I,message:UD,currentProfile:kD})};k("analyzing",0,"Analyzing input video...");let W=await a(u),N=W.hasAudio,V=G&&G!=="auto"?G:J===!0?"nvenc":J===!1?"cpu":"auto",b=await s(),{selected:R,h264Encoder:XD,av1Encoder:YD,warnings:mD}=mF(b,V,A);if(mD.length>0)for(let H of mD)console.warn(`⚠️ ${H}`);let O;if(B&&B.length>0){let H=BD(B,W.width,W.height,W.fps,W.videoBitrate);if(H.errors.length>0){console.warn(` ❌ Profile errors:`);for(let I of H.errors)console.warn(` - ${I}`);console.warn("")}if(H.warnings.length>0){console.warn(` ⚠️ Profile warnings:`);for(let I of H.warnings)console.warn(` - ${I}`);console.warn("")}if(O=H.profiles,O.length===0)throw Error("No valid profiles found in custom list. Check errors above.")}else if(E)O=E;else O=DD(W.width,W.height,W.fps,W.videoBitrate);if(O.length===0)throw Error("No suitable profiles found for input video resolution");let AF=Yu(u,Gu(u)),o=ZD(D,AF);try{await Uu(o,{recursive:!0,force:!0})}catch(H){}await m(o);let v=[];if(A==="h264"||A==="dual"){let H=XD||"libx264",I=Xu(H,"h264");v.push({type:"h264",codec:H,preset:I})}if(A==="av1"||A==="dual"){let H=YD||"libsvtav1",I=Xu(H,"av1");v.push({type:"av1",codec:H,preset:I})}let ZF=v.map((H)=>H.type.toUpperCase()).join(" + "),$F=R==="cpu"?"CPU":R.toUpperCase();k("analyzing",20,`Using ${ZF} encoding (${$F})`,void 0);let JF=R==="cpu"?2:3,GD=new Map;for(let H=0;H{let V8=O.findIndex((kF)=>kF.name===t),aD=25+nD*40,rD=sD/100*(40*YF/O.length);if(k("encoding",aD+rD,`Encoding ${I.toUpperCase()} ${t}...`,`${I}-${t}`),q)q({stage:"encoding",percent:aD+rD,currentProfile:`${I}-${t}`,profilePercent:sD,message:`Encoding ${I.toUpperCase()} ${t}...`})});GD.set(I,UF)}k("encoding",65,"Stage 1 complete: All codecs and profiles encoded"),k("encoding",70,"Stage 2: Creating segments and manifests...");let{manifestPath:KF,hlsManifestPath:XF}=await Ku(GD,o,O,F,A,$,N),cD=[];for(let H of GD.values())cD.push(...Array.from(H.values()));k("encoding",80,"Stage 2 complete: All formats packaged");let lD,dD;if(Y){k("thumbnails",80,"Generating thumbnail sprites...");let H={width:Z.width||160,height:Z.height||90,interval:Z.interval||1,columns:Z.columns||10},I=await Fu(u,o,W.duration,H);lD=I.spritePath,dD=I.vttPath,k("thumbnails",90,"Thumbnails generated")}let pD;if(K)k("thumbnails",92,"Generating poster image..."),pD=await uu(u,o,_),k("thumbnails",95,"Poster generated");return k("manifest",95,"Finalizing..."),k("complete",100,"Conversion complete!"),{manifestPath:KF,hlsManifestPath:XF,videoPaths:cD,thumbnailSpritePath:lD,thumbnailVttPath:dD,posterPath:pD,duration:W.duration,profiles:O,usedNvenc:v.some((H)=>H.codec.includes("nvenc")),selectedAccelerator:R,codecType:A,format:$}}var AD={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60,cpu:1};function mF(u,D,C){let F=C==="h264"||C==="dual",E=C==="av1"||C==="dual",B=[],A=new Set(["nvenc","qsv","amf"]),$=u.filter((k)=>F&&k.h264Encoder||E&&k.av1Encoder),J=$.filter((k)=>A.has(k.accelerator)),G=(k)=>$.find((W)=>W.accelerator===k),X;if(D!=="auto"){if(D==="cpu")X=void 0;else if(!A.has(D))B.push(`Ускоритель "${D}" пока не поддерживается, использую CPU`);else if(X=G(D),!X)throw Error(`Аппаратный ускоритель "${D}" недоступен в системе`)}else if(X=(J.length>0?J:[]).sort((W,N)=>(AD[N.accelerator]||0)-(AD[W.accelerator]||0))[0],!X&&$.length>0)B.push("Доступен аппаратный ускоритель, но он пока не поддерживается пайплайном, использую CPU");let Z=(J.length>0?J:[]).sort((k,W)=>(AD[W.accelerator]||0)-(AD[k.accelerator]||0)),K=(k)=>{let W=k==="h264"?X?.h264Encoder:X?.av1Encoder;if(W)return{encoder:W,accel:X?.accelerator};let N=Z.find((V)=>k==="h264"?V.h264Encoder:V.av1Encoder);if(N){if(D!=="auto"&&X)B.push(`Выбранный ускоритель "${X.accelerator}" не поддерживает ${k.toUpperCase()}, использую ${N.accelerator}`);return{encoder:k==="h264"?N.h264Encoder:N.av1Encoder,accel:N.accelerator}}if(D!=="auto"&&D!=="cpu")B.push(`Ускоритель "${D}" не поддерживает ${k.toUpperCase()}, использую CPU`);return{encoder:void 0,accel:"cpu"}},_=F?K("h264"):{encoder:void 0,accel:X?.accelerator},U=E?K("av1"):{encoder:void 0,accel:X?.accelerator};return{selected:X?.accelerator||_.accel||U.accel||"cpu",h264Encoder:_.encoder,av1Encoder:U.encoder,warnings:B}}function Xu(u,D){if(u.includes("nvenc"))return"p4";if(u.includes("qsv"))return"medium";if(u.includes("amf"))return"balanced";if(u.includes("vaapi"))return"5";if(u.includes("videotoolbox"))return"medium";if(u.includes("v4l2"))return"medium";if(u==="libsvtav1")return"8";if(u==="libx264")return"medium";return D==="av1"?"8":"medium"}var yD=FD(eu(),1);import{statSync as W8}from"node:fs";var Q=process.argv.slice(2),uD,hD,l="dual",r="both",fD=[],j,w,S,T,FF;for(let u=0;uF.trim()).filter((F)=>F.length>0)}else if(Q[u]==="-p"||Q[u]==="--poster")hD=Q[u+1],u++;else if(Q[u]==="-c"||Q[u]==="--codec"){let D=Q[u+1];if(D==="av1"||D==="h264"||D==="dual")l=D;else console.error(`❌ Invalid codec: ${D}. Valid options: av1, h264, dual`),process.exit(1);u++}else if(Q[u]==="-f"||Q[u]==="--format"){let D=Q[u+1];if(D==="dash"||D==="hls"||D==="both")r=D;else console.error(`❌ Invalid format: ${D}. Valid options: dash, hls, both`),process.exit(1);u++}else if(Q[u]==="--h264-cq"){if(j=parseInt(Q[u+1]),isNaN(j)||j<0||j>51)console.error(`❌ Invalid H.264 CQ value: ${Q[u+1]}. Must be 0-51`),process.exit(1);u++}else if(Q[u]==="--h264-crf"){if(w=parseInt(Q[u+1]),isNaN(w)||w<0||w>51)console.error(`❌ Invalid H.264 CRF value: ${Q[u+1]}. Must be 0-51`),process.exit(1);u++}else if(Q[u]==="--av1-cq"){if(S=parseInt(Q[u+1]),isNaN(S)||S<0||S>51)console.error(`❌ Invalid AV1 CQ value: ${Q[u+1]}. Must be 0-51`),process.exit(1);u++}else if(Q[u]==="--av1-crf"){if(T=parseInt(Q[u+1]),isNaN(T)||T<0||T>63)console.error(`❌ Invalid AV1 CRF value: ${Q[u+1]}. Must be 0-63`),process.exit(1);u++}else if(Q[u]==="--accel"||Q[u]==="--hardware"){let D=Q[u+1];if(!["auto","nvenc","qsv","amf","cpu"].includes(D))console.error(`❌ Invalid accelerator: ${D}. Valid: auto, nvenc, qsv, amf, cpu`),process.exit(1);FF=D,u++}else if(!Q[u].startsWith("-"))fD.push(Q[u]);var i=fD[0],CF=fD[1]||".";if(!i)console.error("❌ Usage: create-vod [output-dir] [options]"),console.error(` Options:`),console.error(" -r, --resolutions Video resolutions (e.g., 360,480,720 or 720@60,1080@60)"),console.error(" -c, --codec Video codec: av1, h264, or dual (default: dual)"),console.error(" -f, --format Streaming format: dash, hls, or both (default: both)"),console.error(" -p, --poster Poster timecode (e.g., 00:00:05 or 10)"),console.error(" --accel Hardware accelerator: auto|nvenc|qsv|amf|cpu (default: auto)"),console.error(` Quality Options (override defaults):`),console.error(" --h264-cq H.264 GPU CQ value (0-51, lower = better, default: auto)"),console.error(" --h264-crf H.264 CPU CRF value (0-51, lower = better, default: auto)"),console.error(" --av1-cq AV1 GPU CQ value (0-51, lower = better, default: auto)"),console.error(" --av1-crf AV1 CPU CRF value (0-63, lower = better, default: auto)"),console.error(` Examples:`),console.error(" create-vod video.mp4"),console.error(" create-vod video.mp4 ./output"),console.error(" create-vod video.mp4 -r 360,480,720"),console.error(" create-vod video.mp4 -c av1 --av1-cq 40"),console.error(" create-vod video.mp4 -c dual --h264-cq 30 --av1-cq 39"),console.error(" create-vod video.mp4 -f hls"),console.error(" create-vod video.mp4 -c dual -f both"),console.error(" create-vod video.mp4 -r 720@60,1080@60,2160@60 -c av1 -f dash"),console.error(" create-vod video.mp4 -p 00:00:05"),console.error(" create-vod video.mp4 ./output -r 720,1080 -c dual -f both -p 10 --h264-cq 28 --av1-cq 37"),process.exit(1);console.log(`\uD83D\uDD0D Checking system... `);var EF=await p(),BF=await n(),gD=await s(),DF={nvenc:100,qsv:90,amf:80,vaapi:70,videotoolbox:65,v4l2:60},KD=gD.slice().sort((u,D)=>(DF[D.accelerator]||0)-(DF[u.accelerator]||0))[0];console.log(`FFmpeg: ${EF?"✅":"❌"}`);console.log(`MP4Box: ${BF?"✅":"❌"}`);var _8=Array.from(new Set(gD.map((u)=>u.accelerator.toUpperCase()))),vD=KD?KD.accelerator.toUpperCase():void 0,uF=_8.filter((u)=>u!==vD),Q8=vD?`✅ ${vD}${uF.length>0?` (${uF.join(", ")})`:""}`:"❌";console.log(`Hardware: ${Q8}`);console.log("");if(!EF)console.error("❌ FFmpeg not found. Please install FFmpeg first."),process.exit(1);if(!BF)console.error("❌ MP4Box not found. Please install: sudo pacman -S gpac"),process.exit(1);var H8=gD.some((u)=>u.av1Encoder);if((l==="av1"||l==="dual")&&!H8)console.error("⚠️ Warning: AV1 encoding requested but no hardware AV1 encoder found."),console.error(" CPU-based AV1 encoding (libsvtav1) will be VERY slow."),console.error(` Consider using --codec h264 for faster encoding. `);if((r==="hls"||r==="both")&&l==="av1")console.error("❌ Error: HLS format requires H.264 codec for Safari/iOS compatibility."),console.error(` Please use --codec h264 or --codec dual with --format hls `),process.exit(1);console.log(`\uD83D\uDCCA Analyzing video... `);var L=await a(i),N8=W8(i),z8=(N8.size/1048576).toFixed(2);console.log("\uD83D\uDCF9 Video Information:");console.log(` File: ${i}`);console.log(` Size: ${z8} MB`);console.log(` Resolution: ${L.width}x${L.height}`);console.log(` FPS: ${L.fps.toFixed(2)}`);console.log(` Duration: ${Math.floor(L.duration/60)}m ${Math.floor(L.duration%60)}s`);console.log(` Codec: ${L.codec}`);if(L.videoBitrate)console.log(` Video Bitrate: ${(L.videoBitrate/1000).toFixed(2)} Mbps`);if(L.audioBitrate)console.log(` Audio Bitrate: ${L.audioBitrate} kbps`);var PD=[];if(uD&&uD.length>0){let u=BD(uD,L.width,L.height,L.fps,L.videoBitrate);if(u.errors.length>0)console.error(` ❌ Profile errors:`),u.errors.forEach((D)=>console.error(` - ${D}`)),process.exit(1);if(u.warnings.length>0)console.warn(` ⚠️ Profile warnings:`),u.warnings.forEach((D)=>console.warn(` - ${D}`));PD=u.profiles.map((D)=>D.name)}else PD=DD(L.width,L.height,L.fps,L.videoBitrate).map((D)=>D.name);var q8=r==="both"?"DASH (manifest.mpd), HLS (master.m3u8)":r==="dash"?"DASH (manifest.mpd)":"HLS (master.m3u8)",I8=!0,x8=hD||"00:00:00";console.log(` \uD83D\uDCE6 Parameters:`);console.log(` Input: ${i}`);console.log(` Output: ${CF}`);console.log(` Codec: ${l}${l==="dual"?" (AV1 + H.264)":""}`);console.log(` Profiles: ${PD.join(", ")}`);console.log(` Manifests: ${q8}`);console.log(` Poster: ${x8} (will be generated)`);console.log(` Thumbnails: ${I8?"yes (with VTT)":"no"}`);console.log(` Accelerator: ${KD?KD.accelerator.toUpperCase():"CPU"}`);var f;if(j!==void 0||w!==void 0||S!==void 0||T!==void 0){if(f={},j!==void 0||w!==void 0){if(f.h264={},j!==void 0)f.h264.cq=j;if(w!==void 0)f.h264.crf=w;console.log(`\uD83C\uDF9A️ H.264 Quality: ${j!==void 0?`CQ ${j}`:""}${w!==void 0?` CRF ${w}`:""}`)}if(S!==void 0||T!==void 0){if(f.av1={},S!==void 0)f.av1.cq=S;if(T!==void 0)f.av1.crf=T;console.log(`\uD83C\uDF9A️ AV1 Quality: ${S!==void 0?`CQ ${S}`:""}${T!==void 0?` CRF ${T}`:""}`)}}console.log(` \uD83D\uDE80 Starting conversion... `);var JD=new yD.default.MultiBar({format:"{stage} | {bar} | {percentage}% | {name}",barCompleteChar:"█",barIncompleteChar:"░",hideCursor:!0,clearOnComplete:!1,stopOnComplete:!0},yD.default.Presets.shades_classic),TD={},bD=null;try{let u=await xD({input:i,outputDir:CF,customProfiles:uD,posterTimecode:hD,codec:l,format:r,segmentDuration:2,hardwareAccelerator:FF,quality:f,generateThumbnails:!0,generatePoster:!0,parallel:!0,onProgress:(D)=>{let C=D.stage==="encoding"?"Encoding":D.stage==="thumbnails"?"Thumbnails":D.stage==="manifest"?"Manifest":D.stage==="analyzing"?"Analyzing":"Complete";if(D.stage==="encoding"&&D.currentProfile){if(!TD[D.currentProfile])TD[D.currentProfile]=JD.create(100,0,{stage:"Encode",name:D.currentProfile});let F=D.profilePercent??D.percent;TD[D.currentProfile].update(F,{stage:"Encode",name:D.currentProfile})}if(!bD)bD=JD.create(100,0,{stage:C,name:"Overall"});bD.update(D.percent,{stage:C,name:D.message||"Overall"})}});JD.stop(),console.log(` ✅ Conversion completed successfully! `)}catch(u){JD.stop(),console.error(` ❌ Error during conversion:`),console.error(u),process.exit(1)}