libffmpeg.js 142 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518451945204521452245234524452545264527452845294530453145324533453445354536453745384539454045414542454345444545454645474548454945504551455245534554455545564557455845594560456145624563456445654566456745684569457045714572457345744575457645774578457945804581458245834584458545864587458845894590459145924593459445954596459745984599460046014602460346044605460646074608460946104611461246134614461546164617461846194620462146224623462446254626462746284629463046314632463346344635463646374638463946404641464246434644464546464647464846494650465146524653465446554656465746584659466046614662466346644665466646674668466946704671467246734674467546764677467846794680468146824683468446854686468746884689469046914692469346944695469646974698469947004701470247034704470547064707470847094710471147124713471447154716471747184719472047214722472347244725472647274728472947304731473247334734473547364737473847394740474147424743474447454746474747484749475047514752475347544755475647574758475947604761476247634764476547664767476847694770477147724773477447754776477747784779478047814782478347844785478647874788478947904791479247934794479547964797479847994800480148024803480448054806480748084809481048114812481348144815481648174818481948204821482248234824482548264827482848294830483148324833483448354836483748384839484048414842484348444845484648474848484948504851485248534854485548564857485848594860486148624863486448654866486748684869487048714872487348744875487648774878487948804881488248834884488548864887488848894890489148924893489448954896489748984899490049014902490349044905490649074908490949104911491249134914491549164917491849194920492149224923492449254926492749284929493049314932493349344935493649374938493949404941494249434944494549464947494849494950495149524953495449554956495749584959496049614962496349644965496649674968496949704971497249734974497549764977497849794980498149824983498449854986498749884989499049914992499349944995499649974998499950005001500250035004500550065007500850095010501150125013501450155016501750185019502050215022502350245025502650275028502950305031503250335034503550365037503850395040504150425043504450455046504750485049505050515052505350545055505650575058505950605061506250635064506550665067506850695070507150725073507450755076507750785079508050815082508350845085508650875088508950905091509250935094509550965097509850995100510151025103510451055106510751085109511051115112511351145115511651175118511951205121512251235124512551265127512851295130513151325133513451355136513751385139514051415142514351445145514651475148514951505151515251535154515551565157515851595160516151625163516451655166516751685169517051715172517351745175517651775178517951805181518251835184518551865187518851895190519151925193519451955196519751985199520052015202520352045205520652075208520952105211521252135214521552165217521852195220522152225223522452255226522752285229523052315232523352345235523652375238523952405241524252435244524552465247524852495250525152525253525452555256525752585259526052615262526352645265526652675268526952705271527252735274527552765277527852795280528152825283
  1. var Module = typeof Module !== 'undefined' ? Module : {}
  2. var moduleOverrides = {}
  3. var key
  4. for (key in Module) {
  5. if (Module.hasOwnProperty(key)) {
  6. moduleOverrides[key] = Module[key]
  7. }
  8. }
  9. var arguments_ = []
  10. var thisProgram = './this.program'
  11. var quit_ = function(status, toThrow) {
  12. throw toThrow
  13. }
  14. var ENVIRONMENT_IS_WEB = false
  15. var ENVIRONMENT_IS_WORKER = false
  16. var ENVIRONMENT_IS_NODE = false
  17. var ENVIRONMENT_HAS_NODE = false
  18. var ENVIRONMENT_IS_SHELL = false
  19. ENVIRONMENT_IS_WEB = typeof window === 'object'
  20. ENVIRONMENT_IS_WORKER = typeof importScripts === 'function'
  21. ENVIRONMENT_HAS_NODE =
  22. typeof process === 'object' &&
  23. typeof process.versions === 'object' &&
  24. typeof process.versions.node === 'string'
  25. ENVIRONMENT_IS_NODE =
  26. ENVIRONMENT_HAS_NODE && !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_WORKER
  27. ENVIRONMENT_IS_SHELL =
  28. !ENVIRONMENT_IS_WEB && !ENVIRONMENT_IS_NODE && !ENVIRONMENT_IS_WORKER
  29. var scriptDirectory = ''
  30. function locateFile(path) {
  31. if (Module['locateFile']) {
  32. return Module['locateFile'](path, scriptDirectory)
  33. }
  34. return scriptDirectory + path
  35. }
  36. var read_, readAsync, readBinary, setWindowTitle
  37. if (ENVIRONMENT_IS_NODE) {
  38. scriptDirectory = __dirname + '/'
  39. var nodeFS
  40. var nodePath
  41. read_ = function shell_read(filename, binary) {
  42. var ret
  43. if (!nodeFS) nodeFS = require('fs')
  44. if (!nodePath) nodePath = require('path')
  45. filename = nodePath['normalize'](filename)
  46. ret = nodeFS['readFileSync'](filename)
  47. return binary ? ret : ret.toString()
  48. }
  49. readBinary = function readBinary(filename) {
  50. var ret = read_(filename, true)
  51. if (!ret.buffer) {
  52. ret = new Uint8Array(ret)
  53. }
  54. assert(ret.buffer)
  55. return ret
  56. }
  57. if (process['argv'].length > 1) {
  58. thisProgram = process['argv'][1].replace(/\\/g, '/')
  59. }
  60. arguments_ = process['argv'].slice(2)
  61. if (typeof module !== 'undefined') {
  62. module['exports'] = Module
  63. }
  64. process['on']('uncaughtException', function(ex) {
  65. if (!(ex instanceof ExitStatus)) {
  66. throw ex
  67. }
  68. })
  69. process['on']('unhandledRejection', abort)
  70. quit_ = function(status) {
  71. process['exit'](status)
  72. }
  73. Module['inspect'] = function() {
  74. return '[Emscripten Module object]'
  75. }
  76. } else if (ENVIRONMENT_IS_SHELL) {
  77. if (typeof read != 'undefined') {
  78. read_ = function shell_read(f) {
  79. return read(f)
  80. }
  81. }
  82. readBinary = function readBinary(f) {
  83. var data
  84. if (typeof readbuffer === 'function') {
  85. return new Uint8Array(readbuffer(f))
  86. }
  87. data = read(f, 'binary')
  88. assert(typeof data === 'object')
  89. return data
  90. }
  91. if (typeof scriptArgs != 'undefined') {
  92. arguments_ = scriptArgs
  93. } else if (typeof arguments != 'undefined') {
  94. arguments_ = arguments
  95. }
  96. if (typeof quit === 'function') {
  97. quit_ = function(status) {
  98. quit(status)
  99. }
  100. }
  101. if (typeof print !== 'undefined') {
  102. if (typeof console === 'undefined') console = {}
  103. console.log = print
  104. console.warn = console.error =
  105. typeof printErr !== 'undefined' ? printErr : print
  106. }
  107. } else if (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) {
  108. if (ENVIRONMENT_IS_WORKER) {
  109. scriptDirectory = self.location.href
  110. } else if (document.currentScript) {
  111. scriptDirectory = document.currentScript.src
  112. }
  113. if (scriptDirectory.indexOf('blob:') !== 0) {
  114. scriptDirectory = scriptDirectory.substr(
  115. 0,
  116. scriptDirectory.lastIndexOf('/') + 1
  117. )
  118. } else {
  119. scriptDirectory = ''
  120. }
  121. read_ = function shell_read(url) {
  122. var xhr = new XMLHttpRequest()
  123. xhr.open('GET', url, false)
  124. xhr.send(null)
  125. return xhr.responseText
  126. }
  127. if (ENVIRONMENT_IS_WORKER) {
  128. readBinary = function readBinary(url) {
  129. var xhr = new XMLHttpRequest()
  130. xhr.open('GET', url, false)
  131. xhr.responseType = 'arraybuffer'
  132. xhr.send(null)
  133. return new Uint8Array(xhr.response)
  134. }
  135. }
  136. readAsync = function readAsync(url, onload, onerror) {
  137. var xhr = new XMLHttpRequest()
  138. xhr.open('GET', url, true)
  139. xhr.responseType = 'arraybuffer'
  140. xhr.onload = function xhr_onload() {
  141. if (xhr.status == 200 || (xhr.status == 0 && xhr.response)) {
  142. onload(xhr.response)
  143. return
  144. }
  145. onerror()
  146. }
  147. xhr.onerror = onerror
  148. xhr.send(null)
  149. }
  150. setWindowTitle = function(title) {
  151. document.title = title
  152. }
  153. } else {
  154. }
  155. var out = Module['print'] || console.log.bind(console)
  156. var err = Module['printErr'] || console.warn.bind(console)
  157. for (key in moduleOverrides) {
  158. if (moduleOverrides.hasOwnProperty(key)) {
  159. Module[key] = moduleOverrides[key]
  160. }
  161. }
  162. moduleOverrides = null
  163. if (Module['arguments']) arguments_ = Module['arguments']
  164. if (Module['thisProgram']) thisProgram = Module['thisProgram']
  165. if (Module['quit']) quit_ = Module['quit']
  166. var STACK_ALIGN = 16
  167. function dynamicAlloc(size) {
  168. var ret = HEAP32[DYNAMICTOP_PTR >> 2]
  169. var end = (ret + size + 15) & -16
  170. if (end > _emscripten_get_heap_size()) {
  171. abort()
  172. }
  173. HEAP32[DYNAMICTOP_PTR >> 2] = end
  174. return ret
  175. }
  176. function getNativeTypeSize(type) {
  177. switch (type) {
  178. case 'i1':
  179. case 'i8':
  180. return 1
  181. case 'i16':
  182. return 2
  183. case 'i32':
  184. return 4
  185. case 'i64':
  186. return 8
  187. case 'float':
  188. return 4
  189. case 'double':
  190. return 8
  191. default: {
  192. if (type[type.length - 1] === '*') {
  193. return 4
  194. } else if (type[0] === 'i') {
  195. var bits = parseInt(type.substr(1))
  196. assert(
  197. bits % 8 === 0,
  198. 'getNativeTypeSize invalid bits ' + bits + ', type ' + type
  199. )
  200. return bits / 8
  201. } else {
  202. return 0
  203. }
  204. }
  205. }
  206. }
  207. function warnOnce(text) {
  208. if (!warnOnce.shown) warnOnce.shown = {}
  209. if (!warnOnce.shown[text]) {
  210. warnOnce.shown[text] = 1
  211. err(text)
  212. }
  213. }
  214. var asm2wasmImports = {
  215. 'f64-rem': function(x, y) {
  216. return x % y
  217. },
  218. debugger: function() {}
  219. }
  220. var jsCallStartIndex = 1
  221. var functionPointers = new Array(14)
  222. function convertJsFunctionToWasm(func, sig) {
  223. var typeSection = [1, 0, 1, 96]
  224. var sigRet = sig.slice(0, 1)
  225. var sigParam = sig.slice(1)
  226. var typeCodes = { i: 127, j: 126, f: 125, d: 124 }
  227. typeSection.push(sigParam.length)
  228. for (var i = 0; i < sigParam.length; ++i) {
  229. typeSection.push(typeCodes[sigParam[i]])
  230. }
  231. if (sigRet == 'v') {
  232. typeSection.push(0)
  233. } else {
  234. typeSection = typeSection.concat([1, typeCodes[sigRet]])
  235. }
  236. typeSection[1] = typeSection.length - 2
  237. var bytes = new Uint8Array(
  238. [0, 97, 115, 109, 1, 0, 0, 0].concat(typeSection, [
  239. 2,
  240. 7,
  241. 1,
  242. 1,
  243. 101,
  244. 1,
  245. 102,
  246. 0,
  247. 0,
  248. 7,
  249. 5,
  250. 1,
  251. 1,
  252. 102,
  253. 0,
  254. 0
  255. ])
  256. )
  257. var module = new WebAssembly.Module(bytes)
  258. var instance = new WebAssembly.Instance(module, { e: { f: func } })
  259. var wrappedFunc = instance.exports.f
  260. return wrappedFunc
  261. }
  262. function addFunction(func, sig) {
  263. var base = 0
  264. for (var i = base; i < base + 14; i++) {
  265. if (!functionPointers[i]) {
  266. functionPointers[i] = func
  267. return jsCallStartIndex + i
  268. }
  269. }
  270. throw 'Finished up all reserved function pointers. Use a higher value for RESERVED_FUNCTION_POINTERS.'
  271. }
  272. var funcWrappers = {}
  273. function dynCall(sig, ptr, args) {
  274. if (args && args.length) {
  275. return Module['dynCall_' + sig].apply(null, [ptr].concat(args))
  276. } else {
  277. return Module['dynCall_' + sig].call(null, ptr)
  278. }
  279. }
  280. var tempRet0 = 0
  281. var setTempRet0 = function(value) {
  282. tempRet0 = value
  283. }
  284. var getTempRet0 = function() {
  285. return tempRet0
  286. }
  287. var wasmBinary
  288. if (Module['wasmBinary']) wasmBinary = Module['wasmBinary']
  289. var noExitRuntime
  290. if (Module['noExitRuntime']) noExitRuntime = Module['noExitRuntime']
  291. if (typeof WebAssembly !== 'object') {
  292. err('no native wasm support detected')
  293. }
  294. function setValue(ptr, value, type, noSafe) {
  295. type = type || 'i8'
  296. if (type.charAt(type.length - 1) === '*') type = 'i32'
  297. switch (type) {
  298. case 'i1':
  299. HEAP8[ptr >> 0] = value
  300. break
  301. case 'i8':
  302. HEAP8[ptr >> 0] = value
  303. break
  304. case 'i16':
  305. HEAP16[ptr >> 1] = value
  306. break
  307. case 'i32':
  308. HEAP32[ptr >> 2] = value
  309. break
  310. case 'i64':
  311. ;(tempI64 = [
  312. value >>> 0,
  313. ((tempDouble = value),
  314. +Math_abs(tempDouble) >= 1
  315. ? tempDouble > 0
  316. ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) |
  317. 0) >>>
  318. 0
  319. : ~~+Math_ceil(
  320. (tempDouble - +(~~tempDouble >>> 0)) / 4294967296
  321. ) >>> 0
  322. : 0)
  323. ]),
  324. (HEAP32[ptr >> 2] = tempI64[0]),
  325. (HEAP32[(ptr + 4) >> 2] = tempI64[1])
  326. break
  327. case 'float':
  328. HEAPF32[ptr >> 2] = value
  329. break
  330. case 'double':
  331. HEAPF64[ptr >> 3] = value
  332. break
  333. default:
  334. abort('invalid type for setValue: ' + type)
  335. }
  336. }
  337. var wasmMemory
  338. var wasmTable
  339. var ABORT = false
  340. var EXITSTATUS = 0
  341. function assert(condition, text) {
  342. if (!condition) {
  343. abort('Assertion failed: ' + text)
  344. }
  345. }
  346. function getCFunc(ident) {
  347. var func = Module['_' + ident]
  348. assert(
  349. func,
  350. 'Cannot call unknown function ' + ident + ', make sure it is exported'
  351. )
  352. return func
  353. }
  354. function ccall(ident, returnType, argTypes, args, opts) {
  355. var toC = {
  356. string: function(str) {
  357. var ret = 0
  358. if (str !== null && str !== undefined && str !== 0) {
  359. var len = (str.length << 2) + 1
  360. ret = stackAlloc(len)
  361. stringToUTF8(str, ret, len)
  362. }
  363. return ret
  364. },
  365. array: function(arr) {
  366. var ret = stackAlloc(arr.length)
  367. writeArrayToMemory(arr, ret)
  368. return ret
  369. }
  370. }
  371. function convertReturnValue(ret) {
  372. if (returnType === 'string') return UTF8ToString(ret)
  373. if (returnType === 'boolean') return Boolean(ret)
  374. return ret
  375. }
  376. var func = getCFunc(ident)
  377. var cArgs = []
  378. var stack = 0
  379. if (args) {
  380. for (var i = 0; i < args.length; i++) {
  381. var converter = toC[argTypes[i]]
  382. if (converter) {
  383. if (stack === 0) stack = stackSave()
  384. cArgs[i] = converter(args[i])
  385. } else {
  386. cArgs[i] = args[i]
  387. }
  388. }
  389. }
  390. var ret = func.apply(null, cArgs)
  391. ret = convertReturnValue(ret)
  392. if (stack !== 0) stackRestore(stack)
  393. return ret
  394. }
  395. var ALLOC_NORMAL = 0
  396. var ALLOC_NONE = 3
  397. function allocate(slab, types, allocator, ptr) {
  398. var zeroinit, size
  399. if (typeof slab === 'number') {
  400. zeroinit = true
  401. size = slab
  402. } else {
  403. zeroinit = false
  404. size = slab.length
  405. }
  406. var singleType = typeof types === 'string' ? types : null
  407. var ret
  408. if (allocator == ALLOC_NONE) {
  409. ret = ptr
  410. } else {
  411. ret = [_malloc, stackAlloc, dynamicAlloc][allocator](
  412. Math.max(size, singleType ? 1 : types.length)
  413. )
  414. }
  415. if (zeroinit) {
  416. var stop
  417. ptr = ret
  418. assert((ret & 3) == 0)
  419. stop = ret + (size & ~3)
  420. for (; ptr < stop; ptr += 4) {
  421. HEAP32[ptr >> 2] = 0
  422. }
  423. stop = ret + size
  424. while (ptr < stop) {
  425. HEAP8[ptr++ >> 0] = 0
  426. }
  427. return ret
  428. }
  429. if (singleType === 'i8') {
  430. if (slab.subarray || slab.slice) {
  431. HEAPU8.set(slab, ret)
  432. } else {
  433. HEAPU8.set(new Uint8Array(slab), ret)
  434. }
  435. return ret
  436. }
  437. var i = 0,
  438. type,
  439. typeSize,
  440. previousType
  441. while (i < size) {
  442. var curr = slab[i]
  443. type = singleType || types[i]
  444. if (type === 0) {
  445. i++
  446. continue
  447. }
  448. if (type == 'i64') type = 'i32'
  449. setValue(ret + i, curr, type)
  450. if (previousType !== type) {
  451. typeSize = getNativeTypeSize(type)
  452. previousType = type
  453. }
  454. i += typeSize
  455. }
  456. return ret
  457. }
  458. function getMemory(size) {
  459. if (!runtimeInitialized) return dynamicAlloc(size)
  460. return _malloc(size)
  461. }
  462. var UTF8Decoder =
  463. typeof TextDecoder !== 'undefined' ? new TextDecoder('utf8') : undefined
  464. function UTF8ArrayToString(u8Array, idx, maxBytesToRead) {
  465. var endIdx = idx + maxBytesToRead
  466. var endPtr = idx
  467. while (u8Array[endPtr] && !(endPtr >= endIdx)) ++endPtr
  468. if (endPtr - idx > 16 && u8Array.subarray && UTF8Decoder) {
  469. return UTF8Decoder.decode(u8Array.subarray(idx, endPtr))
  470. } else {
  471. var str = ''
  472. while (idx < endPtr) {
  473. var u0 = u8Array[idx++]
  474. if (!(u0 & 128)) {
  475. str += String.fromCharCode(u0)
  476. continue
  477. }
  478. var u1 = u8Array[idx++] & 63
  479. if ((u0 & 224) == 192) {
  480. str += String.fromCharCode(((u0 & 31) << 6) | u1)
  481. continue
  482. }
  483. var u2 = u8Array[idx++] & 63
  484. if ((u0 & 240) == 224) {
  485. u0 = ((u0 & 15) << 12) | (u1 << 6) | u2
  486. } else {
  487. u0 = ((u0 & 7) << 18) | (u1 << 12) | (u2 << 6) | (u8Array[idx++] & 63)
  488. }
  489. if (u0 < 65536) {
  490. str += String.fromCharCode(u0)
  491. } else {
  492. var ch = u0 - 65536
  493. str += String.fromCharCode(55296 | (ch >> 10), 56320 | (ch & 1023))
  494. }
  495. }
  496. }
  497. return str
  498. }
  499. function UTF8ToString(ptr, maxBytesToRead) {
  500. return ptr ? UTF8ArrayToString(HEAPU8, ptr, maxBytesToRead) : ''
  501. }
  502. function stringToUTF8Array(str, outU8Array, outIdx, maxBytesToWrite) {
  503. if (!(maxBytesToWrite > 0)) return 0
  504. var startIdx = outIdx
  505. var endIdx = outIdx + maxBytesToWrite - 1
  506. for (var i = 0; i < str.length; ++i) {
  507. var u = str.charCodeAt(i)
  508. if (u >= 55296 && u <= 57343) {
  509. var u1 = str.charCodeAt(++i)
  510. u = (65536 + ((u & 1023) << 10)) | (u1 & 1023)
  511. }
  512. if (u <= 127) {
  513. if (outIdx >= endIdx) break
  514. outU8Array[outIdx++] = u
  515. } else if (u <= 2047) {
  516. if (outIdx + 1 >= endIdx) break
  517. outU8Array[outIdx++] = 192 | (u >> 6)
  518. outU8Array[outIdx++] = 128 | (u & 63)
  519. } else if (u <= 65535) {
  520. if (outIdx + 2 >= endIdx) break
  521. outU8Array[outIdx++] = 224 | (u >> 12)
  522. outU8Array[outIdx++] = 128 | ((u >> 6) & 63)
  523. outU8Array[outIdx++] = 128 | (u & 63)
  524. } else {
  525. if (outIdx + 3 >= endIdx) break
  526. outU8Array[outIdx++] = 240 | (u >> 18)
  527. outU8Array[outIdx++] = 128 | ((u >> 12) & 63)
  528. outU8Array[outIdx++] = 128 | ((u >> 6) & 63)
  529. outU8Array[outIdx++] = 128 | (u & 63)
  530. }
  531. }
  532. outU8Array[outIdx] = 0
  533. return outIdx - startIdx
  534. }
  535. function stringToUTF8(str, outPtr, maxBytesToWrite) {
  536. return stringToUTF8Array(str, HEAPU8, outPtr, maxBytesToWrite)
  537. }
  538. function lengthBytesUTF8(str) {
  539. var len = 0
  540. for (var i = 0; i < str.length; ++i) {
  541. var u = str.charCodeAt(i)
  542. if (u >= 55296 && u <= 57343)
  543. u = (65536 + ((u & 1023) << 10)) | (str.charCodeAt(++i) & 1023)
  544. if (u <= 127) ++len
  545. else if (u <= 2047) len += 2
  546. else if (u <= 65535) len += 3
  547. else len += 4
  548. }
  549. return len
  550. }
  551. var UTF16Decoder =
  552. typeof TextDecoder !== 'undefined' ? new TextDecoder('utf-16le') : undefined
  553. function allocateUTF8(str) {
  554. var size = lengthBytesUTF8(str) + 1
  555. var ret = _malloc(size)
  556. if (ret) stringToUTF8Array(str, HEAP8, ret, size)
  557. return ret
  558. }
  559. function allocateUTF8OnStack(str) {
  560. var size = lengthBytesUTF8(str) + 1
  561. var ret = stackAlloc(size)
  562. stringToUTF8Array(str, HEAP8, ret, size)
  563. return ret
  564. }
  565. function writeArrayToMemory(array, buffer) {
  566. HEAP8.set(array, buffer)
  567. }
  568. function writeAsciiToMemory(str, buffer, dontAddNull) {
  569. for (var i = 0; i < str.length; ++i) {
  570. HEAP8[buffer++ >> 0] = str.charCodeAt(i)
  571. }
  572. if (!dontAddNull) HEAP8[buffer >> 0] = 0
  573. }
  574. var PAGE_SIZE = 16384
  575. var WASM_PAGE_SIZE = 65536
  576. var buffer, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32, HEAPF32, HEAPF64
  577. function updateGlobalBufferAndViews(buf) {
  578. buffer = buf
  579. Module['HEAP8'] = HEAP8 = new Int8Array(buf)
  580. Module['HEAP16'] = HEAP16 = new Int16Array(buf)
  581. Module['HEAP32'] = HEAP32 = new Int32Array(buf)
  582. Module['HEAPU8'] = HEAPU8 = new Uint8Array(buf)
  583. Module['HEAPU16'] = HEAPU16 = new Uint16Array(buf)
  584. Module['HEAPU32'] = HEAPU32 = new Uint32Array(buf)
  585. Module['HEAPF32'] = HEAPF32 = new Float32Array(buf)
  586. Module['HEAPF64'] = HEAPF64 = new Float64Array(buf)
  587. }
  588. var STACK_BASE = 135840,
  589. DYNAMIC_BASE = 5378720,
  590. DYNAMICTOP_PTR = 135808
  591. var INITIAL_TOTAL_MEMORY = Module['TOTAL_MEMORY'] || 67108864
  592. if (Module['wasmMemory']) {
  593. wasmMemory = Module['wasmMemory']
  594. } else {
  595. wasmMemory = new WebAssembly.Memory({
  596. initial: INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE,
  597. maximum: INITIAL_TOTAL_MEMORY / WASM_PAGE_SIZE
  598. })
  599. }
  600. if (wasmMemory) {
  601. buffer = wasmMemory.buffer
  602. }
  603. INITIAL_TOTAL_MEMORY = buffer.byteLength
  604. updateGlobalBufferAndViews(buffer)
  605. HEAP32[DYNAMICTOP_PTR >> 2] = DYNAMIC_BASE
  606. function callRuntimeCallbacks(callbacks) {
  607. while (callbacks.length > 0) {
  608. var callback = callbacks.shift()
  609. if (typeof callback == 'function') {
  610. callback()
  611. continue
  612. }
  613. var func = callback.func
  614. if (typeof func === 'number') {
  615. if (callback.arg === undefined) {
  616. Module['dynCall_v'](func)
  617. } else {
  618. Module['dynCall_vi'](func, callback.arg)
  619. }
  620. } else {
  621. func(callback.arg === undefined ? null : callback.arg)
  622. }
  623. }
  624. }
  625. var __ATPRERUN__ = []
  626. var __ATINIT__ = []
  627. var __ATMAIN__ = []
  628. var __ATPOSTRUN__ = []
  629. var runtimeInitialized = false
  630. var runtimeExited = false
  631. function preRun() {
  632. if (Module['preRun']) {
  633. if (typeof Module['preRun'] == 'function')
  634. Module['preRun'] = [Module['preRun']]
  635. while (Module['preRun'].length) {
  636. addOnPreRun(Module['preRun'].shift())
  637. }
  638. }
  639. callRuntimeCallbacks(__ATPRERUN__)
  640. }
  641. function initRuntime() {
  642. runtimeInitialized = true
  643. if (!Module['noFSInit'] && !FS.init.initialized) FS.init()
  644. TTY.init()
  645. callRuntimeCallbacks(__ATINIT__)
  646. }
  647. function preMain() {
  648. FS.ignorePermissions = false
  649. callRuntimeCallbacks(__ATMAIN__)
  650. }
  651. function exitRuntime() {
  652. runtimeExited = true
  653. }
  654. function postRun() {
  655. if (Module['postRun']) {
  656. if (typeof Module['postRun'] == 'function')
  657. Module['postRun'] = [Module['postRun']]
  658. while (Module['postRun'].length) {
  659. addOnPostRun(Module['postRun'].shift())
  660. }
  661. }
  662. callRuntimeCallbacks(__ATPOSTRUN__)
  663. }
  664. function addOnPreRun(cb) {
  665. __ATPRERUN__.unshift(cb)
  666. }
  667. function addOnPostRun(cb) {
  668. __ATPOSTRUN__.unshift(cb)
  669. }
  670. var Math_abs = Math.abs
  671. var Math_ceil = Math.ceil
  672. var Math_floor = Math.floor
  673. var Math_min = Math.min
  674. var Math_trunc = Math.trunc
  675. var runDependencies = 0
  676. var runDependencyWatcher = null
  677. var dependenciesFulfilled = null
  678. function getUniqueRunDependency(id) {
  679. return id
  680. }
  681. function addRunDependency(id) {
  682. runDependencies++
  683. if (Module['monitorRunDependencies']) {
  684. Module['monitorRunDependencies'](runDependencies)
  685. }
  686. }
  687. function removeRunDependency(id) {
  688. runDependencies--
  689. if (Module['monitorRunDependencies']) {
  690. Module['monitorRunDependencies'](runDependencies)
  691. }
  692. if (runDependencies == 0) {
  693. if (runDependencyWatcher !== null) {
  694. clearInterval(runDependencyWatcher)
  695. runDependencyWatcher = null
  696. }
  697. if (dependenciesFulfilled) {
  698. var callback = dependenciesFulfilled
  699. dependenciesFulfilled = null
  700. callback()
  701. }
  702. }
  703. }
  704. Module['preloadedImages'] = {}
  705. Module['preloadedAudios'] = {}
  706. var dataURIPrefix = 'data:application/octet-stream;base64,'
  707. function isDataURI(filename) {
  708. return String.prototype.startsWith
  709. ? filename.startsWith(dataURIPrefix)
  710. : filename.indexOf(dataURIPrefix) === 0
  711. }
  712. var wasmBinaryFile = 'libffmpeg.wasm'
  713. if (!isDataURI(wasmBinaryFile)) {
  714. wasmBinaryFile = locateFile(wasmBinaryFile)
  715. }
  716. function getBinary() {
  717. try {
  718. if (wasmBinary) {
  719. return new Uint8Array(wasmBinary)
  720. }
  721. if (readBinary) {
  722. return readBinary(wasmBinaryFile)
  723. } else {
  724. throw 'both async and sync fetching of the wasm failed'
  725. }
  726. } catch (err) {
  727. abort(err)
  728. }
  729. }
  730. function getBinaryPromise() {
  731. if (
  732. !wasmBinary &&
  733. (ENVIRONMENT_IS_WEB || ENVIRONMENT_IS_WORKER) &&
  734. typeof fetch === 'function'
  735. ) {
  736. return fetch(wasmBinaryFile, { credentials: 'same-origin' })
  737. .then(function(response) {
  738. if (!response['ok']) {
  739. throw "failed to load wasm binary file at '" + wasmBinaryFile + "'"
  740. }
  741. return response['arrayBuffer']()
  742. })
  743. .catch(function() {
  744. return getBinary()
  745. })
  746. }
  747. return new Promise(function(resolve, reject) {
  748. resolve(getBinary())
  749. })
  750. }
  751. function createWasm(env) {
  752. var info = {
  753. env: env,
  754. wasi_unstable: env,
  755. global: { NaN: NaN, Infinity: Infinity },
  756. 'global.Math': Math,
  757. asm2wasm: asm2wasmImports
  758. }
  759. function receiveInstance(instance, module) {
  760. var exports = instance.exports
  761. Module['asm'] = exports
  762. removeRunDependency('wasm-instantiate')
  763. }
  764. addRunDependency('wasm-instantiate')
  765. function receiveInstantiatedSource(output) {
  766. receiveInstance(output['instance'])
  767. }
  768. function instantiateArrayBuffer(receiver) {
  769. return getBinaryPromise()
  770. .then(function(binary) {
  771. return WebAssembly.instantiate(binary, info)
  772. })
  773. .then(receiver, function(reason) {
  774. err('failed to asynchronously prepare wasm: ' + reason)
  775. abort(reason)
  776. })
  777. }
  778. function instantiateAsync() {
  779. if (
  780. !wasmBinary &&
  781. typeof WebAssembly.instantiateStreaming === 'function' &&
  782. !isDataURI(wasmBinaryFile) &&
  783. typeof fetch === 'function'
  784. ) {
  785. fetch(wasmBinaryFile, { credentials: 'same-origin' }).then(function(
  786. response
  787. ) {
  788. var result = WebAssembly.instantiateStreaming(response, info)
  789. return result.then(receiveInstantiatedSource, function(reason) {
  790. err('wasm streaming compile failed: ' + reason)
  791. err('falling back to ArrayBuffer instantiation')
  792. instantiateArrayBuffer(receiveInstantiatedSource)
  793. })
  794. })
  795. } else {
  796. return instantiateArrayBuffer(receiveInstantiatedSource)
  797. }
  798. }
  799. if (Module['instantiateWasm']) {
  800. try {
  801. var exports = Module['instantiateWasm'](info, receiveInstance)
  802. return exports
  803. } catch (e) {
  804. err('Module.instantiateWasm callback failed with error: ' + e)
  805. return false
  806. }
  807. }
  808. instantiateAsync()
  809. return {}
  810. }
  811. Module['asm'] = function(global, env, providedBuffer) {
  812. env['memory'] = wasmMemory
  813. env['table'] = wasmTable = new WebAssembly.Table({
  814. initial: 1072,
  815. maximum: 1072,
  816. element: 'anyfunc'
  817. })
  818. env['__memory_base'] = 1024
  819. env['__table_base'] = 0
  820. var exports = createWasm(env)
  821. return exports
  822. }
  823. var tempDouble
  824. var tempI64
  825. __ATINIT__.push({
  826. func: function() {
  827. ___emscripten_environ_constructor()
  828. }
  829. })
  830. var tempDoublePtr = 135824
  831. function demangle(func) {
  832. return func
  833. }
  834. function demangleAll(text) {
  835. var regex = /\b__Z[\w\d_]+/g
  836. return text.replace(regex, function(x) {
  837. var y = demangle(x)
  838. return x === y ? x : y + ' [' + x + ']'
  839. })
  840. }
  841. function jsStackTrace() {
  842. var err = new Error()
  843. if (!err.stack) {
  844. try {
  845. throw new Error(0)
  846. } catch (e) {
  847. err = e
  848. }
  849. if (!err.stack) {
  850. return '(no stack trace available)'
  851. }
  852. }
  853. return err.stack.toString()
  854. }
  855. function stackTrace() {
  856. var js = jsStackTrace()
  857. if (Module['extraStackTrace']) js += '\n' + Module['extraStackTrace']()
  858. return demangleAll(js)
  859. }
  860. var ENV = {}
  861. function ___buildEnvironment(environ) {
  862. var MAX_ENV_VALUES = 64
  863. var TOTAL_ENV_SIZE = 1024
  864. var poolPtr
  865. var envPtr
  866. if (!___buildEnvironment.called) {
  867. ___buildEnvironment.called = true
  868. ENV['USER'] = ENV['LOGNAME'] = 'web_user'
  869. ENV['PATH'] = '/'
  870. ENV['PWD'] = '/'
  871. ENV['HOME'] = '/home/web_user'
  872. ENV['LANG'] =
  873. (
  874. (typeof navigator === 'object' &&
  875. navigator.languages &&
  876. navigator.languages[0]) ||
  877. 'C'
  878. ).replace('-', '_') + '.UTF-8'
  879. ENV['_'] = thisProgram
  880. poolPtr = getMemory(TOTAL_ENV_SIZE)
  881. envPtr = getMemory(MAX_ENV_VALUES * 4)
  882. HEAP32[envPtr >> 2] = poolPtr
  883. HEAP32[environ >> 2] = envPtr
  884. } else {
  885. envPtr = HEAP32[environ >> 2]
  886. poolPtr = HEAP32[envPtr >> 2]
  887. }
  888. var strings = []
  889. var totalSize = 0
  890. for (var key in ENV) {
  891. if (typeof ENV[key] === 'string') {
  892. var line = key + '=' + ENV[key]
  893. strings.push(line)
  894. totalSize += line.length
  895. }
  896. }
  897. if (totalSize > TOTAL_ENV_SIZE) {
  898. throw new Error('Environment size exceeded TOTAL_ENV_SIZE!')
  899. }
  900. var ptrSize = 4
  901. for (var i = 0; i < strings.length; i++) {
  902. var line = strings[i]
  903. writeAsciiToMemory(line, poolPtr)
  904. HEAP32[(envPtr + i * ptrSize) >> 2] = poolPtr
  905. poolPtr += line.length + 1
  906. }
  907. HEAP32[(envPtr + strings.length * ptrSize) >> 2] = 0
  908. }
  909. var PATH = {
  910. splitPath: function(filename) {
  911. var splitPathRe = /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/
  912. return splitPathRe.exec(filename).slice(1)
  913. },
  914. normalizeArray: function(parts, allowAboveRoot) {
  915. var up = 0
  916. for (var i = parts.length - 1; i >= 0; i--) {
  917. var last = parts[i]
  918. if (last === '.') {
  919. parts.splice(i, 1)
  920. } else if (last === '..') {
  921. parts.splice(i, 1)
  922. up++
  923. } else if (up) {
  924. parts.splice(i, 1)
  925. up--
  926. }
  927. }
  928. if (allowAboveRoot) {
  929. for (; up; up--) {
  930. parts.unshift('..')
  931. }
  932. }
  933. return parts
  934. },
  935. normalize: function(path) {
  936. var isAbsolute = path.charAt(0) === '/',
  937. trailingSlash = path.substr(-1) === '/'
  938. path = PATH.normalizeArray(
  939. path.split('/').filter(function(p) {
  940. return !!p
  941. }),
  942. !isAbsolute
  943. ).join('/')
  944. if (!path && !isAbsolute) {
  945. path = '.'
  946. }
  947. if (path && trailingSlash) {
  948. path += '/'
  949. }
  950. return (isAbsolute ? '/' : '') + path
  951. },
  952. dirname: function(path) {
  953. var result = PATH.splitPath(path),
  954. root = result[0],
  955. dir = result[1]
  956. if (!root && !dir) {
  957. return '.'
  958. }
  959. if (dir) {
  960. dir = dir.substr(0, dir.length - 1)
  961. }
  962. return root + dir
  963. },
  964. basename: function(path) {
  965. if (path === '/') return '/'
  966. var lastSlash = path.lastIndexOf('/')
  967. if (lastSlash === -1) return path
  968. return path.substr(lastSlash + 1)
  969. },
  970. extname: function(path) {
  971. return PATH.splitPath(path)[3]
  972. },
  973. join: function() {
  974. var paths = Array.prototype.slice.call(arguments, 0)
  975. return PATH.normalize(paths.join('/'))
  976. },
  977. join2: function(l, r) {
  978. return PATH.normalize(l + '/' + r)
  979. }
  980. }
  981. function ___setErrNo(value) {
  982. if (Module['___errno_location'])
  983. HEAP32[Module['___errno_location']() >> 2] = value
  984. return value
  985. }
  986. var PATH_FS = {
  987. resolve: function() {
  988. var resolvedPath = '',
  989. resolvedAbsolute = false
  990. for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {
  991. var path = i >= 0 ? arguments[i] : FS.cwd()
  992. if (typeof path !== 'string') {
  993. throw new TypeError('Arguments to path.resolve must be strings')
  994. } else if (!path) {
  995. return ''
  996. }
  997. resolvedPath = path + '/' + resolvedPath
  998. resolvedAbsolute = path.charAt(0) === '/'
  999. }
  1000. resolvedPath = PATH.normalizeArray(
  1001. resolvedPath.split('/').filter(function(p) {
  1002. return !!p
  1003. }),
  1004. !resolvedAbsolute
  1005. ).join('/')
  1006. return (resolvedAbsolute ? '/' : '') + resolvedPath || '.'
  1007. },
  1008. relative: function(from, to) {
  1009. from = PATH_FS.resolve(from).substr(1)
  1010. to = PATH_FS.resolve(to).substr(1)
  1011. function trim(arr) {
  1012. var start = 0
  1013. for (; start < arr.length; start++) {
  1014. if (arr[start] !== '') break
  1015. }
  1016. var end = arr.length - 1
  1017. for (; end >= 0; end--) {
  1018. if (arr[end] !== '') break
  1019. }
  1020. if (start > end) return []
  1021. return arr.slice(start, end - start + 1)
  1022. }
  1023. var fromParts = trim(from.split('/'))
  1024. var toParts = trim(to.split('/'))
  1025. var length = Math.min(fromParts.length, toParts.length)
  1026. var samePartsLength = length
  1027. for (var i = 0; i < length; i++) {
  1028. if (fromParts[i] !== toParts[i]) {
  1029. samePartsLength = i
  1030. break
  1031. }
  1032. }
  1033. var outputParts = []
  1034. for (var i = samePartsLength; i < fromParts.length; i++) {
  1035. outputParts.push('..')
  1036. }
  1037. outputParts = outputParts.concat(toParts.slice(samePartsLength))
  1038. return outputParts.join('/')
  1039. }
  1040. }
  1041. var TTY = {
  1042. ttys: [],
  1043. init: function() {},
  1044. shutdown: function() {},
  1045. register: function(dev, ops) {
  1046. TTY.ttys[dev] = { input: [], output: [], ops: ops }
  1047. FS.registerDevice(dev, TTY.stream_ops)
  1048. },
  1049. stream_ops: {
  1050. open: function(stream) {
  1051. var tty = TTY.ttys[stream.node.rdev]
  1052. if (!tty) {
  1053. throw new FS.ErrnoError(19)
  1054. }
  1055. stream.tty = tty
  1056. stream.seekable = false
  1057. },
  1058. close: function(stream) {
  1059. stream.tty.ops.flush(stream.tty)
  1060. },
  1061. flush: function(stream) {
  1062. stream.tty.ops.flush(stream.tty)
  1063. },
  1064. read: function(stream, buffer, offset, length, pos) {
  1065. if (!stream.tty || !stream.tty.ops.get_char) {
  1066. throw new FS.ErrnoError(6)
  1067. }
  1068. var bytesRead = 0
  1069. for (var i = 0; i < length; i++) {
  1070. var result
  1071. try {
  1072. result = stream.tty.ops.get_char(stream.tty)
  1073. } catch (e) {
  1074. throw new FS.ErrnoError(5)
  1075. }
  1076. if (result === undefined && bytesRead === 0) {
  1077. throw new FS.ErrnoError(11)
  1078. }
  1079. if (result === null || result === undefined) break
  1080. bytesRead++
  1081. buffer[offset + i] = result
  1082. }
  1083. if (bytesRead) {
  1084. stream.node.timestamp = Date.now()
  1085. }
  1086. return bytesRead
  1087. },
  1088. write: function(stream, buffer, offset, length, pos) {
  1089. if (!stream.tty || !stream.tty.ops.put_char) {
  1090. throw new FS.ErrnoError(6)
  1091. }
  1092. try {
  1093. for (var i = 0; i < length; i++) {
  1094. stream.tty.ops.put_char(stream.tty, buffer[offset + i])
  1095. }
  1096. } catch (e) {
  1097. throw new FS.ErrnoError(5)
  1098. }
  1099. if (length) {
  1100. stream.node.timestamp = Date.now()
  1101. }
  1102. return i
  1103. }
  1104. },
  1105. default_tty_ops: {
  1106. get_char: function(tty) {
  1107. if (!tty.input.length) {
  1108. var result = null
  1109. if (ENVIRONMENT_IS_NODE) {
  1110. var BUFSIZE = 256
  1111. var buf = Buffer.alloc ? Buffer.alloc(BUFSIZE) : new Buffer(BUFSIZE)
  1112. var bytesRead = 0
  1113. var isPosixPlatform = process.platform != 'win32'
  1114. var fd = process.stdin.fd
  1115. if (isPosixPlatform) {
  1116. var usingDevice = false
  1117. try {
  1118. fd = fs.openSync('/dev/stdin', 'r')
  1119. usingDevice = true
  1120. } catch (e) {}
  1121. }
  1122. try {
  1123. bytesRead = fs.readSync(fd, buf, 0, BUFSIZE, null)
  1124. } catch (e) {
  1125. if (e.toString().indexOf('EOF') != -1) bytesRead = 0
  1126. else throw e
  1127. }
  1128. if (usingDevice) {
  1129. fs.closeSync(fd)
  1130. }
  1131. if (bytesRead > 0) {
  1132. result = buf.slice(0, bytesRead).toString('utf-8')
  1133. } else {
  1134. result = null
  1135. }
  1136. } else if (
  1137. typeof window != 'undefined' &&
  1138. typeof window.prompt == 'function'
  1139. ) {
  1140. result = window.prompt('Input: ')
  1141. if (result !== null) {
  1142. result += '\n'
  1143. }
  1144. } else if (typeof readline == 'function') {
  1145. result = readline()
  1146. if (result !== null) {
  1147. result += '\n'
  1148. }
  1149. }
  1150. if (!result) {
  1151. return null
  1152. }
  1153. tty.input = intArrayFromString(result, true)
  1154. }
  1155. return tty.input.shift()
  1156. },
  1157. put_char: function(tty, val) {
  1158. if (val === null || val === 10) {
  1159. out(UTF8ArrayToString(tty.output, 0))
  1160. tty.output = []
  1161. } else {
  1162. if (val != 0) tty.output.push(val)
  1163. }
  1164. },
  1165. flush: function(tty) {
  1166. if (tty.output && tty.output.length > 0) {
  1167. out(UTF8ArrayToString(tty.output, 0))
  1168. tty.output = []
  1169. }
  1170. }
  1171. },
  1172. default_tty1_ops: {
  1173. put_char: function(tty, val) {
  1174. if (val === null || val === 10) {
  1175. err(UTF8ArrayToString(tty.output, 0))
  1176. tty.output = []
  1177. } else {
  1178. if (val != 0) tty.output.push(val)
  1179. }
  1180. },
  1181. flush: function(tty) {
  1182. if (tty.output && tty.output.length > 0) {
  1183. err(UTF8ArrayToString(tty.output, 0))
  1184. tty.output = []
  1185. }
  1186. }
  1187. }
  1188. }
  1189. var MEMFS = {
  1190. ops_table: null,
  1191. mount: function(mount) {
  1192. return MEMFS.createNode(null, '/', 16384 | 511, 0)
  1193. },
  1194. createNode: function(parent, name, mode, dev) {
  1195. if (FS.isBlkdev(mode) || FS.isFIFO(mode)) {
  1196. throw new FS.ErrnoError(1)
  1197. }
  1198. if (!MEMFS.ops_table) {
  1199. MEMFS.ops_table = {
  1200. dir: {
  1201. node: {
  1202. getattr: MEMFS.node_ops.getattr,
  1203. setattr: MEMFS.node_ops.setattr,
  1204. lookup: MEMFS.node_ops.lookup,
  1205. mknod: MEMFS.node_ops.mknod,
  1206. rename: MEMFS.node_ops.rename,
  1207. unlink: MEMFS.node_ops.unlink,
  1208. rmdir: MEMFS.node_ops.rmdir,
  1209. readdir: MEMFS.node_ops.readdir,
  1210. symlink: MEMFS.node_ops.symlink
  1211. },
  1212. stream: { llseek: MEMFS.stream_ops.llseek }
  1213. },
  1214. file: {
  1215. node: {
  1216. getattr: MEMFS.node_ops.getattr,
  1217. setattr: MEMFS.node_ops.setattr
  1218. },
  1219. stream: {
  1220. llseek: MEMFS.stream_ops.llseek,
  1221. read: MEMFS.stream_ops.read,
  1222. write: MEMFS.stream_ops.write,
  1223. allocate: MEMFS.stream_ops.allocate,
  1224. mmap: MEMFS.stream_ops.mmap,
  1225. msync: MEMFS.stream_ops.msync
  1226. }
  1227. },
  1228. link: {
  1229. node: {
  1230. getattr: MEMFS.node_ops.getattr,
  1231. setattr: MEMFS.node_ops.setattr,
  1232. readlink: MEMFS.node_ops.readlink
  1233. },
  1234. stream: {}
  1235. },
  1236. chrdev: {
  1237. node: {
  1238. getattr: MEMFS.node_ops.getattr,
  1239. setattr: MEMFS.node_ops.setattr
  1240. },
  1241. stream: FS.chrdev_stream_ops
  1242. }
  1243. }
  1244. }
  1245. var node = FS.createNode(parent, name, mode, dev)
  1246. if (FS.isDir(node.mode)) {
  1247. node.node_ops = MEMFS.ops_table.dir.node
  1248. node.stream_ops = MEMFS.ops_table.dir.stream
  1249. node.contents = {}
  1250. } else if (FS.isFile(node.mode)) {
  1251. node.node_ops = MEMFS.ops_table.file.node
  1252. node.stream_ops = MEMFS.ops_table.file.stream
  1253. node.usedBytes = 0
  1254. node.contents = null
  1255. } else if (FS.isLink(node.mode)) {
  1256. node.node_ops = MEMFS.ops_table.link.node
  1257. node.stream_ops = MEMFS.ops_table.link.stream
  1258. } else if (FS.isChrdev(node.mode)) {
  1259. node.node_ops = MEMFS.ops_table.chrdev.node
  1260. node.stream_ops = MEMFS.ops_table.chrdev.stream
  1261. }
  1262. node.timestamp = Date.now()
  1263. if (parent) {
  1264. parent.contents[name] = node
  1265. }
  1266. return node
  1267. },
  1268. getFileDataAsRegularArray: function(node) {
  1269. if (node.contents && node.contents.subarray) {
  1270. var arr = []
  1271. for (var i = 0; i < node.usedBytes; ++i) arr.push(node.contents[i])
  1272. return arr
  1273. }
  1274. return node.contents
  1275. },
  1276. getFileDataAsTypedArray: function(node) {
  1277. if (!node.contents) return new Uint8Array()
  1278. if (node.contents.subarray) return node.contents.subarray(0, node.usedBytes)
  1279. return new Uint8Array(node.contents)
  1280. },
  1281. expandFileStorage: function(node, newCapacity) {
  1282. var prevCapacity = node.contents ? node.contents.length : 0
  1283. if (prevCapacity >= newCapacity) return
  1284. var CAPACITY_DOUBLING_MAX = 1024 * 1024
  1285. newCapacity = Math.max(
  1286. newCapacity,
  1287. (prevCapacity * (prevCapacity < CAPACITY_DOUBLING_MAX ? 2 : 1.125)) | 0
  1288. )
  1289. if (prevCapacity != 0) newCapacity = Math.max(newCapacity, 256)
  1290. var oldContents = node.contents
  1291. node.contents = new Uint8Array(newCapacity)
  1292. if (node.usedBytes > 0)
  1293. node.contents.set(oldContents.subarray(0, node.usedBytes), 0)
  1294. return
  1295. },
  1296. resizeFileStorage: function(node, newSize) {
  1297. if (node.usedBytes == newSize) return
  1298. if (newSize == 0) {
  1299. node.contents = null
  1300. node.usedBytes = 0
  1301. return
  1302. }
  1303. if (!node.contents || node.contents.subarray) {
  1304. var oldContents = node.contents
  1305. node.contents = new Uint8Array(new ArrayBuffer(newSize))
  1306. if (oldContents) {
  1307. node.contents.set(
  1308. oldContents.subarray(0, Math.min(newSize, node.usedBytes))
  1309. )
  1310. }
  1311. node.usedBytes = newSize
  1312. return
  1313. }
  1314. if (!node.contents) node.contents = []
  1315. if (node.contents.length > newSize) node.contents.length = newSize
  1316. else while (node.contents.length < newSize) node.contents.push(0)
  1317. node.usedBytes = newSize
  1318. },
  1319. node_ops: {
  1320. getattr: function(node) {
  1321. var attr = {}
  1322. attr.dev = FS.isChrdev(node.mode) ? node.id : 1
  1323. attr.ino = node.id
  1324. attr.mode = node.mode
  1325. attr.nlink = 1
  1326. attr.uid = 0
  1327. attr.gid = 0
  1328. attr.rdev = node.rdev
  1329. if (FS.isDir(node.mode)) {
  1330. attr.size = 4096
  1331. } else if (FS.isFile(node.mode)) {
  1332. attr.size = node.usedBytes
  1333. } else if (FS.isLink(node.mode)) {
  1334. attr.size = node.link.length
  1335. } else {
  1336. attr.size = 0
  1337. }
  1338. attr.atime = new Date(node.timestamp)
  1339. attr.mtime = new Date(node.timestamp)
  1340. attr.ctime = new Date(node.timestamp)
  1341. attr.blksize = 4096
  1342. attr.blocks = Math.ceil(attr.size / attr.blksize)
  1343. return attr
  1344. },
  1345. setattr: function(node, attr) {
  1346. if (attr.mode !== undefined) {
  1347. node.mode = attr.mode
  1348. }
  1349. if (attr.timestamp !== undefined) {
  1350. node.timestamp = attr.timestamp
  1351. }
  1352. if (attr.size !== undefined) {
  1353. MEMFS.resizeFileStorage(node, attr.size)
  1354. }
  1355. },
  1356. lookup: function(parent, name) {
  1357. throw FS.genericErrors[2]
  1358. },
  1359. mknod: function(parent, name, mode, dev) {
  1360. return MEMFS.createNode(parent, name, mode, dev)
  1361. },
  1362. rename: function(old_node, new_dir, new_name) {
  1363. if (FS.isDir(old_node.mode)) {
  1364. var new_node
  1365. try {
  1366. new_node = FS.lookupNode(new_dir, new_name)
  1367. } catch (e) {}
  1368. if (new_node) {
  1369. for (var i in new_node.contents) {
  1370. throw new FS.ErrnoError(39)
  1371. }
  1372. }
  1373. }
  1374. delete old_node.parent.contents[old_node.name]
  1375. old_node.name = new_name
  1376. new_dir.contents[new_name] = old_node
  1377. old_node.parent = new_dir
  1378. },
  1379. unlink: function(parent, name) {
  1380. delete parent.contents[name]
  1381. },
  1382. rmdir: function(parent, name) {
  1383. var node = FS.lookupNode(parent, name)
  1384. for (var i in node.contents) {
  1385. throw new FS.ErrnoError(39)
  1386. }
  1387. delete parent.contents[name]
  1388. },
  1389. readdir: function(node) {
  1390. var entries = ['.', '..']
  1391. for (var key in node.contents) {
  1392. if (!node.contents.hasOwnProperty(key)) {
  1393. continue
  1394. }
  1395. entries.push(key)
  1396. }
  1397. return entries
  1398. },
  1399. symlink: function(parent, newname, oldpath) {
  1400. var node = MEMFS.createNode(parent, newname, 511 | 40960, 0)
  1401. node.link = oldpath
  1402. return node
  1403. },
  1404. readlink: function(node) {
  1405. if (!FS.isLink(node.mode)) {
  1406. throw new FS.ErrnoError(22)
  1407. }
  1408. return node.link
  1409. }
  1410. },
  1411. stream_ops: {
  1412. read: function(stream, buffer, offset, length, position) {
  1413. var contents = stream.node.contents
  1414. if (position >= stream.node.usedBytes) return 0
  1415. var size = Math.min(stream.node.usedBytes - position, length)
  1416. if (size > 8 && contents.subarray) {
  1417. buffer.set(contents.subarray(position, position + size), offset)
  1418. } else {
  1419. for (var i = 0; i < size; i++)
  1420. buffer[offset + i] = contents[position + i]
  1421. }
  1422. return size
  1423. },
  1424. write: function(stream, buffer, offset, length, position, canOwn) {
  1425. if (!length) return 0
  1426. var node = stream.node
  1427. node.timestamp = Date.now()
  1428. if (buffer.subarray && (!node.contents || node.contents.subarray)) {
  1429. if (canOwn) {
  1430. node.contents = buffer.subarray(offset, offset + length)
  1431. node.usedBytes = length
  1432. return length
  1433. } else if (node.usedBytes === 0 && position === 0) {
  1434. node.contents = new Uint8Array(
  1435. buffer.subarray(offset, offset + length)
  1436. )
  1437. node.usedBytes = length
  1438. return length
  1439. } else if (position + length <= node.usedBytes) {
  1440. node.contents.set(buffer.subarray(offset, offset + length), position)
  1441. return length
  1442. }
  1443. }
  1444. MEMFS.expandFileStorage(node, position + length)
  1445. if (node.contents.subarray && buffer.subarray)
  1446. node.contents.set(buffer.subarray(offset, offset + length), position)
  1447. else {
  1448. for (var i = 0; i < length; i++) {
  1449. node.contents[position + i] = buffer[offset + i]
  1450. }
  1451. }
  1452. node.usedBytes = Math.max(node.usedBytes, position + length)
  1453. return length
  1454. },
  1455. llseek: function(stream, offset, whence) {
  1456. var position = offset
  1457. if (whence === 1) {
  1458. position += stream.position
  1459. } else if (whence === 2) {
  1460. if (FS.isFile(stream.node.mode)) {
  1461. position += stream.node.usedBytes
  1462. }
  1463. }
  1464. if (position < 0) {
  1465. throw new FS.ErrnoError(22)
  1466. }
  1467. return position
  1468. },
  1469. allocate: function(stream, offset, length) {
  1470. MEMFS.expandFileStorage(stream.node, offset + length)
  1471. stream.node.usedBytes = Math.max(stream.node.usedBytes, offset + length)
  1472. },
  1473. mmap: function(stream, buffer, offset, length, position, prot, flags) {
  1474. if (!FS.isFile(stream.node.mode)) {
  1475. throw new FS.ErrnoError(19)
  1476. }
  1477. var ptr
  1478. var allocated
  1479. var contents = stream.node.contents
  1480. if (
  1481. !(flags & 2) &&
  1482. (contents.buffer === buffer || contents.buffer === buffer.buffer)
  1483. ) {
  1484. allocated = false
  1485. ptr = contents.byteOffset
  1486. } else {
  1487. if (position > 0 || position + length < stream.node.usedBytes) {
  1488. if (contents.subarray) {
  1489. contents = contents.subarray(position, position + length)
  1490. } else {
  1491. contents = Array.prototype.slice.call(
  1492. contents,
  1493. position,
  1494. position + length
  1495. )
  1496. }
  1497. }
  1498. allocated = true
  1499. var fromHeap = buffer.buffer == HEAP8.buffer
  1500. ptr = _malloc(length)
  1501. if (!ptr) {
  1502. throw new FS.ErrnoError(12)
  1503. }
  1504. ;(fromHeap ? HEAP8 : buffer).set(contents, ptr)
  1505. }
  1506. return { ptr: ptr, allocated: allocated }
  1507. },
  1508. msync: function(stream, buffer, offset, length, mmapFlags) {
  1509. if (!FS.isFile(stream.node.mode)) {
  1510. throw new FS.ErrnoError(19)
  1511. }
  1512. if (mmapFlags & 2) {
  1513. return 0
  1514. }
  1515. var bytesWritten = MEMFS.stream_ops.write(
  1516. stream,
  1517. buffer,
  1518. 0,
  1519. length,
  1520. offset,
  1521. false
  1522. )
  1523. return 0
  1524. }
  1525. }
  1526. }
  1527. var IDBFS = {
  1528. dbs: {},
  1529. indexedDB: function() {
  1530. if (typeof indexedDB !== 'undefined') return indexedDB
  1531. var ret = null
  1532. if (typeof window === 'object')
  1533. ret =
  1534. window.indexedDB ||
  1535. window.mozIndexedDB ||
  1536. window.webkitIndexedDB ||
  1537. window.msIndexedDB
  1538. assert(ret, 'IDBFS used, but indexedDB not supported')
  1539. return ret
  1540. },
  1541. DB_VERSION: 21,
  1542. DB_STORE_NAME: 'FILE_DATA',
  1543. mount: function(mount) {
  1544. return MEMFS.mount.apply(null, arguments)
  1545. },
  1546. syncfs: function(mount, populate, callback) {
  1547. IDBFS.getLocalSet(mount, function(err, local) {
  1548. if (err) return callback(err)
  1549. IDBFS.getRemoteSet(mount, function(err, remote) {
  1550. if (err) return callback(err)
  1551. var src = populate ? remote : local
  1552. var dst = populate ? local : remote
  1553. IDBFS.reconcile(src, dst, callback)
  1554. })
  1555. })
  1556. },
  1557. getDB: function(name, callback) {
  1558. var db = IDBFS.dbs[name]
  1559. if (db) {
  1560. return callback(null, db)
  1561. }
  1562. var req
  1563. try {
  1564. req = IDBFS.indexedDB().open(name, IDBFS.DB_VERSION)
  1565. } catch (e) {
  1566. return callback(e)
  1567. }
  1568. if (!req) {
  1569. return callback('Unable to connect to IndexedDB')
  1570. }
  1571. req.onupgradeneeded = function(e) {
  1572. var db = e.target.result
  1573. var transaction = e.target.transaction
  1574. var fileStore
  1575. if (db.objectStoreNames.contains(IDBFS.DB_STORE_NAME)) {
  1576. fileStore = transaction.objectStore(IDBFS.DB_STORE_NAME)
  1577. } else {
  1578. fileStore = db.createObjectStore(IDBFS.DB_STORE_NAME)
  1579. }
  1580. if (!fileStore.indexNames.contains('timestamp')) {
  1581. fileStore.createIndex('timestamp', 'timestamp', { unique: false })
  1582. }
  1583. }
  1584. req.onsuccess = function() {
  1585. db = req.result
  1586. IDBFS.dbs[name] = db
  1587. callback(null, db)
  1588. }
  1589. req.onerror = function(e) {
  1590. callback(this.error)
  1591. e.preventDefault()
  1592. }
  1593. },
  1594. getLocalSet: function(mount, callback) {
  1595. var entries = {}
  1596. function isRealDir(p) {
  1597. return p !== '.' && p !== '..'
  1598. }
  1599. function toAbsolute(root) {
  1600. return function(p) {
  1601. return PATH.join2(root, p)
  1602. }
  1603. }
  1604. var check = FS.readdir(mount.mountpoint)
  1605. .filter(isRealDir)
  1606. .map(toAbsolute(mount.mountpoint))
  1607. while (check.length) {
  1608. var path = check.pop()
  1609. var stat
  1610. try {
  1611. stat = FS.stat(path)
  1612. } catch (e) {
  1613. return callback(e)
  1614. }
  1615. if (FS.isDir(stat.mode)) {
  1616. check.push.apply(
  1617. check,
  1618. FS.readdir(path)
  1619. .filter(isRealDir)
  1620. .map(toAbsolute(path))
  1621. )
  1622. }
  1623. entries[path] = { timestamp: stat.mtime }
  1624. }
  1625. return callback(null, { type: 'local', entries: entries })
  1626. },
  1627. getRemoteSet: function(mount, callback) {
  1628. var entries = {}
  1629. IDBFS.getDB(mount.mountpoint, function(err, db) {
  1630. if (err) return callback(err)
  1631. try {
  1632. var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readonly')
  1633. transaction.onerror = function(e) {
  1634. callback(this.error)
  1635. e.preventDefault()
  1636. }
  1637. var store = transaction.objectStore(IDBFS.DB_STORE_NAME)
  1638. var index = store.index('timestamp')
  1639. index.openKeyCursor().onsuccess = function(event) {
  1640. var cursor = event.target.result
  1641. if (!cursor) {
  1642. return callback(null, { type: 'remote', db: db, entries: entries })
  1643. }
  1644. entries[cursor.primaryKey] = { timestamp: cursor.key }
  1645. cursor.continue()
  1646. }
  1647. } catch (e) {
  1648. return callback(e)
  1649. }
  1650. })
  1651. },
  1652. loadLocalEntry: function(path, callback) {
  1653. var stat, node
  1654. try {
  1655. var lookup = FS.lookupPath(path)
  1656. node = lookup.node
  1657. stat = FS.stat(path)
  1658. } catch (e) {
  1659. return callback(e)
  1660. }
  1661. if (FS.isDir(stat.mode)) {
  1662. return callback(null, { timestamp: stat.mtime, mode: stat.mode })
  1663. } else if (FS.isFile(stat.mode)) {
  1664. node.contents = MEMFS.getFileDataAsTypedArray(node)
  1665. return callback(null, {
  1666. timestamp: stat.mtime,
  1667. mode: stat.mode,
  1668. contents: node.contents
  1669. })
  1670. } else {
  1671. return callback(new Error('node type not supported'))
  1672. }
  1673. },
  1674. storeLocalEntry: function(path, entry, callback) {
  1675. try {
  1676. if (FS.isDir(entry.mode)) {
  1677. FS.mkdir(path, entry.mode)
  1678. } else if (FS.isFile(entry.mode)) {
  1679. FS.writeFile(path, entry.contents, { canOwn: true })
  1680. } else {
  1681. return callback(new Error('node type not supported'))
  1682. }
  1683. FS.chmod(path, entry.mode)
  1684. FS.utime(path, entry.timestamp, entry.timestamp)
  1685. } catch (e) {
  1686. return callback(e)
  1687. }
  1688. callback(null)
  1689. },
  1690. removeLocalEntry: function(path, callback) {
  1691. try {
  1692. var lookup = FS.lookupPath(path)
  1693. var stat = FS.stat(path)
  1694. if (FS.isDir(stat.mode)) {
  1695. FS.rmdir(path)
  1696. } else if (FS.isFile(stat.mode)) {
  1697. FS.unlink(path)
  1698. }
  1699. } catch (e) {
  1700. return callback(e)
  1701. }
  1702. callback(null)
  1703. },
  1704. loadRemoteEntry: function(store, path, callback) {
  1705. var req = store.get(path)
  1706. req.onsuccess = function(event) {
  1707. callback(null, event.target.result)
  1708. }
  1709. req.onerror = function(e) {
  1710. callback(this.error)
  1711. e.preventDefault()
  1712. }
  1713. },
  1714. storeRemoteEntry: function(store, path, entry, callback) {
  1715. var req = store.put(entry, path)
  1716. req.onsuccess = function() {
  1717. callback(null)
  1718. }
  1719. req.onerror = function(e) {
  1720. callback(this.error)
  1721. e.preventDefault()
  1722. }
  1723. },
  1724. removeRemoteEntry: function(store, path, callback) {
  1725. var req = store.delete(path)
  1726. req.onsuccess = function() {
  1727. callback(null)
  1728. }
  1729. req.onerror = function(e) {
  1730. callback(this.error)
  1731. e.preventDefault()
  1732. }
  1733. },
  1734. reconcile: function(src, dst, callback) {
  1735. var total = 0
  1736. var create = []
  1737. Object.keys(src.entries).forEach(function(key) {
  1738. var e = src.entries[key]
  1739. var e2 = dst.entries[key]
  1740. if (!e2 || e.timestamp > e2.timestamp) {
  1741. create.push(key)
  1742. total++
  1743. }
  1744. })
  1745. var remove = []
  1746. Object.keys(dst.entries).forEach(function(key) {
  1747. var e = dst.entries[key]
  1748. var e2 = src.entries[key]
  1749. if (!e2) {
  1750. remove.push(key)
  1751. total++
  1752. }
  1753. })
  1754. if (!total) {
  1755. return callback(null)
  1756. }
  1757. var errored = false
  1758. var db = src.type === 'remote' ? src.db : dst.db
  1759. var transaction = db.transaction([IDBFS.DB_STORE_NAME], 'readwrite')
  1760. var store = transaction.objectStore(IDBFS.DB_STORE_NAME)
  1761. function done(err) {
  1762. if (err && !errored) {
  1763. errored = true
  1764. return callback(err)
  1765. }
  1766. }
  1767. transaction.onerror = function(e) {
  1768. done(this.error)
  1769. e.preventDefault()
  1770. }
  1771. transaction.oncomplete = function(e) {
  1772. if (!errored) {
  1773. callback(null)
  1774. }
  1775. }
  1776. create.sort().forEach(function(path) {
  1777. if (dst.type === 'local') {
  1778. IDBFS.loadRemoteEntry(store, path, function(err, entry) {
  1779. if (err) return done(err)
  1780. IDBFS.storeLocalEntry(path, entry, done)
  1781. })
  1782. } else {
  1783. IDBFS.loadLocalEntry(path, function(err, entry) {
  1784. if (err) return done(err)
  1785. IDBFS.storeRemoteEntry(store, path, entry, done)
  1786. })
  1787. }
  1788. })
  1789. remove
  1790. .sort()
  1791. .reverse()
  1792. .forEach(function(path) {
  1793. if (dst.type === 'local') {
  1794. IDBFS.removeLocalEntry(path, done)
  1795. } else {
  1796. IDBFS.removeRemoteEntry(store, path, done)
  1797. }
  1798. })
  1799. }
  1800. }
  1801. var NODEFS = {
  1802. isWindows: false,
  1803. staticInit: function() {
  1804. NODEFS.isWindows = !!process.platform.match(/^win/)
  1805. var flags = process['binding']('constants')
  1806. if (flags['fs']) {
  1807. flags = flags['fs']
  1808. }
  1809. NODEFS.flagsForNodeMap = {
  1810. 1024: flags['O_APPEND'],
  1811. 64: flags['O_CREAT'],
  1812. 128: flags['O_EXCL'],
  1813. 0: flags['O_RDONLY'],
  1814. 2: flags['O_RDWR'],
  1815. 4096: flags['O_SYNC'],
  1816. 512: flags['O_TRUNC'],
  1817. 1: flags['O_WRONLY']
  1818. }
  1819. },
  1820. bufferFrom: function(arrayBuffer) {
  1821. return Buffer['alloc'] ? Buffer.from(arrayBuffer) : new Buffer(arrayBuffer)
  1822. },
  1823. mount: function(mount) {
  1824. assert(ENVIRONMENT_HAS_NODE)
  1825. return NODEFS.createNode(null, '/', NODEFS.getMode(mount.opts.root), 0)
  1826. },
  1827. createNode: function(parent, name, mode, dev) {
  1828. if (!FS.isDir(mode) && !FS.isFile(mode) && !FS.isLink(mode)) {
  1829. throw new FS.ErrnoError(22)
  1830. }
  1831. var node = FS.createNode(parent, name, mode)
  1832. node.node_ops = NODEFS.node_ops
  1833. node.stream_ops = NODEFS.stream_ops
  1834. return node
  1835. },
  1836. getMode: function(path) {
  1837. var stat
  1838. try {
  1839. stat = fs.lstatSync(path)
  1840. if (NODEFS.isWindows) {
  1841. stat.mode = stat.mode | ((stat.mode & 292) >> 2)
  1842. }
  1843. } catch (e) {
  1844. if (!e.code) throw e
  1845. throw new FS.ErrnoError(-e.errno)
  1846. }
  1847. return stat.mode
  1848. },
  1849. realPath: function(node) {
  1850. var parts = []
  1851. while (node.parent !== node) {
  1852. parts.push(node.name)
  1853. node = node.parent
  1854. }
  1855. parts.push(node.mount.opts.root)
  1856. parts.reverse()
  1857. return PATH.join.apply(null, parts)
  1858. },
  1859. flagsForNode: function(flags) {
  1860. flags &= ~2097152
  1861. flags &= ~2048
  1862. flags &= ~32768
  1863. flags &= ~524288
  1864. var newFlags = 0
  1865. for (var k in NODEFS.flagsForNodeMap) {
  1866. if (flags & k) {
  1867. newFlags |= NODEFS.flagsForNodeMap[k]
  1868. flags ^= k
  1869. }
  1870. }
  1871. if (!flags) {
  1872. return newFlags
  1873. } else {
  1874. throw new FS.ErrnoError(22)
  1875. }
  1876. },
  1877. node_ops: {
  1878. getattr: function(node) {
  1879. var path = NODEFS.realPath(node)
  1880. var stat
  1881. try {
  1882. stat = fs.lstatSync(path)
  1883. } catch (e) {
  1884. if (!e.code) throw e
  1885. throw new FS.ErrnoError(-e.errno)
  1886. }
  1887. if (NODEFS.isWindows && !stat.blksize) {
  1888. stat.blksize = 4096
  1889. }
  1890. if (NODEFS.isWindows && !stat.blocks) {
  1891. stat.blocks = ((stat.size + stat.blksize - 1) / stat.blksize) | 0
  1892. }
  1893. return {
  1894. dev: stat.dev,
  1895. ino: stat.ino,
  1896. mode: stat.mode,
  1897. nlink: stat.nlink,
  1898. uid: stat.uid,
  1899. gid: stat.gid,
  1900. rdev: stat.rdev,
  1901. size: stat.size,
  1902. atime: stat.atime,
  1903. mtime: stat.mtime,
  1904. ctime: stat.ctime,
  1905. blksize: stat.blksize,
  1906. blocks: stat.blocks
  1907. }
  1908. },
  1909. setattr: function(node, attr) {
  1910. var path = NODEFS.realPath(node)
  1911. try {
  1912. if (attr.mode !== undefined) {
  1913. fs.chmodSync(path, attr.mode)
  1914. node.mode = attr.mode
  1915. }
  1916. if (attr.timestamp !== undefined) {
  1917. var date = new Date(attr.timestamp)
  1918. fs.utimesSync(path, date, date)
  1919. }
  1920. if (attr.size !== undefined) {
  1921. fs.truncateSync(path, attr.size)
  1922. }
  1923. } catch (e) {
  1924. if (!e.code) throw e
  1925. throw new FS.ErrnoError(-e.errno)
  1926. }
  1927. },
  1928. lookup: function(parent, name) {
  1929. var path = PATH.join2(NODEFS.realPath(parent), name)
  1930. var mode = NODEFS.getMode(path)
  1931. return NODEFS.createNode(parent, name, mode)
  1932. },
  1933. mknod: function(parent, name, mode, dev) {
  1934. var node = NODEFS.createNode(parent, name, mode, dev)
  1935. var path = NODEFS.realPath(node)
  1936. try {
  1937. if (FS.isDir(node.mode)) {
  1938. fs.mkdirSync(path, node.mode)
  1939. } else {
  1940. fs.writeFileSync(path, '', { mode: node.mode })
  1941. }
  1942. } catch (e) {
  1943. if (!e.code) throw e
  1944. throw new FS.ErrnoError(-e.errno)
  1945. }
  1946. return node
  1947. },
  1948. rename: function(oldNode, newDir, newName) {
  1949. var oldPath = NODEFS.realPath(oldNode)
  1950. var newPath = PATH.join2(NODEFS.realPath(newDir), newName)
  1951. try {
  1952. fs.renameSync(oldPath, newPath)
  1953. } catch (e) {
  1954. if (!e.code) throw e
  1955. throw new FS.ErrnoError(-e.errno)
  1956. }
  1957. },
  1958. unlink: function(parent, name) {
  1959. var path = PATH.join2(NODEFS.realPath(parent), name)
  1960. try {
  1961. fs.unlinkSync(path)
  1962. } catch (e) {
  1963. if (!e.code) throw e
  1964. throw new FS.ErrnoError(-e.errno)
  1965. }
  1966. },
  1967. rmdir: function(parent, name) {
  1968. var path = PATH.join2(NODEFS.realPath(parent), name)
  1969. try {
  1970. fs.rmdirSync(path)
  1971. } catch (e) {
  1972. if (!e.code) throw e
  1973. throw new FS.ErrnoError(-e.errno)
  1974. }
  1975. },
  1976. readdir: function(node) {
  1977. var path = NODEFS.realPath(node)
  1978. try {
  1979. return fs.readdirSync(path)
  1980. } catch (e) {
  1981. if (!e.code) throw e
  1982. throw new FS.ErrnoError(-e.errno)
  1983. }
  1984. },
  1985. symlink: function(parent, newName, oldPath) {
  1986. var newPath = PATH.join2(NODEFS.realPath(parent), newName)
  1987. try {
  1988. fs.symlinkSync(oldPath, newPath)
  1989. } catch (e) {
  1990. if (!e.code) throw e
  1991. throw new FS.ErrnoError(-e.errno)
  1992. }
  1993. },
  1994. readlink: function(node) {
  1995. var path = NODEFS.realPath(node)
  1996. try {
  1997. path = fs.readlinkSync(path)
  1998. path = NODEJS_PATH.relative(
  1999. NODEJS_PATH.resolve(node.mount.opts.root),
  2000. path
  2001. )
  2002. return path
  2003. } catch (e) {
  2004. if (!e.code) throw e
  2005. throw new FS.ErrnoError(-e.errno)
  2006. }
  2007. }
  2008. },
  2009. stream_ops: {
  2010. open: function(stream) {
  2011. var path = NODEFS.realPath(stream.node)
  2012. try {
  2013. if (FS.isFile(stream.node.mode)) {
  2014. stream.nfd = fs.openSync(path, NODEFS.flagsForNode(stream.flags))
  2015. }
  2016. } catch (e) {
  2017. if (!e.code) throw e
  2018. throw new FS.ErrnoError(-e.errno)
  2019. }
  2020. },
  2021. close: function(stream) {
  2022. try {
  2023. if (FS.isFile(stream.node.mode) && stream.nfd) {
  2024. fs.closeSync(stream.nfd)
  2025. }
  2026. } catch (e) {
  2027. if (!e.code) throw e
  2028. throw new FS.ErrnoError(-e.errno)
  2029. }
  2030. },
  2031. read: function(stream, buffer, offset, length, position) {
  2032. if (length === 0) return 0
  2033. try {
  2034. return fs.readSync(
  2035. stream.nfd,
  2036. NODEFS.bufferFrom(buffer.buffer),
  2037. offset,
  2038. length,
  2039. position
  2040. )
  2041. } catch (e) {
  2042. throw new FS.ErrnoError(-e.errno)
  2043. }
  2044. },
  2045. write: function(stream, buffer, offset, length, position) {
  2046. try {
  2047. return fs.writeSync(
  2048. stream.nfd,
  2049. NODEFS.bufferFrom(buffer.buffer),
  2050. offset,
  2051. length,
  2052. position
  2053. )
  2054. } catch (e) {
  2055. throw new FS.ErrnoError(-e.errno)
  2056. }
  2057. },
  2058. llseek: function(stream, offset, whence) {
  2059. var position = offset
  2060. if (whence === 1) {
  2061. position += stream.position
  2062. } else if (whence === 2) {
  2063. if (FS.isFile(stream.node.mode)) {
  2064. try {
  2065. var stat = fs.fstatSync(stream.nfd)
  2066. position += stat.size
  2067. } catch (e) {
  2068. throw new FS.ErrnoError(-e.errno)
  2069. }
  2070. }
  2071. }
  2072. if (position < 0) {
  2073. throw new FS.ErrnoError(22)
  2074. }
  2075. return position
  2076. }
  2077. }
  2078. }
  2079. var WORKERFS = {
  2080. DIR_MODE: 16895,
  2081. FILE_MODE: 33279,
  2082. reader: null,
  2083. mount: function(mount) {
  2084. assert(ENVIRONMENT_IS_WORKER)
  2085. if (!WORKERFS.reader) WORKERFS.reader = new FileReaderSync()
  2086. var root = WORKERFS.createNode(null, '/', WORKERFS.DIR_MODE, 0)
  2087. var createdParents = {}
  2088. function ensureParent(path) {
  2089. var parts = path.split('/')
  2090. var parent = root
  2091. for (var i = 0; i < parts.length - 1; i++) {
  2092. var curr = parts.slice(0, i + 1).join('/')
  2093. if (!createdParents[curr]) {
  2094. createdParents[curr] = WORKERFS.createNode(
  2095. parent,
  2096. parts[i],
  2097. WORKERFS.DIR_MODE,
  2098. 0
  2099. )
  2100. }
  2101. parent = createdParents[curr]
  2102. }
  2103. return parent
  2104. }
  2105. function base(path) {
  2106. var parts = path.split('/')
  2107. return parts[parts.length - 1]
  2108. }
  2109. Array.prototype.forEach.call(mount.opts['files'] || [], function(file) {
  2110. WORKERFS.createNode(
  2111. ensureParent(file.name),
  2112. base(file.name),
  2113. WORKERFS.FILE_MODE,
  2114. 0,
  2115. file,
  2116. file.lastModifiedDate
  2117. )
  2118. })
  2119. ;(mount.opts['blobs'] || []).forEach(function(obj) {
  2120. WORKERFS.createNode(
  2121. ensureParent(obj['name']),
  2122. base(obj['name']),
  2123. WORKERFS.FILE_MODE,
  2124. 0,
  2125. obj['data']
  2126. )
  2127. })
  2128. ;(mount.opts['packages'] || []).forEach(function(pack) {
  2129. pack['metadata'].files.forEach(function(file) {
  2130. var name = file.filename.substr(1)
  2131. WORKERFS.createNode(
  2132. ensureParent(name),
  2133. base(name),
  2134. WORKERFS.FILE_MODE,
  2135. 0,
  2136. pack['blob'].slice(file.start, file.end)
  2137. )
  2138. })
  2139. })
  2140. return root
  2141. },
  2142. createNode: function(parent, name, mode, dev, contents, mtime) {
  2143. var node = FS.createNode(parent, name, mode)
  2144. node.mode = mode
  2145. node.node_ops = WORKERFS.node_ops
  2146. node.stream_ops = WORKERFS.stream_ops
  2147. node.timestamp = (mtime || new Date()).getTime()
  2148. assert(WORKERFS.FILE_MODE !== WORKERFS.DIR_MODE)
  2149. if (mode === WORKERFS.FILE_MODE) {
  2150. node.size = contents.size
  2151. node.contents = contents
  2152. } else {
  2153. node.size = 4096
  2154. node.contents = {}
  2155. }
  2156. if (parent) {
  2157. parent.contents[name] = node
  2158. }
  2159. return node
  2160. },
  2161. node_ops: {
  2162. getattr: function(node) {
  2163. return {
  2164. dev: 1,
  2165. ino: undefined,
  2166. mode: node.mode,
  2167. nlink: 1,
  2168. uid: 0,
  2169. gid: 0,
  2170. rdev: undefined,
  2171. size: node.size,
  2172. atime: new Date(node.timestamp),
  2173. mtime: new Date(node.timestamp),
  2174. ctime: new Date(node.timestamp),
  2175. blksize: 4096,
  2176. blocks: Math.ceil(node.size / 4096)
  2177. }
  2178. },
  2179. setattr: function(node, attr) {
  2180. if (attr.mode !== undefined) {
  2181. node.mode = attr.mode
  2182. }
  2183. if (attr.timestamp !== undefined) {
  2184. node.timestamp = attr.timestamp
  2185. }
  2186. },
  2187. lookup: function(parent, name) {
  2188. throw new FS.ErrnoError(2)
  2189. },
  2190. mknod: function(parent, name, mode, dev) {
  2191. throw new FS.ErrnoError(1)
  2192. },
  2193. rename: function(oldNode, newDir, newName) {
  2194. throw new FS.ErrnoError(1)
  2195. },
  2196. unlink: function(parent, name) {
  2197. throw new FS.ErrnoError(1)
  2198. },
  2199. rmdir: function(parent, name) {
  2200. throw new FS.ErrnoError(1)
  2201. },
  2202. readdir: function(node) {
  2203. var entries = ['.', '..']
  2204. for (var key in node.contents) {
  2205. if (!node.contents.hasOwnProperty(key)) {
  2206. continue
  2207. }
  2208. entries.push(key)
  2209. }
  2210. return entries
  2211. },
  2212. symlink: function(parent, newName, oldPath) {
  2213. throw new FS.ErrnoError(1)
  2214. },
  2215. readlink: function(node) {
  2216. throw new FS.ErrnoError(1)
  2217. }
  2218. },
  2219. stream_ops: {
  2220. read: function(stream, buffer, offset, length, position) {
  2221. if (position >= stream.node.size) return 0
  2222. var chunk = stream.node.contents.slice(position, position + length)
  2223. var ab = WORKERFS.reader.readAsArrayBuffer(chunk)
  2224. buffer.set(new Uint8Array(ab), offset)
  2225. return chunk.size
  2226. },
  2227. write: function(stream, buffer, offset, length, position) {
  2228. throw new FS.ErrnoError(5)
  2229. },
  2230. llseek: function(stream, offset, whence) {
  2231. var position = offset
  2232. if (whence === 1) {
  2233. position += stream.position
  2234. } else if (whence === 2) {
  2235. if (FS.isFile(stream.node.mode)) {
  2236. position += stream.node.size
  2237. }
  2238. }
  2239. if (position < 0) {
  2240. throw new FS.ErrnoError(22)
  2241. }
  2242. return position
  2243. }
  2244. }
  2245. }
  2246. var FS = {
  2247. root: null,
  2248. mounts: [],
  2249. devices: {},
  2250. streams: [],
  2251. nextInode: 1,
  2252. nameTable: null,
  2253. currentPath: '/',
  2254. initialized: false,
  2255. ignorePermissions: true,
  2256. trackingDelegate: {},
  2257. tracking: { openFlags: { READ: 1, WRITE: 2 } },
  2258. ErrnoError: null,
  2259. genericErrors: {},
  2260. filesystems: null,
  2261. syncFSRequests: 0,
  2262. handleFSError: function(e) {
  2263. if (!(e instanceof FS.ErrnoError)) throw e + ' : ' + stackTrace()
  2264. return ___setErrNo(e.errno)
  2265. },
  2266. lookupPath: function(path, opts) {
  2267. path = PATH_FS.resolve(FS.cwd(), path)
  2268. opts = opts || {}
  2269. if (!path) return { path: '', node: null }
  2270. var defaults = { follow_mount: true, recurse_count: 0 }
  2271. for (var key in defaults) {
  2272. if (opts[key] === undefined) {
  2273. opts[key] = defaults[key]
  2274. }
  2275. }
  2276. if (opts.recurse_count > 8) {
  2277. throw new FS.ErrnoError(40)
  2278. }
  2279. var parts = PATH.normalizeArray(
  2280. path.split('/').filter(function(p) {
  2281. return !!p
  2282. }),
  2283. false
  2284. )
  2285. var current = FS.root
  2286. var current_path = '/'
  2287. for (var i = 0; i < parts.length; i++) {
  2288. var islast = i === parts.length - 1
  2289. if (islast && opts.parent) {
  2290. break
  2291. }
  2292. current = FS.lookupNode(current, parts[i])
  2293. current_path = PATH.join2(current_path, parts[i])
  2294. if (FS.isMountpoint(current)) {
  2295. if (!islast || (islast && opts.follow_mount)) {
  2296. current = current.mounted.root
  2297. }
  2298. }
  2299. if (!islast || opts.follow) {
  2300. var count = 0
  2301. while (FS.isLink(current.mode)) {
  2302. var link = FS.readlink(current_path)
  2303. current_path = PATH_FS.resolve(PATH.dirname(current_path), link)
  2304. var lookup = FS.lookupPath(current_path, {
  2305. recurse_count: opts.recurse_count
  2306. })
  2307. current = lookup.node
  2308. if (count++ > 40) {
  2309. throw new FS.ErrnoError(40)
  2310. }
  2311. }
  2312. }
  2313. }
  2314. return { path: current_path, node: current }
  2315. },
  2316. getPath: function(node) {
  2317. var path
  2318. while (true) {
  2319. if (FS.isRoot(node)) {
  2320. var mount = node.mount.mountpoint
  2321. if (!path) return mount
  2322. return mount[mount.length - 1] !== '/'
  2323. ? mount + '/' + path
  2324. : mount + path
  2325. }
  2326. path = path ? node.name + '/' + path : node.name
  2327. node = node.parent
  2328. }
  2329. },
  2330. hashName: function(parentid, name) {
  2331. var hash = 0
  2332. for (var i = 0; i < name.length; i++) {
  2333. hash = ((hash << 5) - hash + name.charCodeAt(i)) | 0
  2334. }
  2335. return ((parentid + hash) >>> 0) % FS.nameTable.length
  2336. },
  2337. hashAddNode: function(node) {
  2338. var hash = FS.hashName(node.parent.id, node.name)
  2339. node.name_next = FS.nameTable[hash]
  2340. FS.nameTable[hash] = node
  2341. },
  2342. hashRemoveNode: function(node) {
  2343. var hash = FS.hashName(node.parent.id, node.name)
  2344. if (FS.nameTable[hash] === node) {
  2345. FS.nameTable[hash] = node.name_next
  2346. } else {
  2347. var current = FS.nameTable[hash]
  2348. while (current) {
  2349. if (current.name_next === node) {
  2350. current.name_next = node.name_next
  2351. break
  2352. }
  2353. current = current.name_next
  2354. }
  2355. }
  2356. },
  2357. lookupNode: function(parent, name) {
  2358. var err = FS.mayLookup(parent)
  2359. if (err) {
  2360. throw new FS.ErrnoError(err, parent)
  2361. }
  2362. var hash = FS.hashName(parent.id, name)
  2363. for (var node = FS.nameTable[hash]; node; node = node.name_next) {
  2364. var nodeName = node.name
  2365. if (node.parent.id === parent.id && nodeName === name) {
  2366. return node
  2367. }
  2368. }
  2369. return FS.lookup(parent, name)
  2370. },
  2371. createNode: function(parent, name, mode, rdev) {
  2372. if (!FS.FSNode) {
  2373. FS.FSNode = function(parent, name, mode, rdev) {
  2374. if (!parent) {
  2375. parent = this
  2376. }
  2377. this.parent = parent
  2378. this.mount = parent.mount
  2379. this.mounted = null
  2380. this.id = FS.nextInode++
  2381. this.name = name
  2382. this.mode = mode
  2383. this.node_ops = {}
  2384. this.stream_ops = {}
  2385. this.rdev = rdev
  2386. }
  2387. FS.FSNode.prototype = {}
  2388. var readMode = 292 | 73
  2389. var writeMode = 146
  2390. Object.defineProperties(FS.FSNode.prototype, {
  2391. read: {
  2392. get: function() {
  2393. return (this.mode & readMode) === readMode
  2394. },
  2395. set: function(val) {
  2396. val ? (this.mode |= readMode) : (this.mode &= ~readMode)
  2397. }
  2398. },
  2399. write: {
  2400. get: function() {
  2401. return (this.mode & writeMode) === writeMode
  2402. },
  2403. set: function(val) {
  2404. val ? (this.mode |= writeMode) : (this.mode &= ~writeMode)
  2405. }
  2406. },
  2407. isFolder: {
  2408. get: function() {
  2409. return FS.isDir(this.mode)
  2410. }
  2411. },
  2412. isDevice: {
  2413. get: function() {
  2414. return FS.isChrdev(this.mode)
  2415. }
  2416. }
  2417. })
  2418. }
  2419. var node = new FS.FSNode(parent, name, mode, rdev)
  2420. FS.hashAddNode(node)
  2421. return node
  2422. },
  2423. destroyNode: function(node) {
  2424. FS.hashRemoveNode(node)
  2425. },
  2426. isRoot: function(node) {
  2427. return node === node.parent
  2428. },
  2429. isMountpoint: function(node) {
  2430. return !!node.mounted
  2431. },
  2432. isFile: function(mode) {
  2433. return (mode & 61440) === 32768
  2434. },
  2435. isDir: function(mode) {
  2436. return (mode & 61440) === 16384
  2437. },
  2438. isLink: function(mode) {
  2439. return (mode & 61440) === 40960
  2440. },
  2441. isChrdev: function(mode) {
  2442. return (mode & 61440) === 8192
  2443. },
  2444. isBlkdev: function(mode) {
  2445. return (mode & 61440) === 24576
  2446. },
  2447. isFIFO: function(mode) {
  2448. return (mode & 61440) === 4096
  2449. },
  2450. isSocket: function(mode) {
  2451. return (mode & 49152) === 49152
  2452. },
  2453. flagModes: {
  2454. r: 0,
  2455. rs: 1052672,
  2456. 'r+': 2,
  2457. w: 577,
  2458. wx: 705,
  2459. xw: 705,
  2460. 'w+': 578,
  2461. 'wx+': 706,
  2462. 'xw+': 706,
  2463. a: 1089,
  2464. ax: 1217,
  2465. xa: 1217,
  2466. 'a+': 1090,
  2467. 'ax+': 1218,
  2468. 'xa+': 1218
  2469. },
  2470. modeStringToFlags: function(str) {
  2471. var flags = FS.flagModes[str]
  2472. if (typeof flags === 'undefined') {
  2473. throw new Error('Unknown file open mode: ' + str)
  2474. }
  2475. return flags
  2476. },
  2477. flagsToPermissionString: function(flag) {
  2478. var perms = ['r', 'w', 'rw'][flag & 3]
  2479. if (flag & 512) {
  2480. perms += 'w'
  2481. }
  2482. return perms
  2483. },
  2484. nodePermissions: function(node, perms) {
  2485. if (FS.ignorePermissions) {
  2486. return 0
  2487. }
  2488. if (perms.indexOf('r') !== -1 && !(node.mode & 292)) {
  2489. return 13
  2490. } else if (perms.indexOf('w') !== -1 && !(node.mode & 146)) {
  2491. return 13
  2492. } else if (perms.indexOf('x') !== -1 && !(node.mode & 73)) {
  2493. return 13
  2494. }
  2495. return 0
  2496. },
  2497. mayLookup: function(dir) {
  2498. var err = FS.nodePermissions(dir, 'x')
  2499. if (err) return err
  2500. if (!dir.node_ops.lookup) return 13
  2501. return 0
  2502. },
  2503. mayCreate: function(dir, name) {
  2504. try {
  2505. var node = FS.lookupNode(dir, name)
  2506. return 17
  2507. } catch (e) {}
  2508. return FS.nodePermissions(dir, 'wx')
  2509. },
  2510. mayDelete: function(dir, name, isdir) {
  2511. var node
  2512. try {
  2513. node = FS.lookupNode(dir, name)
  2514. } catch (e) {
  2515. return e.errno
  2516. }
  2517. var err = FS.nodePermissions(dir, 'wx')
  2518. if (err) {
  2519. return err
  2520. }
  2521. if (isdir) {
  2522. if (!FS.isDir(node.mode)) {
  2523. return 20
  2524. }
  2525. if (FS.isRoot(node) || FS.getPath(node) === FS.cwd()) {
  2526. return 16
  2527. }
  2528. } else {
  2529. if (FS.isDir(node.mode)) {
  2530. return 21
  2531. }
  2532. }
  2533. return 0
  2534. },
  2535. mayOpen: function(node, flags) {
  2536. if (!node) {
  2537. return 2
  2538. }
  2539. if (FS.isLink(node.mode)) {
  2540. return 40
  2541. } else if (FS.isDir(node.mode)) {
  2542. if (FS.flagsToPermissionString(flags) !== 'r' || flags & 512) {
  2543. return 21
  2544. }
  2545. }
  2546. return FS.nodePermissions(node, FS.flagsToPermissionString(flags))
  2547. },
  2548. MAX_OPEN_FDS: 4096,
  2549. nextfd: function(fd_start, fd_end) {
  2550. fd_start = fd_start || 0
  2551. fd_end = fd_end || FS.MAX_OPEN_FDS
  2552. for (var fd = fd_start; fd <= fd_end; fd++) {
  2553. if (!FS.streams[fd]) {
  2554. return fd
  2555. }
  2556. }
  2557. throw new FS.ErrnoError(24)
  2558. },
  2559. getStream: function(fd) {
  2560. return FS.streams[fd]
  2561. },
  2562. createStream: function(stream, fd_start, fd_end) {
  2563. if (!FS.FSStream) {
  2564. FS.FSStream = function() {}
  2565. FS.FSStream.prototype = {}
  2566. Object.defineProperties(FS.FSStream.prototype, {
  2567. object: {
  2568. get: function() {
  2569. return this.node
  2570. },
  2571. set: function(val) {
  2572. this.node = val
  2573. }
  2574. },
  2575. isRead: {
  2576. get: function() {
  2577. return (this.flags & 2097155) !== 1
  2578. }
  2579. },
  2580. isWrite: {
  2581. get: function() {
  2582. return (this.flags & 2097155) !== 0
  2583. }
  2584. },
  2585. isAppend: {
  2586. get: function() {
  2587. return this.flags & 1024
  2588. }
  2589. }
  2590. })
  2591. }
  2592. var newStream = new FS.FSStream()
  2593. for (var p in stream) {
  2594. newStream[p] = stream[p]
  2595. }
  2596. stream = newStream
  2597. var fd = FS.nextfd(fd_start, fd_end)
  2598. stream.fd = fd
  2599. FS.streams[fd] = stream
  2600. return stream
  2601. },
  2602. closeStream: function(fd) {
  2603. FS.streams[fd] = null
  2604. },
  2605. chrdev_stream_ops: {
  2606. open: function(stream) {
  2607. var device = FS.getDevice(stream.node.rdev)
  2608. stream.stream_ops = device.stream_ops
  2609. if (stream.stream_ops.open) {
  2610. stream.stream_ops.open(stream)
  2611. }
  2612. },
  2613. llseek: function() {
  2614. throw new FS.ErrnoError(29)
  2615. }
  2616. },
  2617. major: function(dev) {
  2618. return dev >> 8
  2619. },
  2620. minor: function(dev) {
  2621. return dev & 255
  2622. },
  2623. makedev: function(ma, mi) {
  2624. return (ma << 8) | mi
  2625. },
  2626. registerDevice: function(dev, ops) {
  2627. FS.devices[dev] = { stream_ops: ops }
  2628. },
  2629. getDevice: function(dev) {
  2630. return FS.devices[dev]
  2631. },
  2632. getMounts: function(mount) {
  2633. var mounts = []
  2634. var check = [mount]
  2635. while (check.length) {
  2636. var m = check.pop()
  2637. mounts.push(m)
  2638. check.push.apply(check, m.mounts)
  2639. }
  2640. return mounts
  2641. },
  2642. syncfs: function(populate, callback) {
  2643. if (typeof populate === 'function') {
  2644. callback = populate
  2645. populate = false
  2646. }
  2647. FS.syncFSRequests++
  2648. if (FS.syncFSRequests > 1) {
  2649. console.log(
  2650. 'warning: ' +
  2651. FS.syncFSRequests +
  2652. ' FS.syncfs operations in flight at once, probably just doing extra work'
  2653. )
  2654. }
  2655. var mounts = FS.getMounts(FS.root.mount)
  2656. var completed = 0
  2657. function doCallback(err) {
  2658. FS.syncFSRequests--
  2659. return callback(err)
  2660. }
  2661. function done(err) {
  2662. if (err) {
  2663. if (!done.errored) {
  2664. done.errored = true
  2665. return doCallback(err)
  2666. }
  2667. return
  2668. }
  2669. if (++completed >= mounts.length) {
  2670. doCallback(null)
  2671. }
  2672. }
  2673. mounts.forEach(function(mount) {
  2674. if (!mount.type.syncfs) {
  2675. return done(null)
  2676. }
  2677. mount.type.syncfs(mount, populate, done)
  2678. })
  2679. },
  2680. mount: function(type, opts, mountpoint) {
  2681. var root = mountpoint === '/'
  2682. var pseudo = !mountpoint
  2683. var node
  2684. if (root && FS.root) {
  2685. throw new FS.ErrnoError(16)
  2686. } else if (!root && !pseudo) {
  2687. var lookup = FS.lookupPath(mountpoint, { follow_mount: false })
  2688. mountpoint = lookup.path
  2689. node = lookup.node
  2690. if (FS.isMountpoint(node)) {
  2691. throw new FS.ErrnoError(16)
  2692. }
  2693. if (!FS.isDir(node.mode)) {
  2694. throw new FS.ErrnoError(20)
  2695. }
  2696. }
  2697. var mount = { type: type, opts: opts, mountpoint: mountpoint, mounts: [] }
  2698. var mountRoot = type.mount(mount)
  2699. mountRoot.mount = mount
  2700. mount.root = mountRoot
  2701. if (root) {
  2702. FS.root = mountRoot
  2703. } else if (node) {
  2704. node.mounted = mount
  2705. if (node.mount) {
  2706. node.mount.mounts.push(mount)
  2707. }
  2708. }
  2709. return mountRoot
  2710. },
  2711. unmount: function(mountpoint) {
  2712. var lookup = FS.lookupPath(mountpoint, { follow_mount: false })
  2713. if (!FS.isMountpoint(lookup.node)) {
  2714. throw new FS.ErrnoError(22)
  2715. }
  2716. var node = lookup.node
  2717. var mount = node.mounted
  2718. var mounts = FS.getMounts(mount)
  2719. Object.keys(FS.nameTable).forEach(function(hash) {
  2720. var current = FS.nameTable[hash]
  2721. while (current) {
  2722. var next = current.name_next
  2723. if (mounts.indexOf(current.mount) !== -1) {
  2724. FS.destroyNode(current)
  2725. }
  2726. current = next
  2727. }
  2728. })
  2729. node.mounted = null
  2730. var idx = node.mount.mounts.indexOf(mount)
  2731. node.mount.mounts.splice(idx, 1)
  2732. },
  2733. lookup: function(parent, name) {
  2734. return parent.node_ops.lookup(parent, name)
  2735. },
  2736. mknod: function(path, mode, dev) {
  2737. var lookup = FS.lookupPath(path, { parent: true })
  2738. var parent = lookup.node
  2739. var name = PATH.basename(path)
  2740. if (!name || name === '.' || name === '..') {
  2741. throw new FS.ErrnoError(22)
  2742. }
  2743. var err = FS.mayCreate(parent, name)
  2744. if (err) {
  2745. throw new FS.ErrnoError(err)
  2746. }
  2747. if (!parent.node_ops.mknod) {
  2748. throw new FS.ErrnoError(1)
  2749. }
  2750. return parent.node_ops.mknod(parent, name, mode, dev)
  2751. },
  2752. create: function(path, mode) {
  2753. mode = mode !== undefined ? mode : 438
  2754. mode &= 4095
  2755. mode |= 32768
  2756. return FS.mknod(path, mode, 0)
  2757. },
  2758. mkdir: function(path, mode) {
  2759. mode = mode !== undefined ? mode : 511
  2760. mode &= 511 | 512
  2761. mode |= 16384
  2762. return FS.mknod(path, mode, 0)
  2763. },
  2764. mkdirTree: function(path, mode) {
  2765. var dirs = path.split('/')
  2766. var d = ''
  2767. for (var i = 0; i < dirs.length; ++i) {
  2768. if (!dirs[i]) continue
  2769. d += '/' + dirs[i]
  2770. try {
  2771. FS.mkdir(d, mode)
  2772. } catch (e) {
  2773. if (e.errno != 17) throw e
  2774. }
  2775. }
  2776. },
  2777. mkdev: function(path, mode, dev) {
  2778. if (typeof dev === 'undefined') {
  2779. dev = mode
  2780. mode = 438
  2781. }
  2782. mode |= 8192
  2783. return FS.mknod(path, mode, dev)
  2784. },
  2785. symlink: function(oldpath, newpath) {
  2786. if (!PATH_FS.resolve(oldpath)) {
  2787. throw new FS.ErrnoError(2)
  2788. }
  2789. var lookup = FS.lookupPath(newpath, { parent: true })
  2790. var parent = lookup.node
  2791. if (!parent) {
  2792. throw new FS.ErrnoError(2)
  2793. }
  2794. var newname = PATH.basename(newpath)
  2795. var err = FS.mayCreate(parent, newname)
  2796. if (err) {
  2797. throw new FS.ErrnoError(err)
  2798. }
  2799. if (!parent.node_ops.symlink) {
  2800. throw new FS.ErrnoError(1)
  2801. }
  2802. return parent.node_ops.symlink(parent, newname, oldpath)
  2803. },
  2804. rename: function(old_path, new_path) {
  2805. var old_dirname = PATH.dirname(old_path)
  2806. var new_dirname = PATH.dirname(new_path)
  2807. var old_name = PATH.basename(old_path)
  2808. var new_name = PATH.basename(new_path)
  2809. var lookup, old_dir, new_dir
  2810. try {
  2811. lookup = FS.lookupPath(old_path, { parent: true })
  2812. old_dir = lookup.node
  2813. lookup = FS.lookupPath(new_path, { parent: true })
  2814. new_dir = lookup.node
  2815. } catch (e) {
  2816. throw new FS.ErrnoError(16)
  2817. }
  2818. if (!old_dir || !new_dir) throw new FS.ErrnoError(2)
  2819. if (old_dir.mount !== new_dir.mount) {
  2820. throw new FS.ErrnoError(18)
  2821. }
  2822. var old_node = FS.lookupNode(old_dir, old_name)
  2823. var relative = PATH_FS.relative(old_path, new_dirname)
  2824. if (relative.charAt(0) !== '.') {
  2825. throw new FS.ErrnoError(22)
  2826. }
  2827. relative = PATH_FS.relative(new_path, old_dirname)
  2828. if (relative.charAt(0) !== '.') {
  2829. throw new FS.ErrnoError(39)
  2830. }
  2831. var new_node
  2832. try {
  2833. new_node = FS.lookupNode(new_dir, new_name)
  2834. } catch (e) {}
  2835. if (old_node === new_node) {
  2836. return
  2837. }
  2838. var isdir = FS.isDir(old_node.mode)
  2839. var err = FS.mayDelete(old_dir, old_name, isdir)
  2840. if (err) {
  2841. throw new FS.ErrnoError(err)
  2842. }
  2843. err = new_node
  2844. ? FS.mayDelete(new_dir, new_name, isdir)
  2845. : FS.mayCreate(new_dir, new_name)
  2846. if (err) {
  2847. throw new FS.ErrnoError(err)
  2848. }
  2849. if (!old_dir.node_ops.rename) {
  2850. throw new FS.ErrnoError(1)
  2851. }
  2852. if (FS.isMountpoint(old_node) || (new_node && FS.isMountpoint(new_node))) {
  2853. throw new FS.ErrnoError(16)
  2854. }
  2855. if (new_dir !== old_dir) {
  2856. err = FS.nodePermissions(old_dir, 'w')
  2857. if (err) {
  2858. throw new FS.ErrnoError(err)
  2859. }
  2860. }
  2861. try {
  2862. if (FS.trackingDelegate['willMovePath']) {
  2863. FS.trackingDelegate['willMovePath'](old_path, new_path)
  2864. }
  2865. } catch (e) {
  2866. console.log(
  2867. "FS.trackingDelegate['willMovePath']('" +
  2868. old_path +
  2869. "', '" +
  2870. new_path +
  2871. "') threw an exception: " +
  2872. e.message
  2873. )
  2874. }
  2875. FS.hashRemoveNode(old_node)
  2876. try {
  2877. old_dir.node_ops.rename(old_node, new_dir, new_name)
  2878. } catch (e) {
  2879. throw e
  2880. } finally {
  2881. FS.hashAddNode(old_node)
  2882. }
  2883. try {
  2884. if (FS.trackingDelegate['onMovePath'])
  2885. FS.trackingDelegate['onMovePath'](old_path, new_path)
  2886. } catch (e) {
  2887. console.log(
  2888. "FS.trackingDelegate['onMovePath']('" +
  2889. old_path +
  2890. "', '" +
  2891. new_path +
  2892. "') threw an exception: " +
  2893. e.message
  2894. )
  2895. }
  2896. },
  2897. rmdir: function(path) {
  2898. var lookup = FS.lookupPath(path, { parent: true })
  2899. var parent = lookup.node
  2900. var name = PATH.basename(path)
  2901. var node = FS.lookupNode(parent, name)
  2902. var err = FS.mayDelete(parent, name, true)
  2903. if (err) {
  2904. throw new FS.ErrnoError(err)
  2905. }
  2906. if (!parent.node_ops.rmdir) {
  2907. throw new FS.ErrnoError(1)
  2908. }
  2909. if (FS.isMountpoint(node)) {
  2910. throw new FS.ErrnoError(16)
  2911. }
  2912. try {
  2913. if (FS.trackingDelegate['willDeletePath']) {
  2914. FS.trackingDelegate['willDeletePath'](path)
  2915. }
  2916. } catch (e) {
  2917. console.log(
  2918. "FS.trackingDelegate['willDeletePath']('" +
  2919. path +
  2920. "') threw an exception: " +
  2921. e.message
  2922. )
  2923. }
  2924. parent.node_ops.rmdir(parent, name)
  2925. FS.destroyNode(node)
  2926. try {
  2927. if (FS.trackingDelegate['onDeletePath'])
  2928. FS.trackingDelegate['onDeletePath'](path)
  2929. } catch (e) {
  2930. console.log(
  2931. "FS.trackingDelegate['onDeletePath']('" +
  2932. path +
  2933. "') threw an exception: " +
  2934. e.message
  2935. )
  2936. }
  2937. },
  2938. readdir: function(path) {
  2939. var lookup = FS.lookupPath(path, { follow: true })
  2940. var node = lookup.node
  2941. if (!node.node_ops.readdir) {
  2942. throw new FS.ErrnoError(20)
  2943. }
  2944. return node.node_ops.readdir(node)
  2945. },
  2946. unlink: function(path) {
  2947. var lookup = FS.lookupPath(path, { parent: true })
  2948. var parent = lookup.node
  2949. var name = PATH.basename(path)
  2950. var node = FS.lookupNode(parent, name)
  2951. var err = FS.mayDelete(parent, name, false)
  2952. if (err) {
  2953. throw new FS.ErrnoError(err)
  2954. }
  2955. if (!parent.node_ops.unlink) {
  2956. throw new FS.ErrnoError(1)
  2957. }
  2958. if (FS.isMountpoint(node)) {
  2959. throw new FS.ErrnoError(16)
  2960. }
  2961. try {
  2962. if (FS.trackingDelegate['willDeletePath']) {
  2963. FS.trackingDelegate['willDeletePath'](path)
  2964. }
  2965. } catch (e) {
  2966. console.log(
  2967. "FS.trackingDelegate['willDeletePath']('" +
  2968. path +
  2969. "') threw an exception: " +
  2970. e.message
  2971. )
  2972. }
  2973. parent.node_ops.unlink(parent, name)
  2974. FS.destroyNode(node)
  2975. try {
  2976. if (FS.trackingDelegate['onDeletePath'])
  2977. FS.trackingDelegate['onDeletePath'](path)
  2978. } catch (e) {
  2979. console.log(
  2980. "FS.trackingDelegate['onDeletePath']('" +
  2981. path +
  2982. "') threw an exception: " +
  2983. e.message
  2984. )
  2985. }
  2986. },
  2987. readlink: function(path) {
  2988. var lookup = FS.lookupPath(path)
  2989. var link = lookup.node
  2990. if (!link) {
  2991. throw new FS.ErrnoError(2)
  2992. }
  2993. if (!link.node_ops.readlink) {
  2994. throw new FS.ErrnoError(22)
  2995. }
  2996. return PATH_FS.resolve(
  2997. FS.getPath(link.parent),
  2998. link.node_ops.readlink(link)
  2999. )
  3000. },
  3001. stat: function(path, dontFollow) {
  3002. var lookup = FS.lookupPath(path, { follow: !dontFollow })
  3003. var node = lookup.node
  3004. if (!node) {
  3005. throw new FS.ErrnoError(2)
  3006. }
  3007. if (!node.node_ops.getattr) {
  3008. throw new FS.ErrnoError(1)
  3009. }
  3010. return node.node_ops.getattr(node)
  3011. },
  3012. lstat: function(path) {
  3013. return FS.stat(path, true)
  3014. },
  3015. chmod: function(path, mode, dontFollow) {
  3016. var node
  3017. if (typeof path === 'string') {
  3018. var lookup = FS.lookupPath(path, { follow: !dontFollow })
  3019. node = lookup.node
  3020. } else {
  3021. node = path
  3022. }
  3023. if (!node.node_ops.setattr) {
  3024. throw new FS.ErrnoError(1)
  3025. }
  3026. node.node_ops.setattr(node, {
  3027. mode: (mode & 4095) | (node.mode & ~4095),
  3028. timestamp: Date.now()
  3029. })
  3030. },
  3031. lchmod: function(path, mode) {
  3032. FS.chmod(path, mode, true)
  3033. },
  3034. fchmod: function(fd, mode) {
  3035. var stream = FS.getStream(fd)
  3036. if (!stream) {
  3037. throw new FS.ErrnoError(9)
  3038. }
  3039. FS.chmod(stream.node, mode)
  3040. },
  3041. chown: function(path, uid, gid, dontFollow) {
  3042. var node
  3043. if (typeof path === 'string') {
  3044. var lookup = FS.lookupPath(path, { follow: !dontFollow })
  3045. node = lookup.node
  3046. } else {
  3047. node = path
  3048. }
  3049. if (!node.node_ops.setattr) {
  3050. throw new FS.ErrnoError(1)
  3051. }
  3052. node.node_ops.setattr(node, { timestamp: Date.now() })
  3053. },
  3054. lchown: function(path, uid, gid) {
  3055. FS.chown(path, uid, gid, true)
  3056. },
  3057. fchown: function(fd, uid, gid) {
  3058. var stream = FS.getStream(fd)
  3059. if (!stream) {
  3060. throw new FS.ErrnoError(9)
  3061. }
  3062. FS.chown(stream.node, uid, gid)
  3063. },
  3064. truncate: function(path, len) {
  3065. if (len < 0) {
  3066. throw new FS.ErrnoError(22)
  3067. }
  3068. var node
  3069. if (typeof path === 'string') {
  3070. var lookup = FS.lookupPath(path, { follow: true })
  3071. node = lookup.node
  3072. } else {
  3073. node = path
  3074. }
  3075. if (!node.node_ops.setattr) {
  3076. throw new FS.ErrnoError(1)
  3077. }
  3078. if (FS.isDir(node.mode)) {
  3079. throw new FS.ErrnoError(21)
  3080. }
  3081. if (!FS.isFile(node.mode)) {
  3082. throw new FS.ErrnoError(22)
  3083. }
  3084. var err = FS.nodePermissions(node, 'w')
  3085. if (err) {
  3086. throw new FS.ErrnoError(err)
  3087. }
  3088. node.node_ops.setattr(node, { size: len, timestamp: Date.now() })
  3089. },
  3090. ftruncate: function(fd, len) {
  3091. var stream = FS.getStream(fd)
  3092. if (!stream) {
  3093. throw new FS.ErrnoError(9)
  3094. }
  3095. if ((stream.flags & 2097155) === 0) {
  3096. throw new FS.ErrnoError(22)
  3097. }
  3098. FS.truncate(stream.node, len)
  3099. },
  3100. utime: function(path, atime, mtime) {
  3101. var lookup = FS.lookupPath(path, { follow: true })
  3102. var node = lookup.node
  3103. node.node_ops.setattr(node, { timestamp: Math.max(atime, mtime) })
  3104. },
  3105. open: function(path, flags, mode, fd_start, fd_end) {
  3106. if (path === '') {
  3107. throw new FS.ErrnoError(2)
  3108. }
  3109. flags = typeof flags === 'string' ? FS.modeStringToFlags(flags) : flags
  3110. mode = typeof mode === 'undefined' ? 438 : mode
  3111. if (flags & 64) {
  3112. mode = (mode & 4095) | 32768
  3113. } else {
  3114. mode = 0
  3115. }
  3116. var node
  3117. if (typeof path === 'object') {
  3118. node = path
  3119. } else {
  3120. path = PATH.normalize(path)
  3121. try {
  3122. var lookup = FS.lookupPath(path, { follow: !(flags & 131072) })
  3123. node = lookup.node
  3124. } catch (e) {}
  3125. }
  3126. var created = false
  3127. if (flags & 64) {
  3128. if (node) {
  3129. if (flags & 128) {
  3130. throw new FS.ErrnoError(17)
  3131. }
  3132. } else {
  3133. node = FS.mknod(path, mode, 0)
  3134. created = true
  3135. }
  3136. }
  3137. if (!node) {
  3138. throw new FS.ErrnoError(2)
  3139. }
  3140. if (FS.isChrdev(node.mode)) {
  3141. flags &= ~512
  3142. }
  3143. if (flags & 65536 && !FS.isDir(node.mode)) {
  3144. throw new FS.ErrnoError(20)
  3145. }
  3146. if (!created) {
  3147. var err = FS.mayOpen(node, flags)
  3148. if (err) {
  3149. throw new FS.ErrnoError(err)
  3150. }
  3151. }
  3152. if (flags & 512) {
  3153. FS.truncate(node, 0)
  3154. }
  3155. flags &= ~(128 | 512)
  3156. var stream = FS.createStream(
  3157. {
  3158. node: node,
  3159. path: FS.getPath(node),
  3160. flags: flags,
  3161. seekable: true,
  3162. position: 0,
  3163. stream_ops: node.stream_ops,
  3164. ungotten: [],
  3165. error: false
  3166. },
  3167. fd_start,
  3168. fd_end
  3169. )
  3170. if (stream.stream_ops.open) {
  3171. stream.stream_ops.open(stream)
  3172. }
  3173. if (Module['logReadFiles'] && !(flags & 1)) {
  3174. if (!FS.readFiles) FS.readFiles = {}
  3175. if (!(path in FS.readFiles)) {
  3176. FS.readFiles[path] = 1
  3177. console.log('FS.trackingDelegate error on read file: ' + path)
  3178. }
  3179. }
  3180. try {
  3181. if (FS.trackingDelegate['onOpenFile']) {
  3182. var trackingFlags = 0
  3183. if ((flags & 2097155) !== 1) {
  3184. trackingFlags |= FS.tracking.openFlags.READ
  3185. }
  3186. if ((flags & 2097155) !== 0) {
  3187. trackingFlags |= FS.tracking.openFlags.WRITE
  3188. }
  3189. FS.trackingDelegate['onOpenFile'](path, trackingFlags)
  3190. }
  3191. } catch (e) {
  3192. console.log(
  3193. "FS.trackingDelegate['onOpenFile']('" +
  3194. path +
  3195. "', flags) threw an exception: " +
  3196. e.message
  3197. )
  3198. }
  3199. return stream
  3200. },
  3201. close: function(stream) {
  3202. if (FS.isClosed(stream)) {
  3203. throw new FS.ErrnoError(9)
  3204. }
  3205. if (stream.getdents) stream.getdents = null
  3206. try {
  3207. if (stream.stream_ops.close) {
  3208. stream.stream_ops.close(stream)
  3209. }
  3210. } catch (e) {
  3211. throw e
  3212. } finally {
  3213. FS.closeStream(stream.fd)
  3214. }
  3215. stream.fd = null
  3216. },
  3217. isClosed: function(stream) {
  3218. return stream.fd === null
  3219. },
  3220. llseek: function(stream, offset, whence) {
  3221. if (FS.isClosed(stream)) {
  3222. throw new FS.ErrnoError(9)
  3223. }
  3224. if (!stream.seekable || !stream.stream_ops.llseek) {
  3225. throw new FS.ErrnoError(29)
  3226. }
  3227. if (whence != 0 && whence != 1 && whence != 2) {
  3228. throw new FS.ErrnoError(22)
  3229. }
  3230. stream.position = stream.stream_ops.llseek(stream, offset, whence)
  3231. stream.ungotten = []
  3232. return stream.position
  3233. },
  3234. read: function(stream, buffer, offset, length, position) {
  3235. if (length < 0 || position < 0) {
  3236. throw new FS.ErrnoError(22)
  3237. }
  3238. if (FS.isClosed(stream)) {
  3239. throw new FS.ErrnoError(9)
  3240. }
  3241. if ((stream.flags & 2097155) === 1) {
  3242. throw new FS.ErrnoError(9)
  3243. }
  3244. if (FS.isDir(stream.node.mode)) {
  3245. throw new FS.ErrnoError(21)
  3246. }
  3247. if (!stream.stream_ops.read) {
  3248. throw new FS.ErrnoError(22)
  3249. }
  3250. var seeking = typeof position !== 'undefined'
  3251. if (!seeking) {
  3252. position = stream.position
  3253. } else if (!stream.seekable) {
  3254. throw new FS.ErrnoError(29)
  3255. }
  3256. var bytesRead = stream.stream_ops.read(
  3257. stream,
  3258. buffer,
  3259. offset,
  3260. length,
  3261. position
  3262. )
  3263. if (!seeking) stream.position += bytesRead
  3264. return bytesRead
  3265. },
  3266. write: function(stream, buffer, offset, length, position, canOwn) {
  3267. if (length < 0 || position < 0) {
  3268. throw new FS.ErrnoError(22)
  3269. }
  3270. if (FS.isClosed(stream)) {
  3271. throw new FS.ErrnoError(9)
  3272. }
  3273. if ((stream.flags & 2097155) === 0) {
  3274. throw new FS.ErrnoError(9)
  3275. }
  3276. if (FS.isDir(stream.node.mode)) {
  3277. throw new FS.ErrnoError(21)
  3278. }
  3279. if (!stream.stream_ops.write) {
  3280. throw new FS.ErrnoError(22)
  3281. }
  3282. if (stream.flags & 1024) {
  3283. FS.llseek(stream, 0, 2)
  3284. }
  3285. var seeking = typeof position !== 'undefined'
  3286. if (!seeking) {
  3287. position = stream.position
  3288. } else if (!stream.seekable) {
  3289. throw new FS.ErrnoError(29)
  3290. }
  3291. var bytesWritten = stream.stream_ops.write(
  3292. stream,
  3293. buffer,
  3294. offset,
  3295. length,
  3296. position,
  3297. canOwn
  3298. )
  3299. if (!seeking) stream.position += bytesWritten
  3300. try {
  3301. if (stream.path && FS.trackingDelegate['onWriteToFile'])
  3302. FS.trackingDelegate['onWriteToFile'](stream.path)
  3303. } catch (e) {
  3304. console.log(
  3305. "FS.trackingDelegate['onWriteToFile']('" +
  3306. stream.path +
  3307. "') threw an exception: " +
  3308. e.message
  3309. )
  3310. }
  3311. return bytesWritten
  3312. },
  3313. allocate: function(stream, offset, length) {
  3314. if (FS.isClosed(stream)) {
  3315. throw new FS.ErrnoError(9)
  3316. }
  3317. if (offset < 0 || length <= 0) {
  3318. throw new FS.ErrnoError(22)
  3319. }
  3320. if ((stream.flags & 2097155) === 0) {
  3321. throw new FS.ErrnoError(9)
  3322. }
  3323. if (!FS.isFile(stream.node.mode) && !FS.isDir(stream.node.mode)) {
  3324. throw new FS.ErrnoError(19)
  3325. }
  3326. if (!stream.stream_ops.allocate) {
  3327. throw new FS.ErrnoError(95)
  3328. }
  3329. stream.stream_ops.allocate(stream, offset, length)
  3330. },
  3331. mmap: function(stream, buffer, offset, length, position, prot, flags) {
  3332. if (
  3333. (prot & 2) !== 0 &&
  3334. (flags & 2) === 0 &&
  3335. (stream.flags & 2097155) !== 2
  3336. ) {
  3337. throw new FS.ErrnoError(13)
  3338. }
  3339. if ((stream.flags & 2097155) === 1) {
  3340. throw new FS.ErrnoError(13)
  3341. }
  3342. if (!stream.stream_ops.mmap) {
  3343. throw new FS.ErrnoError(19)
  3344. }
  3345. return stream.stream_ops.mmap(
  3346. stream,
  3347. buffer,
  3348. offset,
  3349. length,
  3350. position,
  3351. prot,
  3352. flags
  3353. )
  3354. },
  3355. msync: function(stream, buffer, offset, length, mmapFlags) {
  3356. if (!stream || !stream.stream_ops.msync) {
  3357. return 0
  3358. }
  3359. return stream.stream_ops.msync(stream, buffer, offset, length, mmapFlags)
  3360. },
  3361. munmap: function(stream) {
  3362. return 0
  3363. },
  3364. ioctl: function(stream, cmd, arg) {
  3365. if (!stream.stream_ops.ioctl) {
  3366. throw new FS.ErrnoError(25)
  3367. }
  3368. return stream.stream_ops.ioctl(stream, cmd, arg)
  3369. },
  3370. readFile: function(path, opts) {
  3371. opts = opts || {}
  3372. opts.flags = opts.flags || 'r'
  3373. opts.encoding = opts.encoding || 'binary'
  3374. if (opts.encoding !== 'utf8' && opts.encoding !== 'binary') {
  3375. throw new Error('Invalid encoding type "' + opts.encoding + '"')
  3376. }
  3377. var ret
  3378. var stream = FS.open(path, opts.flags)
  3379. var stat = FS.stat(path)
  3380. var length = stat.size
  3381. var buf = new Uint8Array(length)
  3382. FS.read(stream, buf, 0, length, 0)
  3383. if (opts.encoding === 'utf8') {
  3384. ret = UTF8ArrayToString(buf, 0)
  3385. } else if (opts.encoding === 'binary') {
  3386. ret = buf
  3387. }
  3388. FS.close(stream)
  3389. return ret
  3390. },
  3391. writeFile: function(path, data, opts) {
  3392. opts = opts || {}
  3393. opts.flags = opts.flags || 'w'
  3394. var stream = FS.open(path, opts.flags, opts.mode)
  3395. if (typeof data === 'string') {
  3396. var buf = new Uint8Array(lengthBytesUTF8(data) + 1)
  3397. var actualNumBytes = stringToUTF8Array(data, buf, 0, buf.length)
  3398. FS.write(stream, buf, 0, actualNumBytes, undefined, opts.canOwn)
  3399. } else if (ArrayBuffer.isView(data)) {
  3400. FS.write(stream, data, 0, data.byteLength, undefined, opts.canOwn)
  3401. } else {
  3402. throw new Error('Unsupported data type')
  3403. }
  3404. FS.close(stream)
  3405. },
  3406. cwd: function() {
  3407. return FS.currentPath
  3408. },
  3409. chdir: function(path) {
  3410. var lookup = FS.lookupPath(path, { follow: true })
  3411. if (lookup.node === null) {
  3412. throw new FS.ErrnoError(2)
  3413. }
  3414. if (!FS.isDir(lookup.node.mode)) {
  3415. throw new FS.ErrnoError(20)
  3416. }
  3417. var err = FS.nodePermissions(lookup.node, 'x')
  3418. if (err) {
  3419. throw new FS.ErrnoError(err)
  3420. }
  3421. FS.currentPath = lookup.path
  3422. },
  3423. createDefaultDirectories: function() {
  3424. FS.mkdir('/tmp')
  3425. FS.mkdir('/home')
  3426. FS.mkdir('/home/web_user')
  3427. },
  3428. createDefaultDevices: function() {
  3429. FS.mkdir('/dev')
  3430. FS.registerDevice(FS.makedev(1, 3), {
  3431. read: function() {
  3432. return 0
  3433. },
  3434. write: function(stream, buffer, offset, length, pos) {
  3435. return length
  3436. }
  3437. })
  3438. FS.mkdev('/dev/null', FS.makedev(1, 3))
  3439. TTY.register(FS.makedev(5, 0), TTY.default_tty_ops)
  3440. TTY.register(FS.makedev(6, 0), TTY.default_tty1_ops)
  3441. FS.mkdev('/dev/tty', FS.makedev(5, 0))
  3442. FS.mkdev('/dev/tty1', FS.makedev(6, 0))
  3443. var random_device
  3444. if (
  3445. typeof crypto === 'object' &&
  3446. typeof crypto['getRandomValues'] === 'function'
  3447. ) {
  3448. var randomBuffer = new Uint8Array(1)
  3449. random_device = function() {
  3450. crypto.getRandomValues(randomBuffer)
  3451. return randomBuffer[0]
  3452. }
  3453. } else if (ENVIRONMENT_IS_NODE) {
  3454. try {
  3455. var crypto_module = require('crypto')
  3456. random_device = function() {
  3457. return crypto_module['randomBytes'](1)[0]
  3458. }
  3459. } catch (e) {}
  3460. } else {
  3461. }
  3462. if (!random_device) {
  3463. random_device = function() {
  3464. abort('random_device')
  3465. }
  3466. }
  3467. FS.createDevice('/dev', 'random', random_device)
  3468. FS.createDevice('/dev', 'urandom', random_device)
  3469. FS.mkdir('/dev/shm')
  3470. FS.mkdir('/dev/shm/tmp')
  3471. },
  3472. createSpecialDirectories: function() {
  3473. FS.mkdir('/proc')
  3474. FS.mkdir('/proc/self')
  3475. FS.mkdir('/proc/self/fd')
  3476. FS.mount(
  3477. {
  3478. mount: function() {
  3479. var node = FS.createNode('/proc/self', 'fd', 16384 | 511, 73)
  3480. node.node_ops = {
  3481. lookup: function(parent, name) {
  3482. var fd = +name
  3483. var stream = FS.getStream(fd)
  3484. if (!stream) throw new FS.ErrnoError(9)
  3485. var ret = {
  3486. parent: null,
  3487. mount: { mountpoint: 'fake' },
  3488. node_ops: {
  3489. readlink: function() {
  3490. return stream.path
  3491. }
  3492. }
  3493. }
  3494. ret.parent = ret
  3495. return ret
  3496. }
  3497. }
  3498. return node
  3499. }
  3500. },
  3501. {},
  3502. '/proc/self/fd'
  3503. )
  3504. },
  3505. createStandardStreams: function() {
  3506. if (Module['stdin']) {
  3507. FS.createDevice('/dev', 'stdin', Module['stdin'])
  3508. } else {
  3509. FS.symlink('/dev/tty', '/dev/stdin')
  3510. }
  3511. if (Module['stdout']) {
  3512. FS.createDevice('/dev', 'stdout', null, Module['stdout'])
  3513. } else {
  3514. FS.symlink('/dev/tty', '/dev/stdout')
  3515. }
  3516. if (Module['stderr']) {
  3517. FS.createDevice('/dev', 'stderr', null, Module['stderr'])
  3518. } else {
  3519. FS.symlink('/dev/tty1', '/dev/stderr')
  3520. }
  3521. var stdin = FS.open('/dev/stdin', 'r')
  3522. var stdout = FS.open('/dev/stdout', 'w')
  3523. var stderr = FS.open('/dev/stderr', 'w')
  3524. },
  3525. ensureErrnoError: function() {
  3526. if (FS.ErrnoError) return
  3527. FS.ErrnoError = function ErrnoError(errno, node) {
  3528. this.node = node
  3529. this.setErrno = function(errno) {
  3530. this.errno = errno
  3531. }
  3532. this.setErrno(errno)
  3533. this.message = 'FS error'
  3534. }
  3535. FS.ErrnoError.prototype = new Error()
  3536. FS.ErrnoError.prototype.constructor = FS.ErrnoError
  3537. ;[2].forEach(function(code) {
  3538. FS.genericErrors[code] = new FS.ErrnoError(code)
  3539. FS.genericErrors[code].stack = '<generic error, no stack>'
  3540. })
  3541. },
  3542. staticInit: function() {
  3543. FS.ensureErrnoError()
  3544. FS.nameTable = new Array(4096)
  3545. FS.mount(MEMFS, {}, '/')
  3546. FS.createDefaultDirectories()
  3547. FS.createDefaultDevices()
  3548. FS.createSpecialDirectories()
  3549. FS.filesystems = {
  3550. MEMFS: MEMFS,
  3551. IDBFS: IDBFS,
  3552. NODEFS: NODEFS,
  3553. WORKERFS: WORKERFS
  3554. }
  3555. },
  3556. init: function(input, output, error) {
  3557. FS.init.initialized = true
  3558. FS.ensureErrnoError()
  3559. Module['stdin'] = input || Module['stdin']
  3560. Module['stdout'] = output || Module['stdout']
  3561. Module['stderr'] = error || Module['stderr']
  3562. FS.createStandardStreams()
  3563. },
  3564. quit: function() {
  3565. FS.init.initialized = false
  3566. var fflush = Module['_fflush']
  3567. if (fflush) fflush(0)
  3568. for (var i = 0; i < FS.streams.length; i++) {
  3569. var stream = FS.streams[i]
  3570. if (!stream) {
  3571. continue
  3572. }
  3573. FS.close(stream)
  3574. }
  3575. },
  3576. getMode: function(canRead, canWrite) {
  3577. var mode = 0
  3578. if (canRead) mode |= 292 | 73
  3579. if (canWrite) mode |= 146
  3580. return mode
  3581. },
  3582. joinPath: function(parts, forceRelative) {
  3583. var path = PATH.join.apply(null, parts)
  3584. if (forceRelative && path[0] == '/') path = path.substr(1)
  3585. return path
  3586. },
  3587. absolutePath: function(relative, base) {
  3588. return PATH_FS.resolve(base, relative)
  3589. },
  3590. standardizePath: function(path) {
  3591. return PATH.normalize(path)
  3592. },
  3593. findObject: function(path, dontResolveLastLink) {
  3594. var ret = FS.analyzePath(path, dontResolveLastLink)
  3595. if (ret.exists) {
  3596. return ret.object
  3597. } else {
  3598. ___setErrNo(ret.error)
  3599. return null
  3600. }
  3601. },
  3602. analyzePath: function(path, dontResolveLastLink) {
  3603. try {
  3604. var lookup = FS.lookupPath(path, { follow: !dontResolveLastLink })
  3605. path = lookup.path
  3606. } catch (e) {}
  3607. var ret = {
  3608. isRoot: false,
  3609. exists: false,
  3610. error: 0,
  3611. name: null,
  3612. path: null,
  3613. object: null,
  3614. parentExists: false,
  3615. parentPath: null,
  3616. parentObject: null
  3617. }
  3618. try {
  3619. var lookup = FS.lookupPath(path, { parent: true })
  3620. ret.parentExists = true
  3621. ret.parentPath = lookup.path
  3622. ret.parentObject = lookup.node
  3623. ret.name = PATH.basename(path)
  3624. lookup = FS.lookupPath(path, { follow: !dontResolveLastLink })
  3625. ret.exists = true
  3626. ret.path = lookup.path
  3627. ret.object = lookup.node
  3628. ret.name = lookup.node.name
  3629. ret.isRoot = lookup.path === '/'
  3630. } catch (e) {
  3631. ret.error = e.errno
  3632. }
  3633. return ret
  3634. },
  3635. createFolder: function(parent, name, canRead, canWrite) {
  3636. var path = PATH.join2(
  3637. typeof parent === 'string' ? parent : FS.getPath(parent),
  3638. name
  3639. )
  3640. var mode = FS.getMode(canRead, canWrite)
  3641. return FS.mkdir(path, mode)
  3642. },
  3643. createPath: function(parent, path, canRead, canWrite) {
  3644. parent = typeof parent === 'string' ? parent : FS.getPath(parent)
  3645. var parts = path.split('/').reverse()
  3646. while (parts.length) {
  3647. var part = parts.pop()
  3648. if (!part) continue
  3649. var current = PATH.join2(parent, part)
  3650. try {
  3651. FS.mkdir(current)
  3652. } catch (e) {}
  3653. parent = current
  3654. }
  3655. return current
  3656. },
  3657. createFile: function(parent, name, properties, canRead, canWrite) {
  3658. var path = PATH.join2(
  3659. typeof parent === 'string' ? parent : FS.getPath(parent),
  3660. name
  3661. )
  3662. var mode = FS.getMode(canRead, canWrite)
  3663. return FS.create(path, mode)
  3664. },
  3665. createDataFile: function(parent, name, data, canRead, canWrite, canOwn) {
  3666. var path = name
  3667. ? PATH.join2(
  3668. typeof parent === 'string' ? parent : FS.getPath(parent),
  3669. name
  3670. )
  3671. : parent
  3672. var mode = FS.getMode(canRead, canWrite)
  3673. var node = FS.create(path, mode)
  3674. if (data) {
  3675. if (typeof data === 'string') {
  3676. var arr = new Array(data.length)
  3677. for (var i = 0, len = data.length; i < len; ++i)
  3678. arr[i] = data.charCodeAt(i)
  3679. data = arr
  3680. }
  3681. FS.chmod(node, mode | 146)
  3682. var stream = FS.open(node, 'w')
  3683. FS.write(stream, data, 0, data.length, 0, canOwn)
  3684. FS.close(stream)
  3685. FS.chmod(node, mode)
  3686. }
  3687. return node
  3688. },
  3689. createDevice: function(parent, name, input, output) {
  3690. var path = PATH.join2(
  3691. typeof parent === 'string' ? parent : FS.getPath(parent),
  3692. name
  3693. )
  3694. var mode = FS.getMode(!!input, !!output)
  3695. if (!FS.createDevice.major) FS.createDevice.major = 64
  3696. var dev = FS.makedev(FS.createDevice.major++, 0)
  3697. FS.registerDevice(dev, {
  3698. open: function(stream) {
  3699. stream.seekable = false
  3700. },
  3701. close: function(stream) {
  3702. if (output && output.buffer && output.buffer.length) {
  3703. output(10)
  3704. }
  3705. },
  3706. read: function(stream, buffer, offset, length, pos) {
  3707. var bytesRead = 0
  3708. for (var i = 0; i < length; i++) {
  3709. var result
  3710. try {
  3711. result = input()
  3712. } catch (e) {
  3713. throw new FS.ErrnoError(5)
  3714. }
  3715. if (result === undefined && bytesRead === 0) {
  3716. throw new FS.ErrnoError(11)
  3717. }
  3718. if (result === null || result === undefined) break
  3719. bytesRead++
  3720. buffer[offset + i] = result
  3721. }
  3722. if (bytesRead) {
  3723. stream.node.timestamp = Date.now()
  3724. }
  3725. return bytesRead
  3726. },
  3727. write: function(stream, buffer, offset, length, pos) {
  3728. for (var i = 0; i < length; i++) {
  3729. try {
  3730. output(buffer[offset + i])
  3731. } catch (e) {
  3732. throw new FS.ErrnoError(5)
  3733. }
  3734. }
  3735. if (length) {
  3736. stream.node.timestamp = Date.now()
  3737. }
  3738. return i
  3739. }
  3740. })
  3741. return FS.mkdev(path, mode, dev)
  3742. },
  3743. createLink: function(parent, name, target, canRead, canWrite) {
  3744. var path = PATH.join2(
  3745. typeof parent === 'string' ? parent : FS.getPath(parent),
  3746. name
  3747. )
  3748. return FS.symlink(target, path)
  3749. },
  3750. forceLoadFile: function(obj) {
  3751. if (obj.isDevice || obj.isFolder || obj.link || obj.contents) return true
  3752. var success = true
  3753. if (typeof XMLHttpRequest !== 'undefined') {
  3754. throw new Error(
  3755. 'Lazy loading should have been performed (contents set) in createLazyFile, but it was not. Lazy loading only works in web workers. Use --embed-file or --preload-file in emcc on the main thread.'
  3756. )
  3757. } else if (read_) {
  3758. try {
  3759. obj.contents = intArrayFromString(read_(obj.url), true)
  3760. obj.usedBytes = obj.contents.length
  3761. } catch (e) {
  3762. success = false
  3763. }
  3764. } else {
  3765. throw new Error('Cannot load without read() or XMLHttpRequest.')
  3766. }
  3767. if (!success) ___setErrNo(5)
  3768. return success
  3769. },
  3770. createLazyFile: function(parent, name, url, canRead, canWrite) {
  3771. function LazyUint8Array() {
  3772. this.lengthKnown = false
  3773. this.chunks = []
  3774. }
  3775. LazyUint8Array.prototype.get = function LazyUint8Array_get(idx) {
  3776. if (idx > this.length - 1 || idx < 0) {
  3777. return undefined
  3778. }
  3779. var chunkOffset = idx % this.chunkSize
  3780. var chunkNum = (idx / this.chunkSize) | 0
  3781. return this.getter(chunkNum)[chunkOffset]
  3782. }
  3783. LazyUint8Array.prototype.setDataGetter = function LazyUint8Array_setDataGetter(
  3784. getter
  3785. ) {
  3786. this.getter = getter
  3787. }
  3788. LazyUint8Array.prototype.cacheLength = function LazyUint8Array_cacheLength() {
  3789. var xhr = new XMLHttpRequest()
  3790. xhr.open('HEAD', url, false)
  3791. xhr.send(null)
  3792. if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
  3793. throw new Error("Couldn't load " + url + '. Status: ' + xhr.status)
  3794. var datalength = Number(xhr.getResponseHeader('Content-length'))
  3795. var header
  3796. var hasByteServing =
  3797. (header = xhr.getResponseHeader('Accept-Ranges')) && header === 'bytes'
  3798. var usesGzip =
  3799. (header = xhr.getResponseHeader('Content-Encoding')) &&
  3800. header === 'gzip'
  3801. var chunkSize = 1024 * 1024
  3802. if (!hasByteServing) chunkSize = datalength
  3803. var doXHR = function(from, to) {
  3804. if (from > to)
  3805. throw new Error(
  3806. 'invalid range (' + from + ', ' + to + ') or no bytes requested!'
  3807. )
  3808. if (to > datalength - 1)
  3809. throw new Error(
  3810. 'only ' + datalength + ' bytes available! programmer error!'
  3811. )
  3812. var xhr = new XMLHttpRequest()
  3813. xhr.open('GET', url, false)
  3814. if (datalength !== chunkSize)
  3815. xhr.setRequestHeader('Range', 'bytes=' + from + '-' + to)
  3816. if (typeof Uint8Array != 'undefined') xhr.responseType = 'arraybuffer'
  3817. if (xhr.overrideMimeType) {
  3818. xhr.overrideMimeType('text/plain; charset=x-user-defined')
  3819. }
  3820. xhr.send(null)
  3821. if (!((xhr.status >= 200 && xhr.status < 300) || xhr.status === 304))
  3822. throw new Error("Couldn't load " + url + '. Status: ' + xhr.status)
  3823. if (xhr.response !== undefined) {
  3824. return new Uint8Array(xhr.response || [])
  3825. } else {
  3826. return intArrayFromString(xhr.responseText || '', true)
  3827. }
  3828. }
  3829. var lazyArray = this
  3830. lazyArray.setDataGetter(function(chunkNum) {
  3831. var start = chunkNum * chunkSize
  3832. var end = (chunkNum + 1) * chunkSize - 1
  3833. end = Math.min(end, datalength - 1)
  3834. if (typeof lazyArray.chunks[chunkNum] === 'undefined') {
  3835. lazyArray.chunks[chunkNum] = doXHR(start, end)
  3836. }
  3837. if (typeof lazyArray.chunks[chunkNum] === 'undefined')
  3838. throw new Error('doXHR failed!')
  3839. return lazyArray.chunks[chunkNum]
  3840. })
  3841. if (usesGzip || !datalength) {
  3842. chunkSize = datalength = 1
  3843. datalength = this.getter(0).length
  3844. chunkSize = datalength
  3845. console.log(
  3846. 'LazyFiles on gzip forces download of the whole file when length is accessed'
  3847. )
  3848. }
  3849. this._length = datalength
  3850. this._chunkSize = chunkSize
  3851. this.lengthKnown = true
  3852. }
  3853. if (typeof XMLHttpRequest !== 'undefined') {
  3854. if (!ENVIRONMENT_IS_WORKER)
  3855. throw 'Cannot do synchronous binary XHRs outside webworkers in modern browsers. Use --embed-file or --preload-file in emcc'
  3856. var lazyArray = new LazyUint8Array()
  3857. Object.defineProperties(lazyArray, {
  3858. length: {
  3859. get: function() {
  3860. if (!this.lengthKnown) {
  3861. this.cacheLength()
  3862. }
  3863. return this._length
  3864. }
  3865. },
  3866. chunkSize: {
  3867. get: function() {
  3868. if (!this.lengthKnown) {
  3869. this.cacheLength()
  3870. }
  3871. return this._chunkSize
  3872. }
  3873. }
  3874. })
  3875. var properties = { isDevice: false, contents: lazyArray }
  3876. } else {
  3877. var properties = { isDevice: false, url: url }
  3878. }
  3879. var node = FS.createFile(parent, name, properties, canRead, canWrite)
  3880. if (properties.contents) {
  3881. node.contents = properties.contents
  3882. } else if (properties.url) {
  3883. node.contents = null
  3884. node.url = properties.url
  3885. }
  3886. Object.defineProperties(node, {
  3887. usedBytes: {
  3888. get: function() {
  3889. return this.contents.length
  3890. }
  3891. }
  3892. })
  3893. var stream_ops = {}
  3894. var keys = Object.keys(node.stream_ops)
  3895. keys.forEach(function(key) {
  3896. var fn = node.stream_ops[key]
  3897. stream_ops[key] = function forceLoadLazyFile() {
  3898. if (!FS.forceLoadFile(node)) {
  3899. throw new FS.ErrnoError(5)
  3900. }
  3901. return fn.apply(null, arguments)
  3902. }
  3903. })
  3904. stream_ops.read = function stream_ops_read(
  3905. stream,
  3906. buffer,
  3907. offset,
  3908. length,
  3909. position
  3910. ) {
  3911. if (!FS.forceLoadFile(node)) {
  3912. throw new FS.ErrnoError(5)
  3913. }
  3914. var contents = stream.node.contents
  3915. if (position >= contents.length) return 0
  3916. var size = Math.min(contents.length - position, length)
  3917. if (contents.slice) {
  3918. for (var i = 0; i < size; i++) {
  3919. buffer[offset + i] = contents[position + i]
  3920. }
  3921. } else {
  3922. for (var i = 0; i < size; i++) {
  3923. buffer[offset + i] = contents.get(position + i)
  3924. }
  3925. }
  3926. return size
  3927. }
  3928. node.stream_ops = stream_ops
  3929. return node
  3930. },
  3931. createPreloadedFile: function(
  3932. parent,
  3933. name,
  3934. url,
  3935. canRead,
  3936. canWrite,
  3937. onload,
  3938. onerror,
  3939. dontCreateFile,
  3940. canOwn,
  3941. preFinish
  3942. ) {
  3943. Browser.init()
  3944. var fullname = name ? PATH_FS.resolve(PATH.join2(parent, name)) : parent
  3945. var dep = getUniqueRunDependency('cp ' + fullname)
  3946. function processData(byteArray) {
  3947. function finish(byteArray) {
  3948. if (preFinish) preFinish()
  3949. if (!dontCreateFile) {
  3950. FS.createDataFile(parent, name, byteArray, canRead, canWrite, canOwn)
  3951. }
  3952. if (onload) onload()
  3953. removeRunDependency(dep)
  3954. }
  3955. var handled = false
  3956. Module['preloadPlugins'].forEach(function(plugin) {
  3957. if (handled) return
  3958. if (plugin['canHandle'](fullname)) {
  3959. plugin['handle'](byteArray, fullname, finish, function() {
  3960. if (onerror) onerror()
  3961. removeRunDependency(dep)
  3962. })
  3963. handled = true
  3964. }
  3965. })
  3966. if (!handled) finish(byteArray)
  3967. }
  3968. addRunDependency(dep)
  3969. if (typeof url == 'string') {
  3970. Browser.asyncLoad(
  3971. url,
  3972. function(byteArray) {
  3973. processData(byteArray)
  3974. },
  3975. onerror
  3976. )
  3977. } else {
  3978. processData(url)
  3979. }
  3980. },
  3981. indexedDB: function() {
  3982. return (
  3983. window.indexedDB ||
  3984. window.mozIndexedDB ||
  3985. window.webkitIndexedDB ||
  3986. window.msIndexedDB
  3987. )
  3988. },
  3989. DB_NAME: function() {
  3990. return 'EM_FS_' + window.location.pathname
  3991. },
  3992. DB_VERSION: 20,
  3993. DB_STORE_NAME: 'FILE_DATA',
  3994. saveFilesToDB: function(paths, onload, onerror) {
  3995. onload = onload || function() {}
  3996. onerror = onerror || function() {}
  3997. var indexedDB = FS.indexedDB()
  3998. try {
  3999. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4000. } catch (e) {
  4001. return onerror(e)
  4002. }
  4003. openRequest.onupgradeneeded = function openRequest_onupgradeneeded() {
  4004. console.log('creating db')
  4005. var db = openRequest.result
  4006. db.createObjectStore(FS.DB_STORE_NAME)
  4007. }
  4008. openRequest.onsuccess = function openRequest_onsuccess() {
  4009. var db = openRequest.result
  4010. var transaction = db.transaction([FS.DB_STORE_NAME], 'readwrite')
  4011. var files = transaction.objectStore(FS.DB_STORE_NAME)
  4012. var ok = 0,
  4013. fail = 0,
  4014. total = paths.length
  4015. function finish() {
  4016. if (fail == 0) onload()
  4017. else onerror()
  4018. }
  4019. paths.forEach(function(path) {
  4020. var putRequest = files.put(FS.analyzePath(path).object.contents, path)
  4021. putRequest.onsuccess = function putRequest_onsuccess() {
  4022. ok++
  4023. if (ok + fail == total) finish()
  4024. }
  4025. putRequest.onerror = function putRequest_onerror() {
  4026. fail++
  4027. if (ok + fail == total) finish()
  4028. }
  4029. })
  4030. transaction.onerror = onerror
  4031. }
  4032. openRequest.onerror = onerror
  4033. },
  4034. loadFilesFromDB: function(paths, onload, onerror) {
  4035. onload = onload || function() {}
  4036. onerror = onerror || function() {}
  4037. var indexedDB = FS.indexedDB()
  4038. try {
  4039. var openRequest = indexedDB.open(FS.DB_NAME(), FS.DB_VERSION)
  4040. } catch (e) {
  4041. return onerror(e)
  4042. }
  4043. openRequest.onupgradeneeded = onerror
  4044. openRequest.onsuccess = function openRequest_onsuccess() {
  4045. var db = openRequest.result
  4046. try {
  4047. var transaction = db.transaction([FS.DB_STORE_NAME], 'readonly')
  4048. } catch (e) {
  4049. onerror(e)
  4050. return
  4051. }
  4052. var files = transaction.objectStore(FS.DB_STORE_NAME)
  4053. var ok = 0,
  4054. fail = 0,
  4055. total = paths.length
  4056. function finish() {
  4057. if (fail == 0) onload()
  4058. else onerror()
  4059. }
  4060. paths.forEach(function(path) {
  4061. var getRequest = files.get(path)
  4062. getRequest.onsuccess = function getRequest_onsuccess() {
  4063. if (FS.analyzePath(path).exists) {
  4064. FS.unlink(path)
  4065. }
  4066. FS.createDataFile(
  4067. PATH.dirname(path),
  4068. PATH.basename(path),
  4069. getRequest.result,
  4070. true,
  4071. true,
  4072. true
  4073. )
  4074. ok++
  4075. if (ok + fail == total) finish()
  4076. }
  4077. getRequest.onerror = function getRequest_onerror() {
  4078. fail++
  4079. if (ok + fail == total) finish()
  4080. }
  4081. })
  4082. transaction.onerror = onerror
  4083. }
  4084. openRequest.onerror = onerror
  4085. }
  4086. }
  4087. var SYSCALLS = {
  4088. DEFAULT_POLLMASK: 5,
  4089. mappings: {},
  4090. umask: 511,
  4091. calculateAt: function(dirfd, path) {
  4092. if (path[0] !== '/') {
  4093. var dir
  4094. if (dirfd === -100) {
  4095. dir = FS.cwd()
  4096. } else {
  4097. var dirstream = FS.getStream(dirfd)
  4098. if (!dirstream) throw new FS.ErrnoError(9)
  4099. dir = dirstream.path
  4100. }
  4101. path = PATH.join2(dir, path)
  4102. }
  4103. return path
  4104. },
  4105. doStat: function(func, path, buf) {
  4106. try {
  4107. var stat = func(path)
  4108. } catch (e) {
  4109. if (
  4110. e &&
  4111. e.node &&
  4112. PATH.normalize(path) !== PATH.normalize(FS.getPath(e.node))
  4113. ) {
  4114. return -20
  4115. }
  4116. throw e
  4117. }
  4118. HEAP32[buf >> 2] = stat.dev
  4119. HEAP32[(buf + 4) >> 2] = 0
  4120. HEAP32[(buf + 8) >> 2] = stat.ino
  4121. HEAP32[(buf + 12) >> 2] = stat.mode
  4122. HEAP32[(buf + 16) >> 2] = stat.nlink
  4123. HEAP32[(buf + 20) >> 2] = stat.uid
  4124. HEAP32[(buf + 24) >> 2] = stat.gid
  4125. HEAP32[(buf + 28) >> 2] = stat.rdev
  4126. HEAP32[(buf + 32) >> 2] = 0
  4127. ;(tempI64 = [
  4128. stat.size >>> 0,
  4129. ((tempDouble = stat.size),
  4130. +Math_abs(tempDouble) >= 1
  4131. ? tempDouble > 0
  4132. ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
  4133. 0
  4134. : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
  4135. 0
  4136. : 0)
  4137. ]),
  4138. (HEAP32[(buf + 40) >> 2] = tempI64[0]),
  4139. (HEAP32[(buf + 44) >> 2] = tempI64[1])
  4140. HEAP32[(buf + 48) >> 2] = 4096
  4141. HEAP32[(buf + 52) >> 2] = stat.blocks
  4142. HEAP32[(buf + 56) >> 2] = (stat.atime.getTime() / 1e3) | 0
  4143. HEAP32[(buf + 60) >> 2] = 0
  4144. HEAP32[(buf + 64) >> 2] = (stat.mtime.getTime() / 1e3) | 0
  4145. HEAP32[(buf + 68) >> 2] = 0
  4146. HEAP32[(buf + 72) >> 2] = (stat.ctime.getTime() / 1e3) | 0
  4147. HEAP32[(buf + 76) >> 2] = 0
  4148. ;(tempI64 = [
  4149. stat.ino >>> 0,
  4150. ((tempDouble = stat.ino),
  4151. +Math_abs(tempDouble) >= 1
  4152. ? tempDouble > 0
  4153. ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
  4154. 0
  4155. : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
  4156. 0
  4157. : 0)
  4158. ]),
  4159. (HEAP32[(buf + 80) >> 2] = tempI64[0]),
  4160. (HEAP32[(buf + 84) >> 2] = tempI64[1])
  4161. return 0
  4162. },
  4163. doMsync: function(addr, stream, len, flags) {
  4164. var buffer = new Uint8Array(HEAPU8.subarray(addr, addr + len))
  4165. FS.msync(stream, buffer, 0, len, flags)
  4166. },
  4167. doMkdir: function(path, mode) {
  4168. path = PATH.normalize(path)
  4169. if (path[path.length - 1] === '/') path = path.substr(0, path.length - 1)
  4170. FS.mkdir(path, mode, 0)
  4171. return 0
  4172. },
  4173. doMknod: function(path, mode, dev) {
  4174. switch (mode & 61440) {
  4175. case 32768:
  4176. case 8192:
  4177. case 24576:
  4178. case 4096:
  4179. case 49152:
  4180. break
  4181. default:
  4182. return -22
  4183. }
  4184. FS.mknod(path, mode, dev)
  4185. return 0
  4186. },
  4187. doReadlink: function(path, buf, bufsize) {
  4188. if (bufsize <= 0) return -22
  4189. var ret = FS.readlink(path)
  4190. var len = Math.min(bufsize, lengthBytesUTF8(ret))
  4191. var endChar = HEAP8[buf + len]
  4192. stringToUTF8(ret, buf, bufsize + 1)
  4193. HEAP8[buf + len] = endChar
  4194. return len
  4195. },
  4196. doAccess: function(path, amode) {
  4197. if (amode & ~7) {
  4198. return -22
  4199. }
  4200. var node
  4201. var lookup = FS.lookupPath(path, { follow: true })
  4202. node = lookup.node
  4203. if (!node) {
  4204. return -2
  4205. }
  4206. var perms = ''
  4207. if (amode & 4) perms += 'r'
  4208. if (amode & 2) perms += 'w'
  4209. if (amode & 1) perms += 'x'
  4210. if (perms && FS.nodePermissions(node, perms)) {
  4211. return -13
  4212. }
  4213. return 0
  4214. },
  4215. doDup: function(path, flags, suggestFD) {
  4216. var suggest = FS.getStream(suggestFD)
  4217. if (suggest) FS.close(suggest)
  4218. return FS.open(path, flags, 0, suggestFD, suggestFD).fd
  4219. },
  4220. doReadv: function(stream, iov, iovcnt, offset) {
  4221. var ret = 0
  4222. for (var i = 0; i < iovcnt; i++) {
  4223. var ptr = HEAP32[(iov + i * 8) >> 2]
  4224. var len = HEAP32[(iov + (i * 8 + 4)) >> 2]
  4225. var curr = FS.read(stream, HEAP8, ptr, len, offset)
  4226. if (curr < 0) return -1
  4227. ret += curr
  4228. if (curr < len) break
  4229. }
  4230. return ret
  4231. },
  4232. doWritev: function(stream, iov, iovcnt, offset) {
  4233. var ret = 0
  4234. for (var i = 0; i < iovcnt; i++) {
  4235. var ptr = HEAP32[(iov + i * 8) >> 2]
  4236. var len = HEAP32[(iov + (i * 8 + 4)) >> 2]
  4237. var curr = FS.write(stream, HEAP8, ptr, len, offset)
  4238. if (curr < 0) return -1
  4239. ret += curr
  4240. }
  4241. return ret
  4242. },
  4243. varargs: 0,
  4244. get: function(varargs) {
  4245. SYSCALLS.varargs += 4
  4246. var ret = HEAP32[(SYSCALLS.varargs - 4) >> 2]
  4247. return ret
  4248. },
  4249. getStr: function() {
  4250. var ret = UTF8ToString(SYSCALLS.get())
  4251. return ret
  4252. },
  4253. getStreamFromFD: function() {
  4254. var stream = FS.getStream(SYSCALLS.get())
  4255. if (!stream) throw new FS.ErrnoError(9)
  4256. return stream
  4257. },
  4258. get64: function() {
  4259. var low = SYSCALLS.get(),
  4260. high = SYSCALLS.get()
  4261. return low
  4262. },
  4263. getZero: function() {
  4264. SYSCALLS.get()
  4265. }
  4266. }
  4267. function ___syscall140(which, varargs) {
  4268. SYSCALLS.varargs = varargs
  4269. try {
  4270. var stream = SYSCALLS.getStreamFromFD(),
  4271. offset_high = SYSCALLS.get(),
  4272. offset_low = SYSCALLS.get(),
  4273. result = SYSCALLS.get(),
  4274. whence = SYSCALLS.get()
  4275. var HIGH_OFFSET = 4294967296
  4276. var offset = offset_high * HIGH_OFFSET + (offset_low >>> 0)
  4277. var DOUBLE_LIMIT = 9007199254740992
  4278. if (offset <= -DOUBLE_LIMIT || offset >= DOUBLE_LIMIT) {
  4279. return -75
  4280. }
  4281. FS.llseek(stream, offset, whence)
  4282. ;(tempI64 = [
  4283. stream.position >>> 0,
  4284. ((tempDouble = stream.position),
  4285. +Math_abs(tempDouble) >= 1
  4286. ? tempDouble > 0
  4287. ? (Math_min(+Math_floor(tempDouble / 4294967296), 4294967295) | 0) >>>
  4288. 0
  4289. : ~~+Math_ceil((tempDouble - +(~~tempDouble >>> 0)) / 4294967296) >>>
  4290. 0
  4291. : 0)
  4292. ]),
  4293. (HEAP32[result >> 2] = tempI64[0]),
  4294. (HEAP32[(result + 4) >> 2] = tempI64[1])
  4295. if (stream.getdents && offset === 0 && whence === 0) stream.getdents = null
  4296. return 0
  4297. } catch (e) {
  4298. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4299. return -e.errno
  4300. }
  4301. }
  4302. function ___syscall221(which, varargs) {
  4303. SYSCALLS.varargs = varargs
  4304. try {
  4305. var stream = SYSCALLS.getStreamFromFD(),
  4306. cmd = SYSCALLS.get()
  4307. switch (cmd) {
  4308. case 0: {
  4309. var arg = SYSCALLS.get()
  4310. if (arg < 0) {
  4311. return -22
  4312. }
  4313. var newStream
  4314. newStream = FS.open(stream.path, stream.flags, 0, arg)
  4315. return newStream.fd
  4316. }
  4317. case 1:
  4318. case 2:
  4319. return 0
  4320. case 3:
  4321. return stream.flags
  4322. case 4: {
  4323. var arg = SYSCALLS.get()
  4324. stream.flags |= arg
  4325. return 0
  4326. }
  4327. case 12: {
  4328. var arg = SYSCALLS.get()
  4329. var offset = 0
  4330. HEAP16[(arg + offset) >> 1] = 2
  4331. return 0
  4332. }
  4333. case 13:
  4334. case 14:
  4335. return 0
  4336. case 16:
  4337. case 8:
  4338. return -22
  4339. case 9:
  4340. ___setErrNo(22)
  4341. return -1
  4342. default: {
  4343. return -22
  4344. }
  4345. }
  4346. } catch (e) {
  4347. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4348. return -e.errno
  4349. }
  4350. }
  4351. function ___syscall3(which, varargs) {
  4352. SYSCALLS.varargs = varargs
  4353. try {
  4354. var stream = SYSCALLS.getStreamFromFD(),
  4355. buf = SYSCALLS.get(),
  4356. count = SYSCALLS.get()
  4357. return FS.read(stream, HEAP8, buf, count)
  4358. } catch (e) {
  4359. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4360. return -e.errno
  4361. }
  4362. }
  4363. function ___syscall5(which, varargs) {
  4364. SYSCALLS.varargs = varargs
  4365. try {
  4366. var pathname = SYSCALLS.getStr(),
  4367. flags = SYSCALLS.get(),
  4368. mode = SYSCALLS.get()
  4369. var stream = FS.open(pathname, flags, mode)
  4370. return stream.fd
  4371. } catch (e) {
  4372. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4373. return -e.errno
  4374. }
  4375. }
  4376. function ___syscall54(which, varargs) {
  4377. SYSCALLS.varargs = varargs
  4378. try {
  4379. var stream = SYSCALLS.getStreamFromFD(),
  4380. op = SYSCALLS.get()
  4381. switch (op) {
  4382. case 21509:
  4383. case 21505: {
  4384. if (!stream.tty) return -25
  4385. return 0
  4386. }
  4387. case 21510:
  4388. case 21511:
  4389. case 21512:
  4390. case 21506:
  4391. case 21507:
  4392. case 21508: {
  4393. if (!stream.tty) return -25
  4394. return 0
  4395. }
  4396. case 21519: {
  4397. if (!stream.tty) return -25
  4398. var argp = SYSCALLS.get()
  4399. HEAP32[argp >> 2] = 0
  4400. return 0
  4401. }
  4402. case 21520: {
  4403. if (!stream.tty) return -25
  4404. return -22
  4405. }
  4406. case 21531: {
  4407. var argp = SYSCALLS.get()
  4408. return FS.ioctl(stream, op, argp)
  4409. }
  4410. case 21523: {
  4411. if (!stream.tty) return -25
  4412. return 0
  4413. }
  4414. case 21524: {
  4415. if (!stream.tty) return -25
  4416. return 0
  4417. }
  4418. default:
  4419. abort('bad ioctl syscall ' + op)
  4420. }
  4421. } catch (e) {
  4422. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4423. return -e.errno
  4424. }
  4425. }
  4426. function ___syscall6(which, varargs) {
  4427. SYSCALLS.varargs = varargs
  4428. try {
  4429. var stream = SYSCALLS.getStreamFromFD()
  4430. FS.close(stream)
  4431. return 0
  4432. } catch (e) {
  4433. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4434. return -e.errno
  4435. }
  4436. }
  4437. function _fd_write(stream, iov, iovcnt, pnum) {
  4438. try {
  4439. stream = FS.getStream(stream)
  4440. if (!stream) throw new FS.ErrnoError(9)
  4441. var num = SYSCALLS.doWritev(stream, iov, iovcnt)
  4442. HEAP32[pnum >> 2] = num
  4443. return 0
  4444. } catch (e) {
  4445. if (typeof FS === 'undefined' || !(e instanceof FS.ErrnoError)) abort(e)
  4446. return -e.errno
  4447. }
  4448. }
  4449. function ___wasi_fd_write() {
  4450. return _fd_write.apply(null, arguments)
  4451. }
  4452. function _abort() {
  4453. Module['abort']()
  4454. }
  4455. function _clock() {
  4456. if (_clock.start === undefined) _clock.start = Date.now()
  4457. return ((Date.now() - _clock.start) * (1e6 / 1e3)) | 0
  4458. }
  4459. function _emscripten_get_heap_size() {
  4460. return HEAP8.length
  4461. }
  4462. var _fabs = Math_abs
  4463. function _getenv(name) {
  4464. if (name === 0) return 0
  4465. name = UTF8ToString(name)
  4466. if (!ENV.hasOwnProperty(name)) return 0
  4467. if (_getenv.ret) _free(_getenv.ret)
  4468. _getenv.ret = allocateUTF8(ENV[name])
  4469. return _getenv.ret
  4470. }
  4471. function _gettimeofday(ptr) {
  4472. var now = Date.now()
  4473. HEAP32[ptr >> 2] = (now / 1e3) | 0
  4474. HEAP32[(ptr + 4) >> 2] = ((now % 1e3) * 1e3) | 0
  4475. return 0
  4476. }
  4477. var ___tm_timezone = (stringToUTF8('GMT', 135712, 4), 135712)
  4478. function _gmtime_r(time, tmPtr) {
  4479. var date = new Date(HEAP32[time >> 2] * 1e3)
  4480. HEAP32[tmPtr >> 2] = date.getUTCSeconds()
  4481. HEAP32[(tmPtr + 4) >> 2] = date.getUTCMinutes()
  4482. HEAP32[(tmPtr + 8) >> 2] = date.getUTCHours()
  4483. HEAP32[(tmPtr + 12) >> 2] = date.getUTCDate()
  4484. HEAP32[(tmPtr + 16) >> 2] = date.getUTCMonth()
  4485. HEAP32[(tmPtr + 20) >> 2] = date.getUTCFullYear() - 1900
  4486. HEAP32[(tmPtr + 24) >> 2] = date.getUTCDay()
  4487. HEAP32[(tmPtr + 36) >> 2] = 0
  4488. HEAP32[(tmPtr + 32) >> 2] = 0
  4489. var start = Date.UTC(date.getUTCFullYear(), 0, 1, 0, 0, 0, 0)
  4490. var yday = ((date.getTime() - start) / (1e3 * 60 * 60 * 24)) | 0
  4491. HEAP32[(tmPtr + 28) >> 2] = yday
  4492. HEAP32[(tmPtr + 40) >> 2] = ___tm_timezone
  4493. return tmPtr
  4494. }
  4495. function _llvm_exp2_f32(x) {
  4496. return Math.pow(2, x)
  4497. }
  4498. function _llvm_exp2_f64(a0) {
  4499. return _llvm_exp2_f32(a0)
  4500. }
  4501. var _llvm_trunc_f64 = Math_trunc
  4502. function _tzset() {
  4503. if (_tzset.called) return
  4504. _tzset.called = true
  4505. HEAP32[__get_timezone() >> 2] = new Date().getTimezoneOffset() * 60
  4506. var winter = new Date(2e3, 0, 1)
  4507. var summer = new Date(2e3, 6, 1)
  4508. HEAP32[__get_daylight() >> 2] = Number(
  4509. winter.getTimezoneOffset() != summer.getTimezoneOffset()
  4510. )
  4511. function extractZone(date) {
  4512. var match = date.toTimeString().match(/\(([A-Za-z ]+)\)$/)
  4513. return match ? match[1] : 'GMT'
  4514. }
  4515. var winterName = extractZone(winter)
  4516. var summerName = extractZone(summer)
  4517. var winterNamePtr = allocate(
  4518. intArrayFromString(winterName),
  4519. 'i8',
  4520. ALLOC_NORMAL
  4521. )
  4522. var summerNamePtr = allocate(
  4523. intArrayFromString(summerName),
  4524. 'i8',
  4525. ALLOC_NORMAL
  4526. )
  4527. if (summer.getTimezoneOffset() < winter.getTimezoneOffset()) {
  4528. HEAP32[__get_tzname() >> 2] = winterNamePtr
  4529. HEAP32[(__get_tzname() + 4) >> 2] = summerNamePtr
  4530. } else {
  4531. HEAP32[__get_tzname() >> 2] = summerNamePtr
  4532. HEAP32[(__get_tzname() + 4) >> 2] = winterNamePtr
  4533. }
  4534. }
  4535. function _localtime_r(time, tmPtr) {
  4536. _tzset()
  4537. var date = new Date(HEAP32[time >> 2] * 1e3)
  4538. HEAP32[tmPtr >> 2] = date.getSeconds()
  4539. HEAP32[(tmPtr + 4) >> 2] = date.getMinutes()
  4540. HEAP32[(tmPtr + 8) >> 2] = date.getHours()
  4541. HEAP32[(tmPtr + 12) >> 2] = date.getDate()
  4542. HEAP32[(tmPtr + 16) >> 2] = date.getMonth()
  4543. HEAP32[(tmPtr + 20) >> 2] = date.getFullYear() - 1900
  4544. HEAP32[(tmPtr + 24) >> 2] = date.getDay()
  4545. var start = new Date(date.getFullYear(), 0, 1)
  4546. var yday = ((date.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24)) | 0
  4547. HEAP32[(tmPtr + 28) >> 2] = yday
  4548. HEAP32[(tmPtr + 36) >> 2] = -(date.getTimezoneOffset() * 60)
  4549. var summerOffset = new Date(2e3, 6, 1).getTimezoneOffset()
  4550. var winterOffset = start.getTimezoneOffset()
  4551. var dst =
  4552. (summerOffset != winterOffset &&
  4553. date.getTimezoneOffset() == Math.min(winterOffset, summerOffset)) | 0
  4554. HEAP32[(tmPtr + 32) >> 2] = dst
  4555. var zonePtr = HEAP32[(__get_tzname() + (dst ? 4 : 0)) >> 2]
  4556. HEAP32[(tmPtr + 40) >> 2] = zonePtr
  4557. return tmPtr
  4558. }
  4559. function _emscripten_memcpy_big(dest, src, num) {
  4560. HEAPU8.set(HEAPU8.subarray(src, src + num), dest)
  4561. }
  4562. function _mktime(tmPtr) {
  4563. _tzset()
  4564. var date = new Date(
  4565. HEAP32[(tmPtr + 20) >> 2] + 1900,
  4566. HEAP32[(tmPtr + 16) >> 2],
  4567. HEAP32[(tmPtr + 12) >> 2],
  4568. HEAP32[(tmPtr + 8) >> 2],
  4569. HEAP32[(tmPtr + 4) >> 2],
  4570. HEAP32[tmPtr >> 2],
  4571. 0
  4572. )
  4573. var dst = HEAP32[(tmPtr + 32) >> 2]
  4574. var guessedOffset = date.getTimezoneOffset()
  4575. var start = new Date(date.getFullYear(), 0, 1)
  4576. var summerOffset = new Date(2e3, 6, 1).getTimezoneOffset()
  4577. var winterOffset = start.getTimezoneOffset()
  4578. var dstOffset = Math.min(winterOffset, summerOffset)
  4579. if (dst < 0) {
  4580. HEAP32[(tmPtr + 32) >> 2] = Number(
  4581. summerOffset != winterOffset && dstOffset == guessedOffset
  4582. )
  4583. } else if (dst > 0 != (dstOffset == guessedOffset)) {
  4584. var nonDstOffset = Math.max(winterOffset, summerOffset)
  4585. var trueOffset = dst > 0 ? dstOffset : nonDstOffset
  4586. date.setTime(date.getTime() + (trueOffset - guessedOffset) * 6e4)
  4587. }
  4588. HEAP32[(tmPtr + 24) >> 2] = date.getDay()
  4589. var yday = ((date.getTime() - start.getTime()) / (1e3 * 60 * 60 * 24)) | 0
  4590. HEAP32[(tmPtr + 28) >> 2] = yday
  4591. return (date.getTime() / 1e3) | 0
  4592. }
  4593. function _pthread_cond_destroy() {
  4594. return 0
  4595. }
  4596. function _pthread_cond_init() {
  4597. return 0
  4598. }
  4599. function _pthread_cond_signal() {
  4600. return 0
  4601. }
  4602. function _pthread_cond_wait() {
  4603. return 0
  4604. }
  4605. function _pthread_create() {
  4606. return 11
  4607. }
  4608. function _pthread_join() {}
  4609. function abortOnCannotGrowMemory(requestedSize) {
  4610. abort('OOM')
  4611. }
  4612. function _emscripten_resize_heap(requestedSize) {
  4613. abortOnCannotGrowMemory(requestedSize)
  4614. }
  4615. function _sysconf(name) {
  4616. switch (name) {
  4617. case 30:
  4618. return PAGE_SIZE
  4619. case 85:
  4620. var maxHeapSize = 2 * 1024 * 1024 * 1024 - 65536
  4621. maxHeapSize = HEAPU8.length
  4622. return maxHeapSize / PAGE_SIZE
  4623. case 132:
  4624. case 133:
  4625. case 12:
  4626. case 137:
  4627. case 138:
  4628. case 15:
  4629. case 235:
  4630. case 16:
  4631. case 17:
  4632. case 18:
  4633. case 19:
  4634. case 20:
  4635. case 149:
  4636. case 13:
  4637. case 10:
  4638. case 236:
  4639. case 153:
  4640. case 9:
  4641. case 21:
  4642. case 22:
  4643. case 159:
  4644. case 154:
  4645. case 14:
  4646. case 77:
  4647. case 78:
  4648. case 139:
  4649. case 80:
  4650. case 81:
  4651. case 82:
  4652. case 68:
  4653. case 67:
  4654. case 164:
  4655. case 11:
  4656. case 29:
  4657. case 47:
  4658. case 48:
  4659. case 95:
  4660. case 52:
  4661. case 51:
  4662. case 46:
  4663. return 200809
  4664. case 79:
  4665. return 0
  4666. case 27:
  4667. case 246:
  4668. case 127:
  4669. case 128:
  4670. case 23:
  4671. case 24:
  4672. case 160:
  4673. case 161:
  4674. case 181:
  4675. case 182:
  4676. case 242:
  4677. case 183:
  4678. case 184:
  4679. case 243:
  4680. case 244:
  4681. case 245:
  4682. case 165:
  4683. case 178:
  4684. case 179:
  4685. case 49:
  4686. case 50:
  4687. case 168:
  4688. case 169:
  4689. case 175:
  4690. case 170:
  4691. case 171:
  4692. case 172:
  4693. case 97:
  4694. case 76:
  4695. case 32:
  4696. case 173:
  4697. case 35:
  4698. return -1
  4699. case 176:
  4700. case 177:
  4701. case 7:
  4702. case 155:
  4703. case 8:
  4704. case 157:
  4705. case 125:
  4706. case 126:
  4707. case 92:
  4708. case 93:
  4709. case 129:
  4710. case 130:
  4711. case 131:
  4712. case 94:
  4713. case 91:
  4714. return 1
  4715. case 74:
  4716. case 60:
  4717. case 69:
  4718. case 70:
  4719. case 4:
  4720. return 1024
  4721. case 31:
  4722. case 42:
  4723. case 72:
  4724. return 32
  4725. case 87:
  4726. case 26:
  4727. case 33:
  4728. return 2147483647
  4729. case 34:
  4730. case 1:
  4731. return 47839
  4732. case 38:
  4733. case 36:
  4734. return 99
  4735. case 43:
  4736. case 37:
  4737. return 2048
  4738. case 0:
  4739. return 2097152
  4740. case 3:
  4741. return 65536
  4742. case 28:
  4743. return 32768
  4744. case 44:
  4745. return 32767
  4746. case 75:
  4747. return 16384
  4748. case 39:
  4749. return 1e3
  4750. case 89:
  4751. return 700
  4752. case 71:
  4753. return 256
  4754. case 40:
  4755. return 255
  4756. case 2:
  4757. return 100
  4758. case 180:
  4759. return 64
  4760. case 25:
  4761. return 20
  4762. case 5:
  4763. return 16
  4764. case 6:
  4765. return 6
  4766. case 73:
  4767. return 4
  4768. case 84: {
  4769. if (typeof navigator === 'object')
  4770. return navigator['hardwareConcurrency'] || 1
  4771. return 1
  4772. }
  4773. }
  4774. ___setErrNo(22)
  4775. return -1
  4776. }
  4777. FS.staticInit()
  4778. Module['FS_createFolder'] = FS.createFolder
  4779. Module['FS_createPath'] = FS.createPath
  4780. Module['FS_createDataFile'] = FS.createDataFile
  4781. Module['FS_createPreloadedFile'] = FS.createPreloadedFile
  4782. Module['FS_createLazyFile'] = FS.createLazyFile
  4783. Module['FS_createLink'] = FS.createLink
  4784. Module['FS_createDevice'] = FS.createDevice
  4785. Module['FS_unlink'] = FS.unlink
  4786. if (ENVIRONMENT_HAS_NODE) {
  4787. var fs = require('fs')
  4788. var NODEJS_PATH = require('path')
  4789. NODEFS.staticInit()
  4790. }
  4791. var ASSERTIONS = false
  4792. function intArrayFromString(stringy, dontAddNull, length) {
  4793. var len = length > 0 ? length : lengthBytesUTF8(stringy) + 1
  4794. var u8array = new Array(len)
  4795. var numBytesWritten = stringToUTF8Array(stringy, u8array, 0, u8array.length)
  4796. if (dontAddNull) u8array.length = numBytesWritten
  4797. return u8array
  4798. }
  4799. function jsCall_dd(index, a1) {
  4800. return functionPointers[index](a1)
  4801. }
  4802. function jsCall_did(index, a1, a2) {
  4803. return functionPointers[index](a1, a2)
  4804. }
  4805. function jsCall_didd(index, a1, a2, a3) {
  4806. return functionPointers[index](a1, a2, a3)
  4807. }
  4808. function jsCall_ii(index, a1) {
  4809. return functionPointers[index](a1)
  4810. }
  4811. function jsCall_iidiiii(index, a1, a2, a3, a4, a5, a6) {
  4812. return functionPointers[index](a1, a2, a3, a4, a5, a6)
  4813. }
  4814. function jsCall_iii(index, a1, a2) {
  4815. return functionPointers[index](a1, a2)
  4816. }
  4817. function jsCall_iiii(index, a1, a2, a3) {
  4818. return functionPointers[index](a1, a2, a3)
  4819. }
  4820. function jsCall_iiiii(index, a1, a2, a3, a4) {
  4821. return functionPointers[index](a1, a2, a3, a4)
  4822. }
  4823. function jsCall_iiiiii(index, a1, a2, a3, a4, a5) {
  4824. return functionPointers[index](a1, a2, a3, a4, a5)
  4825. }
  4826. function jsCall_iiiiiii(index, a1, a2, a3, a4, a5, a6) {
  4827. return functionPointers[index](a1, a2, a3, a4, a5, a6)
  4828. }
  4829. function jsCall_jiji(index, a1, a2, a3) {
  4830. return functionPointers[index](a1, a2, a3)
  4831. }
  4832. function jsCall_v(index) {
  4833. functionPointers[index]()
  4834. }
  4835. function jsCall_vi(index, a1) {
  4836. functionPointers[index](a1)
  4837. }
  4838. function jsCall_vii(index, a1, a2) {
  4839. functionPointers[index](a1, a2)
  4840. }
  4841. function jsCall_viii(index, a1, a2, a3) {
  4842. functionPointers[index](a1, a2, a3)
  4843. }
  4844. function jsCall_viiii(index, a1, a2, a3, a4) {
  4845. functionPointers[index](a1, a2, a3, a4)
  4846. }
  4847. function jsCall_viiiii(index, a1, a2, a3, a4, a5) {
  4848. functionPointers[index](a1, a2, a3, a4, a5)
  4849. }
  4850. function jsCall_viiiiii(index, a1, a2, a3, a4, a5, a6) {
  4851. functionPointers[index](a1, a2, a3, a4, a5, a6)
  4852. }
  4853. function jsCall_viiiiiii(index, a1, a2, a3, a4, a5, a6, a7) {
  4854. functionPointers[index](a1, a2, a3, a4, a5, a6, a7)
  4855. }
  4856. function jsCall_viiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8) {
  4857. functionPointers[index](a1, a2, a3, a4, a5, a6, a7, a8)
  4858. }
  4859. function jsCall_viiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9) {
  4860. functionPointers[index](a1, a2, a3, a4, a5, a6, a7, a8, a9)
  4861. }
  4862. function jsCall_viiiiiiiiii(index, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
  4863. functionPointers[index](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)
  4864. }
  4865. function jsCall_viiiiiiiiiii(
  4866. index,
  4867. a1,
  4868. a2,
  4869. a3,
  4870. a4,
  4871. a5,
  4872. a6,
  4873. a7,
  4874. a8,
  4875. a9,
  4876. a10,
  4877. a11
  4878. ) {
  4879. functionPointers[index](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11)
  4880. }
  4881. function jsCall_viiiiiiiiiiii(
  4882. index,
  4883. a1,
  4884. a2,
  4885. a3,
  4886. a4,
  4887. a5,
  4888. a6,
  4889. a7,
  4890. a8,
  4891. a9,
  4892. a10,
  4893. a11,
  4894. a12
  4895. ) {
  4896. functionPointers[index](a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12)
  4897. }
  4898. function jsCall_viiiiiiiiiiiiii(
  4899. index,
  4900. a1,
  4901. a2,
  4902. a3,
  4903. a4,
  4904. a5,
  4905. a6,
  4906. a7,
  4907. a8,
  4908. a9,
  4909. a10,
  4910. a11,
  4911. a12,
  4912. a13,
  4913. a14
  4914. ) {
  4915. functionPointers[index](
  4916. a1,
  4917. a2,
  4918. a3,
  4919. a4,
  4920. a5,
  4921. a6,
  4922. a7,
  4923. a8,
  4924. a9,
  4925. a10,
  4926. a11,
  4927. a12,
  4928. a13,
  4929. a14
  4930. )
  4931. }
  4932. var asmGlobalArg = {}
  4933. var asmLibraryArg = {
  4934. abort: abort,
  4935. setTempRet0: setTempRet0,
  4936. getTempRet0: getTempRet0,
  4937. jsCall_dd: jsCall_dd,
  4938. jsCall_did: jsCall_did,
  4939. jsCall_didd: jsCall_didd,
  4940. jsCall_ii: jsCall_ii,
  4941. jsCall_iidiiii: jsCall_iidiiii,
  4942. jsCall_iii: jsCall_iii,
  4943. jsCall_iiii: jsCall_iiii,
  4944. jsCall_iiiii: jsCall_iiiii,
  4945. jsCall_iiiiii: jsCall_iiiiii,
  4946. jsCall_iiiiiii: jsCall_iiiiiii,
  4947. jsCall_jiji: jsCall_jiji,
  4948. jsCall_v: jsCall_v,
  4949. jsCall_vi: jsCall_vi,
  4950. jsCall_vii: jsCall_vii,
  4951. jsCall_viii: jsCall_viii,
  4952. jsCall_viiii: jsCall_viiii,
  4953. jsCall_viiiii: jsCall_viiiii,
  4954. jsCall_viiiiii: jsCall_viiiiii,
  4955. jsCall_viiiiiii: jsCall_viiiiiii,
  4956. jsCall_viiiiiiii: jsCall_viiiiiiii,
  4957. jsCall_viiiiiiiii: jsCall_viiiiiiiii,
  4958. jsCall_viiiiiiiiii: jsCall_viiiiiiiiii,
  4959. jsCall_viiiiiiiiiii: jsCall_viiiiiiiiiii,
  4960. jsCall_viiiiiiiiiiii: jsCall_viiiiiiiiiiii,
  4961. jsCall_viiiiiiiiiiiiii: jsCall_viiiiiiiiiiiiii,
  4962. ___buildEnvironment: ___buildEnvironment,
  4963. ___setErrNo: ___setErrNo,
  4964. ___syscall140: ___syscall140,
  4965. ___syscall221: ___syscall221,
  4966. ___syscall3: ___syscall3,
  4967. ___syscall5: ___syscall5,
  4968. ___syscall54: ___syscall54,
  4969. ___syscall6: ___syscall6,
  4970. ___wasi_fd_write: ___wasi_fd_write,
  4971. _abort: _abort,
  4972. _clock: _clock,
  4973. _emscripten_get_heap_size: _emscripten_get_heap_size,
  4974. _emscripten_memcpy_big: _emscripten_memcpy_big,
  4975. _emscripten_resize_heap: _emscripten_resize_heap,
  4976. _fabs: _fabs,
  4977. _fd_write: _fd_write,
  4978. _getenv: _getenv,
  4979. _gettimeofday: _gettimeofday,
  4980. _gmtime_r: _gmtime_r,
  4981. _llvm_exp2_f32: _llvm_exp2_f32,
  4982. _llvm_exp2_f64: _llvm_exp2_f64,
  4983. _llvm_trunc_f64: _llvm_trunc_f64,
  4984. _localtime_r: _localtime_r,
  4985. _mktime: _mktime,
  4986. _pthread_cond_destroy: _pthread_cond_destroy,
  4987. _pthread_cond_init: _pthread_cond_init,
  4988. _pthread_cond_signal: _pthread_cond_signal,
  4989. _pthread_cond_wait: _pthread_cond_wait,
  4990. _pthread_create: _pthread_create,
  4991. _pthread_join: _pthread_join,
  4992. _sysconf: _sysconf,
  4993. _tzset: _tzset,
  4994. abortOnCannotGrowMemory: abortOnCannotGrowMemory,
  4995. demangle: demangle,
  4996. demangleAll: demangleAll,
  4997. jsStackTrace: jsStackTrace,
  4998. stackTrace: stackTrace,
  4999. tempDoublePtr: tempDoublePtr,
  5000. DYNAMICTOP_PTR: DYNAMICTOP_PTR
  5001. }
  5002. var asm = Module['asm'](asmGlobalArg, asmLibraryArg, buffer)
  5003. Module['asm'] = asm
  5004. var ___emscripten_environ_constructor = (Module[
  5005. '___emscripten_environ_constructor'
  5006. ] = function() {
  5007. return Module['asm']['___emscripten_environ_constructor'].apply(
  5008. null,
  5009. arguments
  5010. )
  5011. })
  5012. var ___errno_location = (Module['___errno_location'] = function() {
  5013. return Module['asm']['___errno_location'].apply(null, arguments)
  5014. })
  5015. var __get_daylight = (Module['__get_daylight'] = function() {
  5016. return Module['asm']['__get_daylight'].apply(null, arguments)
  5017. })
  5018. var __get_environ = (Module['__get_environ'] = function() {
  5019. return Module['asm']['__get_environ'].apply(null, arguments)
  5020. })
  5021. var __get_timezone = (Module['__get_timezone'] = function() {
  5022. return Module['asm']['__get_timezone'].apply(null, arguments)
  5023. })
  5024. var __get_tzname = (Module['__get_tzname'] = function() {
  5025. return Module['asm']['__get_tzname'].apply(null, arguments)
  5026. })
  5027. var _closeDecoder = (Module['_closeDecoder'] = function() {
  5028. return Module['asm']['_closeDecoder'].apply(null, arguments)
  5029. })
  5030. var _decodeData = (Module['_decodeData'] = function() {
  5031. return Module['asm']['_decodeData'].apply(null, arguments)
  5032. })
  5033. var _flushDecoder = (Module['_flushDecoder'] = function() {
  5034. return Module['asm']['_flushDecoder'].apply(null, arguments)
  5035. })
  5036. var _free = (Module['_free'] = function() {
  5037. return Module['asm']['_free'].apply(null, arguments)
  5038. })
  5039. var _llvm_bswap_i16 = (Module['_llvm_bswap_i16'] = function() {
  5040. return Module['asm']['_llvm_bswap_i16'].apply(null, arguments)
  5041. })
  5042. var _llvm_bswap_i32 = (Module['_llvm_bswap_i32'] = function() {
  5043. return Module['asm']['_llvm_bswap_i32'].apply(null, arguments)
  5044. })
  5045. var _llvm_round_f64 = (Module['_llvm_round_f64'] = function() {
  5046. return Module['asm']['_llvm_round_f64'].apply(null, arguments)
  5047. })
  5048. var _main = (Module['_main'] = function() {
  5049. return Module['asm']['_main'].apply(null, arguments)
  5050. })
  5051. var _malloc = (Module['_malloc'] = function() {
  5052. return Module['asm']['_malloc'].apply(null, arguments)
  5053. })
  5054. var _memalign = (Module['_memalign'] = function() {
  5055. return Module['asm']['_memalign'].apply(null, arguments)
  5056. })
  5057. var _memcpy = (Module['_memcpy'] = function() {
  5058. return Module['asm']['_memcpy'].apply(null, arguments)
  5059. })
  5060. var _memmove = (Module['_memmove'] = function() {
  5061. return Module['asm']['_memmove'].apply(null, arguments)
  5062. })
  5063. var _memset = (Module['_memset'] = function() {
  5064. return Module['asm']['_memset'].apply(null, arguments)
  5065. })
  5066. var _openDecoder = (Module['_openDecoder'] = function() {
  5067. return Module['asm']['_openDecoder'].apply(null, arguments)
  5068. })
  5069. var _pthread_cond_broadcast = (Module['_pthread_cond_broadcast'] = function() {
  5070. return Module['asm']['_pthread_cond_broadcast'].apply(null, arguments)
  5071. })
  5072. var _sbrk = (Module['_sbrk'] = function() {
  5073. return Module['asm']['_sbrk'].apply(null, arguments)
  5074. })
  5075. var establishStackSpace = (Module['establishStackSpace'] = function() {
  5076. return Module['asm']['establishStackSpace'].apply(null, arguments)
  5077. })
  5078. var stackAlloc = (Module['stackAlloc'] = function() {
  5079. return Module['asm']['stackAlloc'].apply(null, arguments)
  5080. })
  5081. var stackRestore = (Module['stackRestore'] = function() {
  5082. return Module['asm']['stackRestore'].apply(null, arguments)
  5083. })
  5084. var stackSave = (Module['stackSave'] = function() {
  5085. return Module['asm']['stackSave'].apply(null, arguments)
  5086. })
  5087. var dynCall_dd = (Module['dynCall_dd'] = function() {
  5088. return Module['asm']['dynCall_dd'].apply(null, arguments)
  5089. })
  5090. var dynCall_did = (Module['dynCall_did'] = function() {
  5091. return Module['asm']['dynCall_did'].apply(null, arguments)
  5092. })
  5093. var dynCall_didd = (Module['dynCall_didd'] = function() {
  5094. return Module['asm']['dynCall_didd'].apply(null, arguments)
  5095. })
  5096. var dynCall_ii = (Module['dynCall_ii'] = function() {
  5097. return Module['asm']['dynCall_ii'].apply(null, arguments)
  5098. })
  5099. var dynCall_iidiiii = (Module['dynCall_iidiiii'] = function() {
  5100. return Module['asm']['dynCall_iidiiii'].apply(null, arguments)
  5101. })
  5102. var dynCall_iii = (Module['dynCall_iii'] = function() {
  5103. return Module['asm']['dynCall_iii'].apply(null, arguments)
  5104. })
  5105. var dynCall_iiii = (Module['dynCall_iiii'] = function() {
  5106. return Module['asm']['dynCall_iiii'].apply(null, arguments)
  5107. })
  5108. var dynCall_iiiii = (Module['dynCall_iiiii'] = function() {
  5109. return Module['asm']['dynCall_iiiii'].apply(null, arguments)
  5110. })
  5111. var dynCall_iiiiii = (Module['dynCall_iiiiii'] = function() {
  5112. return Module['asm']['dynCall_iiiiii'].apply(null, arguments)
  5113. })
  5114. var dynCall_iiiiiii = (Module['dynCall_iiiiiii'] = function() {
  5115. return Module['asm']['dynCall_iiiiiii'].apply(null, arguments)
  5116. })
  5117. var dynCall_jiji = (Module['dynCall_jiji'] = function() {
  5118. return Module['asm']['dynCall_jiji'].apply(null, arguments)
  5119. })
  5120. var dynCall_v = (Module['dynCall_v'] = function() {
  5121. return Module['asm']['dynCall_v'].apply(null, arguments)
  5122. })
  5123. var dynCall_vi = (Module['dynCall_vi'] = function() {
  5124. return Module['asm']['dynCall_vi'].apply(null, arguments)
  5125. })
  5126. var dynCall_vii = (Module['dynCall_vii'] = function() {
  5127. return Module['asm']['dynCall_vii'].apply(null, arguments)
  5128. })
  5129. var dynCall_viii = (Module['dynCall_viii'] = function() {
  5130. return Module['asm']['dynCall_viii'].apply(null, arguments)
  5131. })
  5132. var dynCall_viiii = (Module['dynCall_viiii'] = function() {
  5133. return Module['asm']['dynCall_viiii'].apply(null, arguments)
  5134. })
  5135. var dynCall_viiiii = (Module['dynCall_viiiii'] = function() {
  5136. return Module['asm']['dynCall_viiiii'].apply(null, arguments)
  5137. })
  5138. var dynCall_viiiiii = (Module['dynCall_viiiiii'] = function() {
  5139. return Module['asm']['dynCall_viiiiii'].apply(null, arguments)
  5140. })
  5141. var dynCall_viiiiiii = (Module['dynCall_viiiiiii'] = function() {
  5142. return Module['asm']['dynCall_viiiiiii'].apply(null, arguments)
  5143. })
  5144. var dynCall_viiiiiiii = (Module['dynCall_viiiiiiii'] = function() {
  5145. return Module['asm']['dynCall_viiiiiiii'].apply(null, arguments)
  5146. })
  5147. var dynCall_viiiiiiiii = (Module['dynCall_viiiiiiiii'] = function() {
  5148. return Module['asm']['dynCall_viiiiiiiii'].apply(null, arguments)
  5149. })
  5150. var dynCall_viiiiiiiiii = (Module['dynCall_viiiiiiiiii'] = function() {
  5151. return Module['asm']['dynCall_viiiiiiiiii'].apply(null, arguments)
  5152. })
  5153. var dynCall_viiiiiiiiiii = (Module['dynCall_viiiiiiiiiii'] = function() {
  5154. return Module['asm']['dynCall_viiiiiiiiiii'].apply(null, arguments)
  5155. })
  5156. var dynCall_viiiiiiiiiiii = (Module['dynCall_viiiiiiiiiiii'] = function() {
  5157. return Module['asm']['dynCall_viiiiiiiiiiii'].apply(null, arguments)
  5158. })
  5159. var dynCall_viiiiiiiiiiiiii = (Module['dynCall_viiiiiiiiiiiiii'] = function() {
  5160. return Module['asm']['dynCall_viiiiiiiiiiiiii'].apply(null, arguments)
  5161. })
  5162. Module['asm'] = asm
  5163. Module['getMemory'] = getMemory
  5164. Module['addRunDependency'] = addRunDependency
  5165. Module['removeRunDependency'] = removeRunDependency
  5166. Module['FS_createFolder'] = FS.createFolder
  5167. Module['FS_createPath'] = FS.createPath
  5168. Module['FS_createDataFile'] = FS.createDataFile
  5169. Module['FS_createPreloadedFile'] = FS.createPreloadedFile
  5170. Module['FS_createLazyFile'] = FS.createLazyFile
  5171. Module['FS_createLink'] = FS.createLink
  5172. Module['FS_createDevice'] = FS.createDevice
  5173. Module['FS_unlink'] = FS.unlink
  5174. Module['addFunction'] = addFunction
  5175. Module['calledRun'] = calledRun
  5176. var calledRun
  5177. function ExitStatus(status) {
  5178. this.name = 'ExitStatus'
  5179. this.message = 'Program terminated with exit(' + status + ')'
  5180. this.status = status
  5181. }
  5182. var calledMain = false
  5183. dependenciesFulfilled = function runCaller() {
  5184. if (!calledRun) run()
  5185. if (!calledRun) dependenciesFulfilled = runCaller
  5186. }
  5187. function callMain(args) {
  5188. args = args || []
  5189. var argc = args.length + 1
  5190. var argv = stackAlloc((argc + 1) * 4)
  5191. HEAP32[argv >> 2] = allocateUTF8OnStack(thisProgram)
  5192. for (var i = 1; i < argc; i++) {
  5193. HEAP32[(argv >> 2) + i] = allocateUTF8OnStack(args[i - 1])
  5194. }
  5195. HEAP32[(argv >> 2) + argc] = 0
  5196. try {
  5197. var ret = Module['_main'](argc, argv)
  5198. exit(ret, true)
  5199. } catch (e) {
  5200. if (e instanceof ExitStatus) {
  5201. return
  5202. } else if (e == 'SimulateInfiniteLoop') {
  5203. noExitRuntime = true
  5204. return
  5205. } else {
  5206. var toLog = e
  5207. if (e && typeof e === 'object' && e.stack) {
  5208. toLog = [e, e.stack]
  5209. }
  5210. err('exception thrown: ' + toLog)
  5211. quit_(1, e)
  5212. }
  5213. } finally {
  5214. calledMain = true
  5215. }
  5216. }
  5217. function run(args) {
  5218. args = args || arguments_
  5219. if (runDependencies > 0) {
  5220. return
  5221. }
  5222. preRun()
  5223. if (runDependencies > 0) return
  5224. function doRun() {
  5225. if (calledRun) return
  5226. calledRun = true
  5227. Module['calledRun'] = true
  5228. if (ABORT) return
  5229. initRuntime()
  5230. preMain()
  5231. if (Module['onRuntimeInitialized']) Module['onRuntimeInitialized']()
  5232. if (shouldRunNow) callMain(args)
  5233. postRun()
  5234. }
  5235. if (Module['setStatus']) {
  5236. Module['setStatus']('Running...')
  5237. setTimeout(function() {
  5238. setTimeout(function() {
  5239. Module['setStatus']('')
  5240. }, 1)
  5241. doRun()
  5242. }, 1)
  5243. } else {
  5244. doRun()
  5245. }
  5246. }
  5247. Module['run'] = run
  5248. function exit(status, implicit) {
  5249. if (implicit && noExitRuntime && status === 0) {
  5250. return
  5251. }
  5252. if (noExitRuntime) {
  5253. } else {
  5254. ABORT = true
  5255. EXITSTATUS = status
  5256. exitRuntime()
  5257. if (Module['onExit']) Module['onExit'](status)
  5258. }
  5259. quit_(status, new ExitStatus(status))
  5260. }
  5261. function abort(what) {
  5262. if (Module['onAbort']) {
  5263. Module['onAbort'](what)
  5264. }
  5265. what += ''
  5266. out(what)
  5267. err(what)
  5268. ABORT = true
  5269. EXITSTATUS = 1
  5270. throw 'abort(' + what + '). Build with -s ASSERTIONS=1 for more info.'
  5271. }
  5272. Module['abort'] = abort
  5273. if (Module['preInit']) {
  5274. if (typeof Module['preInit'] == 'function')
  5275. Module['preInit'] = [Module['preInit']]
  5276. while (Module['preInit'].length > 0) {
  5277. Module['preInit'].pop()()
  5278. }
  5279. }
  5280. var shouldRunNow = true
  5281. if (Module['noInitialRun']) shouldRunNow = false
  5282. noExitRuntime = true
  5283. run()