{"version":3,"file":"static/js/main.9404545a.js","mappings":"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EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,cAAeijC,EAAE8xN,GACpC,IAAe,CAAE/0P,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,IAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,cAAeijC,EAjN1C,SAA2BkmE,EAAM9nG,EAAQwrF,GACxC,GAAIA,EAAK2mK,QAAQnyP,EAAS,IAA1B,CACA,IAAIgN,EAAK86F,EAAKs7H,WAAW,GAKzB,OAJAt7H,EAAK1qG,GAAK,GACV0qG,EAAK1qG,GAAK,EACV0qG,EAAK1qG,GAAK,EAEH,CAAC4P,EADC86F,EAAKs7H,WAAWpjO,EAAS,GAAI,QALF,CAOrC,GA0MQ,KAAe,CAAErB,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,KAAe,CAAEA,EAAE,MACnB,MAAe,CAAEA,EAAE,MACnB,MAAe,CAAEA,EAAE,MACnB,MAAe,CAAEA,EAAE,MACnB,MAAe,CAAEA,EAAE,MACnB,MAAe,CAAEA,EAAE,KAE3B,MAAO,CACNq1P,aAlqBD,SAAsBpY,EAAkBpwJ,GACvC,IAAI7tF,EAAI6tF,GAAQ,CAAC,EAEjB,IADI7tF,EAAE6rP,UAAY,GAAGtxB,IAAQv6N,EAAE6rP,UAClB,UAAV7rP,EAAEsP,KAAkB,MAAM,IAAI2wB,MAAM,iCACvC,IAAIsmB,EAAKi1L,KACL/0N,EAAQ02N,GAAkBc,EAAG,SAC7BD,EAAQt4O,MAAMxB,QAAQ+5O,GACtBuO,EAAO,GAEX8J,GAAe/vM,EAAI,EAoEpB,SAAuBv6C,GACtB,IAAI60E,EAAM8oJ,GAAQ,GAElB,OADA9oJ,EAAIwkJ,YAAY,EAAGr5N,GACZ60E,CACR,CAxE0B01K,CAAc,OACvCD,GAAe/vM,EAAI,EAyHpB,SAAqB9/B,GACpB,IAAIo6D,EAAM8oJ,GAAQ,GAKlB,OAJA9oJ,EAAIwkJ,YAAY,EAAG5+M,EAAMnlB,EAAE1B,GAC3BihF,EAAIwkJ,YAAY,EAAG5+M,EAAMnlB,EAAEjB,GAC3BwgF,EAAIwkJ,YAAY,EAAG5+M,EAAM3e,EAAElI,GAC3BihF,EAAIwkJ,YAAY,EAAG5+M,EAAM3e,EAAEzH,GACpBwgF,CACR,CAhI0B21K,CAAY/vO,IAErC,IADA,IAAIgwO,EAAQjzP,KAAKgB,IAAIiiB,EAAM3e,EAAEzH,EAAG,MACxBi1D,EAAI7uC,EAAMnlB,EAAEjB,EAAGi1D,GAAKmhM,IAASnhM,EAEpC,IADA,IAAI4rK,EAAKwb,GAAWpnL,GACZ7gB,EAAIhuB,EAAMnlB,EAAE1B,EAAG60C,GAAKhuB,EAAM3e,EAAElI,IAAK60C,EAAG,CACxC6gB,IAAM7uC,EAAMnlB,EAAEjB,IAAGmsP,EAAK/3M,GAAKkoM,GAAWloM,IACzC,IAAI6X,EAAMkgM,EAAK/3M,GAAKysL,EAChB+a,EAAO+B,GAASC,EAAG3oL,IAAI,IAAI7gB,GAAKwpM,EAAG3xL,GACvC,GAAI2vL,GAAkB,KAAVA,EAAKx7O,EAEjB,GAAa,KAAVw7O,EAAKx7O,GACI,EAAPw7O,EAAKjwO,IAAMiwO,EAAKjwO,GAAKiwO,EAAKjwO,IAAM,OAASiwO,EAAKjwO,GAAK,MAAOsqP,GAAe/vM,EAAI,GAAMyuM,EAAc1/L,EAAG7gB,EAAGwnM,EAAKjwO,IAC3GsqP,GAAe/vM,EAAI,GAAM0uM,EAAa3/L,EAAG7gB,EAAGwnM,EAAKjwO,SAGtDsqP,GAAe/vM,EAAI,GAAMwuM,EAAYz/L,EAAG7gB,EAD9B8oM,GAAYtB,GACyBh5O,MAAM,EAAG,MAE1D,CAID,OADAqzP,GAAe/vM,EAAI,GACZA,EAAGxjD,KACX,EAmoBC2zP,YAjoBD,SAAqB1nN,EAAiB6+C,GACrC,IAAI7tF,EAAI6tF,GAAQ,CAAC,EAEjB,IADI7tF,EAAE6rP,UAAY,GAAGtxB,IAAQv6N,EAAE6rP,UAClB,UAAV7rP,EAAEsP,KAAkB,MAAM,IAAI2wB,MAAM,iCACvC,IAAIsmB,EAAKi1L,KAET8a,GAAe/vM,EAAI,EA2CpB,SAAuBvX,GACtB,IAAI6xC,EAAM8oJ,GAAQ,IAClB9oJ,EAAIwkJ,YAAY,EAAG,MACnBxkJ,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GAEnB,IADA,IAAIh2M,EAAO,EAAGm9N,EAAO,EAAGmK,EAAQ,EACxBn3P,EAAI,EAAGA,EAAIwvC,EAAG4uM,WAAWv7O,SAAU7C,EAAG,CAC7C,IAAIM,EAAOkvC,EAAG4uM,WAAWp+O,GACrBy+O,EAAKjvM,EAAG6uM,OAAO/9O,GACnB,GAAIm+O,GAAOA,EAAG,QAAd,GACE0Y,EACF,IAAIlwO,EAAQw2N,GAAagB,EAAG,SACzB5uN,EAAO5I,EAAM3e,EAAEzH,IAAGgvB,EAAO5I,EAAM3e,EAAEzH,GACjCmsP,EAAO/lO,EAAM3e,EAAElI,IAAG4sP,EAAO/lO,EAAM3e,EAAElI,EAJL,CAKhC,CACGyvB,EAAO,OAAMA,EAAO,MAUvB,OATAwxD,EAAIwkJ,YAAY,EAAGh2M,GACnBwxD,EAAIwkJ,YAAY,EAAGsxB,GACnB91K,EAAIwkJ,YAAY,EAAGmnB,GACnB3rK,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GACnBxkJ,EAAIwkJ,YAAY,EAAG,GACZxkJ,CACR,CArE0B+1K,CAAc5nN,IAEvC,IAAI,IAAIxvC,EAAI,EAAGoqO,EAAM,EAAGpqO,EAAIwvC,EAAG4uM,WAAWv7O,SAAU7C,GAAOwvC,EAAG6uM,OAAO7uM,EAAG4uM,WAAWp+O,KAAO,CAAC,GAAG,SAAS82P,GAAe/vM,EAAI,GAAMyvM,EAAwBhnN,EAAG4uM,WAAWp+O,GAAIoqO,MAE1K,IAAI4rB,EAAQ,EACZ,IAAIh2P,EAAI,EAAGA,EAAIwvC,EAAG4uM,WAAWv7O,SAAU7C,EAAG,CACzC,IAAIy+O,EAAKjvM,EAAG6uM,OAAO7uM,EAAG4uM,WAAWp+O,IACjC,GAAIy+O,GAAOA,EAAG,QAAd,CAKA,IAJA,IAAIx3N,EAAQ02N,GAAkBc,EAAG,SAC7BD,EAAQt4O,MAAMxB,QAAQ+5O,GACtBuO,EAAO,GACPiK,EAAQjzP,KAAKgB,IAAIiiB,EAAM3e,EAAEzH,EAAG,MACxBi1D,EAAI7uC,EAAMnlB,EAAEjB,EAAGi1D,GAAKmhM,IAASnhM,EAEpC,IADA,IAAI4rK,EAAKwb,GAAWpnL,GACZ7gB,EAAIhuB,EAAMnlB,EAAE1B,EAAG60C,GAAKhuB,EAAM3e,EAAElI,IAAK60C,EAAG,CACxC6gB,IAAM7uC,EAAMnlB,EAAEjB,IAAGmsP,EAAK/3M,GAAKkoM,GAAWloM,IACzC,IAAI6X,EAAMkgM,EAAK/3M,GAAKysL,EAChB+a,EAAO+B,GAASC,EAAG3oL,IAAI,IAAI7gB,GAAKwpM,EAAG3xL,GACvC,GAAI2vL,GAAkB,KAAVA,EAAKx7O,EAEjB,GAAa,KAAVw7O,EAAKx7O,EACP61P,GAAe/vM,EAAI,GAAMqvM,EAAgBtgM,EAAG7gB,EAAG+gN,EAAOvZ,EAAKjwO,SAI3DsqP,GAAe/vM,EAAI,GAAMgvM,EAAejgM,EAAG7gB,EAAG+gN,EAFpCjY,GAAYtB,GAEmCh5O,MAAM,EAAG,MAEpE,GAECuyP,CAtB6B,CAuBhC,CAGA,OADAc,GAAe/vM,EAAI,GACZA,EAAGxjD,KACX,EA0lBCopP,YApyBD,SAA2BtsP,EAAeguF,GACzC,OAAOA,EAAKv+E,MACX,IAAK,SAAU,OAAO2kP,EAAsBp4B,GAAIV,GAAct7N,IAAKguF,GACnE,IAAK,SAAU,OAAOomK,EAAsBp4B,GAAIh8N,GAAIguF,GACpD,IAAK,SACL,IAAK,QAAS,OAAOomK,EAAsBp0P,EAAGguF,GAE/C,KAAM,oBAAsBA,EAAKv+E,IAClC,EA8xBD,CAtzBwB,GA8gCxB,IAAIunP,GAAe,mBACnB,SAASC,GAAcC,EAAalpK,GACnC,IAAIA,EAAKmpK,QAAS,MAAO,GACzB,IAAIh3P,EAAI,CAACo3O,IACTp3O,EAAEA,EAAEqC,QAAWq2O,GAAU,MAAO,KAAM,CACrCue,MAAOpe,GAAW,GAClBv9M,MAAOy7N,EAAIG,MACXC,YAAaJ,EAAIK,SAElB,IAAI,IAAI53P,EAAI,EAAGA,GAAKu3P,EAAI10P,SAAU7C,EAAK,GAAa,MAAVu3P,EAAIv3P,GAAP,CACtC,IAAI8B,EAAiBy1P,EAAIv3P,GACrB63P,EAAQ,OACT/1P,EAAEjB,EAAGg3P,GAAS/1P,EAAEjB,GAElBg3P,GAAS,KACL/1P,EAAEb,IAAGa,EAAEb,EAAI,IACZa,EAAEb,EAAE2K,MAAMyrP,MAAeQ,GAAS,yBACrCA,GAAS,IAAM5f,GAAUn2O,EAAEb,GAAK,QAEjC42P,GAAS,QACTr3P,EAAEA,EAAEqC,QAAWg1P,CAXkD,CAclE,OADGr3P,EAAEqC,OAAO,IAAIrC,EAAEA,EAAEqC,QAAW,SAAWrC,EAAE,GAAGA,EAAE,GAAGkF,QAAQ,KAAK,MAC1DlF,EAAE+F,KAAK,GACf,CAuCA,IAAIuxP,GAvoKJ,SAAuB12K,EAAkB5gF,GAExC,IAAIg/O,GAAQ,EAGZ,OAH4B,MAALh/O,IAAag/O,GAAQ,EAAMh/O,EAAI2pO,GAAQ,GAAK,EAAI/oJ,EAAIngF,EAAE4B,SAC7ErC,EAAEqlO,YAAY,EAAG,GACjB0Z,GAAmBn+J,EAAIngF,EAAGT,GACnBg/O,EAAQh/O,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,CAClC,EAmoKA,SAASu3P,GAAcR,GACtB,IAAIxwM,EAAKi1L,KACTM,GAAav1L,EAAI,IAXlB,SAA2BwwM,EAAK/2P,GAI/B,OAHIA,IAAGA,EAAI2pO,GAAQ,IACnB3pO,EAAEqlO,YAAY,EAAG0xB,EAAIG,OACrBl3P,EAAEqlO,YAAY,EAAG0xB,EAAIK,QACdp3P,CACR,CAM4Cw3P,CAAkBT,IAC7D,IAAI,IAAIv3P,EAAI,EAAGA,EAAIu3P,EAAI10P,SAAU7C,EAAGs8O,GAAav1L,EAAI,GAAyB+wM,GAAiBP,EAAIv3P,KAGnG,OADAs8O,GAAav1L,EAAI,KACVA,EAAGxjD,KACX,CACA,SAAS00P,GAAS72K,GACjB,GAAuB,qBAAb85I,GAA0B,OAAOA,GAASwY,MAAMrwD,OAAOq3C,GAAct5I,GAE/E,IADA,IAAI5gF,EAAsB,GAAIq6L,EAAKz5G,EAAI59E,MAAM,IACrCxD,EAAI,EAAGA,EAAI66L,EAAGh4L,SAAU7C,EAAGQ,EAAER,GAAK66L,EAAG76L,GAAGshF,WAAW,GAC3D,OAAO9gF,CACR,CA0LA,SAAS03P,GAAsCC,GAC9C,IAAuBC,EAEep4P,EAFlCq4P,EAAW,EACXC,EAAkBL,GAASE,GAC3Bz1N,EAAM41N,EAAgBz1P,OAAS,EAInC,KAFAu1P,EAAgBn8B,GAAYv5L,IACd,GAAK41N,EAAgBz1P,OAC/B7C,EAAI,EAAGA,GAAK0iC,IAAO1iC,EAAGo4P,EAAcp4P,GAAKs4P,EAAgBt4P,EAAE,GAC/D,IAAIA,EAAI0iC,EAAI,EAAG1iC,GAAK,IAAKA,EAKxBq4P,IAHyC,KAAZ,MAAXA,GAAiC,EAAI,GACtCA,GAAY,EAAK,OAFnBD,EAAcp4P,GAM9B,OAAkB,MAAXq4P,CACR,CA6GA,IAAIE,GAAoB,WACvB,SAASC,EAAan4P,EAAeguF,GACpC,OAAOA,EAAKv+E,MACX,IAAK,SAAU,OAAO2oP,EAAiB98B,GAAct7N,GAAIguF,GACzD,IAAK,SAAU,OAAOoqK,EAAiBp4P,EAAGguF,GAC1C,IAAK,SAAU,OAAOoqK,EAAiB78B,IAAWx6B,OAAOs7B,SAASr8N,GAAKA,EAAEsE,SAAS,UAAY43N,GAAIl8N,GAAIguF,GACtG,IAAK,QAAU,OAAOoqK,EAAiB3hB,GAAOz2O,GAAIguF,GAEnD,MAAM,IAAI5tD,MAAM,qBAAuB4tD,EAAKv+E,KAC7C,CAGA,SAAS2oP,EAAiBr3K,EAAgBiN,GACzC,IACIowJ,GADIpwJ,GAAQ,CAAC,GACQmwJ,MAAS,GAAe,CAAC,EAE9C3uN,EAAOuxD,EAAIx1E,MAAM,sBACrB,IAAIikB,EAAKhtB,OAAQ,MAAM,IAAI49B,MAAM,qBACjC,IAAIxZ,EAAmB,CAACnlB,EAAG,CAAC1B,EAAE,EAAGS,EAAE,GAAIyH,EAAG,CAAClI,EAAE,EAAGS,EAAEgvB,EAAKhtB,OAAS,IA0BhE,OAzBAgtB,EAAKsV,SAAQ,SAASuzN,EAAO5iM,GACzB5vD,MAAMxB,QAAQ+5O,KAAKA,EAAG3oL,GAAK,IAK9B,IAJA,IAEIyyB,EAFAowK,EAAQ,WACRC,EAAa,EAEb3jN,GAAK,EACFszC,EAAMowK,EAAMtwO,KAAKqwO,IAAS,CAChC,GACM,WADCnwK,EAAI,GACV,CACC,IAAInrD,EAAOs7N,EAAMj1P,MAAMm1P,EAAYD,EAAME,UAAYtwK,EAAI,GAAG1lF,QAG5D,GAFc,KAAXu6B,EAAK,KAAWA,EAAOA,EAAK35B,MAAM,MACnCwxC,EACC7X,EAAKv6B,OAAQ,CAEf,IAAI45O,EAAO,CAACjwO,EAAG4wB,EAAMn8B,EAAE,KACpBiF,MAAMxB,QAAQ+5O,GAAKA,EAAG3oL,GAAG7gB,GAAKwnM,EAC5BgC,EAAG1B,GAAY,CAACl8O,EAAEi1D,EAAG11D,EAAE60C,KAAOwnM,CACpC,CACK,CAEPmc,EAAaD,EAAME,SACpB,CACG5jN,EAAIhuB,EAAM3e,EAAElI,IAAG6mB,EAAM3e,EAAElI,EAAI60C,EAC/B,IACAwpM,EAAG,QAAUf,GAAaz2N,GACnBw3N,CACR,CAyBA,MAAO,CACNkO,YAxBD,SAAyBtsP,EAAeguF,GAAqB,OAAO4vJ,GAAkBua,EAAan4P,EAAGguF,GAAOA,EAAO,EAyBnHu+J,SAAU4L,EACV3L,WAvBD,SAAsBpO,GAIrB,IAHA,IACuChC,EADnCj8O,EAAI,CAAC,iBACLK,EAAI88O,GAAkBc,EAAG,SACzBD,EAAQt4O,MAAMxB,QAAQ+5O,GAClB3oL,EAAIj1D,EAAEiB,EAAEjB,EAAGi1D,GAAKj1D,EAAEyH,EAAEzH,IAAKi1D,EAAG,CACnCt1D,EAAE2C,KAAK,uBACP,IAAI,IAAI8xC,EAAIp0C,EAAEiB,EAAE1B,EAAG60C,GAAKp0C,EAAEyH,EAAElI,IAAK60C,EAAGz0C,EAAE2C,KAAK,WAAa8xC,EAAE,IAE1D,IADAz0C,EAAE2C,KAAK,iBACH8xC,EAAIp0C,EAAEiB,EAAE1B,EAAG60C,GAAKp0C,EAAEyH,EAAElI,IAAK60C,EAAG,CAC/B,IAAI+8M,EAAQjV,GAAY,CAACl8O,EAAEi1D,EAAE11D,EAAE60C,KAC/BwnM,EAAO+B,GAASC,EAAG3oL,IAAI,IAAI7gB,GAAIwpM,EAAGuT,MACZ,MAAVvV,EAAKjwO,GAAeiwO,EAAKh4M,IAAKg4M,EAAKn2L,KAC/C9lD,EAAE2C,KAAK,KAAOs5O,EAAKp2L,IAAM03L,GAAYtB,GAAOA,EAAKp2L,KACjD7lD,EAAE2C,KAAK,UACR,CACA3C,EAAE2C,KAAK,qBACR,CACA,OAAO3C,EAAE+F,KAAK,IAAM,GACrB,EAOD,CA3EwB,GAgFxB,SAASuyP,GAAQhX,GAChB,IAAI,IAAI9hP,EAAE,EAAEQ,EAAE,EAAM,GAAHR,IAAQA,EAAGQ,EAAM,IAAFA,GAASshP,EAAI9hP,GAAG,IAAI,IAAI8hP,EAAI9hP,GAAG,EAAE,EAAE8hP,EAAI9hP,IACvE,OAAOQ,EAAEmE,SAAS,IAAIk9B,cAAcp+B,MAAM,EAC3C,CA8CA,IAA4Cs1P,GAA9B,EACd,SAASnH,GAASzxO,GAAS,OAAOnc,KAAKC,OAAQkc,EAASnc,KAAK23B,MAAM,IAAIo9N,IAAM,KAAOA,GAAO,CAC3F,SAASlH,GAAQvwN,GAAM,OAAQt9B,KAAKC,OAAOq9B,EAAK,GAAGy3N,GAAM,IAAM,IAAM,GAAK,CAC1E,SAASC,GAAWC,GAAO,OAAQj1P,KAAK23B,OAAOs9N,EAAMF,GAAM,GAAGA,GAAI,KAAM,GAAK,CAsB7E,SAAShI,GAAYmI,GACjBA,EAAK/4O,OACP+4O,EAAKvH,IAAMC,GAASsH,EAAK/4O,OACzB+4O,EAAKzM,IAAMoF,GAAQqH,EAAKvH,KACxBuH,EAAKH,IAAMA,IACFG,EAAKvH,KACduH,EAAKzM,IAAMoF,GAAQqH,EAAKvH,KACxBuH,EAAK/4O,MAAQ64O,GAAWE,EAAKzM,KAC7ByM,EAAKH,IAAMA,IACiB,iBAAZG,EAAKzM,MACrByM,EAAK/4O,MAAQ64O,GAAWE,EAAKzM,KAC7ByM,EAAKvH,IAAMC,GAASsH,EAAK/4O,OACzB+4O,EAAKH,IAAMA,IAETG,EAAKC,oBAAoBD,EAAKC,WAClC,CAEA,IAAkBC,GAAJ,GACd,SAAStH,GAAMxwN,GAAM,OAAY,GAALA,EAAU83N,EAAK,CAC3C,SAASlI,GAAMmI,GAAM,OAAOA,EAAKD,GAAM,EAAI,CAib3C,SAASE,GAAc9pN,EAAiB6+C,GACvC,IAGKhoC,EAHD7lD,EAAI,CAACo3O,GAAYsB,GAAU,aAAc,KAAM,CAClD,MAASG,GAAW,GACpB,WAAYD,MAab,OAXG5pM,EAAG+pN,KAAsC,OAA9BlzM,EAhIf,SAAuBmzM,GACtB,IAAIh5P,EAAI,CAAC,aAIT,MAHA,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAO,GAAgB,MAAM2kC,SAAQ,SAAStkC,GACpE,IAAI,IAAIb,EAAIa,EAAE,GAAIb,GAAKa,EAAE,KAAMb,EAAe,MAATw5P,EAAGx5P,KAAYQ,EAAEA,EAAEqC,QAAWq2O,GAAU,SAAS,KAAK,CAAC4E,SAAS99O,EAAEy5P,WAAWxhB,GAAUuhB,EAAGx5P,MAChI,IACgB,IAAbQ,EAAEqC,OAAqB,IAC1BrC,EAAEA,EAAEqC,QAAW,aACfrC,EAAE,GAAK04O,GAAU,UAAW,KAAM,CAAEp9M,MAAMt7B,EAAEqC,OAAO,IAAK6C,QAAQ,KAAM,KAC/DlF,EAAE+F,KAAK,IACf,CAuHmBmzP,CAAclqN,EAAG+pN,QAAe/4P,EAAEA,EAAEqC,QAAUwjD,GAChE7lD,EAAEA,EAAEqC,QAAW,oIACfrC,EAAEA,EAAEqC,QAAW,2HACfrC,EAAEA,EAAEqC,QAAW,0FACfrC,EAAEA,EAAEqC,QAAW,gGACXwjD,EAhEL,SAAuBszM,GACtB,IAAIn5P,EAAsB,GAM1B,OALAA,EAAEA,EAAEqC,QAAWq2O,GAAU,UAAU,MACnCygB,EAAQx0N,SAAQ,SAAS/kC,GACxBI,EAAEA,EAAEqC,QAAWq2O,GAAU,KAAM,KAAM94O,EACtC,IACAI,EAAEA,EAAEqC,QAAW,aACC,IAAbrC,EAAEqC,OAAqB,IAC1BrC,EAAE,GAAK04O,GAAU,UAAU,KAAM,CAACp9M,MAAMt7B,EAAEqC,OAAO,IAAI6C,QAAQ,KAAK,KAC3DlF,EAAE+F,KAAK,IACf,CAsDSqzP,CAAcvrK,EAAKsrK,YAAWn5P,EAAEA,EAAEqC,QAAWwjD,GACrD7lD,EAAEA,EAAEqC,QAAW,uFACfrC,EAAEA,EAAEqC,QAAW,oBACfrC,EAAEA,EAAEqC,QAAW,uGAEZrC,EAAEqC,OAAO,IAAIrC,EAAEA,EAAEqC,QAAW,gBAAkBrC,EAAE,GAAGA,EAAE,GAAGkF,QAAQ,KAAK,MACjElF,EAAE+F,KAAK,GACf,CAOA,SAASszP,GAAa75P,EAAcykC,EAAcjkC,GAC7CA,IAAGA,EAAI2pO,GAAQ,EAAI,EAAI1lM,EAAE5hC,SAC7BrC,EAAEqlO,YAAY,EAAG7lO,GACjBu/O,GAAmB96M,EAAGjkC,GACtB,IAAI6gF,EAAO7gF,EAAEqC,OAASrC,EAAEP,EAAKO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,EAE/C,OADU,MAAPA,EAAEP,IAAWO,EAAEP,EAAIO,EAAEqC,QACjBw+E,CACR,CA+CA,SAASy4K,GAAcl/N,EAAcp6B,GAChCA,IAAGA,EAAI2pO,GAAQ,MACnB3pO,EAAEqlO,YAAY,EAAa,GAAVjrM,EAAKsrM,IA55LvB,SAAyBtrM,EAAMp6B,GACzBA,IAAGA,EAAI2pO,GAAQ,IACpB,IAAI4vB,GACFn/N,EAAKo/N,OAAS,EAAO,IACrBp/N,EAAKq/N,OAAS,EAAO,IACrBr/N,EAAKs/N,QAAU,GAAO,IACtBt/N,EAAKu/N,OAAS,GAAO,IACrBv/N,EAAKw/N,SAAW,GAAO,IACvBx/N,EAAKr4B,OAAS,IAAO,GACvB/B,EAAEqlO,YAAY,EAAGk0B,GACjBv5P,EAAEqlO,YAAY,EAAG,EAElB,CAi5LCw0B,CAAgBz/N,EAAMp6B,GACtBA,EAAEqlO,YAAY,EAAGjrM,EAAK0/N,KAAO,IAAS,KACtC,IAAIC,EAAM,EACW,eAAlB3/N,EAAK4/N,UAA4BD,EAAM,EAChB,aAAlB3/N,EAAK4/N,YAA0BD,EAAM,GAC7C/5P,EAAEqlO,YAAY,EAAG00B,GACjB/5P,EAAEqlO,YAAY,EAAGjrM,EAAK6/N,WAAa,GACnCj6P,EAAEqlO,YAAY,EAAGjrM,EAAK8/N,QAAU,GAChCl6P,EAAEqlO,YAAY,EAAGjrM,EAAKozC,SAAW,GACjCxtE,EAAEqlO,YAAY,EAAG,GACjB4b,GAAe7mN,EAAK8kB,MAAOl/C,GAC3B,IAAIy/J,EAAS,EAKb,MAJkB,SAAfrlI,EAAKqlI,SAAmBA,EAAS,GAClB,SAAfrlI,EAAKqlI,SAAmBA,EAAS,GACpCz/J,EAAEqlO,YAAY,EAAG5lE,GACjBs/E,GAAmB3kN,EAAKt6B,KAAME,GACvBA,EAAEqC,OAASrC,EAAEP,EAAIO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,CAC3C,CAGA,IAqBIm6P,GArBAC,GAAkB,CACrB,OACA,QACA,aACA,WACA,YACA,iBACA,eACA,WACA,SACA,WACA,cACA,kBACA,gBACA,YACA,UACA,YACA,eACA,UACA,YAIGC,GAAgB9e,GACpB,SAAS+e,GAAcr+N,EAAMj8B,GACxBA,IAAGA,EAAI2pO,GAAQ,KACfwwB,KAAqBA,GAAuB3kB,GAAM4kB,KACtD,IAAIG,EAAiBJ,GAAoBl+N,EAAKu+N,aACpC,MAAPD,IAAaA,EAAM,IACtBv6P,EAAEqlO,YAAY,EAAGk1B,GACjB,IAAIh3P,EAAI,EACR,GAAU,IAAPg3P,EAMF,IAJAtZ,GAAe,CAACC,KAAK,GAAIlhP,GAEzBihP,GAAe,CAACC,KAAK,GAAIlhP,GAEnBuD,EAAI,KAAMA,EAAGvD,EAAEqlO,YAAY,EAAG,OAC9B,CACN,KAAM9hO,EAAI,IAAKA,EAAGvD,EAAEqlO,YAAY,EAAG,GAEnC,KAAM9hO,EAAI,KAAMA,EAAGvD,EAAEqlO,YAAY,EAAG,EASrC,CACA,OAAOrlO,EAAEqC,OAASrC,EAAEP,EAAIO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,CAC3C,CAUA,SAASy6P,GAAY79N,EAAM2tN,EAAOvqP,GAC7BA,IAAGA,EAAI2pO,GAAQ,KACnB3pO,EAAEqlO,YAAY,EAAGklB,GAAO,GACxBvqP,EAAEqlO,YAAY,EAAGzoM,EAAK0gN,UAAU,GAChCt9O,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GAMjB,OAJArlO,EAAEqlO,YAAY,EADH,GAEXrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACVrlO,CACR,CAGA,SAAS06P,GAAW99N,EAAM58B,GAMzB,OALIA,IAAGA,EAAI2pO,GAAQ,KACnB3pO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACVrlO,CACR,CAEA,IAAI26P,GAAkBpf,GA2ItB,SAASqf,GAAkBr0M,GAC1B,IA3IgCvmD,EA8IhC87O,GAAav1L,EAAI,IAA8Bq4L,GAHrC,IAIV9C,GAAav1L,EAAI,IA9IbvmD,IAAGA,EAAI2pO,GAAQ,KACnB3pO,EAAEqlO,YAAY,EAAG,GACjBq1B,GAAW,EAAM16P,GACjB06P,GAAW,EAAM16P,GACjB06P,GAAW,EAAM16P,GACjB06P,GAAW,EAAM16P,GACjB06P,GAAW,EAAM16P,GACVA,EAAEqC,OAASrC,EAAEP,EAAIO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,IAyI1C87O,GAAav1L,EAAI,IAClB,CAsBA,SAASs0M,GAAiBt0M,GACzB,IA7JuB/tB,EAAOx4B,EA+J9B87O,GAAav1L,EAAI,IAA6Bq4L,GAFpC,IAGV9C,GAAav1L,EAAI,IAhKM/tB,EAgKgC,CACtDsiO,KAAK,EACLC,UAAU,EACVj7P,KAAK,UAlKFE,IAAGA,EAAI2pO,GAAQ,KACnB3pO,EAAEqlO,YAAY,EAAG7sM,EAAMsiO,MACvB96P,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,GAAI7sM,EAAMuiO,WACxB/6P,EAAEqlO,YAAY,EAAG,GACjB6a,GAA2B1nN,EAAM14B,MAAQ,GAAIE,GACtCA,EAAEqC,OAASrC,EAAEP,EAAIO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,IA+J1C87O,GAAav1L,EAAI,IAClB,CAUA,SAASy0M,GAAsBz0M,GAG9Bu1L,GAAav1L,EAAI,IAzKlB,SAAmCqjL,EAAKqxB,EAAeC,GACtD,IAAIl7P,EAAI2pO,GAAQ,MAIhB,OAHA3pO,EAAEqlO,YAAY,EAAGuE,GACjBsW,GAA2B+a,EAAej7P,GAC1CkgP,GAA2Bgb,EAAel7P,GACnCA,EAAEqC,OAASrC,EAAEP,EAAIO,EAAEiD,MAAM,EAAGjD,EAAEP,GAAKO,CAC3C,CAmKoDm7P,CAFzC,EAEwE,oBAAqB,sBAEvGrf,GAAav1L,EAAI,IAClB,CAQA,SAAS60M,GAAcpsN,EAAI6+C,GAC1B,IAAItnC,EAAKi1L,KAcT,OAbAM,GAAav1L,EAAI,KA/GlB,SAAwBA,EAAIyyM,GAC3B,GAAIA,EAAJ,CACA,IAAIpvB,EAAM,EACV,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAO,GAAgB,MAAMjlM,SAAQ,SAAStkC,GAEpE,IAAI,IAAIb,EAAIa,EAAE,GAAIb,GAAKa,EAAE,KAAMb,EAAe,MAATw5P,EAAGx5P,MAAcoqO,CACvD,IAEU,GAAPA,IACHkS,GAAav1L,EAAI,IAA2Bq4L,GAAehV,IAC3D,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,IAAI,CAAC,GAAG,IAAI,CAAO,GAAgB,MAAMjlM,SAAQ,SAAStkC,GAEpE,IAAI,IAAIb,EAAIa,EAAE,GAAIb,GAAKa,EAAE,KAAMb,EAAe,MAATw5P,EAAGx5P,IAAYs8O,GAAav1L,EAAI,GAAqB8yM,GAAa75P,EAAGw5P,EAAGx5P,IAC9G,IACAs8O,GAAav1L,EAAI,KAbH,CAcf,CAiGC80M,CAAe90M,EAAIvX,EAAG+pN,KA/FvB,SAAyBxyM,GAIxBu1L,GAAav1L,EAAI,IAA4Bq4L,GAHnC,IAIV9C,GAAav1L,EAAI,GAAsB+yM,GAAc,CACpD5zB,GAAG,GACHxmL,MAAO,CAACiiM,MAAM,GACdrhP,KAAM,UACNo6P,OAAQ,EACRz6F,OAAQ,WAGTq8E,GAAav1L,EAAI,IAClB,CAkFC+0M,CAAgB/0M,GAhFjB,SAAyBA,GAIxBu1L,GAAav1L,EAAI,IAA4Bq4L,GAHnC,IAIV9C,GAAav1L,EAAI,GAAsB+zM,GAAc,CAACE,YAAY,UAClE1e,GAAav1L,EAAI,GAAsB+zM,GAAc,CAACE,YAAY,aAElE1e,GAAav1L,EAAI,IAClB,CAwECg1M,CAAgBh1M,GAChBq0M,GAAkBr0M,GA7DnB,SAAgCA,GAE/Bu1L,GAAav1L,EAAI,IAAmCq4L,GAD1C,IAEV9C,GAAav1L,EAAI,GAAoBk0M,GAAY,CAChDnd,SAAU,EACVke,OAAU,EACVC,OAAU,EACVC,SAAU,GACR,QAEH5f,GAAav1L,EAAI,IAClB,CAmDCo1M,CAAuBp1M,GAjDxB,SAA2BA,EAAI3pB,GAC9Bk/M,GAAav1L,EAAI,IAA8Bq4L,GAAehiN,EAAKv6B,SACnEu6B,EAAK+H,SAAQ,SAAS/kC,GAAKk8O,GAAav1L,EAAI,GAAoBk0M,GAAY76P,EAAE,GAAK,IAEnFk8O,GAAav1L,EAAI,IAClB,CA6CCq1M,CAAkBr1M,EAAIsnC,EAAKsrK,SAC3B0B,GAAiBt0M,GA/BlB,SAAwBA,GAGvBu1L,GAAav1L,EAAI,IAA2Bq4L,GAFlC,IAIV9C,GAAav1L,EAAI,IAClB,CA0BCs1M,CAAet1M,GACfy0M,GAAsBz0M,GAGtBu1L,GAAav1L,EAAI,KACVA,EAAGxjD,KACX,CA6GA,SAAS+4P,GAAYC,EAAQluK,GAC5B,GAAGA,GAAQA,EAAKmuK,UAAW,OAAOnuK,EAAKmuK,UACvC,GAAGD,GAA+B,iBAAdA,EAAO//F,IAAiB,OAAO+/F,EAAO//F,IAC1D,IAAIh8J,EAAI,CAACo3O,IAsKT,OArKAp3O,EAAEA,EAAEqC,QAAU,gGACdrC,EAAEA,EAAEqC,QAAW,oBAEfrC,EAAEA,EAAEqC,QAAY,8BAChBrC,EAAEA,EAAEqC,QAAa,+DACjBrC,EAAEA,EAAEqC,QAAa,2DACjBrC,EAAEA,EAAEqC,QAAa,2CACjBrC,EAAEA,EAAEqC,QAAa,2CACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,mDACjBrC,EAAEA,EAAEqC,QAAa,+CACjBrC,EAAEA,EAAEqC,QAAa,qDACjBrC,EAAEA,EAAEqC,QAAY,iBAEhBrC,EAAEA,EAAEqC,QAAY,+BAChBrC,EAAEA,EAAEqC,QAAa,gBACjBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAc,sBAClBrC,EAAEA,EAAEqC,QAAc,sBAClBrC,EAAEA,EAAEqC,QAAc,iFAClBrC,EAAEA,EAAEqC,QAAc,+DAClBrC,EAAEA,EAAEqC,QAAc,kDAClBrC,EAAEA,EAAEqC,QAAc,8DAClBrC,EAAEA,EAAEqC,QAAc,qDAClBrC,EAAEA,EAAEqC,QAAc,qDAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,+CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,8CAClBrC,EAAEA,EAAEqC,QAAc,0DAClBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,uDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,+CAClBrC,EAAEA,EAAEqC,QAAc,kDAClBrC,EAAEA,EAAEqC,QAAc,qDAClBrC,EAAEA,EAAEqC,QAAc,qDAClBrC,EAAEA,EAAEqC,QAAc,sDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAa,iBACjBrC,EAAEA,EAAEqC,QAAa,gBACjBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAc,sBAClBrC,EAAEA,EAAEqC,QAAc,sBAClBrC,EAAEA,EAAEqC,QAAc,iFAClBrC,EAAEA,EAAEqC,QAAc,+DAClBrC,EAAEA,EAAEqC,QAAc,kDAClBrC,EAAEA,EAAEqC,QAAc,8DAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,8CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,8CAClBrC,EAAEA,EAAEqC,QAAc,0DAClBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,4CAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,uDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAc,+CAClBrC,EAAEA,EAAEqC,QAAc,kDAClBrC,EAAEA,EAAEqC,QAAc,qDAClBrC,EAAEA,EAAEqC,QAAc,2CAClBrC,EAAEA,EAAEqC,QAAc,sDAClBrC,EAAEA,EAAEqC,QAAc,6CAClBrC,EAAEA,EAAEqC,QAAa,iBACjBrC,EAAEA,EAAEqC,QAAY,kBAEhBrC,EAAEA,EAAEqC,QAAY,8BAChBrC,EAAEA,EAAEqC,QAAa,mBACjBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAe,YACnBrC,EAAEA,EAAEqC,QAAgB,4GACpBrC,EAAEA,EAAEqC,QAAgB,gHACpBrC,EAAEA,EAAEqC,QAAgB,iHACpBrC,EAAEA,EAAEqC,QAAe,aACnBrC,EAAEA,EAAEqC,QAAe,qCACnBrC,EAAEA,EAAEqC,QAAc,gBAClBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAe,YACnBrC,EAAEA,EAAEqC,QAAgB,oIACpBrC,EAAEA,EAAEqC,QAAgB,wIACpBrC,EAAEA,EAAEqC,QAAe,aACnBrC,EAAEA,EAAEqC,QAAe,qCACnBrC,EAAEA,EAAEqC,QAAc,gBAClBrC,EAAEA,EAAEqC,QAAa,oBACjBrC,EAAEA,EAAEqC,QAAa,iBACjBrC,EAAEA,EAAEqC,QAAc,mMAClBrC,EAAEA,EAAEqC,QAAc,yIAClBrC,EAAEA,EAAEqC,QAAc,yIAClBrC,EAAEA,EAAEqC,QAAa,kBACjBrC,EAAEA,EAAEqC,QAAa,qBACjBrC,EAAEA,EAAEqC,QAAc,kBAClBrC,EAAEA,EAAEqC,QAAe,gBACnBrC,EAAEA,EAAEqC,QAAgB,oJACpBrC,EAAEA,EAAEqC,QAAe,iBACnBrC,EAAEA,EAAEqC,QAAc,mBAClBrC,EAAEA,EAAEqC,QAAc,kBAClBrC,EAAEA,EAAEqC,QAAe,gBACnBrC,EAAEA,EAAEqC,QAAgB,oJACpBrC,EAAEA,EAAEqC,QAAe,iBACnBrC,EAAEA,EAAEqC,QAAc,mBAClBrC,EAAEA,EAAEqC,QAAc,kBAClBrC,EAAEA,EAAEqC,QAAe,gBACnBrC,EAAEA,EAAEqC,QAAgB,oJACpBrC,EAAEA,EAAEqC,QAAe,iBACnBrC,EAAEA,EAAEqC,QAAe,6LACnBrC,EAAEA,EAAEqC,QAAe,mDACnBrC,EAAEA,EAAEqC,QAAc,mBAClBrC,EAAEA,EAAEqC,QAAa,sBACjBrC,EAAEA,EAAEqC,QAAa,qBACjBrC,EAAEA,EAAEqC,QAAc,wDAClBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAe,YACnBrC,EAAEA,EAAEqC,QAAgB,4GACpBrC,EAAEA,EAAEqC,QAAgB,sIACpBrC,EAAEA,EAAEqC,QAAgB,kHACpBrC,EAAEA,EAAEqC,QAAe,aACnBrC,EAAEA,EAAEqC,QAAe,2FACnBrC,EAAEA,EAAEqC,QAAc,gBAClBrC,EAAEA,EAAEqC,QAAc,gCAClBrC,EAAEA,EAAEqC,QAAe,YACnBrC,EAAEA,EAAEqC,QAAgB,4GACpBrC,EAAEA,EAAEqC,QAAgB,kHACpBrC,EAAEA,EAAEqC,QAAe,aACnBrC,EAAEA,EAAEqC,QAAe,yFACnBrC,EAAEA,EAAEqC,QAAc,gBAClBrC,EAAEA,EAAEqC,QAAa,sBACjBrC,EAAEA,EAAEqC,QAAY,iBAChBrC,EAAEA,EAAEqC,QAAW,qBAEfrC,EAAEA,EAAEqC,QAAW,qBACfrC,EAAEA,EAAEqC,QAAY,YAChBrC,EAAEA,EAAEqC,QAAa,mSACjBrC,EAAEA,EAAEqC,QAAY,aAChBrC,EAAEA,EAAEqC,QAAY,YAChBrC,EAAEA,EAAEqC,QAAa,mSACjBrC,EAAEA,EAAEqC,QAAY,aAChBrC,EAAEA,EAAEqC,QAAW,sBACfrC,EAAEA,EAAEqC,QAAW,yBACfrC,EAAEA,EAAEqC,QAAU,aACPrC,EAAE+F,KAAK,GACf,CAmLA,SAASk2P,KACP,IAAI11M,EAAKi1L,KAqBT,OApBAM,GAAav1L,EAAI,KACjBu1L,GAAav1L,EAAI,IAAKq4L,GAAe,IACrC9C,GAAav1L,EAAI,IApFnB,SAA0B3pB,GACxB,IAAI58B,EAAI2pO,GAAQ,GAAK,EAAI/sM,EAAK98B,KAAKuC,QAInC,OAHArC,EAAEqlO,YAAY,EAAGzoM,EAAKqU,OACtBjxC,EAAEqlO,YAAY,EAAGzoM,EAAKzW,SACtB44N,GAAmBniN,EAAK98B,KAAME,GACvBA,EAAEiD,MAAM,EAAGjD,EAAEP,EACtB,CA8EwBy8P,CAAiB,CACrCp8P,KAAM,SACNqmB,QAAS,KACT8qB,MAAO,cAET6qM,GAAav1L,EAAI,KACjBu1L,GAAav1L,EAAI,IAnEnB,SAA6BqjL,EAAK9pO,GAChC,IAAIE,EAAI2pO,GAAQ,EAAI,EAAI7pO,EAAKuC,QAG7B,OAFArC,EAAEqlO,YAAY,EAAGuE,GACjBmV,GAAmBj/O,EAAME,GAClBA,EAAEiD,MAAM,EAAGjD,EAAEP,EACtB,CA8DwB08P,CAAoB,EAAG,WAC7CrgB,GAAav1L,EAAI,IACjBu1L,GAAav1L,EAAI,GAAIq4L,GAAe,MACpC9C,GAAav1L,EAAI,KAAMq4L,GAAe,IACtC9C,GAAav1L,EAAI,KAAMqiM,GAAY,IACnC9M,GAAav1L,EAAI,IACjBu1L,GAAav1L,EAAI,IACjBu1L,GAAav1L,EAAI,KACjBu1L,GAAav1L,EAAI,IAjEnB,SAA6BqjL,EAAKwyB,GAChC,IAAIp8P,EAAI2pO,GAAQ,GAGhB,OAFA3pO,EAAEqlO,YAAY,EAAGuE,GACjB5pO,EAAEqlO,YAAY,EAAG+2B,EAAK,EAAI,GACnBp8P,CACT,CA4DwBq8P,CAAoB,GAAG,IAC7CvgB,GAAav1L,EAAI,GArFnB,SAAsB+1M,GACpB,IAAIt8P,EAAI2pO,GAAQ,EAAI,EAAI2yB,EAAIj6P,QAC5BrC,EAAEqlO,YAAY,EAAGi3B,EAAIj6P,QACrB,IAAK,IAAI7C,EAAI,EAAGA,EAAI88P,EAAIj6P,SAAU7C,EAChCQ,EAAEqlO,YAAY,EAAGi3B,EAAI98P,GAAG,IACxBQ,EAAEqlO,YAAY,EAAGi3B,EAAI98P,GAAG,IAE1B,OAAOQ,CACT,CA6EuBu8P,CAAa,CAAC,CAAC,EAAG,MACvCzgB,GAAav1L,EAAI,KACjBu1L,GAAav1L,EAAI,KACVA,EAAGxjD,KACZ,CAiFA,SAASy5P,KACP,IAAIx8P,EAAI,CAACo3O,IAET,OADAp3O,EAAE2C,KAAK,q2BACA3C,EAAE+F,KAAK,GAChB,CA4HA,IAAI02P,GAAW,KACf,SAASC,GAAmBvX,EAAgB9C,GAY3C,IAXA,IAAIsa,EAAQ,CAAC,MAAO,OAEhBC,EAAO,CAAC,SAASD,EAAM,GAAGA,EAAM,GAAGA,EAAM,GAAGA,EAAM,GAAG,OAAO52P,KAAK,KACjE/F,EAAI,CACP04O,GAAU,MAAO,KAAM,CAAE,UAAWI,GAAU,UAAWA,GAAU,UAAWA,GAAU,WAAYA,KAAa5zO,QAAQ,MAAM,KAC/HwzO,GAAU,gBAAiBA,GAAU,UAAW,KAAM,CAAC,QAAQ,OAAQ,KAAOyM,IAAO,CAAC,QAAQ,SAC9FzM,GAAU,cAAe,CACxBA,GAAU,WAAY,KAAM,CAACmkB,UAAU,UACvCnkB,GAAU,SAAU,KAAM,CAACokB,gBAAgB,IAAK,gBAAgB,UAC/D/2P,KAAK,IAAK,CAACsJ,GAAG,cAAe,QAAQ,IAAK0tP,UAAUJ,EAAM52P,KAAK,KAAKlD,KAAK+5P,KAEtEH,GAAiB,IAANtX,GAAYsX,IAAY,IAqCzC,OAnCApa,EAAS19M,SAAQ,SAASz8B,GAC1B,IAAItI,EAAIo9O,GAAY90O,EAAE,IAClB80P,EAAkB,CAAC,OAAS,UAAW,KAAO,YAC9B,YAAjBA,EAAS1tP,OAAoB0tP,EAASxzP,MAAQ,QACjD,IAAIyzP,EAA4B,YAAjBD,EAAS1tP,KAAqBopO,GAAU,SAAU,KAAM,CAACppO,KAAK,mBAAoB,QAAQ,SAAW,KAChH4tP,EAAUxkB,GAAU,SAAUukB,EAAUD,KAG1CP,GAEFz8P,EAAIA,EAAEyF,OAAO,CACb,WAAagzO,GAAW,CACvBppO,GAAG,WAAaotP,GAChBntP,KAAK,eACLkpB,MAAM,yFAA2FtwB,EAAE,GAAGi/H,OAAS,qBAAuB,IACtIg2H,UAAU,UACVC,YAAY,YACR,IACJF,EACAxkB,GAAU,WAAY,KAZR,CAACpjO,GAAG,IAAK,SAAW,MAalCojO,GAAU,SAAU,KAAM,CAAC,gBAAgB,SAC3C,6DACA,mCACC,qBACA,qBAEAF,GAAS,WAAY,CAAC54O,EAAEA,EAAE,EAAG,EAAGA,EAAES,EAAE,EAAG,EAAGT,EAAEA,EAAE,EAAG,GAAIA,EAAES,EAAE,EAAG,IAAI0F,KAAK,MACrEyyO,GAAS,aAAc,SACvBA,GAAS,QAAS37L,OAAOj9C,EAAES,IAC3Bm4O,GAAS,WAAY37L,OAAOj9C,EAAEA,IAC9BsI,EAAE,GAAGi/H,OAAS,GAAK,eACpB,kBACD,cACI,IACJnnI,EAAE2C,KAAK,UACA3C,EAAE+F,KAAK,GACf,CAuEA,SAASs3P,GAAmBzgO,GAC3B,IAAI58B,EAAI,CAACo3O,GAAYsB,GAAU,WAAY,KAAM,CAAE,MAASG,GAAW,MAEnEykB,EAA4B,GAmChC,OAlCAt9P,EAAE2C,KAAK,aACPi6B,EAAK+H,SAAQ,SAASz8B,GAAKA,EAAE,GAAGy8B,SAAQ,SAASkhB,GAAK,IAAIxiB,EAAIo0M,GAAU5xL,EAAExiB,IAC/C,GAAvBi6N,EAAQl3P,QAAQi9B,KAClBi6N,EAAQ36P,KAAK0gC,GACbrjC,EAAE2C,KAAK,WAAa0gC,EAAI,cAEtBwiB,EAAE4X,GAAK5X,EAAE03M,KAAwC,GAAlCD,EAAQl3P,QAAQ,MAAQy/C,EAAE03M,MAC3CD,EAAQ36P,KAAK,MAAQkjD,EAAE03M,IACvBv9P,EAAE2C,KAAK,cAAqBkjD,EAAE03M,GAAK,aAErC,GAAI,IACiB,GAAlBD,EAAQj7P,SAAei7P,EAAQ36P,KAAK,WAAY3C,EAAE2C,KAAK,6BAC1D3C,EAAE2C,KAAK,cACP3C,EAAE2C,KAAK,iBACPi6B,EAAK+H,SAAQ,SAAS9kC,GAErB,IAAI29P,EAAa,EAAGhhI,EAAK,GAOzB,GANG38H,EAAE,GAAG,IAAMA,EAAE,GAAG,GAAG49D,GAAK59D,EAAE,GAAG,GAAG09P,GAAIC,EAAaF,EAAQl3P,QAAQ,MAAQvG,EAAE,GAAG,GAAG09P,IAC/E19P,EAAE,GAAG8kC,SAAQ,SAAS/kC,GACvBA,EAAEyjC,IAAGm6N,EAAaF,EAAQl3P,QAAQqxO,GAAU73O,EAAEyjC,KACjDm5F,EAAG75H,KAAK/C,EAAEa,GAAG,GACd,IACAT,EAAE2C,KAAK,iBAAmB9C,EAAE,GAAK,eAAiB29P,EAAa,YAC5DhhI,EAAGn6H,QAAU,EAAGrC,EAAE2C,KAAK61O,GAAS,IAAKf,GAAUj7G,EAAG,IAAI,UACpD,CAGJ,IADA,IAAI/7H,EAAI,iBAAoB+7H,EAAG,GAAM,KAC7Bh9H,EAAI,EAAGA,EAAIg9H,EAAGn6H,SAAU7C,EAAGiB,GAAK,eAAiB+7H,EAAGh9H,GAAK,KACjEQ,EAAE2C,KAAK61O,GAAS,IAAKf,GAAUh3O,IAChC,CACAT,EAAE2C,KAAK,oBACR,IACA3C,EAAE2C,KAAK,kBACJ3C,EAAEqC,OAAO,IAAKrC,EAAEA,EAAEqC,QAAW,cAAgBrC,EAAE,GAAGA,EAAE,GAAGkF,QAAQ,KAAK,MAChElF,EAAE+F,KAAK,GACf,CAyCA,SAAS03P,GAAgBpb,EAAUqb,EAAQ7vK,GAC1C,IAAI7tF,EAAI,CAACo3O,GAAYsB,GAAU,mBAAoB,KAAM,CAAE,MAASE,KAAe1zO,QAAQ,QAAS,MAkBpG,OAjBAm9O,EAAS19M,SAAQ,SAASg5N,GACzB,IAAIC,EAAS,IACZD,EAAK,IAAM,IAAIh5N,SAAQ,SAAS/kC,EAAG2vE,GACnC,GAAI3vE,EAAE69D,EAAN,CACG79D,EAAEyjC,IAA6B,GAAxBq6N,EAAOt3P,QAAQxG,EAAEyjC,IAAUq6N,EAAO/6P,KAAK/C,EAAEyjC,GACnD,IAAIw6N,EAAS,CACZvxM,IAAKqxM,EAAK,GACVtuP,GAAI,6BAA+B,eAAiBw+E,EAAKiwK,QAAQ76P,OAAO,IAAM,KAErE,GAAPssE,EAAUquL,EAASC,EAAOxuP,GACxBwuP,EAAOE,SAAWH,EACvBh+P,EAAE29P,GAAKM,EAAOxuP,GACXzP,EAAEyjC,IAAGw6N,EAAOG,SAAW,6BAA+B,eAAiBN,EAAOt3P,QAAQxG,EAAEyjC,IAAIpgC,OAAO,IAAM,KAC5GjD,EAAE2C,KAAK+1O,GAAU,kBAAmBF,GAAS,OAAQ54O,EAAEa,GAAG,IAAKo9P,GAV/B,aAAdj+P,EAAE29P,EAWrB,GACD,IACAv9P,EAAE2C,KAAK,uBACA3C,EAAE+F,KAAK,GACf,CAqEA,IAAIk4P,GAAyBpf,GA2C7B,SAASqf,GAAmBthO,GAC3B,IAAI2pB,EAAKi1L,KACL8hB,EAA4B,GA2BhC,OA1BAxhB,GAAav1L,EAAI,KAEjBu1L,GAAav1L,EAAI,KACjB3pB,EAAK+H,SAAQ,SAASw5N,GACrBA,EAAQ,GAAGx5N,SAAQ,SAAS/kC,GACxB09P,EAAQl3P,QAAQxG,EAAEyjC,IAAM,IAC3Bi6N,EAAQ36P,KAAK/C,EAAEyjC,EAAEpgC,MAAM,EAAE,KACzB64O,GAAav1L,EAAI,IApDpB,SAAgC3pB,GAAQ,OAAOmiN,GAAmBniN,EAAK35B,MAAM,EAAG,IAAM,CAoDnCm7P,CAAuBx+P,EAAEyjC,IAC1E,GACD,IACAy4M,GAAav1L,EAAI,KAEjBu1L,GAAav1L,EAAI,KACjB3pB,EAAK+H,SAAQ,SAASw5N,GACrBA,EAAQ,GAAGx5N,SAAQ,SAAS/kC,GAC3BA,EAAE09P,QAAUA,EAAQl3P,QAAQxG,EAAEyjC,GAC9B,IAAI5c,EAAQ,CAACnlB,EAAE07O,GAAYmhB,EAAQ,IAAIr2P,EAAEk1O,GAAYmhB,EAAQ,KAC7DriB,GAAav1L,EAAI,IA3EpB,SAA+B3pB,EAAM58B,GAQpC,OAPQ,MAALA,IAAWA,EAAI2pO,GAAQ,KAC1B3pO,EAAEqlO,YAAY,EAAGzoM,EAAK,GAAG0gO,SACzBxc,GAAoBlkN,EAAK,GAAa58B,GACtCA,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACVrlO,CACR,CAkEkDq+P,CAAsB,CAAC53O,EAAO7mB,KAC1EA,EAAEa,GAAKb,EAAEa,EAAE4B,OAAS,GAAGy5O,GAAav1L,EAAI,IAA6Bi5L,GAAqB5/O,IAC7Fk8O,GAAav1L,EAAI,YACV3mD,EAAE09P,OACV,GACD,IACAxhB,GAAav1L,EAAI,KAEjBu1L,GAAav1L,EAAI,KACVA,EAAGxjD,KACX,CAqBA,IAAIu7P,GAAU,CAAC,OAAQ,OAAQ,OAAQ,QAAS,OAOhD,IAAInO,GAAyB,WAC5B,IAAIoO,EAAU,gFACVC,EAAmB,CAACn+P,EAAE,EAAET,EAAE,GAC9B,SAAS6+P,EAAO3+B,EAAGC,EAAGC,EAAGC,GACxB,IAAIic,GAAO,EAAOC,GAAO,EAET,GAAbnc,EAAG39N,OAAa85O,GAAO,EACF,KAAhBnc,EAAG76N,OAAO,KAAag3O,GAAO,EAAMnc,EAAKA,EAAG/8N,MAAM,GAAI,IAE9C,GAAbg9N,EAAG59N,OAAa65O,GAAO,EACF,KAAhBjc,EAAG96N,OAAO,KAAa+2O,GAAO,EAAMjc,EAAKA,EAAGh9N,MAAM,GAAI,IAE9D,IAAIqyD,EAAI0qK,EAAG39N,OAAO,EAAkB,EAAhB+C,SAAS46N,EAAG,IAAM,EAAGvrL,EAAIwrL,EAAG59N,OAAO,EAAkB,EAAhB+C,SAAS66N,EAAG,IAAM,EAI3E,OAFGic,EAAMznM,GAAK+pN,EAAO5+P,IAAU60C,EAC5B0nM,EAAM7mL,GAAKkpM,EAAOn+P,IAAUi1D,EACxByqK,GAAMmc,EAAO,GAAK,KAAOS,GAAWloM,IAAM0nM,EAAO,GAAK,KAAOO,GAAWpnL,EAChF,CACA,OAAO,SAAkBopM,EAAiBl3P,GAEzC,OADAg3P,EAASh3P,EACFk3P,EAAKx5P,QAAQq5P,EAASE,EAC9B,CACD,CAtB6B,GAwBzBE,GAAY,iLACZ5N,GAAyB,WAC5B,OAAO,SAAkB2N,EAAiBl3P,GACzC,OAAOk3P,EAAKx5P,QAAQy5P,IAAW,SAASC,EAAI7+B,EAAIC,EAAIC,EAAI4+B,EAAIC,GAC3D,IAAIl/P,EAAIk9O,GAAW7c,IAAOD,EAAK,EAAIx4N,EAAK5H,GACpCS,EAAIu8O,GAAWkiB,IAAOD,EAAK,EAAIr3P,EAAKnH,GAGxC,OAAO0/N,EAAK,KAFE,GAAL1/N,EAAS,GAAMw+P,EAAsBx+P,EAAE,EAAnB,IAAMA,EAAI,KAEjB,KADR,GAALT,EAAS,GAAMogO,EAAsBpgO,EAAE,EAAnB,IAAMA,EAAI,IAExC,GACD,CACD,CAV6B,GAa7B,SAASywP,GAAkBpsN,EAAcr3B,GACxC,OAAOq3B,EAAE/+B,QAAQy5P,IAAW,SAASC,EAAI7+B,EAAIC,EAAIC,EAAI4+B,EAAIC,GACxD,OAAO/+B,GAAQ,KAAJC,EAAUA,EAAGC,EAAK0c,GAAWG,GAAW7c,GAAIrzN,EAAMhN,KAAS,KAAJi/P,EAAUA,EAAGC,EAAKpiB,GAAWE,GAAWkiB,GAAMlyP,EAAMvM,GACvH,GACD,CAiBA,SAAS0+P,GAAW50J,GAAQA,EAAK1qG,GAAG,CAAW,CAG/C,SAASu/P,GAAc70J,EAAM9nG,GAC5B,IAAIzC,EAAIuqG,EAAKs7H,WAAqB,GAAVpjO,EAAc,EAAI,GAC1C,MAAO,CAAK,MAAJzC,EAAaA,GAAK,GAAM,EAAIA,GAAK,GAAM,EAChD,CAGA,SAASq/P,GAAe90J,EAAM9nG,EAAQwrF,GACrC,IAAIhoC,EAAI,EACR,GAAGgoC,EAAM,CACR,GAAGA,EAAKuuJ,MAAQ,GAAKvuJ,EAAKuuJ,MAAQ,EAAG,OAAO8iB,GAAqB/0J,GAC5C,IAAbtc,EAAKuuJ,OAAYv2L,EAAI,EAC9B,CACA,IAAIxlD,EAAE8pG,EAAKs7H,WAAW5/K,GAAIyP,EAAE60C,EAAKs7H,WAAW5/K,GACxCjmD,EAAEo/P,GAAc70J,EAAM,GACtB11D,EAAEuqN,GAAc70J,EAAM,GAC1B,MAAO,CAAE7oG,EAAE,CAACjB,EAAEA,EAAGT,EAAEA,EAAE,GAAIs8O,KAAKt8O,EAAE,GAAIu8O,KAAKv8O,EAAE,IAAKkI,EAAE,CAACzH,EAAEi1D,EAAG11D,EAAE60C,EAAE,GAAIynM,KAAKznM,EAAE,GAAI0nM,KAAK1nM,EAAE,IACnF,CAEA,SAASyqN,GAAqB/0J,GAC7B,IAAI9pG,EAAE2+P,GAAc70J,EAAM,GAAI70C,EAAE0pM,GAAc70J,EAAM,GAChDvqG,EAAEuqG,EAAKs7H,WAAW,GAClBhxL,EAAE01D,EAAKs7H,WAAW,GACtB,MAAO,CAAEnkO,EAAE,CAACjB,EAAEA,EAAE,GAAIT,EAAEA,EAAGs8O,KAAK77O,EAAE,GAAI87O,KAAK97O,EAAE,IAAKyH,EAAE,CAACzH,EAAEi1D,EAAE,GAAI11D,EAAE60C,EAAGynM,KAAK5mL,EAAE,GAAI6mL,KAAK7mL,EAAE,IACnF,CAYA,SAAS6pM,GAAch1J,EAAM9nG,EAAQwrF,GACpC,GAAGA,GAAQA,EAAKuuJ,MAAQ,GAAKvuJ,EAAKuuJ,MAAQ,EAAG,OAK9C,SAA6BjyI,GAC5B,IAAI9pG,EAAI2+P,GAAc70J,EAAM,GACxBvqG,EAAIuqG,EAAKs7H,WAAW,GACxB,MAAO,CAACplO,EAAEA,EAAE,GAAIT,EAAEA,EAAGs8O,KAAK77O,EAAE,GAAI87O,KAAK97O,EAAE,GACxC,CATqD++P,CAAoBj1J,GACxE,IAAI9pG,EAAI8pG,EAAKs7H,WAAW53I,GAAqB,IAAbA,EAAKuuJ,KAAa,EAAI,GAClDx8O,EAAIo/P,GAAc70J,EAAM,GAC5B,MAAO,CAAC9pG,EAAEA,EAAGT,EAAEA,EAAE,GAAIs8O,KAAKt8O,EAAE,GAAIu8O,KAAKv8O,EAAE,GACxC,CAQA,SAASy/P,GAAiBl1J,GACzB,IAAI9pG,EAAI8pG,EAAKs7H,WAAW,GACpB7lO,EAAIuqG,EAAKs7H,WAAW,GACxB,MAAO,CAACplO,EAAEA,EAAGT,EAAM,IAAJA,EAAU0/P,WAAe,MAAJ1/P,GAAas8O,KAAKt8O,GAAG,GAAIu8O,KAAKv8O,GAAG,GACtE,CA8EA,SAAS2/P,GAAoBp1J,GAC5B,IAAIq1J,EAA2B,EAAjBr1J,EAAKA,EAAK1qG,EAAE,GAG1B,OADA0qG,EAAK1qG,GAAK,EACH,CAAC+/P,EAFQ,EAGjB,CAyCA,SAASC,GAAuBt1J,GAE/B,MAAO,CADIA,EAAKs7H,WAAW,GAAUt7H,EAAKs7H,WAAW,GAEtD,CA4FA,SAASi6B,GAAYv1J,EAAMiyI,GAC1B,IAAIj5O,EAAM,CAACgnG,EAAKs7H,WAAW,IAC3B,GAAW,IAAR2W,EAAY,OAAOj5O,EAAI,IACzB,KAAK,EAAMA,EAAI,GAAK,EAAM,MAC1B,KAAK,EAAMA,EAAI,GAAK,GAAM,MAC1B,KAAK,EAAMA,EAAI,GAAK,EAAM,MAC1B,KAAK,EAAMA,EAAI,GAAK,EAErB,OAAOA,EAAI,IACV,KAAK,EACJA,EAAI,GAAKslP,GAAUt+I,EAAM,GAAK,OAAS,QAC5B,IAARiyI,IAAYjyI,EAAK1qG,GAAK,GAAG,MAC7B,KAAK,GACL,KAAK,GACJ0D,EAAI,GAAKq6O,GAAKrzI,EAAKA,EAAK1qG,IACxB0qG,EAAK1qG,GAAe,IAAR28O,EAAc,EAAI,EAAI,MACnC,KAAK,EACJjyI,EAAK1qG,GAAK,EAAG,MACd,KAAK,EACJ0D,EAAI,GAAK49O,GAAW52I,GAAU,MAC/B,KAAK,EACJhnG,EAAI,GAAKkmP,GAAuBl/I,EAAM,EAAG,CAACiyI,KAAKA,EAAO,GAAKA,EAAO,EAAI,EAAIA,IAAQ,MACnF,QAAS,MAAM,IAAIn8M,MAAM,cAAgB98B,EAAI,IAE9C,OAAOA,CACR,CAGA,SAASw8P,GAAkBx1J,EAAMy1J,EAAK/xK,GAGrC,IAFA,IAAIvyD,EAAQ6uE,EAAKs7H,WAAyB,IAAb53I,EAAKuuJ,KAAc,EAAI,GAChDv7J,EAAuB,GACnBrhF,EAAI,EAAGA,GAAK87B,IAAS97B,EAAGqhF,EAAIl+E,MAAoB,IAAbkrF,EAAKuuJ,KAAcyE,GAAqBiJ,IAAa3/I,EAAM,IACtG,OAAOtpB,CACR,CAGA,SAASg/K,GAAoB11J,EAAM9nG,EAAQwrF,GAC1C,IAAIx+D,EAAO,EAAGm9N,EAAO,EACL,IAAb3+J,EAAKuuJ,MACP/sN,EAAO86E,EAAKs7H,WAAW,GACvB+mB,EAAOriJ,EAAKs7H,WAAW,KAEvB+mB,EAAO,EAAIriJ,EAAKs7H,WAAW,GAC3Bp2M,EAAO,EAAI86E,EAAKs7H,WAAW,IAEzB53I,EAAKuuJ,MAAQ,GAAKvuJ,EAAKuuJ,KAAO,MAAO/sN,EAAmB,KAARm9N,IAAWA,EAAO,MAErE,IAAI,IAAIhtP,EAAI,EAAGQ,EAA0B,GAAIR,GAAK6vB,IAASrvB,EAAER,GAAK,MAAOA,EACxE,IAAI,IAAI+D,EAAI,EAAGA,GAAKipP,IAAQjpP,EAAGvD,EAAER,GAAG+D,GAAKm8P,GAAYv1J,EAAMtc,EAAKuuJ,MACjE,OAAOp8O,CACR,CA6EA,SAAS8/P,GAAgB31J,EAAM9nG,EAAQwrF,GAEtC,OADAsc,EAAK1qG,GAAK,EACH,CAAC4/P,GAAiBl1J,GAC1B,CACA,SAAS41J,GAAiB51J,GAEzB,OADAA,EAAK1qG,GAAK,EACH,EACR,CAUA,SAASugQ,GAAgB71J,GAExB,OADAA,EAAK1qG,GAAK,EACH,CAACkpP,GAAYx+I,GAA4B,EAArBA,EAAKs7H,WAAW,GAC5C,CAEA,IAWIw6B,GAAY,CACf,OACA,MACA,UACA,KACA,SACA,KACA,eACA,KACA,SACA,KACA,KACA,KACA,cACA,KACA,KACA,KACA,YA6CD,IAAIC,GAAW,CACP,EAAa,CAAEl/P,EAAE,SAAUijC,EAxPnC,SAAsBkmE,EAAM9nG,EAAQwrF,GAEnC,OADAsc,EAAK1qG,IACFouF,GAAqB,IAAbA,EAAKuuJ,KAAmB,CAACjyI,EAAKs7H,WAAW,EAAG,KAAM,GAGtD,CAFGt7H,EAAKs7H,WAAW,GAChBt7H,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GAExD,GAmPQ,EAAa,CAAEp7O,EAAE,SAAUijC,EAnGhBs3M,IAoGX,EAAa,CAAEv6O,EAAE,SAAUijC,EAAE86N,IAC7B,EAAa,CAAE/9P,EAAE,SAAUijC,EAAE86N,IAC7B,EAAa,CAAE/9P,EAAE,SAAUijC,EAAE86N,IAC7B,EAAa,CAAE/9P,EAAE,SAAUijC,EAAE86N,IAC7B,EAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,EAAa,CAAE/9P,EAAE,YAAaijC,EAAE86N,IAChC,EAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,QAASijC,EAAE86N,IAC5B,GAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,GAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,GAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,GAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,GAAa,CAAE/9P,EAAE,YAAaijC,EAAE86N,IAChC,GAAa,CAAE/9P,EAAE,aAAcijC,EAAE86N,IACjC,GAAa,CAAE/9P,EAAE,WAAYijC,EAAE86N,IAC/B,GAAa,CAAE/9P,EAAE,aAAcijC,EAAE86N,IACjC,GAAa,CAAE/9P,EAAE,SAAUijC,EAzPnC,SAAsBkmE,EAAM9nG,EAAQwrF,GAAkB,OAAVsc,EAAK1qG,IAAYqpP,GAA2B3+I,EAAM9nG,EAAUwrF,EAAO,GA0PvG,GAAa,CAAE7sF,EAAE,WAAYijC,EAlDrC,SAAwBkmE,EAAM9nG,EAAQwrF,GAIrC,OAHAsc,EAAK1qG,GAAK,EACV0qG,EAAK1qG,GAAK,EACV0qG,EAAK1qG,GAAmB,GAAbouF,EAAKuuJ,KAAY,EAAI,EACzB,CAAC,WACT,GA8CQ,GAAa,CAAEp7O,EAAE,cAAeijC,EA7CxC,SAA2BkmE,EAAM9nG,EAAQwrF,GAExC,OADAsc,EAAK1qG,GAAmB,GAAbouF,EAAKuuJ,KAAY,EAAI,EACzB,CAAC,cACT,GA2CQ,GAAa,CAAEp7O,EAAE,SAAUijC,EAxQnC,SAAsBkmE,GAAkB,OAAVA,EAAK1qG,IAAY+9O,GAAKrzI,EAAKs7H,WAAW,GAAK,GAyQjE,GAAa,CAAEzkO,EAAE,UAAWijC,EAnQpC,SAAuBkmE,GAAkB,OAAVA,EAAK1qG,IAAiC,IAArB0qG,EAAKs7H,WAAW,EAAO,GAoQ/D,GAAa,CAAEzkO,EAAE,SAAUijC,EAvQnC,SAAsBkmE,GAAkB,OAAVA,EAAK1qG,IAAY0qG,EAAKs7H,WAAW,EAAI,GAwQ3D,GAAa,CAAEzkO,EAAE,SAAUijC,EAlQnC,SAAsBkmE,GAAkB,OAAVA,EAAK1qG,IAAYshP,GAAW52I,EAAU,GAmQ5D,GAAa,CAAEnpG,EAAE,WAAYijC,EAhZrC,SAAwBkmE,EAAM9nG,EAAQwrF,GACrC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAEtC,OADA0qG,EAAK1qG,GAAkB,GAAbouF,EAAKuuJ,KAAY,EAAiB,IAAbvuJ,EAAKuuJ,KAAa,GAAK,EAC/C,CAAC9sO,EACT,GA6YQ,GAAa,CAAEtO,EAAE,UAAWijC,EA9SpC,SAAuBkmE,EAAM9nG,EAAQwrF,GAEpC,IAAIv+E,GAAuB,GAAf66F,EAAKA,EAAK1qG,KAAY,EAClC0qG,EAAK1qG,GAAK,EACV,IAAI0gQ,EAAQh2J,EAAKs7H,WAAW53I,GAAQA,EAAKuuJ,MAAQ,EAAI,EAAI,GACzD,MAAO,CAACgkB,GAASD,GAAQE,GAAKF,GAAQ7wP,EACvC,GAySQ,GAAa,CAAEtO,EAAE,aAAcijC,EAvSvC,SAA0BkmE,EAAM9nG,EAAQwrF,GACvC,IAAIv+E,EAAO66F,EAAKA,EAAK1qG,KACjB6gQ,EAAUn2J,EAAKs7H,WAAW,GAAI86B,EAAM1yK,GAAQA,EAAKuuJ,MAAQ,EAAI,CAAU,IAAR9sO,GAAgB,EAAI,EAAI66F,EAAKs7H,WAAW,IAI5G,SAAkBt7H,GACjB,MAAO,CAACA,EAAKA,EAAK1qG,EAAE,IAAI,EAAwB,MAArB0qG,EAAKs7H,WAAW,GAC5C,CANiH+6B,CAASr2J,GACzH,MAAO,CAACm2J,GAAqB,IAAXC,EAAI,GAAWF,GAAOI,IAAOF,EAAI,IACpD,GAoSQ,GAAa,CAAEv/P,EAAE,UAAWijC,EA1MpC,SAAuBkmE,EAAM9nG,EAAQwrF,GACpC,IAAIv+E,EAAQ66F,EAAKs7H,WAAW,KAAO,EAAK,EACpC5/K,GAAMgoC,GAASA,EAAKuuJ,MAAQ,EAAM,EAAI,EACtCskB,EAAYv2J,EAAKs7H,WAAW5/K,GAChC,OAAOgoC,EAAKuuJ,MACX,KAAK,EAAGjyI,EAAK1qG,GAAK,EAAG,MACrB,KAAK,EAAG,KAAK,EAAG0qG,EAAK1qG,GAAK,EAAG,MAC7B,KAAK,EAAG0qG,EAAK1qG,GAAK,GAEnB,MAAO,CAAC6P,EAAM,EAAGoxP,EAClB,GAiMQ,GAAa,CAAE1/P,EAAE,SAAUijC,EA7UnC,SAAsBkmE,EAAM9nG,EAAQwrF,GAEnC,IAAIv+E,GAAuB,GAAf66F,EAAKA,EAAK1qG,KAAY,EAGlC,OAFA0qG,EAAK1qG,GAAK,EAEH,CAAC6P,EADE6vP,GAAch1J,EAAM,EAAGtc,GAElC,GAwUQ,GAAa,CAAE7sF,EAAE,UAAWijC,EAncpC,SAAuBkmE,EAAM9nG,EAAQwrF,GAGpC,MAAO,EAFsB,GAAjBsc,EAAKA,EAAK1qG,OAAgB,EAC3Bw/P,GAAe90J,EAAMtc,EAAKuuJ,MAAQ,GAAKvuJ,EAAKuuJ,KAAmBvuJ,GAE3E,GAgcQ,GAAa,CAAE7sF,EAAE,aAAcijC,EA/KvC,SAA0BkmE,EAAM9nG,EAAQwrF,GACvC,IAAIv+E,EAAQ66F,EAAKs7H,WAAW,KAAO,EAAK,EAGxC,OAFAt7H,EAAK1qG,GAAMouF,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,EAEjC,CAAC9sO,EADE66F,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GAExD,GA2KQ,GAAa,CAAEp7O,EAAE,YAAaijC,EA1IhBs3M,IA2Id,GAAa,CAAEv6O,EAAE,cAAeijC,EAzIhBs3M,IA0IhB,GAAa,CAAEv6O,EAAE,aAAcijC,EA1KvC,SAA0BkmE,EAAM9nG,EAAQwrF,GAGvC,MAAO,CAFKsc,EAAKs7H,WAAW,KAAO,EAAK,EAC9Bt7H,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GAExD,GAuKQ,GAAa,CAAEp7O,EAAE,YAAaijC,EAnKtC,SAAyBkmE,EAAM9nG,EAAQwrF,GACtC,IAAIv+E,EAAQ66F,EAAKs7H,WAAW,KAAO,EAAK,EAIxC,OAHAt7H,EAAK1qG,GAAK,EACPouF,EAAKuuJ,KAAO,GAAGjyI,EAAK1qG,IACP,IAAbouF,EAAKuuJ,OAAYjyI,EAAK1qG,GAAK,GACvB,CAAC6P,EACT,GA8JQ,GAAa,CAAEtO,EAAE,aAAcijC,EArbvC,SAA0BkmE,EAAM9nG,EAAQwrF,GACvC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAEtC,OADA0qG,EAAK1qG,GAAKouF,GAASA,EAAKuuJ,KAAO,EAAK,GAAMvuJ,EAAKuuJ,KAAO,EAAI,EAAI,EACvD,CAAC9sO,EACT,GAkbQ,GAAa,CAAEtO,EAAE,UAAWijC,EA5UpC,SAAuBkmE,EAAM9nG,EAAQwrF,GACpC,IAAIv+E,GAAuB,GAAf66F,EAAKA,EAAK1qG,KAAY,EAClC0qG,EAAK1qG,GAAK,EACV,IAAIu9M,EAvJL,SAA0B7yG,EAAM9nG,EAAQwrF,GACvC,IAAIuuJ,EAAOvuJ,GAAQA,EAAKuuJ,KAAOvuJ,EAAKuuJ,KAAO,EAC3C,GAAGA,GAAQ,GAAKA,GAAQ,EAAG,OAS5B,SAAgCjyI,GAC/B,IAAI/kC,EAAK+kC,EAAKs7H,WAAW,GACrB7lO,EAAIuqG,EAAKs7H,WAAW,GACpB0W,GAAa,MAAL/2K,IAAgB,GAAI82K,GAAa,MAAL92K,IAAgB,GAIxD,OAHAA,GAAM,MACK,GAAR+2K,GAAa/2K,GAAM,OAAQA,GAAU,OAC7B,GAAR82K,GAAat8O,GAAK,MAAMA,GAAQ,KAC5B,CAACS,EAAE+kE,EAAGxlE,EAAEA,EAAEs8O,KAAKA,EAAKC,KAAKA,EACjC,CAjBmCwkB,CAAuBx2J,GACzD,IAAI9pG,EAAI8pG,EAAKs7H,WAAW2W,GAAQ,GAAK,EAAI,GACrCz0K,EAAKwiC,EAAKs7H,WAAW,GACrByW,GAAa,MAALv0K,IAAgB,GAAIw0K,GAAa,MAALx0K,IAAgB,GAExD,GADAA,GAAM,MACK,GAARw0K,EAAW,KAAM97O,EAAI,QAASA,GAAK,QACtC,GAAW,GAAR67O,EAAW,KAAMv0K,EAAK,MAAQA,GAAU,MAC3C,MAAO,CAACtnE,EAAEA,EAAET,EAAE+nE,EAAGu0K,KAAKA,EAAKC,KAAKA,EACjC,CA6IWykB,CAAiBz2J,EAAM,EAAGtc,GACpC,MAAO,CAACv+E,EAAM0tM,EACf,GAwUQ,GAAa,CAAEh8M,EAAE,WAAYijC,EAparC,SAAwBkmE,EAAM9nG,EAAQwrF,GACrC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAClC8L,EA5FL,SAA2B4+F,EAAM9nG,EAAQwrF,GACxC,GAAGA,EAAKuuJ,KAAO,EAAG,OAAO8iB,GAAqB/0J,GAC9C,IAAI9pG,EAAE8pG,EAAKs7H,WAAwB,IAAb53I,EAAKuuJ,KAAa,EAAI,GAAI9mL,EAAE60C,EAAKs7H,WAAwB,IAAb53I,EAAKuuJ,KAAa,EAAI,GACpFx8O,EAAEo/P,GAAc70J,EAAM,GACtB11D,EAAEuqN,GAAc70J,EAAM,GAC1B,MAAO,CAAE7oG,EAAE,CAACjB,EAAEA,EAAGT,EAAEA,EAAE,GAAIs8O,KAAKt8O,EAAE,GAAIu8O,KAAKv8O,EAAE,IAAKkI,EAAE,CAACzH,EAAEi1D,EAAG11D,EAAE60C,EAAE,GAAIynM,KAAKznM,EAAE,GAAI0nM,KAAK1nM,EAAE,IACnF,CAsFYosN,CAAkB12J,EAAM9nG,EAAYwrF,GAC/C,MAAO,CAACv+E,EAAM/D,EACf,GAiaQ,GAAa,CAAEvK,EAAE,cAAeijC,EA5DxC,SAA2BkmE,GAG1B,MAAO,CAFKA,EAAKs7H,WAAW,KAAO,EAAK,EAC9Bt7H,EAAKs7H,WAAW,GAE3B,GAyDQ,GAAa,CAAEzkO,EAAE,eAAgBijC,EAxDzC,SAA4BkmE,GAG3B,MAAO,CAFKA,EAAKs7H,WAAW,KAAO,EAAK,EAC9Bt7H,EAAKs7H,WAAW,GAE3B,GAqDQ,GAAa,CAAEzkO,EAAE,WAAYijC,EA1MrC,SAAwBkmE,EAAM9nG,EAAQwrF,GACrC,OAAgB,GAAbA,EAAKuuJ,KAMT,SAA8BjyI,GAC7B,IAAI76F,EAAQ66F,EAAKs7H,WAAW,KAAO,EAAK,EACpCq7B,EAAO32J,EAAKs7H,WAAW,EAAG,KAC9Bt7H,EAAK1qG,GAAK,EACV,IAAIihQ,EAAYv2J,EAAKs7H,WAAW,GAEhC,OADAt7H,EAAK1qG,GAAK,GACH,CAAC6P,EAAMwxP,EAAMJ,EACrB,CAb2BK,CAAqB52J,GAIxC,CAHKA,EAAKs7H,WAAW,KAAO,EAAK,EAC7Bt7H,EAAKs7H,WAAW,GACXt7H,EAAKs7H,WAAW,GAEjC,GAqMQ,GAAa,CAAEzkO,EAAE,WAAYijC,EAzUrC,SAAwBkmE,EAAM9nG,EAAQwrF,GACrC,IAAIv+E,GAAuB,GAAf66F,EAAKA,EAAK1qG,KAAY,EAClC0qG,EAAK1qG,GAAK,EACV,IAAIqhQ,EAAO32J,EAAKs7H,WAAW,GAG3B,OAFG53I,GAAqB,GAAbA,EAAKuuJ,OAAWjyI,EAAK1qG,GAAK,IAE9B,CAAC6P,EAAMwxP,EADJ3B,GAAch1J,EAAM,EAAGtc,GAElC,GAmUQ,GAAa,CAAE7sF,EAAE,YAAaijC,EAzctC,SAAyBkmE,EAAM9nG,EAAQwrF,GACtC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAClCqhQ,EAAO32J,EAAKs7H,WAAW,EAAG,KAE9B,GAAG53I,EAAM,OAAOA,EAAKuuJ,MACpB,KAAK,EAAGjyI,EAAK1qG,GAAK,GAAW,MAC7B,KAAK,GAAIomD,EAGV,MAAO,CAACv2C,EAAMwxP,EADH7B,GAAe90J,EAAMtkD,EAAGgoC,GAEpC,GAgcQ,GAAa,CAAE7sF,EAAE,cAAeijC,EAnKxC,SAA2BkmE,EAAM9nG,EAAQwrF,GACxC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAClCqhQ,EAAO32J,EAAKs7H,WAAW,GACvB5/K,EAAI,EACR,GAAGgoC,EAAM,OAAOA,EAAKuuJ,MACpB,KAAK,EAAGv2L,EAAI,GAAI,MAChB,KAAK,GAAIA,EAAI,EAGd,OADAskD,EAAK1qG,GAAKomD,EACH,CAACv2C,EAAMwxP,EACf,GA0JQ,GAAa,CAAE9/P,EAAE,eAAgBijC,EAxbzC,SAA4BkmE,EAAM9nG,EAAQwrF,GACzC,IAAIv+E,GAAyB,GAAjB66F,EAAKA,EAAK1qG,OAAgB,EAClCqhQ,EAAO32J,EAAKs7H,WAAW,GACvB5/K,EAAI,EACR,GAAGgoC,EAAM,OAAOA,EAAKuuJ,MACpB,KAAK,EAAGjyI,EAAK1qG,GAAK,GAAIomD,EAAI,EAAG,MAC7B,KAAK,GAAIA,EAAI,GAGd,OADAskD,EAAK1qG,GAAKomD,EACH,CAACv2C,EAAMwxP,EACf,GA+aQ,IAAa,CAAC,GAGlBE,GAAW,CACP,GAAa,GAAa,GAAa,GACvC,GAAa,GAAa,GAAa,GACvC,GAAa,GAAa,GAAa,GACvC,GAAa,GAAa,GAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,GACvC,GAAa,GAAa,IAAa,IAG3CC,GAAQ,CACJ,EAAa,CAAEjgQ,EAAE,YAAaijC,EAAE+7N,IAChC,EAAa,CAAEh/P,EAAE,WAAYijC,EApJhB67N,IAqJb,EAAa,CAAE9+P,EAAE,YAAaijC,EAxKhB67N,IAyKd,EAAa,CAAE9+P,EAAE,YAAaijC,EApJhB67N,IAqJd,EAAa,CAAE9+P,EAAE,aAAcijC,EApKhB67N,IAqKf,GAAa,CAAE9+P,EAAE,gBAAiBijC,EA9JhB67N,IA+JlB,GAAa,CAAE9+P,EAAE,iBAAkBijC,EA3JhB87N,IA4JnB,GAAa,CAAE/+P,EAAE,aAAcijC,EA3KhB87N,IA4Kf,GAAa,CAAE/+P,EAAE,cAAeijC,EA1KhB87N,IA2KhB,GAAa,CAAE/+P,EAAE,mBAAoBijC,EAhKhB+7N,IAiKrB,GAAa,CAAEh/P,EAAE,UAAWijC,EArIpC,SAAuBkmE,GACtBA,EAAK1qG,GAAK,EACV,IAAIqhQ,EAAO32J,EAAKs7H,WAAW,GACvBx0L,EAAQk5D,EAAKs7H,WAAW,GACxBl2J,EAAM46B,EAAKs7H,WAAW,GACtB7lO,EAAIuqG,EAAKs7H,WAAW,GACpBhxL,EAAI01D,EAAKs7H,WAAW,GAExB,MAAO,CAACq7B,KAAMA,EAAMI,QAAe,EAANjwN,EAAYy0I,GADhCu6E,GAAWhvN,GAAS,EAAK,IACcs+B,IAAIA,EAAK3vE,EAAEA,EAAG60C,EAAEA,EACjE,GA6HQ,GAAa,CAAEzzC,EAAE,YAAaijC,EA3HtC,SAAyBkmE,GAExB,OADAA,EAAK1qG,GAAK,EACH,CAAC0qG,EAAKs7H,WAAW,GACzB,GAyHQ,IAAa,CAAC,GAElB07B,GAAQ,CACJ,EAAa,CAAEngQ,EAAE,cAAeijC,EArGxC,SAA2BkmE,GAE1B,OADAA,EAAK1qG,GAAK,EACH,CAAC,EAAG,EACZ,GAmGQ,EAAa,CAAEuB,EAAE,cAAeijC,EApaxC,SAA2BkmE,EAAM9nG,EAAQwrF,GACxC,IAAI2xK,EAA4B,IAAjBr1J,EAAKA,EAAK1qG,EAAE,GAAa,EAAI,EAE5C,OADA0qG,EAAK1qG,GAAKouF,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,EAChC,CAACojB,EACT,GAiaQ,EAAa,CAAEx+P,EAAE,YAAaijC,EAnbtC,SAAyBkmE,EAAM9nG,EAAQwrF,GACtC,IAAIuzK,EAA0B,IAAjBj3J,EAAKA,EAAK1qG,EAAE,GAAa,EAAI,EAE1C,OADA0qG,EAAK1qG,GAAK,EACH,CAAC2hQ,EAAOj3J,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GAC7D,GAgbQ,EAAa,CAAEp7O,EAAE,gBAAiBijC,EArc1C,SAA6BkmE,EAAM9nG,EAAQwrF,GAC1Csc,EAAK1qG,GAAI,EAIT,IAHA,IAAI0V,EAASg1F,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GACtDp8O,EAAsB,GAElBR,EAAI,EAAGA,GAAK2V,IAAU3V,EAAGQ,EAAE2C,KAAKwnG,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,IACrF,OAAOp8O,CACR,GA+bQ,EAAa,CAAEgB,EAAE,cAAeijC,EA5bxC,SAA2BkmE,EAAM9nG,EAAQwrF,GACxC,IAAIwzK,EAA4B,IAAjBl3J,EAAKA,EAAK1qG,EAAE,GAAa,EAAI,EAE5C,OADA0qG,EAAK1qG,GAAK,EACH,CAAC4hQ,EAASl3J,EAAKs7H,WAAW53I,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,GAC/D,GAybQ,GAAa,CAAEp7O,EAAE,aAAcijC,EAhWvC,SAA0BkmE,EAAM9nG,EAAQwrF,GACvCsc,EAAK1qG,GAAKouF,GAAqB,GAAbA,EAAKuuJ,KAAY,EAAI,CACxC,GA+VQ,GAAa,CAAEp7O,EAAE,gBAAiBijC,EAAEs7N,IACpC,GAAa,CAAEv+P,EAAE,gBAAiBijC,EAAEs7N,IACpC,GAAa,CAAEv+P,EAAE,eAAgBijC,EA9ZzC,SAA4BkmE,GAE3B,OADAA,EAAKs7H,WAAW,GACTg6B,GAAuBt1J,EAC/B,GA4ZQ,GAAa,CAAEnpG,EAAE,mBAAoBijC,EAzZ7C,SAAgCkmE,GAE/B,OADAA,EAAKs7H,WAAW,GACTg6B,GAAuBt1J,EAC/B,GAuZQ,IAAa,CAAEnpG,EAAE,iBAAkBijC,EApb3C,SAA8BkmE,GAC7B,IAAIi3J,EAA0B,IAAjBj3J,EAAKA,EAAK1qG,EAAE,GAAa,EAAI,EAE1C,OADA0qG,EAAK1qG,GAAK,EACH,CAAC2hQ,EAAOj3J,EAAKs7H,WAAW,GAChC,GAibQ,IAAa,CAAC,GAItB,SAAS67B,GAAen3J,EAAM9nG,EAAQk/P,EAAM1zK,GAC3C,GAAGA,EAAKuuJ,KAAO,EAAG,OAAOb,GAAUpxI,EAAM9nG,GAGzC,IAFA,IAAI6sC,EAASi7D,EAAK1qG,EAAI4C,EAClBrC,EAAI,GACAR,EAAI,EAAGA,IAAM+hQ,EAAKl/P,SAAU7C,EACnC,OAAO+hQ,EAAK/hQ,GAAG,IACd,IAAK,WACJ+hQ,EAAK/hQ,GAAG,GAAKqgQ,GAAoB11J,EAAM,EAAGtc,GAC1C7tF,EAAE2C,KAAK4+P,EAAK/hQ,GAAG,IACf,MACD,IAAK,aACJ+hQ,EAAK/hQ,GAAG,GAAKmgQ,GAAkBx1J,EAAMo3J,EAAK/hQ,GAAG,GAAIquF,GACjD7tF,EAAE2C,KAAK4+P,EAAK/hQ,GAAG,IACf,MACD,IAAK,SACDquF,GAAqB,IAAbA,EAAKuuJ,OACfmlB,EAAK/hQ,GAAG,GAAG,GAAK2qG,EAAKs7H,WAAW,GAChCzlO,EAAE2C,KAAK4+P,EAAK/hQ,GAAG,KACd,MACH,IAAK,UACL,IAAK,iBACL,IAAK,aACL,IAAK,cACJ,KAAM,eAAiB+hQ,EAAK/hQ,GAAG,GAQlC,OADc,KAHd6C,EAAS6sC,EAASi7D,EAAK1qG,IAGNO,EAAE2C,KAAK44O,GAAUpxI,EAAM9nG,IACjCrC,CACR,CAGA,SAASwhQ,GAAWr3J,EAAM9nG,EAAQwrF,GAGjC,IAFA,IACIv4B,EAAGjmD,EADH6/B,EAASi7D,EAAK1qG,EAAI4C,EACXo/P,EAAO,GACZvyN,GAAUi7D,EAAK1qG,GACpB4C,EAAS6sC,EAASi7D,EAAK1qG,EACvB4P,EAAK86F,EAAKA,EAAK1qG,GACf61D,EAAI4qM,GAAS7wP,IAAO6wP,GAASc,GAAS3xP,IAC5B,KAAPA,GAAsB,KAAPA,IAAaimD,GAAY,KAAPjmD,EAAc4xP,GAAQE,IAAOh3J,EAAKA,EAAK1qG,EAAI,KAC3E61D,GAAMA,EAAErxB,EACLw9N,EAAK9+P,KAAK,CAAC2yD,EAAEt0D,EAAGs0D,EAAErxB,EAAEkmE,EAAM9nG,EAAQwrF,KADV0tJ,GAAUpxI,EAAM9nG,GAGhD,OAAOo/P,CACR,CAEA,SAASC,GAAgBz9N,GAExB,IADA,IAAIjkC,EAAsB,GAClBR,EAAI,EAAGA,EAAIykC,EAAE5hC,SAAU7C,EAAG,CAEjC,IADA,IAAI0I,EAAI+7B,EAAEzkC,GAAIa,EAAsB,GAC5BkD,EAAI,EAAGA,EAAI2E,EAAE7F,SAAUkB,EAAG,CACjC,IAAI4E,EAAID,EAAE3E,GACV,GAAG4E,EAAG,GAEA,IAFOA,EAAE,GAIb9H,EAAEsC,KAAK,IAAMwF,EAAE,GAAGjD,QAAQ,KAAK,MAAQ,UAC/B7E,EAAEsC,KAAKwF,EAAE,SACZ9H,EAAEsC,KAAK,GACf,CACA3C,EAAE2C,KAAKtC,EAAE0F,KAAK,KACf,CACA,OAAO/F,EAAE+F,KAAK,IACf,CAGA,IAAI47P,GAAW,CACdC,OAAQ,IACRC,UAAW,IACXC,OAAQ,IACRC,MAAO,IACPC,MAAO,KACPC,MAAO,IACPC,MAAO,KACPC,MAAO,IACPC,OAAQ,IACRC,MAAO,KACPC,SAAU,IACVC,OAAQ,KAST,SAASC,GAAaC,EAAU3B,EAAiBjzK,GAChD,IAAI40K,EAAU,MAAO,cACrB,GAAG50K,EAAKuuJ,KAAO,KAAOqmB,EAASC,MAAQD,EAASC,IAAI5B,IAAQ,OAAO2B,EAAS7kB,WAAWkjB,GACvF,IAAI2B,EAASC,IAAK,MAAO,cACzB,IAAIA,EAAMD,EAASC,IAAI5B,GACvB,GAAGjzK,EAAKuuJ,KAAO,EAGd,OAFG0kB,EAAO,MAAOA,GAAO,OACrBA,EAAO,IAAGA,GAAQA,GACN,GAARA,EAAY,GAAK2B,EAASC,IAAI5B,EAAO,GAE7C,IAAI4B,EAAK,MAAO,cAChB,IAAI1iQ,EAAI,GACR,GAAG6tF,EAAKuuJ,KAAO,EAAG,OAAOqmB,EAASC,EAAI,IAAI,IACzC,KAAK,IAEJ,OADA1iQ,GAAe,GAAX0iQ,EAAI,GAAW,OAASD,EAAS7kB,WAAW8kB,EAAI,IAC7CA,EAAI,IAAMA,EAAI,GAAK1iQ,EAAIA,EAAI,IAAMyiQ,EAAS7kB,WAAW8kB,EAAI,IACjE,KAAK,IACJ,OAAe,MAAZ70K,EAAK80K,IAAoBF,EAAS7kB,WAAW/vJ,EAAK80K,KAC9C,cAAgBF,EAASC,EAAI,IAAI,GAGzC,QAAS,MAAO,aAAeD,EAASC,EAAI,IAAI,GAEjD,OAAOD,EAASC,EAAI,IAAI,GAAG,IAC1B,KAAK,KAEJ,OADA1iQ,GAAe,GAAX0iQ,EAAI,GAAW,OAAUD,EAAS7kB,WAAW8kB,EAAI,KAAO,cACrDA,EAAI,IAAMA,EAAI,GAAK1iQ,EAAIA,EAAI,IAAMyiQ,EAAS7kB,WAAW8kB,EAAI,IACjE,KAAK,MAAQ,OAAOD,EAASC,EAAI,IAAIz/P,MAAM,GAAGsD,KAAI,SAASzG,GAAQ,OAAOA,EAAK8iQ,IAAM,IAAG78P,KAAK,MAC7F,QACC,OAAI08P,EAASC,EAAI,IAAI,GAAG,IACxB1iQ,GAAe,GAAX0iQ,EAAI,GAAW,OAAUD,EAASC,EAAI,IAAI,GAAG,GAAGA,EAAI,KAAO,cACxDA,EAAI,IAAMA,EAAI,GAAK1iQ,EAAIA,EAAI,IAAMyiQ,EAASC,EAAI,IAAI,GAAG,GAAGA,EAAI,KAFhC,cAItC,CACA,SAASG,GAASJ,EAAU3B,EAAiBjzK,GAC5C,IAAIi1K,EAAUN,GAAaC,EAAU3B,EAAMjzK,GAC3C,MAAkB,QAAXi1K,EAAoBA,EAzC5B,SAAkCC,EAAkBl1K,GACnD,IAAIk1K,KAAWl1K,GAAQA,EAAKuuJ,MAAQ,GAAKvuJ,EAAKuuJ,MAAQ,GAAI,MAAM,IAAIn8M,MAAM,oBAC1E,MAAI,kCAAkCtY,KAAKo7O,GAAe,IAAMA,EAAQ,IACjEA,CACR,CAqCsCC,CAAyBF,EAASj1K,EACxE,CACA,SAASo1K,GAAkB/S,EAAuBzpO,EAAOw1N,EAAcwmB,EAAU50K,GAChF,IAEkCktI,EAAIC,EAAgBp7N,EAAsCS,EAFxF+7O,EAAQvuJ,GAAQA,EAAKuuJ,MAAS,EAC9BgC,EAAqC,CAAC98O,EAAE,CAAC1B,EAAE,EAAGS,EAAE,GAAGyH,EAAE,CAAClI,EAAE,EAAGS,EAAE,IAC7D8uB,EAA0B,GAA2C2xO,EAAK,EAAGoC,EAAQ,EAAMH,EAAM,GACrG,IAAI7S,EAAQ,KAAOA,EAAQ,GAAG,GAAI,MAAO,GAEzC,IADA,IAAIiT,GAAW,EAAG/uG,EAAK,GACf1vG,EAAK,EAAG0+M,EAAQlT,EAAQ,GAAG7tP,OAAQqiD,EAAK0+M,IAAS1+M,EAAI,CAC5D,IAAIzgB,EAAIisN,EAAQ,GAAGxrM,GACnB,OAAOzgB,EAAE,IACR,IAAK,YACJ9U,EAAMxsB,KAAK,IAAMwsB,EAAMzgB,OAAQ,MAChC,IAAK,WACJygB,EAAMxsB,KAAK,IAAMwsB,EAAMzgB,OAAQ,MAChC,IAAK,aACJygB,EAAMxsB,KAAKwsB,EAAMzgB,MAAQ,KAAM,MAEhC,IAAK,SACL,IAAK,YACL,IAAK,SACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,SACL,IAAK,QACL,IAAK,WACL,IAAK,SAEJ,GADAqsN,EAAK5rM,EAAMzgB,MAAOssN,EAAK7rM,EAAMzgB,MAC1By0P,GAAW,EAAG,CAChB,OAAOjT,EAAQ,GAAGiT,GAAS,GAAG,IAC7B,KAAK,EAEJ/uG,EAAKn4H,GAAK,IAAKi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAK,MAC5C,KAAK,EAEJ/uG,EAAKn4H,GAAK,KAAMi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAK,MAC7C,QAGC,GAFA/uG,EAAK,GAEFvmE,EAAKk4J,IAAK,MAAM,IAAI9lN,MAAM,+BAAiCiwN,EAAQ,GAAGiT,GAAS,GAAG,IAEvFnoC,GAAU5mE,EACV+uG,GAAW,CACZ,CACAh0O,EAAMxsB,KAAKq4N,EAAG2mC,GAAS19N,EAAE,IAAI82L,GAC7B,MAED,IAAK,WACJA,EAAK5rM,EAAMzgB,MAAOssN,EAAK7rM,EAAMzgB,MAC7BygB,EAAMxsB,KAAKq4N,EAAG,IAAID,GAClB,MACD,IAAK,WACJA,EAAK5rM,EAAMzgB,MAAOssN,EAAK7rM,EAAMzgB,MAC7BygB,EAAMxsB,KAAKq4N,EAAG,IAAID,GAClB,MACD,IAAK,WACJA,EAAK5rM,EAAMzgB,MAAOssN,EAAK7rM,EAAMzgB,MAC7BygB,EAAMxsB,KAAKq4N,EAAG,IAAID,GAClB,MAED,IAAK,gBAEL,IAAK,cAEL,IAAK,YAEL,IAAK,iBA2DL,IAAK,gBACL,IAAK,cA+FL,IAAK,aASL,IAAK,SAGL,IAAK,YAkBL,IAAK,cACL,IAAK,eACL,IAAK,cACL,IAAK,WACL,IAAK,cAGL,IAAK,aAEL,IAAK,cACJ,MA/LD,IAAK,SACkBn7N,EAAIo8O,GAAgB/3M,EAAE,GAAG,GAAam6M,EAAQvwJ,GACpE1+D,EAAMxsB,KAAK25O,GAAgB18O,EAAGw8O,IAC9B,MACD,IAAK,UACkBx8O,EAAIq8O,EAAOD,GAAgB/3M,EAAE,GAAG,GAAag4M,EAAMpuJ,GAAS5pD,EAAE,GAAG,GACvF9U,EAAMxsB,KAAK25O,GAAgB18O,EAAGw8O,IAC9B,MACD,IAAK,WACkB0kB,EAAoB78N,EAAE,GAAG,GAAWrkC,EAAIo8O,GAAgB/3M,EAAE,GAAG,GAAam6M,EAAQvwJ,GACxGk1K,EAAQF,GAASJ,EAAU3B,EAAMjzK,GAEjC1+D,EAAMxsB,KAAKogQ,EAAQ,IAAMzmB,GAAgB18O,EAAGw8O,IAC5C,MAED,IAAK,UACL,IAAK,aAEJ,IAAI6Z,EAAmBhyN,EAAE,GAAG,GAAax9B,EAAmBw9B,EAAE,GAAG,GAC7DgyN,IAAMA,EAAO,GAEjB,IAAI3uP,EAAe,IADnB2uP,GAAQ,KACe,GAAK9mO,EAAMlsB,OAAOgzP,GACzC9mO,EAAM9sB,QAAU4zP,EACJ,SAATxvP,IAAiBA,EAAOa,EAAKyB,SAChComB,EAAMxsB,KAAK8D,EAAO,IAAMa,EAAKvB,KAAK,KAAO,KACzC,MAED,IAAK,UACJopB,EAAMxsB,KAAKshC,EAAE,GAAK,OAAS,SAAU,MACtC,IAAK,SAOL,IAAK,SACJ9U,EAAMxsB,KAAkBshC,EAAE,IAAY,MANvC,IAAK,SACJ9U,EAAMxsB,KAAKk6C,OAAO5Y,EAAE,KAAM,MAC3B,IAAK,SAEJ9U,EAAMxsB,KAAK,IAAMshC,EAAE,GAAG/+B,QAAQ,KAAM,MAAQ,KAAM,MAGnD,IAAK,WACkB7E,EAAIg8O,GAAgBp4M,EAAE,GAAG,GAAIg4M,EAAO,CAAC36O,EAAE26O,GAAQmC,EAAQvwJ,GAC7E1+D,EAAMxsB,KAAK85O,GAAkBp8O,EAAYwtF,IACzC,MACD,IAAK,UACkBxtF,EAAIg8O,GAAgBp4M,EAAE,GAAG,GAAIm6M,EAAQvwJ,GAC3D1+D,EAAMxsB,KAAK85O,GAAkBp8O,EAAYwtF,IACzC,MACD,IAAK,YACkBizK,EAAoB78N,EAAE,GAAG,GAAW5jC,EAAI4jC,EAAE,GAAG,GACnE8+N,EAAQF,GAASJ,EAAU3B,EAAMjzK,GACjC1+D,EAAMxsB,KAAKogQ,EAAQ,IAAMtmB,GAAkBp8O,EAAYwtF,IACvD,MACD,IAAK,aACJ1+D,EAAMxsB,KAAK,OAASwsB,EAAMzgB,MAAQ,KAClC,MAMD,IAAK,UAEJw0P,EAAWj/N,EAAE,GAAG,GAChB,IAAIo/N,GAAOZ,EAAShtP,OAAO,IAAIytP,EAAQ,KAAOT,EAAS,IAAI,IAAIS,GAC3DpjQ,EAAOujQ,EAAMA,EAAIT,KAAO,cAAgB/lN,OAAOqmN,GAEhDpjQ,GAA2B,UAAnBA,EAAKmD,MAAM,EAAE,KAAmB4qF,EAAKy1K,OAAMxjQ,EAAOA,EAAKmD,MAAM,IACxEksB,EAAMxsB,KAAK7C,GACX,MAED,IAAK,WAEJ,IAA6EyjQ,EAAzEC,EAAsBv/N,EAAE,GAAG,GAE/B,GAF4Ci/N,EAAWj/N,EAAE,GAAG,KAEzD4pD,EAAKuuJ,MAAQ,GAGT,CACN,IAAIp8O,EAAI,GAQR,GAP0C,SAArCyiQ,EAASe,IAAU,IAAI,IAAI,IAAI,KACW,QAArCf,EAASe,IAAU,IAAI,IAAI,IAAI,GACrCf,EAASe,GAASN,IAAYT,EAASe,GAASN,GAASO,KAAO,IAClEzjQ,EAAIyiQ,EAAS7kB,WAAW6kB,EAASe,GAASN,GAASO,KAAK,GAAK,KAG1DzjQ,EAAIyiQ,EAAS7kB,WAAWslB,EAAQ,GAAI,KACtCT,EAASe,IAAYf,EAASe,GAASN,GAAUljQ,GAAKyiQ,EAASe,GAASN,GAASN,UAC/E,GAAGH,EAAS,IAAMA,EAAS,GAAGS,GAAUljQ,GAAKyiQ,EAAS,GAAGS,GAASN,SAClE,CACJ,IAAIc,GAAYlB,GAAaC,EAAUe,EAAS31K,IAAO,IAAI7qF,MAAM,MAC9D0gQ,EAASR,EAAU,GAAIljQ,EAAI0jQ,EAASR,EAAU,GAC5CljQ,GAAK,aACX,CACAmvB,EAAMxsB,KAAK3C,GACX,KACD,CApBIwjQ,EAAU,IAAGA,GAAWA,GACxBf,EAASe,KAAUD,EAAad,EAASe,GAASN,IAoBlDK,IAAYA,EAAa,CAACX,KAAM,gBACpCzzO,EAAMxsB,KAAK4gQ,EAAWX,MACtB,MAED,IAAK,WACJ,IAAIe,EAAK,IAAKC,EAAK,IACnB,GAAGT,GAAW,EAAG,CAEhB,OADA/uG,EAAK,GACE87F,EAAQ,GAAGiT,GAAS,GAAG,IAE7B,KAAK,EAAGQ,EAAK1nO,GAAK,IAAKi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAMQ,EAAI,MAExD,KAAK,EAAGA,EAAK1nO,GAAK,KAAMi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAMQ,EAAI,MAEzD,KAAK,EAAGC,EAAK3nO,GAAK,IAAKi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAMS,EAAI,MAExD,KAAK,EAAGA,EAAK3nO,GAAK,KAAMi0N,EAAQ,GAAGiT,GAAS,GAAG,IAAMS,EAAI,MACzD,QAEC,GAAG/1K,EAAKk4J,IAAK,MAAM,IAAI9lN,MAAM,+BAAiCiwN,EAAQ,GAAGiT,GAAS,GAAG,IAEvFA,GAAW,CACZ,CACAh0O,EAAMxsB,KAAKghQ,EAAKx0O,EAAMzgB,MAAQk1P,GAAK,MAEpC,IAAK,YAGL,IAAK,cA+CL,IAAK,aAGL,IAAK,eACJz0O,EAAMxsB,KAAK,SAAU,MAhDtB,IAAK,SACJ/C,EAAI,CAACA,EAAGqkC,EAAE,GAAG,GAAY5jC,EAAG4jC,EAAE,GAAG,IACjC,IAAImpB,EAAK,CAACxtD,EAAGq8O,EAAKr8O,EAAGS,EAAE47O,EAAK57O,GAC5B,GAAGoiQ,EAASoB,QAAQtnB,GAAY38O,IAAK,CACpC,IAAIkkQ,EAAWrB,EAASoB,QAAQtnB,GAAY38O,IAC5CuvB,EAAMxsB,KAAKsgQ,GAAkBa,EAAS1lB,EAAQhxL,EAAGq1M,EAAU50K,GAC5D,KAAO,CACN,IAAIk2K,GAAM,EACV,IAAIhpC,EAAG,EAAEA,GAAI0nC,EAASuB,OAAO3hQ,SAAU04N,EAGtC,GADAC,EAAKynC,EAASuB,OAAOjpC,KAClBn7N,EAAEA,EAAIo7N,EAAG,GAAG15N,EAAE1B,GAAKA,EAAEA,EAAIo7N,EAAG,GAAGlzN,EAAElI,MACjCA,EAAES,EAAI26N,EAAG,GAAG15N,EAAEjB,GAAKT,EAAES,EAAI26N,EAAG,GAAGlzN,EAAEzH,GAApC,CACA8uB,EAAMxsB,KAAKsgQ,GAAkBjoC,EAAG,GAAIojB,EAAQhxL,EAAGq1M,EAAU50K,IACzDk2K,GAAM,EACN,KAH+C,CAK5CA,GAAK50O,EAAMxsB,KAAkBshC,EAAE,GACpC,CACA,MAED,IAAK,WACJ9U,EAAMxsB,KAAK,IAAM++P,GAAuBz9N,EAAE,IAAkB,KAC5D,MAMD,IAAK,eACL,IAAK,mBACJk/N,EAAUz+M,EACV,MAQD,IAAK,aACJv1B,EAAMxsB,KAAK,IACX,MAQD,IAAK,UAEJwsB,EAAMxsB,KAAK,QAAUshC,EAAE,GAAGsrC,IAAM,KAAOtrC,EAAE,GAAGyhJ,GAAK,KACjD,MAcD,IAAK,YACL,IAAK,aACL,IAAK,cACL,IAAK,aACL,IAAK,YACL,IAAK,gBACL,IAAK,mBACL,IAAK,iBACL,IAAK,WACL,IAAK,YACJ,MAAM,IAAIzlJ,MAAM,oBAIjB,QAAS,MAAM,IAAIA,MAAM,+BAAiC4c,OAAO5Y,IAGlE,GAAgB,GAAb4pD,EAAKuuJ,MAAc+mB,GAAW,IAA+C,GAD/D,CAAC,eAAgB,mBAAoB,eACL/8P,QAAQ8pP,EAAQ,GAAGxrM,GAAI,IAAW,CAElF,IAAIu/M,GAAQ,EACZ,QAFAhgO,EAAIisN,EAAQ,GAAGiT,IAEN,GAAG,IAEX,KAAK,EAAGc,GAAQ,EAEhB,KAAK,EAEJ7vG,EAAKn4H,GAAK,IAAKgI,EAAE,GAAG,IAAK,MAC1B,KAAK,EAAGggO,GAAQ,EAEhB,KAAK,EAEJ7vG,EAAKn4H,GAAK,KAAMgI,EAAE,GAAG,IAAK,MAC3B,QAGC,GAFAmwH,EAAK,GAEFvmE,EAAKk4J,IAAK,MAAM,IAAI9lN,MAAM,+BAAiCgE,EAAE,GAAG,IAErE9U,EAAMxsB,MAAMshQ,EAAQ7vG,EAAK,IAAMjlI,EAAMzgB,OAASu1P,EAAQ,GAAK7vG,IAC3D+uG,GAAW,CACZ,CACD,CACA,GAAGh0O,EAAM9sB,OAAS,GAAKwrF,EAAKk4J,IAAK,MAAM,IAAI9lN,MAAM,qBACjD,OAAO9Q,EAAM,EACd,CAqFA,SAAS+0O,GAAcjoB,EAAe3mL,EAAc7gB,EAAco5C,EAAM2qG,GAEvE,IAAI2rE,EAAKxa,GAAcr0L,EAAG7gB,EAAG+jJ,GAGzB88C,EAnCL,SAA4B90O,GAC3B,GAAY,MAATA,EAAe,CAEjB,IAAIR,EAAI2pO,GAAQ,GAMhB,OALA3pO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,GACjBrlO,EAAEqlO,YAAY,EAAG,OACVrlO,CACR,CAAO,OAAoCghP,GAAjB,iBAATxgP,EAAqCA,EACpC,EACnB,CAuBU4jQ,CAAmBnoB,EAAKjwO,GAG7Bq4P,EAAK16B,GAAQ,GAEjB06B,EAAGh/B,YAAY,EADH,IAEZg/B,EAAGh/B,YAAY,EAAG,GAIlB,IADA,IAAI/gL,EAAKqlL,GAAQsS,EAAK33L,GAAGjiD,QACjB7C,EAAI,EAAGA,EAAIy8O,EAAK33L,GAAGjiD,SAAU7C,EAAG8kD,EAAG9kD,GAAKy8O,EAAK33L,GAAG9kD,GAGxD,OADUw8N,GAAQ,CAACmoC,EAAI7uB,EAAI+uB,EAAI//M,GAEhC,CAIA,SAASggN,GAAwB1nO,EAAMv6B,EAAQwrF,GAC9C,IAAI+xK,EAAMhjO,EAAK6oM,WAAW,GACtB87B,EAAOC,GAAW5kO,EAAMgjO,EAAK/xK,GAC7BvkD,EAAK1M,EAAK6oM,WAAW,GAEzB,MAAO,CAAC87B,EADGj4N,EAAK,EAAIg4N,GAAe1kO,EAAM0M,EAAIi4N,EAAM1zK,GAAQ,KAE5D,CAGA,IAAI02K,GAA+BD,GAE/BE,GAA8BF,GAM9BG,GAA8BH,GAE9BI,GAAgCJ,GAChC7D,GAAQ,CACV,EAAG,OACH,EAAG,OACH,EAAG,aACH,EAAG,YACH,EAAG,OACH,EAAG,UACH,EAAG,cACH,EAAG,aACH,EAAG,QACH,EAAG,gBACH,GAAI,OACJ,GAAI,aACJ,GAAI,cACJ,GAAI,cACJ,GAAI,cACJ,GAAI,OACJ,GAAI,QACJ,GAAI,MACJ,GAAI,iBACJ,GAAI,mBACJ,GAAI,iBACJ,GAAI,oBACJ,GAAI,OACJ,GAAI,UACJ,GAAI,mBACJ,GAAI,YACJ,GAAI,UACJ,GAAI,gBACJ,GAAI,cACJ,GAAI,YACJ,GAAI,UACJ,GAAI,cACJ,GAAI,eACJ,GAAI,eACJ,GAAI,OACJ,GAAI,cACJ,GAAI,QACJ,GAAI,gBACJ,GAAI,YACJ,GAAI,QACJ,GAAI,SACJ,GAAI,kBACJ,GAAI,eACJ,GAAI,OACJ,GAAI,MACJ,GAAI,OACJ,GAAI,QACJ,GAAI,QACJ,GAAI,gBACJ,GAAI,cACJ,GAAI,SACJ,GAAI,aACJ,GAAI,YACJ,GAAI,cACJ,GAAI,eACJ,GAAI,eACJ,GAAI,eACJ,GAAI,mBACJ,GAAI,mBACJ,GAAI,eACJ,GAAI,cACJ,GAAI,iBACJ,GAAI,eACJ,GAAI,cACJ,GAAI,kBACJ,GAAI,cACJ,GAAI,YACJ,GAAI,cACJ,GAAI,YACJ,GAAI,gBACJ,GAAI,OACJ,GAAI,SACJ,GAAI,cACJ,GAAI,YACJ,GAAI,eACJ,GAAI,mBACJ,GAAI,WACJ,GAAI,aACJ,GAAI,UACJ,GAAI,QACJ,GAAI,gBACJ,GAAI,cACJ,GAAI,cACJ,GAAI,QACJ,GAAI,UACJ,GAAI,OACJ,GAAI,SACJ,GAAI,YACJ,GAAI,UACJ,GAAI,eACJ,GAAI,gBACJ,GAAI,iBACJ,IAAK,iBACL,IAAK,oBACL,IAAK,oBACL,IAAK,WACL,IAAK,gBACL,IAAK,gBACL,IAAK,gBACL,IAAK,gBACL,IAAK,eACL,IAAK,SACL,IAAK,cACL,IAAK,gBACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,UACL,IAAK,UACL,IAAK,QACL,IAAK,MACL,IAAK,cACL,IAAK,iBACL,IAAK,UACL,IAAK,aACL,IAAK,eACL,IAAK,eACL,IAAK,aACL,IAAK,cACL,IAAK,cACL,IAAK,kBACL,IAAK,YACL,IAAK,iBACL,IAAK,cACL,IAAK,eACL,IAAK,eACL,IAAK,YACL,IAAK,QACL,IAAK,YACL,IAAK,UACL,IAAK,gBACL,IAAK,UACL,IAAK,aACL,IAAK,aACL,IAAK,gBACL,IAAK,YACL,IAAK,aACL,IAAK,UACL,IAAK,OACL,IAAK,cACL,IAAK,UACL,IAAK,YACL,IAAK,iBACL,IAAK,cACL,IAAK,oBACL,IAAK,gBACL,IAAK,eACL,IAAK,iBACL,IAAK,kBACL,IAAK,cACL,IAAK,qBACL,IAAK,SACL,IAAK,cACL,IAAK,WACL,IAAK,WACL,IAAK,eACL,IAAK,eACL,IAAK,iBACL,IAAK,eACL,IAAK,kBACL,IAAK,qBACL,IAAK,aACL,IAAK,YACL,IAAK,YACL,IAAK,gBACL,IAAK,cACL,IAAK,eACL,IAAK,kBACL,IAAK,oBACL,IAAK,kBACL,IAAK,iBACL,IAAK,UACL,IAAK,YACL,IAAK,YACL,IAAK,aACL,IAAK,cACL,IAAK,UACL,IAAK,SACL,IAAK,cACL,IAAK,UACL,IAAK,oBACL,IAAK,kBACL,IAAK,QACL,IAAK,aACL,IAAK,YACL,IAAK,cACL,IAAK,mBACL,IAAK,oBACL,IAAK,cACL,IAAK,cACL,IAAK,mBACL,IAAK,eACL,IAAK,aACL,IAAK,eACL,IAAK,gBACL,IAAK,aACL,IAAK,cACL,IAAK,cACL,IAAK,iBACL,IAAK,YACL,IAAK,cACL,IAAK,eACL,IAAK,aACL,IAAK,aACL,IAAK,gBACL,IAAK,eACL,IAAK,kBACL,IAAK,gBACL,IAAK,qBACL,IAAK,WACL,IAAK,OACL,IAAK,gBACL,IAAK,kBACL,IAAK,aACL,IAAK,aACL,IAAK,eACL,IAAK,iBACL,IAAK,cACL,IAAK,iBACL,IAAK,qBACL,IAAK,YACL,IAAK,oBACL,IAAK,WACL,IAAK,cACL,IAAK,iBACL,IAAK,WACL,IAAK,eACL,IAAK,gBACL,IAAK,gBACL,IAAK,mBACL,IAAK,iBACL,IAAK,eACL,IAAK,cACL,IAAK,YACL,IAAK,kBACL,IAAK,oBACL,IAAK,iBACL,IAAK,YACL,IAAK,aACL,IAAK,oBACL,IAAK,aACL,IAAK,eACL,IAAK,iBACL,IAAK,kBACL,IAAK,eACL,IAAK,gBACL,IAAK,gBACL,IAAK,qBACL,IAAK,mBACL,IAAK,qBACL,IAAK,yBACL,IAAK,cACL,IAAK,aACL,IAAK,mBACL,IAAK,sBACL,IAAK,eACL,IAAK,eACL,IAAK,gBACL,IAAK,cACL,IAAK,kBACL,IAAK,cACL,IAAK,gBACL,IAAK,kBACL,IAAK,2BACL,IAAK,eACL,IAAK,iBACL,IAAK,aACL,IAAK,iBACL,IAAK,YACL,IAAK,mBACL,IAAK,cACL,IAAK,wBACL,IAAK,kBACL,IAAK,qBACL,IAAK,kBACL,IAAK,kBACL,IAAK,kBACL,IAAK,qBACL,IAAK,aACL,IAAK,iBACL,IAAK,eACL,IAAK,mBACL,IAAK,aACL,IAAK,eACL,IAAK,kBACL,IAAK,gBACL,IAAK,gBACL,IAAK,kBACL,IAAK,kBACL,IAAK,gBACL,IAAK,iBACL,IAAK,uBACL,IAAK,0BACL,IAAK,iBACL,IAAK,eACL,IAAK,YACL,IAAK,cACL,IAAK,aACL,IAAK,iBACL,IAAK,kBACL,IAAK,kBACL,IAAK,gBACL,IAAK,k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ACL,IAAK,YACL,IAAK,MACL,IAAK,MACL,IAAK,MACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WACL,IAAK,WACL,IAAK,OACL,IAAK,UACL,IAAK,WACL,IAAK,cACL,IAAK,iBACL,IAAK,gBACL,IAAK,iBACL,IAAK,WACL,IAAK,cACL,IAAK,iBACL,IAAK,iBACL,IAAK,aACL,IAAK,QACL,IAAK,UACL,IAAK,WACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,SACL,IAAK,aACL,IAAK,MACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,WACL,IAAK,UACL,IAAK,OACL,IAAK,UACL,IAAK,YACL,IAAK,UACL,IAAK,OACL,IAAK,UACL,IAAK,UACL,IAAK,OACL,IAAK,WACL,IAAK,gBACL,IAAK,aACL,IAAK,eACL,IAAK,WACL,IAAK,YACL,IAAK,WACL,IAAK,OACL,IAAK,SACL,IAAK,OACL,IAAK,UACL,IAAK,QACL,IAAK,QACL,IAAK,YACL,IAAK,UACL,IAAK,aACL,IAAK,aACL,IAAK,WACL,IAAK,QACL,IAAK,UACL,IAAK,WACL,IAAK,QACL,IAAK,SACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,YACL,IAAK,MACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,UACL,IAAK,QACL,IAAK,MACL,IAAK,OACL,IAAK,UACL,IAAK,SACL,IAAK,WACL,IAAK,SACL,IAAK,aACL,IAAK,OACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,gBACL,IAAK,WACL,IAAK,aACL,IAAK,cACL,IAAK,gBACL,IAAK,kBACL,IAAK,gBACL,IAAK,WACL,IAAK,OACL,IAAK,QACL,IAAK,aACL,IAAK,KACL,IAAK,QACL,IAAK,SACL,IAAK,YACL,IAAK,cACL,IAAK,iBACL,IAAK,OACL,IAAK,gBACL,IAAK,WACL,IAAK,cACL,IAAK,WACL,IAAK,iBACL,IAAK,aACL,IAAK,YACL,IAAK,eACL,IAAK,eACL,IAAK,cACL,IAAK,aACL,IAAK,cACL,IAAK,eACL,IAAK,SACL,IAAK,WACL,IAAK,UACL,IAAK,UACL,IAAK,YACL,IAAK,UACL,IAAK,SACL,IAAK,SACL,IAAK,aACL,IAAK,YACL,IAAK,OACL,IAAK,YACL,IAAK,QACL,IAAK,OACL,IAAK,SACL,IAAK,YACL,IAAK,QACL,IAAK,YACL,IAAK,WACL,IAAK,UACL,IAAK,cACL,IAAK,cACL,IAAK,SACL,IAAK,eACL,IAAK,WACL,IAAK,YACL,IAAK,UACL,IAAK,WACL,IAAK,cACL,IAAK,MACL,IAAK,SACL,IAAK,UACL,IAAK,QACL,IAAK,UACL,IAAK,UACL,IAAK,WACL,IAAK,WACL,IAAK,UACL,IAAK,SACL,IAAK,QACL,IAAK,WACL,IAAK,QACL,IAAK,YACL,IAAK,UACL,IAAK,MACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,OACL,IAAK,QACL,IAAK,UACL,IAAK,UACL,IAAK,QACL,IAAK,OACL,IAAK,OACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,WACL,IAAK,aACL,IAAK,cACL,IAAK,OACL,IAAK,WACL,IAAK,OACL,IAAK,gBACL,IAAK,YACL,IAAK,cACL,IAAK,QACL,IAAK,iBACL,IAAK,kBACL,IAAK,kBACL,IAAK,iBACL,IAAK,UACL,IAAK,UACL,IAAK,WACL,IAAK,QACL,IAAK,UACL,IAAK,aACL,IAAK,eACL,IAAK,oBACL,IAAK,QACL,IAAK,UACL,IAAK,aACL,IAAK,eACL,IAAK,QACL,IAAK,cACL,IAAK,cACL,IAAK,WACL,IAAK,eACL,IAAK,YACL,IAAK,WACL,IAAK,WACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,QACL,IAAK,SACL,IAAK,OACL,IAAK,WACL,IAAK,gBACL,IAAK,YACL,IAAK,kBACL,IAAK,eACL,IAAK,gBACL,IAAK,mBACL,IAAK,cACL,IAAK,gBACL,IAAK,cACL,IAAK,WACL,IAAK,MACL,IAAK,YACL,IAAK,aACL,IAAK,qBACL,IAAK,mBACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,QACL,IAAK,QACL,IAAK,UACL,IAAK,QACL,IAAK,SACL,IAAK,OACL,IAAK,SACL,IAAK,UACL,IAAK,QACL,IAAK,QACL,IAAK,QACL,IAAK,aACL,IAAK,cACL,IAAK,YACL,IAAK,SACL,IAAK,UACL,IAAK,QACL,IAAK,YACL,IAAK,YACL,IAAK,aACL,IAAK,SACL,IAAK,WACL,IAAK,QACL,IAAK,SACL,IAAK,SACL,IAAK,QACL,IAAK,SACL,IAAK,MACL,IAAK,OACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,OACL,IAAK,OACL,IAAK,WACL,IAAK,WACL,IAAK,UACL,IAAK,WACL,IAAK,OACL,IAAK,YACL,IAAK,YACL,IAAK,UACL,IAAK,aACL,IAAK,aACL,IAAK,QACL,IAAK,QACL,IAAK,WACL,IAAK,WACL,IAAK,UACL,IAAK,SACL,IAAK,WACL,IAAK,UACL,IAAK,QACL,IAAK,UACL,IAAK,WACL,IAAK,YACL,IAAK,WACL,IAAK,aACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,YACL,IAAK,cACL,IAAK,UACL,IAAK,YACL,IAAK,WACL,IAAK,UACL,IAAK,UACL,IAAK,UACL,IAAK,WACL,IAAK,UACL,IAAK,cACL,IAAK,MACL,IAAK,cACL,IAAK,MACL,IAAK,aACL,IAAK,gBACL,IAAK,UACL,IAAK,eACL,IAAK,UACL,IAAK,WACL,IAAK,SACL,IAAK,YACL,IAAK,cAEHD,GAAW,CACb,EAAG,EACH,EAAG,EACH,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,IAAK,EACL,MAAO,GAkCT,IAKIuE,GAAiC,qBAARrvN,IAE7B,SAASsvN,GAAW7N,EAAan2K,EAAgB6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","sources":["../node_modules/matter-js/build/matter.js","../node_modules/react-dom/cjs/react-dom.production.min.js","../node_modules/react-dom/client.js","../node_modules/react-dom/index.js","../node_modules/react/cjs/react-jsx-runtime.production.min.js","../node_modules/react/cjs/react.production.min.js","../node_modules/react/index.js","../node_modules/react/jsx-runtime.js","../node_modules/scheduler/cjs/scheduler.production.min.js","../node_modules/scheduler/index.js","../webpack/bootstrap","../webpack/runtime/compat get default export","../webpack/runtime/create fake namespace object","../webpack/runtime/define property getters","../webpack/runtime/ensure chunk","../webpack/runtime/get javascript chunk filename","../webpack/runtime/get mini-css chunk filename","../webpack/runtime/global","../webpack/runtime/hasOwnProperty shorthand","../webpack/runtime/load script","../webpack/runtime/make namespace object","../webpack/runtime/publicPath","../webpack/runtime/jsonp chunk loading","../node_modules/@remix-run/router/history.ts","../node_modules/@remix-run/router/utils.ts","../node_modules/@remix-run/router/router.ts","../node_modules/react-router/lib/context.ts","../node_modules/react-router/lib/hooks.tsx","../node_modules/react-router/lib/components.tsx","../node_modules/react-router-dom/dom.ts","../node_modules/react-router-dom/index.tsx","../node_modules/@firebase/util/src/constants.ts","../node_modules/@firebase/util/src/assert.ts","../node_modules/@firebase/util/src/crypt.ts","../node_modules/@firebase/util/src/deepCopy.ts","../node_modules/@firebase/util/src/defaults.ts","../node_modules/@firebase/util/src/global.ts","../node_modules/@firebase/util/src/deferred.ts","../node_modules/@firebase/util/src/emulator.ts","../node_modules/@firebase/util/src/environment.ts","../node_modules/@firebase/util/src/errors.ts","../node_modules/@firebase/util/src/json.ts","../node_modules/@firebase/util/src/jwt.ts","../node_modules/@firebase/util/src/obj.ts","../node_modules/@firebase/util/src/query.ts","../node_modules/@firebase/util/src/sha1.ts","../node_modules/@firebase/util/src/subscribe.ts","../node_modules/@firebase/util/src/validation.ts","../node_modules/@firebase/util/src/utf8.ts","../node_modules/@firebase/util/src/compat.ts","../node_modules/@firebase/component/src/component.ts","../node_modules/@firebase/component/src/constants.ts","../node_modules/@firebase/component/src/provider.ts","../node_modules/@firebase/component/src/component_container.ts","../node_modules/@firebase/logger/src/logger.ts","../node_modules/idb/build/wrap-idb-value.js","../node_modules/idb/build/index.js","../node_modules/@firebase/app/src/platformLoggerService.ts","../node_modules/@firebase/app/src/logger.ts","../node_modules/@firebase/app/src/constants.ts","../node_modules/@firebase/app/src/internal.ts","../node_modules/@firebase/app/src/errors.ts","../node_modules/@firebase/app/src/firebaseApp.ts","../node_modules/@firebase/app/src/api.ts","../node_modules/@firebase/app/src/indexeddb.ts","../node_modules/@firebase/app/src/heartbeatService.ts","../node_modules/@firebase/app/src/registerCoreComponents.ts","../node_modules/@firebase/app/src/index.ts","../node_modules/firebase/app/index.ts","../node_modules/tslib/tslib.es6.mjs","../node_modules/@firebase/auth/src/core/errors.ts","../node_modules/@firebase/auth/src/core/util/log.ts","../node_modules/@firebase/auth/src/core/util/assert.ts","../node_modules/@firebase/auth/src/core/util/location.ts","../node_modules/@firebase/auth/src/core/util/navigator.ts","../node_modules/@firebase/auth/src/core/util/delay.ts","../node_modules/@firebase/auth/src/core/util/emulator.ts","../node_modules/@firebase/auth/src/core/util/fetch_provider.ts","../node_modules/@firebase/auth/src/api/errors.ts","../node_modules/@firebase/auth/src/api/index.ts","../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha.ts","../node_modules/@firebase/auth/src/api/authentication/recaptcha.ts","../node_modules/@firebase/auth/src/api/account_management/account.ts","../node_modules/@firebase/auth/src/core/util/time.ts","../node_modules/@firebase/auth/src/core/user/id_token_result.ts","../node_modules/@firebase/auth/src/core/user/invalidation.ts","../node_modules/@firebase/auth/src/core/user/proactive_refresh.ts","../node_modules/@firebase/auth/src/core/user/user_metadata.ts","../node_modules/@firebase/auth/src/core/user/reload.ts","../node_modules/@firebase/auth/src/core/user/token_manager.ts","../node_modules/@firebase/auth/src/api/authentication/token.ts","../node_modules/@firebase/auth/src/core/user/user_impl.ts","../node_modules/@firebase/auth/src/core/util/instantiator.ts","../node_modules/@firebase/auth/src/core/persistence/in_memory.ts","../node_modules/@firebase/auth/src/core/persistence/persistence_user_manager.ts","../node_modules/@firebase/auth/src/core/util/browser.ts","../node_modules/@firebase/auth/src/core/util/version.ts","../node_modules/@firebase/auth/src/core/auth/middleware.ts","../node_modules/@firebase/auth/src/core/auth/password_policy_impl.ts","../node_modules/@firebase/auth/src/core/auth/auth_impl.ts","../node_modules/@firebase/auth/src/api/password_policy/get_password_policy.ts","../node_modules/@firebase/auth/src/platform_browser/load_js.ts","../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_mock.ts","../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_enterprise_verifier.ts","../node_modules/@firebase/auth/src/core/auth/emulator.ts","../node_modules/@firebase/auth/src/core/credentials/auth_credential.ts","../node_modules/@firebase/auth/src/api/account_management/email_and_password.ts","../node_modules/@firebase/auth/src/api/authentication/email_and_password.ts","../node_modules/@firebase/auth/src/core/credentials/email.ts","../node_modules/@firebase/auth/src/api/authentication/email_link.ts","../node_modules/@firebase/auth/src/api/authentication/idp.ts","../node_modules/@firebase/auth/src/core/credentials/oauth.ts","../node_modules/@firebase/auth/src/api/authentication/sms.ts","../node_modules/@firebase/auth/src/core/credentials/phone.ts","../node_modules/@firebase/auth/src/core/action_code_url.ts","../node_modules/@firebase/auth/src/core/providers/email.ts","../node_modules/@firebase/auth/src/core/providers/federated.ts","../node_modules/@firebase/auth/src/core/providers/oauth.ts","../node_modules/@firebase/auth/src/core/providers/facebook.ts","../node_modules/@firebase/auth/src/core/providers/google.ts","../node_modules/@firebase/auth/src/core/providers/github.ts","../node_modules/@firebase/auth/src/core/providers/twitter.ts","../node_modules/@firebase/auth/src/api/authentication/sign_up.ts","../node_modules/@firebase/auth/src/core/user/user_credential_impl.ts","../node_modules/@firebase/auth/src/mfa/mfa_error.ts","../node_modules/@firebase/auth/src/core/user/link_unlink.ts","../node_modules/@firebase/auth/src/core/user/reauthenticate.ts","../node_modules/@firebase/auth/src/core/strategies/credential.ts","../node_modules/@firebase/auth/src/core/strategies/email_and_password.ts","../node_modules/@firebase/auth/src/core/index.ts","../node_modules/@firebase/auth/src/api/account_management/mfa.ts","../node_modules/@firebase/auth/src/mfa/mfa_user.ts","../node_modules/@firebase/auth/src/core/persistence/index.ts","../node_modules/@firebase/auth/src/platform_browser/persistence/browser.ts","../node_modules/@firebase/auth/src/platform_browser/persistence/local_storage.ts","../node_modules/@firebase/auth/src/platform_browser/persistence/session_storage.ts","../node_modules/@firebase/auth/src/platform_browser/messagechannel/receiver.ts","../node_modules/@firebase/auth/src/platform_browser/messagechannel/promise.ts","../node_modules/@firebase/auth/src/core/util/event_id.ts","../node_modules/@firebase/auth/src/platform_browser/messagechannel/sender.ts","../node_modules/@firebase/auth/src/platform_browser/auth_window.ts","../node_modules/@firebase/auth/src/platform_browser/util/worker.ts","../node_modules/@firebase/auth/src/platform_browser/persistence/indexed_db.ts","../node_modules/@firebase/auth/src/api/authentication/mfa.ts","../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_loader.ts","../node_modules/@firebase/auth/src/platform_browser/recaptcha/recaptcha_verifier.ts","../node_modules/@firebase/auth/src/platform_browser/strategies/phone.ts","../node_modules/@firebase/auth/src/platform_browser/providers/phone.ts","../node_modules/@firebase/auth/src/core/util/resolver.ts","../node_modules/@firebase/auth/src/core/strategies/idp.ts","../node_modules/@firebase/auth/src/core/strategies/abstract_popup_redirect_operation.ts","../node_modules/@firebase/auth/src/platform_browser/strategies/popup.ts","../node_modules/@firebase/auth/src/core/strategies/redirect.ts","../node_modules/@firebase/auth/src/platform_browser/strategies/redirect.ts","../node_modules/@firebase/auth/src/core/auth/auth_event_manager.ts","../node_modules/@firebase/auth/src/core/util/validate_origin.ts","../node_modules/@firebase/auth/src/api/project_config/get_project_config.ts","../node_modules/@firebase/auth/src/platform_browser/iframe/gapi.ts","../node_modules/@firebase/auth/src/platform_browser/iframe/iframe.ts","../node_modules/@firebase/auth/src/platform_browser/util/popup.ts","../node_modules/@firebase/auth/src/core/util/handler.ts","../node_modules/@firebase/auth/src/platform_browser/popup_redirect.ts","../node_modules/@firebase/auth/src/core/auth/firebase_internal.ts","../node_modules/@firebase/auth/src/platform_browser/index.ts","../node_modules/@firebase/auth/src/core/auth/register.ts","../node_modules/@firebase/auth/src/core/auth/initialize.ts","../node_modules/@firebase/database/src/core/version.ts","../node_modules/@firebase/database/src/core/storage/DOMStorageWrapper.ts","../node_modules/@firebase/database/src/core/storage/MemoryStorage.ts","../node_modules/@firebase/database/src/core/storage/storage.ts","../node_modules/@firebase/database/src/core/util/util.ts","../node_modules/@firebase/database/src/core/AppCheckTokenProvider.ts","../node_modules/@firebase/database/src/core/AuthTokenProvider.ts","../node_modules/@firebase/database/src/realtime/Constants.ts","../node_modules/@firebase/database/src/core/RepoInfo.ts","../node_modules/@firebase/database/src/core/stats/StatsCollection.ts","../node_modules/@firebase/database/src/core/stats/StatsManager.ts","../node_modules/@firebase/database/src/realtime/polling/PacketReceiver.ts","../node_modules/@firebase/database/src/realtime/BrowserPollConnection.ts","../node_modules/@firebase/database/src/realtime/WebSocketConnection.ts","../node_modules/@firebase/database/src/realtime/TransportManager.ts","../node_modules/@firebase/database/src/realtime/Connection.ts","../node_modules/@firebase/database/src/core/ServerActions.ts","../node_modules/@firebase/database/src/core/util/EventEmitter.ts","../node_modules/@firebase/database/src/core/util/OnlineMonitor.ts","../node_modules/@firebase/database/src/core/util/Path.ts","../node_modules/@firebase/database/src/core/util/VisibilityMonitor.ts","../node_modules/@firebase/database/src/core/PersistentConnection.ts","../node_modules/@firebase/database/src/core/snap/Node.ts","../node_modules/@firebase/database/src/core/snap/indexes/Index.ts","../node_modules/@firebase/database/src/core/snap/indexes/KeyIndex.ts","../node_modules/@firebase/database/src/core/util/SortedMap.ts","../node_modules/@firebase/database/src/core/snap/comparators.ts","../node_modules/@firebase/database/src/core/snap/snap.ts","../node_modules/@firebase/database/src/core/snap/LeafNode.ts","../node_modules/@firebase/database/src/core/snap/indexes/PriorityIndex.ts","../node_modules/@firebase/database/src/core/snap/childSet.ts","../node_modules/@firebase/database/src/core/snap/IndexMap.ts","../node_modules/@firebase/database/src/core/snap/ChildrenNode.ts","../node_modules/@firebase/database/src/core/snap/nodeFromJSON.ts","../node_modules/@firebase/database/src/core/snap/indexes/PathIndex.ts","../node_modules/@firebase/database/src/core/snap/indexes/ValueIndex.ts","../node_modules/@firebase/database/src/core/view/Change.ts","../node_modules/@firebase/database/src/core/view/filter/IndexedFilter.ts","../node_modules/@firebase/database/src/core/view/filter/RangedFilter.ts","../node_modules/@firebase/database/src/core/view/filter/LimitedFilter.ts","../node_modules/@firebase/database/src/core/view/QueryParams.ts","../node_modules/@firebase/database/src/core/ReadonlyRestClient.ts","../node_modules/@firebase/database/src/core/SnapshotHolder.ts","../node_modules/@firebase/database/src/core/SparseSnapshotTree.ts","../node_modules/@firebase/database/src/core/stats/StatsListener.ts","../node_modules/@firebase/database/src/core/stats/StatsReporter.ts","../node_modules/@firebase/database/src/core/operation/Operation.ts","../node_modules/@firebase/database/src/core/operation/AckUserWrite.ts","../node_modules/@firebase/database/src/core/operation/ListenComplete.ts","../node_modules/@firebase/database/src/core/operation/Overwrite.ts","../node_modules/@firebase/database/src/core/operation/Merge.ts","../node_modules/@firebase/database/src/core/view/CacheNode.ts","../node_modules/@firebase/database/src/core/view/EventGenerator.ts","../node_modules/@firebase/database/src/core/view/ViewCache.ts","../node_modules/@firebase/database/src/core/util/ImmutableTree.ts","../node_modules/@firebase/database/src/core/CompoundWrite.ts","../node_modules/@firebase/database/src/core/WriteTree.ts","../node_modules/@firebase/database/src/core/view/ChildChangeAccumulator.ts","../node_modules/@firebase/database/src/core/view/CompleteChildSource.ts","../node_modules/@firebase/database/src/core/view/ViewProcessor.ts","../node_modules/@firebase/database/src/core/view/View.ts","../node_modules/@firebase/database/src/core/SyncPoint.ts","../node_modules/@firebase/database/src/core/SyncTree.ts","../node_modules/@firebase/database/src/core/util/ServerValues.ts","../node_modules/@firebase/database/src/core/util/Tree.ts","../node_modules/@firebase/database/src/core/util/validation.ts","../node_modules/@firebase/database/src/core/view/EventQueue.ts","../node_modules/@firebase/database/src/core/Repo.ts","../node_modules/@firebase/database/src/core/util/libs/parser.ts","../node_modules/@firebase/database/src/core/util/NextPushId.ts","../node_modules/@firebase/database/src/core/view/Event.ts","../node_modules/@firebase/database/src/core/view/EventRegistration.ts","../node_modules/@firebase/database/src/api/Reference_impl.ts","../node_modules/@firebase/database/src/api/Database.ts","../node_modules/@firebase/database/src/api/test_access.ts","../node_modules/@firebase/database/src/register.ts","../node_modules/@firebase/database/src/index.ts","../node_modules/node_modules/closure-net/firebase/bloom_blob_es2018.js","../node_modules/node_modules/closure-net/firebase/webchannel_blob_es2018.js","../node_modules/@firebase/firestore/src/auth/user.ts","../node_modules/@firebase/firestore/src/core/version.ts","../node_modules/@firebase/firestore/src/util/log.ts","../node_modules/@firebase/firestore/src/platform/browser/format_json.ts","../node_modules/@firebase/firestore/src/util/assert.ts","../node_modules/@firebase/firestore/src/util/error.ts","../node_modules/@firebase/firestore/src/util/promise.ts","../node_modules/@firebase/firestore/src/api/credentials.ts","../node_modules/@firebase/firestore/src/platform/browser/random_bytes.ts","../node_modules/@firebase/firestore/src/util/misc.ts","../node_modules/@firebase/firestore/src/lite-api/timestamp.ts","../node_modules/@firebase/firestore/src/core/snapshot_version.ts","../node_modules/@firebase/firestore/src/model/path.ts","../node_modules/@firebase/firestore/src/model/document_key.ts","../node_modules/@firebase/firestore/src/model/field_index.ts","../node_modules/@firebase/firestore/src/local/persistence_transaction.ts","../node_modules/@firebase/firestore/src/local/local_store.ts","../node_modules/@firebase/firestore/src/local/persistence_promise.ts","../node_modules/@firebase/firestore/src/local/simple_db.ts","../node_modules/@firebase/firestore/src/core/listen_sequence.ts","../node_modules/@firebase/firestore/src/util/types.ts","../node_modules/@firebase/firestore/src/local/encoded_resource_path.ts","../node_modules/@firebase/firestore/src/local/indexeddb_sentinels.ts","../node_modules/@firebase/firestore/src/local/indexeddb_schema_legacy.ts","../node_modules/@firebase/firestore/src/util/obj.ts","../node_modules/@firebase/firestore/src/util/sorted_map.ts","../node_modules/@firebase/firestore/src/util/sorted_set.ts","../node_modules/@firebase/firestore/src/model/field_mask.ts","../node_modules/@firebase/firestore/src/util/base64_decode_error.ts","../node_modules/@firebase/firestore/src/util/byte_string.ts","../node_modules/@firebase/firestore/src/platform/browser/base64.ts","../node_modules/@firebase/firestore/src/model/normalize.ts","../node_modules/@firebase/firestore/src/model/server_timestamps.ts","../node_modules/@firebase/firestore/src/core/database_info.ts","../node_modules/@firebase/firestore/src/model/values.ts","../node_modules/@firebase/firestore/src/model/object_value.ts","../node_modules/@firebase/firestore/src/model/document.ts","../node_modules/@firebase/firestore/src/core/bound.ts","../node_modules/@firebase/firestore/src/core/order_by.ts","../node_modules/@firebase/firestore/src/core/filter.ts","../node_modules/@firebase/firestore/src/core/target.ts","../node_modules/@firebase/firestore/src/core/query.ts","../node_modules/@firebase/firestore/src/util/obj_map.ts","../node_modules/@firebase/firestore/src/model/collections.ts","../node_modules/@firebase/firestore/src/remote/number_serializer.ts","../node_modules/@firebase/firestore/src/model/transform_operation.ts","../node_modules/@firebase/firestore/src/model/mutation.ts","../node_modules/@firebase/firestore/src/model/mutation_batch.ts","../node_modules/@firebase/firestore/src/model/overlay.ts","../node_modules/@firebase/firestore/src/remote/existence_filter.ts","../node_modules/@firebase/firestore/src/remote/rpc_error.ts","../node_modules/@firebase/firestore/src/util/testing_hooks_spi.ts","../node_modules/@firebase/firestore/src/platform/browser/text_serializer.ts","../node_modules/@firebase/firestore/src/remote/bloom_filter.ts","../node_modules/@firebase/firestore/src/remote/remote_event.ts","../node_modules/@firebase/firestore/src/remote/watch_change.ts","../node_modules/@firebase/firestore/src/remote/serializer.ts","../node_modules/@firebase/firestore/src/local/target_data.ts","../node_modules/@firebase/firestore/src/local/local_serializer.ts","../node_modules/@firebase/firestore/src/index/firestore_index_value_writer.ts","../node_modules/@firebase/firestore/src/local/memory_index_manager.ts","../node_modules/@firebase/firestore/src/local/indexeddb_index_manager.ts","../node_modules/@firebase/firestore/src/local/lru_garbage_collector.ts","../node_modules/@firebase/firestore/src/core/target_id_generator.ts","../node_modules/@firebase/firestore/src/local/lru_garbage_collector_impl.ts","../node_modules/@firebase/firestore/src/local/remote_document_change_buffer.ts","../node_modules/@firebase/firestore/src/local/overlayed_document.ts","../node_modules/@firebase/firestore/src/local/local_documents_view.ts","../node_modules/@firebase/firestore/src/local/memory_bundle_cache.ts","../node_modules/@firebase/firestore/src/local/memory_document_overlay_cache.ts","../node_modules/@firebase/firestore/src/local/memory_globals_cache.ts","../node_modules/@firebase/firestore/src/local/reference_set.ts","../node_modules/@firebase/firestore/src/local/memory_mutation_queue.ts","../node_modules/@firebase/firestore/src/local/memory_remote_document_cache.ts","../node_modules/@firebase/firestore/src/local/memory_target_cache.ts","../node_modules/@firebase/firestore/src/local/memory_persistence.ts","../node_modules/@firebase/firestore/src/local/local_view_changes.ts","../node_modules/@firebase/firestore/src/local/query_context.ts","../node_modules/@firebase/firestore/src/local/query_engine.ts","../node_modules/@firebase/firestore/src/local/local_store_impl.ts","../node_modules/@firebase/firestore/src/local/shared_client_state.ts","../node_modules/@firebase/firestore/src/remote/connectivity_monitor_noop.ts","../node_modules/@firebase/firestore/src/platform/browser/connectivity_monitor.ts","../node_modules/@firebase/firestore/src/util/debug_uid.ts","../node_modules/@firebase/firestore/src/remote/rest_connection.ts","../node_modules/@firebase/firestore/src/remote/stream_bridge.ts","../node_modules/@firebase/firestore/src/platform/browser/webchannel_connection.ts","../node_modules/@firebase/firestore/src/platform/browser/dom.ts","../node_modules/@firebase/firestore/src/platform/browser/serializer.ts","../node_modules/@firebase/firestore/src/remote/backoff.ts","../node_modules/@firebase/firestore/src/remote/persistent_stream.ts","../node_modules/@firebase/firestore/src/remote/datastore.ts","../node_modules/@firebase/firestore/src/remote/online_state_tracker.ts","../node_modules/@firebase/firestore/src/remote/remote_store.ts","../node_modules/@firebase/firestore/src/util/async_queue.ts","../node_modules/@firebase/firestore/src/model/document_set.ts","../node_modules/@firebase/firestore/src/core/view_snapshot.ts","../node_modules/@firebase/firestore/src/core/event_manager.ts","../node_modules/@firebase/firestore/src/core/view.ts","../node_modules/@firebase/firestore/src/core/sync_engine_impl.ts","../node_modules/@firebase/firestore/src/core/component_provider.ts","../node_modules/@firebase/firestore/src/platform/browser/connection.ts","../node_modules/@firebase/firestore/src/util/async_observer.ts","../node_modules/@firebase/firestore/src/core/transaction.ts","../node_modules/@firebase/firestore/src/core/transaction_runner.ts","../node_modules/@firebase/firestore/src/core/firestore_client.ts","../node_modules/@firebase/firestore/src/api/long_polling_options.ts","../node_modules/@firebase/firestore/src/lite-api/components.ts","../node_modules/@firebase/firestore/src/util/input_validation.ts","../node_modules/@firebase/firestore/src/lite-api/settings.ts","../node_modules/@firebase/firestore/src/lite-api/database.ts","../node_modules/@firebase/firestore/src/lite-api/reference.ts","../node_modules/@firebase/firestore/src/util/async_queue_impl.ts","../node_modules/@firebase/firestore/src/api/database.ts","../node_modules/@firebase/firestore/src/lite-api/bytes.ts","../node_modules/@firebase/firestore/src/lite-api/field_path.ts","../node_modules/@firebase/firestore/src/lite-api/field_value.ts","../node_modules/@firebase/firestore/src/lite-api/geo_point.ts","../node_modules/@firebase/firestore/src/lite-api/vector_value.ts","../node_modules/@firebase/firestore/src/util/array.ts","../node_modules/@firebase/firestore/src/lite-api/user_data_reader.ts","../node_modules/@firebase/firestore/src/lite-api/snapshot.ts","../node_modules/@firebase/firestore/src/lite-api/query.ts","../node_modules/@firebase/firestore/src/lite-api/user_data_writer.ts","../node_modules/@firebase/firestore/src/lite-api/reference_impl.ts","../node_modules/@firebase/firestore/src/api/snapshot.ts","../node_modules/@firebase/firestore/src/api/reference_impl.ts","../node_modules/@firebase/firestore/src/core/transaction_options.ts","../node_modules/@firebase/firestore/src/lite-api/write_batch.ts","../node_modules/@firebase/firestore/src/api/transaction.ts","../node_modules/@firebase/firestore/src/lite-api/transaction.ts","../node_modules/@firebase/firestore/src/api/persistent_cache_index_manager.ts","../node_modules/@firebase/firestore/src/register.ts","../node_modules/@firebase/firestore/src/index.ts","../node_modules/@firebase/storage/src/implementation/constants.ts","../node_modules/@firebase/storage/src/implementation/error.ts","../node_modules/@firebase/storage/src/implementation/connection.ts","../node_modules/@firebase/storage/src/implementation/location.ts","../node_modules/@firebase/storage/src/implementation/failrequest.ts","../node_modules/@firebase/storage/src/implementation/type.ts","../node_modules/@firebase/storage/src/implementation/url.ts","../node_modules/@firebase/storage/src/implementation/utils.ts","../node_modules/@firebase/storage/src/implementation/request.ts","../node_modules/@firebase/storage/src/implementation/backoff.ts","../node_modules/@firebase/storage/src/implementation/fs.ts","../node_modules/@firebase/storage/src/platform/browser/base64.ts","../node_modules/@firebase/storage/src/implementation/string.ts","../node_modules/@firebase/storage/src/implementation/blob.ts","../node_modules/@firebase/storage/src/implementation/json.ts","../node_modules/@firebase/storage/src/implementation/path.ts","../node_modules/@firebase/storage/src/implementation/metadata.ts","../node_modules/@firebase/storage/src/implementation/requestinfo.ts","../node_modules/@firebase/storage/src/implementation/requests.ts","../node_modules/@firebase/storage/src/platform/browser/connection.ts","../node_modules/@firebase/storage/src/reference.ts","../node_modules/@firebase/storage/src/service.ts","../node_modules/@firebase/storage/src/constants.ts","../node_modules/@firebase/storage/src/api.ts","../node_modules/@firebase/storage/src/index.ts","firebase.js","Page/Login.js","Page/Map.js","component/ScrollToTop.js","Page/SignUp.js","Page/Event.js","Page/VoteCreation.js","Page/VoteList.js","Page/memberList.js","../node_modules/xlsx/xlsx.mjs","Page/VoteDetail.js","Page/VoteArea.js","Page/MonthHero.js","component/Sidebar.js","Page/Honor.js","component/TypingEffect.js","Page/Bigpie.js","Page/Sub/History.js","Page/Sub/Organization.js","Page/Sub/Mission.js","Page/Sub/jungdal.js","Page/Sub/Darlibaba.js","Page/Sub/Meo.js","Page/Sub/Infra.js","App.js","reportWebVitals.js","index.js"],"sourcesContent":["/*!\n * matter-js 0.20.0 by @liabru\n * http://brm.io/matter-js/\n * License MIT\n * \n * The MIT License (MIT)\n * \n * Copyright (c) Liam Brummitt and contributors.\n * \n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n * \n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n * \n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"Matter\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"Matter\"] = factory();\n\telse\n\t\troot[\"Matter\"] = factory();\n})(this, function() {\nreturn /******/ (function(modules) { // webpackBootstrap\n/******/ \t// The module cache\n/******/ \tvar installedModules = {};\n/******/\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(installedModules[moduleId]) {\n/******/ \t\t\treturn installedModules[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = installedModules[moduleId] = {\n/******/ \t\t\ti: moduleId,\n/******/ \t\t\tl: false,\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/\n/******/ \t\t// Execute the module function\n/******/ \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n/******/\n/******/ \t\t// Flag the module as loaded\n/******/ \t\tmodule.l = true;\n/******/\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/\n/******/\n/******/ \t// expose the modules object (__webpack_modules__)\n/******/ \t__webpack_require__.m = modules;\n/******/\n/******/ \t// expose the module cache\n/******/ \t__webpack_require__.c = installedModules;\n/******/\n/******/ \t// define getter function for harmony exports\n/******/ \t__webpack_require__.d = function(exports, name, getter) {\n/******/ \t\tif(!__webpack_require__.o(exports, name)) {\n/******/ \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n/******/ \t\t}\n/******/ \t};\n/******/\n/******/ \t// define __esModule on exports\n/******/ \t__webpack_require__.r = function(exports) {\n/******/ \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n/******/ \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n/******/ \t\t}\n/******/ \t\tObject.defineProperty(exports, '__esModule', { value: true });\n/******/ \t};\n/******/\n/******/ \t// create a fake namespace object\n/******/ \t// mode & 1: value is a module id, require it\n/******/ \t// mode & 2: merge all properties of value into the ns\n/******/ \t// mode & 4: return value when already ns object\n/******/ \t// mode & 8|1: behave like require\n/******/ \t__webpack_require__.t = function(value, mode) {\n/******/ \t\tif(mode & 1) value = __webpack_require__(value);\n/******/ \t\tif(mode & 8) return value;\n/******/ \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n/******/ \t\tvar ns = Object.create(null);\n/******/ \t\t__webpack_require__.r(ns);\n/******/ \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n/******/ \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n/******/ \t\treturn ns;\n/******/ \t};\n/******/\n/******/ \t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t__webpack_require__.n = function(module) {\n/******/ \t\tvar getter = module && module.__esModule ?\n/******/ \t\t\tfunction getDefault() { return module['default']; } :\n/******/ \t\t\tfunction getModuleExports() { return module; };\n/******/ \t\t__webpack_require__.d(getter, 'a', getter);\n/******/ \t\treturn getter;\n/******/ \t};\n/******/\n/******/ \t// Object.prototype.hasOwnProperty.call\n/******/ \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n/******/\n/******/ \t// __webpack_public_path__\n/******/ \t__webpack_require__.p = \"\";\n/******/\n/******/\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(__webpack_require__.s = 20);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\n/**\n* The `Matter.Common` module contains utility functions that are common to all modules.\n*\n* @class Common\n*/\n\nvar Common = {};\n\nmodule.exports = Common;\n\n(function() {\n\n Common._baseDelta = 1000 / 60;\n Common._nextId = 0;\n Common._seed = 0;\n Common._nowStartTime = +(new Date());\n Common._warnedOnce = {};\n Common._decomp = null;\n \n /**\n * Extends the object in the first argument using the object in the second argument.\n * @method extend\n * @param {} obj\n * @param {boolean} deep\n * @return {} obj extended\n */\n Common.extend = function(obj, deep) {\n var argsStart,\n args,\n deepClone;\n\n if (typeof deep === 'boolean') {\n argsStart = 2;\n deepClone = deep;\n } else {\n argsStart = 1;\n deepClone = true;\n }\n\n for (var i = argsStart; i < arguments.length; i++) {\n var source = arguments[i];\n\n if (source) {\n for (var prop in source) {\n if (deepClone && source[prop] && source[prop].constructor === Object) {\n if (!obj[prop] || obj[prop].constructor === Object) {\n obj[prop] = obj[prop] || {};\n Common.extend(obj[prop], deepClone, source[prop]);\n } else {\n obj[prop] = source[prop];\n }\n } else {\n obj[prop] = source[prop];\n }\n }\n }\n }\n \n return obj;\n };\n\n /**\n * Creates a new clone of the object, if deep is true references will also be cloned.\n * @method clone\n * @param {} obj\n * @param {bool} deep\n * @return {} obj cloned\n */\n Common.clone = function(obj, deep) {\n return Common.extend({}, deep, obj);\n };\n\n /**\n * Returns the list of keys for the given object.\n * @method keys\n * @param {} obj\n * @return {string[]} keys\n */\n Common.keys = function(obj) {\n if (Object.keys)\n return Object.keys(obj);\n\n // avoid hasOwnProperty for performance\n var keys = [];\n for (var key in obj)\n keys.push(key);\n return keys;\n };\n\n /**\n * Returns the list of values for the given object.\n * @method values\n * @param {} obj\n * @return {array} Array of the objects property values\n */\n Common.values = function(obj) {\n var values = [];\n \n if (Object.keys) {\n var keys = Object.keys(obj);\n for (var i = 0; i < keys.length; i++) {\n values.push(obj[keys[i]]);\n }\n return values;\n }\n \n // avoid hasOwnProperty for performance\n for (var key in obj)\n values.push(obj[key]);\n return values;\n };\n\n /**\n * Gets a value from `base` relative to the `path` string.\n * @method get\n * @param {} obj The base object\n * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'\n * @param {number} [begin] Path slice begin\n * @param {number} [end] Path slice end\n * @return {} The object at the given path\n */\n Common.get = function(obj, path, begin, end) {\n path = path.split('.').slice(begin, end);\n\n for (var i = 0; i < path.length; i += 1) {\n obj = obj[path[i]];\n }\n\n return obj;\n };\n\n /**\n * Sets a value on `base` relative to the given `path` string.\n * @method set\n * @param {} obj The base object\n * @param {string} path The path relative to `base`, e.g. 'Foo.Bar.baz'\n * @param {} val The value to set\n * @param {number} [begin] Path slice begin\n * @param {number} [end] Path slice end\n * @return {} Pass through `val` for chaining\n */\n Common.set = function(obj, path, val, begin, end) {\n var parts = path.split('.').slice(begin, end);\n Common.get(obj, path, 0, -1)[parts[parts.length - 1]] = val;\n return val;\n };\n\n /**\n * Shuffles the given array in-place.\n * The function uses a seeded random generator.\n * @method shuffle\n * @param {array} array\n * @return {array} array shuffled randomly\n */\n Common.shuffle = function(array) {\n for (var i = array.length - 1; i > 0; i--) {\n var j = Math.floor(Common.random() * (i + 1));\n var temp = array[i];\n array[i] = array[j];\n array[j] = temp;\n }\n return array;\n };\n\n /**\n * Randomly chooses a value from a list with equal probability.\n * The function uses a seeded random generator.\n * @method choose\n * @param {array} choices\n * @return {object} A random choice object from the array\n */\n Common.choose = function(choices) {\n return choices[Math.floor(Common.random() * choices.length)];\n };\n\n /**\n * Returns true if the object is a HTMLElement, otherwise false.\n * @method isElement\n * @param {object} obj\n * @return {boolean} True if the object is a HTMLElement, otherwise false\n */\n Common.isElement = function(obj) {\n if (typeof HTMLElement !== 'undefined') {\n return obj instanceof HTMLElement;\n }\n\n return !!(obj && obj.nodeType && obj.nodeName);\n };\n\n /**\n * Returns true if the object is an array.\n * @method isArray\n * @param {object} obj\n * @return {boolean} True if the object is an array, otherwise false\n */\n Common.isArray = function(obj) {\n return Object.prototype.toString.call(obj) === '[object Array]';\n };\n\n /**\n * Returns true if the object is a function.\n * @method isFunction\n * @param {object} obj\n * @return {boolean} True if the object is a function, otherwise false\n */\n Common.isFunction = function(obj) {\n return typeof obj === \"function\";\n };\n\n /**\n * Returns true if the object is a plain object.\n * @method isPlainObject\n * @param {object} obj\n * @return {boolean} True if the object is a plain object, otherwise false\n */\n Common.isPlainObject = function(obj) {\n return typeof obj === 'object' && obj.constructor === Object;\n };\n\n /**\n * Returns true if the object is a string.\n * @method isString\n * @param {object} obj\n * @return {boolean} True if the object is a string, otherwise false\n */\n Common.isString = function(obj) {\n return toString.call(obj) === '[object String]';\n };\n \n /**\n * Returns the given value clamped between a minimum and maximum value.\n * @method clamp\n * @param {number} value\n * @param {number} min\n * @param {number} max\n * @return {number} The value clamped between min and max inclusive\n */\n Common.clamp = function(value, min, max) {\n if (value < min)\n return min;\n if (value > max)\n return max;\n return value;\n };\n \n /**\n * Returns the sign of the given value.\n * @method sign\n * @param {number} value\n * @return {number} -1 if negative, +1 if 0 or positive\n */\n Common.sign = function(value) {\n return value < 0 ? -1 : 1;\n };\n \n /**\n * Returns the current timestamp since the time origin (e.g. from page load).\n * The result is in milliseconds and will use high-resolution timing if available.\n * @method now\n * @return {number} the current timestamp in milliseconds\n */\n Common.now = function() {\n if (typeof window !== 'undefined' && window.performance) {\n if (window.performance.now) {\n return window.performance.now();\n } else if (window.performance.webkitNow) {\n return window.performance.webkitNow();\n }\n }\n\n if (Date.now) {\n return Date.now();\n }\n\n return (new Date()) - Common._nowStartTime;\n };\n \n /**\n * Returns a random value between a minimum and a maximum value inclusive.\n * The function uses a seeded random generator.\n * @method random\n * @param {number} min\n * @param {number} max\n * @return {number} A random number between min and max inclusive\n */\n Common.random = function(min, max) {\n min = (typeof min !== \"undefined\") ? min : 0;\n max = (typeof max !== \"undefined\") ? max : 1;\n return min + _seededRandom() * (max - min);\n };\n\n var _seededRandom = function() {\n // https://en.wikipedia.org/wiki/Linear_congruential_generator\n Common._seed = (Common._seed * 9301 + 49297) % 233280;\n return Common._seed / 233280;\n };\n\n /**\n * Converts a CSS hex colour string into an integer.\n * @method colorToNumber\n * @param {string} colorString\n * @return {number} An integer representing the CSS hex string\n */\n Common.colorToNumber = function(colorString) {\n colorString = colorString.replace('#','');\n\n if (colorString.length == 3) {\n colorString = colorString.charAt(0) + colorString.charAt(0)\n + colorString.charAt(1) + colorString.charAt(1)\n + colorString.charAt(2) + colorString.charAt(2);\n }\n\n return parseInt(colorString, 16);\n };\n\n /**\n * The console logging level to use, where each level includes all levels above and excludes the levels below.\n * The default level is 'debug' which shows all console messages. \n *\n * Possible level values are:\n * - 0 = None\n * - 1 = Debug\n * - 2 = Info\n * - 3 = Warn\n * - 4 = Error\n * @static\n * @property logLevel\n * @type {Number}\n * @default 1\n */\n Common.logLevel = 1;\n\n /**\n * Shows a `console.log` message only if the current `Common.logLevel` allows it.\n * The message will be prefixed with 'matter-js' to make it easily identifiable.\n * @method log\n * @param ...objs {} The objects to log.\n */\n Common.log = function() {\n if (console && Common.logLevel > 0 && Common.logLevel <= 3) {\n console.log.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));\n }\n };\n\n /**\n * Shows a `console.info` message only if the current `Common.logLevel` allows it.\n * The message will be prefixed with 'matter-js' to make it easily identifiable.\n * @method info\n * @param ...objs {} The objects to log.\n */\n Common.info = function() {\n if (console && Common.logLevel > 0 && Common.logLevel <= 2) {\n console.info.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));\n }\n };\n\n /**\n * Shows a `console.warn` message only if the current `Common.logLevel` allows it.\n * The message will be prefixed with 'matter-js' to make it easily identifiable.\n * @method warn\n * @param ...objs {} The objects to log.\n */\n Common.warn = function() {\n if (console && Common.logLevel > 0 && Common.logLevel <= 3) {\n console.warn.apply(console, ['matter-js:'].concat(Array.prototype.slice.call(arguments)));\n }\n };\n\n /**\n * Uses `Common.warn` to log the given message one time only.\n * @method warnOnce\n * @param ...objs {} The objects to log.\n */\n Common.warnOnce = function() {\n var message = Array.prototype.slice.call(arguments).join(' ');\n\n if (!Common._warnedOnce[message]) {\n Common.warn(message);\n Common._warnedOnce[message] = true;\n }\n };\n\n /**\n * Shows a deprecated console warning when the function on the given object is called.\n * The target function will be replaced with a new function that first shows the warning\n * and then calls the original function.\n * @method deprecated\n * @param {object} obj The object or module\n * @param {string} name The property name of the function on obj\n * @param {string} warning The one-time message to show if the function is called\n */\n Common.deprecated = function(obj, prop, warning) {\n obj[prop] = Common.chain(function() {\n Common.warnOnce('🔅 deprecated 🔅', warning);\n }, obj[prop]);\n };\n\n /**\n * Returns the next unique sequential ID.\n * @method nextId\n * @return {Number} Unique sequential ID\n */\n Common.nextId = function() {\n return Common._nextId++;\n };\n\n /**\n * A cross browser compatible indexOf implementation.\n * @method indexOf\n * @param {array} haystack\n * @param {object} needle\n * @return {number} The position of needle in haystack, otherwise -1.\n */\n Common.indexOf = function(haystack, needle) {\n if (haystack.indexOf)\n return haystack.indexOf(needle);\n\n for (var i = 0; i < haystack.length; i++) {\n if (haystack[i] === needle)\n return i;\n }\n\n return -1;\n };\n\n /**\n * A cross browser compatible array map implementation.\n * @method map\n * @param {array} list\n * @param {function} func\n * @return {array} Values from list transformed by func.\n */\n Common.map = function(list, func) {\n if (list.map) {\n return list.map(func);\n }\n\n var mapped = [];\n\n for (var i = 0; i < list.length; i += 1) {\n mapped.push(func(list[i]));\n }\n\n return mapped;\n };\n\n /**\n * Takes a directed graph and returns the partially ordered set of vertices in topological order.\n * Circular dependencies are allowed.\n * @method topologicalSort\n * @param {object} graph\n * @return {array} Partially ordered set of vertices in topological order.\n */\n Common.topologicalSort = function(graph) {\n // https://github.com/mgechev/javascript-algorithms\n // Copyright (c) Minko Gechev (MIT license)\n // Modifications: tidy formatting and naming\n var result = [],\n visited = [],\n temp = [];\n\n for (var node in graph) {\n if (!visited[node] && !temp[node]) {\n Common._topologicalSort(node, visited, temp, graph, result);\n }\n }\n\n return result;\n };\n\n Common._topologicalSort = function(node, visited, temp, graph, result) {\n var neighbors = graph[node] || [];\n temp[node] = true;\n\n for (var i = 0; i < neighbors.length; i += 1) {\n var neighbor = neighbors[i];\n\n if (temp[neighbor]) {\n // skip circular dependencies\n continue;\n }\n\n if (!visited[neighbor]) {\n Common._topologicalSort(neighbor, visited, temp, graph, result);\n }\n }\n\n temp[node] = false;\n visited[node] = true;\n\n result.push(node);\n };\n\n /**\n * Takes _n_ functions as arguments and returns a new function that calls them in order.\n * The arguments applied when calling the new function will also be applied to every function passed.\n * The value of `this` refers to the last value returned in the chain that was not `undefined`.\n * Therefore if a passed function does not return a value, the previously returned value is maintained.\n * After all passed functions have been called the new function returns the last returned value (if any).\n * If any of the passed functions are a chain, then the chain will be flattened.\n * @method chain\n * @param ...funcs {function} The functions to chain.\n * @return {function} A new function that calls the passed functions in order.\n */\n Common.chain = function() {\n var funcs = [];\n\n for (var i = 0; i < arguments.length; i += 1) {\n var func = arguments[i];\n\n if (func._chained) {\n // flatten already chained functions\n funcs.push.apply(funcs, func._chained);\n } else {\n funcs.push(func);\n }\n }\n\n var chain = function() {\n // https://github.com/GoogleChrome/devtools-docs/issues/53#issuecomment-51941358\n var lastResult,\n args = new Array(arguments.length);\n\n for (var i = 0, l = arguments.length; i < l; i++) {\n args[i] = arguments[i];\n }\n\n for (i = 0; i < funcs.length; i += 1) {\n var result = funcs[i].apply(lastResult, args);\n\n if (typeof result !== 'undefined') {\n lastResult = result;\n }\n }\n\n return lastResult;\n };\n\n chain._chained = funcs;\n\n return chain;\n };\n\n /**\n * Chains a function to excute before the original function on the given `path` relative to `base`.\n * See also docs for `Common.chain`.\n * @method chainPathBefore\n * @param {} base The base object\n * @param {string} path The path relative to `base`\n * @param {function} func The function to chain before the original\n * @return {function} The chained function that replaced the original\n */\n Common.chainPathBefore = function(base, path, func) {\n return Common.set(base, path, Common.chain(\n func,\n Common.get(base, path)\n ));\n };\n\n /**\n * Chains a function to excute after the original function on the given `path` relative to `base`.\n * See also docs for `Common.chain`.\n * @method chainPathAfter\n * @param {} base The base object\n * @param {string} path The path relative to `base`\n * @param {function} func The function to chain after the original\n * @return {function} The chained function that replaced the original\n */\n Common.chainPathAfter = function(base, path, func) {\n return Common.set(base, path, Common.chain(\n Common.get(base, path),\n func\n ));\n };\n\n /**\n * Provide the [poly-decomp](https://github.com/schteppe/poly-decomp.js) library module to enable\n * concave vertex decomposition support when using `Bodies.fromVertices` e.g. `Common.setDecomp(require('poly-decomp'))`.\n * @method setDecomp\n * @param {} decomp The [poly-decomp](https://github.com/schteppe/poly-decomp.js) library module.\n */\n Common.setDecomp = function(decomp) {\n Common._decomp = decomp;\n };\n\n /**\n * Returns the [poly-decomp](https://github.com/schteppe/poly-decomp.js) library module provided through `Common.setDecomp`,\n * otherwise returns the global `decomp` if set.\n * @method getDecomp\n * @return {} The [poly-decomp](https://github.com/schteppe/poly-decomp.js) library module if provided.\n */\n Common.getDecomp = function() {\n // get user provided decomp if set\n var decomp = Common._decomp;\n\n try {\n // otherwise from window global\n if (!decomp && typeof window !== 'undefined') {\n decomp = window.decomp;\n }\n \n // otherwise from node global\n if (!decomp && typeof global !== 'undefined') {\n decomp = global.decomp;\n }\n } catch (e) {\n // decomp not available\n decomp = null;\n }\n\n return decomp;\n };\n})();\n\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports) {\n\n/**\n* The `Matter.Bounds` module contains methods for creating and manipulating axis-aligned bounding boxes (AABB).\n*\n* @class Bounds\n*/\n\nvar Bounds = {};\n\nmodule.exports = Bounds;\n\n(function() {\n\n /**\n * Creates a new axis-aligned bounding box (AABB) for the given vertices.\n * @method create\n * @param {vertices} vertices\n * @return {bounds} A new bounds object\n */\n Bounds.create = function(vertices) {\n var bounds = { \n min: { x: 0, y: 0 }, \n max: { x: 0, y: 0 }\n };\n\n if (vertices)\n Bounds.update(bounds, vertices);\n \n return bounds;\n };\n\n /**\n * Updates bounds using the given vertices and extends the bounds given a velocity.\n * @method update\n * @param {bounds} bounds\n * @param {vertices} vertices\n * @param {vector} velocity\n */\n Bounds.update = function(bounds, vertices, velocity) {\n bounds.min.x = Infinity;\n bounds.max.x = -Infinity;\n bounds.min.y = Infinity;\n bounds.max.y = -Infinity;\n\n for (var i = 0; i < vertices.length; i++) {\n var vertex = vertices[i];\n if (vertex.x > bounds.max.x) bounds.max.x = vertex.x;\n if (vertex.x < bounds.min.x) bounds.min.x = vertex.x;\n if (vertex.y > bounds.max.y) bounds.max.y = vertex.y;\n if (vertex.y < bounds.min.y) bounds.min.y = vertex.y;\n }\n \n if (velocity) {\n if (velocity.x > 0) {\n bounds.max.x += velocity.x;\n } else {\n bounds.min.x += velocity.x;\n }\n \n if (velocity.y > 0) {\n bounds.max.y += velocity.y;\n } else {\n bounds.min.y += velocity.y;\n }\n }\n };\n\n /**\n * Returns true if the bounds contains the given point.\n * @method contains\n * @param {bounds} bounds\n * @param {vector} point\n * @return {boolean} True if the bounds contain the point, otherwise false\n */\n Bounds.contains = function(bounds, point) {\n return point.x >= bounds.min.x && point.x <= bounds.max.x \n && point.y >= bounds.min.y && point.y <= bounds.max.y;\n };\n\n /**\n * Returns true if the two bounds intersect.\n * @method overlaps\n * @param {bounds} boundsA\n * @param {bounds} boundsB\n * @return {boolean} True if the bounds overlap, otherwise false\n */\n Bounds.overlaps = function(boundsA, boundsB) {\n return (boundsA.min.x <= boundsB.max.x && boundsA.max.x >= boundsB.min.x\n && boundsA.max.y >= boundsB.min.y && boundsA.min.y <= boundsB.max.y);\n };\n\n /**\n * Translates the bounds by the given vector.\n * @method translate\n * @param {bounds} bounds\n * @param {vector} vector\n */\n Bounds.translate = function(bounds, vector) {\n bounds.min.x += vector.x;\n bounds.max.x += vector.x;\n bounds.min.y += vector.y;\n bounds.max.y += vector.y;\n };\n\n /**\n * Shifts the bounds to the given position.\n * @method shift\n * @param {bounds} bounds\n * @param {vector} position\n */\n Bounds.shift = function(bounds, position) {\n var deltaX = bounds.max.x - bounds.min.x,\n deltaY = bounds.max.y - bounds.min.y;\n \n bounds.min.x = position.x;\n bounds.max.x = position.x + deltaX;\n bounds.min.y = position.y;\n bounds.max.y = position.y + deltaY;\n };\n \n})();\n\n\n/***/ }),\n/* 2 */\n/***/ (function(module, exports) {\n\n/**\n* The `Matter.Vector` module contains methods for creating and manipulating vectors.\n* Vectors are the basis of all the geometry related operations in the engine.\n* A `Matter.Vector` object is of the form `{ x: 0, y: 0 }`.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Vector\n*/\n\n// TODO: consider params for reusing vector objects\n\nvar Vector = {};\n\nmodule.exports = Vector;\n\n(function() {\n\n /**\n * Creates a new vector.\n * @method create\n * @param {number} x\n * @param {number} y\n * @return {vector} A new vector\n */\n Vector.create = function(x, y) {\n return { x: x || 0, y: y || 0 };\n };\n\n /**\n * Returns a new vector with `x` and `y` copied from the given `vector`.\n * @method clone\n * @param {vector} vector\n * @return {vector} A new cloned vector\n */\n Vector.clone = function(vector) {\n return { x: vector.x, y: vector.y };\n };\n\n /**\n * Returns the magnitude (length) of a vector.\n * @method magnitude\n * @param {vector} vector\n * @return {number} The magnitude of the vector\n */\n Vector.magnitude = function(vector) {\n return Math.sqrt((vector.x * vector.x) + (vector.y * vector.y));\n };\n\n /**\n * Returns the magnitude (length) of a vector (therefore saving a `sqrt` operation).\n * @method magnitudeSquared\n * @param {vector} vector\n * @return {number} The squared magnitude of the vector\n */\n Vector.magnitudeSquared = function(vector) {\n return (vector.x * vector.x) + (vector.y * vector.y);\n };\n\n /**\n * Rotates the vector about (0, 0) by specified angle.\n * @method rotate\n * @param {vector} vector\n * @param {number} angle\n * @param {vector} [output]\n * @return {vector} The vector rotated about (0, 0)\n */\n Vector.rotate = function(vector, angle, output) {\n var cos = Math.cos(angle), sin = Math.sin(angle);\n if (!output) output = {};\n var x = vector.x * cos - vector.y * sin;\n output.y = vector.x * sin + vector.y * cos;\n output.x = x;\n return output;\n };\n\n /**\n * Rotates the vector about a specified point by specified angle.\n * @method rotateAbout\n * @param {vector} vector\n * @param {number} angle\n * @param {vector} point\n * @param {vector} [output]\n * @return {vector} A new vector rotated about the point\n */\n Vector.rotateAbout = function(vector, angle, point, output) {\n var cos = Math.cos(angle), sin = Math.sin(angle);\n if (!output) output = {};\n var x = point.x + ((vector.x - point.x) * cos - (vector.y - point.y) * sin);\n output.y = point.y + ((vector.x - point.x) * sin + (vector.y - point.y) * cos);\n output.x = x;\n return output;\n };\n\n /**\n * Normalises a vector (such that its magnitude is `1`).\n * @method normalise\n * @param {vector} vector\n * @return {vector} A new vector normalised\n */\n Vector.normalise = function(vector) {\n var magnitude = Vector.magnitude(vector);\n if (magnitude === 0)\n return { x: 0, y: 0 };\n return { x: vector.x / magnitude, y: vector.y / magnitude };\n };\n\n /**\n * Returns the dot-product of two vectors.\n * @method dot\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @return {number} The dot product of the two vectors\n */\n Vector.dot = function(vectorA, vectorB) {\n return (vectorA.x * vectorB.x) + (vectorA.y * vectorB.y);\n };\n\n /**\n * Returns the cross-product of two vectors.\n * @method cross\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @return {number} The cross product of the two vectors\n */\n Vector.cross = function(vectorA, vectorB) {\n return (vectorA.x * vectorB.y) - (vectorA.y * vectorB.x);\n };\n\n /**\n * Returns the cross-product of three vectors.\n * @method cross3\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @param {vector} vectorC\n * @return {number} The cross product of the three vectors\n */\n Vector.cross3 = function(vectorA, vectorB, vectorC) {\n return (vectorB.x - vectorA.x) * (vectorC.y - vectorA.y) - (vectorB.y - vectorA.y) * (vectorC.x - vectorA.x);\n };\n\n /**\n * Adds the two vectors.\n * @method add\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @param {vector} [output]\n * @return {vector} A new vector of vectorA and vectorB added\n */\n Vector.add = function(vectorA, vectorB, output) {\n if (!output) output = {};\n output.x = vectorA.x + vectorB.x;\n output.y = vectorA.y + vectorB.y;\n return output;\n };\n\n /**\n * Subtracts the two vectors.\n * @method sub\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @param {vector} [output]\n * @return {vector} A new vector of vectorA and vectorB subtracted\n */\n Vector.sub = function(vectorA, vectorB, output) {\n if (!output) output = {};\n output.x = vectorA.x - vectorB.x;\n output.y = vectorA.y - vectorB.y;\n return output;\n };\n\n /**\n * Multiplies a vector and a scalar.\n * @method mult\n * @param {vector} vector\n * @param {number} scalar\n * @return {vector} A new vector multiplied by scalar\n */\n Vector.mult = function(vector, scalar) {\n return { x: vector.x * scalar, y: vector.y * scalar };\n };\n\n /**\n * Divides a vector and a scalar.\n * @method div\n * @param {vector} vector\n * @param {number} scalar\n * @return {vector} A new vector divided by scalar\n */\n Vector.div = function(vector, scalar) {\n return { x: vector.x / scalar, y: vector.y / scalar };\n };\n\n /**\n * Returns the perpendicular vector. Set `negate` to true for the perpendicular in the opposite direction.\n * @method perp\n * @param {vector} vector\n * @param {bool} [negate=false]\n * @return {vector} The perpendicular vector\n */\n Vector.perp = function(vector, negate) {\n negate = negate === true ? -1 : 1;\n return { x: negate * -vector.y, y: negate * vector.x };\n };\n\n /**\n * Negates both components of a vector such that it points in the opposite direction.\n * @method neg\n * @param {vector} vector\n * @return {vector} The negated vector\n */\n Vector.neg = function(vector) {\n return { x: -vector.x, y: -vector.y };\n };\n\n /**\n * Returns the angle between the vector `vectorB - vectorA` and the x-axis in radians.\n * @method angle\n * @param {vector} vectorA\n * @param {vector} vectorB\n * @return {number} The angle in radians\n */\n Vector.angle = function(vectorA, vectorB) {\n return Math.atan2(vectorB.y - vectorA.y, vectorB.x - vectorA.x);\n };\n\n /**\n * Temporary vector pool (not thread-safe).\n * @property _temp\n * @type {vector[]}\n * @private\n */\n Vector._temp = [\n Vector.create(), Vector.create(), \n Vector.create(), Vector.create(), \n Vector.create(), Vector.create()\n ];\n\n})();\n\n/***/ }),\n/* 3 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Vertices` module contains methods for creating and manipulating sets of vertices.\n* A set of vertices is an array of `Matter.Vector` with additional indexing properties inserted by `Vertices.create`.\n* A `Matter.Body` maintains a set of vertices to represent the shape of the object (its convex hull).\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Vertices\n*/\n\nvar Vertices = {};\n\nmodule.exports = Vertices;\n\nvar Vector = __webpack_require__(2);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Creates a new set of `Matter.Body` compatible vertices.\n * The `points` argument accepts an array of `Matter.Vector` points orientated around the origin `(0, 0)`, for example:\n *\n * [{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]\n *\n * The `Vertices.create` method returns a new array of vertices, which are similar to Matter.Vector objects,\n * but with some additional references required for efficient collision detection routines.\n *\n * Vertices must be specified in clockwise order.\n *\n * Note that the `body` argument is not optional, a `Matter.Body` reference must be provided.\n *\n * @method create\n * @param {vector[]} points\n * @param {body} body\n */\n Vertices.create = function(points, body) {\n var vertices = [];\n\n for (var i = 0; i < points.length; i++) {\n var point = points[i],\n vertex = {\n x: point.x,\n y: point.y,\n index: i,\n body: body,\n isInternal: false\n };\n\n vertices.push(vertex);\n }\n\n return vertices;\n };\n\n /**\n * Parses a string containing ordered x y pairs separated by spaces (and optionally commas), \n * into a `Matter.Vertices` object for the given `Matter.Body`.\n * For parsing SVG paths, see `Svg.pathToVertices`.\n * @method fromPath\n * @param {string} path\n * @param {body} body\n * @return {vertices} vertices\n */\n Vertices.fromPath = function(path, body) {\n var pathPattern = /L?\\s*([-\\d.e]+)[\\s,]*([-\\d.e]+)*/ig,\n points = [];\n\n path.replace(pathPattern, function(match, x, y) {\n points.push({ x: parseFloat(x), y: parseFloat(y) });\n });\n\n return Vertices.create(points, body);\n };\n\n /**\n * Returns the centre (centroid) of the set of vertices.\n * @method centre\n * @param {vertices} vertices\n * @return {vector} The centre point\n */\n Vertices.centre = function(vertices) {\n var area = Vertices.area(vertices, true),\n centre = { x: 0, y: 0 },\n cross,\n temp,\n j;\n\n for (var i = 0; i < vertices.length; i++) {\n j = (i + 1) % vertices.length;\n cross = Vector.cross(vertices[i], vertices[j]);\n temp = Vector.mult(Vector.add(vertices[i], vertices[j]), cross);\n centre = Vector.add(centre, temp);\n }\n\n return Vector.div(centre, 6 * area);\n };\n\n /**\n * Returns the average (mean) of the set of vertices.\n * @method mean\n * @param {vertices} vertices\n * @return {vector} The average point\n */\n Vertices.mean = function(vertices) {\n var average = { x: 0, y: 0 };\n\n for (var i = 0; i < vertices.length; i++) {\n average.x += vertices[i].x;\n average.y += vertices[i].y;\n }\n\n return Vector.div(average, vertices.length);\n };\n\n /**\n * Returns the area of the set of vertices.\n * @method area\n * @param {vertices} vertices\n * @param {bool} signed\n * @return {number} The area\n */\n Vertices.area = function(vertices, signed) {\n var area = 0,\n j = vertices.length - 1;\n\n for (var i = 0; i < vertices.length; i++) {\n area += (vertices[j].x - vertices[i].x) * (vertices[j].y + vertices[i].y);\n j = i;\n }\n\n if (signed)\n return area / 2;\n\n return Math.abs(area) / 2;\n };\n\n /**\n * Returns the moment of inertia (second moment of area) of the set of vertices given the total mass.\n * @method inertia\n * @param {vertices} vertices\n * @param {number} mass\n * @return {number} The polygon's moment of inertia\n */\n Vertices.inertia = function(vertices, mass) {\n var numerator = 0,\n denominator = 0,\n v = vertices,\n cross,\n j;\n\n // find the polygon's moment of inertia, using second moment of area\n // from equations at http://www.physicsforums.com/showthread.php?t=25293\n for (var n = 0; n < v.length; n++) {\n j = (n + 1) % v.length;\n cross = Math.abs(Vector.cross(v[j], v[n]));\n numerator += cross * (Vector.dot(v[j], v[j]) + Vector.dot(v[j], v[n]) + Vector.dot(v[n], v[n]));\n denominator += cross;\n }\n\n return (mass / 6) * (numerator / denominator);\n };\n\n /**\n * Translates the set of vertices in-place.\n * @method translate\n * @param {vertices} vertices\n * @param {vector} vector\n * @param {number} scalar\n */\n Vertices.translate = function(vertices, vector, scalar) {\n scalar = typeof scalar !== 'undefined' ? scalar : 1;\n\n var verticesLength = vertices.length,\n translateX = vector.x * scalar,\n translateY = vector.y * scalar,\n i;\n \n for (i = 0; i < verticesLength; i++) {\n vertices[i].x += translateX;\n vertices[i].y += translateY;\n }\n\n return vertices;\n };\n\n /**\n * Rotates the set of vertices in-place.\n * @method rotate\n * @param {vertices} vertices\n * @param {number} angle\n * @param {vector} point\n */\n Vertices.rotate = function(vertices, angle, point) {\n if (angle === 0)\n return;\n\n var cos = Math.cos(angle),\n sin = Math.sin(angle),\n pointX = point.x,\n pointY = point.y,\n verticesLength = vertices.length,\n vertex,\n dx,\n dy,\n i;\n\n for (i = 0; i < verticesLength; i++) {\n vertex = vertices[i];\n dx = vertex.x - pointX;\n dy = vertex.y - pointY;\n vertex.x = pointX + (dx * cos - dy * sin);\n vertex.y = pointY + (dx * sin + dy * cos);\n }\n\n return vertices;\n };\n\n /**\n * Returns `true` if the `point` is inside the set of `vertices`.\n * @method contains\n * @param {vertices} vertices\n * @param {vector} point\n * @return {boolean} True if the vertices contains point, otherwise false\n */\n Vertices.contains = function(vertices, point) {\n var pointX = point.x,\n pointY = point.y,\n verticesLength = vertices.length,\n vertex = vertices[verticesLength - 1],\n nextVertex;\n\n for (var i = 0; i < verticesLength; i++) {\n nextVertex = vertices[i];\n\n if ((pointX - vertex.x) * (nextVertex.y - vertex.y) \n + (pointY - vertex.y) * (vertex.x - nextVertex.x) > 0) {\n return false;\n }\n\n vertex = nextVertex;\n }\n\n return true;\n };\n\n /**\n * Scales the vertices from a point (default is centre) in-place.\n * @method scale\n * @param {vertices} vertices\n * @param {number} scaleX\n * @param {number} scaleY\n * @param {vector} point\n */\n Vertices.scale = function(vertices, scaleX, scaleY, point) {\n if (scaleX === 1 && scaleY === 1)\n return vertices;\n\n point = point || Vertices.centre(vertices);\n\n var vertex,\n delta;\n\n for (var i = 0; i < vertices.length; i++) {\n vertex = vertices[i];\n delta = Vector.sub(vertex, point);\n vertices[i].x = point.x + delta.x * scaleX;\n vertices[i].y = point.y + delta.y * scaleY;\n }\n\n return vertices;\n };\n\n /**\n * Chamfers a set of vertices by giving them rounded corners, returns a new set of vertices.\n * The radius parameter is a single number or an array to specify the radius for each vertex.\n * @method chamfer\n * @param {vertices} vertices\n * @param {number[]} radius\n * @param {number} quality\n * @param {number} qualityMin\n * @param {number} qualityMax\n */\n Vertices.chamfer = function(vertices, radius, quality, qualityMin, qualityMax) {\n if (typeof radius === 'number') {\n radius = [radius];\n } else {\n radius = radius || [8];\n }\n\n // quality defaults to -1, which is auto\n quality = (typeof quality !== 'undefined') ? quality : -1;\n qualityMin = qualityMin || 2;\n qualityMax = qualityMax || 14;\n\n var newVertices = [];\n\n for (var i = 0; i < vertices.length; i++) {\n var prevVertex = vertices[i - 1 >= 0 ? i - 1 : vertices.length - 1],\n vertex = vertices[i],\n nextVertex = vertices[(i + 1) % vertices.length],\n currentRadius = radius[i < radius.length ? i : radius.length - 1];\n\n if (currentRadius === 0) {\n newVertices.push(vertex);\n continue;\n }\n\n var prevNormal = Vector.normalise({ \n x: vertex.y - prevVertex.y, \n y: prevVertex.x - vertex.x\n });\n\n var nextNormal = Vector.normalise({ \n x: nextVertex.y - vertex.y, \n y: vertex.x - nextVertex.x\n });\n\n var diagonalRadius = Math.sqrt(2 * Math.pow(currentRadius, 2)),\n radiusVector = Vector.mult(Common.clone(prevNormal), currentRadius),\n midNormal = Vector.normalise(Vector.mult(Vector.add(prevNormal, nextNormal), 0.5)),\n scaledVertex = Vector.sub(vertex, Vector.mult(midNormal, diagonalRadius));\n\n var precision = quality;\n\n if (quality === -1) {\n // automatically decide precision\n precision = Math.pow(currentRadius, 0.32) * 1.75;\n }\n\n precision = Common.clamp(precision, qualityMin, qualityMax);\n\n // use an even value for precision, more likely to reduce axes by using symmetry\n if (precision % 2 === 1)\n precision += 1;\n\n var alpha = Math.acos(Vector.dot(prevNormal, nextNormal)),\n theta = alpha / precision;\n\n for (var j = 0; j < precision; j++) {\n newVertices.push(Vector.add(Vector.rotate(radiusVector, theta * j), scaledVertex));\n }\n }\n\n return newVertices;\n };\n\n /**\n * Sorts the input vertices into clockwise order in place.\n * @method clockwiseSort\n * @param {vertices} vertices\n * @return {vertices} vertices\n */\n Vertices.clockwiseSort = function(vertices) {\n var centre = Vertices.mean(vertices);\n\n vertices.sort(function(vertexA, vertexB) {\n return Vector.angle(centre, vertexA) - Vector.angle(centre, vertexB);\n });\n\n return vertices;\n };\n\n /**\n * Returns true if the vertices form a convex shape (vertices must be in clockwise order).\n * @method isConvex\n * @param {vertices} vertices\n * @return {bool} `true` if the `vertices` are convex, `false` if not (or `null` if not computable).\n */\n Vertices.isConvex = function(vertices) {\n // http://paulbourke.net/geometry/polygonmesh/\n // Copyright (c) Paul Bourke (use permitted)\n\n var flag = 0,\n n = vertices.length,\n i,\n j,\n k,\n z;\n\n if (n < 3)\n return null;\n\n for (i = 0; i < n; i++) {\n j = (i + 1) % n;\n k = (i + 2) % n;\n z = (vertices[j].x - vertices[i].x) * (vertices[k].y - vertices[j].y);\n z -= (vertices[j].y - vertices[i].y) * (vertices[k].x - vertices[j].x);\n\n if (z < 0) {\n flag |= 1;\n } else if (z > 0) {\n flag |= 2;\n }\n\n if (flag === 3) {\n return false;\n }\n }\n\n if (flag !== 0){\n return true;\n } else {\n return null;\n }\n };\n\n /**\n * Returns the convex hull of the input vertices as a new array of points.\n * @method hull\n * @param {vertices} vertices\n * @return [vertex] vertices\n */\n Vertices.hull = function(vertices) {\n // http://geomalgorithms.com/a10-_hull-1.html\n\n var upper = [],\n lower = [], \n vertex,\n i;\n\n // sort vertices on x-axis (y-axis for ties)\n vertices = vertices.slice(0);\n vertices.sort(function(vertexA, vertexB) {\n var dx = vertexA.x - vertexB.x;\n return dx !== 0 ? dx : vertexA.y - vertexB.y;\n });\n\n // build lower hull\n for (i = 0; i < vertices.length; i += 1) {\n vertex = vertices[i];\n\n while (lower.length >= 2 \n && Vector.cross3(lower[lower.length - 2], lower[lower.length - 1], vertex) <= 0) {\n lower.pop();\n }\n\n lower.push(vertex);\n }\n\n // build upper hull\n for (i = vertices.length - 1; i >= 0; i -= 1) {\n vertex = vertices[i];\n\n while (upper.length >= 2 \n && Vector.cross3(upper[upper.length - 2], upper[upper.length - 1], vertex) <= 0) {\n upper.pop();\n }\n\n upper.push(vertex);\n }\n\n // concatenation of the lower and upper hulls gives the convex hull\n // omit last points because they are repeated at the beginning of the other list\n upper.pop();\n lower.pop();\n\n return upper.concat(lower);\n };\n\n})();\n\n\n/***/ }),\n/* 4 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Body` module contains methods for creating and manipulating rigid bodies.\n* For creating bodies with common configurations such as rectangles, circles and other polygons see the module `Matter.Bodies`.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n\n* @class Body\n*/\n\nvar Body = {};\n\nmodule.exports = Body;\n\nvar Vertices = __webpack_require__(3);\nvar Vector = __webpack_require__(2);\nvar Sleeping = __webpack_require__(7);\nvar Common = __webpack_require__(0);\nvar Bounds = __webpack_require__(1);\nvar Axes = __webpack_require__(11);\n\n(function() {\n\n Body._timeCorrection = true;\n Body._inertiaScale = 4;\n Body._nextCollidingGroupId = 1;\n Body._nextNonCollidingGroupId = -1;\n Body._nextCategory = 0x0001;\n Body._baseDelta = 1000 / 60;\n\n /**\n * Creates a new rigid body model. The options parameter is an object that specifies any properties you wish to override the defaults.\n * All properties have default values, and many are pre-calculated automatically based on other properties.\n * Vertices must be specified in clockwise order.\n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {} options\n * @return {body} body\n */\n Body.create = function(options) {\n var defaults = {\n id: Common.nextId(),\n type: 'body',\n label: 'Body',\n parts: [],\n plugin: {},\n angle: 0,\n vertices: Vertices.fromPath('L 0 0 L 40 0 L 40 40 L 0 40'),\n position: { x: 0, y: 0 },\n force: { x: 0, y: 0 },\n torque: 0,\n positionImpulse: { x: 0, y: 0 },\n constraintImpulse: { x: 0, y: 0, angle: 0 },\n totalContacts: 0,\n speed: 0,\n angularSpeed: 0,\n velocity: { x: 0, y: 0 },\n angularVelocity: 0,\n isSensor: false,\n isStatic: false,\n isSleeping: false,\n motion: 0,\n sleepThreshold: 60,\n density: 0.001,\n restitution: 0,\n friction: 0.1,\n frictionStatic: 0.5,\n frictionAir: 0.01,\n collisionFilter: {\n category: 0x0001,\n mask: 0xFFFFFFFF,\n group: 0\n },\n slop: 0.05,\n timeScale: 1,\n render: {\n visible: true,\n opacity: 1,\n strokeStyle: null,\n fillStyle: null,\n lineWidth: null,\n sprite: {\n xScale: 1,\n yScale: 1,\n xOffset: 0,\n yOffset: 0\n }\n },\n events: null,\n bounds: null,\n chamfer: null,\n circleRadius: 0,\n positionPrev: null,\n anglePrev: 0,\n parent: null,\n axes: null,\n area: 0,\n mass: 0,\n inertia: 0,\n deltaTime: 1000 / 60,\n _original: null\n };\n\n var body = Common.extend(defaults, options);\n\n _initProperties(body, options);\n\n return body;\n };\n\n /**\n * Returns the next unique group index for which bodies will collide.\n * If `isNonColliding` is `true`, returns the next unique group index for which bodies will _not_ collide.\n * See `body.collisionFilter` for more information.\n * @method nextGroup\n * @param {bool} [isNonColliding=false]\n * @return {Number} Unique group index\n */\n Body.nextGroup = function(isNonColliding) {\n if (isNonColliding)\n return Body._nextNonCollidingGroupId--;\n\n return Body._nextCollidingGroupId++;\n };\n\n /**\n * Returns the next unique category bitfield (starting after the initial default category `0x0001`).\n * There are 32 available. See `body.collisionFilter` for more information.\n * @method nextCategory\n * @return {Number} Unique category bitfield\n */\n Body.nextCategory = function() {\n Body._nextCategory = Body._nextCategory << 1;\n return Body._nextCategory;\n };\n\n /**\n * Initialises body properties.\n * @method _initProperties\n * @private\n * @param {body} body\n * @param {} [options]\n */\n var _initProperties = function(body, options) {\n options = options || {};\n\n // init required properties (order is important)\n Body.set(body, {\n bounds: body.bounds || Bounds.create(body.vertices),\n positionPrev: body.positionPrev || Vector.clone(body.position),\n anglePrev: body.anglePrev || body.angle,\n vertices: body.vertices,\n parts: body.parts || [body],\n isStatic: body.isStatic,\n isSleeping: body.isSleeping,\n parent: body.parent || body\n });\n\n Vertices.rotate(body.vertices, body.angle, body.position);\n Axes.rotate(body.axes, body.angle);\n Bounds.update(body.bounds, body.vertices, body.velocity);\n\n // allow options to override the automatically calculated properties\n Body.set(body, {\n axes: options.axes || body.axes,\n area: options.area || body.area,\n mass: options.mass || body.mass,\n inertia: options.inertia || body.inertia\n });\n\n // render properties\n var defaultFillStyle = (body.isStatic ? '#14151f' : Common.choose(['#f19648', '#f5d259', '#f55a3c', '#063e7b', '#ececd1'])),\n defaultStrokeStyle = body.isStatic ? '#555' : '#ccc',\n defaultLineWidth = body.isStatic && body.render.fillStyle === null ? 1 : 0;\n body.render.fillStyle = body.render.fillStyle || defaultFillStyle;\n body.render.strokeStyle = body.render.strokeStyle || defaultStrokeStyle;\n body.render.lineWidth = body.render.lineWidth || defaultLineWidth;\n body.render.sprite.xOffset += -(body.bounds.min.x - body.position.x) / (body.bounds.max.x - body.bounds.min.x);\n body.render.sprite.yOffset += -(body.bounds.min.y - body.position.y) / (body.bounds.max.y - body.bounds.min.y);\n };\n\n /**\n * Given a property and a value (or map of), sets the property(s) on the body, using the appropriate setter functions if they exist.\n * Prefer to use the actual setter functions in performance critical situations.\n * @method set\n * @param {body} body\n * @param {} settings A property name (or map of properties and values) to set on the body.\n * @param {} value The value to set if `settings` is a single property name.\n */\n Body.set = function(body, settings, value) {\n var property;\n\n if (typeof settings === 'string') {\n property = settings;\n settings = {};\n settings[property] = value;\n }\n\n for (property in settings) {\n if (!Object.prototype.hasOwnProperty.call(settings, property))\n continue;\n\n value = settings[property];\n switch (property) {\n\n case 'isStatic':\n Body.setStatic(body, value);\n break;\n case 'isSleeping':\n Sleeping.set(body, value);\n break;\n case 'mass':\n Body.setMass(body, value);\n break;\n case 'density':\n Body.setDensity(body, value);\n break;\n case 'inertia':\n Body.setInertia(body, value);\n break;\n case 'vertices':\n Body.setVertices(body, value);\n break;\n case 'position':\n Body.setPosition(body, value);\n break;\n case 'angle':\n Body.setAngle(body, value);\n break;\n case 'velocity':\n Body.setVelocity(body, value);\n break;\n case 'angularVelocity':\n Body.setAngularVelocity(body, value);\n break;\n case 'speed':\n Body.setSpeed(body, value);\n break;\n case 'angularSpeed':\n Body.setAngularSpeed(body, value);\n break;\n case 'parts':\n Body.setParts(body, value);\n break;\n case 'centre':\n Body.setCentre(body, value);\n break;\n default:\n body[property] = value;\n\n }\n }\n };\n\n /**\n * Sets the body as static, including isStatic flag and setting mass and inertia to Infinity.\n * @method setStatic\n * @param {body} body\n * @param {bool} isStatic\n */\n Body.setStatic = function(body, isStatic) {\n for (var i = 0; i < body.parts.length; i++) {\n var part = body.parts[i];\n\n if (isStatic) {\n if (!part.isStatic) {\n part._original = {\n restitution: part.restitution,\n friction: part.friction,\n mass: part.mass,\n inertia: part.inertia,\n density: part.density,\n inverseMass: part.inverseMass,\n inverseInertia: part.inverseInertia\n };\n }\n\n part.restitution = 0;\n part.friction = 1;\n part.mass = part.inertia = part.density = Infinity;\n part.inverseMass = part.inverseInertia = 0;\n\n part.positionPrev.x = part.position.x;\n part.positionPrev.y = part.position.y;\n part.anglePrev = part.angle;\n part.angularVelocity = 0;\n part.speed = 0;\n part.angularSpeed = 0;\n part.motion = 0;\n } else if (part._original) {\n part.restitution = part._original.restitution;\n part.friction = part._original.friction;\n part.mass = part._original.mass;\n part.inertia = part._original.inertia;\n part.density = part._original.density;\n part.inverseMass = part._original.inverseMass;\n part.inverseInertia = part._original.inverseInertia;\n\n part._original = null;\n }\n\n part.isStatic = isStatic;\n }\n };\n\n /**\n * Sets the mass of the body. Inverse mass, density and inertia are automatically updated to reflect the change.\n * @method setMass\n * @param {body} body\n * @param {number} mass\n */\n Body.setMass = function(body, mass) {\n var moment = body.inertia / (body.mass / 6);\n body.inertia = moment * (mass / 6);\n body.inverseInertia = 1 / body.inertia;\n\n body.mass = mass;\n body.inverseMass = 1 / body.mass;\n body.density = body.mass / body.area;\n };\n\n /**\n * Sets the density of the body. Mass and inertia are automatically updated to reflect the change.\n * @method setDensity\n * @param {body} body\n * @param {number} density\n */\n Body.setDensity = function(body, density) {\n Body.setMass(body, density * body.area);\n body.density = density;\n };\n\n /**\n * Sets the moment of inertia of the body. This is the second moment of area in two dimensions.\n * Inverse inertia is automatically updated to reflect the change. Mass is not changed.\n * @method setInertia\n * @param {body} body\n * @param {number} inertia\n */\n Body.setInertia = function(body, inertia) {\n body.inertia = inertia;\n body.inverseInertia = 1 / body.inertia;\n };\n\n /**\n * Sets the body's vertices and updates body properties accordingly, including inertia, area and mass (with respect to `body.density`).\n * Vertices will be automatically transformed to be orientated around their centre of mass as the origin.\n * They are then automatically translated to world space based on `body.position`.\n *\n * The `vertices` argument should be passed as an array of `Matter.Vector` points (or a `Matter.Vertices` array).\n * Vertices must form a convex hull. Concave vertices must be decomposed into convex parts.\n * \n * @method setVertices\n * @param {body} body\n * @param {vector[]} vertices\n */\n Body.setVertices = function(body, vertices) {\n // change vertices\n if (vertices[0].body === body) {\n body.vertices = vertices;\n } else {\n body.vertices = Vertices.create(vertices, body);\n }\n\n // update properties\n body.axes = Axes.fromVertices(body.vertices);\n body.area = Vertices.area(body.vertices);\n Body.setMass(body, body.density * body.area);\n\n // orient vertices around the centre of mass at origin (0, 0)\n var centre = Vertices.centre(body.vertices);\n Vertices.translate(body.vertices, centre, -1);\n\n // update inertia while vertices are at origin (0, 0)\n Body.setInertia(body, Body._inertiaScale * Vertices.inertia(body.vertices, body.mass));\n\n // update geometry\n Vertices.translate(body.vertices, body.position);\n Bounds.update(body.bounds, body.vertices, body.velocity);\n };\n\n /**\n * Sets the parts of the `body`. \n * \n * See `body.parts` for details and requirements on how parts are used.\n * \n * See Bodies.fromVertices for a related utility.\n * \n * This function updates `body` mass, inertia and centroid based on the parts geometry. \n * Sets each `part.parent` to be this `body`. \n * \n * The convex hull is computed and set on this `body` (unless `autoHull` is `false`). \n * Automatically ensures that the first part in `body.parts` is the `body`.\n * @method setParts\n * @param {body} body\n * @param {body[]} parts\n * @param {bool} [autoHull=true]\n */\n Body.setParts = function(body, parts, autoHull) {\n var i;\n\n // add all the parts, ensuring that the first part is always the parent body\n parts = parts.slice(0);\n body.parts.length = 0;\n body.parts.push(body);\n body.parent = body;\n\n for (i = 0; i < parts.length; i++) {\n var part = parts[i];\n if (part !== body) {\n part.parent = body;\n body.parts.push(part);\n }\n }\n\n if (body.parts.length === 1)\n return;\n\n autoHull = typeof autoHull !== 'undefined' ? autoHull : true;\n\n // find the convex hull of all parts to set on the parent body\n if (autoHull) {\n var vertices = [];\n for (i = 0; i < parts.length; i++) {\n vertices = vertices.concat(parts[i].vertices);\n }\n\n Vertices.clockwiseSort(vertices);\n\n var hull = Vertices.hull(vertices),\n hullCentre = Vertices.centre(hull);\n\n Body.setVertices(body, hull);\n Vertices.translate(body.vertices, hullCentre);\n }\n\n // sum the properties of all compound parts of the parent body\n var total = Body._totalProperties(body);\n\n body.area = total.area;\n body.parent = body;\n body.position.x = total.centre.x;\n body.position.y = total.centre.y;\n body.positionPrev.x = total.centre.x;\n body.positionPrev.y = total.centre.y;\n\n Body.setMass(body, total.mass);\n Body.setInertia(body, total.inertia);\n Body.setPosition(body, total.centre);\n };\n\n /**\n * Set the centre of mass of the body. \n * The `centre` is a vector in world-space unless `relative` is set, in which case it is a translation.\n * The centre of mass is the point the body rotates about and can be used to simulate non-uniform density.\n * This is equal to moving `body.position` but not the `body.vertices`.\n * Invalid if the `centre` falls outside the body's convex hull.\n * @method setCentre\n * @param {body} body\n * @param {vector} centre\n * @param {bool} relative\n */\n Body.setCentre = function(body, centre, relative) {\n if (!relative) {\n body.positionPrev.x = centre.x - (body.position.x - body.positionPrev.x);\n body.positionPrev.y = centre.y - (body.position.y - body.positionPrev.y);\n body.position.x = centre.x;\n body.position.y = centre.y;\n } else {\n body.positionPrev.x += centre.x;\n body.positionPrev.y += centre.y;\n body.position.x += centre.x;\n body.position.y += centre.y;\n }\n };\n\n /**\n * Sets the position of the body. By default velocity is unchanged.\n * If `updateVelocity` is `true` then velocity is inferred from the change in position.\n * @method setPosition\n * @param {body} body\n * @param {vector} position\n * @param {boolean} [updateVelocity=false]\n */\n Body.setPosition = function(body, position, updateVelocity) {\n var delta = Vector.sub(position, body.position);\n\n if (updateVelocity) {\n body.positionPrev.x = body.position.x;\n body.positionPrev.y = body.position.y;\n body.velocity.x = delta.x;\n body.velocity.y = delta.y;\n body.speed = Vector.magnitude(delta);\n } else {\n body.positionPrev.x += delta.x;\n body.positionPrev.y += delta.y;\n }\n\n for (var i = 0; i < body.parts.length; i++) {\n var part = body.parts[i];\n part.position.x += delta.x;\n part.position.y += delta.y;\n Vertices.translate(part.vertices, delta);\n Bounds.update(part.bounds, part.vertices, body.velocity);\n }\n };\n\n /**\n * Sets the angle of the body. By default angular velocity is unchanged.\n * If `updateVelocity` is `true` then angular velocity is inferred from the change in angle.\n * @method setAngle\n * @param {body} body\n * @param {number} angle\n * @param {boolean} [updateVelocity=false]\n */\n Body.setAngle = function(body, angle, updateVelocity) {\n var delta = angle - body.angle;\n \n if (updateVelocity) {\n body.anglePrev = body.angle;\n body.angularVelocity = delta;\n body.angularSpeed = Math.abs(delta);\n } else {\n body.anglePrev += delta;\n }\n\n for (var i = 0; i < body.parts.length; i++) {\n var part = body.parts[i];\n part.angle += delta;\n Vertices.rotate(part.vertices, delta, body.position);\n Axes.rotate(part.axes, delta);\n Bounds.update(part.bounds, part.vertices, body.velocity);\n if (i > 0) {\n Vector.rotateAbout(part.position, delta, body.position, part.position);\n }\n }\n };\n\n /**\n * Sets the current linear velocity of the body. \n * Affects body speed.\n * @method setVelocity\n * @param {body} body\n * @param {vector} velocity\n */\n Body.setVelocity = function(body, velocity) {\n var timeScale = body.deltaTime / Body._baseDelta;\n body.positionPrev.x = body.position.x - velocity.x * timeScale;\n body.positionPrev.y = body.position.y - velocity.y * timeScale;\n body.velocity.x = (body.position.x - body.positionPrev.x) / timeScale;\n body.velocity.y = (body.position.y - body.positionPrev.y) / timeScale;\n body.speed = Vector.magnitude(body.velocity);\n };\n\n /**\n * Gets the current linear velocity of the body.\n * @method getVelocity\n * @param {body} body\n * @return {vector} velocity\n */\n Body.getVelocity = function(body) {\n var timeScale = Body._baseDelta / body.deltaTime;\n\n return {\n x: (body.position.x - body.positionPrev.x) * timeScale,\n y: (body.position.y - body.positionPrev.y) * timeScale\n };\n };\n\n /**\n * Gets the current linear speed of the body. \n * Equivalent to the magnitude of its velocity.\n * @method getSpeed\n * @param {body} body\n * @return {number} speed\n */\n Body.getSpeed = function(body) {\n return Vector.magnitude(Body.getVelocity(body));\n };\n\n /**\n * Sets the current linear speed of the body. \n * Direction is maintained. Affects body velocity.\n * @method setSpeed\n * @param {body} body\n * @param {number} speed\n */\n Body.setSpeed = function(body, speed) {\n Body.setVelocity(body, Vector.mult(Vector.normalise(Body.getVelocity(body)), speed));\n };\n\n /**\n * Sets the current rotational velocity of the body. \n * Affects body angular speed.\n * @method setAngularVelocity\n * @param {body} body\n * @param {number} velocity\n */\n Body.setAngularVelocity = function(body, velocity) {\n var timeScale = body.deltaTime / Body._baseDelta;\n body.anglePrev = body.angle - velocity * timeScale;\n body.angularVelocity = (body.angle - body.anglePrev) / timeScale;\n body.angularSpeed = Math.abs(body.angularVelocity);\n };\n\n /**\n * Gets the current rotational velocity of the body.\n * @method getAngularVelocity\n * @param {body} body\n * @return {number} angular velocity\n */\n Body.getAngularVelocity = function(body) {\n return (body.angle - body.anglePrev) * Body._baseDelta / body.deltaTime;\n };\n\n /**\n * Gets the current rotational speed of the body. \n * Equivalent to the magnitude of its angular velocity.\n * @method getAngularSpeed\n * @param {body} body\n * @return {number} angular speed\n */\n Body.getAngularSpeed = function(body) {\n return Math.abs(Body.getAngularVelocity(body));\n };\n\n /**\n * Sets the current rotational speed of the body. \n * Direction is maintained. Affects body angular velocity.\n * @method setAngularSpeed\n * @param {body} body\n * @param {number} speed\n */\n Body.setAngularSpeed = function(body, speed) {\n Body.setAngularVelocity(body, Common.sign(Body.getAngularVelocity(body)) * speed);\n };\n\n /**\n * Moves a body by a given vector relative to its current position. By default velocity is unchanged.\n * If `updateVelocity` is `true` then velocity is inferred from the change in position.\n * @method translate\n * @param {body} body\n * @param {vector} translation\n * @param {boolean} [updateVelocity=false]\n */\n Body.translate = function(body, translation, updateVelocity) {\n Body.setPosition(body, Vector.add(body.position, translation), updateVelocity);\n };\n\n /**\n * Rotates a body by a given angle relative to its current angle. By default angular velocity is unchanged.\n * If `updateVelocity` is `true` then angular velocity is inferred from the change in angle.\n * @method rotate\n * @param {body} body\n * @param {number} rotation\n * @param {vector} [point]\n * @param {boolean} [updateVelocity=false]\n */\n Body.rotate = function(body, rotation, point, updateVelocity) {\n if (!point) {\n Body.setAngle(body, body.angle + rotation, updateVelocity);\n } else {\n var cos = Math.cos(rotation),\n sin = Math.sin(rotation),\n dx = body.position.x - point.x,\n dy = body.position.y - point.y;\n \n Body.setPosition(body, {\n x: point.x + (dx * cos - dy * sin),\n y: point.y + (dx * sin + dy * cos)\n }, updateVelocity);\n\n Body.setAngle(body, body.angle + rotation, updateVelocity);\n }\n };\n\n /**\n * Scales the body, including updating physical properties (mass, area, axes, inertia), from a world-space point (default is body centre).\n * @method scale\n * @param {body} body\n * @param {number} scaleX\n * @param {number} scaleY\n * @param {vector} [point]\n */\n Body.scale = function(body, scaleX, scaleY, point) {\n var totalArea = 0,\n totalInertia = 0;\n\n point = point || body.position;\n\n for (var i = 0; i < body.parts.length; i++) {\n var part = body.parts[i];\n\n // scale vertices\n Vertices.scale(part.vertices, scaleX, scaleY, point);\n\n // update properties\n part.axes = Axes.fromVertices(part.vertices);\n part.area = Vertices.area(part.vertices);\n Body.setMass(part, body.density * part.area);\n\n // update inertia (requires vertices to be at origin)\n Vertices.translate(part.vertices, { x: -part.position.x, y: -part.position.y });\n Body.setInertia(part, Body._inertiaScale * Vertices.inertia(part.vertices, part.mass));\n Vertices.translate(part.vertices, { x: part.position.x, y: part.position.y });\n\n if (i > 0) {\n totalArea += part.area;\n totalInertia += part.inertia;\n }\n\n // scale position\n part.position.x = point.x + (part.position.x - point.x) * scaleX;\n part.position.y = point.y + (part.position.y - point.y) * scaleY;\n\n // update bounds\n Bounds.update(part.bounds, part.vertices, body.velocity);\n }\n\n // handle parent body\n if (body.parts.length > 1) {\n body.area = totalArea;\n\n if (!body.isStatic) {\n Body.setMass(body, body.density * totalArea);\n Body.setInertia(body, totalInertia);\n }\n }\n\n // handle circles\n if (body.circleRadius) { \n if (scaleX === scaleY) {\n body.circleRadius *= scaleX;\n } else {\n // body is no longer a circle\n body.circleRadius = null;\n }\n }\n };\n\n /**\n * Performs an update by integrating the equations of motion on the `body`.\n * This is applied every update by `Matter.Engine` automatically.\n * @method update\n * @param {body} body\n * @param {number} [deltaTime=16.666]\n */\n Body.update = function(body, deltaTime) {\n deltaTime = (typeof deltaTime !== 'undefined' ? deltaTime : (1000 / 60)) * body.timeScale;\n\n var deltaTimeSquared = deltaTime * deltaTime,\n correction = Body._timeCorrection ? deltaTime / (body.deltaTime || deltaTime) : 1;\n\n // from the previous step\n var frictionAir = 1 - body.frictionAir * (deltaTime / Common._baseDelta),\n velocityPrevX = (body.position.x - body.positionPrev.x) * correction,\n velocityPrevY = (body.position.y - body.positionPrev.y) * correction;\n\n // update velocity with Verlet integration\n body.velocity.x = (velocityPrevX * frictionAir) + (body.force.x / body.mass) * deltaTimeSquared;\n body.velocity.y = (velocityPrevY * frictionAir) + (body.force.y / body.mass) * deltaTimeSquared;\n\n body.positionPrev.x = body.position.x;\n body.positionPrev.y = body.position.y;\n body.position.x += body.velocity.x;\n body.position.y += body.velocity.y;\n body.deltaTime = deltaTime;\n\n // update angular velocity with Verlet integration\n body.angularVelocity = ((body.angle - body.anglePrev) * frictionAir * correction) + (body.torque / body.inertia) * deltaTimeSquared;\n body.anglePrev = body.angle;\n body.angle += body.angularVelocity;\n\n // transform the body geometry\n for (var i = 0; i < body.parts.length; i++) {\n var part = body.parts[i];\n\n Vertices.translate(part.vertices, body.velocity);\n \n if (i > 0) {\n part.position.x += body.velocity.x;\n part.position.y += body.velocity.y;\n }\n\n if (body.angularVelocity !== 0) {\n Vertices.rotate(part.vertices, body.angularVelocity, body.position);\n Axes.rotate(part.axes, body.angularVelocity);\n if (i > 0) {\n Vector.rotateAbout(part.position, body.angularVelocity, body.position, part.position);\n }\n }\n\n Bounds.update(part.bounds, part.vertices, body.velocity);\n }\n };\n\n /**\n * Updates properties `body.velocity`, `body.speed`, `body.angularVelocity` and `body.angularSpeed` which are normalised in relation to `Body._baseDelta`.\n * @method updateVelocities\n * @param {body} body\n */\n Body.updateVelocities = function(body) {\n var timeScale = Body._baseDelta / body.deltaTime,\n bodyVelocity = body.velocity;\n\n bodyVelocity.x = (body.position.x - body.positionPrev.x) * timeScale;\n bodyVelocity.y = (body.position.y - body.positionPrev.y) * timeScale;\n body.speed = Math.sqrt((bodyVelocity.x * bodyVelocity.x) + (bodyVelocity.y * bodyVelocity.y));\n\n body.angularVelocity = (body.angle - body.anglePrev) * timeScale;\n body.angularSpeed = Math.abs(body.angularVelocity);\n };\n\n /**\n * Applies the `force` to the `body` from the force origin `position` in world-space, over a single timestep, including applying any resulting angular torque.\n * \n * Forces are useful for effects like gravity, wind or rocket thrust, but can be difficult in practice when precise control is needed. In these cases see `Body.setVelocity` and `Body.setPosition` as an alternative.\n * \n * The force from this function is only applied once for the duration of a single timestep, in other words the duration depends directly on the current engine update `delta` and the rate of calls to this function.\n * \n * Therefore to account for time, you should apply the force constantly over as many engine updates as equivalent to the intended duration.\n * \n * If all or part of the force duration is some fraction of a timestep, first multiply the force by `duration / timestep`.\n * \n * The force origin `position` in world-space must also be specified. Passing `body.position` will result in zero angular effect as the force origin would be at the centre of mass.\n * \n * The `body` will take time to accelerate under a force, the resulting effect depends on duration of the force, the body mass and other forces on the body including friction combined.\n * @method applyForce\n * @param {body} body\n * @param {vector} position The force origin in world-space. Pass `body.position` to avoid angular torque.\n * @param {vector} force\n */\n Body.applyForce = function(body, position, force) {\n var offset = { x: position.x - body.position.x, y: position.y - body.position.y };\n body.force.x += force.x;\n body.force.y += force.y;\n body.torque += offset.x * force.y - offset.y * force.x;\n };\n\n /**\n * Returns the sums of the properties of all compound parts of the parent body.\n * @method _totalProperties\n * @private\n * @param {body} body\n * @return {}\n */\n Body._totalProperties = function(body) {\n // from equations at:\n // https://ecourses.ou.edu/cgi-bin/ebook.cgi?doc=&topic=st&chap_sec=07.2&page=theory\n // http://output.to/sideway/default.asp?qno=121100087\n\n var properties = {\n mass: 0,\n area: 0,\n inertia: 0,\n centre: { x: 0, y: 0 }\n };\n\n // sum the properties of all compound parts of the parent body\n for (var i = body.parts.length === 1 ? 0 : 1; i < body.parts.length; i++) {\n var part = body.parts[i],\n mass = part.mass !== Infinity ? part.mass : 1;\n\n properties.mass += mass;\n properties.area += part.area;\n properties.inertia += part.inertia;\n properties.centre = Vector.add(properties.centre, Vector.mult(part.position, mass));\n }\n\n properties.centre = Vector.div(properties.centre, properties.mass);\n\n return properties;\n };\n\n /*\n *\n * Events Documentation\n *\n */\n\n /**\n * Fired when a body starts sleeping (where `this` is the body).\n *\n * @event sleepStart\n * @this {body} The body that has started sleeping\n * @param {} event An event object\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when a body ends sleeping (where `this` is the body).\n *\n * @event sleepEnd\n * @this {body} The body that has ended sleeping\n * @param {} event An event object\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * An integer `Number` uniquely identifying number generated in `Body.create` by `Common.nextId`.\n *\n * @property id\n * @type number\n */\n\n /**\n * _Read only_. Set by `Body.create`.\n * \n * A `String` denoting the type of object.\n *\n * @readOnly\n * @property type\n * @type string\n * @default \"body\"\n */\n\n /**\n * An arbitrary `String` name to help the user identify and manage bodies.\n *\n * @property label\n * @type string\n * @default \"Body\"\n */\n\n /**\n * _Read only_. Use `Body.setParts` to set. \n * \n * See `Bodies.fromVertices` for a related utility.\n * \n * An array of bodies (the 'parts') that make up this body (the 'parent'). The first body in this array must always be a self-reference to this `body`. \n * \n * The parts are fixed together and therefore perform as a single unified rigid body.\n * \n * Parts in relation to each other are allowed to overlap, as well as form gaps or holes, so can be used to create complex concave bodies unlike when using a single part. \n * \n * Use properties and functions on the parent `body` rather than on parts.\n * \n * Outside of their geometry, most properties on parts are not considered or updated. \n * As such 'per-part' material properties among others are not currently considered.\n * \n * Parts should be created specifically for their parent body. \n * Parts should not be shared or reused between bodies, only one parent is supported. \n * Parts should not have their own parts, they are not handled recursively. \n * Parts should not be added to the world directly or any other composite. \n * Parts own vertices must be convex and in clockwise order. \n * \n * A body with more than one part is sometimes referred to as a 'compound' body. \n * \n * Use `Body.setParts` when setting parts to ensure correct updates of all properties. \n *\n * @readOnly\n * @property parts\n * @type body[]\n */\n\n /**\n * An object reserved for storing plugin-specific properties.\n *\n * @property plugin\n * @type {}\n */\n\n /**\n * _Read only_. Updated by `Body.setParts`.\n * \n * A reference to the body that this is a part of. See `body.parts`.\n * This is a self reference if the body is not a part of another body.\n *\n * @readOnly\n * @property parent\n * @type body\n */\n\n /**\n * A `Number` specifying the angle of the body, in radians.\n *\n * @property angle\n * @type number\n * @default 0\n */\n\n /**\n * _Read only_. Use `Body.setVertices` or `Body.setParts` to set. See also `Bodies.fromVertices`.\n * \n * An array of `Vector` objects that specify the convex hull of the rigid body.\n * These should be provided about the origin `(0, 0)`. E.g.\n *\n * `[{ x: 0, y: 0 }, { x: 25, y: 50 }, { x: 50, y: 0 }]`\n * \n * Vertices must always be convex, in clockwise order and must not contain any duplicate points.\n * \n * Concave vertices should be decomposed into convex `parts`, see `Bodies.fromVertices` and `Body.setParts`.\n *\n * When set the vertices are translated such that `body.position` is at the centre of mass.\n * Many other body properties are automatically calculated from these vertices when set including `density`, `area` and `inertia`.\n * \n * The module `Matter.Vertices` contains useful methods for working with vertices.\n *\n * @readOnly\n * @property vertices\n * @type vector[]\n */\n\n /**\n * _Read only_. Use `Body.setPosition` to set. \n * \n * A `Vector` that specifies the current world-space position of the body.\n * \n * @readOnly\n * @property position\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A `Vector` that accumulates the total force applied to the body for a single update.\n * Force is zeroed after every `Engine.update`, so constant forces should be applied for every update they are needed. See also `Body.applyForce`.\n * \n * @property force\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A `Number` that accumulates the total torque (turning force) applied to the body for a single update. See also `Body.applyForce`.\n * Torque is zeroed after every `Engine.update`, so constant torques should be applied for every update they are needed.\n *\n * Torques result in angular acceleration on every update, which depends on body inertia and the engine update delta.\n * \n * @property torque\n * @type number\n * @default 0\n */\n\n /**\n * _Read only_. Use `Body.setSpeed` to set. \n * \n * See `Body.getSpeed` for details.\n * \n * Equivalent to the magnitude of `body.velocity` (always positive).\n * \n * @readOnly\n * @property speed\n * @type number\n * @default 0\n */\n\n /**\n * _Read only_. Use `Body.setVelocity` to set. \n * \n * See `Body.getVelocity` for details.\n * \n * Equivalent to the magnitude of `body.angularVelocity` (always positive).\n * \n * @readOnly\n * @property velocity\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * _Read only_. Use `Body.setAngularSpeed` to set. \n * \n * See `Body.getAngularSpeed` for details.\n * \n * \n * @readOnly\n * @property angularSpeed\n * @type number\n * @default 0\n */\n\n /**\n * _Read only_. Use `Body.setAngularVelocity` to set. \n * \n * See `Body.getAngularVelocity` for details.\n * \n *\n * @readOnly\n * @property angularVelocity\n * @type number\n * @default 0\n */\n\n /**\n * _Read only_. Use `Body.setStatic` to set. \n * \n * A flag that indicates whether a body is considered static. A static body can never change position or angle and is completely fixed.\n *\n * @readOnly\n * @property isStatic\n * @type boolean\n * @default false\n */\n\n /**\n * A flag that indicates whether a body is a sensor. Sensor triggers collision events, but doesn't react with colliding body physically.\n *\n * @property isSensor\n * @type boolean\n * @default false\n */\n\n /**\n * _Read only_. Use `Sleeping.set` to set. \n * \n * A flag that indicates whether the body is considered sleeping. A sleeping body acts similar to a static body, except it is only temporary and can be awoken.\n *\n * @readOnly\n * @property isSleeping\n * @type boolean\n * @default false\n */\n\n /**\n * _Read only_. Calculated during engine update only when sleeping is enabled.\n * \n * A `Number` that loosely measures the amount of movement a body currently has.\n *\n * Derived from `body.speed^2 + body.angularSpeed^2`. See `Sleeping.update`.\n * \n * @readOnly\n * @property motion\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that defines the length of time during which this body must have near-zero velocity before it is set as sleeping by the `Matter.Sleeping` module (if sleeping is enabled by the engine).\n * \n * @property sleepThreshold\n * @type number\n * @default 60\n */\n\n /**\n * _Read only_. Use `Body.setDensity` to set. \n * \n * A `Number` that defines the density of the body (mass per unit area).\n * \n * Mass will also be updated when set.\n *\n * @readOnly\n * @property density\n * @type number\n * @default 0.001\n */\n\n /**\n * _Read only_. Use `Body.setMass` to set. \n * \n * A `Number` that defines the mass of the body.\n * \n * Density will also be updated when set.\n * \n * @readOnly\n * @property mass\n * @type number\n */\n\n /**\n * _Read only_. Use `Body.setMass` to set. \n * \n * A `Number` that defines the inverse mass of the body (`1 / mass`).\n *\n * @readOnly\n * @property inverseMass\n * @type number\n */\n\n /**\n * _Read only_. Automatically calculated when vertices, mass or density are set or set through `Body.setInertia`.\n * \n * A `Number` that defines the moment of inertia of the body. This is the second moment of area in two dimensions.\n * \n * Can be manually set to `Infinity` to prevent rotation of the body. See `Body.setInertia`.\n * \n * @readOnly\n * @property inertia\n * @type number\n */\n\n /**\n * _Read only_. Automatically calculated when vertices, mass or density are set or calculated by `Body.setInertia`.\n * \n * A `Number` that defines the inverse moment of inertia of the body (`1 / inertia`).\n * \n * @readOnly\n * @property inverseInertia\n * @type number\n */\n\n /**\n * A `Number` that defines the restitution (elasticity) of the body. The value is always positive and is in the range `(0, 1)`.\n * A value of `0` means collisions may be perfectly inelastic and no bouncing may occur. \n * A value of `0.8` means the body may bounce back with approximately 80% of its kinetic energy.\n * Note that collision response is based on _pairs_ of bodies, and that `restitution` values are _combined_ with the following formula:\n *\n * `Math.max(bodyA.restitution, bodyB.restitution)`\n *\n * @property restitution\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that defines the friction of the body. The value is always positive and is in the range `(0, 1)`.\n * A value of `0` means that the body may slide indefinitely.\n * A value of `1` means the body may come to a stop almost instantly after a force is applied.\n *\n * The effects of the value may be non-linear. \n * High values may be unstable depending on the body.\n * The engine uses a Coulomb friction model including static and kinetic friction.\n * Note that collision response is based on _pairs_ of bodies, and that `friction` values are _combined_ with the following formula:\n *\n * `Math.min(bodyA.friction, bodyB.friction)`\n *\n * @property friction\n * @type number\n * @default 0.1\n */\n\n /**\n * A `Number` that defines the static friction of the body (in the Coulomb friction model). \n * A value of `0` means the body will never 'stick' when it is nearly stationary and only dynamic `friction` is used.\n * The higher the value (e.g. `10`), the more force it will take to initially get the body moving when nearly stationary.\n * This value is multiplied with the `friction` property to make it easier to change `friction` and maintain an appropriate amount of static friction.\n *\n * @property frictionStatic\n * @type number\n * @default 0.5\n */\n\n /**\n * A `Number` that defines the air friction of the body (air resistance). \n * A value of `0` means the body will never slow as it moves through space.\n * The higher the value, the faster a body slows when moving through space.\n * The effects of the value are non-linear. \n *\n * @property frictionAir\n * @type number\n * @default 0.01\n */\n\n /**\n * An `Object` that specifies the collision filtering properties of this body.\n *\n * Collisions between two bodies will obey the following rules:\n * - If the two bodies have the same non-zero value of `collisionFilter.group`,\n * they will always collide if the value is positive, and they will never collide\n * if the value is negative.\n * - If the two bodies have different values of `collisionFilter.group` or if one\n * (or both) of the bodies has a value of 0, then the category/mask rules apply as follows:\n *\n * Each body belongs to a collision category, given by `collisionFilter.category`. This\n * value is used as a bit field and the category should have only one bit set, meaning that\n * the value of this property is a power of two in the range [1, 2^31]. Thus, there are 32\n * different collision categories available.\n *\n * Each body also defines a collision bitmask, given by `collisionFilter.mask` which specifies\n * the categories it collides with (the value is the bitwise AND value of all these categories).\n *\n * Using the category/mask rules, two bodies `A` and `B` collide if each includes the other's\n * category in its mask, i.e. `(categoryA & maskB) !== 0` and `(categoryB & maskA) !== 0`\n * are both true.\n *\n * @property collisionFilter\n * @type object\n */\n\n /**\n * An Integer `Number`, that specifies the collision group this body belongs to.\n * See `body.collisionFilter` for more information.\n *\n * @property collisionFilter.group\n * @type object\n * @default 0\n */\n\n /**\n * A bit field that specifies the collision category this body belongs to.\n * The category value should have only one bit set, for example `0x0001`.\n * This means there are up to 32 unique collision categories available.\n * See `body.collisionFilter` for more information.\n *\n * @property collisionFilter.category\n * @type object\n * @default 1\n */\n\n /**\n * A bit mask that specifies the collision categories this body may collide with.\n * See `body.collisionFilter` for more information.\n *\n * @property collisionFilter.mask\n * @type object\n * @default -1\n */\n\n /**\n * A `Number` that specifies a thin boundary around the body where it is allowed to slightly sink into other bodies.\n * \n * This is required for proper collision response, including friction and restitution effects.\n * \n * The default should generally suffice in most cases. You may need to decrease this value for very small bodies that are nearing the default value in scale.\n *\n * @property slop\n * @type number\n * @default 0.05\n */\n\n /**\n * A `Number` that specifies per-body time scaling.\n *\n * @property timeScale\n * @type number\n * @default 1\n */\n\n /**\n * _Read only_. Updated during engine update.\n * \n * A `Number` that records the last delta time value used to update this body.\n * Used to calculate speed and velocity.\n *\n * @readOnly\n * @property deltaTime\n * @type number\n * @default 1000 / 60\n */\n\n /**\n * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.\n *\n * @property render\n * @type object\n */\n\n /**\n * A flag that indicates if the body should be rendered.\n *\n * @property render.visible\n * @type boolean\n * @default true\n */\n\n /**\n * Sets the opacity to use when rendering.\n *\n * @property render.opacity\n * @type number\n * @default 1\n */\n\n /**\n * An `Object` that defines the sprite properties to use when rendering, if any.\n *\n * @property render.sprite\n * @type object\n */\n\n /**\n * An `String` that defines the path to the image to use as the sprite texture, if any.\n *\n * @property render.sprite.texture\n * @type string\n */\n \n /**\n * A `Number` that defines the scaling in the x-axis for the sprite, if any.\n *\n * @property render.sprite.xScale\n * @type number\n * @default 1\n */\n\n /**\n * A `Number` that defines the scaling in the y-axis for the sprite, if any.\n *\n * @property render.sprite.yScale\n * @type number\n * @default 1\n */\n\n /**\n * A `Number` that defines the offset in the x-axis for the sprite (normalised by texture width).\n *\n * @property render.sprite.xOffset\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that defines the offset in the y-axis for the sprite (normalised by texture height).\n *\n * @property render.sprite.yOffset\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that defines the line width to use when rendering the body outline (if a sprite is not defined).\n * A value of `0` means no outline will be rendered.\n *\n * @property render.lineWidth\n * @type number\n * @default 0\n */\n\n /**\n * A `String` that defines the fill style to use when rendering the body (if a sprite is not defined).\n * It is the same as when using a canvas, so it accepts CSS style property values.\n *\n * @property render.fillStyle\n * @type string\n * @default a random colour\n */\n\n /**\n * A `String` that defines the stroke style to use when rendering the body outline (if a sprite is not defined).\n * It is the same as when using a canvas, so it accepts CSS style property values.\n *\n * @property render.strokeStyle\n * @type string\n * @default a random colour\n */\n\n /**\n * _Read only_. Calculated automatically when vertices are set.\n * \n * An array of unique axis vectors (edge normals) used for collision detection.\n * These are automatically calculated when vertices are set.\n * They are constantly updated by `Body.update` during the simulation.\n *\n * @readOnly\n * @property axes\n * @type vector[]\n */\n \n /**\n * _Read only_. Calculated automatically when vertices are set.\n * \n * A `Number` that measures the area of the body's convex hull.\n * \n * @readOnly\n * @property area\n * @type string\n * @default \n */\n\n /**\n * A `Bounds` object that defines the AABB region for the body.\n * It is automatically calculated when vertices are set and constantly updated by `Body.update` during simulation.\n * \n * @property bounds\n * @type bounds\n */\n\n /**\n * Temporarily may hold parameters to be passed to `Vertices.chamfer` where supported by external functions.\n * \n * See `Vertices.chamfer` for possible parameters this object may hold.\n * \n * Currently only functions inside `Matter.Bodies` provide a utility using this property as a vertices pre-processing option.\n * \n * Alternatively consider using `Vertices.chamfer` directly on vertices before passing them to a body creation function.\n * \n * @property chamfer\n * @type object|null|undefined\n */\n\n})();\n\n\n/***/ }),\n/* 5 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Events` module contains methods to fire and listen to events on other objects.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Events\n*/\n\nvar Events = {};\n\nmodule.exports = Events;\n\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Subscribes a callback function to the given object's `eventName`.\n * @method on\n * @param {} object\n * @param {string} eventNames\n * @param {function} callback\n */\n Events.on = function(object, eventNames, callback) {\n var names = eventNames.split(' '),\n name;\n\n for (var i = 0; i < names.length; i++) {\n name = names[i];\n object.events = object.events || {};\n object.events[name] = object.events[name] || [];\n object.events[name].push(callback);\n }\n\n return callback;\n };\n\n /**\n * Removes the given event callback. If no callback, clears all callbacks in `eventNames`. If no `eventNames`, clears all events.\n * @method off\n * @param {} object\n * @param {string} eventNames\n * @param {function} callback\n */\n Events.off = function(object, eventNames, callback) {\n if (!eventNames) {\n object.events = {};\n return;\n }\n\n // handle Events.off(object, callback)\n if (typeof eventNames === 'function') {\n callback = eventNames;\n eventNames = Common.keys(object.events).join(' ');\n }\n\n var names = eventNames.split(' ');\n\n for (var i = 0; i < names.length; i++) {\n var callbacks = object.events[names[i]],\n newCallbacks = [];\n\n if (callback && callbacks) {\n for (var j = 0; j < callbacks.length; j++) {\n if (callbacks[j] !== callback)\n newCallbacks.push(callbacks[j]);\n }\n }\n\n object.events[names[i]] = newCallbacks;\n }\n };\n\n /**\n * Fires all the callbacks subscribed to the given object's `eventName`, in the order they subscribed, if any.\n * @method trigger\n * @param {} object\n * @param {string} eventNames\n * @param {} event\n */\n Events.trigger = function(object, eventNames, event) {\n var names,\n name,\n callbacks,\n eventClone;\n\n var events = object.events;\n \n if (events && Common.keys(events).length > 0) {\n if (!event)\n event = {};\n\n names = eventNames.split(' ');\n\n for (var i = 0; i < names.length; i++) {\n name = names[i];\n callbacks = events[name];\n\n if (callbacks) {\n eventClone = Common.clone(event, false);\n eventClone.name = name;\n eventClone.source = object;\n\n for (var j = 0; j < callbacks.length; j++) {\n callbacks[j].apply(object, [eventClone]);\n }\n }\n }\n }\n };\n\n})();\n\n\n/***/ }),\n/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* A composite is a collection of `Matter.Body`, `Matter.Constraint` and other `Matter.Composite` objects.\n*\n* They are a container that can represent complex objects made of multiple parts, even if they are not physically connected.\n* A composite could contain anything from a single body all the way up to a whole world.\n* \n* When making any changes to composites, use the included functions rather than changing their properties directly.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Composite\n*/\n\nvar Composite = {};\n\nmodule.exports = Composite;\n\nvar Events = __webpack_require__(5);\nvar Common = __webpack_require__(0);\nvar Bounds = __webpack_require__(1);\nvar Body = __webpack_require__(4);\n\n(function() {\n\n /**\n * Creates a new composite. The options parameter is an object that specifies any properties you wish to override the defaults.\n * See the properites section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {} [options]\n * @return {composite} A new composite\n */\n Composite.create = function(options) {\n return Common.extend({ \n id: Common.nextId(),\n type: 'composite',\n parent: null,\n isModified: false,\n bodies: [], \n constraints: [], \n composites: [],\n label: 'Composite',\n plugin: {},\n cache: {\n allBodies: null,\n allConstraints: null,\n allComposites: null\n }\n }, options);\n };\n\n /**\n * Sets the composite's `isModified` flag. \n * If `updateParents` is true, all parents will be set (default: false).\n * If `updateChildren` is true, all children will be set (default: false).\n * @private\n * @method setModified\n * @param {composite} composite\n * @param {boolean} isModified\n * @param {boolean} [updateParents=false]\n * @param {boolean} [updateChildren=false]\n */\n Composite.setModified = function(composite, isModified, updateParents, updateChildren) {\n composite.isModified = isModified;\n\n if (isModified && composite.cache) {\n composite.cache.allBodies = null;\n composite.cache.allConstraints = null;\n composite.cache.allComposites = null;\n }\n\n if (updateParents && composite.parent) {\n Composite.setModified(composite.parent, isModified, updateParents, updateChildren);\n }\n\n if (updateChildren) {\n for (var i = 0; i < composite.composites.length; i++) {\n var childComposite = composite.composites[i];\n Composite.setModified(childComposite, isModified, updateParents, updateChildren);\n }\n }\n };\n\n /**\n * Generic single or multi-add function. Adds a single or an array of body(s), constraint(s) or composite(s) to the given composite.\n * Triggers `beforeAdd` and `afterAdd` events on the `composite`.\n * @method add\n * @param {composite} composite\n * @param {object|array} object A single or an array of body(s), constraint(s) or composite(s)\n * @return {composite} The original composite with the objects added\n */\n Composite.add = function(composite, object) {\n var objects = [].concat(object);\n\n Events.trigger(composite, 'beforeAdd', { object: object });\n\n for (var i = 0; i < objects.length; i++) {\n var obj = objects[i];\n\n switch (obj.type) {\n\n case 'body':\n // skip adding compound parts\n if (obj.parent !== obj) {\n Common.warn('Composite.add: skipped adding a compound body part (you must add its parent instead)');\n break;\n }\n\n Composite.addBody(composite, obj);\n break;\n case 'constraint':\n Composite.addConstraint(composite, obj);\n break;\n case 'composite':\n Composite.addComposite(composite, obj);\n break;\n case 'mouseConstraint':\n Composite.addConstraint(composite, obj.constraint);\n break;\n\n }\n }\n\n Events.trigger(composite, 'afterAdd', { object: object });\n\n return composite;\n };\n\n /**\n * Generic remove function. Removes one or many body(s), constraint(s) or a composite(s) to the given composite.\n * Optionally searching its children recursively.\n * Triggers `beforeRemove` and `afterRemove` events on the `composite`.\n * @method remove\n * @param {composite} composite\n * @param {object|array} object\n * @param {boolean} [deep=false]\n * @return {composite} The original composite with the objects removed\n */\n Composite.remove = function(composite, object, deep) {\n var objects = [].concat(object);\n\n Events.trigger(composite, 'beforeRemove', { object: object });\n\n for (var i = 0; i < objects.length; i++) {\n var obj = objects[i];\n\n switch (obj.type) {\n\n case 'body':\n Composite.removeBody(composite, obj, deep);\n break;\n case 'constraint':\n Composite.removeConstraint(composite, obj, deep);\n break;\n case 'composite':\n Composite.removeComposite(composite, obj, deep);\n break;\n case 'mouseConstraint':\n Composite.removeConstraint(composite, obj.constraint);\n break;\n\n }\n }\n\n Events.trigger(composite, 'afterRemove', { object: object });\n\n return composite;\n };\n\n /**\n * Adds a composite to the given composite.\n * @private\n * @method addComposite\n * @param {composite} compositeA\n * @param {composite} compositeB\n * @return {composite} The original compositeA with the objects from compositeB added\n */\n Composite.addComposite = function(compositeA, compositeB) {\n compositeA.composites.push(compositeB);\n compositeB.parent = compositeA;\n Composite.setModified(compositeA, true, true, false);\n return compositeA;\n };\n\n /**\n * Removes a composite from the given composite, and optionally searching its children recursively.\n * @private\n * @method removeComposite\n * @param {composite} compositeA\n * @param {composite} compositeB\n * @param {boolean} [deep=false]\n * @return {composite} The original compositeA with the composite removed\n */\n Composite.removeComposite = function(compositeA, compositeB, deep) {\n var position = Common.indexOf(compositeA.composites, compositeB);\n\n if (position !== -1) {\n var bodies = Composite.allBodies(compositeB);\n\n Composite.removeCompositeAt(compositeA, position);\n\n for (var i = 0; i < bodies.length; i++) {\n bodies[i].sleepCounter = 0;\n }\n }\n\n if (deep) {\n for (var i = 0; i < compositeA.composites.length; i++){\n Composite.removeComposite(compositeA.composites[i], compositeB, true);\n }\n }\n\n return compositeA;\n };\n\n /**\n * Removes a composite from the given composite.\n * @private\n * @method removeCompositeAt\n * @param {composite} composite\n * @param {number} position\n * @return {composite} The original composite with the composite removed\n */\n Composite.removeCompositeAt = function(composite, position) {\n composite.composites.splice(position, 1);\n Composite.setModified(composite, true, true, false);\n return composite;\n };\n\n /**\n * Adds a body to the given composite.\n * @private\n * @method addBody\n * @param {composite} composite\n * @param {body} body\n * @return {composite} The original composite with the body added\n */\n Composite.addBody = function(composite, body) {\n composite.bodies.push(body);\n Composite.setModified(composite, true, true, false);\n return composite;\n };\n\n /**\n * Removes a body from the given composite, and optionally searching its children recursively.\n * @private\n * @method removeBody\n * @param {composite} composite\n * @param {body} body\n * @param {boolean} [deep=false]\n * @return {composite} The original composite with the body removed\n */\n Composite.removeBody = function(composite, body, deep) {\n var position = Common.indexOf(composite.bodies, body);\n\n if (position !== -1) {\n Composite.removeBodyAt(composite, position);\n body.sleepCounter = 0;\n }\n\n if (deep) {\n for (var i = 0; i < composite.composites.length; i++){\n Composite.removeBody(composite.composites[i], body, true);\n }\n }\n\n return composite;\n };\n\n /**\n * Removes a body from the given composite.\n * @private\n * @method removeBodyAt\n * @param {composite} composite\n * @param {number} position\n * @return {composite} The original composite with the body removed\n */\n Composite.removeBodyAt = function(composite, position) {\n composite.bodies.splice(position, 1);\n Composite.setModified(composite, true, true, false);\n return composite;\n };\n\n /**\n * Adds a constraint to the given composite.\n * @private\n * @method addConstraint\n * @param {composite} composite\n * @param {constraint} constraint\n * @return {composite} The original composite with the constraint added\n */\n Composite.addConstraint = function(composite, constraint) {\n composite.constraints.push(constraint);\n Composite.setModified(composite, true, true, false);\n return composite;\n };\n\n /**\n * Removes a constraint from the given composite, and optionally searching its children recursively.\n * @private\n * @method removeConstraint\n * @param {composite} composite\n * @param {constraint} constraint\n * @param {boolean} [deep=false]\n * @return {composite} The original composite with the constraint removed\n */\n Composite.removeConstraint = function(composite, constraint, deep) {\n var position = Common.indexOf(composite.constraints, constraint);\n \n if (position !== -1) {\n Composite.removeConstraintAt(composite, position);\n }\n\n if (deep) {\n for (var i = 0; i < composite.composites.length; i++){\n Composite.removeConstraint(composite.composites[i], constraint, true);\n }\n }\n\n return composite;\n };\n\n /**\n * Removes a body from the given composite.\n * @private\n * @method removeConstraintAt\n * @param {composite} composite\n * @param {number} position\n * @return {composite} The original composite with the constraint removed\n */\n Composite.removeConstraintAt = function(composite, position) {\n composite.constraints.splice(position, 1);\n Composite.setModified(composite, true, true, false);\n return composite;\n };\n\n /**\n * Removes all bodies, constraints and composites from the given composite.\n * Optionally clearing its children recursively.\n * @method clear\n * @param {composite} composite\n * @param {boolean} keepStatic\n * @param {boolean} [deep=false]\n */\n Composite.clear = function(composite, keepStatic, deep) {\n if (deep) {\n for (var i = 0; i < composite.composites.length; i++){\n Composite.clear(composite.composites[i], keepStatic, true);\n }\n }\n \n if (keepStatic) {\n composite.bodies = composite.bodies.filter(function(body) { return body.isStatic; });\n } else {\n composite.bodies.length = 0;\n }\n\n composite.constraints.length = 0;\n composite.composites.length = 0;\n\n Composite.setModified(composite, true, true, false);\n\n return composite;\n };\n\n /**\n * Returns all bodies in the given composite, including all bodies in its children, recursively.\n * @method allBodies\n * @param {composite} composite\n * @return {body[]} All the bodies\n */\n Composite.allBodies = function(composite) {\n if (composite.cache && composite.cache.allBodies) {\n return composite.cache.allBodies;\n }\n\n var bodies = [].concat(composite.bodies);\n\n for (var i = 0; i < composite.composites.length; i++)\n bodies = bodies.concat(Composite.allBodies(composite.composites[i]));\n\n if (composite.cache) {\n composite.cache.allBodies = bodies;\n }\n\n return bodies;\n };\n\n /**\n * Returns all constraints in the given composite, including all constraints in its children, recursively.\n * @method allConstraints\n * @param {composite} composite\n * @return {constraint[]} All the constraints\n */\n Composite.allConstraints = function(composite) {\n if (composite.cache && composite.cache.allConstraints) {\n return composite.cache.allConstraints;\n }\n\n var constraints = [].concat(composite.constraints);\n\n for (var i = 0; i < composite.composites.length; i++)\n constraints = constraints.concat(Composite.allConstraints(composite.composites[i]));\n\n if (composite.cache) {\n composite.cache.allConstraints = constraints;\n }\n\n return constraints;\n };\n\n /**\n * Returns all composites in the given composite, including all composites in its children, recursively.\n * @method allComposites\n * @param {composite} composite\n * @return {composite[]} All the composites\n */\n Composite.allComposites = function(composite) {\n if (composite.cache && composite.cache.allComposites) {\n return composite.cache.allComposites;\n }\n\n var composites = [].concat(composite.composites);\n\n for (var i = 0; i < composite.composites.length; i++)\n composites = composites.concat(Composite.allComposites(composite.composites[i]));\n\n if (composite.cache) {\n composite.cache.allComposites = composites;\n }\n\n return composites;\n };\n\n /**\n * Searches the composite recursively for an object matching the type and id supplied, null if not found.\n * @method get\n * @param {composite} composite\n * @param {number} id\n * @param {string} type\n * @return {object} The requested object, if found\n */\n Composite.get = function(composite, id, type) {\n var objects,\n object;\n\n switch (type) {\n case 'body':\n objects = Composite.allBodies(composite);\n break;\n case 'constraint':\n objects = Composite.allConstraints(composite);\n break;\n case 'composite':\n objects = Composite.allComposites(composite).concat(composite);\n break;\n }\n\n if (!objects)\n return null;\n\n object = objects.filter(function(object) { \n return object.id.toString() === id.toString(); \n });\n\n return object.length === 0 ? null : object[0];\n };\n\n /**\n * Moves the given object(s) from compositeA to compositeB (equal to a remove followed by an add).\n * @method move\n * @param {compositeA} compositeA\n * @param {object[]} objects\n * @param {compositeB} compositeB\n * @return {composite} Returns compositeA\n */\n Composite.move = function(compositeA, objects, compositeB) {\n Composite.remove(compositeA, objects);\n Composite.add(compositeB, objects);\n return compositeA;\n };\n\n /**\n * Assigns new ids for all objects in the composite, recursively.\n * @method rebase\n * @param {composite} composite\n * @return {composite} Returns composite\n */\n Composite.rebase = function(composite) {\n var objects = Composite.allBodies(composite)\n .concat(Composite.allConstraints(composite))\n .concat(Composite.allComposites(composite));\n\n for (var i = 0; i < objects.length; i++) {\n objects[i].id = Common.nextId();\n }\n\n return composite;\n };\n\n /**\n * Translates all children in the composite by a given vector relative to their current positions, \n * without imparting any velocity.\n * @method translate\n * @param {composite} composite\n * @param {vector} translation\n * @param {bool} [recursive=true]\n */\n Composite.translate = function(composite, translation, recursive) {\n var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;\n\n for (var i = 0; i < bodies.length; i++) {\n Body.translate(bodies[i], translation);\n }\n\n return composite;\n };\n\n /**\n * Rotates all children in the composite by a given angle about the given point, without imparting any angular velocity.\n * @method rotate\n * @param {composite} composite\n * @param {number} rotation\n * @param {vector} point\n * @param {bool} [recursive=true]\n */\n Composite.rotate = function(composite, rotation, point, recursive) {\n var cos = Math.cos(rotation),\n sin = Math.sin(rotation),\n bodies = recursive ? Composite.allBodies(composite) : composite.bodies;\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n dx = body.position.x - point.x,\n dy = body.position.y - point.y;\n \n Body.setPosition(body, {\n x: point.x + (dx * cos - dy * sin),\n y: point.y + (dx * sin + dy * cos)\n });\n\n Body.rotate(body, rotation);\n }\n\n return composite;\n };\n\n /**\n * Scales all children in the composite, including updating physical properties (mass, area, axes, inertia), from a world-space point.\n * @method scale\n * @param {composite} composite\n * @param {number} scaleX\n * @param {number} scaleY\n * @param {vector} point\n * @param {bool} [recursive=true]\n */\n Composite.scale = function(composite, scaleX, scaleY, point, recursive) {\n var bodies = recursive ? Composite.allBodies(composite) : composite.bodies;\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n dx = body.position.x - point.x,\n dy = body.position.y - point.y;\n \n Body.setPosition(body, {\n x: point.x + dx * scaleX,\n y: point.y + dy * scaleY\n });\n\n Body.scale(body, scaleX, scaleY);\n }\n\n return composite;\n };\n\n /**\n * Returns the union of the bounds of all of the composite's bodies.\n * @method bounds\n * @param {composite} composite The composite.\n * @returns {bounds} The composite bounds.\n */\n Composite.bounds = function(composite) {\n var bodies = Composite.allBodies(composite),\n vertices = [];\n\n for (var i = 0; i < bodies.length; i += 1) {\n var body = bodies[i];\n vertices.push(body.bounds.min, body.bounds.max);\n }\n\n return Bounds.create(vertices);\n };\n\n /*\n *\n * Events Documentation\n *\n */\n\n /**\n * Fired when a call to `Composite.add` is made, before objects have been added.\n *\n * @event beforeAdd\n * @param {} event An event object\n * @param {} event.object The object(s) to be added (may be a single body, constraint, composite or a mixed array of these)\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when a call to `Composite.add` is made, after objects have been added.\n *\n * @event afterAdd\n * @param {} event An event object\n * @param {} event.object The object(s) that have been added (may be a single body, constraint, composite or a mixed array of these)\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when a call to `Composite.remove` is made, before objects have been removed.\n *\n * @event beforeRemove\n * @param {} event An event object\n * @param {} event.object The object(s) to be removed (may be a single body, constraint, composite or a mixed array of these)\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when a call to `Composite.remove` is made, after objects have been removed.\n *\n * @event afterRemove\n * @param {} event An event object\n * @param {} event.object The object(s) that have been removed (may be a single body, constraint, composite or a mixed array of these)\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.\n *\n * @property id\n * @type number\n */\n\n /**\n * A `String` denoting the type of object.\n *\n * @property type\n * @type string\n * @default \"composite\"\n * @readOnly\n */\n\n /**\n * An arbitrary `String` name to help the user identify and manage composites.\n *\n * @property label\n * @type string\n * @default \"Composite\"\n */\n\n /**\n * A flag that specifies whether the composite has been modified during the current step.\n * This is automatically managed when bodies, constraints or composites are added or removed.\n *\n * @property isModified\n * @type boolean\n * @default false\n */\n\n /**\n * The `Composite` that is the parent of this composite. It is automatically managed by the `Matter.Composite` methods.\n *\n * @property parent\n * @type composite\n * @default null\n */\n\n /**\n * An array of `Body` that are _direct_ children of this composite.\n * To add or remove bodies you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.\n * If you wish to recursively find all descendants, you should use the `Composite.allBodies` method.\n *\n * @property bodies\n * @type body[]\n * @default []\n */\n\n /**\n * An array of `Constraint` that are _direct_ children of this composite.\n * To add or remove constraints you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.\n * If you wish to recursively find all descendants, you should use the `Composite.allConstraints` method.\n *\n * @property constraints\n * @type constraint[]\n * @default []\n */\n\n /**\n * An array of `Composite` that are _direct_ children of this composite.\n * To add or remove composites you should use `Composite.add` and `Composite.remove` methods rather than directly modifying this property.\n * If you wish to recursively find all descendants, you should use the `Composite.allComposites` method.\n *\n * @property composites\n * @type composite[]\n * @default []\n */\n\n /**\n * An object reserved for storing plugin-specific properties.\n *\n * @property plugin\n * @type {}\n */\n\n /**\n * An object used for storing cached results for performance reasons.\n * This is used internally only and is automatically managed.\n *\n * @private\n * @property cache\n * @type {}\n */\n\n})();\n\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Sleeping` module contains methods to manage the sleeping state of bodies.\n*\n* @class Sleeping\n*/\n\nvar Sleeping = {};\n\nmodule.exports = Sleeping;\n\nvar Body = __webpack_require__(4);\nvar Events = __webpack_require__(5);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n Sleeping._motionWakeThreshold = 0.18;\n Sleeping._motionSleepThreshold = 0.08;\n Sleeping._minBias = 0.9;\n\n /**\n * Puts bodies to sleep or wakes them up depending on their motion.\n * @method update\n * @param {body[]} bodies\n * @param {number} delta\n */\n Sleeping.update = function(bodies, delta) {\n var timeScale = delta / Common._baseDelta,\n motionSleepThreshold = Sleeping._motionSleepThreshold;\n \n // update bodies sleeping status\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n speed = Body.getSpeed(body),\n angularSpeed = Body.getAngularSpeed(body),\n motion = speed * speed + angularSpeed * angularSpeed;\n\n // wake up bodies if they have a force applied\n if (body.force.x !== 0 || body.force.y !== 0) {\n Sleeping.set(body, false);\n continue;\n }\n\n var minMotion = Math.min(body.motion, motion),\n maxMotion = Math.max(body.motion, motion);\n \n // biased average motion estimation between frames\n body.motion = Sleeping._minBias * minMotion + (1 - Sleeping._minBias) * maxMotion;\n\n if (body.sleepThreshold > 0 && body.motion < motionSleepThreshold) {\n body.sleepCounter += 1;\n \n if (body.sleepCounter >= body.sleepThreshold / timeScale) {\n Sleeping.set(body, true);\n }\n } else if (body.sleepCounter > 0) {\n body.sleepCounter -= 1;\n }\n }\n };\n\n /**\n * Given a set of colliding pairs, wakes the sleeping bodies involved.\n * @method afterCollisions\n * @param {pair[]} pairs\n */\n Sleeping.afterCollisions = function(pairs) {\n var motionSleepThreshold = Sleeping._motionSleepThreshold;\n\n // wake up bodies involved in collisions\n for (var i = 0; i < pairs.length; i++) {\n var pair = pairs[i];\n \n // don't wake inactive pairs\n if (!pair.isActive)\n continue;\n\n var collision = pair.collision,\n bodyA = collision.bodyA.parent, \n bodyB = collision.bodyB.parent;\n \n // don't wake if at least one body is static\n if ((bodyA.isSleeping && bodyB.isSleeping) || bodyA.isStatic || bodyB.isStatic)\n continue;\n \n if (bodyA.isSleeping || bodyB.isSleeping) {\n var sleepingBody = (bodyA.isSleeping && !bodyA.isStatic) ? bodyA : bodyB,\n movingBody = sleepingBody === bodyA ? bodyB : bodyA;\n\n if (!sleepingBody.isStatic && movingBody.motion > motionSleepThreshold) {\n Sleeping.set(sleepingBody, false);\n }\n }\n }\n };\n \n /**\n * Set a body as sleeping or awake.\n * @method set\n * @param {body} body\n * @param {boolean} isSleeping\n */\n Sleeping.set = function(body, isSleeping) {\n var wasSleeping = body.isSleeping;\n\n if (isSleeping) {\n body.isSleeping = true;\n body.sleepCounter = body.sleepThreshold;\n\n body.positionImpulse.x = 0;\n body.positionImpulse.y = 0;\n\n body.positionPrev.x = body.position.x;\n body.positionPrev.y = body.position.y;\n\n body.anglePrev = body.angle;\n body.speed = 0;\n body.angularSpeed = 0;\n body.motion = 0;\n\n if (!wasSleeping) {\n Events.trigger(body, 'sleepStart');\n }\n } else {\n body.isSleeping = false;\n body.sleepCounter = 0;\n\n if (wasSleeping) {\n Events.trigger(body, 'sleepEnd');\n }\n }\n };\n\n})();\n\n\n/***/ }),\n/* 8 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Collision` module contains methods for detecting collisions between a given pair of bodies.\n*\n* For efficient detection between a list of bodies, see `Matter.Detector` and `Matter.Query`.\n*\n* See `Matter.Engine` for collision events.\n*\n* @class Collision\n*/\n\nvar Collision = {};\n\nmodule.exports = Collision;\n\nvar Vertices = __webpack_require__(3);\nvar Pair = __webpack_require__(9);\n\n(function() {\n var _supports = [];\n\n var _overlapAB = {\n overlap: 0,\n axis: null\n };\n\n var _overlapBA = {\n overlap: 0,\n axis: null\n };\n\n /**\n * Creates a new collision record.\n * @method create\n * @param {body} bodyA The first body part represented by the collision record\n * @param {body} bodyB The second body part represented by the collision record\n * @return {collision} A new collision record\n */\n Collision.create = function(bodyA, bodyB) {\n return { \n pair: null,\n collided: false,\n bodyA: bodyA,\n bodyB: bodyB,\n parentA: bodyA.parent,\n parentB: bodyB.parent,\n depth: 0,\n normal: { x: 0, y: 0 },\n tangent: { x: 0, y: 0 },\n penetration: { x: 0, y: 0 },\n supports: [null, null],\n supportCount: 0\n };\n };\n\n /**\n * Detect collision between two bodies.\n * @method collides\n * @param {body} bodyA\n * @param {body} bodyB\n * @param {pairs} [pairs] Optionally reuse collision records from existing pairs.\n * @return {collision|null} A collision record if detected, otherwise null\n */\n Collision.collides = function(bodyA, bodyB, pairs) {\n Collision._overlapAxes(_overlapAB, bodyA.vertices, bodyB.vertices, bodyA.axes);\n\n if (_overlapAB.overlap <= 0) {\n return null;\n }\n\n Collision._overlapAxes(_overlapBA, bodyB.vertices, bodyA.vertices, bodyB.axes);\n\n if (_overlapBA.overlap <= 0) {\n return null;\n }\n\n // reuse collision records for gc efficiency\n var pair = pairs && pairs.table[Pair.id(bodyA, bodyB)],\n collision;\n\n if (!pair) {\n collision = Collision.create(bodyA, bodyB);\n collision.collided = true;\n collision.bodyA = bodyA.id < bodyB.id ? bodyA : bodyB;\n collision.bodyB = bodyA.id < bodyB.id ? bodyB : bodyA;\n collision.parentA = collision.bodyA.parent;\n collision.parentB = collision.bodyB.parent;\n } else {\n collision = pair.collision;\n }\n\n bodyA = collision.bodyA;\n bodyB = collision.bodyB;\n\n var minOverlap;\n\n if (_overlapAB.overlap < _overlapBA.overlap) {\n minOverlap = _overlapAB;\n } else {\n minOverlap = _overlapBA;\n }\n\n var normal = collision.normal,\n tangent = collision.tangent,\n penetration = collision.penetration,\n supports = collision.supports,\n depth = minOverlap.overlap,\n minAxis = minOverlap.axis,\n normalX = minAxis.x,\n normalY = minAxis.y,\n deltaX = bodyB.position.x - bodyA.position.x,\n deltaY = bodyB.position.y - bodyA.position.y;\n\n // ensure normal is facing away from bodyA\n if (normalX * deltaX + normalY * deltaY >= 0) {\n normalX = -normalX;\n normalY = -normalY;\n }\n\n normal.x = normalX;\n normal.y = normalY;\n \n tangent.x = -normalY;\n tangent.y = normalX;\n\n penetration.x = normalX * depth;\n penetration.y = normalY * depth;\n\n collision.depth = depth;\n\n // find support points, there is always either exactly one or two\n var supportsB = Collision._findSupports(bodyA, bodyB, normal, 1),\n supportCount = 0;\n\n // find the supports from bodyB that are inside bodyA\n if (Vertices.contains(bodyA.vertices, supportsB[0])) {\n supports[supportCount++] = supportsB[0];\n }\n\n if (Vertices.contains(bodyA.vertices, supportsB[1])) {\n supports[supportCount++] = supportsB[1];\n }\n\n // find the supports from bodyA that are inside bodyB\n if (supportCount < 2) {\n var supportsA = Collision._findSupports(bodyB, bodyA, normal, -1);\n\n if (Vertices.contains(bodyB.vertices, supportsA[0])) {\n supports[supportCount++] = supportsA[0];\n }\n\n if (supportCount < 2 && Vertices.contains(bodyB.vertices, supportsA[1])) {\n supports[supportCount++] = supportsA[1];\n }\n }\n\n // account for the edge case of overlapping but no vertex containment\n if (supportCount === 0) {\n supports[supportCount++] = supportsB[0];\n }\n\n // update support count\n collision.supportCount = supportCount;\n\n return collision;\n };\n\n /**\n * Find the overlap between two sets of vertices.\n * @method _overlapAxes\n * @private\n * @param {object} result\n * @param {vertices} verticesA\n * @param {vertices} verticesB\n * @param {axes} axes\n */\n Collision._overlapAxes = function(result, verticesA, verticesB, axes) {\n var verticesALength = verticesA.length,\n verticesBLength = verticesB.length,\n verticesAX = verticesA[0].x,\n verticesAY = verticesA[0].y,\n verticesBX = verticesB[0].x,\n verticesBY = verticesB[0].y,\n axesLength = axes.length,\n overlapMin = Number.MAX_VALUE,\n overlapAxisNumber = 0,\n overlap,\n overlapAB,\n overlapBA,\n dot,\n i,\n j;\n\n for (i = 0; i < axesLength; i++) {\n var axis = axes[i],\n axisX = axis.x,\n axisY = axis.y,\n minA = verticesAX * axisX + verticesAY * axisY,\n minB = verticesBX * axisX + verticesBY * axisY,\n maxA = minA,\n maxB = minB;\n \n for (j = 1; j < verticesALength; j += 1) {\n dot = verticesA[j].x * axisX + verticesA[j].y * axisY;\n\n if (dot > maxA) { \n maxA = dot;\n } else if (dot < minA) { \n minA = dot;\n }\n }\n\n for (j = 1; j < verticesBLength; j += 1) {\n dot = verticesB[j].x * axisX + verticesB[j].y * axisY;\n\n if (dot > maxB) { \n maxB = dot;\n } else if (dot < minB) { \n minB = dot;\n }\n }\n\n overlapAB = maxA - minB;\n overlapBA = maxB - minA;\n overlap = overlapAB < overlapBA ? overlapAB : overlapBA;\n\n if (overlap < overlapMin) {\n overlapMin = overlap;\n overlapAxisNumber = i;\n\n if (overlap <= 0) {\n // can not be intersecting\n break;\n }\n } \n }\n\n result.axis = axes[overlapAxisNumber];\n result.overlap = overlapMin;\n };\n\n /**\n * Finds supporting vertices given two bodies along a given direction using hill-climbing.\n * @method _findSupports\n * @private\n * @param {body} bodyA\n * @param {body} bodyB\n * @param {vector} normal\n * @param {number} direction\n * @return [vector]\n */\n Collision._findSupports = function(bodyA, bodyB, normal, direction) {\n var vertices = bodyB.vertices,\n verticesLength = vertices.length,\n bodyAPositionX = bodyA.position.x,\n bodyAPositionY = bodyA.position.y,\n normalX = normal.x * direction,\n normalY = normal.y * direction,\n vertexA = vertices[0],\n vertexB = vertexA,\n nearestDistance = normalX * (bodyAPositionX - vertexB.x) + normalY * (bodyAPositionY - vertexB.y),\n vertexC,\n distance,\n j;\n\n // find deepest vertex relative to the axis\n for (j = 1; j < verticesLength; j += 1) {\n vertexB = vertices[j];\n distance = normalX * (bodyAPositionX - vertexB.x) + normalY * (bodyAPositionY - vertexB.y);\n\n // convex hill-climbing\n if (distance < nearestDistance) {\n nearestDistance = distance;\n vertexA = vertexB;\n }\n }\n\n // measure next vertex\n vertexC = vertices[(verticesLength + vertexA.index - 1) % verticesLength];\n nearestDistance = normalX * (bodyAPositionX - vertexC.x) + normalY * (bodyAPositionY - vertexC.y);\n\n // compare with previous vertex\n vertexB = vertices[(vertexA.index + 1) % verticesLength];\n if (normalX * (bodyAPositionX - vertexB.x) + normalY * (bodyAPositionY - vertexB.y) < nearestDistance) {\n _supports[0] = vertexA;\n _supports[1] = vertexB;\n\n return _supports;\n }\n\n _supports[0] = vertexA;\n _supports[1] = vertexC;\n\n return _supports;\n };\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * A reference to the pair using this collision record, if there is one.\n *\n * @property pair\n * @type {pair|null}\n * @default null\n */\n\n /**\n * A flag that indicates if the bodies were colliding when the collision was last updated.\n * \n * @property collided\n * @type boolean\n * @default false\n */\n\n /**\n * The first body part represented by the collision (see also `collision.parentA`).\n * \n * @property bodyA\n * @type body\n */\n\n /**\n * The second body part represented by the collision (see also `collision.parentB`).\n * \n * @property bodyB\n * @type body\n */\n\n /**\n * The first body represented by the collision (i.e. `collision.bodyA.parent`).\n * \n * @property parentA\n * @type body\n */\n\n /**\n * The second body represented by the collision (i.e. `collision.bodyB.parent`).\n * \n * @property parentB\n * @type body\n */\n\n /**\n * A `Number` that represents the minimum separating distance between the bodies along the collision normal.\n *\n * @readOnly\n * @property depth\n * @type number\n * @default 0\n */\n\n /**\n * A normalised `Vector` that represents the direction between the bodies that provides the minimum separating distance.\n *\n * @property normal\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A normalised `Vector` that is the tangent direction to the collision normal.\n *\n * @property tangent\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A `Vector` that represents the direction and depth of the collision.\n *\n * @property penetration\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * An array of body vertices that represent the support points in the collision.\n * \n * _Note:_ Only the first `collision.supportCount` items of `collision.supports` are active.\n * Therefore use `collision.supportCount` instead of `collision.supports.length` when iterating the active supports.\n * \n * These are the deepest vertices (along the collision normal) of each body that are contained by the other body's vertices.\n *\n * @property supports\n * @type vector[]\n * @default []\n */\n\n /**\n * The number of active supports for this collision found in `collision.supports`.\n * \n * _Note:_ Only the first `collision.supportCount` items of `collision.supports` are active.\n * Therefore use `collision.supportCount` instead of `collision.supports.length` when iterating the active supports.\n *\n * @property supportCount\n * @type number\n * @default 0\n */\n\n})();\n\n\n/***/ }),\n/* 9 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Pair` module contains methods for creating and manipulating collision pairs.\n*\n* @class Pair\n*/\n\nvar Pair = {};\n\nmodule.exports = Pair;\n\nvar Contact = __webpack_require__(16);\n\n(function() {\n \n /**\n * Creates a pair.\n * @method create\n * @param {collision} collision\n * @param {number} timestamp\n * @return {pair} A new pair\n */\n Pair.create = function(collision, timestamp) {\n var bodyA = collision.bodyA,\n bodyB = collision.bodyB;\n\n var pair = {\n id: Pair.id(bodyA, bodyB),\n bodyA: bodyA,\n bodyB: bodyB,\n collision: collision,\n contacts: [Contact.create(), Contact.create()],\n contactCount: 0,\n separation: 0,\n isActive: true,\n isSensor: bodyA.isSensor || bodyB.isSensor,\n timeCreated: timestamp,\n timeUpdated: timestamp,\n inverseMass: 0,\n friction: 0,\n frictionStatic: 0,\n restitution: 0,\n slop: 0\n };\n\n Pair.update(pair, collision, timestamp);\n\n return pair;\n };\n\n /**\n * Updates a pair given a collision.\n * @method update\n * @param {pair} pair\n * @param {collision} collision\n * @param {number} timestamp\n */\n Pair.update = function(pair, collision, timestamp) {\n var supports = collision.supports,\n supportCount = collision.supportCount,\n contacts = pair.contacts,\n parentA = collision.parentA,\n parentB = collision.parentB;\n \n pair.isActive = true;\n pair.timeUpdated = timestamp;\n pair.collision = collision;\n pair.separation = collision.depth;\n pair.inverseMass = parentA.inverseMass + parentB.inverseMass;\n pair.friction = parentA.friction < parentB.friction ? parentA.friction : parentB.friction;\n pair.frictionStatic = parentA.frictionStatic > parentB.frictionStatic ? parentA.frictionStatic : parentB.frictionStatic;\n pair.restitution = parentA.restitution > parentB.restitution ? parentA.restitution : parentB.restitution;\n pair.slop = parentA.slop > parentB.slop ? parentA.slop : parentB.slop;\n\n pair.contactCount = supportCount;\n collision.pair = pair;\n\n var supportA = supports[0],\n contactA = contacts[0],\n supportB = supports[1],\n contactB = contacts[1];\n\n // match contacts to supports\n if (contactB.vertex === supportA || contactA.vertex === supportB) {\n contacts[1] = contactA;\n contacts[0] = contactA = contactB;\n contactB = contacts[1];\n }\n\n // update contacts\n contactA.vertex = supportA;\n contactB.vertex = supportB;\n };\n \n /**\n * Set a pair as active or inactive.\n * @method setActive\n * @param {pair} pair\n * @param {bool} isActive\n * @param {number} timestamp\n */\n Pair.setActive = function(pair, isActive, timestamp) {\n if (isActive) {\n pair.isActive = true;\n pair.timeUpdated = timestamp;\n } else {\n pair.isActive = false;\n pair.contactCount = 0;\n }\n };\n\n /**\n * Get the id for the given pair.\n * @method id\n * @param {body} bodyA\n * @param {body} bodyB\n * @return {string} Unique pairId\n */\n Pair.id = function(bodyA, bodyB) {\n return bodyA.id < bodyB.id ? bodyA.id.toString(36) + ':' + bodyB.id.toString(36) \n : bodyB.id.toString(36) + ':' + bodyA.id.toString(36);\n };\n\n})();\n\n\n/***/ }),\n/* 10 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Constraint` module contains methods for creating and manipulating constraints.\n* Constraints are used for specifying that a fixed distance must be maintained between two bodies (or a body and a fixed world-space position).\n* The stiffness of constraints can be modified to create springs or elastic.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Constraint\n*/\n\nvar Constraint = {};\n\nmodule.exports = Constraint;\n\nvar Vertices = __webpack_require__(3);\nvar Vector = __webpack_require__(2);\nvar Sleeping = __webpack_require__(7);\nvar Bounds = __webpack_require__(1);\nvar Axes = __webpack_require__(11);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n Constraint._warming = 0.4;\n Constraint._torqueDampen = 1;\n Constraint._minLength = 0.000001;\n\n /**\n * Creates a new constraint.\n * All properties have default values, and many are pre-calculated automatically based on other properties.\n * To simulate a revolute constraint (or pin joint) set `length: 0` and a high `stiffness` value (e.g. `0.7` or above).\n * If the constraint is unstable, try lowering the `stiffness` value and / or increasing `engine.constraintIterations`.\n * For compound bodies, constraints must be applied to the parent body (not one of its parts).\n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {} options\n * @return {constraint} constraint\n */\n Constraint.create = function(options) {\n var constraint = options;\n\n // if bodies defined but no points, use body centre\n if (constraint.bodyA && !constraint.pointA)\n constraint.pointA = { x: 0, y: 0 };\n if (constraint.bodyB && !constraint.pointB)\n constraint.pointB = { x: 0, y: 0 };\n\n // calculate static length using initial world space points\n var initialPointA = constraint.bodyA ? Vector.add(constraint.bodyA.position, constraint.pointA) : constraint.pointA,\n initialPointB = constraint.bodyB ? Vector.add(constraint.bodyB.position, constraint.pointB) : constraint.pointB,\n length = Vector.magnitude(Vector.sub(initialPointA, initialPointB));\n \n constraint.length = typeof constraint.length !== 'undefined' ? constraint.length : length;\n\n // option defaults\n constraint.id = constraint.id || Common.nextId();\n constraint.label = constraint.label || 'Constraint';\n constraint.type = 'constraint';\n constraint.stiffness = constraint.stiffness || (constraint.length > 0 ? 1 : 0.7);\n constraint.damping = constraint.damping || 0;\n constraint.angularStiffness = constraint.angularStiffness || 0;\n constraint.angleA = constraint.bodyA ? constraint.bodyA.angle : constraint.angleA;\n constraint.angleB = constraint.bodyB ? constraint.bodyB.angle : constraint.angleB;\n constraint.plugin = {};\n\n // render\n var render = {\n visible: true,\n lineWidth: 2,\n strokeStyle: '#ffffff',\n type: 'line',\n anchors: true\n };\n\n if (constraint.length === 0 && constraint.stiffness > 0.1) {\n render.type = 'pin';\n render.anchors = false;\n } else if (constraint.stiffness < 0.9) {\n render.type = 'spring';\n }\n\n constraint.render = Common.extend(render, constraint.render);\n\n return constraint;\n };\n\n /**\n * Prepares for solving by constraint warming.\n * @private\n * @method preSolveAll\n * @param {body[]} bodies\n */\n Constraint.preSolveAll = function(bodies) {\n for (var i = 0; i < bodies.length; i += 1) {\n var body = bodies[i],\n impulse = body.constraintImpulse;\n\n if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {\n continue;\n }\n\n body.position.x += impulse.x;\n body.position.y += impulse.y;\n body.angle += impulse.angle;\n }\n };\n\n /**\n * Solves all constraints in a list of collisions.\n * @private\n * @method solveAll\n * @param {constraint[]} constraints\n * @param {number} delta\n */\n Constraint.solveAll = function(constraints, delta) {\n var timeScale = Common.clamp(delta / Common._baseDelta, 0, 1);\n\n // Solve fixed constraints first.\n for (var i = 0; i < constraints.length; i += 1) {\n var constraint = constraints[i],\n fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic),\n fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);\n\n if (fixedA || fixedB) {\n Constraint.solve(constraints[i], timeScale);\n }\n }\n\n // Solve free constraints last.\n for (i = 0; i < constraints.length; i += 1) {\n constraint = constraints[i];\n fixedA = !constraint.bodyA || (constraint.bodyA && constraint.bodyA.isStatic);\n fixedB = !constraint.bodyB || (constraint.bodyB && constraint.bodyB.isStatic);\n\n if (!fixedA && !fixedB) {\n Constraint.solve(constraints[i], timeScale);\n }\n }\n };\n\n /**\n * Solves a distance constraint with Gauss-Siedel method.\n * @private\n * @method solve\n * @param {constraint} constraint\n * @param {number} timeScale\n */\n Constraint.solve = function(constraint, timeScale) {\n var bodyA = constraint.bodyA,\n bodyB = constraint.bodyB,\n pointA = constraint.pointA,\n pointB = constraint.pointB;\n\n if (!bodyA && !bodyB)\n return;\n\n // update reference angle\n if (bodyA && !bodyA.isStatic) {\n Vector.rotate(pointA, bodyA.angle - constraint.angleA, pointA);\n constraint.angleA = bodyA.angle;\n }\n \n // update reference angle\n if (bodyB && !bodyB.isStatic) {\n Vector.rotate(pointB, bodyB.angle - constraint.angleB, pointB);\n constraint.angleB = bodyB.angle;\n }\n\n var pointAWorld = pointA,\n pointBWorld = pointB;\n\n if (bodyA) pointAWorld = Vector.add(bodyA.position, pointA);\n if (bodyB) pointBWorld = Vector.add(bodyB.position, pointB);\n\n if (!pointAWorld || !pointBWorld)\n return;\n\n var delta = Vector.sub(pointAWorld, pointBWorld),\n currentLength = Vector.magnitude(delta);\n\n // prevent singularity\n if (currentLength < Constraint._minLength) {\n currentLength = Constraint._minLength;\n }\n\n // solve distance constraint with Gauss-Siedel method\n var difference = (currentLength - constraint.length) / currentLength,\n isRigid = constraint.stiffness >= 1 || constraint.length === 0,\n stiffness = isRigid ? constraint.stiffness * timeScale \n : constraint.stiffness * timeScale * timeScale,\n damping = constraint.damping * timeScale,\n force = Vector.mult(delta, difference * stiffness),\n massTotal = (bodyA ? bodyA.inverseMass : 0) + (bodyB ? bodyB.inverseMass : 0),\n inertiaTotal = (bodyA ? bodyA.inverseInertia : 0) + (bodyB ? bodyB.inverseInertia : 0),\n resistanceTotal = massTotal + inertiaTotal,\n torque,\n share,\n normal,\n normalVelocity,\n relativeVelocity;\n \n if (damping > 0) {\n var zero = Vector.create();\n normal = Vector.div(delta, currentLength);\n\n relativeVelocity = Vector.sub(\n bodyB && Vector.sub(bodyB.position, bodyB.positionPrev) || zero,\n bodyA && Vector.sub(bodyA.position, bodyA.positionPrev) || zero\n );\n\n normalVelocity = Vector.dot(normal, relativeVelocity);\n }\n\n if (bodyA && !bodyA.isStatic) {\n share = bodyA.inverseMass / massTotal;\n\n // keep track of applied impulses for post solving\n bodyA.constraintImpulse.x -= force.x * share;\n bodyA.constraintImpulse.y -= force.y * share;\n\n // apply forces\n bodyA.position.x -= force.x * share;\n bodyA.position.y -= force.y * share;\n\n // apply damping\n if (damping > 0) {\n bodyA.positionPrev.x -= damping * normal.x * normalVelocity * share;\n bodyA.positionPrev.y -= damping * normal.y * normalVelocity * share;\n }\n\n // apply torque\n torque = (Vector.cross(pointA, force) / resistanceTotal) * Constraint._torqueDampen * bodyA.inverseInertia * (1 - constraint.angularStiffness);\n bodyA.constraintImpulse.angle -= torque;\n bodyA.angle -= torque;\n }\n\n if (bodyB && !bodyB.isStatic) {\n share = bodyB.inverseMass / massTotal;\n\n // keep track of applied impulses for post solving\n bodyB.constraintImpulse.x += force.x * share;\n bodyB.constraintImpulse.y += force.y * share;\n \n // apply forces\n bodyB.position.x += force.x * share;\n bodyB.position.y += force.y * share;\n\n // apply damping\n if (damping > 0) {\n bodyB.positionPrev.x += damping * normal.x * normalVelocity * share;\n bodyB.positionPrev.y += damping * normal.y * normalVelocity * share;\n }\n\n // apply torque\n torque = (Vector.cross(pointB, force) / resistanceTotal) * Constraint._torqueDampen * bodyB.inverseInertia * (1 - constraint.angularStiffness);\n bodyB.constraintImpulse.angle += torque;\n bodyB.angle += torque;\n }\n\n };\n\n /**\n * Performs body updates required after solving constraints.\n * @private\n * @method postSolveAll\n * @param {body[]} bodies\n */\n Constraint.postSolveAll = function(bodies) {\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n impulse = body.constraintImpulse;\n\n if (body.isStatic || (impulse.x === 0 && impulse.y === 0 && impulse.angle === 0)) {\n continue;\n }\n\n Sleeping.set(body, false);\n\n // update geometry and reset\n for (var j = 0; j < body.parts.length; j++) {\n var part = body.parts[j];\n \n Vertices.translate(part.vertices, impulse);\n\n if (j > 0) {\n part.position.x += impulse.x;\n part.position.y += impulse.y;\n }\n\n if (impulse.angle !== 0) {\n Vertices.rotate(part.vertices, impulse.angle, body.position);\n Axes.rotate(part.axes, impulse.angle);\n if (j > 0) {\n Vector.rotateAbout(part.position, impulse.angle, body.position, part.position);\n }\n }\n\n Bounds.update(part.bounds, part.vertices, body.velocity);\n }\n\n // dampen the cached impulse for warming next step\n impulse.angle *= Constraint._warming;\n impulse.x *= Constraint._warming;\n impulse.y *= Constraint._warming;\n }\n };\n\n /**\n * Returns the world-space position of `constraint.pointA`, accounting for `constraint.bodyA`.\n * @method pointAWorld\n * @param {constraint} constraint\n * @returns {vector} the world-space position\n */\n Constraint.pointAWorld = function(constraint) {\n return {\n x: (constraint.bodyA ? constraint.bodyA.position.x : 0) \n + (constraint.pointA ? constraint.pointA.x : 0),\n y: (constraint.bodyA ? constraint.bodyA.position.y : 0) \n + (constraint.pointA ? constraint.pointA.y : 0)\n };\n };\n\n /**\n * Returns the world-space position of `constraint.pointB`, accounting for `constraint.bodyB`.\n * @method pointBWorld\n * @param {constraint} constraint\n * @returns {vector} the world-space position\n */\n Constraint.pointBWorld = function(constraint) {\n return {\n x: (constraint.bodyB ? constraint.bodyB.position.x : 0) \n + (constraint.pointB ? constraint.pointB.x : 0),\n y: (constraint.bodyB ? constraint.bodyB.position.y : 0) \n + (constraint.pointB ? constraint.pointB.y : 0)\n };\n };\n\n /**\n * Returns the current length of the constraint. \n * This is the distance between both of the constraint's end points.\n * See `constraint.length` for the target rest length.\n * @method currentLength\n * @param {constraint} constraint\n * @returns {number} the current length\n */\n Constraint.currentLength = function(constraint) {\n var pointAX = (constraint.bodyA ? constraint.bodyA.position.x : 0) \n + (constraint.pointA ? constraint.pointA.x : 0);\n\n var pointAY = (constraint.bodyA ? constraint.bodyA.position.y : 0) \n + (constraint.pointA ? constraint.pointA.y : 0);\n\n var pointBX = (constraint.bodyB ? constraint.bodyB.position.x : 0) \n + (constraint.pointB ? constraint.pointB.x : 0);\n \n var pointBY = (constraint.bodyB ? constraint.bodyB.position.y : 0) \n + (constraint.pointB ? constraint.pointB.y : 0);\n\n var deltaX = pointAX - pointBX;\n var deltaY = pointAY - pointBY;\n\n return Math.sqrt(deltaX * deltaX + deltaY * deltaY);\n };\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * An integer `Number` uniquely identifying number generated in `Composite.create` by `Common.nextId`.\n *\n * @property id\n * @type number\n */\n\n /**\n * A `String` denoting the type of object.\n *\n * @property type\n * @type string\n * @default \"constraint\"\n * @readOnly\n */\n\n /**\n * An arbitrary `String` name to help the user identify and manage bodies.\n *\n * @property label\n * @type string\n * @default \"Constraint\"\n */\n\n /**\n * An `Object` that defines the rendering properties to be consumed by the module `Matter.Render`.\n *\n * @property render\n * @type object\n */\n\n /**\n * A flag that indicates if the constraint should be rendered.\n *\n * @property render.visible\n * @type boolean\n * @default true\n */\n\n /**\n * A `Number` that defines the line width to use when rendering the constraint outline.\n * A value of `0` means no outline will be rendered.\n *\n * @property render.lineWidth\n * @type number\n * @default 2\n */\n\n /**\n * A `String` that defines the stroke style to use when rendering the constraint outline.\n * It is the same as when using a canvas, so it accepts CSS style property values.\n *\n * @property render.strokeStyle\n * @type string\n * @default a random colour\n */\n\n /**\n * A `String` that defines the constraint rendering type. \n * The possible values are 'line', 'pin', 'spring'.\n * An appropriate render type will be automatically chosen unless one is given in options.\n *\n * @property render.type\n * @type string\n * @default 'line'\n */\n\n /**\n * A `Boolean` that defines if the constraint's anchor points should be rendered.\n *\n * @property render.anchors\n * @type boolean\n * @default true\n */\n\n /**\n * The first possible `Body` that this constraint is attached to.\n *\n * @property bodyA\n * @type body\n * @default null\n */\n\n /**\n * The second possible `Body` that this constraint is attached to.\n *\n * @property bodyB\n * @type body\n * @default null\n */\n\n /**\n * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyA` if defined, otherwise a world-space position.\n *\n * @property pointA\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A `Vector` that specifies the offset of the constraint from center of the `constraint.bodyB` if defined, otherwise a world-space position.\n *\n * @property pointB\n * @type vector\n * @default { x: 0, y: 0 }\n */\n\n /**\n * A `Number` that specifies the stiffness of the constraint, i.e. the rate at which it returns to its resting `constraint.length`.\n * A value of `1` means the constraint should be very stiff.\n * A value of `0.2` means the constraint acts like a soft spring.\n *\n * @property stiffness\n * @type number\n * @default 1\n */\n\n /**\n * A `Number` that specifies the damping of the constraint, \n * i.e. the amount of resistance applied to each body based on their velocities to limit the amount of oscillation.\n * Damping will only be apparent when the constraint also has a very low `stiffness`.\n * A value of `0.1` means the constraint will apply heavy damping, resulting in little to no oscillation.\n * A value of `0` means the constraint will apply no damping.\n *\n * @property damping\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that specifies the target resting length of the constraint. \n * It is calculated automatically in `Constraint.create` from initial positions of the `constraint.bodyA` and `constraint.bodyB`.\n *\n * @property length\n * @type number\n */\n\n /**\n * An object reserved for storing plugin-specific properties.\n *\n * @property plugin\n * @type {}\n */\n\n})();\n\n\n/***/ }),\n/* 11 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Axes` module contains methods for creating and manipulating sets of axes.\n*\n* @class Axes\n*/\n\nvar Axes = {};\n\nmodule.exports = Axes;\n\nvar Vector = __webpack_require__(2);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Creates a new set of axes from the given vertices.\n * @method fromVertices\n * @param {vertices} vertices\n * @return {axes} A new axes from the given vertices\n */\n Axes.fromVertices = function(vertices) {\n var axes = {};\n\n // find the unique axes, using edge normal gradients\n for (var i = 0; i < vertices.length; i++) {\n var j = (i + 1) % vertices.length, \n normal = Vector.normalise({ \n x: vertices[j].y - vertices[i].y, \n y: vertices[i].x - vertices[j].x\n }),\n gradient = (normal.y === 0) ? Infinity : (normal.x / normal.y);\n \n // limit precision\n gradient = gradient.toFixed(3).toString();\n axes[gradient] = normal;\n }\n\n return Common.values(axes);\n };\n\n /**\n * Rotates a set of axes by the given angle.\n * @method rotate\n * @param {axes} axes\n * @param {number} angle\n */\n Axes.rotate = function(axes, angle) {\n if (angle === 0)\n return;\n \n var cos = Math.cos(angle),\n sin = Math.sin(angle);\n\n for (var i = 0; i < axes.length; i++) {\n var axis = axes[i],\n xx;\n xx = axis.x * cos - axis.y * sin;\n axis.y = axis.x * sin + axis.y * cos;\n axis.x = xx;\n }\n };\n\n})();\n\n\n/***/ }),\n/* 12 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Bodies` module contains factory methods for creating rigid body models \n* with commonly used body configurations (such as rectangles, circles and other polygons).\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Bodies\n*/\n\n// TODO: true circle bodies\n\nvar Bodies = {};\n\nmodule.exports = Bodies;\n\nvar Vertices = __webpack_require__(3);\nvar Common = __webpack_require__(0);\nvar Body = __webpack_require__(4);\nvar Bounds = __webpack_require__(1);\nvar Vector = __webpack_require__(2);\n\n(function() {\n\n /**\n * Creates a new rigid body model with a rectangle hull. \n * The options parameter is an object that specifies any properties you wish to override the defaults.\n * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.\n * @method rectangle\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {object} [options]\n * @return {body} A new rectangle body\n */\n Bodies.rectangle = function(x, y, width, height, options) {\n options = options || {};\n\n var rectangle = { \n label: 'Rectangle Body',\n position: { x: x, y: y },\n vertices: Vertices.fromPath('L 0 0 L ' + width + ' 0 L ' + width + ' ' + height + ' L 0 ' + height)\n };\n\n if (options.chamfer) {\n var chamfer = options.chamfer;\n rectangle.vertices = Vertices.chamfer(rectangle.vertices, chamfer.radius, \n chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);\n delete options.chamfer;\n }\n\n return Body.create(Common.extend({}, rectangle, options));\n };\n \n /**\n * Creates a new rigid body model with a trapezoid hull. \n * The `slope` is parameterised as a fraction of `width` and must be < 1 to form a valid trapezoid. \n * The options parameter is an object that specifies any properties you wish to override the defaults.\n * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.\n * @method trapezoid\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} slope Must be a number < 1.\n * @param {object} [options]\n * @return {body} A new trapezoid body\n */\n Bodies.trapezoid = function(x, y, width, height, slope, options) {\n options = options || {};\n\n if (slope >= 1) {\n Common.warn('Bodies.trapezoid: slope parameter must be < 1.');\n }\n\n slope *= 0.5;\n var roof = (1 - (slope * 2)) * width;\n \n var x1 = width * slope,\n x2 = x1 + roof,\n x3 = x2 + x1,\n verticesPath;\n\n if (slope < 0.5) {\n verticesPath = 'L 0 0 L ' + x1 + ' ' + (-height) + ' L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';\n } else {\n verticesPath = 'L 0 0 L ' + x2 + ' ' + (-height) + ' L ' + x3 + ' 0';\n }\n\n var trapezoid = { \n label: 'Trapezoid Body',\n position: { x: x, y: y },\n vertices: Vertices.fromPath(verticesPath)\n };\n\n if (options.chamfer) {\n var chamfer = options.chamfer;\n trapezoid.vertices = Vertices.chamfer(trapezoid.vertices, chamfer.radius, \n chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);\n delete options.chamfer;\n }\n\n return Body.create(Common.extend({}, trapezoid, options));\n };\n\n /**\n * Creates a new rigid body model with a circle hull. \n * The options parameter is an object that specifies any properties you wish to override the defaults.\n * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.\n * @method circle\n * @param {number} x\n * @param {number} y\n * @param {number} radius\n * @param {object} [options]\n * @param {number} [maxSides]\n * @return {body} A new circle body\n */\n Bodies.circle = function(x, y, radius, options, maxSides) {\n options = options || {};\n\n var circle = {\n label: 'Circle Body',\n circleRadius: radius\n };\n \n // approximate circles with polygons until true circles implemented in SAT\n maxSides = maxSides || 25;\n var sides = Math.ceil(Math.max(10, Math.min(maxSides, radius)));\n\n // optimisation: always use even number of sides (half the number of unique axes)\n if (sides % 2 === 1)\n sides += 1;\n\n return Bodies.polygon(x, y, sides, radius, Common.extend({}, circle, options));\n };\n\n /**\n * Creates a new rigid body model with a regular polygon hull with the given number of sides. \n * The options parameter is an object that specifies any properties you wish to override the defaults.\n * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.\n * @method polygon\n * @param {number} x\n * @param {number} y\n * @param {number} sides\n * @param {number} radius\n * @param {object} [options]\n * @return {body} A new regular polygon body\n */\n Bodies.polygon = function(x, y, sides, radius, options) {\n options = options || {};\n\n if (sides < 3)\n return Bodies.circle(x, y, radius, options);\n\n var theta = 2 * Math.PI / sides,\n path = '',\n offset = theta * 0.5;\n\n for (var i = 0; i < sides; i += 1) {\n var angle = offset + (i * theta),\n xx = Math.cos(angle) * radius,\n yy = Math.sin(angle) * radius;\n\n path += 'L ' + xx.toFixed(3) + ' ' + yy.toFixed(3) + ' ';\n }\n\n var polygon = { \n label: 'Polygon Body',\n position: { x: x, y: y },\n vertices: Vertices.fromPath(path)\n };\n\n if (options.chamfer) {\n var chamfer = options.chamfer;\n polygon.vertices = Vertices.chamfer(polygon.vertices, chamfer.radius, \n chamfer.quality, chamfer.qualityMin, chamfer.qualityMax);\n delete options.chamfer;\n }\n\n return Body.create(Common.extend({}, polygon, options));\n };\n\n /**\n * Utility to create a compound body based on set(s) of vertices.\n * \n * _Note:_ To optionally enable automatic concave vertices decomposition the [poly-decomp](https://github.com/schteppe/poly-decomp.js) \n * package must be first installed and provided see `Common.setDecomp`, otherwise the convex hull of each vertex set will be used.\n * \n * The resulting vertices are reorientated about their centre of mass,\n * and offset such that `body.position` corresponds to this point.\n * \n * The resulting offset may be found if needed by subtracting `body.bounds` from the original input bounds.\n * To later move the centre of mass see `Body.setCentre`.\n * \n * Note that automatic conconcave decomposition results are not always optimal. \n * For best results, simplify the input vertices as much as possible first.\n * By default this function applies some addtional simplification to help.\n * \n * Some outputs may also require further manual processing afterwards to be robust.\n * In particular some parts may need to be overlapped to avoid collision gaps.\n * Thin parts and sharp points should be avoided or removed where possible.\n *\n * The options parameter object specifies any `Matter.Body` properties you wish to override the defaults.\n * \n * See the properties section of the `Matter.Body` module for detailed information on what you can pass via the `options` object.\n * @method fromVertices\n * @param {number} x\n * @param {number} y\n * @param {array} vertexSets One or more arrays of vertex points e.g. `[[{ x: 0, y: 0 }...], ...]`.\n * @param {object} [options] The body options.\n * @param {bool} [flagInternal=false] Optionally marks internal edges with `isInternal`.\n * @param {number} [removeCollinear=0.01] Threshold when simplifying vertices along the same edge.\n * @param {number} [minimumArea=10] Threshold when removing small parts.\n * @param {number} [removeDuplicatePoints=0.01] Threshold when simplifying nearby vertices.\n * @return {body}\n */\n Bodies.fromVertices = function(x, y, vertexSets, options, flagInternal, removeCollinear, minimumArea, removeDuplicatePoints) {\n var decomp = Common.getDecomp(),\n canDecomp,\n body,\n parts,\n isConvex,\n isConcave,\n vertices,\n i,\n j,\n k,\n v,\n z;\n\n // check decomp is as expected\n canDecomp = Boolean(decomp && decomp.quickDecomp);\n\n options = options || {};\n parts = [];\n\n flagInternal = typeof flagInternal !== 'undefined' ? flagInternal : false;\n removeCollinear = typeof removeCollinear !== 'undefined' ? removeCollinear : 0.01;\n minimumArea = typeof minimumArea !== 'undefined' ? minimumArea : 10;\n removeDuplicatePoints = typeof removeDuplicatePoints !== 'undefined' ? removeDuplicatePoints : 0.01;\n\n // ensure vertexSets is an array of arrays\n if (!Common.isArray(vertexSets[0])) {\n vertexSets = [vertexSets];\n }\n\n for (v = 0; v < vertexSets.length; v += 1) {\n vertices = vertexSets[v];\n isConvex = Vertices.isConvex(vertices);\n isConcave = !isConvex;\n\n if (isConcave && !canDecomp) {\n Common.warnOnce(\n 'Bodies.fromVertices: Install the \\'poly-decomp\\' library and use Common.setDecomp or provide \\'decomp\\' as a global to decompose concave vertices.'\n );\n }\n\n if (isConvex || !canDecomp) {\n if (isConvex) {\n vertices = Vertices.clockwiseSort(vertices);\n } else {\n // fallback to convex hull when decomposition is not possible\n vertices = Vertices.hull(vertices);\n }\n\n parts.push({\n position: { x: x, y: y },\n vertices: vertices\n });\n } else {\n // initialise a decomposition\n var concave = vertices.map(function(vertex) {\n return [vertex.x, vertex.y];\n });\n\n // vertices are concave and simple, we can decompose into parts\n decomp.makeCCW(concave);\n if (removeCollinear !== false)\n decomp.removeCollinearPoints(concave, removeCollinear);\n if (removeDuplicatePoints !== false && decomp.removeDuplicatePoints)\n decomp.removeDuplicatePoints(concave, removeDuplicatePoints);\n\n // use the quick decomposition algorithm (Bayazit)\n var decomposed = decomp.quickDecomp(concave);\n\n // for each decomposed chunk\n for (i = 0; i < decomposed.length; i++) {\n var chunk = decomposed[i];\n\n // convert vertices into the correct structure\n var chunkVertices = chunk.map(function(vertices) {\n return {\n x: vertices[0],\n y: vertices[1]\n };\n });\n\n // skip small chunks\n if (minimumArea > 0 && Vertices.area(chunkVertices) < minimumArea)\n continue;\n\n // create a compound part\n parts.push({\n position: Vertices.centre(chunkVertices),\n vertices: chunkVertices\n });\n }\n }\n }\n\n // create body parts\n for (i = 0; i < parts.length; i++) {\n parts[i] = Body.create(Common.extend(parts[i], options));\n }\n\n // flag internal edges (coincident part edges)\n if (flagInternal) {\n var coincident_max_dist = 5;\n\n for (i = 0; i < parts.length; i++) {\n var partA = parts[i];\n\n for (j = i + 1; j < parts.length; j++) {\n var partB = parts[j];\n\n if (Bounds.overlaps(partA.bounds, partB.bounds)) {\n var pav = partA.vertices,\n pbv = partB.vertices;\n\n // iterate vertices of both parts\n for (k = 0; k < partA.vertices.length; k++) {\n for (z = 0; z < partB.vertices.length; z++) {\n // find distances between the vertices\n var da = Vector.magnitudeSquared(Vector.sub(pav[(k + 1) % pav.length], pbv[z])),\n db = Vector.magnitudeSquared(Vector.sub(pav[k], pbv[(z + 1) % pbv.length]));\n\n // if both vertices are very close, consider the edge concident (internal)\n if (da < coincident_max_dist && db < coincident_max_dist) {\n pav[k].isInternal = true;\n pbv[z].isInternal = true;\n }\n }\n }\n\n }\n }\n }\n }\n\n if (parts.length > 1) {\n // create the parent body to be returned, that contains generated compound parts\n body = Body.create(Common.extend({ parts: parts.slice(0) }, options));\n\n // offset such that body.position is at the centre off mass\n Body.setPosition(body, { x: x, y: y });\n\n return body;\n } else {\n return parts[0];\n }\n };\n\n})();\n\n\n/***/ }),\n/* 13 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Detector` module contains methods for efficiently detecting collisions between a list of bodies using a broadphase algorithm.\n*\n* @class Detector\n*/\n\nvar Detector = {};\n\nmodule.exports = Detector;\n\nvar Common = __webpack_require__(0);\nvar Collision = __webpack_require__(8);\n\n(function() {\n\n /**\n * Creates a new collision detector.\n * @method create\n * @param {} options\n * @return {detector} A new collision detector\n */\n Detector.create = function(options) {\n var defaults = {\n bodies: [],\n collisions: [],\n pairs: null\n };\n\n return Common.extend(defaults, options);\n };\n\n /**\n * Sets the list of bodies in the detector.\n * @method setBodies\n * @param {detector} detector\n * @param {body[]} bodies\n */\n Detector.setBodies = function(detector, bodies) {\n detector.bodies = bodies.slice(0);\n };\n\n /**\n * Clears the detector including its list of bodies.\n * @method clear\n * @param {detector} detector\n */\n Detector.clear = function(detector) {\n detector.bodies = [];\n detector.collisions = [];\n };\n\n /**\n * Efficiently finds all collisions among all the bodies in `detector.bodies` using a broadphase algorithm.\n * \n * _Note:_ The specific ordering of collisions returned is not guaranteed between releases and may change for performance reasons.\n * If a specific ordering is required then apply a sort to the resulting array.\n * @method collisions\n * @param {detector} detector\n * @return {collision[]} collisions\n */\n Detector.collisions = function(detector) {\n var pairs = detector.pairs,\n bodies = detector.bodies,\n bodiesLength = bodies.length,\n canCollide = Detector.canCollide,\n collides = Collision.collides,\n collisions = detector.collisions,\n collisionIndex = 0,\n i,\n j;\n\n bodies.sort(Detector._compareBoundsX);\n\n for (i = 0; i < bodiesLength; i++) {\n var bodyA = bodies[i],\n boundsA = bodyA.bounds,\n boundXMax = bodyA.bounds.max.x,\n boundYMax = bodyA.bounds.max.y,\n boundYMin = bodyA.bounds.min.y,\n bodyAStatic = bodyA.isStatic || bodyA.isSleeping,\n partsALength = bodyA.parts.length,\n partsASingle = partsALength === 1;\n\n for (j = i + 1; j < bodiesLength; j++) {\n var bodyB = bodies[j],\n boundsB = bodyB.bounds;\n\n if (boundsB.min.x > boundXMax) {\n break;\n }\n\n if (boundYMax < boundsB.min.y || boundYMin > boundsB.max.y) {\n continue;\n }\n\n if (bodyAStatic && (bodyB.isStatic || bodyB.isSleeping)) {\n continue;\n }\n\n if (!canCollide(bodyA.collisionFilter, bodyB.collisionFilter)) {\n continue;\n }\n\n var partsBLength = bodyB.parts.length;\n\n if (partsASingle && partsBLength === 1) {\n var collision = collides(bodyA, bodyB, pairs);\n\n if (collision) {\n collisions[collisionIndex++] = collision;\n }\n } else {\n var partsAStart = partsALength > 1 ? 1 : 0,\n partsBStart = partsBLength > 1 ? 1 : 0;\n \n for (var k = partsAStart; k < partsALength; k++) {\n var partA = bodyA.parts[k],\n boundsA = partA.bounds;\n\n for (var z = partsBStart; z < partsBLength; z++) {\n var partB = bodyB.parts[z],\n boundsB = partB.bounds;\n\n if (boundsA.min.x > boundsB.max.x || boundsA.max.x < boundsB.min.x\n || boundsA.max.y < boundsB.min.y || boundsA.min.y > boundsB.max.y) {\n continue;\n }\n\n var collision = collides(partA, partB, pairs);\n\n if (collision) {\n collisions[collisionIndex++] = collision;\n }\n }\n }\n }\n }\n }\n\n if (collisions.length !== collisionIndex) {\n collisions.length = collisionIndex;\n }\n\n return collisions;\n };\n\n /**\n * Returns `true` if both supplied collision filters will allow a collision to occur.\n * See `body.collisionFilter` for more information.\n * @method canCollide\n * @param {} filterA\n * @param {} filterB\n * @return {bool} `true` if collision can occur\n */\n Detector.canCollide = function(filterA, filterB) {\n if (filterA.group === filterB.group && filterA.group !== 0)\n return filterA.group > 0;\n\n return (filterA.mask & filterB.category) !== 0 && (filterB.mask & filterA.category) !== 0;\n };\n\n /**\n * The comparison function used in the broadphase algorithm.\n * Returns the signed delta of the bodies bounds on the x-axis.\n * @private\n * @method _sortCompare\n * @param {body} bodyA\n * @param {body} bodyB\n * @return {number} The signed delta used for sorting\n */\n Detector._compareBoundsX = function(bodyA, bodyB) {\n return bodyA.bounds.min.x - bodyB.bounds.min.x;\n };\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * The array of `Matter.Body` between which the detector finds collisions.\n * \n * _Note:_ The order of bodies in this array _is not fixed_ and will be continually managed by the detector.\n * @property bodies\n * @type body[]\n * @default []\n */\n\n /**\n * The array of `Matter.Collision` found in the last call to `Detector.collisions` on this detector.\n * @property collisions\n * @type collision[]\n * @default []\n */\n\n /**\n * Optional. A `Matter.Pairs` object from which previous collision objects may be reused. Intended for internal `Matter.Engine` usage.\n * @property pairs\n * @type {pairs|null}\n * @default null\n */\n\n})();\n\n\n/***/ }),\n/* 14 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Mouse` module contains methods for creating and manipulating mouse inputs.\n*\n* @class Mouse\n*/\n\nvar Mouse = {};\n\nmodule.exports = Mouse;\n\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Creates a mouse input.\n * @method create\n * @param {HTMLElement} element\n * @return {mouse} A new mouse\n */\n Mouse.create = function(element) {\n var mouse = {};\n\n if (!element) {\n Common.log('Mouse.create: element was undefined, defaulting to document.body', 'warn');\n }\n \n mouse.element = element || document.body;\n mouse.absolute = { x: 0, y: 0 };\n mouse.position = { x: 0, y: 0 };\n mouse.mousedownPosition = { x: 0, y: 0 };\n mouse.mouseupPosition = { x: 0, y: 0 };\n mouse.offset = { x: 0, y: 0 };\n mouse.scale = { x: 1, y: 1 };\n mouse.wheelDelta = 0;\n mouse.button = -1;\n mouse.pixelRatio = parseInt(mouse.element.getAttribute('data-pixel-ratio'), 10) || 1;\n\n mouse.sourceEvents = {\n mousemove: null,\n mousedown: null,\n mouseup: null,\n mousewheel: null\n };\n \n mouse.mousemove = function(event) { \n var position = Mouse._getRelativeMousePosition(event, mouse.element, mouse.pixelRatio),\n touches = event.changedTouches;\n\n if (touches) {\n mouse.button = 0;\n event.preventDefault();\n }\n\n mouse.absolute.x = position.x;\n mouse.absolute.y = position.y;\n mouse.position.x = mouse.absolute.x * mouse.scale.x + mouse.offset.x;\n mouse.position.y = mouse.absolute.y * mouse.scale.y + mouse.offset.y;\n mouse.sourceEvents.mousemove = event;\n };\n \n mouse.mousedown = function(event) {\n var position = Mouse._getRelativeMousePosition(event, mouse.element, mouse.pixelRatio),\n touches = event.changedTouches;\n\n if (touches) {\n mouse.button = 0;\n event.preventDefault();\n } else {\n mouse.button = event.button;\n }\n\n mouse.absolute.x = position.x;\n mouse.absolute.y = position.y;\n mouse.position.x = mouse.absolute.x * mouse.scale.x + mouse.offset.x;\n mouse.position.y = mouse.absolute.y * mouse.scale.y + mouse.offset.y;\n mouse.mousedownPosition.x = mouse.position.x;\n mouse.mousedownPosition.y = mouse.position.y;\n mouse.sourceEvents.mousedown = event;\n };\n \n mouse.mouseup = function(event) {\n var position = Mouse._getRelativeMousePosition(event, mouse.element, mouse.pixelRatio),\n touches = event.changedTouches;\n\n if (touches) {\n event.preventDefault();\n }\n \n mouse.button = -1;\n mouse.absolute.x = position.x;\n mouse.absolute.y = position.y;\n mouse.position.x = mouse.absolute.x * mouse.scale.x + mouse.offset.x;\n mouse.position.y = mouse.absolute.y * mouse.scale.y + mouse.offset.y;\n mouse.mouseupPosition.x = mouse.position.x;\n mouse.mouseupPosition.y = mouse.position.y;\n mouse.sourceEvents.mouseup = event;\n };\n\n mouse.mousewheel = function(event) {\n mouse.wheelDelta = Math.max(-1, Math.min(1, event.wheelDelta || -event.detail));\n event.preventDefault();\n mouse.sourceEvents.mousewheel = event;\n };\n\n Mouse.setElement(mouse, mouse.element);\n\n return mouse;\n };\n\n /**\n * Sets the element the mouse is bound to (and relative to).\n * @method setElement\n * @param {mouse} mouse\n * @param {HTMLElement} element\n */\n Mouse.setElement = function(mouse, element) {\n mouse.element = element;\n\n element.addEventListener('mousemove', mouse.mousemove, { passive: true });\n element.addEventListener('mousedown', mouse.mousedown, { passive: true });\n element.addEventListener('mouseup', mouse.mouseup, { passive: true });\n \n element.addEventListener('wheel', mouse.mousewheel, { passive: false });\n \n element.addEventListener('touchmove', mouse.mousemove, { passive: false });\n element.addEventListener('touchstart', mouse.mousedown, { passive: false });\n element.addEventListener('touchend', mouse.mouseup, { passive: false });\n };\n\n /**\n * Clears all captured source events.\n * @method clearSourceEvents\n * @param {mouse} mouse\n */\n Mouse.clearSourceEvents = function(mouse) {\n mouse.sourceEvents.mousemove = null;\n mouse.sourceEvents.mousedown = null;\n mouse.sourceEvents.mouseup = null;\n mouse.sourceEvents.mousewheel = null;\n mouse.wheelDelta = 0;\n };\n\n /**\n * Sets the mouse position offset.\n * @method setOffset\n * @param {mouse} mouse\n * @param {vector} offset\n */\n Mouse.setOffset = function(mouse, offset) {\n mouse.offset.x = offset.x;\n mouse.offset.y = offset.y;\n mouse.position.x = mouse.absolute.x * mouse.scale.x + mouse.offset.x;\n mouse.position.y = mouse.absolute.y * mouse.scale.y + mouse.offset.y;\n };\n\n /**\n * Sets the mouse position scale.\n * @method setScale\n * @param {mouse} mouse\n * @param {vector} scale\n */\n Mouse.setScale = function(mouse, scale) {\n mouse.scale.x = scale.x;\n mouse.scale.y = scale.y;\n mouse.position.x = mouse.absolute.x * mouse.scale.x + mouse.offset.x;\n mouse.position.y = mouse.absolute.y * mouse.scale.y + mouse.offset.y;\n };\n \n /**\n * Gets the mouse position relative to an element given a screen pixel ratio.\n * @method _getRelativeMousePosition\n * @private\n * @param {} event\n * @param {} element\n * @param {number} pixelRatio\n * @return {}\n */\n Mouse._getRelativeMousePosition = function(event, element, pixelRatio) {\n var elementBounds = element.getBoundingClientRect(),\n rootNode = (document.documentElement || document.body.parentNode || document.body),\n scrollX = (window.pageXOffset !== undefined) ? window.pageXOffset : rootNode.scrollLeft,\n scrollY = (window.pageYOffset !== undefined) ? window.pageYOffset : rootNode.scrollTop,\n touches = event.changedTouches,\n x, y;\n \n if (touches) {\n x = touches[0].pageX - elementBounds.left - scrollX;\n y = touches[0].pageY - elementBounds.top - scrollY;\n } else {\n x = event.pageX - elementBounds.left - scrollX;\n y = event.pageY - elementBounds.top - scrollY;\n }\n\n return { \n x: x / (element.clientWidth / (element.width || element.clientWidth) * pixelRatio),\n y: y / (element.clientHeight / (element.height || element.clientHeight) * pixelRatio)\n };\n };\n\n})();\n\n\n/***/ }),\n/* 15 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Plugin` module contains functions for registering and installing plugins on modules.\n*\n* @class Plugin\n*/\n\nvar Plugin = {};\n\nmodule.exports = Plugin;\n\nvar Common = __webpack_require__(0);\n\n(function() {\n\n Plugin._registry = {};\n\n /**\n * Registers a plugin object so it can be resolved later by name.\n * @method register\n * @param plugin {} The plugin to register.\n * @return {object} The plugin.\n */\n Plugin.register = function(plugin) {\n if (!Plugin.isPlugin(plugin)) {\n Common.warn('Plugin.register:', Plugin.toString(plugin), 'does not implement all required fields.');\n }\n\n if (plugin.name in Plugin._registry) {\n var registered = Plugin._registry[plugin.name],\n pluginVersion = Plugin.versionParse(plugin.version).number,\n registeredVersion = Plugin.versionParse(registered.version).number;\n\n if (pluginVersion > registeredVersion) {\n Common.warn('Plugin.register:', Plugin.toString(registered), 'was upgraded to', Plugin.toString(plugin));\n Plugin._registry[plugin.name] = plugin;\n } else if (pluginVersion < registeredVersion) {\n Common.warn('Plugin.register:', Plugin.toString(registered), 'can not be downgraded to', Plugin.toString(plugin));\n } else if (plugin !== registered) {\n Common.warn('Plugin.register:', Plugin.toString(plugin), 'is already registered to different plugin object');\n }\n } else {\n Plugin._registry[plugin.name] = plugin;\n }\n\n return plugin;\n };\n\n /**\n * Resolves a dependency to a plugin object from the registry if it exists. \n * The `dependency` may contain a version, but only the name matters when resolving.\n * @method resolve\n * @param dependency {string} The dependency.\n * @return {object} The plugin if resolved, otherwise `undefined`.\n */\n Plugin.resolve = function(dependency) {\n return Plugin._registry[Plugin.dependencyParse(dependency).name];\n };\n\n /**\n * Returns a pretty printed plugin name and version.\n * @method toString\n * @param plugin {} The plugin.\n * @return {string} Pretty printed plugin name and version.\n */\n Plugin.toString = function(plugin) {\n return typeof plugin === 'string' ? plugin : (plugin.name || 'anonymous') + '@' + (plugin.version || plugin.range || '0.0.0');\n };\n\n /**\n * Returns `true` if the object meets the minimum standard to be considered a plugin.\n * This means it must define the following properties:\n * - `name`\n * - `version`\n * - `install`\n * @method isPlugin\n * @param obj {} The obj to test.\n * @return {boolean} `true` if the object can be considered a plugin otherwise `false`.\n */\n Plugin.isPlugin = function(obj) {\n return obj && obj.name && obj.version && obj.install;\n };\n\n /**\n * Returns `true` if a plugin with the given `name` been installed on `module`.\n * @method isUsed\n * @param module {} The module.\n * @param name {string} The plugin name.\n * @return {boolean} `true` if a plugin with the given `name` been installed on `module`, otherwise `false`.\n */\n Plugin.isUsed = function(module, name) {\n return module.used.indexOf(name) > -1;\n };\n\n /**\n * Returns `true` if `plugin.for` is applicable to `module` by comparing against `module.name` and `module.version`.\n * If `plugin.for` is not specified then it is assumed to be applicable.\n * The value of `plugin.for` is a string of the format `'module-name'` or `'module-name@version'`.\n * @method isFor\n * @param plugin {} The plugin.\n * @param module {} The module.\n * @return {boolean} `true` if `plugin.for` is applicable to `module`, otherwise `false`.\n */\n Plugin.isFor = function(plugin, module) {\n var parsed = plugin.for && Plugin.dependencyParse(plugin.for);\n return !plugin.for || (module.name === parsed.name && Plugin.versionSatisfies(module.version, parsed.range));\n };\n\n /**\n * Installs the plugins by calling `plugin.install` on each plugin specified in `plugins` if passed, otherwise `module.uses`.\n * For installing plugins on `Matter` see the convenience function `Matter.use`.\n * Plugins may be specified either by their name or a reference to the plugin object.\n * Plugins themselves may specify further dependencies, but each plugin is installed only once.\n * Order is important, a topological sort is performed to find the best resulting order of installation.\n * This sorting attempts to satisfy every dependency's requested ordering, but may not be exact in all cases.\n * This function logs the resulting status of each dependency in the console, along with any warnings.\n * - A green tick ✅ indicates a dependency was resolved and installed.\n * - An orange diamond 🔶 indicates a dependency was resolved but a warning was thrown for it or one if its dependencies.\n * - A red cross ❌ indicates a dependency could not be resolved.\n * Avoid calling this function multiple times on the same module unless you intend to manually control installation order.\n * @method use\n * @param module {} The module install plugins on.\n * @param [plugins=module.uses] {} The plugins to install on module (optional, defaults to `module.uses`).\n */\n Plugin.use = function(module, plugins) {\n module.uses = (module.uses || []).concat(plugins || []);\n\n if (module.uses.length === 0) {\n Common.warn('Plugin.use:', Plugin.toString(module), 'does not specify any dependencies to install.');\n return;\n }\n\n var dependencies = Plugin.dependencies(module),\n sortedDependencies = Common.topologicalSort(dependencies),\n status = [];\n\n for (var i = 0; i < sortedDependencies.length; i += 1) {\n if (sortedDependencies[i] === module.name) {\n continue;\n }\n\n var plugin = Plugin.resolve(sortedDependencies[i]);\n\n if (!plugin) {\n status.push('❌ ' + sortedDependencies[i]);\n continue;\n }\n\n if (Plugin.isUsed(module, plugin.name)) {\n continue;\n }\n\n if (!Plugin.isFor(plugin, module)) {\n Common.warn('Plugin.use:', Plugin.toString(plugin), 'is for', plugin.for, 'but installed on', Plugin.toString(module) + '.');\n plugin._warned = true;\n }\n\n if (plugin.install) {\n plugin.install(module);\n } else {\n Common.warn('Plugin.use:', Plugin.toString(plugin), 'does not specify an install function.');\n plugin._warned = true;\n }\n\n if (plugin._warned) {\n status.push('🔶 ' + Plugin.toString(plugin));\n delete plugin._warned;\n } else {\n status.push('✅ ' + Plugin.toString(plugin));\n }\n\n module.used.push(plugin.name);\n }\n\n if (status.length > 0) {\n Common.info(status.join(' '));\n }\n };\n\n /**\n * Recursively finds all of a module's dependencies and returns a flat dependency graph.\n * @method dependencies\n * @param module {} The module.\n * @return {object} A dependency graph.\n */\n Plugin.dependencies = function(module, tracked) {\n var parsedBase = Plugin.dependencyParse(module),\n name = parsedBase.name;\n\n tracked = tracked || {};\n\n if (name in tracked) {\n return;\n }\n\n module = Plugin.resolve(module) || module;\n\n tracked[name] = Common.map(module.uses || [], function(dependency) {\n if (Plugin.isPlugin(dependency)) {\n Plugin.register(dependency);\n }\n\n var parsed = Plugin.dependencyParse(dependency),\n resolved = Plugin.resolve(dependency);\n\n if (resolved && !Plugin.versionSatisfies(resolved.version, parsed.range)) {\n Common.warn(\n 'Plugin.dependencies:', Plugin.toString(resolved), 'does not satisfy',\n Plugin.toString(parsed), 'used by', Plugin.toString(parsedBase) + '.'\n );\n\n resolved._warned = true;\n module._warned = true;\n } else if (!resolved) {\n Common.warn(\n 'Plugin.dependencies:', Plugin.toString(dependency), 'used by',\n Plugin.toString(parsedBase), 'could not be resolved.'\n );\n\n module._warned = true;\n }\n\n return parsed.name;\n });\n\n for (var i = 0; i < tracked[name].length; i += 1) {\n Plugin.dependencies(tracked[name][i], tracked);\n }\n\n return tracked;\n };\n\n /**\n * Parses a dependency string into its components.\n * The `dependency` is a string of the format `'module-name'` or `'module-name@version'`.\n * See documentation for `Plugin.versionParse` for a description of the format.\n * This function can also handle dependencies that are already resolved (e.g. a module object).\n * @method dependencyParse\n * @param dependency {string} The dependency of the format `'module-name'` or `'module-name@version'`.\n * @return {object} The dependency parsed into its components.\n */\n Plugin.dependencyParse = function(dependency) {\n if (Common.isString(dependency)) {\n var pattern = /^[\\w-]+(@(\\*|[\\^~]?\\d+\\.\\d+\\.\\d+(-[0-9A-Za-z-+]+)?))?$/;\n\n if (!pattern.test(dependency)) {\n Common.warn('Plugin.dependencyParse:', dependency, 'is not a valid dependency string.');\n }\n\n return {\n name: dependency.split('@')[0],\n range: dependency.split('@')[1] || '*'\n };\n }\n\n return {\n name: dependency.name,\n range: dependency.range || dependency.version\n };\n };\n\n /**\n * Parses a version string into its components. \n * Versions are strictly of the format `x.y.z` (as in [semver](http://semver.org/)).\n * Versions may optionally have a prerelease tag in the format `x.y.z-alpha`.\n * Ranges are a strict subset of [npm ranges](https://docs.npmjs.com/misc/semver#advanced-range-syntax).\n * Only the following range types are supported:\n * - Tilde ranges e.g. `~1.2.3`\n * - Caret ranges e.g. `^1.2.3`\n * - Greater than ranges e.g. `>1.2.3`\n * - Greater than or equal ranges e.g. `>=1.2.3`\n * - Exact version e.g. `1.2.3`\n * - Any version `*`\n * @method versionParse\n * @param range {string} The version string.\n * @return {object} The version range parsed into its components.\n */\n Plugin.versionParse = function(range) {\n var pattern = /^(\\*)|(\\^|~|>=|>)?\\s*((\\d+)\\.(\\d+)\\.(\\d+))(-[0-9A-Za-z-+]+)?$/;\n\n if (!pattern.test(range)) {\n Common.warn('Plugin.versionParse:', range, 'is not a valid version or range.');\n }\n\n var parts = pattern.exec(range);\n var major = Number(parts[4]);\n var minor = Number(parts[5]);\n var patch = Number(parts[6]);\n\n return {\n isRange: Boolean(parts[1] || parts[2]),\n version: parts[3],\n range: range,\n operator: parts[1] || parts[2] || '',\n major: major,\n minor: minor,\n patch: patch,\n parts: [major, minor, patch],\n prerelease: parts[7],\n number: major * 1e8 + minor * 1e4 + patch\n };\n };\n\n /**\n * Returns `true` if `version` satisfies the given `range`.\n * See documentation for `Plugin.versionParse` for a description of the format.\n * If a version or range is not specified, then any version (`*`) is assumed to satisfy.\n * @method versionSatisfies\n * @param version {string} The version string.\n * @param range {string} The range string.\n * @return {boolean} `true` if `version` satisfies `range`, otherwise `false`.\n */\n Plugin.versionSatisfies = function(version, range) {\n range = range || '*';\n\n var r = Plugin.versionParse(range),\n v = Plugin.versionParse(version);\n\n if (r.isRange) {\n if (r.operator === '*' || version === '*') {\n return true;\n }\n\n if (r.operator === '>') {\n return v.number > r.number;\n }\n\n if (r.operator === '>=') {\n return v.number >= r.number;\n }\n\n if (r.operator === '~') {\n return v.major === r.major && v.minor === r.minor && v.patch >= r.patch;\n }\n\n if (r.operator === '^') {\n if (r.major > 0) {\n return v.major === r.major && v.number >= r.number;\n }\n\n if (r.minor > 0) {\n return v.minor === r.minor && v.patch >= r.patch;\n }\n\n return v.patch === r.patch;\n }\n }\n\n return version === range || version === '*';\n };\n\n})();\n\n\n/***/ }),\n/* 16 */\n/***/ (function(module, exports) {\n\n/**\n* The `Matter.Contact` module contains methods for creating and manipulating collision contacts.\n*\n* @class Contact\n*/\n\nvar Contact = {};\n\nmodule.exports = Contact;\n\n(function() {\n\n /**\n * Creates a new contact.\n * @method create\n * @param {vertex} [vertex]\n * @return {contact} A new contact\n */\n Contact.create = function(vertex) {\n return {\n vertex: vertex,\n normalImpulse: 0,\n tangentImpulse: 0\n };\n };\n\n})();\n\n\n/***/ }),\n/* 17 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Engine` module contains methods for creating and manipulating engines.\n* An engine is a controller that manages updating the simulation of the world.\n* See `Matter.Runner` for an optional game loop utility.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Engine\n*/\n\nvar Engine = {};\n\nmodule.exports = Engine;\n\nvar Sleeping = __webpack_require__(7);\nvar Resolver = __webpack_require__(18);\nvar Detector = __webpack_require__(13);\nvar Pairs = __webpack_require__(19);\nvar Events = __webpack_require__(5);\nvar Composite = __webpack_require__(6);\nvar Constraint = __webpack_require__(10);\nvar Common = __webpack_require__(0);\nvar Body = __webpack_require__(4);\n\n(function() {\n\n Engine._deltaMax = 1000 / 60;\n\n /**\n * Creates a new engine. The options parameter is an object that specifies any properties you wish to override the defaults.\n * All properties have default values, and many are pre-calculated automatically based on other properties.\n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {object} [options]\n * @return {engine} engine\n */\n Engine.create = function(options) {\n options = options || {};\n\n var defaults = {\n positionIterations: 6,\n velocityIterations: 4,\n constraintIterations: 2,\n enableSleeping: false,\n events: [],\n plugin: {},\n gravity: {\n x: 0,\n y: 1,\n scale: 0.001\n },\n timing: {\n timestamp: 0,\n timeScale: 1,\n lastDelta: 0,\n lastElapsed: 0,\n lastUpdatesPerFrame: 0\n }\n };\n\n var engine = Common.extend(defaults, options);\n\n engine.world = options.world || Composite.create({ label: 'World' });\n engine.pairs = options.pairs || Pairs.create();\n engine.detector = options.detector || Detector.create();\n engine.detector.pairs = engine.pairs;\n\n // for temporary back compatibility only\n engine.grid = { buckets: [] };\n engine.world.gravity = engine.gravity;\n engine.broadphase = engine.grid;\n engine.metrics = {};\n \n return engine;\n };\n\n /**\n * Moves the simulation forward in time by `delta` milliseconds.\n * Triggers `beforeUpdate`, `beforeSolve` and `afterUpdate` events.\n * Triggers `collisionStart`, `collisionActive` and `collisionEnd` events.\n * @method update\n * @param {engine} engine\n * @param {number} [delta=16.666]\n */\n Engine.update = function(engine, delta) {\n var startTime = Common.now();\n\n var world = engine.world,\n detector = engine.detector,\n pairs = engine.pairs,\n timing = engine.timing,\n timestamp = timing.timestamp,\n i;\n\n // warn if high delta\n if (delta > Engine._deltaMax) {\n Common.warnOnce(\n 'Matter.Engine.update: delta argument is recommended to be less than or equal to', Engine._deltaMax.toFixed(3), 'ms.'\n );\n }\n\n delta = typeof delta !== 'undefined' ? delta : Common._baseDelta;\n delta *= timing.timeScale;\n\n // increment timestamp\n timing.timestamp += delta;\n timing.lastDelta = delta;\n\n // create an event object\n var event = {\n timestamp: timing.timestamp,\n delta: delta\n };\n\n Events.trigger(engine, 'beforeUpdate', event);\n\n // get all bodies and all constraints in the world\n var allBodies = Composite.allBodies(world),\n allConstraints = Composite.allConstraints(world);\n\n // if the world has changed\n if (world.isModified) {\n // update the detector bodies\n Detector.setBodies(detector, allBodies);\n\n // reset all composite modified flags\n Composite.setModified(world, false, false, true);\n }\n\n // update sleeping if enabled\n if (engine.enableSleeping)\n Sleeping.update(allBodies, delta);\n\n // apply gravity to all bodies\n Engine._bodiesApplyGravity(allBodies, engine.gravity);\n\n // update all body position and rotation by integration\n if (delta > 0) {\n Engine._bodiesUpdate(allBodies, delta);\n }\n\n Events.trigger(engine, 'beforeSolve', event);\n\n // update all constraints (first pass)\n Constraint.preSolveAll(allBodies);\n for (i = 0; i < engine.constraintIterations; i++) {\n Constraint.solveAll(allConstraints, delta);\n }\n Constraint.postSolveAll(allBodies);\n\n // find all collisions\n var collisions = Detector.collisions(detector);\n\n // update collision pairs\n Pairs.update(pairs, collisions, timestamp);\n\n // wake up bodies involved in collisions\n if (engine.enableSleeping)\n Sleeping.afterCollisions(pairs.list);\n\n // trigger collision events\n if (pairs.collisionStart.length > 0) {\n Events.trigger(engine, 'collisionStart', { \n pairs: pairs.collisionStart,\n timestamp: timing.timestamp,\n delta: delta\n });\n }\n\n // iteratively resolve position between collisions\n var positionDamping = Common.clamp(20 / engine.positionIterations, 0, 1);\n \n Resolver.preSolvePosition(pairs.list);\n for (i = 0; i < engine.positionIterations; i++) {\n Resolver.solvePosition(pairs.list, delta, positionDamping);\n }\n Resolver.postSolvePosition(allBodies);\n\n // update all constraints (second pass)\n Constraint.preSolveAll(allBodies);\n for (i = 0; i < engine.constraintIterations; i++) {\n Constraint.solveAll(allConstraints, delta);\n }\n Constraint.postSolveAll(allBodies);\n\n // iteratively resolve velocity between collisions\n Resolver.preSolveVelocity(pairs.list);\n for (i = 0; i < engine.velocityIterations; i++) {\n Resolver.solveVelocity(pairs.list, delta);\n }\n\n // update body speed and velocity properties\n Engine._bodiesUpdateVelocities(allBodies);\n\n // trigger collision events\n if (pairs.collisionActive.length > 0) {\n Events.trigger(engine, 'collisionActive', { \n pairs: pairs.collisionActive, \n timestamp: timing.timestamp,\n delta: delta\n });\n }\n\n if (pairs.collisionEnd.length > 0) {\n Events.trigger(engine, 'collisionEnd', {\n pairs: pairs.collisionEnd,\n timestamp: timing.timestamp,\n delta: delta\n });\n }\n\n // clear force buffers\n Engine._bodiesClearForces(allBodies);\n\n Events.trigger(engine, 'afterUpdate', event);\n\n // log the time elapsed computing this update\n engine.timing.lastElapsed = Common.now() - startTime;\n\n return engine;\n };\n \n /**\n * Merges two engines by keeping the configuration of `engineA` but replacing the world with the one from `engineB`.\n * @method merge\n * @param {engine} engineA\n * @param {engine} engineB\n */\n Engine.merge = function(engineA, engineB) {\n Common.extend(engineA, engineB);\n \n if (engineB.world) {\n engineA.world = engineB.world;\n\n Engine.clear(engineA);\n\n var bodies = Composite.allBodies(engineA.world);\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i];\n Sleeping.set(body, false);\n body.id = Common.nextId();\n }\n }\n };\n\n /**\n * Clears the engine pairs and detector.\n * @method clear\n * @param {engine} engine\n */\n Engine.clear = function(engine) {\n Pairs.clear(engine.pairs);\n Detector.clear(engine.detector);\n };\n\n /**\n * Zeroes the `body.force` and `body.torque` force buffers.\n * @method _bodiesClearForces\n * @private\n * @param {body[]} bodies\n */\n Engine._bodiesClearForces = function(bodies) {\n var bodiesLength = bodies.length;\n\n for (var i = 0; i < bodiesLength; i++) {\n var body = bodies[i];\n\n // reset force buffers\n body.force.x = 0;\n body.force.y = 0;\n body.torque = 0;\n }\n };\n\n /**\n * Applies gravitational acceleration to all `bodies`.\n * This models a [uniform gravitational field](https://en.wikipedia.org/wiki/Gravity_of_Earth), similar to near the surface of a planet.\n * \n * @method _bodiesApplyGravity\n * @private\n * @param {body[]} bodies\n * @param {vector} gravity\n */\n Engine._bodiesApplyGravity = function(bodies, gravity) {\n var gravityScale = typeof gravity.scale !== 'undefined' ? gravity.scale : 0.001,\n bodiesLength = bodies.length;\n\n if ((gravity.x === 0 && gravity.y === 0) || gravityScale === 0) {\n return;\n }\n \n for (var i = 0; i < bodiesLength; i++) {\n var body = bodies[i];\n\n if (body.isStatic || body.isSleeping)\n continue;\n\n // add the resultant force of gravity\n body.force.y += body.mass * gravity.y * gravityScale;\n body.force.x += body.mass * gravity.x * gravityScale;\n }\n };\n\n /**\n * Applies `Body.update` to all given `bodies`.\n * @method _bodiesUpdate\n * @private\n * @param {body[]} bodies\n * @param {number} delta The amount of time elapsed between updates\n */\n Engine._bodiesUpdate = function(bodies, delta) {\n var bodiesLength = bodies.length;\n\n for (var i = 0; i < bodiesLength; i++) {\n var body = bodies[i];\n\n if (body.isStatic || body.isSleeping)\n continue;\n\n Body.update(body, delta);\n }\n };\n\n /**\n * Applies `Body.updateVelocities` to all given `bodies`.\n * @method _bodiesUpdateVelocities\n * @private\n * @param {body[]} bodies\n */\n Engine._bodiesUpdateVelocities = function(bodies) {\n var bodiesLength = bodies.length;\n\n for (var i = 0; i < bodiesLength; i++) {\n Body.updateVelocities(bodies[i]);\n }\n };\n\n /**\n * A deprecated alias for `Runner.run`, use `Matter.Runner.run(engine)` instead and see `Matter.Runner` for more information.\n * @deprecated use Matter.Runner.run(engine) instead\n * @method run\n * @param {engine} engine\n */\n\n /**\n * Fired just before an update\n *\n * @event beforeUpdate\n * @param {object} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /**\n * Fired after bodies updated based on their velocity and forces, but before any collision detection, constraints and resolving etc.\n *\n * @event beforeSolve\n * @param {object} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /**\n * Fired after engine update and all collision events\n *\n * @event afterUpdate\n * @param {object} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /**\n * Fired after engine update, provides a list of all pairs that have started to collide in the current tick (if any)\n *\n * @event collisionStart\n * @param {object} event An event object\n * @param {pair[]} event.pairs List of affected pairs\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /**\n * Fired after engine update, provides a list of all pairs that are colliding in the current tick (if any)\n *\n * @event collisionActive\n * @param {object} event An event object\n * @param {pair[]} event.pairs List of affected pairs\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /**\n * Fired after engine update, provides a list of all pairs that have ended collision in the current tick (if any)\n *\n * @event collisionEnd\n * @param {object} event An event object\n * @param {pair[]} event.pairs List of affected pairs\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {number} event.delta The delta time in milliseconds value used in the update\n * @param {engine} event.source The source object of the event\n * @param {string} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * An integer `Number` that specifies the number of position iterations to perform each update.\n * The higher the value, the higher quality the simulation will be at the expense of performance.\n *\n * @property positionIterations\n * @type number\n * @default 6\n */\n\n /**\n * An integer `Number` that specifies the number of velocity iterations to perform each update.\n * The higher the value, the higher quality the simulation will be at the expense of performance.\n *\n * @property velocityIterations\n * @type number\n * @default 4\n */\n\n /**\n * An integer `Number` that specifies the number of constraint iterations to perform each update.\n * The higher the value, the higher quality the simulation will be at the expense of performance.\n * The default value of `2` is usually very adequate.\n *\n * @property constraintIterations\n * @type number\n * @default 2\n */\n\n /**\n * A flag that specifies whether the engine should allow sleeping via the `Matter.Sleeping` module.\n * Sleeping can improve stability and performance, but often at the expense of accuracy.\n *\n * @property enableSleeping\n * @type boolean\n * @default false\n */\n\n /**\n * An `Object` containing properties regarding the timing systems of the engine. \n *\n * @property timing\n * @type object\n */\n\n /**\n * A `Number` that specifies the global scaling factor of time for all bodies.\n * A value of `0` freezes the simulation.\n * A value of `0.1` gives a slow-motion effect.\n * A value of `1.2` gives a speed-up effect.\n *\n * @property timing.timeScale\n * @type number\n * @default 1\n */\n\n /**\n * A `Number` that specifies the current simulation-time in milliseconds starting from `0`. \n * It is incremented on every `Engine.update` by the given `delta` argument. \n * \n * @property timing.timestamp\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that represents the total execution time elapsed during the last `Engine.update` in milliseconds.\n * It is updated by timing from the start of the last `Engine.update` call until it ends.\n *\n * This value will also include the total execution time of all event handlers directly or indirectly triggered by the engine update.\n * \n * @property timing.lastElapsed\n * @type number\n * @default 0\n */\n\n /**\n * A `Number` that represents the `delta` value used in the last engine update.\n * \n * @property timing.lastDelta\n * @type number\n * @default 0\n */\n\n /**\n * A `Matter.Detector` instance.\n *\n * @property detector\n * @type detector\n * @default a Matter.Detector instance\n */\n\n /**\n * A `Matter.Grid` instance.\n *\n * @deprecated replaced by `engine.detector`\n * @property grid\n * @type grid\n * @default a Matter.Grid instance\n */\n\n /**\n * Replaced by and now alias for `engine.grid`.\n *\n * @deprecated replaced by `engine.detector`\n * @property broadphase\n * @type grid\n * @default a Matter.Grid instance\n */\n\n /**\n * The root `Matter.Composite` instance that will contain all bodies, constraints and other composites to be simulated by this engine.\n *\n * @property world\n * @type composite\n * @default a Matter.Composite instance\n */\n\n /**\n * An object reserved for storing plugin-specific properties.\n *\n * @property plugin\n * @type {}\n */\n\n /**\n * An optional gravitational acceleration applied to all bodies in `engine.world` on every update.\n * \n * This models a [uniform gravitational field](https://en.wikipedia.org/wiki/Gravity_of_Earth), similar to near the surface of a planet. For gravity in other contexts, disable this and apply forces as needed.\n * \n * To disable set the `scale` component to `0`.\n * \n * This is split into three components for ease of use: \n * a normalised direction (`x` and `y`) and magnitude (`scale`).\n *\n * @property gravity\n * @type object\n */\n\n /**\n * The gravitational direction normal `x` component, to be multiplied by `gravity.scale`.\n * \n * @property gravity.x\n * @type object\n * @default 0\n */\n\n /**\n * The gravitational direction normal `y` component, to be multiplied by `gravity.scale`.\n *\n * @property gravity.y\n * @type object\n * @default 1\n */\n\n /**\n * The magnitude of the gravitational acceleration.\n * \n * @property gravity.scale\n * @type object\n * @default 0.001\n */\n\n})();\n\n\n/***/ }),\n/* 18 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Resolver` module contains methods for resolving collision pairs.\n*\n* @class Resolver\n*/\n\nvar Resolver = {};\n\nmodule.exports = Resolver;\n\nvar Vertices = __webpack_require__(3);\nvar Common = __webpack_require__(0);\nvar Bounds = __webpack_require__(1);\n\n(function() {\n\n Resolver._restingThresh = 2;\n Resolver._restingThreshTangent = Math.sqrt(6);\n Resolver._positionDampen = 0.9;\n Resolver._positionWarming = 0.8;\n Resolver._frictionNormalMultiplier = 5;\n Resolver._frictionMaxStatic = Number.MAX_VALUE;\n\n /**\n * Prepare pairs for position solving.\n * @method preSolvePosition\n * @param {pair[]} pairs\n */\n Resolver.preSolvePosition = function(pairs) {\n var i,\n pair,\n contactCount,\n pairsLength = pairs.length;\n\n // find total contacts on each body\n for (i = 0; i < pairsLength; i++) {\n pair = pairs[i];\n \n if (!pair.isActive)\n continue;\n \n contactCount = pair.contactCount;\n pair.collision.parentA.totalContacts += contactCount;\n pair.collision.parentB.totalContacts += contactCount;\n }\n };\n\n /**\n * Find a solution for pair positions.\n * @method solvePosition\n * @param {pair[]} pairs\n * @param {number} delta\n * @param {number} [damping=1]\n */\n Resolver.solvePosition = function(pairs, delta, damping) {\n var i,\n pair,\n collision,\n bodyA,\n bodyB,\n normal,\n contactShare,\n positionImpulse,\n positionDampen = Resolver._positionDampen * (damping || 1),\n slopDampen = Common.clamp(delta / Common._baseDelta, 0, 1),\n pairsLength = pairs.length;\n\n // find impulses required to resolve penetration\n for (i = 0; i < pairsLength; i++) {\n pair = pairs[i];\n \n if (!pair.isActive || pair.isSensor)\n continue;\n\n collision = pair.collision;\n bodyA = collision.parentA;\n bodyB = collision.parentB;\n normal = collision.normal;\n\n // get current separation between body edges involved in collision\n pair.separation = \n collision.depth + normal.x * (bodyB.positionImpulse.x - bodyA.positionImpulse.x)\n + normal.y * (bodyB.positionImpulse.y - bodyA.positionImpulse.y);\n }\n \n for (i = 0; i < pairsLength; i++) {\n pair = pairs[i];\n\n if (!pair.isActive || pair.isSensor)\n continue;\n \n collision = pair.collision;\n bodyA = collision.parentA;\n bodyB = collision.parentB;\n normal = collision.normal;\n positionImpulse = pair.separation - pair.slop * slopDampen;\n\n if (bodyA.isStatic || bodyB.isStatic)\n positionImpulse *= 2;\n \n if (!(bodyA.isStatic || bodyA.isSleeping)) {\n contactShare = positionDampen / bodyA.totalContacts;\n bodyA.positionImpulse.x += normal.x * positionImpulse * contactShare;\n bodyA.positionImpulse.y += normal.y * positionImpulse * contactShare;\n }\n\n if (!(bodyB.isStatic || bodyB.isSleeping)) {\n contactShare = positionDampen / bodyB.totalContacts;\n bodyB.positionImpulse.x -= normal.x * positionImpulse * contactShare;\n bodyB.positionImpulse.y -= normal.y * positionImpulse * contactShare;\n }\n }\n };\n\n /**\n * Apply position resolution.\n * @method postSolvePosition\n * @param {body[]} bodies\n */\n Resolver.postSolvePosition = function(bodies) {\n var positionWarming = Resolver._positionWarming,\n bodiesLength = bodies.length,\n verticesTranslate = Vertices.translate,\n boundsUpdate = Bounds.update;\n\n for (var i = 0; i < bodiesLength; i++) {\n var body = bodies[i],\n positionImpulse = body.positionImpulse,\n positionImpulseX = positionImpulse.x,\n positionImpulseY = positionImpulse.y,\n velocity = body.velocity;\n\n // reset contact count\n body.totalContacts = 0;\n\n if (positionImpulseX !== 0 || positionImpulseY !== 0) {\n // update body geometry\n for (var j = 0; j < body.parts.length; j++) {\n var part = body.parts[j];\n verticesTranslate(part.vertices, positionImpulse);\n boundsUpdate(part.bounds, part.vertices, velocity);\n part.position.x += positionImpulseX;\n part.position.y += positionImpulseY;\n }\n\n // move the body without changing velocity\n body.positionPrev.x += positionImpulseX;\n body.positionPrev.y += positionImpulseY;\n\n if (positionImpulseX * velocity.x + positionImpulseY * velocity.y < 0) {\n // reset cached impulse if the body has velocity along it\n positionImpulse.x = 0;\n positionImpulse.y = 0;\n } else {\n // warm the next iteration\n positionImpulse.x *= positionWarming;\n positionImpulse.y *= positionWarming;\n }\n }\n }\n };\n\n /**\n * Prepare pairs for velocity solving.\n * @method preSolveVelocity\n * @param {pair[]} pairs\n */\n Resolver.preSolveVelocity = function(pairs) {\n var pairsLength = pairs.length,\n i,\n j;\n \n for (i = 0; i < pairsLength; i++) {\n var pair = pairs[i];\n \n if (!pair.isActive || pair.isSensor)\n continue;\n \n var contacts = pair.contacts,\n contactCount = pair.contactCount,\n collision = pair.collision,\n bodyA = collision.parentA,\n bodyB = collision.parentB,\n normal = collision.normal,\n tangent = collision.tangent;\n \n // resolve each contact\n for (j = 0; j < contactCount; j++) {\n var contact = contacts[j],\n contactVertex = contact.vertex,\n normalImpulse = contact.normalImpulse,\n tangentImpulse = contact.tangentImpulse;\n \n if (normalImpulse !== 0 || tangentImpulse !== 0) {\n // total impulse from contact\n var impulseX = normal.x * normalImpulse + tangent.x * tangentImpulse,\n impulseY = normal.y * normalImpulse + tangent.y * tangentImpulse;\n \n // apply impulse from contact\n if (!(bodyA.isStatic || bodyA.isSleeping)) {\n bodyA.positionPrev.x += impulseX * bodyA.inverseMass;\n bodyA.positionPrev.y += impulseY * bodyA.inverseMass;\n bodyA.anglePrev += bodyA.inverseInertia * (\n (contactVertex.x - bodyA.position.x) * impulseY\n - (contactVertex.y - bodyA.position.y) * impulseX\n );\n }\n \n if (!(bodyB.isStatic || bodyB.isSleeping)) {\n bodyB.positionPrev.x -= impulseX * bodyB.inverseMass;\n bodyB.positionPrev.y -= impulseY * bodyB.inverseMass;\n bodyB.anglePrev -= bodyB.inverseInertia * (\n (contactVertex.x - bodyB.position.x) * impulseY \n - (contactVertex.y - bodyB.position.y) * impulseX\n );\n }\n }\n }\n }\n };\n\n /**\n * Find a solution for pair velocities.\n * @method solveVelocity\n * @param {pair[]} pairs\n * @param {number} delta\n */\n Resolver.solveVelocity = function(pairs, delta) {\n var timeScale = delta / Common._baseDelta,\n timeScaleSquared = timeScale * timeScale,\n timeScaleCubed = timeScaleSquared * timeScale,\n restingThresh = -Resolver._restingThresh * timeScale,\n restingThreshTangent = Resolver._restingThreshTangent,\n frictionNormalMultiplier = Resolver._frictionNormalMultiplier * timeScale,\n frictionMaxStatic = Resolver._frictionMaxStatic,\n pairsLength = pairs.length,\n tangentImpulse,\n maxFriction,\n i,\n j;\n\n for (i = 0; i < pairsLength; i++) {\n var pair = pairs[i];\n \n if (!pair.isActive || pair.isSensor)\n continue;\n \n var collision = pair.collision,\n bodyA = collision.parentA,\n bodyB = collision.parentB,\n normalX = collision.normal.x,\n normalY = collision.normal.y,\n tangentX = collision.tangent.x,\n tangentY = collision.tangent.y,\n inverseMassTotal = pair.inverseMass,\n friction = pair.friction * pair.frictionStatic * frictionNormalMultiplier,\n contacts = pair.contacts,\n contactCount = pair.contactCount,\n contactShare = 1 / contactCount;\n\n // get body velocities\n var bodyAVelocityX = bodyA.position.x - bodyA.positionPrev.x,\n bodyAVelocityY = bodyA.position.y - bodyA.positionPrev.y,\n bodyAAngularVelocity = bodyA.angle - bodyA.anglePrev,\n bodyBVelocityX = bodyB.position.x - bodyB.positionPrev.x,\n bodyBVelocityY = bodyB.position.y - bodyB.positionPrev.y,\n bodyBAngularVelocity = bodyB.angle - bodyB.anglePrev;\n\n // resolve each contact\n for (j = 0; j < contactCount; j++) {\n var contact = contacts[j],\n contactVertex = contact.vertex;\n\n var offsetAX = contactVertex.x - bodyA.position.x,\n offsetAY = contactVertex.y - bodyA.position.y,\n offsetBX = contactVertex.x - bodyB.position.x,\n offsetBY = contactVertex.y - bodyB.position.y;\n \n var velocityPointAX = bodyAVelocityX - offsetAY * bodyAAngularVelocity,\n velocityPointAY = bodyAVelocityY + offsetAX * bodyAAngularVelocity,\n velocityPointBX = bodyBVelocityX - offsetBY * bodyBAngularVelocity,\n velocityPointBY = bodyBVelocityY + offsetBX * bodyBAngularVelocity;\n\n var relativeVelocityX = velocityPointAX - velocityPointBX,\n relativeVelocityY = velocityPointAY - velocityPointBY;\n\n var normalVelocity = normalX * relativeVelocityX + normalY * relativeVelocityY,\n tangentVelocity = tangentX * relativeVelocityX + tangentY * relativeVelocityY;\n\n // coulomb friction\n var normalOverlap = pair.separation + normalVelocity;\n var normalForce = Math.min(normalOverlap, 1);\n normalForce = normalOverlap < 0 ? 0 : normalForce;\n\n var frictionLimit = normalForce * friction;\n\n if (tangentVelocity < -frictionLimit || tangentVelocity > frictionLimit) {\n maxFriction = (tangentVelocity > 0 ? tangentVelocity : -tangentVelocity);\n tangentImpulse = pair.friction * (tangentVelocity > 0 ? 1 : -1) * timeScaleCubed;\n \n if (tangentImpulse < -maxFriction) {\n tangentImpulse = -maxFriction;\n } else if (tangentImpulse > maxFriction) {\n tangentImpulse = maxFriction;\n }\n } else {\n tangentImpulse = tangentVelocity;\n maxFriction = frictionMaxStatic;\n }\n\n // account for mass, inertia and contact offset\n var oAcN = offsetAX * normalY - offsetAY * normalX,\n oBcN = offsetBX * normalY - offsetBY * normalX,\n share = contactShare / (inverseMassTotal + bodyA.inverseInertia * oAcN * oAcN + bodyB.inverseInertia * oBcN * oBcN);\n\n // raw impulses\n var normalImpulse = (1 + pair.restitution) * normalVelocity * share;\n tangentImpulse *= share;\n\n // handle high velocity and resting collisions separately\n if (normalVelocity < restingThresh) {\n // high normal velocity so clear cached contact normal impulse\n contact.normalImpulse = 0;\n } else {\n // solve resting collision constraints using Erin Catto's method (GDC08)\n // impulse constraint tends to 0\n var contactNormalImpulse = contact.normalImpulse;\n contact.normalImpulse += normalImpulse;\n if (contact.normalImpulse > 0) contact.normalImpulse = 0;\n normalImpulse = contact.normalImpulse - contactNormalImpulse;\n }\n\n // handle high velocity and resting collisions separately\n if (tangentVelocity < -restingThreshTangent || tangentVelocity > restingThreshTangent) {\n // high tangent velocity so clear cached contact tangent impulse\n contact.tangentImpulse = 0;\n } else {\n // solve resting collision constraints using Erin Catto's method (GDC08)\n // tangent impulse tends to -tangentSpeed or +tangentSpeed\n var contactTangentImpulse = contact.tangentImpulse;\n contact.tangentImpulse += tangentImpulse;\n if (contact.tangentImpulse < -maxFriction) contact.tangentImpulse = -maxFriction;\n if (contact.tangentImpulse > maxFriction) contact.tangentImpulse = maxFriction;\n tangentImpulse = contact.tangentImpulse - contactTangentImpulse;\n }\n\n // total impulse from contact\n var impulseX = normalX * normalImpulse + tangentX * tangentImpulse,\n impulseY = normalY * normalImpulse + tangentY * tangentImpulse;\n \n // apply impulse from contact\n if (!(bodyA.isStatic || bodyA.isSleeping)) {\n bodyA.positionPrev.x += impulseX * bodyA.inverseMass;\n bodyA.positionPrev.y += impulseY * bodyA.inverseMass;\n bodyA.anglePrev += (offsetAX * impulseY - offsetAY * impulseX) * bodyA.inverseInertia;\n }\n\n if (!(bodyB.isStatic || bodyB.isSleeping)) {\n bodyB.positionPrev.x -= impulseX * bodyB.inverseMass;\n bodyB.positionPrev.y -= impulseY * bodyB.inverseMass;\n bodyB.anglePrev -= (offsetBX * impulseY - offsetBY * impulseX) * bodyB.inverseInertia;\n }\n }\n }\n };\n\n})();\n\n\n/***/ }),\n/* 19 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Pairs` module contains methods for creating and manipulating collision pair sets.\n*\n* @class Pairs\n*/\n\nvar Pairs = {};\n\nmodule.exports = Pairs;\n\nvar Pair = __webpack_require__(9);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Creates a new pairs structure.\n * @method create\n * @param {object} options\n * @return {pairs} A new pairs structure\n */\n Pairs.create = function(options) {\n return Common.extend({ \n table: {},\n list: [],\n collisionStart: [],\n collisionActive: [],\n collisionEnd: []\n }, options);\n };\n\n /**\n * Updates pairs given a list of collisions.\n * @method update\n * @param {object} pairs\n * @param {collision[]} collisions\n * @param {number} timestamp\n */\n Pairs.update = function(pairs, collisions, timestamp) {\n var pairUpdate = Pair.update,\n pairCreate = Pair.create,\n pairSetActive = Pair.setActive,\n pairsTable = pairs.table,\n pairsList = pairs.list,\n pairsListLength = pairsList.length,\n pairsListIndex = pairsListLength,\n collisionStart = pairs.collisionStart,\n collisionEnd = pairs.collisionEnd,\n collisionActive = pairs.collisionActive,\n collisionsLength = collisions.length,\n collisionStartIndex = 0,\n collisionEndIndex = 0,\n collisionActiveIndex = 0,\n collision,\n pair,\n i;\n\n for (i = 0; i < collisionsLength; i++) {\n collision = collisions[i];\n pair = collision.pair;\n\n if (pair) {\n // pair already exists (but may or may not be active)\n if (pair.isActive) {\n // pair exists and is active\n collisionActive[collisionActiveIndex++] = pair;\n }\n\n // update the pair\n pairUpdate(pair, collision, timestamp);\n } else {\n // pair did not exist, create a new pair\n pair = pairCreate(collision, timestamp);\n pairsTable[pair.id] = pair;\n\n // add the new pair\n collisionStart[collisionStartIndex++] = pair;\n pairsList[pairsListIndex++] = pair;\n }\n }\n\n // find pairs that are no longer active\n pairsListIndex = 0;\n pairsListLength = pairsList.length;\n\n for (i = 0; i < pairsListLength; i++) {\n pair = pairsList[i];\n \n // pair is active if updated this timestep\n if (pair.timeUpdated >= timestamp) {\n // keep active pairs\n pairsList[pairsListIndex++] = pair;\n } else {\n pairSetActive(pair, false, timestamp);\n\n // keep inactive pairs if both bodies may be sleeping\n if (pair.collision.bodyA.sleepCounter > 0 && pair.collision.bodyB.sleepCounter > 0) {\n pairsList[pairsListIndex++] = pair;\n } else {\n // remove inactive pairs if either body awake\n collisionEnd[collisionEndIndex++] = pair;\n delete pairsTable[pair.id];\n }\n }\n }\n\n // update array lengths if changed\n if (pairsList.length !== pairsListIndex) {\n pairsList.length = pairsListIndex;\n }\n\n if (collisionStart.length !== collisionStartIndex) {\n collisionStart.length = collisionStartIndex;\n }\n\n if (collisionEnd.length !== collisionEndIndex) {\n collisionEnd.length = collisionEndIndex;\n }\n\n if (collisionActive.length !== collisionActiveIndex) {\n collisionActive.length = collisionActiveIndex;\n }\n };\n\n /**\n * Clears the given pairs structure.\n * @method clear\n * @param {pairs} pairs\n * @return {pairs} pairs\n */\n Pairs.clear = function(pairs) {\n pairs.table = {};\n pairs.list.length = 0;\n pairs.collisionStart.length = 0;\n pairs.collisionActive.length = 0;\n pairs.collisionEnd.length = 0;\n return pairs;\n };\n\n})();\n\n\n/***/ }),\n/* 20 */\n/***/ (function(module, exports, __webpack_require__) {\n\nvar Matter = module.exports = __webpack_require__(21);\r\n\r\nMatter.Axes = __webpack_require__(11);\r\nMatter.Bodies = __webpack_require__(12);\r\nMatter.Body = __webpack_require__(4);\r\nMatter.Bounds = __webpack_require__(1);\r\nMatter.Collision = __webpack_require__(8);\r\nMatter.Common = __webpack_require__(0);\r\nMatter.Composite = __webpack_require__(6);\r\nMatter.Composites = __webpack_require__(22);\r\nMatter.Constraint = __webpack_require__(10);\r\nMatter.Contact = __webpack_require__(16);\r\nMatter.Detector = __webpack_require__(13);\r\nMatter.Engine = __webpack_require__(17);\r\nMatter.Events = __webpack_require__(5);\r\nMatter.Grid = __webpack_require__(23);\r\nMatter.Mouse = __webpack_require__(14);\r\nMatter.MouseConstraint = __webpack_require__(24);\r\nMatter.Pair = __webpack_require__(9);\r\nMatter.Pairs = __webpack_require__(19);\r\nMatter.Plugin = __webpack_require__(15);\r\nMatter.Query = __webpack_require__(25);\r\nMatter.Render = __webpack_require__(26);\r\nMatter.Resolver = __webpack_require__(18);\r\nMatter.Runner = __webpack_require__(27);\r\nMatter.SAT = __webpack_require__(28);\r\nMatter.Sleeping = __webpack_require__(7);\r\nMatter.Svg = __webpack_require__(29);\r\nMatter.Vector = __webpack_require__(2);\r\nMatter.Vertices = __webpack_require__(3);\r\nMatter.World = __webpack_require__(30);\r\n\r\n// temporary back compatibility\r\nMatter.Engine.run = Matter.Runner.run;\r\nMatter.Common.deprecated(Matter.Engine, 'run', 'Engine.run ➤ use Matter.Runner.run(engine) instead');\r\n\n\n/***/ }),\n/* 21 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\r\n* The `Matter` module is the top level namespace. It also includes a function for installing plugins on top of the library.\r\n*\r\n* @class Matter\r\n*/\r\n\r\nvar Matter = {};\r\n\r\nmodule.exports = Matter;\r\n\r\nvar Plugin = __webpack_require__(15);\r\nvar Common = __webpack_require__(0);\r\n\r\n(function() {\r\n\r\n /**\r\n * The library name.\r\n * @property name\r\n * @readOnly\r\n * @type {String}\r\n */\r\n Matter.name = 'matter-js';\r\n\r\n /**\r\n * The library version.\r\n * @property version\r\n * @readOnly\r\n * @type {String}\r\n */\r\n Matter.version = true ? \"0.20.0\" : undefined;\r\n\r\n /**\r\n * A list of plugin dependencies to be installed. These are normally set and installed through `Matter.use`.\r\n * Alternatively you may set `Matter.uses` manually and install them by calling `Plugin.use(Matter)`.\r\n * @property uses\r\n * @type {Array}\r\n */\r\n Matter.uses = [];\r\n\r\n /**\r\n * The plugins that have been installed through `Matter.Plugin.install`. Read only.\r\n * @property used\r\n * @readOnly\r\n * @type {Array}\r\n */\r\n Matter.used = [];\r\n\r\n /**\r\n * Installs the given plugins on the `Matter` namespace.\r\n * This is a short-hand for `Plugin.use`, see it for more information.\r\n * Call this function once at the start of your code, with all of the plugins you wish to install as arguments.\r\n * Avoid calling this function multiple times unless you intend to manually control installation order.\r\n * @method use\r\n * @param ...plugin {Function} The plugin(s) to install on `base` (multi-argument).\r\n */\r\n Matter.use = function() {\r\n Plugin.use(Matter, Array.prototype.slice.call(arguments));\r\n };\r\n\r\n /**\r\n * Chains a function to excute before the original function on the given `path` relative to `Matter`.\r\n * See also docs for `Common.chain`.\r\n * @method before\r\n * @param {string} path The path relative to `Matter`\r\n * @param {function} func The function to chain before the original\r\n * @return {function} The chained function that replaced the original\r\n */\r\n Matter.before = function(path, func) {\r\n path = path.replace(/^Matter./, '');\r\n return Common.chainPathBefore(Matter, path, func);\r\n };\r\n\r\n /**\r\n * Chains a function to excute after the original function on the given `path` relative to `Matter`.\r\n * See also docs for `Common.chain`.\r\n * @method after\r\n * @param {string} path The path relative to `Matter`\r\n * @param {function} func The function to chain after the original\r\n * @return {function} The chained function that replaced the original\r\n */\r\n Matter.after = function(path, func) {\r\n path = path.replace(/^Matter./, '');\r\n return Common.chainPathAfter(Matter, path, func);\r\n };\r\n\r\n})();\r\n\n\n/***/ }),\n/* 22 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Composites` module contains factory methods for creating composite bodies\n* with commonly used configurations (such as stacks and chains).\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Composites\n*/\n\nvar Composites = {};\n\nmodule.exports = Composites;\n\nvar Composite = __webpack_require__(6);\nvar Constraint = __webpack_require__(10);\nvar Common = __webpack_require__(0);\nvar Body = __webpack_require__(4);\nvar Bodies = __webpack_require__(12);\nvar deprecated = Common.deprecated;\n\n(function() {\n\n /**\n * Create a new composite containing bodies created in the callback in a grid arrangement.\n * This function uses the body's bounds to prevent overlaps.\n * @method stack\n * @param {number} x Starting position in X.\n * @param {number} y Starting position in Y.\n * @param {number} columns\n * @param {number} rows\n * @param {number} columnGap\n * @param {number} rowGap\n * @param {function} callback\n * @return {composite} A new composite containing objects created in the callback\n */\n Composites.stack = function(x, y, columns, rows, columnGap, rowGap, callback) {\n var stack = Composite.create({ label: 'Stack' }),\n currentX = x,\n currentY = y,\n lastBody,\n i = 0;\n\n for (var row = 0; row < rows; row++) {\n var maxHeight = 0;\n \n for (var column = 0; column < columns; column++) {\n var body = callback(currentX, currentY, column, row, lastBody, i);\n \n if (body) {\n var bodyHeight = body.bounds.max.y - body.bounds.min.y,\n bodyWidth = body.bounds.max.x - body.bounds.min.x; \n\n if (bodyHeight > maxHeight)\n maxHeight = bodyHeight;\n \n Body.translate(body, { x: bodyWidth * 0.5, y: bodyHeight * 0.5 });\n\n currentX = body.bounds.max.x + columnGap;\n\n Composite.addBody(stack, body);\n \n lastBody = body;\n i += 1;\n } else {\n currentX += columnGap;\n }\n }\n \n currentY += maxHeight + rowGap;\n currentX = x;\n }\n\n return stack;\n };\n \n /**\n * Chains all bodies in the given composite together using constraints.\n * @method chain\n * @param {composite} composite\n * @param {number} xOffsetA\n * @param {number} yOffsetA\n * @param {number} xOffsetB\n * @param {number} yOffsetB\n * @param {object} options\n * @return {composite} A new composite containing objects chained together with constraints\n */\n Composites.chain = function(composite, xOffsetA, yOffsetA, xOffsetB, yOffsetB, options) {\n var bodies = composite.bodies;\n \n for (var i = 1; i < bodies.length; i++) {\n var bodyA = bodies[i - 1],\n bodyB = bodies[i],\n bodyAHeight = bodyA.bounds.max.y - bodyA.bounds.min.y,\n bodyAWidth = bodyA.bounds.max.x - bodyA.bounds.min.x, \n bodyBHeight = bodyB.bounds.max.y - bodyB.bounds.min.y,\n bodyBWidth = bodyB.bounds.max.x - bodyB.bounds.min.x;\n \n var defaults = {\n bodyA: bodyA,\n pointA: { x: bodyAWidth * xOffsetA, y: bodyAHeight * yOffsetA },\n bodyB: bodyB,\n pointB: { x: bodyBWidth * xOffsetB, y: bodyBHeight * yOffsetB }\n };\n \n var constraint = Common.extend(defaults, options);\n \n Composite.addConstraint(composite, Constraint.create(constraint));\n }\n\n composite.label += ' Chain';\n \n return composite;\n };\n\n /**\n * Connects bodies in the composite with constraints in a grid pattern, with optional cross braces.\n * @method mesh\n * @param {composite} composite\n * @param {number} columns\n * @param {number} rows\n * @param {boolean} crossBrace\n * @param {object} options\n * @return {composite} The composite containing objects meshed together with constraints\n */\n Composites.mesh = function(composite, columns, rows, crossBrace, options) {\n var bodies = composite.bodies,\n row,\n col,\n bodyA,\n bodyB,\n bodyC;\n \n for (row = 0; row < rows; row++) {\n for (col = 1; col < columns; col++) {\n bodyA = bodies[(col - 1) + (row * columns)];\n bodyB = bodies[col + (row * columns)];\n Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));\n }\n\n if (row > 0) {\n for (col = 0; col < columns; col++) {\n bodyA = bodies[col + ((row - 1) * columns)];\n bodyB = bodies[col + (row * columns)];\n Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyA, bodyB: bodyB }, options)));\n\n if (crossBrace && col > 0) {\n bodyC = bodies[(col - 1) + ((row - 1) * columns)];\n Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));\n }\n\n if (crossBrace && col < columns - 1) {\n bodyC = bodies[(col + 1) + ((row - 1) * columns)];\n Composite.addConstraint(composite, Constraint.create(Common.extend({ bodyA: bodyC, bodyB: bodyB }, options)));\n }\n }\n }\n }\n\n composite.label += ' Mesh';\n \n return composite;\n };\n \n /**\n * Create a new composite containing bodies created in the callback in a pyramid arrangement.\n * This function uses the body's bounds to prevent overlaps.\n * @method pyramid\n * @param {number} x Starting position in X.\n * @param {number} y Starting position in Y.\n * @param {number} columns\n * @param {number} rows\n * @param {number} columnGap\n * @param {number} rowGap\n * @param {function} callback\n * @return {composite} A new composite containing objects created in the callback\n */\n Composites.pyramid = function(x, y, columns, rows, columnGap, rowGap, callback) {\n return Composites.stack(x, y, columns, rows, columnGap, rowGap, function(stackX, stackY, column, row, lastBody, i) {\n var actualRows = Math.min(rows, Math.ceil(columns / 2)),\n lastBodyWidth = lastBody ? lastBody.bounds.max.x - lastBody.bounds.min.x : 0;\n \n if (row > actualRows)\n return;\n \n // reverse row order\n row = actualRows - row;\n \n var start = row,\n end = columns - 1 - row;\n\n if (column < start || column > end)\n return;\n \n // retroactively fix the first body's position, since width was unknown\n if (i === 1) {\n Body.translate(lastBody, { x: (column + (columns % 2 === 1 ? 1 : -1)) * lastBodyWidth, y: 0 });\n }\n\n var xOffset = lastBody ? column * lastBodyWidth : 0;\n \n return callback(x + xOffset + column * columnGap, stackY, column, row, lastBody, i);\n });\n };\n\n /**\n * This has now moved to the [newtonsCradle example](https://github.com/liabru/matter-js/blob/master/examples/newtonsCradle.js), follow that instead as this function is deprecated here.\n * @deprecated moved to newtonsCradle example\n * @method newtonsCradle\n * @param {number} x Starting position in X.\n * @param {number} y Starting position in Y.\n * @param {number} number\n * @param {number} size\n * @param {number} length\n * @return {composite} A new composite newtonsCradle body\n */\n Composites.newtonsCradle = function(x, y, number, size, length) {\n var newtonsCradle = Composite.create({ label: 'Newtons Cradle' });\n\n for (var i = 0; i < number; i++) {\n var separation = 1.9,\n circle = Bodies.circle(x + i * (size * separation), y + length, size, \n { inertia: Infinity, restitution: 1, friction: 0, frictionAir: 0.0001, slop: 1 }),\n constraint = Constraint.create({ pointA: { x: x + i * (size * separation), y: y }, bodyB: circle });\n\n Composite.addBody(newtonsCradle, circle);\n Composite.addConstraint(newtonsCradle, constraint);\n }\n\n return newtonsCradle;\n };\n\n deprecated(Composites, 'newtonsCradle', 'Composites.newtonsCradle ➤ moved to newtonsCradle example');\n \n /**\n * This has now moved to the [car example](https://github.com/liabru/matter-js/blob/master/examples/car.js), follow that instead as this function is deprecated here.\n * @deprecated moved to car example\n * @method car\n * @param {number} x Starting position in X.\n * @param {number} y Starting position in Y.\n * @param {number} width\n * @param {number} height\n * @param {number} wheelSize\n * @return {composite} A new composite car body\n */\n Composites.car = function(x, y, width, height, wheelSize) {\n var group = Body.nextGroup(true),\n wheelBase = 20,\n wheelAOffset = -width * 0.5 + wheelBase,\n wheelBOffset = width * 0.5 - wheelBase,\n wheelYOffset = 0;\n \n var car = Composite.create({ label: 'Car' }),\n body = Bodies.rectangle(x, y, width, height, { \n collisionFilter: {\n group: group\n },\n chamfer: {\n radius: height * 0.5\n },\n density: 0.0002\n });\n \n var wheelA = Bodies.circle(x + wheelAOffset, y + wheelYOffset, wheelSize, { \n collisionFilter: {\n group: group\n },\n friction: 0.8\n });\n \n var wheelB = Bodies.circle(x + wheelBOffset, y + wheelYOffset, wheelSize, { \n collisionFilter: {\n group: group\n },\n friction: 0.8\n });\n \n var axelA = Constraint.create({\n bodyB: body,\n pointB: { x: wheelAOffset, y: wheelYOffset },\n bodyA: wheelA,\n stiffness: 1,\n length: 0\n });\n \n var axelB = Constraint.create({\n bodyB: body,\n pointB: { x: wheelBOffset, y: wheelYOffset },\n bodyA: wheelB,\n stiffness: 1,\n length: 0\n });\n \n Composite.addBody(car, body);\n Composite.addBody(car, wheelA);\n Composite.addBody(car, wheelB);\n Composite.addConstraint(car, axelA);\n Composite.addConstraint(car, axelB);\n\n return car;\n };\n\n deprecated(Composites, 'car', 'Composites.car ➤ moved to car example');\n\n /**\n * This has now moved to the [softBody example](https://github.com/liabru/matter-js/blob/master/examples/softBody.js)\n * and the [cloth example](https://github.com/liabru/matter-js/blob/master/examples/cloth.js), follow those instead as this function is deprecated here.\n * @deprecated moved to softBody and cloth examples\n * @method softBody\n * @param {number} x Starting position in X.\n * @param {number} y Starting position in Y.\n * @param {number} columns\n * @param {number} rows\n * @param {number} columnGap\n * @param {number} rowGap\n * @param {boolean} crossBrace\n * @param {number} particleRadius\n * @param {} particleOptions\n * @param {} constraintOptions\n * @return {composite} A new composite softBody\n */\n Composites.softBody = function(x, y, columns, rows, columnGap, rowGap, crossBrace, particleRadius, particleOptions, constraintOptions) {\n particleOptions = Common.extend({ inertia: Infinity }, particleOptions);\n constraintOptions = Common.extend({ stiffness: 0.2, render: { type: 'line', anchors: false } }, constraintOptions);\n\n var softBody = Composites.stack(x, y, columns, rows, columnGap, rowGap, function(stackX, stackY) {\n return Bodies.circle(stackX, stackY, particleRadius, particleOptions);\n });\n\n Composites.mesh(softBody, columns, rows, crossBrace, constraintOptions);\n\n softBody.label = 'Soft Body';\n\n return softBody;\n };\n\n deprecated(Composites, 'softBody', 'Composites.softBody ➤ moved to softBody and cloth examples');\n})();\n\n\n/***/ }),\n/* 23 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* This module has now been replaced by `Matter.Detector`.\n*\n* All usage should be migrated to `Matter.Detector` or another alternative.\n* For back-compatibility purposes this module will remain for a short term and then later removed in a future release.\n*\n* The `Matter.Grid` module contains methods for creating and manipulating collision broadphase grid structures.\n*\n* @class Grid\n* @deprecated\n*/\n\nvar Grid = {};\n\nmodule.exports = Grid;\n\nvar Pair = __webpack_require__(9);\nvar Common = __webpack_require__(0);\nvar deprecated = Common.deprecated;\n\n(function() {\n\n /**\n * Creates a new grid.\n * @deprecated replaced by Matter.Detector\n * @method create\n * @param {} options\n * @return {grid} A new grid\n */\n Grid.create = function(options) {\n var defaults = {\n buckets: {},\n pairs: {},\n pairsList: [],\n bucketWidth: 48,\n bucketHeight: 48\n };\n\n return Common.extend(defaults, options);\n };\n\n /**\n * The width of a single grid bucket.\n *\n * @property bucketWidth\n * @type number\n * @default 48\n */\n\n /**\n * The height of a single grid bucket.\n *\n * @property bucketHeight\n * @type number\n * @default 48\n */\n\n /**\n * Updates the grid.\n * @deprecated replaced by Matter.Detector\n * @method update\n * @param {grid} grid\n * @param {body[]} bodies\n * @param {engine} engine\n * @param {boolean} forceUpdate\n */\n Grid.update = function(grid, bodies, engine, forceUpdate) {\n var i, col, row,\n world = engine.world,\n buckets = grid.buckets,\n bucket,\n bucketId,\n gridChanged = false;\n\n for (i = 0; i < bodies.length; i++) {\n var body = bodies[i];\n\n if (body.isSleeping && !forceUpdate)\n continue;\n\n // temporary back compatibility bounds check\n if (world.bounds && (body.bounds.max.x < world.bounds.min.x || body.bounds.min.x > world.bounds.max.x\n || body.bounds.max.y < world.bounds.min.y || body.bounds.min.y > world.bounds.max.y))\n continue;\n\n var newRegion = Grid._getRegion(grid, body);\n\n // if the body has changed grid region\n if (!body.region || newRegion.id !== body.region.id || forceUpdate) {\n\n if (!body.region || forceUpdate)\n body.region = newRegion;\n\n var union = Grid._regionUnion(newRegion, body.region);\n\n // update grid buckets affected by region change\n // iterate over the union of both regions\n for (col = union.startCol; col <= union.endCol; col++) {\n for (row = union.startRow; row <= union.endRow; row++) {\n bucketId = Grid._getBucketId(col, row);\n bucket = buckets[bucketId];\n\n var isInsideNewRegion = (col >= newRegion.startCol && col <= newRegion.endCol\n && row >= newRegion.startRow && row <= newRegion.endRow);\n\n var isInsideOldRegion = (col >= body.region.startCol && col <= body.region.endCol\n && row >= body.region.startRow && row <= body.region.endRow);\n\n // remove from old region buckets\n if (!isInsideNewRegion && isInsideOldRegion) {\n if (isInsideOldRegion) {\n if (bucket)\n Grid._bucketRemoveBody(grid, bucket, body);\n }\n }\n\n // add to new region buckets\n if (body.region === newRegion || (isInsideNewRegion && !isInsideOldRegion) || forceUpdate) {\n if (!bucket)\n bucket = Grid._createBucket(buckets, bucketId);\n Grid._bucketAddBody(grid, bucket, body);\n }\n }\n }\n\n // set the new region\n body.region = newRegion;\n\n // flag changes so we can update pairs\n gridChanged = true;\n }\n }\n\n // update pairs list only if pairs changed (i.e. a body changed region)\n if (gridChanged)\n grid.pairsList = Grid._createActivePairsList(grid);\n };\n\n deprecated(Grid, 'update', 'Grid.update ➤ replaced by Matter.Detector');\n\n /**\n * Clears the grid.\n * @deprecated replaced by Matter.Detector\n * @method clear\n * @param {grid} grid\n */\n Grid.clear = function(grid) {\n grid.buckets = {};\n grid.pairs = {};\n grid.pairsList = [];\n };\n\n deprecated(Grid, 'clear', 'Grid.clear ➤ replaced by Matter.Detector');\n\n /**\n * Finds the union of two regions.\n * @method _regionUnion\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} regionA\n * @param {} regionB\n * @return {} region\n */\n Grid._regionUnion = function(regionA, regionB) {\n var startCol = Math.min(regionA.startCol, regionB.startCol),\n endCol = Math.max(regionA.endCol, regionB.endCol),\n startRow = Math.min(regionA.startRow, regionB.startRow),\n endRow = Math.max(regionA.endRow, regionB.endRow);\n\n return Grid._createRegion(startCol, endCol, startRow, endRow);\n };\n\n /**\n * Gets the region a given body falls in for a given grid.\n * @method _getRegion\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} grid\n * @param {} body\n * @return {} region\n */\n Grid._getRegion = function(grid, body) {\n var bounds = body.bounds,\n startCol = Math.floor(bounds.min.x / grid.bucketWidth),\n endCol = Math.floor(bounds.max.x / grid.bucketWidth),\n startRow = Math.floor(bounds.min.y / grid.bucketHeight),\n endRow = Math.floor(bounds.max.y / grid.bucketHeight);\n\n return Grid._createRegion(startCol, endCol, startRow, endRow);\n };\n\n /**\n * Creates a region.\n * @method _createRegion\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} startCol\n * @param {} endCol\n * @param {} startRow\n * @param {} endRow\n * @return {} region\n */\n Grid._createRegion = function(startCol, endCol, startRow, endRow) {\n return { \n id: startCol + ',' + endCol + ',' + startRow + ',' + endRow,\n startCol: startCol, \n endCol: endCol, \n startRow: startRow, \n endRow: endRow \n };\n };\n\n /**\n * Gets the bucket id at the given position.\n * @method _getBucketId\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} column\n * @param {} row\n * @return {string} bucket id\n */\n Grid._getBucketId = function(column, row) {\n return 'C' + column + 'R' + row;\n };\n\n /**\n * Creates a bucket.\n * @method _createBucket\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} buckets\n * @param {} bucketId\n * @return {} bucket\n */\n Grid._createBucket = function(buckets, bucketId) {\n var bucket = buckets[bucketId] = [];\n return bucket;\n };\n\n /**\n * Adds a body to a bucket.\n * @method _bucketAddBody\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} grid\n * @param {} bucket\n * @param {} body\n */\n Grid._bucketAddBody = function(grid, bucket, body) {\n var gridPairs = grid.pairs,\n pairId = Pair.id,\n bucketLength = bucket.length,\n i;\n\n // add new pairs\n for (i = 0; i < bucketLength; i++) {\n var bodyB = bucket[i];\n\n if (body.id === bodyB.id || (body.isStatic && bodyB.isStatic))\n continue;\n\n // keep track of the number of buckets the pair exists in\n // important for Grid.update to work\n var id = pairId(body, bodyB),\n pair = gridPairs[id];\n\n if (pair) {\n pair[2] += 1;\n } else {\n gridPairs[id] = [body, bodyB, 1];\n }\n }\n\n // add to bodies (after pairs, otherwise pairs with self)\n bucket.push(body);\n };\n\n /**\n * Removes a body from a bucket.\n * @method _bucketRemoveBody\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} grid\n * @param {} bucket\n * @param {} body\n */\n Grid._bucketRemoveBody = function(grid, bucket, body) {\n var gridPairs = grid.pairs,\n pairId = Pair.id,\n i;\n\n // remove from bucket\n bucket.splice(Common.indexOf(bucket, body), 1);\n\n var bucketLength = bucket.length;\n\n // update pair counts\n for (i = 0; i < bucketLength; i++) {\n // keep track of the number of buckets the pair exists in\n // important for _createActivePairsList to work\n var pair = gridPairs[pairId(body, bucket[i])];\n\n if (pair)\n pair[2] -= 1;\n }\n };\n\n /**\n * Generates a list of the active pairs in the grid.\n * @method _createActivePairsList\n * @deprecated replaced by Matter.Detector\n * @private\n * @param {} grid\n * @return [] pairs\n */\n Grid._createActivePairsList = function(grid) {\n var pair,\n gridPairs = grid.pairs,\n pairKeys = Common.keys(gridPairs),\n pairKeysLength = pairKeys.length,\n pairs = [],\n k;\n\n // iterate over grid.pairs\n for (k = 0; k < pairKeysLength; k++) {\n pair = gridPairs[pairKeys[k]];\n\n // if pair exists in at least one bucket\n // it is a pair that needs further collision testing so push it\n if (pair[2] > 0) {\n pairs.push(pair);\n } else {\n delete gridPairs[pairKeys[k]];\n }\n }\n\n return pairs;\n };\n \n})();\n\n\n/***/ }),\n/* 24 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.MouseConstraint` module contains methods for creating mouse constraints.\n* Mouse constraints are used for allowing user interaction, providing the ability to move bodies via the mouse or touch.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class MouseConstraint\n*/\n\nvar MouseConstraint = {};\n\nmodule.exports = MouseConstraint;\n\nvar Vertices = __webpack_require__(3);\nvar Sleeping = __webpack_require__(7);\nvar Mouse = __webpack_require__(14);\nvar Events = __webpack_require__(5);\nvar Detector = __webpack_require__(13);\nvar Constraint = __webpack_require__(10);\nvar Composite = __webpack_require__(6);\nvar Common = __webpack_require__(0);\nvar Bounds = __webpack_require__(1);\n\n(function() {\n\n /**\n * Creates a new mouse constraint.\n * All properties have default values, and many are pre-calculated automatically based on other properties.\n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {engine} engine\n * @param {} options\n * @return {MouseConstraint} A new MouseConstraint\n */\n MouseConstraint.create = function(engine, options) {\n var mouse = (engine ? engine.mouse : null) || (options ? options.mouse : null);\n\n if (!mouse) {\n if (engine && engine.render && engine.render.canvas) {\n mouse = Mouse.create(engine.render.canvas);\n } else if (options && options.element) {\n mouse = Mouse.create(options.element);\n } else {\n mouse = Mouse.create();\n Common.warn('MouseConstraint.create: options.mouse was undefined, options.element was undefined, may not function as expected');\n }\n }\n\n var constraint = Constraint.create({ \n label: 'Mouse Constraint',\n pointA: mouse.position,\n pointB: { x: 0, y: 0 },\n length: 0.01, \n stiffness: 0.1,\n angularStiffness: 1,\n render: {\n strokeStyle: '#90EE90',\n lineWidth: 3\n }\n });\n\n var defaults = {\n type: 'mouseConstraint',\n mouse: mouse,\n element: null,\n body: null,\n constraint: constraint,\n collisionFilter: {\n category: 0x0001,\n mask: 0xFFFFFFFF,\n group: 0\n }\n };\n\n var mouseConstraint = Common.extend(defaults, options);\n\n Events.on(engine, 'beforeUpdate', function() {\n var allBodies = Composite.allBodies(engine.world);\n MouseConstraint.update(mouseConstraint, allBodies);\n MouseConstraint._triggerEvents(mouseConstraint);\n });\n\n return mouseConstraint;\n };\n\n /**\n * Updates the given mouse constraint.\n * @private\n * @method update\n * @param {MouseConstraint} mouseConstraint\n * @param {body[]} bodies\n */\n MouseConstraint.update = function(mouseConstraint, bodies) {\n var mouse = mouseConstraint.mouse,\n constraint = mouseConstraint.constraint,\n body = mouseConstraint.body;\n\n if (mouse.button === 0) {\n if (!constraint.bodyB) {\n for (var i = 0; i < bodies.length; i++) {\n body = bodies[i];\n if (Bounds.contains(body.bounds, mouse.position) \n && Detector.canCollide(body.collisionFilter, mouseConstraint.collisionFilter)) {\n for (var j = body.parts.length > 1 ? 1 : 0; j < body.parts.length; j++) {\n var part = body.parts[j];\n if (Vertices.contains(part.vertices, mouse.position)) {\n constraint.pointA = mouse.position;\n constraint.bodyB = mouseConstraint.body = body;\n constraint.pointB = { x: mouse.position.x - body.position.x, y: mouse.position.y - body.position.y };\n constraint.angleB = body.angle;\n\n Sleeping.set(body, false);\n Events.trigger(mouseConstraint, 'startdrag', { mouse: mouse, body: body });\n\n break;\n }\n }\n }\n }\n } else {\n Sleeping.set(constraint.bodyB, false);\n constraint.pointA = mouse.position;\n }\n } else {\n constraint.bodyB = mouseConstraint.body = null;\n constraint.pointB = null;\n\n if (body)\n Events.trigger(mouseConstraint, 'enddrag', { mouse: mouse, body: body });\n }\n };\n\n /**\n * Triggers mouse constraint events.\n * @method _triggerEvents\n * @private\n * @param {mouse} mouseConstraint\n */\n MouseConstraint._triggerEvents = function(mouseConstraint) {\n var mouse = mouseConstraint.mouse,\n mouseEvents = mouse.sourceEvents;\n\n if (mouseEvents.mousemove)\n Events.trigger(mouseConstraint, 'mousemove', { mouse: mouse });\n\n if (mouseEvents.mousedown)\n Events.trigger(mouseConstraint, 'mousedown', { mouse: mouse });\n\n if (mouseEvents.mouseup)\n Events.trigger(mouseConstraint, 'mouseup', { mouse: mouse });\n\n // reset the mouse state ready for the next step\n Mouse.clearSourceEvents(mouse);\n };\n\n /*\n *\n * Events Documentation\n *\n */\n\n /**\n * Fired when the mouse has moved (or a touch moves) during the last step\n *\n * @event mousemove\n * @param {} event An event object\n * @param {mouse} event.mouse The engine's mouse instance\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when the mouse is down (or a touch has started) during the last step\n *\n * @event mousedown\n * @param {} event An event object\n * @param {mouse} event.mouse The engine's mouse instance\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when the mouse is up (or a touch has ended) during the last step\n *\n * @event mouseup\n * @param {} event An event object\n * @param {mouse} event.mouse The engine's mouse instance\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when the user starts dragging a body\n *\n * @event startdrag\n * @param {} event An event object\n * @param {mouse} event.mouse The engine's mouse instance\n * @param {body} event.body The body being dragged\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired when the user ends dragging a body\n *\n * @event enddrag\n * @param {} event An event object\n * @param {mouse} event.mouse The engine's mouse instance\n * @param {body} event.body The body that has stopped being dragged\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * A `String` denoting the type of object.\n *\n * @property type\n * @type string\n * @default \"constraint\"\n * @readOnly\n */\n\n /**\n * The `Mouse` instance in use. If not supplied in `MouseConstraint.create`, one will be created.\n *\n * @property mouse\n * @type mouse\n * @default mouse\n */\n\n /**\n * The `Body` that is currently being moved by the user, or `null` if no body.\n *\n * @property body\n * @type body\n * @default null\n */\n\n /**\n * The `Constraint` object that is used to move the body during interaction.\n *\n * @property constraint\n * @type constraint\n */\n\n /**\n * An `Object` that specifies the collision filter properties.\n * The collision filter allows the user to define which types of body this mouse constraint can interact with.\n * See `body.collisionFilter` for more information.\n *\n * @property collisionFilter\n * @type object\n */\n\n})();\n\n\n/***/ }),\n/* 25 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Query` module contains methods for performing collision queries.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Query\n*/\n\nvar Query = {};\n\nmodule.exports = Query;\n\nvar Vector = __webpack_require__(2);\nvar Collision = __webpack_require__(8);\nvar Bounds = __webpack_require__(1);\nvar Bodies = __webpack_require__(12);\nvar Vertices = __webpack_require__(3);\n\n(function() {\n\n /**\n * Returns a list of collisions between `body` and `bodies`.\n * @method collides\n * @param {body} body\n * @param {body[]} bodies\n * @return {collision[]} Collisions\n */\n Query.collides = function(body, bodies) {\n var collisions = [],\n bodiesLength = bodies.length,\n bounds = body.bounds,\n collides = Collision.collides,\n overlaps = Bounds.overlaps;\n\n for (var i = 0; i < bodiesLength; i++) {\n var bodyA = bodies[i],\n partsALength = bodyA.parts.length,\n partsAStart = partsALength === 1 ? 0 : 1;\n \n if (overlaps(bodyA.bounds, bounds)) {\n for (var j = partsAStart; j < partsALength; j++) {\n var part = bodyA.parts[j];\n\n if (overlaps(part.bounds, bounds)) {\n var collision = collides(part, body);\n\n if (collision) {\n collisions.push(collision);\n break;\n }\n }\n }\n }\n }\n\n return collisions;\n };\n\n /**\n * Casts a ray segment against a set of bodies and returns all collisions, ray width is optional. Intersection points are not provided.\n * @method ray\n * @param {body[]} bodies\n * @param {vector} startPoint\n * @param {vector} endPoint\n * @param {number} [rayWidth]\n * @return {collision[]} Collisions\n */\n Query.ray = function(bodies, startPoint, endPoint, rayWidth) {\n rayWidth = rayWidth || 1e-100;\n\n var rayAngle = Vector.angle(startPoint, endPoint),\n rayLength = Vector.magnitude(Vector.sub(startPoint, endPoint)),\n rayX = (endPoint.x + startPoint.x) * 0.5,\n rayY = (endPoint.y + startPoint.y) * 0.5,\n ray = Bodies.rectangle(rayX, rayY, rayLength, rayWidth, { angle: rayAngle }),\n collisions = Query.collides(ray, bodies);\n\n for (var i = 0; i < collisions.length; i += 1) {\n var collision = collisions[i];\n collision.body = collision.bodyB = collision.bodyA; \n }\n\n return collisions;\n };\n\n /**\n * Returns all bodies whose bounds are inside (or outside if set) the given set of bounds, from the given set of bodies.\n * @method region\n * @param {body[]} bodies\n * @param {bounds} bounds\n * @param {bool} [outside=false]\n * @return {body[]} The bodies matching the query\n */\n Query.region = function(bodies, bounds, outside) {\n var result = [];\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n overlaps = Bounds.overlaps(body.bounds, bounds);\n if ((overlaps && !outside) || (!overlaps && outside))\n result.push(body);\n }\n\n return result;\n };\n\n /**\n * Returns all bodies whose vertices contain the given point, from the given set of bodies.\n * @method point\n * @param {body[]} bodies\n * @param {vector} point\n * @return {body[]} The bodies matching the query\n */\n Query.point = function(bodies, point) {\n var result = [];\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i];\n \n if (Bounds.contains(body.bounds, point)) {\n for (var j = body.parts.length === 1 ? 0 : 1; j < body.parts.length; j++) {\n var part = body.parts[j];\n\n if (Bounds.contains(part.bounds, point)\n && Vertices.contains(part.vertices, point)) {\n result.push(body);\n break;\n }\n }\n }\n }\n\n return result;\n };\n\n})();\n\n\n/***/ }),\n/* 26 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Render` module is a lightweight, optional utility which provides a simple canvas based renderer for visualising instances of `Matter.Engine`.\n* It is intended for development and debugging purposes, but may also be suitable for simple games.\n* It includes a number of drawing options including wireframe, vector with support for sprites and viewports.\n*\n* @class Render\n*/\n\nvar Render = {};\n\nmodule.exports = Render;\n\nvar Body = __webpack_require__(4);\nvar Common = __webpack_require__(0);\nvar Composite = __webpack_require__(6);\nvar Bounds = __webpack_require__(1);\nvar Events = __webpack_require__(5);\nvar Vector = __webpack_require__(2);\nvar Mouse = __webpack_require__(14);\n\n(function() {\n\n var _requestAnimationFrame,\n _cancelAnimationFrame;\n\n if (typeof window !== 'undefined') {\n _requestAnimationFrame = window.requestAnimationFrame || window.webkitRequestAnimationFrame\n || window.mozRequestAnimationFrame || window.msRequestAnimationFrame\n || function(callback){ window.setTimeout(function() { callback(Common.now()); }, 1000 / 60); };\n\n _cancelAnimationFrame = window.cancelAnimationFrame || window.mozCancelAnimationFrame\n || window.webkitCancelAnimationFrame || window.msCancelAnimationFrame;\n }\n\n Render._goodFps = 30;\n Render._goodDelta = 1000 / 60;\n\n /**\n * Creates a new renderer. The options parameter is an object that specifies any properties you wish to override the defaults.\n * All properties have default values, and many are pre-calculated automatically based on other properties.\n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {object} [options]\n * @return {render} A new renderer\n */\n Render.create = function(options) {\n var defaults = {\n engine: null,\n element: null,\n canvas: null,\n mouse: null,\n frameRequestId: null,\n timing: {\n historySize: 60,\n delta: 0,\n deltaHistory: [],\n lastTime: 0,\n lastTimestamp: 0,\n lastElapsed: 0,\n timestampElapsed: 0,\n timestampElapsedHistory: [],\n engineDeltaHistory: [],\n engineElapsedHistory: [],\n engineUpdatesHistory: [],\n elapsedHistory: []\n },\n options: {\n width: 800,\n height: 600,\n pixelRatio: 1,\n background: '#14151f',\n wireframeBackground: '#14151f',\n wireframeStrokeStyle: '#bbb',\n hasBounds: !!options.bounds,\n enabled: true,\n wireframes: true,\n showSleeping: true,\n showDebug: false,\n showStats: false,\n showPerformance: false,\n showBounds: false,\n showVelocity: false,\n showCollisions: false,\n showSeparations: false,\n showAxes: false,\n showPositions: false,\n showAngleIndicator: false,\n showIds: false,\n showVertexNumbers: false,\n showConvexHulls: false,\n showInternalEdges: false,\n showMousePosition: false\n }\n };\n\n var render = Common.extend(defaults, options);\n\n if (render.canvas) {\n render.canvas.width = render.options.width || render.canvas.width;\n render.canvas.height = render.options.height || render.canvas.height;\n }\n\n render.mouse = options.mouse;\n render.engine = options.engine;\n render.canvas = render.canvas || _createCanvas(render.options.width, render.options.height);\n render.context = render.canvas.getContext('2d');\n render.textures = {};\n\n render.bounds = render.bounds || {\n min: {\n x: 0,\n y: 0\n },\n max: {\n x: render.canvas.width,\n y: render.canvas.height\n }\n };\n\n // for temporary back compatibility only\n render.controller = Render;\n render.options.showBroadphase = false;\n\n if (render.options.pixelRatio !== 1) {\n Render.setPixelRatio(render, render.options.pixelRatio);\n }\n\n if (Common.isElement(render.element)) {\n render.element.appendChild(render.canvas);\n }\n\n return render;\n };\n\n /**\n * Continuously updates the render canvas on the `requestAnimationFrame` event.\n * @method run\n * @param {render} render\n */\n Render.run = function(render) {\n (function loop(time){\n render.frameRequestId = _requestAnimationFrame(loop);\n \n _updateTiming(render, time);\n\n Render.world(render, time);\n\n render.context.setTransform(render.options.pixelRatio, 0, 0, render.options.pixelRatio, 0, 0);\n\n if (render.options.showStats || render.options.showDebug) {\n Render.stats(render, render.context, time);\n }\n\n if (render.options.showPerformance || render.options.showDebug) {\n Render.performance(render, render.context, time);\n }\n\n render.context.setTransform(1, 0, 0, 1, 0, 0);\n })();\n };\n\n /**\n * Ends execution of `Render.run` on the given `render`, by canceling the animation frame request event loop.\n * @method stop\n * @param {render} render\n */\n Render.stop = function(render) {\n _cancelAnimationFrame(render.frameRequestId);\n };\n\n /**\n * Sets the pixel ratio of the renderer and updates the canvas.\n * To automatically detect the correct ratio, pass the string `'auto'` for `pixelRatio`.\n * @method setPixelRatio\n * @param {render} render\n * @param {number} pixelRatio\n */\n Render.setPixelRatio = function(render, pixelRatio) {\n var options = render.options,\n canvas = render.canvas;\n\n if (pixelRatio === 'auto') {\n pixelRatio = _getPixelRatio(canvas);\n }\n\n options.pixelRatio = pixelRatio;\n canvas.setAttribute('data-pixel-ratio', pixelRatio);\n canvas.width = options.width * pixelRatio;\n canvas.height = options.height * pixelRatio;\n canvas.style.width = options.width + 'px';\n canvas.style.height = options.height + 'px';\n };\n\n /**\n * Sets the render `width` and `height`.\n * \n * Updates the canvas accounting for `render.options.pixelRatio`. \n * \n * Updates the bottom right render bound `render.bounds.max` relative to the provided `width` and `height`.\n * The top left render bound `render.bounds.min` isn't changed.\n * \n * Follow this call with `Render.lookAt` if you need to change the render bounds.\n * \n * See also `Render.setPixelRatio`.\n * @method setSize\n * @param {render} render\n * @param {number} width The width (in CSS pixels)\n * @param {number} height The height (in CSS pixels)\n */\n Render.setSize = function(render, width, height) {\n render.options.width = width;\n render.options.height = height;\n render.bounds.max.x = render.bounds.min.x + width;\n render.bounds.max.y = render.bounds.min.y + height;\n\n if (render.options.pixelRatio !== 1) {\n Render.setPixelRatio(render, render.options.pixelRatio);\n } else {\n render.canvas.width = width;\n render.canvas.height = height;\n }\n };\n\n /**\n * Positions and sizes the viewport around the given object bounds.\n * Objects must have at least one of the following properties:\n * - `object.bounds`\n * - `object.position`\n * - `object.min` and `object.max`\n * - `object.x` and `object.y`\n * @method lookAt\n * @param {render} render\n * @param {object[]} objects\n * @param {vector} [padding]\n * @param {bool} [center=true]\n */\n Render.lookAt = function(render, objects, padding, center) {\n center = typeof center !== 'undefined' ? center : true;\n objects = Common.isArray(objects) ? objects : [objects];\n padding = padding || {\n x: 0,\n y: 0\n };\n\n // find bounds of all objects\n var bounds = {\n min: { x: Infinity, y: Infinity },\n max: { x: -Infinity, y: -Infinity }\n };\n\n for (var i = 0; i < objects.length; i += 1) {\n var object = objects[i],\n min = object.bounds ? object.bounds.min : (object.min || object.position || object),\n max = object.bounds ? object.bounds.max : (object.max || object.position || object);\n\n if (min && max) {\n if (min.x < bounds.min.x)\n bounds.min.x = min.x;\n\n if (max.x > bounds.max.x)\n bounds.max.x = max.x;\n\n if (min.y < bounds.min.y)\n bounds.min.y = min.y;\n\n if (max.y > bounds.max.y)\n bounds.max.y = max.y;\n }\n }\n\n // find ratios\n var width = (bounds.max.x - bounds.min.x) + 2 * padding.x,\n height = (bounds.max.y - bounds.min.y) + 2 * padding.y,\n viewHeight = render.canvas.height,\n viewWidth = render.canvas.width,\n outerRatio = viewWidth / viewHeight,\n innerRatio = width / height,\n scaleX = 1,\n scaleY = 1;\n\n // find scale factor\n if (innerRatio > outerRatio) {\n scaleY = innerRatio / outerRatio;\n } else {\n scaleX = outerRatio / innerRatio;\n }\n\n // enable bounds\n render.options.hasBounds = true;\n\n // position and size\n render.bounds.min.x = bounds.min.x;\n render.bounds.max.x = bounds.min.x + width * scaleX;\n render.bounds.min.y = bounds.min.y;\n render.bounds.max.y = bounds.min.y + height * scaleY;\n\n // center\n if (center) {\n render.bounds.min.x += width * 0.5 - (width * scaleX) * 0.5;\n render.bounds.max.x += width * 0.5 - (width * scaleX) * 0.5;\n render.bounds.min.y += height * 0.5 - (height * scaleY) * 0.5;\n render.bounds.max.y += height * 0.5 - (height * scaleY) * 0.5;\n }\n\n // padding\n render.bounds.min.x -= padding.x;\n render.bounds.max.x -= padding.x;\n render.bounds.min.y -= padding.y;\n render.bounds.max.y -= padding.y;\n\n // update mouse\n if (render.mouse) {\n Mouse.setScale(render.mouse, {\n x: (render.bounds.max.x - render.bounds.min.x) / render.canvas.width,\n y: (render.bounds.max.y - render.bounds.min.y) / render.canvas.height\n });\n\n Mouse.setOffset(render.mouse, render.bounds.min);\n }\n };\n\n /**\n * Applies viewport transforms based on `render.bounds` to a render context.\n * @method startViewTransform\n * @param {render} render\n */\n Render.startViewTransform = function(render) {\n var boundsWidth = render.bounds.max.x - render.bounds.min.x,\n boundsHeight = render.bounds.max.y - render.bounds.min.y,\n boundsScaleX = boundsWidth / render.options.width,\n boundsScaleY = boundsHeight / render.options.height;\n\n render.context.setTransform(\n render.options.pixelRatio / boundsScaleX, 0, 0, \n render.options.pixelRatio / boundsScaleY, 0, 0\n );\n \n render.context.translate(-render.bounds.min.x, -render.bounds.min.y);\n };\n\n /**\n * Resets all transforms on the render context.\n * @method endViewTransform\n * @param {render} render\n */\n Render.endViewTransform = function(render) {\n render.context.setTransform(render.options.pixelRatio, 0, 0, render.options.pixelRatio, 0, 0);\n };\n\n /**\n * Renders the given `engine`'s `Matter.World` object.\n * This is the entry point for all rendering and should be called every time the scene changes.\n * @method world\n * @param {render} render\n */\n Render.world = function(render, time) {\n var startTime = Common.now(),\n engine = render.engine,\n world = engine.world,\n canvas = render.canvas,\n context = render.context,\n options = render.options,\n timing = render.timing;\n\n var allBodies = Composite.allBodies(world),\n allConstraints = Composite.allConstraints(world),\n background = options.wireframes ? options.wireframeBackground : options.background,\n bodies = [],\n constraints = [],\n i;\n\n var event = {\n timestamp: engine.timing.timestamp\n };\n\n Events.trigger(render, 'beforeRender', event);\n\n // apply background if it has changed\n if (render.currentBackground !== background)\n _applyBackground(render, background);\n\n // clear the canvas with a transparent fill, to allow the canvas background to show\n context.globalCompositeOperation = 'source-in';\n context.fillStyle = \"transparent\";\n context.fillRect(0, 0, canvas.width, canvas.height);\n context.globalCompositeOperation = 'source-over';\n\n // handle bounds\n if (options.hasBounds) {\n // filter out bodies that are not in view\n for (i = 0; i < allBodies.length; i++) {\n var body = allBodies[i];\n if (Bounds.overlaps(body.bounds, render.bounds))\n bodies.push(body);\n }\n\n // filter out constraints that are not in view\n for (i = 0; i < allConstraints.length; i++) {\n var constraint = allConstraints[i],\n bodyA = constraint.bodyA,\n bodyB = constraint.bodyB,\n pointAWorld = constraint.pointA,\n pointBWorld = constraint.pointB;\n\n if (bodyA) pointAWorld = Vector.add(bodyA.position, constraint.pointA);\n if (bodyB) pointBWorld = Vector.add(bodyB.position, constraint.pointB);\n\n if (!pointAWorld || !pointBWorld)\n continue;\n\n if (Bounds.contains(render.bounds, pointAWorld) || Bounds.contains(render.bounds, pointBWorld))\n constraints.push(constraint);\n }\n\n // transform the view\n Render.startViewTransform(render);\n\n // update mouse\n if (render.mouse) {\n Mouse.setScale(render.mouse, {\n x: (render.bounds.max.x - render.bounds.min.x) / render.options.width,\n y: (render.bounds.max.y - render.bounds.min.y) / render.options.height\n });\n\n Mouse.setOffset(render.mouse, render.bounds.min);\n }\n } else {\n constraints = allConstraints;\n bodies = allBodies;\n\n if (render.options.pixelRatio !== 1) {\n render.context.setTransform(render.options.pixelRatio, 0, 0, render.options.pixelRatio, 0, 0);\n }\n }\n\n if (!options.wireframes || (engine.enableSleeping && options.showSleeping)) {\n // fully featured rendering of bodies\n Render.bodies(render, bodies, context);\n } else {\n if (options.showConvexHulls)\n Render.bodyConvexHulls(render, bodies, context);\n\n // optimised method for wireframes only\n Render.bodyWireframes(render, bodies, context);\n }\n\n if (options.showBounds)\n Render.bodyBounds(render, bodies, context);\n\n if (options.showAxes || options.showAngleIndicator)\n Render.bodyAxes(render, bodies, context);\n\n if (options.showPositions)\n Render.bodyPositions(render, bodies, context);\n\n if (options.showVelocity)\n Render.bodyVelocity(render, bodies, context);\n\n if (options.showIds)\n Render.bodyIds(render, bodies, context);\n\n if (options.showSeparations)\n Render.separations(render, engine.pairs.list, context);\n\n if (options.showCollisions)\n Render.collisions(render, engine.pairs.list, context);\n\n if (options.showVertexNumbers)\n Render.vertexNumbers(render, bodies, context);\n\n if (options.showMousePosition)\n Render.mousePosition(render, render.mouse, context);\n\n Render.constraints(constraints, context);\n\n if (options.hasBounds) {\n // revert view transforms\n Render.endViewTransform(render);\n }\n\n Events.trigger(render, 'afterRender', event);\n\n // log the time elapsed computing this update\n timing.lastElapsed = Common.now() - startTime;\n };\n\n /**\n * Renders statistics about the engine and world useful for debugging.\n * @private\n * @method stats\n * @param {render} render\n * @param {RenderingContext} context\n * @param {Number} time\n */\n Render.stats = function(render, context, time) {\n var engine = render.engine,\n world = engine.world,\n bodies = Composite.allBodies(world),\n parts = 0,\n width = 55,\n height = 44,\n x = 0,\n y = 0;\n \n // count parts\n for (var i = 0; i < bodies.length; i += 1) {\n parts += bodies[i].parts.length;\n }\n\n // sections\n var sections = {\n 'Part': parts,\n 'Body': bodies.length,\n 'Cons': Composite.allConstraints(world).length,\n 'Comp': Composite.allComposites(world).length,\n 'Pair': engine.pairs.list.length\n };\n\n // background\n context.fillStyle = '#0e0f19';\n context.fillRect(x, y, width * 5.5, height);\n\n context.font = '12px Arial';\n context.textBaseline = 'top';\n context.textAlign = 'right';\n\n // sections\n for (var key in sections) {\n var section = sections[key];\n // label\n context.fillStyle = '#aaa';\n context.fillText(key, x + width, y + 8);\n\n // value\n context.fillStyle = '#eee';\n context.fillText(section, x + width, y + 26);\n\n x += width;\n }\n };\n\n /**\n * Renders engine and render performance information.\n * @private\n * @method performance\n * @param {render} render\n * @param {RenderingContext} context\n */\n Render.performance = function(render, context) {\n var engine = render.engine,\n timing = render.timing,\n deltaHistory = timing.deltaHistory,\n elapsedHistory = timing.elapsedHistory,\n timestampElapsedHistory = timing.timestampElapsedHistory,\n engineDeltaHistory = timing.engineDeltaHistory,\n engineUpdatesHistory = timing.engineUpdatesHistory,\n engineElapsedHistory = timing.engineElapsedHistory,\n lastEngineUpdatesPerFrame = engine.timing.lastUpdatesPerFrame,\n lastEngineDelta = engine.timing.lastDelta;\n \n var deltaMean = _mean(deltaHistory),\n elapsedMean = _mean(elapsedHistory),\n engineDeltaMean = _mean(engineDeltaHistory),\n engineUpdatesMean = _mean(engineUpdatesHistory),\n engineElapsedMean = _mean(engineElapsedHistory),\n timestampElapsedMean = _mean(timestampElapsedHistory),\n rateMean = (timestampElapsedMean / deltaMean) || 0,\n neededUpdatesPerFrame = Math.round(deltaMean / lastEngineDelta),\n fps = (1000 / deltaMean) || 0;\n\n var graphHeight = 4,\n gap = 12,\n width = 60,\n height = 34,\n x = 10,\n y = 69;\n\n // background\n context.fillStyle = '#0e0f19';\n context.fillRect(0, 50, gap * 5 + width * 6 + 22, height);\n\n // show FPS\n Render.status(\n context, x, y, width, graphHeight, deltaHistory.length, \n Math.round(fps) + ' fps', \n fps / Render._goodFps,\n function(i) { return (deltaHistory[i] / deltaMean) - 1; }\n );\n\n // show engine delta\n Render.status(\n context, x + gap + width, y, width, graphHeight, engineDeltaHistory.length,\n lastEngineDelta.toFixed(2) + ' dt', \n Render._goodDelta / lastEngineDelta,\n function(i) { return (engineDeltaHistory[i] / engineDeltaMean) - 1; }\n );\n\n // show engine updates per frame\n Render.status(\n context, x + (gap + width) * 2, y, width, graphHeight, engineUpdatesHistory.length,\n lastEngineUpdatesPerFrame + ' upf', \n Math.pow(Common.clamp((engineUpdatesMean / neededUpdatesPerFrame) || 1, 0, 1), 4),\n function(i) { return (engineUpdatesHistory[i] / engineUpdatesMean) - 1; }\n );\n\n // show engine update time\n Render.status(\n context, x + (gap + width) * 3, y, width, graphHeight, engineElapsedHistory.length,\n engineElapsedMean.toFixed(2) + ' ut', \n 1 - (lastEngineUpdatesPerFrame * engineElapsedMean / Render._goodFps),\n function(i) { return (engineElapsedHistory[i] / engineElapsedMean) - 1; }\n );\n\n // show render time\n Render.status(\n context, x + (gap + width) * 4, y, width, graphHeight, elapsedHistory.length,\n elapsedMean.toFixed(2) + ' rt', \n 1 - (elapsedMean / Render._goodFps),\n function(i) { return (elapsedHistory[i] / elapsedMean) - 1; }\n );\n\n // show effective speed\n Render.status(\n context, x + (gap + width) * 5, y, width, graphHeight, timestampElapsedHistory.length, \n rateMean.toFixed(2) + ' x', \n rateMean * rateMean * rateMean,\n function(i) { return (((timestampElapsedHistory[i] / deltaHistory[i]) / rateMean) || 0) - 1; }\n );\n };\n\n /**\n * Renders a label, indicator and a chart.\n * @private\n * @method status\n * @param {RenderingContext} context\n * @param {number} x\n * @param {number} y\n * @param {number} width\n * @param {number} height\n * @param {number} count\n * @param {string} label\n * @param {string} indicator\n * @param {function} plotY\n */\n Render.status = function(context, x, y, width, height, count, label, indicator, plotY) {\n // background\n context.strokeStyle = '#888';\n context.fillStyle = '#444';\n context.lineWidth = 1;\n context.fillRect(x, y + 7, width, 1);\n\n // chart\n context.beginPath();\n context.moveTo(x, y + 7 - height * Common.clamp(0.4 * plotY(0), -2, 2));\n for (var i = 0; i < width; i += 1) {\n context.lineTo(x + i, y + 7 - (i < count ? height * Common.clamp(0.4 * plotY(i), -2, 2) : 0));\n }\n context.stroke();\n\n // indicator\n context.fillStyle = 'hsl(' + Common.clamp(25 + 95 * indicator, 0, 120) + ',100%,60%)';\n context.fillRect(x, y - 7, 4, 4);\n\n // label\n context.font = '12px Arial';\n context.textBaseline = 'middle';\n context.textAlign = 'right';\n context.fillStyle = '#eee';\n context.fillText(label, x + width, y - 5);\n };\n\n /**\n * Description\n * @private\n * @method constraints\n * @param {constraint[]} constraints\n * @param {RenderingContext} context\n */\n Render.constraints = function(constraints, context) {\n var c = context;\n\n for (var i = 0; i < constraints.length; i++) {\n var constraint = constraints[i];\n\n if (!constraint.render.visible || !constraint.pointA || !constraint.pointB)\n continue;\n\n var bodyA = constraint.bodyA,\n bodyB = constraint.bodyB,\n start,\n end;\n\n if (bodyA) {\n start = Vector.add(bodyA.position, constraint.pointA);\n } else {\n start = constraint.pointA;\n }\n\n if (constraint.render.type === 'pin') {\n c.beginPath();\n c.arc(start.x, start.y, 3, 0, 2 * Math.PI);\n c.closePath();\n } else {\n if (bodyB) {\n end = Vector.add(bodyB.position, constraint.pointB);\n } else {\n end = constraint.pointB;\n }\n\n c.beginPath();\n c.moveTo(start.x, start.y);\n\n if (constraint.render.type === 'spring') {\n var delta = Vector.sub(end, start),\n normal = Vector.perp(Vector.normalise(delta)),\n coils = Math.ceil(Common.clamp(constraint.length / 5, 12, 20)),\n offset;\n\n for (var j = 1; j < coils; j += 1) {\n offset = j % 2 === 0 ? 1 : -1;\n\n c.lineTo(\n start.x + delta.x * (j / coils) + normal.x * offset * 4,\n start.y + delta.y * (j / coils) + normal.y * offset * 4\n );\n }\n }\n\n c.lineTo(end.x, end.y);\n }\n\n if (constraint.render.lineWidth) {\n c.lineWidth = constraint.render.lineWidth;\n c.strokeStyle = constraint.render.strokeStyle;\n c.stroke();\n }\n\n if (constraint.render.anchors) {\n c.fillStyle = constraint.render.strokeStyle;\n c.beginPath();\n c.arc(start.x, start.y, 3, 0, 2 * Math.PI);\n c.arc(end.x, end.y, 3, 0, 2 * Math.PI);\n c.closePath();\n c.fill();\n }\n }\n };\n\n /**\n * Description\n * @private\n * @method bodies\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodies = function(render, bodies, context) {\n var c = context,\n engine = render.engine,\n options = render.options,\n showInternalEdges = options.showInternalEdges || !options.wireframes,\n body,\n part,\n i,\n k;\n\n for (i = 0; i < bodies.length; i++) {\n body = bodies[i];\n\n if (!body.render.visible)\n continue;\n\n // handle compound parts\n for (k = body.parts.length > 1 ? 1 : 0; k < body.parts.length; k++) {\n part = body.parts[k];\n\n if (!part.render.visible)\n continue;\n\n if (options.showSleeping && body.isSleeping) {\n c.globalAlpha = 0.5 * part.render.opacity;\n } else if (part.render.opacity !== 1) {\n c.globalAlpha = part.render.opacity;\n }\n\n if (part.render.sprite && part.render.sprite.texture && !options.wireframes) {\n // part sprite\n var sprite = part.render.sprite,\n texture = _getTexture(render, sprite.texture);\n\n c.translate(part.position.x, part.position.y);\n c.rotate(part.angle);\n\n c.drawImage(\n texture,\n texture.width * -sprite.xOffset * sprite.xScale,\n texture.height * -sprite.yOffset * sprite.yScale,\n texture.width * sprite.xScale,\n texture.height * sprite.yScale\n );\n\n // revert translation, hopefully faster than save / restore\n c.rotate(-part.angle);\n c.translate(-part.position.x, -part.position.y);\n } else {\n // part polygon\n if (part.circleRadius) {\n c.beginPath();\n c.arc(part.position.x, part.position.y, part.circleRadius, 0, 2 * Math.PI);\n } else {\n c.beginPath();\n c.moveTo(part.vertices[0].x, part.vertices[0].y);\n\n for (var j = 1; j < part.vertices.length; j++) {\n if (!part.vertices[j - 1].isInternal || showInternalEdges) {\n c.lineTo(part.vertices[j].x, part.vertices[j].y);\n } else {\n c.moveTo(part.vertices[j].x, part.vertices[j].y);\n }\n\n if (part.vertices[j].isInternal && !showInternalEdges) {\n c.moveTo(part.vertices[(j + 1) % part.vertices.length].x, part.vertices[(j + 1) % part.vertices.length].y);\n }\n }\n\n c.lineTo(part.vertices[0].x, part.vertices[0].y);\n c.closePath();\n }\n\n if (!options.wireframes) {\n c.fillStyle = part.render.fillStyle;\n\n if (part.render.lineWidth) {\n c.lineWidth = part.render.lineWidth;\n c.strokeStyle = part.render.strokeStyle;\n c.stroke();\n }\n\n c.fill();\n } else {\n c.lineWidth = 1;\n c.strokeStyle = render.options.wireframeStrokeStyle;\n c.stroke();\n }\n }\n\n c.globalAlpha = 1;\n }\n }\n };\n\n /**\n * Optimised method for drawing body wireframes in one pass\n * @private\n * @method bodyWireframes\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyWireframes = function(render, bodies, context) {\n var c = context,\n showInternalEdges = render.options.showInternalEdges,\n body,\n part,\n i,\n j,\n k;\n\n c.beginPath();\n\n // render all bodies\n for (i = 0; i < bodies.length; i++) {\n body = bodies[i];\n\n if (!body.render.visible)\n continue;\n\n // handle compound parts\n for (k = body.parts.length > 1 ? 1 : 0; k < body.parts.length; k++) {\n part = body.parts[k];\n\n c.moveTo(part.vertices[0].x, part.vertices[0].y);\n\n for (j = 1; j < part.vertices.length; j++) {\n if (!part.vertices[j - 1].isInternal || showInternalEdges) {\n c.lineTo(part.vertices[j].x, part.vertices[j].y);\n } else {\n c.moveTo(part.vertices[j].x, part.vertices[j].y);\n }\n\n if (part.vertices[j].isInternal && !showInternalEdges) {\n c.moveTo(part.vertices[(j + 1) % part.vertices.length].x, part.vertices[(j + 1) % part.vertices.length].y);\n }\n }\n\n c.lineTo(part.vertices[0].x, part.vertices[0].y);\n }\n }\n\n c.lineWidth = 1;\n c.strokeStyle = render.options.wireframeStrokeStyle;\n c.stroke();\n };\n\n /**\n * Optimised method for drawing body convex hull wireframes in one pass\n * @private\n * @method bodyConvexHulls\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyConvexHulls = function(render, bodies, context) {\n var c = context,\n body,\n part,\n i,\n j,\n k;\n\n c.beginPath();\n\n // render convex hulls\n for (i = 0; i < bodies.length; i++) {\n body = bodies[i];\n\n if (!body.render.visible || body.parts.length === 1)\n continue;\n\n c.moveTo(body.vertices[0].x, body.vertices[0].y);\n\n for (j = 1; j < body.vertices.length; j++) {\n c.lineTo(body.vertices[j].x, body.vertices[j].y);\n }\n\n c.lineTo(body.vertices[0].x, body.vertices[0].y);\n }\n\n c.lineWidth = 1;\n c.strokeStyle = 'rgba(255,255,255,0.2)';\n c.stroke();\n };\n\n /**\n * Renders body vertex numbers.\n * @private\n * @method vertexNumbers\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.vertexNumbers = function(render, bodies, context) {\n var c = context,\n i,\n j,\n k;\n\n for (i = 0; i < bodies.length; i++) {\n var parts = bodies[i].parts;\n for (k = parts.length > 1 ? 1 : 0; k < parts.length; k++) {\n var part = parts[k];\n for (j = 0; j < part.vertices.length; j++) {\n c.fillStyle = 'rgba(255,255,255,0.2)';\n c.fillText(i + '_' + j, part.position.x + (part.vertices[j].x - part.position.x) * 0.8, part.position.y + (part.vertices[j].y - part.position.y) * 0.8);\n }\n }\n }\n };\n\n /**\n * Renders mouse position.\n * @private\n * @method mousePosition\n * @param {render} render\n * @param {mouse} mouse\n * @param {RenderingContext} context\n */\n Render.mousePosition = function(render, mouse, context) {\n var c = context;\n c.fillStyle = 'rgba(255,255,255,0.8)';\n c.fillText(mouse.position.x + ' ' + mouse.position.y, mouse.position.x + 5, mouse.position.y - 5);\n };\n\n /**\n * Draws body bounds\n * @private\n * @method bodyBounds\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyBounds = function(render, bodies, context) {\n var c = context,\n engine = render.engine,\n options = render.options;\n\n c.beginPath();\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i];\n\n if (body.render.visible) {\n var parts = bodies[i].parts;\n for (var j = parts.length > 1 ? 1 : 0; j < parts.length; j++) {\n var part = parts[j];\n c.rect(part.bounds.min.x, part.bounds.min.y, part.bounds.max.x - part.bounds.min.x, part.bounds.max.y - part.bounds.min.y);\n }\n }\n }\n\n if (options.wireframes) {\n c.strokeStyle = 'rgba(255,255,255,0.08)';\n } else {\n c.strokeStyle = 'rgba(0,0,0,0.1)';\n }\n\n c.lineWidth = 1;\n c.stroke();\n };\n\n /**\n * Draws body angle indicators and axes\n * @private\n * @method bodyAxes\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyAxes = function(render, bodies, context) {\n var c = context,\n engine = render.engine,\n options = render.options,\n part,\n i,\n j,\n k;\n\n c.beginPath();\n\n for (i = 0; i < bodies.length; i++) {\n var body = bodies[i],\n parts = body.parts;\n\n if (!body.render.visible)\n continue;\n\n if (options.showAxes) {\n // render all axes\n for (j = parts.length > 1 ? 1 : 0; j < parts.length; j++) {\n part = parts[j];\n for (k = 0; k < part.axes.length; k++) {\n var axis = part.axes[k];\n c.moveTo(part.position.x, part.position.y);\n c.lineTo(part.position.x + axis.x * 20, part.position.y + axis.y * 20);\n }\n }\n } else {\n for (j = parts.length > 1 ? 1 : 0; j < parts.length; j++) {\n part = parts[j];\n for (k = 0; k < part.axes.length; k++) {\n // render a single axis indicator\n c.moveTo(part.position.x, part.position.y);\n c.lineTo((part.vertices[0].x + part.vertices[part.vertices.length-1].x) / 2,\n (part.vertices[0].y + part.vertices[part.vertices.length-1].y) / 2);\n }\n }\n }\n }\n\n if (options.wireframes) {\n c.strokeStyle = 'indianred';\n c.lineWidth = 1;\n } else {\n c.strokeStyle = 'rgba(255, 255, 255, 0.4)';\n c.globalCompositeOperation = 'overlay';\n c.lineWidth = 2;\n }\n\n c.stroke();\n c.globalCompositeOperation = 'source-over';\n };\n\n /**\n * Draws body positions\n * @private\n * @method bodyPositions\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyPositions = function(render, bodies, context) {\n var c = context,\n engine = render.engine,\n options = render.options,\n body,\n part,\n i,\n k;\n\n c.beginPath();\n\n // render current positions\n for (i = 0; i < bodies.length; i++) {\n body = bodies[i];\n\n if (!body.render.visible)\n continue;\n\n // handle compound parts\n for (k = 0; k < body.parts.length; k++) {\n part = body.parts[k];\n c.arc(part.position.x, part.position.y, 3, 0, 2 * Math.PI, false);\n c.closePath();\n }\n }\n\n if (options.wireframes) {\n c.fillStyle = 'indianred';\n } else {\n c.fillStyle = 'rgba(0,0,0,0.5)';\n }\n c.fill();\n\n c.beginPath();\n\n // render previous positions\n for (i = 0; i < bodies.length; i++) {\n body = bodies[i];\n if (body.render.visible) {\n c.arc(body.positionPrev.x, body.positionPrev.y, 2, 0, 2 * Math.PI, false);\n c.closePath();\n }\n }\n\n c.fillStyle = 'rgba(255,165,0,0.8)';\n c.fill();\n };\n\n /**\n * Draws body velocity\n * @private\n * @method bodyVelocity\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyVelocity = function(render, bodies, context) {\n var c = context;\n\n c.beginPath();\n\n for (var i = 0; i < bodies.length; i++) {\n var body = bodies[i];\n\n if (!body.render.visible)\n continue;\n\n var velocity = Body.getVelocity(body);\n\n c.moveTo(body.position.x, body.position.y);\n c.lineTo(body.position.x + velocity.x, body.position.y + velocity.y);\n }\n\n c.lineWidth = 3;\n c.strokeStyle = 'cornflowerblue';\n c.stroke();\n };\n\n /**\n * Draws body ids\n * @private\n * @method bodyIds\n * @param {render} render\n * @param {body[]} bodies\n * @param {RenderingContext} context\n */\n Render.bodyIds = function(render, bodies, context) {\n var c = context,\n i,\n j;\n\n for (i = 0; i < bodies.length; i++) {\n if (!bodies[i].render.visible)\n continue;\n\n var parts = bodies[i].parts;\n for (j = parts.length > 1 ? 1 : 0; j < parts.length; j++) {\n var part = parts[j];\n c.font = \"12px Arial\";\n c.fillStyle = 'rgba(255,255,255,0.5)';\n c.fillText(part.id, part.position.x + 10, part.position.y - 10);\n }\n }\n };\n\n /**\n * Description\n * @private\n * @method collisions\n * @param {render} render\n * @param {pair[]} pairs\n * @param {RenderingContext} context\n */\n Render.collisions = function(render, pairs, context) {\n var c = context,\n options = render.options,\n pair,\n collision,\n corrected,\n bodyA,\n bodyB,\n i,\n j;\n\n c.beginPath();\n\n // render collision positions\n for (i = 0; i < pairs.length; i++) {\n pair = pairs[i];\n\n if (!pair.isActive)\n continue;\n\n collision = pair.collision;\n for (j = 0; j < pair.contactCount; j++) {\n var contact = pair.contacts[j],\n vertex = contact.vertex;\n c.rect(vertex.x - 1.5, vertex.y - 1.5, 3.5, 3.5);\n }\n }\n\n if (options.wireframes) {\n c.fillStyle = 'rgba(255,255,255,0.7)';\n } else {\n c.fillStyle = 'orange';\n }\n c.fill();\n\n c.beginPath();\n\n // render collision normals\n for (i = 0; i < pairs.length; i++) {\n pair = pairs[i];\n\n if (!pair.isActive)\n continue;\n\n collision = pair.collision;\n\n if (pair.contactCount > 0) {\n var normalPosX = pair.contacts[0].vertex.x,\n normalPosY = pair.contacts[0].vertex.y;\n\n if (pair.contactCount === 2) {\n normalPosX = (pair.contacts[0].vertex.x + pair.contacts[1].vertex.x) / 2;\n normalPosY = (pair.contacts[0].vertex.y + pair.contacts[1].vertex.y) / 2;\n }\n\n if (collision.bodyB === collision.supports[0].body || collision.bodyA.isStatic === true) {\n c.moveTo(normalPosX - collision.normal.x * 8, normalPosY - collision.normal.y * 8);\n } else {\n c.moveTo(normalPosX + collision.normal.x * 8, normalPosY + collision.normal.y * 8);\n }\n\n c.lineTo(normalPosX, normalPosY);\n }\n }\n\n if (options.wireframes) {\n c.strokeStyle = 'rgba(255,165,0,0.7)';\n } else {\n c.strokeStyle = 'orange';\n }\n\n c.lineWidth = 1;\n c.stroke();\n };\n\n /**\n * Description\n * @private\n * @method separations\n * @param {render} render\n * @param {pair[]} pairs\n * @param {RenderingContext} context\n */\n Render.separations = function(render, pairs, context) {\n var c = context,\n options = render.options,\n pair,\n collision,\n corrected,\n bodyA,\n bodyB,\n i,\n j;\n\n c.beginPath();\n\n // render separations\n for (i = 0; i < pairs.length; i++) {\n pair = pairs[i];\n\n if (!pair.isActive)\n continue;\n\n collision = pair.collision;\n bodyA = collision.bodyA;\n bodyB = collision.bodyB;\n\n var k = 1;\n\n if (!bodyB.isStatic && !bodyA.isStatic) k = 0.5;\n if (bodyB.isStatic) k = 0;\n\n c.moveTo(bodyB.position.x, bodyB.position.y);\n c.lineTo(bodyB.position.x - collision.penetration.x * k, bodyB.position.y - collision.penetration.y * k);\n\n k = 1;\n\n if (!bodyB.isStatic && !bodyA.isStatic) k = 0.5;\n if (bodyA.isStatic) k = 0;\n\n c.moveTo(bodyA.position.x, bodyA.position.y);\n c.lineTo(bodyA.position.x + collision.penetration.x * k, bodyA.position.y + collision.penetration.y * k);\n }\n\n if (options.wireframes) {\n c.strokeStyle = 'rgba(255,165,0,0.5)';\n } else {\n c.strokeStyle = 'orange';\n }\n c.stroke();\n };\n\n /**\n * Description\n * @private\n * @method inspector\n * @param {inspector} inspector\n * @param {RenderingContext} context\n */\n Render.inspector = function(inspector, context) {\n var engine = inspector.engine,\n selected = inspector.selected,\n render = inspector.render,\n options = render.options,\n bounds;\n\n if (options.hasBounds) {\n var boundsWidth = render.bounds.max.x - render.bounds.min.x,\n boundsHeight = render.bounds.max.y - render.bounds.min.y,\n boundsScaleX = boundsWidth / render.options.width,\n boundsScaleY = boundsHeight / render.options.height;\n\n context.scale(1 / boundsScaleX, 1 / boundsScaleY);\n context.translate(-render.bounds.min.x, -render.bounds.min.y);\n }\n\n for (var i = 0; i < selected.length; i++) {\n var item = selected[i].data;\n\n context.translate(0.5, 0.5);\n context.lineWidth = 1;\n context.strokeStyle = 'rgba(255,165,0,0.9)';\n context.setLineDash([1,2]);\n\n switch (item.type) {\n\n case 'body':\n\n // render body selections\n bounds = item.bounds;\n context.beginPath();\n context.rect(Math.floor(bounds.min.x - 3), Math.floor(bounds.min.y - 3),\n Math.floor(bounds.max.x - bounds.min.x + 6), Math.floor(bounds.max.y - bounds.min.y + 6));\n context.closePath();\n context.stroke();\n\n break;\n\n case 'constraint':\n\n // render constraint selections\n var point = item.pointA;\n if (item.bodyA)\n point = item.pointB;\n context.beginPath();\n context.arc(point.x, point.y, 10, 0, 2 * Math.PI);\n context.closePath();\n context.stroke();\n\n break;\n\n }\n\n context.setLineDash([]);\n context.translate(-0.5, -0.5);\n }\n\n // render selection region\n if (inspector.selectStart !== null) {\n context.translate(0.5, 0.5);\n context.lineWidth = 1;\n context.strokeStyle = 'rgba(255,165,0,0.6)';\n context.fillStyle = 'rgba(255,165,0,0.1)';\n bounds = inspector.selectBounds;\n context.beginPath();\n context.rect(Math.floor(bounds.min.x), Math.floor(bounds.min.y),\n Math.floor(bounds.max.x - bounds.min.x), Math.floor(bounds.max.y - bounds.min.y));\n context.closePath();\n context.stroke();\n context.fill();\n context.translate(-0.5, -0.5);\n }\n\n if (options.hasBounds)\n context.setTransform(1, 0, 0, 1, 0, 0);\n };\n\n /**\n * Updates render timing.\n * @method _updateTiming\n * @private\n * @param {render} render\n * @param {number} time\n */\n var _updateTiming = function(render, time) {\n var engine = render.engine,\n timing = render.timing,\n historySize = timing.historySize,\n timestamp = engine.timing.timestamp;\n\n timing.delta = time - timing.lastTime || Render._goodDelta;\n timing.lastTime = time;\n\n timing.timestampElapsed = timestamp - timing.lastTimestamp || 0;\n timing.lastTimestamp = timestamp;\n\n timing.deltaHistory.unshift(timing.delta);\n timing.deltaHistory.length = Math.min(timing.deltaHistory.length, historySize);\n\n timing.engineDeltaHistory.unshift(engine.timing.lastDelta);\n timing.engineDeltaHistory.length = Math.min(timing.engineDeltaHistory.length, historySize);\n\n timing.timestampElapsedHistory.unshift(timing.timestampElapsed);\n timing.timestampElapsedHistory.length = Math.min(timing.timestampElapsedHistory.length, historySize);\n\n timing.engineUpdatesHistory.unshift(engine.timing.lastUpdatesPerFrame);\n timing.engineUpdatesHistory.length = Math.min(timing.engineUpdatesHistory.length, historySize);\n\n timing.engineElapsedHistory.unshift(engine.timing.lastElapsed);\n timing.engineElapsedHistory.length = Math.min(timing.engineElapsedHistory.length, historySize);\n\n timing.elapsedHistory.unshift(timing.lastElapsed);\n timing.elapsedHistory.length = Math.min(timing.elapsedHistory.length, historySize);\n };\n\n /**\n * Returns the mean value of the given numbers.\n * @method _mean\n * @private\n * @param {Number[]} values\n * @return {Number} the mean of given values\n */\n var _mean = function(values) {\n var result = 0;\n for (var i = 0; i < values.length; i += 1) {\n result += values[i];\n }\n return (result / values.length) || 0;\n };\n\n /**\n * @method _createCanvas\n * @private\n * @param {} width\n * @param {} height\n * @return canvas\n */\n var _createCanvas = function(width, height) {\n var canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n canvas.oncontextmenu = function() { return false; };\n canvas.onselectstart = function() { return false; };\n return canvas;\n };\n\n /**\n * Gets the pixel ratio of the canvas.\n * @method _getPixelRatio\n * @private\n * @param {HTMLElement} canvas\n * @return {Number} pixel ratio\n */\n var _getPixelRatio = function(canvas) {\n var context = canvas.getContext('2d'),\n devicePixelRatio = window.devicePixelRatio || 1,\n backingStorePixelRatio = context.webkitBackingStorePixelRatio || context.mozBackingStorePixelRatio\n || context.msBackingStorePixelRatio || context.oBackingStorePixelRatio\n || context.backingStorePixelRatio || 1;\n\n return devicePixelRatio / backingStorePixelRatio;\n };\n\n /**\n * Gets the requested texture (an Image) via its path\n * @method _getTexture\n * @private\n * @param {render} render\n * @param {string} imagePath\n * @return {Image} texture\n */\n var _getTexture = function(render, imagePath) {\n var image = render.textures[imagePath];\n\n if (image)\n return image;\n\n image = render.textures[imagePath] = new Image();\n image.src = imagePath;\n\n return image;\n };\n\n /**\n * Applies the background to the canvas using CSS.\n * @method applyBackground\n * @private\n * @param {render} render\n * @param {string} background\n */\n var _applyBackground = function(render, background) {\n var cssBackground = background;\n\n if (/(jpg|gif|png)$/.test(background))\n cssBackground = 'url(' + background + ')';\n\n render.canvas.style.background = cssBackground;\n render.canvas.style.backgroundSize = \"contain\";\n render.currentBackground = background;\n };\n\n /*\n *\n * Events Documentation\n *\n */\n\n /**\n * Fired before rendering\n *\n * @event beforeRender\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired after rendering\n *\n * @event afterRender\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * A back-reference to the `Matter.Render` module.\n *\n * @deprecated\n * @property controller\n * @type render\n */\n\n /**\n * A reference to the `Matter.Engine` instance to be used.\n *\n * @property engine\n * @type engine\n */\n\n /**\n * A reference to the element where the canvas is to be inserted (if `render.canvas` has not been specified)\n *\n * @property element\n * @type HTMLElement\n * @default null\n */\n\n /**\n * The canvas element to render to. If not specified, one will be created if `render.element` has been specified.\n *\n * @property canvas\n * @type HTMLCanvasElement\n * @default null\n */\n\n /**\n * A `Bounds` object that specifies the drawing view region.\n * Rendering will be automatically transformed and scaled to fit within the canvas size (`render.options.width` and `render.options.height`).\n * This allows for creating views that can pan or zoom around the scene.\n * You must also set `render.options.hasBounds` to `true` to enable bounded rendering.\n *\n * @property bounds\n * @type bounds\n */\n\n /**\n * The 2d rendering context from the `render.canvas` element.\n *\n * @property context\n * @type CanvasRenderingContext2D\n */\n\n /**\n * The sprite texture cache.\n *\n * @property textures\n * @type {}\n */\n\n /**\n * The mouse to render if `render.options.showMousePosition` is enabled.\n *\n * @property mouse\n * @type mouse\n * @default null\n */\n\n /**\n * The configuration options of the renderer.\n *\n * @property options\n * @type {}\n */\n\n /**\n * The target width in pixels of the `render.canvas` to be created.\n * See also the `options.pixelRatio` property to change render quality.\n *\n * @property options.width\n * @type number\n * @default 800\n */\n\n /**\n * The target height in pixels of the `render.canvas` to be created.\n * See also the `options.pixelRatio` property to change render quality.\n *\n * @property options.height\n * @type number\n * @default 600\n */\n\n /**\n * The [pixel ratio](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio) to use when rendering.\n *\n * @property options.pixelRatio\n * @type number\n * @default 1\n */\n\n /**\n * A CSS background color string to use when `render.options.wireframes` is disabled.\n * This may be also set to `'transparent'` or equivalent.\n *\n * @property options.background\n * @type string\n * @default '#14151f'\n */\n\n /**\n * A CSS color string to use for background when `render.options.wireframes` is enabled.\n * This may be also set to `'transparent'` or equivalent.\n *\n * @property options.wireframeBackground\n * @type string\n * @default '#14151f'\n */\n\n /**\n * A CSS color string to use for stroke when `render.options.wireframes` is enabled.\n * This may be also set to `'transparent'` or equivalent.\n *\n * @property options.wireframeStrokeStyle\n * @type string\n * @default '#bbb'\n */\n\n /**\n * A flag that specifies if `render.bounds` should be used when rendering.\n *\n * @property options.hasBounds\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable all debug information overlays together. \n * This includes and has priority over the values of:\n *\n * - `render.options.showStats`\n * - `render.options.showPerformance`\n *\n * @property options.showDebug\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the engine stats info overlay. \n * From left to right, the values shown are:\n *\n * - body parts total\n * - body total\n * - constraints total\n * - composites total\n * - collision pairs total\n *\n * @property options.showStats\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable performance charts. \n * From left to right, the values shown are:\n *\n * - average render frequency (e.g. 60 fps)\n * - exact engine delta time used for last update (e.g. 16.66ms)\n * - average updates per frame (e.g. 1)\n * - average engine execution duration (e.g. 5.00ms)\n * - average render execution duration (e.g. 0.40ms)\n * - average effective play speed (e.g. '1.00x' is 'real-time')\n *\n * Each value is recorded over a fixed sample of past frames (60 frames).\n *\n * A chart shown below each value indicates the variance from the average over the sample.\n * The more stable or fixed the value is the flatter the chart will appear.\n *\n * @property options.showPerformance\n * @type boolean\n * @default false\n */\n \n /**\n * A flag to enable or disable rendering entirely.\n *\n * @property options.enabled\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to toggle wireframe rendering otherwise solid fill rendering is used.\n *\n * @property options.wireframes\n * @type boolean\n * @default true\n */\n\n /**\n * A flag to enable or disable sleeping bodies indicators.\n *\n * @property options.showSleeping\n * @type boolean\n * @default true\n */\n\n /**\n * A flag to enable or disable the debug information overlay.\n *\n * @property options.showDebug\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the collision broadphase debug overlay.\n *\n * @deprecated no longer implemented\n * @property options.showBroadphase\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body bounds debug overlay.\n *\n * @property options.showBounds\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body velocity debug overlay.\n *\n * @property options.showVelocity\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body collisions debug overlay.\n *\n * @property options.showCollisions\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the collision resolver separations debug overlay.\n *\n * @property options.showSeparations\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body axes debug overlay.\n *\n * @property options.showAxes\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body positions debug overlay.\n *\n * @property options.showPositions\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body angle debug overlay.\n *\n * @property options.showAngleIndicator\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body and part ids debug overlay.\n *\n * @property options.showIds\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body vertex numbers debug overlay.\n *\n * @property options.showVertexNumbers\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body convex hulls debug overlay.\n *\n * @property options.showConvexHulls\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the body internal edges debug overlay.\n *\n * @property options.showInternalEdges\n * @type boolean\n * @default false\n */\n\n /**\n * A flag to enable or disable the mouse position debug overlay.\n *\n * @property options.showMousePosition\n * @type boolean\n * @default false\n */\n\n})();\n\n\n/***/ }),\n/* 27 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Runner` module is an optional utility that provides a game loop for running a `Matter.Engine` inside a browser environment.\n* A runner will continuously update a `Matter.Engine` whilst synchronising engine updates with the browser frame rate.\n* This runner favours a smoother user experience over perfect time keeping.\n* This runner is optional and is used for development and debugging but could be useful as a starting point for implementing some games and experiences.\n* Alternatively see `Engine.update` to step the engine directly inside your own game loop implementation as may be needed inside other environments.\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Runner\n*/\n\nvar Runner = {};\n\nmodule.exports = Runner;\n\nvar Events = __webpack_require__(5);\nvar Engine = __webpack_require__(17);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n Runner._maxFrameDelta = 1000 / 15;\n Runner._frameDeltaFallback = 1000 / 60;\n Runner._timeBufferMargin = 1.5;\n Runner._elapsedNextEstimate = 1;\n Runner._smoothingLowerBound = 0.1;\n Runner._smoothingUpperBound = 0.9;\n\n /**\n * Creates a new Runner. \n * See the properties section below for detailed information on what you can pass via the `options` object.\n * @method create\n * @param {} options\n */\n Runner.create = function(options) {\n var defaults = {\n delta: 1000 / 60,\n frameDelta: null,\n frameDeltaSmoothing: true,\n frameDeltaSnapping: true,\n frameDeltaHistory: [],\n frameDeltaHistorySize: 100,\n frameRequestId: null,\n timeBuffer: 0,\n timeLastTick: null,\n maxUpdates: null,\n maxFrameTime: 1000 / 30,\n lastUpdatesDeferred: 0,\n enabled: true\n };\n\n var runner = Common.extend(defaults, options);\n\n // for temporary back compatibility only\n runner.fps = 0;\n\n return runner;\n };\n\n /**\n * Runs a `Matter.Engine` whilst synchronising engine updates with the browser frame rate. \n * See module and properties descriptions for more information on this runner.\n * Alternatively see `Engine.update` to step the engine directly inside your own game loop implementation.\n * @method run\n * @param {runner} runner\n * @param {engine} [engine]\n * @return {runner} runner\n */\n Runner.run = function(runner, engine) {\n // initial time buffer for the first frame\n runner.timeBuffer = Runner._frameDeltaFallback;\n\n (function onFrame(time){\n runner.frameRequestId = Runner._onNextFrame(runner, onFrame);\n\n if (time && runner.enabled) {\n Runner.tick(runner, engine, time);\n }\n })();\n\n return runner;\n };\n\n /**\n * Performs a single runner tick as used inside `Runner.run`.\n * See module and properties descriptions for more information on this runner.\n * Alternatively see `Engine.update` to step the engine directly inside your own game loop implementation.\n * @method tick\n * @param {runner} runner\n * @param {engine} engine\n * @param {number} time\n */\n Runner.tick = function(runner, engine, time) {\n var tickStartTime = Common.now(),\n engineDelta = runner.delta,\n updateCount = 0;\n\n // find frame delta time since last call\n var frameDelta = time - runner.timeLastTick;\n\n // fallback for unusable frame delta values (e.g. 0, NaN, on first frame or long pauses)\n if (!frameDelta || !runner.timeLastTick || frameDelta > Math.max(Runner._maxFrameDelta, runner.maxFrameTime)) {\n // reuse last accepted frame delta else fallback\n frameDelta = runner.frameDelta || Runner._frameDeltaFallback;\n }\n\n if (runner.frameDeltaSmoothing) {\n // record frame delta over a number of frames\n runner.frameDeltaHistory.push(frameDelta);\n runner.frameDeltaHistory = runner.frameDeltaHistory.slice(-runner.frameDeltaHistorySize);\n\n // sort frame delta history\n var deltaHistorySorted = runner.frameDeltaHistory.slice(0).sort();\n\n // sample a central window to limit outliers\n var deltaHistoryWindow = runner.frameDeltaHistory.slice(\n deltaHistorySorted.length * Runner._smoothingLowerBound, \n deltaHistorySorted.length * Runner._smoothingUpperBound\n );\n\n // take the mean of the central window\n var frameDeltaSmoothed = _mean(deltaHistoryWindow);\n frameDelta = frameDeltaSmoothed || frameDelta;\n }\n\n if (runner.frameDeltaSnapping) {\n // snap frame delta to the nearest 1 Hz\n frameDelta = 1000 / Math.round(1000 / frameDelta);\n }\n\n // update runner values for next call\n runner.frameDelta = frameDelta;\n runner.timeLastTick = time;\n\n // accumulate elapsed time\n runner.timeBuffer += runner.frameDelta;\n\n // limit time buffer size to a single frame of updates\n runner.timeBuffer = Common.clamp(\n runner.timeBuffer, 0, runner.frameDelta + engineDelta * Runner._timeBufferMargin\n );\n\n // reset count of over budget updates\n runner.lastUpdatesDeferred = 0;\n\n // get max updates per frame\n var maxUpdates = runner.maxUpdates || Math.ceil(runner.maxFrameTime / engineDelta);\n\n // create event object\n var event = {\n timestamp: engine.timing.timestamp\n };\n\n // tick events before update\n Events.trigger(runner, 'beforeTick', event);\n Events.trigger(runner, 'tick', event);\n\n var updateStartTime = Common.now();\n\n // simulate time elapsed between calls\n while (engineDelta > 0 && runner.timeBuffer >= engineDelta * Runner._timeBufferMargin) {\n // update the engine\n Events.trigger(runner, 'beforeUpdate', event);\n Engine.update(engine, engineDelta);\n Events.trigger(runner, 'afterUpdate', event);\n\n // consume time simulated from buffer\n runner.timeBuffer -= engineDelta;\n updateCount += 1;\n\n // find elapsed time during this tick\n var elapsedTimeTotal = Common.now() - tickStartTime,\n elapsedTimeUpdates = Common.now() - updateStartTime,\n elapsedNextEstimate = elapsedTimeTotal + Runner._elapsedNextEstimate * elapsedTimeUpdates / updateCount;\n\n // defer updates if over performance budgets for this frame\n if (updateCount >= maxUpdates || elapsedNextEstimate > runner.maxFrameTime) {\n runner.lastUpdatesDeferred = Math.round(Math.max(0, (runner.timeBuffer / engineDelta) - Runner._timeBufferMargin));\n break;\n }\n }\n\n // track timing metrics\n engine.timing.lastUpdatesPerFrame = updateCount;\n\n // tick events after update\n Events.trigger(runner, 'afterTick', event);\n\n // show useful warnings if needed\n if (runner.frameDeltaHistory.length >= 100) {\n if (runner.lastUpdatesDeferred && Math.round(runner.frameDelta / engineDelta) > maxUpdates) {\n Common.warnOnce('Matter.Runner: runner reached runner.maxUpdates, see docs.');\n } else if (runner.lastUpdatesDeferred) {\n Common.warnOnce('Matter.Runner: runner reached runner.maxFrameTime, see docs.');\n }\n\n if (typeof runner.isFixed !== 'undefined') {\n Common.warnOnce('Matter.Runner: runner.isFixed is now redundant, see docs.');\n }\n\n if (runner.deltaMin || runner.deltaMax) {\n Common.warnOnce('Matter.Runner: runner.deltaMin and runner.deltaMax were removed, see docs.');\n }\n\n if (runner.fps !== 0) {\n Common.warnOnce('Matter.Runner: runner.fps was replaced by runner.delta, see docs.');\n }\n }\n };\n\n /**\n * Ends execution of `Runner.run` on the given `runner` by canceling the frame loop.\n * Alternatively to temporarily pause the runner, see `runner.enabled`.\n * @method stop\n * @param {runner} runner\n */\n Runner.stop = function(runner) {\n Runner._cancelNextFrame(runner);\n };\n\n /**\n * Schedules the `callback` on this `runner` for the next animation frame.\n * @private\n * @method _onNextFrame\n * @param {runner} runner\n * @param {function} callback\n * @return {number} frameRequestId\n */\n Runner._onNextFrame = function(runner, callback) {\n if (typeof window !== 'undefined' && window.requestAnimationFrame) {\n runner.frameRequestId = window.requestAnimationFrame(callback);\n } else {\n throw new Error('Matter.Runner: missing required global window.requestAnimationFrame.');\n }\n\n return runner.frameRequestId;\n };\n\n /**\n * Cancels the last callback scheduled by `Runner._onNextFrame` on this `runner`.\n * @private\n * @method _cancelNextFrame\n * @param {runner} runner\n */\n Runner._cancelNextFrame = function(runner) {\n if (typeof window !== 'undefined' && window.cancelAnimationFrame) {\n window.cancelAnimationFrame(runner.frameRequestId);\n } else {\n throw new Error('Matter.Runner: missing required global window.cancelAnimationFrame.');\n }\n };\n\n /**\n * Returns the mean of the given numbers.\n * @method _mean\n * @private\n * @param {Number[]} values\n * @return {Number} the mean of given values.\n */\n var _mean = function(values) {\n var result = 0,\n valuesLength = values.length;\n\n for (var i = 0; i < valuesLength; i += 1) {\n result += values[i];\n }\n\n return (result / valuesLength) || 0;\n };\n\n /*\n *\n * Events Documentation\n *\n */\n\n /**\n * Fired once at the start of the browser frame, before any engine updates.\n *\n * @event beforeTick\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired once at the start of the browser frame, after `beforeTick`.\n *\n * @event tick\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired once at the end of the browser frame, after `beforeTick`, `tick` and after any engine updates.\n *\n * @event afterTick\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired before each and every engine update in this browser frame (if any). \n * There may be multiple engine update calls per browser frame (or none) depending on framerate and timestep delta.\n *\n * @event beforeUpdate\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /**\n * Fired after each and every engine update in this browser frame (if any). \n * There may be multiple engine update calls per browser frame (or none) depending on framerate and timestep delta.\n *\n * @event afterUpdate\n * @param {} event An event object\n * @param {number} event.timestamp The engine.timing.timestamp of the event\n * @param {} event.source The source object of the event\n * @param {} event.name The name of the event\n */\n\n /*\n *\n * Properties Documentation\n *\n */\n\n /**\n * The fixed timestep size used for `Engine.update` calls in milliseconds, known as `delta`.\n * \n * This value is recommended to be `1000 / 60` ms or smaller (i.e. equivalent to at least 60hz).\n * \n * Smaller `delta` values provide higher quality results at the cost of performance.\n * \n * You should usually avoid changing `delta` during running, otherwise quality may be affected. \n * \n * For smoother frame pacing choose a `delta` that is an even multiple of each display FPS you target, i.e. `1000 / (n * fps)` as this helps distribute an equal number of updates over each display frame.\n * \n * For example with a 60 Hz `delta` i.e. `1000 / 60` the runner will on average perform one update per frame on displays running 60 FPS and one update every two frames on displays running 120 FPS, etc.\n * \n * Where as e.g. using a 240 Hz `delta` i.e. `1000 / 240` the runner will on average perform four updates per frame on displays running 60 FPS and two updates per frame on displays running 120 FPS, etc.\n * \n * Therefore `Runner.run` will call multiple engine updates (or none) as needed to simulate the time elapsed between browser frames. \n * \n * In practice the number of updates in any particular frame may be restricted to respect the runner's performance budgets. These are specified by `runner.maxFrameTime` and `runner.maxUpdates`, see those properties for details.\n * \n * @property delta\n * @type number\n * @default 1000 / 60\n */\n\n /**\n * A flag that can be toggled to enable or disable tick calls on this runner, therefore pausing engine updates and events while the runner loop remains running.\n *\n * @property enabled\n * @type boolean\n * @default true\n */\n\n /**\n * The accumulated time elapsed that has yet to be simulated in milliseconds.\n * This value is clamped within certain limits (see `Runner.tick` code).\n *\n * @private\n * @property timeBuffer\n * @type number\n * @default 0\n */\n\n /**\n * The measured time elapsed between the last two browser frames measured in milliseconds.\n * This is useful e.g. to estimate the current browser FPS using `1000 / runner.frameDelta`.\n *\n * @readonly\n * @property frameDelta\n * @type number\n */\n\n /**\n * Enables averaging to smooth frame rate measurements and therefore stabilise play rate.\n *\n * @property frameDeltaSmoothing\n * @type boolean\n * @default true\n */\n\n /**\n * Rounds measured browser frame delta to the nearest 1 Hz.\n * This option can help smooth frame rate measurements and simplify handling hardware timing differences e.g. 59.94Hz and 60Hz displays.\n * For best results you should also round your `runner.delta` equivalent to the nearest 1 Hz.\n *\n * @property frameDeltaSnapping\n * @type boolean\n * @default true\n */\n\n /**\n * A performance budget that limits execution time allowed for this runner per browser frame in milliseconds.\n * \n * To calculate the effective browser FPS at which this throttle is applied use `1000 / runner.maxFrameTime`.\n * \n * This performance budget is intended to help maintain browser interactivity and help improve framerate recovery during temporary high CPU usage.\n * \n * This budget only covers the measured time elapsed executing the functions called in the scope of the runner tick, including `Engine.update` and its related user event callbacks.\n * \n * You may also reduce this budget to allow for any significant additional processing you perform on the same thread outside the scope of this runner tick, e.g. rendering time.\n * \n * See also `runner.maxUpdates`.\n *\n * @property maxFrameTime\n * @type number\n * @default 1000 / 30\n */\n\n /**\n * An optional limit for maximum engine update count allowed per frame tick in addition to `runner.maxFrameTime`.\n * \n * Unless you set a value it is automatically chosen based on `runner.delta` and `runner.maxFrameTime`.\n * \n * See also `runner.maxFrameTime`.\n * \n * @property maxUpdates\n * @type number\n * @default null\n */\n\n /**\n * The timestamp of the last call to `Runner.tick` used to measure `frameDelta`.\n *\n * @private\n * @property timeLastTick\n * @type number\n * @default 0\n */\n\n /**\n * The id of the last call to `Runner._onNextFrame`.\n *\n * @private\n * @property frameRequestId\n * @type number\n * @default null\n */\n\n})();\n\n\n/***/ }),\n/* 28 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* This module has now been replaced by `Matter.Collision`.\n*\n* All usage should be migrated to `Matter.Collision`.\n* For back-compatibility purposes this module will remain for a short term and then later removed in a future release.\n*\n* The `Matter.SAT` module contains methods for detecting collisions using the Separating Axis Theorem.\n*\n* @class SAT\n* @deprecated\n*/\n\nvar SAT = {};\n\nmodule.exports = SAT;\n\nvar Collision = __webpack_require__(8);\nvar Common = __webpack_require__(0);\nvar deprecated = Common.deprecated;\n\n(function() {\n\n /**\n * Detect collision between two bodies using the Separating Axis Theorem.\n * @deprecated replaced by Collision.collides\n * @method collides\n * @param {body} bodyA\n * @param {body} bodyB\n * @return {collision} collision\n */\n SAT.collides = function(bodyA, bodyB) {\n return Collision.collides(bodyA, bodyB);\n };\n\n deprecated(SAT, 'collides', 'SAT.collides ➤ replaced by Collision.collides');\n\n})();\n\n\n/***/ }),\n/* 29 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* The `Matter.Svg` module contains methods for converting SVG images into an array of vector points.\n*\n* To use this module you also need the SVGPathSeg polyfill: https://github.com/progers/pathseg\n*\n* See the included usage [examples](https://github.com/liabru/matter-js/tree/master/examples).\n*\n* @class Svg\n*/\n\nvar Svg = {};\n\nmodule.exports = Svg;\n\nvar Bounds = __webpack_require__(1);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * Converts an SVG path into an array of vector points.\n * If the input path forms a concave shape, you must decompose the result into convex parts before use.\n * See `Bodies.fromVertices` which provides support for this.\n * Note that this function is not guaranteed to support complex paths (such as those with holes).\n * You must load the `pathseg.js` polyfill on newer browsers.\n * @method pathToVertices\n * @param {SVGPathElement} path\n * @param {Number} [sampleLength=15]\n * @return {Vector[]} points\n */\n Svg.pathToVertices = function(path, sampleLength) {\n if (typeof window !== 'undefined' && !('SVGPathSeg' in window)) {\n Common.warn('Svg.pathToVertices: SVGPathSeg not defined, a polyfill is required.');\n }\n\n // https://github.com/wout/svg.topoly.js/blob/master/svg.topoly.js\n var i, il, total, point, segment, segments, \n segmentsQueue, lastSegment, \n lastPoint, segmentIndex, points = [],\n lx, ly, length = 0, x = 0, y = 0;\n\n sampleLength = sampleLength || 15;\n\n var addPoint = function(px, py, pathSegType) {\n // all odd-numbered path types are relative except PATHSEG_CLOSEPATH (1)\n var isRelative = pathSegType % 2 === 1 && pathSegType > 1;\n\n // when the last point doesn't equal the current point add the current point\n if (!lastPoint || px != lastPoint.x || py != lastPoint.y) {\n if (lastPoint && isRelative) {\n lx = lastPoint.x;\n ly = lastPoint.y;\n } else {\n lx = 0;\n ly = 0;\n }\n\n var point = {\n x: lx + px,\n y: ly + py\n };\n\n // set last point\n if (isRelative || !lastPoint) {\n lastPoint = point;\n }\n\n points.push(point);\n\n x = lx + px;\n y = ly + py;\n }\n };\n\n var addSegmentPoint = function(segment) {\n var segType = segment.pathSegTypeAsLetter.toUpperCase();\n\n // skip path ends\n if (segType === 'Z') \n return;\n\n // map segment to x and y\n switch (segType) {\n\n case 'M':\n case 'L':\n case 'T':\n case 'C':\n case 'S':\n case 'Q':\n x = segment.x;\n y = segment.y;\n break;\n case 'H':\n x = segment.x;\n break;\n case 'V':\n y = segment.y;\n break;\n }\n\n addPoint(x, y, segment.pathSegType);\n };\n\n // ensure path is absolute\n Svg._svgPathToAbsolute(path);\n\n // get total length\n total = path.getTotalLength();\n\n // queue segments\n segments = [];\n for (i = 0; i < path.pathSegList.numberOfItems; i += 1)\n segments.push(path.pathSegList.getItem(i));\n\n segmentsQueue = segments.concat();\n\n // sample through path\n while (length < total) {\n // get segment at position\n segmentIndex = path.getPathSegAtLength(length);\n segment = segments[segmentIndex];\n\n // new segment\n if (segment != lastSegment) {\n while (segmentsQueue.length && segmentsQueue[0] != segment)\n addSegmentPoint(segmentsQueue.shift());\n\n lastSegment = segment;\n }\n\n // add points in between when curving\n // TODO: adaptive sampling\n switch (segment.pathSegTypeAsLetter.toUpperCase()) {\n\n case 'C':\n case 'T':\n case 'S':\n case 'Q':\n case 'A':\n point = path.getPointAtLength(length);\n addPoint(point.x, point.y, 0);\n break;\n\n }\n\n // increment by sample value\n length += sampleLength;\n }\n\n // add remaining segments not passed by sampling\n for (i = 0, il = segmentsQueue.length; i < il; ++i)\n addSegmentPoint(segmentsQueue[i]);\n\n return points;\n };\n\n Svg._svgPathToAbsolute = function(path) {\n // http://phrogz.net/convert-svg-path-to-all-absolute-commands\n // Copyright (c) Gavin Kistner\n // http://phrogz.net/js/_ReuseLicense.txt\n // Modifications: tidy formatting and naming\n var x0, y0, x1, y1, x2, y2, segs = path.pathSegList,\n x = 0, y = 0, len = segs.numberOfItems;\n\n for (var i = 0; i < len; ++i) {\n var seg = segs.getItem(i),\n segType = seg.pathSegTypeAsLetter;\n\n if (/[MLHVCSQTA]/.test(segType)) {\n if ('x' in seg) x = seg.x;\n if ('y' in seg) y = seg.y;\n } else {\n if ('x1' in seg) x1 = x + seg.x1;\n if ('x2' in seg) x2 = x + seg.x2;\n if ('y1' in seg) y1 = y + seg.y1;\n if ('y2' in seg) y2 = y + seg.y2;\n if ('x' in seg) x += seg.x;\n if ('y' in seg) y += seg.y;\n\n switch (segType) {\n\n case 'm':\n segs.replaceItem(path.createSVGPathSegMovetoAbs(x, y), i);\n break;\n case 'l':\n segs.replaceItem(path.createSVGPathSegLinetoAbs(x, y), i);\n break;\n case 'h':\n segs.replaceItem(path.createSVGPathSegLinetoHorizontalAbs(x), i);\n break;\n case 'v':\n segs.replaceItem(path.createSVGPathSegLinetoVerticalAbs(y), i);\n break;\n case 'c':\n segs.replaceItem(path.createSVGPathSegCurvetoCubicAbs(x, y, x1, y1, x2, y2), i);\n break;\n case 's':\n segs.replaceItem(path.createSVGPathSegCurvetoCubicSmoothAbs(x, y, x2, y2), i);\n break;\n case 'q':\n segs.replaceItem(path.createSVGPathSegCurvetoQuadraticAbs(x, y, x1, y1), i);\n break;\n case 't':\n segs.replaceItem(path.createSVGPathSegCurvetoQuadraticSmoothAbs(x, y), i);\n break;\n case 'a':\n segs.replaceItem(path.createSVGPathSegArcAbs(x, y, seg.r1, seg.r2, seg.angle, seg.largeArcFlag, seg.sweepFlag), i);\n break;\n case 'z':\n case 'Z':\n x = x0;\n y = y0;\n break;\n\n }\n }\n\n if (segType == 'M' || segType == 'm') {\n x0 = x;\n y0 = y;\n }\n }\n };\n\n})();\n\n/***/ }),\n/* 30 */\n/***/ (function(module, exports, __webpack_require__) {\n\n/**\n* This module has now been replaced by `Matter.Composite`.\n*\n* All usage should be migrated to the equivalent functions found on `Matter.Composite`.\n* For example `World.add(world, body)` now becomes `Composite.add(world, body)`.\n*\n* The property `world.gravity` has been moved to `engine.gravity`.\n*\n* For back-compatibility purposes this module will remain as a direct alias to `Matter.Composite` in the short term during migration.\n* Eventually this alias module will be marked as deprecated and then later removed in a future release.\n*\n* @class World\n*/\n\nvar World = {};\n\nmodule.exports = World;\n\nvar Composite = __webpack_require__(6);\nvar Common = __webpack_require__(0);\n\n(function() {\n\n /**\n * See above, aliases for back compatibility only\n */\n World.create = Composite.create;\n World.add = Composite.add;\n World.remove = Composite.remove;\n World.clear = Composite.clear;\n World.addComposite = Composite.addComposite;\n World.addBody = Composite.addBody;\n World.addConstraint = Composite.addConstraint;\n\n})();\n\n\n/***/ })\n/******/ ]);\n});","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&Ng(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=Lg(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Tg(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=Rg(f.type,f.key,f.props,null,a.mode,h),h.ref=Lg(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=Sg(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);Mg(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=Qg(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Ug=Og(!0),Vg=Og(!1),Wg=Uf(null),Xg=null,Yg=null,Zg=null;function $g(){Zg=Yg=Xg=null}function ah(a){var b=Wg.current;E(Wg);a._currentValue=b}function bh(a,b,c){for(;null!==a;){var d=a.alternate;(a.childLanes&b)!==b?(a.childLanes|=b,null!==d&&(d.childLanes|=b)):null!==d&&(d.childLanes&b)!==b&&(d.childLanes|=b);if(a===c)break;a=a.return}}\nfunction ch(a,b){Xg=a;Zg=Yg=null;a=a.dependencies;null!==a&&null!==a.firstContext&&(0!==(a.lanes&b)&&(dh=!0),a.firstContext=null)}function eh(a){var b=a._currentValue;if(Zg!==a)if(a={context:a,memoizedValue:b,next:null},null===Yg){if(null===Xg)throw Error(p(308));Yg=a;Xg.dependencies={lanes:0,firstContext:a}}else Yg=Yg.next=a;return b}var fh=null;function gh(a){null===fh?fh=[a]:fh.push(a)}\nfunction hh(a,b,c,d){var e=b.interleaved;null===e?(c.next=c,gh(b)):(c.next=e.next,e.next=c);b.interleaved=c;return ih(a,d)}function ih(a,b){a.lanes|=b;var c=a.alternate;null!==c&&(c.lanes|=b);c=a;for(a=a.return;null!==a;)a.childLanes|=b,c=a.alternate,null!==c&&(c.childLanes|=b),c=a,a=a.return;return 3===c.tag?c.stateNode:null}var jh=!1;function kh(a){a.updateQueue={baseState:a.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}\nfunction lh(a,b){a=a.updateQueue;b.updateQueue===a&&(b.updateQueue={baseState:a.baseState,firstBaseUpdate:a.firstBaseUpdate,lastBaseUpdate:a.lastBaseUpdate,shared:a.shared,effects:a.effects})}function mh(a,b){return{eventTime:a,lane:b,tag:0,payload:null,callback:null,next:null}}\nfunction nh(a,b,c){var d=a.updateQueue;if(null===d)return null;d=d.shared;if(0!==(K&2)){var e=d.pending;null===e?b.next=b:(b.next=e.next,e.next=b);d.pending=b;return ih(a,c)}e=d.interleaved;null===e?(b.next=b,gh(d)):(b.next=e.next,e.next=b);d.interleaved=b;return ih(a,c)}function oh(a,b,c){b=b.updateQueue;if(null!==b&&(b=b.shared,0!==(c&4194240))){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nfunction ph(a,b){var c=a.updateQueue,d=a.alternate;if(null!==d&&(d=d.updateQueue,c===d)){var e=null,f=null;c=c.firstBaseUpdate;if(null!==c){do{var g={eventTime:c.eventTime,lane:c.lane,tag:c.tag,payload:c.payload,callback:c.callback,next:null};null===f?e=f=g:f=f.next=g;c=c.next}while(null!==c);null===f?e=f=b:f=f.next=b}else e=f=b;c={baseState:d.baseState,firstBaseUpdate:e,lastBaseUpdate:f,shared:d.shared,effects:d.effects};a.updateQueue=c;return}a=c.lastBaseUpdate;null===a?c.firstBaseUpdate=b:a.next=\nb;c.lastBaseUpdate=b}\nfunction qh(a,b,c,d){var e=a.updateQueue;jh=!1;var f=e.firstBaseUpdate,g=e.lastBaseUpdate,h=e.shared.pending;if(null!==h){e.shared.pending=null;var k=h,l=k.next;k.next=null;null===g?f=l:g.next=l;g=k;var m=a.alternate;null!==m&&(m=m.updateQueue,h=m.lastBaseUpdate,h!==g&&(null===h?m.firstBaseUpdate=l:h.next=l,m.lastBaseUpdate=k))}if(null!==f){var q=e.baseState;g=0;m=l=k=null;h=f;do{var r=h.lane,y=h.eventTime;if((d&r)===r){null!==m&&(m=m.next={eventTime:y,lane:0,tag:h.tag,payload:h.payload,callback:h.callback,\nnext:null});a:{var n=a,t=h;r=b;y=c;switch(t.tag){case 1:n=t.payload;if(\"function\"===typeof n){q=n.call(y,q,r);break a}q=n;break a;case 3:n.flags=n.flags&-65537|128;case 0:n=t.payload;r=\"function\"===typeof n?n.call(y,q,r):n;if(null===r||void 0===r)break a;q=A({},q,r);break a;case 2:jh=!0}}null!==h.callback&&0!==h.lane&&(a.flags|=64,r=e.effects,null===r?e.effects=[h]:r.push(h))}else y={eventTime:y,lane:r,tag:h.tag,payload:h.payload,callback:h.callback,next:null},null===m?(l=m=y,k=q):m=m.next=y,g|=r;\nh=h.next;if(null===h)if(h=e.shared.pending,null===h)break;else r=h,h=r.next,r.next=null,e.lastBaseUpdate=r,e.shared.pending=null}while(1);null===m&&(k=q);e.baseState=k;e.firstBaseUpdate=l;e.lastBaseUpdate=m;b=e.shared.interleaved;if(null!==b){e=b;do g|=e.lane,e=e.next;while(e!==b)}else null===f&&(e.shared.lanes=0);rh|=g;a.lanes=g;a.memoizedState=q}}\nfunction sh(a,b,c){a=b.effects;b.effects=null;if(null!==a)for(b=0;bc?c:4;a(!0);var d=Gh.transition;Gh.transition={};try{a(!1),b()}finally{C=c,Gh.transition=d}}function wi(){return Uh().memoizedState}\nfunction xi(a,b,c){var d=yi(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,c);else if(c=hh(a,b,c,d),null!==c){var e=R();gi(c,a,d,e);Bi(c,b,d)}}\nfunction ii(a,b,c){var d=yi(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(zi(a))Ai(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,gh(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=hh(a,b,e,d);null!==c&&(e=R(),gi(c,a,d,e),Bi(c,b,d))}}\nfunction zi(a){var b=a.alternate;return a===M||null!==b&&b===M}function Ai(a,b){Jh=Ih=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Bi(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar Rh={readContext:eh,useCallback:P,useContext:P,useEffect:P,useImperativeHandle:P,useInsertionEffect:P,useLayoutEffect:P,useMemo:P,useReducer:P,useRef:P,useState:P,useDebugValue:P,useDeferredValue:P,useTransition:P,useMutableSource:P,useSyncExternalStore:P,useId:P,unstable_isNewReconciler:!1},Oh={readContext:eh,useCallback:function(a,b){Th().memoizedState=[a,void 0===b?null:b];return a},useContext:eh,useEffect:mi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ki(4194308,\n4,pi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ki(4194308,4,a,b)},useInsertionEffect:function(a,b){return ki(4,2,a,b)},useMemo:function(a,b){var c=Th();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=Th();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=xi.bind(null,M,a);return[d.memoizedState,a]},useRef:function(a){var b=\nTh();a={current:a};return b.memoizedState=a},useState:hi,useDebugValue:ri,useDeferredValue:function(a){return Th().memoizedState=a},useTransition:function(){var a=hi(!1),b=a[0];a=vi.bind(null,a[1]);Th().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=M,e=Th();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===Q)throw Error(p(349));0!==(Hh&30)||di(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;mi(ai.bind(null,d,\nf,a),[a]);d.flags|=2048;bi(9,ci.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=Th(),b=Q.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Kh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;zj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eGj&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304)}else{if(!d)if(a=Ch(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Dj(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Gj&&1073741824!==c&&(b.flags|=128,d=!0,Dj(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=L.current,G(L,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Hj(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(fj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Ij(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return zh(),E(Wf),E(H),Eh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Bh(b),null;case 13:E(L);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(L),null;case 4:return zh(),null;case 10:return ah(b.type._context),null;case 22:case 23:return Hj(),\nnull;case 24:return null;default:return null}}var Jj=!1,U=!1,Kj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Lj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Mj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Nj=!1;\nfunction Oj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Ci(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Nj;Nj=!1;return n}\nfunction Pj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Mj(b,c,f)}e=e.next}while(e!==d)}}function Qj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Rj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Sj(a){var b=a.alternate;null!==b&&(a.alternate=null,Sj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Tj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Uj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Tj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Vj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Vj(a,b,c),a=a.sibling;null!==a;)Vj(a,b,c),a=a.sibling}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}var X=null,Xj=!1;function Yj(a,b,c){for(c=c.child;null!==c;)Zj(a,b,c),c=c.sibling}\nfunction Zj(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Lj(c,b);case 6:var d=X,e=Xj;X=null;Yj(a,b,c);X=d;Xj=e;null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Xj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Xj;X=c.stateNode.containerInfo;Xj=!0;\nYj(a,b,c);X=d;Xj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Mj(c,b,g):0!==(f&4)&&Mj(c,b,g));e=e.next}while(e!==d)}Yj(a,b,c);break;case 1:if(!U&&(Lj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Yj(a,b,c);break;case 21:Yj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Yj(a,b,c),U=d):Yj(a,b,c);break;default:Yj(a,b,c)}}function ak(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Kj);b.forEach(function(b){var d=bk.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction ck(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*lk(d/1960))-d;if(10a?16:a;if(null===wk)var d=!1;else{a=wk;wk=null;xk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-fk?Kk(a,0):rk|=c);Dk(a,b)}function Yk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=R();a=ih(a,b);null!==a&&(Ac(a,b,c),Dk(a,c))}function uj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Yk(a,c)}\nfunction bk(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Yk(a,c)}var Vk;\nVk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)dh=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return dh=!1,yj(a,b,c);dh=0!==(a.flags&131072)?!0:!1}else dh=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;ij(a,b);a=b.pendingProps;var e=Yf(b,H.current);ch(b,c);e=Nh(null,b,d,a,e,c);var f=Sh();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,kh(b),e.updater=Ei,b.stateNode=e,e._reactInternals=b,Ii(b,d,a,c),b=jj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Xi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{ij(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=Zk(d);a=Ci(d,a);switch(e){case 0:b=cj(null,b,d,a,c);break a;case 1:b=hj(null,b,d,a,c);break a;case 11:b=Yi(null,b,d,a,c);break a;case 14:b=$i(null,b,d,Ci(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),cj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),hj(a,b,d,e,c);case 3:a:{kj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;lh(a,b);qh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ji(Error(p(423)),b);b=lj(a,b,d,c,e);break a}else if(d!==e){e=Ji(Error(p(424)),b);b=lj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Vg(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=Zi(a,b,c);break a}Xi(a,b,d,c)}b=b.child}return b;case 5:return Ah(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\ngj(a,b),Xi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return oj(a,b,c);case 4:return yh(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Ug(b,null,d,c):Xi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),Yi(a,b,d,e,c);case 7:return Xi(a,b,b.pendingProps,c),b.child;case 8:return Xi(a,b,b.pendingProps.children,c),b.child;case 12:return Xi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Wg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=Zi(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=mh(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);bh(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);bh(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Xi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,ch(b,c),e=eh(e),d=d(e),b.flags|=1,Xi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Ci(d,b.pendingProps),e=Ci(d.type,e),$i(a,b,d,e,c);case 15:return bj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Ci(d,e),ij(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,ch(b,c),Gi(b,d,e),Ii(b,d,e,c),jj(null,b,d,!0,a,c);case 19:return xj(a,b,c);case 22:return dj(a,b,c)}throw Error(p(156,b.tag));};function Fk(a,b){return ac(a,b)}\nfunction $k(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new $k(a,b,c,d)}function aj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction Zk(a){if(\"function\"===typeof a)return aj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction Pg(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction Rg(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)aj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Tg(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return pj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Tg(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function pj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function Qg(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction Sg(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction al(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function bl(a,b,c,d,e,f,g,h,k){a=new al(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};kh(f);return a}function cl(a,b,c){var d=3>>1,e=a[d];if(0>>1;dg(C,c))ng(x,C)?(a[d]=x,a[n]=c,d=n):(a[d]=C,a[m]=c,d=m);else if(ng(x,c))a[d]=x,a[n]=c,d=n;else break a}}return b}\nfunction g(a,b){var c=a.sortIndex-b.sortIndex;return 0!==c?c:a.id-b.id}if(\"object\"===typeof performance&&\"function\"===typeof performance.now){var l=performance;exports.unstable_now=function(){return l.now()}}else{var p=Date,q=p.now();exports.unstable_now=function(){return p.now()-q}}var r=[],t=[],u=1,v=null,y=3,z=!1,A=!1,B=!1,D=\"function\"===typeof setTimeout?setTimeout:null,E=\"function\"===typeof clearTimeout?clearTimeout:null,F=\"undefined\"!==typeof setImmediate?setImmediate:null;\n\"undefined\"!==typeof navigator&&void 0!==navigator.scheduling&&void 0!==navigator.scheduling.isInputPending&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function G(a){for(var b=h(t);null!==b;){if(null===b.callback)k(t);else if(b.startTime<=a)k(t),b.sortIndex=b.expirationTime,f(r,b);else break;b=h(t)}}function H(a){B=!1;G(a);if(!A)if(null!==h(r))A=!0,I(J);else{var b=h(t);null!==b&&K(H,b.startTime-a)}}\nfunction J(a,b){A=!1;B&&(B=!1,E(L),L=-1);z=!0;var c=y;try{G(b);for(v=h(r);null!==v&&(!(v.expirationTime>b)||a&&!M());){var d=v.callback;if(\"function\"===typeof d){v.callback=null;y=v.priorityLevel;var e=d(v.expirationTime<=b);b=exports.unstable_now();\"function\"===typeof e?v.callback=e:v===h(r)&&k(r);G(b)}else k(r);v=h(r)}if(null!==v)var w=!0;else{var m=h(t);null!==m&&K(H,m.startTime-b);w=!1}return w}finally{v=null,y=c,z=!1}}var N=!1,O=null,L=-1,P=5,Q=-1;\nfunction M(){return exports.unstable_now()-Qa||125d?(a.sortIndex=c,f(t,a),null===h(r)&&a===h(t)&&(B?(E(L),L=-1):B=!0,K(H,c-d))):(a.sortIndex=e,f(r,a),A||z||(A=!0,I(J)));return a};\nexports.unstable_shouldYield=M;exports.unstable_wrapCallback=function(a){var b=y;return function(){var c=y;y=b;try{return a.apply(this,arguments)}finally{y=c}}};\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/scheduler.production.min.js');\n} else {\n module.exports = require('./cjs/scheduler.development.js');\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n// expose the modules object (__webpack_modules__)\n__webpack_require__.m = __webpack_modules__;\n\n","// getDefaultExport function for compatibility with non-harmony modules\n__webpack_require__.n = (module) => {\n\tvar getter = module && module.__esModule ?\n\t\t() => (module['default']) :\n\t\t() => (module);\n\t__webpack_require__.d(getter, { a: getter });\n\treturn getter;\n};","var getProto = Object.getPrototypeOf ? (obj) => (Object.getPrototypeOf(obj)) : (obj) => (obj.__proto__);\nvar leafPrototypes;\n// create a fake namespace object\n// mode & 1: value is a module id, require it\n// mode & 2: merge all properties of value into the ns\n// mode & 4: return value when already ns object\n// mode & 16: return value when it's Promise-like\n// mode & 8|1: behave like require\n__webpack_require__.t = function(value, mode) {\n\tif(mode & 1) value = this(value);\n\tif(mode & 8) return value;\n\tif(typeof value === 'object' && value) {\n\t\tif((mode & 4) && value.__esModule) return value;\n\t\tif((mode & 16) && typeof value.then === 'function') return value;\n\t}\n\tvar ns = Object.create(null);\n\t__webpack_require__.r(ns);\n\tvar def = {};\n\tleafPrototypes = leafPrototypes || [null, getProto({}), getProto([]), getProto(getProto)];\n\tfor(var current = mode & 2 && value; typeof current == 'object' && !~leafPrototypes.indexOf(current); current = getProto(current)) {\n\t\tObject.getOwnPropertyNames(current).forEach((key) => (def[key] = () => (value[key])));\n\t}\n\tdef['default'] = () => (value);\n\t__webpack_require__.d(ns, def);\n\treturn ns;\n};","// define getter functions for harmony exports\n__webpack_require__.d = (exports, definition) => {\n\tfor(var key in definition) {\n\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n\t\t}\n\t}\n};","__webpack_require__.f = {};\n// This file contains only the entry chunk.\n// The chunk loading function for additional chunks\n__webpack_require__.e = (chunkId) => {\n\treturn Promise.all(Object.keys(__webpack_require__.f).reduce((promises, key) => {\n\t\t__webpack_require__.f[key](chunkId, promises);\n\t\treturn promises;\n\t}, []));\n};","// This function allow to reference async chunks\n__webpack_require__.u = (chunkId) => {\n\t// return url for filenames based on template\n\treturn \"static/js/\" + chunkId + \".\" + \"e265d430\" + \".chunk.js\";\n};","// This function allow to reference async chunks\n__webpack_require__.miniCssF = (chunkId) => {\n\t// return url for filenames based on template\n\treturn undefined;\n};","__webpack_require__.g = (function() {\n\tif (typeof globalThis === 'object') return globalThis;\n\ttry {\n\t\treturn this || new Function('return this')();\n\t} catch (e) {\n\t\tif (typeof window === 'object') return window;\n\t}\n})();","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","var inProgress = {};\nvar dataWebpackPrefix = \"bigpie_manual:\";\n// loadScript function to load a script via script tag\n__webpack_require__.l = (url, done, key, chunkId) => {\n\tif(inProgress[url]) { inProgress[url].push(done); return; }\n\tvar script, needAttach;\n\tif(key !== undefined) {\n\t\tvar scripts = document.getElementsByTagName(\"script\");\n\t\tfor(var i = 0; i < scripts.length; i++) {\n\t\t\tvar s = scripts[i];\n\t\t\tif(s.getAttribute(\"src\") == url || s.getAttribute(\"data-webpack\") == dataWebpackPrefix + key) { script = s; break; }\n\t\t}\n\t}\n\tif(!script) {\n\t\tneedAttach = true;\n\t\tscript = document.createElement('script');\n\n\t\tscript.charset = 'utf-8';\n\t\tscript.timeout = 120;\n\t\tif (__webpack_require__.nc) {\n\t\t\tscript.setAttribute(\"nonce\", __webpack_require__.nc);\n\t\t}\n\t\tscript.setAttribute(\"data-webpack\", dataWebpackPrefix + key);\n\n\t\tscript.src = url;\n\t}\n\tinProgress[url] = [done];\n\tvar onScriptComplete = (prev, event) => {\n\t\t// avoid mem leaks in IE.\n\t\tscript.onerror = script.onload = null;\n\t\tclearTimeout(timeout);\n\t\tvar doneFns = inProgress[url];\n\t\tdelete inProgress[url];\n\t\tscript.parentNode && script.parentNode.removeChild(script);\n\t\tdoneFns && doneFns.forEach((fn) => (fn(event)));\n\t\tif(prev) return prev(event);\n\t}\n\tvar timeout = setTimeout(onScriptComplete.bind(null, undefined, { type: 'timeout', target: script }), 120000);\n\tscript.onerror = onScriptComplete.bind(null, script.onerror);\n\tscript.onload = onScriptComplete.bind(null, script.onload);\n\tneedAttach && document.head.appendChild(script);\n};","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","__webpack_require__.p = \"/\";","// no baseURI\n\n// object to store loaded and loading chunks\n// undefined = chunk not loaded, null = chunk preloaded/prefetched\n// [resolve, reject, Promise] = chunk loading, 0 = chunk loaded\nvar installedChunks = {\n\t792: 0\n};\n\n__webpack_require__.f.j = (chunkId, promises) => {\n\t\t// JSONP chunk loading for javascript\n\t\tvar installedChunkData = __webpack_require__.o(installedChunks, chunkId) ? installedChunks[chunkId] : undefined;\n\t\tif(installedChunkData !== 0) { // 0 means \"already installed\".\n\n\t\t\t// a Promise means \"currently loading\".\n\t\t\tif(installedChunkData) {\n\t\t\t\tpromises.push(installedChunkData[2]);\n\t\t\t} else {\n\t\t\t\tif(true) { // all chunks have JS\n\t\t\t\t\t// setup Promise in chunk cache\n\t\t\t\t\tvar promise = new Promise((resolve, reject) => (installedChunkData = installedChunks[chunkId] = [resolve, reject]));\n\t\t\t\t\tpromises.push(installedChunkData[2] = promise);\n\n\t\t\t\t\t// start chunk loading\n\t\t\t\t\tvar url = __webpack_require__.p + __webpack_require__.u(chunkId);\n\t\t\t\t\t// create error before stack unwound to get useful stacktrace later\n\t\t\t\t\tvar error = new Error();\n\t\t\t\t\tvar loadingEnded = (event) => {\n\t\t\t\t\t\tif(__webpack_require__.o(installedChunks, chunkId)) {\n\t\t\t\t\t\t\tinstalledChunkData = installedChunks[chunkId];\n\t\t\t\t\t\t\tif(installedChunkData !== 0) installedChunks[chunkId] = undefined;\n\t\t\t\t\t\t\tif(installedChunkData) {\n\t\t\t\t\t\t\t\tvar errorType = event && (event.type === 'load' ? 'missing' : event.type);\n\t\t\t\t\t\t\t\tvar realSrc = event && event.target && event.target.src;\n\t\t\t\t\t\t\t\terror.message = 'Loading chunk ' + chunkId + ' failed.\\n(' + errorType + ': ' + realSrc + ')';\n\t\t\t\t\t\t\t\terror.name = 'ChunkLoadError';\n\t\t\t\t\t\t\t\terror.type = errorType;\n\t\t\t\t\t\t\t\terror.request = realSrc;\n\t\t\t\t\t\t\t\tinstalledChunkData[1](error);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\t__webpack_require__.l(url, loadingEnded, \"chunk-\" + chunkId, chunkId);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n};\n\n// no prefetching\n\n// no preloaded\n\n// no HMR\n\n// no HMR manifest\n\n// no on chunks loaded\n\n// install a JSONP callback for chunk loading\nvar webpackJsonpCallback = (parentChunkLoadingFunction, data) => {\n\tvar chunkIds = data[0];\n\tvar moreModules = data[1];\n\tvar runtime = data[2];\n\t// add \"moreModules\" to the modules object,\n\t// then flag all \"chunkIds\" as loaded and fire callback\n\tvar moduleId, chunkId, i = 0;\n\tif(chunkIds.some((id) => (installedChunks[id] !== 0))) {\n\t\tfor(moduleId in moreModules) {\n\t\t\tif(__webpack_require__.o(moreModules, moduleId)) {\n\t\t\t\t__webpack_require__.m[moduleId] = moreModules[moduleId];\n\t\t\t}\n\t\t}\n\t\tif(runtime) var result = runtime(__webpack_require__);\n\t}\n\tif(parentChunkLoadingFunction) parentChunkLoadingFunction(data);\n\tfor(;i < chunkIds.length; i++) {\n\t\tchunkId = chunkIds[i];\n\t\tif(__webpack_require__.o(installedChunks, chunkId) && installedChunks[chunkId]) {\n\t\t\tinstalledChunks[chunkId][0]();\n\t\t}\n\t\tinstalledChunks[chunkId] = 0;\n\t}\n\n}\n\nvar chunkLoadingGlobal = self[\"webpackChunkbigpie_manual\"] = self[\"webpackChunkbigpie_manual\"] || [];\nchunkLoadingGlobal.forEach(webpackJsonpCallback.bind(null, 0));\nchunkLoadingGlobal.push = webpackJsonpCallback.bind(null, chunkLoadingGlobal.push.bind(chunkLoadingGlobal));","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Pop = \"POP\",\n\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Push = \"PUSH\",\n\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n /**\n * A URL pathname, beginning with a /.\n */\n pathname: string;\n\n /**\n * A URL search string, beginning with a ?.\n */\n search: string;\n\n /**\n * A URL fragment identifier, beginning with a #.\n */\n hash: string;\n}\n\n// TODO: (v7) Change the Location generic default from `any` to `unknown` and\n// remove Remix `useLocation` wrapper.\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location extends Path {\n /**\n * A value of arbitrary data associated with this location.\n */\n state: State;\n\n /**\n * A unique string associated with this location. May be used to safely store\n * and retrieve data in some other storage API, like `localStorage`.\n *\n * Note: This value is always \"default\" on the initial location.\n */\n key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n /**\n * The action that triggered the change.\n */\n action: Action;\n\n /**\n * The new location.\n */\n location: Location;\n\n /**\n * The delta between this location and the former location in the history stack\n */\n delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. This may be either a URL or the pieces\n * of a URL path.\n */\nexport type To = string | Partial;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n /**\n * The last action that modified the current location. This will always be\n * Action.Pop when a history instance is first created. This value is mutable.\n */\n readonly action: Action;\n\n /**\n * The current location. This value is mutable.\n */\n readonly location: Location;\n\n /**\n * Returns a valid href for the given `to` value that may be used as\n * the value of an attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience, so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly {\n let location: Readonly = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial {\n let parsedPath: Partial = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n // Treating this as a full URL will strip any trailing spaces so we need to\n // pre-encode them since they might be part of a matching splat param from\n // an ancestor route\n href = href.replace(/ $/, \"%20\");\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { invariant, parsePath, warning } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n // We keep the raw Response for redirects so we can return it verbatim\n response: Response;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: unknown;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase;\n\n/**\n * Users can specify either lowercase or uppercase form methods on `
`,\n * useSubmit(), ``, etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs {\n request: Request;\n params: Params;\n context?: Context;\n}\n\n// TODO: (v7) Change the defaults from any to unknown in and remove Remix wrappers:\n// ActionFunction, ActionFunctionArgs, LoaderFunction, LoaderFunctionArgs\n// Also, make them a type alias instead of an interface\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs\n extends DataFunctionArgs {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable | null;\n\ntype DataFunctionReturnValue = Promise | DataFunctionValue;\n\n/**\n * Route loader function signature\n */\nexport type LoaderFunction = {\n (\n args: LoaderFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n} & { hydrate?: boolean };\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction {\n (\n args: ActionFunctionArgs,\n handlerCtx?: unknown\n ): DataFunctionReturnValue;\n}\n\n/**\n * Arguments passed to shouldRevalidate function\n */\nexport interface ShouldRevalidateFunctionArgs {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n actionStatus?: number;\n actionResult?: any;\n defaultShouldRevalidate: boolean;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: ShouldRevalidateFunctionArgs): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\nexport interface DataStrategyMatch\n extends AgnosticRouteMatch {\n shouldLoad: boolean;\n resolve: (\n handlerOverride?: (\n handler: (ctx?: unknown) => DataFunctionReturnValue\n ) => DataFunctionReturnValue\n ) => Promise;\n}\n\nexport interface DataStrategyFunctionArgs\n extends DataFunctionArgs {\n matches: DataStrategyMatch[];\n fetcherKey: string | null;\n}\n\n/**\n * Result from a loader or action called via dataStrategy\n */\nexport interface DataStrategyResult {\n type: \"data\" | \"error\";\n result: unknown; // data, Error, Response, DeferredData, DataWithResponseInit\n}\n\nexport interface DataStrategyFunction {\n (args: DataStrategyFunctionArgs): Promise>;\n}\n\nexport type AgnosticPatchRoutesOnNavigationFunctionArgs<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = {\n path: string;\n matches: M[];\n patch: (routeId: string | null, children: O[]) => void;\n};\n\nexport type AgnosticPatchRoutesOnNavigationFunction<\n O extends AgnosticRouteObject = AgnosticRouteObject,\n M extends AgnosticRouteMatch = AgnosticRouteMatch\n> = (\n opts: AgnosticPatchRoutesOnNavigationFunctionArgs\n) => void | Promise;\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit & Required> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction {\n (): Promise>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction | boolean;\n action?: ActionFunction | boolean;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam | _PathParam\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\nexport type PathParam =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam\n : // look for params in the absence of wildcards\n _PathParam;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise, return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey =\n // if you could not find path params, fallback to `string`\n [PathParam] extends [never] ? string : PathParam;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary, so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: string[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, String(index)];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename = \"/\"\n): AgnosticRouteMatch[] | null {\n return matchRoutesImpl(routes, locationArg, basename, false);\n}\n\nexport function matchRoutesImpl<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename: string,\n allowPartial: boolean\n): AgnosticRouteMatch[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n let decoded = decodePath(pathname);\n matches = matchRouteBranch(\n branches[i],\n decoded,\n allowPartial\n );\n }\n\n return matches;\n}\n\nexport interface UIMatch {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: Data;\n handle: Handle;\n}\n\nexport function convertRouteMatchToUiMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UIMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id],\n handle: route.handle,\n };\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch[] = [],\n parentsMeta: RouteMeta[] = [],\n parentPath = \"\"\n): RouteBranch[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array, so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children, so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explode _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then, if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:[\\w-]+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch,\n pathname: string,\n allowPartial = false\n): AgnosticRouteMatch[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n let route = meta.route;\n\n if (\n !match &&\n end &&\n allowPartial &&\n !routesMeta[routesMeta.length - 1].route.index\n ) {\n match = matchPath(\n {\n path: meta.relativePath,\n caseSensitive: meta.caseSensitive,\n end: false,\n },\n remainingPathname\n );\n }\n\n if (!match) {\n return null;\n }\n\n Object.assign(matchedParams, match.params);\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nexport function generatePath(\n originalPath: Path,\n params: {\n [key in PathParam]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:([\\w-]+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey,\n Path extends string\n>(\n pattern: PathPattern | Path,\n pathname: string\n): PathMatch | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, compiledParams] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = compiledParams.reduce>(\n (memo, { paramName, isOptional }, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n const value = captureGroups[index];\n if (isOptional && !value) {\n memo[paramName] = undefined;\n } else {\n memo[paramName] = (value || \"\").replace(/%2F/g, \"/\");\n }\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\ntype CompiledPathParam = { paramName: string; isOptional?: boolean };\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, CompiledPathParam[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let params: CompiledPathParam[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^${}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(\n /\\/:([\\w-]+)(\\?)?/g,\n (_: string, paramName: string, isOptional) => {\n params.push({ paramName, isOptional: isOptional != null });\n return isOptional ? \"/?([^\\\\/]+)?\" : \"/([^\\\\/]+)\";\n }\n );\n\n if (path.endsWith(\"*\")) {\n params.push({ paramName: \"*\" });\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex, so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, params];\n}\n\nexport function decodePath(value: string) {\n try {\n return value\n .split(\"/\")\n .map((v) => decodeURIComponent(v).replace(/\\//g, \"%2F\"))\n .join(\"/\");\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n// Return the array of pathnames for the current route matches - used to\n// generate the routePathnames input for resolveTo()\nexport function getResolveToMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[], v7_relativeSplatPath: boolean) {\n let pathMatches = getPathContributingMatches(matches);\n\n // When v7_relativeSplatPath is enabled, use the full pathname for the leaf\n // match so we include splat values for \".\" links. See:\n // https://github.com/remix-run/react-router/issues/11052#issuecomment-1836589329\n if (v7_relativeSplatPath) {\n return pathMatches.map((match, idx) =>\n idx === pathMatches.length - 1 ? match.pathname : match.pathnameBase\n );\n }\n\n return pathMatches.map((match) => match.pathnameBase);\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n // With relative=\"route\" (the default), each leading .. segment means\n // \"go up one route\" instead of \"go up one URL segment\". This is a key\n // difference from how works and a major reason we call this a\n // \"to\" value instead of a \"href\".\n if (!isPathRelative && toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = (\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport class DataWithResponseInit {\n type: string = \"DataWithResponseInit\";\n data: D;\n init: ResponseInit | null;\n\n constructor(data: D, init?: ResponseInit) {\n this.data = data;\n this.init = init || null;\n }\n}\n\n/**\n * Create \"responses\" that contain `status`/`headers` without forcing\n * serialization into an actual `Response` - used by Remix single fetch\n */\nexport function data(data: D, init?: number | ResponseInit) {\n return new DataWithResponseInit(\n data,\n typeof init === \"number\" ? { status: init } : init\n );\n}\n\nexport interface TrackedPromise extends Promise {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set = new Set();\n private controller: AbortController;\n private abortPromise: Promise;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record,\n init?: number | ResponseInit\n) => DeferredData;\n\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\n/**\n * A redirect response that will perform a `history.replaceState` instead of a\n * `history.pushState` for client-side navigation redirects.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const replace: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Replace\", \"true\");\n return response;\n};\n\nexport type ErrorResponse = {\n status: number;\n statusText: string;\n data: any;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n *\n * We don't export the class for public use since it's an implementation\n * detail, but we export the interface above so folks can build their own\n * abstractions around instances via isRouteErrorResponse()\n */\nexport class ErrorResponseImpl implements ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n private error?: Error;\n private internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n DataStrategyMatch,\n AgnosticRouteObject,\n DataResult,\n DataStrategyFunction,\n DataStrategyFunctionArgs,\n DeferredData,\n DeferredResult,\n DetectErrorBoundaryFunction,\n ErrorResult,\n FormEncType,\n FormMethod,\n HTMLFormMethod,\n DataStrategyResult,\n ImmutableRouteKey,\n MapRoutePropertiesFunction,\n MutationFormMethod,\n RedirectResult,\n RouteData,\n RouteManifest,\n ShouldRevalidateFunctionArgs,\n Submission,\n SuccessResult,\n UIMatch,\n V7_FormMethod,\n V7_MutationFormMethod,\n AgnosticPatchRoutesOnNavigationFunction,\n DataWithResponseInit,\n} from \"./utils\";\nimport {\n ErrorResponseImpl,\n ResultType,\n convertRouteMatchToUiMatch,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n getResolveToMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n matchRoutesImpl,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the future config for the router\n */\n get future(): FutureConfig;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the window associated with the router\n */\n get window(): RouterInit[\"window\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher(key: string): Fetcher;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE DO NOT USE\n *\n * Patch additional children routes into an existing parent route\n * @param routeId The parent route id or a callback function accepting `patch`\n * to perform batch patching\n * @param children The additional children routes\n */\n patchRoutes(routeId: string | null, children: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map;\n\n /**\n * Map of current blockers\n */\n blockers: Map;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_fetcherPersist: boolean;\n v7_normalizeFormMethod: boolean;\n v7_partialHydration: boolean;\n v7_prependBasename: boolean;\n v7_relativeSplatPath: boolean;\n v7_skipActionErrorRevalidation: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n hydrationData?: HydrationState;\n window?: Window;\n dataStrategy?: DataStrategyFunction;\n patchRoutesOnNavigation?: AgnosticPatchRoutesOnNavigationFunction;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record;\n actionHeaders: Record;\n activeDeferreds: Record | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise;\n queryRoute(\n request: Request,\n opts?: {\n routeId?: string;\n requestContext?: unknown;\n dataStrategy?: DataStrategyFunction;\n }\n ): Promise;\n}\n\ntype ViewTransitionOpts = {\n currentLocation: Location;\n nextLocation: Location;\n};\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (\n state: RouterState,\n opts: {\n deletedFetchers: string[];\n viewTransitionOpts?: ViewTransitionOpts;\n flushSync: boolean;\n }\n ): void;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UIMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n viewTransition?: boolean;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n };\n};\n\nexport type Fetcher =\n FetcherStates[keyof FetcherStates];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ntype PendingActionResult = [string, SuccessResult | ErrorResult];\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * Tuple for the returned or thrown value from the current action. The routeId\n * is the action route for success and the bubbled boundary route for errors.\n */\n pendingActionResult?: PendingActionResult;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * Route matches which may have been updated from fog of war discovery\n */\n matches?: RouterState[\"matches\"];\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\nconst TRANSITIONS_STORAGE_KEY = \"remix-router-transitions\";\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n let dataStrategyImpl = init.dataStrategy || defaultDataStrategy;\n let patchRoutesOnNavigationImpl = init.patchRoutesOnNavigation;\n\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_fetcherPersist: false,\n v7_normalizeFormMethod: false,\n v7_partialHydration: false,\n v7_prependBasename: false,\n v7_relativeSplatPath: false,\n v7_skipActionErrorRevalidation: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null && !patchRoutesOnNavigationImpl) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n // In SPA apps, if the user provided a patchRoutesOnNavigation implementation and\n // our initial match is a splat route, clear them out so we run through lazy\n // discovery on hydration in case there's a more accurate lazy route match.\n // In SSR apps (with `hydrationData`), we expect that the server will send\n // up the proper matched routes so we don't want to run lazy discovery on\n // initial hydration and want to hydrate into the splat route.\n if (initialMatches && !init.hydrationData) {\n let fogOfWar = checkFogOfWar(\n initialMatches,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active) {\n initialMatches = null;\n }\n }\n\n let initialized: boolean;\n if (!initialMatches) {\n initialized = false;\n initialMatches = [];\n\n // If partial hydration and fog of war is enabled, we will be running\n // `patchRoutesOnNavigation` during hydration so include any partial matches as\n // the initial matches so we can properly render `HydrateFallback`'s\n if (future.v7_partialHydration) {\n let fogOfWar = checkFogOfWar(\n null,\n dataRoutes,\n init.history.location.pathname\n );\n if (fogOfWar.active && fogOfWar.matches) {\n initialMatches = fogOfWar.matches;\n }\n }\n } else if (initialMatches.some((m) => m.route.lazy)) {\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n initialized = false;\n } else if (!initialMatches.some((m) => m.route.loader)) {\n // If we've got no loaders to run, then we're good to go\n initialized = true;\n } else if (future.v7_partialHydration) {\n // If partial hydration is enabled, we're initialized so long as we were\n // provided with hydrationData for every route with a loader, and no loaders\n // were marked for explicit hydration\n let loaderData = init.hydrationData ? init.hydrationData.loaderData : null;\n let errors = init.hydrationData ? init.hydrationData.errors : null;\n // If errors exist, don't consider routes below the boundary\n if (errors) {\n let idx = initialMatches.findIndex(\n (m) => errors![m.route.id] !== undefined\n );\n initialized = initialMatches\n .slice(0, idx + 1)\n .every((m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors));\n } else {\n initialized = initialMatches.every(\n (m) => !shouldLoadRouteOnHydration(m.route, loaderData, errors)\n );\n }\n } else {\n // Without partial hydration - we're initialized if we were provided any\n // hydrationData - which is expected to be complete\n initialized = init.hydrationData != null;\n }\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // Should the current navigation enable document.startViewTransition?\n let pendingViewTransitionEnabled = false;\n\n // Store applied view transitions so we can apply them on POP\n let appliedViewTransitions: Map> = new Map<\n string,\n Set\n >();\n\n // Cleanup function for persisting applied transitions to sessionStorage\n let removePageHideEventListener: (() => void) | null = null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: Set = new Set();\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n\n // Ref-count mounted fetchers so we know when it's ok to clean them up\n let activeFetchers = new Map();\n\n // Fetchers that have requested a delete when using v7_fetcherPersist,\n // they'll be officially removed after they return to idle\n let deletedFetchers = new Set();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n\n // Map of pending patchRoutesOnNavigation() promises (keyed by path/matches) so\n // that we only kick them off once for a given combo\n let pendingPatchRoutes = new Map<\n string,\n ReturnType\n >();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let unblockBlockerHistoryUpdate: (() => void) | undefined = undefined;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (unblockBlockerHistoryUpdate) {\n unblockBlockerHistoryUpdate();\n unblockBlockerHistoryUpdate = undefined;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n let nextHistoryUpdatePromise = new Promise((resolve) => {\n unblockBlockerHistoryUpdate = resolve;\n });\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked, after the url\n // restoration is also complete. See:\n // https://github.com/remix-run/react-router/issues/11613\n nextHistoryUpdatePromise.then(() => init.history.go(delta));\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n if (isBrowser) {\n // FIXME: This feels gross. How can we cleanup the lines between\n // scrollRestoration/appliedTransitions persistance?\n restoreAppliedTransitions(routerWindow, appliedViewTransitions);\n let _saveAppliedTransitions = () =>\n persistAppliedTransitions(routerWindow, appliedViewTransitions);\n routerWindow.addEventListener(\"pagehide\", _saveAppliedTransitions);\n removePageHideEventListener = () =>\n routerWindow.removeEventListener(\"pagehide\", _saveAppliedTransitions);\n }\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location, {\n initialHydration: true,\n });\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n if (removePageHideEventListener) {\n removePageHideEventListener();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(\n newState: Partial,\n opts: {\n flushSync?: boolean;\n viewTransitionOpts?: ViewTransitionOpts;\n } = {}\n ): void {\n state = {\n ...state,\n ...newState,\n };\n\n // Prep fetcher cleanup so we can tell the UI which fetcher data entries\n // can be removed\n let completedFetchers: string[] = [];\n let deletedFetchersKeys: string[] = [];\n\n if (future.v7_fetcherPersist) {\n state.fetchers.forEach((fetcher, key) => {\n if (fetcher.state === \"idle\") {\n if (deletedFetchers.has(key)) {\n // Unmounted from the UI and can be totally removed\n deletedFetchersKeys.push(key);\n } else {\n // Returned to idle but still mounted in the UI, so semi-remains for\n // revalidations and such\n completedFetchers.push(key);\n }\n }\n });\n }\n\n // Iterate over a local copy so that if flushSync is used and we end up\n // removing and adding a new subscriber due to the useCallback dependencies,\n // we don't get ourselves into a loop calling the new subscriber immediately\n [...subscribers].forEach((subscriber) =>\n subscriber(state, {\n deletedFetchers: deletedFetchersKeys,\n viewTransitionOpts: opts.viewTransitionOpts,\n flushSync: opts.flushSync === true,\n })\n );\n\n // Remove idle fetchers from state since we only care about in-flight fetchers.\n if (future.v7_fetcherPersist) {\n completedFetchers.forEach((key) => state.fetchers.delete(key));\n deletedFetchersKeys.forEach((key) => deleteFetcher(key));\n }\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial>,\n { flushSync }: { flushSync?: boolean } = {}\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n // Commit any in-flight routes at the end of the HMR revalidation \"navigation\"\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n let viewTransitionOpts: ViewTransitionOpts | undefined;\n\n // On POP, enable transitions if they were enabled on the original navigation\n if (pendingAction === HistoryAction.Pop) {\n // Forward takes precedence so they behave like the original navigation\n let priorPaths = appliedViewTransitions.get(state.location.pathname);\n if (priorPaths && priorPaths.has(location.pathname)) {\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n } else if (appliedViewTransitions.has(location.pathname)) {\n // If we don't have a previous forward nav, assume we're popping back to\n // the new location and enable if that location previously enabled\n viewTransitionOpts = {\n currentLocation: location,\n nextLocation: state.location,\n };\n }\n } else if (pendingViewTransitionEnabled) {\n // Store the applied transition on PUSH/REPLACE\n let toPaths = appliedViewTransitions.get(state.location.pathname);\n if (toPaths) {\n toPaths.add(location.pathname);\n } else {\n toPaths = new Set([location.pathname]);\n appliedViewTransitions.set(state.location.pathname, toPaths);\n }\n viewTransitionOpts = {\n currentLocation: state.location,\n nextLocation: location,\n };\n }\n\n updateState(\n {\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n },\n {\n viewTransitionOpts,\n flushSync: flushSync === true,\n }\n );\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n pendingViewTransitionEnabled = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n future.v7_relativeSplatPath,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n enableViewTransition: opts && opts.viewTransition,\n flushSync,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n {\n overrideNavigation: state.navigation,\n // Proxy through any rending view transition\n enableViewTransition: pendingViewTransitionEnabled === true,\n }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n initialHydration?: boolean;\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponseImpl;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n enableViewTransition?: boolean;\n flushSync?: boolean;\n }\n ): Promise {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n pendingViewTransitionEnabled = (opts && opts.enableViewTransition) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename);\n let flushSync = (opts && opts.flushSync) === true;\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, location.pathname);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n completeNavigation(\n location,\n {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n },\n { flushSync }\n );\n return;\n }\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial hydration will always\n // be \"same hash\". For example, on /page#hash and submit a \n // which will default to a navigation to /page\n if (\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches }, { flushSync });\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionResult: PendingActionResult | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingActionResult = [\n findNearestBoundary(matches).route.id,\n { type: ResultType.error, error: opts.pendingError },\n ];\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionResult = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n fogOfWar.active,\n { replace: opts.replace, flushSync }\n );\n\n if (actionResult.shortCircuited) {\n return;\n }\n\n // If we received a 404 from handleAction, it's because we couldn't lazily\n // discover the destination route so we don't want to call loaders\n if (actionResult.pendingActionResult) {\n let [routeId, result] = actionResult.pendingActionResult;\n if (\n isErrorResult(result) &&\n isRouteErrorResponse(result.error) &&\n result.error.status === 404\n ) {\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: actionResult.matches,\n loaderData: {},\n errors: {\n [routeId]: result.error,\n },\n });\n return;\n }\n }\n\n matches = actionResult.matches || matches;\n pendingActionResult = actionResult.pendingActionResult;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n flushSync = false;\n // No need to do fog of war matching again on loader execution\n fogOfWar.active = false;\n\n // Create a GET request for the loaders\n request = createClientSideRequest(\n init.history,\n request.url,\n request.signal\n );\n }\n\n // Call loaders\n let {\n shortCircuited,\n matches: updatedMatches,\n loaderData,\n errors,\n } = await handleLoaders(\n request,\n location,\n matches,\n fogOfWar.active,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n opts && opts.initialHydration === true,\n flushSync,\n pendingActionResult\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches: updatedMatches || matches,\n ...getActionDataForCommit(pendingActionResult),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n opts: { replace?: boolean; flushSync?: boolean } = {}\n ): Promise {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation }, { flushSync: opts.flushSync === true });\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n pendingActionResult: [\n boundaryId,\n {\n type: ResultType.error,\n error: discoverResult.error,\n },\n ],\n };\n } else if (!discoverResult.matches) {\n let { notFoundMatches, error, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n pendingActionResult: [\n route.id,\n {\n type: ResultType.error,\n error,\n },\n ],\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n state,\n request,\n [actionMatch],\n matches,\n null\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n let location = normalizeRedirectLocation(\n result.response.headers.get(\"Location\")!,\n new URL(request.url),\n basename\n );\n replace = location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(request, result, true, {\n submission,\n replace,\n });\n return { shortCircuited: true };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions to the current location are REPLACE\n // navigations, but if the action threw an error that'll be rendered in\n // an errorElement, we fall back to PUSH so that the user can use the\n // back button to get back to the pre-submission form location to try\n // again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n matches,\n pendingActionResult: [boundaryMatch.route.id, result],\n };\n }\n\n return {\n matches,\n pendingActionResult: [actionMatch.route.id, result],\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n initialHydration?: boolean,\n flushSync?: boolean,\n pendingActionResult?: PendingActionResult\n ): Promise {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n // If we have partialHydration enabled, then don't update the state for the\n // initial data load since it's not a \"navigation\"\n let shouldUpdateNavigationState =\n !isUninterruptedRevalidation &&\n (!future.v7_partialHydration || !initialHydration);\n\n // When fog of war is enabled, we enter our `loading` state earlier so we\n // can discover new routes during the `loading` state. We skip this if\n // we've already run actions since we would have done our matching already.\n // If the children() function threw then, we want to proceed with the\n // partial matches it discovered.\n if (isFogOfWar) {\n if (shouldUpdateNavigationState) {\n let actionData = getUpdatedActionData(pendingActionResult);\n updateState(\n {\n navigation: loadingNavigation,\n ...(actionData !== undefined ? { actionData } : {}),\n },\n {\n flushSync,\n }\n );\n }\n\n let discoverResult = await discoverRoutes(\n matches,\n location.pathname,\n request.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return { shortCircuited: true };\n } else if (discoverResult.type === \"error\") {\n let boundaryId = findNearestBoundary(discoverResult.partialMatches)\n .route.id;\n return {\n matches: discoverResult.partialMatches,\n loaderData: {},\n errors: {\n [boundaryId]: discoverResult.error,\n },\n };\n } else if (!discoverResult.matches) {\n let { error, notFoundMatches, route } = handleNavigational404(\n location.pathname\n );\n return {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n };\n } else {\n matches = discoverResult.matches;\n }\n }\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n future.v7_partialHydration && initialHydration === true,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionResult\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(\n location,\n {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? { [pendingActionResult[0]]: pendingActionResult[1].error }\n : null,\n ...getActionDataForCommit(pendingActionResult),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n },\n { flushSync }\n );\n return { shortCircuited: true };\n }\n\n if (shouldUpdateNavigationState) {\n let updates: Partial = {};\n if (!isFogOfWar) {\n // Only update navigation/actionNData if we didn't already do it above\n updates.navigation = loadingNavigation;\n let actionData = getUpdatedActionData(pendingActionResult);\n if (actionData !== undefined) {\n updates.actionData = actionData;\n }\n }\n if (revalidatingFetchers.length > 0) {\n updates.fetchers = getUpdatedRevalidatingFetchers(revalidatingFetchers);\n }\n updateState(updates, { flushSync });\n }\n\n revalidatingFetchers.forEach((rf) => {\n abortFetcher(rf.key);\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n await startRedirectNavigation(request, redirect.result, true, {\n replace,\n });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n pendingActionResult,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n // Preserve SSR errors during partial hydration\n if (future.v7_partialHydration && initialHydration && state.errors) {\n errors = { ...state.errors, ...errors };\n }\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n matches,\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n function getUpdatedActionData(\n pendingActionResult: PendingActionResult | undefined\n ): Record | null | undefined {\n if (pendingActionResult && !isErrorResult(pendingActionResult[1])) {\n // This is cast to `any` currently because `RouteData`uses any and it\n // would be a breaking change to use any.\n // TODO: v7 - change `RouteData` to use `unknown` instead of `any`\n return {\n [pendingActionResult[0]]: pendingActionResult[1].data as any,\n };\n } else if (state.actionData) {\n if (Object.keys(state.actionData).length === 0) {\n return null;\n } else {\n return state.actionData;\n }\n }\n }\n\n function getUpdatedRevalidatingFetchers(\n revalidatingFetchers: RevalidatingFetcher[]\n ) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n return new Map(state.fetchers);\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n abortFetcher(key);\n\n let flushSync = (opts && opts.flushSync) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n future.v7_relativeSplatPath,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n let fogOfWar = checkFogOfWar(matches, routesToUse, normalizedPath);\n if (fogOfWar.active && fogOfWar.matches) {\n matches = fogOfWar.matches;\n }\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath }),\n { flushSync }\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error, { flushSync });\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n let preventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(\n key,\n routeId,\n path,\n match,\n matches,\n fogOfWar.active,\n flushSync,\n preventScrollReset,\n submission\n );\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n function detectAndHandle405Error(m: AgnosticDataRouteMatch) {\n if (!m.route.action && !m.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error, { flushSync });\n return true;\n }\n return false;\n }\n\n if (!isFogOfWar && detectAndHandle405Error(match)) {\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(key, getSubmittingFetcher(submission, existingFetcher), {\n flushSync,\n });\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n requestMatches,\n path,\n fetchRequest.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n requestMatches = discoverResult.matches;\n match = getTargetMatch(requestMatches, path);\n\n if (detectAndHandle405Error(match)) {\n return;\n }\n }\n }\n\n // Call the action for the fetcher\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResults = await callDataStrategy(\n \"action\",\n state,\n fetchRequest,\n [match],\n requestMatches,\n key\n );\n let actionResult = actionResults[match.route.id];\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n // When using v7_fetcherPersist, we don't want errors bubbling up to the UI\n // or redirects processed for unmounted fetchers so we just revert them to\n // idle\n if (future.v7_fetcherPersist && deletedFetchers.has(key)) {\n if (isRedirectResult(actionResult) || isErrorResult(actionResult)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n // Let SuccessResult's fall through for revalidation\n } else {\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n updateFetcherState(key, getLoadingFetcher(submission));\n return startRedirectNavigation(fetchRequest, actionResult, false, {\n fetcherSubmission: submission,\n preventScrollReset,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n false,\n future.v7_skipActionErrorRevalidation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n deletedFetchers,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n [match.route.id, actionResult]\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n abortFetcher(staleKey);\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect(loaderResults);\n if (redirect) {\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n redirect = findRedirect(fetcherResults);\n if (redirect) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n fetchRedirectIds.add(redirect.key);\n return startRedirectNavigation(\n revalidationRequest,\n redirect.result,\n false,\n { preventScrollReset }\n );\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n fetchers: new Map(state.fetchers),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n isFogOfWar: boolean,\n flushSync: boolean,\n preventScrollReset: boolean,\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n updateFetcherState(\n key,\n getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n ),\n { flushSync }\n );\n\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n\n if (isFogOfWar) {\n let discoverResult = await discoverRoutes(\n matches,\n path,\n fetchRequest.signal\n );\n\n if (discoverResult.type === \"aborted\") {\n return;\n } else if (discoverResult.type === \"error\") {\n setFetcherError(key, routeId, discoverResult.error, { flushSync });\n return;\n } else if (!discoverResult.matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: path }),\n { flushSync }\n );\n return;\n } else {\n matches = discoverResult.matches;\n match = getTargetMatch(matches, path);\n }\n }\n\n // Call the loader for this fetcher route match\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let results = await callDataStrategy(\n \"loader\",\n state,\n fetchRequest,\n [match],\n matches,\n key\n );\n let result = results[match.route.id];\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n // We don't want errors bubbling up or redirects followed for unmounted\n // fetchers, so short circuit here if it was removed from the UI\n if (deletedFetchers.has(key)) {\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n updateFetcherState(key, getDoneFetcher(undefined));\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(fetchRequest, result, false, {\n preventScrollReset,\n });\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n setFetcherError(key, routeId, result.error);\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n updateFetcherState(key, getDoneFetcher(result.data));\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n request: Request,\n redirect: RedirectResult,\n isNavigation: boolean,\n {\n submission,\n fetcherSubmission,\n preventScrollReset,\n replace,\n }: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n preventScrollReset?: boolean;\n replace?: boolean;\n } = {}\n ) {\n if (redirect.response.headers.has(\"X-Remix-Revalidate\")) {\n isRevalidationRequired = true;\n }\n\n let location = redirect.response.headers.get(\"Location\");\n invariant(location, \"Expected a Location header on the redirect Response\");\n location = normalizeRedirectLocation(\n location,\n new URL(request.url),\n basename\n );\n let redirectLocation = createLocation(state.location, location, {\n _isRedirect: true,\n });\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.response.headers.has(\"X-Remix-Reload-Document\")) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(location)) {\n const url = init.history.createURL(location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(location);\n } else {\n routerWindow.location.assign(location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true || redirect.response.headers.has(\"X-Remix-Replace\")\n ? HistoryAction.Replace\n : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let { formMethod, formAction, formEncType } = state.navigation;\n if (\n !submission &&\n !fetcherSubmission &&\n formMethod &&\n formAction &&\n formEncType\n ) {\n submission = getSubmissionFromNavigation(state.navigation);\n }\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n let activeSubmission = submission || fetcherSubmission;\n if (\n redirectPreserveMethodStatusCodes.has(redirect.response.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: location,\n },\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n } else {\n // If we have a navigation submission, we will preserve it through the\n // redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n submission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Send fetcher submissions through for shouldRevalidate\n fetcherSubmission,\n // Preserve these flags across redirects\n preventScrollReset: preventScrollReset || pendingPreventScrollReset,\n enableViewTransition: isNavigation\n ? pendingViewTransitionEnabled\n : undefined,\n });\n }\n }\n\n // Utility wrapper for calling dataStrategy client-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n state: RouterState,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null\n ): Promise> {\n let results: Record;\n let dataResults: Record = {};\n try {\n results = await callDataStrategyImpl(\n dataStrategyImpl,\n type,\n state,\n request,\n matchesToLoad,\n matches,\n fetcherKey,\n manifest,\n mapRouteProperties\n );\n } catch (e) {\n // If the outer dataStrategy method throws, just return the error for all\n // matches - and it'll naturally bubble to the root\n matchesToLoad.forEach((m) => {\n dataResults[m.route.id] = {\n type: ResultType.error,\n error: e,\n };\n });\n return dataResults;\n }\n\n for (let [routeId, result] of Object.entries(results)) {\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n dataResults[routeId] = {\n type: ResultType.redirect,\n response: normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n routeId,\n matches,\n basename,\n future.v7_relativeSplatPath\n ),\n };\n } else {\n dataResults[routeId] = await convertDataStrategyResultToDataResult(\n result\n );\n }\n }\n\n return dataResults;\n }\n\n async function callLoadersAndMaybeResolveData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n let currentMatches = state.matches;\n\n // Kick off loaders and fetchers in parallel\n let loaderResultsPromise = callDataStrategy(\n \"loader\",\n state,\n request,\n matchesToLoad,\n matches,\n null\n );\n\n let fetcherResultsPromise = Promise.all(\n fetchersToLoad.map(async (f) => {\n if (f.matches && f.match && f.controller) {\n let results = await callDataStrategy(\n \"loader\",\n state,\n createClientSideRequest(init.history, f.path, f.controller.signal),\n [f.match],\n f.matches,\n f.key\n );\n let result = results[f.match.route.id];\n // Fetcher results are keyed by fetcher key from here on out, not routeId\n return { [f.key]: result };\n } else {\n return Promise.resolve({\n [f.key]: {\n type: ResultType.error,\n error: getInternalRouterError(404, {\n pathname: f.path,\n }),\n } as ErrorResult,\n });\n }\n })\n );\n\n let loaderResults = await loaderResultsPromise;\n let fetcherResults = (await fetcherResultsPromise).reduce(\n (acc, r) => Object.assign(acc, r),\n {}\n );\n\n await Promise.all([\n resolveNavigationDeferredResults(\n matches,\n loaderResults,\n request.signal,\n currentMatches,\n state.loaderData\n ),\n resolveFetcherDeferredResults(matches, fetcherResults, fetchersToLoad),\n ]);\n\n return {\n loaderResults,\n fetcherResults,\n };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.add(key);\n }\n abortFetcher(key);\n });\n }\n\n function updateFetcherState(\n key: string,\n fetcher: Fetcher,\n opts: { flushSync?: boolean } = {}\n ) {\n state.fetchers.set(key, fetcher);\n updateState(\n { fetchers: new Map(state.fetchers) },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function setFetcherError(\n key: string,\n routeId: string,\n error: any,\n opts: { flushSync?: boolean } = {}\n ) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState(\n {\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n },\n { flushSync: (opts && opts.flushSync) === true }\n );\n }\n\n function getFetcher(key: string): Fetcher {\n if (future.v7_fetcherPersist) {\n activeFetchers.set(key, (activeFetchers.get(key) || 0) + 1);\n // If this fetcher was previously marked for deletion, unmark it since we\n // have a new instance\n if (deletedFetchers.has(key)) {\n deletedFetchers.delete(key);\n }\n }\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n deletedFetchers.delete(key);\n cancelledFetcherLoads.delete(key);\n state.fetchers.delete(key);\n }\n\n function deleteFetcherAndUpdateState(key: string): void {\n if (future.v7_fetcherPersist) {\n let count = (activeFetchers.get(key) || 0) - 1;\n if (count <= 0) {\n activeFetchers.delete(key);\n deletedFetchers.add(key);\n } else {\n activeFetchers.set(key, count);\n }\n } else {\n deleteFetcher(key);\n }\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n if (controller) {\n controller.abort();\n fetchControllers.delete(key);\n }\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function handleNavigational404(pathname: string) {\n let error = getInternalRouterError(404, { pathname });\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let { matches, route } = getShortCircuitMatches(routesToUse);\n\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n\n return { notFoundMatches: matches, route, error };\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n function enableScrollRestoration(\n positions: Record,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered \n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => convertRouteMatchToUiMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function checkFogOfWar(\n matches: AgnosticDataRouteMatch[] | null,\n routesToUse: AgnosticDataRouteObject[],\n pathname: string\n ): { active: boolean; matches: AgnosticDataRouteMatch[] | null } {\n if (patchRoutesOnNavigationImpl) {\n if (!matches) {\n let fogMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n return { active: true, matches: fogMatches || [] };\n } else {\n if (Object.keys(matches[0].params).length > 0) {\n // If we matched a dynamic param or a splat, it might only be because\n // we haven't yet discovered other routes that would match with a\n // higher score. Call patchRoutesOnNavigation just to be sure\n let partialMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n return { active: true, matches: partialMatches };\n }\n }\n }\n\n return { active: false, matches: null };\n }\n\n type DiscoverRoutesSuccessResult = {\n type: \"success\";\n matches: AgnosticDataRouteMatch[] | null;\n };\n type DiscoverRoutesErrorResult = {\n type: \"error\";\n error: any;\n partialMatches: AgnosticDataRouteMatch[];\n };\n type DiscoverRoutesAbortedResult = { type: \"aborted\" };\n type DiscoverRoutesResult =\n | DiscoverRoutesSuccessResult\n | DiscoverRoutesErrorResult\n | DiscoverRoutesAbortedResult;\n\n async function discoverRoutes(\n matches: AgnosticDataRouteMatch[],\n pathname: string,\n signal: AbortSignal\n ): Promise {\n if (!patchRoutesOnNavigationImpl) {\n return { type: \"success\", matches };\n }\n\n let partialMatches: AgnosticDataRouteMatch[] | null = matches;\n while (true) {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let localManifest = manifest;\n try {\n await patchRoutesOnNavigationImpl({\n path: pathname,\n matches: partialMatches,\n patch: (routeId, children) => {\n if (signal.aborted) return;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n localManifest,\n mapRouteProperties\n );\n },\n });\n } catch (e) {\n return { type: \"error\", error: e, partialMatches };\n } finally {\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity so when we `updateState` at the end of\n // this navigation/fetch `router.routes` will be a new identity and\n // trigger a re-run of memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR && !signal.aborted) {\n dataRoutes = [...dataRoutes];\n }\n }\n\n if (signal.aborted) {\n return { type: \"aborted\" };\n }\n\n let newMatches = matchRoutes(routesToUse, pathname, basename);\n if (newMatches) {\n return { type: \"success\", matches: newMatches };\n }\n\n let newPartialMatches = matchRoutesImpl(\n routesToUse,\n pathname,\n basename,\n true\n );\n\n // Avoid loops if the second pass results in the same partial matches\n if (\n !newPartialMatches ||\n (partialMatches.length === newPartialMatches.length &&\n partialMatches.every(\n (m, i) => m.route.id === newPartialMatches![i].route.id\n ))\n ) {\n return { type: \"success\", matches: null };\n }\n\n partialMatches = newPartialMatches;\n }\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n function patchRoutes(\n routeId: string | null,\n children: AgnosticRouteObject[]\n ): void {\n let isNonHMR = inFlightDataRoutes == null;\n let routesToUse = inFlightDataRoutes || dataRoutes;\n patchRoutesImpl(\n routeId,\n children,\n routesToUse,\n manifest,\n mapRouteProperties\n );\n\n // If we are not in the middle of an HMR revalidation and we changed the\n // routes, provide a new identity and trigger a reflow via `updateState`\n // to re-run memoized `router.routes` dependencies.\n // HMR will already update the identity and reflow when it lands\n // `inFlightDataRoutes` in `completeNavigation`\n if (isNonHMR) {\n dataRoutes = [...dataRoutes];\n updateState({});\n }\n }\n\n router = {\n get basename() {\n return basename;\n },\n get future() {\n return future;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n get window() {\n return routerWindow;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher: deleteFetcherAndUpdateState,\n dispose,\n getBlocker,\n deleteBlocker,\n patchRoutes,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface StaticHandlerFutureConfig {\n v7_relativeSplatPath: boolean;\n v7_throwAbortReason: boolean;\n}\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n // Config driven behavior flags\n let future: StaticHandlerFutureConfig = {\n v7_relativeSplatPath: false,\n v7_throwAbortReason: false,\n ...(opts ? opts.future : null),\n };\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n *\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n * - `opts.skipLoaderErrorBubbling` is an optional parameter that will prevent\n * the bubbling of errors which allows single-fetch-type implementations\n * where the client will handle the bubbling and we may need to return data\n * for the handling route\n */\n async function query(\n request: Request,\n {\n requestContext,\n skipLoaderErrorBubbling,\n dataStrategy,\n }: {\n requestContext?: unknown;\n skipLoaderErrorBubbling?: boolean;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n skipLoaderErrorBubbling === true,\n null\n );\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n *\n * - `opts.routeId` allows you to specify the specific route handler to call.\n * If not provided the handler will determine the proper route by matching\n * against `request.url`\n * - `opts.requestContext` is an optional server context that will be passed\n * to actions/loaders in the `context` parameter\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n dataStrategy,\n }: {\n requestContext?: unknown;\n routeId?: string;\n dataStrategy?: DataStrategyFunction;\n } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n dataStrategy || null,\n false,\n match\n );\n\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null\n ): Promise | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction for a\n // `queryRoute` call, we throw the `DataStrategyResult` to bail out early\n // and then return or throw the raw Response here accordingly\n if (isDataStrategyResult(e) && isResponse(e.result)) {\n if (e.type === ResultType.error) {\n throw e.result;\n }\n return e.result;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n isRouteRequest: boolean\n ): Promise | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n let results = await callDataStrategy(\n \"action\",\n request,\n [actionMatch],\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n result = results[actionMatch.route.id];\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.response.status,\n headers: {\n Location: result.response.headers.get(\"Location\")!,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = skipLoaderErrorBubbling\n ? actionMatch\n : findNearestBoundary(matches, actionMatch.route.id);\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null,\n [boundaryMatch.route.id, result]\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : result.statusCode != null\n ? result.statusCode\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n let context = await loadRouteData(\n loaderRequest,\n matches,\n requestContext,\n dataStrategy,\n skipLoaderErrorBubbling,\n null\n );\n\n return {\n ...context,\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionHeaders: result.headers\n ? { [actionMatch.route.id]: result.headers }\n : {},\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null,\n skipLoaderErrorBubbling: boolean,\n routeMatch: AgnosticDataRouteMatch | null,\n pendingActionResult?: PendingActionResult\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : pendingActionResult && isErrorResult(pendingActionResult[1])\n ? getLoaderMatchesUntilBoundary(matches, pendingActionResult[0])\n : matches;\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors:\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? {\n [pendingActionResult[0]]: pendingActionResult[1].error,\n }\n : null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await callDataStrategy(\n \"loader\",\n request,\n matchesToLoad,\n matches,\n isRouteRequest,\n requestContext,\n dataStrategy\n );\n\n if (request.signal.aborted) {\n throwStaticHandlerAbortedError(request, isRouteRequest, future);\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n skipLoaderErrorBubbling\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n // Utility wrapper for calling dataStrategy server-side without having to\n // pass around the manifest, mapRouteProperties, etc.\n async function callDataStrategy(\n type: \"loader\" | \"action\",\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n isRouteRequest: boolean,\n requestContext: unknown,\n dataStrategy: DataStrategyFunction | null\n ): Promise> {\n let results = await callDataStrategyImpl(\n dataStrategy || defaultDataStrategy,\n type,\n null,\n request,\n matchesToLoad,\n matches,\n null,\n manifest,\n mapRouteProperties,\n requestContext\n );\n\n let dataResults: Record = {};\n await Promise.all(\n matches.map(async (match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let result = results[match.route.id];\n if (isRedirectDataStrategyResultResult(result)) {\n let response = result.result as Response;\n // Throw redirects and let the server handle them with an HTTP redirect\n throw normalizeRelativeRoutingRedirectResponse(\n response,\n request,\n match.route.id,\n matches,\n basename,\n future.v7_relativeSplatPath\n );\n }\n if (isResponse(result.result) && isRouteRequest) {\n // For SSR single-route requests, we want to hand Responses back\n // directly without unwrapping\n throw result;\n }\n\n dataResults[match.route.id] =\n await convertDataStrategyResultToDataResult(result);\n })\n );\n return dataResults;\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: isRouteErrorResponse(error) ? error.status : 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction throwStaticHandlerAbortedError(\n request: Request,\n isRouteRequest: boolean,\n future: StaticHandlerFutureConfig\n) {\n if (future.v7_throwAbortReason && request.signal.reason !== undefined) {\n throw request.signal.reason;\n }\n\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted: ${request.method} ${request.url}`);\n}\n\nfunction isSubmissionNavigation(\n opts: BaseNavigateOrFetchOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n v7_relativeSplatPath: boolean,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId) {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getResolveToMatches(contextualMatches, v7_relativeSplatPath),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Account for `?index` params when routing to the current location\n if ((to == null || to === \"\" || to === \".\") && activeRouteMatch) {\n let nakedIndex = hasNakedIndexQuery(path.search);\n if (activeRouteMatch.route.index && !nakedIndex) {\n // Add one when we're targeting an index route\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n } else if (!activeRouteMatch.route.index && nakedIndex) {\n // Remove existing ones when we're not\n let params = new URLSearchParams(path.search);\n let indexValues = params.getAll(\"index\");\n params.delete(\"index\");\n indexValues.filter((v) => v).forEach((v) => params.append(\"index\", v));\n let qs = params.toString();\n path.search = qs ? `?${qs}` : \"\";\n }\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: BaseNavigateOrFetchOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponseImpl;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes at/below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId: string,\n includeBoundary = false\n) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n return matches.slice(0, includeBoundary ? index + 1 : index);\n }\n return matches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n initialHydration: boolean,\n skipActionErrorRevalidation: boolean,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: Set,\n deletedFetchers: Set,\n fetchLoadMatches: Map,\n fetchRedirectIds: Set,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionResult?: PendingActionResult\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingActionResult\n ? isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : pendingActionResult[1].data\n : undefined;\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryMatches = matches;\n if (initialHydration && state.errors) {\n // On initial hydration, only consider matches up to _and including_ the boundary.\n // This is inclusive to handle cases where a server loader ran successfully,\n // a child server loader bubbled up to this route, but this route has\n // `clientLoader.hydrate` so we want to still run the `clientLoader` so that\n // we have a complete version of `loaderData`\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n Object.keys(state.errors)[0],\n true\n );\n } else if (pendingActionResult && isErrorResult(pendingActionResult[1])) {\n // If an action threw an error, we call loaders up to, but not including the\n // boundary\n boundaryMatches = getLoaderMatchesUntilBoundary(\n matches,\n pendingActionResult[0]\n );\n }\n\n // Don't revalidate loaders by default after action 4xx/5xx responses\n // when the flag is enabled. They can still opt-into revalidation via\n // `shouldRevalidate` via `actionResult`\n let actionStatus = pendingActionResult\n ? pendingActionResult[1].statusCode\n : undefined;\n let shouldSkipRevalidation =\n skipActionErrorRevalidation && actionStatus && actionStatus >= 400;\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n let { route } = match;\n if (route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n\n if (route.loader == null) {\n return false;\n }\n\n if (initialHydration) {\n return shouldLoadRouteOnHydration(route, state.loaderData, state.errors);\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate:\n // - on initial hydration (shouldn't be any fetchers then anyway)\n // - if fetcher won't be present in the subsequent render\n // - no longer matches the URL (v7_fetcherPersist=false)\n // - was unmounted but persisted due to v7_fetcherPersist=true\n if (\n initialHydration ||\n !matches.some((m) => m.route.id === f.routeId) ||\n deletedFetchers.has(key)\n ) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.has(key)) {\n // Always mark for revalidation if the fetcher was cancelled\n cancelledFetcherLoads.delete(key);\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n actionStatus,\n defaultShouldRevalidate: shouldSkipRevalidation\n ? false\n : isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction shouldLoadRouteOnHydration(\n route: AgnosticDataRouteObject,\n loaderData: RouteData | null | undefined,\n errors: RouteData | null | undefined\n) {\n // We dunno if we have a loader - gotta find out!\n if (route.lazy) {\n return true;\n }\n\n // No loader, nothing to initialize\n if (!route.loader) {\n return false;\n }\n\n let hasData = loaderData != null && loaderData[route.id] !== undefined;\n let hasError = errors != null && errors[route.id] !== undefined;\n\n // Don't run if we error'd during SSR\n if (!hasData && hasError) {\n return false;\n }\n\n // Explicitly opting-in to running on hydration\n if (typeof route.loader === \"function\" && route.loader.hydrate === true) {\n return true;\n }\n\n // Otherwise, run if we're not yet initialized with anything\n return !hasData && !hasError;\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: ShouldRevalidateFunctionArgs\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\nfunction patchRoutesImpl(\n routeId: string | null,\n children: AgnosticRouteObject[],\n routesToUse: AgnosticDataRouteObject[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction\n) {\n let childrenToPatch: AgnosticDataRouteObject[];\n if (routeId) {\n let route = manifest[routeId];\n invariant(\n route,\n `No route found to patch children into: routeId = ${routeId}`\n );\n if (!route.children) {\n route.children = [];\n }\n childrenToPatch = route.children;\n } else {\n childrenToPatch = routesToUse;\n }\n\n // Don't patch in routes we already know about so that `patch` is idempotent\n // to simplify user-land code. This is useful because we re-call the\n // `patchRoutesOnNavigation` function for matched routes with params.\n let uniqueChildren = children.filter(\n (newRoute) =>\n !childrenToPatch.some((existingRoute) =>\n isSameRoute(newRoute, existingRoute)\n )\n );\n\n let newRoutes = convertRoutesToDataRoutes(\n uniqueChildren,\n mapRouteProperties,\n [routeId || \"_\", \"patch\", String(childrenToPatch?.length || \"0\")],\n manifest\n );\n\n childrenToPatch.push(...newRoutes);\n}\n\nfunction isSameRoute(\n newRoute: AgnosticRouteObject,\n existingRoute: AgnosticRouteObject\n): boolean {\n // Most optimal check is by id\n if (\n \"id\" in newRoute &&\n \"id\" in existingRoute &&\n newRoute.id === existingRoute.id\n ) {\n return true;\n }\n\n // Second is by pathing differences\n if (\n !(\n newRoute.index === existingRoute.index &&\n newRoute.path === existingRoute.path &&\n newRoute.caseSensitive === existingRoute.caseSensitive\n )\n ) {\n return false;\n }\n\n // Pathless layout routes are trickier since we need to check children.\n // If they have no children then they're the same as far as we can tell\n if (\n (!newRoute.children || newRoute.children.length === 0) &&\n (!existingRoute.children || existingRoute.children.length === 0)\n ) {\n return true;\n }\n\n // Otherwise, we look to see if every child in the new route is already\n // represented in the existing route's children\n return newRoute.children!.every((aChild, i) =>\n existingRoute.children?.some((bChild) => isSameRoute(aChild, bChild))\n );\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\n// Default implementation of `dataStrategy` which fetches all loaders in parallel\nasync function defaultDataStrategy({\n matches,\n}: DataStrategyFunctionArgs): ReturnType {\n let matchesToLoad = matches.filter((m) => m.shouldLoad);\n let results = await Promise.all(matchesToLoad.map((m) => m.resolve()));\n return results.reduce(\n (acc, result, i) =>\n Object.assign(acc, { [matchesToLoad[i].route.id]: result }),\n {}\n );\n}\n\nasync function callDataStrategyImpl(\n dataStrategyImpl: DataStrategyFunction,\n type: \"loader\" | \"action\",\n state: RouterState | null,\n request: Request,\n matchesToLoad: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n fetcherKey: string | null,\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n requestContext?: unknown\n): Promise> {\n let loadRouteDefinitionsPromises = matches.map((m) =>\n m.route.lazy\n ? loadLazyRouteModule(m.route, mapRouteProperties, manifest)\n : undefined\n );\n\n let dsMatches = matches.map((match, i) => {\n let loadRoutePromise = loadRouteDefinitionsPromises[i];\n let shouldLoad = matchesToLoad.some((m) => m.route.id === match.route.id);\n // `resolve` encapsulates route.lazy(), executing the loader/action,\n // and mapping return values/thrown errors to a `DataStrategyResult`. Users\n // can pass a callback to take fine-grained control over the execution\n // of the loader/action\n let resolve: DataStrategyMatch[\"resolve\"] = async (handlerOverride) => {\n if (\n handlerOverride &&\n request.method === \"GET\" &&\n (match.route.lazy || match.route.loader)\n ) {\n shouldLoad = true;\n }\n return shouldLoad\n ? callLoaderOrAction(\n type,\n request,\n match,\n loadRoutePromise,\n handlerOverride,\n requestContext\n )\n : Promise.resolve({ type: ResultType.data, result: undefined });\n };\n\n return {\n ...match,\n shouldLoad,\n resolve,\n };\n });\n\n // Send all matches here to allow for a middleware-type implementation.\n // handler will be a no-op for unneeded routes and we filter those results\n // back out below.\n let results = await dataStrategyImpl({\n matches: dsMatches,\n request,\n params: matches[0].params,\n fetcherKey,\n context: requestContext,\n });\n\n // Wait for all routes to load here but 'swallow the error since we want\n // it to bubble up from the `await loadRoutePromise` in `callLoaderOrAction` -\n // called from `match.resolve()`\n try {\n await Promise.all(loadRouteDefinitionsPromises);\n } catch (e) {\n // No-op\n }\n\n return results;\n}\n\n// Default logic for calling a loader/action is the user has no specified a dataStrategy\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n loadRoutePromise: Promise | undefined,\n handlerOverride: Parameters[0],\n staticContext?: unknown\n): Promise {\n let result: DataStrategyResult;\n let onReject: (() => void) | undefined;\n\n let runHandler = (\n handler: AgnosticRouteObject[\"loader\"] | AgnosticRouteObject[\"action\"]\n ): Promise => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n // This will never resolve so safe to type it as Promise to\n // satisfy the function return value\n let abortPromise = new Promise((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n\n let actualHandler = (ctx?: unknown) => {\n if (typeof handler !== \"function\") {\n return Promise.reject(\n new Error(\n `You cannot call the handler for a route which defines a boolean ` +\n `\"${type}\" [routeId: ${match.route.id}]`\n )\n );\n }\n return handler(\n {\n request,\n params: match.params,\n context: staticContext,\n },\n ...(ctx !== undefined ? [ctx] : [])\n );\n };\n\n let handlerPromise: Promise = (async () => {\n try {\n let val = await (handlerOverride\n ? handlerOverride((ctx: unknown) => actualHandler(ctx))\n : actualHandler());\n return { type: \"data\", result: val };\n } catch (e) {\n return { type: \"error\", result: e };\n }\n })();\n\n return Promise.race([handlerPromise, abortPromise]);\n };\n\n try {\n let handler = match.route[type];\n\n // If we have a route.lazy promise, await that first\n if (loadRoutePromise) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let handlerError;\n let [value] = await Promise.all([\n // If the handler throws, don't let it immediately bubble out,\n // since we need to let the lazy() execution finish so we know if this\n // route has a boundary that can handle the error\n runHandler(handler).catch((e) => {\n handlerError = e;\n }),\n loadRoutePromise,\n ]);\n if (handlerError !== undefined) {\n throw handlerError;\n }\n result = value!;\n } else {\n // Load lazy route module, then run any returned handler\n await loadRoutePromise;\n\n handler = match.route[type];\n if (handler) {\n // Handler still runs even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, result: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result.result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n // We should already be catching and converting normal handler executions to\n // DataStrategyResults and returning them, so anything that throws here is an\n // unexpected error we still need to wrap\n return { type: ResultType.error, result: e };\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n return result;\n}\n\nasync function convertDataStrategyResultToDataResult(\n dataStrategyResult: DataStrategyResult\n): Promise {\n let { result, type } = dataStrategyResult;\n\n if (isResponse(result)) {\n let data: any;\n\n try {\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n if (result.body == null) {\n data = null;\n } else {\n data = await result.json();\n }\n } else {\n data = await result.text();\n }\n } catch (e) {\n return { type: ResultType.error, error: e };\n }\n\n if (type === ResultType.error) {\n return {\n type: ResultType.error,\n error: new ErrorResponseImpl(result.status, result.statusText, data),\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (type === ResultType.error) {\n if (isDataWithResponseInit(result)) {\n if (result.data instanceof Error) {\n return {\n type: ResultType.error,\n error: result.data,\n statusCode: result.init?.status,\n };\n }\n\n // Convert thrown data() to ErrorResponse instances\n result = new ErrorResponseImpl(\n result.init?.status || 500,\n undefined,\n result.data\n );\n }\n return {\n type: ResultType.error,\n error: result,\n statusCode: isRouteErrorResponse(result) ? result.status : undefined,\n };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n if (isDataWithResponseInit(result)) {\n return {\n type: ResultType.data,\n data: result.data,\n statusCode: result.init?.status,\n headers: result.init?.headers\n ? new Headers(result.init.headers)\n : undefined,\n };\n }\n\n return { type: ResultType.data, data: result };\n}\n\n// Support relative routing in internal redirects\nfunction normalizeRelativeRoutingRedirectResponse(\n response: Response,\n request: Request,\n routeId: string,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n v7_relativeSplatPath: boolean\n) {\n let location = response.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n let trimmedMatches = matches.slice(\n 0,\n matches.findIndex((m) => m.route.id === routeId) + 1\n );\n location = normalizeTo(\n new URL(request.url),\n trimmedMatches,\n basename,\n true,\n location,\n v7_relativeSplatPath\n );\n response.headers.set(\"Location\", location);\n }\n\n return response;\n}\n\nfunction normalizeRedirectLocation(\n location: string,\n currentUrl: URL,\n basename: string\n): string {\n if (ABSOLUTE_URL_REGEX.test(location)) {\n // Strip off the protocol+origin for same-origin + same-basename absolute redirects\n let normalizedLocation = location;\n let url = normalizedLocation.startsWith(\"//\")\n ? new URL(currentUrl.protocol + normalizedLocation)\n : new URL(normalizedLocation);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n return url.pathname + url.search + url.hash;\n }\n }\n return location;\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n results: Record,\n pendingActionResult: PendingActionResult | undefined,\n activeDeferreds: Map,\n skipLoaderErrorBubbling: boolean\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record = {};\n let pendingError =\n pendingActionResult && isErrorResult(pendingActionResult[1])\n ? pendingActionResult[1].error\n : undefined;\n\n // Process loader results into state.loaderData/state.errors\n matches.forEach((match) => {\n if (!(match.route.id in results)) {\n return;\n }\n let id = match.route.id;\n let result = results[id];\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError !== undefined) {\n error = pendingError;\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n if (skipLoaderErrorBubbling) {\n errors[id] = error;\n } else {\n // Look upwards from the matched route for the closest ancestor error\n // boundary, defaulting to the root match. Prefer higher error values\n // if lower errors bubble to the same boundary\n let boundaryMatch = findNearestBoundary(matches, id);\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n loaderData[id] = result.data;\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (result.statusCode && result.statusCode !== 200 && !foundError) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError !== undefined && pendingActionResult) {\n errors = { [pendingActionResult[0]]: pendingError };\n loaderData[pendingActionResult[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n results: Record,\n pendingActionResult: PendingActionResult | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: Record,\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n results,\n pendingActionResult,\n activeDeferreds,\n false // This method is only called client side so we always want to bubble\n );\n\n // Process results from our revalidating fetchers\n revalidatingFetchers.forEach((rf) => {\n let { key, match, controller } = rf;\n let result = fetcherResults[key];\n invariant(result, \"Did not find corresponding fetcher result\");\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n return;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n });\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\nfunction getActionDataForCommit(\n pendingActionResult: PendingActionResult | undefined\n) {\n if (!pendingActionResult) {\n return {};\n }\n return isErrorResult(pendingActionResult[1])\n ? {\n // Clear out prior actionData on errors\n actionData: {},\n }\n : {\n actionData: {\n [pendingActionResult[0]]: pendingActionResult[1].data,\n },\n };\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route =\n routes.length === 1\n ? routes[0]\n : routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n message,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n message?: string;\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponseImpl(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: Record\n): { key: string; result: RedirectResult } | undefined {\n let entries = Object.entries(results);\n for (let i = entries.length - 1; i >= 0; i--) {\n let [key, result] = entries[i];\n if (isRedirectResult(result)) {\n return { key, result };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isPromise(val: unknown): val is Promise {\n return typeof val === \"object\" && val != null && \"then\" in val;\n}\n\nfunction isDataStrategyResult(result: unknown): result is DataStrategyResult {\n return (\n result != null &&\n typeof result === \"object\" &&\n \"type\" in result &&\n \"result\" in result &&\n (result.type === ResultType.data || result.type === ResultType.error)\n );\n}\n\nfunction isRedirectDataStrategyResultResult(result: DataStrategyResult) {\n return (\n isResponse(result.result) && redirectStatusCodes.has(result.result.status)\n );\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDataWithResponseInit(\n value: any\n): value is DataWithResponseInit {\n return (\n typeof value === \"object\" &&\n value != null &&\n \"type\" in value &&\n \"data\" in value &&\n \"init\" in value &&\n value.type === \"DataWithResponseInit\"\n );\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveNavigationDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record,\n signal: AbortSignal,\n currentMatches: AgnosticDataRouteMatch[],\n currentLoaderData: RouteData\n) {\n let entries = Object.entries(results);\n for (let index = 0; index < entries.length; index++) {\n let [routeId, result] = entries[index];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && isRevalidatingLoader) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n await resolveDeferredData(result, signal, false).then((result) => {\n if (result) {\n results[routeId] = result;\n }\n });\n }\n }\n}\n\nasync function resolveFetcherDeferredResults(\n matches: (AgnosticDataRouteMatch | null)[],\n results: Record,\n revalidatingFetchers: RevalidatingFetcher[]\n) {\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, routeId, controller } = revalidatingFetchers[index];\n let result = results[key];\n let match = matches.find((m) => m?.route.id === routeId);\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n if (isDeferredResult(result)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n invariant(\n controller,\n \"Expected an AbortController for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, controller.signal, true).then(\n (result) => {\n if (result) {\n results[key] = result;\n }\n }\n );\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n };\n return fetcher;\n}\n\nfunction restoreAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n try {\n let sessionPositions = _window.sessionStorage.getItem(\n TRANSITIONS_STORAGE_KEY\n );\n if (sessionPositions) {\n let json = JSON.parse(sessionPositions);\n for (let [k, v] of Object.entries(json || {})) {\n if (v && Array.isArray(v)) {\n transitions.set(k, new Set(v || []));\n }\n }\n }\n } catch (e) {\n // no-op, use default empty object\n }\n}\n\nfunction persistAppliedTransitions(\n _window: Window,\n transitions: Map>\n) {\n if (transitions.size > 0) {\n let json: Record = {};\n for (let [k, v] of transitions) {\n json[k] = [...v];\n }\n try {\n _window.sessionStorage.setItem(\n TRANSITIONS_STORAGE_KEY,\n JSON.stringify(json)\n );\n } catch (error) {\n warning(\n false,\n `Failed to save applied view transitions in sessionStorage (${error}).`\n );\n }\n }\n}\n//#endregion\n","import * as React from \"react\";\nimport type {\n AgnosticIndexRouteObject,\n AgnosticNonIndexRouteObject,\n AgnosticRouteMatch,\n History,\n LazyRouteFunction,\n Location,\n Action as NavigationType,\n RelativeRoutingType,\n Router,\n StaticHandlerContext,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\n\n// Create react-specific types from the agnostic types in @remix-run/router to\n// export from react-router\nexport interface IndexRouteObject {\n caseSensitive?: AgnosticIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticIndexRouteObject[\"path\"];\n id?: AgnosticIndexRouteObject[\"id\"];\n loader?: AgnosticIndexRouteObject[\"loader\"];\n action?: AgnosticIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticIndexRouteObject[\"handle\"];\n index: true;\n children?: undefined;\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport interface NonIndexRouteObject {\n caseSensitive?: AgnosticNonIndexRouteObject[\"caseSensitive\"];\n path?: AgnosticNonIndexRouteObject[\"path\"];\n id?: AgnosticNonIndexRouteObject[\"id\"];\n loader?: AgnosticNonIndexRouteObject[\"loader\"];\n action?: AgnosticNonIndexRouteObject[\"action\"];\n hasErrorBoundary?: AgnosticNonIndexRouteObject[\"hasErrorBoundary\"];\n shouldRevalidate?: AgnosticNonIndexRouteObject[\"shouldRevalidate\"];\n handle?: AgnosticNonIndexRouteObject[\"handle\"];\n index?: false;\n children?: RouteObject[];\n element?: React.ReactNode | null;\n hydrateFallbackElement?: React.ReactNode | null;\n errorElement?: React.ReactNode | null;\n Component?: React.ComponentType | null;\n HydrateFallback?: React.ComponentType | null;\n ErrorBoundary?: React.ComponentType | null;\n lazy?: LazyRouteFunction;\n}\n\nexport type RouteObject = IndexRouteObject | NonIndexRouteObject;\n\nexport type DataRouteObject = RouteObject & {\n children?: DataRouteObject[];\n id: string;\n};\n\nexport interface RouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends RouteObject = RouteObject\n> extends AgnosticRouteMatch {}\n\nexport interface DataRouteMatch extends RouteMatch {}\n\nexport interface DataRouterContextObject\n // Omit `future` since those can be pulled from the `router`\n // `NavigationContext` needs future since it doesn't have a `router` in all cases\n extends Omit {\n router: Router;\n staticContext?: StaticHandlerContext;\n}\n\nexport const DataRouterContext =\n React.createContext(null);\nif (__DEV__) {\n DataRouterContext.displayName = \"DataRouter\";\n}\n\nexport const DataRouterStateContext = React.createContext<\n Router[\"state\"] | null\n>(null);\nif (__DEV__) {\n DataRouterStateContext.displayName = \"DataRouterState\";\n}\n\nexport const AwaitContext = React.createContext(null);\nif (__DEV__) {\n AwaitContext.displayName = \"Await\";\n}\n\nexport interface NavigateOptions {\n replace?: boolean;\n state?: any;\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n flushSync?: boolean;\n viewTransition?: boolean;\n}\n\n/**\n * A Navigator is a \"location changer\"; it's how you get to different locations.\n *\n * Every history instance conforms to the Navigator interface, but the\n * distinction is useful primarily when it comes to the low-level `` API\n * where both the location and a navigator must be provided separately in order\n * to avoid \"tearing\" that may occur in a suspense-enabled app if the action\n * and/or location were to be read directly from the history instance.\n */\nexport interface Navigator {\n createHref: History[\"createHref\"];\n // Optional for backwards-compat with Router/HistoryRouter usage (edge case)\n encodeLocation?: History[\"encodeLocation\"];\n go: History[\"go\"];\n push(to: To, state?: any, opts?: NavigateOptions): void;\n replace(to: To, state?: any, opts?: NavigateOptions): void;\n}\n\ninterface NavigationContextObject {\n basename: string;\n navigator: Navigator;\n static: boolean;\n future: {\n v7_relativeSplatPath: boolean;\n };\n}\n\nexport const NavigationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n NavigationContext.displayName = \"Navigation\";\n}\n\ninterface LocationContextObject {\n location: Location;\n navigationType: NavigationType;\n}\n\nexport const LocationContext = React.createContext(\n null!\n);\n\nif (__DEV__) {\n LocationContext.displayName = \"Location\";\n}\n\nexport interface RouteContextObject {\n outlet: React.ReactElement | null;\n matches: RouteMatch[];\n isDataRoute: boolean;\n}\n\nexport const RouteContext = React.createContext({\n outlet: null,\n matches: [],\n isDataRoute: false,\n});\n\nif (__DEV__) {\n RouteContext.displayName = \"Route\";\n}\n\nexport const RouteErrorContext = React.createContext(null);\n\nif (__DEV__) {\n RouteErrorContext.displayName = \"RouteError\";\n}\n","import * as React from \"react\";\nimport type {\n Blocker,\n BlockerFunction,\n Location,\n ParamParseKey,\n Params,\n Path,\n PathMatch,\n PathPattern,\n RelativeRoutingType,\n Router as RemixRouter,\n RevalidationState,\n To,\n UIMatch,\n} from \"@remix-run/router\";\nimport {\n IDLE_BLOCKER,\n Action as NavigationType,\n UNSAFE_convertRouteMatchToUiMatch as convertRouteMatchToUiMatch,\n UNSAFE_decodePath as decodePath,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n isRouteErrorResponse,\n joinPaths,\n matchPath,\n matchRoutes,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\n\nimport type {\n DataRouteMatch,\n NavigateOptions,\n RouteContextObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n RouteErrorContext,\n} from \"./context\";\n\n/**\n * Returns the full href for the given \"to\" value. This is useful for building\n * custom links that are also accessible and preserve right-click behavior.\n *\n * @see https://reactrouter.com/hooks/use-href\n */\nexport function useHref(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): string {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useHref() may be used only in the context of a component.`\n );\n\n let { basename, navigator } = React.useContext(NavigationContext);\n let { hash, pathname, search } = useResolvedPath(to, { relative });\n\n let joinedPathname = pathname;\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to creating the href. If this is a root navigation, then just use the raw\n // basename which allows the basename to have full control over the presence\n // of a trailing slash on root links\n if (basename !== \"/\") {\n joinedPathname =\n pathname === \"/\" ? basename : joinPaths([basename, pathname]);\n }\n\n return navigator.createHref({ pathname: joinedPathname, search, hash });\n}\n\n/**\n * Returns true if this component is a descendant of a ``.\n *\n * @see https://reactrouter.com/hooks/use-in-router-context\n */\nexport function useInRouterContext(): boolean {\n return React.useContext(LocationContext) != null;\n}\n\n/**\n * Returns the current location object, which represents the current URL in web\n * browsers.\n *\n * Note: If you're using this it may mean you're doing some of your own\n * \"routing\" in your app, and we'd like to know what your use case is. We may\n * be able to provide something higher-level to better suit your needs.\n *\n * @see https://reactrouter.com/hooks/use-location\n */\nexport function useLocation(): Location {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useLocation() may be used only in the context of a component.`\n );\n\n return React.useContext(LocationContext).location;\n}\n\n/**\n * Returns the current navigation action which describes how the router came to\n * the current location, either by a pop, push, or replace on the history stack.\n *\n * @see https://reactrouter.com/hooks/use-navigation-type\n */\nexport function useNavigationType(): NavigationType {\n return React.useContext(LocationContext).navigationType;\n}\n\n/**\n * Returns a PathMatch object if the given pattern matches the current URL.\n * This is useful for components that need to know \"active\" state, e.g.\n * ``.\n *\n * @see https://reactrouter.com/hooks/use-match\n */\nexport function useMatch<\n ParamKey extends ParamParseKey,\n Path extends string\n>(pattern: PathPattern | Path): PathMatch | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useMatch() may be used only in the context of a component.`\n );\n\n let { pathname } = useLocation();\n return React.useMemo(\n () => matchPath(pattern, decodePath(pathname)),\n [pathname, pattern]\n );\n}\n\n/**\n * The interface for the navigate() function returned from useNavigate().\n */\nexport interface NavigateFunction {\n (to: To, options?: NavigateOptions): void;\n (delta: number): void;\n}\n\nconst navigateEffectWarning =\n `You should call navigate() in a React.useEffect(), not when ` +\n `your component is first rendered.`;\n\n// Mute warnings for calls to useNavigate in SSR environments\nfunction useIsomorphicLayoutEffect(\n cb: Parameters[0]\n) {\n let isStatic = React.useContext(NavigationContext).static;\n if (!isStatic) {\n // We should be able to get rid of this once react 18.3 is released\n // See: https://github.com/facebook/react/pull/26395\n // eslint-disable-next-line react-hooks/rules-of-hooks\n React.useLayoutEffect(cb);\n }\n}\n\n/**\n * Returns an imperative method for changing the location. Used by ``s, but\n * may also be used by other elements to change the location.\n *\n * @see https://reactrouter.com/hooks/use-navigate\n */\nexport function useNavigate(): NavigateFunction {\n let { isDataRoute } = React.useContext(RouteContext);\n // Conditional usage is OK here because the usage of a data router is static\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return isDataRoute ? useNavigateStable() : useNavigateUnstable();\n}\n\nfunction useNavigateUnstable(): NavigateFunction {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useNavigate() may be used only in the context of a component.`\n );\n\n let dataRouterContext = React.useContext(DataRouterContext);\n let { basename, future, navigator } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our history listener yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n navigator.go(to);\n return;\n }\n\n let path = resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n options.relative === \"path\"\n );\n\n // If we're operating within a basename, prepend it to the pathname prior\n // to handing off to history (but only if we're not in a data router,\n // otherwise it'll prepend the basename inside of the router).\n // If this is a root navigation, then we navigate to the raw basename\n // which allows the basename to have full control over the presence of a\n // trailing slash on root links\n if (dataRouterContext == null && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\"\n ? basename\n : joinPaths([basename, path.pathname]);\n }\n\n (!!options.replace ? navigator.replace : navigator.push)(\n path,\n options.state,\n options\n );\n },\n [\n basename,\n navigator,\n routePathnamesJson,\n locationPathname,\n dataRouterContext,\n ]\n );\n\n return navigate;\n}\n\nconst OutletContext = React.createContext(null);\n\n/**\n * Returns the context (if provided) for the child route at this level of the route\n * hierarchy.\n * @see https://reactrouter.com/hooks/use-outlet-context\n */\nexport function useOutletContext(): Context {\n return React.useContext(OutletContext) as Context;\n}\n\n/**\n * Returns the element for the child route at this level of the route\n * hierarchy. Used internally by `` to render child routes.\n *\n * @see https://reactrouter.com/hooks/use-outlet\n */\nexport function useOutlet(context?: unknown): React.ReactElement | null {\n let outlet = React.useContext(RouteContext).outlet;\n if (outlet) {\n return (\n {outlet}\n );\n }\n return outlet;\n}\n\n/**\n * Returns an object of key/value pairs of the dynamic params from the current\n * URL that were matched by the route path.\n *\n * @see https://reactrouter.com/hooks/use-params\n */\nexport function useParams<\n ParamsOrKey extends string | Record = string\n>(): Readonly<\n [ParamsOrKey] extends [string] ? Params : Partial\n> {\n let { matches } = React.useContext(RouteContext);\n let routeMatch = matches[matches.length - 1];\n return routeMatch ? (routeMatch.params as any) : {};\n}\n\n/**\n * Resolves the pathname of the given `to` value against the current location.\n *\n * @see https://reactrouter.com/hooks/use-resolved-path\n */\nexport function useResolvedPath(\n to: To,\n { relative }: { relative?: RelativeRoutingType } = {}\n): Path {\n let { future } = React.useContext(NavigationContext);\n let { matches } = React.useContext(RouteContext);\n let { pathname: locationPathname } = useLocation();\n let routePathnamesJson = JSON.stringify(\n getResolveToMatches(matches, future.v7_relativeSplatPath)\n );\n\n return React.useMemo(\n () =>\n resolveTo(\n to,\n JSON.parse(routePathnamesJson),\n locationPathname,\n relative === \"path\"\n ),\n [to, routePathnamesJson, locationPathname, relative]\n );\n}\n\n/**\n * Returns the element of the route that matched the current location, prepared\n * with the correct context to render the remainder of the route tree. Route\n * elements in the tree must render an `` to render their child route's\n * element.\n *\n * @see https://reactrouter.com/hooks/use-routes\n */\nexport function useRoutes(\n routes: RouteObject[],\n locationArg?: Partial | string\n): React.ReactElement | null {\n return useRoutesImpl(routes, locationArg);\n}\n\n// Internal implementation with accept optional param for RouterProvider usage\nexport function useRoutesImpl(\n routes: RouteObject[],\n locationArg?: Partial | string,\n dataRouterState?: RemixRouter[\"state\"],\n future?: RemixRouter[\"future\"]\n): React.ReactElement | null {\n invariant(\n useInRouterContext(),\n // TODO: This error is probably because they somehow have 2 versions of the\n // router loaded. We can help them understand how to avoid that.\n `useRoutes() may be used only in the context of a component.`\n );\n\n let { navigator } = React.useContext(NavigationContext);\n let { matches: parentMatches } = React.useContext(RouteContext);\n let routeMatch = parentMatches[parentMatches.length - 1];\n let parentParams = routeMatch ? routeMatch.params : {};\n let parentPathname = routeMatch ? routeMatch.pathname : \"/\";\n let parentPathnameBase = routeMatch ? routeMatch.pathnameBase : \"/\";\n let parentRoute = routeMatch && routeMatch.route;\n\n if (__DEV__) {\n // You won't get a warning about 2 different under a \n // without a trailing *, but this is a best-effort warning anyway since we\n // cannot even give the warning unless they land at the parent route.\n //\n // Example:\n //\n // \n // {/* This route path MUST end with /* because otherwise\n // it will never match /blog/post/123 */}\n // } />\n // } />\n // \n //\n // function Blog() {\n // return (\n // \n // } />\n // \n // );\n // }\n let parentPath = (parentRoute && parentRoute.path) || \"\";\n warningOnce(\n parentPathname,\n !parentRoute || parentPath.endsWith(\"*\"),\n `You rendered descendant (or called \\`useRoutes()\\`) at ` +\n `\"${parentPathname}\" (under ) but the ` +\n `parent route path has no trailing \"*\". This means if you navigate ` +\n `deeper, the parent won't match anymore and therefore the child ` +\n `routes will never render.\\n\\n` +\n `Please change the parent to .`\n );\n }\n\n let locationFromContext = useLocation();\n\n let location;\n if (locationArg) {\n let parsedLocationArg =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n invariant(\n parentPathnameBase === \"/\" ||\n parsedLocationArg.pathname?.startsWith(parentPathnameBase),\n `When overriding the location using \\`\\` or \\`useRoutes(routes, location)\\`, ` +\n `the location pathname must begin with the portion of the URL pathname that was ` +\n `matched by all parent routes. The current pathname base is \"${parentPathnameBase}\" ` +\n `but pathname \"${parsedLocationArg.pathname}\" was given in the \\`location\\` prop.`\n );\n\n location = parsedLocationArg;\n } else {\n location = locationFromContext;\n }\n\n let pathname = location.pathname || \"/\";\n\n let remainingPathname = pathname;\n if (parentPathnameBase !== \"/\") {\n // Determine the remaining pathname by removing the # of URL segments the\n // parentPathnameBase has, instead of removing based on character count.\n // This is because we can't guarantee that incoming/outgoing encodings/\n // decodings will match exactly.\n // We decode paths before matching on a per-segment basis with\n // decodeURIComponent(), but we re-encode pathnames via `new URL()` so they\n // match what `window.location.pathname` would reflect. Those don't 100%\n // align when it comes to encoded URI characters such as % and &.\n //\n // So we may end up with:\n // pathname: \"/descendant/a%25b/match\"\n // parentPathnameBase: \"/descendant/a%b\"\n //\n // And the direct substring removal approach won't work :/\n let parentSegments = parentPathnameBase.replace(/^\\//, \"\").split(\"/\");\n let segments = pathname.replace(/^\\//, \"\").split(\"/\");\n remainingPathname = \"/\" + segments.slice(parentSegments.length).join(\"/\");\n }\n\n let matches = matchRoutes(routes, { pathname: remainingPathname });\n\n if (__DEV__) {\n warning(\n parentRoute || matches != null,\n `No routes matched location \"${location.pathname}${location.search}${location.hash}\" `\n );\n\n warning(\n matches == null ||\n matches[matches.length - 1].route.element !== undefined ||\n matches[matches.length - 1].route.Component !== undefined ||\n matches[matches.length - 1].route.lazy !== undefined,\n `Matched leaf route at location \"${location.pathname}${location.search}${location.hash}\" ` +\n `does not have an element or Component. This means it will render an with a ` +\n `null value by default resulting in an \"empty\" page.`\n );\n }\n\n let renderedMatches = _renderMatches(\n matches &&\n matches.map((match) =>\n Object.assign({}, match, {\n params: Object.assign({}, parentParams, match.params),\n pathname: joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathname).pathname\n : match.pathname,\n ]),\n pathnameBase:\n match.pathnameBase === \"/\"\n ? parentPathnameBase\n : joinPaths([\n parentPathnameBase,\n // Re-encode pathnames that were decoded inside matchRoutes\n navigator.encodeLocation\n ? navigator.encodeLocation(match.pathnameBase).pathname\n : match.pathnameBase,\n ]),\n })\n ),\n parentMatches,\n dataRouterState,\n future\n );\n\n // When a user passes in a `locationArg`, the associated routes need to\n // be wrapped in a new `LocationContext.Provider` in order for `useLocation`\n // to use the scoped location instead of the global location.\n if (locationArg && renderedMatches) {\n return (\n \n {renderedMatches}\n \n );\n }\n\n return renderedMatches;\n}\n\nfunction DefaultErrorComponent() {\n let error = useRouteError();\n let message = isRouteErrorResponse(error)\n ? `${error.status} ${error.statusText}`\n : error instanceof Error\n ? error.message\n : JSON.stringify(error);\n let stack = error instanceof Error ? error.stack : null;\n let lightgrey = \"rgba(200,200,200, 0.5)\";\n let preStyles = { padding: \"0.5rem\", backgroundColor: lightgrey };\n let codeStyles = { padding: \"2px 4px\", backgroundColor: lightgrey };\n\n let devInfo = null;\n if (__DEV__) {\n console.error(\n \"Error handled by React Router default ErrorBoundary:\",\n error\n );\n\n devInfo = (\n <>\n

💿 Hey developer 👋

\n

\n You can provide a way better UX than this when your app throws errors\n by providing your own ErrorBoundary or{\" \"}\n errorElement prop on your route.\n

\n \n );\n }\n\n return (\n <>\n

Unexpected Application Error!

\n

{message}

\n {stack ?
{stack}
: null}\n {devInfo}\n \n );\n}\n\nconst defaultErrorElement = ;\n\ntype RenderErrorBoundaryProps = React.PropsWithChildren<{\n location: Location;\n revalidation: RevalidationState;\n error: any;\n component: React.ReactNode;\n routeContext: RouteContextObject;\n}>;\n\ntype RenderErrorBoundaryState = {\n location: Location;\n revalidation: RevalidationState;\n error: any;\n};\n\nexport class RenderErrorBoundary extends React.Component<\n RenderErrorBoundaryProps,\n RenderErrorBoundaryState\n> {\n constructor(props: RenderErrorBoundaryProps) {\n super(props);\n this.state = {\n location: props.location,\n revalidation: props.revalidation,\n error: props.error,\n };\n }\n\n static getDerivedStateFromError(error: any) {\n return { error: error };\n }\n\n static getDerivedStateFromProps(\n props: RenderErrorBoundaryProps,\n state: RenderErrorBoundaryState\n ) {\n // When we get into an error state, the user will likely click \"back\" to the\n // previous page that didn't have an error. Because this wraps the entire\n // application, that will have no effect--the error page continues to display.\n // This gives us a mechanism to recover from the error when the location changes.\n //\n // Whether we're in an error state or not, we update the location in state\n // so that when we are in an error state, it gets reset when a new location\n // comes in and the user recovers from the error.\n if (\n state.location !== props.location ||\n (state.revalidation !== \"idle\" && props.revalidation === \"idle\")\n ) {\n return {\n error: props.error,\n location: props.location,\n revalidation: props.revalidation,\n };\n }\n\n // If we're not changing locations, preserve the location but still surface\n // any new errors that may come through. We retain the existing error, we do\n // this because the error provided from the app state may be cleared without\n // the location changing.\n return {\n error: props.error !== undefined ? props.error : state.error,\n location: state.location,\n revalidation: props.revalidation || state.revalidation,\n };\n }\n\n componentDidCatch(error: any, errorInfo: any) {\n console.error(\n \"React Router caught the following error during render\",\n error,\n errorInfo\n );\n }\n\n render() {\n return this.state.error !== undefined ? (\n \n \n \n ) : (\n this.props.children\n );\n }\n}\n\ninterface RenderedRouteProps {\n routeContext: RouteContextObject;\n match: RouteMatch;\n children: React.ReactNode | null;\n}\n\nfunction RenderedRoute({ routeContext, match, children }: RenderedRouteProps) {\n let dataRouterContext = React.useContext(DataRouterContext);\n\n // Track how deep we got in our render pass to emulate SSR componentDidCatch\n // in a DataStaticRouter\n if (\n dataRouterContext &&\n dataRouterContext.static &&\n dataRouterContext.staticContext &&\n (match.route.errorElement || match.route.ErrorBoundary)\n ) {\n dataRouterContext.staticContext._deepestRenderedBoundaryId = match.route.id;\n }\n\n return (\n \n {children}\n \n );\n}\n\nexport function _renderMatches(\n matches: RouteMatch[] | null,\n parentMatches: RouteMatch[] = [],\n dataRouterState: RemixRouter[\"state\"] | null = null,\n future: RemixRouter[\"future\"] | null = null\n): React.ReactElement | null {\n if (matches == null) {\n if (!dataRouterState) {\n return null;\n }\n\n if (dataRouterState.errors) {\n // Don't bail if we have data router errors so we can render them in the\n // boundary. Use the pre-matched (or shimmed) matches\n matches = dataRouterState.matches as DataRouteMatch[];\n } else if (\n future?.v7_partialHydration &&\n parentMatches.length === 0 &&\n !dataRouterState.initialized &&\n dataRouterState.matches.length > 0\n ) {\n // Don't bail if we're initializing with partial hydration and we have\n // router matches. That means we're actively running `patchRoutesOnNavigation`\n // so we should render down the partial matches to the appropriate\n // `HydrateFallback`. We only do this if `parentMatches` is empty so it\n // only impacts the root matches for `RouterProvider` and no descendant\n // ``\n matches = dataRouterState.matches as DataRouteMatch[];\n } else {\n return null;\n }\n }\n\n let renderedMatches = matches;\n\n // If we have data errors, trim matches to the highest error boundary\n let errors = dataRouterState?.errors;\n if (errors != null) {\n let errorIndex = renderedMatches.findIndex(\n (m) => m.route.id && errors?.[m.route.id] !== undefined\n );\n invariant(\n errorIndex >= 0,\n `Could not find a matching route for errors on route IDs: ${Object.keys(\n errors\n ).join(\",\")}`\n );\n renderedMatches = renderedMatches.slice(\n 0,\n Math.min(renderedMatches.length, errorIndex + 1)\n );\n }\n\n // If we're in a partial hydration mode, detect if we need to render down to\n // a given HydrateFallback while we load the rest of the hydration data\n let renderFallback = false;\n let fallbackIndex = -1;\n if (dataRouterState && future && future.v7_partialHydration) {\n for (let i = 0; i < renderedMatches.length; i++) {\n let match = renderedMatches[i];\n // Track the deepest fallback up until the first route without data\n if (match.route.HydrateFallback || match.route.hydrateFallbackElement) {\n fallbackIndex = i;\n }\n\n if (match.route.id) {\n let { loaderData, errors } = dataRouterState;\n let needsToRunLoader =\n match.route.loader &&\n loaderData[match.route.id] === undefined &&\n (!errors || errors[match.route.id] === undefined);\n if (match.route.lazy || needsToRunLoader) {\n // We found the first route that's not ready to render (waiting on\n // lazy, or has a loader that hasn't run yet). Flag that we need to\n // render a fallback and render up until the appropriate fallback\n renderFallback = true;\n if (fallbackIndex >= 0) {\n renderedMatches = renderedMatches.slice(0, fallbackIndex + 1);\n } else {\n renderedMatches = [renderedMatches[0]];\n }\n break;\n }\n }\n }\n }\n\n return renderedMatches.reduceRight((outlet, match, index) => {\n // Only data routers handle errors/fallbacks\n let error: any;\n let shouldRenderHydrateFallback = false;\n let errorElement: React.ReactNode | null = null;\n let hydrateFallbackElement: React.ReactNode | null = null;\n if (dataRouterState) {\n error = errors && match.route.id ? errors[match.route.id] : undefined;\n errorElement = match.route.errorElement || defaultErrorElement;\n\n if (renderFallback) {\n if (fallbackIndex < 0 && index === 0) {\n warningOnce(\n \"route-fallback\",\n false,\n \"No `HydrateFallback` element provided to render during initial hydration\"\n );\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = null;\n } else if (fallbackIndex === index) {\n shouldRenderHydrateFallback = true;\n hydrateFallbackElement = match.route.hydrateFallbackElement || null;\n }\n }\n }\n\n let matches = parentMatches.concat(renderedMatches.slice(0, index + 1));\n let getChildren = () => {\n let children: React.ReactNode;\n if (error) {\n children = errorElement;\n } else if (shouldRenderHydrateFallback) {\n children = hydrateFallbackElement;\n } else if (match.route.Component) {\n // Note: This is a de-optimized path since React won't re-use the\n // ReactElement since it's identity changes with each new\n // React.createElement call. We keep this so folks can use\n // `` in `` but generally `Component`\n // usage is only advised in `RouterProvider` when we can convert it to\n // `element` ahead of time.\n children = ;\n } else if (match.route.element) {\n children = match.route.element;\n } else {\n children = outlet;\n }\n return (\n \n );\n };\n // Only wrap in an error boundary within data router usages when we have an\n // ErrorBoundary/errorElement on this route. Otherwise let it bubble up to\n // an ancestor ErrorBoundary/errorElement\n return dataRouterState &&\n (match.route.ErrorBoundary || match.route.errorElement || index === 0) ? (\n \n ) : (\n getChildren()\n );\n }, null as React.ReactElement | null);\n}\n\nenum DataRouterHook {\n UseBlocker = \"useBlocker\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n}\n\nenum DataRouterStateHook {\n UseBlocker = \"useBlocker\",\n UseLoaderData = \"useLoaderData\",\n UseActionData = \"useActionData\",\n UseRouteError = \"useRouteError\",\n UseNavigation = \"useNavigation\",\n UseRouteLoaderData = \"useRouteLoaderData\",\n UseMatches = \"useMatches\",\n UseRevalidator = \"useRevalidator\",\n UseNavigateStable = \"useNavigate\",\n UseRouteId = \"useRouteId\",\n}\n\nfunction getDataRouterConsoleError(\n hookName: DataRouterHook | DataRouterStateHook\n) {\n return `${hookName} must be used within a data router. See https://reactrouter.com/routers/picking-a-router.`;\n}\n\nfunction useDataRouterContext(hookName: DataRouterHook) {\n let ctx = React.useContext(DataRouterContext);\n invariant(ctx, getDataRouterConsoleError(hookName));\n return ctx;\n}\n\nfunction useDataRouterState(hookName: DataRouterStateHook) {\n let state = React.useContext(DataRouterStateContext);\n invariant(state, getDataRouterConsoleError(hookName));\n return state;\n}\n\nfunction useRouteContext(hookName: DataRouterStateHook) {\n let route = React.useContext(RouteContext);\n invariant(route, getDataRouterConsoleError(hookName));\n return route;\n}\n\n// Internal version with hookName-aware debugging\nfunction useCurrentRouteId(hookName: DataRouterStateHook) {\n let route = useRouteContext(hookName);\n let thisRoute = route.matches[route.matches.length - 1];\n invariant(\n thisRoute.route.id,\n `${hookName} can only be used on routes that contain a unique \"id\"`\n );\n return thisRoute.route.id;\n}\n\n/**\n * Returns the ID for the nearest contextual route\n */\nexport function useRouteId() {\n return useCurrentRouteId(DataRouterStateHook.UseRouteId);\n}\n\n/**\n * Returns the current navigation, defaulting to an \"idle\" navigation when\n * no navigation is in progress\n */\nexport function useNavigation() {\n let state = useDataRouterState(DataRouterStateHook.UseNavigation);\n return state.navigation;\n}\n\n/**\n * Returns a revalidate function for manually triggering revalidation, as well\n * as the current state of any manual revalidations\n */\nexport function useRevalidator() {\n let dataRouterContext = useDataRouterContext(DataRouterHook.UseRevalidator);\n let state = useDataRouterState(DataRouterStateHook.UseRevalidator);\n return React.useMemo(\n () => ({\n revalidate: dataRouterContext.router.revalidate,\n state: state.revalidation,\n }),\n [dataRouterContext.router.revalidate, state.revalidation]\n );\n}\n\n/**\n * Returns the active route matches, useful for accessing loaderData for\n * parent/child routes or the route \"handle\" property\n */\nexport function useMatches(): UIMatch[] {\n let { matches, loaderData } = useDataRouterState(\n DataRouterStateHook.UseMatches\n );\n return React.useMemo(\n () => matches.map((m) => convertRouteMatchToUiMatch(m, loaderData)),\n [matches, loaderData]\n );\n}\n\n/**\n * Returns the loader data for the nearest ancestor Route loader\n */\nexport function useLoaderData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseLoaderData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n\n if (state.errors && state.errors[routeId] != null) {\n console.error(\n `You cannot \\`useLoaderData\\` in an errorElement (routeId: ${routeId})`\n );\n return undefined;\n }\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the loaderData for the given routeId\n */\nexport function useRouteLoaderData(routeId: string): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseRouteLoaderData);\n return state.loaderData[routeId];\n}\n\n/**\n * Returns the action data for the nearest ancestor Route action\n */\nexport function useActionData(): unknown {\n let state = useDataRouterState(DataRouterStateHook.UseActionData);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseLoaderData);\n return state.actionData ? state.actionData[routeId] : undefined;\n}\n\n/**\n * Returns the nearest ancestor Route error, which could be a loader/action\n * error or a render error. This is intended to be called from your\n * ErrorBoundary/errorElement to display a proper error message.\n */\nexport function useRouteError(): unknown {\n let error = React.useContext(RouteErrorContext);\n let state = useDataRouterState(DataRouterStateHook.UseRouteError);\n let routeId = useCurrentRouteId(DataRouterStateHook.UseRouteError);\n\n // If this was a render error, we put it in a RouteError context inside\n // of RenderErrorBoundary\n if (error !== undefined) {\n return error;\n }\n\n // Otherwise look for errors from our data router state\n return state.errors?.[routeId];\n}\n\n/**\n * Returns the happy-path data from the nearest ancestor `` value\n */\nexport function useAsyncValue(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._data;\n}\n\n/**\n * Returns the error from the nearest ancestor `` value\n */\nexport function useAsyncError(): unknown {\n let value = React.useContext(AwaitContext);\n return value?._error;\n}\n\nlet blockerId = 0;\n\n/**\n * Allow the application to block navigations within the SPA and present the\n * user a confirmation dialog to confirm the navigation. Mostly used to avoid\n * using half-filled form data. This does not handle hard-reloads or\n * cross-origin navigations.\n */\nexport function useBlocker(shouldBlock: boolean | BlockerFunction): Blocker {\n let { router, basename } = useDataRouterContext(DataRouterHook.UseBlocker);\n let state = useDataRouterState(DataRouterStateHook.UseBlocker);\n\n let [blockerKey, setBlockerKey] = React.useState(\"\");\n let blockerFunction = React.useCallback(\n (arg) => {\n if (typeof shouldBlock !== \"function\") {\n return !!shouldBlock;\n }\n if (basename === \"/\") {\n return shouldBlock(arg);\n }\n\n // If they provided us a function and we've got an active basename, strip\n // it from the locations we expose to the user to match the behavior of\n // useLocation\n let { currentLocation, nextLocation, historyAction } = arg;\n return shouldBlock({\n currentLocation: {\n ...currentLocation,\n pathname:\n stripBasename(currentLocation.pathname, basename) ||\n currentLocation.pathname,\n },\n nextLocation: {\n ...nextLocation,\n pathname:\n stripBasename(nextLocation.pathname, basename) ||\n nextLocation.pathname,\n },\n historyAction,\n });\n },\n [basename, shouldBlock]\n );\n\n // This effect is in charge of blocker key assignment and deletion (which is\n // tightly coupled to the key)\n React.useEffect(() => {\n let key = String(++blockerId);\n setBlockerKey(key);\n return () => router.deleteBlocker(key);\n }, [router]);\n\n // This effect handles assigning the blockerFunction. This is to handle\n // unstable blocker function identities, and happens only after the prior\n // effect so we don't get an orphaned blockerFunction in the router with a\n // key of \"\". Until then we just have the IDLE_BLOCKER.\n React.useEffect(() => {\n if (blockerKey !== \"\") {\n router.getBlocker(blockerKey, blockerFunction);\n }\n }, [router, blockerKey, blockerFunction]);\n\n // Prefer the blocker from `state` not `router.state` since DataRouterContext\n // is memoized so this ensures we update on blocker state updates\n return blockerKey && state.blockers.has(blockerKey)\n ? state.blockers.get(blockerKey)!\n : IDLE_BLOCKER;\n}\n\n/**\n * Stable version of useNavigate that is used when we are in the context of\n * a RouterProvider.\n */\nfunction useNavigateStable(): NavigateFunction {\n let { router } = useDataRouterContext(DataRouterHook.UseNavigateStable);\n let id = useCurrentRouteId(DataRouterStateHook.UseNavigateStable);\n\n let activeRef = React.useRef(false);\n useIsomorphicLayoutEffect(() => {\n activeRef.current = true;\n });\n\n let navigate: NavigateFunction = React.useCallback(\n (to: To | number, options: NavigateOptions = {}) => {\n warning(activeRef.current, navigateEffectWarning);\n\n // Short circuit here since if this happens on first render the navigate\n // is useless because we haven't wired up our router subscriber yet\n if (!activeRef.current) return;\n\n if (typeof to === \"number\") {\n router.navigate(to);\n } else {\n router.navigate(to, { fromRouteId: id, ...options });\n }\n },\n [router, id]\n );\n\n return navigate;\n}\n\nconst alreadyWarned: Record = {};\n\nfunction warningOnce(key: string, cond: boolean, message: string) {\n if (!cond && !alreadyWarned[key]) {\n alreadyWarned[key] = true;\n warning(false, message);\n }\n}\n","import type {\n InitialEntry,\n LazyRouteFunction,\n Location,\n MemoryHistory,\n RelativeRoutingType,\n Router as RemixRouter,\n RouterState,\n RouterSubscriber,\n To,\n TrackedPromise,\n} from \"@remix-run/router\";\nimport {\n AbortedDeferredError,\n Action as NavigationType,\n createMemoryHistory,\n UNSAFE_getResolveToMatches as getResolveToMatches,\n UNSAFE_invariant as invariant,\n parsePath,\n resolveTo,\n stripBasename,\n UNSAFE_warning as warning,\n} from \"@remix-run/router\";\nimport * as React from \"react\";\n\nimport type {\n DataRouteObject,\n IndexRouteObject,\n Navigator,\n NonIndexRouteObject,\n RouteMatch,\n RouteObject,\n} from \"./context\";\nimport {\n AwaitContext,\n DataRouterContext,\n DataRouterStateContext,\n LocationContext,\n NavigationContext,\n RouteContext,\n} from \"./context\";\nimport {\n _renderMatches,\n useAsyncValue,\n useInRouterContext,\n useLocation,\n useNavigate,\n useOutlet,\n useRoutes,\n useRoutesImpl,\n} from \"./hooks\";\n\nexport interface FutureConfig {\n v7_relativeSplatPath: boolean;\n v7_startTransition: boolean;\n}\n\nexport interface RouterProviderProps {\n fallbackElement?: React.ReactNode;\n router: RemixRouter;\n // Only accept future flags relevant to rendering behavior\n // routing flags should be accessed via router.future\n future?: Partial>;\n}\n\n/**\n Webpack + React 17 fails to compile on any of the following because webpack\n complains that `startTransition` doesn't exist in `React`:\n * import { startTransition } from \"react\"\n * import * as React from from \"react\";\n \"startTransition\" in React ? React.startTransition(() => setState()) : setState()\n * import * as React from from \"react\";\n \"startTransition\" in React ? React[\"startTransition\"](() => setState()) : setState()\n\n Moving it to a constant such as the following solves the Webpack/React 17 issue:\n * import * as React from from \"react\";\n const START_TRANSITION = \"startTransition\";\n START_TRANSITION in React ? React[START_TRANSITION](() => setState()) : setState()\n\n However, that introduces webpack/terser minification issues in production builds\n in React 18 where minification/obfuscation ends up removing the call of\n React.startTransition entirely from the first half of the ternary. Grabbing\n this exported reference once up front resolves that issue.\n\n See https://github.com/remix-run/react-router/issues/10579\n*/\nconst START_TRANSITION = \"startTransition\";\nconst startTransitionImpl = React[START_TRANSITION];\n\n/**\n * Given a Remix Router instance, render the appropriate UI\n */\nexport function RouterProvider({\n fallbackElement,\n router,\n future,\n}: RouterProviderProps): React.ReactElement {\n let [state, setStateImpl] = React.useState(router.state);\n let { v7_startTransition } = future || {};\n\n let setState = React.useCallback(\n (newState: RouterState) => {\n if (v7_startTransition && startTransitionImpl) {\n startTransitionImpl(() => setStateImpl(newState));\n } else {\n setStateImpl(newState);\n }\n },\n [setStateImpl, v7_startTransition]\n );\n\n // Need to use a layout effect here so we are subscribed early enough to\n // pick up on any render-driven redirects/navigations (useEffect/)\n React.useLayoutEffect(() => router.subscribe(setState), [router, setState]);\n\n React.useEffect(() => {\n warning(\n fallbackElement == null || !router.future.v7_partialHydration,\n \"`` is deprecated when using \" +\n \"`v7_partialHydration`, use a `HydrateFallback` component instead\"\n );\n // Only log this once on initial mount\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n let navigator = React.useMemo((): Navigator => {\n return {\n createHref: router.createHref,\n encodeLocation: router.encodeLocation,\n go: (n) => router.navigate(n),\n push: (to, state, opts) =>\n router.navigate(to, {\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n replace: (to, state, opts) =>\n router.navigate(to, {\n replace: true,\n state,\n preventScrollReset: opts?.preventScrollReset,\n }),\n };\n }, [router]);\n\n let basename = router.basename || \"/\";\n\n let dataRouterContext = React.useMemo(\n () => ({\n router,\n navigator,\n static: false,\n basename,\n }),\n [router, navigator, basename]\n );\n\n // The fragment and {null} here are important! We need them to keep React 18's\n // useId happy when we are server-rendering since we may have a ';\n }\n const iframeContents = '' + script + '';\n try {\n this.myIFrame.doc.open();\n this.myIFrame.doc.write(iframeContents);\n this.myIFrame.doc.close();\n } catch (e) {\n log('frame writing exception');\n if (e.stack) {\n log(e.stack);\n }\n log(e);\n }\n } else {\n this.commandCB = commandCB;\n this.onMessageCB = onMessageCB;\n }\n }\n\n /**\n * Each browser has its own funny way to handle iframes. Here we mush them all together into one object that I can\n * actually use.\n */\n private static createIFrame_(): IFrameElement {\n const iframe = document.createElement('iframe') as IFrameElement;\n iframe.style.display = 'none';\n\n // This is necessary in order to initialize the document inside the iframe\n if (document.body) {\n document.body.appendChild(iframe);\n try {\n // If document.domain has been modified in IE, this will throw an error, and we need to set the\n // domain of the iframe's document manually. We can do this via a javascript: url as the src attribute\n // Also note that we must do this *after* the iframe has been appended to the page. Otherwise it doesn't work.\n const a = iframe.contentWindow.document;\n if (!a) {\n // Apologies for the log-spam, I need to do something to keep closure from optimizing out the assignment above.\n log('No IE domain setting required');\n }\n } catch (e) {\n const domain = document.domain;\n iframe.src =\n \"javascript:void((function(){document.open();document.domain='\" +\n domain +\n \"';document.close();})())\";\n }\n } else {\n // LongPollConnection attempts to delay initialization until the document is ready, so hopefully this\n // never gets hit.\n throw 'Document body has not initialized. Wait to initialize Firebase until after the document is ready.';\n }\n\n // Get the document of the iframe in a browser-specific way.\n if (iframe.contentDocument) {\n iframe.doc = iframe.contentDocument; // Firefox, Opera, Safari\n } else if (iframe.contentWindow) {\n iframe.doc = iframe.contentWindow.document; // Internet Explorer\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } else if ((iframe as any).document) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n iframe.doc = (iframe as any).document; //others?\n }\n\n return iframe;\n }\n\n /**\n * Cancel all outstanding queries and remove the frame.\n */\n close() {\n //Mark this iframe as dead, so no new requests are sent.\n this.alive = false;\n\n if (this.myIFrame) {\n //We have to actually remove all of the html inside this iframe before removing it from the\n //window, or IE will continue loading and executing the script tags we've already added, which\n //can lead to some errors being thrown. Setting textContent seems to be the safest way to do this.\n this.myIFrame.doc.body.textContent = '';\n setTimeout(() => {\n if (this.myIFrame !== null) {\n document.body.removeChild(this.myIFrame);\n this.myIFrame = null;\n }\n }, Math.floor(0));\n }\n\n // Protect from being called recursively.\n const onDisconnect = this.onDisconnect;\n if (onDisconnect) {\n this.onDisconnect = null;\n onDisconnect();\n }\n }\n\n /**\n * Actually start the long-polling session by adding the first script tag(s) to the iframe.\n * @param id - The ID of this connection\n * @param pw - The password for this connection\n */\n startLongPoll(id: string, pw: string) {\n this.myID = id;\n this.myPW = pw;\n this.alive = true;\n\n //send the initial request. If there are requests queued, make sure that we transmit as many as we are currently able to.\n while (this.newRequest_()) {}\n }\n\n /**\n * This is called any time someone might want a script tag to be added. It adds a script tag when there aren't\n * too many outstanding requests and we are still alive.\n *\n * If there are outstanding packet segments to send, it sends one. If there aren't, it sends a long-poll anyways if\n * needed.\n */\n private newRequest_() {\n // We keep one outstanding request open all the time to receive data, but if we need to send data\n // (pendingSegs.length > 0) then we create a new request to send the data. The server will automatically\n // close the old request.\n if (\n this.alive &&\n this.sendNewPolls &&\n this.outstandingRequests.size < (this.pendingSegs.length > 0 ? 2 : 1)\n ) {\n //construct our url\n this.currentSerial++;\n const urlParams: { [k: string]: string | number } = {};\n urlParams[FIREBASE_LONGPOLL_ID_PARAM] = this.myID;\n urlParams[FIREBASE_LONGPOLL_PW_PARAM] = this.myPW;\n urlParams[FIREBASE_LONGPOLL_SERIAL_PARAM] = this.currentSerial;\n let theURL = this.urlFn(urlParams);\n //Now add as much data as we can.\n let curDataString = '';\n let i = 0;\n\n while (this.pendingSegs.length > 0) {\n //first, lets see if the next segment will fit.\n const nextSeg = this.pendingSegs[0];\n if (\n (nextSeg.d as unknown[]).length +\n SEG_HEADER_SIZE +\n curDataString.length <=\n MAX_URL_DATA_SIZE\n ) {\n //great, the segment will fit. Lets append it.\n const theSeg = this.pendingSegs.shift();\n curDataString =\n curDataString +\n '&' +\n FIREBASE_LONGPOLL_SEGMENT_NUM_PARAM +\n i +\n '=' +\n theSeg.seg +\n '&' +\n FIREBASE_LONGPOLL_SEGMENTS_IN_PACKET +\n i +\n '=' +\n theSeg.ts +\n '&' +\n FIREBASE_LONGPOLL_DATA_PARAM +\n i +\n '=' +\n theSeg.d;\n i++;\n } else {\n break;\n }\n }\n\n theURL = theURL + curDataString;\n this.addLongPollTag_(theURL, this.currentSerial);\n\n return true;\n } else {\n return false;\n }\n }\n\n /**\n * Queue a packet for transmission to the server.\n * @param segnum - A sequential id for this packet segment used for reassembly\n * @param totalsegs - The total number of segments in this packet\n * @param data - The data for this segment.\n */\n enqueueSegment(segnum: number, totalsegs: number, data: unknown) {\n //add this to the queue of segments to send.\n this.pendingSegs.push({ seg: segnum, ts: totalsegs, d: data });\n\n //send the data immediately if there isn't already data being transmitted, unless\n //startLongPoll hasn't been called yet.\n if (this.alive) {\n this.newRequest_();\n }\n }\n\n /**\n * Add a script tag for a regular long-poll request.\n * @param url - The URL of the script tag.\n * @param serial - The serial number of the request.\n */\n private addLongPollTag_(url: string, serial: number) {\n //remember that we sent this request.\n this.outstandingRequests.add(serial);\n\n const doNewRequest = () => {\n this.outstandingRequests.delete(serial);\n this.newRequest_();\n };\n\n // If this request doesn't return on its own accord (by the server sending us some data), we'll\n // create a new one after the KEEPALIVE interval to make sure we always keep a fresh request open.\n const keepaliveTimeout = setTimeout(\n doNewRequest,\n Math.floor(KEEPALIVE_REQUEST_INTERVAL)\n );\n\n const readyStateCB = () => {\n // Request completed. Cancel the keepalive.\n clearTimeout(keepaliveTimeout);\n\n // Trigger a new request so we can continue receiving data.\n doNewRequest();\n };\n\n this.addTag(url, readyStateCB);\n }\n\n /**\n * Add an arbitrary script tag to the iframe.\n * @param url - The URL for the script tag source.\n * @param loadCB - A callback to be triggered once the script has loaded.\n */\n addTag(url: string, loadCB: () => void) {\n if (isNodeSdk()) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (this as any).doNodeLongPoll(url, loadCB);\n } else {\n setTimeout(() => {\n try {\n // if we're already closed, don't add this poll\n if (!this.sendNewPolls) {\n return;\n }\n const newScript = this.myIFrame.doc.createElement('script');\n newScript.type = 'text/javascript';\n newScript.async = true;\n newScript.src = url;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newScript.onload = (newScript as any).onreadystatechange =\n function () {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const rstate = (newScript as any).readyState;\n if (!rstate || rstate === 'loaded' || rstate === 'complete') {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n newScript.onload = (newScript as any).onreadystatechange = null;\n if (newScript.parentNode) {\n newScript.parentNode.removeChild(newScript);\n }\n loadCB();\n }\n };\n newScript.onerror = () => {\n log('Long-poll script failed to load: ' + url);\n this.sendNewPolls = false;\n this.close();\n };\n this.myIFrame.doc.body.appendChild(newScript);\n } catch (e) {\n // TODO: we should make this error visible somehow\n }\n }, Math.floor(1));\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, isNodeSdk, jsonEval, stringify } from '@firebase/util';\n\nimport { RepoInfo, repoInfoConnectionURL } from '../core/RepoInfo';\nimport { StatsCollection } from '../core/stats/StatsCollection';\nimport { statsManagerGetCollection } from '../core/stats/StatsManager';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { logWrapper, splitStringBySize } from '../core/util/util';\nimport { SDK_VERSION } from '../core/version';\n\nimport {\n APPLICATION_ID_PARAM,\n APP_CHECK_TOKEN_PARAM,\n FORGE_DOMAIN_RE,\n FORGE_REF,\n LAST_SESSION_PARAM,\n PROTOCOL_VERSION,\n REFERER_PARAM,\n TRANSPORT_SESSION_PARAM,\n VERSION_PARAM,\n WEBSOCKET\n} from './Constants';\nimport { Transport } from './Transport';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ndeclare const MozWebSocket: any;\n\nconst WEBSOCKET_MAX_FRAME_SIZE = 16384;\nconst WEBSOCKET_KEEPALIVE_INTERVAL = 45000;\n\nlet WebSocketImpl = null;\nif (typeof MozWebSocket !== 'undefined') {\n WebSocketImpl = MozWebSocket;\n} else if (typeof WebSocket !== 'undefined') {\n WebSocketImpl = WebSocket;\n}\n\nexport function setWebSocketImpl(impl) {\n WebSocketImpl = impl;\n}\n\n/**\n * Create a new websocket connection with the given callbacks.\n */\nexport class WebSocketConnection implements Transport {\n keepaliveTimer: number | null = null;\n frames: string[] | null = null;\n totalFrames = 0;\n bytesSent = 0;\n bytesReceived = 0;\n connURL: string;\n onDisconnect: (a?: boolean) => void;\n onMessage: (msg: {}) => void;\n mySock: WebSocket | null;\n private log_: (...a: unknown[]) => void;\n private stats_: StatsCollection;\n private everConnected_: boolean;\n private isClosed_: boolean;\n private nodeAdmin: boolean;\n\n /**\n * @param connId identifier for this transport\n * @param repoInfo The info for the websocket endpoint.\n * @param applicationId The Firebase App ID for this project.\n * @param appCheckToken The App Check Token for this client.\n * @param authToken The Auth Token for this client.\n * @param transportSessionId Optional transportSessionId if this is connecting\n * to an existing transport session\n * @param lastSessionId Optional lastSessionId if there was a previous\n * connection\n */\n constructor(\n public connId: string,\n repoInfo: RepoInfo,\n private applicationId?: string,\n private appCheckToken?: string,\n private authToken?: string,\n transportSessionId?: string,\n lastSessionId?: string\n ) {\n this.log_ = logWrapper(this.connId);\n this.stats_ = statsManagerGetCollection(repoInfo);\n this.connURL = WebSocketConnection.connectionURL_(\n repoInfo,\n transportSessionId,\n lastSessionId,\n appCheckToken,\n applicationId\n );\n this.nodeAdmin = repoInfo.nodeAdmin;\n }\n\n /**\n * @param repoInfo - The info for the websocket endpoint.\n * @param transportSessionId - Optional transportSessionId if this is connecting to an existing transport\n * session\n * @param lastSessionId - Optional lastSessionId if there was a previous connection\n * @returns connection url\n */\n private static connectionURL_(\n repoInfo: RepoInfo,\n transportSessionId?: string,\n lastSessionId?: string,\n appCheckToken?: string,\n applicationId?: string\n ): string {\n const urlParams: { [k: string]: string } = {};\n urlParams[VERSION_PARAM] = PROTOCOL_VERSION;\n\n if (\n !isNodeSdk() &&\n typeof location !== 'undefined' &&\n location.hostname &&\n FORGE_DOMAIN_RE.test(location.hostname)\n ) {\n urlParams[REFERER_PARAM] = FORGE_REF;\n }\n if (transportSessionId) {\n urlParams[TRANSPORT_SESSION_PARAM] = transportSessionId;\n }\n if (lastSessionId) {\n urlParams[LAST_SESSION_PARAM] = lastSessionId;\n }\n if (appCheckToken) {\n urlParams[APP_CHECK_TOKEN_PARAM] = appCheckToken;\n }\n if (applicationId) {\n urlParams[APPLICATION_ID_PARAM] = applicationId;\n }\n\n return repoInfoConnectionURL(repoInfo, WEBSOCKET, urlParams);\n }\n\n /**\n * @param onMessage - Callback when messages arrive\n * @param onDisconnect - Callback with connection lost.\n */\n open(onMessage: (msg: {}) => void, onDisconnect: (a?: boolean) => void) {\n this.onDisconnect = onDisconnect;\n this.onMessage = onMessage;\n\n this.log_('Websocket connecting to ' + this.connURL);\n\n this.everConnected_ = false;\n // Assume failure until proven otherwise.\n PersistentStorage.set('previous_websocket_failure', true);\n\n try {\n let options: { [k: string]: object };\n if (isNodeSdk()) {\n const device = this.nodeAdmin ? 'AdminNode' : 'Node';\n // UA Format: Firebase////\n options = {\n headers: {\n 'User-Agent': `Firebase/${PROTOCOL_VERSION}/${SDK_VERSION}/${process.platform}/${device}`,\n 'X-Firebase-GMPID': this.applicationId || ''\n }\n };\n\n // If using Node with admin creds, AppCheck-related checks are unnecessary.\n // Note that we send the credentials here even if they aren't admin credentials, which is\n // not a problem.\n // Note that this header is just used to bypass appcheck, and the token should still be sent\n // through the websocket connection once it is established.\n if (this.authToken) {\n options.headers['Authorization'] = `Bearer ${this.authToken}`;\n }\n if (this.appCheckToken) {\n options.headers['X-Firebase-AppCheck'] = this.appCheckToken;\n }\n\n // Plumb appropriate http_proxy environment variable into faye-websocket if it exists.\n const env = process['env'];\n const proxy =\n this.connURL.indexOf('wss://') === 0\n ? env['HTTPS_PROXY'] || env['https_proxy']\n : env['HTTP_PROXY'] || env['http_proxy'];\n\n if (proxy) {\n options['proxy'] = { origin: proxy };\n }\n }\n this.mySock = new WebSocketImpl(this.connURL, [], options);\n } catch (e) {\n this.log_('Error instantiating WebSocket.');\n const error = e.message || e.data;\n if (error) {\n this.log_(error);\n }\n this.onClosed_();\n return;\n }\n\n this.mySock.onopen = () => {\n this.log_('Websocket connected.');\n this.everConnected_ = true;\n };\n\n this.mySock.onclose = () => {\n this.log_('Websocket connection was disconnected.');\n this.mySock = null;\n this.onClosed_();\n };\n\n this.mySock.onmessage = m => {\n this.handleIncomingFrame(m as {});\n };\n\n this.mySock.onerror = e => {\n this.log_('WebSocket error. Closing connection.');\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const error = (e as any).message || (e as any).data;\n if (error) {\n this.log_(error);\n }\n this.onClosed_();\n };\n }\n\n /**\n * No-op for websockets, we don't need to do anything once the connection is confirmed as open\n */\n start() {}\n\n static forceDisallow_: boolean;\n\n static forceDisallow() {\n WebSocketConnection.forceDisallow_ = true;\n }\n\n static isAvailable(): boolean {\n let isOldAndroid = false;\n if (typeof navigator !== 'undefined' && navigator.userAgent) {\n const oldAndroidRegex = /Android ([0-9]{0,}\\.[0-9]{0,})/;\n const oldAndroidMatch = navigator.userAgent.match(oldAndroidRegex);\n if (oldAndroidMatch && oldAndroidMatch.length > 1) {\n if (parseFloat(oldAndroidMatch[1]) < 4.4) {\n isOldAndroid = true;\n }\n }\n }\n\n return (\n !isOldAndroid &&\n WebSocketImpl !== null &&\n !WebSocketConnection.forceDisallow_\n );\n }\n\n /**\n * Number of response before we consider the connection \"healthy.\"\n */\n static responsesRequiredToBeHealthy = 2;\n\n /**\n * Time to wait for the connection te become healthy before giving up.\n */\n static healthyTimeout = 30000;\n\n /**\n * Returns true if we previously failed to connect with this transport.\n */\n static previouslyFailed(): boolean {\n // If our persistent storage is actually only in-memory storage,\n // we default to assuming that it previously failed to be safe.\n return (\n PersistentStorage.isInMemoryStorage ||\n PersistentStorage.get('previous_websocket_failure') === true\n );\n }\n\n markConnectionHealthy() {\n PersistentStorage.remove('previous_websocket_failure');\n }\n\n private appendFrame_(data: string) {\n this.frames.push(data);\n if (this.frames.length === this.totalFrames) {\n const fullMess = this.frames.join('');\n this.frames = null;\n const jsonMess = jsonEval(fullMess) as object;\n\n //handle the message\n this.onMessage(jsonMess);\n }\n }\n\n /**\n * @param frameCount - The number of frames we are expecting from the server\n */\n private handleNewFrameCount_(frameCount: number) {\n this.totalFrames = frameCount;\n this.frames = [];\n }\n\n /**\n * Attempts to parse a frame count out of some text. If it can't, assumes a value of 1\n * @returns Any remaining data to be process, or null if there is none\n */\n private extractFrameCount_(data: string): string | null {\n assert(this.frames === null, 'We already have a frame buffer');\n // TODO: The server is only supposed to send up to 9999 frames (i.e. length <= 4), but that isn't being enforced\n // currently. So allowing larger frame counts (length <= 6). See https://app.asana.com/0/search/8688598998380/8237608042508\n if (data.length <= 6) {\n const frameCount = Number(data);\n if (!isNaN(frameCount)) {\n this.handleNewFrameCount_(frameCount);\n return null;\n }\n }\n this.handleNewFrameCount_(1);\n return data;\n }\n\n /**\n * Process a websocket frame that has arrived from the server.\n * @param mess - The frame data\n */\n handleIncomingFrame(mess: { [k: string]: unknown }) {\n if (this.mySock === null) {\n return; // Chrome apparently delivers incoming packets even after we .close() the connection sometimes.\n }\n const data = mess['data'] as string;\n this.bytesReceived += data.length;\n this.stats_.incrementCounter('bytes_received', data.length);\n\n this.resetKeepAlive();\n\n if (this.frames !== null) {\n // we're buffering\n this.appendFrame_(data);\n } else {\n // try to parse out a frame count, otherwise, assume 1 and process it\n const remainingData = this.extractFrameCount_(data);\n if (remainingData !== null) {\n this.appendFrame_(remainingData);\n }\n }\n }\n\n /**\n * Send a message to the server\n * @param data - The JSON object to transmit\n */\n send(data: {}) {\n this.resetKeepAlive();\n\n const dataStr = stringify(data);\n this.bytesSent += dataStr.length;\n this.stats_.incrementCounter('bytes_sent', dataStr.length);\n\n //We can only fit a certain amount in each websocket frame, so we need to split this request\n //up into multiple pieces if it doesn't fit in one request.\n\n const dataSegs = splitStringBySize(dataStr, WEBSOCKET_MAX_FRAME_SIZE);\n\n //Send the length header\n if (dataSegs.length > 1) {\n this.sendString_(String(dataSegs.length));\n }\n\n //Send the actual data in segments.\n for (let i = 0; i < dataSegs.length; i++) {\n this.sendString_(dataSegs[i]);\n }\n }\n\n private shutdown_() {\n this.isClosed_ = true;\n if (this.keepaliveTimer) {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = null;\n }\n\n if (this.mySock) {\n this.mySock.close();\n this.mySock = null;\n }\n }\n\n private onClosed_() {\n if (!this.isClosed_) {\n this.log_('WebSocket is closing itself');\n this.shutdown_();\n\n // since this is an internal close, trigger the close listener\n if (this.onDisconnect) {\n this.onDisconnect(this.everConnected_);\n this.onDisconnect = null;\n }\n }\n }\n\n /**\n * External-facing close handler.\n * Close the websocket and kill the connection.\n */\n close() {\n if (!this.isClosed_) {\n this.log_('WebSocket is being closed');\n this.shutdown_();\n }\n }\n\n /**\n * Kill the current keepalive timer and start a new one, to ensure that it always fires N seconds after\n * the last activity.\n */\n resetKeepAlive() {\n clearInterval(this.keepaliveTimer);\n this.keepaliveTimer = setInterval(() => {\n //If there has been no websocket activity for a while, send a no-op\n if (this.mySock) {\n this.sendString_('0');\n }\n this.resetKeepAlive();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(WEBSOCKET_KEEPALIVE_INTERVAL)) as any;\n }\n\n /**\n * Send a string over the websocket.\n *\n * @param str - String to send.\n */\n private sendString_(str: string) {\n // Firefox seems to sometimes throw exceptions (NS_ERROR_UNEXPECTED) from websocket .send()\n // calls for some unknown reason. We treat these as an error and disconnect.\n // See https://app.asana.com/0/58926111402292/68021340250410\n try {\n this.mySock.send(str);\n } catch (e) {\n this.log_(\n 'Exception thrown from WebSocket.send():',\n e.message || e.data,\n 'Closing connection.'\n );\n setTimeout(this.onClosed_.bind(this), 0);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RepoInfo } from '../core/RepoInfo';\nimport { warn } from '../core/util/util';\n\nimport { BrowserPollConnection } from './BrowserPollConnection';\nimport { TransportConstructor } from './Transport';\nimport { WebSocketConnection } from './WebSocketConnection';\n\n/**\n * Currently simplistic, this class manages what transport a Connection should use at various stages of its\n * lifecycle.\n *\n * It starts with longpolling in a browser, and httppolling on node. It then upgrades to websockets if\n * they are available.\n */\nexport class TransportManager {\n private transports_: TransportConstructor[];\n\n // Keeps track of whether the TransportManager has already chosen a transport to use\n static globalTransportInitialized_ = false;\n\n static get ALL_TRANSPORTS() {\n return [BrowserPollConnection, WebSocketConnection];\n }\n\n /**\n * Returns whether transport has been selected to ensure WebSocketConnection or BrowserPollConnection are not called after\n * TransportManager has already set up transports_\n */\n static get IS_TRANSPORT_INITIALIZED() {\n return this.globalTransportInitialized_;\n }\n\n /**\n * @param repoInfo - Metadata around the namespace we're connecting to\n */\n constructor(repoInfo: RepoInfo) {\n this.initTransports_(repoInfo);\n }\n\n private initTransports_(repoInfo: RepoInfo) {\n const isWebSocketsAvailable: boolean =\n WebSocketConnection && WebSocketConnection['isAvailable']();\n let isSkipPollConnection =\n isWebSocketsAvailable && !WebSocketConnection.previouslyFailed();\n\n if (repoInfo.webSocketOnly) {\n if (!isWebSocketsAvailable) {\n warn(\n \"wss:// URL used, but browser isn't known to support websockets. Trying anyway.\"\n );\n }\n\n isSkipPollConnection = true;\n }\n\n if (isSkipPollConnection) {\n this.transports_ = [WebSocketConnection];\n } else {\n const transports = (this.transports_ = [] as TransportConstructor[]);\n for (const transport of TransportManager.ALL_TRANSPORTS) {\n if (transport && transport['isAvailable']()) {\n transports.push(transport);\n }\n }\n TransportManager.globalTransportInitialized_ = true;\n }\n }\n\n /**\n * @returns The constructor for the initial transport to use\n */\n initialTransport(): TransportConstructor {\n if (this.transports_.length > 0) {\n return this.transports_[0];\n } else {\n throw new Error('No transports available');\n }\n }\n\n /**\n * @returns The constructor for the next transport, or null\n */\n upgradeTransport(): TransportConstructor | null {\n if (this.transports_.length > 1) {\n return this.transports_[1];\n } else {\n return null;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RepoInfo } from '../core/RepoInfo';\nimport { PersistentStorage } from '../core/storage/storage';\nimport { Indexable } from '../core/util/misc';\nimport {\n error,\n logWrapper,\n requireKey,\n setTimeoutNonBlocking,\n warn\n} from '../core/util/util';\n\nimport { PROTOCOL_VERSION } from './Constants';\nimport { Transport, TransportConstructor } from './Transport';\nimport { TransportManager } from './TransportManager';\n\n// Abort upgrade attempt if it takes longer than 60s.\nconst UPGRADE_TIMEOUT = 60000;\n\n// For some transports (WebSockets), we need to \"validate\" the transport by exchanging a few requests and responses.\n// If we haven't sent enough requests within 5s, we'll start sending noop ping requests.\nconst DELAY_BEFORE_SENDING_EXTRA_REQUESTS = 5000;\n\n// If the initial data sent triggers a lot of bandwidth (i.e. it's a large put or a listen for a large amount of data)\n// then we may not be able to exchange our ping/pong requests within the healthy timeout. So if we reach the timeout\n// but we've sent/received enough bytes, we don't cancel the connection.\nconst BYTES_SENT_HEALTHY_OVERRIDE = 10 * 1024;\nconst BYTES_RECEIVED_HEALTHY_OVERRIDE = 100 * 1024;\n\nconst enum RealtimeState {\n CONNECTING,\n CONNECTED,\n DISCONNECTED\n}\n\nconst MESSAGE_TYPE = 't';\nconst MESSAGE_DATA = 'd';\nconst CONTROL_SHUTDOWN = 's';\nconst CONTROL_RESET = 'r';\nconst CONTROL_ERROR = 'e';\nconst CONTROL_PONG = 'o';\nconst SWITCH_ACK = 'a';\nconst END_TRANSMISSION = 'n';\nconst PING = 'p';\n\nconst SERVER_HELLO = 'h';\n\n/**\n * Creates a new real-time connection to the server using whichever method works\n * best in the current browser.\n */\nexport class Connection {\n connectionCount = 0;\n pendingDataMessages: unknown[] = [];\n sessionId: string;\n\n private conn_: Transport;\n private healthyTimeout_: number;\n private isHealthy_: boolean;\n private log_: (...args: unknown[]) => void;\n private primaryResponsesRequired_: number;\n private rx_: Transport;\n private secondaryConn_: Transport;\n private secondaryResponsesRequired_: number;\n private state_ = RealtimeState.CONNECTING;\n private transportManager_: TransportManager;\n private tx_: Transport;\n\n /**\n * @param id - an id for this connection\n * @param repoInfo_ - the info for the endpoint to connect to\n * @param applicationId_ - the Firebase App ID for this project\n * @param appCheckToken_ - The App Check Token for this device.\n * @param authToken_ - The auth token for this session.\n * @param onMessage_ - the callback to be triggered when a server-push message arrives\n * @param onReady_ - the callback to be triggered when this connection is ready to send messages.\n * @param onDisconnect_ - the callback to be triggered when a connection was lost\n * @param onKill_ - the callback to be triggered when this connection has permanently shut down.\n * @param lastSessionId - last session id in persistent connection. is used to clean up old session in real-time server\n */\n constructor(\n public id: string,\n private repoInfo_: RepoInfo,\n private applicationId_: string | undefined,\n private appCheckToken_: string | undefined,\n private authToken_: string | undefined,\n private onMessage_: (a: {}) => void,\n private onReady_: (a: number, b: string) => void,\n private onDisconnect_: () => void,\n private onKill_: (a: string) => void,\n public lastSessionId?: string\n ) {\n this.log_ = logWrapper('c:' + this.id + ':');\n this.transportManager_ = new TransportManager(repoInfo_);\n this.log_('Connection created');\n this.start_();\n }\n\n /**\n * Starts a connection attempt\n */\n private start_(): void {\n const conn = this.transportManager_.initialTransport();\n this.conn_ = new conn(\n this.nextTransportId_(),\n this.repoInfo_,\n this.applicationId_,\n this.appCheckToken_,\n this.authToken_,\n null,\n this.lastSessionId\n );\n\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\n // can consider the transport healthy.\n this.primaryResponsesRequired_ = conn['responsesRequiredToBeHealthy'] || 0;\n\n const onMessageReceived = this.connReceiver_(this.conn_);\n const onConnectionLost = this.disconnReceiver_(this.conn_);\n this.tx_ = this.conn_;\n this.rx_ = this.conn_;\n this.secondaryConn_ = null;\n this.isHealthy_ = false;\n\n /*\n * Firefox doesn't like when code from one iframe tries to create another iframe by way of the parent frame.\n * This can occur in the case of a redirect, i.e. we guessed wrong on what server to connect to and received a reset.\n * Somehow, setTimeout seems to make this ok. That doesn't make sense from a security perspective, since you should\n * still have the context of your originating frame.\n */\n setTimeout(() => {\n // this.conn_ gets set to null in some of the tests. Check to make sure it still exists before using it\n this.conn_ && this.conn_.open(onMessageReceived, onConnectionLost);\n }, Math.floor(0));\n\n const healthyTimeoutMS = conn['healthyTimeout'] || 0;\n if (healthyTimeoutMS > 0) {\n this.healthyTimeout_ = setTimeoutNonBlocking(() => {\n this.healthyTimeout_ = null;\n if (!this.isHealthy_) {\n if (\n this.conn_ &&\n this.conn_.bytesReceived > BYTES_RECEIVED_HEALTHY_OVERRIDE\n ) {\n this.log_(\n 'Connection exceeded healthy timeout but has received ' +\n this.conn_.bytesReceived +\n ' bytes. Marking connection healthy.'\n );\n this.isHealthy_ = true;\n this.conn_.markConnectionHealthy();\n } else if (\n this.conn_ &&\n this.conn_.bytesSent > BYTES_SENT_HEALTHY_OVERRIDE\n ) {\n this.log_(\n 'Connection exceeded healthy timeout but has sent ' +\n this.conn_.bytesSent +\n ' bytes. Leaving connection alive.'\n );\n // NOTE: We don't want to mark it healthy, since we have no guarantee that the bytes have made it to\n // the server.\n } else {\n this.log_('Closing unhealthy connection after timeout.');\n this.close();\n }\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(healthyTimeoutMS)) as any;\n }\n }\n\n private nextTransportId_(): string {\n return 'c:' + this.id + ':' + this.connectionCount++;\n }\n\n private disconnReceiver_(conn) {\n return everConnected => {\n if (conn === this.conn_) {\n this.onConnectionLost_(everConnected);\n } else if (conn === this.secondaryConn_) {\n this.log_('Secondary connection lost.');\n this.onSecondaryConnectionLost_();\n } else {\n this.log_('closing an old connection');\n }\n };\n }\n\n private connReceiver_(conn: Transport) {\n return (message: Indexable) => {\n if (this.state_ !== RealtimeState.DISCONNECTED) {\n if (conn === this.rx_) {\n this.onPrimaryMessageReceived_(message);\n } else if (conn === this.secondaryConn_) {\n this.onSecondaryMessageReceived_(message);\n } else {\n this.log_('message on old connection');\n }\n }\n };\n }\n\n /**\n * @param dataMsg - An arbitrary data message to be sent to the server\n */\n sendRequest(dataMsg: object) {\n // wrap in a data message envelope and send it on\n const msg = { t: 'd', d: dataMsg };\n this.sendData_(msg);\n }\n\n tryCleanupConnection() {\n if (this.tx_ === this.secondaryConn_ && this.rx_ === this.secondaryConn_) {\n this.log_(\n 'cleaning up and promoting a connection: ' + this.secondaryConn_.connId\n );\n this.conn_ = this.secondaryConn_;\n this.secondaryConn_ = null;\n // the server will shutdown the old connection\n }\n }\n\n private onSecondaryControl_(controlData: { [k: string]: unknown }) {\n if (MESSAGE_TYPE in controlData) {\n const cmd = controlData[MESSAGE_TYPE] as string;\n if (cmd === SWITCH_ACK) {\n this.upgradeIfSecondaryHealthy_();\n } else if (cmd === CONTROL_RESET) {\n // Most likely the session wasn't valid. Abandon the switch attempt\n this.log_('Got a reset on secondary, closing it');\n this.secondaryConn_.close();\n // If we were already using this connection for something, than we need to fully close\n if (\n this.tx_ === this.secondaryConn_ ||\n this.rx_ === this.secondaryConn_\n ) {\n this.close();\n }\n } else if (cmd === CONTROL_PONG) {\n this.log_('got pong on secondary.');\n this.secondaryResponsesRequired_--;\n this.upgradeIfSecondaryHealthy_();\n }\n }\n }\n\n private onSecondaryMessageReceived_(parsedData: Indexable) {\n const layer: string = requireKey('t', parsedData) as string;\n const data: unknown = requireKey('d', parsedData);\n if (layer === 'c') {\n this.onSecondaryControl_(data as Indexable);\n } else if (layer === 'd') {\n // got a data message, but we're still second connection. Need to buffer it up\n this.pendingDataMessages.push(data);\n } else {\n throw new Error('Unknown protocol layer: ' + layer);\n }\n }\n\n private upgradeIfSecondaryHealthy_() {\n if (this.secondaryResponsesRequired_ <= 0) {\n this.log_('Secondary connection is healthy.');\n this.isHealthy_ = true;\n this.secondaryConn_.markConnectionHealthy();\n this.proceedWithUpgrade_();\n } else {\n // Send a ping to make sure the connection is healthy.\n this.log_('sending ping on secondary.');\n this.secondaryConn_.send({ t: 'c', d: { t: PING, d: {} } });\n }\n }\n\n private proceedWithUpgrade_() {\n // tell this connection to consider itself open\n this.secondaryConn_.start();\n // send ack\n this.log_('sending client ack on secondary');\n this.secondaryConn_.send({ t: 'c', d: { t: SWITCH_ACK, d: {} } });\n\n // send end packet on primary transport, switch to sending on this one\n // can receive on this one, buffer responses until end received on primary transport\n this.log_('Ending transmission on primary');\n this.conn_.send({ t: 'c', d: { t: END_TRANSMISSION, d: {} } });\n this.tx_ = this.secondaryConn_;\n\n this.tryCleanupConnection();\n }\n\n private onPrimaryMessageReceived_(parsedData: { [k: string]: unknown }) {\n // Must refer to parsedData properties in quotes, so closure doesn't touch them.\n const layer: string = requireKey('t', parsedData) as string;\n const data: unknown = requireKey('d', parsedData);\n if (layer === 'c') {\n this.onControl_(data as { [k: string]: unknown });\n } else if (layer === 'd') {\n this.onDataMessage_(data);\n }\n }\n\n private onDataMessage_(message: unknown) {\n this.onPrimaryResponse_();\n\n // We don't do anything with data messages, just kick them up a level\n this.onMessage_(message);\n }\n\n private onPrimaryResponse_() {\n if (!this.isHealthy_) {\n this.primaryResponsesRequired_--;\n if (this.primaryResponsesRequired_ <= 0) {\n this.log_('Primary connection is healthy.');\n this.isHealthy_ = true;\n this.conn_.markConnectionHealthy();\n }\n }\n }\n\n private onControl_(controlData: { [k: string]: unknown }) {\n const cmd: string = requireKey(MESSAGE_TYPE, controlData) as string;\n if (MESSAGE_DATA in controlData) {\n const payload = controlData[MESSAGE_DATA];\n if (cmd === SERVER_HELLO) {\n const handshakePayload = {\n ...(payload as {\n ts: number;\n v: string;\n h: string;\n s: string;\n })\n };\n if (this.repoInfo_.isUsingEmulator) {\n // Upon connecting, the emulator will pass the hostname that it's aware of, but we prefer the user's set hostname via `connectDatabaseEmulator` over what the emulator passes.\n handshakePayload.h = this.repoInfo_.host;\n }\n this.onHandshake_(handshakePayload);\n } else if (cmd === END_TRANSMISSION) {\n this.log_('recvd end transmission on primary');\n this.rx_ = this.secondaryConn_;\n for (let i = 0; i < this.pendingDataMessages.length; ++i) {\n this.onDataMessage_(this.pendingDataMessages[i]);\n }\n this.pendingDataMessages = [];\n this.tryCleanupConnection();\n } else if (cmd === CONTROL_SHUTDOWN) {\n // This was previously the 'onKill' callback passed to the lower-level connection\n // payload in this case is the reason for the shutdown. Generally a human-readable error\n this.onConnectionShutdown_(payload as string);\n } else if (cmd === CONTROL_RESET) {\n // payload in this case is the host we should contact\n this.onReset_(payload as string);\n } else if (cmd === CONTROL_ERROR) {\n error('Server Error: ' + payload);\n } else if (cmd === CONTROL_PONG) {\n this.log_('got pong on primary.');\n this.onPrimaryResponse_();\n this.sendPingOnPrimaryIfNecessary_();\n } else {\n error('Unknown control packet command: ' + cmd);\n }\n }\n }\n\n /**\n * @param handshake - The handshake data returned from the server\n */\n private onHandshake_(handshake: {\n ts: number;\n v: string;\n h: string;\n s: string;\n }): void {\n const timestamp = handshake.ts;\n const version = handshake.v;\n const host = handshake.h;\n this.sessionId = handshake.s;\n this.repoInfo_.host = host;\n // if we've already closed the connection, then don't bother trying to progress further\n if (this.state_ === RealtimeState.CONNECTING) {\n this.conn_.start();\n this.onConnectionEstablished_(this.conn_, timestamp);\n if (PROTOCOL_VERSION !== version) {\n warn('Protocol version mismatch detected');\n }\n // TODO: do we want to upgrade? when? maybe a delay?\n this.tryStartUpgrade_();\n }\n }\n\n private tryStartUpgrade_() {\n const conn = this.transportManager_.upgradeTransport();\n if (conn) {\n this.startUpgrade_(conn);\n }\n }\n\n private startUpgrade_(conn: TransportConstructor) {\n this.secondaryConn_ = new conn(\n this.nextTransportId_(),\n this.repoInfo_,\n this.applicationId_,\n this.appCheckToken_,\n this.authToken_,\n this.sessionId\n );\n // For certain transports (WebSockets), we need to send and receive several messages back and forth before we\n // can consider the transport healthy.\n this.secondaryResponsesRequired_ =\n conn['responsesRequiredToBeHealthy'] || 0;\n\n const onMessage = this.connReceiver_(this.secondaryConn_);\n const onDisconnect = this.disconnReceiver_(this.secondaryConn_);\n this.secondaryConn_.open(onMessage, onDisconnect);\n\n // If we haven't successfully upgraded after UPGRADE_TIMEOUT, give up and kill the secondary.\n setTimeoutNonBlocking(() => {\n if (this.secondaryConn_) {\n this.log_('Timed out trying to upgrade.');\n this.secondaryConn_.close();\n }\n }, Math.floor(UPGRADE_TIMEOUT));\n }\n\n private onReset_(host: string) {\n this.log_('Reset packet received. New host: ' + host);\n this.repoInfo_.host = host;\n // TODO: if we're already \"connected\", we need to trigger a disconnect at the next layer up.\n // We don't currently support resets after the connection has already been established\n if (this.state_ === RealtimeState.CONNECTED) {\n this.close();\n } else {\n // Close whatever connections we have open and start again.\n this.closeConnections_();\n this.start_();\n }\n }\n\n private onConnectionEstablished_(conn: Transport, timestamp: number) {\n this.log_('Realtime connection established.');\n this.conn_ = conn;\n this.state_ = RealtimeState.CONNECTED;\n\n if (this.onReady_) {\n this.onReady_(timestamp, this.sessionId);\n this.onReady_ = null;\n }\n\n // If after 5 seconds we haven't sent enough requests to the server to get the connection healthy,\n // send some pings.\n if (this.primaryResponsesRequired_ === 0) {\n this.log_('Primary connection is healthy.');\n this.isHealthy_ = true;\n } else {\n setTimeoutNonBlocking(() => {\n this.sendPingOnPrimaryIfNecessary_();\n }, Math.floor(DELAY_BEFORE_SENDING_EXTRA_REQUESTS));\n }\n }\n\n private sendPingOnPrimaryIfNecessary_() {\n // If the connection isn't considered healthy yet, we'll send a noop ping packet request.\n if (!this.isHealthy_ && this.state_ === RealtimeState.CONNECTED) {\n this.log_('sending ping on primary.');\n this.sendData_({ t: 'c', d: { t: PING, d: {} } });\n }\n }\n\n private onSecondaryConnectionLost_() {\n const conn = this.secondaryConn_;\n this.secondaryConn_ = null;\n if (this.tx_ === conn || this.rx_ === conn) {\n // we are relying on this connection already in some capacity. Therefore, a failure is real\n this.close();\n }\n }\n\n /**\n * @param everConnected - Whether or not the connection ever reached a server. Used to determine if\n * we should flush the host cache\n */\n private onConnectionLost_(everConnected: boolean) {\n this.conn_ = null;\n\n // NOTE: IF you're seeing a Firefox error for this line, I think it might be because it's getting\n // called on window close and RealtimeState.CONNECTING is no longer defined. Just a guess.\n if (!everConnected && this.state_ === RealtimeState.CONNECTING) {\n this.log_('Realtime connection failed.');\n // Since we failed to connect at all, clear any cached entry for this namespace in case the machine went away\n if (this.repoInfo_.isCacheableHost()) {\n PersistentStorage.remove('host:' + this.repoInfo_.host);\n // reset the internal host to what we would show the user, i.e. .firebaseio.com\n this.repoInfo_.internalHost = this.repoInfo_.host;\n }\n } else if (this.state_ === RealtimeState.CONNECTED) {\n this.log_('Realtime connection lost.');\n }\n\n this.close();\n }\n\n private onConnectionShutdown_(reason: string) {\n this.log_('Connection shutdown command received. Shutting down...');\n\n if (this.onKill_) {\n this.onKill_(reason);\n this.onKill_ = null;\n }\n\n // We intentionally don't want to fire onDisconnect (kill is a different case),\n // so clear the callback.\n this.onDisconnect_ = null;\n\n this.close();\n }\n\n private sendData_(data: object) {\n if (this.state_ !== RealtimeState.CONNECTED) {\n throw 'Connection is not connected';\n } else {\n this.tx_.send(data);\n }\n }\n\n /**\n * Cleans up this connection, calling the appropriate callbacks\n */\n close() {\n if (this.state_ !== RealtimeState.DISCONNECTED) {\n this.log_('Closing realtime connection.');\n this.state_ = RealtimeState.DISCONNECTED;\n\n this.closeConnections_();\n\n if (this.onDisconnect_) {\n this.onDisconnect_();\n this.onDisconnect_ = null;\n }\n }\n }\n\n private closeConnections_() {\n this.log_('Shutting down all connections');\n if (this.conn_) {\n this.conn_.close();\n this.conn_ = null;\n }\n\n if (this.secondaryConn_) {\n this.secondaryConn_.close();\n this.secondaryConn_ = null;\n }\n\n if (this.healthyTimeout_) {\n clearTimeout(this.healthyTimeout_);\n this.healthyTimeout_ = null;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryContext } from './view/EventRegistration';\n\n/**\n * Interface defining the set of actions that can be performed against the Firebase server\n * (basically corresponds to our wire protocol).\n *\n * @interface\n */\nexport abstract class ServerActions {\n abstract listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ): void;\n\n /**\n * Remove a listen.\n */\n abstract unlisten(query: QueryContext, tag: number | null): void;\n\n /**\n * Get the server value satisfying this query.\n */\n abstract get(query: QueryContext): Promise;\n\n put(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void,\n hash?: string\n ) {}\n\n merge(\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {}\n\n /**\n * Refreshes the auth token for the current connection.\n * @param token - The authentication token\n */\n refreshAuthToken(token: string) {}\n\n /**\n * Refreshes the app check token for the current connection.\n * @param token The app check token\n */\n refreshAppCheckToken(token: string) {}\n\n onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {}\n\n reportStats(stats: { [k: string]: unknown }) {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\n/**\n * Base class to be used if you want to emit events. Call the constructor with\n * the set of allowed event names.\n */\nexport abstract class EventEmitter {\n private listeners_: {\n [eventType: string]: Array<{\n callback(...args: unknown[]): void;\n context: unknown;\n }>;\n } = {};\n\n constructor(private allowedEvents_: string[]) {\n assert(\n Array.isArray(allowedEvents_) && allowedEvents_.length > 0,\n 'Requires a non-empty array'\n );\n }\n\n /**\n * To be overridden by derived classes in order to fire an initial event when\n * somebody subscribes for data.\n *\n * @returns {Array.<*>} Array of parameters to trigger initial event with.\n */\n abstract getInitialEvent(eventType: string): unknown[];\n\n /**\n * To be called by derived classes to trigger events.\n */\n protected trigger(eventType: string, ...varArgs: unknown[]) {\n if (Array.isArray(this.listeners_[eventType])) {\n // Clone the list, since callbacks could add/remove listeners.\n const listeners = [...this.listeners_[eventType]];\n\n for (let i = 0; i < listeners.length; i++) {\n listeners[i].callback.apply(listeners[i].context, varArgs);\n }\n }\n }\n\n on(eventType: string, callback: (a: unknown) => void, context: unknown) {\n this.validateEventType_(eventType);\n this.listeners_[eventType] = this.listeners_[eventType] || [];\n this.listeners_[eventType].push({ callback, context });\n\n const eventData = this.getInitialEvent(eventType);\n if (eventData) {\n callback.apply(context, eventData);\n }\n }\n\n off(eventType: string, callback: (a: unknown) => void, context: unknown) {\n this.validateEventType_(eventType);\n const listeners = this.listeners_[eventType] || [];\n for (let i = 0; i < listeners.length; i++) {\n if (\n listeners[i].callback === callback &&\n (!context || context === listeners[i].context)\n ) {\n listeners.splice(i, 1);\n return;\n }\n }\n }\n\n private validateEventType_(eventType: string) {\n assert(\n this.allowedEvents_.find(et => {\n return et === eventType;\n }),\n 'Unknown event: ' + eventType\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, isMobileCordova } from '@firebase/util';\n\nimport { EventEmitter } from './EventEmitter';\n\n/**\n * Monitors online state (as reported by window.online/offline events).\n *\n * The expectation is that this could have many false positives (thinks we are online\n * when we're not), but no false negatives. So we can safely use it to determine when\n * we definitely cannot reach the internet.\n */\nexport class OnlineMonitor extends EventEmitter {\n private online_ = true;\n\n static getInstance() {\n return new OnlineMonitor();\n }\n\n constructor() {\n super(['online']);\n\n // We've had repeated complaints that Cordova apps can get stuck \"offline\", e.g.\n // https://forum.ionicframework.com/t/firebase-connection-is-lost-and-never-come-back/43810\n // It would seem that the 'online' event does not always fire consistently. So we disable it\n // for Cordova.\n if (\n typeof window !== 'undefined' &&\n typeof window.addEventListener !== 'undefined' &&\n !isMobileCordova()\n ) {\n window.addEventListener(\n 'online',\n () => {\n if (!this.online_) {\n this.online_ = true;\n this.trigger('online', true);\n }\n },\n false\n );\n\n window.addEventListener(\n 'offline',\n () => {\n if (this.online_) {\n this.online_ = false;\n this.trigger('online', false);\n }\n },\n false\n );\n }\n }\n\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'online', 'Unknown event type: ' + eventType);\n return [this.online_];\n }\n\n currentlyOnline(): boolean {\n return this.online_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringLength } from '@firebase/util';\n\nimport { nameCompare } from './util';\n\n/** Maximum key depth. */\nconst MAX_PATH_DEPTH = 32;\n\n/** Maximum number of (UTF8) bytes in a Firebase path. */\nconst MAX_PATH_LENGTH_BYTES = 768;\n\n/**\n * An immutable object representing a parsed path. It's immutable so that you\n * can pass them around to other functions without worrying about them changing\n * it.\n */\n\nexport class Path {\n pieces_: string[];\n pieceNum_: number;\n\n /**\n * @param pathOrString - Path string to parse, or another path, or the raw\n * tokens array\n */\n constructor(pathOrString: string | string[], pieceNum?: number) {\n if (pieceNum === void 0) {\n this.pieces_ = (pathOrString as string).split('/');\n\n // Remove empty pieces.\n let copyTo = 0;\n for (let i = 0; i < this.pieces_.length; i++) {\n if (this.pieces_[i].length > 0) {\n this.pieces_[copyTo] = this.pieces_[i];\n copyTo++;\n }\n }\n this.pieces_.length = copyTo;\n\n this.pieceNum_ = 0;\n } else {\n this.pieces_ = pathOrString as string[];\n this.pieceNum_ = pieceNum;\n }\n }\n\n toString(): string {\n let pathString = '';\n for (let i = this.pieceNum_; i < this.pieces_.length; i++) {\n if (this.pieces_[i] !== '') {\n pathString += '/' + this.pieces_[i];\n }\n }\n\n return pathString || '/';\n }\n}\n\nexport function newEmptyPath(): Path {\n return new Path('');\n}\n\nexport function pathGetFront(path: Path): string | null {\n if (path.pieceNum_ >= path.pieces_.length) {\n return null;\n }\n\n return path.pieces_[path.pieceNum_];\n}\n\n/**\n * @returns The number of segments in this path\n */\nexport function pathGetLength(path: Path): number {\n return path.pieces_.length - path.pieceNum_;\n}\n\nexport function pathPopFront(path: Path): Path {\n let pieceNum = path.pieceNum_;\n if (pieceNum < path.pieces_.length) {\n pieceNum++;\n }\n return new Path(path.pieces_, pieceNum);\n}\n\nexport function pathGetBack(path: Path): string | null {\n if (path.pieceNum_ < path.pieces_.length) {\n return path.pieces_[path.pieces_.length - 1];\n }\n\n return null;\n}\n\nexport function pathToUrlEncodedString(path: Path): string {\n let pathString = '';\n for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\n if (path.pieces_[i] !== '') {\n pathString += '/' + encodeURIComponent(String(path.pieces_[i]));\n }\n }\n\n return pathString || '/';\n}\n\n/**\n * Shallow copy of the parts of the path.\n *\n */\nexport function pathSlice(path: Path, begin: number = 0): string[] {\n return path.pieces_.slice(path.pieceNum_ + begin);\n}\n\nexport function pathParent(path: Path): Path | null {\n if (path.pieceNum_ >= path.pieces_.length) {\n return null;\n }\n\n const pieces = [];\n for (let i = path.pieceNum_; i < path.pieces_.length - 1; i++) {\n pieces.push(path.pieces_[i]);\n }\n\n return new Path(pieces, 0);\n}\n\nexport function pathChild(path: Path, childPathObj: string | Path): Path {\n const pieces = [];\n for (let i = path.pieceNum_; i < path.pieces_.length; i++) {\n pieces.push(path.pieces_[i]);\n }\n\n if (childPathObj instanceof Path) {\n for (let i = childPathObj.pieceNum_; i < childPathObj.pieces_.length; i++) {\n pieces.push(childPathObj.pieces_[i]);\n }\n } else {\n const childPieces = childPathObj.split('/');\n for (let i = 0; i < childPieces.length; i++) {\n if (childPieces[i].length > 0) {\n pieces.push(childPieces[i]);\n }\n }\n }\n\n return new Path(pieces, 0);\n}\n\n/**\n * @returns True if there are no segments in this path\n */\nexport function pathIsEmpty(path: Path): boolean {\n return path.pieceNum_ >= path.pieces_.length;\n}\n\n/**\n * @returns The path from outerPath to innerPath\n */\nexport function newRelativePath(outerPath: Path, innerPath: Path): Path {\n const outer = pathGetFront(outerPath),\n inner = pathGetFront(innerPath);\n if (outer === null) {\n return innerPath;\n } else if (outer === inner) {\n return newRelativePath(pathPopFront(outerPath), pathPopFront(innerPath));\n } else {\n throw new Error(\n 'INTERNAL ERROR: innerPath (' +\n innerPath +\n ') is not within ' +\n 'outerPath (' +\n outerPath +\n ')'\n );\n }\n}\n\n/**\n * @returns -1, 0, 1 if left is less, equal, or greater than the right.\n */\nexport function pathCompare(left: Path, right: Path): number {\n const leftKeys = pathSlice(left, 0);\n const rightKeys = pathSlice(right, 0);\n for (let i = 0; i < leftKeys.length && i < rightKeys.length; i++) {\n const cmp = nameCompare(leftKeys[i], rightKeys[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n if (leftKeys.length === rightKeys.length) {\n return 0;\n }\n return leftKeys.length < rightKeys.length ? -1 : 1;\n}\n\n/**\n * @returns true if paths are the same.\n */\nexport function pathEquals(path: Path, other: Path): boolean {\n if (pathGetLength(path) !== pathGetLength(other)) {\n return false;\n }\n\n for (\n let i = path.pieceNum_, j = other.pieceNum_;\n i <= path.pieces_.length;\n i++, j++\n ) {\n if (path.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * @returns True if this path is a parent of (or the same as) other\n */\nexport function pathContains(path: Path, other: Path): boolean {\n let i = path.pieceNum_;\n let j = other.pieceNum_;\n if (pathGetLength(path) > pathGetLength(other)) {\n return false;\n }\n while (i < path.pieces_.length) {\n if (path.pieces_[i] !== other.pieces_[j]) {\n return false;\n }\n ++i;\n ++j;\n }\n return true;\n}\n\n/**\n * Dynamic (mutable) path used to count path lengths.\n *\n * This class is used to efficiently check paths for valid\n * length (in UTF8 bytes) and depth (used in path validation).\n *\n * Throws Error exception if path is ever invalid.\n *\n * The definition of a path always begins with '/'.\n */\nexport class ValidationPath {\n parts_: string[];\n /** Initialize to number of '/' chars needed in path. */\n byteLength_: number;\n\n /**\n * @param path - Initial Path.\n * @param errorPrefix_ - Prefix for any error messages.\n */\n constructor(path: Path, public errorPrefix_: string) {\n this.parts_ = pathSlice(path, 0);\n /** Initialize to number of '/' chars needed in path. */\n this.byteLength_ = Math.max(1, this.parts_.length);\n\n for (let i = 0; i < this.parts_.length; i++) {\n this.byteLength_ += stringLength(this.parts_[i]);\n }\n validationPathCheckValid(this);\n }\n}\n\nexport function validationPathPush(\n validationPath: ValidationPath,\n child: string\n): void {\n // Count the needed '/'\n if (validationPath.parts_.length > 0) {\n validationPath.byteLength_ += 1;\n }\n validationPath.parts_.push(child);\n validationPath.byteLength_ += stringLength(child);\n validationPathCheckValid(validationPath);\n}\n\nexport function validationPathPop(validationPath: ValidationPath): void {\n const last = validationPath.parts_.pop();\n validationPath.byteLength_ -= stringLength(last);\n // Un-count the previous '/'\n if (validationPath.parts_.length > 0) {\n validationPath.byteLength_ -= 1;\n }\n}\n\nfunction validationPathCheckValid(validationPath: ValidationPath): void {\n if (validationPath.byteLength_ > MAX_PATH_LENGTH_BYTES) {\n throw new Error(\n validationPath.errorPrefix_ +\n 'has a key path longer than ' +\n MAX_PATH_LENGTH_BYTES +\n ' bytes (' +\n validationPath.byteLength_ +\n ').'\n );\n }\n if (validationPath.parts_.length > MAX_PATH_DEPTH) {\n throw new Error(\n validationPath.errorPrefix_ +\n 'path specified exceeds the maximum depth that can be written (' +\n MAX_PATH_DEPTH +\n ') or object contains a cycle ' +\n validationPathToErrorString(validationPath)\n );\n }\n}\n\n/**\n * String for use in error messages - uses '.' notation for path.\n */\nexport function validationPathToErrorString(\n validationPath: ValidationPath\n): string {\n if (validationPath.parts_.length === 0) {\n return '';\n }\n return \"in property '\" + validationPath.parts_.join('.') + \"'\";\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { EventEmitter } from './EventEmitter';\n\ndeclare const document: Document;\n\nexport class VisibilityMonitor extends EventEmitter {\n private visible_: boolean;\n\n static getInstance() {\n return new VisibilityMonitor();\n }\n\n constructor() {\n super(['visible']);\n let hidden: string;\n let visibilityChange: string;\n if (\n typeof document !== 'undefined' &&\n typeof document.addEventListener !== 'undefined'\n ) {\n if (typeof document['hidden'] !== 'undefined') {\n // Opera 12.10 and Firefox 18 and later support\n visibilityChange = 'visibilitychange';\n hidden = 'hidden';\n } else if (typeof document['mozHidden'] !== 'undefined') {\n visibilityChange = 'mozvisibilitychange';\n hidden = 'mozHidden';\n } else if (typeof document['msHidden'] !== 'undefined') {\n visibilityChange = 'msvisibilitychange';\n hidden = 'msHidden';\n } else if (typeof document['webkitHidden'] !== 'undefined') {\n visibilityChange = 'webkitvisibilitychange';\n hidden = 'webkitHidden';\n }\n }\n\n // Initially, we always assume we are visible. This ensures that in browsers\n // without page visibility support or in cases where we are never visible\n // (e.g. chrome extension), we act as if we are visible, i.e. don't delay\n // reconnects\n this.visible_ = true;\n\n if (visibilityChange) {\n document.addEventListener(\n visibilityChange,\n () => {\n const visible = !document[hidden];\n if (visible !== this.visible_) {\n this.visible_ = visible;\n this.trigger('visible', visible);\n }\n },\n false\n );\n }\n }\n\n getInitialEvent(eventType: string): boolean[] {\n assert(eventType === 'visible', 'Unknown event type: ' + eventType);\n return [this.visible_];\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n contains,\n Deferred,\n isEmpty,\n isMobileCordova,\n isNodeSdk,\n isReactNative,\n isValidFormat,\n safeGet,\n stringify,\n isAdmin\n} from '@firebase/util';\n\nimport { Connection } from '../realtime/Connection';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { OnlineMonitor } from './util/OnlineMonitor';\nimport { Path } from './util/Path';\nimport { error, log, logWrapper, warn, ObjectToUniqueKey } from './util/util';\nimport { VisibilityMonitor } from './util/VisibilityMonitor';\nimport { SDK_VERSION } from './version';\nimport { QueryContext } from './view/EventRegistration';\n\nconst RECONNECT_MIN_DELAY = 1000;\nconst RECONNECT_MAX_DELAY_DEFAULT = 60 * 5 * 1000; // 5 minutes in milliseconds (Case: 1858)\nconst RECONNECT_MAX_DELAY_FOR_ADMINS = 30 * 1000; // 30 seconds for admin clients (likely to be a backend server)\nconst RECONNECT_DELAY_MULTIPLIER = 1.3;\nconst RECONNECT_DELAY_RESET_TIMEOUT = 30000; // Reset delay back to MIN_DELAY after being connected for 30sec.\nconst SERVER_KILL_INTERRUPT_REASON = 'server_kill';\n\n// If auth fails repeatedly, we'll assume something is wrong and log a warning / back off.\nconst INVALID_TOKEN_THRESHOLD = 3;\n\ninterface ListenSpec {\n onComplete(s: string, p?: unknown): void;\n\n hashFn(): string;\n\n query: QueryContext;\n tag: number | null;\n}\n\ninterface OnDisconnectRequest {\n pathString: string;\n action: string;\n data: unknown;\n onComplete?: (a: string, b: string) => void;\n}\n\ninterface OutstandingPut {\n action: string;\n request: object;\n queued?: boolean;\n onComplete: (a: string, b?: string) => void;\n}\n\ninterface OutstandingGet {\n request: object;\n onComplete: (response: { [k: string]: unknown }) => void;\n}\n\n/**\n * Firebase connection. Abstracts wire protocol and handles reconnecting.\n *\n * NOTE: All JSON objects sent to the realtime connection must have property names enclosed\n * in quotes to make sure the closure compiler does not minify them.\n */\nexport class PersistentConnection extends ServerActions {\n // Used for diagnostic logging.\n id = PersistentConnection.nextPersistentConnectionId_++;\n private log_ = logWrapper('p:' + this.id + ':');\n\n private interruptReasons_: { [reason: string]: boolean } = {};\n private readonly listens: Map<\n /* path */ string,\n Map\n > = new Map();\n private outstandingPuts_: OutstandingPut[] = [];\n private outstandingGets_: OutstandingGet[] = [];\n private outstandingPutCount_ = 0;\n private outstandingGetCount_ = 0;\n private onDisconnectRequestQueue_: OnDisconnectRequest[] = [];\n private connected_ = false;\n private reconnectDelay_ = RECONNECT_MIN_DELAY;\n private maxReconnectDelay_ = RECONNECT_MAX_DELAY_DEFAULT;\n private securityDebugCallback_: ((a: object) => void) | null = null;\n lastSessionId: string | null = null;\n\n private establishConnectionTimer_: number | null = null;\n\n private visible_: boolean = false;\n\n // Before we get connected, we keep a queue of pending messages to send.\n private requestCBHash_: { [k: number]: (a: unknown) => void } = {};\n private requestNumber_ = 0;\n\n private realtime_: {\n sendRequest(a: object): void;\n close(): void;\n } | null = null;\n\n private authToken_: string | null = null;\n private appCheckToken_: string | null = null;\n private forceTokenRefresh_ = false;\n private invalidAuthTokenCount_ = 0;\n private invalidAppCheckTokenCount_ = 0;\n\n private firstConnection_ = true;\n private lastConnectionAttemptTime_: number | null = null;\n private lastConnectionEstablishedTime_: number | null = null;\n\n private static nextPersistentConnectionId_ = 0;\n\n /**\n * Counter for number of connections created. Mainly used for tagging in the logs\n */\n private static nextConnectionId_ = 0;\n\n /**\n * @param repoInfo_ - Data about the namespace we are connecting to\n * @param applicationId_ - The Firebase App ID for this project\n * @param onDataUpdate_ - A callback for new data from the server\n */\n constructor(\n private repoInfo_: RepoInfo,\n private applicationId_: string,\n private onDataUpdate_: (\n a: string,\n b: unknown,\n c: boolean,\n d: number | null\n ) => void,\n private onConnectStatus_: (a: boolean) => void,\n private onServerInfoUpdate_: (a: unknown) => void,\n private authTokenProvider_: AuthTokenProvider,\n private appCheckTokenProvider_: AppCheckTokenProvider,\n private authOverride_?: object | null\n ) {\n super();\n\n if (authOverride_ && !isNodeSdk()) {\n throw new Error(\n 'Auth override specified in options, but not supported on non Node.js platforms'\n );\n }\n\n VisibilityMonitor.getInstance().on('visible', this.onVisible_, this);\n\n if (repoInfo_.host.indexOf('fblocal') === -1) {\n OnlineMonitor.getInstance().on('online', this.onOnline_, this);\n }\n }\n\n protected sendRequest(\n action: string,\n body: unknown,\n onResponse?: (a: unknown) => void\n ) {\n const curReqNum = ++this.requestNumber_;\n\n const msg = { r: curReqNum, a: action, b: body };\n this.log_(stringify(msg));\n assert(\n this.connected_,\n \"sendRequest call when we're not connected not allowed.\"\n );\n this.realtime_.sendRequest(msg);\n if (onResponse) {\n this.requestCBHash_[curReqNum] = onResponse;\n }\n }\n\n get(query: QueryContext): Promise {\n this.initConnection_();\n\n const deferred = new Deferred();\n const request = {\n p: query._path.toString(),\n q: query._queryObject\n };\n const outstandingGet = {\n action: 'g',\n request,\n onComplete: (message: { [k: string]: unknown }) => {\n const payload = message['d'] as string;\n if (message['s'] === 'ok') {\n deferred.resolve(payload);\n } else {\n deferred.reject(payload);\n }\n }\n };\n this.outstandingGets_.push(outstandingGet);\n this.outstandingGetCount_++;\n const index = this.outstandingGets_.length - 1;\n\n if (this.connected_) {\n this.sendGet_(index);\n }\n\n return deferred.promise;\n }\n\n listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n this.initConnection_();\n\n const queryId = query._queryIdentifier;\n const pathString = query._path.toString();\n this.log_('Listen called for ' + pathString + ' ' + queryId);\n if (!this.listens.has(pathString)) {\n this.listens.set(pathString, new Map());\n }\n assert(\n query._queryParams.isDefault() || !query._queryParams.loadsAllData(),\n 'listen() called for non-default but complete query'\n );\n assert(\n !this.listens.get(pathString)!.has(queryId),\n `listen() called twice for same path/queryId.`\n );\n const listenSpec: ListenSpec = {\n onComplete,\n hashFn: currentHashFn,\n query,\n tag\n };\n this.listens.get(pathString)!.set(queryId, listenSpec);\n\n if (this.connected_) {\n this.sendListen_(listenSpec);\n }\n }\n\n private sendGet_(index: number) {\n const get = this.outstandingGets_[index];\n this.sendRequest('g', get.request, (message: { [k: string]: unknown }) => {\n delete this.outstandingGets_[index];\n this.outstandingGetCount_--;\n if (this.outstandingGetCount_ === 0) {\n this.outstandingGets_ = [];\n }\n if (get.onComplete) {\n get.onComplete(message);\n }\n });\n }\n\n private sendListen_(listenSpec: ListenSpec) {\n const query = listenSpec.query;\n const pathString = query._path.toString();\n const queryId = query._queryIdentifier;\n this.log_('Listen on ' + pathString + ' for ' + queryId);\n const req: { [k: string]: unknown } = { /*path*/ p: pathString };\n\n const action = 'q';\n\n // Only bother to send query if it's non-default.\n if (listenSpec.tag) {\n req['q'] = query._queryObject;\n req['t'] = listenSpec.tag;\n }\n\n req[/*hash*/ 'h'] = listenSpec.hashFn();\n\n this.sendRequest(action, req, (message: { [k: string]: unknown }) => {\n const payload: unknown = message[/*data*/ 'd'];\n const status = message[/*status*/ 's'] as string;\n\n // print warnings in any case...\n PersistentConnection.warnOnListenWarnings_(payload, query);\n\n const currentListenSpec =\n this.listens.get(pathString) &&\n this.listens.get(pathString)!.get(queryId);\n // only trigger actions if the listen hasn't been removed and readded\n if (currentListenSpec === listenSpec) {\n this.log_('listen response', message);\n\n if (status !== 'ok') {\n this.removeListen_(pathString, queryId);\n }\n\n if (listenSpec.onComplete) {\n listenSpec.onComplete(status, payload);\n }\n }\n });\n }\n\n private static warnOnListenWarnings_(payload: unknown, query: QueryContext) {\n if (payload && typeof payload === 'object' && contains(payload, 'w')) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const warnings = safeGet(payload as any, 'w');\n if (Array.isArray(warnings) && ~warnings.indexOf('no_index')) {\n const indexSpec =\n '\".indexOn\": \"' + query._queryParams.getIndex().toString() + '\"';\n const indexPath = query._path.toString();\n warn(\n `Using an unspecified index. Your data will be downloaded and ` +\n `filtered on the client. Consider adding ${indexSpec} at ` +\n `${indexPath} to your security rules for better performance.`\n );\n }\n }\n }\n\n refreshAuthToken(token: string) {\n this.authToken_ = token;\n this.log_('Auth token refreshed');\n if (this.authToken_) {\n this.tryAuth();\n } else {\n //If we're connected we want to let the server know to unauthenticate us. If we're not connected, simply delete\n //the credential so we dont become authenticated next time we connect.\n if (this.connected_) {\n this.sendRequest('unauth', {}, () => {});\n }\n }\n\n this.reduceReconnectDelayIfAdminCredential_(token);\n }\n\n private reduceReconnectDelayIfAdminCredential_(credential: string) {\n // NOTE: This isn't intended to be bulletproof (a malicious developer can always just modify the client).\n // Additionally, we don't bother resetting the max delay back to the default if auth fails / expires.\n const isFirebaseSecret = credential && credential.length === 40;\n if (isFirebaseSecret || isAdmin(credential)) {\n this.log_(\n 'Admin auth credential detected. Reducing max reconnect time.'\n );\n this.maxReconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\n }\n }\n\n refreshAppCheckToken(token: string | null) {\n this.appCheckToken_ = token;\n this.log_('App check token refreshed');\n if (this.appCheckToken_) {\n this.tryAppCheck();\n } else {\n //If we're connected we want to let the server know to unauthenticate us.\n //If we're not connected, simply delete the credential so we dont become\n // authenticated next time we connect.\n if (this.connected_) {\n this.sendRequest('unappeck', {}, () => {});\n }\n }\n }\n\n /**\n * Attempts to authenticate with the given credentials. If the authentication attempt fails, it's triggered like\n * a auth revoked (the connection is closed).\n */\n tryAuth() {\n if (this.connected_ && this.authToken_) {\n const token = this.authToken_;\n const authMethod = isValidFormat(token) ? 'auth' : 'gauth';\n const requestData: { [k: string]: unknown } = { cred: token };\n if (this.authOverride_ === null) {\n requestData['noauth'] = true;\n } else if (typeof this.authOverride_ === 'object') {\n requestData['authvar'] = this.authOverride_;\n }\n this.sendRequest(\n authMethod,\n requestData,\n (res: { [k: string]: unknown }) => {\n const status = res[/*status*/ 's'] as string;\n const data = (res[/*data*/ 'd'] as string) || 'error';\n\n if (this.authToken_ === token) {\n if (status === 'ok') {\n this.invalidAuthTokenCount_ = 0;\n } else {\n // Triggers reconnect and force refresh for auth token\n this.onAuthRevoked_(status, data);\n }\n }\n }\n );\n }\n }\n\n /**\n * Attempts to authenticate with the given token. If the authentication\n * attempt fails, it's triggered like the token was revoked (the connection is\n * closed).\n */\n tryAppCheck() {\n if (this.connected_ && this.appCheckToken_) {\n this.sendRequest(\n 'appcheck',\n { 'token': this.appCheckToken_ },\n (res: { [k: string]: unknown }) => {\n const status = res[/*status*/ 's'] as string;\n const data = (res[/*data*/ 'd'] as string) || 'error';\n if (status === 'ok') {\n this.invalidAppCheckTokenCount_ = 0;\n } else {\n this.onAppCheckRevoked_(status, data);\n }\n }\n );\n }\n }\n\n /**\n * @inheritDoc\n */\n unlisten(query: QueryContext, tag: number | null) {\n const pathString = query._path.toString();\n const queryId = query._queryIdentifier;\n\n this.log_('Unlisten called for ' + pathString + ' ' + queryId);\n\n assert(\n query._queryParams.isDefault() || !query._queryParams.loadsAllData(),\n 'unlisten() called for non-default but complete query'\n );\n const listen = this.removeListen_(pathString, queryId);\n if (listen && this.connected_) {\n this.sendUnlisten_(pathString, queryId, query._queryObject, tag);\n }\n }\n\n private sendUnlisten_(\n pathString: string,\n queryId: string,\n queryObj: object,\n tag: number | null\n ) {\n this.log_('Unlisten on ' + pathString + ' for ' + queryId);\n\n const req: { [k: string]: unknown } = { /*path*/ p: pathString };\n const action = 'n';\n // Only bother sending queryId if it's non-default.\n if (tag) {\n req['q'] = queryObj;\n req['t'] = tag;\n }\n\n this.sendRequest(action, req);\n }\n\n onDisconnectPut(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\n\n if (this.connected_) {\n this.sendOnDisconnect_('o', pathString, data, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'o',\n data,\n onComplete\n });\n }\n }\n\n onDisconnectMerge(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\n\n if (this.connected_) {\n this.sendOnDisconnect_('om', pathString, data, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'om',\n data,\n onComplete\n });\n }\n }\n\n onDisconnectCancel(\n pathString: string,\n onComplete?: (a: string, b: string) => void\n ) {\n this.initConnection_();\n\n if (this.connected_) {\n this.sendOnDisconnect_('oc', pathString, null, onComplete);\n } else {\n this.onDisconnectRequestQueue_.push({\n pathString,\n action: 'oc',\n data: null,\n onComplete\n });\n }\n }\n\n private sendOnDisconnect_(\n action: string,\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string) => void\n ) {\n const request = { /*path*/ p: pathString, /*data*/ d: data };\n this.log_('onDisconnect ' + action, request);\n this.sendRequest(action, request, (response: { [k: string]: unknown }) => {\n if (onComplete) {\n setTimeout(() => {\n onComplete(\n response[/*status*/ 's'] as string,\n response[/* data */ 'd'] as string\n );\n }, Math.floor(0));\n }\n });\n }\n\n put(\n pathString: string,\n data: unknown,\n onComplete?: (a: string, b: string) => void,\n hash?: string\n ) {\n this.putInternal('p', pathString, data, onComplete, hash);\n }\n\n merge(\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {\n this.putInternal('m', pathString, data, onComplete, hash);\n }\n\n putInternal(\n action: string,\n pathString: string,\n data: unknown,\n onComplete: (a: string, b: string | null) => void,\n hash?: string\n ) {\n this.initConnection_();\n\n const request: { [k: string]: unknown } = {\n /*path*/ p: pathString,\n /*data*/ d: data\n };\n\n if (hash !== undefined) {\n request[/*hash*/ 'h'] = hash;\n }\n\n // TODO: Only keep track of the most recent put for a given path?\n this.outstandingPuts_.push({\n action,\n request,\n onComplete\n });\n\n this.outstandingPutCount_++;\n const index = this.outstandingPuts_.length - 1;\n\n if (this.connected_) {\n this.sendPut_(index);\n } else {\n this.log_('Buffering put: ' + pathString);\n }\n }\n\n private sendPut_(index: number) {\n const action = this.outstandingPuts_[index].action;\n const request = this.outstandingPuts_[index].request;\n const onComplete = this.outstandingPuts_[index].onComplete;\n this.outstandingPuts_[index].queued = this.connected_;\n\n this.sendRequest(action, request, (message: { [k: string]: unknown }) => {\n this.log_(action + ' response', message);\n\n delete this.outstandingPuts_[index];\n this.outstandingPutCount_--;\n\n // Clean up array occasionally.\n if (this.outstandingPutCount_ === 0) {\n this.outstandingPuts_ = [];\n }\n\n if (onComplete) {\n onComplete(\n message[/*status*/ 's'] as string,\n message[/* data */ 'd'] as string\n );\n }\n });\n }\n\n reportStats(stats: { [k: string]: unknown }) {\n // If we're not connected, we just drop the stats.\n if (this.connected_) {\n const request = { /*counters*/ c: stats };\n this.log_('reportStats', request);\n\n this.sendRequest(/*stats*/ 's', request, result => {\n const status = result[/*status*/ 's'];\n if (status !== 'ok') {\n const errorReason = result[/* data */ 'd'];\n this.log_('reportStats', 'Error sending stats: ' + errorReason);\n }\n });\n }\n }\n\n private onDataMessage_(message: { [k: string]: unknown }) {\n if ('r' in message) {\n // this is a response\n this.log_('from server: ' + stringify(message));\n const reqNum = message['r'] as string;\n const onResponse = this.requestCBHash_[reqNum];\n if (onResponse) {\n delete this.requestCBHash_[reqNum];\n onResponse(message[/*body*/ 'b']);\n }\n } else if ('error' in message) {\n throw 'A server-side error has occurred: ' + message['error'];\n } else if ('a' in message) {\n // a and b are action and body, respectively\n this.onDataPush_(message['a'] as string, message['b'] as {});\n }\n }\n\n private onDataPush_(action: string, body: { [k: string]: unknown }) {\n this.log_('handleServerMessage', action, body);\n if (action === 'd') {\n this.onDataUpdate_(\n body[/*path*/ 'p'] as string,\n body[/*data*/ 'd'],\n /*isMerge*/ false,\n body['t'] as number\n );\n } else if (action === 'm') {\n this.onDataUpdate_(\n body[/*path*/ 'p'] as string,\n body[/*data*/ 'd'],\n /*isMerge=*/ true,\n body['t'] as number\n );\n } else if (action === 'c') {\n this.onListenRevoked_(\n body[/*path*/ 'p'] as string,\n body[/*query*/ 'q'] as unknown[]\n );\n } else if (action === 'ac') {\n this.onAuthRevoked_(\n body[/*status code*/ 's'] as string,\n body[/* explanation */ 'd'] as string\n );\n } else if (action === 'apc') {\n this.onAppCheckRevoked_(\n body[/*status code*/ 's'] as string,\n body[/* explanation */ 'd'] as string\n );\n } else if (action === 'sd') {\n this.onSecurityDebugPacket_(body);\n } else {\n error(\n 'Unrecognized action received from server: ' +\n stringify(action) +\n '\\nAre you using the latest client?'\n );\n }\n }\n\n private onReady_(timestamp: number, sessionId: string) {\n this.log_('connection ready');\n this.connected_ = true;\n this.lastConnectionEstablishedTime_ = new Date().getTime();\n this.handleTimestamp_(timestamp);\n this.lastSessionId = sessionId;\n if (this.firstConnection_) {\n this.sendConnectStats_();\n }\n this.restoreState_();\n this.firstConnection_ = false;\n this.onConnectStatus_(true);\n }\n\n private scheduleConnect_(timeout: number) {\n assert(\n !this.realtime_,\n \"Scheduling a connect when we're already connected/ing?\"\n );\n\n if (this.establishConnectionTimer_) {\n clearTimeout(this.establishConnectionTimer_);\n }\n\n // NOTE: Even when timeout is 0, it's important to do a setTimeout to work around an infuriating \"Security Error\" in\n // Firefox when trying to write to our long-polling iframe in some scenarios (e.g. Forge or our unit tests).\n\n this.establishConnectionTimer_ = setTimeout(() => {\n this.establishConnectionTimer_ = null;\n this.establishConnection_();\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n }, Math.floor(timeout)) as any;\n }\n\n private initConnection_() {\n if (!this.realtime_ && this.firstConnection_) {\n this.scheduleConnect_(0);\n }\n }\n\n private onVisible_(visible: boolean) {\n // NOTE: Tabbing away and back to a window will defeat our reconnect backoff, but I think that's fine.\n if (\n visible &&\n !this.visible_ &&\n this.reconnectDelay_ === this.maxReconnectDelay_\n ) {\n this.log_('Window became visible. Reducing delay.');\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n }\n this.visible_ = visible;\n }\n\n private onOnline_(online: boolean) {\n if (online) {\n this.log_('Browser went online.');\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n } else {\n this.log_('Browser went offline. Killing connection.');\n if (this.realtime_) {\n this.realtime_.close();\n }\n }\n }\n\n private onRealtimeDisconnect_() {\n this.log_('data client disconnected');\n this.connected_ = false;\n this.realtime_ = null;\n\n // Since we don't know if our sent transactions succeeded or not, we need to cancel them.\n this.cancelSentTransactions_();\n\n // Clear out the pending requests.\n this.requestCBHash_ = {};\n\n if (this.shouldReconnect_()) {\n if (!this.visible_) {\n this.log_(\"Window isn't visible. Delaying reconnect.\");\n this.reconnectDelay_ = this.maxReconnectDelay_;\n this.lastConnectionAttemptTime_ = new Date().getTime();\n } else if (this.lastConnectionEstablishedTime_) {\n // If we've been connected long enough, reset reconnect delay to minimum.\n const timeSinceLastConnectSucceeded =\n new Date().getTime() - this.lastConnectionEstablishedTime_;\n if (timeSinceLastConnectSucceeded > RECONNECT_DELAY_RESET_TIMEOUT) {\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n }\n this.lastConnectionEstablishedTime_ = null;\n }\n\n const timeSinceLastConnectAttempt =\n new Date().getTime() - this.lastConnectionAttemptTime_;\n let reconnectDelay = Math.max(\n 0,\n this.reconnectDelay_ - timeSinceLastConnectAttempt\n );\n reconnectDelay = Math.random() * reconnectDelay;\n\n this.log_('Trying to reconnect in ' + reconnectDelay + 'ms');\n this.scheduleConnect_(reconnectDelay);\n\n // Adjust reconnect delay for next time.\n this.reconnectDelay_ = Math.min(\n this.maxReconnectDelay_,\n this.reconnectDelay_ * RECONNECT_DELAY_MULTIPLIER\n );\n }\n this.onConnectStatus_(false);\n }\n\n private async establishConnection_() {\n if (this.shouldReconnect_()) {\n this.log_('Making a connection attempt');\n this.lastConnectionAttemptTime_ = new Date().getTime();\n this.lastConnectionEstablishedTime_ = null;\n const onDataMessage = this.onDataMessage_.bind(this);\n const onReady = this.onReady_.bind(this);\n const onDisconnect = this.onRealtimeDisconnect_.bind(this);\n const connId = this.id + ':' + PersistentConnection.nextConnectionId_++;\n const lastSessionId = this.lastSessionId;\n let canceled = false;\n let connection: Connection | null = null;\n const closeFn = function () {\n if (connection) {\n connection.close();\n } else {\n canceled = true;\n onDisconnect();\n }\n };\n const sendRequestFn = function (msg: object) {\n assert(\n connection,\n \"sendRequest call when we're not connected not allowed.\"\n );\n connection.sendRequest(msg);\n };\n\n this.realtime_ = {\n close: closeFn,\n sendRequest: sendRequestFn\n };\n\n const forceRefresh = this.forceTokenRefresh_;\n this.forceTokenRefresh_ = false;\n\n try {\n // First fetch auth and app check token, and establish connection after\n // fetching the token was successful\n const [authToken, appCheckToken] = await Promise.all([\n this.authTokenProvider_.getToken(forceRefresh),\n this.appCheckTokenProvider_.getToken(forceRefresh)\n ]);\n\n if (!canceled) {\n log('getToken() completed. Creating connection.');\n this.authToken_ = authToken && authToken.accessToken;\n this.appCheckToken_ = appCheckToken && appCheckToken.token;\n connection = new Connection(\n connId,\n this.repoInfo_,\n this.applicationId_,\n this.appCheckToken_,\n this.authToken_,\n onDataMessage,\n onReady,\n onDisconnect,\n /* onKill= */ reason => {\n warn(reason + ' (' + this.repoInfo_.toString() + ')');\n this.interrupt(SERVER_KILL_INTERRUPT_REASON);\n },\n lastSessionId\n );\n } else {\n log('getToken() completed but was canceled');\n }\n } catch (error) {\n this.log_('Failed to get token: ' + error);\n if (!canceled) {\n if (this.repoInfo_.nodeAdmin) {\n // This may be a critical error for the Admin Node.js SDK, so log a warning.\n // But getToken() may also just have temporarily failed, so we still want to\n // continue retrying.\n warn(error);\n }\n closeFn();\n }\n }\n }\n }\n\n interrupt(reason: string) {\n log('Interrupting connection for reason: ' + reason);\n this.interruptReasons_[reason] = true;\n if (this.realtime_) {\n this.realtime_.close();\n } else {\n if (this.establishConnectionTimer_) {\n clearTimeout(this.establishConnectionTimer_);\n this.establishConnectionTimer_ = null;\n }\n if (this.connected_) {\n this.onRealtimeDisconnect_();\n }\n }\n }\n\n resume(reason: string) {\n log('Resuming connection for reason: ' + reason);\n delete this.interruptReasons_[reason];\n if (isEmpty(this.interruptReasons_)) {\n this.reconnectDelay_ = RECONNECT_MIN_DELAY;\n if (!this.realtime_) {\n this.scheduleConnect_(0);\n }\n }\n }\n\n private handleTimestamp_(timestamp: number) {\n const delta = timestamp - new Date().getTime();\n this.onServerInfoUpdate_({ serverTimeOffset: delta });\n }\n\n private cancelSentTransactions_() {\n for (let i = 0; i < this.outstandingPuts_.length; i++) {\n const put = this.outstandingPuts_[i];\n if (put && /*hash*/ 'h' in put.request && put.queued) {\n if (put.onComplete) {\n put.onComplete('disconnect');\n }\n\n delete this.outstandingPuts_[i];\n this.outstandingPutCount_--;\n }\n }\n\n // Clean up array occasionally.\n if (this.outstandingPutCount_ === 0) {\n this.outstandingPuts_ = [];\n }\n }\n\n private onListenRevoked_(pathString: string, query?: unknown[]) {\n // Remove the listen and manufacture a \"permission_denied\" error for the failed listen.\n let queryId;\n if (!query) {\n queryId = 'default';\n } else {\n queryId = query.map(q => ObjectToUniqueKey(q)).join('$');\n }\n const listen = this.removeListen_(pathString, queryId);\n if (listen && listen.onComplete) {\n listen.onComplete('permission_denied');\n }\n }\n\n private removeListen_(pathString: string, queryId: string): ListenSpec {\n const normalizedPathString = new Path(pathString).toString(); // normalize path.\n let listen;\n if (this.listens.has(normalizedPathString)) {\n const map = this.listens.get(normalizedPathString)!;\n listen = map.get(queryId);\n map.delete(queryId);\n if (map.size === 0) {\n this.listens.delete(normalizedPathString);\n }\n } else {\n // all listens for this path has already been removed\n listen = undefined;\n }\n return listen;\n }\n\n private onAuthRevoked_(statusCode: string, explanation: string) {\n log('Auth token revoked: ' + statusCode + '/' + explanation);\n this.authToken_ = null;\n this.forceTokenRefresh_ = true;\n this.realtime_.close();\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\n // We'll wait a couple times before logging the warning / increasing the\n // retry period since oauth tokens will report as \"invalid\" if they're\n // just expired. Plus there may be transient issues that resolve themselves.\n this.invalidAuthTokenCount_++;\n if (this.invalidAuthTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\n // Set a long reconnect delay because recovery is unlikely\n this.reconnectDelay_ = RECONNECT_MAX_DELAY_FOR_ADMINS;\n\n // Notify the auth token provider that the token is invalid, which will log\n // a warning\n this.authTokenProvider_.notifyForInvalidToken();\n }\n }\n }\n\n private onAppCheckRevoked_(statusCode: string, explanation: string) {\n log('App check token revoked: ' + statusCode + '/' + explanation);\n this.appCheckToken_ = null;\n this.forceTokenRefresh_ = true;\n // Note: We don't close the connection as the developer may not have\n // enforcement enabled. The backend closes connections with enforcements.\n if (statusCode === 'invalid_token' || statusCode === 'permission_denied') {\n // We'll wait a couple times before logging the warning / increasing the\n // retry period since oauth tokens will report as \"invalid\" if they're\n // just expired. Plus there may be transient issues that resolve themselves.\n this.invalidAppCheckTokenCount_++;\n if (this.invalidAppCheckTokenCount_ >= INVALID_TOKEN_THRESHOLD) {\n this.appCheckTokenProvider_.notifyForInvalidToken();\n }\n }\n }\n\n private onSecurityDebugPacket_(body: { [k: string]: unknown }) {\n if (this.securityDebugCallback_) {\n this.securityDebugCallback_(body);\n } else {\n if ('msg' in body) {\n console.log(\n 'FIREBASE: ' + (body['msg'] as string).replace('\\n', '\\nFIREBASE: ')\n );\n }\n }\n }\n\n private restoreState_() {\n //Re-authenticate ourselves if we have a credential stored.\n this.tryAuth();\n this.tryAppCheck();\n\n // Puts depend on having received the corresponding data update from the server before they complete, so we must\n // make sure to send listens before puts.\n for (const queries of this.listens.values()) {\n for (const listenSpec of queries.values()) {\n this.sendListen_(listenSpec);\n }\n }\n\n for (let i = 0; i < this.outstandingPuts_.length; i++) {\n if (this.outstandingPuts_[i]) {\n this.sendPut_(i);\n }\n }\n\n while (this.onDisconnectRequestQueue_.length) {\n const request = this.onDisconnectRequestQueue_.shift();\n this.sendOnDisconnect_(\n request.action,\n request.pathString,\n request.data,\n request.onComplete\n );\n }\n\n for (let i = 0; i < this.outstandingGets_.length; i++) {\n if (this.outstandingGets_[i]) {\n this.sendGet_(i);\n }\n }\n }\n\n /**\n * Sends client stats for first connection\n */\n private sendConnectStats_() {\n const stats: { [k: string]: number } = {};\n\n let clientName = 'js';\n if (isNodeSdk()) {\n if (this.repoInfo_.nodeAdmin) {\n clientName = 'admin_node';\n } else {\n clientName = 'node';\n }\n }\n\n stats['sdk.' + clientName + '.' + SDK_VERSION.replace(/\\./g, '-')] = 1;\n\n if (isMobileCordova()) {\n stats['framework.cordova'] = 1;\n } else if (isReactNative()) {\n stats['framework.reactnative'] = 1;\n }\n this.reportStats(stats);\n }\n\n private shouldReconnect_(): boolean {\n const online = OnlineMonitor.getInstance().currentlyOnline();\n return isEmpty(this.interruptReasons_) && online;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../util/Path';\n\nimport { Index } from './indexes/Index';\n\n/**\n * Node is an interface defining the common functionality for nodes in\n * a DataSnapshot.\n *\n * @interface\n */\nexport interface Node {\n /**\n * Whether this node is a leaf node.\n * @returns Whether this is a leaf node.\n */\n isLeafNode(): boolean;\n\n /**\n * Gets the priority of the node.\n * @returns The priority of the node.\n */\n getPriority(): Node;\n\n /**\n * Returns a duplicate node with the new priority.\n * @param newPriorityNode - New priority to set for the node.\n * @returns Node with new priority.\n */\n updatePriority(newPriorityNode: Node): Node;\n\n /**\n * Returns the specified immediate child, or null if it doesn't exist.\n * @param childName - The name of the child to retrieve.\n * @returns The retrieved child, or an empty node.\n */\n getImmediateChild(childName: string): Node;\n\n /**\n * Returns a child by path, or null if it doesn't exist.\n * @param path - The path of the child to retrieve.\n * @returns The retrieved child or an empty node.\n */\n getChild(path: Path): Node;\n\n /**\n * Returns the name of the child immediately prior to the specified childNode, or null.\n * @param childName - The name of the child to find the predecessor of.\n * @param childNode - The node to find the predecessor of.\n * @param index - The index to use to determine the predecessor\n * @returns The name of the predecessor child, or null if childNode is the first child.\n */\n getPredecessorChildName(\n childName: string,\n childNode: Node,\n index: Index\n ): string | null;\n\n /**\n * Returns a duplicate node, with the specified immediate child updated.\n * Any value in the node will be removed.\n * @param childName - The name of the child to update.\n * @param newChildNode - The new child node\n * @returns The updated node.\n */\n updateImmediateChild(childName: string, newChildNode: Node): Node;\n\n /**\n * Returns a duplicate node, with the specified child updated. Any value will\n * be removed.\n * @param path - The path of the child to update.\n * @param newChildNode - The new child node, which may be an empty node\n * @returns The updated node.\n */\n updateChild(path: Path, newChildNode: Node): Node;\n\n /**\n * True if the immediate child specified exists\n */\n hasChild(childName: string): boolean;\n\n /**\n * @returns True if this node has no value or children.\n */\n isEmpty(): boolean;\n\n /**\n * @returns The number of children of this node.\n */\n numChildren(): number;\n\n /**\n * Calls action for each child.\n * @param action - Action to be called for\n * each child. It's passed the child name and the child node.\n * @returns The first truthy value return by action, or the last falsey one\n */\n forEachChild(index: Index, action: (a: string, b: Node) => void): unknown;\n\n /**\n * @param exportFormat - True for export format (also wire protocol format).\n * @returns Value of this node as JSON.\n */\n val(exportFormat?: boolean): unknown;\n\n /**\n * @returns hash representing the node contents.\n */\n hash(): string;\n\n /**\n * @param other - Another node\n * @returns -1 for less than, 0 for equal, 1 for greater than other\n */\n compareTo(other: Node): number;\n\n /**\n * @returns Whether or not this snapshot equals other\n */\n equals(other: Node): boolean;\n\n /**\n * @returns This node, with the specified index now available\n */\n withIndex(indexDefinition: Index): Node;\n\n isIndexed(indexDefinition: Index): boolean;\n}\n\nexport class NamedNode {\n constructor(public name: string, public node: Node) {}\n\n static Wrap(name: string, node: Node) {\n return new NamedNode(name, node);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Comparator } from '../../util/SortedMap';\nimport { MIN_NAME } from '../../util/util';\nimport { Node, NamedNode } from '../Node';\n\nexport abstract class Index {\n abstract compare(a: NamedNode, b: NamedNode): number;\n\n abstract isDefinedOn(node: Node): boolean;\n\n /**\n * @returns A standalone comparison function for\n * this index\n */\n getCompare(): Comparator {\n return this.compare.bind(this);\n }\n\n /**\n * Given a before and after value for a node, determine if the indexed value has changed. Even if they are different,\n * it's possible that the changes are isolated to parts of the snapshot that are not indexed.\n *\n *\n * @returns True if the portion of the snapshot being indexed changed between oldNode and newNode\n */\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n const oldWrapped = new NamedNode(MIN_NAME, oldNode);\n const newWrapped = new NamedNode(MIN_NAME, newNode);\n return this.compare(oldWrapped, newWrapped) !== 0;\n }\n\n /**\n * @returns a node wrapper that will sort equal to or less than\n * any other node wrapper, using this index\n */\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n\n /**\n * @returns a node wrapper that will sort greater than or equal to\n * any other node wrapper, using this index\n */\n abstract maxPost(): NamedNode;\n\n abstract makePost(indexValue: unknown, name: string): NamedNode;\n\n /**\n * @returns String representation for inclusion in a query spec\n */\n abstract toString(): string;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, assertionError } from '@firebase/util';\n\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { ChildrenNode } from '../ChildrenNode';\nimport { Node, NamedNode } from '../Node';\n\nimport { Index } from './Index';\n\nlet __EMPTY_NODE: ChildrenNode;\n\nexport class KeyIndex extends Index {\n static get __EMPTY_NODE() {\n return __EMPTY_NODE;\n }\n\n static set __EMPTY_NODE(val) {\n __EMPTY_NODE = val;\n }\n compare(a: NamedNode, b: NamedNode): number {\n return nameCompare(a.name, b.name);\n }\n isDefinedOn(node: Node): boolean {\n // We could probably return true here (since every node has a key), but it's never called\n // so just leaving unimplemented for now.\n throw assertionError('KeyIndex.isDefinedOn not expected to be called.');\n }\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return false; // The key for a node never changes.\n }\n minPost() {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n maxPost(): NamedNode {\n // TODO: This should really be created once and cached in a static property, but\n // NamedNode isn't defined yet, so I can't use it in a static. Bleh.\n return new NamedNode(MAX_NAME, __EMPTY_NODE);\n }\n\n makePost(indexValue: string, name: string): NamedNode {\n assert(\n typeof indexValue === 'string',\n 'KeyIndex indexValue must always be a string.'\n );\n // We just use empty node, but it'll never be compared, since our comparator only looks at name.\n return new NamedNode(indexValue, __EMPTY_NODE);\n }\n\n /**\n * @returns String representation for inclusion in a query spec\n */\n toString(): string {\n return '.key';\n }\n}\n\nexport const KEY_INDEX = new KeyIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Implementation of an immutable SortedMap using a Left-leaning\n * Red-Black Tree, adapted from the implementation in Mugs\n * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen\n * (mads379\\@gmail.com).\n *\n * Original paper on Left-leaning Red-Black Trees:\n * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf\n *\n * Invariant 1: No red node has a red child\n * Invariant 2: Every leaf path has the same number of black nodes\n * Invariant 3: Only the left child can be red (left leaning)\n */\n\n// TODO: There are some improvements I'd like to make to improve memory / perf:\n// * Create two prototypes, LLRedNode and LLBlackNode, instead of storing a\n// color property in every node.\n// TODO: It would also be good (and possibly necessary) to create a base\n// interface for LLRBNode and LLRBEmptyNode.\n\nexport type Comparator = (key1: K, key2: K) => number;\n\n/**\n * An iterator over an LLRBNode.\n */\nexport class SortedMapIterator {\n private nodeStack_: Array | LLRBEmptyNode> = [];\n\n /**\n * @param node - Node to iterate.\n * @param isReverse_ - Whether or not to iterate in reverse\n */\n constructor(\n node: LLRBNode | LLRBEmptyNode,\n startKey: K | null,\n comparator: Comparator,\n private isReverse_: boolean,\n private resultGenerator_: ((k: K, v: V) => T) | null = null\n ) {\n let cmp = 1;\n while (!node.isEmpty()) {\n node = node as LLRBNode;\n cmp = startKey ? comparator(node.key, startKey) : 1;\n // flip the comparison if we're going in reverse\n if (isReverse_) {\n cmp *= -1;\n }\n\n if (cmp < 0) {\n // This node is less than our start key. ignore it\n if (this.isReverse_) {\n node = node.left;\n } else {\n node = node.right;\n }\n } else if (cmp === 0) {\n // This node is exactly equal to our start key. Push it on the stack, but stop iterating;\n this.nodeStack_.push(node);\n break;\n } else {\n // This node is greater than our start key, add it to the stack and move to the next one\n this.nodeStack_.push(node);\n if (this.isReverse_) {\n node = node.right;\n } else {\n node = node.left;\n }\n }\n }\n }\n\n getNext(): T {\n if (this.nodeStack_.length === 0) {\n return null;\n }\n\n let node = this.nodeStack_.pop();\n let result: T;\n if (this.resultGenerator_) {\n result = this.resultGenerator_(node.key, node.value);\n } else {\n result = { key: node.key, value: node.value } as unknown as T;\n }\n\n if (this.isReverse_) {\n node = node.left;\n while (!node.isEmpty()) {\n this.nodeStack_.push(node);\n node = node.right;\n }\n } else {\n node = node.right;\n while (!node.isEmpty()) {\n this.nodeStack_.push(node);\n node = node.left;\n }\n }\n\n return result;\n }\n\n hasNext(): boolean {\n return this.nodeStack_.length > 0;\n }\n\n peek(): T {\n if (this.nodeStack_.length === 0) {\n return null;\n }\n\n const node = this.nodeStack_[this.nodeStack_.length - 1];\n if (this.resultGenerator_) {\n return this.resultGenerator_(node.key, node.value);\n } else {\n return { key: node.key, value: node.value } as unknown as T;\n }\n }\n}\n\n/**\n * Represents a node in a Left-leaning Red-Black tree.\n */\nexport class LLRBNode {\n color: boolean;\n left: LLRBNode | LLRBEmptyNode;\n right: LLRBNode | LLRBEmptyNode;\n\n /**\n * @param key - Key associated with this node.\n * @param value - Value associated with this node.\n * @param color - Whether this node is red.\n * @param left - Left child.\n * @param right - Right child.\n */\n constructor(\n public key: K,\n public value: V,\n color: boolean | null,\n left?: LLRBNode | LLRBEmptyNode | null,\n right?: LLRBNode | LLRBEmptyNode | null\n ) {\n this.color = color != null ? color : LLRBNode.RED;\n this.left =\n left != null ? left : (SortedMap.EMPTY_NODE as LLRBEmptyNode);\n this.right =\n right != null ? right : (SortedMap.EMPTY_NODE as LLRBEmptyNode);\n }\n\n static RED = true;\n static BLACK = false;\n\n /**\n * Returns a copy of the current node, optionally replacing pieces of it.\n *\n * @param key - New key for the node, or null.\n * @param value - New value for the node, or null.\n * @param color - New color for the node, or null.\n * @param left - New left child for the node, or null.\n * @param right - New right child for the node, or null.\n * @returns The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBNode {\n return new LLRBNode(\n key != null ? key : this.key,\n value != null ? value : this.value,\n color != null ? color : this.color,\n left != null ? left : this.left,\n right != null ? right : this.right\n );\n }\n\n /**\n * @returns The total number of nodes in the tree.\n */\n count(): number {\n return this.left.count() + 1 + this.right.count();\n }\n\n /**\n * @returns True if the tree is empty.\n */\n isEmpty(): boolean {\n return false;\n }\n\n /**\n * Traverses the tree in key order and calls the specified action function\n * for each node.\n *\n * @param action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns The first truthy value returned by action, or the last falsey\n * value returned by action\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return (\n this.left.inorderTraversal(action) ||\n !!action(this.key, this.value) ||\n this.right.inorderTraversal(action)\n );\n }\n\n /**\n * Traverses the tree in reverse key order and calls the specified action function\n * for each node.\n *\n * @param action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns True if traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return (\n this.right.reverseTraversal(action) ||\n action(this.key, this.value) ||\n this.left.reverseTraversal(action)\n );\n }\n\n /**\n * @returns The minimum node in the tree.\n */\n private min_(): LLRBNode {\n if (this.left.isEmpty()) {\n return this;\n } else {\n return (this.left as LLRBNode).min_();\n }\n }\n\n /**\n * @returns The maximum key in the tree.\n */\n minKey(): K {\n return this.min_().key;\n }\n\n /**\n * @returns The maximum key in the tree.\n */\n maxKey(): K {\n if (this.right.isEmpty()) {\n return this.key;\n } else {\n return this.right.maxKey();\n }\n }\n\n /**\n * @param key - Key to insert.\n * @param value - Value to insert.\n * @param comparator - Comparator.\n * @returns New tree, with the key/value added.\n */\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\n let n: LLRBNode = this;\n const cmp = comparator(key, n.key);\n if (cmp < 0) {\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\n } else if (cmp === 0) {\n n = n.copy(null, value, null, null, null);\n } else {\n n = n.copy(\n null,\n null,\n null,\n null,\n n.right.insert(key, value, comparator)\n );\n }\n return n.fixUp_();\n }\n\n /**\n * @returns New tree, with the minimum key removed.\n */\n private removeMin_(): LLRBNode | LLRBEmptyNode {\n if (this.left.isEmpty()) {\n return SortedMap.EMPTY_NODE as LLRBEmptyNode;\n }\n let n: LLRBNode = this;\n if (!n.left.isRed_() && !n.left.left.isRed_()) {\n n = n.moveRedLeft_();\n }\n n = n.copy(null, null, null, (n.left as LLRBNode).removeMin_(), null);\n return n.fixUp_();\n }\n\n /**\n * @param key - The key of the item to remove.\n * @param comparator - Comparator.\n * @returns New tree, with the specified item removed.\n */\n remove(\n key: K,\n comparator: Comparator\n ): LLRBNode | LLRBEmptyNode {\n let n, smallest;\n n = this;\n if (comparator(key, n.key) < 0) {\n if (!n.left.isEmpty() && !n.left.isRed_() && !n.left.left.isRed_()) {\n n = n.moveRedLeft_();\n }\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\n } else {\n if (n.left.isRed_()) {\n n = n.rotateRight_();\n }\n if (!n.right.isEmpty() && !n.right.isRed_() && !n.right.left.isRed_()) {\n n = n.moveRedRight_();\n }\n if (comparator(key, n.key) === 0) {\n if (n.right.isEmpty()) {\n return SortedMap.EMPTY_NODE as LLRBEmptyNode;\n } else {\n smallest = (n.right as LLRBNode).min_();\n n = n.copy(\n smallest.key,\n smallest.value,\n null,\n null,\n (n.right as LLRBNode).removeMin_()\n );\n }\n }\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\n }\n return n.fixUp_();\n }\n\n /**\n * @returns Whether this is a RED node.\n */\n isRed_(): boolean {\n return this.color;\n }\n\n /**\n * @returns New tree after performing any needed rotations.\n */\n private fixUp_(): LLRBNode {\n let n: LLRBNode = this;\n if (n.right.isRed_() && !n.left.isRed_()) {\n n = n.rotateLeft_();\n }\n if (n.left.isRed_() && n.left.left.isRed_()) {\n n = n.rotateRight_();\n }\n if (n.left.isRed_() && n.right.isRed_()) {\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @returns New tree, after moveRedLeft.\n */\n private moveRedLeft_(): LLRBNode {\n let n = this.colorFlip_();\n if (n.right.left.isRed_()) {\n n = n.copy(\n null,\n null,\n null,\n null,\n (n.right as LLRBNode).rotateRight_()\n );\n n = n.rotateLeft_();\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @returns New tree, after moveRedRight.\n */\n private moveRedRight_(): LLRBNode {\n let n = this.colorFlip_();\n if (n.left.left.isRed_()) {\n n = n.rotateRight_();\n n = n.colorFlip_();\n }\n return n;\n }\n\n /**\n * @returns New tree, after rotateLeft.\n */\n private rotateLeft_(): LLRBNode {\n const nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return this.right.copy(null, null, this.color, nl, null) as LLRBNode;\n }\n\n /**\n * @returns New tree, after rotateRight.\n */\n private rotateRight_(): LLRBNode {\n const nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return this.left.copy(null, null, this.color, null, nr) as LLRBNode;\n }\n\n /**\n * @returns Newt ree, after colorFlip.\n */\n private colorFlip_(): LLRBNode {\n const left = this.left.copy(null, null, !this.left.color, null, null);\n const right = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, left, right);\n }\n\n /**\n * For testing.\n *\n * @returns True if all is well.\n */\n private checkMaxDepth_(): boolean {\n const blackDepth = this.check_();\n return Math.pow(2.0, blackDepth) <= this.count() + 1;\n }\n\n check_(): number {\n if (this.isRed_() && this.left.isRed_()) {\n throw new Error(\n 'Red node has red child(' + this.key + ',' + this.value + ')'\n );\n }\n if (this.right.isRed_()) {\n throw new Error(\n 'Right child of (' + this.key + ',' + this.value + ') is red'\n );\n }\n const blackDepth = this.left.check_();\n if (blackDepth !== this.right.check_()) {\n throw new Error('Black depths differ');\n } else {\n return blackDepth + (this.isRed_() ? 0 : 1);\n }\n }\n}\n\n/**\n * Represents an empty node (a leaf node in the Red-Black Tree).\n */\nexport class LLRBEmptyNode {\n key: K;\n value: V;\n left: LLRBNode | LLRBEmptyNode;\n right: LLRBNode | LLRBEmptyNode;\n color: boolean;\n\n /**\n * Returns a copy of the current node.\n *\n * @returns The node copy.\n */\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBEmptyNode {\n return this;\n }\n\n /**\n * Returns a copy of the tree, with the specified key/value added.\n *\n * @param key - Key to be added.\n * @param value - Value to be added.\n * @param comparator - Comparator.\n * @returns New tree, with item added.\n */\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\n return new LLRBNode(key, value, null);\n }\n\n /**\n * Returns a copy of the tree, with the specified key removed.\n *\n * @param key - The key to remove.\n * @param comparator - Comparator.\n * @returns New tree, with item removed.\n */\n remove(key: K, comparator: Comparator): LLRBEmptyNode {\n return this;\n }\n\n /**\n * @returns The total number of nodes in the tree.\n */\n count(): number {\n return 0;\n }\n\n /**\n * @returns True if the tree is empty.\n */\n isEmpty(): boolean {\n return true;\n }\n\n /**\n * Traverses the tree in key order and calls the specified action function\n * for each node.\n *\n * @param action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns True if traversal was aborted.\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return false;\n }\n\n /**\n * Traverses the tree in reverse key order and calls the specified action function\n * for each node.\n *\n * @param action - Callback function to be called for each\n * node. If it returns true, traversal is aborted.\n * @returns True if traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return false;\n }\n\n minKey(): null {\n return null;\n }\n\n maxKey(): null {\n return null;\n }\n\n check_(): number {\n return 0;\n }\n\n /**\n * @returns Whether this node is red.\n */\n isRed_() {\n return false;\n }\n}\n\n/**\n * An immutable sorted map implementation, based on a Left-leaning Red-Black\n * tree.\n */\nexport class SortedMap {\n /**\n * Always use the same empty node, to reduce memory.\n */\n static EMPTY_NODE = new LLRBEmptyNode();\n\n /**\n * @param comparator_ - Key comparator.\n * @param root_ - Optional root node for the map.\n */\n constructor(\n private comparator_: Comparator,\n private root_:\n | LLRBNode\n | LLRBEmptyNode = SortedMap.EMPTY_NODE as LLRBEmptyNode\n ) {}\n\n /**\n * Returns a copy of the map, with the specified key/value added or replaced.\n * (TODO: We should perhaps rename this method to 'put')\n *\n * @param key - Key to be added.\n * @param value - Value to be added.\n * @returns New map, with item added.\n */\n insert(key: K, value: V): SortedMap {\n return new SortedMap(\n this.comparator_,\n this.root_\n .insert(key, value, this.comparator_)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n /**\n * Returns a copy of the map, with the specified key removed.\n *\n * @param key - The key to remove.\n * @returns New map, with item removed.\n */\n remove(key: K): SortedMap {\n return new SortedMap(\n this.comparator_,\n this.root_\n .remove(key, this.comparator_)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n /**\n * Returns the value of the node with the given key, or null.\n *\n * @param key - The key to look up.\n * @returns The value of the node with the given key, or null if the\n * key doesn't exist.\n */\n get(key: K): V | null {\n let cmp;\n let node = this.root_;\n while (!node.isEmpty()) {\n cmp = this.comparator_(key, node.key);\n if (cmp === 0) {\n return node.value;\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n node = node.right;\n }\n }\n return null;\n }\n\n /**\n * Returns the key of the item *before* the specified key, or null if key is the first item.\n * @param key - The key to find the predecessor of\n * @returns The predecessor key.\n */\n getPredecessorKey(key: K): K | null {\n let cmp,\n node = this.root_,\n rightParent = null;\n while (!node.isEmpty()) {\n cmp = this.comparator_(key, node.key);\n if (cmp === 0) {\n if (!node.left.isEmpty()) {\n node = node.left;\n while (!node.right.isEmpty()) {\n node = node.right;\n }\n return node.key;\n } else if (rightParent) {\n return rightParent.key;\n } else {\n return null; // first item.\n }\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n rightParent = node;\n node = node.right;\n }\n }\n\n throw new Error(\n 'Attempted to find predecessor key for a nonexistent key. What gives?'\n );\n }\n\n /**\n * @returns True if the map is empty.\n */\n isEmpty(): boolean {\n return this.root_.isEmpty();\n }\n\n /**\n * @returns The total number of nodes in the map.\n */\n count(): number {\n return this.root_.count();\n }\n\n /**\n * @returns The minimum key in the map.\n */\n minKey(): K | null {\n return this.root_.minKey();\n }\n\n /**\n * @returns The maximum key in the map.\n */\n maxKey(): K | null {\n return this.root_.maxKey();\n }\n\n /**\n * Traverses the map in key order and calls the specified action function\n * for each key/value pair.\n *\n * @param action - Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @returns The first truthy value returned by action, or the last falsey\n * value returned by action\n */\n inorderTraversal(action: (k: K, v: V) => unknown): boolean {\n return this.root_.inorderTraversal(action);\n }\n\n /**\n * Traverses the map in reverse key order and calls the specified action function\n * for each key/value pair.\n *\n * @param action - Callback function to be called\n * for each key/value pair. If action returns true, traversal is aborted.\n * @returns True if the traversal was aborted.\n */\n reverseTraversal(action: (k: K, v: V) => void): boolean {\n return this.root_.reverseTraversal(action);\n }\n\n /**\n * Returns an iterator over the SortedMap.\n * @returns The iterator.\n */\n getIterator(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n null,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getIteratorFrom(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n false,\n resultGenerator\n );\n }\n\n getReverseIteratorFrom(\n key: K,\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n key,\n this.comparator_,\n true,\n resultGenerator\n );\n }\n\n getReverseIterator(\n resultGenerator?: (k: K, v: V) => T\n ): SortedMapIterator {\n return new SortedMapIterator(\n this.root_,\n null,\n this.comparator_,\n true,\n resultGenerator\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nameCompare } from '../util/util';\n\nimport { NamedNode } from './Node';\n\nexport function NAME_ONLY_COMPARATOR(left: NamedNode, right: NamedNode) {\n return nameCompare(left.name, right.name);\n}\n\nexport function NAME_COMPARATOR(left: string, right: string) {\n return nameCompare(left, right);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains } from '@firebase/util';\n\nimport { Indexable } from '../util/misc';\nimport { doubleToIEEE754String } from '../util/util';\n\nimport { Node } from './Node';\n\nlet MAX_NODE: Node;\n\nexport function setMaxNode(val: Node) {\n MAX_NODE = val;\n}\n\nexport const priorityHashText = function (priority: string | number): string {\n if (typeof priority === 'number') {\n return 'number:' + doubleToIEEE754String(priority);\n } else {\n return 'string:' + priority;\n }\n};\n\n/**\n * Validates that a priority snapshot Node is valid.\n */\nexport const validatePriorityNode = function (priorityNode: Node) {\n if (priorityNode.isLeafNode()) {\n const val = priorityNode.val();\n assert(\n typeof val === 'string' ||\n typeof val === 'number' ||\n (typeof val === 'object' && contains(val as Indexable, '.sv')),\n 'Priority must be a string or number.'\n );\n } else {\n assert(\n priorityNode === MAX_NODE || priorityNode.isEmpty(),\n 'priority of unexpected type.'\n );\n }\n // Don't call getPriority() on MAX_NODE to avoid hitting assertion.\n assert(\n priorityNode === MAX_NODE || priorityNode.getPriority().isEmpty(),\n \"Priority nodes can't have a priority of their own.\"\n );\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { Indexable } from '../util/misc';\nimport {\n Path,\n pathGetFront,\n pathGetLength,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\nimport { doubleToIEEE754String, sha1 } from '../util/util';\n\nimport { ChildrenNodeConstructor } from './ChildrenNode';\nimport { Index } from './indexes/Index';\nimport { Node } from './Node';\nimport { priorityHashText, validatePriorityNode } from './snap';\n\nlet __childrenNodeConstructor: ChildrenNodeConstructor;\n\n/**\n * LeafNode is a class for storing leaf nodes in a DataSnapshot. It\n * implements Node and stores the value of the node (a string,\n * number, or boolean) accessible via getValue().\n */\nexport class LeafNode implements Node {\n static set __childrenNodeConstructor(val: ChildrenNodeConstructor) {\n __childrenNodeConstructor = val;\n }\n\n static get __childrenNodeConstructor() {\n return __childrenNodeConstructor;\n }\n\n /**\n * The sort order for comparing leaf nodes of different types. If two leaf nodes have\n * the same type, the comparison falls back to their value\n */\n static VALUE_TYPE_ORDER = ['object', 'boolean', 'number', 'string'];\n\n private lazyHash_: string | null = null;\n\n /**\n * @param value_ - The value to store in this leaf node. The object type is\n * possible in the event of a deferred value\n * @param priorityNode_ - The priority of this node.\n */\n constructor(\n private readonly value_: string | number | boolean | Indexable,\n private priorityNode_: Node = LeafNode.__childrenNodeConstructor.EMPTY_NODE\n ) {\n assert(\n this.value_ !== undefined && this.value_ !== null,\n \"LeafNode shouldn't be created with null/undefined value.\"\n );\n\n validatePriorityNode(this.priorityNode_);\n }\n\n /** @inheritDoc */\n isLeafNode(): boolean {\n return true;\n }\n\n /** @inheritDoc */\n getPriority(): Node {\n return this.priorityNode_;\n }\n\n /** @inheritDoc */\n updatePriority(newPriorityNode: Node): Node {\n return new LeafNode(this.value_, newPriorityNode);\n }\n\n /** @inheritDoc */\n getImmediateChild(childName: string): Node {\n // Hack to treat priority as a regular child\n if (childName === '.priority') {\n return this.priorityNode_;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\n }\n }\n\n /** @inheritDoc */\n getChild(path: Path): Node {\n if (pathIsEmpty(path)) {\n return this;\n } else if (pathGetFront(path) === '.priority') {\n return this.priorityNode_;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE;\n }\n }\n hasChild(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n getPredecessorChildName(childName: string, childNode: Node): null {\n return null;\n }\n\n /** @inheritDoc */\n updateImmediateChild(childName: string, newChildNode: Node): Node {\n if (childName === '.priority') {\n return this.updatePriority(newChildNode);\n } else if (newChildNode.isEmpty() && childName !== '.priority') {\n return this;\n } else {\n return LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateImmediateChild(\n childName,\n newChildNode\n ).updatePriority(this.priorityNode_);\n }\n }\n\n /** @inheritDoc */\n updateChild(path: Path, newChildNode: Node): Node {\n const front = pathGetFront(path);\n if (front === null) {\n return newChildNode;\n } else if (newChildNode.isEmpty() && front !== '.priority') {\n return this;\n } else {\n assert(\n front !== '.priority' || pathGetLength(path) === 1,\n '.priority must be the last token in a path'\n );\n\n return this.updateImmediateChild(\n front,\n LeafNode.__childrenNodeConstructor.EMPTY_NODE.updateChild(\n pathPopFront(path),\n newChildNode\n )\n );\n }\n }\n\n /** @inheritDoc */\n isEmpty(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n numChildren(): number {\n return 0;\n }\n\n /** @inheritDoc */\n forEachChild(index: Index, action: (s: string, n: Node) => void): boolean {\n return false;\n }\n val(exportFormat?: boolean): {} {\n if (exportFormat && !this.getPriority().isEmpty()) {\n return {\n '.value': this.getValue(),\n '.priority': this.getPriority().val()\n };\n } else {\n return this.getValue();\n }\n }\n\n /** @inheritDoc */\n hash(): string {\n if (this.lazyHash_ === null) {\n let toHash = '';\n if (!this.priorityNode_.isEmpty()) {\n toHash +=\n 'priority:' +\n priorityHashText(this.priorityNode_.val() as number | string) +\n ':';\n }\n\n const type = typeof this.value_;\n toHash += type + ':';\n if (type === 'number') {\n toHash += doubleToIEEE754String(this.value_ as number);\n } else {\n toHash += this.value_;\n }\n this.lazyHash_ = sha1(toHash);\n }\n return this.lazyHash_;\n }\n\n /**\n * Returns the value of the leaf node.\n * @returns The value of the node.\n */\n getValue(): Indexable | string | number | boolean {\n return this.value_;\n }\n compareTo(other: Node): number {\n if (other === LeafNode.__childrenNodeConstructor.EMPTY_NODE) {\n return 1;\n } else if (other instanceof LeafNode.__childrenNodeConstructor) {\n return -1;\n } else {\n assert(other.isLeafNode(), 'Unknown node type');\n return this.compareToLeafNode_(other as LeafNode);\n }\n }\n\n /**\n * Comparison specifically for two leaf nodes\n */\n private compareToLeafNode_(otherLeaf: LeafNode): number {\n const otherLeafType = typeof otherLeaf.value_;\n const thisLeafType = typeof this.value_;\n const otherIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(otherLeafType);\n const thisIndex = LeafNode.VALUE_TYPE_ORDER.indexOf(thisLeafType);\n assert(otherIndex >= 0, 'Unknown leaf type: ' + otherLeafType);\n assert(thisIndex >= 0, 'Unknown leaf type: ' + thisLeafType);\n if (otherIndex === thisIndex) {\n // Same type, compare values\n if (thisLeafType === 'object') {\n // Deferred value nodes are all equal, but we should also never get to this point...\n return 0;\n } else {\n // Note that this works because true > false, all others are number or string comparisons\n if (this.value_ < otherLeaf.value_) {\n return -1;\n } else if (this.value_ === otherLeaf.value_) {\n return 0;\n } else {\n return 1;\n }\n }\n } else {\n return thisIndex - otherIndex;\n }\n }\n withIndex(): Node {\n return this;\n }\n isIndexed(): boolean {\n return true;\n }\n equals(other: Node): boolean {\n if (other === this) {\n return true;\n } else if (other.isLeafNode()) {\n const otherLeaf = other as LeafNode;\n return (\n this.value_ === otherLeaf.value_ &&\n this.priorityNode_.equals(otherLeaf.priorityNode_)\n );\n } else {\n return false;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nameCompare, MAX_NAME } from '../../util/util';\nimport { LeafNode } from '../LeafNode';\nimport { NamedNode, Node } from '../Node';\n\nimport { Index } from './Index';\n\nlet nodeFromJSON: (a: unknown) => Node;\nlet MAX_NODE: Node;\n\nexport function setNodeFromJSON(val: (a: unknown) => Node) {\n nodeFromJSON = val;\n}\n\nexport function setMaxNode(val: Node) {\n MAX_NODE = val;\n}\n\nexport class PriorityIndex extends Index {\n compare(a: NamedNode, b: NamedNode): number {\n const aPriority = a.node.getPriority();\n const bPriority = b.node.getPriority();\n const indexCmp = aPriority.compareTo(bPriority);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n isDefinedOn(node: Node): boolean {\n return !node.getPriority().isEmpty();\n }\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.getPriority().equals(newNode.getPriority());\n }\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n maxPost(): NamedNode {\n return new NamedNode(MAX_NAME, new LeafNode('[PRIORITY-POST]', MAX_NODE));\n }\n\n makePost(indexValue: unknown, name: string): NamedNode {\n const priorityNode = nodeFromJSON(indexValue);\n return new NamedNode(name, new LeafNode('[PRIORITY-POST]', priorityNode));\n }\n\n /**\n * @returns String representation for inclusion in a query spec\n */\n toString(): string {\n return '.priority';\n }\n}\n\nexport const PRIORITY_INDEX = new PriorityIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LLRBNode, SortedMap } from '../util/SortedMap';\n\nimport { NamedNode } from './Node';\n\nconst LOG_2 = Math.log(2);\n\nclass Base12Num {\n count: number;\n private current_: number;\n private bits_: number;\n\n constructor(length: number) {\n const logBase2 = (num: number) =>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parseInt((Math.log(num) / LOG_2) as any, 10);\n const bitMask = (bits: number) => parseInt(Array(bits + 1).join('1'), 2);\n this.count = logBase2(length + 1);\n this.current_ = this.count - 1;\n const mask = bitMask(this.count);\n this.bits_ = (length + 1) & mask;\n }\n\n nextBitIsOne(): boolean {\n //noinspection JSBitwiseOperatorUsage\n const result = !(this.bits_ & (0x1 << this.current_));\n this.current_--;\n return result;\n }\n}\n\n/**\n * Takes a list of child nodes and constructs a SortedSet using the given comparison\n * function\n *\n * Uses the algorithm described in the paper linked here:\n * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.46.1458\n *\n * @param childList - Unsorted list of children\n * @param cmp - The comparison method to be used\n * @param keyFn - An optional function to extract K from a node wrapper, if K's\n * type is not NamedNode\n * @param mapSortFn - An optional override for comparator used by the generated sorted map\n */\nexport const buildChildSet = function (\n childList: NamedNode[],\n cmp: (a: NamedNode, b: NamedNode) => number,\n keyFn?: (a: NamedNode) => K,\n mapSortFn?: (a: K, b: K) => number\n): SortedMap {\n childList.sort(cmp);\n\n const buildBalancedTree = function (\n low: number,\n high: number\n ): LLRBNode | null {\n const length = high - low;\n let namedNode: NamedNode;\n let key: K;\n if (length === 0) {\n return null;\n } else if (length === 1) {\n namedNode = childList[low];\n key = keyFn ? keyFn(namedNode) : (namedNode as unknown as K);\n return new LLRBNode(\n key,\n namedNode.node as unknown as V,\n LLRBNode.BLACK,\n null,\n null\n );\n } else {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const middle = parseInt((length / 2) as any, 10) + low;\n const left = buildBalancedTree(low, middle);\n const right = buildBalancedTree(middle + 1, high);\n namedNode = childList[middle];\n key = keyFn ? keyFn(namedNode) : (namedNode as unknown as K);\n return new LLRBNode(\n key,\n namedNode.node as unknown as V,\n LLRBNode.BLACK,\n left,\n right\n );\n }\n };\n\n const buildFrom12Array = function (base12: Base12Num): LLRBNode {\n let node: LLRBNode = null;\n let root = null;\n let index = childList.length;\n\n const buildPennant = function (chunkSize: number, color: boolean) {\n const low = index - chunkSize;\n const high = index;\n index -= chunkSize;\n const childTree = buildBalancedTree(low + 1, high);\n const namedNode = childList[low];\n const key: K = keyFn ? keyFn(namedNode) : (namedNode as unknown as K);\n attachPennant(\n new LLRBNode(\n key,\n namedNode.node as unknown as V,\n color,\n null,\n childTree\n )\n );\n };\n\n const attachPennant = function (pennant: LLRBNode) {\n if (node) {\n node.left = pennant;\n node = pennant;\n } else {\n root = pennant;\n node = pennant;\n }\n };\n\n for (let i = 0; i < base12.count; ++i) {\n const isOne = base12.nextBitIsOne();\n // The number of nodes taken in each slice is 2^(arr.length - (i + 1))\n const chunkSize = Math.pow(2, base12.count - (i + 1));\n if (isOne) {\n buildPennant(chunkSize, LLRBNode.BLACK);\n } else {\n // current == 2\n buildPennant(chunkSize, LLRBNode.BLACK);\n buildPennant(chunkSize, LLRBNode.RED);\n }\n }\n return root;\n };\n\n const base12 = new Base12Num(childList.length);\n const root = buildFrom12Array(base12);\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new SortedMap(mapSortFn || (cmp as any), root);\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, contains, map, safeGet } from '@firebase/util';\n\nimport { SortedMap } from '../util/SortedMap';\n\nimport { buildChildSet } from './childSet';\nimport { Index } from './indexes/Index';\nimport { KEY_INDEX } from './indexes/KeyIndex';\nimport { PRIORITY_INDEX } from './indexes/PriorityIndex';\nimport { NamedNode, Node } from './Node';\n\nlet _defaultIndexMap: IndexMap;\n\nconst fallbackObject = {};\n\nexport class IndexMap {\n /**\n * The default IndexMap for nodes without a priority\n */\n static get Default(): IndexMap {\n assert(\n fallbackObject && PRIORITY_INDEX,\n 'ChildrenNode.ts has not been loaded'\n );\n _defaultIndexMap =\n _defaultIndexMap ||\n new IndexMap(\n { '.priority': fallbackObject },\n { '.priority': PRIORITY_INDEX }\n );\n return _defaultIndexMap;\n }\n\n constructor(\n private indexes_: {\n [k: string]: SortedMap | /*FallbackType*/ object;\n },\n private indexSet_: { [k: string]: Index }\n ) {}\n\n get(indexKey: string): SortedMap | null {\n const sortedMap = safeGet(this.indexes_, indexKey);\n if (!sortedMap) {\n throw new Error('No index defined for ' + indexKey);\n }\n\n if (sortedMap instanceof SortedMap) {\n return sortedMap;\n } else {\n // The index exists, but it falls back to just name comparison. Return null so that the calling code uses the\n // regular child map\n return null;\n }\n }\n\n hasIndex(indexDefinition: Index): boolean {\n return contains(this.indexSet_, indexDefinition.toString());\n }\n\n addIndex(\n indexDefinition: Index,\n existingChildren: SortedMap\n ): IndexMap {\n assert(\n indexDefinition !== KEY_INDEX,\n \"KeyIndex always exists and isn't meant to be added to the IndexMap.\"\n );\n const childList = [];\n let sawIndexedValue = false;\n const iter = existingChildren.getIterator(NamedNode.Wrap);\n let next = iter.getNext();\n while (next) {\n sawIndexedValue =\n sawIndexedValue || indexDefinition.isDefinedOn(next.node);\n childList.push(next);\n next = iter.getNext();\n }\n let newIndex;\n if (sawIndexedValue) {\n newIndex = buildChildSet(childList, indexDefinition.getCompare());\n } else {\n newIndex = fallbackObject;\n }\n const indexName = indexDefinition.toString();\n const newIndexSet = { ...this.indexSet_ };\n newIndexSet[indexName] = indexDefinition;\n const newIndexes = { ...this.indexes_ };\n newIndexes[indexName] = newIndex;\n return new IndexMap(newIndexes, newIndexSet);\n }\n\n /**\n * Ensure that this node is properly tracked in any indexes that we're maintaining\n */\n addToIndexes(\n namedNode: NamedNode,\n existingChildren: SortedMap\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap, indexName: string) => {\n const index = safeGet(this.indexSet_, indexName);\n assert(index, 'Missing index implementation for ' + indexName);\n if (indexedChildren === fallbackObject) {\n // Check to see if we need to index everything\n if (index.isDefinedOn(namedNode.node)) {\n // We need to build this index\n const childList = [];\n const iter = existingChildren.getIterator(NamedNode.Wrap);\n let next = iter.getNext();\n while (next) {\n if (next.name !== namedNode.name) {\n childList.push(next);\n }\n next = iter.getNext();\n }\n childList.push(namedNode);\n return buildChildSet(childList, index.getCompare());\n } else {\n // No change, this remains a fallback\n return fallbackObject;\n }\n } else {\n const existingSnap = existingChildren.get(namedNode.name);\n let newChildren = indexedChildren;\n if (existingSnap) {\n newChildren = newChildren.remove(\n new NamedNode(namedNode.name, existingSnap)\n );\n }\n return newChildren.insert(namedNode, namedNode.node);\n }\n }\n );\n return new IndexMap(newIndexes, this.indexSet_);\n }\n\n /**\n * Create a new IndexMap instance with the given value removed\n */\n removeFromIndexes(\n namedNode: NamedNode,\n existingChildren: SortedMap\n ): IndexMap {\n const newIndexes = map(\n this.indexes_,\n (indexedChildren: SortedMap) => {\n if (indexedChildren === fallbackObject) {\n // This is the fallback. Just return it, nothing to do in this case\n return indexedChildren;\n } else {\n const existingSnap = existingChildren.get(namedNode.name);\n if (existingSnap) {\n return indexedChildren.remove(\n new NamedNode(namedNode.name, existingSnap)\n );\n } else {\n // No record of this child\n return indexedChildren;\n }\n }\n }\n );\n return new IndexMap(newIndexes, this.indexSet_);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { Path, pathGetFront, pathGetLength, pathPopFront } from '../util/Path';\nimport { SortedMap, SortedMapIterator } from '../util/SortedMap';\nimport { MAX_NAME, MIN_NAME, sha1 } from '../util/util';\n\nimport { NAME_COMPARATOR } from './comparators';\nimport { Index } from './indexes/Index';\nimport { KEY_INDEX, KeyIndex } from './indexes/KeyIndex';\nimport {\n PRIORITY_INDEX,\n setMaxNode as setPriorityMaxNode\n} from './indexes/PriorityIndex';\nimport { IndexMap } from './IndexMap';\nimport { LeafNode } from './LeafNode';\nimport { NamedNode, Node } from './Node';\nimport { priorityHashText, setMaxNode, validatePriorityNode } from './snap';\n\nexport interface ChildrenNodeConstructor {\n new (\n children_: SortedMap,\n priorityNode_: Node | null,\n indexMap_: IndexMap\n ): ChildrenNode;\n EMPTY_NODE: ChildrenNode;\n}\n\n// TODO: For memory savings, don't store priorityNode_ if it's empty.\n\nlet EMPTY_NODE: ChildrenNode;\n\n/**\n * ChildrenNode is a class for storing internal nodes in a DataSnapshot\n * (i.e. nodes with children). It implements Node and stores the\n * list of children in the children property, sorted by child name.\n */\nexport class ChildrenNode implements Node {\n private lazyHash_: string | null = null;\n\n static get EMPTY_NODE(): ChildrenNode {\n return (\n EMPTY_NODE ||\n (EMPTY_NODE = new ChildrenNode(\n new SortedMap(NAME_COMPARATOR),\n null,\n IndexMap.Default\n ))\n );\n }\n\n /**\n * @param children_ - List of children of this node..\n * @param priorityNode_ - The priority of this node (as a snapshot node).\n */\n constructor(\n private readonly children_: SortedMap,\n private readonly priorityNode_: Node | null,\n private indexMap_: IndexMap\n ) {\n /**\n * Note: The only reason we allow null priority is for EMPTY_NODE, since we can't use\n * EMPTY_NODE as the priority of EMPTY_NODE. We might want to consider making EMPTY_NODE its own\n * class instead of an empty ChildrenNode.\n */\n if (this.priorityNode_) {\n validatePriorityNode(this.priorityNode_);\n }\n\n if (this.children_.isEmpty()) {\n assert(\n !this.priorityNode_ || this.priorityNode_.isEmpty(),\n 'An empty node cannot have a priority'\n );\n }\n }\n\n /** @inheritDoc */\n isLeafNode(): boolean {\n return false;\n }\n\n /** @inheritDoc */\n getPriority(): Node {\n return this.priorityNode_ || EMPTY_NODE;\n }\n\n /** @inheritDoc */\n updatePriority(newPriorityNode: Node): Node {\n if (this.children_.isEmpty()) {\n // Don't allow priorities on empty nodes\n return this;\n } else {\n return new ChildrenNode(this.children_, newPriorityNode, this.indexMap_);\n }\n }\n\n /** @inheritDoc */\n getImmediateChild(childName: string): Node {\n // Hack to treat priority as a regular child\n if (childName === '.priority') {\n return this.getPriority();\n } else {\n const child = this.children_.get(childName);\n return child === null ? EMPTY_NODE : child;\n }\n }\n\n /** @inheritDoc */\n getChild(path: Path): Node {\n const front = pathGetFront(path);\n if (front === null) {\n return this;\n }\n\n return this.getImmediateChild(front).getChild(pathPopFront(path));\n }\n\n /** @inheritDoc */\n hasChild(childName: string): boolean {\n return this.children_.get(childName) !== null;\n }\n\n /** @inheritDoc */\n updateImmediateChild(childName: string, newChildNode: Node): Node {\n assert(newChildNode, 'We should always be passing snapshot nodes');\n if (childName === '.priority') {\n return this.updatePriority(newChildNode);\n } else {\n const namedNode = new NamedNode(childName, newChildNode);\n let newChildren, newIndexMap;\n if (newChildNode.isEmpty()) {\n newChildren = this.children_.remove(childName);\n newIndexMap = this.indexMap_.removeFromIndexes(\n namedNode,\n this.children_\n );\n } else {\n newChildren = this.children_.insert(childName, newChildNode);\n newIndexMap = this.indexMap_.addToIndexes(namedNode, this.children_);\n }\n\n const newPriority = newChildren.isEmpty()\n ? EMPTY_NODE\n : this.priorityNode_;\n return new ChildrenNode(newChildren, newPriority, newIndexMap);\n }\n }\n\n /** @inheritDoc */\n updateChild(path: Path, newChildNode: Node): Node {\n const front = pathGetFront(path);\n if (front === null) {\n return newChildNode;\n } else {\n assert(\n pathGetFront(path) !== '.priority' || pathGetLength(path) === 1,\n '.priority must be the last token in a path'\n );\n const newImmediateChild = this.getImmediateChild(front).updateChild(\n pathPopFront(path),\n newChildNode\n );\n return this.updateImmediateChild(front, newImmediateChild);\n }\n }\n\n /** @inheritDoc */\n isEmpty(): boolean {\n return this.children_.isEmpty();\n }\n\n /** @inheritDoc */\n numChildren(): number {\n return this.children_.count();\n }\n\n private static INTEGER_REGEXP_ = /^(0|[1-9]\\d*)$/;\n\n /** @inheritDoc */\n val(exportFormat?: boolean): object {\n if (this.isEmpty()) {\n return null;\n }\n\n const obj: { [k: string]: unknown } = {};\n let numKeys = 0,\n maxKey = 0,\n allIntegerKeys = true;\n this.forEachChild(PRIORITY_INDEX, (key: string, childNode: Node) => {\n obj[key] = childNode.val(exportFormat);\n\n numKeys++;\n if (allIntegerKeys && ChildrenNode.INTEGER_REGEXP_.test(key)) {\n maxKey = Math.max(maxKey, Number(key));\n } else {\n allIntegerKeys = false;\n }\n });\n\n if (!exportFormat && allIntegerKeys && maxKey < 2 * numKeys) {\n // convert to array.\n const array: unknown[] = [];\n // eslint-disable-next-line guard-for-in\n for (const key in obj) {\n array[key as unknown as number] = obj[key];\n }\n\n return array;\n } else {\n if (exportFormat && !this.getPriority().isEmpty()) {\n obj['.priority'] = this.getPriority().val();\n }\n return obj;\n }\n }\n\n /** @inheritDoc */\n hash(): string {\n if (this.lazyHash_ === null) {\n let toHash = '';\n if (!this.getPriority().isEmpty()) {\n toHash +=\n 'priority:' +\n priorityHashText(this.getPriority().val() as string | number) +\n ':';\n }\n\n this.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n const childHash = childNode.hash();\n if (childHash !== '') {\n toHash += ':' + key + ':' + childHash;\n }\n });\n\n this.lazyHash_ = toHash === '' ? '' : sha1(toHash);\n }\n return this.lazyHash_;\n }\n\n /** @inheritDoc */\n getPredecessorChildName(\n childName: string,\n childNode: Node,\n index: Index\n ): string {\n const idx = this.resolveIndex_(index);\n if (idx) {\n const predecessor = idx.getPredecessorKey(\n new NamedNode(childName, childNode)\n );\n return predecessor ? predecessor.name : null;\n } else {\n return this.children_.getPredecessorKey(childName);\n }\n }\n\n getFirstChildName(indexDefinition: Index): string | null {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n const minKey = idx.minKey();\n return minKey && minKey.name;\n } else {\n return this.children_.minKey();\n }\n }\n\n getFirstChild(indexDefinition: Index): NamedNode | null {\n const minKey = this.getFirstChildName(indexDefinition);\n if (minKey) {\n return new NamedNode(minKey, this.children_.get(minKey));\n } else {\n return null;\n }\n }\n\n /**\n * Given an index, return the key name of the largest value we have, according to that index\n */\n getLastChildName(indexDefinition: Index): string | null {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n const maxKey = idx.maxKey();\n return maxKey && maxKey.name;\n } else {\n return this.children_.maxKey();\n }\n }\n\n getLastChild(indexDefinition: Index): NamedNode | null {\n const maxKey = this.getLastChildName(indexDefinition);\n if (maxKey) {\n return new NamedNode(maxKey, this.children_.get(maxKey));\n } else {\n return null;\n }\n }\n forEachChild(\n index: Index,\n action: (key: string, node: Node) => boolean | void\n ): boolean {\n const idx = this.resolveIndex_(index);\n if (idx) {\n return idx.inorderTraversal(wrappedNode => {\n return action(wrappedNode.name, wrappedNode.node);\n });\n } else {\n return this.children_.inorderTraversal(action);\n }\n }\n\n getIterator(\n indexDefinition: Index\n ): SortedMapIterator {\n return this.getIteratorFrom(indexDefinition.minPost(), indexDefinition);\n }\n\n getIteratorFrom(\n startPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n return idx.getIteratorFrom(startPost, key => key);\n } else {\n const iterator = this.children_.getIteratorFrom(\n startPost.name,\n NamedNode.Wrap\n );\n let next = iterator.peek();\n while (next != null && indexDefinition.compare(next, startPost) < 0) {\n iterator.getNext();\n next = iterator.peek();\n }\n return iterator;\n }\n }\n\n getReverseIterator(\n indexDefinition: Index\n ): SortedMapIterator {\n return this.getReverseIteratorFrom(\n indexDefinition.maxPost(),\n indexDefinition\n );\n }\n\n getReverseIteratorFrom(\n endPost: NamedNode,\n indexDefinition: Index\n ): SortedMapIterator {\n const idx = this.resolveIndex_(indexDefinition);\n if (idx) {\n return idx.getReverseIteratorFrom(endPost, key => {\n return key;\n });\n } else {\n const iterator = this.children_.getReverseIteratorFrom(\n endPost.name,\n NamedNode.Wrap\n );\n let next = iterator.peek();\n while (next != null && indexDefinition.compare(next, endPost) > 0) {\n iterator.getNext();\n next = iterator.peek();\n }\n return iterator;\n }\n }\n compareTo(other: ChildrenNode): number {\n if (this.isEmpty()) {\n if (other.isEmpty()) {\n return 0;\n } else {\n return -1;\n }\n } else if (other.isLeafNode() || other.isEmpty()) {\n return 1;\n } else if (other === MAX_NODE) {\n return -1;\n } else {\n // Must be another node with children.\n return 0;\n }\n }\n withIndex(indexDefinition: Index): Node {\n if (\n indexDefinition === KEY_INDEX ||\n this.indexMap_.hasIndex(indexDefinition)\n ) {\n return this;\n } else {\n const newIndexMap = this.indexMap_.addIndex(\n indexDefinition,\n this.children_\n );\n return new ChildrenNode(this.children_, this.priorityNode_, newIndexMap);\n }\n }\n isIndexed(index: Index): boolean {\n return index === KEY_INDEX || this.indexMap_.hasIndex(index);\n }\n equals(other: Node): boolean {\n if (other === this) {\n return true;\n } else if (other.isLeafNode()) {\n return false;\n } else {\n const otherChildrenNode = other as ChildrenNode;\n if (!this.getPriority().equals(otherChildrenNode.getPriority())) {\n return false;\n } else if (\n this.children_.count() === otherChildrenNode.children_.count()\n ) {\n const thisIter = this.getIterator(PRIORITY_INDEX);\n const otherIter = otherChildrenNode.getIterator(PRIORITY_INDEX);\n let thisCurrent = thisIter.getNext();\n let otherCurrent = otherIter.getNext();\n while (thisCurrent && otherCurrent) {\n if (\n thisCurrent.name !== otherCurrent.name ||\n !thisCurrent.node.equals(otherCurrent.node)\n ) {\n return false;\n }\n thisCurrent = thisIter.getNext();\n otherCurrent = otherIter.getNext();\n }\n return thisCurrent === null && otherCurrent === null;\n } else {\n return false;\n }\n }\n }\n\n /**\n * Returns a SortedMap ordered by index, or null if the default (by-key) ordering can be used\n * instead.\n *\n */\n private resolveIndex_(\n indexDefinition: Index\n ): SortedMap | null {\n if (indexDefinition === KEY_INDEX) {\n return null;\n } else {\n return this.indexMap_.get(indexDefinition.toString());\n }\n }\n}\n\nexport class MaxNode extends ChildrenNode {\n constructor() {\n super(\n new SortedMap(NAME_COMPARATOR),\n ChildrenNode.EMPTY_NODE,\n IndexMap.Default\n );\n }\n\n compareTo(other: Node): number {\n if (other === this) {\n return 0;\n } else {\n return 1;\n }\n }\n\n equals(other: Node): boolean {\n // Not that we every compare it, but MAX_NODE is only ever equal to itself\n return other === this;\n }\n\n getPriority(): MaxNode {\n return this;\n }\n\n getImmediateChild(childName: string): ChildrenNode {\n return ChildrenNode.EMPTY_NODE;\n }\n\n isEmpty(): boolean {\n return false;\n }\n}\n\n/**\n * Marker that will sort higher than any other snapshot.\n */\nexport const MAX_NODE = new MaxNode();\n\n/**\n * Document NamedNode extensions\n */\ndeclare module './Node' {\n interface NamedNode {\n MIN: NamedNode;\n MAX: NamedNode;\n }\n}\n\nObject.defineProperties(NamedNode, {\n MIN: {\n value: new NamedNode(MIN_NAME, ChildrenNode.EMPTY_NODE)\n },\n MAX: {\n value: new NamedNode(MAX_NAME, MAX_NODE)\n }\n});\n\n/**\n * Reference Extensions\n */\nKeyIndex.__EMPTY_NODE = ChildrenNode.EMPTY_NODE;\nLeafNode.__childrenNodeConstructor = ChildrenNode;\nsetMaxNode(MAX_NODE);\nsetPriorityMaxNode(MAX_NODE);\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { contains, assert } from '@firebase/util';\n\nimport { Indexable } from '../util/misc';\nimport { SortedMap } from '../util/SortedMap';\nimport { each } from '../util/util';\n\nimport { ChildrenNode } from './ChildrenNode';\nimport { buildChildSet } from './childSet';\nimport { NAME_COMPARATOR, NAME_ONLY_COMPARATOR } from './comparators';\nimport { PRIORITY_INDEX, setNodeFromJSON } from './indexes/PriorityIndex';\nimport { IndexMap } from './IndexMap';\nimport { LeafNode } from './LeafNode';\nimport { NamedNode, Node } from './Node';\n\nconst USE_HINZE = true;\n\n/**\n * Constructs a snapshot node representing the passed JSON and returns it.\n * @param json - JSON to create a node for.\n * @param priority - Optional priority to use. This will be ignored if the\n * passed JSON contains a .priority property.\n */\nexport function nodeFromJSON(\n json: unknown | null,\n priority: unknown = null\n): Node {\n if (json === null) {\n return ChildrenNode.EMPTY_NODE;\n }\n\n if (typeof json === 'object' && '.priority' in json) {\n priority = json['.priority'];\n }\n\n assert(\n priority === null ||\n typeof priority === 'string' ||\n typeof priority === 'number' ||\n (typeof priority === 'object' && '.sv' in (priority as object)),\n 'Invalid priority type found: ' + typeof priority\n );\n\n if (typeof json === 'object' && '.value' in json && json['.value'] !== null) {\n json = json['.value'];\n }\n\n // Valid leaf nodes include non-objects or server-value wrapper objects\n if (typeof json !== 'object' || '.sv' in json) {\n const jsonLeaf = json as string | number | boolean | Indexable;\n return new LeafNode(jsonLeaf, nodeFromJSON(priority));\n }\n\n if (!(json instanceof Array) && USE_HINZE) {\n const children: NamedNode[] = [];\n let childrenHavePriority = false;\n const hinzeJsonObj = json;\n each(hinzeJsonObj, (key, child) => {\n if (key.substring(0, 1) !== '.') {\n // Ignore metadata nodes\n const childNode = nodeFromJSON(child);\n if (!childNode.isEmpty()) {\n childrenHavePriority =\n childrenHavePriority || !childNode.getPriority().isEmpty();\n children.push(new NamedNode(key, childNode));\n }\n }\n });\n\n if (children.length === 0) {\n return ChildrenNode.EMPTY_NODE;\n }\n\n const childSet = buildChildSet(\n children,\n NAME_ONLY_COMPARATOR,\n namedNode => namedNode.name,\n NAME_COMPARATOR\n ) as SortedMap;\n if (childrenHavePriority) {\n const sortedChildSet = buildChildSet(\n children,\n PRIORITY_INDEX.getCompare()\n );\n return new ChildrenNode(\n childSet,\n nodeFromJSON(priority),\n new IndexMap(\n { '.priority': sortedChildSet },\n { '.priority': PRIORITY_INDEX }\n )\n );\n } else {\n return new ChildrenNode(\n childSet,\n nodeFromJSON(priority),\n IndexMap.Default\n );\n }\n } else {\n let node: Node = ChildrenNode.EMPTY_NODE;\n each(json, (key: string, childData: unknown) => {\n if (contains(json as object, key)) {\n if (key.substring(0, 1) !== '.') {\n // ignore metadata nodes.\n const childNode = nodeFromJSON(childData);\n if (childNode.isLeafNode() || !childNode.isEmpty()) {\n node = node.updateImmediateChild(key, childNode);\n }\n }\n }\n });\n\n return node.updatePriority(nodeFromJSON(priority));\n }\n}\n\nsetNodeFromJSON(nodeFromJSON);\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { Path, pathGetFront, pathIsEmpty, pathSlice } from '../../util/Path';\nimport { MAX_NAME, nameCompare } from '../../util/util';\nimport { ChildrenNode, MAX_NODE } from '../ChildrenNode';\nimport { NamedNode, Node } from '../Node';\nimport { nodeFromJSON } from '../nodeFromJSON';\n\nimport { Index } from './Index';\n\nexport class PathIndex extends Index {\n constructor(private indexPath_: Path) {\n super();\n\n assert(\n !pathIsEmpty(indexPath_) && pathGetFront(indexPath_) !== '.priority',\n \"Can't create PathIndex with empty path or .priority key\"\n );\n }\n\n protected extractChild(snap: Node): Node {\n return snap.getChild(this.indexPath_);\n }\n isDefinedOn(node: Node): boolean {\n return !node.getChild(this.indexPath_).isEmpty();\n }\n compare(a: NamedNode, b: NamedNode): number {\n const aChild = this.extractChild(a.node);\n const bChild = this.extractChild(b.node);\n const indexCmp = aChild.compareTo(bChild);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n makePost(indexValue: object, name: string): NamedNode {\n const valueNode = nodeFromJSON(indexValue);\n const node = ChildrenNode.EMPTY_NODE.updateChild(\n this.indexPath_,\n valueNode\n );\n return new NamedNode(name, node);\n }\n maxPost(): NamedNode {\n const node = ChildrenNode.EMPTY_NODE.updateChild(this.indexPath_, MAX_NODE);\n return new NamedNode(MAX_NAME, node);\n }\n toString(): string {\n return pathSlice(this.indexPath_, 0).join('/');\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { nameCompare } from '../../util/util';\nimport { NamedNode, Node } from '../Node';\nimport { nodeFromJSON } from '../nodeFromJSON';\n\nimport { Index } from './Index';\n\nexport class ValueIndex extends Index {\n compare(a: NamedNode, b: NamedNode): number {\n const indexCmp = a.node.compareTo(b.node);\n if (indexCmp === 0) {\n return nameCompare(a.name, b.name);\n } else {\n return indexCmp;\n }\n }\n isDefinedOn(node: Node): boolean {\n return true;\n }\n indexedValueChanged(oldNode: Node, newNode: Node): boolean {\n return !oldNode.equals(newNode);\n }\n minPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MIN;\n }\n maxPost(): NamedNode {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (NamedNode as any).MAX;\n }\n\n makePost(indexValue: object, name: string): NamedNode {\n const valueNode = nodeFromJSON(indexValue);\n return new NamedNode(name, valueNode);\n }\n\n /**\n * @returns String representation for inclusion in a query spec\n */\n toString(): string {\n return '.value';\n }\n}\n\nexport const VALUE_INDEX = new ValueIndex();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\n\nexport const enum ChangeType {\n /** Event type for a child added */\n CHILD_ADDED = 'child_added',\n /** Event type for a child removed */\n CHILD_REMOVED = 'child_removed',\n /** Event type for a child changed */\n CHILD_CHANGED = 'child_changed',\n /** Event type for a child moved */\n CHILD_MOVED = 'child_moved',\n /** Event type for a value change */\n VALUE = 'value'\n}\n\nexport interface Change {\n /** @param type - The event type */\n type: ChangeType;\n /** @param snapshotNode - The data */\n snapshotNode: Node;\n /** @param childName - The name for this child, if it's a child even */\n childName?: string;\n /** @param oldSnap - Used for intermediate processing of child changed events */\n oldSnap?: Node;\n /** * @param prevName - The name for the previous child, if applicable */\n prevName?: string | null;\n}\n\nexport function changeValue(snapshotNode: Node): Change {\n return { type: ChangeType.VALUE, snapshotNode };\n}\n\nexport function changeChildAdded(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_ADDED, snapshotNode, childName };\n}\n\nexport function changeChildRemoved(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_REMOVED, snapshotNode, childName };\n}\n\nexport function changeChildChanged(\n childName: string,\n snapshotNode: Node,\n oldSnap: Node\n): Change {\n return {\n type: ChangeType.CHILD_CHANGED,\n snapshotNode,\n childName,\n oldSnap\n };\n}\n\nexport function changeChildMoved(\n childName: string,\n snapshotNode: Node\n): Change {\n return { type: ChangeType.CHILD_MOVED, snapshotNode, childName };\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { Node } from '../../snap/Node';\nimport { Path } from '../../util/Path';\nimport {\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from '../Change';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\n\nimport { NodeFilter } from './NodeFilter';\n\n/**\n * Doesn't really filter nodes but applies an index to the node and keeps track of any changes\n */\nexport class IndexedFilter implements NodeFilter {\n constructor(private readonly index_: Index) {}\n\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n assert(\n snap.isIndexed(this.index_),\n 'A node must be indexed if only a child is updated'\n );\n const oldChild = snap.getImmediateChild(key);\n // Check if anything actually changed.\n if (\n oldChild.getChild(affectedPath).equals(newChild.getChild(affectedPath))\n ) {\n // There's an edge case where a child can enter or leave the view because affectedPath was set to null.\n // In this case, affectedPath will appear null in both the old and new snapshots. So we need\n // to avoid treating these cases as \"nothing changed.\"\n if (oldChild.isEmpty() === newChild.isEmpty()) {\n // Nothing changed.\n\n // This assert should be valid, but it's expensive (can dominate perf testing) so don't actually do it.\n //assert(oldChild.equals(newChild), 'Old and new snapshots should be equal.');\n return snap;\n }\n }\n\n if (optChangeAccumulator != null) {\n if (newChild.isEmpty()) {\n if (snap.hasChild(key)) {\n optChangeAccumulator.trackChildChange(\n changeChildRemoved(key, oldChild)\n );\n } else {\n assert(\n snap.isLeafNode(),\n 'A child remove without an old child only makes sense on a leaf node'\n );\n }\n } else if (oldChild.isEmpty()) {\n optChangeAccumulator.trackChildChange(changeChildAdded(key, newChild));\n } else {\n optChangeAccumulator.trackChildChange(\n changeChildChanged(key, newChild, oldChild)\n );\n }\n }\n if (snap.isLeafNode() && newChild.isEmpty()) {\n return snap;\n } else {\n // Make sure the node is indexed\n return snap.updateImmediateChild(key, newChild).withIndex(this.index_);\n }\n }\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (optChangeAccumulator != null) {\n if (!oldSnap.isLeafNode()) {\n oldSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (!newSnap.hasChild(key)) {\n optChangeAccumulator.trackChildChange(\n changeChildRemoved(key, childNode)\n );\n }\n });\n }\n if (!newSnap.isLeafNode()) {\n newSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (oldSnap.hasChild(key)) {\n const oldChild = oldSnap.getImmediateChild(key);\n if (!oldChild.equals(childNode)) {\n optChangeAccumulator.trackChildChange(\n changeChildChanged(key, childNode, oldChild)\n );\n }\n } else {\n optChangeAccumulator.trackChildChange(\n changeChildAdded(key, childNode)\n );\n }\n });\n }\n }\n return newSnap.withIndex(this.index_);\n }\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n if (oldSnap.isEmpty()) {\n return ChildrenNode.EMPTY_NODE;\n } else {\n return oldSnap.updatePriority(newPriority);\n }\n }\n filtersNodes(): boolean {\n return false;\n }\n getIndexedFilter(): IndexedFilter {\n return this;\n }\n getIndex(): Index {\n return this.index_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { NamedNode, Node } from '../../../core/snap/Node';\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { PRIORITY_INDEX } from '../../snap/indexes/PriorityIndex';\nimport { Path } from '../../util/Path';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { QueryParams } from '../QueryParams';\n\nimport { IndexedFilter } from './IndexedFilter';\nimport { NodeFilter } from './NodeFilter';\n\n/**\n * Filters nodes by range and uses an IndexFilter to track any changes after filtering the node\n */\nexport class RangedFilter implements NodeFilter {\n private indexedFilter_: IndexedFilter;\n\n private index_: Index;\n\n private startPost_: NamedNode;\n\n private endPost_: NamedNode;\n\n private startIsInclusive_: boolean;\n\n private endIsInclusive_: boolean;\n\n constructor(params: QueryParams) {\n this.indexedFilter_ = new IndexedFilter(params.getIndex());\n this.index_ = params.getIndex();\n this.startPost_ = RangedFilter.getStartPost_(params);\n this.endPost_ = RangedFilter.getEndPost_(params);\n this.startIsInclusive_ = !params.startAfterSet_;\n this.endIsInclusive_ = !params.endBeforeSet_;\n }\n\n getStartPost(): NamedNode {\n return this.startPost_;\n }\n\n getEndPost(): NamedNode {\n return this.endPost_;\n }\n\n matches(node: NamedNode): boolean {\n const isWithinStart = this.startIsInclusive_\n ? this.index_.compare(this.getStartPost(), node) <= 0\n : this.index_.compare(this.getStartPost(), node) < 0;\n const isWithinEnd = this.endIsInclusive_\n ? this.index_.compare(node, this.getEndPost()) <= 0\n : this.index_.compare(node, this.getEndPost()) < 0;\n return isWithinStart && isWithinEnd;\n }\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (!this.matches(new NamedNode(key, newChild))) {\n newChild = ChildrenNode.EMPTY_NODE;\n }\n return this.indexedFilter_.updateChild(\n snap,\n key,\n newChild,\n affectedPath,\n source,\n optChangeAccumulator\n );\n }\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (newSnap.isLeafNode()) {\n // Make sure we have a children node with the correct index, not a leaf node;\n newSnap = ChildrenNode.EMPTY_NODE;\n }\n let filtered = newSnap.withIndex(this.index_);\n // Don't support priorities on queries\n filtered = filtered.updatePriority(ChildrenNode.EMPTY_NODE);\n const self = this;\n newSnap.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n if (!self.matches(new NamedNode(key, childNode))) {\n filtered = filtered.updateImmediateChild(key, ChildrenNode.EMPTY_NODE);\n }\n });\n return this.indexedFilter_.updateFullNode(\n oldSnap,\n filtered,\n optChangeAccumulator\n );\n }\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n filtersNodes(): boolean {\n return true;\n }\n getIndexedFilter(): IndexedFilter {\n return this.indexedFilter_;\n }\n getIndex(): Index {\n return this.index_;\n }\n\n private static getStartPost_(params: QueryParams): NamedNode {\n if (params.hasStart()) {\n const startName = params.getIndexStartName();\n return params.getIndex().makePost(params.getIndexStartValue(), startName);\n } else {\n return params.getIndex().minPost();\n }\n }\n\n private static getEndPost_(params: QueryParams): NamedNode {\n if (params.hasEnd()) {\n const endName = params.getIndexEndName();\n return params.getIndex().makePost(params.getIndexEndValue(), endName);\n } else {\n return params.getIndex().maxPost();\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ChildrenNode } from '../../snap/ChildrenNode';\nimport { Index } from '../../snap/indexes/Index';\nimport { NamedNode, Node } from '../../snap/Node';\nimport { Path } from '../../util/Path';\nimport {\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from '../Change';\nimport { ChildChangeAccumulator } from '../ChildChangeAccumulator';\nimport { CompleteChildSource } from '../CompleteChildSource';\nimport { QueryParams } from '../QueryParams';\n\nimport { IndexedFilter } from './IndexedFilter';\nimport { NodeFilter } from './NodeFilter';\nimport { RangedFilter } from './RangedFilter';\n\n/**\n * Applies a limit and a range to a node and uses RangedFilter to do the heavy lifting where possible\n */\nexport class LimitedFilter implements NodeFilter {\n private readonly rangedFilter_: RangedFilter;\n\n private readonly index_: Index;\n\n private readonly limit_: number;\n\n private readonly reverse_: boolean;\n\n private readonly startIsInclusive_: boolean;\n\n private readonly endIsInclusive_: boolean;\n\n constructor(params: QueryParams) {\n this.rangedFilter_ = new RangedFilter(params);\n this.index_ = params.getIndex();\n this.limit_ = params.getLimit();\n this.reverse_ = !params.isViewFromLeft();\n this.startIsInclusive_ = !params.startAfterSet_;\n this.endIsInclusive_ = !params.endBeforeSet_;\n }\n updateChild(\n snap: Node,\n key: string,\n newChild: Node,\n affectedPath: Path,\n source: CompleteChildSource,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n if (!this.rangedFilter_.matches(new NamedNode(key, newChild))) {\n newChild = ChildrenNode.EMPTY_NODE;\n }\n if (snap.getImmediateChild(key).equals(newChild)) {\n // No change\n return snap;\n } else if (snap.numChildren() < this.limit_) {\n return this.rangedFilter_\n .getIndexedFilter()\n .updateChild(\n snap,\n key,\n newChild,\n affectedPath,\n source,\n optChangeAccumulator\n );\n } else {\n return this.fullLimitUpdateChild_(\n snap,\n key,\n newChild,\n source,\n optChangeAccumulator\n );\n }\n }\n updateFullNode(\n oldSnap: Node,\n newSnap: Node,\n optChangeAccumulator: ChildChangeAccumulator | null\n ): Node {\n let filtered;\n if (newSnap.isLeafNode() || newSnap.isEmpty()) {\n // Make sure we have a children node with the correct index, not a leaf node;\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\n } else {\n if (\n this.limit_ * 2 < newSnap.numChildren() &&\n newSnap.isIndexed(this.index_)\n ) {\n // Easier to build up a snapshot, since what we're given has more than twice the elements we want\n filtered = ChildrenNode.EMPTY_NODE.withIndex(this.index_);\n // anchor to the startPost, endPost, or last element as appropriate\n let iterator;\n if (this.reverse_) {\n iterator = (newSnap as ChildrenNode).getReverseIteratorFrom(\n this.rangedFilter_.getEndPost(),\n this.index_\n );\n } else {\n iterator = (newSnap as ChildrenNode).getIteratorFrom(\n this.rangedFilter_.getStartPost(),\n this.index_\n );\n }\n let count = 0;\n while (iterator.hasNext() && count < this.limit_) {\n const next = iterator.getNext();\n if (!this.withinDirectionalStart(next)) {\n // if we have not reached the start, skip to the next element\n continue;\n } else if (!this.withinDirectionalEnd(next)) {\n // if we have reached the end, stop adding elements\n break;\n } else {\n filtered = filtered.updateImmediateChild(next.name, next.node);\n count++;\n }\n }\n } else {\n // The snap contains less than twice the limit. Faster to delete from the snap than build up a new one\n filtered = newSnap.withIndex(this.index_);\n // Don't support priorities on queries\n filtered = filtered.updatePriority(\n ChildrenNode.EMPTY_NODE\n ) as ChildrenNode;\n\n let iterator;\n if (this.reverse_) {\n iterator = filtered.getReverseIterator(this.index_);\n } else {\n iterator = filtered.getIterator(this.index_);\n }\n\n let count = 0;\n while (iterator.hasNext()) {\n const next = iterator.getNext();\n const inRange =\n count < this.limit_ &&\n this.withinDirectionalStart(next) &&\n this.withinDirectionalEnd(next);\n if (inRange) {\n count++;\n } else {\n filtered = filtered.updateImmediateChild(\n next.name,\n ChildrenNode.EMPTY_NODE\n );\n }\n }\n }\n }\n return this.rangedFilter_\n .getIndexedFilter()\n .updateFullNode(oldSnap, filtered, optChangeAccumulator);\n }\n updatePriority(oldSnap: Node, newPriority: Node): Node {\n // Don't support priorities on queries\n return oldSnap;\n }\n filtersNodes(): boolean {\n return true;\n }\n getIndexedFilter(): IndexedFilter {\n return this.rangedFilter_.getIndexedFilter();\n }\n getIndex(): Index {\n return this.index_;\n }\n\n private fullLimitUpdateChild_(\n snap: Node,\n childKey: string,\n childSnap: Node,\n source: CompleteChildSource,\n changeAccumulator: ChildChangeAccumulator | null\n ): Node {\n // TODO: rename all cache stuff etc to general snap terminology\n let cmp;\n if (this.reverse_) {\n const indexCmp = this.index_.getCompare();\n cmp = (a: NamedNode, b: NamedNode) => indexCmp(b, a);\n } else {\n cmp = this.index_.getCompare();\n }\n const oldEventCache = snap as ChildrenNode;\n assert(oldEventCache.numChildren() === this.limit_, '');\n const newChildNamedNode = new NamedNode(childKey, childSnap);\n const windowBoundary = this.reverse_\n ? oldEventCache.getFirstChild(this.index_)\n : (oldEventCache.getLastChild(this.index_) as NamedNode);\n const inRange = this.rangedFilter_.matches(newChildNamedNode);\n if (oldEventCache.hasChild(childKey)) {\n const oldChildSnap = oldEventCache.getImmediateChild(childKey);\n let nextChild = source.getChildAfterChild(\n this.index_,\n windowBoundary,\n this.reverse_\n );\n while (\n nextChild != null &&\n (nextChild.name === childKey || oldEventCache.hasChild(nextChild.name))\n ) {\n // There is a weird edge case where a node is updated as part of a merge in the write tree, but hasn't\n // been applied to the limited filter yet. Ignore this next child which will be updated later in\n // the limited filter...\n nextChild = source.getChildAfterChild(\n this.index_,\n nextChild,\n this.reverse_\n );\n }\n const compareNext =\n nextChild == null ? 1 : cmp(nextChild, newChildNamedNode);\n const remainsInWindow =\n inRange && !childSnap.isEmpty() && compareNext >= 0;\n if (remainsInWindow) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n changeChildChanged(childKey, childSnap, oldChildSnap)\n );\n }\n return oldEventCache.updateImmediateChild(childKey, childSnap);\n } else {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n changeChildRemoved(childKey, oldChildSnap)\n );\n }\n const newEventCache = oldEventCache.updateImmediateChild(\n childKey,\n ChildrenNode.EMPTY_NODE\n );\n const nextChildInRange =\n nextChild != null && this.rangedFilter_.matches(nextChild);\n if (nextChildInRange) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n changeChildAdded(nextChild.name, nextChild.node)\n );\n }\n return newEventCache.updateImmediateChild(\n nextChild.name,\n nextChild.node\n );\n } else {\n return newEventCache;\n }\n }\n } else if (childSnap.isEmpty()) {\n // we're deleting a node, but it was not in the window, so ignore it\n return snap;\n } else if (inRange) {\n if (cmp(windowBoundary, newChildNamedNode) >= 0) {\n if (changeAccumulator != null) {\n changeAccumulator.trackChildChange(\n changeChildRemoved(windowBoundary.name, windowBoundary.node)\n );\n changeAccumulator.trackChildChange(\n changeChildAdded(childKey, childSnap)\n );\n }\n return oldEventCache\n .updateImmediateChild(childKey, childSnap)\n .updateImmediateChild(windowBoundary.name, ChildrenNode.EMPTY_NODE);\n } else {\n return snap;\n }\n } else {\n return snap;\n }\n }\n\n private withinDirectionalStart = (node: NamedNode) =>\n this.reverse_ ? this.withinEndPost(node) : this.withinStartPost(node);\n\n private withinDirectionalEnd = (node: NamedNode) =>\n this.reverse_ ? this.withinStartPost(node) : this.withinEndPost(node);\n\n private withinStartPost = (node: NamedNode) => {\n const compareRes = this.index_.compare(\n this.rangedFilter_.getStartPost(),\n node\n );\n return this.startIsInclusive_ ? compareRes <= 0 : compareRes < 0;\n };\n\n private withinEndPost = (node: NamedNode) => {\n const compareRes = this.index_.compare(\n node,\n this.rangedFilter_.getEndPost()\n );\n return this.endIsInclusive_ ? compareRes <= 0 : compareRes < 0;\n };\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, stringify } from '@firebase/util';\n\nimport { Index } from '../snap/indexes/Index';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { PathIndex } from '../snap/indexes/PathIndex';\nimport { PRIORITY_INDEX, PriorityIndex } from '../snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../snap/indexes/ValueIndex';\nimport { MAX_NAME, MIN_NAME } from '../util/util';\n\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { LimitedFilter } from './filter/LimitedFilter';\nimport { NodeFilter } from './filter/NodeFilter';\nimport { RangedFilter } from './filter/RangedFilter';\n\n/**\n * Wire Protocol Constants\n */\nconst enum WIRE_PROTOCOL_CONSTANTS {\n INDEX_START_VALUE = 'sp',\n INDEX_START_NAME = 'sn',\n INDEX_START_IS_INCLUSIVE = 'sin',\n INDEX_END_VALUE = 'ep',\n INDEX_END_NAME = 'en',\n INDEX_END_IS_INCLUSIVE = 'ein',\n LIMIT = 'l',\n VIEW_FROM = 'vf',\n VIEW_FROM_LEFT = 'l',\n VIEW_FROM_RIGHT = 'r',\n INDEX = 'i'\n}\n\n/**\n * REST Query Constants\n */\nconst enum REST_QUERY_CONSTANTS {\n ORDER_BY = 'orderBy',\n PRIORITY_INDEX = '$priority',\n VALUE_INDEX = '$value',\n KEY_INDEX = '$key',\n START_AFTER = 'startAfter',\n START_AT = 'startAt',\n END_AT = 'endAt',\n END_BEFORE = 'endBefore',\n LIMIT_TO_FIRST = 'limitToFirst',\n LIMIT_TO_LAST = 'limitToLast'\n}\n\n/**\n * This class is an immutable-from-the-public-api struct containing a set of query parameters defining a\n * range to be returned for a particular location. It is assumed that validation of parameters is done at the\n * user-facing API level, so it is not done here.\n *\n * @internal\n */\nexport class QueryParams {\n limitSet_ = false;\n startSet_ = false;\n startNameSet_ = false;\n startAfterSet_ = false; // can only be true if startSet_ is true\n endSet_ = false;\n endNameSet_ = false;\n endBeforeSet_ = false; // can only be true if endSet_ is true\n limit_ = 0;\n viewFrom_ = '';\n indexStartValue_: unknown | null = null;\n indexStartName_ = '';\n indexEndValue_: unknown | null = null;\n indexEndName_ = '';\n index_: PriorityIndex = PRIORITY_INDEX;\n\n hasStart(): boolean {\n return this.startSet_;\n }\n\n /**\n * @returns True if it would return from left.\n */\n isViewFromLeft(): boolean {\n if (this.viewFrom_ === '') {\n // limit(), rather than limitToFirst or limitToLast was called.\n // This means that only one of startSet_ and endSet_ is true. Use them\n // to calculate which side of the view to anchor to. If neither is set,\n // anchor to the end.\n return this.startSet_;\n } else {\n return this.viewFrom_ === WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n }\n }\n\n /**\n * Only valid to call if hasStart() returns true\n */\n getIndexStartValue(): unknown {\n assert(this.startSet_, 'Only valid if start has been set');\n return this.indexStartValue_;\n }\n\n /**\n * Only valid to call if hasStart() returns true.\n * Returns the starting key name for the range defined by these query parameters\n */\n getIndexStartName(): string {\n assert(this.startSet_, 'Only valid if start has been set');\n if (this.startNameSet_) {\n return this.indexStartName_;\n } else {\n return MIN_NAME;\n }\n }\n\n hasEnd(): boolean {\n return this.endSet_;\n }\n\n /**\n * Only valid to call if hasEnd() returns true.\n */\n getIndexEndValue(): unknown {\n assert(this.endSet_, 'Only valid if end has been set');\n return this.indexEndValue_;\n }\n\n /**\n * Only valid to call if hasEnd() returns true.\n * Returns the end key name for the range defined by these query parameters\n */\n getIndexEndName(): string {\n assert(this.endSet_, 'Only valid if end has been set');\n if (this.endNameSet_) {\n return this.indexEndName_;\n } else {\n return MAX_NAME;\n }\n }\n\n hasLimit(): boolean {\n return this.limitSet_;\n }\n\n /**\n * @returns True if a limit has been set and it has been explicitly anchored\n */\n hasAnchoredLimit(): boolean {\n return this.limitSet_ && this.viewFrom_ !== '';\n }\n\n /**\n * Only valid to call if hasLimit() returns true\n */\n getLimit(): number {\n assert(this.limitSet_, 'Only valid if limit has been set');\n return this.limit_;\n }\n\n getIndex(): Index {\n return this.index_;\n }\n\n loadsAllData(): boolean {\n return !(this.startSet_ || this.endSet_ || this.limitSet_);\n }\n\n isDefault(): boolean {\n return this.loadsAllData() && this.index_ === PRIORITY_INDEX;\n }\n\n copy(): QueryParams {\n const copy = new QueryParams();\n copy.limitSet_ = this.limitSet_;\n copy.limit_ = this.limit_;\n copy.startSet_ = this.startSet_;\n copy.startAfterSet_ = this.startAfterSet_;\n copy.indexStartValue_ = this.indexStartValue_;\n copy.startNameSet_ = this.startNameSet_;\n copy.indexStartName_ = this.indexStartName_;\n copy.endSet_ = this.endSet_;\n copy.endBeforeSet_ = this.endBeforeSet_;\n copy.indexEndValue_ = this.indexEndValue_;\n copy.endNameSet_ = this.endNameSet_;\n copy.indexEndName_ = this.indexEndName_;\n copy.index_ = this.index_;\n copy.viewFrom_ = this.viewFrom_;\n return copy;\n }\n}\n\nexport function queryParamsGetNodeFilter(queryParams: QueryParams): NodeFilter {\n if (queryParams.loadsAllData()) {\n return new IndexedFilter(queryParams.getIndex());\n } else if (queryParams.hasLimit()) {\n return new LimitedFilter(queryParams);\n } else {\n return new RangedFilter(queryParams);\n }\n}\n\nexport function queryParamsLimit(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = '';\n return newParams;\n}\n\nexport function queryParamsLimitToFirst(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n return newParams;\n}\n\nexport function queryParamsLimitToLast(\n queryParams: QueryParams,\n newLimit: number\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.limitSet_ = true;\n newParams.limit_ = newLimit;\n newParams.viewFrom_ = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT;\n return newParams;\n}\n\nexport function queryParamsStartAt(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.startSet_ = true;\n if (indexValue === undefined) {\n indexValue = null;\n }\n newParams.indexStartValue_ = indexValue;\n if (key != null) {\n newParams.startNameSet_ = true;\n newParams.indexStartName_ = key;\n } else {\n newParams.startNameSet_ = false;\n newParams.indexStartName_ = '';\n }\n return newParams;\n}\n\nexport function queryParamsStartAfter(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n let params: QueryParams;\n if (queryParams.index_ === KEY_INDEX || !!key) {\n params = queryParamsStartAt(queryParams, indexValue, key);\n } else {\n params = queryParamsStartAt(queryParams, indexValue, MAX_NAME);\n }\n params.startAfterSet_ = true;\n return params;\n}\n\nexport function queryParamsEndAt(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.endSet_ = true;\n if (indexValue === undefined) {\n indexValue = null;\n }\n newParams.indexEndValue_ = indexValue;\n if (key !== undefined) {\n newParams.endNameSet_ = true;\n newParams.indexEndName_ = key;\n } else {\n newParams.endNameSet_ = false;\n newParams.indexEndName_ = '';\n }\n return newParams;\n}\n\nexport function queryParamsEndBefore(\n queryParams: QueryParams,\n indexValue: unknown,\n key?: string | null\n): QueryParams {\n let params: QueryParams;\n if (queryParams.index_ === KEY_INDEX || !!key) {\n params = queryParamsEndAt(queryParams, indexValue, key);\n } else {\n params = queryParamsEndAt(queryParams, indexValue, MIN_NAME);\n }\n params.endBeforeSet_ = true;\n return params;\n}\n\nexport function queryParamsOrderBy(\n queryParams: QueryParams,\n index: Index\n): QueryParams {\n const newParams = queryParams.copy();\n newParams.index_ = index;\n return newParams;\n}\n\n/**\n * Returns a set of REST query string parameters representing this query.\n *\n * @returns query string parameters\n */\nexport function queryParamsToRestQueryStringParameters(\n queryParams: QueryParams\n): Record {\n const qs: Record = {};\n\n if (queryParams.isDefault()) {\n return qs;\n }\n\n let orderBy;\n if (queryParams.index_ === PRIORITY_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.PRIORITY_INDEX;\n } else if (queryParams.index_ === VALUE_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.VALUE_INDEX;\n } else if (queryParams.index_ === KEY_INDEX) {\n orderBy = REST_QUERY_CONSTANTS.KEY_INDEX;\n } else {\n assert(queryParams.index_ instanceof PathIndex, 'Unrecognized index type!');\n orderBy = queryParams.index_.toString();\n }\n qs[REST_QUERY_CONSTANTS.ORDER_BY] = stringify(orderBy);\n\n if (queryParams.startSet_) {\n const startParam = queryParams.startAfterSet_\n ? REST_QUERY_CONSTANTS.START_AFTER\n : REST_QUERY_CONSTANTS.START_AT;\n qs[startParam] = stringify(queryParams.indexStartValue_);\n if (queryParams.startNameSet_) {\n qs[startParam] += ',' + stringify(queryParams.indexStartName_);\n }\n }\n\n if (queryParams.endSet_) {\n const endParam = queryParams.endBeforeSet_\n ? REST_QUERY_CONSTANTS.END_BEFORE\n : REST_QUERY_CONSTANTS.END_AT;\n qs[endParam] = stringify(queryParams.indexEndValue_);\n if (queryParams.endNameSet_) {\n qs[endParam] += ',' + stringify(queryParams.indexEndName_);\n }\n }\n\n if (queryParams.limitSet_) {\n if (queryParams.isViewFromLeft()) {\n qs[REST_QUERY_CONSTANTS.LIMIT_TO_FIRST] = queryParams.limit_;\n } else {\n qs[REST_QUERY_CONSTANTS.LIMIT_TO_LAST] = queryParams.limit_;\n }\n }\n\n return qs;\n}\n\nexport function queryParamsGetQueryObject(\n queryParams: QueryParams\n): Record {\n const obj: Record = {};\n if (queryParams.startSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_VALUE] =\n queryParams.indexStartValue_;\n if (queryParams.startNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_NAME] =\n queryParams.indexStartName_;\n }\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_START_IS_INCLUSIVE] =\n !queryParams.startAfterSet_;\n }\n if (queryParams.endSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_VALUE] = queryParams.indexEndValue_;\n if (queryParams.endNameSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_NAME] = queryParams.indexEndName_;\n }\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX_END_IS_INCLUSIVE] =\n !queryParams.endBeforeSet_;\n }\n if (queryParams.limitSet_) {\n obj[WIRE_PROTOCOL_CONSTANTS.LIMIT] = queryParams.limit_;\n let viewFrom = queryParams.viewFrom_;\n if (viewFrom === '') {\n if (queryParams.isViewFromLeft()) {\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_LEFT;\n } else {\n viewFrom = WIRE_PROTOCOL_CONSTANTS.VIEW_FROM_RIGHT;\n }\n }\n obj[WIRE_PROTOCOL_CONSTANTS.VIEW_FROM] = viewFrom;\n }\n // For now, priority index is the default, so we only specify if it's some other index\n if (queryParams.index_ !== PRIORITY_INDEX) {\n obj[WIRE_PROTOCOL_CONSTANTS.INDEX] = queryParams.index_.toString();\n }\n return obj;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n jsonEval,\n safeGet,\n querystring,\n Deferred\n} from '@firebase/util';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { logWrapper, warn } from './util/util';\nimport { QueryContext } from './view/EventRegistration';\nimport { queryParamsToRestQueryStringParameters } from './view/QueryParams';\n\n/**\n * An implementation of ServerActions that communicates with the server via REST requests.\n * This is mostly useful for compatibility with crawlers, where we don't want to spin up a full\n * persistent connection (using WebSockets or long-polling)\n */\nexport class ReadonlyRestClient extends ServerActions {\n reportStats(stats: { [k: string]: unknown }): void {\n throw new Error('Method not implemented.');\n }\n\n /** @private {function(...[*])} */\n private log_: (...args: unknown[]) => void = logWrapper('p:rest:');\n\n /**\n * We don't actually need to track listens, except to prevent us calling an onComplete for a listen\n * that's been removed. :-/\n */\n private listens_: { [k: string]: object } = {};\n\n static getListenId_(query: QueryContext, tag?: number | null): string {\n if (tag !== undefined) {\n return 'tag$' + tag;\n } else {\n assert(\n query._queryParams.isDefault(),\n \"should have a tag if it's not a default query.\"\n );\n return query._path.toString();\n }\n }\n\n /**\n * @param repoInfo_ - Data about the namespace we are connecting to\n * @param onDataUpdate_ - A callback for new data from the server\n */\n constructor(\n private repoInfo_: RepoInfo,\n private onDataUpdate_: (\n a: string,\n b: unknown,\n c: boolean,\n d: number | null\n ) => void,\n private authTokenProvider_: AuthTokenProvider,\n private appCheckTokenProvider_: AppCheckTokenProvider\n ) {\n super();\n }\n\n /** @inheritDoc */\n listen(\n query: QueryContext,\n currentHashFn: () => string,\n tag: number | null,\n onComplete: (a: string, b: unknown) => void\n ) {\n const pathString = query._path.toString();\n this.log_('Listen called for ' + pathString + ' ' + query._queryIdentifier);\n\n // Mark this listener so we can tell if it's removed.\n const listenId = ReadonlyRestClient.getListenId_(query, tag);\n const thisListen = {};\n this.listens_[listenId] = thisListen;\n\n const queryStringParameters = queryParamsToRestQueryStringParameters(\n query._queryParams\n );\n\n this.restRequest_(\n pathString + '.json',\n queryStringParameters,\n (error, result) => {\n let data = result;\n\n if (error === 404) {\n data = null;\n error = null;\n }\n\n if (error === null) {\n this.onDataUpdate_(pathString, data, /*isMerge=*/ false, tag);\n }\n\n if (safeGet(this.listens_, listenId) === thisListen) {\n let status;\n if (!error) {\n status = 'ok';\n } else if (error === 401) {\n status = 'permission_denied';\n } else {\n status = 'rest_error:' + error;\n }\n\n onComplete(status, null);\n }\n }\n );\n }\n\n /** @inheritDoc */\n unlisten(query: QueryContext, tag: number | null) {\n const listenId = ReadonlyRestClient.getListenId_(query, tag);\n delete this.listens_[listenId];\n }\n\n get(query: QueryContext): Promise {\n const queryStringParameters = queryParamsToRestQueryStringParameters(\n query._queryParams\n );\n\n const pathString = query._path.toString();\n\n const deferred = new Deferred();\n\n this.restRequest_(\n pathString + '.json',\n queryStringParameters,\n (error, result) => {\n let data = result;\n\n if (error === 404) {\n data = null;\n error = null;\n }\n\n if (error === null) {\n this.onDataUpdate_(\n pathString,\n data,\n /*isMerge=*/ false,\n /*tag=*/ null\n );\n deferred.resolve(data as string);\n } else {\n deferred.reject(new Error(data as string));\n }\n }\n );\n return deferred.promise;\n }\n\n /** @inheritDoc */\n refreshAuthToken(token: string) {\n // no-op since we just always call getToken.\n }\n\n /**\n * Performs a REST request to the given path, with the provided query string parameters,\n * and any auth credentials we have.\n */\n private restRequest_(\n pathString: string,\n queryStringParameters: { [k: string]: string | number } = {},\n callback: ((a: number | null, b?: unknown) => void) | null\n ) {\n queryStringParameters['format'] = 'export';\n\n return Promise.all([\n this.authTokenProvider_.getToken(/*forceRefresh=*/ false),\n this.appCheckTokenProvider_.getToken(/*forceRefresh=*/ false)\n ]).then(([authToken, appCheckToken]) => {\n if (authToken && authToken.accessToken) {\n queryStringParameters['auth'] = authToken.accessToken;\n }\n if (appCheckToken && appCheckToken.token) {\n queryStringParameters['ac'] = appCheckToken.token;\n }\n\n const url =\n (this.repoInfo_.secure ? 'https://' : 'http://') +\n this.repoInfo_.host +\n pathString +\n '?' +\n 'ns=' +\n this.repoInfo_.namespace +\n querystring(queryStringParameters);\n\n this.log_('Sending REST request for ' + url);\n const xhr = new XMLHttpRequest();\n xhr.onreadystatechange = () => {\n if (callback && xhr.readyState === 4) {\n this.log_(\n 'REST Response for ' + url + ' received. status:',\n xhr.status,\n 'response:',\n xhr.responseText\n );\n let res = null;\n if (xhr.status >= 200 && xhr.status < 300) {\n try {\n res = jsonEval(xhr.responseText);\n } catch (e) {\n warn(\n 'Failed to parse JSON response for ' +\n url +\n ': ' +\n xhr.responseText\n );\n }\n callback(null, res);\n } else {\n // 401 and 404 are expected.\n if (xhr.status !== 401 && xhr.status !== 404) {\n warn(\n 'Got unsuccessful REST response for ' +\n url +\n ' Status: ' +\n xhr.status\n );\n }\n callback(xhr.status);\n }\n callback = null;\n }\n };\n\n xhr.open('GET', url, /*asynchronous=*/ true);\n xhr.send();\n });\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { Path } from './util/Path';\n\n/**\n * Mutable object which basically just stores a reference to the \"latest\" immutable snapshot.\n */\nexport class SnapshotHolder {\n private rootNode_: Node = ChildrenNode.EMPTY_NODE;\n\n getNode(path: Path): Node {\n return this.rootNode_.getChild(path);\n }\n\n updateSnapshot(path: Path, newSnapshotNode: Node) {\n this.rootNode_ = this.rootNode_.updateChild(path, newSnapshotNode);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { Node } from './snap/Node';\nimport { Path, pathGetFront, pathIsEmpty, pathPopFront } from './util/Path';\n\n/**\n * Helper class to store a sparse set of snapshots.\n */\nexport interface SparseSnapshotTree {\n value: Node | null;\n readonly children: Map;\n}\n\nexport function newSparseSnapshotTree(): SparseSnapshotTree {\n return {\n value: null,\n children: new Map()\n };\n}\n\n/**\n * Gets the node stored at the given path if one exists.\n * Only seems to be used in tests.\n *\n * @param path - Path to look up snapshot for.\n * @returns The retrieved node, or null.\n */\nexport function sparseSnapshotTreeFind(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path\n): Node | null {\n if (sparseSnapshotTree.value != null) {\n return sparseSnapshotTree.value.getChild(path);\n } else if (!pathIsEmpty(path) && sparseSnapshotTree.children.size > 0) {\n const childKey = pathGetFront(path);\n path = pathPopFront(path);\n if (sparseSnapshotTree.children.has(childKey)) {\n const childTree = sparseSnapshotTree.children.get(childKey);\n return sparseSnapshotTreeFind(childTree, path);\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\n/**\n * Stores the given node at the specified path. If there is already a node\n * at a shallower path, it merges the new data into that snapshot node.\n *\n * @param path - Path to look up snapshot for.\n * @param data - The new data, or null.\n */\nexport function sparseSnapshotTreeRemember(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path,\n data: Node\n): void {\n if (pathIsEmpty(path)) {\n sparseSnapshotTree.value = data;\n sparseSnapshotTree.children.clear();\n } else if (sparseSnapshotTree.value !== null) {\n sparseSnapshotTree.value = sparseSnapshotTree.value.updateChild(path, data);\n } else {\n const childKey = pathGetFront(path);\n if (!sparseSnapshotTree.children.has(childKey)) {\n sparseSnapshotTree.children.set(childKey, newSparseSnapshotTree());\n }\n\n const child = sparseSnapshotTree.children.get(childKey);\n path = pathPopFront(path);\n sparseSnapshotTreeRemember(child, path, data);\n }\n}\n\n/**\n * Purge the data at path from the cache.\n *\n * @param path - Path to look up snapshot for.\n * @returns True if this node should now be removed.\n */\nexport function sparseSnapshotTreeForget(\n sparseSnapshotTree: SparseSnapshotTree,\n path: Path\n): boolean {\n if (pathIsEmpty(path)) {\n sparseSnapshotTree.value = null;\n sparseSnapshotTree.children.clear();\n return true;\n } else {\n if (sparseSnapshotTree.value !== null) {\n if (sparseSnapshotTree.value.isLeafNode()) {\n // We're trying to forget a node that doesn't exist\n return false;\n } else {\n const value = sparseSnapshotTree.value;\n sparseSnapshotTree.value = null;\n\n value.forEachChild(PRIORITY_INDEX, (key, tree) => {\n sparseSnapshotTreeRemember(sparseSnapshotTree, new Path(key), tree);\n });\n\n return sparseSnapshotTreeForget(sparseSnapshotTree, path);\n }\n } else if (sparseSnapshotTree.children.size > 0) {\n const childKey = pathGetFront(path);\n path = pathPopFront(path);\n if (sparseSnapshotTree.children.has(childKey)) {\n const safeToRemove = sparseSnapshotTreeForget(\n sparseSnapshotTree.children.get(childKey),\n path\n );\n if (safeToRemove) {\n sparseSnapshotTree.children.delete(childKey);\n }\n }\n\n return sparseSnapshotTree.children.size === 0;\n } else {\n return true;\n }\n }\n}\n\n/**\n * Recursively iterates through all of the stored tree and calls the\n * callback on each one.\n *\n * @param prefixPath - Path to look up node for.\n * @param func - The function to invoke for each tree.\n */\nexport function sparseSnapshotTreeForEachTree(\n sparseSnapshotTree: SparseSnapshotTree,\n prefixPath: Path,\n func: (a: Path, b: Node) => unknown\n): void {\n if (sparseSnapshotTree.value !== null) {\n func(prefixPath, sparseSnapshotTree.value);\n } else {\n sparseSnapshotTreeForEachChild(sparseSnapshotTree, (key, tree) => {\n const path = new Path(prefixPath.toString() + '/' + key);\n sparseSnapshotTreeForEachTree(tree, path, func);\n });\n }\n}\n\n/**\n * Iterates through each immediate child and triggers the callback.\n * Only seems to be used in tests.\n *\n * @param func - The function to invoke for each child.\n */\nexport function sparseSnapshotTreeForEachChild(\n sparseSnapshotTree: SparseSnapshotTree,\n func: (a: string, b: SparseSnapshotTree) => void\n): void {\n sparseSnapshotTree.children.forEach((tree, key) => {\n func(key, tree);\n });\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { each } from '../util/util';\n\nimport { StatsCollection } from './StatsCollection';\n\n/**\n * Returns the delta from the previous call to get stats.\n *\n * @param collection_ - The collection to \"listen\" to.\n */\nexport class StatsListener {\n private last_: { [k: string]: number } | null = null;\n\n constructor(private collection_: StatsCollection) {}\n\n get(): { [k: string]: number } {\n const newStats = this.collection_.get();\n\n const delta = { ...newStats };\n if (this.last_) {\n each(this.last_, (stat: string, value: number) => {\n delta[stat] = delta[stat] - value;\n });\n }\n this.last_ = newStats;\n\n return delta;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { contains } from '@firebase/util';\n\nimport { ServerActions } from '../ServerActions';\nimport { setTimeoutNonBlocking, each } from '../util/util';\n\nimport { StatsCollection } from './StatsCollection';\nimport { StatsListener } from './StatsListener';\n\n// Assuming some apps may have a short amount of time on page, and a bulk of firebase operations probably\n// happen on page load, we try to report our first set of stats pretty quickly, but we wait at least 10\n// seconds to try to ensure the Firebase connection is established / settled.\nconst FIRST_STATS_MIN_TIME = 10 * 1000;\nconst FIRST_STATS_MAX_TIME = 30 * 1000;\n\n// We'll continue to report stats on average every 5 minutes.\nconst REPORT_STATS_INTERVAL = 5 * 60 * 1000;\n\nexport class StatsReporter {\n private statsListener_: StatsListener;\n statsToReport_: { [k: string]: boolean } = {};\n\n constructor(collection: StatsCollection, private server_: ServerActions) {\n this.statsListener_ = new StatsListener(collection);\n\n const timeout =\n FIRST_STATS_MIN_TIME +\n (FIRST_STATS_MAX_TIME - FIRST_STATS_MIN_TIME) * Math.random();\n setTimeoutNonBlocking(this.reportStats_.bind(this), Math.floor(timeout));\n }\n\n private reportStats_() {\n const stats = this.statsListener_.get();\n const reportedStats: typeof stats = {};\n let haveStatsToReport = false;\n\n each(stats, (stat: string, value: number) => {\n if (value > 0 && contains(this.statsToReport_, stat)) {\n reportedStats[stat] = value;\n haveStatsToReport = true;\n }\n });\n\n if (haveStatsToReport) {\n this.server_.reportStats(reportedStats);\n }\n\n // queue our next run.\n setTimeoutNonBlocking(\n this.reportStats_.bind(this),\n Math.floor(Math.random() * 2 * REPORT_STATS_INTERVAL)\n );\n }\n}\n\nexport function statsReporterIncludeStat(\n reporter: StatsReporter,\n stat: string\n) {\n reporter.statsToReport_[stat] = true;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path } from '../util/Path';\n\n/**\n *\n * @enum\n */\nexport enum OperationType {\n OVERWRITE,\n MERGE,\n ACK_USER_WRITE,\n LISTEN_COMPLETE\n}\n\n/**\n * @interface\n */\nexport interface Operation {\n source: OperationSource;\n\n type: OperationType;\n\n path: Path;\n\n operationForChild(childName: string): Operation | null;\n}\n\nexport interface OperationSource {\n fromUser: boolean;\n fromServer: boolean;\n queryId: string | null;\n tagged: boolean;\n}\n\nexport function newOperationSourceUser(): OperationSource {\n return {\n fromUser: true,\n fromServer: false,\n queryId: null,\n tagged: false\n };\n}\n\nexport function newOperationSourceServer(): OperationSource {\n return {\n fromUser: false,\n fromServer: true,\n queryId: null,\n tagged: false\n };\n}\n\nexport function newOperationSourceServerTaggedQuery(\n queryId: string\n): OperationSource {\n return {\n fromUser: false,\n fromServer: true,\n queryId,\n tagged: true\n };\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\n\nimport { newOperationSourceUser, Operation, OperationType } from './Operation';\n\nexport class AckUserWrite implements Operation {\n /** @inheritDoc */\n type = OperationType.ACK_USER_WRITE;\n\n /** @inheritDoc */\n source = newOperationSourceUser();\n\n /**\n * @param affectedTree - A tree containing true for each affected path. Affected paths can't overlap.\n */\n constructor(\n /** @inheritDoc */ public path: Path,\n /** @inheritDoc */ public affectedTree: ImmutableTree,\n /** @inheritDoc */ public revert: boolean\n ) {}\n operationForChild(childName: string): AckUserWrite {\n if (!pathIsEmpty(this.path)) {\n assert(\n pathGetFront(this.path) === childName,\n 'operationForChild called for unrelated child.'\n );\n return new AckUserWrite(\n pathPopFront(this.path),\n this.affectedTree,\n this.revert\n );\n } else if (this.affectedTree.value != null) {\n assert(\n this.affectedTree.children.isEmpty(),\n 'affectedTree should not have overlapping affected paths.'\n );\n // All child locations are affected as well; just return same operation.\n return this;\n } else {\n const childTree = this.affectedTree.subtree(new Path(childName));\n return new AckUserWrite(newEmptyPath(), childTree, this.revert);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { newEmptyPath, Path, pathIsEmpty, pathPopFront } from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './Operation';\n\nexport class ListenComplete implements Operation {\n /** @inheritDoc */\n type = OperationType.LISTEN_COMPLETE;\n\n constructor(public source: OperationSource, public path: Path) {}\n\n operationForChild(childName: string): ListenComplete {\n if (pathIsEmpty(this.path)) {\n return new ListenComplete(this.source, newEmptyPath());\n } else {\n return new ListenComplete(this.source, pathPopFront(this.path));\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\nimport { newEmptyPath, Path, pathIsEmpty, pathPopFront } from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './Operation';\n\nexport class Overwrite implements Operation {\n /** @inheritDoc */\n type = OperationType.OVERWRITE;\n\n constructor(\n public source: OperationSource,\n public path: Path,\n public snap: Node\n ) {}\n\n operationForChild(childName: string): Overwrite {\n if (pathIsEmpty(this.path)) {\n return new Overwrite(\n this.source,\n newEmptyPath(),\n this.snap.getImmediateChild(childName)\n );\n } else {\n return new Overwrite(this.source, pathPopFront(this.path), this.snap);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { Node } from '../snap/Node';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from '../util/Path';\n\nimport { Operation, OperationSource, OperationType } from './Operation';\nimport { Overwrite } from './Overwrite';\n\nexport class Merge implements Operation {\n /** @inheritDoc */\n type = OperationType.MERGE;\n\n constructor(\n /** @inheritDoc */ public source: OperationSource,\n /** @inheritDoc */ public path: Path,\n /** @inheritDoc */ public children: ImmutableTree\n ) {}\n operationForChild(childName: string): Operation {\n if (pathIsEmpty(this.path)) {\n const childTree = this.children.subtree(new Path(childName));\n if (childTree.isEmpty()) {\n // This child is unaffected\n return null;\n } else if (childTree.value) {\n // We have a snapshot for the child in question. This becomes an overwrite of the child.\n return new Overwrite(this.source, newEmptyPath(), childTree.value);\n } else {\n // This is a merge at a deeper level\n return new Merge(this.source, newEmptyPath(), childTree);\n }\n } else {\n assert(\n pathGetFront(this.path) === childName,\n \"Can't get a merge for a child not on the path of the operation\"\n );\n return new Merge(this.source, pathPopFront(this.path), this.children);\n }\n }\n toString(): string {\n return (\n 'Operation(' +\n this.path +\n ': ' +\n this.source.toString() +\n ' merge: ' +\n this.children.toString() +\n ')'\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\nimport { Path, pathGetFront, pathIsEmpty } from '../util/Path';\n\n/**\n * A cache node only stores complete children. Additionally it holds a flag whether the node can be considered fully\n * initialized in the sense that we know at one point in time this represented a valid state of the world, e.g.\n * initialized with data from the server, or a complete overwrite by the client. The filtered flag also tracks\n * whether a node potentially had children removed due to a filter.\n */\nexport class CacheNode {\n constructor(\n private node_: Node,\n private fullyInitialized_: boolean,\n private filtered_: boolean\n ) {}\n\n /**\n * Returns whether this node was fully initialized with either server data or a complete overwrite by the client\n */\n isFullyInitialized(): boolean {\n return this.fullyInitialized_;\n }\n\n /**\n * Returns whether this node is potentially missing children due to a filter applied to the node\n */\n isFiltered(): boolean {\n return this.filtered_;\n }\n\n isCompleteForPath(path: Path): boolean {\n if (pathIsEmpty(path)) {\n return this.isFullyInitialized() && !this.filtered_;\n }\n\n const childKey = pathGetFront(path);\n return this.isCompleteForChild(childKey);\n }\n\n isCompleteForChild(key: string): boolean {\n return (\n (this.isFullyInitialized() && !this.filtered_) || this.node_.hasChild(key)\n );\n }\n\n getNode(): Node {\n return this.node_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assertionError } from '@firebase/util';\n\nimport { Index } from '../snap/indexes/Index';\nimport { NamedNode, Node } from '../snap/Node';\n\nimport { Change, ChangeType, changeChildMoved } from './Change';\nimport { Event } from './Event';\nimport { EventRegistration, QueryContext } from './EventRegistration';\n\n/**\n * An EventGenerator is used to convert \"raw\" changes (Change) as computed by the\n * CacheDiffer into actual events (Event) that can be raised. See generateEventsForChanges()\n * for details.\n *\n */\nexport class EventGenerator {\n index_: Index;\n\n constructor(public query_: QueryContext) {\n this.index_ = this.query_._queryParams.getIndex();\n }\n}\n\n/**\n * Given a set of raw changes (no moved events and prevName not specified yet), and a set of\n * EventRegistrations that should be notified of these changes, generate the actual events to be raised.\n *\n * Notes:\n * - child_moved events will be synthesized at this time for any child_changed events that affect\n * our index.\n * - prevName will be calculated based on the index ordering.\n */\nexport function eventGeneratorGenerateEventsForChanges(\n eventGenerator: EventGenerator,\n changes: Change[],\n eventCache: Node,\n eventRegistrations: EventRegistration[]\n): Event[] {\n const events: Event[] = [];\n const moves: Change[] = [];\n\n changes.forEach(change => {\n if (\n change.type === ChangeType.CHILD_CHANGED &&\n eventGenerator.index_.indexedValueChanged(\n change.oldSnap as Node,\n change.snapshotNode\n )\n ) {\n moves.push(changeChildMoved(change.childName, change.snapshotNode));\n }\n });\n\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_REMOVED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_ADDED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_MOVED,\n moves,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.CHILD_CHANGED,\n changes,\n eventRegistrations,\n eventCache\n );\n eventGeneratorGenerateEventsForType(\n eventGenerator,\n events,\n ChangeType.VALUE,\n changes,\n eventRegistrations,\n eventCache\n );\n\n return events;\n}\n\n/**\n * Given changes of a single change type, generate the corresponding events.\n */\nfunction eventGeneratorGenerateEventsForType(\n eventGenerator: EventGenerator,\n events: Event[],\n eventType: string,\n changes: Change[],\n registrations: EventRegistration[],\n eventCache: Node\n) {\n const filteredChanges = changes.filter(change => change.type === eventType);\n\n filteredChanges.sort((a, b) =>\n eventGeneratorCompareChanges(eventGenerator, a, b)\n );\n filteredChanges.forEach(change => {\n const materializedChange = eventGeneratorMaterializeSingleChange(\n eventGenerator,\n change,\n eventCache\n );\n registrations.forEach(registration => {\n if (registration.respondsTo(change.type)) {\n events.push(\n registration.createEvent(materializedChange, eventGenerator.query_)\n );\n }\n });\n });\n}\n\nfunction eventGeneratorMaterializeSingleChange(\n eventGenerator: EventGenerator,\n change: Change,\n eventCache: Node\n): Change {\n if (change.type === 'value' || change.type === 'child_removed') {\n return change;\n } else {\n change.prevName = eventCache.getPredecessorChildName(\n change.childName,\n change.snapshotNode,\n eventGenerator.index_\n );\n return change;\n }\n}\n\nfunction eventGeneratorCompareChanges(\n eventGenerator: EventGenerator,\n a: Change,\n b: Change\n) {\n if (a.childName == null || b.childName == null) {\n throw assertionError('Should only compare child_ events.');\n }\n const aWrapped = new NamedNode(a.childName, a.snapshotNode);\n const bWrapped = new NamedNode(b.childName, b.snapshotNode);\n return eventGenerator.index_.compare(aWrapped, bWrapped);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Node } from '../snap/Node';\n\nimport { CacheNode } from './CacheNode';\n\n/**\n * Stores the data we have cached for a view.\n *\n * serverSnap is the cached server data, eventSnap is the cached event data (server data plus any local writes).\n */\nexport interface ViewCache {\n readonly eventCache: CacheNode;\n readonly serverCache: CacheNode;\n}\n\nexport function newViewCache(\n eventCache: CacheNode,\n serverCache: CacheNode\n): ViewCache {\n return { eventCache, serverCache };\n}\n\nexport function viewCacheUpdateEventSnap(\n viewCache: ViewCache,\n eventSnap: Node,\n complete: boolean,\n filtered: boolean\n): ViewCache {\n return newViewCache(\n new CacheNode(eventSnap, complete, filtered),\n viewCache.serverCache\n );\n}\n\nexport function viewCacheUpdateServerSnap(\n viewCache: ViewCache,\n serverSnap: Node,\n complete: boolean,\n filtered: boolean\n): ViewCache {\n return newViewCache(\n viewCache.eventCache,\n new CacheNode(serverSnap, complete, filtered)\n );\n}\n\nexport function viewCacheGetCompleteEventSnap(\n viewCache: ViewCache\n): Node | null {\n return viewCache.eventCache.isFullyInitialized()\n ? viewCache.eventCache.getNode()\n : null;\n}\n\nexport function viewCacheGetCompleteServerSnap(\n viewCache: ViewCache\n): Node | null {\n return viewCache.serverCache.isFullyInitialized()\n ? viewCache.serverCache.getNode()\n : null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n newEmptyPath,\n Path,\n pathChild,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from './Path';\nimport { SortedMap } from './SortedMap';\nimport { each, stringCompare } from './util';\n\nlet emptyChildrenSingleton: SortedMap>;\n\n/**\n * Singleton empty children collection.\n *\n */\nconst EmptyChildren = (): SortedMap> => {\n if (!emptyChildrenSingleton) {\n emptyChildrenSingleton = new SortedMap>(\n stringCompare\n );\n }\n return emptyChildrenSingleton;\n};\n\n/**\n * A tree with immutable elements.\n */\nexport class ImmutableTree {\n static fromObject(obj: { [k: string]: T }): ImmutableTree {\n let tree: ImmutableTree = new ImmutableTree(null);\n each(obj, (childPath: string, childSnap: T) => {\n tree = tree.set(new Path(childPath), childSnap);\n });\n return tree;\n }\n\n constructor(\n public readonly value: T | null,\n public readonly children: SortedMap<\n string,\n ImmutableTree\n > = EmptyChildren()\n ) {}\n\n /**\n * True if the value is empty and there are no children\n */\n isEmpty(): boolean {\n return this.value === null && this.children.isEmpty();\n }\n\n /**\n * Given a path and predicate, return the first node and the path to that node\n * where the predicate returns true.\n *\n * TODO Do a perf test -- If we're creating a bunch of `{path: value:}`\n * objects on the way back out, it may be better to pass down a pathSoFar obj.\n *\n * @param relativePath - The remainder of the path\n * @param predicate - The predicate to satisfy to return a node\n */\n findRootMostMatchingPathAndValue(\n relativePath: Path,\n predicate: (a: T) => boolean\n ): { path: Path; value: T } | null {\n if (this.value != null && predicate(this.value)) {\n return { path: newEmptyPath(), value: this.value };\n } else {\n if (pathIsEmpty(relativePath)) {\n return null;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child !== null) {\n const childExistingPathAndValue =\n child.findRootMostMatchingPathAndValue(\n pathPopFront(relativePath),\n predicate\n );\n if (childExistingPathAndValue != null) {\n const fullPath = pathChild(\n new Path(front),\n childExistingPathAndValue.path\n );\n return { path: fullPath, value: childExistingPathAndValue.value };\n } else {\n return null;\n }\n } else {\n return null;\n }\n }\n }\n }\n\n /**\n * Find, if it exists, the shortest subpath of the given path that points a defined\n * value in the tree\n */\n findRootMostValueAndPath(\n relativePath: Path\n ): { path: Path; value: T } | null {\n return this.findRootMostMatchingPathAndValue(relativePath, () => true);\n }\n\n /**\n * @returns The subtree at the given path\n */\n subtree(relativePath: Path): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return this;\n } else {\n const front = pathGetFront(relativePath);\n const childTree = this.children.get(front);\n if (childTree !== null) {\n return childTree.subtree(pathPopFront(relativePath));\n } else {\n return new ImmutableTree(null);\n }\n }\n }\n\n /**\n * Sets a value at the specified path.\n *\n * @param relativePath - Path to set value at.\n * @param toSet - Value to set.\n * @returns Resulting tree.\n */\n set(relativePath: Path, toSet: T | null): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return new ImmutableTree(toSet, this.children);\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front) || new ImmutableTree(null);\n const newChild = child.set(pathPopFront(relativePath), toSet);\n const newChildren = this.children.insert(front, newChild);\n return new ImmutableTree(this.value, newChildren);\n }\n }\n\n /**\n * Removes the value at the specified path.\n *\n * @param relativePath - Path to value to remove.\n * @returns Resulting tree.\n */\n remove(relativePath: Path): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n if (this.children.isEmpty()) {\n return new ImmutableTree(null);\n } else {\n return new ImmutableTree(null, this.children);\n }\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child) {\n const newChild = child.remove(pathPopFront(relativePath));\n let newChildren;\n if (newChild.isEmpty()) {\n newChildren = this.children.remove(front);\n } else {\n newChildren = this.children.insert(front, newChild);\n }\n if (this.value === null && newChildren.isEmpty()) {\n return new ImmutableTree(null);\n } else {\n return new ImmutableTree(this.value, newChildren);\n }\n } else {\n return this;\n }\n }\n }\n\n /**\n * Gets a value from the tree.\n *\n * @param relativePath - Path to get value for.\n * @returns Value at path, or null.\n */\n get(relativePath: Path): T | null {\n if (pathIsEmpty(relativePath)) {\n return this.value;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front);\n if (child) {\n return child.get(pathPopFront(relativePath));\n } else {\n return null;\n }\n }\n }\n\n /**\n * Replace the subtree at the specified path with the given new tree.\n *\n * @param relativePath - Path to replace subtree for.\n * @param newTree - New tree.\n * @returns Resulting tree.\n */\n setTree(relativePath: Path, newTree: ImmutableTree): ImmutableTree {\n if (pathIsEmpty(relativePath)) {\n return newTree;\n } else {\n const front = pathGetFront(relativePath);\n const child = this.children.get(front) || new ImmutableTree(null);\n const newChild = child.setTree(pathPopFront(relativePath), newTree);\n let newChildren;\n if (newChild.isEmpty()) {\n newChildren = this.children.remove(front);\n } else {\n newChildren = this.children.insert(front, newChild);\n }\n return new ImmutableTree(this.value, newChildren);\n }\n }\n\n /**\n * Performs a depth first fold on this tree. Transforms a tree into a single\n * value, given a function that operates on the path to a node, an optional\n * current value, and a map of child names to folded subtrees\n */\n fold(fn: (path: Path, value: T, children: { [k: string]: V }) => V): V {\n return this.fold_(newEmptyPath(), fn);\n }\n\n /**\n * Recursive helper for public-facing fold() method\n */\n private fold_(\n pathSoFar: Path,\n fn: (path: Path, value: T | null, children: { [k: string]: V }) => V\n ): V {\n const accum: { [k: string]: V } = {};\n this.children.inorderTraversal(\n (childKey: string, childTree: ImmutableTree) => {\n accum[childKey] = childTree.fold_(pathChild(pathSoFar, childKey), fn);\n }\n );\n return fn(pathSoFar, this.value, accum);\n }\n\n /**\n * Find the first matching value on the given path. Return the result of applying f to it.\n */\n findOnPath(path: Path, f: (path: Path, value: T) => V | null): V | null {\n return this.findOnPath_(path, newEmptyPath(), f);\n }\n\n private findOnPath_(\n pathToFollow: Path,\n pathSoFar: Path,\n f: (path: Path, value: T) => V | null\n ): V | null {\n const result = this.value ? f(pathSoFar, this.value) : false;\n if (result) {\n return result;\n } else {\n if (pathIsEmpty(pathToFollow)) {\n return null;\n } else {\n const front = pathGetFront(pathToFollow)!;\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.findOnPath_(\n pathPopFront(pathToFollow),\n pathChild(pathSoFar, front),\n f\n );\n } else {\n return null;\n }\n }\n }\n }\n\n foreachOnPath(\n path: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree {\n return this.foreachOnPath_(path, newEmptyPath(), f);\n }\n\n private foreachOnPath_(\n pathToFollow: Path,\n currentRelativePath: Path,\n f: (path: Path, value: T) => void\n ): ImmutableTree {\n if (pathIsEmpty(pathToFollow)) {\n return this;\n } else {\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n const front = pathGetFront(pathToFollow);\n const nextChild = this.children.get(front);\n if (nextChild) {\n return nextChild.foreachOnPath_(\n pathPopFront(pathToFollow),\n pathChild(currentRelativePath, front),\n f\n );\n } else {\n return new ImmutableTree(null);\n }\n }\n }\n\n /**\n * Calls the given function for each node in the tree that has a value.\n *\n * @param f - A function to be called with the path from the root of the tree to\n * a node, and the value at that node. Called in depth-first order.\n */\n foreach(f: (path: Path, value: T) => void) {\n this.foreach_(newEmptyPath(), f);\n }\n\n private foreach_(\n currentRelativePath: Path,\n f: (path: Path, value: T) => void\n ) {\n this.children.inorderTraversal((childName, childTree) => {\n childTree.foreach_(pathChild(currentRelativePath, childName), f);\n });\n if (this.value) {\n f(currentRelativePath, this.value);\n }\n }\n\n foreachChild(f: (name: string, value: T) => void) {\n this.children.inorderTraversal(\n (childName: string, childTree: ImmutableTree) => {\n if (childTree.value) {\n f(childName, childTree.value);\n }\n }\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { NamedNode, Node } from './snap/Node';\nimport { ImmutableTree } from './util/ImmutableTree';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathIsEmpty\n} from './util/Path';\nimport { each } from './util/util';\n\n/**\n * This class holds a collection of writes that can be applied to nodes in unison. It abstracts away the logic with\n * dealing with priority writes and multiple nested writes. At any given path there is only allowed to be one write\n * modifying that path. Any write to an existing path or shadowing an existing path will modify that existing write\n * to reflect the write added.\n */\nexport class CompoundWrite {\n constructor(public writeTree_: ImmutableTree) {}\n\n static empty(): CompoundWrite {\n return new CompoundWrite(new ImmutableTree(null));\n }\n}\n\nexport function compoundWriteAddWrite(\n compoundWrite: CompoundWrite,\n path: Path,\n node: Node\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return new CompoundWrite(new ImmutableTree(node));\n } else {\n const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n const rootMostPath = rootmost.path;\n let value = rootmost.value;\n const relativePath = newRelativePath(rootMostPath, path);\n value = value.updateChild(relativePath, node);\n return new CompoundWrite(\n compoundWrite.writeTree_.set(rootMostPath, value)\n );\n } else {\n const subtree = new ImmutableTree(node);\n const newWriteTree = compoundWrite.writeTree_.setTree(path, subtree);\n return new CompoundWrite(newWriteTree);\n }\n }\n}\n\nexport function compoundWriteAddWrites(\n compoundWrite: CompoundWrite,\n path: Path,\n updates: { [name: string]: Node }\n): CompoundWrite {\n let newWrite = compoundWrite;\n each(updates, (childKey: string, node: Node) => {\n newWrite = compoundWriteAddWrite(newWrite, pathChild(path, childKey), node);\n });\n return newWrite;\n}\n\n/**\n * Will remove a write at the given path and deeper paths. This will not modify a write at a higher\n * location, which must be removed by calling this method with that path.\n *\n * @param compoundWrite - The CompoundWrite to remove.\n * @param path - The path at which a write and all deeper writes should be removed\n * @returns The new CompoundWrite with the removed path\n */\nexport function compoundWriteRemoveWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return CompoundWrite.empty();\n } else {\n const newWriteTree = compoundWrite.writeTree_.setTree(\n path,\n new ImmutableTree(null)\n );\n return new CompoundWrite(newWriteTree);\n }\n}\n\n/**\n * Returns whether this CompoundWrite will fully overwrite a node at a given location and can therefore be\n * considered \"complete\".\n *\n * @param compoundWrite - The CompoundWrite to check.\n * @param path - The path to check for\n * @returns Whether there is a complete write at that path\n */\nexport function compoundWriteHasCompleteWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): boolean {\n return compoundWriteGetCompleteNode(compoundWrite, path) != null;\n}\n\n/**\n * Returns a node for a path if and only if the node is a \"complete\" overwrite at that path. This will not aggregate\n * writes from deeper paths, but will return child nodes from a more shallow path.\n *\n * @param compoundWrite - The CompoundWrite to get the node from.\n * @param path - The path to get a complete write\n * @returns The node if complete at that path, or null otherwise.\n */\nexport function compoundWriteGetCompleteNode(\n compoundWrite: CompoundWrite,\n path: Path\n): Node | null {\n const rootmost = compoundWrite.writeTree_.findRootMostValueAndPath(path);\n if (rootmost != null) {\n return compoundWrite.writeTree_\n .get(rootmost.path)\n .getChild(newRelativePath(rootmost.path, path));\n } else {\n return null;\n }\n}\n\n/**\n * Returns all children that are guaranteed to be a complete overwrite.\n *\n * @param compoundWrite - The CompoundWrite to get children from.\n * @returns A list of all complete children.\n */\nexport function compoundWriteGetCompleteChildren(\n compoundWrite: CompoundWrite\n): NamedNode[] {\n const children: NamedNode[] = [];\n const node = compoundWrite.writeTree_.value;\n if (node != null) {\n // If it's a leaf node, it has no children; so nothing to do.\n if (!node.isLeafNode()) {\n (node as ChildrenNode).forEachChild(\n PRIORITY_INDEX,\n (childName, childNode) => {\n children.push(new NamedNode(childName, childNode));\n }\n );\n }\n } else {\n compoundWrite.writeTree_.children.inorderTraversal(\n (childName, childTree) => {\n if (childTree.value != null) {\n children.push(new NamedNode(childName, childTree.value));\n }\n }\n );\n }\n return children;\n}\n\nexport function compoundWriteChildCompoundWrite(\n compoundWrite: CompoundWrite,\n path: Path\n): CompoundWrite {\n if (pathIsEmpty(path)) {\n return compoundWrite;\n } else {\n const shadowingNode = compoundWriteGetCompleteNode(compoundWrite, path);\n if (shadowingNode != null) {\n return new CompoundWrite(new ImmutableTree(shadowingNode));\n } else {\n return new CompoundWrite(compoundWrite.writeTree_.subtree(path));\n }\n }\n}\n\n/**\n * Returns true if this CompoundWrite is empty and therefore does not modify any nodes.\n * @returns Whether this CompoundWrite is empty\n */\nexport function compoundWriteIsEmpty(compoundWrite: CompoundWrite): boolean {\n return compoundWrite.writeTree_.isEmpty();\n}\n\n/**\n * Applies this CompoundWrite to a node. The node is returned with all writes from this CompoundWrite applied to the\n * node\n * @param node - The node to apply this CompoundWrite to\n * @returns The node with all writes applied\n */\nexport function compoundWriteApply(\n compoundWrite: CompoundWrite,\n node: Node\n): Node {\n return applySubtreeWrite(newEmptyPath(), compoundWrite.writeTree_, node);\n}\n\nfunction applySubtreeWrite(\n relativePath: Path,\n writeTree: ImmutableTree,\n node: Node\n): Node {\n if (writeTree.value != null) {\n // Since there a write is always a leaf, we're done here\n return node.updateChild(relativePath, writeTree.value);\n } else {\n let priorityWrite = null;\n writeTree.children.inorderTraversal((childKey, childTree) => {\n if (childKey === '.priority') {\n // Apply priorities at the end so we don't update priorities for either empty nodes or forget\n // to apply priorities to empty nodes that are later filled\n assert(\n childTree.value !== null,\n 'Priority writes must always be leaf nodes'\n );\n priorityWrite = childTree.value;\n } else {\n node = applySubtreeWrite(\n pathChild(relativePath, childKey),\n childTree,\n node\n );\n }\n });\n // If there was a priority write, we only apply it if the node is not empty\n if (!node.getChild(relativePath).isEmpty() && priorityWrite !== null) {\n node = node.updateChild(\n pathChild(relativePath, '.priority'),\n priorityWrite\n );\n }\n return node;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, assertionError, safeGet } from '@firebase/util';\n\nimport {\n CompoundWrite,\n compoundWriteAddWrite,\n compoundWriteAddWrites,\n compoundWriteApply,\n compoundWriteChildCompoundWrite,\n compoundWriteGetCompleteChildren,\n compoundWriteGetCompleteNode,\n compoundWriteHasCompleteWrite,\n compoundWriteIsEmpty,\n compoundWriteRemoveWrite\n} from './CompoundWrite';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Index } from './snap/indexes/Index';\nimport { PRIORITY_INDEX } from './snap/indexes/PriorityIndex';\nimport { NamedNode, Node } from './snap/Node';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathContains,\n pathGetFront,\n pathIsEmpty,\n pathPopFront\n} from './util/Path';\nimport { each } from './util/util';\nimport { CacheNode } from './view/CacheNode';\n\n/**\n * Defines a single user-initiated write operation. May be the result of a set(), transaction(), or update() call. In\n * the case of a set() or transaction, snap will be non-null. In the case of an update(), children will be non-null.\n */\nexport interface WriteRecord {\n writeId: number;\n path: Path;\n snap?: Node | null;\n children?: { [k: string]: Node } | null;\n visible: boolean;\n}\n\n/**\n * Create a new WriteTreeRef for the given path. For use with a new sync point at the given path.\n *\n */\nexport function writeTreeChildWrites(\n writeTree: WriteTree,\n path: Path\n): WriteTreeRef {\n return newWriteTreeRef(path, writeTree);\n}\n\n/**\n * Record a new overwrite from user code.\n *\n * @param visible - This is set to false by some transactions. It should be excluded from event caches\n */\nexport function writeTreeAddOverwrite(\n writeTree: WriteTree,\n path: Path,\n snap: Node,\n writeId: number,\n visible?: boolean\n) {\n assert(\n writeId > writeTree.lastWriteId,\n 'Stacking an older write on top of newer ones'\n );\n if (visible === undefined) {\n visible = true;\n }\n writeTree.allWrites.push({\n path,\n snap,\n writeId,\n visible\n });\n\n if (visible) {\n writeTree.visibleWrites = compoundWriteAddWrite(\n writeTree.visibleWrites,\n path,\n snap\n );\n }\n writeTree.lastWriteId = writeId;\n}\n\n/**\n * Record a new merge from user code.\n */\nexport function writeTreeAddMerge(\n writeTree: WriteTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n) {\n assert(\n writeId > writeTree.lastWriteId,\n 'Stacking an older merge on top of newer ones'\n );\n writeTree.allWrites.push({\n path,\n children: changedChildren,\n writeId,\n visible: true\n });\n\n writeTree.visibleWrites = compoundWriteAddWrites(\n writeTree.visibleWrites,\n path,\n changedChildren\n );\n writeTree.lastWriteId = writeId;\n}\n\nexport function writeTreeGetWrite(\n writeTree: WriteTree,\n writeId: number\n): WriteRecord | null {\n for (let i = 0; i < writeTree.allWrites.length; i++) {\n const record = writeTree.allWrites[i];\n if (record.writeId === writeId) {\n return record;\n }\n }\n return null;\n}\n\n/**\n * Remove a write (either an overwrite or merge) that has been successfully acknowledge by the server. Recalculates\n * the tree if necessary. We return true if it may have been visible, meaning views need to reevaluate.\n *\n * @returns true if the write may have been visible (meaning we'll need to reevaluate / raise\n * events as a result).\n */\nexport function writeTreeRemoveWrite(\n writeTree: WriteTree,\n writeId: number\n): boolean {\n // Note: disabling this check. It could be a transaction that preempted another transaction, and thus was applied\n // out of order.\n //const validClear = revert || this.allWrites_.length === 0 || writeId <= this.allWrites_[0].writeId;\n //assert(validClear, \"Either we don't have this write, or it's the first one in the queue\");\n\n const idx = writeTree.allWrites.findIndex(s => {\n return s.writeId === writeId;\n });\n assert(idx >= 0, 'removeWrite called with nonexistent writeId.');\n const writeToRemove = writeTree.allWrites[idx];\n writeTree.allWrites.splice(idx, 1);\n\n let removedWriteWasVisible = writeToRemove.visible;\n let removedWriteOverlapsWithOtherWrites = false;\n\n let i = writeTree.allWrites.length - 1;\n\n while (removedWriteWasVisible && i >= 0) {\n const currentWrite = writeTree.allWrites[i];\n if (currentWrite.visible) {\n if (\n i >= idx &&\n writeTreeRecordContainsPath_(currentWrite, writeToRemove.path)\n ) {\n // The removed write was completely shadowed by a subsequent write.\n removedWriteWasVisible = false;\n } else if (pathContains(writeToRemove.path, currentWrite.path)) {\n // Either we're covering some writes or they're covering part of us (depending on which came first).\n removedWriteOverlapsWithOtherWrites = true;\n }\n }\n i--;\n }\n\n if (!removedWriteWasVisible) {\n return false;\n } else if (removedWriteOverlapsWithOtherWrites) {\n // There's some shadowing going on. Just rebuild the visible writes from scratch.\n writeTreeResetTree_(writeTree);\n return true;\n } else {\n // There's no shadowing. We can safely just remove the write(s) from visibleWrites.\n if (writeToRemove.snap) {\n writeTree.visibleWrites = compoundWriteRemoveWrite(\n writeTree.visibleWrites,\n writeToRemove.path\n );\n } else {\n const children = writeToRemove.children;\n each(children, (childName: string) => {\n writeTree.visibleWrites = compoundWriteRemoveWrite(\n writeTree.visibleWrites,\n pathChild(writeToRemove.path, childName)\n );\n });\n }\n return true;\n }\n}\n\nfunction writeTreeRecordContainsPath_(\n writeRecord: WriteRecord,\n path: Path\n): boolean {\n if (writeRecord.snap) {\n return pathContains(writeRecord.path, path);\n } else {\n for (const childName in writeRecord.children) {\n if (\n writeRecord.children.hasOwnProperty(childName) &&\n pathContains(pathChild(writeRecord.path, childName), path)\n ) {\n return true;\n }\n }\n return false;\n }\n}\n\n/**\n * Re-layer the writes and merges into a tree so we can efficiently calculate event snapshots\n */\nfunction writeTreeResetTree_(writeTree: WriteTree) {\n writeTree.visibleWrites = writeTreeLayerTree_(\n writeTree.allWrites,\n writeTreeDefaultFilter_,\n newEmptyPath()\n );\n if (writeTree.allWrites.length > 0) {\n writeTree.lastWriteId =\n writeTree.allWrites[writeTree.allWrites.length - 1].writeId;\n } else {\n writeTree.lastWriteId = -1;\n }\n}\n\n/**\n * The default filter used when constructing the tree. Keep everything that's visible.\n */\nfunction writeTreeDefaultFilter_(write: WriteRecord) {\n return write.visible;\n}\n\n/**\n * Static method. Given an array of WriteRecords, a filter for which ones to include, and a path, construct the tree of\n * event data at that path.\n */\nfunction writeTreeLayerTree_(\n writes: WriteRecord[],\n filter: (w: WriteRecord) => boolean,\n treeRoot: Path\n): CompoundWrite {\n let compoundWrite = CompoundWrite.empty();\n for (let i = 0; i < writes.length; ++i) {\n const write = writes[i];\n // Theory, a later set will either:\n // a) abort a relevant transaction, so no need to worry about excluding it from calculating that transaction\n // b) not be relevant to a transaction (separate branch), so again will not affect the data for that transaction\n if (filter(write)) {\n const writePath = write.path;\n let relativePath: Path;\n if (write.snap) {\n if (pathContains(treeRoot, writePath)) {\n relativePath = newRelativePath(treeRoot, writePath);\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n relativePath,\n write.snap\n );\n } else if (pathContains(writePath, treeRoot)) {\n relativePath = newRelativePath(writePath, treeRoot);\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n newEmptyPath(),\n write.snap.getChild(relativePath)\n );\n } else {\n // There is no overlap between root path and write path, ignore write\n }\n } else if (write.children) {\n if (pathContains(treeRoot, writePath)) {\n relativePath = newRelativePath(treeRoot, writePath);\n compoundWrite = compoundWriteAddWrites(\n compoundWrite,\n relativePath,\n write.children\n );\n } else if (pathContains(writePath, treeRoot)) {\n relativePath = newRelativePath(writePath, treeRoot);\n if (pathIsEmpty(relativePath)) {\n compoundWrite = compoundWriteAddWrites(\n compoundWrite,\n newEmptyPath(),\n write.children\n );\n } else {\n const child = safeGet(write.children, pathGetFront(relativePath));\n if (child) {\n // There exists a child in this node that matches the root path\n const deepNode = child.getChild(pathPopFront(relativePath));\n compoundWrite = compoundWriteAddWrite(\n compoundWrite,\n newEmptyPath(),\n deepNode\n );\n }\n }\n } else {\n // There is no overlap between root path and write path, ignore write\n }\n } else {\n throw assertionError('WriteRecord should have .snap or .children');\n }\n }\n }\n return compoundWrite;\n}\n\n/**\n * Return a complete snapshot for the given path if there's visible write data at that path, else null.\n * No server data is considered.\n *\n */\nexport function writeTreeGetCompleteWriteData(\n writeTree: WriteTree,\n path: Path\n): Node | null {\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\n}\n\n/**\n * Given optional, underlying server data, and an optional set of constraints (exclude some sets, include hidden\n * writes), attempt to calculate a complete snapshot for the given path\n *\n * @param writeIdsToExclude - An optional set to be excluded\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\n */\nexport function writeTreeCalcCompleteEventCache(\n writeTree: WriteTree,\n treePath: Path,\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n): Node | null {\n if (!writeIdsToExclude && !includeHiddenWrites) {\n const shadowingNode = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n treePath\n );\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n const subMerge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n if (compoundWriteIsEmpty(subMerge)) {\n return completeServerCache;\n } else if (\n completeServerCache == null &&\n !compoundWriteHasCompleteWrite(subMerge, newEmptyPath())\n ) {\n // We wouldn't have a complete snapshot, since there's no underlying data and no complete shadow\n return null;\n } else {\n const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\n return compoundWriteApply(subMerge, layeredCache);\n }\n }\n } else {\n const merge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n if (!includeHiddenWrites && compoundWriteIsEmpty(merge)) {\n return completeServerCache;\n } else {\n // If the server cache is null, and we don't have a complete cache, we need to return null\n if (\n !includeHiddenWrites &&\n completeServerCache == null &&\n !compoundWriteHasCompleteWrite(merge, newEmptyPath())\n ) {\n return null;\n } else {\n const filter = function (write: WriteRecord) {\n return (\n (write.visible || includeHiddenWrites) &&\n (!writeIdsToExclude ||\n !~writeIdsToExclude.indexOf(write.writeId)) &&\n (pathContains(write.path, treePath) ||\n pathContains(treePath, write.path))\n );\n };\n const mergeAtPath = writeTreeLayerTree_(\n writeTree.allWrites,\n filter,\n treePath\n );\n const layeredCache = completeServerCache || ChildrenNode.EMPTY_NODE;\n return compoundWriteApply(mergeAtPath, layeredCache);\n }\n }\n }\n}\n\n/**\n * With optional, underlying server data, attempt to return a children node of children that we have complete data for.\n * Used when creating new views, to pre-fill their complete event children snapshot.\n */\nexport function writeTreeCalcCompleteEventChildren(\n writeTree: WriteTree,\n treePath: Path,\n completeServerChildren: ChildrenNode | null\n) {\n let completeChildren = ChildrenNode.EMPTY_NODE as Node;\n const topLevelSet = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n treePath\n );\n if (topLevelSet) {\n if (!topLevelSet.isLeafNode()) {\n // we're shadowing everything. Return the children.\n topLevelSet.forEachChild(PRIORITY_INDEX, (childName, childSnap) => {\n completeChildren = completeChildren.updateImmediateChild(\n childName,\n childSnap\n );\n });\n }\n return completeChildren;\n } else if (completeServerChildren) {\n // Layer any children we have on top of this\n // We know we don't have a top-level set, so just enumerate existing children\n const merge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n completeServerChildren.forEachChild(\n PRIORITY_INDEX,\n (childName, childNode) => {\n const node = compoundWriteApply(\n compoundWriteChildCompoundWrite(merge, new Path(childName)),\n childNode\n );\n completeChildren = completeChildren.updateImmediateChild(\n childName,\n node\n );\n }\n );\n // Add any complete children we have from the set\n compoundWriteGetCompleteChildren(merge).forEach(namedNode => {\n completeChildren = completeChildren.updateImmediateChild(\n namedNode.name,\n namedNode.node\n );\n });\n return completeChildren;\n } else {\n // We don't have anything to layer on top of. Layer on any children we have\n // Note that we can return an empty snap if we have a defined delete\n const merge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n compoundWriteGetCompleteChildren(merge).forEach(namedNode => {\n completeChildren = completeChildren.updateImmediateChild(\n namedNode.name,\n namedNode.node\n );\n });\n return completeChildren;\n }\n}\n\n/**\n * Given that the underlying server data has updated, determine what, if anything, needs to be\n * applied to the event cache.\n *\n * Possibilities:\n *\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\n *\n * 2. Some write is completely shadowing. No events to be raised\n *\n * 3. Is partially shadowed. Events\n *\n * Either existingEventSnap or existingServerSnap must exist\n */\nexport function writeTreeCalcEventCacheAfterServerOverwrite(\n writeTree: WriteTree,\n treePath: Path,\n childPath: Path,\n existingEventSnap: Node | null,\n existingServerSnap: Node | null\n): Node | null {\n assert(\n existingEventSnap || existingServerSnap,\n 'Either existingEventSnap or existingServerSnap must exist'\n );\n const path = pathChild(treePath, childPath);\n if (compoundWriteHasCompleteWrite(writeTree.visibleWrites, path)) {\n // At this point we can probably guarantee that we're in case 2, meaning no events\n // May need to check visibility while doing the findRootMostValueAndPath call\n return null;\n } else {\n // No complete shadowing. We're either partially shadowing or not shadowing at all.\n const childMerge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n path\n );\n if (compoundWriteIsEmpty(childMerge)) {\n // We're not shadowing at all. Case 1\n return existingServerSnap.getChild(childPath);\n } else {\n // This could be more efficient if the serverNode + updates doesn't change the eventSnap\n // However this is tricky to find out, since user updates don't necessary change the server\n // snap, e.g. priority updates on empty nodes, or deep deletes. Another special case is if the server\n // adds nodes, but doesn't change any existing writes. It is therefore not enough to\n // only check if the updates change the serverNode.\n // Maybe check if the merge tree contains these special cases and only do a full overwrite in that case?\n return compoundWriteApply(\n childMerge,\n existingServerSnap.getChild(childPath)\n );\n }\n }\n}\n\n/**\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\n * complete child for this ChildKey.\n */\nexport function writeTreeCalcCompleteChild(\n writeTree: WriteTree,\n treePath: Path,\n childKey: string,\n existingServerSnap: CacheNode\n): Node | null {\n const path = pathChild(treePath, childKey);\n const shadowingNode = compoundWriteGetCompleteNode(\n writeTree.visibleWrites,\n path\n );\n if (shadowingNode != null) {\n return shadowingNode;\n } else {\n if (existingServerSnap.isCompleteForChild(childKey)) {\n const childMerge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n path\n );\n return compoundWriteApply(\n childMerge,\n existingServerSnap.getNode().getImmediateChild(childKey)\n );\n } else {\n return null;\n }\n }\n}\n\n/**\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\n * a higher path, this will return the child of that write relative to the write and this path.\n * Returns null if there is no write at this path.\n */\nexport function writeTreeShadowingWrite(\n writeTree: WriteTree,\n path: Path\n): Node | null {\n return compoundWriteGetCompleteNode(writeTree.visibleWrites, path);\n}\n\n/**\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\n * the window, but may now be in the window.\n */\nexport function writeTreeCalcIndexedSlice(\n writeTree: WriteTree,\n treePath: Path,\n completeServerData: Node | null,\n startPost: NamedNode,\n count: number,\n reverse: boolean,\n index: Index\n): NamedNode[] {\n let toIterate: Node;\n const merge = compoundWriteChildCompoundWrite(\n writeTree.visibleWrites,\n treePath\n );\n const shadowingNode = compoundWriteGetCompleteNode(merge, newEmptyPath());\n if (shadowingNode != null) {\n toIterate = shadowingNode;\n } else if (completeServerData != null) {\n toIterate = compoundWriteApply(merge, completeServerData);\n } else {\n // no children to iterate on\n return [];\n }\n toIterate = toIterate.withIndex(index);\n if (!toIterate.isEmpty() && !toIterate.isLeafNode()) {\n const nodes = [];\n const cmp = index.getCompare();\n const iter = reverse\n ? (toIterate as ChildrenNode).getReverseIteratorFrom(startPost, index)\n : (toIterate as ChildrenNode).getIteratorFrom(startPost, index);\n let next = iter.getNext();\n while (next && nodes.length < count) {\n if (cmp(next, startPost) !== 0) {\n nodes.push(next);\n }\n next = iter.getNext();\n }\n return nodes;\n } else {\n return [];\n }\n}\n\nexport function newWriteTree(): WriteTree {\n return {\n visibleWrites: CompoundWrite.empty(),\n allWrites: [],\n lastWriteId: -1\n };\n}\n\n/**\n * WriteTree tracks all pending user-initiated writes and has methods to calculate the result of merging them\n * with underlying server data (to create \"event cache\" data). Pending writes are added with addOverwrite()\n * and addMerge(), and removed with removeWrite().\n */\nexport interface WriteTree {\n /**\n * A tree tracking the result of applying all visible writes. This does not include transactions with\n * applyLocally=false or writes that are completely shadowed by other writes.\n */\n visibleWrites: CompoundWrite;\n\n /**\n * A list of all pending writes, regardless of visibility and shadowed-ness. Used to calculate arbitrary\n * sets of the changed data, such as hidden writes (from transactions) or changes with certain writes excluded (also\n * used by transactions).\n */\n allWrites: WriteRecord[];\n\n lastWriteId: number;\n}\n\n/**\n * If possible, returns a complete event cache, using the underlying server data if possible. In addition, can be used\n * to get a cache that includes hidden writes, and excludes arbitrary writes. Note that customizing the returned node\n * can lead to a more expensive calculation.\n *\n * @param writeIdsToExclude - Optional writes to exclude.\n * @param includeHiddenWrites - Defaults to false, whether or not to layer on writes with visible set to false\n */\nexport function writeTreeRefCalcCompleteEventCache(\n writeTreeRef: WriteTreeRef,\n completeServerCache: Node | null,\n writeIdsToExclude?: number[],\n includeHiddenWrites?: boolean\n): Node | null {\n return writeTreeCalcCompleteEventCache(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n completeServerCache,\n writeIdsToExclude,\n includeHiddenWrites\n );\n}\n\n/**\n * If possible, returns a children node containing all of the complete children we have data for. The returned data is a\n * mix of the given server data and write data.\n *\n */\nexport function writeTreeRefCalcCompleteEventChildren(\n writeTreeRef: WriteTreeRef,\n completeServerChildren: ChildrenNode | null\n): ChildrenNode {\n return writeTreeCalcCompleteEventChildren(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n completeServerChildren\n ) as ChildrenNode;\n}\n\n/**\n * Given that either the underlying server data has updated or the outstanding writes have updated, determine what,\n * if anything, needs to be applied to the event cache.\n *\n * Possibilities:\n *\n * 1. No writes are shadowing. Events should be raised, the snap to be applied comes from the server data\n *\n * 2. Some write is completely shadowing. No events to be raised\n *\n * 3. Is partially shadowed. Events should be raised\n *\n * Either existingEventSnap or existingServerSnap must exist, this is validated via an assert\n *\n *\n */\nexport function writeTreeRefCalcEventCacheAfterServerOverwrite(\n writeTreeRef: WriteTreeRef,\n path: Path,\n existingEventSnap: Node | null,\n existingServerSnap: Node | null\n): Node | null {\n return writeTreeCalcEventCacheAfterServerOverwrite(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n path,\n existingEventSnap,\n existingServerSnap\n );\n}\n\n/**\n * Returns a node if there is a complete overwrite for this path. More specifically, if there is a write at\n * a higher path, this will return the child of that write relative to the write and this path.\n * Returns null if there is no write at this path.\n *\n */\nexport function writeTreeRefShadowingWrite(\n writeTreeRef: WriteTreeRef,\n path: Path\n): Node | null {\n return writeTreeShadowingWrite(\n writeTreeRef.writeTree,\n pathChild(writeTreeRef.treePath, path)\n );\n}\n\n/**\n * This method is used when processing child remove events on a query. If we can, we pull in children that were outside\n * the window, but may now be in the window\n */\nexport function writeTreeRefCalcIndexedSlice(\n writeTreeRef: WriteTreeRef,\n completeServerData: Node | null,\n startPost: NamedNode,\n count: number,\n reverse: boolean,\n index: Index\n): NamedNode[] {\n return writeTreeCalcIndexedSlice(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n completeServerData,\n startPost,\n count,\n reverse,\n index\n );\n}\n\n/**\n * Returns a complete child for a given server snap after applying all user writes or null if there is no\n * complete child for this ChildKey.\n */\nexport function writeTreeRefCalcCompleteChild(\n writeTreeRef: WriteTreeRef,\n childKey: string,\n existingServerCache: CacheNode\n): Node | null {\n return writeTreeCalcCompleteChild(\n writeTreeRef.writeTree,\n writeTreeRef.treePath,\n childKey,\n existingServerCache\n );\n}\n\n/**\n * Return a WriteTreeRef for a child.\n */\nexport function writeTreeRefChild(\n writeTreeRef: WriteTreeRef,\n childName: string\n): WriteTreeRef {\n return newWriteTreeRef(\n pathChild(writeTreeRef.treePath, childName),\n writeTreeRef.writeTree\n );\n}\n\nexport function newWriteTreeRef(\n path: Path,\n writeTree: WriteTree\n): WriteTreeRef {\n return {\n treePath: path,\n writeTree\n };\n}\n\n/**\n * A WriteTreeRef wraps a WriteTree and a path, for convenient access to a particular subtree. All of the methods\n * just proxy to the underlying WriteTree.\n *\n */\nexport interface WriteTreeRef {\n /**\n * The path to this particular write tree ref. Used for calling methods on writeTree_ while exposing a simpler\n * interface to callers.\n */\n readonly treePath: Path;\n\n /**\n * * A reference to the actual tree of write data. All methods are pass-through to the tree, but with the appropriate\n * path prefixed.\n *\n * This lets us make cheap references to points in the tree for sync points without having to copy and maintain all of\n * the data.\n */\n readonly writeTree: WriteTree;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, assertionError } from '@firebase/util';\n\nimport {\n Change,\n ChangeType,\n changeChildAdded,\n changeChildChanged,\n changeChildRemoved\n} from './Change';\n\nexport class ChildChangeAccumulator {\n private readonly changeMap: Map = new Map();\n\n trackChildChange(change: Change) {\n const type = change.type;\n const childKey = change.childName!;\n assert(\n type === ChangeType.CHILD_ADDED ||\n type === ChangeType.CHILD_CHANGED ||\n type === ChangeType.CHILD_REMOVED,\n 'Only child changes supported for tracking'\n );\n assert(\n childKey !== '.priority',\n 'Only non-priority child changes can be tracked.'\n );\n const oldChange = this.changeMap.get(childKey);\n if (oldChange) {\n const oldType = oldChange.type;\n if (\n type === ChangeType.CHILD_ADDED &&\n oldType === ChangeType.CHILD_REMOVED\n ) {\n this.changeMap.set(\n childKey,\n changeChildChanged(\n childKey,\n change.snapshotNode,\n oldChange.snapshotNode\n )\n );\n } else if (\n type === ChangeType.CHILD_REMOVED &&\n oldType === ChangeType.CHILD_ADDED\n ) {\n this.changeMap.delete(childKey);\n } else if (\n type === ChangeType.CHILD_REMOVED &&\n oldType === ChangeType.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n changeChildRemoved(childKey, oldChange.oldSnap)\n );\n } else if (\n type === ChangeType.CHILD_CHANGED &&\n oldType === ChangeType.CHILD_ADDED\n ) {\n this.changeMap.set(\n childKey,\n changeChildAdded(childKey, change.snapshotNode)\n );\n } else if (\n type === ChangeType.CHILD_CHANGED &&\n oldType === ChangeType.CHILD_CHANGED\n ) {\n this.changeMap.set(\n childKey,\n changeChildChanged(childKey, change.snapshotNode, oldChange.oldSnap)\n );\n } else {\n throw assertionError(\n 'Illegal combination of changes: ' +\n change +\n ' occurred after ' +\n oldChange\n );\n }\n } else {\n this.changeMap.set(childKey, change);\n }\n }\n\n getChanges(): Change[] {\n return Array.from(this.changeMap.values());\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Index } from '../snap/indexes/Index';\nimport { NamedNode, Node } from '../snap/Node';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteChild,\n writeTreeRefCalcIndexedSlice\n} from '../WriteTree';\n\nimport { CacheNode } from './CacheNode';\nimport { ViewCache, viewCacheGetCompleteServerSnap } from './ViewCache';\n\n/**\n * Since updates to filtered nodes might require nodes to be pulled in from \"outside\" the node, this interface\n * can help to get complete children that can be pulled in.\n * A class implementing this interface takes potentially multiple sources (e.g. user writes, server data from\n * other views etc.) to try it's best to get a complete child that might be useful in pulling into the view.\n *\n * @interface\n */\nexport interface CompleteChildSource {\n getCompleteChild(childKey: string): Node | null;\n\n getChildAfterChild(\n index: Index,\n child: NamedNode,\n reverse: boolean\n ): NamedNode | null;\n}\n\n/**\n * An implementation of CompleteChildSource that never returns any additional children\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport class NoCompleteChildSource_ implements CompleteChildSource {\n getCompleteChild(childKey?: string): Node | null {\n return null;\n }\n getChildAfterChild(\n index?: Index,\n child?: NamedNode,\n reverse?: boolean\n ): NamedNode | null {\n return null;\n }\n}\n\n/**\n * Singleton instance.\n */\nexport const NO_COMPLETE_CHILD_SOURCE = new NoCompleteChildSource_();\n\n/**\n * An implementation of CompleteChildSource that uses a WriteTree in addition to any other server data or\n * old event caches available to calculate complete children.\n */\nexport class WriteTreeCompleteChildSource implements CompleteChildSource {\n constructor(\n private writes_: WriteTreeRef,\n private viewCache_: ViewCache,\n private optCompleteServerCache_: Node | null = null\n ) {}\n getCompleteChild(childKey: string): Node | null {\n const node = this.viewCache_.eventCache;\n if (node.isCompleteForChild(childKey)) {\n return node.getNode().getImmediateChild(childKey);\n } else {\n const serverNode =\n this.optCompleteServerCache_ != null\n ? new CacheNode(this.optCompleteServerCache_, true, false)\n : this.viewCache_.serverCache;\n return writeTreeRefCalcCompleteChild(this.writes_, childKey, serverNode);\n }\n }\n getChildAfterChild(\n index: Index,\n child: NamedNode,\n reverse: boolean\n ): NamedNode | null {\n const completeServerData =\n this.optCompleteServerCache_ != null\n ? this.optCompleteServerCache_\n : viewCacheGetCompleteServerSnap(this.viewCache_);\n const nodes = writeTreeRefCalcIndexedSlice(\n this.writes_,\n completeServerData,\n child,\n 1,\n reverse,\n index\n );\n if (nodes.length === 0) {\n return null;\n } else {\n return nodes[0];\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, assertionError } from '@firebase/util';\n\nimport { AckUserWrite } from '../operation/AckUserWrite';\nimport { Merge } from '../operation/Merge';\nimport { Operation, OperationType } from '../operation/Operation';\nimport { Overwrite } from '../operation/Overwrite';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { KEY_INDEX } from '../snap/indexes/KeyIndex';\nimport { Node } from '../snap/Node';\nimport { ImmutableTree } from '../util/ImmutableTree';\nimport {\n newEmptyPath,\n Path,\n pathChild,\n pathGetBack,\n pathGetFront,\n pathGetLength,\n pathIsEmpty,\n pathParent,\n pathPopFront\n} from '../util/Path';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteChild,\n writeTreeRefCalcCompleteEventCache,\n writeTreeRefCalcCompleteEventChildren,\n writeTreeRefCalcEventCacheAfterServerOverwrite,\n writeTreeRefShadowingWrite\n} from '../WriteTree';\n\nimport { Change, changeValue } from './Change';\nimport { ChildChangeAccumulator } from './ChildChangeAccumulator';\nimport {\n CompleteChildSource,\n NO_COMPLETE_CHILD_SOURCE,\n WriteTreeCompleteChildSource\n} from './CompleteChildSource';\nimport { NodeFilter } from './filter/NodeFilter';\nimport {\n ViewCache,\n viewCacheGetCompleteEventSnap,\n viewCacheGetCompleteServerSnap,\n viewCacheUpdateEventSnap,\n viewCacheUpdateServerSnap\n} from './ViewCache';\n\nexport interface ProcessorResult {\n readonly viewCache: ViewCache;\n readonly changes: Change[];\n}\n\nexport interface ViewProcessor {\n readonly filter: NodeFilter;\n}\n\nexport function newViewProcessor(filter: NodeFilter): ViewProcessor {\n return { filter };\n}\n\nexport function viewProcessorAssertIndexed(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache\n): void {\n assert(\n viewCache.eventCache.getNode().isIndexed(viewProcessor.filter.getIndex()),\n 'Event snap not indexed'\n );\n assert(\n viewCache.serverCache.getNode().isIndexed(viewProcessor.filter.getIndex()),\n 'Server snap not indexed'\n );\n}\n\nexport function viewProcessorApplyOperation(\n viewProcessor: ViewProcessor,\n oldViewCache: ViewCache,\n operation: Operation,\n writesCache: WriteTreeRef,\n completeCache: Node | null\n): ProcessorResult {\n const accumulator = new ChildChangeAccumulator();\n let newViewCache, filterServerNode;\n if (operation.type === OperationType.OVERWRITE) {\n const overwrite = operation as Overwrite;\n if (overwrite.source.fromUser) {\n newViewCache = viewProcessorApplyUserOverwrite(\n viewProcessor,\n oldViewCache,\n overwrite.path,\n overwrite.snap,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n assert(overwrite.source.fromServer, 'Unknown source.');\n // We filter the node if it's a tagged update or the node has been previously filtered and the\n // update is not at the root in which case it is ok (and necessary) to mark the node unfiltered\n // again\n filterServerNode =\n overwrite.source.tagged ||\n (oldViewCache.serverCache.isFiltered() && !pathIsEmpty(overwrite.path));\n newViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\n oldViewCache,\n overwrite.path,\n overwrite.snap,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n } else if (operation.type === OperationType.MERGE) {\n const merge = operation as Merge;\n if (merge.source.fromUser) {\n newViewCache = viewProcessorApplyUserMerge(\n viewProcessor,\n oldViewCache,\n merge.path,\n merge.children,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n assert(merge.source.fromServer, 'Unknown source.');\n // We filter the node if it's a tagged update or the node has been previously filtered\n filterServerNode =\n merge.source.tagged || oldViewCache.serverCache.isFiltered();\n newViewCache = viewProcessorApplyServerMerge(\n viewProcessor,\n oldViewCache,\n merge.path,\n merge.children,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n } else if (operation.type === OperationType.ACK_USER_WRITE) {\n const ackUserWrite = operation as AckUserWrite;\n if (!ackUserWrite.revert) {\n newViewCache = viewProcessorAckUserWrite(\n viewProcessor,\n oldViewCache,\n ackUserWrite.path,\n ackUserWrite.affectedTree,\n writesCache,\n completeCache,\n accumulator\n );\n } else {\n newViewCache = viewProcessorRevertUserWrite(\n viewProcessor,\n oldViewCache,\n ackUserWrite.path,\n writesCache,\n completeCache,\n accumulator\n );\n }\n } else if (operation.type === OperationType.LISTEN_COMPLETE) {\n newViewCache = viewProcessorListenComplete(\n viewProcessor,\n oldViewCache,\n operation.path,\n writesCache,\n accumulator\n );\n } else {\n throw assertionError('Unknown operation type: ' + operation.type);\n }\n const changes = accumulator.getChanges();\n viewProcessorMaybeAddValueEvent(oldViewCache, newViewCache, changes);\n return { viewCache: newViewCache, changes };\n}\n\nfunction viewProcessorMaybeAddValueEvent(\n oldViewCache: ViewCache,\n newViewCache: ViewCache,\n accumulator: Change[]\n): void {\n const eventSnap = newViewCache.eventCache;\n if (eventSnap.isFullyInitialized()) {\n const isLeafOrEmpty =\n eventSnap.getNode().isLeafNode() || eventSnap.getNode().isEmpty();\n const oldCompleteSnap = viewCacheGetCompleteEventSnap(oldViewCache);\n if (\n accumulator.length > 0 ||\n !oldViewCache.eventCache.isFullyInitialized() ||\n (isLeafOrEmpty && !eventSnap.getNode().equals(oldCompleteSnap)) ||\n !eventSnap.getNode().getPriority().equals(oldCompleteSnap.getPriority())\n ) {\n accumulator.push(\n changeValue(viewCacheGetCompleteEventSnap(newViewCache))\n );\n }\n }\n}\n\nfunction viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n changePath: Path,\n writesCache: WriteTreeRef,\n source: CompleteChildSource,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldEventSnap = viewCache.eventCache;\n if (writeTreeRefShadowingWrite(writesCache, changePath) != null) {\n // we have a shadowing write, ignore changes\n return viewCache;\n } else {\n let newEventCache, serverNode;\n if (pathIsEmpty(changePath)) {\n // TODO: figure out how this plays with \"sliding ack windows\"\n assert(\n viewCache.serverCache.isFullyInitialized(),\n 'If change path is empty, we must have complete server data'\n );\n if (viewCache.serverCache.isFiltered()) {\n // We need to special case this, because we need to only apply writes to complete children, or\n // we might end up raising events for incomplete children. If the server data is filtered deep\n // writes cannot be guaranteed to be complete\n const serverCache = viewCacheGetCompleteServerSnap(viewCache);\n const completeChildren =\n serverCache instanceof ChildrenNode\n ? serverCache\n : ChildrenNode.EMPTY_NODE;\n const completeEventChildren = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n completeChildren\n );\n newEventCache = viewProcessor.filter.updateFullNode(\n viewCache.eventCache.getNode(),\n completeEventChildren,\n accumulator\n );\n } else {\n const completeNode = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n newEventCache = viewProcessor.filter.updateFullNode(\n viewCache.eventCache.getNode(),\n completeNode,\n accumulator\n );\n }\n } else {\n const childKey = pathGetFront(changePath);\n if (childKey === '.priority') {\n assert(\n pathGetLength(changePath) === 1,\n \"Can't have a priority with additional path components\"\n );\n const oldEventNode = oldEventSnap.getNode();\n serverNode = viewCache.serverCache.getNode();\n // we might have overwrites for this priority\n const updatedPriority = writeTreeRefCalcEventCacheAfterServerOverwrite(\n writesCache,\n changePath,\n oldEventNode,\n serverNode\n );\n if (updatedPriority != null) {\n newEventCache = viewProcessor.filter.updatePriority(\n oldEventNode,\n updatedPriority\n );\n } else {\n // priority didn't change, keep old node\n newEventCache = oldEventSnap.getNode();\n }\n } else {\n const childChangePath = pathPopFront(changePath);\n // update child\n let newEventChild;\n if (oldEventSnap.isCompleteForChild(childKey)) {\n serverNode = viewCache.serverCache.getNode();\n const eventChildUpdate =\n writeTreeRefCalcEventCacheAfterServerOverwrite(\n writesCache,\n changePath,\n oldEventSnap.getNode(),\n serverNode\n );\n if (eventChildUpdate != null) {\n newEventChild = oldEventSnap\n .getNode()\n .getImmediateChild(childKey)\n .updateChild(childChangePath, eventChildUpdate);\n } else {\n // Nothing changed, just keep the old child\n newEventChild = oldEventSnap.getNode().getImmediateChild(childKey);\n }\n } else {\n newEventChild = writeTreeRefCalcCompleteChild(\n writesCache,\n childKey,\n viewCache.serverCache\n );\n }\n if (newEventChild != null) {\n newEventCache = viewProcessor.filter.updateChild(\n oldEventSnap.getNode(),\n childKey,\n newEventChild,\n childChangePath,\n source,\n accumulator\n );\n } else {\n // no complete child available or no change\n newEventCache = oldEventSnap.getNode();\n }\n }\n }\n return viewCacheUpdateEventSnap(\n viewCache,\n newEventCache,\n oldEventSnap.isFullyInitialized() || pathIsEmpty(changePath),\n viewProcessor.filter.filtersNodes()\n );\n }\n}\n\nfunction viewProcessorApplyServerOverwrite(\n viewProcessor: ViewProcessor,\n oldViewCache: ViewCache,\n changePath: Path,\n changedSnap: Node,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n filterServerNode: boolean,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldServerSnap = oldViewCache.serverCache;\n let newServerCache;\n const serverFilter = filterServerNode\n ? viewProcessor.filter\n : viewProcessor.filter.getIndexedFilter();\n if (pathIsEmpty(changePath)) {\n newServerCache = serverFilter.updateFullNode(\n oldServerSnap.getNode(),\n changedSnap,\n null\n );\n } else if (serverFilter.filtersNodes() && !oldServerSnap.isFiltered()) {\n // we want to filter the server node, but we didn't filter the server node yet, so simulate a full update\n const newServerNode = oldServerSnap\n .getNode()\n .updateChild(changePath, changedSnap);\n newServerCache = serverFilter.updateFullNode(\n oldServerSnap.getNode(),\n newServerNode,\n null\n );\n } else {\n const childKey = pathGetFront(changePath);\n if (\n !oldServerSnap.isCompleteForPath(changePath) &&\n pathGetLength(changePath) > 1\n ) {\n // We don't update incomplete nodes with updates intended for other listeners\n return oldViewCache;\n }\n const childChangePath = pathPopFront(changePath);\n const childNode = oldServerSnap.getNode().getImmediateChild(childKey);\n const newChildNode = childNode.updateChild(childChangePath, changedSnap);\n if (childKey === '.priority') {\n newServerCache = serverFilter.updatePriority(\n oldServerSnap.getNode(),\n newChildNode\n );\n } else {\n newServerCache = serverFilter.updateChild(\n oldServerSnap.getNode(),\n childKey,\n newChildNode,\n childChangePath,\n NO_COMPLETE_CHILD_SOURCE,\n null\n );\n }\n }\n const newViewCache = viewCacheUpdateServerSnap(\n oldViewCache,\n newServerCache,\n oldServerSnap.isFullyInitialized() || pathIsEmpty(changePath),\n serverFilter.filtersNodes()\n );\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n newViewCache,\n completeCache\n );\n return viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor,\n newViewCache,\n changePath,\n writesCache,\n source,\n accumulator\n );\n}\n\nfunction viewProcessorApplyUserOverwrite(\n viewProcessor: ViewProcessor,\n oldViewCache: ViewCache,\n changePath: Path,\n changedSnap: Node,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldEventSnap = oldViewCache.eventCache;\n let newViewCache, newEventCache;\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n oldViewCache,\n completeCache\n );\n if (pathIsEmpty(changePath)) {\n newEventCache = viewProcessor.filter.updateFullNode(\n oldViewCache.eventCache.getNode(),\n changedSnap,\n accumulator\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventCache,\n true,\n viewProcessor.filter.filtersNodes()\n );\n } else {\n const childKey = pathGetFront(changePath);\n if (childKey === '.priority') {\n newEventCache = viewProcessor.filter.updatePriority(\n oldViewCache.eventCache.getNode(),\n changedSnap\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventCache,\n oldEventSnap.isFullyInitialized(),\n oldEventSnap.isFiltered()\n );\n } else {\n const childChangePath = pathPopFront(changePath);\n const oldChild = oldEventSnap.getNode().getImmediateChild(childKey);\n let newChild;\n if (pathIsEmpty(childChangePath)) {\n // Child overwrite, we can replace the child\n newChild = changedSnap;\n } else {\n const childNode = source.getCompleteChild(childKey);\n if (childNode != null) {\n if (\n pathGetBack(childChangePath) === '.priority' &&\n childNode.getChild(pathParent(childChangePath)).isEmpty()\n ) {\n // This is a priority update on an empty node. If this node exists on the server, the\n // server will send down the priority in the update, so ignore for now\n newChild = childNode;\n } else {\n newChild = childNode.updateChild(childChangePath, changedSnap);\n }\n } else {\n // There is no complete child node available\n newChild = ChildrenNode.EMPTY_NODE;\n }\n }\n if (!oldChild.equals(newChild)) {\n const newEventSnap = viewProcessor.filter.updateChild(\n oldEventSnap.getNode(),\n childKey,\n newChild,\n childChangePath,\n source,\n accumulator\n );\n newViewCache = viewCacheUpdateEventSnap(\n oldViewCache,\n newEventSnap,\n oldEventSnap.isFullyInitialized(),\n viewProcessor.filter.filtersNodes()\n );\n } else {\n newViewCache = oldViewCache;\n }\n }\n }\n return newViewCache;\n}\n\nfunction viewProcessorCacheHasChild(\n viewCache: ViewCache,\n childKey: string\n): boolean {\n return viewCache.eventCache.isCompleteForChild(childKey);\n}\n\nfunction viewProcessorApplyUserMerge(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\n // window leaving room for new items. It's important we process these changes first, so we\n // iterate the changes twice, first processing any that affect items currently in view.\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\n // not the other.\n let curViewCache = viewCache;\n changedChildren.foreach((relativePath, childNode) => {\n const writePath = pathChild(path, relativePath);\n if (viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\n curViewCache = viewProcessorApplyUserOverwrite(\n viewProcessor,\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n changedChildren.foreach((relativePath, childNode) => {\n const writePath = pathChild(path, relativePath);\n if (!viewProcessorCacheHasChild(viewCache, pathGetFront(writePath))) {\n curViewCache = viewProcessorApplyUserOverwrite(\n viewProcessor,\n curViewCache,\n writePath,\n childNode,\n writesCache,\n serverCache,\n accumulator\n );\n }\n });\n\n return curViewCache;\n}\n\nfunction viewProcessorApplyMerge(\n viewProcessor: ViewProcessor,\n node: Node,\n merge: ImmutableTree\n): Node {\n merge.foreach((relativePath, childNode) => {\n node = node.updateChild(relativePath, childNode);\n });\n return node;\n}\n\nfunction viewProcessorApplyServerMerge(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n changedChildren: ImmutableTree,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n filterServerNode: boolean,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n // If we don't have a cache yet, this merge was intended for a previously listen in the same location. Ignore it and\n // wait for the complete data update coming soon.\n if (\n viewCache.serverCache.getNode().isEmpty() &&\n !viewCache.serverCache.isFullyInitialized()\n ) {\n return viewCache;\n }\n\n // HACK: In the case of a limit query, there may be some changes that bump things out of the\n // window leaving room for new items. It's important we process these changes first, so we\n // iterate the changes twice, first processing any that affect items currently in view.\n // TODO: I consider an item \"in view\" if cacheHasChild is true, which checks both the server\n // and event snap. I'm not sure if this will result in edge cases when a child is in one but\n // not the other.\n let curViewCache = viewCache;\n let viewMergeTree: ImmutableTree;\n if (pathIsEmpty(path)) {\n viewMergeTree = changedChildren;\n } else {\n viewMergeTree = new ImmutableTree(null).setTree(\n path,\n changedChildren\n );\n }\n const serverNode = viewCache.serverCache.getNode();\n viewMergeTree.children.inorderTraversal((childKey, childTree) => {\n if (serverNode.hasChild(childKey)) {\n const serverChild = viewCache.serverCache\n .getNode()\n .getImmediateChild(childKey);\n const newChild = viewProcessorApplyMerge(\n viewProcessor,\n serverChild,\n childTree\n );\n curViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\n curViewCache,\n new Path(childKey),\n newChild,\n writesCache,\n serverCache,\n filterServerNode,\n accumulator\n );\n }\n });\n viewMergeTree.children.inorderTraversal((childKey, childMergeTree) => {\n const isUnknownDeepMerge =\n !viewCache.serverCache.isCompleteForChild(childKey) &&\n childMergeTree.value === null;\n if (!serverNode.hasChild(childKey) && !isUnknownDeepMerge) {\n const serverChild = viewCache.serverCache\n .getNode()\n .getImmediateChild(childKey);\n const newChild = viewProcessorApplyMerge(\n viewProcessor,\n serverChild,\n childMergeTree\n );\n curViewCache = viewProcessorApplyServerOverwrite(\n viewProcessor,\n curViewCache,\n new Path(childKey),\n newChild,\n writesCache,\n serverCache,\n filterServerNode,\n accumulator\n );\n }\n });\n\n return curViewCache;\n}\n\nfunction viewProcessorAckUserWrite(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n ackPath: Path,\n affectedTree: ImmutableTree,\n writesCache: WriteTreeRef,\n completeCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n if (writeTreeRefShadowingWrite(writesCache, ackPath) != null) {\n return viewCache;\n }\n\n // Only filter server node if it is currently filtered\n const filterServerNode = viewCache.serverCache.isFiltered();\n\n // Essentially we'll just get our existing server cache for the affected paths and re-apply it as a server update\n // now that it won't be shadowed.\n const serverCache = viewCache.serverCache;\n if (affectedTree.value != null) {\n // This is an overwrite.\n if (\n (pathIsEmpty(ackPath) && serverCache.isFullyInitialized()) ||\n serverCache.isCompleteForPath(ackPath)\n ) {\n return viewProcessorApplyServerOverwrite(\n viewProcessor,\n viewCache,\n ackPath,\n serverCache.getNode().getChild(ackPath),\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n } else if (pathIsEmpty(ackPath)) {\n // This is a goofy edge case where we are acking data at this location but don't have full data. We\n // should just re-apply whatever we have in our cache as a merge.\n let changedChildren = new ImmutableTree(null);\n serverCache.getNode().forEachChild(KEY_INDEX, (name, node) => {\n changedChildren = changedChildren.set(new Path(name), node);\n });\n return viewProcessorApplyServerMerge(\n viewProcessor,\n viewCache,\n ackPath,\n changedChildren,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n } else {\n return viewCache;\n }\n } else {\n // This is a merge.\n let changedChildren = new ImmutableTree(null);\n affectedTree.foreach((mergePath, value) => {\n const serverCachePath = pathChild(ackPath, mergePath);\n if (serverCache.isCompleteForPath(serverCachePath)) {\n changedChildren = changedChildren.set(\n mergePath,\n serverCache.getNode().getChild(serverCachePath)\n );\n }\n });\n return viewProcessorApplyServerMerge(\n viewProcessor,\n viewCache,\n ackPath,\n changedChildren,\n writesCache,\n completeCache,\n filterServerNode,\n accumulator\n );\n }\n}\n\nfunction viewProcessorListenComplete(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n const oldServerNode = viewCache.serverCache;\n const newViewCache = viewCacheUpdateServerSnap(\n viewCache,\n oldServerNode.getNode(),\n oldServerNode.isFullyInitialized() || pathIsEmpty(path),\n oldServerNode.isFiltered()\n );\n return viewProcessorGenerateEventCacheAfterServerEvent(\n viewProcessor,\n newViewCache,\n path,\n writesCache,\n NO_COMPLETE_CHILD_SOURCE,\n accumulator\n );\n}\n\nfunction viewProcessorRevertUserWrite(\n viewProcessor: ViewProcessor,\n viewCache: ViewCache,\n path: Path,\n writesCache: WriteTreeRef,\n completeServerCache: Node | null,\n accumulator: ChildChangeAccumulator\n): ViewCache {\n let complete;\n if (writeTreeRefShadowingWrite(writesCache, path) != null) {\n return viewCache;\n } else {\n const source = new WriteTreeCompleteChildSource(\n writesCache,\n viewCache,\n completeServerCache\n );\n const oldEventCache = viewCache.eventCache.getNode();\n let newEventCache;\n if (pathIsEmpty(path) || pathGetFront(path) === '.priority') {\n let newNode;\n if (viewCache.serverCache.isFullyInitialized()) {\n newNode = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n } else {\n const serverChildren = viewCache.serverCache.getNode();\n assert(\n serverChildren instanceof ChildrenNode,\n 'serverChildren would be complete if leaf node'\n );\n newNode = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n serverChildren as ChildrenNode\n );\n }\n newNode = newNode as Node;\n newEventCache = viewProcessor.filter.updateFullNode(\n oldEventCache,\n newNode,\n accumulator\n );\n } else {\n const childKey = pathGetFront(path);\n let newChild = writeTreeRefCalcCompleteChild(\n writesCache,\n childKey,\n viewCache.serverCache\n );\n if (\n newChild == null &&\n viewCache.serverCache.isCompleteForChild(childKey)\n ) {\n newChild = oldEventCache.getImmediateChild(childKey);\n }\n if (newChild != null) {\n newEventCache = viewProcessor.filter.updateChild(\n oldEventCache,\n childKey,\n newChild,\n pathPopFront(path),\n source,\n accumulator\n );\n } else if (viewCache.eventCache.getNode().hasChild(childKey)) {\n // No complete child available, delete the existing one, if any\n newEventCache = viewProcessor.filter.updateChild(\n oldEventCache,\n childKey,\n ChildrenNode.EMPTY_NODE,\n pathPopFront(path),\n source,\n accumulator\n );\n } else {\n newEventCache = oldEventCache;\n }\n if (\n newEventCache.isEmpty() &&\n viewCache.serverCache.isFullyInitialized()\n ) {\n // We might have reverted all child writes. Maybe the old event was a leaf node\n complete = writeTreeRefCalcCompleteEventCache(\n writesCache,\n viewCacheGetCompleteServerSnap(viewCache)\n );\n if (complete.isLeafNode()) {\n newEventCache = viewProcessor.filter.updateFullNode(\n newEventCache,\n complete,\n accumulator\n );\n }\n }\n }\n complete =\n viewCache.serverCache.isFullyInitialized() ||\n writeTreeRefShadowingWrite(writesCache, newEmptyPath()) != null;\n return viewCacheUpdateEventSnap(\n viewCache,\n newEventCache,\n complete,\n viewProcessor.filter.filtersNodes()\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { Operation, OperationType } from '../operation/Operation';\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { Node } from '../snap/Node';\nimport { Path, pathGetFront, pathIsEmpty } from '../util/Path';\nimport { WriteTreeRef } from '../WriteTree';\n\nimport { CacheNode } from './CacheNode';\nimport { Change, changeChildAdded, changeValue } from './Change';\nimport { CancelEvent, Event } from './Event';\nimport {\n EventGenerator,\n eventGeneratorGenerateEventsForChanges\n} from './EventGenerator';\nimport { EventRegistration, QueryContext } from './EventRegistration';\nimport { IndexedFilter } from './filter/IndexedFilter';\nimport { queryParamsGetNodeFilter } from './QueryParams';\nimport {\n newViewCache,\n ViewCache,\n viewCacheGetCompleteEventSnap,\n viewCacheGetCompleteServerSnap\n} from './ViewCache';\nimport {\n newViewProcessor,\n ViewProcessor,\n viewProcessorApplyOperation,\n viewProcessorAssertIndexed\n} from './ViewProcessor';\n\n/**\n * A view represents a specific location and query that has 1 or more event registrations.\n *\n * It does several things:\n * - Maintains the list of event registrations for this location/query.\n * - Maintains a cache of the data visible for this location/query.\n * - Applies new operations (via applyOperation), updates the cache, and based on the event\n * registrations returns the set of events to be raised.\n */\nexport class View {\n processor_: ViewProcessor;\n viewCache_: ViewCache;\n eventRegistrations_: EventRegistration[] = [];\n eventGenerator_: EventGenerator;\n\n constructor(private query_: QueryContext, initialViewCache: ViewCache) {\n const params = this.query_._queryParams;\n\n const indexFilter = new IndexedFilter(params.getIndex());\n const filter = queryParamsGetNodeFilter(params);\n\n this.processor_ = newViewProcessor(filter);\n\n const initialServerCache = initialViewCache.serverCache;\n const initialEventCache = initialViewCache.eventCache;\n\n // Don't filter server node with other filter than index, wait for tagged listen\n const serverSnap = indexFilter.updateFullNode(\n ChildrenNode.EMPTY_NODE,\n initialServerCache.getNode(),\n null\n );\n const eventSnap = filter.updateFullNode(\n ChildrenNode.EMPTY_NODE,\n initialEventCache.getNode(),\n null\n );\n const newServerCache = new CacheNode(\n serverSnap,\n initialServerCache.isFullyInitialized(),\n indexFilter.filtersNodes()\n );\n const newEventCache = new CacheNode(\n eventSnap,\n initialEventCache.isFullyInitialized(),\n filter.filtersNodes()\n );\n\n this.viewCache_ = newViewCache(newEventCache, newServerCache);\n this.eventGenerator_ = new EventGenerator(this.query_);\n }\n\n get query(): QueryContext {\n return this.query_;\n }\n}\n\nexport function viewGetServerCache(view: View): Node | null {\n return view.viewCache_.serverCache.getNode();\n}\n\nexport function viewGetCompleteNode(view: View): Node | null {\n return viewCacheGetCompleteEventSnap(view.viewCache_);\n}\n\nexport function viewGetCompleteServerCache(\n view: View,\n path: Path\n): Node | null {\n const cache = viewCacheGetCompleteServerSnap(view.viewCache_);\n if (cache) {\n // If this isn't a \"loadsAllData\" view, then cache isn't actually a complete cache and\n // we need to see if it contains the child we're interested in.\n if (\n view.query._queryParams.loadsAllData() ||\n (!pathIsEmpty(path) &&\n !cache.getImmediateChild(pathGetFront(path)).isEmpty())\n ) {\n return cache.getChild(path);\n }\n }\n return null;\n}\n\nexport function viewIsEmpty(view: View): boolean {\n return view.eventRegistrations_.length === 0;\n}\n\nexport function viewAddEventRegistration(\n view: View,\n eventRegistration: EventRegistration\n) {\n view.eventRegistrations_.push(eventRegistration);\n}\n\n/**\n * @param eventRegistration - If null, remove all callbacks.\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\n * @returns Cancel events, if cancelError was provided.\n */\nexport function viewRemoveEventRegistration(\n view: View,\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n): Event[] {\n const cancelEvents: CancelEvent[] = [];\n if (cancelError) {\n assert(\n eventRegistration == null,\n 'A cancel should cancel all event registrations.'\n );\n const path = view.query._path;\n view.eventRegistrations_.forEach(registration => {\n const maybeEvent = registration.createCancelEvent(cancelError, path);\n if (maybeEvent) {\n cancelEvents.push(maybeEvent);\n }\n });\n }\n\n if (eventRegistration) {\n let remaining = [];\n for (let i = 0; i < view.eventRegistrations_.length; ++i) {\n const existing = view.eventRegistrations_[i];\n if (!existing.matches(eventRegistration)) {\n remaining.push(existing);\n } else if (eventRegistration.hasAnyCallback()) {\n // We're removing just this one\n remaining = remaining.concat(view.eventRegistrations_.slice(i + 1));\n break;\n }\n }\n view.eventRegistrations_ = remaining;\n } else {\n view.eventRegistrations_ = [];\n }\n return cancelEvents;\n}\n\n/**\n * Applies the given Operation, updates our cache, and returns the appropriate events.\n */\nexport function viewApplyOperation(\n view: View,\n operation: Operation,\n writesCache: WriteTreeRef,\n completeServerCache: Node | null\n): Event[] {\n if (\n operation.type === OperationType.MERGE &&\n operation.source.queryId !== null\n ) {\n assert(\n viewCacheGetCompleteServerSnap(view.viewCache_),\n 'We should always have a full cache before handling merges'\n );\n assert(\n viewCacheGetCompleteEventSnap(view.viewCache_),\n 'Missing event cache, even though we have a server cache'\n );\n }\n\n const oldViewCache = view.viewCache_;\n const result = viewProcessorApplyOperation(\n view.processor_,\n oldViewCache,\n operation,\n writesCache,\n completeServerCache\n );\n viewProcessorAssertIndexed(view.processor_, result.viewCache);\n\n assert(\n result.viewCache.serverCache.isFullyInitialized() ||\n !oldViewCache.serverCache.isFullyInitialized(),\n 'Once a server snap is complete, it should never go back'\n );\n\n view.viewCache_ = result.viewCache;\n\n return viewGenerateEventsForChanges_(\n view,\n result.changes,\n result.viewCache.eventCache.getNode(),\n null\n );\n}\n\nexport function viewGetInitialEvents(\n view: View,\n registration: EventRegistration\n): Event[] {\n const eventSnap = view.viewCache_.eventCache;\n const initialChanges: Change[] = [];\n if (!eventSnap.getNode().isLeafNode()) {\n const eventNode = eventSnap.getNode() as ChildrenNode;\n eventNode.forEachChild(PRIORITY_INDEX, (key, childNode) => {\n initialChanges.push(changeChildAdded(key, childNode));\n });\n }\n if (eventSnap.isFullyInitialized()) {\n initialChanges.push(changeValue(eventSnap.getNode()));\n }\n return viewGenerateEventsForChanges_(\n view,\n initialChanges,\n eventSnap.getNode(),\n registration\n );\n}\n\nfunction viewGenerateEventsForChanges_(\n view: View,\n changes: Change[],\n eventCache: Node,\n eventRegistration?: EventRegistration\n): Event[] {\n const registrations = eventRegistration\n ? [eventRegistration]\n : view.eventRegistrations_;\n return eventGeneratorGenerateEventsForChanges(\n view.eventGenerator_,\n changes,\n eventCache,\n registrations\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ReferenceConstructor } from '../api/Reference';\n\nimport { Operation } from './operation/Operation';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { Path } from './util/Path';\nimport { CacheNode } from './view/CacheNode';\nimport { Event } from './view/Event';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\nimport {\n View,\n viewAddEventRegistration,\n viewApplyOperation,\n viewGetCompleteServerCache,\n viewGetInitialEvents,\n viewIsEmpty,\n viewRemoveEventRegistration\n} from './view/View';\nimport { newViewCache } from './view/ViewCache';\nimport {\n WriteTreeRef,\n writeTreeRefCalcCompleteEventCache,\n writeTreeRefCalcCompleteEventChildren\n} from './WriteTree';\n\nlet referenceConstructor: ReferenceConstructor;\n\n/**\n * SyncPoint represents a single location in a SyncTree with 1 or more event registrations, meaning we need to\n * maintain 1 or more Views at this location to cache server data and raise appropriate events for server changes\n * and user writes (set, transaction, update).\n *\n * It's responsible for:\n * - Maintaining the set of 1 or more views necessary at this location (a SyncPoint with 0 views should be removed).\n * - Proxying user / server operations to the views as appropriate (i.e. applyServerOverwrite,\n * applyUserOverwrite, etc.)\n */\nexport class SyncPoint {\n /**\n * The Views being tracked at this location in the tree, stored as a map where the key is a\n * queryId and the value is the View for that query.\n *\n * NOTE: This list will be quite small (usually 1, but perhaps 2 or 3; any more is an odd use case).\n */\n readonly views: Map = new Map();\n}\n\nexport function syncPointSetReferenceConstructor(\n val: ReferenceConstructor\n): void {\n assert(\n !referenceConstructor,\n '__referenceConstructor has already been defined'\n );\n referenceConstructor = val;\n}\n\nfunction syncPointGetReferenceConstructor(): ReferenceConstructor {\n assert(referenceConstructor, 'Reference.ts has not been loaded');\n return referenceConstructor;\n}\n\nexport function syncPointIsEmpty(syncPoint: SyncPoint): boolean {\n return syncPoint.views.size === 0;\n}\n\nexport function syncPointApplyOperation(\n syncPoint: SyncPoint,\n operation: Operation,\n writesCache: WriteTreeRef,\n optCompleteServerCache: Node | null\n): Event[] {\n const queryId = operation.source.queryId;\n if (queryId !== null) {\n const view = syncPoint.views.get(queryId);\n assert(view != null, 'SyncTree gave us an op for an invalid query.');\n return viewApplyOperation(\n view,\n operation,\n writesCache,\n optCompleteServerCache\n );\n } else {\n let events: Event[] = [];\n\n for (const view of syncPoint.views.values()) {\n events = events.concat(\n viewApplyOperation(view, operation, writesCache, optCompleteServerCache)\n );\n }\n\n return events;\n }\n}\n\n/**\n * Get a view for the specified query.\n *\n * @param query - The query to return a view for\n * @param writesCache\n * @param serverCache\n * @param serverCacheComplete\n * @returns Events to raise.\n */\nexport function syncPointGetView(\n syncPoint: SyncPoint,\n query: QueryContext,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n serverCacheComplete: boolean\n): View {\n const queryId = query._queryIdentifier;\n const view = syncPoint.views.get(queryId);\n if (!view) {\n // TODO: make writesCache take flag for complete server node\n let eventCache = writeTreeRefCalcCompleteEventCache(\n writesCache,\n serverCacheComplete ? serverCache : null\n );\n let eventCacheComplete = false;\n if (eventCache) {\n eventCacheComplete = true;\n } else if (serverCache instanceof ChildrenNode) {\n eventCache = writeTreeRefCalcCompleteEventChildren(\n writesCache,\n serverCache\n );\n eventCacheComplete = false;\n } else {\n eventCache = ChildrenNode.EMPTY_NODE;\n eventCacheComplete = false;\n }\n const viewCache = newViewCache(\n new CacheNode(eventCache, eventCacheComplete, false),\n new CacheNode(serverCache, serverCacheComplete, false)\n );\n return new View(query, viewCache);\n }\n return view;\n}\n\n/**\n * Add an event callback for the specified query.\n *\n * @param query\n * @param eventRegistration\n * @param writesCache\n * @param serverCache - Complete server cache, if we have it.\n * @param serverCacheComplete\n * @returns Events to raise.\n */\nexport function syncPointAddEventRegistration(\n syncPoint: SyncPoint,\n query: QueryContext,\n eventRegistration: EventRegistration,\n writesCache: WriteTreeRef,\n serverCache: Node | null,\n serverCacheComplete: boolean\n): Event[] {\n const view = syncPointGetView(\n syncPoint,\n query,\n writesCache,\n serverCache,\n serverCacheComplete\n );\n if (!syncPoint.views.has(query._queryIdentifier)) {\n syncPoint.views.set(query._queryIdentifier, view);\n }\n // This is guaranteed to exist now, we just created anything that was missing\n viewAddEventRegistration(view, eventRegistration);\n return viewGetInitialEvents(view, eventRegistration);\n}\n\n/**\n * Remove event callback(s). Return cancelEvents if a cancelError is specified.\n *\n * If query is the default query, we'll check all views for the specified eventRegistration.\n * If eventRegistration is null, we'll remove all callbacks for the specified view(s).\n *\n * @param eventRegistration - If null, remove all callbacks.\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\n * @returns removed queries and any cancel events\n */\nexport function syncPointRemoveEventRegistration(\n syncPoint: SyncPoint,\n query: QueryContext,\n eventRegistration: EventRegistration | null,\n cancelError?: Error\n): { removed: QueryContext[]; events: Event[] } {\n const queryId = query._queryIdentifier;\n const removed: QueryContext[] = [];\n let cancelEvents: Event[] = [];\n const hadCompleteView = syncPointHasCompleteView(syncPoint);\n if (queryId === 'default') {\n // When you do ref.off(...), we search all views for the registration to remove.\n for (const [viewQueryId, view] of syncPoint.views.entries()) {\n cancelEvents = cancelEvents.concat(\n viewRemoveEventRegistration(view, eventRegistration, cancelError)\n );\n if (viewIsEmpty(view)) {\n syncPoint.views.delete(viewQueryId);\n\n // We'll deal with complete views later.\n if (!view.query._queryParams.loadsAllData()) {\n removed.push(view.query);\n }\n }\n }\n } else {\n // remove the callback from the specific view.\n const view = syncPoint.views.get(queryId);\n if (view) {\n cancelEvents = cancelEvents.concat(\n viewRemoveEventRegistration(view, eventRegistration, cancelError)\n );\n if (viewIsEmpty(view)) {\n syncPoint.views.delete(queryId);\n\n // We'll deal with complete views later.\n if (!view.query._queryParams.loadsAllData()) {\n removed.push(view.query);\n }\n }\n }\n }\n\n if (hadCompleteView && !syncPointHasCompleteView(syncPoint)) {\n // We removed our last complete view.\n removed.push(\n new (syncPointGetReferenceConstructor())(query._repo, query._path)\n );\n }\n\n return { removed, events: cancelEvents };\n}\n\nexport function syncPointGetQueryViews(syncPoint: SyncPoint): View[] {\n const result = [];\n for (const view of syncPoint.views.values()) {\n if (!view.query._queryParams.loadsAllData()) {\n result.push(view);\n }\n }\n return result;\n}\n\n/**\n * @param path - The path to the desired complete snapshot\n * @returns A complete cache, if it exists\n */\nexport function syncPointGetCompleteServerCache(\n syncPoint: SyncPoint,\n path: Path\n): Node | null {\n let serverCache: Node | null = null;\n for (const view of syncPoint.views.values()) {\n serverCache = serverCache || viewGetCompleteServerCache(view, path);\n }\n return serverCache;\n}\n\nexport function syncPointViewForQuery(\n syncPoint: SyncPoint,\n query: QueryContext\n): View | null {\n const params = query._queryParams;\n if (params.loadsAllData()) {\n return syncPointGetCompleteView(syncPoint);\n } else {\n const queryId = query._queryIdentifier;\n return syncPoint.views.get(queryId);\n }\n}\n\nexport function syncPointViewExistsForQuery(\n syncPoint: SyncPoint,\n query: QueryContext\n): boolean {\n return syncPointViewForQuery(syncPoint, query) != null;\n}\n\nexport function syncPointHasCompleteView(syncPoint: SyncPoint): boolean {\n return syncPointGetCompleteView(syncPoint) != null;\n}\n\nexport function syncPointGetCompleteView(syncPoint: SyncPoint): View | null {\n for (const view of syncPoint.views.values()) {\n if (view.query._queryParams.loadsAllData()) {\n return view;\n }\n }\n return null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ReferenceConstructor } from '../api/Reference';\n\nimport { AckUserWrite } from './operation/AckUserWrite';\nimport { ListenComplete } from './operation/ListenComplete';\nimport { Merge } from './operation/Merge';\nimport {\n newOperationSourceServer,\n newOperationSourceServerTaggedQuery,\n newOperationSourceUser,\n Operation\n} from './operation/Operation';\nimport { Overwrite } from './operation/Overwrite';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport {\n SyncPoint,\n syncPointAddEventRegistration,\n syncPointApplyOperation,\n syncPointGetCompleteServerCache,\n syncPointGetCompleteView,\n syncPointGetQueryViews,\n syncPointGetView,\n syncPointHasCompleteView,\n syncPointIsEmpty,\n syncPointRemoveEventRegistration,\n syncPointViewExistsForQuery,\n syncPointViewForQuery\n} from './SyncPoint';\nimport { ImmutableTree } from './util/ImmutableTree';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathGetFront,\n pathIsEmpty\n} from './util/Path';\nimport { each, errorForServerCode } from './util/util';\nimport { CacheNode } from './view/CacheNode';\nimport { Event } from './view/Event';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\nimport { View, viewGetCompleteNode, viewGetServerCache } from './view/View';\nimport {\n newWriteTree,\n WriteTree,\n writeTreeAddMerge,\n writeTreeAddOverwrite,\n writeTreeCalcCompleteEventCache,\n writeTreeChildWrites,\n writeTreeGetWrite,\n WriteTreeRef,\n writeTreeRefChild,\n writeTreeRemoveWrite\n} from './WriteTree';\n\nlet referenceConstructor: ReferenceConstructor;\n\nexport function syncTreeSetReferenceConstructor(\n val: ReferenceConstructor\n): void {\n assert(\n !referenceConstructor,\n '__referenceConstructor has already been defined'\n );\n referenceConstructor = val;\n}\n\nfunction syncTreeGetReferenceConstructor(): ReferenceConstructor {\n assert(referenceConstructor, 'Reference.ts has not been loaded');\n return referenceConstructor;\n}\n\nexport interface ListenProvider {\n startListening(\n query: QueryContext,\n tag: number | null,\n hashFn: () => string,\n onComplete: (a: string, b?: unknown) => Event[]\n ): Event[];\n\n stopListening(a: QueryContext, b: number | null): void;\n}\n\n/**\n * Static tracker for next query tag.\n */\nlet syncTreeNextQueryTag_ = 1;\n\nexport function resetSyncTreeTag() {\n syncTreeNextQueryTag_ = 1;\n}\n\n/**\n * SyncTree is the central class for managing event callback registration, data caching, views\n * (query processing), and event generation. There are typically two SyncTree instances for\n * each Repo, one for the normal Firebase data, and one for the .info data.\n *\n * It has a number of responsibilities, including:\n * - Tracking all user event callbacks (registered via addEventRegistration() and removeEventRegistration()).\n * - Applying and caching data changes for user set(), transaction(), and update() calls\n * (applyUserOverwrite(), applyUserMerge()).\n * - Applying and caching data changes for server data changes (applyServerOverwrite(),\n * applyServerMerge()).\n * - Generating user-facing events for server and user changes (all of the apply* methods\n * return the set of events that need to be raised as a result).\n * - Maintaining the appropriate set of server listens to ensure we are always subscribed\n * to the correct set of paths and queries to satisfy the current set of user event\n * callbacks (listens are started/stopped using the provided listenProvider).\n *\n * NOTE: Although SyncTree tracks event callbacks and calculates events to raise, the actual\n * events are returned to the caller rather than raised synchronously.\n *\n */\nexport class SyncTree {\n /**\n * Tree of SyncPoints. There's a SyncPoint at any location that has 1 or more views.\n */\n syncPointTree_: ImmutableTree = new ImmutableTree(null);\n\n /**\n * A tree of all pending user writes (user-initiated set()'s, transaction()'s, update()'s, etc.).\n */\n pendingWriteTree_: WriteTree = newWriteTree();\n\n readonly tagToQueryMap: Map = new Map();\n readonly queryToTagMap: Map = new Map();\n\n /**\n * @param listenProvider_ - Used by SyncTree to start / stop listening\n * to server data.\n */\n constructor(public listenProvider_: ListenProvider) {}\n}\n\n/**\n * Apply the data changes for a user-generated set() or transaction() call.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyUserOverwrite(\n syncTree: SyncTree,\n path: Path,\n newData: Node,\n writeId: number,\n visible?: boolean\n): Event[] {\n // Record pending write.\n writeTreeAddOverwrite(\n syncTree.pendingWriteTree_,\n path,\n newData,\n writeId,\n visible\n );\n\n if (!visible) {\n return [];\n } else {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Overwrite(newOperationSourceUser(), path, newData)\n );\n }\n}\n\n/**\n * Apply the data from a user-generated update() call\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyUserMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n writeId: number\n): Event[] {\n // Record pending merge.\n writeTreeAddMerge(syncTree.pendingWriteTree_, path, changedChildren, writeId);\n\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Merge(newOperationSourceUser(), path, changeTree)\n );\n}\n\n/**\n * Acknowledge a pending user write that was previously registered with applyUserOverwrite() or applyUserMerge().\n *\n * @param revert - True if the given write failed and needs to be reverted\n * @returns Events to raise.\n */\nexport function syncTreeAckUserWrite(\n syncTree: SyncTree,\n writeId: number,\n revert: boolean = false\n) {\n const write = writeTreeGetWrite(syncTree.pendingWriteTree_, writeId);\n const needToReevaluate = writeTreeRemoveWrite(\n syncTree.pendingWriteTree_,\n writeId\n );\n if (!needToReevaluate) {\n return [];\n } else {\n let affectedTree = new ImmutableTree(null);\n if (write.snap != null) {\n // overwrite\n affectedTree = affectedTree.set(newEmptyPath(), true);\n } else {\n each(write.children, (pathString: string) => {\n affectedTree = affectedTree.set(new Path(pathString), true);\n });\n }\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new AckUserWrite(write.path, affectedTree, revert)\n );\n }\n}\n\n/**\n * Apply new server data for the specified path..\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyServerOverwrite(\n syncTree: SyncTree,\n path: Path,\n newData: Node\n): Event[] {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Overwrite(newOperationSourceServer(), path, newData)\n );\n}\n\n/**\n * Apply new server data to be merged in at the specified path.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyServerMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node }\n): Event[] {\n const changeTree = ImmutableTree.fromObject(changedChildren);\n\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new Merge(newOperationSourceServer(), path, changeTree)\n );\n}\n\n/**\n * Apply a listen complete for a query\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyListenComplete(\n syncTree: SyncTree,\n path: Path\n): Event[] {\n return syncTreeApplyOperationToSyncPoints_(\n syncTree,\n new ListenComplete(newOperationSourceServer(), path)\n );\n}\n\n/**\n * Apply a listen complete for a tagged query\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedListenComplete(\n syncTree: SyncTree,\n path: Path,\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const op = new ListenComplete(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath\n );\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\n } else {\n // We've already removed the query. No big deal, ignore the update\n return [];\n }\n}\n\n/**\n * Remove event callback(s).\n *\n * If query is the default query, we'll check all queries for the specified eventRegistration.\n * If eventRegistration is null, we'll remove all callbacks for the specified query/queries.\n *\n * @param eventRegistration - If null, all callbacks are removed.\n * @param cancelError - If a cancelError is provided, appropriate cancel events will be returned.\n * @param skipListenerDedup - When performing a `get()`, we don't add any new listeners, so no\n * deduping needs to take place. This flag allows toggling of that behavior\n * @returns Cancel events, if cancelError was provided.\n */\nexport function syncTreeRemoveEventRegistration(\n syncTree: SyncTree,\n query: QueryContext,\n eventRegistration: EventRegistration | null,\n cancelError?: Error,\n skipListenerDedup = false\n): Event[] {\n // Find the syncPoint first. Then deal with whether or not it has matching listeners\n const path = query._path;\n const maybeSyncPoint = syncTree.syncPointTree_.get(path);\n let cancelEvents: Event[] = [];\n // A removal on a default query affects all queries at that location. A removal on an indexed query, even one without\n // other query constraints, does *not* affect all queries at that location. So this check must be for 'default', and\n // not loadsAllData().\n if (\n maybeSyncPoint &&\n (query._queryIdentifier === 'default' ||\n syncPointViewExistsForQuery(maybeSyncPoint, query))\n ) {\n const removedAndEvents = syncPointRemoveEventRegistration(\n maybeSyncPoint,\n query,\n eventRegistration,\n cancelError\n );\n if (syncPointIsEmpty(maybeSyncPoint)) {\n syncTree.syncPointTree_ = syncTree.syncPointTree_.remove(path);\n }\n\n const removed = removedAndEvents.removed;\n cancelEvents = removedAndEvents.events;\n\n if (!skipListenerDedup) {\n /**\n * We may have just removed one of many listeners and can short-circuit this whole process\n * We may also not have removed a default listener, in which case all of the descendant listeners should already be\n * properly set up.\n */\n\n // Since indexed queries can shadow if they don't have other query constraints, check for loadsAllData(), instead of\n // queryId === 'default'\n const removingDefault =\n -1 !==\n removed.findIndex(query => {\n return query._queryParams.loadsAllData();\n });\n const covered = syncTree.syncPointTree_.findOnPath(\n path,\n (relativePath, parentSyncPoint) =>\n syncPointHasCompleteView(parentSyncPoint)\n );\n\n if (removingDefault && !covered) {\n const subtree = syncTree.syncPointTree_.subtree(path);\n // There are potentially child listeners. Determine what if any listens we need to send before executing the\n // removal\n if (!subtree.isEmpty()) {\n // We need to fold over our subtree and collect the listeners to send\n const newViews = syncTreeCollectDistinctViewsForSubTree_(subtree);\n\n // Ok, we've collected all the listens we need. Set them up.\n for (let i = 0; i < newViews.length; ++i) {\n const view = newViews[i],\n newQuery = view.query;\n const listener = syncTreeCreateListenerForView_(syncTree, view);\n syncTree.listenProvider_.startListening(\n syncTreeQueryForListening_(newQuery),\n syncTreeTagForQuery(syncTree, newQuery),\n listener.hashFn,\n listener.onComplete\n );\n }\n }\n // Otherwise there's nothing below us, so nothing we need to start listening on\n }\n // If we removed anything and we're not covered by a higher up listen, we need to stop listening on this query\n // The above block has us covered in terms of making sure we're set up on listens lower in the tree.\n // Also, note that if we have a cancelError, it's already been removed at the provider level.\n if (!covered && removed.length > 0 && !cancelError) {\n // If we removed a default, then we weren't listening on any of the other queries here. Just cancel the one\n // default. Otherwise, we need to iterate through and cancel each individual query\n if (removingDefault) {\n // We don't tag default listeners\n const defaultTag: number | null = null;\n syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(query),\n defaultTag\n );\n } else {\n removed.forEach((queryToRemove: QueryContext) => {\n const tagToRemove = syncTree.queryToTagMap.get(\n syncTreeMakeQueryKey_(queryToRemove)\n );\n syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(queryToRemove),\n tagToRemove\n );\n });\n }\n }\n }\n // Now, clear all of the tags we're tracking for the removed listens\n syncTreeRemoveTags_(syncTree, removed);\n } else {\n // No-op, this listener must've been already removed\n }\n return cancelEvents;\n}\n\n/**\n * Apply new server data for the specified tagged query.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedQueryOverwrite(\n syncTree: SyncTree,\n path: Path,\n snap: Node,\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey != null) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const op = new Overwrite(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath,\n snap\n );\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\n } else {\n // Query must have been removed already\n return [];\n }\n}\n\n/**\n * Apply server data to be merged in for the specified tagged query.\n *\n * @returns Events to raise.\n */\nexport function syncTreeApplyTaggedQueryMerge(\n syncTree: SyncTree,\n path: Path,\n changedChildren: { [k: string]: Node },\n tag: number\n): Event[] {\n const queryKey = syncTreeQueryKeyForTag_(syncTree, tag);\n if (queryKey) {\n const r = syncTreeParseQueryKey_(queryKey);\n const queryPath = r.path,\n queryId = r.queryId;\n const relativePath = newRelativePath(queryPath, path);\n const changeTree = ImmutableTree.fromObject(changedChildren);\n const op = new Merge(\n newOperationSourceServerTaggedQuery(queryId),\n relativePath,\n changeTree\n );\n return syncTreeApplyTaggedOperation_(syncTree, queryPath, op);\n } else {\n // We've already removed the query. No big deal, ignore the update\n return [];\n }\n}\n\n/**\n * Add an event callback for the specified query.\n *\n * @returns Events to raise.\n */\nexport function syncTreeAddEventRegistration(\n syncTree: SyncTree,\n query: QueryContext,\n eventRegistration: EventRegistration,\n skipSetupListener = false\n): Event[] {\n const path = query._path;\n\n let serverCache: Node | null = null;\n let foundAncestorDefaultView = false;\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\n syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\n const relativePath = newRelativePath(pathToSyncPoint, path);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\n foundAncestorDefaultView =\n foundAncestorDefaultView || syncPointHasCompleteView(sp);\n });\n let syncPoint = syncTree.syncPointTree_.get(path);\n if (!syncPoint) {\n syncPoint = new SyncPoint();\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\n } else {\n foundAncestorDefaultView =\n foundAncestorDefaultView || syncPointHasCompleteView(syncPoint);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n\n let serverCacheComplete;\n if (serverCache != null) {\n serverCacheComplete = true;\n } else {\n serverCacheComplete = false;\n serverCache = ChildrenNode.EMPTY_NODE;\n const subtree = syncTree.syncPointTree_.subtree(path);\n subtree.foreachChild((childName, childSyncPoint) => {\n const completeCache = syncPointGetCompleteServerCache(\n childSyncPoint,\n newEmptyPath()\n );\n if (completeCache) {\n serverCache = serverCache.updateImmediateChild(\n childName,\n completeCache\n );\n }\n });\n }\n\n const viewAlreadyExists = syncPointViewExistsForQuery(syncPoint, query);\n if (!viewAlreadyExists && !query._queryParams.loadsAllData()) {\n // We need to track a tag for this query\n const queryKey = syncTreeMakeQueryKey_(query);\n assert(\n !syncTree.queryToTagMap.has(queryKey),\n 'View does not exist, but we have a tag'\n );\n const tag = syncTreeGetNextQueryTag_();\n syncTree.queryToTagMap.set(queryKey, tag);\n syncTree.tagToQueryMap.set(tag, queryKey);\n }\n const writesCache = writeTreeChildWrites(syncTree.pendingWriteTree_, path);\n let events = syncPointAddEventRegistration(\n syncPoint,\n query,\n eventRegistration,\n writesCache,\n serverCache,\n serverCacheComplete\n );\n if (!viewAlreadyExists && !foundAncestorDefaultView && !skipSetupListener) {\n const view = syncPointViewForQuery(syncPoint, query);\n events = events.concat(syncTreeSetupListener_(syncTree, query, view));\n }\n return events;\n}\n\n/**\n * Returns a complete cache, if we have one, of the data at a particular path. If the location does not have a\n * listener above it, we will get a false \"null\". This shouldn't be a problem because transactions will always\n * have a listener above, and atomic operations would correctly show a jitter of ->\n * as the write is applied locally and then acknowledged at the server.\n *\n * Note: this method will *include* hidden writes from transaction with applyLocally set to false.\n *\n * @param path - The path to the data we want\n * @param writeIdsToExclude - A specific set to be excluded\n */\nexport function syncTreeCalcCompleteEventCache(\n syncTree: SyncTree,\n path: Path,\n writeIdsToExclude?: number[]\n): Node {\n const includeHiddenSets = true;\n const writeTree = syncTree.pendingWriteTree_;\n const serverCache = syncTree.syncPointTree_.findOnPath(\n path,\n (pathSoFar, syncPoint) => {\n const relativePath = newRelativePath(pathSoFar, path);\n const serverCache = syncPointGetCompleteServerCache(\n syncPoint,\n relativePath\n );\n if (serverCache) {\n return serverCache;\n }\n }\n );\n return writeTreeCalcCompleteEventCache(\n writeTree,\n path,\n serverCache,\n writeIdsToExclude,\n includeHiddenSets\n );\n}\n\nexport function syncTreeGetServerValue(\n syncTree: SyncTree,\n query: QueryContext\n): Node | null {\n const path = query._path;\n let serverCache: Node | null = null;\n // Any covering writes will necessarily be at the root, so really all we need to find is the server cache.\n // Consider optimizing this once there's a better understanding of what actual behavior will be.\n syncTree.syncPointTree_.foreachOnPath(path, (pathToSyncPoint, sp) => {\n const relativePath = newRelativePath(pathToSyncPoint, path);\n serverCache =\n serverCache || syncPointGetCompleteServerCache(sp, relativePath);\n });\n let syncPoint = syncTree.syncPointTree_.get(path);\n if (!syncPoint) {\n syncPoint = new SyncPoint();\n syncTree.syncPointTree_ = syncTree.syncPointTree_.set(path, syncPoint);\n } else {\n serverCache =\n serverCache || syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n const serverCacheComplete = serverCache != null;\n const serverCacheNode: CacheNode | null = serverCacheComplete\n ? new CacheNode(serverCache, true, false)\n : null;\n const writesCache: WriteTreeRef | null = writeTreeChildWrites(\n syncTree.pendingWriteTree_,\n query._path\n );\n const view: View = syncPointGetView(\n syncPoint,\n query,\n writesCache,\n serverCacheComplete ? serverCacheNode.getNode() : ChildrenNode.EMPTY_NODE,\n serverCacheComplete\n );\n return viewGetCompleteNode(view);\n}\n\n/**\n * A helper method that visits all descendant and ancestor SyncPoints, applying the operation.\n *\n * NOTES:\n * - Descendant SyncPoints will be visited first (since we raise events depth-first).\n *\n * - We call applyOperation() on each SyncPoint passing three things:\n * 1. A version of the Operation that has been made relative to the SyncPoint location.\n * 2. A WriteTreeRef of any writes we have cached at the SyncPoint location.\n * 3. A snapshot Node with cached server data, if we have it.\n *\n * - We concatenate all of the events returned by each SyncPoint and return the result.\n */\nfunction syncTreeApplyOperationToSyncPoints_(\n syncTree: SyncTree,\n operation: Operation\n): Event[] {\n return syncTreeApplyOperationHelper_(\n operation,\n syncTree.syncPointTree_,\n /*serverCache=*/ null,\n writeTreeChildWrites(syncTree.pendingWriteTree_, newEmptyPath())\n );\n}\n\n/**\n * Recursive helper for applyOperationToSyncPoints_\n */\nfunction syncTreeApplyOperationHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n): Event[] {\n if (pathIsEmpty(operation.path)) {\n return syncTreeApplyOperationDescendantsHelper_(\n operation,\n syncPointTree,\n serverCache,\n writesCache\n );\n } else {\n const syncPoint = syncPointTree.get(newEmptyPath());\n\n // If we don't have cached server data, see if we can get it from this SyncPoint.\n if (serverCache == null && syncPoint != null) {\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n\n let events: Event[] = [];\n const childName = pathGetFront(operation.path);\n const childOperation = operation.operationForChild(childName);\n const childTree = syncPointTree.children.get(childName);\n if (childTree && childOperation) {\n const childServerCache = serverCache\n ? serverCache.getImmediateChild(childName)\n : null;\n const childWritesCache = writeTreeRefChild(writesCache, childName);\n events = events.concat(\n syncTreeApplyOperationHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n\n if (syncPoint) {\n events = events.concat(\n syncPointApplyOperation(syncPoint, operation, writesCache, serverCache)\n );\n }\n\n return events;\n }\n}\n\n/**\n * Recursive helper for applyOperationToSyncPoints_\n */\nfunction syncTreeApplyOperationDescendantsHelper_(\n operation: Operation,\n syncPointTree: ImmutableTree,\n serverCache: Node | null,\n writesCache: WriteTreeRef\n): Event[] {\n const syncPoint = syncPointTree.get(newEmptyPath());\n\n // If we don't have cached server data, see if we can get it from this SyncPoint.\n if (serverCache == null && syncPoint != null) {\n serverCache = syncPointGetCompleteServerCache(syncPoint, newEmptyPath());\n }\n\n let events: Event[] = [];\n syncPointTree.children.inorderTraversal((childName, childTree) => {\n const childServerCache = serverCache\n ? serverCache.getImmediateChild(childName)\n : null;\n const childWritesCache = writeTreeRefChild(writesCache, childName);\n const childOperation = operation.operationForChild(childName);\n if (childOperation) {\n events = events.concat(\n syncTreeApplyOperationDescendantsHelper_(\n childOperation,\n childTree,\n childServerCache,\n childWritesCache\n )\n );\n }\n });\n\n if (syncPoint) {\n events = events.concat(\n syncPointApplyOperation(syncPoint, operation, writesCache, serverCache)\n );\n }\n\n return events;\n}\n\nfunction syncTreeCreateListenerForView_(\n syncTree: SyncTree,\n view: View\n): { hashFn(): string; onComplete(a: string, b?: unknown): Event[] } {\n const query = view.query;\n const tag = syncTreeTagForQuery(syncTree, query);\n\n return {\n hashFn: () => {\n const cache = viewGetServerCache(view) || ChildrenNode.EMPTY_NODE;\n return cache.hash();\n },\n onComplete: (status: string): Event[] => {\n if (status === 'ok') {\n if (tag) {\n return syncTreeApplyTaggedListenComplete(syncTree, query._path, tag);\n } else {\n return syncTreeApplyListenComplete(syncTree, query._path);\n }\n } else {\n // If a listen failed, kill all of the listeners here, not just the one that triggered the error.\n // Note that this may need to be scoped to just this listener if we change permissions on filtered children\n const error = errorForServerCode(status, query);\n return syncTreeRemoveEventRegistration(\n syncTree,\n query,\n /*eventRegistration*/ null,\n error\n );\n }\n }\n };\n}\n\n/**\n * Return the tag associated with the given query.\n */\nexport function syncTreeTagForQuery(\n syncTree: SyncTree,\n query: QueryContext\n): number | null {\n const queryKey = syncTreeMakeQueryKey_(query);\n return syncTree.queryToTagMap.get(queryKey);\n}\n\n/**\n * Given a query, computes a \"queryKey\" suitable for use in our queryToTagMap_.\n */\nfunction syncTreeMakeQueryKey_(query: QueryContext): string {\n return query._path.toString() + '$' + query._queryIdentifier;\n}\n\n/**\n * Return the query associated with the given tag, if we have one\n */\nfunction syncTreeQueryKeyForTag_(\n syncTree: SyncTree,\n tag: number\n): string | null {\n return syncTree.tagToQueryMap.get(tag);\n}\n\n/**\n * Given a queryKey (created by makeQueryKey), parse it back into a path and queryId.\n */\nfunction syncTreeParseQueryKey_(queryKey: string): {\n queryId: string;\n path: Path;\n} {\n const splitIndex = queryKey.indexOf('$');\n assert(\n splitIndex !== -1 && splitIndex < queryKey.length - 1,\n 'Bad queryKey.'\n );\n return {\n queryId: queryKey.substr(splitIndex + 1),\n path: new Path(queryKey.substr(0, splitIndex))\n };\n}\n\n/**\n * A helper method to apply tagged operations\n */\nfunction syncTreeApplyTaggedOperation_(\n syncTree: SyncTree,\n queryPath: Path,\n operation: Operation\n): Event[] {\n const syncPoint = syncTree.syncPointTree_.get(queryPath);\n assert(syncPoint, \"Missing sync point for query tag that we're tracking\");\n const writesCache = writeTreeChildWrites(\n syncTree.pendingWriteTree_,\n queryPath\n );\n return syncPointApplyOperation(syncPoint, operation, writesCache, null);\n}\n\n/**\n * This collapses multiple unfiltered views into a single view, since we only need a single\n * listener for them.\n */\nfunction syncTreeCollectDistinctViewsForSubTree_(\n subtree: ImmutableTree\n): View[] {\n return subtree.fold((relativePath, maybeChildSyncPoint, childMap) => {\n if (maybeChildSyncPoint && syncPointHasCompleteView(maybeChildSyncPoint)) {\n const completeView = syncPointGetCompleteView(maybeChildSyncPoint);\n return [completeView];\n } else {\n // No complete view here, flatten any deeper listens into an array\n let views: View[] = [];\n if (maybeChildSyncPoint) {\n views = syncPointGetQueryViews(maybeChildSyncPoint);\n }\n each(childMap, (_key: string, childViews: View[]) => {\n views = views.concat(childViews);\n });\n return views;\n }\n });\n}\n\n/**\n * Normalizes a query to a query we send the server for listening\n *\n * @returns The normalized query\n */\nfunction syncTreeQueryForListening_(query: QueryContext): QueryContext {\n if (query._queryParams.loadsAllData() && !query._queryParams.isDefault()) {\n // We treat queries that load all data as default queries\n // Cast is necessary because ref() technically returns Firebase which is actually fb.api.Firebase which inherits\n // from Query\n return new (syncTreeGetReferenceConstructor())(query._repo, query._path);\n } else {\n return query;\n }\n}\n\nfunction syncTreeRemoveTags_(syncTree: SyncTree, queries: QueryContext[]) {\n for (let j = 0; j < queries.length; ++j) {\n const removedQuery = queries[j];\n if (!removedQuery._queryParams.loadsAllData()) {\n // We should have a tag for this\n const removedQueryKey = syncTreeMakeQueryKey_(removedQuery);\n const removedQueryTag = syncTree.queryToTagMap.get(removedQueryKey);\n syncTree.queryToTagMap.delete(removedQueryKey);\n syncTree.tagToQueryMap.delete(removedQueryTag);\n }\n }\n}\n\n/**\n * Static accessor for query tags.\n */\nfunction syncTreeGetNextQueryTag_(): number {\n return syncTreeNextQueryTag_++;\n}\n\n/**\n * For a given new listen, manage the de-duplication of outstanding subscriptions.\n *\n * @returns This method can return events to support synchronous data sources\n */\nfunction syncTreeSetupListener_(\n syncTree: SyncTree,\n query: QueryContext,\n view: View\n): Event[] {\n const path = query._path;\n const tag = syncTreeTagForQuery(syncTree, query);\n const listener = syncTreeCreateListenerForView_(syncTree, view);\n\n const events = syncTree.listenProvider_.startListening(\n syncTreeQueryForListening_(query),\n tag,\n listener.hashFn,\n listener.onComplete\n );\n\n const subtree = syncTree.syncPointTree_.subtree(path);\n // The root of this subtree has our query. We're here because we definitely need to send a listen for that, but we\n // may need to shadow other listens as well.\n if (tag) {\n assert(\n !syncPointHasCompleteView(subtree.value),\n \"If we're adding a query, it shouldn't be shadowed\"\n );\n } else {\n // Shadow everything at or below this location, this is a default listener.\n const queriesToStop = subtree.fold(\n (relativePath, maybeChildSyncPoint, childMap) => {\n if (\n !pathIsEmpty(relativePath) &&\n maybeChildSyncPoint &&\n syncPointHasCompleteView(maybeChildSyncPoint)\n ) {\n return [syncPointGetCompleteView(maybeChildSyncPoint).query];\n } else {\n // No default listener here, flatten any deeper queries into an array\n let queries: QueryContext[] = [];\n if (maybeChildSyncPoint) {\n queries = queries.concat(\n syncPointGetQueryViews(maybeChildSyncPoint).map(\n view => view.query\n )\n );\n }\n each(childMap, (_key: string, childQueries: QueryContext[]) => {\n queries = queries.concat(childQueries);\n });\n return queries;\n }\n }\n );\n for (let i = 0; i < queriesToStop.length; ++i) {\n const queryToStop = queriesToStop[i];\n syncTree.listenProvider_.stopListening(\n syncTreeQueryForListening_(queryToStop),\n syncTreeTagForQuery(syncTree, queryToStop)\n );\n }\n }\n return events;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { ChildrenNode } from '../snap/ChildrenNode';\nimport { PRIORITY_INDEX } from '../snap/indexes/PriorityIndex';\nimport { LeafNode } from '../snap/LeafNode';\nimport { Node } from '../snap/Node';\nimport { nodeFromJSON } from '../snap/nodeFromJSON';\nimport { SyncTree, syncTreeCalcCompleteEventCache } from '../SyncTree';\n\nimport { Indexable } from './misc';\nimport { Path, pathChild } from './Path';\n\n/* It's critical for performance that we do not calculate actual values from a SyncTree\n * unless and until the value is needed. Because we expose both a SyncTree and Node\n * version of deferred value resolution, we ned a wrapper class that will let us share\n * code.\n *\n * @see https://github.com/firebase/firebase-js-sdk/issues/2487\n */\ninterface ValueProvider {\n getImmediateChild(childName: string): ValueProvider;\n node(): Node;\n}\n\nclass ExistingValueProvider implements ValueProvider {\n constructor(readonly node_: Node) {}\n\n getImmediateChild(childName: string): ValueProvider {\n const child = this.node_.getImmediateChild(childName);\n return new ExistingValueProvider(child);\n }\n\n node(): Node {\n return this.node_;\n }\n}\n\nclass DeferredValueProvider implements ValueProvider {\n private syncTree_: SyncTree;\n private path_: Path;\n\n constructor(syncTree: SyncTree, path: Path) {\n this.syncTree_ = syncTree;\n this.path_ = path;\n }\n\n getImmediateChild(childName: string): ValueProvider {\n const childPath = pathChild(this.path_, childName);\n return new DeferredValueProvider(this.syncTree_, childPath);\n }\n\n node(): Node {\n return syncTreeCalcCompleteEventCache(this.syncTree_, this.path_);\n }\n}\n\n/**\n * Generate placeholders for deferred values.\n */\nexport const generateWithValues = function (\n values: {\n [k: string]: unknown;\n } | null\n): { [k: string]: unknown } {\n values = values || {};\n values['timestamp'] = values['timestamp'] || new Date().getTime();\n return values;\n};\n\n/**\n * Value to use when firing local events. When writing server values, fire\n * local events with an approximate value, otherwise return value as-is.\n */\nexport const resolveDeferredLeafValue = function (\n value: { [k: string]: unknown } | string | number | boolean,\n existingVal: ValueProvider,\n serverValues: { [k: string]: unknown }\n): string | number | boolean {\n if (!value || typeof value !== 'object') {\n return value as string | number | boolean;\n }\n assert('.sv' in value, 'Unexpected leaf node or priority contents');\n\n if (typeof value['.sv'] === 'string') {\n return resolveScalarDeferredValue(value['.sv'], existingVal, serverValues);\n } else if (typeof value['.sv'] === 'object') {\n return resolveComplexDeferredValue(value['.sv'], existingVal, serverValues);\n } else {\n assert(false, 'Unexpected server value: ' + JSON.stringify(value, null, 2));\n }\n};\n\nconst resolveScalarDeferredValue = function (\n op: string,\n existing: ValueProvider,\n serverValues: { [k: string]: unknown }\n): string | number | boolean {\n switch (op) {\n case 'timestamp':\n return serverValues['timestamp'] as string | number | boolean;\n default:\n assert(false, 'Unexpected server value: ' + op);\n }\n};\n\nconst resolveComplexDeferredValue = function (\n op: object,\n existing: ValueProvider,\n unused: { [k: string]: unknown }\n): string | number | boolean {\n if (!op.hasOwnProperty('increment')) {\n assert(false, 'Unexpected server value: ' + JSON.stringify(op, null, 2));\n }\n const delta = op['increment'];\n if (typeof delta !== 'number') {\n assert(false, 'Unexpected increment value: ' + delta);\n }\n\n const existingNode = existing.node();\n assert(\n existingNode !== null && typeof existingNode !== 'undefined',\n 'Expected ChildrenNode.EMPTY_NODE for nulls'\n );\n\n // Incrementing a non-number sets the value to the incremented amount\n if (!existingNode.isLeafNode()) {\n return delta;\n }\n\n const leaf = existingNode as LeafNode;\n const existingVal = leaf.getValue();\n if (typeof existingVal !== 'number') {\n return delta;\n }\n\n // No need to do over/underflow arithmetic here because JS only handles floats under the covers\n return existingVal + delta;\n};\n\n/**\n * Recursively replace all deferred values and priorities in the tree with the\n * specified generated replacement values.\n * @param path - path to which write is relative\n * @param node - new data written at path\n * @param syncTree - current data\n */\nexport const resolveDeferredValueTree = function (\n path: Path,\n node: Node,\n syncTree: SyncTree,\n serverValues: Indexable\n): Node {\n return resolveDeferredValue(\n node,\n new DeferredValueProvider(syncTree, path),\n serverValues\n );\n};\n\n/**\n * Recursively replace all deferred values and priorities in the node with the\n * specified generated replacement values. If there are no server values in the node,\n * it'll be returned as-is.\n */\nexport const resolveDeferredValueSnapshot = function (\n node: Node,\n existing: Node,\n serverValues: Indexable\n): Node {\n return resolveDeferredValue(\n node,\n new ExistingValueProvider(existing),\n serverValues\n );\n};\n\nfunction resolveDeferredValue(\n node: Node,\n existingVal: ValueProvider,\n serverValues: Indexable\n): Node {\n const rawPri = node.getPriority().val() as\n | Indexable\n | boolean\n | null\n | number\n | string;\n const priority = resolveDeferredLeafValue(\n rawPri,\n existingVal.getImmediateChild('.priority'),\n serverValues\n );\n let newNode: Node;\n\n if (node.isLeafNode()) {\n const leafNode = node as LeafNode;\n const value = resolveDeferredLeafValue(\n leafNode.getValue(),\n existingVal,\n serverValues\n );\n if (\n value !== leafNode.getValue() ||\n priority !== leafNode.getPriority().val()\n ) {\n return new LeafNode(value, nodeFromJSON(priority));\n } else {\n return node;\n }\n } else {\n const childrenNode = node as ChildrenNode;\n newNode = childrenNode;\n if (priority !== childrenNode.getPriority().val()) {\n newNode = newNode.updatePriority(new LeafNode(priority));\n }\n childrenNode.forEachChild(PRIORITY_INDEX, (childName, childNode) => {\n const newChildNode = resolveDeferredValue(\n childNode,\n existingVal.getImmediateChild(childName),\n serverValues\n );\n if (newChildNode !== childNode) {\n newNode = newNode.updateImmediateChild(childName, newChildNode);\n }\n });\n return newNode;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { contains, safeGet } from '@firebase/util';\n\nimport { Path, pathGetFront, pathPopFront } from './Path';\nimport { each } from './util';\n\n/**\n * Node in a Tree.\n */\nexport interface TreeNode {\n // TODO: Consider making accessors that create children and value lazily or\n // separate Internal / Leaf 'types'.\n children: Record>;\n childCount: number;\n value?: T;\n}\n\n/**\n * A light-weight tree, traversable by path. Nodes can have both values and children.\n * Nodes are not enumerated (by forEachChild) unless they have a value or non-empty\n * children.\n */\nexport class Tree {\n /**\n * @param name - Optional name of the node.\n * @param parent - Optional parent node.\n * @param node - Optional node to wrap.\n */\n constructor(\n readonly name: string = '',\n readonly parent: Tree | null = null,\n public node: TreeNode = { children: {}, childCount: 0 }\n ) {}\n}\n\n/**\n * Returns a sub-Tree for the given path.\n *\n * @param pathObj - Path to look up.\n * @returns Tree for path.\n */\nexport function treeSubTree(tree: Tree, pathObj: string | Path): Tree {\n // TODO: Require pathObj to be Path?\n let path = pathObj instanceof Path ? pathObj : new Path(pathObj);\n let child = tree,\n next = pathGetFront(path);\n while (next !== null) {\n const childNode = safeGet(child.node.children, next) || {\n children: {},\n childCount: 0\n };\n child = new Tree(next, child, childNode);\n path = pathPopFront(path);\n next = pathGetFront(path);\n }\n\n return child;\n}\n\n/**\n * Returns the data associated with this tree node.\n *\n * @returns The data or null if no data exists.\n */\nexport function treeGetValue(tree: Tree): T | undefined {\n return tree.node.value;\n}\n\n/**\n * Sets data to this tree node.\n *\n * @param value - Value to set.\n */\nexport function treeSetValue(tree: Tree, value: T | undefined): void {\n tree.node.value = value;\n treeUpdateParents(tree);\n}\n\n/**\n * @returns Whether the tree has any children.\n */\nexport function treeHasChildren(tree: Tree): boolean {\n return tree.node.childCount > 0;\n}\n\n/**\n * @returns Whether the tree is empty (no value or children).\n */\nexport function treeIsEmpty(tree: Tree): boolean {\n return treeGetValue(tree) === undefined && !treeHasChildren(tree);\n}\n\n/**\n * Calls action for each child of this tree node.\n *\n * @param action - Action to be called for each child.\n */\nexport function treeForEachChild(\n tree: Tree,\n action: (tree: Tree) => void\n): void {\n each(tree.node.children, (child: string, childTree: TreeNode) => {\n action(new Tree(child, tree, childTree));\n });\n}\n\n/**\n * Does a depth-first traversal of this node's descendants, calling action for each one.\n *\n * @param action - Action to be called for each child.\n * @param includeSelf - Whether to call action on this node as well. Defaults to\n * false.\n * @param childrenFirst - Whether to call action on children before calling it on\n * parent.\n */\nexport function treeForEachDescendant(\n tree: Tree,\n action: (tree: Tree) => void,\n includeSelf?: boolean,\n childrenFirst?: boolean\n): void {\n if (includeSelf && !childrenFirst) {\n action(tree);\n }\n\n treeForEachChild(tree, child => {\n treeForEachDescendant(child, action, true, childrenFirst);\n });\n\n if (includeSelf && childrenFirst) {\n action(tree);\n }\n}\n\n/**\n * Calls action on each ancestor node.\n *\n * @param action - Action to be called on each parent; return\n * true to abort.\n * @param includeSelf - Whether to call action on this node as well.\n * @returns true if the action callback returned true.\n */\nexport function treeForEachAncestor(\n tree: Tree,\n action: (tree: Tree) => unknown,\n includeSelf?: boolean\n): boolean {\n let node = includeSelf ? tree : tree.parent;\n while (node !== null) {\n if (action(node)) {\n return true;\n }\n node = node.parent;\n }\n return false;\n}\n\n/**\n * Does a depth-first traversal of this node's descendants. When a descendant with a value\n * is found, action is called on it and traversal does not continue inside the node.\n * Action is *not* called on this node.\n *\n * @param action - Action to be called for each child.\n */\nexport function treeForEachImmediateDescendantWithValue(\n tree: Tree,\n action: (tree: Tree) => void\n): void {\n treeForEachChild(tree, child => {\n if (treeGetValue(child) !== undefined) {\n action(child);\n } else {\n treeForEachImmediateDescendantWithValue(child, action);\n }\n });\n}\n\n/**\n * @returns The path of this tree node, as a Path.\n */\nexport function treeGetPath(tree: Tree) {\n return new Path(\n tree.parent === null\n ? tree.name\n : treeGetPath(tree.parent) + '/' + tree.name\n );\n}\n\n/**\n * Adds or removes this child from its parent based on whether it's empty or not.\n */\nfunction treeUpdateParents(tree: Tree) {\n if (tree.parent !== null) {\n treeUpdateChild(tree.parent, tree.name, tree);\n }\n}\n\n/**\n * Adds or removes the passed child to this tree node, depending on whether it's empty.\n *\n * @param childName - The name of the child to update.\n * @param child - The child to update.\n */\nfunction treeUpdateChild(tree: Tree, childName: string, child: Tree) {\n const childEmpty = treeIsEmpty(child);\n const childExists = contains(tree.node.children, childName);\n if (childEmpty && childExists) {\n delete tree.node.children[childName];\n tree.node.childCount--;\n treeUpdateParents(tree);\n } else if (!childEmpty && !childExists) {\n tree.node.children[childName] = child.node;\n tree.node.childCount++;\n treeUpdateParents(tree);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n contains,\n errorPrefix as errorPrefixFxn,\n safeGet,\n stringLength\n} from '@firebase/util';\n\nimport { RepoInfo } from '../RepoInfo';\n\nimport {\n Path,\n pathChild,\n pathCompare,\n pathContains,\n pathGetBack,\n pathGetFront,\n pathSlice,\n ValidationPath,\n validationPathPop,\n validationPathPush,\n validationPathToErrorString\n} from './Path';\nimport { each, isInvalidJSONNumber } from './util';\n\n/**\n * True for invalid Firebase keys\n */\nexport const INVALID_KEY_REGEX_ = /[\\[\\].#$\\/\\u0000-\\u001F\\u007F]/;\n\n/**\n * True for invalid Firebase paths.\n * Allows '/' in paths.\n */\nexport const INVALID_PATH_REGEX_ = /[\\[\\].#$\\u0000-\\u001F\\u007F]/;\n\n/**\n * Maximum number of characters to allow in leaf value\n */\nexport const MAX_LEAF_SIZE_ = 10 * 1024 * 1024;\n\nexport const isValidKey = function (key: unknown): boolean {\n return (\n typeof key === 'string' && key.length !== 0 && !INVALID_KEY_REGEX_.test(key)\n );\n};\n\nexport const isValidPathString = function (pathString: string): boolean {\n return (\n typeof pathString === 'string' &&\n pathString.length !== 0 &&\n !INVALID_PATH_REGEX_.test(pathString)\n );\n};\n\nexport const isValidRootPathString = function (pathString: string): boolean {\n if (pathString) {\n // Allow '/.info/' at the beginning.\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\n }\n\n return isValidPathString(pathString);\n};\n\nexport const isValidPriority = function (priority: unknown): boolean {\n return (\n priority === null ||\n typeof priority === 'string' ||\n (typeof priority === 'number' && !isInvalidJSONNumber(priority)) ||\n (priority &&\n typeof priority === 'object' &&\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n contains(priority as any, '.sv'))\n );\n};\n\n/**\n * Pre-validate a datum passed as an argument to Firebase function.\n */\nexport const validateFirebaseDataArg = function (\n fnName: string,\n value: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && value === undefined) {\n return;\n }\n\n validateFirebaseData(errorPrefixFxn(fnName, 'value'), value, path);\n};\n\n/**\n * Validate a data object client-side before sending to server.\n */\nexport const validateFirebaseData = function (\n errorPrefix: string,\n data: unknown,\n path_: Path | ValidationPath\n) {\n const path =\n path_ instanceof Path ? new ValidationPath(path_, errorPrefix) : path_;\n\n if (data === undefined) {\n throw new Error(\n errorPrefix + 'contains undefined ' + validationPathToErrorString(path)\n );\n }\n if (typeof data === 'function') {\n throw new Error(\n errorPrefix +\n 'contains a function ' +\n validationPathToErrorString(path) +\n ' with contents = ' +\n data.toString()\n );\n }\n if (isInvalidJSONNumber(data)) {\n throw new Error(\n errorPrefix +\n 'contains ' +\n data.toString() +\n ' ' +\n validationPathToErrorString(path)\n );\n }\n\n // Check max leaf size, but try to avoid the utf8 conversion if we can.\n if (\n typeof data === 'string' &&\n data.length > MAX_LEAF_SIZE_ / 3 &&\n stringLength(data) > MAX_LEAF_SIZE_\n ) {\n throw new Error(\n errorPrefix +\n 'contains a string greater than ' +\n MAX_LEAF_SIZE_ +\n ' utf8 bytes ' +\n validationPathToErrorString(path) +\n \" ('\" +\n data.substring(0, 50) +\n \"...')\"\n );\n }\n\n // TODO = Perf = Consider combining the recursive validation of keys into NodeFromJSON\n // to save extra walking of large objects.\n if (data && typeof data === 'object') {\n let hasDotValue = false;\n let hasActualChild = false;\n each(data, (key: string, value: unknown) => {\n if (key === '.value') {\n hasDotValue = true;\n } else if (key !== '.priority' && key !== '.sv') {\n hasActualChild = true;\n if (!isValidKey(key)) {\n throw new Error(\n errorPrefix +\n ' contains an invalid key (' +\n key +\n ') ' +\n validationPathToErrorString(path) +\n '. Keys must be non-empty strings ' +\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"'\n );\n }\n }\n\n validationPathPush(path, key);\n validateFirebaseData(errorPrefix, value, path);\n validationPathPop(path);\n });\n\n if (hasDotValue && hasActualChild) {\n throw new Error(\n errorPrefix +\n ' contains \".value\" child ' +\n validationPathToErrorString(path) +\n ' in addition to actual children.'\n );\n }\n }\n};\n\n/**\n * Pre-validate paths passed in the firebase function.\n */\nexport const validateFirebaseMergePaths = function (\n errorPrefix: string,\n mergePaths: Path[]\n) {\n let i, curPath: Path;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n const keys = pathSlice(curPath);\n for (let j = 0; j < keys.length; j++) {\n if (keys[j] === '.priority' && j === keys.length - 1) {\n // .priority is OK\n } else if (!isValidKey(keys[j])) {\n throw new Error(\n errorPrefix +\n 'contains an invalid key (' +\n keys[j] +\n ') in path ' +\n curPath.toString() +\n '. Keys must be non-empty strings ' +\n 'and can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\"'\n );\n }\n }\n }\n\n // Check that update keys are not descendants of each other.\n // We rely on the property that sorting guarantees that ancestors come\n // right before descendants.\n mergePaths.sort(pathCompare);\n let prevPath: Path | null = null;\n for (i = 0; i < mergePaths.length; i++) {\n curPath = mergePaths[i];\n if (prevPath !== null && pathContains(prevPath, curPath)) {\n throw new Error(\n errorPrefix +\n 'contains a path ' +\n prevPath.toString() +\n ' that is ancestor of another path ' +\n curPath.toString()\n );\n }\n prevPath = curPath;\n }\n};\n\n/**\n * pre-validate an object passed as an argument to firebase function (\n * must be an object - e.g. for firebase.update()).\n */\nexport const validateFirebaseMergeDataArg = function (\n fnName: string,\n data: unknown,\n path: Path,\n optional: boolean\n) {\n if (optional && data === undefined) {\n return;\n }\n\n const errorPrefix = errorPrefixFxn(fnName, 'values');\n\n if (!(data && typeof data === 'object') || Array.isArray(data)) {\n throw new Error(\n errorPrefix + ' must be an object containing the children to replace.'\n );\n }\n\n const mergePaths: Path[] = [];\n each(data, (key: string, value: unknown) => {\n const curPath = new Path(key);\n validateFirebaseData(errorPrefix, value, pathChild(path, curPath));\n if (pathGetBack(curPath) === '.priority') {\n if (!isValidPriority(value)) {\n throw new Error(\n errorPrefix +\n \"contains an invalid value for '\" +\n curPath.toString() +\n \"', which must be a valid \" +\n 'Firebase priority (a string, finite number, server value, or null).'\n );\n }\n }\n mergePaths.push(curPath);\n });\n validateFirebaseMergePaths(errorPrefix, mergePaths);\n};\n\nexport const validatePriority = function (\n fnName: string,\n priority: unknown,\n optional: boolean\n) {\n if (optional && priority === undefined) {\n return;\n }\n if (isInvalidJSONNumber(priority)) {\n throw new Error(\n errorPrefixFxn(fnName, 'priority') +\n 'is ' +\n priority.toString() +\n ', but must be a valid Firebase priority (a string, finite number, ' +\n 'server value, or null).'\n );\n }\n // Special case to allow importing data with a .sv.\n if (!isValidPriority(priority)) {\n throw new Error(\n errorPrefixFxn(fnName, 'priority') +\n 'must be a valid Firebase priority ' +\n '(a string, finite number, server value, or null).'\n );\n }\n};\n\nexport const validateKey = function (\n fnName: string,\n argumentName: string,\n key: string,\n optional: boolean\n) {\n if (optional && key === undefined) {\n return;\n }\n if (!isValidKey(key)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) +\n 'was an invalid key = \"' +\n key +\n '\". Firebase keys must be non-empty strings and ' +\n 'can\\'t contain \".\", \"#\", \"$\", \"/\", \"[\", or \"]\").'\n );\n }\n};\n\n/**\n * @internal\n */\nexport const validatePathString = function (\n fnName: string,\n argumentName: string,\n pathString: string,\n optional: boolean\n) {\n if (optional && pathString === undefined) {\n return;\n }\n\n if (!isValidPathString(pathString)) {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) +\n 'was an invalid path = \"' +\n pathString +\n '\". Paths must be non-empty strings and ' +\n 'can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\"'\n );\n }\n};\n\nexport const validateRootPathString = function (\n fnName: string,\n argumentName: string,\n pathString: string,\n optional: boolean\n) {\n if (pathString) {\n // Allow '/.info/' at the beginning.\n pathString = pathString.replace(/^\\/*\\.info(\\/|$)/, '/');\n }\n\n validatePathString(fnName, argumentName, pathString, optional);\n};\n\n/**\n * @internal\n */\nexport const validateWritablePath = function (fnName: string, path: Path) {\n if (pathGetFront(path) === '.info') {\n throw new Error(fnName + \" failed = Can't modify data under /.info/\");\n }\n};\n\nexport const validateUrl = function (\n fnName: string,\n parsedUrl: { repoInfo: RepoInfo; path: Path }\n) {\n // TODO = Validate server better.\n const pathString = parsedUrl.path.toString();\n if (\n !(typeof parsedUrl.repoInfo.host === 'string') ||\n parsedUrl.repoInfo.host.length === 0 ||\n (!isValidKey(parsedUrl.repoInfo.namespace) &&\n parsedUrl.repoInfo.host.split(':')[0] !== 'localhost') ||\n (pathString.length !== 0 && !isValidRootPathString(pathString))\n ) {\n throw new Error(\n errorPrefixFxn(fnName, 'url') +\n 'must be a valid firebase URL and ' +\n 'the path can\\'t contain \".\", \"#\", \"$\", \"[\", or \"]\".'\n );\n }\n};\n\nexport const validateString = function (\n fnName: string,\n argumentName: string,\n string: unknown,\n optional: boolean\n) {\n if (optional && string === undefined) {\n return;\n }\n if (!(typeof string === 'string')) {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) + 'must be a valid string.'\n );\n }\n};\n\nexport const validateObject = function (\n fnName: string,\n argumentName: string,\n obj: unknown,\n optional: boolean\n) {\n if (optional && obj === undefined) {\n return;\n }\n if (!(obj && typeof obj === 'object') || obj === null) {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) + 'must be a valid object.'\n );\n }\n};\n\nexport const validateObjectContainsKey = function (\n fnName: string,\n argumentName: string,\n obj: unknown,\n key: string,\n optional: boolean,\n optType?: string\n) {\n const objectContainsKey =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj && typeof obj === 'object' && contains(obj as any, key);\n\n if (!objectContainsKey) {\n if (optional) {\n return;\n } else {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) +\n 'must contain the key \"' +\n key +\n '\"'\n );\n }\n }\n\n if (optType) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const val = safeGet(obj as any, key);\n if (\n (optType === 'number' && !(typeof val === 'number')) ||\n (optType === 'string' && !(typeof val === 'string')) ||\n (optType === 'boolean' && !(typeof val === 'boolean')) ||\n (optType === 'function' && !(typeof val === 'function')) ||\n (optType === 'object' && !(typeof val === 'object') && val)\n ) {\n if (optional) {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) +\n 'contains invalid value for key \"' +\n key +\n '\" (must be of type \"' +\n optType +\n '\")'\n );\n } else {\n throw new Error(\n errorPrefixFxn(fnName, argumentName) +\n 'must contain the key \"' +\n key +\n '\" with type \"' +\n optType +\n '\"'\n );\n }\n }\n }\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Path, pathContains, pathEquals } from '../util/Path';\nimport { exceptionGuard, log, logger } from '../util/util';\n\nimport { Event } from './Event';\n\n/**\n * The event queue serves a few purposes:\n * 1. It ensures we maintain event order in the face of event callbacks doing operations that result in more\n * events being queued.\n * 2. raiseQueuedEvents() handles being called reentrantly nicely. That is, if in the course of raising events,\n * raiseQueuedEvents() is called again, the \"inner\" call will pick up raising events where the \"outer\" call\n * left off, ensuring that the events are still raised synchronously and in order.\n * 3. You can use raiseEventsAtPath and raiseEventsForChangedPath to ensure only relevant previously-queued\n * events are raised synchronously.\n *\n * NOTE: This can all go away if/when we move to async events.\n *\n */\nexport class EventQueue {\n eventLists_: EventList[] = [];\n\n /**\n * Tracks recursion depth of raiseQueuedEvents_, for debugging purposes.\n */\n recursionDepth_ = 0;\n}\n\n/**\n * @param eventDataList - The new events to queue.\n */\nexport function eventQueueQueueEvents(\n eventQueue: EventQueue,\n eventDataList: Event[]\n) {\n // We group events by path, storing them in a single EventList, to make it easier to skip over them quickly.\n let currList: EventList | null = null;\n for (let i = 0; i < eventDataList.length; i++) {\n const data = eventDataList[i];\n const path = data.getPath();\n if (currList !== null && !pathEquals(path, currList.path)) {\n eventQueue.eventLists_.push(currList);\n currList = null;\n }\n\n if (currList === null) {\n currList = { events: [], path };\n }\n\n currList.events.push(data);\n }\n if (currList) {\n eventQueue.eventLists_.push(currList);\n }\n}\n\n/**\n * Queues the specified events and synchronously raises all events (including previously queued ones)\n * for the specified path.\n *\n * It is assumed that the new events are all for the specified path.\n *\n * @param path - The path to raise events for.\n * @param eventDataList - The new events to raise.\n */\nexport function eventQueueRaiseEventsAtPath(\n eventQueue: EventQueue,\n path: Path,\n eventDataList: Event[]\n) {\n eventQueueQueueEvents(eventQueue, eventDataList);\n eventQueueRaiseQueuedEventsMatchingPredicate(eventQueue, eventPath =>\n pathEquals(eventPath, path)\n );\n}\n\n/**\n * Queues the specified events and synchronously raises all events (including previously queued ones) for\n * locations related to the specified change path (i.e. all ancestors and descendants).\n *\n * It is assumed that the new events are all related (ancestor or descendant) to the specified path.\n *\n * @param changedPath - The path to raise events for.\n * @param eventDataList - The events to raise\n */\nexport function eventQueueRaiseEventsForChangedPath(\n eventQueue: EventQueue,\n changedPath: Path,\n eventDataList: Event[]\n) {\n eventQueueQueueEvents(eventQueue, eventDataList);\n eventQueueRaiseQueuedEventsMatchingPredicate(\n eventQueue,\n eventPath =>\n pathContains(eventPath, changedPath) ||\n pathContains(changedPath, eventPath)\n );\n}\n\nfunction eventQueueRaiseQueuedEventsMatchingPredicate(\n eventQueue: EventQueue,\n predicate: (path: Path) => boolean\n) {\n eventQueue.recursionDepth_++;\n\n let sentAll = true;\n for (let i = 0; i < eventQueue.eventLists_.length; i++) {\n const eventList = eventQueue.eventLists_[i];\n if (eventList) {\n const eventPath = eventList.path;\n if (predicate(eventPath)) {\n eventListRaise(eventQueue.eventLists_[i]);\n eventQueue.eventLists_[i] = null;\n } else {\n sentAll = false;\n }\n }\n }\n\n if (sentAll) {\n eventQueue.eventLists_ = [];\n }\n\n eventQueue.recursionDepth_--;\n}\n\ninterface EventList {\n events: Event[];\n path: Path;\n}\n\n/**\n * Iterates through the list and raises each event\n */\nfunction eventListRaise(eventList: EventList) {\n for (let i = 0; i < eventList.events.length; i++) {\n const eventData = eventList.events[i];\n if (eventData !== null) {\n eventList.events[i] = null;\n const eventFn = eventData.getEventRunner();\n if (logger) {\n log('event: ' + eventData.toString());\n }\n exceptionGuard(eventFn);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n assert,\n contains,\n isEmpty,\n map,\n safeGet,\n stringify\n} from '@firebase/util';\n\nimport { ValueEventRegistration } from '../api/Reference_impl';\n\nimport { AppCheckTokenProvider } from './AppCheckTokenProvider';\nimport { AuthTokenProvider } from './AuthTokenProvider';\nimport { PersistentConnection } from './PersistentConnection';\nimport { ReadonlyRestClient } from './ReadonlyRestClient';\nimport { RepoInfo } from './RepoInfo';\nimport { ServerActions } from './ServerActions';\nimport { ChildrenNode } from './snap/ChildrenNode';\nimport { Node } from './snap/Node';\nimport { nodeFromJSON } from './snap/nodeFromJSON';\nimport { SnapshotHolder } from './SnapshotHolder';\nimport {\n newSparseSnapshotTree,\n SparseSnapshotTree,\n sparseSnapshotTreeForEachTree,\n sparseSnapshotTreeForget,\n sparseSnapshotTreeRemember\n} from './SparseSnapshotTree';\nimport { StatsCollection } from './stats/StatsCollection';\nimport { StatsListener } from './stats/StatsListener';\nimport {\n statsManagerGetCollection,\n statsManagerGetOrCreateReporter\n} from './stats/StatsManager';\nimport { StatsReporter, statsReporterIncludeStat } from './stats/StatsReporter';\nimport {\n SyncTree,\n syncTreeAckUserWrite,\n syncTreeAddEventRegistration,\n syncTreeApplyServerMerge,\n syncTreeApplyServerOverwrite,\n syncTreeApplyTaggedQueryMerge,\n syncTreeApplyTaggedQueryOverwrite,\n syncTreeApplyUserMerge,\n syncTreeApplyUserOverwrite,\n syncTreeCalcCompleteEventCache,\n syncTreeGetServerValue,\n syncTreeRemoveEventRegistration,\n syncTreeTagForQuery\n} from './SyncTree';\nimport { Indexable } from './util/misc';\nimport {\n newEmptyPath,\n newRelativePath,\n Path,\n pathChild,\n pathGetFront,\n pathPopFront\n} from './util/Path';\nimport {\n generateWithValues,\n resolveDeferredValueSnapshot,\n resolveDeferredValueTree\n} from './util/ServerValues';\nimport {\n Tree,\n treeForEachAncestor,\n treeForEachChild,\n treeForEachDescendant,\n treeGetPath,\n treeGetValue,\n treeHasChildren,\n treeSetValue,\n treeSubTree\n} from './util/Tree';\nimport {\n beingCrawled,\n each,\n exceptionGuard,\n log,\n LUIDGenerator,\n warn\n} from './util/util';\nimport { isValidPriority, validateFirebaseData } from './util/validation';\nimport { Event } from './view/Event';\nimport {\n EventQueue,\n eventQueueQueueEvents,\n eventQueueRaiseEventsAtPath,\n eventQueueRaiseEventsForChangedPath\n} from './view/EventQueue';\nimport { EventRegistration, QueryContext } from './view/EventRegistration';\n\nconst INTERRUPT_REASON = 'repo_interrupt';\n\n/**\n * If a transaction does not succeed after 25 retries, we abort it. Among other\n * things this ensure that if there's ever a bug causing a mismatch between\n * client / server hashes for some data, we won't retry indefinitely.\n */\nconst MAX_TRANSACTION_RETRIES = 25;\n\nconst enum TransactionStatus {\n // We've run the transaction and updated transactionResultData_ with the result, but it isn't currently sent to the\n // server. A transaction will go from RUN -> SENT -> RUN if it comes back from the server as rejected due to\n // mismatched hash.\n RUN,\n\n // We've run the transaction and sent it to the server and it's currently outstanding (hasn't come back as accepted\n // or rejected yet).\n SENT,\n\n // Temporary state used to mark completed transactions (whether successful or aborted). The transaction will be\n // removed when we get a chance to prune completed ones.\n COMPLETED,\n\n // Used when an already-sent transaction needs to be aborted (e.g. due to a conflicting set() call that was made).\n // If it comes back as unsuccessful, we'll abort it.\n SENT_NEEDS_ABORT,\n\n // Temporary state used to mark transactions that need to be aborted.\n NEEDS_ABORT\n}\n\ninterface Transaction {\n path: Path;\n update: (a: unknown) => unknown;\n onComplete: (\n error: Error | null,\n committed: boolean,\n node: Node | null\n ) => void;\n status: TransactionStatus;\n order: number;\n applyLocally: boolean;\n retryCount: number;\n unwatcher: () => void;\n abortReason: string | null;\n currentWriteId: number;\n currentInputSnapshot: Node | null;\n currentOutputSnapshotRaw: Node | null;\n currentOutputSnapshotResolved: Node | null;\n}\n\n/**\n * A connection to a single data repository.\n */\nexport class Repo {\n /** Key for uniquely identifying this repo, used in RepoManager */\n readonly key: string;\n\n dataUpdateCount = 0;\n infoSyncTree_: SyncTree;\n serverSyncTree_: SyncTree;\n\n stats_: StatsCollection;\n statsListener_: StatsListener | null = null;\n eventQueue_ = new EventQueue();\n nextWriteId_ = 1;\n server_: ServerActions;\n statsReporter_: StatsReporter;\n infoData_: SnapshotHolder;\n interceptServerDataCallback_: ((a: string, b: unknown) => void) | null = null;\n\n /** A list of data pieces and paths to be set when this client disconnects. */\n onDisconnect_: SparseSnapshotTree = newSparseSnapshotTree();\n\n /** Stores queues of outstanding transactions for Firebase locations. */\n transactionQueueTree_ = new Tree();\n\n // TODO: This should be @private but it's used by test_access.js and internal.js\n persistentConnection_: PersistentConnection | null = null;\n\n constructor(\n public repoInfo_: RepoInfo,\n public forceRestClient_: boolean,\n public authTokenProvider_: AuthTokenProvider,\n public appCheckProvider_: AppCheckTokenProvider\n ) {\n // This key is intentionally not updated if RepoInfo is later changed or replaced\n this.key = this.repoInfo_.toURLString();\n }\n\n /**\n * @returns The URL corresponding to the root of this Firebase.\n */\n toString(): string {\n return (\n (this.repoInfo_.secure ? 'https://' : 'http://') + this.repoInfo_.host\n );\n }\n}\n\nexport function repoStart(\n repo: Repo,\n appId: string,\n authOverride?: object\n): void {\n repo.stats_ = statsManagerGetCollection(repo.repoInfo_);\n\n if (repo.forceRestClient_ || beingCrawled()) {\n repo.server_ = new ReadonlyRestClient(\n repo.repoInfo_,\n (\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n ) => {\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\n },\n repo.authTokenProvider_,\n repo.appCheckProvider_\n );\n\n // Minor hack: Fire onConnect immediately, since there's no actual connection.\n setTimeout(() => repoOnConnectStatus(repo, /* connectStatus= */ true), 0);\n } else {\n // Validate authOverride\n if (typeof authOverride !== 'undefined' && authOverride !== null) {\n if (typeof authOverride !== 'object') {\n throw new Error(\n 'Only objects are supported for option databaseAuthVariableOverride'\n );\n }\n try {\n stringify(authOverride);\n } catch (e) {\n throw new Error('Invalid authOverride provided: ' + e);\n }\n }\n\n repo.persistentConnection_ = new PersistentConnection(\n repo.repoInfo_,\n appId,\n (\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n ) => {\n repoOnDataUpdate(repo, pathString, data, isMerge, tag);\n },\n (connectStatus: boolean) => {\n repoOnConnectStatus(repo, connectStatus);\n },\n (updates: object) => {\n repoOnServerInfoUpdate(repo, updates);\n },\n repo.authTokenProvider_,\n repo.appCheckProvider_,\n authOverride\n );\n\n repo.server_ = repo.persistentConnection_;\n }\n\n repo.authTokenProvider_.addTokenChangeListener(token => {\n repo.server_.refreshAuthToken(token);\n });\n\n repo.appCheckProvider_.addTokenChangeListener(result => {\n repo.server_.refreshAppCheckToken(result.token);\n });\n\n // In the case of multiple Repos for the same repoInfo (i.e. there are multiple Firebase.Contexts being used),\n // we only want to create one StatsReporter. As such, we'll report stats over the first Repo created.\n repo.statsReporter_ = statsManagerGetOrCreateReporter(\n repo.repoInfo_,\n () => new StatsReporter(repo.stats_, repo.server_)\n );\n\n // Used for .info.\n repo.infoData_ = new SnapshotHolder();\n repo.infoSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n let infoEvents: Event[] = [];\n const node = repo.infoData_.getNode(query._path);\n // This is possibly a hack, but we have different semantics for .info endpoints. We don't raise null events\n // on initial data...\n if (!node.isEmpty()) {\n infoEvents = syncTreeApplyServerOverwrite(\n repo.infoSyncTree_,\n query._path,\n node\n );\n setTimeout(() => {\n onComplete('ok');\n }, 0);\n }\n return infoEvents;\n },\n stopListening: () => {}\n });\n repoUpdateInfo(repo, 'connected', false);\n\n repo.serverSyncTree_ = new SyncTree({\n startListening: (query, tag, currentHashFn, onComplete) => {\n repo.server_.listen(query, currentHashFn, tag, (status, data) => {\n const events = onComplete(status, data);\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n query._path,\n events\n );\n });\n // No synchronous events for network-backed sync trees\n return [];\n },\n stopListening: (query, tag) => {\n repo.server_.unlisten(query, tag);\n }\n });\n}\n\n/**\n * @returns The time in milliseconds, taking the server offset into account if we have one.\n */\nexport function repoServerTime(repo: Repo): number {\n const offsetNode = repo.infoData_.getNode(new Path('.info/serverTimeOffset'));\n const offset = (offsetNode.val() as number) || 0;\n return new Date().getTime() + offset;\n}\n\n/**\n * Generate ServerValues using some variables from the repo object.\n */\nexport function repoGenerateServerValues(repo: Repo): Indexable {\n return generateWithValues({\n timestamp: repoServerTime(repo)\n });\n}\n\n/**\n * Called by realtime when we get new messages from the server.\n */\nfunction repoOnDataUpdate(\n repo: Repo,\n pathString: string,\n data: unknown,\n isMerge: boolean,\n tag: number | null\n): void {\n // For testing.\n repo.dataUpdateCount++;\n const path = new Path(pathString);\n data = repo.interceptServerDataCallback_\n ? repo.interceptServerDataCallback_(pathString, data)\n : data;\n let events = [];\n if (tag) {\n if (isMerge) {\n const taggedChildren = map(\n data as { [k: string]: unknown },\n (raw: unknown) => nodeFromJSON(raw)\n );\n events = syncTreeApplyTaggedQueryMerge(\n repo.serverSyncTree_,\n path,\n taggedChildren,\n tag\n );\n } else {\n const taggedSnap = nodeFromJSON(data);\n events = syncTreeApplyTaggedQueryOverwrite(\n repo.serverSyncTree_,\n path,\n taggedSnap,\n tag\n );\n }\n } else if (isMerge) {\n const changedChildren = map(\n data as { [k: string]: unknown },\n (raw: unknown) => nodeFromJSON(raw)\n );\n events = syncTreeApplyServerMerge(\n repo.serverSyncTree_,\n path,\n changedChildren\n );\n } else {\n const snap = nodeFromJSON(data);\n events = syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap);\n }\n let affectedPath = path;\n if (events.length > 0) {\n // Since we have a listener outstanding for each transaction, receiving any events\n // is a proxy for some change having occurred.\n affectedPath = repoRerunTransactions(repo, path);\n }\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, events);\n}\n\n// TODO: This should be @private but it's used by test_access.js and internal.js\nexport function repoInterceptServerData(\n repo: Repo,\n callback: ((a: string, b: unknown) => unknown) | null\n): void {\n repo.interceptServerDataCallback_ = callback;\n}\n\nfunction repoOnConnectStatus(repo: Repo, connectStatus: boolean): void {\n repoUpdateInfo(repo, 'connected', connectStatus);\n if (connectStatus === false) {\n repoRunOnDisconnectEvents(repo);\n }\n}\n\nfunction repoOnServerInfoUpdate(repo: Repo, updates: object): void {\n each(updates, (key: string, value: unknown) => {\n repoUpdateInfo(repo, key, value);\n });\n}\n\nfunction repoUpdateInfo(repo: Repo, pathString: string, value: unknown): void {\n const path = new Path('/.info/' + pathString);\n const newNode = nodeFromJSON(value);\n repo.infoData_.updateSnapshot(path, newNode);\n const events = syncTreeApplyServerOverwrite(\n repo.infoSyncTree_,\n path,\n newNode\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n}\n\nfunction repoGetNextWriteId(repo: Repo): number {\n return repo.nextWriteId_++;\n}\n\n/**\n * The purpose of `getValue` is to return the latest known value\n * satisfying `query`.\n *\n * This method will first check for in-memory cached values\n * belonging to active listeners. If they are found, such values\n * are considered to be the most up-to-date.\n *\n * If the client is not connected, this method will wait until the\n * repo has established a connection and then request the value for `query`.\n * If the client is not able to retrieve the query result for another reason,\n * it reports an error.\n *\n * @param query - The query to surface a value for.\n */\nexport function repoGetValue(\n repo: Repo,\n query: QueryContext,\n eventRegistration: ValueEventRegistration\n): Promise {\n // Only active queries are cached. There is no persisted cache.\n const cached = syncTreeGetServerValue(repo.serverSyncTree_, query);\n if (cached != null) {\n return Promise.resolve(cached);\n }\n return repo.server_.get(query).then(\n payload => {\n const node = nodeFromJSON(payload).withIndex(\n query._queryParams.getIndex()\n );\n /**\n * Below we simulate the actions of an `onlyOnce` `onValue()` event where:\n * Add an event registration,\n * Update data at the path,\n * Raise any events,\n * Cleanup the SyncTree\n */\n syncTreeAddEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration,\n true\n );\n let events: Event[];\n if (query._queryParams.loadsAllData()) {\n events = syncTreeApplyServerOverwrite(\n repo.serverSyncTree_,\n query._path,\n node\n );\n } else {\n const tag = syncTreeTagForQuery(repo.serverSyncTree_, query);\n events = syncTreeApplyTaggedQueryOverwrite(\n repo.serverSyncTree_,\n query._path,\n node,\n tag\n );\n }\n /*\n * We need to raise events in the scenario where `get()` is called at a parent path, and\n * while the `get()` is pending, `onValue` is called at a child location. While get() is waiting\n * for the data, `onValue` will register a new event. Then, get() will come back, and update the syncTree\n * and its corresponding serverCache, including the child location where `onValue` is called. Then,\n * `onValue` will receive the event from the server, but look at the syncTree and see that the data received\n * from the server is already at the SyncPoint, and so the `onValue` callback will never get fired.\n * Calling `eventQueueRaiseEventsForChangedPath()` is the correct way to propagate the events and\n * ensure the corresponding child events will get fired.\n */\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n query._path,\n events\n );\n syncTreeRemoveEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration,\n null,\n true\n );\n return node;\n },\n err => {\n repoLog(repo, 'get for query ' + stringify(query) + ' failed: ' + err);\n return Promise.reject(new Error(err as string));\n }\n );\n}\n\nexport function repoSetWithPriority(\n repo: Repo,\n path: Path,\n newVal: unknown,\n newPriority: number | string | null,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repoLog(repo, 'set', {\n path: path.toString(),\n value: newVal,\n priority: newPriority\n });\n\n // TODO: Optimize this behavior to either (a) store flag to skip resolving where possible and / or\n // (b) store unresolved paths on JSON parse\n const serverValues = repoGenerateServerValues(repo);\n const newNodeUnresolved = nodeFromJSON(newVal, newPriority);\n const existing = syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path);\n const newNode = resolveDeferredValueSnapshot(\n newNodeUnresolved,\n existing,\n serverValues\n );\n\n const writeId = repoGetNextWriteId(repo);\n const events = syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n path,\n newNode,\n writeId,\n true\n );\n eventQueueQueueEvents(repo.eventQueue_, events);\n repo.server_.put(\n path.toString(),\n newNodeUnresolved.val(/*export=*/ true),\n (status, errorReason) => {\n const success = status === 'ok';\n if (!success) {\n warn('set at ' + path + ' failed: ' + status);\n }\n\n const clearEvents = syncTreeAckUserWrite(\n repo.serverSyncTree_,\n writeId,\n !success\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, clearEvents);\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n const affectedPath = repoAbortTransactions(repo, path);\n repoRerunTransactions(repo, affectedPath);\n // We queued the events above, so just flush the queue here\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, affectedPath, []);\n}\n\nexport function repoUpdate(\n repo: Repo,\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repoLog(repo, 'update', { path: path.toString(), value: childrenToMerge });\n\n // Start with our existing data and merge each child into it.\n let empty = true;\n const serverValues = repoGenerateServerValues(repo);\n const changedChildren: { [k: string]: Node } = {};\n each(childrenToMerge, (changedKey: string, changedValue: unknown) => {\n empty = false;\n changedChildren[changedKey] = resolveDeferredValueTree(\n pathChild(path, changedKey),\n nodeFromJSON(changedValue),\n repo.serverSyncTree_,\n serverValues\n );\n });\n\n if (!empty) {\n const writeId = repoGetNextWriteId(repo);\n const events = syncTreeApplyUserMerge(\n repo.serverSyncTree_,\n path,\n changedChildren,\n writeId\n );\n eventQueueQueueEvents(repo.eventQueue_, events);\n repo.server_.merge(\n path.toString(),\n childrenToMerge,\n (status, errorReason) => {\n const success = status === 'ok';\n if (!success) {\n warn('update at ' + path + ' failed: ' + status);\n }\n\n const clearEvents = syncTreeAckUserWrite(\n repo.serverSyncTree_,\n writeId,\n !success\n );\n const affectedPath =\n clearEvents.length > 0 ? repoRerunTransactions(repo, path) : path;\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n affectedPath,\n clearEvents\n );\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n\n each(childrenToMerge, (changedPath: string) => {\n const affectedPath = repoAbortTransactions(\n repo,\n pathChild(path, changedPath)\n );\n repoRerunTransactions(repo, affectedPath);\n });\n\n // We queued the events above, so just flush the queue here\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, []);\n } else {\n log(\"update() called with empty data. Don't do anything.\");\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\n }\n}\n\n/**\n * Applies all of the changes stored up in the onDisconnect_ tree.\n */\nfunction repoRunOnDisconnectEvents(repo: Repo): void {\n repoLog(repo, 'onDisconnectEvents');\n\n const serverValues = repoGenerateServerValues(repo);\n const resolvedOnDisconnectTree = newSparseSnapshotTree();\n sparseSnapshotTreeForEachTree(\n repo.onDisconnect_,\n newEmptyPath(),\n (path, node) => {\n const resolved = resolveDeferredValueTree(\n path,\n node,\n repo.serverSyncTree_,\n serverValues\n );\n sparseSnapshotTreeRemember(resolvedOnDisconnectTree, path, resolved);\n }\n );\n let events: Event[] = [];\n\n sparseSnapshotTreeForEachTree(\n resolvedOnDisconnectTree,\n newEmptyPath(),\n (path, snap) => {\n events = events.concat(\n syncTreeApplyServerOverwrite(repo.serverSyncTree_, path, snap)\n );\n const affectedPath = repoAbortTransactions(repo, path);\n repoRerunTransactions(repo, affectedPath);\n }\n );\n\n repo.onDisconnect_ = newSparseSnapshotTree();\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, newEmptyPath(), events);\n}\n\nexport function repoOnDisconnectCancel(\n repo: Repo,\n path: Path,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n repo.server_.onDisconnectCancel(path.toString(), (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeForget(repo.onDisconnect_, path);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n });\n}\n\nexport function repoOnDisconnectSet(\n repo: Repo,\n path: Path,\n value: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n const newNode = nodeFromJSON(value);\n repo.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoOnDisconnectSetWithPriority(\n repo: Repo,\n path: Path,\n value: unknown,\n priority: unknown,\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n const newNode = nodeFromJSON(value, priority);\n repo.server_.onDisconnectPut(\n path.toString(),\n newNode.val(/*export=*/ true),\n (status, errorReason) => {\n if (status === 'ok') {\n sparseSnapshotTreeRemember(repo.onDisconnect_, path, newNode);\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoOnDisconnectUpdate(\n repo: Repo,\n path: Path,\n childrenToMerge: { [k: string]: unknown },\n onComplete: ((status: Error | null, errorReason?: string) => void) | null\n): void {\n if (isEmpty(childrenToMerge)) {\n log(\"onDisconnect().update() called with empty data. Don't do anything.\");\n repoCallOnCompleteCallback(repo, onComplete, 'ok', undefined);\n return;\n }\n\n repo.server_.onDisconnectMerge(\n path.toString(),\n childrenToMerge,\n (status, errorReason) => {\n if (status === 'ok') {\n each(childrenToMerge, (childName: string, childNode: unknown) => {\n const newChildNode = nodeFromJSON(childNode);\n sparseSnapshotTreeRemember(\n repo.onDisconnect_,\n pathChild(path, childName),\n newChildNode\n );\n });\n }\n repoCallOnCompleteCallback(repo, onComplete, status, errorReason);\n }\n );\n}\n\nexport function repoAddEventCallbackForQuery(\n repo: Repo,\n query: QueryContext,\n eventRegistration: EventRegistration\n): void {\n let events;\n if (pathGetFront(query._path) === '.info') {\n events = syncTreeAddEventRegistration(\n repo.infoSyncTree_,\n query,\n eventRegistration\n );\n } else {\n events = syncTreeAddEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration\n );\n }\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\n}\n\nexport function repoRemoveEventCallbackForQuery(\n repo: Repo,\n query: QueryContext,\n eventRegistration: EventRegistration\n): void {\n // These are guaranteed not to raise events, since we're not passing in a cancelError. However, we can future-proof\n // a little bit by handling the return values anyways.\n let events;\n if (pathGetFront(query._path) === '.info') {\n events = syncTreeRemoveEventRegistration(\n repo.infoSyncTree_,\n query,\n eventRegistration\n );\n } else {\n events = syncTreeRemoveEventRegistration(\n repo.serverSyncTree_,\n query,\n eventRegistration\n );\n }\n eventQueueRaiseEventsAtPath(repo.eventQueue_, query._path, events);\n}\n\nexport function repoInterrupt(repo: Repo): void {\n if (repo.persistentConnection_) {\n repo.persistentConnection_.interrupt(INTERRUPT_REASON);\n }\n}\n\nexport function repoResume(repo: Repo): void {\n if (repo.persistentConnection_) {\n repo.persistentConnection_.resume(INTERRUPT_REASON);\n }\n}\n\nexport function repoStats(repo: Repo, showDelta: boolean = false): void {\n if (typeof console === 'undefined') {\n return;\n }\n\n let stats: { [k: string]: unknown };\n if (showDelta) {\n if (!repo.statsListener_) {\n repo.statsListener_ = new StatsListener(repo.stats_);\n }\n stats = repo.statsListener_.get();\n } else {\n stats = repo.stats_.get();\n }\n\n const longestName = Object.keys(stats).reduce(\n (previousValue, currentValue) =>\n Math.max(currentValue.length, previousValue),\n 0\n );\n\n each(stats, (stat: string, value: unknown) => {\n let paddedStat = stat;\n // pad stat names to be the same length (plus 2 extra spaces).\n for (let i = stat.length; i < longestName + 2; i++) {\n paddedStat += ' ';\n }\n console.log(paddedStat + value);\n });\n}\n\nexport function repoStatsIncrementCounter(repo: Repo, metric: string): void {\n repo.stats_.incrementCounter(metric);\n statsReporterIncludeStat(repo.statsReporter_, metric);\n}\n\nfunction repoLog(repo: Repo, ...varArgs: unknown[]): void {\n let prefix = '';\n if (repo.persistentConnection_) {\n prefix = repo.persistentConnection_.id + ':';\n }\n log(prefix, ...varArgs);\n}\n\nexport function repoCallOnCompleteCallback(\n repo: Repo,\n callback: ((status: Error | null, errorReason?: string) => void) | null,\n status: string,\n errorReason?: string | null\n): void {\n if (callback) {\n exceptionGuard(() => {\n if (status === 'ok') {\n callback(null);\n } else {\n const code = (status || 'error').toUpperCase();\n let message = code;\n if (errorReason) {\n message += ': ' + errorReason;\n }\n\n const error = new Error(message);\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).code = code;\n callback(error);\n }\n });\n }\n}\n\n/**\n * Creates a new transaction, adds it to the transactions we're tracking, and\n * sends it to the server if possible.\n *\n * @param path - Path at which to do transaction.\n * @param transactionUpdate - Update callback.\n * @param onComplete - Completion callback.\n * @param unwatcher - Function that will be called when the transaction no longer\n * need data updates for `path`.\n * @param applyLocally - Whether or not to make intermediate results visible\n */\nexport function repoStartTransaction(\n repo: Repo,\n path: Path,\n transactionUpdate: (a: unknown) => unknown,\n onComplete: ((error: Error, committed: boolean, node: Node) => void) | null,\n unwatcher: () => void,\n applyLocally: boolean\n): void {\n repoLog(repo, 'transaction on ' + path);\n\n // Initialize transaction.\n const transaction: Transaction = {\n path,\n update: transactionUpdate,\n onComplete,\n // One of TransactionStatus enums.\n status: null,\n // Used when combining transactions at different locations to figure out\n // which one goes first.\n order: LUIDGenerator(),\n // Whether to raise local events for this transaction.\n applyLocally,\n // Count of how many times we've retried the transaction.\n retryCount: 0,\n // Function to call to clean up our .on() listener.\n unwatcher,\n // Stores why a transaction was aborted.\n abortReason: null,\n currentWriteId: null,\n currentInputSnapshot: null,\n currentOutputSnapshotRaw: null,\n currentOutputSnapshotResolved: null\n };\n\n // Run transaction initially.\n const currentState = repoGetLatestState(repo, path, undefined);\n transaction.currentInputSnapshot = currentState;\n const newVal = transaction.update(currentState.val());\n if (newVal === undefined) {\n // Abort transaction.\n transaction.unwatcher();\n transaction.currentOutputSnapshotRaw = null;\n transaction.currentOutputSnapshotResolved = null;\n if (transaction.onComplete) {\n transaction.onComplete(null, false, transaction.currentInputSnapshot);\n }\n } else {\n validateFirebaseData(\n 'transaction failed: Data returned ',\n newVal,\n transaction.path\n );\n\n // Mark as run and add to our queue.\n transaction.status = TransactionStatus.RUN;\n const queueNode = treeSubTree(repo.transactionQueueTree_, path);\n const nodeQueue = treeGetValue(queueNode) || [];\n nodeQueue.push(transaction);\n\n treeSetValue(queueNode, nodeQueue);\n\n // Update visibleData and raise events\n // Note: We intentionally raise events after updating all of our\n // transaction state, since the user could start new transactions from the\n // event callbacks.\n let priorityForNode;\n if (\n typeof newVal === 'object' &&\n newVal !== null &&\n contains(newVal, '.priority')\n ) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n priorityForNode = safeGet(newVal as any, '.priority');\n assert(\n isValidPriority(priorityForNode),\n 'Invalid priority returned by transaction. ' +\n 'Priority must be a valid string, finite number, server value, or null.'\n );\n } else {\n const currentNode =\n syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path) ||\n ChildrenNode.EMPTY_NODE;\n priorityForNode = currentNode.getPriority().val();\n }\n\n const serverValues = repoGenerateServerValues(repo);\n const newNodeUnresolved = nodeFromJSON(newVal, priorityForNode);\n const newNode = resolveDeferredValueSnapshot(\n newNodeUnresolved,\n currentState,\n serverValues\n );\n transaction.currentOutputSnapshotRaw = newNodeUnresolved;\n transaction.currentOutputSnapshotResolved = newNode;\n transaction.currentWriteId = repoGetNextWriteId(repo);\n\n const events = syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n path,\n newNode,\n transaction.currentWriteId,\n transaction.applyLocally\n );\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n }\n}\n\n/**\n * @param excludeSets - A specific set to exclude\n */\nfunction repoGetLatestState(\n repo: Repo,\n path: Path,\n excludeSets?: number[]\n): Node {\n return (\n syncTreeCalcCompleteEventCache(repo.serverSyncTree_, path, excludeSets) ||\n ChildrenNode.EMPTY_NODE\n );\n}\n\n/**\n * Sends any already-run transactions that aren't waiting for outstanding\n * transactions to complete.\n *\n * Externally it's called with no arguments, but it calls itself recursively\n * with a particular transactionQueueTree node to recurse through the tree.\n *\n * @param node - transactionQueueTree node to start at.\n */\nfunction repoSendReadyTransactions(\n repo: Repo,\n node: Tree = repo.transactionQueueTree_\n): void {\n // Before recursing, make sure any completed transactions are removed.\n if (!node) {\n repoPruneCompletedTransactionsBelowNode(repo, node);\n }\n\n if (treeGetValue(node)) {\n const queue = repoBuildTransactionQueue(repo, node);\n assert(queue.length > 0, 'Sending zero length transaction queue');\n\n const allRun = queue.every(\n (transaction: Transaction) => transaction.status === TransactionStatus.RUN\n );\n\n // If they're all run (and not sent), we can send them. Else, we must wait.\n if (allRun) {\n repoSendTransactionQueue(repo, treeGetPath(node), queue);\n }\n } else if (treeHasChildren(node)) {\n treeForEachChild(node, childNode => {\n repoSendReadyTransactions(repo, childNode);\n });\n }\n}\n\n/**\n * Given a list of run transactions, send them to the server and then handle\n * the result (success or failure).\n *\n * @param path - The location of the queue.\n * @param queue - Queue of transactions under the specified location.\n */\nfunction repoSendTransactionQueue(\n repo: Repo,\n path: Path,\n queue: Transaction[]\n): void {\n // Mark transactions as sent and increment retry count!\n const setsToIgnore = queue.map(txn => {\n return txn.currentWriteId;\n });\n const latestState = repoGetLatestState(repo, path, setsToIgnore);\n let snapToSend = latestState;\n const latestHash = latestState.hash();\n for (let i = 0; i < queue.length; i++) {\n const txn = queue[i];\n assert(\n txn.status === TransactionStatus.RUN,\n 'tryToSendTransactionQueue_: items in queue should all be run.'\n );\n txn.status = TransactionStatus.SENT;\n txn.retryCount++;\n const relativePath = newRelativePath(path, txn.path);\n // If we've gotten to this point, the output snapshot must be defined.\n snapToSend = snapToSend.updateChild(\n relativePath /** @type {!Node} */,\n txn.currentOutputSnapshotRaw\n );\n }\n\n const dataToSend = snapToSend.val(true);\n const pathToSend = path;\n\n // Send the put.\n repo.server_.put(\n pathToSend.toString(),\n dataToSend,\n (status: string) => {\n repoLog(repo, 'transaction put response', {\n path: pathToSend.toString(),\n status\n });\n\n let events: Event[] = [];\n if (status === 'ok') {\n // Queue up the callbacks and fire them after cleaning up all of our\n // transaction state, since the callback could trigger more\n // transactions or sets.\n const callbacks = [];\n for (let i = 0; i < queue.length; i++) {\n queue[i].status = TransactionStatus.COMPLETED;\n events = events.concat(\n syncTreeAckUserWrite(repo.serverSyncTree_, queue[i].currentWriteId)\n );\n if (queue[i].onComplete) {\n // We never unset the output snapshot, and given that this\n // transaction is complete, it should be set\n callbacks.push(() =>\n queue[i].onComplete(\n null,\n true,\n queue[i].currentOutputSnapshotResolved\n )\n );\n }\n queue[i].unwatcher();\n }\n\n // Now remove the completed transactions.\n repoPruneCompletedTransactionsBelowNode(\n repo,\n treeSubTree(repo.transactionQueueTree_, path)\n );\n // There may be pending transactions that we can now send.\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n\n // Finally, trigger onComplete callbacks.\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n } else {\n // transactions are no longer sent. Update their status appropriately.\n if (status === 'datastale') {\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT) {\n queue[i].status = TransactionStatus.NEEDS_ABORT;\n } else {\n queue[i].status = TransactionStatus.RUN;\n }\n }\n } else {\n warn(\n 'transaction at ' + pathToSend.toString() + ' failed: ' + status\n );\n for (let i = 0; i < queue.length; i++) {\n queue[i].status = TransactionStatus.NEEDS_ABORT;\n queue[i].abortReason = status;\n }\n }\n\n repoRerunTransactions(repo, path);\n }\n },\n latestHash\n );\n}\n\n/**\n * Finds all transactions dependent on the data at changedPath and reruns them.\n *\n * Should be called any time cached data changes.\n *\n * Return the highest path that was affected by rerunning transactions. This\n * is the path at which events need to be raised for.\n *\n * @param changedPath - The path in mergedData that changed.\n * @returns The rootmost path that was affected by rerunning transactions.\n */\nfunction repoRerunTransactions(repo: Repo, changedPath: Path): Path {\n const rootMostTransactionNode = repoGetAncestorTransactionNode(\n repo,\n changedPath\n );\n const path = treeGetPath(rootMostTransactionNode);\n\n const queue = repoBuildTransactionQueue(repo, rootMostTransactionNode);\n repoRerunTransactionQueue(repo, queue, path);\n\n return path;\n}\n\n/**\n * Does all the work of rerunning transactions (as well as cleans up aborted\n * transactions and whatnot).\n *\n * @param queue - The queue of transactions to run.\n * @param path - The path the queue is for.\n */\nfunction repoRerunTransactionQueue(\n repo: Repo,\n queue: Transaction[],\n path: Path\n): void {\n if (queue.length === 0) {\n return; // Nothing to do!\n }\n\n // Queue up the callbacks and fire them after cleaning up all of our\n // transaction state, since the callback could trigger more transactions or\n // sets.\n const callbacks = [];\n let events: Event[] = [];\n // Ignore all of the sets we're going to re-run.\n const txnsToRerun = queue.filter(q => {\n return q.status === TransactionStatus.RUN;\n });\n const setsToIgnore = txnsToRerun.map(q => {\n return q.currentWriteId;\n });\n for (let i = 0; i < queue.length; i++) {\n const transaction = queue[i];\n const relativePath = newRelativePath(path, transaction.path);\n let abortTransaction = false,\n abortReason;\n assert(\n relativePath !== null,\n 'rerunTransactionsUnderNode_: relativePath should not be null.'\n );\n\n if (transaction.status === TransactionStatus.NEEDS_ABORT) {\n abortTransaction = true;\n abortReason = transaction.abortReason;\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n } else if (transaction.status === TransactionStatus.RUN) {\n if (transaction.retryCount >= MAX_TRANSACTION_RETRIES) {\n abortTransaction = true;\n abortReason = 'maxretry';\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n } else {\n // This code reruns a transaction\n const currentNode = repoGetLatestState(\n repo,\n transaction.path,\n setsToIgnore\n );\n transaction.currentInputSnapshot = currentNode;\n const newData = queue[i].update(currentNode.val());\n if (newData !== undefined) {\n validateFirebaseData(\n 'transaction failed: Data returned ',\n newData,\n transaction.path\n );\n let newDataNode = nodeFromJSON(newData);\n const hasExplicitPriority =\n typeof newData === 'object' &&\n newData != null &&\n contains(newData, '.priority');\n if (!hasExplicitPriority) {\n // Keep the old priority if there wasn't a priority explicitly specified.\n newDataNode = newDataNode.updatePriority(currentNode.getPriority());\n }\n\n const oldWriteId = transaction.currentWriteId;\n const serverValues = repoGenerateServerValues(repo);\n const newNodeResolved = resolveDeferredValueSnapshot(\n newDataNode,\n currentNode,\n serverValues\n );\n\n transaction.currentOutputSnapshotRaw = newDataNode;\n transaction.currentOutputSnapshotResolved = newNodeResolved;\n transaction.currentWriteId = repoGetNextWriteId(repo);\n // Mutates setsToIgnore in place\n setsToIgnore.splice(setsToIgnore.indexOf(oldWriteId), 1);\n events = events.concat(\n syncTreeApplyUserOverwrite(\n repo.serverSyncTree_,\n transaction.path,\n newNodeResolved,\n transaction.currentWriteId,\n transaction.applyLocally\n )\n );\n events = events.concat(\n syncTreeAckUserWrite(repo.serverSyncTree_, oldWriteId, true)\n );\n } else {\n abortTransaction = true;\n abortReason = 'nodata';\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n transaction.currentWriteId,\n true\n )\n );\n }\n }\n }\n eventQueueRaiseEventsForChangedPath(repo.eventQueue_, path, events);\n events = [];\n if (abortTransaction) {\n // Abort.\n queue[i].status = TransactionStatus.COMPLETED;\n\n // Removing a listener can trigger pruning which can muck with\n // mergedData/visibleData (as it prunes data). So defer the unwatcher\n // until we're done.\n (function (unwatcher) {\n setTimeout(unwatcher, Math.floor(0));\n })(queue[i].unwatcher);\n\n if (queue[i].onComplete) {\n if (abortReason === 'nodata') {\n callbacks.push(() =>\n queue[i].onComplete(null, false, queue[i].currentInputSnapshot)\n );\n } else {\n callbacks.push(() =>\n queue[i].onComplete(new Error(abortReason), false, null)\n );\n }\n }\n }\n }\n\n // Clean up completed transactions.\n repoPruneCompletedTransactionsBelowNode(repo, repo.transactionQueueTree_);\n\n // Now fire callbacks, now that we're in a good, known state.\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n\n // Try to send the transaction result to the server.\n repoSendReadyTransactions(repo, repo.transactionQueueTree_);\n}\n\n/**\n * Returns the rootmost ancestor node of the specified path that has a pending\n * transaction on it, or just returns the node for the given path if there are\n * no pending transactions on any ancestor.\n *\n * @param path - The location to start at.\n * @returns The rootmost node with a transaction.\n */\nfunction repoGetAncestorTransactionNode(\n repo: Repo,\n path: Path\n): Tree {\n let front;\n\n // Start at the root and walk deeper into the tree towards path until we\n // find a node with pending transactions.\n let transactionNode = repo.transactionQueueTree_;\n front = pathGetFront(path);\n while (front !== null && treeGetValue(transactionNode) === undefined) {\n transactionNode = treeSubTree(transactionNode, front);\n path = pathPopFront(path);\n front = pathGetFront(path);\n }\n\n return transactionNode;\n}\n\n/**\n * Builds the queue of all transactions at or below the specified\n * transactionNode.\n *\n * @param transactionNode\n * @returns The generated queue.\n */\nfunction repoBuildTransactionQueue(\n repo: Repo,\n transactionNode: Tree\n): Transaction[] {\n // Walk any child transaction queues and aggregate them into a single queue.\n const transactionQueue: Transaction[] = [];\n repoAggregateTransactionQueuesForNode(\n repo,\n transactionNode,\n transactionQueue\n );\n\n // Sort them by the order the transactions were created.\n transactionQueue.sort((a, b) => a.order - b.order);\n\n return transactionQueue;\n}\n\nfunction repoAggregateTransactionQueuesForNode(\n repo: Repo,\n node: Tree,\n queue: Transaction[]\n): void {\n const nodeQueue = treeGetValue(node);\n if (nodeQueue) {\n for (let i = 0; i < nodeQueue.length; i++) {\n queue.push(nodeQueue[i]);\n }\n }\n\n treeForEachChild(node, child => {\n repoAggregateTransactionQueuesForNode(repo, child, queue);\n });\n}\n\n/**\n * Remove COMPLETED transactions at or below this node in the transactionQueueTree_.\n */\nfunction repoPruneCompletedTransactionsBelowNode(\n repo: Repo,\n node: Tree\n): void {\n const queue = treeGetValue(node);\n if (queue) {\n let to = 0;\n for (let from = 0; from < queue.length; from++) {\n if (queue[from].status !== TransactionStatus.COMPLETED) {\n queue[to] = queue[from];\n to++;\n }\n }\n queue.length = to;\n treeSetValue(node, queue.length > 0 ? queue : undefined);\n }\n\n treeForEachChild(node, childNode => {\n repoPruneCompletedTransactionsBelowNode(repo, childNode);\n });\n}\n\n/**\n * Aborts all transactions on ancestors or descendants of the specified path.\n * Called when doing a set() or update() since we consider them incompatible\n * with transactions.\n *\n * @param path - Path for which we want to abort related transactions.\n */\nfunction repoAbortTransactions(repo: Repo, path: Path): Path {\n const affectedPath = treeGetPath(repoGetAncestorTransactionNode(repo, path));\n\n const transactionNode = treeSubTree(repo.transactionQueueTree_, path);\n\n treeForEachAncestor(transactionNode, (node: Tree) => {\n repoAbortTransactionsOnNode(repo, node);\n });\n\n repoAbortTransactionsOnNode(repo, transactionNode);\n\n treeForEachDescendant(transactionNode, (node: Tree) => {\n repoAbortTransactionsOnNode(repo, node);\n });\n\n return affectedPath;\n}\n\n/**\n * Abort transactions stored in this transaction queue node.\n *\n * @param node - Node to abort transactions for.\n */\nfunction repoAbortTransactionsOnNode(\n repo: Repo,\n node: Tree\n): void {\n const queue = treeGetValue(node);\n if (queue) {\n // Queue up the callbacks and fire them after cleaning up all of our\n // transaction state, since the callback could trigger more transactions\n // or sets.\n const callbacks = [];\n\n // Go through queue. Any already-sent transactions must be marked for\n // abort, while the unsent ones can be immediately aborted and removed.\n let events: Event[] = [];\n let lastSent = -1;\n for (let i = 0; i < queue.length; i++) {\n if (queue[i].status === TransactionStatus.SENT_NEEDS_ABORT) {\n // Already marked. No action needed.\n } else if (queue[i].status === TransactionStatus.SENT) {\n assert(\n lastSent === i - 1,\n 'All SENT items should be at beginning of queue.'\n );\n lastSent = i;\n // Mark transaction for abort when it comes back.\n queue[i].status = TransactionStatus.SENT_NEEDS_ABORT;\n queue[i].abortReason = 'set';\n } else {\n assert(\n queue[i].status === TransactionStatus.RUN,\n 'Unexpected transaction status in abort'\n );\n // We can abort it immediately.\n queue[i].unwatcher();\n events = events.concat(\n syncTreeAckUserWrite(\n repo.serverSyncTree_,\n queue[i].currentWriteId,\n true\n )\n );\n if (queue[i].onComplete) {\n callbacks.push(\n queue[i].onComplete.bind(null, new Error('set'), false, null)\n );\n }\n }\n }\n if (lastSent === -1) {\n // We're not waiting for any sent transactions. We can clear the queue.\n treeSetValue(node, undefined);\n } else {\n // Remove the transactions we aborted.\n queue.length = lastSent + 1;\n }\n\n // Now fire the callbacks.\n eventQueueRaiseEventsForChangedPath(\n repo.eventQueue_,\n treeGetPath(node),\n events\n );\n for (let i = 0; i < callbacks.length; i++) {\n exceptionGuard(callbacks[i]);\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { RepoInfo } from '../../RepoInfo';\nimport { Path } from '../Path';\nimport { warnIfPageIsSecure, warn, fatal } from '../util';\n\nfunction decodePath(pathString: string): string {\n let pathStringDecoded = '';\n const pieces = pathString.split('/');\n for (let i = 0; i < pieces.length; i++) {\n if (pieces[i].length > 0) {\n let piece = pieces[i];\n try {\n piece = decodeURIComponent(piece.replace(/\\+/g, ' '));\n } catch (e) {}\n pathStringDecoded += '/' + piece;\n }\n }\n return pathStringDecoded;\n}\n\n/**\n * @returns key value hash\n */\nfunction decodeQuery(queryString: string): { [key: string]: string } {\n const results = {};\n if (queryString.charAt(0) === '?') {\n queryString = queryString.substring(1);\n }\n for (const segment of queryString.split('&')) {\n if (segment.length === 0) {\n continue;\n }\n const kv = segment.split('=');\n if (kv.length === 2) {\n results[decodeURIComponent(kv[0])] = decodeURIComponent(kv[1]);\n } else {\n warn(`Invalid query segment '${segment}' in query '${queryString}'`);\n }\n }\n return results;\n}\n\nexport const parseRepoInfo = function (\n dataURL: string,\n nodeAdmin: boolean\n): { repoInfo: RepoInfo; path: Path } {\n const parsedUrl = parseDatabaseURL(dataURL),\n namespace = parsedUrl.namespace;\n\n if (parsedUrl.domain === 'firebase.com') {\n fatal(\n parsedUrl.host +\n ' is no longer supported. ' +\n 'Please use .firebaseio.com instead'\n );\n }\n\n // Catch common error of uninitialized namespace value.\n if (\n (!namespace || namespace === 'undefined') &&\n parsedUrl.domain !== 'localhost'\n ) {\n fatal(\n 'Cannot parse Firebase url. Please use https://.firebaseio.com'\n );\n }\n\n if (!parsedUrl.secure) {\n warnIfPageIsSecure();\n }\n\n const webSocketOnly = parsedUrl.scheme === 'ws' || parsedUrl.scheme === 'wss';\n\n return {\n repoInfo: new RepoInfo(\n parsedUrl.host,\n parsedUrl.secure,\n namespace,\n webSocketOnly,\n nodeAdmin,\n /*persistenceKey=*/ '',\n /*includeNamespaceInQueryParams=*/ namespace !== parsedUrl.subdomain\n ),\n path: new Path(parsedUrl.pathString)\n };\n};\n\nexport const parseDatabaseURL = function (dataURL: string): {\n host: string;\n port: number;\n domain: string;\n subdomain: string;\n secure: boolean;\n scheme: string;\n pathString: string;\n namespace: string;\n} {\n // Default to empty strings in the event of a malformed string.\n let host = '',\n domain = '',\n subdomain = '',\n pathString = '',\n namespace = '';\n\n // Always default to SSL, unless otherwise specified.\n let secure = true,\n scheme = 'https',\n port = 443;\n\n // Don't do any validation here. The caller is responsible for validating the result of parsing.\n if (typeof dataURL === 'string') {\n // Parse scheme.\n let colonInd = dataURL.indexOf('//');\n if (colonInd >= 0) {\n scheme = dataURL.substring(0, colonInd - 1);\n dataURL = dataURL.substring(colonInd + 2);\n }\n\n // Parse host, path, and query string.\n let slashInd = dataURL.indexOf('/');\n if (slashInd === -1) {\n slashInd = dataURL.length;\n }\n let questionMarkInd = dataURL.indexOf('?');\n if (questionMarkInd === -1) {\n questionMarkInd = dataURL.length;\n }\n host = dataURL.substring(0, Math.min(slashInd, questionMarkInd));\n if (slashInd < questionMarkInd) {\n // For pathString, questionMarkInd will always come after slashInd\n pathString = decodePath(dataURL.substring(slashInd, questionMarkInd));\n }\n const queryParams = decodeQuery(\n dataURL.substring(Math.min(dataURL.length, questionMarkInd))\n );\n\n // If we have a port, use scheme for determining if it's secure.\n colonInd = host.indexOf(':');\n if (colonInd >= 0) {\n secure = scheme === 'https' || scheme === 'wss';\n port = parseInt(host.substring(colonInd + 1), 10);\n } else {\n colonInd = host.length;\n }\n\n const hostWithoutPort = host.slice(0, colonInd);\n if (hostWithoutPort.toLowerCase() === 'localhost') {\n domain = 'localhost';\n } else if (hostWithoutPort.split('.').length <= 2) {\n domain = hostWithoutPort;\n } else {\n // Interpret the subdomain of a 3 or more component URL as the namespace name.\n const dotInd = host.indexOf('.');\n subdomain = host.substring(0, dotInd).toLowerCase();\n domain = host.substring(dotInd + 1);\n // Normalize namespaces to lowercase to share storage / connection.\n namespace = subdomain;\n }\n // Always treat the value of the `ns` as the namespace name if it is present.\n if ('ns' in queryParams) {\n namespace = queryParams['ns'];\n }\n }\n\n return {\n host,\n port,\n domain,\n subdomain,\n secure,\n scheme,\n pathString,\n namespace\n };\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport {\n tryParseInt,\n MAX_NAME,\n MIN_NAME,\n INTEGER_32_MIN,\n INTEGER_32_MAX\n} from '../util/util';\n\n// Modeled after base64 web-safe chars, but ordered by ASCII.\nconst PUSH_CHARS =\n '-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz';\n\nconst MIN_PUSH_CHAR = '-';\n\nconst MAX_PUSH_CHAR = 'z';\n\nconst MAX_KEY_LEN = 786;\n\n/**\n * Fancy ID generator that creates 20-character string identifiers with the\n * following properties:\n *\n * 1. They're based on timestamp so that they sort *after* any existing ids.\n * 2. They contain 72-bits of random data after the timestamp so that IDs won't\n * collide with other clients' IDs.\n * 3. They sort *lexicographically* (so the timestamp is converted to characters\n * that will sort properly).\n * 4. They're monotonically increasing. Even if you generate more than one in\n * the same timestamp, the latter ones will sort after the former ones. We do\n * this by using the previous random bits but \"incrementing\" them by 1 (only\n * in the case of a timestamp collision).\n */\nexport const nextPushId = (function () {\n // Timestamp of last push, used to prevent local collisions if you push twice\n // in one ms.\n let lastPushTime = 0;\n\n // We generate 72-bits of randomness which get turned into 12 characters and\n // appended to the timestamp to prevent collisions with other clients. We\n // store the last characters we generated because in the event of a collision,\n // we'll use those same characters except \"incremented\" by one.\n const lastRandChars: number[] = [];\n\n return function (now: number) {\n const duplicateTime = now === lastPushTime;\n lastPushTime = now;\n\n let i;\n const timeStampChars = new Array(8);\n for (i = 7; i >= 0; i--) {\n timeStampChars[i] = PUSH_CHARS.charAt(now % 64);\n // NOTE: Can't use << here because javascript will convert to int and lose\n // the upper bits.\n now = Math.floor(now / 64);\n }\n assert(now === 0, 'Cannot push at time == 0');\n\n let id = timeStampChars.join('');\n\n if (!duplicateTime) {\n for (i = 0; i < 12; i++) {\n lastRandChars[i] = Math.floor(Math.random() * 64);\n }\n } else {\n // If the timestamp hasn't changed since last push, use the same random\n // number, except incremented by 1.\n for (i = 11; i >= 0 && lastRandChars[i] === 63; i--) {\n lastRandChars[i] = 0;\n }\n lastRandChars[i]++;\n }\n for (i = 0; i < 12; i++) {\n id += PUSH_CHARS.charAt(lastRandChars[i]);\n }\n assert(id.length === 20, 'nextPushId: Length should be 20.');\n\n return id;\n };\n})();\n\nexport const successor = function (key: string) {\n if (key === '' + INTEGER_32_MAX) {\n // See https://firebase.google.com/docs/database/web/lists-of-data#data-order\n return MIN_PUSH_CHAR;\n }\n const keyAsInt: number = tryParseInt(key);\n if (keyAsInt != null) {\n return '' + (keyAsInt + 1);\n }\n const next = new Array(key.length);\n\n for (let i = 0; i < next.length; i++) {\n next[i] = key.charAt(i);\n }\n\n if (next.length < MAX_KEY_LEN) {\n next.push(MIN_PUSH_CHAR);\n return next.join('');\n }\n\n let i = next.length - 1;\n\n while (i >= 0 && next[i] === MAX_PUSH_CHAR) {\n i--;\n }\n\n // `successor` was called on the largest possible key, so return the\n // MAX_NAME, which sorts larger than all keys.\n if (i === -1) {\n return MAX_NAME;\n }\n\n const source = next[i];\n const sourcePlusOne = PUSH_CHARS.charAt(PUSH_CHARS.indexOf(source) + 1);\n next[i] = sourcePlusOne;\n\n return next.slice(0, i + 1).join('');\n};\n\n// `key` is assumed to be non-empty.\nexport const predecessor = function (key: string) {\n if (key === '' + INTEGER_32_MIN) {\n return MIN_NAME;\n }\n const keyAsInt: number = tryParseInt(key);\n if (keyAsInt != null) {\n return '' + (keyAsInt - 1);\n }\n const next = new Array(key.length);\n for (let i = 0; i < next.length; i++) {\n next[i] = key.charAt(i);\n }\n // If `key` ends in `MIN_PUSH_CHAR`, the largest key lexicographically\n // smaller than `key`, is `key[0:key.length - 1]`. The next key smaller\n // than that, `predecessor(predecessor(key))`, is\n //\n // `key[0:key.length - 2] + (key[key.length - 1] - 1) + \\\n // { MAX_PUSH_CHAR repeated MAX_KEY_LEN - (key.length - 1) times }\n //\n // analogous to increment/decrement for base-10 integers.\n //\n // This works because lexicographic comparison works character-by-character,\n // using length as a tie-breaker if one key is a prefix of the other.\n if (next[next.length - 1] === MIN_PUSH_CHAR) {\n if (next.length === 1) {\n // See https://firebase.google.com/docs/database/web/lists-of-data#orderbykey\n return '' + INTEGER_32_MAX;\n }\n delete next[next.length - 1];\n return next.join('');\n }\n // Replace the last character with it's immediate predecessor, and\n // fill the suffix of the key with MAX_PUSH_CHAR. This is the\n // lexicographically largest possible key smaller than `key`.\n next[next.length - 1] = PUSH_CHARS.charAt(\n PUSH_CHARS.indexOf(next[next.length - 1]) - 1\n );\n return next.join('') + MAX_PUSH_CHAR.repeat(MAX_KEY_LEN - next.length);\n};\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { stringify } from '@firebase/util';\n\nimport { DataSnapshot as ExpDataSnapshot } from '../../api/Reference_impl';\nimport { Path } from '../util/Path';\n\nimport { EventRegistration } from './EventRegistration';\n\n/**\n * Encapsulates the data needed to raise an event\n * @interface\n */\nexport interface Event {\n getPath(): Path;\n\n getEventType(): string;\n\n getEventRunner(): () => void;\n\n toString(): string;\n}\n\n/**\n * One of the following strings: \"value\", \"child_added\", \"child_changed\",\n * \"child_removed\", or \"child_moved.\"\n */\nexport type EventType =\n | 'value'\n | 'child_added'\n | 'child_changed'\n | 'child_moved'\n | 'child_removed';\n\n/**\n * Encapsulates the data needed to raise an event\n */\nexport class DataEvent implements Event {\n /**\n * @param eventType - One of: value, child_added, child_changed, child_moved, child_removed\n * @param eventRegistration - The function to call to with the event data. User provided\n * @param snapshot - The data backing the event\n * @param prevName - Optional, the name of the previous child for child_* events.\n */\n constructor(\n public eventType: EventType,\n public eventRegistration: EventRegistration,\n public snapshot: ExpDataSnapshot,\n public prevName?: string | null\n ) {}\n getPath(): Path {\n const ref = this.snapshot.ref;\n if (this.eventType === 'value') {\n return ref._path;\n } else {\n return ref.parent._path;\n }\n }\n getEventType(): string {\n return this.eventType;\n }\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\n }\n toString(): string {\n return (\n this.getPath().toString() +\n ':' +\n this.eventType +\n ':' +\n stringify(this.snapshot.exportVal())\n );\n }\n}\n\nexport class CancelEvent implements Event {\n constructor(\n public eventRegistration: EventRegistration,\n public error: Error,\n public path: Path\n ) {}\n getPath(): Path {\n return this.path;\n }\n getEventType(): string {\n return 'cancel';\n }\n getEventRunner(): () => void {\n return this.eventRegistration.getEventRunner(this);\n }\n toString(): string {\n return this.path.toString() + ':cancel';\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert } from '@firebase/util';\n\nimport { DataSnapshot } from '../../api/Reference_impl';\nimport { Repo } from '../Repo';\nimport { Path } from '../util/Path';\n\nimport { Change } from './Change';\nimport { CancelEvent, Event } from './Event';\nimport { QueryParams } from './QueryParams';\n\n/**\n * A user callback. Callbacks issues from the Legacy SDK maintain references\n * to the original user-issued callbacks, which allows equality\n * comparison by reference even though this callbacks are wrapped before\n * they can be passed to the firebase@exp SDK.\n *\n * @internal\n */\nexport interface UserCallback {\n (dataSnapshot: DataSnapshot, previousChildName?: string | null): unknown;\n userCallback?: unknown;\n context?: object | null;\n}\n\n/**\n * A wrapper class that converts events from the database@exp SDK to the legacy\n * Database SDK. Events are not converted directly as event registration relies\n * on reference comparison of the original user callback (see `matches()`) and\n * relies on equality of the legacy SDK's `context` object.\n */\nexport class CallbackContext {\n constructor(\n private readonly snapshotCallback: UserCallback,\n private readonly cancelCallback?: (error: Error) => unknown\n ) {}\n\n onValue(\n expDataSnapshot: DataSnapshot,\n previousChildName?: string | null\n ): void {\n this.snapshotCallback.call(null, expDataSnapshot, previousChildName);\n }\n\n onCancel(error: Error): void {\n assert(\n this.hasCancelCallback,\n 'Raising a cancel event on a listener with no cancel callback'\n );\n return this.cancelCallback.call(null, error);\n }\n\n get hasCancelCallback(): boolean {\n return !!this.cancelCallback;\n }\n\n matches(other: CallbackContext): boolean {\n return (\n this.snapshotCallback === other.snapshotCallback ||\n (this.snapshotCallback.userCallback !== undefined &&\n this.snapshotCallback.userCallback ===\n other.snapshotCallback.userCallback &&\n this.snapshotCallback.context === other.snapshotCallback.context)\n );\n }\n}\n\nexport interface QueryContext {\n readonly _queryIdentifier: string;\n readonly _queryObject: object;\n readonly _repo: Repo;\n readonly _path: Path;\n readonly _queryParams: QueryParams;\n}\n\n/**\n * An EventRegistration is basically an event type ('value', 'child_added', etc.) and a callback\n * to be notified of that type of event.\n *\n * That said, it can also contain a cancel callback to be notified if the event is canceled. And\n * currently, this code is organized around the idea that you would register multiple child_ callbacks\n * together, as a single EventRegistration. Though currently we don't do that.\n */\nexport interface EventRegistration {\n /**\n * True if this container has a callback to trigger for this event type\n */\n respondsTo(eventType: string): boolean;\n\n createEvent(change: Change, query: QueryContext): Event;\n\n /**\n * Given event data, return a function to trigger the user's callback\n */\n getEventRunner(eventData: Event): () => void;\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null;\n\n matches(other: EventRegistration): boolean;\n\n /**\n * False basically means this is a \"dummy\" callback container being used as a sentinel\n * to remove all callback containers of a particular type. (e.g. if the user does\n * ref.off('value') without specifying a specific callback).\n *\n * (TODO: Rework this, since it's hacky)\n *\n */\n hasAnyCallback(): boolean;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { assert, getModularInstance, Deferred } from '@firebase/util';\n\nimport {\n Repo,\n repoAddEventCallbackForQuery,\n repoGetValue,\n repoRemoveEventCallbackForQuery,\n repoServerTime,\n repoSetWithPriority,\n repoUpdate\n} from '../core/Repo';\nimport { ChildrenNode } from '../core/snap/ChildrenNode';\nimport { Index } from '../core/snap/indexes/Index';\nimport { KEY_INDEX } from '../core/snap/indexes/KeyIndex';\nimport { PathIndex } from '../core/snap/indexes/PathIndex';\nimport { PRIORITY_INDEX } from '../core/snap/indexes/PriorityIndex';\nimport { VALUE_INDEX } from '../core/snap/indexes/ValueIndex';\nimport { Node } from '../core/snap/Node';\nimport { syncPointSetReferenceConstructor } from '../core/SyncPoint';\nimport { syncTreeSetReferenceConstructor } from '../core/SyncTree';\nimport { parseRepoInfo } from '../core/util/libs/parser';\nimport { nextPushId } from '../core/util/NextPushId';\nimport {\n Path,\n pathEquals,\n pathGetBack,\n pathGetFront,\n pathChild,\n pathParent,\n pathToUrlEncodedString,\n pathIsEmpty\n} from '../core/util/Path';\nimport {\n fatal,\n MAX_NAME,\n MIN_NAME,\n ObjectToUniqueKey\n} from '../core/util/util';\nimport {\n isValidPriority,\n validateFirebaseDataArg,\n validateFirebaseMergeDataArg,\n validateKey,\n validatePathString,\n validatePriority,\n validateRootPathString,\n validateUrl,\n validateWritablePath\n} from '../core/util/validation';\nimport { Change } from '../core/view/Change';\nimport { CancelEvent, DataEvent, EventType } from '../core/view/Event';\nimport {\n CallbackContext,\n EventRegistration,\n QueryContext,\n UserCallback\n} from '../core/view/EventRegistration';\nimport {\n QueryParams,\n queryParamsEndAt,\n queryParamsEndBefore,\n queryParamsGetQueryObject,\n queryParamsLimitToFirst,\n queryParamsLimitToLast,\n queryParamsOrderBy,\n queryParamsStartAfter,\n queryParamsStartAt\n} from '../core/view/QueryParams';\n\nimport { Database } from './Database';\nimport { OnDisconnect } from './OnDisconnect';\nimport {\n ListenOptions,\n Query as Query,\n DatabaseReference,\n Unsubscribe,\n ThenableReference\n} from './Reference';\n\n/**\n * @internal\n */\nexport class QueryImpl implements Query, QueryContext {\n /**\n * @hideconstructor\n */\n constructor(\n readonly _repo: Repo,\n readonly _path: Path,\n readonly _queryParams: QueryParams,\n readonly _orderByCalled: boolean\n ) {}\n\n get key(): string | null {\n if (pathIsEmpty(this._path)) {\n return null;\n } else {\n return pathGetBack(this._path);\n }\n }\n\n get ref(): DatabaseReference {\n return new ReferenceImpl(this._repo, this._path);\n }\n\n get _queryIdentifier(): string {\n const obj = queryParamsGetQueryObject(this._queryParams);\n const id = ObjectToUniqueKey(obj);\n return id === '{}' ? 'default' : id;\n }\n\n /**\n * An object representation of the query parameters used by this Query.\n */\n get _queryObject(): object {\n return queryParamsGetQueryObject(this._queryParams);\n }\n\n isEqual(other: QueryImpl | null): boolean {\n other = getModularInstance(other);\n if (!(other instanceof QueryImpl)) {\n return false;\n }\n\n const sameRepo = this._repo === other._repo;\n const samePath = pathEquals(this._path, other._path);\n const sameQueryIdentifier =\n this._queryIdentifier === other._queryIdentifier;\n\n return sameRepo && samePath && sameQueryIdentifier;\n }\n\n toJSON(): string {\n return this.toString();\n }\n\n toString(): string {\n return this._repo.toString() + pathToUrlEncodedString(this._path);\n }\n}\n\n/**\n * Validates that no other order by call has been made\n */\nfunction validateNoPreviousOrderByCall(query: QueryImpl, fnName: string) {\n if (query._orderByCalled === true) {\n throw new Error(fnName + \": You can't combine multiple orderBy calls.\");\n }\n}\n\n/**\n * Validates start/end values for queries.\n */\nfunction validateQueryEndpoints(params: QueryParams) {\n let startNode = null;\n let endNode = null;\n if (params.hasStart()) {\n startNode = params.getIndexStartValue();\n }\n if (params.hasEnd()) {\n endNode = params.getIndexEndValue();\n }\n\n if (params.getIndex() === KEY_INDEX) {\n const tooManyArgsError =\n 'Query: When ordering by key, you may only pass one argument to ' +\n 'startAt(), endAt(), or equalTo().';\n const wrongArgTypeError =\n 'Query: When ordering by key, the argument passed to startAt(), startAfter(), ' +\n 'endAt(), endBefore(), or equalTo() must be a string.';\n if (params.hasStart()) {\n const startName = params.getIndexStartName();\n if (startName !== MIN_NAME) {\n throw new Error(tooManyArgsError);\n } else if (typeof startNode !== 'string') {\n throw new Error(wrongArgTypeError);\n }\n }\n if (params.hasEnd()) {\n const endName = params.getIndexEndName();\n if (endName !== MAX_NAME) {\n throw new Error(tooManyArgsError);\n } else if (typeof endNode !== 'string') {\n throw new Error(wrongArgTypeError);\n }\n }\n } else if (params.getIndex() === PRIORITY_INDEX) {\n if (\n (startNode != null && !isValidPriority(startNode)) ||\n (endNode != null && !isValidPriority(endNode))\n ) {\n throw new Error(\n 'Query: When ordering by priority, the first argument passed to startAt(), ' +\n 'startAfter() endAt(), endBefore(), or equalTo() must be a valid priority value ' +\n '(null, a number, or a string).'\n );\n }\n } else {\n assert(\n params.getIndex() instanceof PathIndex ||\n params.getIndex() === VALUE_INDEX,\n 'unknown index type.'\n );\n if (\n (startNode != null && typeof startNode === 'object') ||\n (endNode != null && typeof endNode === 'object')\n ) {\n throw new Error(\n 'Query: First argument passed to startAt(), startAfter(), endAt(), endBefore(), or ' +\n 'equalTo() cannot be an object.'\n );\n }\n }\n}\n\n/**\n * Validates that limit* has been called with the correct combination of parameters\n */\nfunction validateLimit(params: QueryParams) {\n if (\n params.hasStart() &&\n params.hasEnd() &&\n params.hasLimit() &&\n !params.hasAnchoredLimit()\n ) {\n throw new Error(\n \"Query: Can't combine startAt(), startAfter(), endAt(), endBefore(), and limit(). Use \" +\n 'limitToFirst() or limitToLast() instead.'\n );\n }\n}\n/**\n * @internal\n */\nexport class ReferenceImpl extends QueryImpl implements DatabaseReference {\n /** @hideconstructor */\n constructor(repo: Repo, path: Path) {\n super(repo, path, new QueryParams(), false);\n }\n\n get parent(): ReferenceImpl | null {\n const parentPath = pathParent(this._path);\n return parentPath === null\n ? null\n : new ReferenceImpl(this._repo, parentPath);\n }\n\n get root(): ReferenceImpl {\n let ref: ReferenceImpl = this;\n while (ref.parent !== null) {\n ref = ref.parent;\n }\n return ref;\n }\n}\n\n/**\n * A `DataSnapshot` contains data from a Database location.\n *\n * Any time you read data from the Database, you receive the data as a\n * `DataSnapshot`. A `DataSnapshot` is passed to the event callbacks you attach\n * with `on()` or `once()`. You can extract the contents of the snapshot as a\n * JavaScript object by calling the `val()` method. Alternatively, you can\n * traverse into the snapshot by calling `child()` to return child snapshots\n * (which you could then call `val()` on).\n *\n * A `DataSnapshot` is an efficiently generated, immutable copy of the data at\n * a Database location. It cannot be modified and will never change (to modify\n * data, you always call the `set()` method on a `Reference` directly).\n */\nexport class DataSnapshot {\n /**\n * @param _node - A SnapshotNode to wrap.\n * @param ref - The location this snapshot came from.\n * @param _index - The iteration order for this snapshot\n * @hideconstructor\n */\n constructor(\n readonly _node: Node,\n /**\n * The location of this DataSnapshot.\n */\n readonly ref: DatabaseReference,\n readonly _index: Index\n ) {}\n\n /**\n * Gets the priority value of the data in this `DataSnapshot`.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data |Sorting and filtering data}\n * ).\n */\n get priority(): string | number | null {\n // typecast here because we never return deferred values or internal priorities (MAX_PRIORITY)\n return this._node.getPriority().val() as string | number | null;\n }\n\n /**\n * The key (last part of the path) of the location of this `DataSnapshot`.\n *\n * The last token in a Database location is considered its key. For example,\n * \"ada\" is the key for the /users/ada/ node. Accessing the key on any\n * `DataSnapshot` will return the key for the location that generated it.\n * However, accessing the key on the root URL of a Database will return\n * `null`.\n */\n get key(): string | null {\n return this.ref.key;\n }\n\n /** Returns the number of child properties of this `DataSnapshot`. */\n get size(): number {\n return this._node.numChildren();\n }\n\n /**\n * Gets another `DataSnapshot` for the location at the specified relative path.\n *\n * Passing a relative path to the `child()` method of a DataSnapshot returns\n * another `DataSnapshot` for the location at the specified relative path. The\n * relative path can either be a simple child name (for example, \"ada\") or a\n * deeper, slash-separated path (for example, \"ada/name/first\"). If the child\n * location has no data, an empty `DataSnapshot` (that is, a `DataSnapshot`\n * whose value is `null`) is returned.\n *\n * @param path - A relative path to the location of child data.\n */\n child(path: string): DataSnapshot {\n const childPath = new Path(path);\n const childRef = child(this.ref, path);\n return new DataSnapshot(\n this._node.getChild(childPath),\n childRef,\n PRIORITY_INDEX\n );\n }\n /**\n * Returns true if this `DataSnapshot` contains any data. It is slightly more\n * efficient than using `snapshot.val() !== null`.\n */\n exists(): boolean {\n return !this._node.isEmpty();\n }\n\n /**\n * Exports the entire contents of the DataSnapshot as a JavaScript object.\n *\n * The `exportVal()` method is similar to `val()`, except priority information\n * is included (if available), making it suitable for backing up your data.\n *\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\n * Array, string, number, boolean, or `null`).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n exportVal(): any {\n return this._node.val(true);\n }\n\n /**\n * Enumerates the top-level children in the `IteratedDataSnapshot`.\n *\n * Because of the way JavaScript objects work, the ordering of data in the\n * JavaScript object returned by `val()` is not guaranteed to match the\n * ordering on the server nor the ordering of `onChildAdded()` events. That is\n * where `forEach()` comes in handy. It guarantees the children of a\n * `DataSnapshot` will be iterated in their query order.\n *\n * If no explicit `orderBy*()` method is used, results are returned\n * ordered by key (unless priorities are used, in which case, results are\n * returned by priority).\n *\n * @param action - A function that will be called for each child DataSnapshot.\n * The callback can return true to cancel further enumeration.\n * @returns true if enumeration was canceled due to your callback returning\n * true.\n */\n forEach(action: (child: IteratedDataSnapshot) => boolean | void): boolean {\n if (this._node.isLeafNode()) {\n return false;\n }\n\n const childrenNode = this._node as ChildrenNode;\n // Sanitize the return value to a boolean. ChildrenNode.forEachChild has a weird return type...\n return !!childrenNode.forEachChild(this._index, (key, node) => {\n return action(\n new DataSnapshot(node, child(this.ref, key), PRIORITY_INDEX)\n );\n });\n }\n\n /**\n * Returns true if the specified child path has (non-null) data.\n *\n * @param path - A relative path to the location of a potential child.\n * @returns `true` if data exists at the specified child path; else\n * `false`.\n */\n hasChild(path: string): boolean {\n const childPath = new Path(path);\n return !this._node.getChild(childPath).isEmpty();\n }\n\n /**\n * Returns whether or not the `DataSnapshot` has any non-`null` child\n * properties.\n *\n * You can use `hasChildren()` to determine if a `DataSnapshot` has any\n * children. If it does, you can enumerate them using `forEach()`. If it\n * doesn't, then either this snapshot contains a primitive value (which can be\n * retrieved with `val()`) or it is empty (in which case, `val()` will return\n * `null`).\n *\n * @returns true if this snapshot has any children; else false.\n */\n hasChildren(): boolean {\n if (this._node.isLeafNode()) {\n return false;\n } else {\n return !this._node.isEmpty();\n }\n }\n\n /**\n * Returns a JSON-serializable representation of this object.\n */\n toJSON(): object | null {\n return this.exportVal();\n }\n\n /**\n * Extracts a JavaScript value from a `DataSnapshot`.\n *\n * Depending on the data in a `DataSnapshot`, the `val()` method may return a\n * scalar type (string, number, or boolean), an array, or an object. It may\n * also return null, indicating that the `DataSnapshot` is empty (contains no\n * data).\n *\n * @returns The DataSnapshot's contents as a JavaScript value (Object,\n * Array, string, number, boolean, or `null`).\n */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n val(): any {\n return this._node.val();\n }\n}\n\n/**\n * Represents a child snapshot of a `Reference` that is being iterated over. The key will never be undefined.\n */\nexport interface IteratedDataSnapshot extends DataSnapshot {\n key: string; // key of the location of this snapshot.\n}\n\n/**\n *\n * Returns a `Reference` representing the location in the Database\n * corresponding to the provided path. If no path is provided, the `Reference`\n * will point to the root of the Database.\n *\n * @param db - The database instance to obtain a reference for.\n * @param path - Optional path representing the location the returned\n * `Reference` will point. If not provided, the returned `Reference` will\n * point to the root of the Database.\n * @returns If a path is provided, a `Reference`\n * pointing to the provided path. Otherwise, a `Reference` pointing to the\n * root of the Database.\n */\nexport function ref(db: Database, path?: string): DatabaseReference {\n db = getModularInstance(db);\n db._checkNotDeleted('ref');\n return path !== undefined ? child(db._root, path) : db._root;\n}\n\n/**\n * Returns a `Reference` representing the location in the Database\n * corresponding to the provided Firebase URL.\n *\n * An exception is thrown if the URL is not a valid Firebase Database URL or it\n * has a different domain than the current `Database` instance.\n *\n * Note that all query parameters (`orderBy`, `limitToLast`, etc.) are ignored\n * and are not applied to the returned `Reference`.\n *\n * @param db - The database instance to obtain a reference for.\n * @param url - The Firebase URL at which the returned `Reference` will\n * point.\n * @returns A `Reference` pointing to the provided\n * Firebase URL.\n */\nexport function refFromURL(db: Database, url: string): DatabaseReference {\n db = getModularInstance(db);\n db._checkNotDeleted('refFromURL');\n const parsedURL = parseRepoInfo(url, db._repo.repoInfo_.nodeAdmin);\n validateUrl('refFromURL', parsedURL);\n\n const repoInfo = parsedURL.repoInfo;\n if (\n !db._repo.repoInfo_.isCustomHost() &&\n repoInfo.host !== db._repo.repoInfo_.host\n ) {\n fatal(\n 'refFromURL' +\n ': Host name does not match the current database: ' +\n '(found ' +\n repoInfo.host +\n ' but expected ' +\n db._repo.repoInfo_.host +\n ')'\n );\n }\n\n return ref(db, parsedURL.path.toString());\n}\n/**\n * Gets a `Reference` for the location at the specified relative path.\n *\n * The relative path can either be a simple child name (for example, \"ada\") or\n * a deeper slash-separated path (for example, \"ada/name/first\").\n *\n * @param parent - The parent location.\n * @param path - A relative path from this location to the desired child\n * location.\n * @returns The specified child location.\n */\nexport function child(\n parent: DatabaseReference,\n path: string\n): DatabaseReference {\n parent = getModularInstance(parent);\n if (pathGetFront(parent._path) === null) {\n validateRootPathString('child', 'path', path, false);\n } else {\n validatePathString('child', 'path', path, false);\n }\n return new ReferenceImpl(parent._repo, pathChild(parent._path, path));\n}\n\n/**\n * Returns an `OnDisconnect` object - see\n * {@link https://firebase.google.com/docs/database/web/offline-capabilities | Enabling Offline Capabilities in JavaScript}\n * for more information on how to use it.\n *\n * @param ref - The reference to add OnDisconnect triggers for.\n */\nexport function onDisconnect(ref: DatabaseReference): OnDisconnect {\n ref = getModularInstance(ref) as ReferenceImpl;\n return new OnDisconnect(ref._repo, ref._path);\n}\n\nexport interface ThenableReferenceImpl\n extends ReferenceImpl,\n Pick, 'then' | 'catch'> {}\n\n/**\n * Generates a new child location using a unique key and returns its\n * `Reference`.\n *\n * This is the most common pattern for adding data to a collection of items.\n *\n * If you provide a value to `push()`, the value is written to the\n * generated location. If you don't pass a value, nothing is written to the\n * database and the child remains empty (but you can use the `Reference`\n * elsewhere).\n *\n * The unique keys generated by `push()` are ordered by the current time, so the\n * resulting list of items is chronologically sorted. The keys are also\n * designed to be unguessable (they contain 72 random bits of entropy).\n *\n * See {@link https://firebase.google.com/docs/database/web/lists-of-data#append_to_a_list_of_data | Append to a list of data}.\n * See {@link https://firebase.googleblog.com/2015/02/the-2120-ways-to-ensure-unique_68.html | The 2^120 Ways to Ensure Unique Identifiers}.\n *\n * @param parent - The parent location.\n * @param value - Optional value to be written at the generated location.\n * @returns Combined `Promise` and `Reference`; resolves when write is complete,\n * but can be used immediately as the `Reference` to the child location.\n */\nexport function push(\n parent: DatabaseReference,\n value?: unknown\n): ThenableReference {\n parent = getModularInstance(parent);\n validateWritablePath('push', parent._path);\n validateFirebaseDataArg('push', value, parent._path, true);\n const now = repoServerTime(parent._repo);\n const name = nextPushId(now);\n\n // push() returns a ThennableReference whose promise is fulfilled with a\n // regular Reference. We use child() to create handles to two different\n // references. The first is turned into a ThennableReference below by adding\n // then() and catch() methods and is used as the return value of push(). The\n // second remains a regular Reference and is used as the fulfilled value of\n // the first ThennableReference.\n const thenablePushRef: Partial = child(\n parent,\n name\n ) as ReferenceImpl;\n const pushRef = child(parent, name) as ReferenceImpl;\n\n let promise: Promise;\n if (value != null) {\n promise = set(pushRef, value).then(() => pushRef);\n } else {\n promise = Promise.resolve(pushRef);\n }\n\n thenablePushRef.then = promise.then.bind(promise);\n thenablePushRef.catch = promise.then.bind(promise, undefined);\n return thenablePushRef as ThenableReferenceImpl;\n}\n\n/**\n * Removes the data at this Database location.\n *\n * Any data at child locations will also be deleted.\n *\n * The effect of the remove will be visible immediately and the corresponding\n * event 'value' will be triggered. Synchronization of the remove to the\n * Firebase servers will also be started, and the returned Promise will resolve\n * when complete. If provided, the onComplete callback will be called\n * asynchronously after synchronization has finished.\n *\n * @param ref - The location to remove.\n * @returns Resolves when remove on server is complete.\n */\nexport function remove(ref: DatabaseReference): Promise {\n validateWritablePath('remove', ref._path);\n return set(ref, null);\n}\n\n/**\n * Writes data to this Database location.\n *\n * This will overwrite any data at this location and all child locations.\n *\n * The effect of the write will be visible immediately, and the corresponding\n * events (\"value\", \"child_added\", etc.) will be triggered. Synchronization of\n * the data to the Firebase servers will also be started, and the returned\n * Promise will resolve when complete. If provided, the `onComplete` callback\n * will be called asynchronously after synchronization has finished.\n *\n * Passing `null` for the new value is equivalent to calling `remove()`; namely,\n * all data at this location and all child locations will be deleted.\n *\n * `set()` will remove any priority stored at this location, so if priority is\n * meant to be preserved, you need to use `setWithPriority()` instead.\n *\n * Note that modifying data with `set()` will cancel any pending transactions\n * at that location, so extreme care should be taken if mixing `set()` and\n * `transaction()` to modify the same data.\n *\n * A single `set()` will generate a single \"value\" event at the location where\n * the `set()` was performed.\n *\n * @param ref - The location to write to.\n * @param value - The value to be written (string, number, boolean, object,\n * array, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function set(ref: DatabaseReference, value: unknown): Promise {\n ref = getModularInstance(ref);\n validateWritablePath('set', ref._path);\n validateFirebaseDataArg('set', value, ref._path, false);\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n ref._path,\n value,\n /*priority=*/ null,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Sets a priority for the data at this Database location.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\n * ).\n *\n * @param ref - The location to write to.\n * @param priority - The priority to be written (string, number, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function setPriority(\n ref: DatabaseReference,\n priority: string | number | null\n): Promise {\n ref = getModularInstance(ref);\n validateWritablePath('setPriority', ref._path);\n validatePriority('setPriority', priority, false);\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n pathChild(ref._path, '.priority'),\n priority,\n null,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Writes data the Database location. Like `set()` but also specifies the\n * priority for that data.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sorting_and_filtering_data | Sorting and filtering data}\n * ).\n *\n * @param ref - The location to write to.\n * @param value - The value to be written (string, number, boolean, object,\n * array, or null).\n * @param priority - The priority to be written (string, number, or null).\n * @returns Resolves when write to server is complete.\n */\nexport function setWithPriority(\n ref: DatabaseReference,\n value: unknown,\n priority: string | number | null\n): Promise {\n validateWritablePath('setWithPriority', ref._path);\n validateFirebaseDataArg('setWithPriority', value, ref._path, false);\n validatePriority('setWithPriority', priority, false);\n if (ref.key === '.length' || ref.key === '.keys') {\n throw 'setWithPriority failed: ' + ref.key + ' is a read-only object.';\n }\n\n const deferred = new Deferred();\n repoSetWithPriority(\n ref._repo,\n ref._path,\n value,\n priority,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Writes multiple values to the Database at once.\n *\n * The `values` argument contains multiple property-value pairs that will be\n * written to the Database together. Each child property can either be a simple\n * property (for example, \"name\") or a relative path (for example,\n * \"name/first\") from the current location to the data to update.\n *\n * As opposed to the `set()` method, `update()` can be use to selectively update\n * only the referenced properties at the current location (instead of replacing\n * all the child properties at the current location).\n *\n * The effect of the write will be visible immediately, and the corresponding\n * events ('value', 'child_added', etc.) will be triggered. Synchronization of\n * the data to the Firebase servers will also be started, and the returned\n * Promise will resolve when complete. If provided, the `onComplete` callback\n * will be called asynchronously after synchronization has finished.\n *\n * A single `update()` will generate a single \"value\" event at the location\n * where the `update()` was performed, regardless of how many children were\n * modified.\n *\n * Note that modifying data with `update()` will cancel any pending\n * transactions at that location, so extreme care should be taken if mixing\n * `update()` and `transaction()` to modify the same data.\n *\n * Passing `null` to `update()` will remove the data at this location.\n *\n * See\n * {@link https://firebase.googleblog.com/2015/09/introducing-multi-location-updates-and_86.html | Introducing multi-location updates and more}.\n *\n * @param ref - The location to write to.\n * @param values - Object containing multiple values.\n * @returns Resolves when update on server is complete.\n */\nexport function update(ref: DatabaseReference, values: object): Promise {\n validateFirebaseMergeDataArg('update', values, ref._path, false);\n const deferred = new Deferred();\n repoUpdate(\n ref._repo,\n ref._path,\n values as Record,\n deferred.wrapCallback(() => {})\n );\n return deferred.promise;\n}\n\n/**\n * Gets the most up-to-date result for this query.\n *\n * @param query - The query to run.\n * @returns A `Promise` which resolves to the resulting DataSnapshot if a value is\n * available, or rejects if the client is unable to return a value (e.g., if the\n * server is unreachable and there is nothing cached).\n */\nexport function get(query: Query): Promise {\n query = getModularInstance(query) as QueryImpl;\n const callbackContext = new CallbackContext(() => {});\n const container = new ValueEventRegistration(callbackContext);\n return repoGetValue(query._repo, query, container).then(node => {\n return new DataSnapshot(\n node,\n new ReferenceImpl(query._repo, query._path),\n query._queryParams.getIndex()\n );\n });\n}\n/**\n * Represents registration for 'value' events.\n */\nexport class ValueEventRegistration implements EventRegistration {\n constructor(private callbackContext: CallbackContext) {}\n\n respondsTo(eventType: string): boolean {\n return eventType === 'value';\n }\n\n createEvent(change: Change, query: QueryContext): DataEvent {\n const index = query._queryParams.getIndex();\n return new DataEvent(\n 'value',\n this,\n new DataSnapshot(\n change.snapshotNode,\n new ReferenceImpl(query._repo, query._path),\n index\n )\n );\n }\n\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n if (eventData.getEventType() === 'cancel') {\n return () =>\n this.callbackContext.onCancel((eventData as CancelEvent).error);\n } else {\n return () =>\n this.callbackContext.onValue((eventData as DataEvent).snapshot, null);\n }\n }\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.callbackContext.hasCancelCallback) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n matches(other: EventRegistration): boolean {\n if (!(other instanceof ValueEventRegistration)) {\n return false;\n } else if (!other.callbackContext || !this.callbackContext) {\n // If no callback specified, we consider it to match any callback.\n return true;\n } else {\n return other.callbackContext.matches(this.callbackContext);\n }\n }\n\n hasAnyCallback(): boolean {\n return this.callbackContext !== null;\n }\n}\n\n/**\n * Represents the registration of a child_x event.\n */\nexport class ChildEventRegistration implements EventRegistration {\n constructor(\n private eventType: string,\n private callbackContext: CallbackContext | null\n ) {}\n\n respondsTo(eventType: string): boolean {\n let eventToCheck =\n eventType === 'children_added' ? 'child_added' : eventType;\n eventToCheck =\n eventToCheck === 'children_removed' ? 'child_removed' : eventToCheck;\n return this.eventType === eventToCheck;\n }\n\n createCancelEvent(error: Error, path: Path): CancelEvent | null {\n if (this.callbackContext.hasCancelCallback) {\n return new CancelEvent(this, error, path);\n } else {\n return null;\n }\n }\n\n createEvent(change: Change, query: QueryContext): DataEvent {\n assert(change.childName != null, 'Child events should have a childName.');\n const childRef = child(\n new ReferenceImpl(query._repo, query._path),\n change.childName\n );\n const index = query._queryParams.getIndex();\n return new DataEvent(\n change.type as EventType,\n this,\n new DataSnapshot(change.snapshotNode, childRef, index),\n change.prevName\n );\n }\n\n getEventRunner(eventData: CancelEvent | DataEvent): () => void {\n if (eventData.getEventType() === 'cancel') {\n return () =>\n this.callbackContext.onCancel((eventData as CancelEvent).error);\n } else {\n return () =>\n this.callbackContext.onValue(\n (eventData as DataEvent).snapshot,\n (eventData as DataEvent).prevName\n );\n }\n }\n\n matches(other: EventRegistration): boolean {\n if (other instanceof ChildEventRegistration) {\n return (\n this.eventType === other.eventType &&\n (!this.callbackContext ||\n !other.callbackContext ||\n this.callbackContext.matches(other.callbackContext))\n );\n }\n\n return false;\n }\n\n hasAnyCallback(): boolean {\n return !!this.callbackContext;\n }\n}\n\nfunction addEventListener(\n query: Query,\n eventType: EventType,\n callback: UserCallback,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n) {\n let cancelCallback: ((error: Error) => unknown) | undefined;\n if (typeof cancelCallbackOrListenOptions === 'object') {\n cancelCallback = undefined;\n options = cancelCallbackOrListenOptions;\n }\n if (typeof cancelCallbackOrListenOptions === 'function') {\n cancelCallback = cancelCallbackOrListenOptions;\n }\n\n if (options && options.onlyOnce) {\n const userCallback = callback;\n const onceCallback: UserCallback = (dataSnapshot, previousChildName) => {\n repoRemoveEventCallbackForQuery(query._repo, query, container);\n userCallback(dataSnapshot, previousChildName);\n };\n onceCallback.userCallback = callback.userCallback;\n onceCallback.context = callback.context;\n callback = onceCallback;\n }\n\n const callbackContext = new CallbackContext(\n callback,\n cancelCallback || undefined\n );\n const container =\n eventType === 'value'\n ? new ValueEventRegistration(callbackContext)\n : new ChildEventRegistration(eventType, callbackContext);\n repoAddEventCallbackForQuery(query._repo, query, container);\n return () => repoRemoveEventCallbackForQuery(query._repo, query, container);\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onValue` event will trigger once with the initial data stored at this\n * location, and then trigger again each time the data changes. The\n * `DataSnapshot` passed to the callback will be for the location at which\n * `on()` was called. It won't trigger until the entire contents has been\n * synchronized. If the location has no data, it will be triggered with an empty\n * `DataSnapshot` (`val()` will return `null`).\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs. The\n * callback will be passed a DataSnapshot.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onValue(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'value',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName?: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildAdded` event will be triggered once for each initial child at this\n * location, and it will be triggered again every time a new child is added. The\n * `DataSnapshot` passed into the callback will reflect the data for the\n * relevant child. For ordering purposes, it is passed a second argument which\n * is a string containing the key of the previous sibling child by sort order,\n * or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildAdded(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_added',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildChanged` event will be triggered when the data stored in a child\n * (or any of its descendants) changes. Note that a single `child_changed` event\n * may represent multiple changes to the child. The `DataSnapshot` passed to the\n * callback will contain the new child contents. For ordering purposes, the\n * callback is also passed a second argument which is a string containing the\n * key of the previous sibling child by sort order, or `null` if it is the first\n * child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildChanged(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_changed',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildMoved` event will be triggered when a child's sort order changes\n * such that its position relative to its siblings changes. The `DataSnapshot`\n * passed to the callback will be for the data of the child that has moved. It\n * is also passed a second argument which is a string containing the key of the\n * previous sibling child by sort order, or `null` if it is the first child.\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildMoved(\n query: Query,\n callback: (\n snapshot: DataSnapshot,\n previousChildName: string | null\n ) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_moved',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback?: (error: Error) => unknown\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\n/**\n * Listens for data changes at a particular location.\n *\n * This is the primary way to read data from a Database. Your callback\n * will be triggered for the initial data and again whenever the data changes.\n * Invoke the returned unsubscribe callback to stop receiving updates. See\n * {@link https://firebase.google.com/docs/database/web/retrieve-data | Retrieve Data on the Web}\n * for more details.\n *\n * An `onChildRemoved` event will be triggered once every time a child is\n * removed. The `DataSnapshot` passed into the callback will be the old data for\n * the child that was removed. A child will get removed when either:\n *\n * - a client explicitly calls `remove()` on that child or one of its ancestors\n * - a client calls `set(null)` on that child or one of its ancestors\n * - that child has all of its children removed\n * - there is a query in effect which now filters out the child (because it's\n * sort order changed or the max limit was hit)\n *\n * @param query - The query to run.\n * @param callback - A callback that fires when the specified event occurs.\n * The callback will be passed a DataSnapshot and a string containing the key of\n * the previous child, by sort order, or `null` if it is the first child.\n * @param cancelCallback - An optional callback that will be notified if your\n * event subscription is ever canceled because your client does not have\n * permission to read this data (or it had permission but has now lost it).\n * This callback will be passed an `Error` object indicating why the failure\n * occurred.\n * @param options - An object that can be used to configure `onlyOnce`, which\n * then removes the listener after its first invocation.\n * @returns A function that can be invoked to remove the listener.\n */\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallback: (error: Error) => unknown,\n options: ListenOptions\n): Unsubscribe;\n\nexport function onChildRemoved(\n query: Query,\n callback: (snapshot: DataSnapshot) => unknown,\n cancelCallbackOrListenOptions?: ((error: Error) => unknown) | ListenOptions,\n options?: ListenOptions\n): Unsubscribe {\n return addEventListener(\n query,\n 'child_removed',\n callback,\n cancelCallbackOrListenOptions,\n options\n );\n}\n\nexport { EventType };\n\n/**\n * Detaches a callback previously attached with the corresponding `on*()` (`onValue`, `onChildAdded`) listener.\n * Note: This is not the recommended way to remove a listener. Instead, please use the returned callback function from\n * the respective `on*` callbacks.\n *\n * Detach a callback previously attached with `on*()`. Calling `off()` on a parent listener\n * will not automatically remove listeners registered on child nodes, `off()`\n * must also be called on any child listeners to remove the callback.\n *\n * If a callback is not specified, all callbacks for the specified eventType\n * will be removed. Similarly, if no eventType is specified, all callbacks\n * for the `Reference` will be removed.\n *\n * Individual listeners can also be removed by invoking their unsubscribe\n * callbacks.\n *\n * @param query - The query that the listener was registered with.\n * @param eventType - One of the following strings: \"value\", \"child_added\",\n * \"child_changed\", \"child_removed\", or \"child_moved.\" If omitted, all callbacks\n * for the `Reference` will be removed.\n * @param callback - The callback function that was passed to `on()` or\n * `undefined` to remove all callbacks.\n */\nexport function off(\n query: Query,\n eventType?: EventType,\n callback?: (\n snapshot: DataSnapshot,\n previousChildName?: string | null\n ) => unknown\n): void {\n let container: EventRegistration | null = null;\n const expCallback = callback ? new CallbackContext(callback) : null;\n if (eventType === 'value') {\n container = new ValueEventRegistration(expCallback);\n } else if (eventType) {\n container = new ChildEventRegistration(eventType, expCallback);\n }\n repoRemoveEventCallbackForQuery(query._repo, query, container);\n}\n\n/** Describes the different query constraints available in this SDK. */\nexport type QueryConstraintType =\n | 'endAt'\n | 'endBefore'\n | 'startAt'\n | 'startAfter'\n | 'limitToFirst'\n | 'limitToLast'\n | 'orderByChild'\n | 'orderByKey'\n | 'orderByPriority'\n | 'orderByValue'\n | 'equalTo';\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Database query. `QueryConstraint`s are created by invoking {@link endAt},\n * {@link endBefore}, {@link startAt}, {@link startAfter}, {@link\n * limitToFirst}, {@link limitToLast}, {@link orderByChild},\n * {@link orderByChild}, {@link orderByKey} , {@link orderByPriority} ,\n * {@link orderByValue} or {@link equalTo} and\n * can then be passed to {@link query} to create a new query instance that\n * also contains this `QueryConstraint`.\n */\nexport abstract class QueryConstraint {\n /** The type of this query constraints */\n abstract readonly type: QueryConstraintType;\n\n /**\n * Takes the provided `Query` and returns a copy of the `Query` with this\n * `QueryConstraint` applied.\n */\n abstract _apply(query: QueryImpl): QueryImpl;\n}\n\nclass QueryEndAtConstraint extends QueryConstraint {\n readonly type = 'endAt';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('endAt', this._value, query._path, true);\n const newParams = queryParamsEndAt(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'endAt: Starting point was already set (by another call to endAt, ' +\n 'endBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified ending point.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The ending point is inclusive, so children with exactly the specified value\n * will be included in the query. The optional key argument can be used to\n * further limit the range of the query. If it is specified, then children that\n * have exactly the specified value must also have a key name less than or equal\n * to the specified key.\n *\n * You can read more about `endAt()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to end at. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to end at, among the children with the previously\n * specified priority. This argument is only allowed if ordering by child,\n * value, or priority.\n */\nexport function endAt(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('endAt', 'key', key, true);\n return new QueryEndAtConstraint(value, key);\n}\n\nclass QueryEndBeforeConstraint extends QueryConstraint {\n readonly type = 'endBefore';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('endBefore', this._value, query._path, false);\n const newParams = queryParamsEndBefore(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'endBefore: Starting point was already set (by another call to endAt, ' +\n 'endBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified ending point (exclusive).\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The ending point is exclusive. If only a value is provided, children\n * with a value less than the specified value will be included in the query.\n * If a key is specified, then children must have a value less than or equal\n * to the specified value and a key name less than the specified key.\n *\n * @param value - The value to end before. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to end before, among the children with the\n * previously specified priority. This argument is only allowed if ordering by\n * child, value, or priority.\n */\nexport function endBefore(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('endBefore', 'key', key, true);\n return new QueryEndBeforeConstraint(value, key);\n}\n\nclass QueryStartAtConstraint extends QueryConstraint {\n readonly type = 'startAt';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('startAt', this._value, query._path, true);\n const newParams = queryParamsStartAt(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'startAt: Starting point was already set (by another call to startAt, ' +\n 'startBefore or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified starting point.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The starting point is inclusive, so children with exactly the specified value\n * will be included in the query. The optional key argument can be used to\n * further limit the range of the query. If it is specified, then children that\n * have exactly the specified value must also have a key name greater than or\n * equal to the specified key.\n *\n * You can read more about `startAt()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to start at. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start at. This argument is only allowed if\n * ordering by child, value, or priority.\n */\nexport function startAt(\n value: number | string | boolean | null = null,\n key?: string\n): QueryConstraint {\n validateKey('startAt', 'key', key, true);\n return new QueryStartAtConstraint(value, key);\n}\n\nclass QueryStartAfterConstraint extends QueryConstraint {\n readonly type = 'startAfter';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('startAfter', this._value, query._path, false);\n const newParams = queryParamsStartAfter(\n query._queryParams,\n this._value,\n this._key\n );\n validateLimit(newParams);\n validateQueryEndpoints(newParams);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'startAfter: Starting point was already set (by another call to startAt, ' +\n 'startAfter, or equalTo).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` with the specified starting point (exclusive).\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The starting point is exclusive. If only a value is provided, children\n * with a value greater than the specified value will be included in the query.\n * If a key is specified, then children must have a value greater than or equal\n * to the specified value and a a key name greater than the specified key.\n *\n * @param value - The value to start after. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start after. This argument is only allowed if\n * ordering by child, value, or priority.\n */\nexport function startAfter(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('startAfter', 'key', key, true);\n return new QueryStartAfterConstraint(value, key);\n}\n\nclass QueryLimitToFirstConstraint extends QueryConstraint {\n readonly type = 'limitToFirst';\n\n constructor(private readonly _limit: number) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n if (query._queryParams.hasLimit()) {\n throw new Error(\n 'limitToFirst: Limit was already set (by another call to limitToFirst ' +\n 'or limitToLast).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n queryParamsLimitToFirst(query._queryParams, this._limit),\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that if limited to the first specific number\n * of children.\n *\n * The `limitToFirst()` method is used to set a maximum number of children to be\n * synced for a given callback. If we set a limit of 100, we will initially only\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\n * stored in our Database, a `child_added` event will fire for each message.\n * However, if we have over 100 messages, we will only receive a `child_added`\n * event for the first 100 ordered messages. As items change, we will receive\n * `child_removed` events for each item that drops out of the active list so\n * that the total number stays at 100.\n *\n * You can read more about `limitToFirst()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param limit - The maximum number of nodes to include in this query.\n */\nexport function limitToFirst(limit: number): QueryConstraint {\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\n throw new Error('limitToFirst: First argument must be a positive integer.');\n }\n return new QueryLimitToFirstConstraint(limit);\n}\n\nclass QueryLimitToLastConstraint extends QueryConstraint {\n readonly type = 'limitToLast';\n\n constructor(private readonly _limit: number) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n if (query._queryParams.hasLimit()) {\n throw new Error(\n 'limitToLast: Limit was already set (by another call to limitToFirst ' +\n 'or limitToLast).'\n );\n }\n return new QueryImpl(\n query._repo,\n query._path,\n queryParamsLimitToLast(query._queryParams, this._limit),\n query._orderByCalled\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that is limited to return only the last\n * specified number of children.\n *\n * The `limitToLast()` method is used to set a maximum number of children to be\n * synced for a given callback. If we set a limit of 100, we will initially only\n * receive up to 100 `child_added` events. If we have fewer than 100 messages\n * stored in our Database, a `child_added` event will fire for each message.\n * However, if we have over 100 messages, we will only receive a `child_added`\n * event for the last 100 ordered messages. As items change, we will receive\n * `child_removed` events for each item that drops out of the active list so\n * that the total number stays at 100.\n *\n * You can read more about `limitToLast()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param limit - The maximum number of nodes to include in this query.\n */\nexport function limitToLast(limit: number): QueryConstraint {\n if (typeof limit !== 'number' || Math.floor(limit) !== limit || limit <= 0) {\n throw new Error('limitToLast: First argument must be a positive integer.');\n }\n\n return new QueryLimitToLastConstraint(limit);\n}\n\nclass QueryOrderByChildConstraint extends QueryConstraint {\n readonly type = 'orderByChild';\n\n constructor(private readonly _path: string) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByChild');\n const parsedPath = new Path(this._path);\n if (pathIsEmpty(parsedPath)) {\n throw new Error(\n 'orderByChild: cannot pass in empty path. Use orderByValue() instead.'\n );\n }\n const index = new PathIndex(parsedPath);\n const newParams = queryParamsOrderBy(query._queryParams, index);\n validateQueryEndpoints(newParams);\n\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by the specified child key.\n *\n * Queries can only order by one key at a time. Calling `orderByChild()`\n * multiple times on the same query is an error.\n *\n * Firebase queries allow you to order your data by any child key on the fly.\n * However, if you know in advance what your indexes will be, you can define\n * them via the .indexOn rule in your Security Rules for better performance. See\n * the{@link https://firebase.google.com/docs/database/security/indexing-data}\n * rule for more information.\n *\n * You can read more about `orderByChild()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n *\n * @param path - The path to order by.\n */\nexport function orderByChild(path: string): QueryConstraint {\n if (path === '$key') {\n throw new Error(\n 'orderByChild: \"$key\" is invalid. Use orderByKey() instead.'\n );\n } else if (path === '$priority') {\n throw new Error(\n 'orderByChild: \"$priority\" is invalid. Use orderByPriority() instead.'\n );\n } else if (path === '$value') {\n throw new Error(\n 'orderByChild: \"$value\" is invalid. Use orderByValue() instead.'\n );\n }\n validatePathString('orderByChild', 'path', path, false);\n return new QueryOrderByChildConstraint(path);\n}\n\nclass QueryOrderByKeyConstraint extends QueryConstraint {\n readonly type = 'orderByKey';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByKey');\n const newParams = queryParamsOrderBy(query._queryParams, KEY_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by the key.\n *\n * Sorts the results of a query by their (ascending) key values.\n *\n * You can read more about `orderByKey()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n */\nexport function orderByKey(): QueryConstraint {\n return new QueryOrderByKeyConstraint();\n}\n\nclass QueryOrderByPriorityConstraint extends QueryConstraint {\n readonly type = 'orderByPriority';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByPriority');\n const newParams = queryParamsOrderBy(query._queryParams, PRIORITY_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by priority.\n *\n * Applications need not use priority but can order collections by\n * ordinary properties (see\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}\n * for alternatives to priority.\n */\nexport function orderByPriority(): QueryConstraint {\n return new QueryOrderByPriorityConstraint();\n}\n\nclass QueryOrderByValueConstraint extends QueryConstraint {\n readonly type = 'orderByValue';\n\n _apply(query: QueryImpl): QueryImpl {\n validateNoPreviousOrderByCall(query, 'orderByValue');\n const newParams = queryParamsOrderBy(query._queryParams, VALUE_INDEX);\n validateQueryEndpoints(newParams);\n return new QueryImpl(\n query._repo,\n query._path,\n newParams,\n /*orderByCalled=*/ true\n );\n }\n}\n\n/**\n * Creates a new `QueryConstraint` that orders by value.\n *\n * If the children of a query are all scalar values (string, number, or\n * boolean), you can order the results by their (ascending) values.\n *\n * You can read more about `orderByValue()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#sort_data | Sort data}.\n */\nexport function orderByValue(): QueryConstraint {\n return new QueryOrderByValueConstraint();\n}\n\nclass QueryEqualToValueConstraint extends QueryConstraint {\n readonly type = 'equalTo';\n\n constructor(\n private readonly _value: number | string | boolean | null,\n private readonly _key?: string\n ) {\n super();\n }\n\n _apply(query: QueryImpl): QueryImpl {\n validateFirebaseDataArg('equalTo', this._value, query._path, false);\n if (query._queryParams.hasStart()) {\n throw new Error(\n 'equalTo: Starting point was already set (by another call to startAt/startAfter or ' +\n 'equalTo).'\n );\n }\n if (query._queryParams.hasEnd()) {\n throw new Error(\n 'equalTo: Ending point was already set (by another call to endAt/endBefore or ' +\n 'equalTo).'\n );\n }\n return new QueryEndAtConstraint(this._value, this._key)._apply(\n new QueryStartAtConstraint(this._value, this._key)._apply(query)\n );\n }\n}\n\n/**\n * Creates a `QueryConstraint` that includes children that match the specified\n * value.\n *\n * Using `startAt()`, `startAfter()`, `endBefore()`, `endAt()` and `equalTo()`\n * allows you to choose arbitrary starting and ending points for your queries.\n *\n * The optional key argument can be used to further limit the range of the\n * query. If it is specified, then children that have exactly the specified\n * value must also have exactly the specified key as their key name. This can be\n * used to filter result sets with many matches for the same value.\n *\n * You can read more about `equalTo()` in\n * {@link https://firebase.google.com/docs/database/web/lists-of-data#filtering_data | Filtering data}.\n *\n * @param value - The value to match for. The argument type depends on which\n * `orderBy*()` function was used in this query. Specify a value that matches\n * the `orderBy*()` type. When used in combination with `orderByKey()`, the\n * value must be a string.\n * @param key - The child key to start at, among the children with the\n * previously specified priority. This argument is only allowed if ordering by\n * child, value, or priority.\n */\nexport function equalTo(\n value: number | string | boolean | null,\n key?: string\n): QueryConstraint {\n validateKey('equalTo', 'key', key, true);\n return new QueryEqualToValueConstraint(value, key);\n}\n\n/**\n * Creates a new immutable instance of `Query` that is extended to also include\n * additional query constraints.\n *\n * @param query - The Query instance to use as a base for the new constraints.\n * @param queryConstraints - The list of `QueryConstraint`s to apply.\n * @throws if any of the provided query constraints cannot be combined with the\n * existing or new constraints.\n */\nexport function query(\n query: Query,\n ...queryConstraints: QueryConstraint[]\n): Query {\n let queryImpl = getModularInstance(query) as QueryImpl;\n for (const constraint of queryConstraints) {\n queryImpl = constraint._apply(queryImpl);\n }\n return queryImpl;\n}\n\n/**\n * Define reference constructor in various modules\n *\n * We are doing this here to avoid several circular\n * dependency issues\n */\nsyncPointSetReferenceConstructor(ReferenceImpl);\nsyncTreeSetReferenceConstructor(ReferenceImpl);\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _FirebaseService,\n _getProvider,\n FirebaseApp,\n getApp\n} from '@firebase/app';\nimport { AppCheckInternalComponentName } from '@firebase/app-check-interop-types';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\nimport {\n getModularInstance,\n createMockUserToken,\n EmulatorMockTokenOptions,\n getDefaultEmulatorHostnameAndPort\n} from '@firebase/util';\n\nimport { AppCheckTokenProvider } from '../core/AppCheckTokenProvider';\nimport {\n AuthTokenProvider,\n EmulatorTokenProvider,\n FirebaseAuthTokenProvider\n} from '../core/AuthTokenProvider';\nimport { Repo, repoInterrupt, repoResume, repoStart } from '../core/Repo';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { parseRepoInfo } from '../core/util/libs/parser';\nimport { newEmptyPath, pathIsEmpty } from '../core/util/Path';\nimport {\n warn,\n fatal,\n log,\n enableLogging as enableLoggingImpl\n} from '../core/util/util';\nimport { validateUrl } from '../core/util/validation';\nimport { BrowserPollConnection } from '../realtime/BrowserPollConnection';\nimport { TransportManager } from '../realtime/TransportManager';\nimport { WebSocketConnection } from '../realtime/WebSocketConnection';\n\nimport { ReferenceImpl } from './Reference_impl';\n\nexport { EmulatorMockTokenOptions } from '@firebase/util';\n/**\n * This variable is also defined in the firebase Node.js Admin SDK. Before\n * modifying this definition, consult the definition in:\n *\n * https://github.com/firebase/firebase-admin-node\n *\n * and make sure the two are consistent.\n */\nconst FIREBASE_DATABASE_EMULATOR_HOST_VAR = 'FIREBASE_DATABASE_EMULATOR_HOST';\n\n/**\n * Creates and caches `Repo` instances.\n */\nconst repos: {\n [appName: string]: {\n [dbUrl: string]: Repo;\n };\n} = {};\n\n/**\n * If true, any new `Repo` will be created to use `ReadonlyRestClient` (for testing purposes).\n */\nlet useRestClient = false;\n\n/**\n * Update an existing `Repo` in place to point to a new host/port.\n */\nfunction repoManagerApplyEmulatorSettings(\n repo: Repo,\n host: string,\n port: number,\n tokenProvider?: AuthTokenProvider\n): void {\n repo.repoInfo_ = new RepoInfo(\n `${host}:${port}`,\n /* secure= */ false,\n repo.repoInfo_.namespace,\n repo.repoInfo_.webSocketOnly,\n repo.repoInfo_.nodeAdmin,\n repo.repoInfo_.persistenceKey,\n repo.repoInfo_.includeNamespaceInQueryParams,\n /*isUsingEmulator=*/ true\n );\n\n if (tokenProvider) {\n repo.authTokenProvider_ = tokenProvider;\n }\n}\n\n/**\n * This function should only ever be called to CREATE a new database instance.\n * @internal\n */\nexport function repoManagerDatabaseFromApp(\n app: FirebaseApp,\n authProvider: Provider,\n appCheckProvider?: Provider,\n url?: string,\n nodeAdmin?: boolean\n): Database {\n let dbUrl: string | undefined = url || app.options.databaseURL;\n if (dbUrl === undefined) {\n if (!app.options.projectId) {\n fatal(\n \"Can't determine Firebase Database URL. Be sure to include \" +\n ' a Project ID when calling firebase.initializeApp().'\n );\n }\n\n log('Using default host for project ', app.options.projectId);\n dbUrl = `${app.options.projectId}-default-rtdb.firebaseio.com`;\n }\n\n let parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\n let repoInfo = parsedUrl.repoInfo;\n\n let isEmulator: boolean;\n\n let dbEmulatorHost: string | undefined = undefined;\n if (typeof process !== 'undefined' && process.env) {\n dbEmulatorHost = process.env[FIREBASE_DATABASE_EMULATOR_HOST_VAR];\n }\n\n if (dbEmulatorHost) {\n isEmulator = true;\n dbUrl = `http://${dbEmulatorHost}?ns=${repoInfo.namespace}`;\n parsedUrl = parseRepoInfo(dbUrl, nodeAdmin);\n repoInfo = parsedUrl.repoInfo;\n } else {\n isEmulator = !parsedUrl.repoInfo.secure;\n }\n\n const authTokenProvider =\n nodeAdmin && isEmulator\n ? new EmulatorTokenProvider(EmulatorTokenProvider.OWNER)\n : new FirebaseAuthTokenProvider(app.name, app.options, authProvider);\n\n validateUrl('Invalid Firebase Database URL', parsedUrl);\n if (!pathIsEmpty(parsedUrl.path)) {\n fatal(\n 'Database URL must point to the root of a Firebase Database ' +\n '(not including a child path).'\n );\n }\n\n const repo = repoManagerCreateRepo(\n repoInfo,\n app,\n authTokenProvider,\n new AppCheckTokenProvider(app.name, appCheckProvider)\n );\n return new Database(repo, app);\n}\n\n/**\n * Remove the repo and make sure it is disconnected.\n *\n */\nfunction repoManagerDeleteRepo(repo: Repo, appName: string): void {\n const appRepos = repos[appName];\n // This should never happen...\n if (!appRepos || appRepos[repo.key] !== repo) {\n fatal(`Database ${appName}(${repo.repoInfo_}) has already been deleted.`);\n }\n repoInterrupt(repo);\n delete appRepos[repo.key];\n}\n\n/**\n * Ensures a repo doesn't already exist and then creates one using the\n * provided app.\n *\n * @param repoInfo - The metadata about the Repo\n * @returns The Repo object for the specified server / repoName.\n */\nfunction repoManagerCreateRepo(\n repoInfo: RepoInfo,\n app: FirebaseApp,\n authTokenProvider: AuthTokenProvider,\n appCheckProvider: AppCheckTokenProvider\n): Repo {\n let appRepos = repos[app.name];\n\n if (!appRepos) {\n appRepos = {};\n repos[app.name] = appRepos;\n }\n\n let repo = appRepos[repoInfo.toURLString()];\n if (repo) {\n fatal(\n 'Database initialized multiple times. Please make sure the format of the database URL matches with each database() call.'\n );\n }\n repo = new Repo(repoInfo, useRestClient, authTokenProvider, appCheckProvider);\n appRepos[repoInfo.toURLString()] = repo;\n\n return repo;\n}\n\n/**\n * Forces us to use ReadonlyRestClient instead of PersistentConnection for new Repos.\n */\nexport function repoManagerForceRestClient(forceRestClient: boolean): void {\n useRestClient = forceRestClient;\n}\n\n/**\n * Class representing a Firebase Realtime Database.\n */\nexport class Database implements _FirebaseService {\n /** Represents a `Database` instance. */\n readonly 'type' = 'database';\n\n /** Track if the instance has been used (root or repo accessed) */\n _instanceStarted: boolean = false;\n\n /** Backing state for root_ */\n private _rootInternal?: ReferenceImpl;\n\n /** @hideconstructor */\n constructor(\n public _repoInternal: Repo,\n /** The {@link @firebase/app#FirebaseApp} associated with this Realtime Database instance. */\n readonly app: FirebaseApp\n ) {}\n\n get _repo(): Repo {\n if (!this._instanceStarted) {\n repoStart(\n this._repoInternal,\n this.app.options.appId,\n this.app.options['databaseAuthVariableOverride']\n );\n this._instanceStarted = true;\n }\n return this._repoInternal;\n }\n\n get _root(): ReferenceImpl {\n if (!this._rootInternal) {\n this._rootInternal = new ReferenceImpl(this._repo, newEmptyPath());\n }\n return this._rootInternal;\n }\n\n _delete(): Promise {\n if (this._rootInternal !== null) {\n repoManagerDeleteRepo(this._repo, this.app.name);\n this._repoInternal = null;\n this._rootInternal = null;\n }\n return Promise.resolve();\n }\n\n _checkNotDeleted(apiName: string) {\n if (this._rootInternal === null) {\n fatal('Cannot call ' + apiName + ' on a deleted database.');\n }\n }\n}\n\nfunction checkTransportInit() {\n if (TransportManager.IS_TRANSPORT_INITIALIZED) {\n warn(\n 'Transport has already been initialized. Please call this function before calling ref or setting up a listener'\n );\n }\n}\n\n/**\n * Force the use of websockets instead of longPolling.\n */\nexport function forceWebSockets() {\n checkTransportInit();\n BrowserPollConnection.forceDisallow();\n}\n\n/**\n * Force the use of longPolling instead of websockets. This will be ignored if websocket protocol is used in databaseURL.\n */\nexport function forceLongPolling() {\n checkTransportInit();\n WebSocketConnection.forceDisallow();\n BrowserPollConnection.forceAllow();\n}\n\n/**\n * Returns the instance of the Realtime Database SDK that is associated with the provided\n * {@link @firebase/app#FirebaseApp}. Initializes a new instance with default settings if\n * no instance exists or if the existing instance uses a custom database URL.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned Realtime\n * Database instance is associated with.\n * @param url - The URL of the Realtime Database instance to connect to. If not\n * provided, the SDK connects to the default instance of the Firebase App.\n * @returns The `Database` instance of the provided app.\n */\nexport function getDatabase(\n app: FirebaseApp = getApp(),\n url?: string\n): Database {\n const db = _getProvider(app, 'database').getImmediate({\n identifier: url\n }) as Database;\n if (!db._instanceStarted) {\n const emulator = getDefaultEmulatorHostnameAndPort('database');\n if (emulator) {\n connectDatabaseEmulator(db, ...emulator);\n }\n }\n return db;\n}\n\n/**\n * Modify the provided instance to communicate with the Realtime Database\n * emulator.\n *\n *

Note: This method must be called before performing any other operation.\n *\n * @param db - The instance to modify.\n * @param host - The emulator host (ex: localhost)\n * @param port - The emulator port (ex: 8080)\n * @param options.mockUserToken - the mock auth token to use for unit testing Security Rules\n */\nexport function connectDatabaseEmulator(\n db: Database,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions | string;\n } = {}\n): void {\n db = getModularInstance(db);\n db._checkNotDeleted('useEmulator');\n if (db._instanceStarted) {\n fatal(\n 'Cannot call useEmulator() after instance has already been initialized.'\n );\n }\n\n const repo = db._repoInternal;\n let tokenProvider: EmulatorTokenProvider | undefined = undefined;\n if (repo.repoInfo_.nodeAdmin) {\n if (options.mockUserToken) {\n fatal(\n 'mockUserToken is not supported by the Admin SDK. For client access with mock users, please use the \"firebase\" package instead of \"firebase-admin\".'\n );\n }\n tokenProvider = new EmulatorTokenProvider(EmulatorTokenProvider.OWNER);\n } else if (options.mockUserToken) {\n const token =\n typeof options.mockUserToken === 'string'\n ? options.mockUserToken\n : createMockUserToken(options.mockUserToken, db.app.options.projectId);\n tokenProvider = new EmulatorTokenProvider(token);\n }\n\n // Modify the repo to apply emulator settings\n repoManagerApplyEmulatorSettings(repo, host, port, tokenProvider);\n}\n\n/**\n * Disconnects from the server (all Database operations will be completed\n * offline).\n *\n * The client automatically maintains a persistent connection to the Database\n * server, which will remain active indefinitely and reconnect when\n * disconnected. However, the `goOffline()` and `goOnline()` methods may be used\n * to control the client connection in cases where a persistent connection is\n * undesirable.\n *\n * While offline, the client will no longer receive data updates from the\n * Database. However, all Database operations performed locally will continue to\n * immediately fire events, allowing your application to continue behaving\n * normally. Additionally, each operation performed locally will automatically\n * be queued and retried upon reconnection to the Database server.\n *\n * To reconnect to the Database and begin receiving remote events, see\n * `goOnline()`.\n *\n * @param db - The instance to disconnect.\n */\nexport function goOffline(db: Database): void {\n db = getModularInstance(db);\n db._checkNotDeleted('goOffline');\n repoInterrupt(db._repo);\n}\n\n/**\n * Reconnects to the server and synchronizes the offline Database state\n * with the server state.\n *\n * This method should be used after disabling the active connection with\n * `goOffline()`. Once reconnected, the client will transmit the proper data\n * and fire the appropriate events so that your client \"catches up\"\n * automatically.\n *\n * @param db - The instance to reconnect.\n */\nexport function goOnline(db: Database): void {\n db = getModularInstance(db);\n db._checkNotDeleted('goOnline');\n repoResume(db._repo);\n}\n\n/**\n * Logs debugging information to the console.\n *\n * @param enabled - Enables logging if `true`, disables logging if `false`.\n * @param persistent - Remembers the logging state between page refreshes if\n * `true`.\n */\nexport function enableLogging(enabled: boolean, persistent?: boolean);\n\n/**\n * Logs debugging information to the console.\n *\n * @param logger - A custom logger function to control how things get logged.\n */\nexport function enableLogging(logger: (message: string) => unknown);\n\nexport function enableLogging(\n logger: boolean | ((message: string) => unknown),\n persistent?: boolean\n): void {\n enableLoggingImpl(logger, persistent);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { PersistentConnection } from '../core/PersistentConnection';\nimport { RepoInfo } from '../core/RepoInfo';\nimport { Connection } from '../realtime/Connection';\n\nimport { repoManagerForceRestClient } from './Database';\n\nexport const DataConnection = PersistentConnection;\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(PersistentConnection.prototype as any).simpleListen = function (\n pathString: string,\n onComplete: (a: unknown) => void\n) {\n this.sendRequest('q', { p: pathString }, onComplete);\n};\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n(PersistentConnection.prototype as any).echo = function (\n data: unknown,\n onEcho: (a: unknown) => void\n) {\n this.sendRequest('echo', { d: data }, onEcho);\n};\n\n// RealTimeConnection properties that we use in tests.\nexport const RealTimeConnection = Connection;\n\n/**\n * @internal\n */\nexport const hijackHash = function (newHash: () => string) {\n const oldPut = PersistentConnection.prototype.put;\n PersistentConnection.prototype.put = function (\n pathString,\n data,\n onComplete,\n hash\n ) {\n if (hash !== undefined) {\n hash = newHash();\n }\n oldPut.call(this, pathString, data, onComplete, hash);\n };\n return function () {\n PersistentConnection.prototype.put = oldPut;\n };\n};\n\nexport const ConnectionTarget = RepoInfo;\n\n/**\n * Forces the RepoManager to create Repos that use ReadonlyRestClient instead of PersistentConnection.\n * @internal\n */\nexport const forceRestClient = function (forceRestClient: boolean) {\n repoManagerForceRestClient(forceRestClient);\n};\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\nimport { Component, ComponentType } from '@firebase/component';\n\nimport { name, version } from '../package.json';\nimport { setSDKVersion } from '../src/core/version';\n\nimport { repoManagerDatabaseFromApp } from './api/Database';\n\nexport function registerDatabase(variant?: string): void {\n setSDKVersion(SDK_VERSION);\n _registerComponent(\n new Component(\n 'database',\n (container, { instanceIdentifier: url }) => {\n const app = container.getProvider('app').getImmediate()!;\n const authProvider = container.getProvider('auth-internal');\n const appCheckProvider = container.getProvider('app-check-internal');\n return repoManagerDatabaseFromApp(\n app,\n authProvider,\n appCheckProvider,\n url\n );\n },\n ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n registerVersion(name, version, variant);\n // BUILD_TARGET will be replaced by values like esm2017, cjs2017, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n}\n","/**\n * Firebase Realtime Database\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Database } from './api/Database';\nimport { registerDatabase } from './register';\n\nexport * from './api';\n\nregisterDatabase();\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'database': Database;\n }\n}\n","/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n(function() {'use strict';var h;/** @license\n\n Copyright The Closure Library Authors.\n SPDX-License-Identifier: Apache-2.0\n*/\nfunction k(f,a){function c(){}c.prototype=a.prototype;f.D=a.prototype;f.prototype=new c;f.prototype.constructor=f;f.C=function(d,e,g){for(var b=Array(arguments.length-2),r=2;re;++e)d[e]=a.charCodeAt(c++)|a.charCodeAt(c++)<<8|a.charCodeAt(c++)<<16|a.charCodeAt(c++)<<24;else for(e=0;16>e;++e)d[e]=a[c++]|a[c++]<<8|a[c++]<<16|a[c++]<<24;a=f.g[0];c=f.g[1];e=f.g[2];var g=f.g[3];var b=a+(g^c&(e^g))+d[0]+3614090360&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[1]+3905402710&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[2]+606105819&4294967295;e=g+(b<<17&4294967295|b>>>15);\nb=c+(a^e&(g^a))+d[3]+3250441966&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[4]+4118548399&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[5]+1200080426&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[6]+2821735955&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[7]+4249261313&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[8]+1770035416&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[9]+2336552879&4294967295;g=a+(b<<12&4294967295|\nb>>>20);b=e+(c^g&(a^c))+d[10]+4294925233&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[11]+2304563134&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(g^c&(e^g))+d[12]+1804603682&4294967295;a=c+(b<<7&4294967295|b>>>25);b=g+(e^a&(c^e))+d[13]+4254626195&4294967295;g=a+(b<<12&4294967295|b>>>20);b=e+(c^g&(a^c))+d[14]+2792965006&4294967295;e=g+(b<<17&4294967295|b>>>15);b=c+(a^e&(g^a))+d[15]+1236535329&4294967295;c=e+(b<<22&4294967295|b>>>10);b=a+(e^g&(c^e))+d[1]+4129170786&4294967295;a=c+(b<<\n5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[6]+3225465664&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[11]+643717713&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[0]+3921069994&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[5]+3593408605&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[10]+38016083&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[15]+3634488961&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[4]+3889429448&4294967295;c=\ne+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[9]+568446438&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[14]+3275163606&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[3]+4107603335&4294967295;e=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[8]+1163531501&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(e^g&(c^e))+d[13]+2850285829&4294967295;a=c+(b<<5&4294967295|b>>>27);b=g+(c^e&(a^c))+d[2]+4243563512&4294967295;g=a+(b<<9&4294967295|b>>>23);b=e+(a^c&(g^a))+d[7]+1735328473&4294967295;\ne=g+(b<<14&4294967295|b>>>18);b=c+(g^a&(e^g))+d[12]+2368359562&4294967295;c=e+(b<<20&4294967295|b>>>12);b=a+(c^e^g)+d[5]+4294588738&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[8]+2272392833&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[11]+1839030562&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[14]+4259657740&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[1]+2763975236&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[4]+1272893353&4294967295;g=a+(b<<11&4294967295|\nb>>>21);b=e+(g^a^c)+d[7]+4139469664&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[10]+3200236656&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[13]+681279174&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[0]+3936430074&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[3]+3572445317&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[6]+76029189&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(c^e^g)+d[9]+3654602809&4294967295;a=c+(b<<4&4294967295|b>>>28);b=g+(a^c^e)+d[12]+\n3873151461&4294967295;g=a+(b<<11&4294967295|b>>>21);b=e+(g^a^c)+d[15]+530742520&4294967295;e=g+(b<<16&4294967295|b>>>16);b=c+(e^g^a)+d[2]+3299628645&4294967295;c=e+(b<<23&4294967295|b>>>9);b=a+(e^(c|~g))+d[0]+4096336452&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[7]+1126891415&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[14]+2878612391&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[5]+4237533241&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[12]+1700485571&\n4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[3]+2399980690&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[10]+4293915773&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[1]+2240044497&4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[8]+1873313359&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[15]+4264355552&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[6]+2734768916&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[13]+1309151649&\n4294967295;c=e+(b<<21&4294967295|b>>>11);b=a+(e^(c|~g))+d[4]+4149444226&4294967295;a=c+(b<<6&4294967295|b>>>26);b=g+(c^(a|~e))+d[11]+3174756917&4294967295;g=a+(b<<10&4294967295|b>>>22);b=e+(a^(g|~c))+d[2]+718787259&4294967295;e=g+(b<<15&4294967295|b>>>17);b=c+(g^(e|~a))+d[9]+3951481745&4294967295;f.g[0]=f.g[0]+a&4294967295;f.g[1]=f.g[1]+(e+(b<<21&4294967295|b>>>11))&4294967295;f.g[2]=f.g[2]+e&4294967295;f.g[3]=f.g[3]+g&4294967295}\nm.prototype.u=function(f,a){void 0===a&&(a=f.length);for(var c=a-this.blockSize,d=this.B,e=this.h,g=0;gthis.h?this.blockSize:2*this.blockSize)-this.h);f[0]=128;for(var a=1;aa;++a)for(var d=0;32>d;d+=8)f[c++]=this.g[a]>>>d&255;return f};function p(f,a){var c=q;return Object.prototype.hasOwnProperty.call(c,f)?c[f]:c[f]=a(f)};function t(f,a){this.h=a;for(var c=[],d=!0,e=f.length-1;0<=e;e--){var g=f[e]|0;d&&g==a||(c[e]=g,d=!1)}this.g=c}var q={};function u(f){return-128<=f&&128>f?p(f,function(a){return new t([a|0],0>a?-1:0)}):new t([f|0],0>f?-1:0)}function v(f){if(isNaN(f)||!isFinite(f))return w;if(0>f)return x(v(-f));for(var a=[],c=1,d=0;f>=c;d++)a[d]=f/c|0,c*=4294967296;return new t(a,0)}\nfunction y(f,a){if(0==f.length)throw Error(\"number format error: empty string\");a=a||10;if(2>a||36g?(g=v(Math.pow(a,g)),d=d.j(g).add(v(b))):(d=d.j(c),d=d.add(v(b)))}return d}var w=u(0),z=u(1),A=u(16777216);h=t.prototype;\nh.m=function(){if(B(this))return-x(this).m();for(var f=0,a=1,c=0;cf||36>>0).toString(f);c=e;if(C(c))return g+d;for(;6>g.length;)g=\"0\"+g;d=g+d}};\nh.i=function(f){return 0>f?0:f>>16)+(this.i(e)>>>16)+(f.i(e)>>>16);d=b>>>16;g&=65535;b&=65535;c[e]=b<<16|g}return new t(c,c[c.length-1]&-2147483648?-1:0)};function F(f,a){return f.add(x(a))}\nh.j=function(f){if(C(this)||C(f))return w;if(B(this))return B(f)?x(this).j(x(f)):x(x(this).j(f));if(B(f))return x(this.j(x(f)));if(0>this.l(A)&&0>f.l(A))return v(this.m()*f.m());for(var a=this.g.length+f.g.length,c=[],d=0;d<2*a;d++)c[d]=0;for(d=0;d>>16,b=this.i(d)&65535,r=f.i(e)>>>16,E=f.i(e)&65535;c[2*d+2*e]+=b*E;G(c,2*d+2*e);c[2*d+2*e+1]+=g*E;G(c,2*d+2*e+1);c[2*d+2*e+1]+=b*r;G(c,2*d+2*e+1);c[2*d+2*e+2]+=g*r;G(c,2*d+2*e+2)}for(d=0;d<\na;d++)c[d]=c[2*d+1]<<16|c[2*d];for(d=a;d<2*a;d++)c[d]=0;return new t(c,0)};function G(f,a){for(;(f[a]&65535)!=f[a];)f[a+1]+=f[a]>>>16,f[a]&=65535,a++}function H(f,a){this.g=f;this.h=a}\nfunction D(f,a){if(C(a))throw Error(\"division by zero\");if(C(f))return new H(w,w);if(B(f))return a=D(x(f),a),new H(x(a.g),x(a.h));if(B(a))return a=D(f,x(a)),new H(x(a.g),a.h);if(30=d.l(f);)c=I(c),d=I(d);var e=J(c,1),g=J(d,1);d=J(d,2);for(c=J(c,2);!C(d);){var b=g.add(d);0>=b.l(f)&&(e=e.add(c),g=b);d=J(d,1);c=J(c,1)}a=F(f,e.j(a));return new H(e,a)}for(e=w;0<=f.l(a);){c=Math.max(1,Math.floor(f.m()/\na.m()));d=Math.ceil(Math.log(c)/Math.LN2);d=48>=d?1:Math.pow(2,d-48);g=v(c);for(b=g.j(a);B(b)||0>>31;return new t(c,f.h)}function J(f,a){var c=a>>5;a%=32;for(var d=f.g.length-c,e=[],g=0;g>>a|f.i(g+c+1)<<32-a:f.i(g+c);return new t(e,f.h)};m.prototype.digest=m.prototype.v;m.prototype.reset=m.prototype.s;m.prototype.update=m.prototype.u;module.exports.Md5=m;t.prototype.add=t.prototype.add;t.prototype.multiply=t.prototype.j;t.prototype.modulo=t.prototype.A;t.prototype.compare=t.prototype.l;t.prototype.toNumber=t.prototype.m;t.prototype.toString=t.prototype.toString;t.prototype.getBits=t.prototype.i;t.fromNumber=v;t.fromString=y;module.exports.Integer=t;}).apply( typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : {});\n","/** @license\nCopyright The Closure Library Authors.\nSPDX-License-Identifier: Apache-2.0\n*/\n(function() {'use strict';var h,aa=\"function\"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){if(a==Array.prototype||a==Object.prototype)return a;a[b]=c.value;return a};function ba(a){a=[\"object\"==typeof globalThis&&globalThis,a,\"object\"==typeof window&&window,\"object\"==typeof self&&self,\"object\"==typeof global&&global];for(var b=0;b{throw a;},0)};function xa(){var a=za;let b=null;a.g&&(b=a.g,a.g=a.g.next,a.g||(a.h=null),b.next=null);return b}class Aa{constructor(){this.h=this.g=null}add(a,b){const c=Ba.get();c.set(a,b);this.h?this.h.next=c:this.g=c;this.h=c}}var Ba=new na(()=>new Ca,a=>a.reset());class Ca{constructor(){this.next=this.g=this.h=null}set(a,b){this.h=a;this.g=b;this.next=null}reset(){this.next=this.g=this.h=null}};let x,y=!1,za=new Aa,Ea=()=>{const a=k.Promise.resolve(void 0);x=()=>{a.then(Da)}};var Da=()=>{for(var a;a=xa();){try{a.h.call(a.g)}catch(c){wa(c)}var b=Ba;b.j(a);100>b.h&&(b.h++,a.next=b.g,b.g=a)}y=!1};function z(){this.s=this.s;this.C=this.C}z.prototype.s=!1;z.prototype.ma=function(){this.s||(this.s=!0,this.N())};z.prototype.N=function(){if(this.C)for(;this.C.length;)this.C.shift()()};function A(a,b){this.type=a;this.g=this.target=b;this.defaultPrevented=!1}A.prototype.h=function(){this.defaultPrevented=!0};var Fa=function(){if(!k.addEventListener||!Object.defineProperty)return!1;var a=!1,b=Object.defineProperty({},\"passive\",{get:function(){a=!0}});try{const c=()=>{};k.addEventListener(\"test\",c,b);k.removeEventListener(\"test\",c,b)}catch(c){}return a}();function C(a,b){A.call(this,a?a.type:\"\");this.relatedTarget=this.g=this.target=null;this.button=this.screenY=this.screenX=this.clientY=this.clientX=0;this.key=\"\";this.metaKey=this.shiftKey=this.altKey=this.ctrlKey=!1;this.state=null;this.pointerId=0;this.pointerType=\"\";this.i=null;if(a){var c=this.type=a.type,d=a.changedTouches&&a.changedTouches.length?a.changedTouches[0]:null;this.target=a.target||a.srcElement;this.g=b;if(b=a.relatedTarget){if(pa){a:{try{oa(b.nodeName);var e=!0;break a}catch(f){}e=\n!1}e||(b=null)}}else\"mouseover\"==c?b=a.fromElement:\"mouseout\"==c&&(b=a.toElement);this.relatedTarget=b;d?(this.clientX=void 0!==d.clientX?d.clientX:d.pageX,this.clientY=void 0!==d.clientY?d.clientY:d.pageY,this.screenX=d.screenX||0,this.screenY=d.screenY||0):(this.clientX=void 0!==a.clientX?a.clientX:a.pageX,this.clientY=void 0!==a.clientY?a.clientY:a.pageY,this.screenX=a.screenX||0,this.screenY=a.screenY||0);this.button=a.button;this.key=a.key||\"\";this.ctrlKey=a.ctrlKey;this.altKey=a.altKey;this.shiftKey=\na.shiftKey;this.metaKey=a.metaKey;this.pointerId=a.pointerId||0;this.pointerType=\"string\"===typeof a.pointerType?a.pointerType:Ga[a.pointerType]||\"\";this.state=a.state;this.i=a;a.defaultPrevented&&C.aa.h.call(this)}}r(C,A);var Ga={2:\"touch\",3:\"pen\",4:\"mouse\"};C.prototype.h=function(){C.aa.h.call(this);var a=this.i;a.preventDefault?a.preventDefault():a.returnValue=!1};var D=\"closure_listenable_\"+(1E6*Math.random()|0);var Ha=0;function Ia(a,b,c,d,e){this.listener=a;this.proxy=null;this.src=b;this.type=c;this.capture=!!d;this.ha=e;this.key=++Ha;this.da=this.fa=!1}function Ja(a){a.da=!0;a.listener=null;a.proxy=null;a.src=null;a.ha=null};function Ka(a){this.src=a;this.g={};this.h=0}Ka.prototype.add=function(a,b,c,d,e){var f=a.toString();a=this.g[f];a||(a=this.g[f]=[],this.h++);var g=La(a,b,d,e);-1>>0);function Sa(a){if(\"function\"===typeof a)return a;a[$a]||(a[$a]=function(b){return a.handleEvent(b)});return a[$a]};function E(){z.call(this);this.i=new Ka(this);this.M=this;this.F=null}r(E,z);E.prototype[D]=!0;E.prototype.removeEventListener=function(a,b,c,d){Ya(this,a,b,c,d)};\nfunction F(a,b){var c,d=a.F;if(d)for(c=[];d;d=d.F)c.push(d);a=a.M;d=b.type||b;if(\"string\"===typeof b)b=new A(b,a);else if(b instanceof A)b.target=b.target||a;else{var e=b;b=new A(d,a);ua(b,e)}e=!0;if(c)for(var f=c.length-1;0<=f;f--){var g=b.g=c[f];e=ab(g,d,!0,b)&&e}g=b.g=a;e=ab(g,d,!0,b)&&e;e=ab(g,d,!1,b)&&e;if(c)for(f=0;f{a.g=null;a.i&&(a.i=!1,cb(a))},a.l);const b=a.h;a.h=null;a.m.apply(null,b)}class eb extends z{constructor(a,b){super();this.m=a;this.l=b;this.h=null;this.i=!1;this.g=null}j(a){this.h=arguments;this.g?this.i=!0:cb(this)}N(){super.N();this.g&&(k.clearTimeout(this.g),this.g=null,this.i=!1,this.h=null)}};function G(a){z.call(this);this.h=a;this.g={}}r(G,z);var fb=[];function gb(a){qa(a.g,function(b,c){this.g.hasOwnProperty(c)&&Za(b)},a);a.g={}}G.prototype.N=function(){G.aa.N.call(this);gb(this)};G.prototype.handleEvent=function(){throw Error(\"EventHandler.handleEvent not implemented\");};var hb=k.JSON.stringify;var ib=k.JSON.parse;var jb=class{stringify(a){return k.JSON.stringify(a,void 0)}parse(a){return k.JSON.parse(a,void 0)}};function kb(){}kb.prototype.h=null;function lb(a){return a.h||(a.h=a.i())};function mb(){}var H={OPEN:\"a\",kb:\"b\",Ja:\"c\",wb:\"d\"};function nb(){A.call(this,\"d\")}r(nb,A);function ob(){A.call(this,\"c\")}r(ob,A);var I={},pb=null;function qb(){return pb=pb||new E}I.La=\"serverreachability\";function rb(a){A.call(this,I.La,a)}r(rb,A);function J(a){const b=qb();F(b,new rb(b,a))}I.STAT_EVENT=\"statevent\";function sb(a,b){A.call(this,I.STAT_EVENT,a);this.stat=b}r(sb,A);function K(a){const b=qb();F(b,new sb(b,a))}I.Ma=\"timingevent\";function tb(a,b){A.call(this,I.Ma,a);this.size=b}r(tb,A);\nfunction ub(a,b){if(\"function\"!==typeof a)throw Error(\"Fn must not be null and must be a function\");return k.setTimeout(function(){a()},b)};function vb(){this.g=!0}vb.prototype.xa=function(){this.g=!1};function wb(a,b,c,d,e,f){a.info(function(){if(a.g)if(f){var g=\"\";for(var m=f.split(\"&\"),q=0;qd.length)){var e=d[1];if(Array.isArray(e)&&!(1>e.length)){var f=e[0];if(\"noop\"!=f&&\"stop\"!=f&&\"close\"!=f)for(var g=1;gw)&&(3!=w||this.g&&(this.h.h||this.g.oa()||Nb(this.g)))){this.J||4!=w||7==b||(8==b||0>=O?J(3):J(2));Ob(this);var c=this.g.Z();this.X=c;b:if(Pb(this)){var d=Nb(this.g);a=\"\";var e=d.length,f=4==P(this.g);if(!this.h.i){if(\"undefined\"===typeof TextDecoder){Q(this);Qb(this);var g=\"\";break b}this.h.i=new k.TextDecoder}for(b=0;bb.length)return Gb;b=b.slice(d,d+c);a.C=d+c;return b}M.prototype.cancel=function(){this.J=!0;Q(this)};function Kb(a){a.S=Date.now()+a.I;Wb(a,a.I)}function Wb(a,b){if(null!=a.B)throw Error(\"WatchDog timer not null\");a.B=ub(p(a.ba,a),b)}function Ob(a){a.B&&(k.clearTimeout(a.B),a.B=null)}\nM.prototype.ba=function(){this.B=null;const a=Date.now();0<=a-this.S?(zb(this.i,this.A),2!=this.L&&(J(3),K(17)),Q(this),this.s=2,Qb(this)):Wb(this,this.S-a)};function Qb(a){0==a.j.G||a.J||Ub(a.j,a)}function Q(a){Ob(a);var b=a.M;b&&\"function\"==typeof b.ma&&b.ma();a.M=null;gb(a.U);a.g&&(b=a.g,a.g=null,b.abort(),b.ma())}\nfunction Rb(a,b){try{var c=a.j;if(0!=c.G&&(c.g==a||Xb(c.h,a)))if(!a.K&&Xb(c.h,a)&&3==c.G){try{var d=c.Da.g.parse(b)}catch(l){d=null}if(Array.isArray(d)&&3==d.length){var e=d;if(0==e[0])a:{if(!c.u){if(c.g)if(c.g.F+3E3e[2]&&c.F&&0==c.v&&!c.C&&(c.C=ub(p(c.Za,c),6E3));if(1>=ac(c.h)&&c.ca){try{c.ca()}catch(l){}c.ca=void 0}}else R(c,11)}else if((a.K||c.g==a)&&Yb(c),!t(b))for(e=c.Da.g.parse(b),b=0;b=a.j:!1}function ac(a){return a.h?1:a.g?a.g.size:0}function Xb(a,b){return a.h?a.h==b:a.g?a.g.has(b):!1}\nfunction bc(a,b){a.g?a.g.add(b):a.h=b}function dc(a,b){a.h&&a.h==b?a.h=null:a.g&&a.g.has(b)&&a.g.delete(b)}ic.prototype.cancel=function(){this.i=kc(this);if(this.h)this.h.cancel(),this.h=null;else if(this.g&&0!==this.g.size){for(const a of this.g.values())a.cancel();this.g.clear()}};function kc(a){if(null!=a.h)return a.i.concat(a.h.D);if(null!=a.g&&0!==a.g.size){let b=a.i;for(const c of a.g.values())b=b.concat(c.D);return b}return la(a.i)};function lc(a){if(a.V&&\"function\"==typeof a.V)return a.V();if(\"undefined\"!==typeof Map&&a instanceof Map||\"undefined\"!==typeof Set&&a instanceof Set)return Array.from(a.values());if(\"string\"===typeof a)return a.split(\"\");if(ha(a)){for(var b=[],c=a.length,d=0;db)throw Error(\"Bad port number \"+b);a.s=b}else a.s=null}function tc(a,b,c){b instanceof sc?(a.i=b,Ac(a.i,a.h)):(c||(b=vc(b,Bc)),a.i=new sc(b,a.h))}function S(a,b,c){a.i.set(b,c)}function Ib(a){S(a,\"zx\",Math.floor(2147483648*Math.random()).toString(36)+Math.abs(Math.floor(2147483648*Math.random())^Date.now()).toString(36));return a}\nfunction uc(a,b){return a?b?decodeURI(a.replace(/%25/g,\"%2525\")):decodeURIComponent(a):\"\"}function vc(a,b,c){return\"string\"===typeof a?(a=encodeURI(a).replace(b,Cc),c&&(a=a.replace(/%25([0-9a-fA-F]{2})/g,\"%$1\")),a):null}function Cc(a){a=a.charCodeAt(0);return\"%\"+(a>>4&15).toString(16)+(a&15).toString(16)}var wc=/[#\\/\\?@]/g,yc=/[#\\?:]/g,xc=/[#\\?]/g,Bc=/[#\\?@]/g,zc=/#/g;function sc(a,b){this.h=this.g=null;this.i=a||null;this.j=!!b}\nfunction U(a){a.g||(a.g=new Map,a.h=0,a.i&&pc(a.i,function(b,c){a.add(decodeURIComponent(b.replace(/\\+/g,\" \")),c)}))}h=sc.prototype;h.add=function(a,b){U(this);this.i=null;a=V(this,a);var c=this.g.get(a);c||this.g.set(a,c=[]);c.push(b);this.h+=1;return this};function Dc(a,b){U(a);b=V(a,b);a.g.has(b)&&(a.i=null,a.h-=a.g.get(b).length,a.g.delete(b))}function Ec(a,b){U(a);b=V(a,b);return a.g.has(b)}\nh.forEach=function(a,b){U(this);this.g.forEach(function(c,d){c.forEach(function(e){a.call(b,e,d,this)},this)},this)};h.na=function(){U(this);const a=Array.from(this.g.values()),b=Array.from(this.g.keys()),c=[];for(let d=0;d{d.abort();W(c,\"TestPingServer: timeout\",!1,b)},1E4);fetch(a,{signal:d.signal}).then(f=>{clearTimeout(e);f.ok?W(c,\"TestPingServer: ok\",!0,b):W(c,\"TestPingServer: server error\",!1,b)}).catch(()=>{clearTimeout(e);W(c,\"TestPingServer: error\",!1,b)})}function W(a,b,c,d,e){try{e&&(e.onload=null,e.onerror=null,e.onabort=null,e.ontimeout=null),d(c)}catch(f){}};function Hc(){this.g=new jb}function Ic(a,b,c){const d=c||\"\";try{nc(a,function(e,f){let g=e;n(e)&&(g=hb(e));b.push(d+f+\"=\"+encodeURIComponent(g))})}catch(e){throw b.push(d+\"type=\"+encodeURIComponent(\"_badmap\")),e;}};function Jc(a){this.l=a.Ub||null;this.j=a.eb||!1}r(Jc,kb);Jc.prototype.g=function(){return new Kc(this.l,this.j)};Jc.prototype.i=function(a){return function(){return a}}({});function Kc(a,b){E.call(this);this.D=a;this.o=b;this.m=void 0;this.status=this.readyState=0;this.responseType=this.responseText=this.response=this.statusText=\"\";this.onreadystatechange=null;this.u=new Headers;this.h=null;this.B=\"GET\";this.A=\"\";this.g=!1;this.v=this.j=this.l=null}r(Kc,E);h=Kc.prototype;\nh.open=function(a,b){if(0!=this.readyState)throw this.abort(),Error(\"Error reopening a connection\");this.B=a;this.A=b;this.readyState=1;Lc(this)};h.send=function(a){if(1!=this.readyState)throw this.abort(),Error(\"need to call open() first. \");this.g=!0;const b={headers:this.u,method:this.B,credentials:this.m,cache:void 0};a&&(b.body=a);(this.D||k).fetch(new Request(this.A,b)).then(this.Sa.bind(this),this.ga.bind(this))};\nh.abort=function(){this.response=this.responseText=\"\";this.u=new Headers;this.status=0;this.j&&this.j.cancel(\"Request was aborted.\").catch(()=>{});1<=this.readyState&&this.g&&4!=this.readyState&&(this.g=!1,Mc(this));this.readyState=0};\nh.Sa=function(a){if(this.g&&(this.l=a,this.h||(this.status=this.l.status,this.statusText=this.l.statusText,this.h=a.headers,this.readyState=2,Lc(this)),this.g&&(this.readyState=3,Lc(this),this.g)))if(\"arraybuffer\"===this.responseType)a.arrayBuffer().then(this.Qa.bind(this),this.ga.bind(this));else if(\"undefined\"!==typeof k.ReadableStream&&\"body\"in a){this.j=a.body.getReader();if(this.o){if(this.responseType)throw Error('responseType must be empty for \"streamBinaryChunks\" mode responses.');this.response=\n[]}else this.response=this.responseText=\"\",this.v=new TextDecoder;Nc(this)}else a.text().then(this.Ra.bind(this),this.ga.bind(this))};function Nc(a){a.j.read().then(a.Pa.bind(a)).catch(a.ga.bind(a))}h.Pa=function(a){if(this.g){if(this.o&&a.value)this.response.push(a.value);else if(!this.o){var b=a.value?a.value:new Uint8Array(0);if(b=this.v.decode(b,{stream:!a.done}))this.response=this.responseText+=b}a.done?Mc(this):Lc(this);3==this.readyState&&Nc(this)}};\nh.Ra=function(a){this.g&&(this.response=this.responseText=a,Mc(this))};h.Qa=function(a){this.g&&(this.response=a,Mc(this))};h.ga=function(){this.g&&Mc(this)};function Mc(a){a.readyState=4;a.l=null;a.j=null;a.v=null;Lc(a)}h.setRequestHeader=function(a,b){this.u.append(a,b)};h.getResponseHeader=function(a){return this.h?this.h.get(a.toLowerCase())||\"\":\"\"};\nh.getAllResponseHeaders=function(){if(!this.h)return\"\";const a=[],b=this.h.entries();for(var c=b.next();!c.done;)c=c.value,a.push(c[0]+\": \"+c[1]),c=b.next();return a.join(\"\\r\\n\")};function Lc(a){a.onreadystatechange&&a.onreadystatechange.call(a)}Object.defineProperty(Kc.prototype,\"withCredentials\",{get:function(){return\"include\"===this.m},set:function(a){this.m=a?\"include\":\"same-origin\"}});function Oc(a){let b=\"\";qa(a,function(c,d){b+=d;b+=\":\";b+=c;b+=\"\\r\\n\"});return b}function Pc(a,b,c){a:{for(d in c){var d=!1;break a}d=!0}d||(c=Oc(c),\"string\"===typeof a?(encodeURIComponent(String(b)),null!=c&&encodeURIComponent(String(c))):S(a,b,c))};function X(a){E.call(this);this.headers=new Map;this.o=a||null;this.h=!1;this.v=this.g=null;this.D=\"\";this.m=0;this.l=\"\";this.j=this.B=this.u=this.A=!1;this.I=null;this.H=\"\";this.J=!1}r(X,E);var Qc=/^https?$/i,Rc=[\"POST\",\"PUT\"];h=X.prototype;h.Ha=function(a){this.J=a};\nh.ea=function(a,b,c,d){if(this.g)throw Error(\"[goog.net.XhrIo] Object is active with another request=\"+this.D+\"; newUri=\"+a);b=b?b.toUpperCase():\"GET\";this.D=a;this.l=\"\";this.m=0;this.A=!1;this.h=!0;this.g=this.o?this.o.g():Cb.g();this.v=this.o?lb(this.o):lb(Cb);this.g.onreadystatechange=p(this.Ea,this);try{this.B=!0,this.g.open(b,String(a),!0),this.B=!1}catch(f){Sc(this,f);return}a=c||\"\";c=new Map(this.headers);if(d)if(Object.getPrototypeOf(d)===Object.prototype)for(var e in d)c.set(e,d[e]);else if(\"function\"===\ntypeof d.keys&&\"function\"===typeof d.get)for(const f of d.keys())c.set(f,d.get(f));else throw Error(\"Unknown input type for opt_headers: \"+String(d));d=Array.from(c.keys()).find(f=>\"content-type\"==f.toLowerCase());e=k.FormData&&a instanceof k.FormData;!(0<=Array.prototype.indexOf.call(Rc,b,void 0))||d||e||c.set(\"Content-Type\",\"application/x-www-form-urlencoded;charset=utf-8\");for(const [f,g]of c)this.g.setRequestHeader(f,g);this.H&&(this.g.responseType=this.H);\"withCredentials\"in this.g&&this.g.withCredentials!==\nthis.J&&(this.g.withCredentials=this.J);try{Tc(this),this.u=!0,this.g.send(a),this.u=!1}catch(f){Sc(this,f)}};function Sc(a,b){a.h=!1;a.g&&(a.j=!0,a.g.abort(),a.j=!1);a.l=b;a.m=5;Uc(a);Vc(a)}function Uc(a){a.A||(a.A=!0,F(a,\"complete\"),F(a,\"error\"))}h.abort=function(a){this.g&&this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1,this.m=a||7,F(this,\"complete\"),F(this,\"abort\"),Vc(this))};h.N=function(){this.g&&(this.h&&(this.h=!1,this.j=!0,this.g.abort(),this.j=!1),Vc(this,!0));X.aa.N.call(this)};\nh.Ea=function(){this.s||(this.B||this.u||this.j?Wc(this):this.bb())};h.bb=function(){Wc(this)};\nfunction Wc(a){if(a.h&&\"undefined\"!=typeof fa&&(!a.v[1]||4!=P(a)||2!=a.Z()))if(a.u&&4==P(a))bb(a.Ea,0,a);else if(F(a,\"readystatechange\"),4==P(a)){a.h=!1;try{const g=a.Z();a:switch(g){case 200:case 201:case 202:case 204:case 206:case 304:case 1223:var b=!0;break a;default:b=!1}var c;if(!(c=b)){var d;if(d=0===g){var e=String(a.D).match(oc)[1]||null;!e&&k.self&&k.self.location&&(e=k.self.location.protocol.slice(0,-1));d=!Qc.test(e?e.toLowerCase():\"\")}c=d}if(c)F(a,\"complete\"),F(a,\"success\");else{a.m=\n6;try{var f=2{}:null;a.g=null;a.v=null;b||F(a,\"ready\");try{c.onreadystatechange=d}catch(e){}}}function Tc(a){a.I&&(k.clearTimeout(a.I),a.I=null)}h.isActive=function(){return!!this.g};function P(a){return a.g?a.g.readyState:0}h.Z=function(){try{return 2=a.h.j-(a.s?1:0))return!1;if(a.s)return a.i=b.D.concat(a.i),!0;if(1==a.G||2==a.G||a.B>=(a.Va?0:a.Wa))return!1;a.s=ub(p(a.Ga,a,b),cd(a,a.B));a.B++;return!0}\nh.Ga=function(a){if(this.s)if(this.s=null,1==this.G){if(!a){this.U=Math.floor(1E5*Math.random());a=this.U++;const e=new M(this,this.j,a);let f=this.o;this.S&&(f?(f=sa(f),ua(f,this.S)):f=this.S);null!==this.m||this.O||(e.H=f,f=null);if(this.P)a:{var b=0;for(var c=0;cl)f=Math.max(0,e[q].g-100),m=!1;else try{Ic(v,g,\"req\"+l+\"_\")}catch(w){d&&d(v)}}if(m){d=g.join(\"&\");break a}}}a=a.i.splice(0,c);b.D=a;return d}function ec(a){if(!a.g&&!a.u){a.Y=1;var b=a.Fa;x||Ea();y||(x(),y=!0);za.add(b,a);a.v=0}}\nfunction $b(a){if(a.g||a.u||3<=a.v)return!1;a.Y++;a.u=ub(p(a.Fa,a),cd(a,a.v));a.v++;return!0}h.Fa=function(){this.u=null;fd(this);if(this.ba&&!(this.M||null==this.g||0>=this.R)){var a=2*this.R;this.j.info(\"BP detection timer enabled: \"+a);this.A=ub(p(this.ab,this),a)}};h.ab=function(){this.A&&(this.A=null,this.j.info(\"BP detection timeout reached.\"),this.j.info(\"Buffering proxy detected and switch to long-polling!\"),this.F=!1,this.M=!0,K(10),Zb(this),fd(this))};\nfunction Tb(a){null!=a.A&&(k.clearTimeout(a.A),a.A=null)}function fd(a){a.g=new M(a,a.j,\"rpc\",a.Y);null===a.m&&(a.g.H=a.o);a.g.O=0;var b=N(a.qa);S(b,\"RID\",\"rpc\");S(b,\"SID\",a.K);S(b,\"AID\",a.T);S(b,\"CI\",a.F?\"0\":\"1\");!a.F&&a.ja&&S(b,\"TO\",a.ja);S(b,\"TYPE\",\"xmlhttp\");$c(a,b);a.m&&a.o&&Pc(b,a.m,a.o);a.L&&(a.g.I=a.L);var c=a.g;a=a.ia;c.L=1;c.v=Ib(N(b));c.m=null;c.P=!0;Jb(c,a)}h.Za=function(){null!=this.C&&(this.C=null,Zb(this),$b(this),K(19))};function Yb(a){null!=a.C&&(k.clearTimeout(a.C),a.C=null)}\nfunction Ub(a,b){var c=null;if(a.g==b){Yb(a);Tb(a);a.g=null;var d=2}else if(Xb(a.h,b))c=b.D,dc(a.h,b),d=1;else return;if(0!=a.G)if(b.o)if(1==d){c=b.m?b.m.length:0;b=Date.now()-b.F;var e=a.B;d=qb();F(d,new tb(d,c,b,e));fc(a)}else ec(a);else if(e=b.s,3==e||0==e&&0\n *

  • `debug` for the most verbose logging level, primarily for\n * debugging.
  • \n *
  • `error` to log errors only.
  • \n *
  • `silent` to turn off logging.
  • \n * \n */\nexport function setLogLevel(logLevel: LogLevelString): void {\n logClient.setLogLevel(logLevel);\n}\n\nexport function logDebug(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.DEBUG) {\n const args = obj.map(argToString);\n logClient.debug(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\nexport function logError(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.ERROR) {\n const args = obj.map(argToString);\n logClient.error(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\n/**\n * @internal\n */\nexport function logWarn(msg: string, ...obj: unknown[]): void {\n if (logClient.logLevel <= LogLevel.WARN) {\n const args = obj.map(argToString);\n logClient.warn(`Firestore (${SDK_VERSION}): ${msg}`, ...args);\n }\n}\n\n/**\n * Converts an additional log parameter to a string representation.\n */\nfunction argToString(obj: unknown): string | unknown {\n if (typeof obj === 'string') {\n return obj;\n } else {\n try {\n return formatJSON(obj);\n } catch (e) {\n // Converting to JSON failed, just log the object directly\n return obj;\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Formats an object as a JSON string, suitable for logging. */\nexport function formatJSON(value: unknown): string {\n return JSON.stringify(value);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '../core/version';\n\nimport { logError } from './log';\n\n/**\n * Unconditionally fails, throwing an Error with the given message.\n * Messages are stripped in production builds.\n *\n * Returns `never` and can be used in expressions:\n * @example\n * let futureVar = fail('not implemented yet');\n */\nexport function fail(failure: string = 'Unexpected state'): never {\n // Log the failure in addition to throw an exception, just in case the\n // exception is swallowed.\n const message =\n `FIRESTORE (${SDK_VERSION}) INTERNAL ASSERTION FAILED: ` + failure;\n logError(message);\n\n // NOTE: We don't use FirestoreError here because these are internal failures\n // that cannot be handled by the user. (Also it would create a circular\n // dependency between the error and assert modules which doesn't work.)\n throw new Error(message);\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * Messages are stripped in production builds.\n */\nexport function hardAssert(\n assertion: boolean,\n message?: string\n): asserts assertion {\n if (!assertion) {\n fail(message);\n }\n}\n\n/**\n * Fails if the given assertion condition is false, throwing an Error with the\n * given message if it did.\n *\n * The code of callsites invoking this function are stripped out in production\n * builds. Any side-effects of code within the debugAssert() invocation will not\n * happen in this case.\n *\n * @internal\n */\nexport function debugAssert(\n assertion: boolean,\n message: string\n): asserts assertion {\n if (!assertion) {\n fail(message);\n }\n}\n\n/**\n * Casts `obj` to `T`. In non-production builds, verifies that `obj` is an\n * instance of `T` before casting.\n */\nexport function debugCast(\n obj: object,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor: { new (...args: any[]): T }\n): T | never {\n debugAssert(\n obj instanceof constructor,\n `Expected type '${constructor.name}', but was '${obj.constructor.name}'`\n );\n return obj as T;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\n\n/**\n * The set of Firestore status codes. The codes are the same at the ones\n * exposed by gRPC here:\n * https://github.com/grpc/grpc/blob/master/doc/statuscodes.md\n *\n * Possible values:\n * - 'cancelled': The operation was cancelled (typically by the caller).\n * - 'unknown': Unknown error or an error from a different error domain.\n * - 'invalid-argument': Client specified an invalid argument. Note that this\n * differs from 'failed-precondition'. 'invalid-argument' indicates\n * arguments that are problematic regardless of the state of the system\n * (e.g. an invalid field name).\n * - 'deadline-exceeded': Deadline expired before operation could complete.\n * For operations that change the state of the system, this error may be\n * returned even if the operation has completed successfully. For example,\n * a successful response from a server could have been delayed long enough\n * for the deadline to expire.\n * - 'not-found': Some requested document was not found.\n * - 'already-exists': Some document that we attempted to create already\n * exists.\n * - 'permission-denied': The caller does not have permission to execute the\n * specified operation.\n * - 'resource-exhausted': Some resource has been exhausted, perhaps a\n * per-user quota, or perhaps the entire file system is out of space.\n * - 'failed-precondition': Operation was rejected because the system is not\n * in a state required for the operation's execution.\n * - 'aborted': The operation was aborted, typically due to a concurrency\n * issue like transaction aborts, etc.\n * - 'out-of-range': Operation was attempted past the valid range.\n * - 'unimplemented': Operation is not implemented or not supported/enabled.\n * - 'internal': Internal errors. Means some invariants expected by\n * underlying system has been broken. If you see one of these errors,\n * something is very broken.\n * - 'unavailable': The service is currently unavailable. This is most likely\n * a transient condition and may be corrected by retrying with a backoff.\n * - 'data-loss': Unrecoverable data loss or corruption.\n * - 'unauthenticated': The request does not have valid authentication\n * credentials for the operation.\n */\nexport type FirestoreErrorCode =\n | 'cancelled'\n | 'unknown'\n | 'invalid-argument'\n | 'deadline-exceeded'\n | 'not-found'\n | 'already-exists'\n | 'permission-denied'\n | 'resource-exhausted'\n | 'failed-precondition'\n | 'aborted'\n | 'out-of-range'\n | 'unimplemented'\n | 'internal'\n | 'unavailable'\n | 'data-loss'\n | 'unauthenticated';\n\n/**\n * Error Codes describing the different ways Firestore can fail. These come\n * directly from GRPC.\n */\nexport type Code = FirestoreErrorCode;\n\nexport const Code = {\n // Causes are copied from:\n // https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n /** Not an error; returned on success. */\n OK: 'ok' as FirestoreErrorCode,\n\n /** The operation was cancelled (typically by the caller). */\n CANCELLED: 'cancelled' as FirestoreErrorCode,\n\n /** Unknown error or an error from a different error domain. */\n UNKNOWN: 'unknown' as FirestoreErrorCode,\n\n /**\n * Client specified an invalid argument. Note that this differs from\n * FAILED_PRECONDITION. INVALID_ARGUMENT indicates arguments that are\n * problematic regardless of the state of the system (e.g., a malformed file\n * name).\n */\n INVALID_ARGUMENT: 'invalid-argument' as FirestoreErrorCode,\n\n /**\n * Deadline expired before operation could complete. For operations that\n * change the state of the system, this error may be returned even if the\n * operation has completed successfully. For example, a successful response\n * from a server could have been delayed long enough for the deadline to\n * expire.\n */\n DEADLINE_EXCEEDED: 'deadline-exceeded' as FirestoreErrorCode,\n\n /** Some requested entity (e.g., file or directory) was not found. */\n NOT_FOUND: 'not-found' as FirestoreErrorCode,\n\n /**\n * Some entity that we attempted to create (e.g., file or directory) already\n * exists.\n */\n ALREADY_EXISTS: 'already-exists' as FirestoreErrorCode,\n\n /**\n * The caller does not have permission to execute the specified operation.\n * PERMISSION_DENIED must not be used for rejections caused by exhausting\n * some resource (use RESOURCE_EXHAUSTED instead for those errors).\n * PERMISSION_DENIED must not be used if the caller cannot be identified\n * (use UNAUTHENTICATED instead for those errors).\n */\n PERMISSION_DENIED: 'permission-denied' as FirestoreErrorCode,\n\n /**\n * The request does not have valid authentication credentials for the\n * operation.\n */\n UNAUTHENTICATED: 'unauthenticated' as FirestoreErrorCode,\n\n /**\n * Some resource has been exhausted, perhaps a per-user quota, or perhaps the\n * entire file system is out of space.\n */\n RESOURCE_EXHAUSTED: 'resource-exhausted' as FirestoreErrorCode,\n\n /**\n * Operation was rejected because the system is not in a state required for\n * the operation's execution. For example, directory to be deleted may be\n * non-empty, an rmdir operation is applied to a non-directory, etc.\n *\n * A litmus test that may help a service implementor in deciding\n * between FAILED_PRECONDITION, ABORTED, and UNAVAILABLE:\n * (a) Use UNAVAILABLE if the client can retry just the failing call.\n * (b) Use ABORTED if the client should retry at a higher-level\n * (e.g., restarting a read-modify-write sequence).\n * (c) Use FAILED_PRECONDITION if the client should not retry until\n * the system state has been explicitly fixed. E.g., if an \"rmdir\"\n * fails because the directory is non-empty, FAILED_PRECONDITION\n * should be returned since the client should not retry unless\n * they have first fixed up the directory by deleting files from it.\n * (d) Use FAILED_PRECONDITION if the client performs conditional\n * REST Get/Update/Delete on a resource and the resource on the\n * server does not match the condition. E.g., conflicting\n * read-modify-write on the same resource.\n */\n FAILED_PRECONDITION: 'failed-precondition' as FirestoreErrorCode,\n\n /**\n * The operation was aborted, typically due to a concurrency issue like\n * sequencer check failures, transaction aborts, etc.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n ABORTED: 'aborted' as FirestoreErrorCode,\n\n /**\n * Operation was attempted past the valid range. E.g., seeking or reading\n * past end of file.\n *\n * Unlike INVALID_ARGUMENT, this error indicates a problem that may be fixed\n * if the system state changes. For example, a 32-bit file system will\n * generate INVALID_ARGUMENT if asked to read at an offset that is not in the\n * range [0,2^32-1], but it will generate OUT_OF_RANGE if asked to read from\n * an offset past the current file size.\n *\n * There is a fair bit of overlap between FAILED_PRECONDITION and\n * OUT_OF_RANGE. We recommend using OUT_OF_RANGE (the more specific error)\n * when it applies so that callers who are iterating through a space can\n * easily look for an OUT_OF_RANGE error to detect when they are done.\n */\n OUT_OF_RANGE: 'out-of-range' as FirestoreErrorCode,\n\n /** Operation is not implemented or not supported/enabled in this service. */\n UNIMPLEMENTED: 'unimplemented' as FirestoreErrorCode,\n\n /**\n * Internal errors. Means some invariants expected by underlying System has\n * been broken. If you see one of these errors, Something is very broken.\n */\n INTERNAL: 'internal' as FirestoreErrorCode,\n\n /**\n * The service is currently unavailable. This is a most likely a transient\n * condition and may be corrected by retrying with a backoff.\n *\n * See litmus test above for deciding between FAILED_PRECONDITION, ABORTED,\n * and UNAVAILABLE.\n */\n UNAVAILABLE: 'unavailable' as FirestoreErrorCode,\n\n /** Unrecoverable data loss or corruption. */\n DATA_LOSS: 'data-loss' as FirestoreErrorCode\n};\n\n/** An error returned by a Firestore operation. */\nexport class FirestoreError extends FirebaseError {\n /** The stack of the error. */\n readonly stack?: string;\n\n /** @hideconstructor */\n constructor(\n /**\n * The backend error code associated with this error.\n */\n readonly code: FirestoreErrorCode,\n /**\n * A custom error description.\n */\n readonly message: string\n ) {\n super(code, message);\n\n // HACK: We write a toString property directly because Error is not a real\n // class and so inheritance does not work correctly. We could alternatively\n // do the same \"back-door inheritance\" trick that FirebaseError does.\n this.toString = () => `${this.name}: [code=${this.code}]: ${this.message}`;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport interface Resolver {\n (value: R | Promise): void;\n}\n\nexport interface Rejecter {\n (reason?: Error): void;\n}\n\nexport class Deferred {\n promise: Promise;\n // Assigned synchronously in constructor by Promise constructor callback.\n resolve!: Resolver;\n reject!: Rejecter;\n\n constructor() {\n this.promise = new Promise((resolve: Resolver, reject: Rejecter) => {\n this.resolve = resolve;\n this.reject = reject;\n });\n }\n}\n\n/**\n * Takes an array of values and a function from a value to a Promise. The function is run on each\n * value sequentially, waiting for the previous promise to resolve before starting the next one.\n * The returned promise resolves once the function has been run on all values.\n */\nexport function sequence(\n values: T[],\n fn: (value: T) => Promise\n): Promise {\n let p = Promise.resolve();\n for (const value of values) {\n p = p.then(() => fn(value));\n }\n return p;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n AppCheckInternalComponentName,\n AppCheckTokenListener,\n AppCheckTokenResult,\n FirebaseAppCheckInternal\n} from '@firebase/app-check-interop-types';\nimport {\n FirebaseAuthInternal,\n FirebaseAuthInternalName\n} from '@firebase/auth-interop-types';\nimport { Provider } from '@firebase/component';\n\nimport { User } from '../auth/user';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { Deferred } from '../util/promise';\n\n// TODO(mikelehen): This should be split into multiple files and probably\n// moved to an auth/ folder to match other platforms.\n\n/**\n * @internal\n */\nexport type AuthTokenFactory = () => string;\n\n/**\n * @internal\n */\nexport interface FirstPartyCredentialsSettings {\n // These are external types. Prevent minification.\n ['type']: 'firstParty';\n ['sessionIndex']: string;\n ['iamToken']: string | null;\n ['authTokenFactory']: AuthTokenFactory | null;\n}\n\nexport interface ProviderCredentialsSettings {\n // These are external types. Prevent minification.\n ['type']: 'provider';\n ['client']: CredentialsProvider;\n}\n\n/** Settings for private credentials */\nexport type CredentialsSettings =\n | FirstPartyCredentialsSettings\n | ProviderCredentialsSettings;\n\nexport type TokenType = 'OAuth' | 'FirstParty' | 'AppCheck';\nexport interface Token {\n /** Type of token. */\n type: TokenType;\n\n /**\n * The user with which the token is associated (used for persisting user\n * state on disk, etc.).\n * This will be null for Tokens of the type 'AppCheck'.\n */\n user?: User;\n\n /** Header values to set for this token */\n headers: Map;\n}\n\nexport class OAuthToken implements Token {\n type = 'OAuth' as TokenType;\n headers = new Map();\n\n constructor(value: string, public user: User) {\n this.headers.set('Authorization', `Bearer ${value}`);\n }\n}\n\n/**\n * A Listener for credential change events. The listener should fetch a new\n * token and may need to invalidate other state if the current user has also\n * changed.\n */\nexport type CredentialChangeListener = (credential: T) => Promise;\n\n/**\n * Provides methods for getting the uid and token for the current user and\n * listening for changes.\n */\nexport interface CredentialsProvider {\n /**\n * Starts the credentials provider and specifies a listener to be notified of\n * credential changes (sign-in / sign-out, token changes). It is immediately\n * called once with the initial user.\n *\n * The change listener is invoked on the provided AsyncQueue.\n */\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void;\n\n /** Requests a token for the current user. */\n getToken(): Promise;\n\n /**\n * Marks the last retrieved token as invalid, making the next GetToken request\n * force-refresh the token.\n */\n invalidateToken(): void;\n\n shutdown(): void;\n}\n\n/**\n * A CredentialsProvider that always yields an empty token.\n * @internal\n */\nexport class EmptyAuthCredentialsProvider implements CredentialsProvider {\n getToken(): Promise {\n return Promise.resolve(null);\n }\n\n invalidateToken(): void {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n // Fire with initial user.\n asyncQueue.enqueueRetryable(() => changeListener(User.UNAUTHENTICATED));\n }\n\n shutdown(): void {}\n}\n\n/**\n * A CredentialsProvider that always returns a constant token. Used for\n * emulator token mocking.\n */\nexport class EmulatorAuthCredentialsProvider\n implements CredentialsProvider\n{\n constructor(private token: Token) {}\n\n /**\n * Stores the listener registered with setChangeListener()\n * This isn't actually necessary since the UID never changes, but we use this\n * to verify the listen contract is adhered to in tests.\n */\n private changeListener: CredentialChangeListener | null = null;\n\n getToken(): Promise {\n return Promise.resolve(this.token);\n }\n\n invalidateToken(): void {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n debugAssert(\n !this.changeListener,\n 'Can only call setChangeListener() once.'\n );\n this.changeListener = changeListener;\n // Fire with initial user.\n asyncQueue.enqueueRetryable(() => changeListener(this.token.user!));\n }\n\n shutdown(): void {\n this.changeListener = null;\n }\n}\n\n/** Credential provider for the Lite SDK. */\nexport class LiteAuthCredentialsProvider implements CredentialsProvider {\n private auth: FirebaseAuthInternal | null = null;\n\n constructor(authProvider: Provider) {\n authProvider.onInit(auth => {\n this.auth = auth;\n });\n }\n\n getToken(): Promise {\n if (!this.auth) {\n return Promise.resolve(null);\n }\n\n return this.auth.getToken().then(tokenData => {\n if (tokenData) {\n hardAssert(\n typeof tokenData.accessToken === 'string',\n 'Invalid tokenData returned from getToken():' + tokenData\n );\n return new OAuthToken(\n tokenData.accessToken,\n new User(this.auth!.getUid())\n );\n } else {\n return null;\n }\n });\n }\n\n invalidateToken(): void {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {}\n\n shutdown(): void {}\n}\n\nexport class FirebaseAuthCredentialsProvider\n implements CredentialsProvider\n{\n /**\n * The auth token listener registered with FirebaseApp, retained here so we\n * can unregister it.\n */\n private tokenListener: (() => void) | undefined;\n\n /** Tracks the current User. */\n private currentUser: User = User.UNAUTHENTICATED;\n\n /**\n * Counter used to detect if the token changed while a getToken request was\n * outstanding.\n */\n private tokenCounter = 0;\n\n private forceRefresh = false;\n\n private auth: FirebaseAuthInternal | null = null;\n\n constructor(private authProvider: Provider) {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n hardAssert(\n this.tokenListener === undefined,\n 'Token listener already added'\n );\n let lastTokenId = this.tokenCounter;\n\n // A change listener that prevents double-firing for the same token change.\n const guardedChangeListener: (user: User) => Promise = user => {\n if (this.tokenCounter !== lastTokenId) {\n lastTokenId = this.tokenCounter;\n return changeListener(user);\n } else {\n return Promise.resolve();\n }\n };\n\n // A promise that can be waited on to block on the next token change.\n // This promise is re-created after each change.\n let nextToken = new Deferred();\n\n this.tokenListener = () => {\n this.tokenCounter++;\n this.currentUser = this.getUser();\n nextToken.resolve();\n nextToken = new Deferred();\n asyncQueue.enqueueRetryable(() =>\n guardedChangeListener(this.currentUser)\n );\n };\n\n const awaitNextToken: () => void = () => {\n const currentTokenAttempt = nextToken;\n asyncQueue.enqueueRetryable(async () => {\n await currentTokenAttempt.promise;\n await guardedChangeListener(this.currentUser);\n });\n };\n\n const registerAuth = (auth: FirebaseAuthInternal): void => {\n logDebug('FirebaseAuthCredentialsProvider', 'Auth detected');\n this.auth = auth;\n if (this.tokenListener) {\n this.auth.addAuthTokenListener(this.tokenListener);\n awaitNextToken();\n }\n };\n\n this.authProvider.onInit(auth => registerAuth(auth));\n\n // Our users can initialize Auth right after Firestore, so we give it\n // a chance to register itself with the component framework before we\n // determine whether to start up in unauthenticated mode.\n setTimeout(() => {\n if (!this.auth) {\n const auth = this.authProvider.getImmediate({ optional: true });\n if (auth) {\n registerAuth(auth);\n } else {\n // If auth is still not available, proceed with `null` user\n logDebug('FirebaseAuthCredentialsProvider', 'Auth not yet detected');\n nextToken.resolve();\n nextToken = new Deferred();\n }\n }\n }, 0);\n\n awaitNextToken();\n }\n\n getToken(): Promise {\n debugAssert(\n this.tokenListener != null,\n 'FirebaseAuthCredentialsProvider not started.'\n );\n\n // Take note of the current value of the tokenCounter so that this method\n // can fail (with an ABORTED error) if there is a token change while the\n // request is outstanding.\n const initialTokenCounter = this.tokenCounter;\n const forceRefresh = this.forceRefresh;\n this.forceRefresh = false;\n\n if (!this.auth) {\n return Promise.resolve(null);\n }\n\n return this.auth.getToken(forceRefresh).then(tokenData => {\n // Cancel the request since the token changed while the request was\n // outstanding so the response is potentially for a previous user (which\n // user, we can't be sure).\n if (this.tokenCounter !== initialTokenCounter) {\n logDebug(\n 'FirebaseAuthCredentialsProvider',\n 'getToken aborted due to token change.'\n );\n return this.getToken();\n } else {\n if (tokenData) {\n hardAssert(\n typeof tokenData.accessToken === 'string',\n 'Invalid tokenData returned from getToken():' + tokenData\n );\n return new OAuthToken(tokenData.accessToken, this.currentUser);\n } else {\n return null;\n }\n }\n });\n }\n\n invalidateToken(): void {\n this.forceRefresh = true;\n }\n\n shutdown(): void {\n if (this.auth && this.tokenListener) {\n this.auth.removeAuthTokenListener(this.tokenListener);\n }\n this.tokenListener = undefined;\n }\n\n // Auth.getUid() can return null even with a user logged in. It is because\n // getUid() is synchronous, but the auth code populating Uid is asynchronous.\n // This method should only be called in the AuthTokenListener callback\n // to guarantee to get the actual user.\n private getUser(): User {\n const currentUid = this.auth && this.auth.getUid();\n hardAssert(\n currentUid === null || typeof currentUid === 'string',\n 'Received invalid UID: ' + currentUid\n );\n return new User(currentUid);\n }\n}\n\n/*\n * FirstPartyToken provides a fresh token each time its value\n * is requested, because if the token is too old, requests will be rejected.\n * Technically this may no longer be necessary since the SDK should gracefully\n * recover from unauthenticated errors (see b/33147818 for context), but it's\n * safer to keep the implementation as-is.\n */\nexport class FirstPartyToken implements Token {\n type = 'FirstParty' as TokenType;\n user = User.FIRST_PARTY;\n private _headers = new Map();\n\n constructor(\n private readonly sessionIndex: string,\n private readonly iamToken: string | null,\n private readonly authTokenFactory: AuthTokenFactory | null\n ) {}\n\n /**\n * Gets an authorization token, using a provided factory function, or return\n * null.\n */\n private getAuthToken(): string | null {\n if (this.authTokenFactory) {\n return this.authTokenFactory();\n } else {\n return null;\n }\n }\n\n get headers(): Map {\n this._headers.set('X-Goog-AuthUser', this.sessionIndex);\n // Use array notation to prevent minification\n const authHeaderTokenValue = this.getAuthToken();\n if (authHeaderTokenValue) {\n this._headers.set('Authorization', authHeaderTokenValue);\n }\n if (this.iamToken) {\n this._headers.set('X-Goog-Iam-Authorization-Token', this.iamToken);\n }\n\n return this._headers;\n }\n}\n\n/*\n * Provides user credentials required for the Firestore JavaScript SDK\n * to authenticate the user, using technique that is only available\n * to applications hosted by Google.\n */\nexport class FirstPartyAuthCredentialsProvider\n implements CredentialsProvider\n{\n constructor(\n private sessionIndex: string,\n private iamToken: string | null,\n private authTokenFactory: AuthTokenFactory | null\n ) {}\n\n getToken(): Promise {\n return Promise.resolve(\n new FirstPartyToken(\n this.sessionIndex,\n this.iamToken,\n this.authTokenFactory\n )\n );\n }\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n // Fire with initial uid.\n asyncQueue.enqueueRetryable(() => changeListener(User.FIRST_PARTY));\n }\n\n shutdown(): void {}\n\n invalidateToken(): void {}\n}\n\nexport class AppCheckToken implements Token {\n type = 'AppCheck' as TokenType;\n headers = new Map();\n\n constructor(private value: string) {\n if (value && value.length > 0) {\n this.headers.set('x-firebase-appcheck', this.value);\n }\n }\n}\n\nexport class FirebaseAppCheckTokenProvider\n implements CredentialsProvider\n{\n /**\n * The AppCheck token listener registered with FirebaseApp, retained here so\n * we can unregister it.\n */\n private tokenListener: AppCheckTokenListener | undefined;\n private forceRefresh = false;\n private appCheck: FirebaseAppCheckInternal | null = null;\n private latestAppCheckToken: string | null = null;\n\n constructor(\n private appCheckProvider: Provider\n ) {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {\n hardAssert(\n this.tokenListener === undefined,\n 'Token listener already added'\n );\n\n const onTokenChanged: (\n tokenResult: AppCheckTokenResult\n ) => Promise = tokenResult => {\n if (tokenResult.error != null) {\n logDebug(\n 'FirebaseAppCheckTokenProvider',\n `Error getting App Check token; using placeholder token instead. Error: ${tokenResult.error.message}`\n );\n }\n const tokenUpdated = tokenResult.token !== this.latestAppCheckToken;\n this.latestAppCheckToken = tokenResult.token;\n logDebug(\n 'FirebaseAppCheckTokenProvider',\n `Received ${tokenUpdated ? 'new' : 'existing'} token.`\n );\n return tokenUpdated\n ? changeListener(tokenResult.token)\n : Promise.resolve();\n };\n\n this.tokenListener = (tokenResult: AppCheckTokenResult) => {\n asyncQueue.enqueueRetryable(() => onTokenChanged(tokenResult));\n };\n\n const registerAppCheck = (appCheck: FirebaseAppCheckInternal): void => {\n logDebug('FirebaseAppCheckTokenProvider', 'AppCheck detected');\n this.appCheck = appCheck;\n if (this.tokenListener) {\n this.appCheck.addTokenListener(this.tokenListener);\n }\n };\n\n this.appCheckProvider.onInit(appCheck => registerAppCheck(appCheck));\n\n // Our users can initialize AppCheck after Firestore, so we give it\n // a chance to register itself with the component framework.\n setTimeout(() => {\n if (!this.appCheck) {\n const appCheck = this.appCheckProvider.getImmediate({ optional: true });\n if (appCheck) {\n registerAppCheck(appCheck);\n } else {\n // If AppCheck is still not available, proceed without it.\n logDebug(\n 'FirebaseAppCheckTokenProvider',\n 'AppCheck not yet detected'\n );\n }\n }\n }, 0);\n }\n\n getToken(): Promise {\n debugAssert(\n this.tokenListener != null,\n 'FirebaseAppCheckTokenProvider not started.'\n );\n\n const forceRefresh = this.forceRefresh;\n this.forceRefresh = false;\n\n if (!this.appCheck) {\n return Promise.resolve(null);\n }\n\n return this.appCheck.getToken(forceRefresh).then(tokenResult => {\n if (tokenResult) {\n hardAssert(\n typeof tokenResult.token === 'string',\n 'Invalid tokenResult returned from getToken():' + tokenResult\n );\n this.latestAppCheckToken = tokenResult.token;\n return new AppCheckToken(tokenResult.token);\n } else {\n return null;\n }\n });\n }\n\n invalidateToken(): void {\n this.forceRefresh = true;\n }\n\n shutdown(): void {\n if (this.appCheck && this.tokenListener) {\n this.appCheck.removeTokenListener(this.tokenListener);\n }\n this.tokenListener = undefined;\n }\n}\n\n/**\n * An AppCheck token provider that always yields an empty token.\n * @internal\n */\nexport class EmptyAppCheckTokenProvider implements CredentialsProvider {\n getToken(): Promise {\n return Promise.resolve(new AppCheckToken(''));\n }\n\n invalidateToken(): void {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {}\n\n shutdown(): void {}\n}\n\n/** AppCheck token provider for the Lite SDK. */\nexport class LiteAppCheckTokenProvider implements CredentialsProvider {\n private appCheck: FirebaseAppCheckInternal | null = null;\n\n constructor(\n private appCheckProvider: Provider\n ) {\n appCheckProvider.onInit(appCheck => {\n this.appCheck = appCheck;\n });\n }\n\n getToken(): Promise {\n if (!this.appCheck) {\n return Promise.resolve(null);\n }\n\n return this.appCheck.getToken().then(tokenResult => {\n if (tokenResult) {\n hardAssert(\n typeof tokenResult.token === 'string',\n 'Invalid tokenResult returned from getToken():' + tokenResult\n );\n return new AppCheckToken(tokenResult.token);\n } else {\n return null;\n }\n });\n }\n\n invalidateToken(): void {}\n\n start(\n asyncQueue: AsyncQueue,\n changeListener: CredentialChangeListener\n ): void {}\n\n shutdown(): void {}\n}\n\n/**\n * Builds a CredentialsProvider depending on the type of\n * the credentials passed in.\n */\nexport function makeAuthCredentialsProvider(\n credentials?: CredentialsSettings\n): CredentialsProvider {\n if (!credentials) {\n return new EmptyAuthCredentialsProvider();\n }\n switch (credentials['type']) {\n case 'firstParty':\n return new FirstPartyAuthCredentialsProvider(\n credentials['sessionIndex'] || '0',\n credentials['iamToken'] || null,\n credentials['authTokenFactory'] || null\n );\n\n case 'provider':\n return credentials['client'];\n\n default:\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'makeAuthCredentialsProvider failed due to invalid credential type'\n );\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../../util/assert';\n\n/**\n * Generates `nBytes` of random bytes.\n *\n * If `nBytes < 0` , an error will be thrown.\n */\nexport function randomBytes(nBytes: number): Uint8Array {\n debugAssert(nBytes >= 0, `Expecting non-negative nBytes, got: ${nBytes}`);\n\n // Polyfills for IE and WebWorker by using `self` and `msCrypto` when `crypto` is not available.\n const crypto =\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n typeof self !== 'undefined' && (self.crypto || (self as any)['msCrypto']);\n const bytes = new Uint8Array(nBytes);\n if (crypto && typeof crypto.getRandomValues === 'function') {\n crypto.getRandomValues(bytes);\n } else {\n // Falls back to Math.random\n for (let i = 0; i < nBytes; i++) {\n bytes[i] = Math.floor(Math.random() * 256);\n }\n }\n return bytes;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { randomBytes } from '../platform/random_bytes';\n\nimport { debugAssert } from './assert';\n\nexport type EventHandler = (value: E) => void;\nexport interface Indexable {\n [k: string]: unknown;\n}\n\n/**\n * A utility class for generating unique alphanumeric IDs of a specified length.\n *\n * @internal\n * Exported internally for testing purposes.\n */\nexport class AutoId {\n static newId(): string {\n // Alphanumeric characters\n const chars =\n 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';\n // The largest byte value that is a multiple of `char.length`.\n const maxMultiple = Math.floor(256 / chars.length) * chars.length;\n debugAssert(\n 0 < maxMultiple && maxMultiple < 256,\n `Expect maxMultiple to be (0, 256), but got ${maxMultiple}`\n );\n\n let autoId = '';\n const targetLength = 20;\n while (autoId.length < targetLength) {\n const bytes = randomBytes(40);\n for (let i = 0; i < bytes.length; ++i) {\n // Only accept values that are [0, maxMultiple), this ensures they can\n // be evenly mapped to indices of `chars` via a modulo operation.\n if (autoId.length < targetLength && bytes[i] < maxMultiple) {\n autoId += chars.charAt(bytes[i] % chars.length);\n }\n }\n }\n debugAssert(autoId.length === targetLength, 'Invalid auto ID: ' + autoId);\n\n return autoId;\n }\n}\n\nexport function primitiveComparator(left: T, right: T): number {\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n return 0;\n}\n\nexport interface Equatable {\n isEqual(other: T): boolean;\n}\n\nexport interface Iterable {\n forEach: (cb: (v: V) => void) => void;\n}\n\n/** Helper to compare arrays using isEqual(). */\nexport function arrayEquals(\n left: T[],\n right: T[],\n comparator: (l: T, r: T) => boolean\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n return left.every((value, index) => comparator(value, right[index]));\n}\n/**\n * Returns the immediate lexicographically-following string. This is useful to\n * construct an inclusive range for indexeddb iterators.\n */\nexport function immediateSuccessor(s: string): string {\n // Return the input string, with an additional NUL byte appended.\n return s + '\\0';\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { primitiveComparator } from '../util/misc';\n\n// The earliest date supported by Firestore timestamps (0001-01-01T00:00:00Z).\nconst MIN_SECONDS = -62135596800;\n\n// Number of nanoseconds in a millisecond.\nconst MS_TO_NANOS = 1e6;\n\n/**\n * A `Timestamp` represents a point in time independent of any time zone or\n * calendar, represented as seconds and fractions of seconds at nanosecond\n * resolution in UTC Epoch time.\n *\n * It is encoded using the Proleptic Gregorian Calendar which extends the\n * Gregorian calendar backwards to year one. It is encoded assuming all minutes\n * are 60 seconds long, i.e. leap seconds are \"smeared\" so that no leap second\n * table is needed for interpretation. Range is from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59.999999999Z.\n *\n * For examples and further specifications, refer to the\n * {@link https://github.com/google/protobuf/blob/master/src/google/protobuf/timestamp.proto | Timestamp definition}.\n */\nexport class Timestamp {\n /**\n * Creates a new timestamp with the current date, with millisecond precision.\n *\n * @returns a new timestamp representing the current date.\n */\n static now(): Timestamp {\n return Timestamp.fromMillis(Date.now());\n }\n\n /**\n * Creates a new timestamp from the given date.\n *\n * @param date - The date to initialize the `Timestamp` from.\n * @returns A new `Timestamp` representing the same point in time as the given\n * date.\n */\n static fromDate(date: Date): Timestamp {\n return Timestamp.fromMillis(date.getTime());\n }\n\n /**\n * Creates a new timestamp from the given number of milliseconds.\n *\n * @param milliseconds - Number of milliseconds since Unix epoch\n * 1970-01-01T00:00:00Z.\n * @returns A new `Timestamp` representing the same point in time as the given\n * number of milliseconds.\n */\n static fromMillis(milliseconds: number): Timestamp {\n const seconds = Math.floor(milliseconds / 1000);\n const nanos = Math.floor((milliseconds - seconds * 1000) * MS_TO_NANOS);\n return new Timestamp(seconds, nanos);\n }\n\n /**\n * Creates a new timestamp.\n *\n * @param seconds - The number of seconds of UTC time since Unix epoch\n * 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to\n * 9999-12-31T23:59:59Z inclusive.\n * @param nanoseconds - The non-negative fractions of a second at nanosecond\n * resolution. Negative second values with fractions must still have\n * non-negative nanoseconds values that count forward in time. Must be\n * from 0 to 999,999,999 inclusive.\n */\n constructor(\n /**\n * The number of seconds of UTC time since Unix epoch 1970-01-01T00:00:00Z.\n */\n readonly seconds: number,\n /**\n * The fractions of a second at nanosecond resolution.*\n */\n readonly nanoseconds: number\n ) {\n if (nanoseconds < 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp nanoseconds out of range: ' + nanoseconds\n );\n }\n if (nanoseconds >= 1e9) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp nanoseconds out of range: ' + nanoseconds\n );\n }\n if (seconds < MIN_SECONDS) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp seconds out of range: ' + seconds\n );\n }\n // This will break in the year 10,000.\n if (seconds >= 253402300800) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Timestamp seconds out of range: ' + seconds\n );\n }\n }\n\n /**\n * Converts a `Timestamp` to a JavaScript `Date` object. This conversion\n * causes a loss of precision since `Date` objects only support millisecond\n * precision.\n *\n * @returns JavaScript `Date` object representing the same point in time as\n * this `Timestamp`, with millisecond precision.\n */\n toDate(): Date {\n return new Date(this.toMillis());\n }\n\n /**\n * Converts a `Timestamp` to a numeric timestamp (in milliseconds since\n * epoch). This operation causes a loss of precision.\n *\n * @returns The point in time corresponding to this timestamp, represented as\n * the number of milliseconds since Unix epoch 1970-01-01T00:00:00Z.\n */\n toMillis(): number {\n return this.seconds * 1000 + this.nanoseconds / MS_TO_NANOS;\n }\n\n _compareTo(other: Timestamp): number {\n if (this.seconds === other.seconds) {\n return primitiveComparator(this.nanoseconds, other.nanoseconds);\n }\n return primitiveComparator(this.seconds, other.seconds);\n }\n\n /**\n * Returns true if this `Timestamp` is equal to the provided one.\n *\n * @param other - The `Timestamp` to compare against.\n * @returns true if this `Timestamp` is equal to the provided one.\n */\n isEqual(other: Timestamp): boolean {\n return (\n other.seconds === this.seconds && other.nanoseconds === this.nanoseconds\n );\n }\n\n /** Returns a textual representation of this `Timestamp`. */\n toString(): string {\n return (\n 'Timestamp(seconds=' +\n this.seconds +\n ', nanoseconds=' +\n this.nanoseconds +\n ')'\n );\n }\n\n /** Returns a JSON-serializable representation of this `Timestamp`. */\n toJSON(): { seconds: number; nanoseconds: number } {\n return { seconds: this.seconds, nanoseconds: this.nanoseconds };\n }\n\n /**\n * Converts this object to a primitive string, which allows `Timestamp` objects\n * to be compared using the `>`, `<=`, `>=` and `>` operators.\n */\n valueOf(): string {\n // This method returns a string of the form . where\n // is translated to have a non-negative value and both \n // and are left-padded with zeroes to be a consistent length.\n // Strings with this format then have a lexicographical ordering that matches\n // the expected ordering. The translation is done to avoid having\n // a leading negative sign (i.e. a leading '-' character) in its string\n // representation, which would affect its lexicographical ordering.\n const adjustedSeconds = this.seconds - MIN_SECONDS;\n // Note: Up to 12 decimal digits are required to represent all valid\n // 'seconds' values.\n const formattedSeconds = String(adjustedSeconds).padStart(12, '0');\n const formattedNanoseconds = String(this.nanoseconds).padStart(9, '0');\n return formattedSeconds + '.' + formattedNanoseconds;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite-api/timestamp';\n\n/**\n * A version of a document in Firestore. This corresponds to the version\n * timestamp, such as update_time or read_time.\n */\nexport class SnapshotVersion {\n static fromTimestamp(value: Timestamp): SnapshotVersion {\n return new SnapshotVersion(value);\n }\n\n static min(): SnapshotVersion {\n return new SnapshotVersion(new Timestamp(0, 0));\n }\n\n static max(): SnapshotVersion {\n return new SnapshotVersion(new Timestamp(253402300799, 1e9 - 1));\n }\n\n private constructor(private timestamp: Timestamp) {}\n\n compareTo(other: SnapshotVersion): number {\n return this.timestamp._compareTo(other.timestamp);\n }\n\n isEqual(other: SnapshotVersion): boolean {\n return this.timestamp.isEqual(other.timestamp);\n }\n\n /** Returns a number representation of the version for use in spec tests. */\n toMicroseconds(): number {\n // Convert to microseconds.\n return this.timestamp.seconds * 1e6 + this.timestamp.nanoseconds / 1000;\n }\n\n toString(): string {\n return 'SnapshotVersion(' + this.timestamp.toString() + ')';\n }\n\n toTimestamp(): Timestamp {\n return this.timestamp;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nexport const DOCUMENT_KEY_NAME = '__name__';\n\n/**\n * Path represents an ordered sequence of string segments.\n */\nabstract class BasePath> {\n private segments: string[];\n private offset: number;\n private len: number;\n\n constructor(segments: string[], offset?: number, length?: number) {\n if (offset === undefined) {\n offset = 0;\n } else if (offset > segments.length) {\n fail('offset ' + offset + ' out of range ' + segments.length);\n }\n\n if (length === undefined) {\n length = segments.length - offset;\n } else if (length > segments.length - offset) {\n fail('length ' + length + ' out of range ' + (segments.length - offset));\n }\n this.segments = segments;\n this.offset = offset;\n this.len = length;\n }\n\n /**\n * Abstract constructor method to construct an instance of B with the given\n * parameters.\n */\n protected abstract construct(\n segments: string[],\n offset?: number,\n length?: number\n ): B;\n\n /**\n * Returns a String representation.\n *\n * Implementing classes are required to provide deterministic implementations as\n * the String representation is used to obtain canonical Query IDs.\n */\n abstract toString(): string;\n\n get length(): number {\n return this.len;\n }\n\n isEqual(other: B): boolean {\n return BasePath.comparator(this, other) === 0;\n }\n\n child(nameOrPath: string | B): B {\n const segments = this.segments.slice(this.offset, this.limit());\n if (nameOrPath instanceof BasePath) {\n nameOrPath.forEach(segment => {\n segments.push(segment);\n });\n } else {\n segments.push(nameOrPath);\n }\n return this.construct(segments);\n }\n\n /** The index of one past the last segment of the path. */\n private limit(): number {\n return this.offset + this.length;\n }\n\n popFirst(size?: number): B {\n size = size === undefined ? 1 : size;\n debugAssert(\n this.length >= size,\n \"Can't call popFirst() with less segments\"\n );\n return this.construct(\n this.segments,\n this.offset + size,\n this.length - size\n );\n }\n\n popLast(): B {\n debugAssert(!this.isEmpty(), \"Can't call popLast() on empty path\");\n return this.construct(this.segments, this.offset, this.length - 1);\n }\n\n firstSegment(): string {\n debugAssert(!this.isEmpty(), \"Can't call firstSegment() on empty path\");\n return this.segments[this.offset];\n }\n\n lastSegment(): string {\n debugAssert(!this.isEmpty(), \"Can't call lastSegment() on empty path\");\n return this.get(this.length - 1);\n }\n\n get(index: number): string {\n debugAssert(index < this.length, 'Index out of range');\n return this.segments[this.offset + index];\n }\n\n isEmpty(): boolean {\n return this.length === 0;\n }\n\n isPrefixOf(other: this): boolean {\n if (other.length < this.length) {\n return false;\n }\n\n for (let i = 0; i < this.length; i++) {\n if (this.get(i) !== other.get(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n isImmediateParentOf(potentialChild: this): boolean {\n if (this.length + 1 !== potentialChild.length) {\n return false;\n }\n\n for (let i = 0; i < this.length; i++) {\n if (this.get(i) !== potentialChild.get(i)) {\n return false;\n }\n }\n\n return true;\n }\n\n forEach(fn: (segment: string) => void): void {\n for (let i = this.offset, end = this.limit(); i < end; i++) {\n fn(this.segments[i]);\n }\n }\n\n toArray(): string[] {\n return this.segments.slice(this.offset, this.limit());\n }\n\n static comparator>(\n p1: BasePath,\n p2: BasePath\n ): number {\n const len = Math.min(p1.length, p2.length);\n for (let i = 0; i < len; i++) {\n const left = p1.get(i);\n const right = p2.get(i);\n if (left < right) {\n return -1;\n }\n if (left > right) {\n return 1;\n }\n }\n if (p1.length < p2.length) {\n return -1;\n }\n if (p1.length > p2.length) {\n return 1;\n }\n return 0;\n }\n}\n\n/**\n * A slash-separated path for navigating resources (documents and collections)\n * within Firestore.\n *\n * @internal\n */\nexport class ResourcePath extends BasePath {\n protected construct(\n segments: string[],\n offset?: number,\n length?: number\n ): ResourcePath {\n return new ResourcePath(segments, offset, length);\n }\n\n canonicalString(): string {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n\n return this.toArray().join('/');\n }\n\n toString(): string {\n return this.canonicalString();\n }\n\n /**\n * Returns a string representation of this path\n * where each path segment has been encoded with\n * `encodeURIComponent`.\n */\n toUriEncodedString(): string {\n return this.toArray().map(encodeURIComponent).join('/');\n }\n\n /**\n * Creates a resource path from the given slash-delimited string. If multiple\n * arguments are provided, all components are combined. Leading and trailing\n * slashes from all components are ignored.\n */\n static fromString(...pathComponents: string[]): ResourcePath {\n // NOTE: The client is ignorant of any path segments containing escape\n // sequences (e.g. __id123__) and just passes them through raw (they exist\n // for legacy reasons and should not be used frequently).\n\n const segments: string[] = [];\n for (const path of pathComponents) {\n if (path.indexOf('//') >= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid segment (${path}). Paths must not contain // in them.`\n );\n }\n // Strip leading and trailing slashed.\n segments.push(...path.split('/').filter(segment => segment.length > 0));\n }\n\n return new ResourcePath(segments);\n }\n\n static emptyPath(): ResourcePath {\n return new ResourcePath([]);\n }\n}\n\nconst identifierRegExp = /^[_a-zA-Z][_a-zA-Z0-9]*$/;\n\n/**\n * A dot-separated path for navigating sub-objects within a document.\n * @internal\n */\nexport class FieldPath extends BasePath {\n protected construct(\n segments: string[],\n offset?: number,\n length?: number\n ): FieldPath {\n return new FieldPath(segments, offset, length);\n }\n\n /**\n * Returns true if the string could be used as a segment in a field path\n * without escaping.\n */\n private static isValidIdentifier(segment: string): boolean {\n return identifierRegExp.test(segment);\n }\n\n canonicalString(): string {\n return this.toArray()\n .map(str => {\n str = str.replace(/\\\\/g, '\\\\\\\\').replace(/`/g, '\\\\`');\n if (!FieldPath.isValidIdentifier(str)) {\n str = '`' + str + '`';\n }\n return str;\n })\n .join('.');\n }\n\n toString(): string {\n return this.canonicalString();\n }\n\n /**\n * Returns true if this field references the key of a document.\n */\n isKeyField(): boolean {\n return this.length === 1 && this.get(0) === DOCUMENT_KEY_NAME;\n }\n\n /**\n * The field designating the key of a document.\n */\n static keyField(): FieldPath {\n return new FieldPath([DOCUMENT_KEY_NAME]);\n }\n\n /**\n * Parses a field string from the given server-formatted string.\n *\n * - Splitting the empty string is not allowed (for now at least).\n * - Empty segments within the string (e.g. if there are two consecutive\n * separators) are not allowed.\n *\n * TODO(b/37244157): we should make this more strict. Right now, it allows\n * non-identifier path components, even if they aren't escaped.\n */\n static fromServerFormat(path: string): FieldPath {\n const segments: string[] = [];\n let current = '';\n let i = 0;\n\n const addCurrentSegment = (): void => {\n if (current.length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid field path (${path}). Paths must not be empty, begin ` +\n `with '.', end with '.', or contain '..'`\n );\n }\n segments.push(current);\n current = '';\n };\n\n let inBackticks = false;\n\n while (i < path.length) {\n const c = path[i];\n if (c === '\\\\') {\n if (i + 1 === path.length) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Path has trailing escape character: ' + path\n );\n }\n const next = path[i + 1];\n if (!(next === '\\\\' || next === '.' || next === '`')) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Path has invalid escape sequence: ' + path\n );\n }\n current += next;\n i += 2;\n } else if (c === '`') {\n inBackticks = !inBackticks;\n i++;\n } else if (c === '.' && !inBackticks) {\n addCurrentSegment();\n i++;\n } else {\n current += c;\n i++;\n }\n }\n addCurrentSegment();\n\n if (inBackticks) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Unterminated ` in path: ' + path\n );\n }\n\n return new FieldPath(segments);\n }\n\n static emptyPath(): FieldPath {\n return new FieldPath([]);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\n\nimport { ResourcePath } from './path';\n\n/**\n * @internal\n */\nexport class DocumentKey {\n constructor(readonly path: ResourcePath) {\n debugAssert(\n DocumentKey.isDocumentKey(path),\n 'Invalid DocumentKey with an odd number of segments: ' +\n path.toArray().join('/')\n );\n }\n\n static fromPath(path: string): DocumentKey {\n return new DocumentKey(ResourcePath.fromString(path));\n }\n\n static fromName(name: string): DocumentKey {\n return new DocumentKey(ResourcePath.fromString(name).popFirst(5));\n }\n\n static empty(): DocumentKey {\n return new DocumentKey(ResourcePath.emptyPath());\n }\n\n get collectionGroup(): string {\n debugAssert(\n !this.path.isEmpty(),\n 'Cannot get collection group for empty key'\n );\n return this.path.popLast().lastSegment();\n }\n\n /** Returns true if the document is in the specified collectionId. */\n hasCollectionId(collectionId: string): boolean {\n return (\n this.path.length >= 2 &&\n this.path.get(this.path.length - 2) === collectionId\n );\n }\n\n /** Returns the collection group (i.e. the name of the parent collection) for this key. */\n getCollectionGroup(): string {\n debugAssert(\n !this.path.isEmpty(),\n 'Cannot get collection group for empty key'\n );\n return this.path.get(this.path.length - 2);\n }\n\n /** Returns the fully qualified path to the parent collection. */\n getCollectionPath(): ResourcePath {\n return this.path.popLast();\n }\n\n isEqual(other: DocumentKey | null): boolean {\n return (\n other !== null && ResourcePath.comparator(this.path, other.path) === 0\n );\n }\n\n toString(): string {\n return this.path.toString();\n }\n\n static comparator(k1: DocumentKey, k2: DocumentKey): number {\n return ResourcePath.comparator(k1.path, k2.path);\n }\n\n static isDocumentKey(path: ResourcePath): boolean {\n return path.length % 2 === 0;\n }\n\n /**\n * Creates and returns a new document key with the given segments.\n *\n * @param segments - The segments of the path to the document\n * @returns A new instance of DocumentKey\n */\n static fromSegments(segments: string[]): DocumentKey {\n return new DocumentKey(new ResourcePath(segments.slice()));\n }\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { Timestamp } from '../lite-api/timestamp';\nimport { primitiveComparator } from '../util/misc';\n\nimport { Document } from './document';\nimport { DocumentKey } from './document_key';\nimport { FieldPath } from './path';\n\n/**\n * The initial mutation batch id for each index. Gets updated during index\n * backfill.\n */\nexport const INITIAL_LARGEST_BATCH_ID = -1;\n\n/**\n * The initial sequence number for each index. Gets updated during index\n * backfill.\n */\nexport const INITIAL_SEQUENCE_NUMBER = 0;\n\n/**\n * An index definition for field indexes in Firestore.\n *\n * Every index is associated with a collection. The definition contains a list\n * of fields and their index kind (which can be `ASCENDING`, `DESCENDING` or\n * `CONTAINS` for ArrayContains/ArrayContainsAny queries).\n *\n * Unlike the backend, the SDK does not differentiate between collection or\n * collection group-scoped indices. Every index can be used for both single\n * collection and collection group queries.\n */\nexport class FieldIndex {\n /** An ID for an index that has not yet been added to persistence. */\n static UNKNOWN_ID = -1;\n\n constructor(\n /**\n * The index ID. Returns -1 if the index ID is not available (e.g. the index\n * has not yet been persisted).\n */\n readonly indexId: number,\n /** The collection ID this index applies to. */\n readonly collectionGroup: string,\n /** The field segments for this index. */\n readonly fields: IndexSegment[],\n /** Shows how up-to-date the index is for the current user. */\n readonly indexState: IndexState\n ) {}\n}\n\n/** Returns the ArrayContains/ArrayContainsAny segment for this index. */\nexport function fieldIndexGetArraySegment(\n fieldIndex: FieldIndex\n): IndexSegment | undefined {\n return fieldIndex.fields.find(s => s.kind === IndexKind.CONTAINS);\n}\n\n/** Returns all directional (ascending/descending) segments for this index. */\nexport function fieldIndexGetDirectionalSegments(\n fieldIndex: FieldIndex\n): IndexSegment[] {\n return fieldIndex.fields.filter(s => s.kind !== IndexKind.CONTAINS);\n}\n\n/**\n * Returns the order of the document key component for the given index.\n *\n * PORTING NOTE: This is only used in the Web IndexedDb implementation.\n */\nexport function fieldIndexGetKeyOrder(fieldIndex: FieldIndex): IndexKind {\n const directionalSegments = fieldIndexGetDirectionalSegments(fieldIndex);\n return directionalSegments.length === 0\n ? IndexKind.ASCENDING\n : directionalSegments[directionalSegments.length - 1].kind;\n}\n\n/**\n * Compares indexes by collection group and segments. Ignores update time and\n * index ID.\n */\nexport function fieldIndexSemanticComparator(\n left: FieldIndex,\n right: FieldIndex\n): number {\n let cmp = primitiveComparator(left.collectionGroup, right.collectionGroup);\n if (cmp !== 0) {\n return cmp;\n }\n\n for (let i = 0; i < Math.min(left.fields.length, right.fields.length); ++i) {\n cmp = indexSegmentComparator(left.fields[i], right.fields[i]);\n if (cmp !== 0) {\n return cmp;\n }\n }\n return primitiveComparator(left.fields.length, right.fields.length);\n}\n\n/** Returns a debug representation of the field index */\nexport function fieldIndexToString(fieldIndex: FieldIndex): string {\n return `id=${fieldIndex.indexId}|cg=${\n fieldIndex.collectionGroup\n }|f=${fieldIndex.fields.map(f => `${f.fieldPath}:${f.kind}`).join(',')}`;\n}\n\n/** The type of the index, e.g. for which type of query it can be used. */\nexport const enum IndexKind {\n // Note: The order of these values cannot be changed as the enum values are\n // stored in IndexedDb.\n /**\n * Ordered index. Can be used for <, <=, ==, >=, >, !=, IN and NOT IN queries.\n */\n ASCENDING,\n /**\n * Ordered index. Can be used for <, <=, ==, >=, >, !=, IN and NOT IN queries.\n */\n DESCENDING,\n /** Contains index. Can be used for ArrayContains and ArrayContainsAny. */\n CONTAINS\n}\n\n/** An index component consisting of field path and index type. */\nexport class IndexSegment {\n constructor(\n /** The field path of the component. */\n readonly fieldPath: FieldPath,\n /** The fields sorting order. */\n readonly kind: IndexKind\n ) {}\n}\n\nfunction indexSegmentComparator(\n left: IndexSegment,\n right: IndexSegment\n): number {\n const cmp = FieldPath.comparator(left.fieldPath, right.fieldPath);\n if (cmp !== 0) {\n return cmp;\n }\n return primitiveComparator(left.kind, right.kind);\n}\n\n/**\n * Stores the \"high water mark\" that indicates how updated the Index is for the\n * current user.\n */\nexport class IndexState {\n constructor(\n /**\n * Indicates when the index was last updated (relative to other indexes).\n */\n readonly sequenceNumber: number,\n /** The the latest indexed read time, document and batch id. */\n readonly offset: IndexOffset\n ) {}\n\n /** The state of an index that has not yet been backfilled. */\n static empty(): IndexState {\n return new IndexState(INITIAL_SEQUENCE_NUMBER, IndexOffset.min());\n }\n}\n\n/**\n * Creates an offset that matches all documents with a read time higher than\n * `readTime`.\n */\nexport function newIndexOffsetSuccessorFromReadTime(\n readTime: SnapshotVersion,\n largestBatchId: number\n): IndexOffset {\n // We want to create an offset that matches all documents with a read time\n // greater than the provided read time. To do so, we technically need to\n // create an offset for `(readTime, MAX_DOCUMENT_KEY)`. While we could use\n // Unicode codepoints to generate MAX_DOCUMENT_KEY, it is much easier to use\n // `(readTime + 1, DocumentKey.empty())` since `> DocumentKey.empty()` matches\n // all valid document IDs.\n const successorSeconds = readTime.toTimestamp().seconds;\n const successorNanos = readTime.toTimestamp().nanoseconds + 1;\n const successor = SnapshotVersion.fromTimestamp(\n successorNanos === 1e9\n ? new Timestamp(successorSeconds + 1, 0)\n : new Timestamp(successorSeconds, successorNanos)\n );\n return new IndexOffset(successor, DocumentKey.empty(), largestBatchId);\n}\n\n/** Creates a new offset based on the provided document. */\nexport function newIndexOffsetFromDocument(document: Document): IndexOffset {\n return new IndexOffset(\n document.readTime,\n document.key,\n INITIAL_LARGEST_BATCH_ID\n );\n}\n\n/**\n * Stores the latest read time, document and batch ID that were processed for an\n * index.\n */\nexport class IndexOffset {\n constructor(\n /**\n * The latest read time version that has been indexed by Firestore for this\n * field index.\n */\n readonly readTime: SnapshotVersion,\n\n /**\n * The key of the last document that was indexed for this query. Use\n * `DocumentKey.empty()` if no document has been indexed.\n */\n readonly documentKey: DocumentKey,\n\n /*\n * The largest mutation batch id that's been processed by Firestore.\n */\n readonly largestBatchId: number\n ) {}\n\n /** Returns an offset that sorts before all regular offsets. */\n static min(): IndexOffset {\n return new IndexOffset(\n SnapshotVersion.min(),\n DocumentKey.empty(),\n INITIAL_LARGEST_BATCH_ID\n );\n }\n\n /** Returns an offset that sorts after all regular offsets. */\n static max(): IndexOffset {\n return new IndexOffset(\n SnapshotVersion.max(),\n DocumentKey.empty(),\n INITIAL_LARGEST_BATCH_ID\n );\n }\n}\n\nexport function indexOffsetComparator(\n left: IndexOffset,\n right: IndexOffset\n): number {\n let cmp = left.readTime.compareTo(right.readTime);\n if (cmp !== 0) {\n return cmp;\n }\n cmp = DocumentKey.comparator(left.documentKey, right.documentKey);\n if (cmp !== 0) {\n return cmp;\n }\n return primitiveComparator(left.largestBatchId, right.largestBatchId);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber } from '../core/types';\nexport const PRIMARY_LEASE_LOST_ERROR_MSG =\n 'The current tab is not in the required state to perform this operation. ' +\n 'It might be necessary to refresh the browser tab.';\n\n/** The different modes supported by `Persistence.runTransaction()`. */\nexport type PersistenceTransactionMode =\n | 'readonly'\n | 'readwrite'\n | 'readwrite-primary';\n\n/**\n * A base class representing a persistence transaction, encapsulating both the\n * transaction's sequence numbers as well as a list of onCommitted listeners.\n *\n * When you call Persistence.runTransaction(), it will create a transaction and\n * pass it to your callback. You then pass it to any method that operates\n * on persistence.\n */\nexport abstract class PersistenceTransaction {\n private readonly onCommittedListeners: Array<() => void> = [];\n\n abstract readonly currentSequenceNumber: ListenSequenceNumber;\n\n addOnCommittedListener(listener: () => void): void {\n this.onCommittedListeners.push(listener);\n }\n\n raiseOnCommittedEvent(): void {\n this.onCommittedListeners.forEach(listener => listener());\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\n\nimport { IndexManager } from './index_manager';\nimport { LocalDocumentsView } from './local_documents_view';\nimport { LruGarbageCollector, LruResults } from './lru_garbage_collector';\nimport { PRIMARY_LEASE_LOST_ERROR_MSG } from './persistence_transaction';\n\nexport interface LocalStore {\n collectGarbage(garbageCollector: LruGarbageCollector): Promise;\n\n /** Manages the list of active field and collection indices. */\n indexManager: IndexManager;\n\n /**\n * The \"local\" view of all documents (layering mutationQueue on top of\n * remoteDocumentCache).\n */\n localDocuments: LocalDocumentsView;\n}\n\n/**\n * Verifies the error thrown by a LocalStore operation. If a LocalStore\n * operation fails because the primary lease has been taken by another client,\n * we ignore the error (the persistence layer will immediately call\n * `applyPrimaryLease` to propagate the primary state change). All other errors\n * are re-thrown.\n *\n * @param err - An error returned by a LocalStore operation.\n * @returns A Promise that resolves after we recovered, or the original error.\n */\nexport async function ignoreIfPrimaryLeaseLoss(\n err: FirestoreError\n): Promise {\n if (\n err.code === Code.FAILED_PRECONDITION &&\n err.message === PRIMARY_LEASE_LOST_ERROR_MSG\n ) {\n logDebug('LocalStore', 'Unexpectedly lost primary lease');\n } else {\n throw err;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fail } from '../util/assert';\n\nexport type FulfilledHandler =\n | ((result: T) => R | PersistencePromise)\n | null;\nexport type RejectedHandler =\n | ((reason: Error) => R | PersistencePromise)\n | null;\nexport type Resolver = (value?: T) => void;\nexport type Rejector = (error: Error) => void;\n\n/**\n * PersistencePromise is essentially a re-implementation of Promise except\n * it has a .next() method instead of .then() and .next() and .catch() callbacks\n * are executed synchronously when a PersistencePromise resolves rather than\n * asynchronously (Promise implementations use setImmediate() or similar).\n *\n * This is necessary to interoperate with IndexedDB which will automatically\n * commit transactions if control is returned to the event loop without\n * synchronously initiating another operation on the transaction.\n *\n * NOTE: .then() and .catch() only allow a single consumer, unlike normal\n * Promises.\n */\nexport class PersistencePromise {\n // NOTE: next/catchCallback will always point to our own wrapper functions,\n // not the user's raw next() or catch() callbacks.\n private nextCallback: FulfilledHandler = null;\n private catchCallback: RejectedHandler = null;\n\n // When the operation resolves, we'll set result or error and mark isDone.\n private result: T | undefined = undefined;\n private error: Error | undefined = undefined;\n private isDone = false;\n\n // Set to true when .then() or .catch() are called and prevents additional\n // chaining.\n private callbackAttached = false;\n\n constructor(callback: (resolve: Resolver, reject: Rejector) => void) {\n callback(\n value => {\n this.isDone = true;\n this.result = value;\n if (this.nextCallback) {\n // value should be defined unless T is Void, but we can't express\n // that in the type system.\n this.nextCallback(value!);\n }\n },\n error => {\n this.isDone = true;\n this.error = error;\n if (this.catchCallback) {\n this.catchCallback(error);\n }\n }\n );\n }\n\n catch(\n fn: (error: Error) => R | PersistencePromise\n ): PersistencePromise {\n return this.next(undefined, fn);\n }\n\n next(\n nextFn?: FulfilledHandler,\n catchFn?: RejectedHandler\n ): PersistencePromise {\n if (this.callbackAttached) {\n fail('Called next() or catch() twice for PersistencePromise');\n }\n this.callbackAttached = true;\n if (this.isDone) {\n if (!this.error) {\n return this.wrapSuccess(nextFn, this.result!);\n } else {\n return this.wrapFailure(catchFn, this.error);\n }\n } else {\n return new PersistencePromise((resolve, reject) => {\n this.nextCallback = (value: T) => {\n this.wrapSuccess(nextFn, value).next(resolve, reject);\n };\n this.catchCallback = (error: Error) => {\n this.wrapFailure(catchFn, error).next(resolve, reject);\n };\n });\n }\n }\n\n toPromise(): Promise {\n return new Promise((resolve, reject) => {\n this.next(resolve, reject);\n });\n }\n\n private wrapUserFunction(\n fn: () => R | PersistencePromise\n ): PersistencePromise {\n try {\n const result = fn();\n if (result instanceof PersistencePromise) {\n return result;\n } else {\n return PersistencePromise.resolve(result);\n }\n } catch (e) {\n return PersistencePromise.reject(e as Error);\n }\n }\n\n private wrapSuccess(\n nextFn: FulfilledHandler | undefined,\n value: T\n ): PersistencePromise {\n if (nextFn) {\n return this.wrapUserFunction(() => nextFn(value));\n } else {\n // If there's no nextFn, then R must be the same as T\n return PersistencePromise.resolve(value as unknown as R);\n }\n }\n\n private wrapFailure(\n catchFn: RejectedHandler | undefined,\n error: Error\n ): PersistencePromise {\n if (catchFn) {\n return this.wrapUserFunction(() => catchFn(error));\n } else {\n return PersistencePromise.reject(error);\n }\n }\n\n static resolve(): PersistencePromise;\n static resolve(result: R): PersistencePromise;\n static resolve(result?: R): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n resolve(result);\n });\n }\n\n static reject(error: Error): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n reject(error);\n });\n }\n\n static waitFor(\n // Accept all Promise types in waitFor().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n all: { forEach: (cb: (el: PersistencePromise) => void) => void }\n ): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n let expectedCount = 0;\n let resolvedCount = 0;\n let done = false;\n\n all.forEach(element => {\n ++expectedCount;\n element.next(\n () => {\n ++resolvedCount;\n if (done && resolvedCount === expectedCount) {\n resolve();\n }\n },\n err => reject(err)\n );\n });\n\n done = true;\n if (resolvedCount === expectedCount) {\n resolve();\n }\n });\n }\n\n /**\n * Given an array of predicate functions that asynchronously evaluate to a\n * boolean, implements a short-circuiting `or` between the results. Predicates\n * will be evaluated until one of them returns `true`, then stop. The final\n * result will be whether any of them returned `true`.\n */\n static or(\n predicates: Array<() => PersistencePromise>\n ): PersistencePromise {\n let p: PersistencePromise =\n PersistencePromise.resolve(false);\n for (const predicate of predicates) {\n p = p.next(isTrue => {\n if (isTrue) {\n return PersistencePromise.resolve(isTrue);\n } else {\n return predicate();\n }\n });\n }\n return p;\n }\n\n /**\n * Given an iterable, call the given function on each element in the\n * collection and wait for all of the resulting concurrent PersistencePromises\n * to resolve.\n */\n static forEach(\n collection: { forEach: (cb: (r: R, s: S) => void) => void },\n f:\n | ((r: R, s: S) => PersistencePromise)\n | ((r: R) => PersistencePromise)\n ): PersistencePromise;\n static forEach(\n collection: { forEach: (cb: (r: R) => void) => void },\n f: (r: R) => PersistencePromise\n ): PersistencePromise;\n static forEach(\n collection: { forEach: (cb: (r: R, s?: S) => void) => void },\n f: (r: R, s?: S) => PersistencePromise\n ): PersistencePromise {\n const promises: Array> = [];\n collection.forEach((r, s) => {\n promises.push(f.call(this, r, s));\n });\n return this.waitFor(promises);\n }\n\n /**\n * Concurrently map all array elements through asynchronous function.\n */\n static mapArray(\n array: T[],\n f: (t: T) => PersistencePromise\n ): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n const expectedCount = array.length;\n const results: U[] = new Array(expectedCount);\n let resolvedCount = 0;\n for (let i = 0; i < expectedCount; i++) {\n const current = i;\n f(array[current]).next(\n result => {\n results[current] = result;\n ++resolvedCount;\n if (resolvedCount === expectedCount) {\n resolve(results);\n }\n },\n err => reject(err)\n );\n }\n });\n }\n\n /**\n * An alternative to recursive PersistencePromise calls, that avoids\n * potential memory problems from unbounded chains of promises.\n *\n * The `action` will be called repeatedly while `condition` is true.\n */\n static doWhile(\n condition: () => boolean,\n action: () => PersistencePromise\n ): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n const process = (): void => {\n if (condition() === true) {\n action().next(() => {\n process();\n }, reject);\n } else {\n resolve();\n }\n };\n process();\n });\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUA, isIndexedDBAvailable } from '@firebase/util';\n\nimport { debugAssert } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logError } from '../util/log';\nimport { Deferred } from '../util/promise';\n\nimport { PersistencePromise } from './persistence_promise';\n\n// References to `window` are guarded by SimpleDb.isAvailable()\n/* eslint-disable no-restricted-globals */\n\nconst LOG_TAG = 'SimpleDb';\n\n/**\n * The maximum number of retry attempts for an IndexedDb transaction that fails\n * with a DOMException.\n */\nconst TRANSACTION_RETRY_COUNT = 3;\n\n// The different modes supported by `SimpleDb.runTransaction()`\ntype SimpleDbTransactionMode = 'readonly' | 'readwrite';\n\nexport interface SimpleDbSchemaConverter {\n createOrUpgrade(\n db: IDBDatabase,\n txn: IDBTransaction,\n fromVersion: number,\n toVersion: number\n ): PersistencePromise;\n}\n\n/**\n * Wraps an IDBTransaction and exposes a store() method to get a handle to a\n * specific object store.\n */\nexport class SimpleDbTransaction {\n private aborted = false;\n\n /**\n * A `Promise` that resolves with the result of the IndexedDb transaction.\n */\n private readonly completionDeferred = new Deferred();\n\n static open(\n db: IDBDatabase,\n action: string,\n mode: IDBTransactionMode,\n objectStoreNames: string[]\n ): SimpleDbTransaction {\n try {\n return new SimpleDbTransaction(\n action,\n db.transaction(objectStoreNames, mode)\n );\n } catch (e) {\n throw new IndexedDbTransactionError(action, e as Error);\n }\n }\n\n constructor(\n private readonly action: string,\n private readonly transaction: IDBTransaction\n ) {\n this.transaction.oncomplete = () => {\n this.completionDeferred.resolve();\n };\n this.transaction.onabort = () => {\n if (transaction.error) {\n this.completionDeferred.reject(\n new IndexedDbTransactionError(action, transaction.error)\n );\n } else {\n this.completionDeferred.resolve();\n }\n };\n this.transaction.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n this.completionDeferred.reject(\n new IndexedDbTransactionError(action, error)\n );\n };\n }\n\n get completionPromise(): Promise {\n return this.completionDeferred.promise;\n }\n\n abort(error?: Error): void {\n if (error) {\n this.completionDeferred.reject(error);\n }\n\n if (!this.aborted) {\n logDebug(\n LOG_TAG,\n 'Aborting transaction:',\n error ? error.message : 'Client-initiated abort'\n );\n this.aborted = true;\n this.transaction.abort();\n }\n }\n\n maybeCommit(): void {\n // If the browser supports V3 IndexedDB, we invoke commit() explicitly to\n // speed up index DB processing if the event loop remains blocks.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const maybeV3IndexedDb = this.transaction as any;\n if (!this.aborted && typeof maybeV3IndexedDb.commit === 'function') {\n maybeV3IndexedDb.commit();\n }\n }\n\n /**\n * Returns a SimpleDbStore for the specified store. All\n * operations performed on the SimpleDbStore happen within the context of this\n * transaction and it cannot be used anymore once the transaction is\n * completed.\n *\n * Note that we can't actually enforce that the KeyType and ValueType are\n * correct, but they allow type safety through the rest of the consuming code.\n */\n store(\n storeName: string\n ): SimpleDbStore {\n const store = this.transaction.objectStore(storeName);\n debugAssert(!!store, 'Object store not part of transaction: ' + storeName);\n return new SimpleDbStore(store);\n }\n}\n\n/**\n * Provides a wrapper around IndexedDb with a simplified interface that uses\n * Promise-like return values to chain operations. Real promises cannot be used\n * since .then() continuations are executed asynchronously (e.g. via\n * .setImmediate), which would cause IndexedDB to end the transaction.\n * See PersistencePromise for more details.\n */\nexport class SimpleDb {\n private db?: IDBDatabase;\n private versionchangelistener?: (event: IDBVersionChangeEvent) => void;\n\n /** Deletes the specified database. */\n static delete(name: string): Promise {\n logDebug(LOG_TAG, 'Removing database:', name);\n return wrapRequest(window.indexedDB.deleteDatabase(name)).toPromise();\n }\n\n /** Returns true if IndexedDB is available in the current environment. */\n static isAvailable(): boolean {\n if (!isIndexedDBAvailable()) {\n return false;\n }\n\n if (SimpleDb.isMockPersistence()) {\n return true;\n }\n\n // We extensively use indexed array values and compound keys,\n // which IE and Edge do not support. However, they still have indexedDB\n // defined on the window, so we need to check for them here and make sure\n // to return that persistence is not enabled for those browsers.\n // For tracking support of this feature, see here:\n // https://developer.microsoft.com/en-us/microsoft-edge/platform/status/indexeddbarraysandmultientrysupport/\n\n // Check the UA string to find out the browser.\n const ua = getUA();\n\n // IE 10\n // ua = 'Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.2; Trident/6.0)';\n\n // IE 11\n // ua = 'Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko';\n\n // Edge\n // ua = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,\n // like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0';\n\n // iOS Safari: Disable for users running iOS version < 10.\n const iOSVersion = SimpleDb.getIOSVersion(ua);\n const isUnsupportedIOS = 0 < iOSVersion && iOSVersion < 10;\n\n // Android browser: Disable for users running version < 4.5.\n const androidVersion = getAndroidVersion(ua);\n const isUnsupportedAndroid = 0 < androidVersion && androidVersion < 4.5;\n\n if (\n ua.indexOf('MSIE ') > 0 ||\n ua.indexOf('Trident/') > 0 ||\n ua.indexOf('Edge/') > 0 ||\n isUnsupportedIOS ||\n isUnsupportedAndroid\n ) {\n return false;\n } else {\n return true;\n }\n }\n\n /**\n * Returns true if the backing IndexedDB store is the Node IndexedDBShim\n * (see https://github.com/axemclion/IndexedDBShim).\n */\n static isMockPersistence(): boolean {\n return (\n typeof process !== 'undefined' &&\n process.env?.USE_MOCK_PERSISTENCE === 'YES'\n );\n }\n\n /** Helper to get a typed SimpleDbStore from a transaction. */\n static getStore(\n txn: SimpleDbTransaction,\n store: string\n ): SimpleDbStore {\n return txn.store(store);\n }\n\n // visible for testing\n /** Parse User Agent to determine iOS version. Returns -1 if not found. */\n static getIOSVersion(ua: string): number {\n const iOSVersionRegex = ua.match(/i(?:phone|pad|pod) os ([\\d_]+)/i);\n const version = iOSVersionRegex\n ? iOSVersionRegex[1].split('_').slice(0, 2).join('.')\n : '-1';\n return Number(version);\n }\n\n /*\n * Creates a new SimpleDb wrapper for IndexedDb database `name`.\n *\n * Note that `version` must not be a downgrade. IndexedDB does not support\n * downgrading the schema version. We currently do not support any way to do\n * versioning outside of IndexedDB's versioning mechanism, as only\n * version-upgrade transactions are allowed to do things like create\n * objectstores.\n */\n constructor(\n private readonly name: string,\n private readonly version: number,\n private readonly schemaConverter: SimpleDbSchemaConverter\n ) {\n debugAssert(\n SimpleDb.isAvailable(),\n 'IndexedDB not supported in current environment.'\n );\n\n const iOSVersion = SimpleDb.getIOSVersion(getUA());\n // NOTE: According to https://bugs.webkit.org/show_bug.cgi?id=197050, the\n // bug we're checking for should exist in iOS >= 12.2 and < 13, but for\n // whatever reason it's much harder to hit after 12.2 so we only proactively\n // log on 12.2.\n if (iOSVersion === 12.2) {\n logError(\n 'Firestore persistence suffers from a bug in iOS 12.2 ' +\n 'Safari that may cause your app to stop working. See ' +\n 'https://stackoverflow.com/q/56496296/110915 for details ' +\n 'and a potential workaround.'\n );\n }\n }\n\n /**\n * Opens the specified database, creating or upgrading it if necessary.\n */\n async ensureDb(action: string): Promise {\n if (!this.db) {\n logDebug(LOG_TAG, 'Opening database:', this.name);\n this.db = await new Promise((resolve, reject) => {\n // TODO(mikelehen): Investigate browser compatibility.\n // https://developer.mozilla.org/en-US/docs/Web/API/IndexedDB_API/Using_IndexedDB\n // suggests IE9 and older WebKit browsers handle upgrade\n // differently. They expect setVersion, as described here:\n // https://developer.mozilla.org/en-US/docs/Web/API/IDBVersionChangeRequest/setVersion\n const request = indexedDB.open(this.name, this.version);\n\n request.onsuccess = (event: Event) => {\n const db = (event.target as IDBOpenDBRequest).result;\n resolve(db);\n };\n\n request.onblocked = () => {\n reject(\n new IndexedDbTransactionError(\n action,\n 'Cannot upgrade IndexedDB schema while another tab is open. ' +\n 'Close all tabs that access Firestore and reload this page to proceed.'\n )\n );\n };\n\n request.onerror = (event: Event) => {\n const error: DOMException = (event.target as IDBOpenDBRequest).error!;\n if (error.name === 'VersionError') {\n reject(\n new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'A newer version of the Firestore SDK was previously used and so the persisted ' +\n 'data is not compatible with the version of the SDK you are now using. The SDK ' +\n 'will operate with persistence disabled. If you need persistence, please ' +\n 're-upgrade to a newer version of the SDK or else clear the persisted IndexedDB ' +\n 'data for your app to start fresh.'\n )\n );\n } else if (error.name === 'InvalidStateError') {\n reject(\n new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Unable to open an IndexedDB connection. This could be due to running in a ' +\n 'private browsing session on a browser whose private browsing sessions do not ' +\n 'support IndexedDB: ' +\n error\n )\n );\n } else {\n reject(new IndexedDbTransactionError(action, error));\n }\n };\n\n request.onupgradeneeded = (event: IDBVersionChangeEvent) => {\n logDebug(\n LOG_TAG,\n 'Database \"' + this.name + '\" requires upgrade from version:',\n event.oldVersion\n );\n const db = (event.target as IDBOpenDBRequest).result;\n this.schemaConverter\n .createOrUpgrade(\n db,\n request.transaction!,\n event.oldVersion,\n this.version\n )\n .next(() => {\n logDebug(\n LOG_TAG,\n 'Database upgrade to version ' + this.version + ' complete'\n );\n });\n };\n });\n }\n\n if (this.versionchangelistener) {\n this.db.onversionchange = event => this.versionchangelistener!(event);\n }\n return this.db;\n }\n\n setVersionChangeListener(\n versionChangeListener: (event: IDBVersionChangeEvent) => void\n ): void {\n this.versionchangelistener = versionChangeListener;\n if (this.db) {\n this.db.onversionchange = (event: IDBVersionChangeEvent) => {\n return versionChangeListener(event);\n };\n }\n }\n\n async runTransaction(\n action: string,\n mode: SimpleDbTransactionMode,\n objectStores: string[],\n transactionFn: (transaction: SimpleDbTransaction) => PersistencePromise\n ): Promise {\n const readonly = mode === 'readonly';\n let attemptNumber = 0;\n\n while (true) {\n ++attemptNumber;\n\n try {\n this.db = await this.ensureDb(action);\n\n const transaction = SimpleDbTransaction.open(\n this.db,\n action,\n readonly ? 'readonly' : 'readwrite',\n objectStores\n );\n const transactionFnResult = transactionFn(transaction)\n .next(result => {\n transaction.maybeCommit();\n return result;\n })\n .catch(error => {\n // Abort the transaction if there was an error.\n transaction.abort(error);\n // We cannot actually recover, and calling `abort()` will cause the transaction's\n // completion promise to be rejected. This in turn means that we won't use\n // `transactionFnResult` below. We return a rejection here so that we don't add the\n // possibility of returning `void` to the type of `transactionFnResult`.\n return PersistencePromise.reject(error);\n })\n .toPromise();\n\n // As noted above, errors are propagated by aborting the transaction. So\n // we swallow any error here to avoid the browser logging it as unhandled.\n transactionFnResult.catch(() => {});\n\n // Wait for the transaction to complete (i.e. IndexedDb's onsuccess event to\n // fire), but still return the original transactionFnResult back to the\n // caller.\n await transaction.completionPromise;\n return transactionFnResult;\n } catch (e) {\n const error = e as Error;\n // TODO(schmidt-sebastian): We could probably be smarter about this and\n // not retry exceptions that are likely unrecoverable (such as quota\n // exceeded errors).\n\n // Note: We cannot use an instanceof check for FirestoreException, since the\n // exception is wrapped in a generic error by our async/await handling.\n const retryable =\n error.name !== 'FirebaseError' &&\n attemptNumber < TRANSACTION_RETRY_COUNT;\n logDebug(\n LOG_TAG,\n 'Transaction failed with error:',\n error.message,\n 'Retrying:',\n retryable\n );\n\n this.close();\n\n if (!retryable) {\n return Promise.reject(error);\n }\n }\n }\n }\n\n close(): void {\n if (this.db) {\n this.db.close();\n }\n this.db = undefined;\n }\n}\n\n/** Parse User Agent to determine Android version. Returns -1 if not found. */\nexport function getAndroidVersion(ua: string): number {\n const androidVersionRegex = ua.match(/Android ([\\d.]+)/i);\n const version = androidVersionRegex\n ? androidVersionRegex[1].split('.').slice(0, 2).join('.')\n : '-1';\n return Number(version);\n}\n\n/**\n * A controller for iterating over a key range or index. It allows an iterate\n * callback to delete the currently-referenced object, or jump to a new key\n * within the key range or index.\n */\nexport class IterationController {\n private shouldStop = false;\n private nextKey: IDBValidKey | null = null;\n\n constructor(private dbCursor: IDBCursorWithValue) {}\n\n get isDone(): boolean {\n return this.shouldStop;\n }\n\n get skipToKey(): IDBValidKey | null {\n return this.nextKey;\n }\n\n set cursor(value: IDBCursorWithValue) {\n this.dbCursor = value;\n }\n\n /**\n * This function can be called to stop iteration at any point.\n */\n done(): void {\n this.shouldStop = true;\n }\n\n /**\n * This function can be called to skip to that next key, which could be\n * an index or a primary key.\n */\n skip(key: IDBValidKey): void {\n this.nextKey = key;\n }\n\n /**\n * Delete the current cursor value from the object store.\n *\n * NOTE: You CANNOT do this with a keysOnly query.\n */\n delete(): PersistencePromise {\n return wrapRequest(this.dbCursor.delete());\n }\n}\n\n/**\n * Callback used with iterate() method.\n */\nexport type IterateCallback = (\n key: KeyType,\n value: ValueType,\n control: IterationController\n) => void | PersistencePromise;\n\n/** Options available to the iterate() method. */\nexport interface IterateOptions {\n /** Index to iterate over (else primary keys will be iterated) */\n index?: string;\n\n /** IndexedDB Range to iterate over (else entire store will be iterated) */\n range?: IDBKeyRange;\n\n /** If true, values aren't read while iterating. */\n keysOnly?: boolean;\n\n /** If true, iterate over the store in reverse. */\n reverse?: boolean;\n}\n\n/** An error that wraps exceptions that thrown during IndexedDB execution. */\nexport class IndexedDbTransactionError extends FirestoreError {\n name = 'IndexedDbTransactionError';\n\n constructor(actionName: string, cause: Error | string) {\n super(\n Code.UNAVAILABLE,\n `IndexedDB transaction '${actionName}' failed: ${cause}`\n );\n }\n}\n\n/** Verifies whether `e` is an IndexedDbTransactionError. */\nexport function isIndexedDbTransactionError(e: Error): boolean {\n // Use name equality, as instanceof checks on errors don't work with errors\n // that wrap other errors.\n return e.name === 'IndexedDbTransactionError';\n}\n\n/**\n * A wrapper around an IDBObjectStore providing an API that:\n *\n * 1) Has generic KeyType / ValueType parameters to provide strongly-typed\n * methods for acting against the object store.\n * 2) Deals with IndexedDB's onsuccess / onerror event callbacks, making every\n * method return a PersistencePromise instead.\n * 3) Provides a higher-level API to avoid needing to do excessive wrapping of\n * intermediate IndexedDB types (IDBCursorWithValue, etc.)\n */\nexport class SimpleDbStore<\n KeyType extends IDBValidKey,\n ValueType extends unknown\n> {\n constructor(private store: IDBObjectStore) {}\n\n /**\n * Writes a value into the Object Store.\n *\n * @param key - Optional explicit key to use when writing the object, else the\n * key will be auto-assigned (e.g. via the defined keyPath for the store).\n * @param value - The object to write.\n */\n put(value: ValueType): PersistencePromise;\n put(key: KeyType, value: ValueType): PersistencePromise;\n put(\n keyOrValue: KeyType | ValueType,\n value?: ValueType\n ): PersistencePromise {\n let request;\n if (value !== undefined) {\n logDebug(LOG_TAG, 'PUT', this.store.name, keyOrValue, value);\n request = this.store.put(value, keyOrValue as KeyType);\n } else {\n logDebug(LOG_TAG, 'PUT', this.store.name, '', keyOrValue);\n request = this.store.put(keyOrValue as ValueType);\n }\n return wrapRequest(request);\n }\n\n /**\n * Adds a new value into an Object Store and returns the new key. Similar to\n * IndexedDb's `add()`, this method will fail on primary key collisions.\n *\n * @param value - The object to write.\n * @returns The key of the value to add.\n */\n add(value: ValueType): PersistencePromise {\n logDebug(LOG_TAG, 'ADD', this.store.name, value, value);\n const request = this.store.add(value as ValueType);\n return wrapRequest(request);\n }\n\n /**\n * Gets the object with the specified key from the specified store, or null\n * if no object exists with the specified key.\n *\n * @key The key of the object to get.\n * @returns The object with the specified key or null if no object exists.\n */\n get(key: KeyType): PersistencePromise {\n const request = this.store.get(key);\n // We're doing an unsafe cast to ValueType.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return wrapRequest(request).next(result => {\n // Normalize nonexistence to null.\n if (result === undefined) {\n result = null;\n }\n logDebug(LOG_TAG, 'GET', this.store.name, key, result);\n return result;\n });\n }\n\n delete(key: KeyType | IDBKeyRange): PersistencePromise {\n logDebug(LOG_TAG, 'DELETE', this.store.name, key);\n const request = this.store.delete(key);\n return wrapRequest(request);\n }\n\n /**\n * If we ever need more of the count variants, we can add overloads. For now,\n * all we need is to count everything in a store.\n *\n * Returns the number of rows in the store.\n */\n count(): PersistencePromise {\n logDebug(LOG_TAG, 'COUNT', this.store.name);\n const request = this.store.count();\n return wrapRequest(request);\n }\n\n /** Loads all elements from the object store. */\n loadAll(): PersistencePromise;\n /** Loads all elements for the index range from the object store. */\n loadAll(range: IDBKeyRange): PersistencePromise;\n /** Loads all elements ordered by the given index. */\n loadAll(index: string): PersistencePromise;\n /**\n * Loads all elements from the object store that fall into the provided in the\n * index range for the given index.\n */\n loadAll(index: string, range: IDBKeyRange): PersistencePromise;\n loadAll(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): PersistencePromise {\n const iterateOptions = this.options(indexOrRange, range);\n // Use `getAll()` if the browser supports IndexedDB v3, as it is roughly\n // 20% faster.\n const store = iterateOptions.index\n ? this.store.index(iterateOptions.index)\n : this.store;\n if (typeof store.getAll === 'function') {\n const request = store.getAll(iterateOptions.range);\n return new PersistencePromise((resolve, reject) => {\n request.onerror = (event: Event) => {\n reject((event.target as IDBRequest).error!);\n };\n request.onsuccess = (event: Event) => {\n resolve((event.target as IDBRequest).result);\n };\n });\n } else {\n const cursor = this.cursor(iterateOptions);\n const results: ValueType[] = [];\n return this.iterateCursor(cursor, (key, value) => {\n results.push(value);\n }).next(() => {\n return results;\n });\n }\n }\n\n /**\n * Loads the first `count` elements from the provided index range. Loads all\n * elements if no limit is provided.\n */\n loadFirst(\n range: IDBKeyRange,\n count: number | null\n ): PersistencePromise {\n const request = this.store.getAll(\n range,\n count === null ? undefined : count\n );\n return new PersistencePromise((resolve, reject) => {\n request.onerror = (event: Event) => {\n reject((event.target as IDBRequest).error!);\n };\n request.onsuccess = (event: Event) => {\n resolve((event.target as IDBRequest).result);\n };\n });\n }\n\n deleteAll(): PersistencePromise;\n deleteAll(range: IDBKeyRange): PersistencePromise;\n deleteAll(index: string, range: IDBKeyRange): PersistencePromise;\n deleteAll(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): PersistencePromise {\n logDebug(LOG_TAG, 'DELETE ALL', this.store.name);\n const options = this.options(indexOrRange, range);\n options.keysOnly = false;\n const cursor = this.cursor(options);\n return this.iterateCursor(cursor, (key, value, control) => {\n // NOTE: Calling delete() on a cursor is documented as more efficient than\n // calling delete() on an object store with a single key\n // (https://developer.mozilla.org/en-US/docs/Web/API/IDBObjectStore/delete),\n // however, this requires us *not* to use a keysOnly cursor\n // (https://developer.mozilla.org/en-US/docs/Web/API/IDBCursor/delete). We\n // may want to compare the performance of each method.\n return control.delete();\n });\n }\n\n /**\n * Iterates over keys and values in an object store.\n *\n * @param options - Options specifying how to iterate the objects in the\n * store.\n * @param callback - will be called for each iterated object. Iteration can be\n * canceled at any point by calling the doneFn passed to the callback.\n * The callback can return a PersistencePromise if it performs async\n * operations but note that iteration will continue without waiting for them\n * to complete.\n * @returns A PersistencePromise that resolves once all PersistencePromises\n * returned by callbacks resolve.\n */\n iterate(\n callback: IterateCallback\n ): PersistencePromise;\n iterate(\n options: IterateOptions,\n callback: IterateCallback\n ): PersistencePromise;\n iterate(\n optionsOrCallback: IterateOptions | IterateCallback,\n callback?: IterateCallback\n ): PersistencePromise {\n let options;\n if (!callback) {\n options = {};\n callback = optionsOrCallback as IterateCallback;\n } else {\n options = optionsOrCallback as IterateOptions;\n }\n const cursor = this.cursor(options);\n return this.iterateCursor(cursor, callback);\n }\n\n /**\n * Iterates over a store, but waits for the given callback to complete for\n * each entry before iterating the next entry. This allows the callback to do\n * asynchronous work to determine if this iteration should continue.\n *\n * The provided callback should return `true` to continue iteration, and\n * `false` otherwise.\n */\n iterateSerial(\n callback: (k: KeyType, v: ValueType) => PersistencePromise\n ): PersistencePromise {\n const cursorRequest = this.cursor({});\n return new PersistencePromise((resolve, reject) => {\n cursorRequest.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n reject(error);\n };\n cursorRequest.onsuccess = (event: Event) => {\n const cursor: IDBCursorWithValue = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n\n callback(cursor.primaryKey as KeyType, cursor.value).next(\n shouldContinue => {\n if (shouldContinue) {\n cursor.continue();\n } else {\n resolve();\n }\n }\n );\n };\n });\n }\n\n private iterateCursor(\n cursorRequest: IDBRequest,\n fn: IterateCallback\n ): PersistencePromise {\n const results: Array> = [];\n return new PersistencePromise((resolve, reject) => {\n cursorRequest.onerror = (event: Event) => {\n reject((event.target as IDBRequest).error!);\n };\n cursorRequest.onsuccess = (event: Event) => {\n const cursor: IDBCursorWithValue = (event.target as IDBRequest).result;\n if (!cursor) {\n resolve();\n return;\n }\n const controller = new IterationController(cursor);\n const userResult = fn(\n cursor.primaryKey as KeyType,\n cursor.value,\n controller\n );\n if (userResult instanceof PersistencePromise) {\n const userPromise: PersistencePromise = userResult.catch(\n err => {\n controller.done();\n return PersistencePromise.reject(err);\n }\n );\n results.push(userPromise);\n }\n if (controller.isDone) {\n resolve();\n } else if (controller.skipToKey === null) {\n cursor.continue();\n } else {\n cursor.continue(controller.skipToKey);\n }\n };\n }).next(() => PersistencePromise.waitFor(results));\n }\n\n private options(\n indexOrRange?: string | IDBKeyRange,\n range?: IDBKeyRange\n ): IterateOptions {\n let indexName: string | undefined = undefined;\n if (indexOrRange !== undefined) {\n if (typeof indexOrRange === 'string') {\n indexName = indexOrRange;\n } else {\n debugAssert(\n range === undefined,\n '3rd argument must not be defined if 2nd is a range.'\n );\n range = indexOrRange;\n }\n }\n return { index: indexName, range };\n }\n\n private cursor(options: IterateOptions): IDBRequest {\n let direction: IDBCursorDirection = 'next';\n if (options.reverse) {\n direction = 'prev';\n }\n if (options.index) {\n const index = this.store.index(options.index);\n if (options.keysOnly) {\n return index.openKeyCursor(options.range, direction);\n } else {\n return index.openCursor(options.range, direction);\n }\n } else {\n return this.store.openCursor(options.range, direction);\n }\n }\n}\n\n/**\n * Wraps an IDBRequest in a PersistencePromise, using the onsuccess / onerror\n * handlers to resolve / reject the PersistencePromise as appropriate.\n */\nfunction wrapRequest(request: IDBRequest): PersistencePromise {\n return new PersistencePromise((resolve, reject) => {\n request.onsuccess = (event: Event) => {\n const result = (event.target as IDBRequest).result;\n resolve(result);\n };\n\n request.onerror = (event: Event) => {\n const error = checkForAndReportiOSError(\n (event.target as IDBRequest).error!\n );\n reject(error);\n };\n });\n}\n\n// Guard so we only report the error once.\nlet reportedIOSError = false;\nfunction checkForAndReportiOSError(error: DOMException): Error {\n const iOSVersion = SimpleDb.getIOSVersion(getUA());\n if (iOSVersion >= 12.2 && iOSVersion < 13) {\n const IOS_ERROR =\n 'An internal error was encountered in the Indexed Database server';\n if (error.message.indexOf(IOS_ERROR) >= 0) {\n // Wrap error in a more descriptive one.\n const newError = new FirestoreError(\n 'internal',\n `IOS_INDEXEDDB_BUG1: IndexedDb has thrown '${IOS_ERROR}'. This is likely ` +\n `due to an unavoidable bug in iOS. See https://stackoverflow.com/q/56496296/110915 ` +\n `for details and a potential workaround.`\n );\n if (!reportedIOSError) {\n reportedIOSError = true;\n // Throw a global exception outside of this promise chain, for the user to\n // potentially catch.\n setTimeout(() => {\n throw newError;\n }, 0);\n }\n return newError;\n }\n }\n return error;\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber } from './types';\n\n/**\n * `SequenceNumberSyncer` defines the methods required to keep multiple instances of a\n * `ListenSequence` in sync.\n */\nexport interface SequenceNumberSyncer {\n // Notify the syncer that a new sequence number has been used.\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void;\n // Setting this property allows the syncer to notify when a sequence number has been used, and\n // and lets the ListenSequence adjust its internal previous value accordingly.\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null;\n}\n\n/**\n * `ListenSequence` is a monotonic sequence. It is initialized with a minimum value to\n * exceed. All subsequent calls to next will return increasing values. If provided with a\n * `SequenceNumberSyncer`, it will additionally bump its next value when told of a new value, as\n * well as write out sequence numbers that it produces via `next()`.\n */\nexport class ListenSequence {\n static readonly INVALID: ListenSequenceNumber = -1;\n\n private writeNewSequenceNumber?: (\n newSequenceNumber: ListenSequenceNumber\n ) => void;\n\n constructor(\n private previousValue: ListenSequenceNumber,\n sequenceNumberSyncer?: SequenceNumberSyncer\n ) {\n if (sequenceNumberSyncer) {\n sequenceNumberSyncer.sequenceNumberHandler = sequenceNumber =>\n this.setPreviousValue(sequenceNumber);\n this.writeNewSequenceNumber = sequenceNumber =>\n sequenceNumberSyncer.writeSequenceNumber(sequenceNumber);\n }\n }\n\n private setPreviousValue(\n externalPreviousValue: ListenSequenceNumber\n ): ListenSequenceNumber {\n this.previousValue = Math.max(externalPreviousValue, this.previousValue);\n return this.previousValue;\n }\n\n next(): ListenSequenceNumber {\n const nextValue = ++this.previousValue;\n if (this.writeNewSequenceNumber) {\n this.writeNewSequenceNumber(nextValue);\n }\n return nextValue;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Sentinel value that sorts before any Mutation Batch ID. */\nexport const BATCHID_UNKNOWN = -1;\n\n// An Object whose keys and values are strings.\nexport interface StringMap {\n [key: string]: string;\n}\n\n/**\n * Returns whether a variable is either undefined or null.\n */\nexport function isNullOrUndefined(value: unknown): value is null | undefined {\n return value === null || value === undefined;\n}\n\n/** Returns whether the value represents -0. */\nexport function isNegativeZero(value: number): boolean {\n // Detect if the value is -0.0. Based on polyfill from\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\n return value === 0 && 1 / value === 1 / -0;\n}\n\n/**\n * Returns whether a value is an integer and in the safe integer range\n * @param value - The value to test for being an integer and in the safe range\n */\nexport function isSafeInteger(value: unknown): boolean {\n return (\n typeof value === 'number' &&\n Number.isInteger(value) &&\n !isNegativeZero(value) &&\n value <= Number.MAX_SAFE_INTEGER &&\n value >= Number.MIN_SAFE_INTEGER\n );\n}\n\n/** The subset of the browser's Window interface used by the SDK. */\nexport interface WindowLike {\n readonly localStorage: Storage;\n readonly indexedDB: IDBFactory | null;\n addEventListener(type: string, listener: EventListener): void;\n removeEventListener(type: string, listener: EventListener): void;\n}\n\n/** The subset of the browser's Document interface used by the SDK. */\nexport interface DocumentLike {\n readonly visibilityState: DocumentVisibilityState;\n addEventListener(type: string, listener: EventListener): void;\n removeEventListener(type: string, listener: EventListener): void;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ResourcePath } from '../model/path';\nimport { fail, hardAssert } from '../util/assert';\n\n/**\n * Helpers for dealing with resource paths stored in IndexedDB.\n *\n * Resource paths in their canonical string form do not sort as the server\n * sorts them. Specifically the server splits paths into segments first and then\n * sorts, putting end-of-segment before any character. In a UTF-8 string\n * encoding the slash ('/') that denotes the end-of-segment naturally comes\n * after other characters so the intent here is to encode the path delimiters in\n * such a way that the resulting strings sort naturally.\n *\n * Resource paths are also used for prefix scans so it's important to\n * distinguish whole segments from any longer segments of which they might be a\n * prefix. For example, it's important to make it possible to scan documents in\n * a collection \"foo\" without encountering documents in a collection \"foobar\".\n *\n * Separate from the concerns about resource path ordering and separation,\n * On Android, SQLite imposes additional restrictions since it does not handle\n * keys with embedded NUL bytes particularly well. Rather than change the\n * implementation we keep the encoding identical to keep the ports similar.\n *\n * Taken together this means resource paths when encoded for storage in\n * IndexedDB have the following characteristics:\n *\n * * Segment separators (\"/\") sort before everything else.\n * * All paths have a trailing separator.\n * * NUL bytes do not exist in the output, since IndexedDB doesn't treat them\n * well.\n *\n * Therefore resource paths are encoded into string form using the following\n * rules:\n *\n * * '\\x01' is used as an escape character.\n * * Path separators are encoded as \"\\x01\\x01\"\n * * NUL bytes are encoded as \"\\x01\\x10\"\n * * '\\x01' is encoded as \"\\x01\\x11\"\n *\n * This encoding leaves some room between path separators and the NUL byte\n * just in case we decide to support integer document ids after all.\n *\n * Note that characters treated specially by the backend ('.', '/', and '~')\n * are not treated specially here. This class assumes that any unescaping of\n * resource path strings into actual ResourcePath objects will handle these\n * characters there.\n */\nexport type EncodedResourcePath = string;\n\nconst escapeChar = '\\u0001';\nconst encodedSeparatorChar = '\\u0001';\nconst encodedNul = '\\u0010';\nconst encodedEscape = '\\u0011';\n\n/**\n * Encodes a resource path into a IndexedDb-compatible string form.\n */\nexport function encodeResourcePath(path: ResourcePath): EncodedResourcePath {\n let result = '';\n for (let i = 0; i < path.length; i++) {\n if (result.length > 0) {\n result = encodeSeparator(result);\n }\n result = encodeSegment(path.get(i), result);\n }\n return encodeSeparator(result);\n}\n\n/** Encodes a single segment of a resource path into the given result */\nfunction encodeSegment(segment: string, resultBuf: string): string {\n let result = resultBuf;\n const length = segment.length;\n for (let i = 0; i < length; i++) {\n const c = segment.charAt(i);\n switch (c) {\n case '\\0':\n result += escapeChar + encodedNul;\n break;\n case escapeChar:\n result += escapeChar + encodedEscape;\n break;\n default:\n result += c;\n }\n }\n return result;\n}\n\n/** Encodes a path separator into the given result */\nfunction encodeSeparator(result: string): string {\n return result + escapeChar + encodedSeparatorChar;\n}\n\n/**\n * Decodes the given IndexedDb-compatible string form of a resource path into\n * a ResourcePath instance. Note that this method is not suitable for use with\n * decoding resource names from the server; those are One Platform format\n * strings.\n */\nexport function decodeResourcePath(path: EncodedResourcePath): ResourcePath {\n // Event the empty path must encode as a path of at least length 2. A path\n // with exactly 2 must be the empty path.\n const length = path.length;\n hardAssert(length >= 2, 'Invalid path ' + path);\n if (length === 2) {\n hardAssert(\n path.charAt(0) === escapeChar && path.charAt(1) === encodedSeparatorChar,\n 'Non-empty path ' + path + ' had length 2'\n );\n return ResourcePath.emptyPath();\n }\n\n // Escape characters cannot exist past the second-to-last position in the\n // source value.\n const lastReasonableEscapeIndex = length - 2;\n\n const segments: string[] = [];\n let segmentBuilder = '';\n\n for (let start = 0; start < length; ) {\n // The last two characters of a valid encoded path must be a separator, so\n // there must be an end to this segment.\n const end = path.indexOf(escapeChar, start);\n if (end < 0 || end > lastReasonableEscapeIndex) {\n fail('Invalid encoded resource path: \"' + path + '\"');\n }\n\n const next = path.charAt(end + 1);\n switch (next) {\n case encodedSeparatorChar:\n const currentPiece = path.substring(start, end);\n let segment;\n if (segmentBuilder.length === 0) {\n // Avoid copying for the common case of a segment that excludes \\0\n // and \\001\n segment = currentPiece;\n } else {\n segmentBuilder += currentPiece;\n segment = segmentBuilder;\n segmentBuilder = '';\n }\n segments.push(segment);\n break;\n case encodedNul:\n segmentBuilder += path.substring(start, end);\n segmentBuilder += '\\0';\n break;\n case encodedEscape:\n // The escape character can be used in the output to encode itself.\n segmentBuilder += path.substring(start, end + 1);\n break;\n default:\n fail('Invalid encoded resource path: \"' + path + '\"');\n }\n\n start = end + 2;\n }\n\n return new ResourcePath(segments);\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BatchId, TargetId } from '../core/types';\nimport { ResourcePath } from '../model/path';\nimport { fail } from '../util/assert';\n\nimport {\n EncodedResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport { DbDocumentMutation } from './indexeddb_schema';\nimport { DbRemoteDocumentStore as DbRemoteDocumentStoreLegacy } from './indexeddb_schema_legacy';\n\n// This file contains static constants and helper functions for IndexedDB.\n// It is split from indexeddb_schema to allow for minification.\n\n/** A timestamp type that can be used in IndexedDb keys. */\nexport type DbTimestampKey = [/* seconds */ number, /* nanos */ number];\n\n// The key for the singleton object in the DbPrimaryClient is a single string.\nexport type DbPrimaryClientKey = typeof DbPrimaryClientKey;\n\n/**\n * Name of the IndexedDb object store.\n *\n * Note that the name 'owner' is chosen to ensure backwards compatibility with\n * older clients that only supported single locked access to the persistence\n * layer.\n */\nexport const DbPrimaryClientStore = 'owner';\n\n/**\n * The key string used for the single object that exists in the\n * DbPrimaryClient store.\n */\n\nexport const DbPrimaryClientKey = 'owner';\n\n/** Object keys in the 'mutationQueues' store are userId strings. */\nexport type DbMutationQueueKey = string;\n\n/** Name of the IndexedDb object store. */\nexport const DbMutationQueueStore = 'mutationQueues';\n\n/** Keys are automatically assigned via the userId property. */\nexport const DbMutationQueueKeyPath = 'userId';\n\n/** The 'mutations' store is keyed by batch ID. */\nexport type DbMutationBatchKey = BatchId;\n\n/** Name of the IndexedDb object store. */\nexport const DbMutationBatchStore = 'mutations';\n\n/** Keys are automatically assigned via the userId, batchId properties. */\nexport const DbMutationBatchKeyPath = 'batchId';\n\n/** The index name for lookup of mutations by user. */\n\nexport const DbMutationBatchUserMutationsIndex = 'userMutationsIndex';\n\n/** The user mutations index is keyed by [userId, batchId] pairs. */\nexport const DbMutationBatchUserMutationsKeyPath = ['userId', 'batchId'];\n\n/**\n * The key for a db document mutation, which is made up of a userID, path, and\n * batchId. Note that the path must be serialized into a form that indexedDB can\n * sort.\n */\nexport type DbDocumentMutationKey = [string, EncodedResourcePath, BatchId];\n\n/**\n * Creates a [userId] key for use in the DbDocumentMutations index to iterate\n * over all of a user's document mutations.\n */\nexport function newDbDocumentMutationPrefixForUser(userId: string): [string] {\n return [userId];\n}\n\n/**\n * Creates a [userId, encodedPath] key for use in the DbDocumentMutations\n * index to iterate over all at document mutations for a given path or lower.\n */\nexport function newDbDocumentMutationPrefixForPath(\n userId: string,\n path: ResourcePath\n): [string, EncodedResourcePath] {\n return [userId, encodeResourcePath(path)];\n}\n\n/**\n * Creates a full index key of [userId, encodedPath, batchId] for inserting\n * and deleting into the DbDocumentMutations index.\n */\nexport function newDbDocumentMutationKey(\n userId: string,\n path: ResourcePath,\n batchId: BatchId\n): DbDocumentMutationKey {\n return [userId, encodeResourcePath(path), batchId];\n}\n\n/**\n * Because we store all the useful information for this store in the key,\n * there is no useful information to store as the value. The raw (unencoded)\n * path cannot be stored because IndexedDb doesn't store prototype\n * information.\n */\nexport const DbDocumentMutationPlaceholder: DbDocumentMutation = {};\n\nexport const DbDocumentMutationStore = 'documentMutations';\n\nexport const DbRemoteDocumentStore = 'remoteDocumentsV14';\n\n/**\n * A key in the 'remoteDocumentsV14' object store is an array containing the\n * collection path, the collection group, the read time and the document id.\n */\nexport type DbRemoteDocumentKey = [\n /** path to collection */ string[],\n /** collection group */ string,\n /** read time */ DbTimestampKey,\n /** document ID */ string\n];\n\n/**\n * The primary key of the remote documents store, which allows for efficient\n * access by collection path and read time.\n */\nexport const DbRemoteDocumentKeyPath = [\n 'prefixPath',\n 'collectionGroup',\n 'readTime',\n 'documentId'\n];\n\n/** An index that provides access to documents by key. */\nexport const DbRemoteDocumentDocumentKeyIndex = 'documentKeyIndex';\n\nexport const DbRemoteDocumentDocumentKeyIndexPath = [\n 'prefixPath',\n 'collectionGroup',\n 'documentId'\n];\n\n/**\n * An index that provides access to documents by collection group and read\n * time.\n *\n * This index is used by the index backfiller.\n */\nexport const DbRemoteDocumentCollectionGroupIndex = 'collectionGroupIndex';\n\nexport const DbRemoteDocumentCollectionGroupIndexPath = [\n 'collectionGroup',\n 'readTime',\n 'prefixPath',\n 'documentId'\n];\n\nexport const DbRemoteDocumentGlobalStore = 'remoteDocumentGlobal';\n\nexport const DbRemoteDocumentGlobalKey = 'remoteDocumentGlobalKey';\n\nexport type DbRemoteDocumentGlobalKey = typeof DbRemoteDocumentGlobalKey;\n\n/**\n * A key in the 'targets' object store is a targetId of the query.\n */\nexport type DbTargetKey = TargetId;\n\nexport const DbTargetStore = 'targets';\n\n/** Keys are automatically assigned via the targetId property. */\nexport const DbTargetKeyPath = 'targetId';\n\n/** The name of the queryTargets index. */\nexport const DbTargetQueryTargetsIndexName = 'queryTargetsIndex';\n\n/**\n * The index of all canonicalIds to the targets that they match. This is not\n * a unique mapping because canonicalId does not promise a unique name for all\n * possible queries, so we append the targetId to make the mapping unique.\n */\nexport const DbTargetQueryTargetsKeyPath = ['canonicalId', 'targetId'];\n\n/**\n * The key for a DbTargetDocument, containing a targetId and an encoded resource\n * path.\n */\nexport type DbTargetDocumentKey = [TargetId, EncodedResourcePath];\n\n/** Name of the IndexedDb object store. */\nexport const DbTargetDocumentStore = 'targetDocuments';\n\n/** Keys are automatically assigned via the targetId, path properties. */\nexport const DbTargetDocumentKeyPath = ['targetId', 'path'];\n\n/** The index name for the reverse index. */\nexport const DbTargetDocumentDocumentTargetsIndex = 'documentTargetsIndex';\n\n/** We also need to create the reverse index for these properties. */\nexport const DbTargetDocumentDocumentTargetsKeyPath = ['path', 'targetId'];\n\n/**\n * The type to represent the single allowed key for the DbTargetGlobal store.\n */\nexport type DbTargetGlobalKey = typeof DbTargetGlobalKey;\n\n/**\n * The key string used for the single object that exists in the\n * DbTargetGlobal store.\n */\nexport const DbTargetGlobalKey = 'targetGlobalKey';\n\nexport const DbTargetGlobalStore = 'targetGlobal';\n\n/**\n * The key for a DbCollectionParent entry, containing the collection ID\n * and the parent path that contains it. Note that the parent path will be an\n * empty path in the case of root-level collections.\n */\nexport type DbCollectionParentKey = [string, EncodedResourcePath];\n\n/** Name of the IndexedDb object store. */\nexport const DbCollectionParentStore = 'collectionParents';\n\n/** Keys are automatically assigned via the collectionId, parent properties. */\nexport const DbCollectionParentKeyPath = ['collectionId', 'parent'];\n\n/** Name of the IndexedDb object store. */\nexport const DbClientMetadataStore = 'clientMetadata';\n\n/** Keys are automatically assigned via the clientId properties. */\nexport const DbClientMetadataKeyPath = 'clientId';\n\n/** Object keys in the 'clientMetadata' store are clientId strings. */\nexport type DbClientMetadataKey = string;\n\nexport type DbBundlesKey = string;\n\n/** Name of the IndexedDb object store. */\nexport const DbBundleStore = 'bundles';\n\nexport const DbBundleKeyPath = 'bundleId';\n\nexport type DbNamedQueriesKey = string;\n\n/** Name of the IndexedDb object store. */\nexport const DbNamedQueryStore = 'namedQueries';\n\nexport const DbNamedQueryKeyPath = 'name';\n\n/** The key for each index consisting of just the index id. */\nexport type DbIndexConfigurationKey = number;\n\n/** Name of the IndexedDb object store. */\nexport const DbIndexConfigurationStore = 'indexConfiguration';\n\nexport const DbIndexConfigurationKeyPath = 'indexId';\n\n/**\n * An index that provides access to the index configurations by collection\n * group.\n *\n * PORTING NOTE: iOS and Android maintain this index in-memory, but this is\n * not possible here as the Web client supports concurrent access to\n * persistence via multi-tab.\n */\nexport const DbIndexConfigurationCollectionGroupIndex = 'collectionGroupIndex';\n\nexport const DbIndexConfigurationCollectionGroupIndexPath = 'collectionGroup';\n\n/** The key for each index state consisting of the index id and its user id. */\nexport type DbIndexStateKey = [number, string];\n\n/** Name of the IndexedDb object store. */\nexport const DbIndexStateStore = 'indexState';\n\nexport const DbIndexStateKeyPath = ['indexId', 'uid'];\n\n/**\n * An index that provides access to documents in a collection sorted by last\n * update time. Used by the backfiller.\n *\n * PORTING NOTE: iOS and Android maintain this index in-memory, but this is\n * not possible here as the Web client supports concurrent access to\n * persistence via multi-tab.\n */\nexport const DbIndexStateSequenceNumberIndex = 'sequenceNumberIndex';\n\nexport const DbIndexStateSequenceNumberIndexPath = ['uid', 'sequenceNumber'];\n\n/**\n * The key for each index entry consists of the index id and its user id,\n * the encoded array and directional value for the indexed fields as well as\n * an ordered and an encoded document path for the indexed document.\n */\nexport type DbIndexEntryKey = [\n number,\n string,\n Uint8Array,\n Uint8Array,\n Uint8Array,\n string[]\n];\n\n/** Name of the IndexedDb object store. */\nexport const DbIndexEntryStore = 'indexEntries';\n\nexport const DbIndexEntryKeyPath = [\n 'indexId',\n 'uid',\n 'arrayValue',\n 'directionalValue',\n 'orderedDocumentKey',\n 'documentKey'\n];\n\nexport const DbIndexEntryDocumentKeyIndex = 'documentKeyIndex';\n\nexport const DbIndexEntryDocumentKeyIndexPath = [\n 'indexId',\n 'uid',\n 'orderedDocumentKey'\n];\n\nexport type DbDocumentOverlayKey = [\n /* userId */ string,\n /* collectionPath */ string,\n /* documentId */ string\n];\n\n/** Name of the IndexedDb object store. */\nexport const DbDocumentOverlayStore = 'documentOverlays';\n\nexport const DbDocumentOverlayKeyPath = [\n 'userId',\n 'collectionPath',\n 'documentId'\n];\n\nexport const DbDocumentOverlayCollectionPathOverlayIndex =\n 'collectionPathOverlayIndex';\n\nexport const DbDocumentOverlayCollectionPathOverlayIndexPath = [\n 'userId',\n 'collectionPath',\n 'largestBatchId'\n];\n\nexport const DbDocumentOverlayCollectionGroupOverlayIndex =\n 'collectionGroupOverlayIndex';\n\nexport const DbDocumentOverlayCollectionGroupOverlayIndexPath = [\n 'userId',\n 'collectionGroup',\n 'largestBatchId'\n];\n\n/** Name of the IndexedDb object store. */\nexport const DbGlobalsStore = 'globals';\n\nexport const DbGlobalsKeyPath = 'name';\n\n/** Names of global values */\nexport type DbGlobalsKey = 'sessionToken';\n\n// Visible for testing\nexport const V1_STORES = [\n DbMutationQueueStore,\n DbMutationBatchStore,\n DbDocumentMutationStore,\n DbRemoteDocumentStoreLegacy,\n DbTargetStore,\n DbPrimaryClientStore,\n DbTargetGlobalStore,\n DbTargetDocumentStore\n];\n\n// Visible for testing\nexport const V3_STORES = V1_STORES;\n// Note: DbRemoteDocumentChanges is no longer used and dropped with v9.\nexport const V4_STORES = [...V3_STORES, DbClientMetadataStore];\nexport const V6_STORES = [...V4_STORES, DbRemoteDocumentGlobalStore];\nexport const V8_STORES = [...V6_STORES, DbCollectionParentStore];\nexport const V11_STORES = [...V8_STORES, DbBundleStore, DbNamedQueryStore];\nexport const V12_STORES = [...V11_STORES, DbDocumentOverlayStore];\nexport const V13_STORES = [\n DbMutationQueueStore,\n DbMutationBatchStore,\n DbDocumentMutationStore,\n DbRemoteDocumentStore,\n DbTargetStore,\n DbPrimaryClientStore,\n DbTargetGlobalStore,\n DbTargetDocumentStore,\n DbClientMetadataStore,\n DbRemoteDocumentGlobalStore,\n DbCollectionParentStore,\n DbBundleStore,\n DbNamedQueryStore,\n DbDocumentOverlayStore\n];\nexport const V14_STORES = V13_STORES;\nexport const V15_STORES = [\n ...V14_STORES,\n DbIndexConfigurationStore,\n DbIndexStateStore,\n DbIndexEntryStore\n];\nexport const V16_STORES = V15_STORES;\nexport const V17_STORES = [...V15_STORES, DbGlobalsStore];\n\n/**\n * The list of all default IndexedDB stores used throughout the SDK. This is\n * used when creating transactions so that access across all stores is done\n * atomically.\n */\nexport const ALL_STORES = V12_STORES;\n\n/** Returns the object stores for the provided schema. */\nexport function getObjectStores(schemaVersion: number): string[] {\n if (schemaVersion === 17) {\n return V17_STORES;\n } else if (schemaVersion === 16) {\n return V16_STORES;\n } else if (schemaVersion === 15) {\n return V15_STORES;\n } else if (schemaVersion === 14) {\n return V14_STORES;\n } else if (schemaVersion === 13) {\n return V13_STORES;\n } else if (schemaVersion === 12) {\n return V12_STORES;\n } else if (schemaVersion === 11) {\n return V11_STORES;\n } else {\n fail('Only schema version 11 and 12 and 13 are supported');\n }\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Document as ProtoDocument } from '../protos/firestore_proto_api';\n\nimport { DbNoDocument, DbUnknownDocument } from './indexeddb_schema';\nimport { DbTimestampKey } from './indexeddb_sentinels';\n\n// This file contains older schema definitions for object stores that were\n// migrated to newer schema versions. These object stores should only be used\n// during schema migrations.\n\nexport interface DbRemoteDocument {\n unknownDocument?: DbUnknownDocument;\n noDocument?: DbNoDocument;\n document?: ProtoDocument;\n hasCommittedMutations?: boolean;\n readTime?: DbTimestampKey;\n parentPath?: string[];\n}\n\nexport type DbRemoteDocumentKey = string[];\nexport const DbRemoteDocumentStore = 'remoteDocuments';\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from './assert';\n\nexport interface Dict {\n [stringKey: string]: V;\n}\n\nexport function objectSize(obj: object): number {\n let count = 0;\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n count++;\n }\n }\n return count;\n}\n\nexport function forEach(\n obj: Dict | undefined,\n fn: (key: string, val: V) => void\n): void {\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n fn(key, obj[key]);\n }\n }\n}\n\nexport function mapToArray(\n obj: Dict,\n fn: (element: V, key: string, obj: Dict) => R\n): R[] {\n const result: R[] = [];\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n result.push(fn(obj[key], key, obj));\n }\n }\n return result;\n}\n\nexport function isEmpty(obj: Dict): boolean {\n debugAssert(\n obj != null && typeof obj === 'object',\n 'isEmpty() expects object parameter.'\n );\n for (const key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) {\n return false;\n }\n }\n return true;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, fail } from './assert';\n\n/*\n * Implementation of an immutable SortedMap using a Left-leaning\n * Red-Black Tree, adapted from the implementation in Mugs\n * (http://mads379.github.com/mugs/) by Mads Hartmann Jensen\n * (mads379@gmail.com).\n *\n * Original paper on Left-leaning Red-Black Trees:\n * http://www.cs.princeton.edu/~rs/talks/LLRB/LLRB.pdf\n *\n * Invariant 1: No red node has a red child\n * Invariant 2: Every leaf path has the same number of black nodes\n * Invariant 3: Only the left child can be red (left leaning)\n */\n\nexport type Comparator = (key1: K, key2: K) => number;\n\nexport interface Entry {\n key: K;\n value: V;\n}\n\n// An immutable sorted map implementation, based on a Left-leaning Red-Black\n// tree.\nexport class SortedMap {\n // visible for testing\n root: LLRBNode | LLRBEmptyNode;\n\n constructor(\n public comparator: Comparator,\n root?: LLRBNode | LLRBEmptyNode\n ) {\n this.root = root ? root : LLRBNode.EMPTY;\n }\n\n // Returns a copy of the map, with the specified key/value added or replaced.\n insert(key: K, value: V): SortedMap {\n return new SortedMap(\n this.comparator,\n this.root\n .insert(key, value, this.comparator)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n // Returns a copy of the map, with the specified key removed.\n remove(key: K): SortedMap {\n return new SortedMap(\n this.comparator,\n this.root\n .remove(key, this.comparator)\n .copy(null, null, LLRBNode.BLACK, null, null)\n );\n }\n\n // Returns the value of the node with the given key, or null.\n get(key: K): V | null {\n let node = this.root;\n while (!node.isEmpty()) {\n const cmp = this.comparator(key, node.key);\n if (cmp === 0) {\n return node.value;\n } else if (cmp < 0) {\n node = node.left;\n } else if (cmp > 0) {\n node = node.right;\n }\n }\n return null;\n }\n\n // Returns the index of the element in this sorted map, or -1 if it doesn't\n // exist.\n indexOf(key: K): number {\n // Number of nodes that were pruned when descending right\n let prunedNodes = 0;\n let node = this.root;\n while (!node.isEmpty()) {\n const cmp = this.comparator(key, node.key);\n if (cmp === 0) {\n return prunedNodes + node.left.size;\n } else if (cmp < 0) {\n node = node.left;\n } else {\n // Count all nodes left of the node plus the node itself\n prunedNodes += node.left.size + 1;\n node = node.right;\n }\n }\n // Node not found\n return -1;\n }\n\n isEmpty(): boolean {\n return this.root.isEmpty();\n }\n\n // Returns the total number of nodes in the map.\n get size(): number {\n return this.root.size;\n }\n\n // Returns the minimum key in the map.\n minKey(): K | null {\n return this.root.minKey();\n }\n\n // Returns the maximum key in the map.\n maxKey(): K | null {\n return this.root.maxKey();\n }\n\n // Traverses the map in key order and calls the specified action function\n // for each key/value pair. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(action: (k: K, v: V) => T): T {\n return (this.root as LLRBNode).inorderTraversal(action);\n }\n\n forEach(fn: (k: K, v: V) => void): void {\n this.inorderTraversal((k, v) => {\n fn(k, v);\n return false;\n });\n }\n\n toString(): string {\n const descriptions: string[] = [];\n this.inorderTraversal((k, v) => {\n descriptions.push(`${k}:${v}`);\n return false;\n });\n return `{${descriptions.join(', ')}}`;\n }\n\n // Traverses the map in reverse key order and calls the specified action\n // function for each key/value pair. If action returns true, traversal is\n // aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(action: (k: K, v: V) => T): T {\n return (this.root as LLRBNode).reverseTraversal(action);\n }\n\n // Returns an iterator over the SortedMap.\n getIterator(): SortedMapIterator {\n return new SortedMapIterator(this.root, null, this.comparator, false);\n }\n\n getIteratorFrom(key: K): SortedMapIterator {\n return new SortedMapIterator(this.root, key, this.comparator, false);\n }\n\n getReverseIterator(): SortedMapIterator {\n return new SortedMapIterator(this.root, null, this.comparator, true);\n }\n\n getReverseIteratorFrom(key: K): SortedMapIterator {\n return new SortedMapIterator(this.root, key, this.comparator, true);\n }\n} // end SortedMap\n\n// An iterator over an LLRBNode.\nexport class SortedMapIterator {\n private isReverse: boolean;\n private nodeStack: Array | LLRBEmptyNode>;\n\n constructor(\n node: LLRBNode | LLRBEmptyNode,\n startKey: K | null,\n comparator: Comparator,\n isReverse: boolean\n ) {\n this.isReverse = isReverse;\n this.nodeStack = [];\n\n let cmp = 1;\n while (!node.isEmpty()) {\n cmp = startKey ? comparator(node.key, startKey) : 1;\n // flip the comparison if we're going in reverse\n if (startKey && isReverse) {\n cmp *= -1;\n }\n\n if (cmp < 0) {\n // This node is less than our start key. ignore it\n if (this.isReverse) {\n node = node.left;\n } else {\n node = node.right;\n }\n } else if (cmp === 0) {\n // This node is exactly equal to our start key. Push it on the stack,\n // but stop iterating;\n this.nodeStack.push(node);\n break;\n } else {\n // This node is greater than our start key, add it to the stack and move\n // to the next one\n this.nodeStack.push(node);\n if (this.isReverse) {\n node = node.right;\n } else {\n node = node.left;\n }\n }\n }\n }\n\n getNext(): Entry {\n debugAssert(\n this.nodeStack.length > 0,\n 'getNext() called on iterator when hasNext() is false.'\n );\n\n let node = this.nodeStack.pop()!;\n const result = { key: node.key, value: node.value };\n\n if (this.isReverse) {\n node = node.left;\n while (!node.isEmpty()) {\n this.nodeStack.push(node);\n node = node.right;\n }\n } else {\n node = node.right;\n while (!node.isEmpty()) {\n this.nodeStack.push(node);\n node = node.left;\n }\n }\n\n return result;\n }\n\n hasNext(): boolean {\n return this.nodeStack.length > 0;\n }\n\n peek(): Entry | null {\n if (this.nodeStack.length === 0) {\n return null;\n }\n\n const node = this.nodeStack[this.nodeStack.length - 1];\n return { key: node.key, value: node.value };\n }\n} // end SortedMapIterator\n\n// Represents a node in a Left-leaning Red-Black tree.\nexport class LLRBNode {\n readonly color: boolean;\n readonly left: LLRBNode | LLRBEmptyNode;\n readonly right: LLRBNode | LLRBEmptyNode;\n readonly size: number;\n\n // Empty node is shared between all LLRB trees.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static EMPTY: LLRBEmptyNode = null as any;\n\n static RED = true;\n static BLACK = false;\n\n constructor(\n public key: K,\n public value: V,\n color?: boolean,\n left?: LLRBNode | LLRBEmptyNode,\n right?: LLRBNode | LLRBEmptyNode\n ) {\n this.color = color != null ? color : LLRBNode.RED;\n this.left = left != null ? left : LLRBNode.EMPTY;\n this.right = right != null ? right : LLRBNode.EMPTY;\n this.size = this.left.size + 1 + this.right.size;\n }\n\n // Returns a copy of the current node, optionally replacing pieces of it.\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBNode {\n return new LLRBNode(\n key != null ? key : this.key,\n value != null ? value : this.value,\n color != null ? color : this.color,\n left != null ? left : this.left,\n right != null ? right : this.right\n );\n }\n\n isEmpty(): boolean {\n return false;\n }\n\n // Traverses the tree in key order and calls the specified action function\n // for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n inorderTraversal(action: (k: K, v: V) => T): T {\n return (\n (this.left as LLRBNode).inorderTraversal(action) ||\n action(this.key, this.value) ||\n (this.right as LLRBNode).inorderTraversal(action)\n );\n }\n\n // Traverses the tree in reverse key order and calls the specified action\n // function for each node. If action returns true, traversal is aborted.\n // Returns the first truthy value returned by action, or the last falsey\n // value returned by action.\n reverseTraversal(action: (k: K, v: V) => T): T {\n return (\n (this.right as LLRBNode).reverseTraversal(action) ||\n action(this.key, this.value) ||\n (this.left as LLRBNode).reverseTraversal(action)\n );\n }\n\n // Returns the minimum node in the tree.\n private min(): LLRBNode {\n if (this.left.isEmpty()) {\n return this;\n } else {\n return (this.left as LLRBNode).min();\n }\n }\n\n // Returns the maximum key in the tree.\n minKey(): K | null {\n return this.min().key;\n }\n\n // Returns the maximum key in the tree.\n maxKey(): K | null {\n if (this.right.isEmpty()) {\n return this.key;\n } else {\n return this.right.maxKey();\n }\n }\n\n // Returns new tree, with the key/value added.\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\n let n: LLRBNode = this;\n const cmp = comparator(key, n.key);\n if (cmp < 0) {\n n = n.copy(null, null, null, n.left.insert(key, value, comparator), null);\n } else if (cmp === 0) {\n n = n.copy(null, value, null, null, null);\n } else {\n n = n.copy(\n null,\n null,\n null,\n null,\n n.right.insert(key, value, comparator)\n );\n }\n return n.fixUp();\n }\n\n private removeMin(): LLRBNode | LLRBEmptyNode {\n if (this.left.isEmpty()) {\n return LLRBNode.EMPTY;\n }\n let n: LLRBNode = this;\n if (!n.left.isRed() && !n.left.left.isRed()) {\n n = n.moveRedLeft();\n }\n n = n.copy(null, null, null, (n.left as LLRBNode).removeMin(), null);\n return n.fixUp();\n }\n\n // Returns new tree, with the specified item removed.\n remove(\n key: K,\n comparator: Comparator\n ): LLRBNode | LLRBEmptyNode {\n let smallest: LLRBNode;\n let n: LLRBNode = this;\n if (comparator(key, n.key) < 0) {\n if (!n.left.isEmpty() && !n.left.isRed() && !n.left.left.isRed()) {\n n = n.moveRedLeft();\n }\n n = n.copy(null, null, null, n.left.remove(key, comparator), null);\n } else {\n if (n.left.isRed()) {\n n = n.rotateRight();\n }\n if (!n.right.isEmpty() && !n.right.isRed() && !n.right.left.isRed()) {\n n = n.moveRedRight();\n }\n if (comparator(key, n.key) === 0) {\n if (n.right.isEmpty()) {\n return LLRBNode.EMPTY;\n } else {\n smallest = (n.right as LLRBNode).min();\n n = n.copy(\n smallest.key,\n smallest.value,\n null,\n null,\n (n.right as LLRBNode).removeMin()\n );\n }\n }\n n = n.copy(null, null, null, null, n.right.remove(key, comparator));\n }\n return n.fixUp();\n }\n\n isRed(): boolean {\n return this.color;\n }\n\n // Returns new tree after performing any needed rotations.\n private fixUp(): LLRBNode {\n let n: LLRBNode = this;\n if (n.right.isRed() && !n.left.isRed()) {\n n = n.rotateLeft();\n }\n if (n.left.isRed() && n.left.left.isRed()) {\n n = n.rotateRight();\n }\n if (n.left.isRed() && n.right.isRed()) {\n n = n.colorFlip();\n }\n return n;\n }\n\n private moveRedLeft(): LLRBNode {\n let n = this.colorFlip();\n if (n.right.left.isRed()) {\n n = n.copy(\n null,\n null,\n null,\n null,\n (n.right as LLRBNode).rotateRight()\n );\n n = n.rotateLeft();\n n = n.colorFlip();\n }\n return n;\n }\n\n private moveRedRight(): LLRBNode {\n let n = this.colorFlip();\n if (n.left.left.isRed()) {\n n = n.rotateRight();\n n = n.colorFlip();\n }\n return n;\n }\n\n private rotateLeft(): LLRBNode {\n const nl = this.copy(null, null, LLRBNode.RED, null, this.right.left);\n return (this.right as LLRBNode).copy(\n null,\n null,\n this.color,\n nl,\n null\n );\n }\n\n private rotateRight(): LLRBNode {\n const nr = this.copy(null, null, LLRBNode.RED, this.left.right, null);\n return (this.left as LLRBNode).copy(null, null, this.color, null, nr);\n }\n\n private colorFlip(): LLRBNode {\n const left = this.left.copy(null, null, !this.left.color, null, null);\n const right = this.right.copy(null, null, !this.right.color, null, null);\n return this.copy(null, null, !this.color, left, right);\n }\n\n // For testing.\n checkMaxDepth(): boolean {\n const blackDepth = this.check();\n if (Math.pow(2.0, blackDepth) <= this.size + 1) {\n return true;\n } else {\n return false;\n }\n }\n\n // In a balanced RB tree, the black-depth (number of black nodes) from root to\n // leaves is equal on both sides. This function verifies that or asserts.\n protected check(): number {\n if (this.isRed() && this.left.isRed()) {\n throw fail('Red node has red child(' + this.key + ',' + this.value + ')');\n }\n if (this.right.isRed()) {\n throw fail('Right child of (' + this.key + ',' + this.value + ') is red');\n }\n const blackDepth = (this.left as LLRBNode).check();\n if (blackDepth !== (this.right as LLRBNode).check()) {\n throw fail('Black depths differ');\n } else {\n return blackDepth + (this.isRed() ? 0 : 1);\n }\n }\n} // end LLRBNode\n\n// Represents an empty node (a leaf node in the Red-Black Tree).\nexport class LLRBEmptyNode {\n get key(): never {\n throw fail('LLRBEmptyNode has no key.');\n }\n get value(): never {\n throw fail('LLRBEmptyNode has no value.');\n }\n get color(): never {\n throw fail('LLRBEmptyNode has no color.');\n }\n get left(): never {\n throw fail('LLRBEmptyNode has no left child.');\n }\n get right(): never {\n throw fail('LLRBEmptyNode has no right child.');\n }\n size = 0;\n\n // Returns a copy of the current node.\n copy(\n key: K | null,\n value: V | null,\n color: boolean | null,\n left: LLRBNode | LLRBEmptyNode | null,\n right: LLRBNode | LLRBEmptyNode | null\n ): LLRBEmptyNode {\n return this;\n }\n\n // Returns a copy of the tree, with the specified key/value added.\n insert(key: K, value: V, comparator: Comparator): LLRBNode {\n return new LLRBNode(key, value);\n }\n\n // Returns a copy of the tree, with the specified key removed.\n remove(key: K, comparator: Comparator): LLRBEmptyNode {\n return this;\n }\n\n isEmpty(): boolean {\n return true;\n }\n\n inorderTraversal(action: (k: K, v: V) => boolean): boolean {\n return false;\n }\n\n reverseTraversal(action: (k: K, v: V) => boolean): boolean {\n return false;\n }\n\n minKey(): K | null {\n return null;\n }\n\n maxKey(): K | null {\n return null;\n }\n\n isRed(): boolean {\n return false;\n }\n\n // For testing.\n checkMaxDepth(): boolean {\n return true;\n }\n\n protected check(): 0 {\n return 0;\n }\n} // end LLRBEmptyNode\n\nLLRBNode.EMPTY = new LLRBEmptyNode();\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SortedMap, SortedMapIterator } from './sorted_map';\n\n/**\n * SortedSet is an immutable (copy-on-write) collection that holds elements\n * in order specified by the provided comparator.\n *\n * NOTE: if provided comparator returns 0 for two elements, we consider them to\n * be equal!\n */\nexport class SortedSet {\n private data: SortedMap;\n\n constructor(private comparator: (left: T, right: T) => number) {\n this.data = new SortedMap(this.comparator);\n }\n\n has(elem: T): boolean {\n return this.data.get(elem) !== null;\n }\n\n first(): T | null {\n return this.data.minKey();\n }\n\n last(): T | null {\n return this.data.maxKey();\n }\n\n get size(): number {\n return this.data.size;\n }\n\n indexOf(elem: T): number {\n return this.data.indexOf(elem);\n }\n\n /** Iterates elements in order defined by \"comparator\" */\n forEach(cb: (elem: T) => void): void {\n this.data.inorderTraversal((k: T, v: boolean) => {\n cb(k);\n return false;\n });\n }\n\n /** Iterates over `elem`s such that: range[0] <= elem < range[1]. */\n forEachInRange(range: [T, T], cb: (elem: T) => void): void {\n const iter = this.data.getIteratorFrom(range[0]);\n while (iter.hasNext()) {\n const elem = iter.getNext();\n if (this.comparator(elem.key, range[1]) >= 0) {\n return;\n }\n cb(elem.key);\n }\n }\n\n /**\n * Iterates over `elem`s such that: start <= elem until false is returned.\n */\n forEachWhile(cb: (elem: T) => boolean, start?: T): void {\n let iter: SortedMapIterator;\n if (start !== undefined) {\n iter = this.data.getIteratorFrom(start);\n } else {\n iter = this.data.getIterator();\n }\n while (iter.hasNext()) {\n const elem = iter.getNext();\n const result = cb(elem.key);\n if (!result) {\n return;\n }\n }\n }\n\n /** Finds the least element greater than or equal to `elem`. */\n firstAfterOrEqual(elem: T): T | null {\n const iter = this.data.getIteratorFrom(elem);\n return iter.hasNext() ? iter.getNext().key : null;\n }\n\n getIterator(): SortedSetIterator {\n return new SortedSetIterator(this.data.getIterator());\n }\n\n getIteratorFrom(key: T): SortedSetIterator {\n return new SortedSetIterator(this.data.getIteratorFrom(key));\n }\n\n /** Inserts or updates an element */\n add(elem: T): SortedSet {\n return this.copy(this.data.remove(elem).insert(elem, true));\n }\n\n /** Deletes an element */\n delete(elem: T): SortedSet {\n if (!this.has(elem)) {\n return this;\n }\n return this.copy(this.data.remove(elem));\n }\n\n isEmpty(): boolean {\n return this.data.isEmpty();\n }\n\n unionWith(other: SortedSet): SortedSet {\n let result: SortedSet = this;\n\n // Make sure `result` always refers to the larger one of the two sets.\n if (result.size < other.size) {\n result = other;\n other = this;\n }\n\n other.forEach(elem => {\n result = result.add(elem);\n });\n return result;\n }\n\n isEqual(other: SortedSet): boolean {\n if (!(other instanceof SortedSet)) {\n return false;\n }\n if (this.size !== other.size) {\n return false;\n }\n\n const thisIt = this.data.getIterator();\n const otherIt = other.data.getIterator();\n while (thisIt.hasNext()) {\n const thisElem = thisIt.getNext().key;\n const otherElem = otherIt.getNext().key;\n if (this.comparator(thisElem, otherElem) !== 0) {\n return false;\n }\n }\n return true;\n }\n\n toArray(): T[] {\n const res: T[] = [];\n this.forEach(targetId => {\n res.push(targetId);\n });\n return res;\n }\n\n toString(): string {\n const result: T[] = [];\n this.forEach(elem => result.push(elem));\n return 'SortedSet(' + result.toString() + ')';\n }\n\n private copy(data: SortedMap): SortedSet {\n const result = new SortedSet(this.comparator);\n result.data = data;\n return result;\n }\n}\n\nexport class SortedSetIterator {\n constructor(private iter: SortedMapIterator) {}\n\n getNext(): T {\n return this.iter.getNext().key;\n }\n\n hasNext(): boolean {\n return this.iter.hasNext();\n }\n}\n\n/**\n * Compares two sorted sets for equality using their natural ordering. The\n * method computes the intersection and invokes `onAdd` for every element that\n * is in `after` but not `before`. `onRemove` is invoked for every element in\n * `before` but missing from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original set.\n * @param after - The elements to diff against the original set.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\nexport function diffSortedSets(\n before: SortedSet,\n after: SortedSet,\n comparator: (l: T, r: T) => number,\n onAdd: (entry: T) => void,\n onRemove: (entry: T) => void\n): void {\n const beforeIt = before.getIterator();\n const afterIt = after.getIterator();\n\n let beforeValue = advanceIterator(beforeIt);\n let afterValue = advanceIterator(afterIt);\n\n // Walk through the two sets at the same time, using the ordering defined by\n // `comparator`.\n while (beforeValue || afterValue) {\n let added = false;\n let removed = false;\n\n if (beforeValue && afterValue) {\n const cmp = comparator(beforeValue, afterValue);\n if (cmp < 0) {\n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n removed = true;\n } else if (cmp > 0) {\n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n added = true;\n }\n } else if (beforeValue != null) {\n removed = true;\n } else {\n added = true;\n }\n\n if (added) {\n onAdd(afterValue!);\n afterValue = advanceIterator(afterIt);\n } else if (removed) {\n onRemove(beforeValue!);\n beforeValue = advanceIterator(beforeIt);\n } else {\n beforeValue = advanceIterator(beforeIt);\n afterValue = advanceIterator(afterIt);\n }\n }\n}\n\n/**\n * Returns the next element from the iterator or `undefined` if none available.\n */\nfunction advanceIterator(it: SortedSetIterator): T | undefined {\n return it.hasNext() ? it.getNext() : undefined;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { FieldPath } from './path';\n\n/**\n * Provides a set of fields that can be used to partially patch a document.\n * FieldMask is used in conjunction with ObjectValue.\n * Examples:\n * foo - Overwrites foo entirely with the provided value. If foo is not\n * present in the companion ObjectValue, the field is deleted.\n * foo.bar - Overwrites only the field bar of the object foo.\n * If foo is not an object, foo is replaced with an object\n * containing foo\n */\nexport class FieldMask {\n constructor(readonly fields: FieldPath[]) {\n // TODO(dimond): validation of FieldMask\n // Sort the field mask to support `FieldMask.isEqual()` and assert below.\n fields.sort(FieldPath.comparator);\n debugAssert(\n !fields.some((v, i) => i !== 0 && v.isEqual(fields[i - 1])),\n 'FieldMask contains field that is not unique: ' +\n fields.find((v, i) => i !== 0 && v.isEqual(fields[i - 1]))!\n );\n }\n\n static empty(): FieldMask {\n return new FieldMask([]);\n }\n\n /**\n * Returns a new FieldMask object that is the result of adding all the given\n * fields paths to this field mask.\n */\n unionWith(extraFields: FieldPath[]): FieldMask {\n let mergedMaskSet = new SortedSet(FieldPath.comparator);\n for (const fieldPath of this.fields) {\n mergedMaskSet = mergedMaskSet.add(fieldPath);\n }\n for (const fieldPath of extraFields) {\n mergedMaskSet = mergedMaskSet.add(fieldPath);\n }\n return new FieldMask(mergedMaskSet.toArray());\n }\n\n /**\n * Verifies that `fieldPath` is included by at least one field in this field\n * mask.\n *\n * This is an O(n) operation, where `n` is the size of the field mask.\n */\n covers(fieldPath: FieldPath): boolean {\n for (const fieldMaskPath of this.fields) {\n if (fieldMaskPath.isPrefixOf(fieldPath)) {\n return true;\n }\n }\n return false;\n }\n\n isEqual(other: FieldMask): boolean {\n return arrayEquals(this.fields, other.fields, (l, r) => l.isEqual(r));\n }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * An error encountered while decoding base64 string.\n */\nexport class Base64DecodeError extends Error {\n readonly name = 'Base64DecodeError';\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { decodeBase64, encodeBase64 } from '../platform/base64';\n\nimport { primitiveComparator } from './misc';\n\n/**\n * Immutable class that represents a \"proto\" byte string.\n *\n * Proto byte strings can either be Base64-encoded strings or Uint8Arrays when\n * sent on the wire. This class abstracts away this differentiation by holding\n * the proto byte string in a common class that must be converted into a string\n * before being sent as a proto.\n * @internal\n */\nexport class ByteString {\n static readonly EMPTY_BYTE_STRING = new ByteString('');\n\n private constructor(private readonly binaryString: string) {}\n\n static fromBase64String(base64: string): ByteString {\n const binaryString = decodeBase64(base64);\n return new ByteString(binaryString);\n }\n\n static fromUint8Array(array: Uint8Array): ByteString {\n // TODO(indexing); Remove the copy of the byte string here as this method\n // is frequently called during indexing.\n const binaryString = binaryStringFromUint8Array(array);\n return new ByteString(binaryString);\n }\n\n [Symbol.iterator](): Iterator {\n let i = 0;\n return {\n next: () => {\n if (i < this.binaryString.length) {\n return { value: this.binaryString.charCodeAt(i++), done: false };\n } else {\n return { value: undefined, done: true };\n }\n }\n };\n }\n\n toBase64(): string {\n return encodeBase64(this.binaryString);\n }\n\n toUint8Array(): Uint8Array {\n return uint8ArrayFromBinaryString(this.binaryString);\n }\n\n approximateByteSize(): number {\n return this.binaryString.length * 2;\n }\n\n compareTo(other: ByteString): number {\n return primitiveComparator(this.binaryString, other.binaryString);\n }\n\n isEqual(other: ByteString): boolean {\n return this.binaryString === other.binaryString;\n }\n}\n\n/**\n * Helper function to convert an Uint8array to a binary string.\n */\nexport function binaryStringFromUint8Array(array: Uint8Array): string {\n let binaryString = '';\n for (let i = 0; i < array.length; ++i) {\n binaryString += String.fromCharCode(array[i]);\n }\n return binaryString;\n}\n\n/**\n * Helper function to convert a binary string to an Uint8Array.\n */\nexport function uint8ArrayFromBinaryString(binaryString: string): Uint8Array {\n const buffer = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n buffer[i] = binaryString.charCodeAt(i);\n }\n return buffer;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Base64DecodeError } from '../../util/base64_decode_error';\n\n/** Converts a Base64 encoded string to a binary string. */\nexport function decodeBase64(encoded: string): string {\n try {\n return atob(encoded);\n } catch (e) {\n // Check that `DOMException` is defined before using it to avoid\n // \"ReferenceError: Property 'DOMException' doesn't exist\" in react-native.\n // (https://github.com/firebase/firebase-js-sdk/issues/7115)\n if (typeof DOMException !== 'undefined' && e instanceof DOMException) {\n throw new Base64DecodeError('Invalid base64 string: ' + e);\n } else {\n throw e;\n }\n }\n}\n\n/** Converts a binary string to a Base64 encoded string. */\nexport function encodeBase64(raw: string): string {\n return btoa(raw);\n}\n\n/** True if and only if the Base64 conversion functions are available. */\nexport function isBase64Available(): boolean {\n return typeof atob !== 'undefined';\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../protos/firestore_proto_api';\nimport { hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\n\n// A RegExp matching ISO 8601 UTC timestamps with optional fraction.\nconst ISO_TIMESTAMP_REG_EXP = new RegExp(\n /^\\d{4}-\\d\\d-\\d\\dT\\d\\d:\\d\\d:\\d\\d(?:\\.(\\d+))?Z$/\n);\n\n/**\n * Converts the possible Proto values for a timestamp value into a \"seconds and\n * nanos\" representation.\n */\nexport function normalizeTimestamp(date: Timestamp): {\n seconds: number;\n nanos: number;\n} {\n hardAssert(!!date, 'Cannot normalize null or undefined timestamp.');\n\n // The json interface (for the browser) will return an iso timestamp string,\n // while the proto js library (for node) will return a\n // google.protobuf.Timestamp instance.\n if (typeof date === 'string') {\n // The date string can have higher precision (nanos) than the Date class\n // (millis), so we do some custom parsing here.\n\n // Parse the nanos right out of the string.\n let nanos = 0;\n const fraction = ISO_TIMESTAMP_REG_EXP.exec(date);\n hardAssert(!!fraction, 'invalid timestamp: ' + date);\n if (fraction[1]) {\n // Pad the fraction out to 9 digits (nanos).\n let nanoStr = fraction[1];\n nanoStr = (nanoStr + '000000000').substr(0, 9);\n nanos = Number(nanoStr);\n }\n\n // Parse the date to get the seconds.\n const parsedDate = new Date(date);\n const seconds = Math.floor(parsedDate.getTime() / 1000);\n\n return { seconds, nanos };\n } else {\n // TODO(b/37282237): Use strings for Proto3 timestamps\n // assert(!this.options.useProto3Json,\n // 'The timestamp instance format requires Proto JS.');\n const seconds = normalizeNumber(date.seconds);\n const nanos = normalizeNumber(date.nanos);\n return { seconds, nanos };\n }\n}\n\n/**\n * Converts the possible Proto types for numbers into a JavaScript number.\n * Returns 0 if the value is not numeric.\n */\nexport function normalizeNumber(value: number | string | undefined): number {\n // TODO(bjornick): Handle int64 greater than 53 bits.\n if (typeof value === 'number') {\n return value;\n } else if (typeof value === 'string') {\n return Number(value);\n } else {\n return 0;\n }\n}\n\n/** Converts the possible Proto types for Blobs into a ByteString. */\nexport function normalizeByteString(blob: string | Uint8Array): ByteString {\n if (typeof blob === 'string') {\n return ByteString.fromBase64String(blob);\n } else {\n return ByteString.fromUint8Array(blob);\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite-api/timestamp';\nimport {\n Value as ProtoValue,\n MapValue as ProtoMapValue\n} from '../protos/firestore_proto_api';\n\nimport { normalizeTimestamp } from './normalize';\n\n/**\n * Represents a locally-applied ServerTimestamp.\n *\n * Server Timestamps are backed by MapValues that contain an internal field\n * `__type__` with a value of `server_timestamp`. The previous value and local\n * write time are stored in its `__previous_value__` and `__local_write_time__`\n * fields respectively.\n *\n * Notes:\n * - ServerTimestampValue instances are created as the result of applying a\n * transform. They can only exist in the local view of a document. Therefore\n * they do not need to be parsed or serialized.\n * - When evaluated locally (e.g. for snapshot.data()), they by default\n * evaluate to `null`. This behavior can be configured by passing custom\n * FieldValueOptions to value().\n * - With respect to other ServerTimestampValues, they sort by their\n * localWriteTime.\n */\n\nconst SERVER_TIMESTAMP_SENTINEL = 'server_timestamp';\nconst TYPE_KEY = '__type__';\nconst PREVIOUS_VALUE_KEY = '__previous_value__';\nconst LOCAL_WRITE_TIME_KEY = '__local_write_time__';\n\nexport function isServerTimestamp(value: ProtoValue | null): boolean {\n const type = (value?.mapValue?.fields || {})[TYPE_KEY]?.stringValue;\n return type === SERVER_TIMESTAMP_SENTINEL;\n}\n\n/**\n * Creates a new ServerTimestamp proto value (using the internal format).\n */\nexport function serverTimestamp(\n localWriteTime: Timestamp,\n previousValue: ProtoValue | null\n): ProtoValue {\n const mapValue: ProtoMapValue = {\n fields: {\n [TYPE_KEY]: {\n stringValue: SERVER_TIMESTAMP_SENTINEL\n },\n [LOCAL_WRITE_TIME_KEY]: {\n timestampValue: {\n seconds: localWriteTime.seconds,\n nanos: localWriteTime.nanoseconds\n }\n }\n }\n };\n\n // We should avoid storing deeply nested server timestamp map values\n // because we never use the intermediate \"previous values\".\n // For example:\n // previous: 42L, add: t1, result: t1 -> 42L\n // previous: t1, add: t2, result: t2 -> 42L (NOT t2 -> t1 -> 42L)\n // previous: t2, add: t3, result: t3 -> 42L (NOT t3 -> t2 -> t1 -> 42L)\n // `getPreviousValue` recursively traverses server timestamps to find the\n // least recent Value.\n if (previousValue && isServerTimestamp(previousValue)) {\n previousValue = getPreviousValue(previousValue);\n }\n if (previousValue) {\n mapValue.fields![PREVIOUS_VALUE_KEY] = previousValue;\n }\n\n return { mapValue };\n}\n\n/**\n * Returns the value of the field before this ServerTimestamp was set.\n *\n * Preserving the previous values allows the user to display the last resoled\n * value until the backend responds with the timestamp.\n */\nexport function getPreviousValue(value: ProtoValue): ProtoValue | null {\n const previousValue = value.mapValue!.fields![PREVIOUS_VALUE_KEY];\n\n if (isServerTimestamp(previousValue)) {\n return getPreviousValue(previousValue);\n }\n return previousValue;\n}\n\n/**\n * Returns the local time at which this timestamp was first set.\n */\nexport function getLocalWriteTime(value: ProtoValue): Timestamp {\n const localWriteTime = normalizeTimestamp(\n value.mapValue!.fields![LOCAL_WRITE_TIME_KEY].timestampValue!\n );\n return new Timestamp(localWriteTime.seconds, localWriteTime.nanos);\n}\n","import { FirebaseApp } from '@firebase/app';\n\nimport { ExperimentalLongPollingOptions } from '../api/long_polling_options';\nimport { Code, FirestoreError } from '../util/error';\n\n/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nexport class DatabaseInfo {\n /**\n * Constructs a DatabaseInfo using the provided host, databaseId and\n * persistenceKey.\n *\n * @param databaseId - The database to use.\n * @param appId - The Firebase App Id.\n * @param persistenceKey - A unique identifier for this Firestore's local\n * storage (used in conjunction with the databaseId).\n * @param host - The Firestore backend host to connect to.\n * @param ssl - Whether to use SSL when connecting.\n * @param forceLongPolling - Whether to use the forceLongPolling option\n * when using WebChannel as the network transport.\n * @param autoDetectLongPolling - Whether to use the detectBufferingProxy\n * option when using WebChannel as the network transport.\n * @param longPollingOptions Options that configure long-polling.\n * @param useFetchStreams Whether to use the Fetch API instead of\n * XMLHTTPRequest\n */\n constructor(\n readonly databaseId: DatabaseId,\n readonly appId: string,\n readonly persistenceKey: string,\n readonly host: string,\n readonly ssl: boolean,\n readonly forceLongPolling: boolean,\n readonly autoDetectLongPolling: boolean,\n readonly longPollingOptions: ExperimentalLongPollingOptions,\n readonly useFetchStreams: boolean\n ) {}\n}\n\n/** The default database name for a project. */\nexport const DEFAULT_DATABASE_NAME = '(default)';\n\n/**\n * Represents the database ID a Firestore client is associated with.\n * @internal\n */\nexport class DatabaseId {\n readonly database: string;\n constructor(readonly projectId: string, database?: string) {\n this.database = database ? database : DEFAULT_DATABASE_NAME;\n }\n\n static empty(): DatabaseId {\n return new DatabaseId('', '');\n }\n\n get isDefaultDatabase(): boolean {\n return this.database === DEFAULT_DATABASE_NAME;\n }\n\n isEqual(other: {}): boolean {\n return (\n other instanceof DatabaseId &&\n other.projectId === this.projectId &&\n other.database === this.database\n );\n }\n}\n\nexport function databaseIdFromApp(\n app: FirebaseApp,\n database?: string\n): DatabaseId {\n if (!Object.prototype.hasOwnProperty.apply(app.options, ['projectId'])) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n '\"projectId\" not provided in firebase.initializeApp.'\n );\n }\n\n return new DatabaseId(app.options.projectId!, database);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseId } from '../core/database_info';\nimport {\n ArrayValue,\n LatLng,\n MapValue,\n Timestamp,\n Value as ProtoValue,\n Value\n} from '../protos/firestore_proto_api';\nimport { fail } from '../util/assert';\nimport { arrayEquals, primitiveComparator } from '../util/misc';\nimport { forEach, objectSize } from '../util/obj';\nimport { isNegativeZero } from '../util/types';\n\nimport { DocumentKey } from './document_key';\nimport {\n normalizeByteString,\n normalizeNumber,\n normalizeTimestamp\n} from './normalize';\nimport {\n getLocalWriteTime,\n getPreviousValue,\n isServerTimestamp\n} from './server_timestamps';\nimport { TypeOrder } from './type_order';\n\nexport const TYPE_KEY = '__type__';\nconst MAX_VALUE_TYPE = '__max__';\nexport const MAX_VALUE: Value = {\n mapValue: {\n fields: {\n '__type__': { stringValue: MAX_VALUE_TYPE }\n }\n }\n};\n\nexport const VECTOR_VALUE_SENTINEL = '__vector__';\nexport const VECTOR_MAP_VECTORS_KEY = 'value';\n\nexport const MIN_VALUE: Value = {\n nullValue: 'NULL_VALUE'\n};\n\n/** Extracts the backend's type order for the provided value. */\nexport function typeOrder(value: Value): TypeOrder {\n if ('nullValue' in value) {\n return TypeOrder.NullValue;\n } else if ('booleanValue' in value) {\n return TypeOrder.BooleanValue;\n } else if ('integerValue' in value || 'doubleValue' in value) {\n return TypeOrder.NumberValue;\n } else if ('timestampValue' in value) {\n return TypeOrder.TimestampValue;\n } else if ('stringValue' in value) {\n return TypeOrder.StringValue;\n } else if ('bytesValue' in value) {\n return TypeOrder.BlobValue;\n } else if ('referenceValue' in value) {\n return TypeOrder.RefValue;\n } else if ('geoPointValue' in value) {\n return TypeOrder.GeoPointValue;\n } else if ('arrayValue' in value) {\n return TypeOrder.ArrayValue;\n } else if ('mapValue' in value) {\n if (isServerTimestamp(value)) {\n return TypeOrder.ServerTimestampValue;\n } else if (isMaxValue(value)) {\n return TypeOrder.MaxValue;\n } else if (isVectorValue(value)) {\n return TypeOrder.VectorValue;\n }\n return TypeOrder.ObjectValue;\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\n/** Tests `left` and `right` for equality based on the backend semantics. */\nexport function valueEquals(left: Value, right: Value): boolean {\n if (left === right) {\n return true;\n }\n\n const leftType = typeOrder(left);\n const rightType = typeOrder(right);\n if (leftType !== rightType) {\n return false;\n }\n\n switch (leftType) {\n case TypeOrder.NullValue:\n return true;\n case TypeOrder.BooleanValue:\n return left.booleanValue === right.booleanValue;\n case TypeOrder.ServerTimestampValue:\n return getLocalWriteTime(left).isEqual(getLocalWriteTime(right));\n case TypeOrder.TimestampValue:\n return timestampEquals(left, right);\n case TypeOrder.StringValue:\n return left.stringValue === right.stringValue;\n case TypeOrder.BlobValue:\n return blobEquals(left, right);\n case TypeOrder.RefValue:\n return left.referenceValue === right.referenceValue;\n case TypeOrder.GeoPointValue:\n return geoPointEquals(left, right);\n case TypeOrder.NumberValue:\n return numberEquals(left, right);\n case TypeOrder.ArrayValue:\n return arrayEquals(\n left.arrayValue!.values || [],\n right.arrayValue!.values || [],\n valueEquals\n );\n case TypeOrder.VectorValue:\n case TypeOrder.ObjectValue:\n return objectEquals(left, right);\n case TypeOrder.MaxValue:\n return true;\n default:\n return fail('Unexpected value type: ' + JSON.stringify(left));\n }\n}\n\nfunction timestampEquals(left: Value, right: Value): boolean {\n if (\n typeof left.timestampValue === 'string' &&\n typeof right.timestampValue === 'string' &&\n left.timestampValue.length === right.timestampValue.length\n ) {\n // Use string equality for ISO 8601 timestamps\n return left.timestampValue === right.timestampValue;\n }\n\n const leftTimestamp = normalizeTimestamp(left.timestampValue!);\n const rightTimestamp = normalizeTimestamp(right.timestampValue!);\n return (\n leftTimestamp.seconds === rightTimestamp.seconds &&\n leftTimestamp.nanos === rightTimestamp.nanos\n );\n}\n\nfunction geoPointEquals(left: Value, right: Value): boolean {\n return (\n normalizeNumber(left.geoPointValue!.latitude) ===\n normalizeNumber(right.geoPointValue!.latitude) &&\n normalizeNumber(left.geoPointValue!.longitude) ===\n normalizeNumber(right.geoPointValue!.longitude)\n );\n}\n\nfunction blobEquals(left: Value, right: Value): boolean {\n return normalizeByteString(left.bytesValue!).isEqual(\n normalizeByteString(right.bytesValue!)\n );\n}\n\nexport function numberEquals(left: Value, right: Value): boolean {\n if ('integerValue' in left && 'integerValue' in right) {\n return (\n normalizeNumber(left.integerValue) === normalizeNumber(right.integerValue)\n );\n } else if ('doubleValue' in left && 'doubleValue' in right) {\n const n1 = normalizeNumber(left.doubleValue!);\n const n2 = normalizeNumber(right.doubleValue!);\n\n if (n1 === n2) {\n return isNegativeZero(n1) === isNegativeZero(n2);\n } else {\n return isNaN(n1) && isNaN(n2);\n }\n }\n\n return false;\n}\n\nfunction objectEquals(left: Value, right: Value): boolean {\n const leftMap = left.mapValue!.fields || {};\n const rightMap = right.mapValue!.fields || {};\n\n if (objectSize(leftMap) !== objectSize(rightMap)) {\n return false;\n }\n\n for (const key in leftMap) {\n if (leftMap.hasOwnProperty(key)) {\n if (\n rightMap[key] === undefined ||\n !valueEquals(leftMap[key], rightMap[key])\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/** Returns true if the ArrayValue contains the specified element. */\nexport function arrayValueContains(\n haystack: ArrayValue,\n needle: Value\n): boolean {\n return (\n (haystack.values || []).find(v => valueEquals(v, needle)) !== undefined\n );\n}\n\nexport function valueCompare(left: Value, right: Value): number {\n if (left === right) {\n return 0;\n }\n\n const leftType = typeOrder(left);\n const rightType = typeOrder(right);\n\n if (leftType !== rightType) {\n return primitiveComparator(leftType, rightType);\n }\n\n switch (leftType) {\n case TypeOrder.NullValue:\n case TypeOrder.MaxValue:\n return 0;\n case TypeOrder.BooleanValue:\n return primitiveComparator(left.booleanValue!, right.booleanValue!);\n case TypeOrder.NumberValue:\n return compareNumbers(left, right);\n case TypeOrder.TimestampValue:\n return compareTimestamps(left.timestampValue!, right.timestampValue!);\n case TypeOrder.ServerTimestampValue:\n return compareTimestamps(\n getLocalWriteTime(left),\n getLocalWriteTime(right)\n );\n case TypeOrder.StringValue:\n return primitiveComparator(left.stringValue!, right.stringValue!);\n case TypeOrder.BlobValue:\n return compareBlobs(left.bytesValue!, right.bytesValue!);\n case TypeOrder.RefValue:\n return compareReferences(left.referenceValue!, right.referenceValue!);\n case TypeOrder.GeoPointValue:\n return compareGeoPoints(left.geoPointValue!, right.geoPointValue!);\n case TypeOrder.ArrayValue:\n return compareArrays(left.arrayValue!, right.arrayValue!);\n case TypeOrder.VectorValue:\n return compareVectors(left.mapValue!, right.mapValue!);\n case TypeOrder.ObjectValue:\n return compareMaps(left.mapValue!, right.mapValue!);\n default:\n throw fail('Invalid value type: ' + leftType);\n }\n}\n\nfunction compareNumbers(left: Value, right: Value): number {\n const leftNumber = normalizeNumber(left.integerValue || left.doubleValue);\n const rightNumber = normalizeNumber(right.integerValue || right.doubleValue);\n\n if (leftNumber < rightNumber) {\n return -1;\n } else if (leftNumber > rightNumber) {\n return 1;\n } else if (leftNumber === rightNumber) {\n return 0;\n } else {\n // one or both are NaN.\n if (isNaN(leftNumber)) {\n return isNaN(rightNumber) ? 0 : -1;\n } else {\n return 1;\n }\n }\n}\n\nfunction compareTimestamps(left: Timestamp, right: Timestamp): number {\n if (\n typeof left === 'string' &&\n typeof right === 'string' &&\n left.length === right.length\n ) {\n return primitiveComparator(left, right);\n }\n\n const leftTimestamp = normalizeTimestamp(left);\n const rightTimestamp = normalizeTimestamp(right);\n\n const comparison = primitiveComparator(\n leftTimestamp.seconds,\n rightTimestamp.seconds\n );\n if (comparison !== 0) {\n return comparison;\n }\n return primitiveComparator(leftTimestamp.nanos, rightTimestamp.nanos);\n}\n\nfunction compareReferences(leftPath: string, rightPath: string): number {\n const leftSegments = leftPath.split('/');\n const rightSegments = rightPath.split('/');\n for (let i = 0; i < leftSegments.length && i < rightSegments.length; i++) {\n const comparison = primitiveComparator(leftSegments[i], rightSegments[i]);\n if (comparison !== 0) {\n return comparison;\n }\n }\n return primitiveComparator(leftSegments.length, rightSegments.length);\n}\n\nfunction compareGeoPoints(left: LatLng, right: LatLng): number {\n const comparison = primitiveComparator(\n normalizeNumber(left.latitude),\n normalizeNumber(right.latitude)\n );\n if (comparison !== 0) {\n return comparison;\n }\n return primitiveComparator(\n normalizeNumber(left.longitude),\n normalizeNumber(right.longitude)\n );\n}\n\nfunction compareBlobs(\n left: string | Uint8Array,\n right: string | Uint8Array\n): number {\n const leftBytes = normalizeByteString(left);\n const rightBytes = normalizeByteString(right);\n return leftBytes.compareTo(rightBytes);\n}\n\nfunction compareArrays(left: ArrayValue, right: ArrayValue): number {\n const leftArray = left.values || [];\n const rightArray = right.values || [];\n\n for (let i = 0; i < leftArray.length && i < rightArray.length; ++i) {\n const compare = valueCompare(leftArray[i], rightArray[i]);\n if (compare) {\n return compare;\n }\n }\n return primitiveComparator(leftArray.length, rightArray.length);\n}\n\nfunction compareVectors(left: MapValue, right: MapValue): number {\n const leftMap = left.fields || {};\n const rightMap = right.fields || {};\n\n // The vector is a map, but only vector value is compared.\n const leftArrayValue = leftMap[VECTOR_MAP_VECTORS_KEY]?.arrayValue;\n const rightArrayValue = rightMap[VECTOR_MAP_VECTORS_KEY]?.arrayValue;\n\n const lengthCompare = primitiveComparator(\n leftArrayValue?.values?.length || 0,\n rightArrayValue?.values?.length || 0\n );\n if (lengthCompare !== 0) {\n return lengthCompare;\n }\n\n return compareArrays(leftArrayValue!, rightArrayValue!);\n}\n\nfunction compareMaps(left: MapValue, right: MapValue): number {\n if (left === MAX_VALUE.mapValue && right === MAX_VALUE.mapValue) {\n return 0;\n } else if (left === MAX_VALUE.mapValue) {\n return 1;\n } else if (right === MAX_VALUE.mapValue) {\n return -1;\n }\n\n const leftMap = left.fields || {};\n const leftKeys = Object.keys(leftMap);\n const rightMap = right.fields || {};\n const rightKeys = Object.keys(rightMap);\n\n // Even though MapValues are likely sorted correctly based on their insertion\n // order (e.g. when received from the backend), local modifications can bring\n // elements out of order. We need to re-sort the elements to ensure that\n // canonical IDs are independent of insertion order.\n leftKeys.sort();\n rightKeys.sort();\n\n for (let i = 0; i < leftKeys.length && i < rightKeys.length; ++i) {\n const keyCompare = primitiveComparator(leftKeys[i], rightKeys[i]);\n if (keyCompare !== 0) {\n return keyCompare;\n }\n const compare = valueCompare(leftMap[leftKeys[i]], rightMap[rightKeys[i]]);\n if (compare !== 0) {\n return compare;\n }\n }\n\n return primitiveComparator(leftKeys.length, rightKeys.length);\n}\n\n/**\n * Generates the canonical ID for the provided field value (as used in Target\n * serialization).\n */\nexport function canonicalId(value: Value): string {\n return canonifyValue(value);\n}\n\nfunction canonifyValue(value: Value): string {\n if ('nullValue' in value) {\n return 'null';\n } else if ('booleanValue' in value) {\n return '' + value.booleanValue!;\n } else if ('integerValue' in value) {\n return '' + value.integerValue!;\n } else if ('doubleValue' in value) {\n return '' + value.doubleValue!;\n } else if ('timestampValue' in value) {\n return canonifyTimestamp(value.timestampValue!);\n } else if ('stringValue' in value) {\n return value.stringValue!;\n } else if ('bytesValue' in value) {\n return canonifyByteString(value.bytesValue!);\n } else if ('referenceValue' in value) {\n return canonifyReference(value.referenceValue!);\n } else if ('geoPointValue' in value) {\n return canonifyGeoPoint(value.geoPointValue!);\n } else if ('arrayValue' in value) {\n return canonifyArray(value.arrayValue!);\n } else if ('mapValue' in value) {\n return canonifyMap(value.mapValue!);\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\nfunction canonifyByteString(byteString: string | Uint8Array): string {\n return normalizeByteString(byteString).toBase64();\n}\n\nfunction canonifyTimestamp(timestamp: Timestamp): string {\n const normalizedTimestamp = normalizeTimestamp(timestamp);\n return `time(${normalizedTimestamp.seconds},${normalizedTimestamp.nanos})`;\n}\n\nfunction canonifyGeoPoint(geoPoint: LatLng): string {\n return `geo(${geoPoint.latitude},${geoPoint.longitude})`;\n}\n\nfunction canonifyReference(referenceValue: string): string {\n return DocumentKey.fromName(referenceValue).toString();\n}\n\nfunction canonifyMap(mapValue: MapValue): string {\n // Iteration order in JavaScript is not guaranteed. To ensure that we generate\n // matching canonical IDs for identical maps, we need to sort the keys.\n const sortedKeys = Object.keys(mapValue.fields || {}).sort();\n\n let result = '{';\n let first = true;\n for (const key of sortedKeys) {\n if (!first) {\n result += ',';\n } else {\n first = false;\n }\n result += `${key}:${canonifyValue(mapValue.fields![key])}`;\n }\n return result + '}';\n}\n\nfunction canonifyArray(arrayValue: ArrayValue): string {\n let result = '[';\n let first = true;\n for (const value of arrayValue.values || []) {\n if (!first) {\n result += ',';\n } else {\n first = false;\n }\n result += canonifyValue(value);\n }\n return result + ']';\n}\n\n/**\n * Returns an approximate (and wildly inaccurate) in-memory size for the field\n * value.\n *\n * The memory size takes into account only the actual user data as it resides\n * in memory and ignores object overhead.\n */\nexport function estimateByteSize(value: Value): number {\n switch (typeOrder(value)) {\n case TypeOrder.NullValue:\n return 4;\n case TypeOrder.BooleanValue:\n return 4;\n case TypeOrder.NumberValue:\n return 8;\n case TypeOrder.TimestampValue:\n // Timestamps are made up of two distinct numbers (seconds + nanoseconds)\n return 16;\n case TypeOrder.ServerTimestampValue:\n const previousValue = getPreviousValue(value);\n return previousValue ? 16 + estimateByteSize(previousValue) : 16;\n case TypeOrder.StringValue:\n // See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Data_structures:\n // \"JavaScript's String type is [...] a set of elements of 16-bit unsigned\n // integer values\"\n return value.stringValue!.length * 2;\n case TypeOrder.BlobValue:\n return normalizeByteString(value.bytesValue!).approximateByteSize();\n case TypeOrder.RefValue:\n return value.referenceValue!.length;\n case TypeOrder.GeoPointValue:\n // GeoPoints are made up of two distinct numbers (latitude + longitude)\n return 16;\n case TypeOrder.ArrayValue:\n return estimateArrayByteSize(value.arrayValue!);\n case TypeOrder.VectorValue:\n case TypeOrder.ObjectValue:\n return estimateMapByteSize(value.mapValue!);\n default:\n throw fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\nfunction estimateMapByteSize(mapValue: MapValue): number {\n let size = 0;\n forEach(mapValue.fields, (key, val) => {\n size += key.length + estimateByteSize(val);\n });\n return size;\n}\n\nfunction estimateArrayByteSize(arrayValue: ArrayValue): number {\n return (arrayValue.values || []).reduce(\n (previousSize, value) => previousSize + estimateByteSize(value),\n 0\n );\n}\n\n/** Returns a reference value for the provided database and key. */\nexport function refValue(databaseId: DatabaseId, key: DocumentKey): Value {\n return {\n referenceValue: `projects/${databaseId.projectId}/databases/${\n databaseId.database\n }/documents/${key.path.canonicalString()}`\n };\n}\n\n/** Returns true if `value` is an IntegerValue . */\nexport function isInteger(\n value?: Value | null\n): value is { integerValue: string | number } {\n return !!value && 'integerValue' in value;\n}\n\n/** Returns true if `value` is a DoubleValue. */\nexport function isDouble(\n value?: Value | null\n): value is { doubleValue: string | number } {\n return !!value && 'doubleValue' in value;\n}\n\n/** Returns true if `value` is either an IntegerValue or a DoubleValue. */\nexport function isNumber(value?: Value | null): boolean {\n return isInteger(value) || isDouble(value);\n}\n\n/** Returns true if `value` is an ArrayValue. */\nexport function isArray(\n value?: Value | null\n): value is { arrayValue: ArrayValue } {\n return !!value && 'arrayValue' in value;\n}\n\n/** Returns true if `value` is a ReferenceValue. */\nexport function isReferenceValue(\n value?: Value | null\n): value is { referenceValue: string } {\n return !!value && 'referenceValue' in value;\n}\n\n/** Returns true if `value` is a NullValue. */\nexport function isNullValue(\n value?: Value | null\n): value is { nullValue: 'NULL_VALUE' } {\n return !!value && 'nullValue' in value;\n}\n\n/** Returns true if `value` is NaN. */\nexport function isNanValue(\n value?: Value | null\n): value is { doubleValue: 'NaN' | number } {\n return !!value && 'doubleValue' in value && isNaN(Number(value.doubleValue));\n}\n\n/** Returns true if `value` is a MapValue. */\nexport function isMapValue(\n value?: Value | null\n): value is { mapValue: MapValue } {\n return !!value && 'mapValue' in value;\n}\n\n/** Returns true if `value` is a VetorValue. */\nexport function isVectorValue(value: ProtoValue | null): boolean {\n const type = (value?.mapValue?.fields || {})[TYPE_KEY]?.stringValue;\n return type === VECTOR_VALUE_SENTINEL;\n}\n\n/** Creates a deep copy of `source`. */\nexport function deepClone(source: Value): Value {\n if (source.geoPointValue) {\n return { geoPointValue: { ...source.geoPointValue } };\n } else if (\n source.timestampValue &&\n typeof source.timestampValue === 'object'\n ) {\n return { timestampValue: { ...source.timestampValue } };\n } else if (source.mapValue) {\n const target: Value = { mapValue: { fields: {} } };\n forEach(\n source.mapValue.fields,\n (key, val) => (target.mapValue!.fields![key] = deepClone(val))\n );\n return target;\n } else if (source.arrayValue) {\n const target: Value = { arrayValue: { values: [] } };\n for (let i = 0; i < (source.arrayValue.values || []).length; ++i) {\n target.arrayValue!.values![i] = deepClone(source.arrayValue.values![i]);\n }\n return target;\n } else {\n return { ...source };\n }\n}\n\n/** Returns true if the Value represents the canonical {@link #MAX_VALUE} . */\nexport function isMaxValue(value: Value): boolean {\n return (\n (((value.mapValue || {}).fields || {})['__type__'] || {}).stringValue ===\n MAX_VALUE_TYPE\n );\n}\n\nexport const MIN_VECTOR_VALUE = {\n mapValue: {\n fields: {\n [TYPE_KEY]: { stringValue: VECTOR_VALUE_SENTINEL },\n [VECTOR_MAP_VECTORS_KEY]: {\n arrayValue: {}\n }\n }\n }\n};\n\n/** Returns the lowest value for the given value type (inclusive). */\nexport function valuesGetLowerBound(value: Value): Value {\n if ('nullValue' in value) {\n return MIN_VALUE;\n } else if ('booleanValue' in value) {\n return { booleanValue: false };\n } else if ('integerValue' in value || 'doubleValue' in value) {\n return { doubleValue: NaN };\n } else if ('timestampValue' in value) {\n return { timestampValue: { seconds: Number.MIN_SAFE_INTEGER } };\n } else if ('stringValue' in value) {\n return { stringValue: '' };\n } else if ('bytesValue' in value) {\n return { bytesValue: '' };\n } else if ('referenceValue' in value) {\n return refValue(DatabaseId.empty(), DocumentKey.empty());\n } else if ('geoPointValue' in value) {\n return { geoPointValue: { latitude: -90, longitude: -180 } };\n } else if ('arrayValue' in value) {\n return { arrayValue: {} };\n } else if ('mapValue' in value) {\n if (isVectorValue(value)) {\n return MIN_VECTOR_VALUE;\n }\n return { mapValue: {} };\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\n/** Returns the largest value for the given value type (exclusive). */\nexport function valuesGetUpperBound(value: Value): Value {\n if ('nullValue' in value) {\n return { booleanValue: false };\n } else if ('booleanValue' in value) {\n return { doubleValue: NaN };\n } else if ('integerValue' in value || 'doubleValue' in value) {\n return { timestampValue: { seconds: Number.MIN_SAFE_INTEGER } };\n } else if ('timestampValue' in value) {\n return { stringValue: '' };\n } else if ('stringValue' in value) {\n return { bytesValue: '' };\n } else if ('bytesValue' in value) {\n return refValue(DatabaseId.empty(), DocumentKey.empty());\n } else if ('referenceValue' in value) {\n return { geoPointValue: { latitude: -90, longitude: -180 } };\n } else if ('geoPointValue' in value) {\n return { arrayValue: {} };\n } else if ('arrayValue' in value) {\n return MIN_VECTOR_VALUE;\n } else if ('mapValue' in value) {\n if (isVectorValue(value)) {\n return { mapValue: {} };\n }\n return MAX_VALUE;\n } else {\n return fail('Invalid value type: ' + JSON.stringify(value));\n }\n}\n\nexport function lowerBoundCompare(\n left: { value: Value; inclusive: boolean },\n right: { value: Value; inclusive: boolean }\n): number {\n const cmp = valueCompare(left.value, right.value);\n if (cmp !== 0) {\n return cmp;\n }\n\n if (left.inclusive && !right.inclusive) {\n return -1;\n } else if (!left.inclusive && right.inclusive) {\n return 1;\n }\n\n return 0;\n}\n\nexport function upperBoundCompare(\n left: { value: Value; inclusive: boolean },\n right: { value: Value; inclusive: boolean }\n): number {\n const cmp = valueCompare(left.value, right.value);\n if (cmp !== 0) {\n return cmp;\n }\n\n if (left.inclusive && !right.inclusive) {\n return 1;\n } else if (!left.inclusive && right.inclusive) {\n return -1;\n }\n\n return 0;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n MapValue as ProtoMapValue,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { debugAssert } from '../util/assert';\nimport { forEach } from '../util/obj';\n\nimport { FieldMask } from './field_mask';\nimport { FieldPath } from './path';\nimport { isServerTimestamp } from './server_timestamps';\nimport { deepClone, isMapValue, valueEquals } from './values';\n\nexport interface JsonObject {\n [name: string]: T;\n}\n/**\n * An ObjectValue represents a MapValue in the Firestore Proto and offers the\n * ability to add and remove fields (via the ObjectValueBuilder).\n */\nexport class ObjectValue {\n constructor(readonly value: { mapValue: ProtoMapValue }) {\n debugAssert(\n !isServerTimestamp(value),\n 'ServerTimestamps should be converted to ServerTimestampValue'\n );\n }\n\n static empty(): ObjectValue {\n return new ObjectValue({ mapValue: {} });\n }\n\n /**\n * Returns the value at the given path or null.\n *\n * @param path - the path to search\n * @returns The value at the path or null if the path is not set.\n */\n field(path: FieldPath): ProtoValue | null {\n if (path.isEmpty()) {\n return this.value;\n } else {\n let currentLevel: ProtoValue = this.value;\n for (let i = 0; i < path.length - 1; ++i) {\n currentLevel = (currentLevel.mapValue!.fields || {})[path.get(i)];\n if (!isMapValue(currentLevel)) {\n return null;\n }\n }\n currentLevel = (currentLevel.mapValue!.fields! || {})[path.lastSegment()];\n return currentLevel || null;\n }\n }\n\n /**\n * Sets the field to the provided value.\n *\n * @param path - The field path to set.\n * @param value - The value to set.\n */\n set(path: FieldPath, value: ProtoValue): void {\n debugAssert(\n !path.isEmpty(),\n 'Cannot set field for empty path on ObjectValue'\n );\n const fieldsMap = this.getFieldsMap(path.popLast());\n fieldsMap[path.lastSegment()] = deepClone(value);\n }\n\n /**\n * Sets the provided fields to the provided values.\n *\n * @param data - A map of fields to values (or null for deletes).\n */\n setAll(data: Map): void {\n let parent = FieldPath.emptyPath();\n\n let upserts: { [key: string]: ProtoValue } = {};\n let deletes: string[] = [];\n\n data.forEach((value, path) => {\n if (!parent.isImmediateParentOf(path)) {\n // Insert the accumulated changes at this parent location\n const fieldsMap = this.getFieldsMap(parent);\n this.applyChanges(fieldsMap, upserts, deletes);\n upserts = {};\n deletes = [];\n parent = path.popLast();\n }\n\n if (value) {\n upserts[path.lastSegment()] = deepClone(value);\n } else {\n deletes.push(path.lastSegment());\n }\n });\n\n const fieldsMap = this.getFieldsMap(parent);\n this.applyChanges(fieldsMap, upserts, deletes);\n }\n\n /**\n * Removes the field at the specified path. If there is no field at the\n * specified path, nothing is changed.\n *\n * @param path - The field path to remove.\n */\n delete(path: FieldPath): void {\n debugAssert(\n !path.isEmpty(),\n 'Cannot delete field for empty path on ObjectValue'\n );\n const nestedValue = this.field(path.popLast());\n if (isMapValue(nestedValue) && nestedValue.mapValue.fields) {\n delete nestedValue.mapValue.fields[path.lastSegment()];\n }\n }\n\n isEqual(other: ObjectValue): boolean {\n return valueEquals(this.value, other.value);\n }\n\n /**\n * Returns the map that contains the leaf element of `path`. If the parent\n * entry does not yet exist, or if it is not a map, a new map will be created.\n */\n private getFieldsMap(path: FieldPath): Record {\n let current = this.value;\n\n if (!current.mapValue!.fields) {\n current.mapValue = { fields: {} };\n }\n\n for (let i = 0; i < path.length; ++i) {\n let next = current.mapValue!.fields![path.get(i)];\n if (!isMapValue(next) || !next.mapValue.fields) {\n next = { mapValue: { fields: {} } };\n current.mapValue!.fields![path.get(i)] = next;\n }\n current = next as { mapValue: ProtoMapValue };\n }\n\n return current.mapValue!.fields!;\n }\n\n /**\n * Modifies `fieldsMap` by adding, replacing or deleting the specified\n * entries.\n */\n private applyChanges(\n fieldsMap: Record,\n inserts: { [key: string]: ProtoValue },\n deletes: string[]\n ): void {\n forEach(inserts, (key, val) => (fieldsMap[key] = val));\n for (const field of deletes) {\n delete fieldsMap[field];\n }\n }\n\n clone(): ObjectValue {\n return new ObjectValue(\n deepClone(this.value) as { mapValue: ProtoMapValue }\n );\n }\n}\n\n/**\n * Returns a FieldMask built from all fields in a MapValue.\n */\nexport function extractFieldMask(value: ProtoMapValue): FieldMask {\n const fields: FieldPath[] = [];\n forEach(value!.fields, (key, value) => {\n const currentPath = new FieldPath([key]);\n if (isMapValue(value)) {\n const nestedMask = extractFieldMask(value.mapValue!);\n const nestedFields = nestedMask.fields;\n if (nestedFields.length === 0) {\n // Preserve the empty map by adding it to the FieldMask.\n fields.push(currentPath);\n } else {\n // For nested and non-empty ObjectValues, add the FieldPath of the\n // leaf nodes.\n for (const nestedPath of nestedFields) {\n fields.push(currentPath.child(nestedPath));\n }\n }\n } else {\n // For nested and non-empty ObjectValues, add the FieldPath of the leaf\n // nodes.\n fields.push(currentPath);\n }\n });\n return new FieldMask(fields);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { debugAssert, fail } from '../util/assert';\n\nimport { DocumentKey } from './document_key';\nimport { ObjectValue } from './object_value';\nimport { FieldPath } from './path';\nimport { valueCompare } from './values';\n\n/**\n * Whether the document represents an existing document, a document that is\n * known to exist or a document whose state or existence is unknown.\n */\nconst enum DocumentType {\n /**\n * Represents the initial state of a MutableDocument when only the document\n * key is known. Invalid documents transition to other states as mutations are\n * applied. If a document remains invalid after applying mutations, it should\n * be discarded.\n *\n * Invalid documents can have neither local nor committed mutations.\n */\n INVALID,\n /**\n * Represents a document in Firestore with a key, version, data and whether\n * the data has local mutations applied to it.\n *\n * Found documents can be synced or have or committed mutations applied.\n */\n FOUND_DOCUMENT,\n /**\n * Represents that no documents exists for the key at the given version.\n *\n * Documents that are deleted based on a local mutation do not raise snapshots\n * with `hasPendingWrites`. As such, deleted documents never have\n * `HAS_LOCAL_MUTATIONS` set. Once a delete is committed, we store them with\n * `HAS_COMMITTED_MUTATIONS` until we received the delete from the Watch\n * stream.\n */\n NO_DOCUMENT,\n /**\n * Represents an existing document whose data is unknown (e.g. a document that\n * was updated without a known base document).\n *\n * An unknown document always has `HAS_COMMITTED_MUTATIONS` set, since unknown\n * documents can only be generated by applying a patch mutation from a write\n * acknowledgement.\n */\n UNKNOWN_DOCUMENT\n}\n\n/** Describes whether a document has latency-compensated edits applied. */\nconst enum DocumentState {\n /** No mutations applied. Document was sent to us by Watch. */\n SYNCED,\n /**\n * Local mutations applied via the mutation queue. Document is potentially\n * inconsistent.\n */\n HAS_LOCAL_MUTATIONS,\n /**\n * Mutations applied based on a write acknowledgment. Document is potentially\n * inconsistent.\n */\n HAS_COMMITTED_MUTATIONS\n}\n\n/**\n * Represents a document in Firestore with a key, version, data and whether the\n * data has local mutations applied to it.\n */\nexport interface Document {\n /** The key for this document */\n readonly key: DocumentKey;\n\n /**\n * The version of this document if it exists or a version at which this\n * document was guaranteed to not exist.\n */\n readonly version: SnapshotVersion;\n\n /**\n * The timestamp at which this document was read from the remote server. Uses\n * `SnapshotVersion.min()` for documents created by the user.\n */\n readonly readTime: SnapshotVersion;\n\n /**\n * The timestamp at which the document was created. This value increases\n * monotonically when a document is deleted then recreated. It can also be\n * compared to `createTime` of other documents and the `readTime` of a query.\n */\n readonly createTime: SnapshotVersion;\n\n /** The underlying data of this document or an empty value if no data exists. */\n readonly data: ObjectValue;\n\n /** Returns whether local mutations were applied via the mutation queue. */\n readonly hasLocalMutations: boolean;\n\n /** Returns whether mutations were applied based on a write acknowledgment. */\n readonly hasCommittedMutations: boolean;\n\n /**\n * Whether this document had a local mutation applied that has not yet been\n * acknowledged by Watch.\n */\n readonly hasPendingWrites: boolean;\n\n /**\n * Returns whether this document is valid (i.e. it is an entry in the\n * RemoteDocumentCache, was created by a mutation or read from the backend).\n */\n isValidDocument(): boolean;\n\n /**\n * Returns whether the document exists and its data is known at the current\n * version.\n */\n isFoundDocument(): boolean;\n\n /**\n * Returns whether the document is known to not exist at the current version.\n */\n isNoDocument(): boolean;\n\n /**\n * Returns whether the document exists and its data is unknown at the current\n * version.\n */\n isUnknownDocument(): boolean;\n\n isEqual(other: Document | null | undefined): boolean;\n\n /** Creates a mutable copy of this document. */\n mutableCopy(): MutableDocument;\n\n toString(): string;\n}\n\n/**\n * Represents a document in Firestore with a key, version, data and whether it\n * has local mutations applied to it.\n *\n * Documents can transition between states via `convertToFoundDocument()`,\n * `convertToNoDocument()` and `convertToUnknownDocument()`. If a document does\n * not transition to one of these states even after all mutations have been\n * applied, `isValidDocument()` returns false and the document should be removed\n * from all views.\n */\nexport class MutableDocument implements Document {\n private constructor(\n readonly key: DocumentKey,\n private documentType: DocumentType,\n public version: SnapshotVersion,\n public readTime: SnapshotVersion,\n public createTime: SnapshotVersion,\n public data: ObjectValue,\n private documentState: DocumentState\n ) {}\n\n /**\n * Creates a document with no known version or data, but which can serve as\n * base document for mutations.\n */\n static newInvalidDocument(documentKey: DocumentKey): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.INVALID,\n /* version */ SnapshotVersion.min(),\n /* readTime */ SnapshotVersion.min(),\n /* createTime */ SnapshotVersion.min(),\n ObjectValue.empty(),\n DocumentState.SYNCED\n );\n }\n\n /**\n * Creates a new document that is known to exist with the given data at the\n * given version.\n */\n static newFoundDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion,\n createTime: SnapshotVersion,\n value: ObjectValue\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.FOUND_DOCUMENT,\n /* version */ version,\n /* readTime */ SnapshotVersion.min(),\n /* createTime */ createTime,\n value,\n DocumentState.SYNCED\n );\n }\n\n /** Creates a new document that is known to not exist at the given version. */\n static newNoDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.NO_DOCUMENT,\n /* version */ version,\n /* readTime */ SnapshotVersion.min(),\n /* createTime */ SnapshotVersion.min(),\n ObjectValue.empty(),\n DocumentState.SYNCED\n );\n }\n\n /**\n * Creates a new document that is known to exist at the given version but\n * whose data is not known (e.g. a document that was updated without a known\n * base document).\n */\n static newUnknownDocument(\n documentKey: DocumentKey,\n version: SnapshotVersion\n ): MutableDocument {\n return new MutableDocument(\n documentKey,\n DocumentType.UNKNOWN_DOCUMENT,\n /* version */ version,\n /* readTime */ SnapshotVersion.min(),\n /* createTime */ SnapshotVersion.min(),\n ObjectValue.empty(),\n DocumentState.HAS_COMMITTED_MUTATIONS\n );\n }\n\n /**\n * Changes the document type to indicate that it exists and that its version\n * and data are known.\n */\n convertToFoundDocument(\n version: SnapshotVersion,\n value: ObjectValue\n ): MutableDocument {\n // If a document is switching state from being an invalid or deleted\n // document to a valid (FOUND_DOCUMENT) document, either due to receiving an\n // update from Watch or due to applying a local set mutation on top\n // of a deleted document, our best guess about its createTime would be the\n // version at which the document transitioned to a FOUND_DOCUMENT.\n if (\n this.createTime.isEqual(SnapshotVersion.min()) &&\n (this.documentType === DocumentType.NO_DOCUMENT ||\n this.documentType === DocumentType.INVALID)\n ) {\n this.createTime = version;\n }\n this.version = version;\n this.documentType = DocumentType.FOUND_DOCUMENT;\n this.data = value;\n this.documentState = DocumentState.SYNCED;\n return this;\n }\n\n /**\n * Changes the document type to indicate that it doesn't exist at the given\n * version.\n */\n convertToNoDocument(version: SnapshotVersion): MutableDocument {\n this.version = version;\n this.documentType = DocumentType.NO_DOCUMENT;\n this.data = ObjectValue.empty();\n this.documentState = DocumentState.SYNCED;\n return this;\n }\n\n /**\n * Changes the document type to indicate that it exists at a given version but\n * that its data is not known (e.g. a document that was updated without a known\n * base document).\n */\n convertToUnknownDocument(version: SnapshotVersion): MutableDocument {\n this.version = version;\n this.documentType = DocumentType.UNKNOWN_DOCUMENT;\n this.data = ObjectValue.empty();\n this.documentState = DocumentState.HAS_COMMITTED_MUTATIONS;\n return this;\n }\n\n setHasCommittedMutations(): MutableDocument {\n debugAssert(\n this.isValidDocument(),\n 'Invalid documents cannot have committed mutations'\n );\n this.documentState = DocumentState.HAS_COMMITTED_MUTATIONS;\n return this;\n }\n\n setHasLocalMutations(): MutableDocument {\n this.documentState = DocumentState.HAS_LOCAL_MUTATIONS;\n this.version = SnapshotVersion.min();\n return this;\n }\n\n setReadTime(readTime: SnapshotVersion): MutableDocument {\n this.readTime = readTime;\n return this;\n }\n\n get hasLocalMutations(): boolean {\n return this.documentState === DocumentState.HAS_LOCAL_MUTATIONS;\n }\n\n get hasCommittedMutations(): boolean {\n return this.documentState === DocumentState.HAS_COMMITTED_MUTATIONS;\n }\n\n get hasPendingWrites(): boolean {\n return this.hasLocalMutations || this.hasCommittedMutations;\n }\n\n isValidDocument(): boolean {\n return this.documentType !== DocumentType.INVALID;\n }\n\n isFoundDocument(): boolean {\n return this.documentType === DocumentType.FOUND_DOCUMENT;\n }\n\n isNoDocument(): boolean {\n return this.documentType === DocumentType.NO_DOCUMENT;\n }\n\n isUnknownDocument(): boolean {\n return this.documentType === DocumentType.UNKNOWN_DOCUMENT;\n }\n\n isEqual(other: Document | null | undefined): boolean {\n return (\n other instanceof MutableDocument &&\n this.key.isEqual(other.key) &&\n this.version.isEqual(other.version) &&\n this.documentType === other.documentType &&\n this.documentState === other.documentState &&\n this.data.isEqual(other.data)\n );\n }\n\n mutableCopy(): MutableDocument {\n return new MutableDocument(\n this.key,\n this.documentType,\n this.version,\n this.readTime,\n this.createTime,\n this.data.clone(),\n this.documentState\n );\n }\n\n toString(): string {\n return (\n `Document(${this.key}, ${this.version}, ${JSON.stringify(\n this.data.value\n )}, ` +\n `{createTime: ${this.createTime}}), ` +\n `{documentType: ${this.documentType}}), ` +\n `{documentState: ${this.documentState}})`\n );\n }\n}\n\n/**\n * Compares the value for field `field` in the provided documents. Throws if\n * the field does not exist in both documents.\n */\nexport function compareDocumentsByField(\n field: FieldPath,\n d1: Document,\n d2: Document\n): number {\n const v1 = d1.data.field(field);\n const v2 = d2.data.field(field);\n if (v1 !== null && v2 !== null) {\n return valueCompare(v1, v2);\n } else {\n return fail(\"Trying to compare documents on fields that don't exist\");\n }\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { isReferenceValue, valueCompare, valueEquals } from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert } from '../util/assert';\n\nimport { Direction, OrderBy } from './order_by';\n\n/**\n * Represents a bound of a query.\n *\n * The bound is specified with the given components representing a position and\n * whether it's just before or just after the position (relative to whatever the\n * query order is).\n *\n * The position represents a logical index position for a query. It's a prefix\n * of values for the (potentially implicit) order by clauses of a query.\n *\n * Bound provides a function to determine whether a document comes before or\n * after a bound. This is influenced by whether the position is just before or\n * just after the provided values.\n */\nexport class Bound {\n constructor(readonly position: ProtoValue[], readonly inclusive: boolean) {}\n}\n\nfunction boundCompareToDocument(\n bound: Bound,\n orderBy: OrderBy[],\n doc: Document\n): number {\n debugAssert(\n bound.position.length <= orderBy.length,\n \"Bound has more components than query's orderBy\"\n );\n let comparison = 0;\n for (let i = 0; i < bound.position.length; i++) {\n const orderByComponent = orderBy[i];\n const component = bound.position[i];\n if (orderByComponent.field.isKeyField()) {\n debugAssert(\n isReferenceValue(component),\n 'Bound has a non-key value where the key path is being used.'\n );\n comparison = DocumentKey.comparator(\n DocumentKey.fromName(component.referenceValue),\n doc.key\n );\n } else {\n const docValue = doc.data.field(orderByComponent.field);\n debugAssert(\n docValue !== null,\n 'Field should exist since document matched the orderBy already.'\n );\n comparison = valueCompare(component, docValue);\n }\n if (orderByComponent.dir === Direction.DESCENDING) {\n comparison = comparison * -1;\n }\n if (comparison !== 0) {\n break;\n }\n }\n return comparison;\n}\n\n/**\n * Returns true if a document sorts after a bound using the provided sort\n * order.\n */\nexport function boundSortsAfterDocument(\n bound: Bound,\n orderBy: OrderBy[],\n doc: Document\n): boolean {\n const comparison = boundCompareToDocument(bound, orderBy, doc);\n return bound.inclusive ? comparison >= 0 : comparison > 0;\n}\n\n/**\n * Returns true if a document sorts before a bound using the provided sort\n * order.\n */\nexport function boundSortsBeforeDocument(\n bound: Bound,\n orderBy: OrderBy[],\n doc: Document\n): boolean {\n const comparison = boundCompareToDocument(bound, orderBy, doc);\n return bound.inclusive ? comparison <= 0 : comparison < 0;\n}\n\nexport function boundEquals(left: Bound | null, right: Bound | null): boolean {\n if (left === null) {\n return right === null;\n } else if (right === null) {\n return false;\n }\n\n if (\n left.inclusive !== right.inclusive ||\n left.position.length !== right.position.length\n ) {\n return false;\n }\n for (let i = 0; i < left.position.length; i++) {\n const leftPosition = left.position[i];\n const rightPosition = right.position[i];\n if (!valueEquals(leftPosition, rightPosition)) {\n return false;\n }\n }\n return true;\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FieldPath } from '../model/path';\n\n/**\n * The direction of sorting in an order by.\n */\nexport const enum Direction {\n ASCENDING = 'asc',\n DESCENDING = 'desc'\n}\n\n/**\n * An ordering on a field, in some Direction. Direction defaults to ASCENDING.\n */\nexport class OrderBy {\n constructor(\n readonly field: FieldPath,\n readonly dir: Direction = Direction.ASCENDING\n ) {}\n}\n\nexport function canonifyOrderBy(orderBy: OrderBy): string {\n // TODO(b/29183165): Make this collision robust.\n return orderBy.field.canonicalString() + orderBy.dir;\n}\n\nexport function stringifyOrderBy(orderBy: OrderBy): string {\n return `${orderBy.field.canonicalString()} (${orderBy.dir})`;\n}\n\nexport function orderByEquals(left: OrderBy, right: OrderBy): boolean {\n return left.dir === right.dir && left.field.isEqual(right.field);\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath } from '../model/path';\nimport {\n arrayValueContains,\n canonicalId,\n isArray,\n isReferenceValue,\n typeOrder,\n valueCompare,\n valueEquals\n} from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert, fail } from '../util/assert';\n\n// The operator of a FieldFilter\nexport const enum Operator {\n LESS_THAN = '<',\n LESS_THAN_OR_EQUAL = '<=',\n EQUAL = '==',\n NOT_EQUAL = '!=',\n GREATER_THAN = '>',\n GREATER_THAN_OR_EQUAL = '>=',\n ARRAY_CONTAINS = 'array-contains',\n IN = 'in',\n NOT_IN = 'not-in',\n ARRAY_CONTAINS_ANY = 'array-contains-any'\n}\n\n// The operator of a CompositeFilter\nexport const enum CompositeOperator {\n OR = 'or',\n AND = 'and'\n}\n\nexport abstract class Filter {\n abstract matches(doc: Document): boolean;\n\n abstract getFlattenedFilters(): readonly FieldFilter[];\n\n abstract getFilters(): Filter[];\n}\n\nexport class FieldFilter extends Filter {\n protected constructor(\n public readonly field: FieldPath,\n public readonly op: Operator,\n public readonly value: ProtoValue\n ) {\n super();\n }\n\n /**\n * Creates a filter based on the provided arguments.\n */\n static create(\n field: FieldPath,\n op: Operator,\n value: ProtoValue\n ): FieldFilter {\n if (field.isKeyField()) {\n if (op === Operator.IN || op === Operator.NOT_IN) {\n return this.createKeyFieldInFilter(field, op, value);\n } else {\n debugAssert(\n isReferenceValue(value),\n 'Comparing on key, but filter value not a RefValue'\n );\n debugAssert(\n op !== Operator.ARRAY_CONTAINS && op !== Operator.ARRAY_CONTAINS_ANY,\n `'${op.toString()}' queries don't make sense on document keys.`\n );\n return new KeyFieldFilter(field, op, value);\n }\n } else if (op === Operator.ARRAY_CONTAINS) {\n return new ArrayContainsFilter(field, value);\n } else if (op === Operator.IN) {\n debugAssert(\n isArray(value),\n 'IN filter has invalid value: ' + value.toString()\n );\n return new InFilter(field, value);\n } else if (op === Operator.NOT_IN) {\n debugAssert(\n isArray(value),\n 'NOT_IN filter has invalid value: ' + value.toString()\n );\n return new NotInFilter(field, value);\n } else if (op === Operator.ARRAY_CONTAINS_ANY) {\n debugAssert(\n isArray(value),\n 'ARRAY_CONTAINS_ANY filter has invalid value: ' + value.toString()\n );\n return new ArrayContainsAnyFilter(field, value);\n } else {\n return new FieldFilter(field, op, value);\n }\n }\n\n private static createKeyFieldInFilter(\n field: FieldPath,\n op: Operator.IN | Operator.NOT_IN,\n value: ProtoValue\n ): FieldFilter {\n debugAssert(\n isArray(value),\n `Comparing on key with ${op.toString()}` +\n ', but filter value not an ArrayValue'\n );\n debugAssert(\n (value.arrayValue.values || []).every(elem => isReferenceValue(elem)),\n `Comparing on key with ${op.toString()}` +\n ', but an array value was not a RefValue'\n );\n\n return op === Operator.IN\n ? new KeyFieldInFilter(field, value)\n : new KeyFieldNotInFilter(field, value);\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n // Types do not have to match in NOT_EQUAL filters.\n if (this.op === Operator.NOT_EQUAL) {\n return (\n other !== null &&\n this.matchesComparison(valueCompare(other!, this.value))\n );\n }\n\n // Only compare types with matching backend order (such as double and int).\n return (\n other !== null &&\n typeOrder(this.value) === typeOrder(other) &&\n this.matchesComparison(valueCompare(other, this.value))\n );\n }\n\n protected matchesComparison(comparison: number): boolean {\n switch (this.op) {\n case Operator.LESS_THAN:\n return comparison < 0;\n case Operator.LESS_THAN_OR_EQUAL:\n return comparison <= 0;\n case Operator.EQUAL:\n return comparison === 0;\n case Operator.NOT_EQUAL:\n return comparison !== 0;\n case Operator.GREATER_THAN:\n return comparison > 0;\n case Operator.GREATER_THAN_OR_EQUAL:\n return comparison >= 0;\n default:\n return fail('Unknown FieldFilter operator: ' + this.op);\n }\n }\n\n isInequality(): boolean {\n return (\n [\n Operator.LESS_THAN,\n Operator.LESS_THAN_OR_EQUAL,\n Operator.GREATER_THAN,\n Operator.GREATER_THAN_OR_EQUAL,\n Operator.NOT_EQUAL,\n Operator.NOT_IN\n ].indexOf(this.op) >= 0\n );\n }\n\n getFlattenedFilters(): readonly FieldFilter[] {\n return [this];\n }\n\n getFilters(): Filter[] {\n return [this];\n }\n}\n\nexport class CompositeFilter extends Filter {\n private memoizedFlattenedFilters: FieldFilter[] | null = null;\n\n protected constructor(\n public readonly filters: readonly Filter[],\n public readonly op: CompositeOperator\n ) {\n super();\n }\n\n /**\n * Creates a filter based on the provided arguments.\n */\n static create(filters: Filter[], op: CompositeOperator): CompositeFilter {\n return new CompositeFilter(filters, op);\n }\n\n matches(doc: Document): boolean {\n if (compositeFilterIsConjunction(this)) {\n // For conjunctions, all filters must match, so return false if any filter doesn't match.\n return this.filters.find(filter => !filter.matches(doc)) === undefined;\n } else {\n // For disjunctions, at least one filter should match.\n return this.filters.find(filter => filter.matches(doc)) !== undefined;\n }\n }\n\n getFlattenedFilters(): readonly FieldFilter[] {\n if (this.memoizedFlattenedFilters !== null) {\n return this.memoizedFlattenedFilters;\n }\n\n this.memoizedFlattenedFilters = this.filters.reduce((result, subfilter) => {\n return result.concat(subfilter.getFlattenedFilters());\n }, [] as FieldFilter[]);\n\n return this.memoizedFlattenedFilters;\n }\n\n // Returns a mutable copy of `this.filters`\n getFilters(): Filter[] {\n return Object.assign([], this.filters);\n }\n}\n\nexport function compositeFilterIsConjunction(\n compositeFilter: CompositeFilter\n): boolean {\n return compositeFilter.op === CompositeOperator.AND;\n}\n\nexport function compositeFilterIsDisjunction(\n compositeFilter: CompositeFilter\n): boolean {\n return compositeFilter.op === CompositeOperator.OR;\n}\n\n/**\n * Returns true if this filter is a conjunction of field filters only. Returns false otherwise.\n */\nexport function compositeFilterIsFlatConjunction(\n compositeFilter: CompositeFilter\n): boolean {\n return (\n compositeFilterIsFlat(compositeFilter) &&\n compositeFilterIsConjunction(compositeFilter)\n );\n}\n\n/**\n * Returns true if this filter does not contain any composite filters. Returns false otherwise.\n */\nexport function compositeFilterIsFlat(\n compositeFilter: CompositeFilter\n): boolean {\n for (const filter of compositeFilter.filters) {\n if (filter instanceof CompositeFilter) {\n return false;\n }\n }\n return true;\n}\n\nexport function canonifyFilter(filter: Filter): string {\n debugAssert(\n filter instanceof FieldFilter || filter instanceof CompositeFilter,\n 'canonifyFilter() only supports FieldFilters and CompositeFilters'\n );\n\n if (filter instanceof FieldFilter) {\n // TODO(b/29183165): Technically, this won't be unique if two values have\n // the same description, such as the int 3 and the string \"3\". So we should\n // add the types in here somehow, too.\n return (\n filter.field.canonicalString() +\n filter.op.toString() +\n canonicalId(filter.value)\n );\n } else if (compositeFilterIsFlatConjunction(filter)) {\n // Older SDK versions use an implicit AND operation between their filters.\n // In the new SDK versions, the developer may use an explicit AND filter.\n // To stay consistent with the old usages, we add a special case to ensure\n // the canonical ID for these two are the same. For example:\n // `col.whereEquals(\"a\", 1).whereEquals(\"b\", 2)` should have the same\n // canonical ID as `col.where(and(equals(\"a\",1), equals(\"b\",2)))`.\n return filter.filters.map(filter => canonifyFilter(filter)).join(',');\n } else {\n // filter instanceof CompositeFilter\n const canonicalIdsString = filter.filters\n .map(filter => canonifyFilter(filter))\n .join(',');\n return `${filter.op}(${canonicalIdsString})`;\n }\n}\n\nexport function filterEquals(f1: Filter, f2: Filter): boolean {\n if (f1 instanceof FieldFilter) {\n return fieldFilterEquals(f1, f2);\n } else if (f1 instanceof CompositeFilter) {\n return compositeFilterEquals(f1, f2);\n } else {\n fail('Only FieldFilters and CompositeFilters can be compared');\n }\n}\n\nexport function fieldFilterEquals(f1: FieldFilter, f2: Filter): boolean {\n return (\n f2 instanceof FieldFilter &&\n f1.op === f2.op &&\n f1.field.isEqual(f2.field) &&\n valueEquals(f1.value, f2.value)\n );\n}\n\nexport function compositeFilterEquals(\n f1: CompositeFilter,\n f2: Filter\n): boolean {\n if (\n f2 instanceof CompositeFilter &&\n f1.op === f2.op &&\n f1.filters.length === f2.filters.length\n ) {\n const subFiltersMatch: boolean = f1.filters.reduce(\n (result: boolean, f1Filter: Filter, index: number): boolean =>\n result && filterEquals(f1Filter, f2.filters[index]),\n true\n );\n\n return subFiltersMatch;\n }\n\n return false;\n}\n\n/**\n * Returns a new composite filter that contains all filter from\n * `compositeFilter` plus all the given filters in `otherFilters`.\n */\nexport function compositeFilterWithAddedFilters(\n compositeFilter: CompositeFilter,\n otherFilters: Filter[]\n): CompositeFilter {\n const mergedFilters = compositeFilter.filters.concat(otherFilters);\n return CompositeFilter.create(mergedFilters, compositeFilter.op);\n}\n\n/** Returns a debug description for `filter`. */\nexport function stringifyFilter(filter: Filter): string {\n debugAssert(\n filter instanceof FieldFilter || filter instanceof CompositeFilter,\n 'stringifyFilter() only supports FieldFilters and CompositeFilters'\n );\n if (filter instanceof FieldFilter) {\n return stringifyFieldFilter(filter);\n } else if (filter instanceof CompositeFilter) {\n return stringifyCompositeFilter(filter);\n } else {\n return 'Filter';\n }\n}\n\nexport function stringifyCompositeFilter(filter: CompositeFilter): string {\n return (\n filter.op.toString() +\n ` {` +\n filter.getFilters().map(stringifyFilter).join(' ,') +\n '}'\n );\n}\n\nexport function stringifyFieldFilter(filter: FieldFilter): string {\n return `${filter.field.canonicalString()} ${filter.op} ${canonicalId(\n filter.value\n )}`;\n}\n\n/** Filter that matches on key fields (i.e. '__name__'). */\nexport class KeyFieldFilter extends FieldFilter {\n private readonly key: DocumentKey;\n\n constructor(field: FieldPath, op: Operator, value: ProtoValue) {\n super(field, op, value);\n debugAssert(\n isReferenceValue(value),\n 'KeyFieldFilter expects a ReferenceValue'\n );\n this.key = DocumentKey.fromName(value.referenceValue);\n }\n\n matches(doc: Document): boolean {\n const comparison = DocumentKey.comparator(doc.key, this.key);\n return this.matchesComparison(comparison);\n }\n}\n\n/** Filter that matches on key fields within an array. */\nexport class KeyFieldInFilter extends FieldFilter {\n private readonly keys: DocumentKey[];\n\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.IN, value);\n this.keys = extractDocumentKeysFromArrayValue(Operator.IN, value);\n }\n\n matches(doc: Document): boolean {\n return this.keys.some(key => key.isEqual(doc.key));\n }\n}\n\n/** Filter that matches on key fields not present within an array. */\nexport class KeyFieldNotInFilter extends FieldFilter {\n private readonly keys: DocumentKey[];\n\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.NOT_IN, value);\n this.keys = extractDocumentKeysFromArrayValue(Operator.NOT_IN, value);\n }\n\n matches(doc: Document): boolean {\n return !this.keys.some(key => key.isEqual(doc.key));\n }\n}\n\nfunction extractDocumentKeysFromArrayValue(\n op: Operator.IN | Operator.NOT_IN,\n value: ProtoValue\n): DocumentKey[] {\n debugAssert(\n isArray(value),\n 'KeyFieldInFilter/KeyFieldNotInFilter expects an ArrayValue'\n );\n return (value.arrayValue?.values || []).map(v => {\n debugAssert(\n isReferenceValue(v),\n `Comparing on key with ${op.toString()}, but an array value was not ` +\n `a ReferenceValue`\n );\n return DocumentKey.fromName(v.referenceValue);\n });\n}\n\n/** A Filter that implements the array-contains operator. */\nexport class ArrayContainsFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.ARRAY_CONTAINS, value);\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n return isArray(other) && arrayValueContains(other.arrayValue, this.value);\n }\n}\n\n/** A Filter that implements the IN operator. */\nexport class InFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.IN, value);\n debugAssert(isArray(value), 'InFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n return other !== null && arrayValueContains(this.value.arrayValue!, other);\n }\n}\n\n/** A Filter that implements the not-in operator. */\nexport class NotInFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.NOT_IN, value);\n debugAssert(isArray(value), 'NotInFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n if (\n arrayValueContains(this.value.arrayValue!, { nullValue: 'NULL_VALUE' })\n ) {\n return false;\n }\n const other = doc.data.field(this.field);\n return other !== null && !arrayValueContains(this.value.arrayValue!, other);\n }\n}\n\n/** A Filter that implements the array-contains-any operator. */\nexport class ArrayContainsAnyFilter extends FieldFilter {\n constructor(field: FieldPath, value: ProtoValue) {\n super(field, Operator.ARRAY_CONTAINS_ANY, value);\n debugAssert(isArray(value), 'ArrayContainsAnyFilter expects an ArrayValue');\n }\n\n matches(doc: Document): boolean {\n const other = doc.data.field(this.field);\n if (!isArray(other) || !other.arrayValue.values) {\n return false;\n }\n return other.arrayValue.values.some(val =>\n arrayValueContains(this.value.arrayValue!, val)\n );\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKey } from '../model/document_key';\nimport {\n FieldIndex,\n fieldIndexGetArraySegment,\n fieldIndexGetDirectionalSegments,\n IndexKind\n} from '../model/field_index';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport {\n canonicalId,\n MAX_VALUE,\n MIN_VALUE,\n lowerBoundCompare,\n upperBoundCompare,\n valuesGetLowerBound,\n valuesGetUpperBound\n} from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugCast } from '../util/assert';\nimport { SortedSet } from '../util/sorted_set';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { Bound, boundEquals } from './bound';\nimport {\n Filter,\n FieldFilter,\n canonifyFilter,\n stringifyFilter,\n filterEquals,\n Operator\n} from './filter';\nimport {\n canonifyOrderBy,\n OrderBy,\n orderByEquals,\n stringifyOrderBy\n} from './order_by';\n\n/**\n * A Target represents the WatchTarget representation of a Query, which is used\n * by the LocalStore and the RemoteStore to keep track of and to execute\n * backend queries. While a Query can represent multiple Targets, each Targets\n * maps to a single WatchTarget in RemoteStore and a single TargetData entry\n * in persistence.\n */\nexport interface Target {\n readonly path: ResourcePath;\n readonly collectionGroup: string | null;\n readonly orderBy: OrderBy[];\n readonly filters: Filter[];\n readonly limit: number | null;\n readonly startAt: Bound | null;\n readonly endAt: Bound | null;\n}\n\n// Visible for testing\nexport class TargetImpl implements Target {\n memoizedCanonicalId: string | null = null;\n constructor(\n readonly path: ResourcePath,\n readonly collectionGroup: string | null = null,\n readonly orderBy: OrderBy[] = [],\n readonly filters: Filter[] = [],\n readonly limit: number | null = null,\n readonly startAt: Bound | null = null,\n readonly endAt: Bound | null = null\n ) {}\n}\n\n/**\n * Initializes a Target with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n *\n * NOTE: you should always construct `Target` from `Query.toTarget` instead of\n * using this factory method, because `Query` provides an implicit `orderBy`\n * property.\n */\nexport function newTarget(\n path: ResourcePath,\n collectionGroup: string | null = null,\n orderBy: OrderBy[] = [],\n filters: Filter[] = [],\n limit: number | null = null,\n startAt: Bound | null = null,\n endAt: Bound | null = null\n): Target {\n return new TargetImpl(\n path,\n collectionGroup,\n orderBy,\n filters,\n limit,\n startAt,\n endAt\n );\n}\n\nexport function canonifyTarget(target: Target): string {\n const targetImpl = debugCast(target, TargetImpl);\n\n if (targetImpl.memoizedCanonicalId === null) {\n let str = targetImpl.path.canonicalString();\n if (targetImpl.collectionGroup !== null) {\n str += '|cg:' + targetImpl.collectionGroup;\n }\n str += '|f:';\n str += targetImpl.filters.map(f => canonifyFilter(f)).join(',');\n str += '|ob:';\n str += targetImpl.orderBy.map(o => canonifyOrderBy(o)).join(',');\n\n if (!isNullOrUndefined(targetImpl.limit)) {\n str += '|l:';\n str += targetImpl.limit!;\n }\n if (targetImpl.startAt) {\n str += '|lb:';\n str += targetImpl.startAt.inclusive ? 'b:' : 'a:';\n str += targetImpl.startAt.position.map(p => canonicalId(p)).join(',');\n }\n if (targetImpl.endAt) {\n str += '|ub:';\n str += targetImpl.endAt.inclusive ? 'a:' : 'b:';\n str += targetImpl.endAt.position.map(p => canonicalId(p)).join(',');\n }\n targetImpl.memoizedCanonicalId = str;\n }\n return targetImpl.memoizedCanonicalId;\n}\n\nexport function stringifyTarget(target: Target): string {\n let str = target.path.canonicalString();\n if (target.collectionGroup !== null) {\n str += ' collectionGroup=' + target.collectionGroup;\n }\n if (target.filters.length > 0) {\n str += `, filters: [${target.filters\n .map(f => stringifyFilter(f))\n .join(', ')}]`;\n }\n if (!isNullOrUndefined(target.limit)) {\n str += ', limit: ' + target.limit;\n }\n if (target.orderBy.length > 0) {\n str += `, orderBy: [${target.orderBy\n .map(o => stringifyOrderBy(o))\n .join(', ')}]`;\n }\n if (target.startAt) {\n str += ', startAt: ';\n str += target.startAt.inclusive ? 'b:' : 'a:';\n str += target.startAt.position.map(p => canonicalId(p)).join(',');\n }\n if (target.endAt) {\n str += ', endAt: ';\n str += target.endAt.inclusive ? 'a:' : 'b:';\n str += target.endAt.position.map(p => canonicalId(p)).join(',');\n }\n return `Target(${str})`;\n}\n\nexport function targetEquals(left: Target, right: Target): boolean {\n if (left.limit !== right.limit) {\n return false;\n }\n\n if (left.orderBy.length !== right.orderBy.length) {\n return false;\n }\n\n for (let i = 0; i < left.orderBy.length; i++) {\n if (!orderByEquals(left.orderBy[i], right.orderBy[i])) {\n return false;\n }\n }\n\n if (left.filters.length !== right.filters.length) {\n return false;\n }\n\n for (let i = 0; i < left.filters.length; i++) {\n if (!filterEquals(left.filters[i], right.filters[i])) {\n return false;\n }\n }\n\n if (left.collectionGroup !== right.collectionGroup) {\n return false;\n }\n\n if (!left.path.isEqual(right.path)) {\n return false;\n }\n\n if (!boundEquals(left.startAt, right.startAt)) {\n return false;\n }\n\n return boundEquals(left.endAt, right.endAt);\n}\n\nexport function targetIsDocumentTarget(target: Target): boolean {\n return (\n DocumentKey.isDocumentKey(target.path) &&\n target.collectionGroup === null &&\n target.filters.length === 0\n );\n}\n\n/** Returns the field filters that target the given field path. */\nexport function targetGetFieldFiltersForPath(\n target: Target,\n path: FieldPath\n): FieldFilter[] {\n return target.filters.filter(\n f => f instanceof FieldFilter && f.field.isEqual(path)\n ) as FieldFilter[];\n}\n\n/**\n * Returns the values that are used in ARRAY_CONTAINS or ARRAY_CONTAINS_ANY\n * filters. Returns `null` if there are no such filters.\n */\nexport function targetGetArrayValues(\n target: Target,\n fieldIndex: FieldIndex\n): ProtoValue[] | null {\n const segment = fieldIndexGetArraySegment(fieldIndex);\n if (segment === undefined) {\n return null;\n }\n\n for (const fieldFilter of targetGetFieldFiltersForPath(\n target,\n segment.fieldPath\n )) {\n switch (fieldFilter.op) {\n case Operator.ARRAY_CONTAINS_ANY:\n return fieldFilter.value.arrayValue!.values || [];\n case Operator.ARRAY_CONTAINS:\n return [fieldFilter.value];\n default:\n // Remaining filters are not array filters.\n }\n }\n return null;\n}\n\n/**\n * Returns the list of values that are used in != or NOT_IN filters. Returns\n * `null` if there are no such filters.\n */\nexport function targetGetNotInValues(\n target: Target,\n fieldIndex: FieldIndex\n): ProtoValue[] | null {\n const values = new Map();\n\n for (const segment of fieldIndexGetDirectionalSegments(fieldIndex)) {\n for (const fieldFilter of targetGetFieldFiltersForPath(\n target,\n segment.fieldPath\n )) {\n switch (fieldFilter.op) {\n case Operator.EQUAL:\n case Operator.IN:\n // Encode equality prefix, which is encoded in the index value before\n // the inequality (e.g. `a == 'a' && b != 'b'` is encoded to\n // `value != 'ab'`).\n values.set(segment.fieldPath.canonicalString(), fieldFilter.value);\n break;\n case Operator.NOT_IN:\n case Operator.NOT_EQUAL:\n // NotIn/NotEqual is always a suffix. There cannot be any remaining\n // segments and hence we can return early here.\n values.set(segment.fieldPath.canonicalString(), fieldFilter.value);\n return Array.from(values.values());\n default:\n // Remaining filters cannot be used as notIn bounds.\n }\n }\n }\n\n return null;\n}\n\n/**\n * Returns a lower bound of field values that can be used as a starting point to\n * scan the index defined by `fieldIndex`. Returns `MIN_VALUE` if no lower bound\n * exists.\n */\nexport function targetGetLowerBound(\n target: Target,\n fieldIndex: FieldIndex\n): Bound {\n const values: ProtoValue[] = [];\n let inclusive = true;\n\n // For each segment, retrieve a lower bound if there is a suitable filter or\n // startAt.\n for (const segment of fieldIndexGetDirectionalSegments(fieldIndex)) {\n const segmentBound =\n segment.kind === IndexKind.ASCENDING\n ? targetGetAscendingBound(target, segment.fieldPath, target.startAt)\n : targetGetDescendingBound(target, segment.fieldPath, target.startAt);\n\n values.push(segmentBound.value);\n inclusive &&= segmentBound.inclusive;\n }\n return new Bound(values, inclusive);\n}\n\n/**\n * Returns an upper bound of field values that can be used as an ending point\n * when scanning the index defined by `fieldIndex`. Returns `MAX_VALUE` if no\n * upper bound exists.\n */\nexport function targetGetUpperBound(\n target: Target,\n fieldIndex: FieldIndex\n): Bound {\n const values: ProtoValue[] = [];\n let inclusive = true;\n\n // For each segment, retrieve an upper bound if there is a suitable filter or\n // endAt.\n for (const segment of fieldIndexGetDirectionalSegments(fieldIndex)) {\n const segmentBound =\n segment.kind === IndexKind.ASCENDING\n ? targetGetDescendingBound(target, segment.fieldPath, target.endAt)\n : targetGetAscendingBound(target, segment.fieldPath, target.endAt);\n\n values.push(segmentBound.value);\n inclusive &&= segmentBound.inclusive;\n }\n\n return new Bound(values, inclusive);\n}\n\n/**\n * Returns the value to use as the lower bound for ascending index segment at\n * the provided `fieldPath` (or the upper bound for an descending segment).\n */\nfunction targetGetAscendingBound(\n target: Target,\n fieldPath: FieldPath,\n bound: Bound | null\n): { value: ProtoValue; inclusive: boolean } {\n let value: ProtoValue = MIN_VALUE;\n\n let inclusive = true;\n\n // Process all filters to find a value for the current field segment\n for (const fieldFilter of targetGetFieldFiltersForPath(target, fieldPath)) {\n let filterValue: ProtoValue = MIN_VALUE;\n let filterInclusive = true;\n\n switch (fieldFilter.op) {\n case Operator.LESS_THAN:\n case Operator.LESS_THAN_OR_EQUAL:\n filterValue = valuesGetLowerBound(fieldFilter.value);\n break;\n case Operator.EQUAL:\n case Operator.IN:\n case Operator.GREATER_THAN_OR_EQUAL:\n filterValue = fieldFilter.value;\n break;\n case Operator.GREATER_THAN:\n filterValue = fieldFilter.value;\n filterInclusive = false;\n break;\n case Operator.NOT_EQUAL:\n case Operator.NOT_IN:\n filterValue = MIN_VALUE;\n break;\n default:\n // Remaining filters cannot be used as lower bounds.\n }\n\n if (\n lowerBoundCompare(\n { value, inclusive },\n { value: filterValue, inclusive: filterInclusive }\n ) < 0\n ) {\n value = filterValue;\n inclusive = filterInclusive;\n }\n }\n\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (bound !== null) {\n for (let i = 0; i < target.orderBy.length; ++i) {\n const orderBy = target.orderBy[i];\n if (orderBy.field.isEqual(fieldPath)) {\n const cursorValue = bound.position[i];\n if (\n lowerBoundCompare(\n { value, inclusive },\n { value: cursorValue, inclusive: bound.inclusive }\n ) < 0\n ) {\n value = cursorValue;\n inclusive = bound.inclusive;\n }\n break;\n }\n }\n }\n\n return { value, inclusive };\n}\n\n/**\n * Returns the value to use as the upper bound for ascending index segment at\n * the provided `fieldPath` (or the lower bound for a descending segment).\n */\nfunction targetGetDescendingBound(\n target: Target,\n fieldPath: FieldPath,\n bound: Bound | null\n): { value: ProtoValue; inclusive: boolean } {\n let value: ProtoValue = MAX_VALUE;\n let inclusive = true;\n\n // Process all filters to find a value for the current field segment\n for (const fieldFilter of targetGetFieldFiltersForPath(target, fieldPath)) {\n let filterValue: ProtoValue = MAX_VALUE;\n let filterInclusive = true;\n\n switch (fieldFilter.op) {\n case Operator.GREATER_THAN_OR_EQUAL:\n case Operator.GREATER_THAN:\n filterValue = valuesGetUpperBound(fieldFilter.value);\n filterInclusive = false;\n break;\n case Operator.EQUAL:\n case Operator.IN:\n case Operator.LESS_THAN_OR_EQUAL:\n filterValue = fieldFilter.value;\n break;\n case Operator.LESS_THAN:\n filterValue = fieldFilter.value;\n filterInclusive = false;\n break;\n case Operator.NOT_EQUAL:\n case Operator.NOT_IN:\n filterValue = MAX_VALUE;\n break;\n default:\n // Remaining filters cannot be used as upper bounds.\n }\n\n if (\n upperBoundCompare(\n { value, inclusive },\n { value: filterValue, inclusive: filterInclusive }\n ) > 0\n ) {\n value = filterValue;\n inclusive = filterInclusive;\n }\n }\n\n // If there is an additional bound, compare the values against the existing\n // range to see if we can narrow the scope.\n if (bound !== null) {\n for (let i = 0; i < target.orderBy.length; ++i) {\n const orderBy = target.orderBy[i];\n if (orderBy.field.isEqual(fieldPath)) {\n const cursorValue = bound.position[i];\n if (\n upperBoundCompare(\n { value, inclusive },\n { value: cursorValue, inclusive: bound.inclusive }\n ) > 0\n ) {\n value = cursorValue;\n inclusive = bound.inclusive;\n }\n break;\n }\n }\n }\n\n return { value, inclusive };\n}\n\n/** Returns the number of segments of a perfect index for this target. */\nexport function targetGetSegmentCount(target: Target): number {\n let fields = new SortedSet(FieldPath.comparator);\n let hasArraySegment = false;\n\n for (const filter of target.filters) {\n for (const subFilter of filter.getFlattenedFilters()) {\n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n if (subFilter.field.isKeyField()) {\n continue;\n }\n\n // ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filters must be counted separately.\n // For instance, it is possible to have an index for \"a ARRAY a ASC\". Even\n // though these are on the same field, they should be counted as two\n // separate segments in an index.\n if (\n subFilter.op === Operator.ARRAY_CONTAINS ||\n subFilter.op === Operator.ARRAY_CONTAINS_ANY\n ) {\n hasArraySegment = true;\n } else {\n fields = fields.add(subFilter.field);\n }\n }\n }\n\n for (const orderBy of target.orderBy) {\n // __name__ is not an explicit segment of any index, so we don't need to\n // count it.\n if (!orderBy.field.isKeyField()) {\n fields = fields.add(orderBy.field);\n }\n }\n\n return fields.size + (hasArraySegment ? 1 : 0);\n}\n\nexport function targetHasLimit(target: Target): boolean {\n return target.limit !== null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { compareDocumentsByField, Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport { debugAssert, debugCast, fail } from '../util/assert';\nimport { SortedSet } from '../util/sorted_set';\n\nimport {\n Bound,\n boundSortsAfterDocument,\n boundSortsBeforeDocument\n} from './bound';\nimport { FieldFilter, Filter } from './filter';\nimport { Direction, OrderBy } from './order_by';\nimport {\n canonifyTarget,\n newTarget,\n stringifyTarget,\n Target,\n targetEquals\n} from './target';\n\nexport const enum LimitType {\n First = 'F',\n Last = 'L'\n}\n\n/**\n * The Query interface defines all external properties of a query.\n *\n * QueryImpl implements this interface to provide memoization for `queryNormalizedOrderBy`\n * and `queryToTarget`.\n */\nexport interface Query {\n readonly path: ResourcePath;\n readonly collectionGroup: string | null;\n readonly explicitOrderBy: OrderBy[];\n readonly filters: Filter[];\n readonly limit: number | null;\n readonly limitType: LimitType;\n readonly startAt: Bound | null;\n readonly endAt: Bound | null;\n}\n\n/**\n * Query encapsulates all the query attributes we support in the SDK. It can\n * be run against the LocalStore, as well as be converted to a `Target` to\n * query the RemoteStore results.\n *\n * Visible for testing.\n */\nexport class QueryImpl implements Query {\n memoizedNormalizedOrderBy: OrderBy[] | null = null;\n\n // The corresponding `Target` of this `Query` instance, for use with\n // non-aggregate queries.\n memoizedTarget: Target | null = null;\n\n // The corresponding `Target` of this `Query` instance, for use with\n // aggregate queries. Unlike targets for non-aggregate queries,\n // aggregate query targets do not contain normalized order-bys, they only\n // contain explicit order-bys.\n memoizedAggregateTarget: Target | null = null;\n\n /**\n * Initializes a Query with a path and optional additional query constraints.\n * Path must currently be empty if this is a collection group query.\n */\n constructor(\n readonly path: ResourcePath,\n readonly collectionGroup: string | null = null,\n readonly explicitOrderBy: OrderBy[] = [],\n readonly filters: Filter[] = [],\n readonly limit: number | null = null,\n readonly limitType: LimitType = LimitType.First,\n readonly startAt: Bound | null = null,\n readonly endAt: Bound | null = null\n ) {\n if (this.startAt) {\n debugAssert(\n this.startAt.position.length <= queryNormalizedOrderBy(this).length,\n 'Bound is longer than orderBy'\n );\n }\n if (this.endAt) {\n debugAssert(\n this.endAt.position.length <= queryNormalizedOrderBy(this).length,\n 'Bound is longer than orderBy'\n );\n }\n }\n}\n\n/** Creates a new Query instance with the options provided. */\nexport function newQuery(\n path: ResourcePath,\n collectionGroup: string | null,\n explicitOrderBy: OrderBy[],\n filters: Filter[],\n limit: number | null,\n limitType: LimitType,\n startAt: Bound | null,\n endAt: Bound | null\n): Query {\n return new QueryImpl(\n path,\n collectionGroup,\n explicitOrderBy,\n filters,\n limit,\n limitType,\n startAt,\n endAt\n );\n}\n\n/** Creates a new Query for a query that matches all documents at `path` */\nexport function newQueryForPath(path: ResourcePath): Query {\n return new QueryImpl(path);\n}\n\n/**\n * Helper to convert a collection group query into a collection query at a\n * specific path. This is used when executing collection group queries, since\n * we have to split the query into a set of collection queries at multiple\n * paths.\n */\nexport function asCollectionQueryAtPath(\n query: Query,\n path: ResourcePath\n): Query {\n return new QueryImpl(\n path,\n /*collectionGroup=*/ null,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\n/**\n * Returns true if this query does not specify any query constraints that\n * could remove results.\n */\nexport function queryMatchesAllDocuments(query: Query): boolean {\n return (\n query.filters.length === 0 &&\n query.limit === null &&\n query.startAt == null &&\n query.endAt == null &&\n (query.explicitOrderBy.length === 0 ||\n (query.explicitOrderBy.length === 1 &&\n query.explicitOrderBy[0].field.isKeyField()))\n );\n}\n\n// Returns the sorted set of inequality filter fields used in this query.\nexport function getInequalityFilterFields(query: Query): SortedSet {\n let result = new SortedSet(FieldPath.comparator);\n query.filters.forEach((filter: Filter) => {\n const subFilters = filter.getFlattenedFilters();\n subFilters.forEach((filter: FieldFilter) => {\n if (filter.isInequality()) {\n result = result.add(filter.field);\n }\n });\n });\n return result;\n}\n\n/**\n * Creates a new Query for a collection group query that matches all documents\n * within the provided collection group.\n */\nexport function newQueryForCollectionGroup(collectionId: string): Query {\n return new QueryImpl(ResourcePath.emptyPath(), collectionId);\n}\n\n/**\n * Returns whether the query matches a single document by path (rather than a\n * collection).\n */\nexport function isDocumentQuery(query: Query): boolean {\n return (\n DocumentKey.isDocumentKey(query.path) &&\n query.collectionGroup === null &&\n query.filters.length === 0\n );\n}\n\n/**\n * Returns whether the query matches a collection group rather than a specific\n * collection.\n */\nexport function isCollectionGroupQuery(query: Query): boolean {\n return query.collectionGroup !== null;\n}\n\n/**\n * Returns the normalized order-by constraint that is used to execute the Query,\n * which can be different from the order-by constraints the user provided (e.g.\n * the SDK and backend always orders by `__name__`). The normalized order-by\n * includes implicit order-bys in addition to the explicit user provided\n * order-bys.\n */\nexport function queryNormalizedOrderBy(query: Query): OrderBy[] {\n const queryImpl = debugCast(query, QueryImpl);\n if (queryImpl.memoizedNormalizedOrderBy === null) {\n queryImpl.memoizedNormalizedOrderBy = [];\n const fieldsNormalized = new Set();\n\n // Any explicit order by fields should be added as is.\n for (const orderBy of queryImpl.explicitOrderBy) {\n queryImpl.memoizedNormalizedOrderBy.push(orderBy);\n fieldsNormalized.add(orderBy.field.canonicalString());\n }\n\n // The order of the implicit ordering always matches the last explicit order by.\n const lastDirection =\n queryImpl.explicitOrderBy.length > 0\n ? queryImpl.explicitOrderBy[queryImpl.explicitOrderBy.length - 1].dir\n : Direction.ASCENDING;\n\n // Any inequality fields not explicitly ordered should be implicitly ordered in a lexicographical\n // order. When there are multiple inequality filters on the same field, the field should be added\n // only once.\n // Note: `SortedSet` sorts the key field before other fields. However, we want the key\n // field to be sorted last.\n const inequalityFields: SortedSet =\n getInequalityFilterFields(queryImpl);\n inequalityFields.forEach(field => {\n if (\n !fieldsNormalized.has(field.canonicalString()) &&\n !field.isKeyField()\n ) {\n queryImpl.memoizedNormalizedOrderBy!.push(\n new OrderBy(field, lastDirection)\n );\n }\n });\n\n // Add the document key field to the last if it is not explicitly ordered.\n if (!fieldsNormalized.has(FieldPath.keyField().canonicalString())) {\n queryImpl.memoizedNormalizedOrderBy.push(\n new OrderBy(FieldPath.keyField(), lastDirection)\n );\n }\n }\n return queryImpl.memoizedNormalizedOrderBy;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation.\n */\nexport function queryToTarget(query: Query): Target {\n const queryImpl = debugCast(query, QueryImpl);\n if (!queryImpl.memoizedTarget) {\n queryImpl.memoizedTarget = _queryToTarget(\n queryImpl,\n queryNormalizedOrderBy(query)\n );\n }\n\n return queryImpl.memoizedTarget;\n}\n\n/**\n * Converts this `Query` instance to its corresponding `Target` representation,\n * for use within an aggregate query. Unlike targets for non-aggregate queries,\n * aggregate query targets do not contain normalized order-bys, they only\n * contain explicit order-bys.\n */\nexport function queryToAggregateTarget(query: Query): Target {\n const queryImpl = debugCast(query, QueryImpl);\n\n if (!queryImpl.memoizedAggregateTarget) {\n // Do not include implicit order-bys for aggregate queries.\n queryImpl.memoizedAggregateTarget = _queryToTarget(\n queryImpl,\n query.explicitOrderBy\n );\n }\n\n return queryImpl.memoizedAggregateTarget;\n}\n\nfunction _queryToTarget(queryImpl: QueryImpl, orderBys: OrderBy[]): Target {\n if (queryImpl.limitType === LimitType.First) {\n return newTarget(\n queryImpl.path,\n queryImpl.collectionGroup,\n orderBys,\n queryImpl.filters,\n queryImpl.limit,\n queryImpl.startAt,\n queryImpl.endAt\n );\n } else {\n // Flip the orderBy directions since we want the last results\n orderBys = orderBys.map(orderBy => {\n const dir =\n orderBy.dir === Direction.DESCENDING\n ? Direction.ASCENDING\n : Direction.DESCENDING;\n return new OrderBy(orderBy.field, dir);\n });\n\n // We need to swap the cursors to match the now-flipped query ordering.\n const startAt = queryImpl.endAt\n ? new Bound(queryImpl.endAt.position, queryImpl.endAt.inclusive)\n : null;\n const endAt = queryImpl.startAt\n ? new Bound(queryImpl.startAt.position, queryImpl.startAt.inclusive)\n : null;\n\n // Now return as a LimitType.First query.\n return newTarget(\n queryImpl.path,\n queryImpl.collectionGroup,\n orderBys,\n queryImpl.filters,\n queryImpl.limit,\n startAt,\n endAt\n );\n }\n}\n\nexport function queryWithAddedFilter(query: Query, filter: Filter): Query {\n debugAssert(\n !isDocumentQuery(query),\n 'No filtering allowed for document query'\n );\n\n const newFilters = query.filters.concat([filter]);\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n newFilters,\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithAddedOrderBy(query: Query, orderBy: OrderBy): Query {\n debugAssert(\n !query.startAt && !query.endAt,\n 'Bounds must be set after orderBy'\n );\n // TODO(dimond): validate that orderBy does not list the same key twice.\n const newOrderBy = query.explicitOrderBy.concat([orderBy]);\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n newOrderBy,\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithLimit(\n query: Query,\n limit: number | null,\n limitType: LimitType\n): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n limit,\n limitType,\n query.startAt,\n query.endAt\n );\n}\n\nexport function queryWithStartAt(query: Query, bound: Bound): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n bound,\n query.endAt\n );\n}\n\nexport function queryWithEndAt(query: Query, bound: Bound): Query {\n return new QueryImpl(\n query.path,\n query.collectionGroup,\n query.explicitOrderBy.slice(),\n query.filters.slice(),\n query.limit,\n query.limitType,\n query.startAt,\n bound\n );\n}\n\nexport function queryEquals(left: Query, right: Query): boolean {\n return (\n targetEquals(queryToTarget(left), queryToTarget(right)) &&\n left.limitType === right.limitType\n );\n}\n\n// TODO(b/29183165): This is used to get a unique string from a query to, for\n// example, use as a dictionary key, but the implementation is subject to\n// collisions. Make it collision-free.\nexport function canonifyQuery(query: Query): string {\n return `${canonifyTarget(queryToTarget(query))}|lt:${query.limitType}`;\n}\n\nexport function stringifyQuery(query: Query): string {\n return `Query(target=${stringifyTarget(queryToTarget(query))}; limitType=${\n query.limitType\n })`;\n}\n\n/** Returns whether `doc` matches the constraints of `query`. */\nexport function queryMatches(query: Query, doc: Document): boolean {\n return (\n doc.isFoundDocument() &&\n queryMatchesPathAndCollectionGroup(query, doc) &&\n queryMatchesOrderBy(query, doc) &&\n queryMatchesFilters(query, doc) &&\n queryMatchesBounds(query, doc)\n );\n}\n\nfunction queryMatchesPathAndCollectionGroup(\n query: Query,\n doc: Document\n): boolean {\n const docPath = doc.key.path;\n if (query.collectionGroup !== null) {\n // NOTE: this.path is currently always empty since we don't expose Collection\n // Group queries rooted at a document path yet.\n return (\n doc.key.hasCollectionId(query.collectionGroup) &&\n query.path.isPrefixOf(docPath)\n );\n } else if (DocumentKey.isDocumentKey(query.path)) {\n // exact match for document queries\n return query.path.isEqual(docPath);\n } else {\n // shallow ancestor queries by default\n return query.path.isImmediateParentOf(docPath);\n }\n}\n\n/**\n * A document must have a value for every ordering clause in order to show up\n * in the results.\n */\nfunction queryMatchesOrderBy(query: Query, doc: Document): boolean {\n // We must use `queryNormalizedOrderBy()` to get the list of all orderBys (both implicit and explicit).\n // Note that for OR queries, orderBy applies to all disjunction terms and implicit orderBys must\n // be taken into account. For example, the query \"a > 1 || b==1\" has an implicit \"orderBy a\" due\n // to the inequality, and is evaluated as \"a > 1 orderBy a || b==1 orderBy a\".\n // A document with content of {b:1} matches the filters, but does not match the orderBy because\n // it's missing the field 'a'.\n for (const orderBy of queryNormalizedOrderBy(query)) {\n // order-by key always matches\n if (!orderBy.field.isKeyField() && doc.data.field(orderBy.field) === null) {\n return false;\n }\n }\n return true;\n}\n\nfunction queryMatchesFilters(query: Query, doc: Document): boolean {\n for (const filter of query.filters) {\n if (!filter.matches(doc)) {\n return false;\n }\n }\n return true;\n}\n\n/** Makes sure a document is within the bounds, if provided. */\nfunction queryMatchesBounds(query: Query, doc: Document): boolean {\n if (\n query.startAt &&\n !boundSortsBeforeDocument(query.startAt, queryNormalizedOrderBy(query), doc)\n ) {\n return false;\n }\n if (\n query.endAt &&\n !boundSortsAfterDocument(query.endAt, queryNormalizedOrderBy(query), doc)\n ) {\n return false;\n }\n return true;\n}\n\n/**\n * Returns the collection group that this query targets.\n *\n * PORTING NOTE: This is only used in the Web SDK to facilitate multi-tab\n * synchronization for query results.\n */\nexport function queryCollectionGroup(query: Query): string {\n return (\n query.collectionGroup ||\n (query.path.length % 2 === 1\n ? query.path.lastSegment()\n : query.path.get(query.path.length - 2))\n );\n}\n\n/**\n * Returns a new comparator function that can be used to compare two documents\n * based on the Query's ordering constraint.\n */\nexport function newQueryComparator(\n query: Query\n): (d1: Document, d2: Document) => number {\n return (d1: Document, d2: Document): number => {\n let comparedOnKeyField = false;\n for (const orderBy of queryNormalizedOrderBy(query)) {\n const comp = compareDocs(orderBy, d1, d2);\n if (comp !== 0) {\n return comp;\n }\n comparedOnKeyField = comparedOnKeyField || orderBy.field.isKeyField();\n }\n // Assert that we actually compared by key\n debugAssert(\n comparedOnKeyField,\n \"orderBy used that doesn't compare on key field\"\n );\n return 0;\n };\n}\n\nexport function compareDocs(\n orderBy: OrderBy,\n d1: Document,\n d2: Document\n): number {\n const comparison = orderBy.field.isKeyField()\n ? DocumentKey.comparator(d1.key, d2.key)\n : compareDocumentsByField(orderBy.field, d1, d2);\n switch (orderBy.dir) {\n case Direction.ASCENDING:\n return comparison;\n case Direction.DESCENDING:\n return -1 * comparison;\n default:\n return fail('Unknown direction: ' + orderBy.dir);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { forEach, isEmpty } from './obj';\n\ntype Entry = [K, V];\n\n/**\n * A map implementation that uses objects as keys. Objects must have an\n * associated equals function and must be immutable. Entries in the map are\n * stored together with the key being produced from the mapKeyFn. This map\n * automatically handles collisions of keys.\n */\nexport class ObjectMap {\n /**\n * The inner map for a key/value pair. Due to the possibility of collisions we\n * keep a list of entries that we do a linear search through to find an actual\n * match. Note that collisions should be rare, so we still expect near\n * constant time lookups in practice.\n */\n private inner: {\n [canonicalId: string]: Array>;\n } = {};\n\n /** The number of entries stored in the map */\n private innerSize = 0;\n\n constructor(\n private mapKeyFn: (key: KeyType) => string,\n private equalsFn: (l: KeyType, r: KeyType) => boolean\n ) {}\n\n /** Get a value for this key, or undefined if it does not exist. */\n get(key: KeyType): ValueType | undefined {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n return undefined;\n }\n for (const [otherKey, value] of matches) {\n if (this.equalsFn(otherKey, key)) {\n return value;\n }\n }\n return undefined;\n }\n\n has(key: KeyType): boolean {\n return this.get(key) !== undefined;\n }\n\n /** Put this key and value in the map. */\n set(key: KeyType, value: ValueType): void {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n this.inner[id] = [[key, value]];\n this.innerSize++;\n return;\n }\n for (let i = 0; i < matches.length; i++) {\n if (this.equalsFn(matches[i][0], key)) {\n // This is updating an existing entry and does not increase `innerSize`.\n matches[i] = [key, value];\n return;\n }\n }\n matches.push([key, value]);\n this.innerSize++;\n }\n\n /**\n * Remove this key from the map. Returns a boolean if anything was deleted.\n */\n delete(key: KeyType): boolean {\n const id = this.mapKeyFn(key);\n const matches = this.inner[id];\n if (matches === undefined) {\n return false;\n }\n for (let i = 0; i < matches.length; i++) {\n if (this.equalsFn(matches[i][0], key)) {\n if (matches.length === 1) {\n delete this.inner[id];\n } else {\n matches.splice(i, 1);\n }\n this.innerSize--;\n return true;\n }\n }\n return false;\n }\n\n forEach(fn: (key: KeyType, val: ValueType) => void): void {\n forEach(this.inner, (_, entries) => {\n for (const [k, v] of entries) {\n fn(k, v);\n }\n });\n }\n\n isEmpty(): boolean {\n return isEmpty(this.inner);\n }\n\n size(): number {\n return this.innerSize;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport { OverlayedDocument } from '../local/overlayed_document';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { Document, MutableDocument } from './document';\nimport { DocumentKey } from './document_key';\nimport { Mutation } from './mutation';\nimport { Overlay } from './overlay';\n\n/** Miscellaneous collection types / constants. */\n\nexport type MutableDocumentMap = SortedMap;\nconst EMPTY_MUTABLE_DOCUMENT_MAP = new SortedMap(\n DocumentKey.comparator\n);\nexport function mutableDocumentMap(): MutableDocumentMap {\n return EMPTY_MUTABLE_DOCUMENT_MAP;\n}\n\nexport interface DocumentSizeEntries {\n documents: MutableDocumentMap;\n sizeMap: SortedMap;\n}\n\nexport type DocumentMap = SortedMap;\nconst EMPTY_DOCUMENT_MAP = new SortedMap(\n DocumentKey.comparator\n);\nexport function documentMap(...docs: Document[]): DocumentMap {\n let map = EMPTY_DOCUMENT_MAP;\n for (const doc of docs) {\n map = map.insert(doc.key, doc);\n }\n return map;\n}\n\nexport type OverlayedDocumentMap = DocumentKeyMap;\nexport function newOverlayedDocumentMap(): OverlayedDocumentMap {\n return newDocumentKeyMap();\n}\n\nexport function convertOverlayedDocumentMapToDocumentMap(\n collection: OverlayedDocumentMap\n): DocumentMap {\n let documents = EMPTY_DOCUMENT_MAP;\n collection.forEach(\n (k, v) => (documents = documents.insert(k, v.overlayedDocument))\n );\n return documents;\n}\n\nexport type OverlayMap = DocumentKeyMap;\nexport function newOverlayMap(): OverlayMap {\n return newDocumentKeyMap();\n}\n\nexport type MutationMap = DocumentKeyMap;\nexport function newMutationMap(): MutationMap {\n return newDocumentKeyMap();\n}\n\nexport type DocumentKeyMap = ObjectMap;\nexport function newDocumentKeyMap(): DocumentKeyMap {\n return new ObjectMap(\n key => key.toString(),\n (l, r) => l.isEqual(r)\n );\n}\n\nexport type DocumentVersionMap = SortedMap;\nconst EMPTY_DOCUMENT_VERSION_MAP = new SortedMap(\n DocumentKey.comparator\n);\nexport function documentVersionMap(): DocumentVersionMap {\n return EMPTY_DOCUMENT_VERSION_MAP;\n}\n\nexport type DocumentKeySet = SortedSet;\nconst EMPTY_DOCUMENT_KEY_SET = new SortedSet(DocumentKey.comparator);\nexport function documentKeySet(...keys: DocumentKey[]): DocumentKeySet {\n let set = EMPTY_DOCUMENT_KEY_SET;\n for (const key of keys) {\n set = set.add(key);\n }\n return set;\n}\n\nexport type TargetIdSet = SortedSet;\nconst EMPTY_TARGET_ID_SET = new SortedSet(primitiveComparator);\nexport function targetIdSet(): SortedSet {\n return EMPTY_TARGET_ID_SET;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { isNegativeZero, isSafeInteger } from '../util/types';\n\n/** Base interface for the Serializer implementation. */\nexport interface Serializer {\n readonly useProto3Json: boolean;\n}\n\n/**\n * Returns an DoubleValue for `value` that is encoded based the serializer's\n * `useProto3Json` setting.\n */\nexport function toDouble(serializer: Serializer, value: number): ProtoValue {\n if (serializer.useProto3Json) {\n if (isNaN(value)) {\n return { doubleValue: 'NaN' };\n } else if (value === Infinity) {\n return { doubleValue: 'Infinity' };\n } else if (value === -Infinity) {\n return { doubleValue: '-Infinity' };\n }\n }\n return { doubleValue: isNegativeZero(value) ? '-0' : value };\n}\n\n/**\n * Returns an IntegerValue for `value`.\n */\nexport function toInteger(value: number): ProtoValue {\n return { integerValue: '' + value };\n}\n\n/**\n * Returns a value for a number that's appropriate to put into a proto.\n * The return value is an IntegerValue if it can safely represent the value,\n * otherwise a DoubleValue is returned.\n */\nexport function toNumber(serializer: Serializer, value: number): ProtoValue {\n return isSafeInteger(value) ? toInteger(value) : toDouble(serializer, value);\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../lite-api/timestamp';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { Serializer, toDouble, toInteger } from '../remote/number_serializer';\nimport { debugAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport { normalizeNumber } from './normalize';\nimport { serverTimestamp } from './server_timestamps';\nimport { isArray, isInteger, isNumber, valueEquals } from './values';\n\n/** Used to represent a field transform on a mutation. */\nexport class TransformOperation {\n // Make sure that the structural type of `TransformOperation` is unique.\n // See https://github.com/microsoft/TypeScript/issues/5451\n private _ = undefined;\n}\n\n/**\n * Computes the local transform result against the provided `previousValue`,\n * optionally using the provided localWriteTime.\n */\nexport function applyTransformOperationToLocalView(\n transform: TransformOperation,\n previousValue: ProtoValue | null,\n localWriteTime: Timestamp\n): ProtoValue {\n if (transform instanceof ServerTimestampTransform) {\n return serverTimestamp(localWriteTime, previousValue);\n } else if (transform instanceof ArrayUnionTransformOperation) {\n return applyArrayUnionTransformOperation(transform, previousValue);\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return applyArrayRemoveTransformOperation(transform, previousValue);\n } else {\n debugAssert(\n transform instanceof NumericIncrementTransformOperation,\n 'Expected NumericIncrementTransformOperation but was: ' + transform\n );\n return applyNumericIncrementTransformOperationToLocalView(\n transform,\n previousValue\n );\n }\n}\n\n/**\n * Computes a final transform result after the transform has been acknowledged\n * by the server, potentially using the server-provided transformResult.\n */\nexport function applyTransformOperationToRemoteDocument(\n transform: TransformOperation,\n previousValue: ProtoValue | null,\n transformResult: ProtoValue | null\n): ProtoValue {\n // The server just sends null as the transform result for array operations,\n // so we have to calculate a result the same as we do for local\n // applications.\n if (transform instanceof ArrayUnionTransformOperation) {\n return applyArrayUnionTransformOperation(transform, previousValue);\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return applyArrayRemoveTransformOperation(transform, previousValue);\n }\n\n debugAssert(\n transformResult !== null,\n \"Didn't receive transformResult for non-array transform\"\n );\n return transformResult;\n}\n\n/**\n * If this transform operation is not idempotent, returns the base value to\n * persist for this transform. If a base value is returned, the transform\n * operation is always applied to this base value, even if document has\n * already been updated.\n *\n * Base values provide consistent behavior for non-idempotent transforms and\n * allow us to return the same latency-compensated value even if the backend\n * has already applied the transform operation. The base value is null for\n * idempotent transforms, as they can be re-played even if the backend has\n * already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent transforms.\n */\nexport function computeTransformOperationBaseValue(\n transform: TransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue | null {\n if (transform instanceof NumericIncrementTransformOperation) {\n return isNumber(previousValue) ? previousValue! : { integerValue: 0 };\n }\n return null;\n}\n\nexport function transformOperationEquals(\n left: TransformOperation,\n right: TransformOperation\n): boolean {\n if (\n left instanceof ArrayUnionTransformOperation &&\n right instanceof ArrayUnionTransformOperation\n ) {\n return arrayEquals(left.elements, right.elements, valueEquals);\n } else if (\n left instanceof ArrayRemoveTransformOperation &&\n right instanceof ArrayRemoveTransformOperation\n ) {\n return arrayEquals(left.elements, right.elements, valueEquals);\n } else if (\n left instanceof NumericIncrementTransformOperation &&\n right instanceof NumericIncrementTransformOperation\n ) {\n return valueEquals(left.operand, right.operand);\n }\n\n return (\n left instanceof ServerTimestampTransform &&\n right instanceof ServerTimestampTransform\n );\n}\n\n/** Transforms a value into a server-generated timestamp. */\nexport class ServerTimestampTransform extends TransformOperation {}\n\n/** Transforms an array value via a union operation. */\nexport class ArrayUnionTransformOperation extends TransformOperation {\n constructor(readonly elements: ProtoValue[]) {\n super();\n }\n}\n\nfunction applyArrayUnionTransformOperation(\n transform: ArrayUnionTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n const values = coercedFieldValuesArray(previousValue);\n for (const toUnion of transform.elements) {\n if (!values.some(element => valueEquals(element, toUnion))) {\n values.push(toUnion);\n }\n }\n return { arrayValue: { values } };\n}\n\n/** Transforms an array value via a remove operation. */\nexport class ArrayRemoveTransformOperation extends TransformOperation {\n constructor(readonly elements: ProtoValue[]) {\n super();\n }\n}\n\nfunction applyArrayRemoveTransformOperation(\n transform: ArrayRemoveTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n let values = coercedFieldValuesArray(previousValue);\n for (const toRemove of transform.elements) {\n values = values.filter(element => !valueEquals(element, toRemove));\n }\n return { arrayValue: { values } };\n}\n\n/**\n * Implements the backend semantics for locally computed NUMERIC_ADD (increment)\n * transforms. Converts all field values to integers or doubles, but unlike the\n * backend does not cap integer values at 2^63. Instead, JavaScript number\n * arithmetic is used and precision loss can occur for values greater than 2^53.\n */\nexport class NumericIncrementTransformOperation extends TransformOperation {\n constructor(readonly serializer: Serializer, readonly operand: ProtoValue) {\n super();\n debugAssert(\n isNumber(operand),\n 'NumericIncrementTransform transform requires a NumberValue'\n );\n }\n}\n\nexport function applyNumericIncrementTransformOperationToLocalView(\n transform: NumericIncrementTransformOperation,\n previousValue: ProtoValue | null\n): ProtoValue {\n // PORTING NOTE: Since JavaScript's integer arithmetic is limited to 53 bit\n // precision and resolves overflows by reducing precision, we do not\n // manually cap overflows at 2^63.\n const baseValue = computeTransformOperationBaseValue(\n transform,\n previousValue\n )!;\n const sum = asNumber(baseValue) + asNumber(transform.operand);\n if (isInteger(baseValue) && isInteger(transform.operand)) {\n return toInteger(sum);\n } else {\n return toDouble(transform.serializer, sum);\n }\n}\n\nfunction asNumber(value: ProtoValue): number {\n return normalizeNumber(value.integerValue || value.doubleValue);\n}\n\nfunction coercedFieldValuesArray(value: ProtoValue | null): ProtoValue[] {\n return isArray(value) && value.arrayValue.values\n ? value.arrayValue.values.slice()\n : [];\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { Timestamp } from '../lite-api/timestamp';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { Document, MutableDocument } from './document';\nimport { DocumentKey } from './document_key';\nimport { FieldMask } from './field_mask';\nimport { ObjectValue } from './object_value';\nimport { FieldPath } from './path';\nimport {\n applyTransformOperationToLocalView,\n applyTransformOperationToRemoteDocument,\n computeTransformOperationBaseValue,\n TransformOperation,\n transformOperationEquals\n} from './transform_operation';\n\n/** A field path and the TransformOperation to perform upon it. */\nexport class FieldTransform {\n constructor(\n readonly field: FieldPath,\n readonly transform: TransformOperation\n ) {}\n}\n\nexport function fieldTransformEquals(\n left: FieldTransform,\n right: FieldTransform\n): boolean {\n return (\n left.field.isEqual(right.field) &&\n transformOperationEquals(left.transform, right.transform)\n );\n}\n\nexport function fieldTransformsAreEqual(\n left?: FieldTransform[],\n right?: FieldTransform[]\n): boolean {\n if (left === undefined && right === undefined) {\n return true;\n }\n\n if (left && right) {\n return arrayEquals(left, right, (l, r) => fieldTransformEquals(l, r));\n }\n\n return false;\n}\n\n/** The result of successfully applying a mutation to the backend. */\nexport class MutationResult {\n constructor(\n /**\n * The version at which the mutation was committed:\n *\n * - For most operations, this is the updateTime in the WriteResult.\n * - For deletes, the commitTime of the WriteResponse (because deletes are\n * not stored and have no updateTime).\n *\n * Note that these versions can be different: No-op writes will not change\n * the updateTime even though the commitTime advances.\n */\n readonly version: SnapshotVersion,\n /**\n * The resulting fields returned from the backend after a mutation\n * containing field transforms has been committed. Contains one FieldValue\n * for each FieldTransform that was in the mutation.\n *\n * Will be empty if the mutation did not contain any field transforms.\n */\n readonly transformResults: Array\n ) {}\n}\n\nexport const enum MutationType {\n Set,\n Patch,\n Delete,\n Verify\n}\n\n/**\n * Encodes a precondition for a mutation. This follows the model that the\n * backend accepts with the special case of an explicit \"empty\" precondition\n * (meaning no precondition).\n */\nexport class Precondition {\n private constructor(\n readonly updateTime?: SnapshotVersion,\n readonly exists?: boolean\n ) {\n debugAssert(\n updateTime === undefined || exists === undefined,\n 'Precondition can specify \"exists\" or \"updateTime\" but not both'\n );\n }\n\n /** Creates a new empty Precondition. */\n static none(): Precondition {\n return new Precondition();\n }\n\n /** Creates a new Precondition with an exists flag. */\n static exists(exists: boolean): Precondition {\n return new Precondition(undefined, exists);\n }\n\n /** Creates a new Precondition based on a version a document exists at. */\n static updateTime(version: SnapshotVersion): Precondition {\n return new Precondition(version);\n }\n\n /** Returns whether this Precondition is empty. */\n get isNone(): boolean {\n return this.updateTime === undefined && this.exists === undefined;\n }\n\n isEqual(other: Precondition): boolean {\n return (\n this.exists === other.exists &&\n (this.updateTime\n ? !!other.updateTime && this.updateTime.isEqual(other.updateTime)\n : !other.updateTime)\n );\n }\n}\n\n/** Returns true if the preconditions is valid for the given document. */\nexport function preconditionIsValidForDocument(\n precondition: Precondition,\n document: MutableDocument\n): boolean {\n if (precondition.updateTime !== undefined) {\n return (\n document.isFoundDocument() &&\n document.version.isEqual(precondition.updateTime)\n );\n } else if (precondition.exists !== undefined) {\n return precondition.exists === document.isFoundDocument();\n } else {\n debugAssert(precondition.isNone, 'Precondition should be empty');\n return true;\n }\n}\n\n/**\n * A mutation describes a self-contained change to a document. Mutations can\n * create, replace, delete, and update subsets of documents.\n *\n * Mutations not only act on the value of the document but also its version.\n *\n * For local mutations (mutations that haven't been committed yet), we preserve\n * the existing version for Set and Patch mutations. For Delete mutations, we\n * reset the version to 0.\n *\n * Here's the expected transition table.\n *\n * MUTATION APPLIED TO RESULTS IN\n *\n * SetMutation Document(v3) Document(v3)\n * SetMutation NoDocument(v3) Document(v0)\n * SetMutation InvalidDocument(v0) Document(v0)\n * PatchMutation Document(v3) Document(v3)\n * PatchMutation NoDocument(v3) NoDocument(v3)\n * PatchMutation InvalidDocument(v0) UnknownDocument(v3)\n * DeleteMutation Document(v3) NoDocument(v0)\n * DeleteMutation NoDocument(v3) NoDocument(v0)\n * DeleteMutation InvalidDocument(v0) NoDocument(v0)\n *\n * For acknowledged mutations, we use the updateTime of the WriteResponse as\n * the resulting version for Set and Patch mutations. As deletes have no\n * explicit update time, we use the commitTime of the WriteResponse for\n * Delete mutations.\n *\n * If a mutation is acknowledged by the backend but fails the precondition check\n * locally, we transition to an `UnknownDocument` and rely on Watch to send us\n * the updated version.\n *\n * Field transforms are used only with Patch and Set Mutations. We use the\n * `updateTransforms` message to store transforms, rather than the `transforms`s\n * messages.\n *\n * ## Subclassing Notes\n *\n * Every type of mutation needs to implement its own applyToRemoteDocument() and\n * applyToLocalView() to implement the actual behavior of applying the mutation\n * to some source document (see `setMutationApplyToRemoteDocument()` for an\n * example).\n */\nexport abstract class Mutation {\n abstract readonly type: MutationType;\n abstract readonly key: DocumentKey;\n abstract readonly precondition: Precondition;\n abstract readonly fieldTransforms: FieldTransform[];\n /**\n * Returns a `FieldMask` representing the fields that will be changed by\n * applying this mutation. Returns `null` if the mutation will overwrite the\n * entire document.\n */\n abstract getFieldMask(): FieldMask | null;\n}\n\n/**\n * A utility method to calculate a `Mutation` representing the overlay from the\n * final state of the document, and a `FieldMask` representing the fields that\n * are mutated by the local mutations.\n */\nexport function calculateOverlayMutation(\n doc: MutableDocument,\n mask: FieldMask | null\n): Mutation | null {\n if (!doc.hasLocalMutations || (mask && mask!.fields.length === 0)) {\n return null;\n }\n\n // mask is null when sets or deletes are applied to the current document.\n if (mask === null) {\n if (doc.isNoDocument()) {\n return new DeleteMutation(doc.key, Precondition.none());\n } else {\n return new SetMutation(doc.key, doc.data, Precondition.none());\n }\n } else {\n const docValue = doc.data;\n const patchValue = ObjectValue.empty();\n let maskSet = new SortedSet(FieldPath.comparator);\n for (let path of mask.fields) {\n if (!maskSet.has(path)) {\n let value = docValue.field(path);\n // If we are deleting a nested field, we take the immediate parent as\n // the mask used to construct the resulting mutation.\n // Justification: Nested fields can create parent fields implicitly. If\n // only a leaf entry is deleted in later mutations, the parent field\n // should still remain, but we may have lost this information.\n // Consider mutation (foo.bar 1), then mutation (foo.bar delete()).\n // This leaves the final result (foo, {}). Despite the fact that `doc`\n // has the correct result, `foo` is not in `mask`, and the resulting\n // mutation would miss `foo`.\n if (value === null && path.length > 1) {\n path = path.popLast();\n value = docValue.field(path);\n }\n if (value === null) {\n patchValue.delete(path);\n } else {\n patchValue.set(path, value);\n }\n maskSet = maskSet.add(path);\n }\n }\n return new PatchMutation(\n doc.key,\n patchValue,\n new FieldMask(maskSet.toArray()),\n Precondition.none()\n );\n }\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing a\n * new remote document. If the input document doesn't match the expected state\n * (e.g. it is invalid or outdated), the document type may transition to\n * unknown.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param mutationResult - The result of applying the mutation from the backend.\n */\nexport function mutationApplyToRemoteDocument(\n mutation: Mutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n mutationVerifyKeyMatches(mutation, document);\n if (mutation instanceof SetMutation) {\n setMutationApplyToRemoteDocument(mutation, document, mutationResult);\n } else if (mutation instanceof PatchMutation) {\n patchMutationApplyToRemoteDocument(mutation, document, mutationResult);\n } else {\n debugAssert(\n mutation instanceof DeleteMutation,\n 'Unexpected mutation type: ' + mutation\n );\n deleteMutationApplyToRemoteDocument(mutation, document, mutationResult);\n }\n}\n\n/**\n * Applies this mutation to the given document for the purposes of computing\n * the new local view of a document. If the input document doesn't match the\n * expected state, the document is not modified.\n *\n * @param mutation - The mutation to apply.\n * @param document - The document to mutate. The input document can be an\n * invalid document if the client has no knowledge of the pre-mutation state\n * of the document.\n * @param previousMask - The fields that have been updated before applying this mutation.\n * @param localWriteTime - A timestamp indicating the local write time of the\n * batch this mutation is a part of.\n * @returns A `FieldMask` representing the fields that are changed by applying this mutation.\n */\nexport function mutationApplyToLocalView(\n mutation: Mutation,\n document: MutableDocument,\n previousMask: FieldMask | null,\n localWriteTime: Timestamp\n): FieldMask | null {\n mutationVerifyKeyMatches(mutation, document);\n\n if (mutation instanceof SetMutation) {\n return setMutationApplyToLocalView(\n mutation,\n document,\n previousMask,\n localWriteTime\n );\n } else if (mutation instanceof PatchMutation) {\n return patchMutationApplyToLocalView(\n mutation,\n document,\n previousMask,\n localWriteTime\n );\n } else {\n debugAssert(\n mutation instanceof DeleteMutation,\n 'Unexpected mutation type: ' + mutation\n );\n return deleteMutationApplyToLocalView(mutation, document, previousMask);\n }\n}\n\n/**\n * If this mutation is not idempotent, returns the base value to persist with\n * this mutation. If a base value is returned, the mutation is always applied\n * to this base value, even if document has already been updated.\n *\n * The base value is a sparse object that consists of only the document\n * fields for which this mutation contains a non-idempotent transformation\n * (e.g. a numeric increment). The provided value guarantees consistent\n * behavior for non-idempotent transforms and allow us to return the same\n * latency-compensated value even if the backend has already applied the\n * mutation. The base value is null for idempotent mutations, as they can be\n * re-played even if the backend has already applied them.\n *\n * @returns a base value to store along with the mutation, or null for\n * idempotent mutations.\n */\nexport function mutationExtractBaseValue(\n mutation: Mutation,\n document: Document\n): ObjectValue | null {\n let baseObject: ObjectValue | null = null;\n for (const fieldTransform of mutation.fieldTransforms) {\n const existingValue = document.data.field(fieldTransform.field);\n const coercedValue = computeTransformOperationBaseValue(\n fieldTransform.transform,\n existingValue || null\n );\n\n if (coercedValue != null) {\n if (baseObject === null) {\n baseObject = ObjectValue.empty();\n }\n baseObject.set(fieldTransform.field, coercedValue);\n }\n }\n return baseObject ? baseObject : null;\n}\n\nexport function mutationEquals(left: Mutation, right: Mutation): boolean {\n if (left.type !== right.type) {\n return false;\n }\n\n if (!left.key.isEqual(right.key)) {\n return false;\n }\n\n if (!left.precondition.isEqual(right.precondition)) {\n return false;\n }\n\n if (!fieldTransformsAreEqual(left.fieldTransforms, right.fieldTransforms)) {\n return false;\n }\n\n if (left.type === MutationType.Set) {\n return (left as SetMutation).value.isEqual((right as SetMutation).value);\n }\n\n if (left.type === MutationType.Patch) {\n return (\n (left as PatchMutation).data.isEqual((right as PatchMutation).data) &&\n (left as PatchMutation).fieldMask.isEqual(\n (right as PatchMutation).fieldMask\n )\n );\n }\n\n return true;\n}\n\nfunction mutationVerifyKeyMatches(\n mutation: Mutation,\n document: MutableDocument\n): void {\n debugAssert(\n document.key.isEqual(mutation.key),\n 'Can only apply a mutation to a document with the same key'\n );\n}\n\n/**\n * A mutation that creates or replaces the document at the given key with the\n * object value contents.\n */\nexport class SetMutation extends Mutation {\n constructor(\n readonly key: DocumentKey,\n readonly value: ObjectValue,\n readonly precondition: Precondition,\n readonly fieldTransforms: FieldTransform[] = []\n ) {\n super();\n }\n\n readonly type: MutationType = MutationType.Set;\n\n getFieldMask(): FieldMask | null {\n return null;\n }\n}\n\nfunction setMutationApplyToRemoteDocument(\n mutation: SetMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n // Unlike setMutationApplyToLocalView, if we're applying a mutation to a\n // remote document the server has accepted the mutation so the precondition\n // must have held.\n const newData = mutation.value.clone();\n const transformResults = serverTransformResults(\n mutation.fieldTransforms,\n document,\n mutationResult.transformResults\n );\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(mutationResult.version, newData)\n .setHasCommittedMutations();\n}\n\nfunction setMutationApplyToLocalView(\n mutation: SetMutation,\n document: MutableDocument,\n previousMask: FieldMask | null,\n localWriteTime: Timestamp\n): FieldMask | null {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n // The mutation failed to apply (e.g. a document ID created with add()\n // caused a name collision).\n return previousMask;\n }\n\n const newData = mutation.value.clone();\n const transformResults = localTransformResults(\n mutation.fieldTransforms,\n localWriteTime,\n document\n );\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(document.version, newData)\n .setHasLocalMutations();\n return null; // SetMutation overwrites all fields.\n}\n\n/**\n * A mutation that modifies fields of the document at the given key with the\n * given values. The values are applied through a field mask:\n *\n * * When a field is in both the mask and the values, the corresponding field\n * is updated.\n * * When a field is in neither the mask nor the values, the corresponding\n * field is unmodified.\n * * When a field is in the mask but not in the values, the corresponding field\n * is deleted.\n * * When a field is not in the mask but is in the values, the values map is\n * ignored.\n */\nexport class PatchMutation extends Mutation {\n constructor(\n readonly key: DocumentKey,\n readonly data: ObjectValue,\n readonly fieldMask: FieldMask,\n readonly precondition: Precondition,\n readonly fieldTransforms: FieldTransform[] = []\n ) {\n super();\n }\n\n readonly type: MutationType = MutationType.Patch;\n\n getFieldMask(): FieldMask | null {\n return this.fieldMask;\n }\n}\n\nfunction patchMutationApplyToRemoteDocument(\n mutation: PatchMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n // Since the mutation was not rejected, we know that the precondition\n // matched on the backend. We therefore must not have the expected version\n // of the document in our cache and convert to an UnknownDocument with a\n // known updateTime.\n document.convertToUnknownDocument(mutationResult.version);\n return;\n }\n\n const transformResults = serverTransformResults(\n mutation.fieldTransforms,\n document,\n mutationResult.transformResults\n );\n const newData = document.data;\n newData.setAll(getPatch(mutation));\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(mutationResult.version, newData)\n .setHasCommittedMutations();\n}\n\nfunction patchMutationApplyToLocalView(\n mutation: PatchMutation,\n document: MutableDocument,\n previousMask: FieldMask | null,\n localWriteTime: Timestamp\n): FieldMask | null {\n if (!preconditionIsValidForDocument(mutation.precondition, document)) {\n return previousMask;\n }\n\n const transformResults = localTransformResults(\n mutation.fieldTransforms,\n localWriteTime,\n document\n );\n const newData = document.data;\n newData.setAll(getPatch(mutation));\n newData.setAll(transformResults);\n document\n .convertToFoundDocument(document.version, newData)\n .setHasLocalMutations();\n\n if (previousMask === null) {\n return null;\n }\n\n return previousMask\n .unionWith(mutation.fieldMask.fields)\n .unionWith(mutation.fieldTransforms.map(transform => transform.field));\n}\n\n/**\n * Returns a FieldPath/Value map with the content of the PatchMutation.\n */\nfunction getPatch(mutation: PatchMutation): Map {\n const result = new Map();\n mutation.fieldMask.fields.forEach(fieldPath => {\n if (!fieldPath.isEmpty()) {\n const newValue = mutation.data.field(fieldPath);\n result.set(fieldPath, newValue);\n }\n });\n return result;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use after a mutation\n * containing transforms has been acknowledged by the server.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param mutableDocument - The current state of the document after applying all\n * previous mutations.\n * @param serverTransformResults - The transform results received by the server.\n * @returns The transform results list.\n */\nfunction serverTransformResults(\n fieldTransforms: FieldTransform[],\n mutableDocument: MutableDocument,\n serverTransformResults: Array\n): Map {\n const transformResults = new Map();\n hardAssert(\n fieldTransforms.length === serverTransformResults.length,\n `server transform result count (${serverTransformResults.length}) ` +\n `should match field transform count (${fieldTransforms.length})`\n );\n\n for (let i = 0; i < serverTransformResults.length; i++) {\n const fieldTransform = fieldTransforms[i];\n const transform = fieldTransform.transform;\n const previousValue = mutableDocument.data.field(fieldTransform.field);\n transformResults.set(\n fieldTransform.field,\n applyTransformOperationToRemoteDocument(\n transform,\n previousValue,\n serverTransformResults[i]\n )\n );\n }\n return transformResults;\n}\n\n/**\n * Creates a list of \"transform results\" (a transform result is a field value\n * representing the result of applying a transform) for use when applying a\n * transform locally.\n *\n * @param fieldTransforms - The field transforms to apply the result to.\n * @param localWriteTime - The local time of the mutation (used to\n * generate ServerTimestampValues).\n * @param mutableDocument - The document to apply transforms on.\n * @returns The transform results list.\n */\nfunction localTransformResults(\n fieldTransforms: FieldTransform[],\n localWriteTime: Timestamp,\n mutableDocument: MutableDocument\n): Map {\n const transformResults = new Map();\n for (const fieldTransform of fieldTransforms) {\n const transform = fieldTransform.transform;\n\n const previousValue = mutableDocument.data.field(fieldTransform.field);\n transformResults.set(\n fieldTransform.field,\n applyTransformOperationToLocalView(\n transform,\n previousValue,\n localWriteTime\n )\n );\n }\n return transformResults;\n}\n\n/** A mutation that deletes the document at the given key. */\nexport class DeleteMutation extends Mutation {\n constructor(readonly key: DocumentKey, readonly precondition: Precondition) {\n super();\n }\n\n readonly type: MutationType = MutationType.Delete;\n readonly fieldTransforms: FieldTransform[] = [];\n\n getFieldMask(): FieldMask | null {\n return null;\n }\n}\n\nfunction deleteMutationApplyToRemoteDocument(\n mutation: DeleteMutation,\n document: MutableDocument,\n mutationResult: MutationResult\n): void {\n debugAssert(\n mutationResult.transformResults.length === 0,\n 'Transform results received by DeleteMutation.'\n );\n\n // Unlike applyToLocalView, if we're applying a mutation to a remote\n // document the server has accepted the mutation so the precondition must\n // have held.\n document\n .convertToNoDocument(mutationResult.version)\n .setHasCommittedMutations();\n}\n\nfunction deleteMutationApplyToLocalView(\n mutation: DeleteMutation,\n document: MutableDocument,\n previousMask: FieldMask | null\n): FieldMask | null {\n debugAssert(\n document.key.isEqual(mutation.key),\n 'Can only apply mutation to document with same key'\n );\n if (preconditionIsValidForDocument(mutation.precondition, document)) {\n document.convertToNoDocument(document.version).setHasLocalMutations();\n return null;\n }\n return previousMask;\n}\n\n/**\n * A mutation that verifies the existence of the document at the given key with\n * the provided precondition.\n *\n * The `verify` operation is only used in Transactions, and this class serves\n * primarily to facilitate serialization into protos.\n */\nexport class VerifyMutation extends Mutation {\n constructor(readonly key: DocumentKey, readonly precondition: Precondition) {\n super();\n }\n\n readonly type: MutationType = MutationType.Verify;\n readonly fieldTransforms: FieldTransform[] = [];\n\n getFieldMask(): FieldMask | null {\n return null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { BatchId } from '../core/types';\nimport { Timestamp } from '../lite-api/timestamp';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { arrayEquals } from '../util/misc';\n\nimport {\n documentKeySet,\n DocumentKeySet,\n MutationMap,\n DocumentVersionMap,\n documentVersionMap,\n newMutationMap,\n OverlayedDocumentMap\n} from './collections';\nimport { MutableDocument } from './document';\nimport { FieldMask } from './field_mask';\nimport {\n calculateOverlayMutation,\n Mutation,\n mutationApplyToLocalView,\n mutationApplyToRemoteDocument,\n mutationEquals,\n MutationResult\n} from './mutation';\n\n/**\n * A batch of mutations that will be sent as one unit to the backend.\n */\nexport class MutationBatch {\n /**\n * @param batchId - The unique ID of this mutation batch.\n * @param localWriteTime - The original write time of this mutation.\n * @param baseMutations - Mutations that are used to populate the base\n * values when this mutation is applied locally. This can be used to locally\n * overwrite values that are persisted in the remote document cache. Base\n * mutations are never sent to the backend.\n * @param mutations - The user-provided mutations in this mutation batch.\n * User-provided mutations are applied both locally and remotely on the\n * backend.\n */\n constructor(\n public batchId: BatchId,\n public localWriteTime: Timestamp,\n public baseMutations: Mutation[],\n public mutations: Mutation[]\n ) {\n debugAssert(mutations.length > 0, 'Cannot create an empty mutation batch');\n }\n\n /**\n * Applies all the mutations in this MutationBatch to the specified document\n * to compute the state of the remote document\n *\n * @param document - The document to apply mutations to.\n * @param batchResult - The result of applying the MutationBatch to the\n * backend.\n */\n applyToRemoteDocument(\n document: MutableDocument,\n batchResult: MutationBatchResult\n ): void {\n const mutationResults = batchResult.mutationResults;\n debugAssert(\n mutationResults.length === this.mutations.length,\n `Mismatch between mutations length\n (${this.mutations.length}) and mutation results length\n (${mutationResults.length}).`\n );\n\n for (let i = 0; i < this.mutations.length; i++) {\n const mutation = this.mutations[i];\n if (mutation.key.isEqual(document.key)) {\n const mutationResult = mutationResults[i];\n mutationApplyToRemoteDocument(mutation, document, mutationResult);\n }\n }\n }\n\n /**\n * Computes the local view of a document given all the mutations in this\n * batch.\n *\n * @param document - The document to apply mutations to.\n * @param mutatedFields - Fields that have been updated before applying this mutation batch.\n * @returns A `FieldMask` representing all the fields that are mutated.\n */\n applyToLocalView(\n document: MutableDocument,\n mutatedFields: FieldMask | null\n ): FieldMask | null {\n // First, apply the base state. This allows us to apply non-idempotent\n // transform against a consistent set of values.\n for (const mutation of this.baseMutations) {\n if (mutation.key.isEqual(document.key)) {\n mutatedFields = mutationApplyToLocalView(\n mutation,\n document,\n mutatedFields,\n this.localWriteTime\n );\n }\n }\n\n // Second, apply all user-provided mutations.\n for (const mutation of this.mutations) {\n if (mutation.key.isEqual(document.key)) {\n mutatedFields = mutationApplyToLocalView(\n mutation,\n document,\n mutatedFields,\n this.localWriteTime\n );\n }\n }\n return mutatedFields;\n }\n\n /**\n * Computes the local view for all provided documents given the mutations in\n * this batch. Returns a `DocumentKey` to `Mutation` map which can be used to\n * replace all the mutation applications.\n */\n applyToLocalDocumentSet(\n documentMap: OverlayedDocumentMap,\n documentsWithoutRemoteVersion: DocumentKeySet\n ): MutationMap {\n // TODO(mrschmidt): This implementation is O(n^2). If we apply the mutations\n // directly (as done in `applyToLocalView()`), we can reduce the complexity\n // to O(n).\n const overlays = newMutationMap();\n this.mutations.forEach(m => {\n const overlayedDocument = documentMap.get(m.key)!;\n // TODO(mutabledocuments): This method should take a MutableDocumentMap\n // and we should remove this cast.\n const mutableDocument =\n overlayedDocument.overlayedDocument as MutableDocument;\n let mutatedFields = this.applyToLocalView(\n mutableDocument,\n overlayedDocument.mutatedFields\n );\n // Set mutatedFields to null if the document is only from local mutations.\n // This creates a Set or Delete mutation, instead of trying to create a\n // patch mutation as the overlay.\n mutatedFields = documentsWithoutRemoteVersion.has(m.key)\n ? null\n : mutatedFields;\n const overlay = calculateOverlayMutation(mutableDocument, mutatedFields);\n if (overlay !== null) {\n overlays.set(m.key, overlay);\n }\n\n if (!mutableDocument.isValidDocument()) {\n mutableDocument.convertToNoDocument(SnapshotVersion.min());\n }\n });\n return overlays;\n }\n\n keys(): DocumentKeySet {\n return this.mutations.reduce(\n (keys, m) => keys.add(m.key),\n documentKeySet()\n );\n }\n\n isEqual(other: MutationBatch): boolean {\n return (\n this.batchId === other.batchId &&\n arrayEquals(this.mutations, other.mutations, (l, r) =>\n mutationEquals(l, r)\n ) &&\n arrayEquals(this.baseMutations, other.baseMutations, (l, r) =>\n mutationEquals(l, r)\n )\n );\n }\n}\n\n/** The result of applying a mutation batch to the backend. */\nexport class MutationBatchResult {\n private constructor(\n readonly batch: MutationBatch,\n readonly commitVersion: SnapshotVersion,\n readonly mutationResults: MutationResult[],\n /**\n * A pre-computed mapping from each mutated document to the resulting\n * version.\n */\n readonly docVersions: DocumentVersionMap\n ) {}\n\n /**\n * Creates a new MutationBatchResult for the given batch and results. There\n * must be one result for each mutation in the batch. This static factory\n * caches a document=>version mapping (docVersions).\n */\n static from(\n batch: MutationBatch,\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n ): MutationBatchResult {\n hardAssert(\n batch.mutations.length === results.length,\n 'Mutations sent ' +\n batch.mutations.length +\n ' must equal results received ' +\n results.length\n );\n\n let versionMap = documentVersionMap();\n const mutations = batch.mutations;\n for (let i = 0; i < mutations.length; i++) {\n versionMap = versionMap.insert(mutations[i].key, results[i].version);\n }\n\n return new MutationBatchResult(batch, commitVersion, results, versionMap);\n }\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKey } from './document_key';\nimport { Mutation } from './mutation';\n\n/**\n * Representation of an overlay computed by Firestore.\n *\n * Holds information about a mutation and the largest batch id in Firestore when\n * the mutation was created.\n */\nexport class Overlay {\n constructor(readonly largestBatchId: number, readonly mutation: Mutation) {}\n\n getKey(): DocumentKey {\n return this.mutation.key;\n }\n\n isEqual(other: Overlay | null): boolean {\n return other !== null && this.mutation === other.mutation;\n }\n\n toString(): string {\n return `Overlay{\n largestBatchId: ${this.largestBatchId},\n mutation: ${this.mutation.toString()}\n }`;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BloomFilter as ProtoBloomFilter } from '../protos/firestore_proto_api';\n\nexport class ExistenceFilter {\n constructor(public count: number, public unchangedNames?: ProtoBloomFilter) {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { fail } from '../util/assert';\nimport { Code } from '../util/error';\nimport { logError } from '../util/log';\n\n/**\n * Error Codes describing the different ways GRPC can fail. These are copied\n * directly from GRPC's sources here:\n *\n * https://github.com/grpc/grpc/blob/bceec94ea4fc5f0085d81235d8e1c06798dc341a/include/grpc%2B%2B/impl/codegen/status_code_enum.h\n *\n * Important! The names of these identifiers matter because the string forms\n * are used for reverse lookups from the webchannel stream. Do NOT change the\n * names of these identifiers or change this into a const enum.\n */\nenum RpcCode {\n OK = 0,\n CANCELLED = 1,\n UNKNOWN = 2,\n INVALID_ARGUMENT = 3,\n DEADLINE_EXCEEDED = 4,\n NOT_FOUND = 5,\n ALREADY_EXISTS = 6,\n PERMISSION_DENIED = 7,\n UNAUTHENTICATED = 16,\n RESOURCE_EXHAUSTED = 8,\n FAILED_PRECONDITION = 9,\n ABORTED = 10,\n OUT_OF_RANGE = 11,\n UNIMPLEMENTED = 12,\n INTERNAL = 13,\n UNAVAILABLE = 14,\n DATA_LOSS = 15\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a non-write operation.\n *\n * See isPermanentWriteError for classifying write errors.\n */\nexport function isPermanentError(code: Code): boolean {\n switch (code) {\n case Code.OK:\n return fail('Treated status OK as error');\n case Code.CANCELLED:\n case Code.UNKNOWN:\n case Code.DEADLINE_EXCEEDED:\n case Code.RESOURCE_EXHAUSTED:\n case Code.INTERNAL:\n case Code.UNAVAILABLE:\n // Unauthenticated means something went wrong with our token and we need\n // to retry with new credentials which will happen automatically.\n case Code.UNAUTHENTICATED:\n return false;\n case Code.INVALID_ARGUMENT:\n case Code.NOT_FOUND:\n case Code.ALREADY_EXISTS:\n case Code.PERMISSION_DENIED:\n case Code.FAILED_PRECONDITION:\n // Aborted might be retried in some scenarios, but that is dependent on\n // the context and should handled individually by the calling code.\n // See https://cloud.google.com/apis/design/errors.\n case Code.ABORTED:\n case Code.OUT_OF_RANGE:\n case Code.UNIMPLEMENTED:\n case Code.DATA_LOSS:\n return true;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Determines whether an error code represents a permanent error when received\n * in response to a write operation.\n *\n * Write operations must be handled specially because as of b/119437764, ABORTED\n * errors on the write stream should be retried too (even though ABORTED errors\n * are not generally retryable).\n *\n * Note that during the initial handshake on the write stream an ABORTED error\n * signals that we should discard our stream token (i.e. it is permanent). This\n * means a handshake error should be classified with isPermanentError, above.\n */\nexport function isPermanentWriteError(code: Code): boolean {\n return isPermanentError(code) && code !== Code.ABORTED;\n}\n\n/**\n * Maps an error Code from a GRPC status identifier like 'NOT_FOUND'.\n *\n * @returns The Code equivalent to the given status string or undefined if\n * there is no match.\n */\nexport function mapCodeFromRpcStatus(status: string): Code | undefined {\n // lookup by string\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const code: RpcCode = RpcCode[status as any] as any;\n if (code === undefined) {\n return undefined;\n }\n\n return mapCodeFromRpcCode(code);\n}\n\n/**\n * Maps an error Code from GRPC status code number, like 0, 1, or 14. These\n * are not the same as HTTP status codes.\n *\n * @returns The Code equivalent to the given GRPC status code. Fails if there\n * is no match.\n */\nexport function mapCodeFromRpcCode(code: number | undefined): Code {\n if (code === undefined) {\n // This shouldn't normally happen, but in certain error cases (like trying\n // to send invalid proto messages) we may get an error with no GRPC code.\n logError('GRPC error has no .code');\n return Code.UNKNOWN;\n }\n\n switch (code) {\n case RpcCode.OK:\n return Code.OK;\n case RpcCode.CANCELLED:\n return Code.CANCELLED;\n case RpcCode.UNKNOWN:\n return Code.UNKNOWN;\n case RpcCode.DEADLINE_EXCEEDED:\n return Code.DEADLINE_EXCEEDED;\n case RpcCode.RESOURCE_EXHAUSTED:\n return Code.RESOURCE_EXHAUSTED;\n case RpcCode.INTERNAL:\n return Code.INTERNAL;\n case RpcCode.UNAVAILABLE:\n return Code.UNAVAILABLE;\n case RpcCode.UNAUTHENTICATED:\n return Code.UNAUTHENTICATED;\n case RpcCode.INVALID_ARGUMENT:\n return Code.INVALID_ARGUMENT;\n case RpcCode.NOT_FOUND:\n return Code.NOT_FOUND;\n case RpcCode.ALREADY_EXISTS:\n return Code.ALREADY_EXISTS;\n case RpcCode.PERMISSION_DENIED:\n return Code.PERMISSION_DENIED;\n case RpcCode.FAILED_PRECONDITION:\n return Code.FAILED_PRECONDITION;\n case RpcCode.ABORTED:\n return Code.ABORTED;\n case RpcCode.OUT_OF_RANGE:\n return Code.OUT_OF_RANGE;\n case RpcCode.UNIMPLEMENTED:\n return Code.UNIMPLEMENTED;\n case RpcCode.DATA_LOSS:\n return Code.DATA_LOSS;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Maps an RPC code from a Code. This is the reverse operation from\n * mapCodeFromRpcCode and should really only be used in tests.\n */\nexport function mapRpcCodeFromCode(code: Code | undefined): number {\n if (code === undefined) {\n return RpcCode.OK;\n }\n\n switch (code) {\n case Code.OK:\n return RpcCode.OK;\n case Code.CANCELLED:\n return RpcCode.CANCELLED;\n case Code.UNKNOWN:\n return RpcCode.UNKNOWN;\n case Code.DEADLINE_EXCEEDED:\n return RpcCode.DEADLINE_EXCEEDED;\n case Code.RESOURCE_EXHAUSTED:\n return RpcCode.RESOURCE_EXHAUSTED;\n case Code.INTERNAL:\n return RpcCode.INTERNAL;\n case Code.UNAVAILABLE:\n return RpcCode.UNAVAILABLE;\n case Code.UNAUTHENTICATED:\n return RpcCode.UNAUTHENTICATED;\n case Code.INVALID_ARGUMENT:\n return RpcCode.INVALID_ARGUMENT;\n case Code.NOT_FOUND:\n return RpcCode.NOT_FOUND;\n case Code.ALREADY_EXISTS:\n return RpcCode.ALREADY_EXISTS;\n case Code.PERMISSION_DENIED:\n return RpcCode.PERMISSION_DENIED;\n case Code.FAILED_PRECONDITION:\n return RpcCode.FAILED_PRECONDITION;\n case Code.ABORTED:\n return RpcCode.ABORTED;\n case Code.OUT_OF_RANGE:\n return RpcCode.OUT_OF_RANGE;\n case Code.UNIMPLEMENTED:\n return RpcCode.UNIMPLEMENTED;\n case Code.DATA_LOSS:\n return RpcCode.DATA_LOSS;\n default:\n return fail('Unknown status code: ' + code);\n }\n}\n\n/**\n * Converts an HTTP Status Code to the equivalent error code.\n *\n * @param status - An HTTP Status Code, like 200, 404, 503, etc.\n * @returns The equivalent Code. Unknown status codes are mapped to\n * Code.UNKNOWN.\n */\nexport function mapCodeFromHttpStatus(status?: number): Code {\n if (status === undefined) {\n logError('RPC_ERROR', 'HTTP error has no status');\n return Code.UNKNOWN;\n }\n\n // The canonical error codes for Google APIs [1] specify mapping onto HTTP\n // status codes but the mapping is not bijective. In each case of ambiguity\n // this function chooses a primary error.\n //\n // [1]\n // https://github.com/googleapis/googleapis/blob/master/google/rpc/code.proto\n switch (status) {\n case 200: // OK\n return Code.OK;\n\n case 400: // Bad Request\n return Code.FAILED_PRECONDITION;\n // Other possibilities based on the forward mapping\n // return Code.INVALID_ARGUMENT;\n // return Code.OUT_OF_RANGE;\n\n case 401: // Unauthorized\n return Code.UNAUTHENTICATED;\n\n case 403: // Forbidden\n return Code.PERMISSION_DENIED;\n\n case 404: // Not Found\n return Code.NOT_FOUND;\n\n case 409: // Conflict\n return Code.ABORTED;\n // Other possibilities:\n // return Code.ALREADY_EXISTS;\n\n case 416: // Range Not Satisfiable\n return Code.OUT_OF_RANGE;\n\n case 429: // Too Many Requests\n return Code.RESOURCE_EXHAUSTED;\n\n case 499: // Client Closed Request\n return Code.CANCELLED;\n\n case 500: // Internal Server Error\n return Code.UNKNOWN;\n // Other possibilities:\n // return Code.INTERNAL;\n // return Code.DATA_LOSS;\n\n case 501: // Unimplemented\n return Code.UNIMPLEMENTED;\n\n case 503: // Service Unavailable\n return Code.UNAVAILABLE;\n\n case 504: // Gateway Timeout\n return Code.DEADLINE_EXCEEDED;\n\n default:\n if (status >= 200 && status < 300) {\n return Code.OK;\n }\n if (status >= 400 && status < 500) {\n return Code.FAILED_PRECONDITION;\n }\n if (status >= 500 && status < 600) {\n return Code.INTERNAL;\n }\n return Code.UNKNOWN;\n }\n}\n\n/**\n * Converts an HTTP response's error status to the equivalent error code.\n *\n * @param status - An HTTP error response status (\"FAILED_PRECONDITION\",\n * \"UNKNOWN\", etc.)\n * @returns The equivalent Code. Non-matching responses are mapped to\n * Code.UNKNOWN.\n */\nexport function mapCodeFromHttpResponseErrorStatus(status: string): Code {\n const serverError = status.toLowerCase().replace(/_/g, '-');\n return Object.values(Code).indexOf(serverError as Code) >= 0\n ? (serverError as Code)\n : Code.UNKNOWN;\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The global, singleton instance of TestingHooksSpi.\n *\n * This variable will be `null` in all cases _except_ when running from\n * integration tests that have registered callbacks to be notified of events\n * that happen during the test execution.\n */\nexport let testingHooksSpi: TestingHooksSpi | null = null;\n\n/**\n * Sets the value of the `testingHooksSpi` object.\n * @param instance the instance to set.\n */\nexport function setTestingHooksSpi(instance: TestingHooksSpi): void {\n if (testingHooksSpi) {\n throw new Error('a TestingHooksSpi instance is already set');\n }\n testingHooksSpi = instance;\n}\n\n/**\n * The \"service provider interface\" for the testing hooks.\n *\n * The implementation of this object will handle the callbacks made by the SDK\n * to be handled by the integration tests.\n *\n * This \"SPI\" is separated from the implementation to avoid import cycles and\n * to enable production builds to fully tree-shake away the testing hooks logic.\n */\nexport interface TestingHooksSpi {\n /**\n * Invokes all callbacks registered with\n * `TestingHooks.onExistenceFilterMismatch()` with the given info.\n */\n notifyOnExistenceFilterMismatch(info: ExistenceFilterMismatchInfo): void;\n}\n\n/**\n * Information about an existence filter mismatch.\n * @internal\n */\nexport interface ExistenceFilterMismatchInfo {\n /** The number of documents that matched the query in the local cache. */\n localCacheCount: number;\n\n /**\n * The number of documents that matched the query on the server, as specified\n * in the ExistenceFilter message's `count` field.\n */\n existenceFilterCount: number;\n\n /**\n * The projectId used when checking documents for membership in the bloom\n * filter.\n */\n projectId: string;\n\n /**\n * The databaseId used when checking documents for membership in the bloom\n * filter.\n */\n databaseId: string;\n\n /**\n * Information about the bloom filter provided by Watch in the ExistenceFilter\n * message's `unchangedNames` field. If this property is omitted or undefined\n * then that means that Watch did _not_ provide a bloom filter.\n */\n bloomFilter?: {\n /**\n * Whether a full requery was averted by using the bloom filter. If false,\n * then something happened, such as a false positive, to prevent using the\n * bloom filter to avoid a full requery.\n */\n applied: boolean;\n\n /** The number of hash functions used in the bloom filter. */\n hashCount: number;\n\n /** The number of bytes in the bloom filter's bitmask. */\n bitmapLength: number;\n\n /** The number of bits of padding in the last byte of the bloom filter. */\n padding: number;\n\n /**\n * Tests the given string for membership in the bloom filter created from\n * the existence filter; will be undefined if creating the bloom filter\n * failed.\n */\n mightContain?: (value: string) => boolean;\n };\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * An instance of the Platform's 'TextEncoder' implementation.\n */\nexport function newTextEncoder(): TextEncoder {\n return new TextEncoder();\n}\n\n/**\n * An instance of the Platform's 'TextDecoder' implementation.\n */\nexport function newTextDecoder(): TextDecoder {\n return new TextDecoder('utf-8');\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Md5, Integer } from '@firebase/webchannel-wrapper/bloom-blob';\n\nimport { newTextEncoder } from '../platform/text_serializer';\n\nconst MAX_64_BIT_UNSIGNED_INTEGER = new Integer([0xffffffff, 0xffffffff], 0);\n\n// Hash a string using md5 hashing algorithm.\nfunction getMd5HashValue(value: string): Uint8Array {\n const encodedValue = newTextEncoder().encode(value);\n const md5 = new Md5();\n md5.update(encodedValue);\n return new Uint8Array(md5.digest());\n}\n\n// Interpret the 16 bytes array as two 64-bit unsigned integers, encoded using\n// 2’s complement using little endian.\nfunction get64BitUints(Bytes: Uint8Array): [Integer, Integer] {\n const dataView = new DataView(Bytes.buffer);\n const chunk1 = dataView.getUint32(0, /* littleEndian= */ true);\n const chunk2 = dataView.getUint32(4, /* littleEndian= */ true);\n const chunk3 = dataView.getUint32(8, /* littleEndian= */ true);\n const chunk4 = dataView.getUint32(12, /* littleEndian= */ true);\n const integer1 = new Integer([chunk1, chunk2], 0);\n const integer2 = new Integer([chunk3, chunk4], 0);\n return [integer1, integer2];\n}\n\nexport class BloomFilter {\n readonly bitCount: number;\n private readonly bitCountInInteger: Integer;\n\n constructor(\n readonly bitmap: Uint8Array,\n readonly padding: number,\n readonly hashCount: number\n ) {\n if (padding < 0 || padding >= 8) {\n throw new BloomFilterError(`Invalid padding: ${padding}`);\n }\n\n if (hashCount < 0) {\n throw new BloomFilterError(`Invalid hash count: ${hashCount}`);\n }\n\n if (bitmap.length > 0 && this.hashCount === 0) {\n // Only empty bloom filter can have 0 hash count.\n throw new BloomFilterError(`Invalid hash count: ${hashCount}`);\n }\n\n if (bitmap.length === 0 && padding !== 0) {\n // Empty bloom filter should have 0 padding.\n throw new BloomFilterError(\n `Invalid padding when bitmap length is 0: ${padding}`\n );\n }\n\n this.bitCount = bitmap.length * 8 - padding;\n // Set the bit count in Integer to avoid repetition in mightContain().\n this.bitCountInInteger = Integer.fromNumber(this.bitCount);\n }\n\n // Calculate the ith hash value based on the hashed 64bit integers,\n // and calculate its corresponding bit index in the bitmap to be checked.\n private getBitIndex(num1: Integer, num2: Integer, hashIndex: number): number {\n // Calculate hashed value h(i) = h1 + (i * h2).\n let hashValue = num1.add(num2.multiply(Integer.fromNumber(hashIndex)));\n // Wrap if hash value overflow 64bit.\n if (hashValue.compare(MAX_64_BIT_UNSIGNED_INTEGER) === 1) {\n hashValue = new Integer([hashValue.getBits(0), hashValue.getBits(1)], 0);\n }\n return hashValue.modulo(this.bitCountInInteger).toNumber();\n }\n\n // Return whether the bit on the given index in the bitmap is set to 1.\n private isBitSet(index: number): boolean {\n // To retrieve bit n, calculate: (bitmap[n / 8] & (0x01 << (n % 8))).\n const byte = this.bitmap[Math.floor(index / 8)];\n const offset = index % 8;\n return (byte & (0x01 << offset)) !== 0;\n }\n\n mightContain(value: string): boolean {\n // Empty bitmap should always return false on membership check.\n if (this.bitCount === 0) {\n return false;\n }\n const md5HashedValue = getMd5HashValue(value);\n const [hash1, hash2] = get64BitUints(md5HashedValue);\n for (let i = 0; i < this.hashCount; i++) {\n const index = this.getBitIndex(hash1, hash2, i);\n if (!this.isBitSet(index)) {\n return false;\n }\n }\n return true;\n }\n\n /** Create bloom filter for testing purposes only. */\n static create(\n bitCount: number,\n hashCount: number,\n contains: string[]\n ): BloomFilter {\n const padding = bitCount % 8 === 0 ? 0 : 8 - (bitCount % 8);\n const bitmap = new Uint8Array(Math.ceil(bitCount / 8));\n const bloomFilter = new BloomFilter(bitmap, padding, hashCount);\n contains.forEach(item => bloomFilter.insert(item));\n return bloomFilter;\n }\n\n private insert(value: string): void {\n if (this.bitCount === 0) {\n return;\n }\n\n const md5HashedValue = getMd5HashValue(value);\n const [hash1, hash2] = get64BitUints(md5HashedValue);\n for (let i = 0; i < this.hashCount; i++) {\n const index = this.getBitIndex(hash1, hash2, i);\n this.setBit(index);\n }\n }\n\n private setBit(index: number): void {\n const indexOfByte = Math.floor(index / 8);\n const offset = index % 8;\n this.bitmap[indexOfByte] |= 0x01 << offset;\n }\n}\n\nexport class BloomFilterError extends Error {\n readonly name = 'BloomFilterError';\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport { TargetPurpose } from '../local/target_data';\nimport {\n documentKeySet,\n DocumentKeySet,\n mutableDocumentMap,\n MutableDocumentMap\n} from '../model/collections';\nimport { ByteString } from '../util/byte_string';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\n\n/**\n * An event from the RemoteStore. It is split into targetChanges (changes to the\n * state or the set of documents in our watched targets) and documentUpdates\n * (changes to the actual documents).\n */\nexport class RemoteEvent {\n constructor(\n /**\n * The snapshot version this event brings us up to, or MIN if not set.\n */\n readonly snapshotVersion: SnapshotVersion,\n /**\n * A map from target to changes to the target. See TargetChange.\n */\n readonly targetChanges: Map,\n /**\n * A map of targets that is known to be inconsistent, and the purpose for\n * re-listening. Listens for these targets should be re-established without\n * resume tokens.\n */\n readonly targetMismatches: SortedMap,\n /**\n * A set of which documents have changed or been deleted, along with the\n * doc's new values (if not deleted).\n */\n readonly documentUpdates: MutableDocumentMap,\n /**\n * A set of which document updates are due only to limbo resolution targets.\n */\n readonly resolvedLimboDocuments: DocumentKeySet\n ) {}\n\n /**\n * HACK: Views require RemoteEvents in order to determine whether the view is\n * CURRENT, but secondary tabs don't receive remote events. So this method is\n * used to create a synthesized RemoteEvent that can be used to apply a\n * CURRENT status change to a View, for queries executed in a different tab.\n */\n // PORTING NOTE: Multi-tab only\n static createSynthesizedRemoteEventForCurrentChange(\n targetId: TargetId,\n current: boolean,\n resumeToken: ByteString\n ): RemoteEvent {\n const targetChanges = new Map();\n targetChanges.set(\n targetId,\n TargetChange.createSynthesizedTargetChangeForCurrentChange(\n targetId,\n current,\n resumeToken\n )\n );\n return new RemoteEvent(\n SnapshotVersion.min(),\n targetChanges,\n new SortedMap(primitiveComparator),\n mutableDocumentMap(),\n documentKeySet()\n );\n }\n}\n\n/**\n * A TargetChange specifies the set of changes for a specific target as part of\n * a RemoteEvent. These changes track which documents are added, modified or\n * removed, as well as the target's resume token and whether the target is\n * marked CURRENT.\n * The actual changes *to* documents are not part of the TargetChange since\n * documents may be part of multiple targets.\n */\nexport class TargetChange {\n constructor(\n /**\n * An opaque, server-assigned token that allows watching a query to be resumed\n * after disconnecting without retransmitting all the data that matches the\n * query. The resume token essentially identifies a point in time from which\n * the server should resume sending results.\n */\n readonly resumeToken: ByteString,\n /**\n * The \"current\" (synced) status of this target. Note that \"current\"\n * has special meaning in the RPC protocol that implies that a target is\n * both up-to-date and consistent with the rest of the watch stream.\n */\n readonly current: boolean,\n /**\n * The set of documents that were newly assigned to this target as part of\n * this remote event.\n */\n readonly addedDocuments: DocumentKeySet,\n /**\n * The set of documents that were already assigned to this target but received\n * an update during this remote event.\n */\n readonly modifiedDocuments: DocumentKeySet,\n /**\n * The set of documents that were removed from this target as part of this\n * remote event.\n */\n readonly removedDocuments: DocumentKeySet\n ) {}\n\n /**\n * This method is used to create a synthesized TargetChanges that can be used to\n * apply a CURRENT status change to a View (for queries executed in a different\n * tab) or for new queries (to raise snapshots with correct CURRENT status).\n */\n static createSynthesizedTargetChangeForCurrentChange(\n targetId: TargetId,\n current: boolean,\n resumeToken: ByteString\n ): TargetChange {\n return new TargetChange(\n resumeToken,\n current,\n documentKeySet(),\n documentKeySet(),\n documentKeySet()\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseId } from '../core/database_info';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { targetIsDocumentTarget } from '../core/target';\nimport { TargetId } from '../core/types';\nimport { ChangeType } from '../core/view_snapshot';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport {\n documentKeySet,\n DocumentKeySet,\n mutableDocumentMap\n} from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { normalizeByteString } from '../model/normalize';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { Base64DecodeError } from '../util/base64_decode_error';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport {\n testingHooksSpi,\n ExistenceFilterMismatchInfo as TestingHooksExistenceFilterMismatchInfo\n} from '../util/testing_hooks_spi';\n\nimport { BloomFilter, BloomFilterError } from './bloom_filter';\nimport { ExistenceFilter } from './existence_filter';\nimport { RemoteEvent, TargetChange } from './remote_event';\n\n/**\n * Internal representation of the watcher API protocol buffers.\n */\nexport type WatchChange =\n | DocumentWatchChange\n | WatchTargetChange\n | ExistenceFilterChange;\n\n/**\n * Represents a changed document and a list of target ids to which this change\n * applies.\n *\n * If document has been deleted NoDocument will be provided.\n */\nexport class DocumentWatchChange {\n constructor(\n /** The new document applies to all of these targets. */\n public updatedTargetIds: TargetId[],\n /** The new document is removed from all of these targets. */\n public removedTargetIds: TargetId[],\n /** The key of the document for this change. */\n public key: DocumentKey,\n /**\n * The new document or NoDocument if it was deleted. Is null if the\n * document went out of view without the server sending a new document.\n */\n public newDoc: MutableDocument | null\n ) {}\n}\n\nexport class ExistenceFilterChange {\n constructor(\n public targetId: TargetId,\n public existenceFilter: ExistenceFilter\n ) {}\n}\n\nexport const enum WatchTargetChangeState {\n NoChange,\n Added,\n Removed,\n Current,\n Reset\n}\n\nconst enum BloomFilterApplicationStatus {\n Success,\n Skipped,\n FalsePositive\n}\nexport class WatchTargetChange {\n constructor(\n /** What kind of change occurred to the watch target. */\n public state: WatchTargetChangeState,\n /** The target IDs that were added/removed/set. */\n public targetIds: TargetId[],\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n public resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING,\n /** An RPC error indicating why the watch failed. */\n public cause: FirestoreError | null = null\n ) {}\n}\n\n/** Tracks the internal state of a Watch target. */\nclass TargetState {\n /**\n * The number of pending responses (adds or removes) that we are waiting on.\n * We only consider targets active that have no pending responses.\n */\n private pendingResponses = 0;\n\n /**\n * Keeps track of the document changes since the last raised snapshot.\n *\n * These changes are continuously updated as we receive document updates and\n * always reflect the current set of changes against the last issued snapshot.\n */\n private documentChanges: SortedMap =\n snapshotChangesMap();\n\n /** See public getters for explanations of these fields. */\n private _resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING;\n private _current = false;\n\n /**\n * Whether this target state should be included in the next snapshot. We\n * initialize to true so that newly-added targets are included in the next\n * RemoteEvent.\n */\n private _hasPendingChanges = true;\n\n /**\n * Whether this target has been marked 'current'.\n *\n * 'Current' has special meaning in the RPC protocol: It implies that the\n * Watch backend has sent us all changes up to the point at which the target\n * was added and that the target is consistent with the rest of the watch\n * stream.\n */\n get current(): boolean {\n return this._current;\n }\n\n /** The last resume token sent to us for this target. */\n get resumeToken(): ByteString {\n return this._resumeToken;\n }\n\n /** Whether this target has pending target adds or target removes. */\n get isPending(): boolean {\n return this.pendingResponses !== 0;\n }\n\n /** Whether we have modified any state that should trigger a snapshot. */\n get hasPendingChanges(): boolean {\n return this._hasPendingChanges;\n }\n\n /**\n * Applies the resume token to the TargetChange, but only when it has a new\n * value. Empty resumeTokens are discarded.\n */\n updateResumeToken(resumeToken: ByteString): void {\n if (resumeToken.approximateByteSize() > 0) {\n this._hasPendingChanges = true;\n this._resumeToken = resumeToken;\n }\n }\n\n /**\n * Creates a target change from the current set of changes.\n *\n * To reset the document changes after raising this snapshot, call\n * `clearPendingChanges()`.\n */\n toTargetChange(): TargetChange {\n let addedDocuments = documentKeySet();\n let modifiedDocuments = documentKeySet();\n let removedDocuments = documentKeySet();\n\n this.documentChanges.forEach((key, changeType) => {\n switch (changeType) {\n case ChangeType.Added:\n addedDocuments = addedDocuments.add(key);\n break;\n case ChangeType.Modified:\n modifiedDocuments = modifiedDocuments.add(key);\n break;\n case ChangeType.Removed:\n removedDocuments = removedDocuments.add(key);\n break;\n default:\n fail('Encountered invalid change type: ' + changeType);\n }\n });\n\n return new TargetChange(\n this._resumeToken,\n this._current,\n addedDocuments,\n modifiedDocuments,\n removedDocuments\n );\n }\n\n /**\n * Resets the document changes and sets `hasPendingChanges` to false.\n */\n clearPendingChanges(): void {\n this._hasPendingChanges = false;\n this.documentChanges = snapshotChangesMap();\n }\n\n addDocumentChange(key: DocumentKey, changeType: ChangeType): void {\n this._hasPendingChanges = true;\n this.documentChanges = this.documentChanges.insert(key, changeType);\n }\n\n removeDocumentChange(key: DocumentKey): void {\n this._hasPendingChanges = true;\n this.documentChanges = this.documentChanges.remove(key);\n }\n\n recordPendingTargetRequest(): void {\n this.pendingResponses += 1;\n }\n\n recordTargetResponse(): void {\n this.pendingResponses -= 1;\n hardAssert(\n this.pendingResponses >= 0,\n '`pendingResponses` is less than 0. Actual value: ' +\n this.pendingResponses +\n '. This indicates that the SDK received more target acks from the ' +\n 'server than expected. The SDK should not continue to operate.'\n );\n }\n\n markCurrent(): void {\n this._hasPendingChanges = true;\n this._current = true;\n }\n}\n\n/**\n * Interface implemented by RemoteStore to expose target metadata to the\n * WatchChangeAggregator.\n */\nexport interface TargetMetadataProvider {\n /**\n * Returns the set of remote document keys for the given target ID as of the\n * last raised snapshot.\n */\n getRemoteKeysForTarget(targetId: TargetId): DocumentKeySet;\n\n /**\n * Returns the TargetData for an active target ID or 'null' if this target\n * has become inactive\n */\n getTargetDataForTarget(targetId: TargetId): TargetData | null;\n\n /**\n * Returns the database ID of the Firestore instance.\n */\n getDatabaseId(): DatabaseId;\n}\n\nconst LOG_TAG = 'WatchChangeAggregator';\n\n/**\n * A helper class to accumulate watch changes into a RemoteEvent.\n */\nexport class WatchChangeAggregator {\n constructor(private metadataProvider: TargetMetadataProvider) {}\n\n /** The internal state of all tracked targets. */\n private targetStates = new Map();\n\n /** Keeps track of the documents to update since the last raised snapshot. */\n private pendingDocumentUpdates = mutableDocumentMap();\n\n /** A mapping of document keys to their set of target IDs. */\n private pendingDocumentTargetMapping = documentTargetMap();\n\n /**\n * A map of targets with existence filter mismatches. These targets are\n * known to be inconsistent and their listens needs to be re-established by\n * RemoteStore.\n */\n private pendingTargetResets = new SortedMap(\n primitiveComparator\n );\n\n /**\n * Processes and adds the DocumentWatchChange to the current set of changes.\n */\n handleDocumentChange(docChange: DocumentWatchChange): void {\n for (const targetId of docChange.updatedTargetIds) {\n if (docChange.newDoc && docChange.newDoc.isFoundDocument()) {\n this.addDocumentToTarget(targetId, docChange.newDoc);\n } else {\n this.removeDocumentFromTarget(\n targetId,\n docChange.key,\n docChange.newDoc\n );\n }\n }\n\n for (const targetId of docChange.removedTargetIds) {\n this.removeDocumentFromTarget(targetId, docChange.key, docChange.newDoc);\n }\n }\n\n /** Processes and adds the WatchTargetChange to the current set of changes. */\n handleTargetChange(targetChange: WatchTargetChange): void {\n this.forEachTarget(targetChange, targetId => {\n const targetState = this.ensureTargetState(targetId);\n switch (targetChange.state) {\n case WatchTargetChangeState.NoChange:\n if (this.isActiveTarget(targetId)) {\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n case WatchTargetChangeState.Added:\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n targetState.recordTargetResponse();\n if (!targetState.isPending) {\n // We have a freshly added target, so we need to reset any state\n // that we had previously. This can happen e.g. when remove and add\n // back a target for existence filter mismatches.\n targetState.clearPendingChanges();\n }\n targetState.updateResumeToken(targetChange.resumeToken);\n break;\n case WatchTargetChangeState.Removed:\n // We need to keep track of removed targets to we can post-filter and\n // remove any target changes.\n // We need to decrement the number of pending acks needed from watch\n // for this targetId.\n targetState.recordTargetResponse();\n if (!targetState.isPending) {\n this.removeTarget(targetId);\n }\n debugAssert(\n !targetChange.cause,\n 'WatchChangeAggregator does not handle errored targets'\n );\n break;\n case WatchTargetChangeState.Current:\n if (this.isActiveTarget(targetId)) {\n targetState.markCurrent();\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n case WatchTargetChangeState.Reset:\n if (this.isActiveTarget(targetId)) {\n // Reset the target and synthesizes removes for all existing\n // documents. The backend will re-add any documents that still\n // match the target before it sends the next global snapshot.\n this.resetTarget(targetId);\n targetState.updateResumeToken(targetChange.resumeToken);\n }\n break;\n default:\n fail('Unknown target watch change state: ' + targetChange.state);\n }\n });\n }\n\n /**\n * Iterates over all targetIds that the watch change applies to: either the\n * targetIds explicitly listed in the change or the targetIds of all currently\n * active targets.\n */\n forEachTarget(\n targetChange: WatchTargetChange,\n fn: (targetId: TargetId) => void\n ): void {\n if (targetChange.targetIds.length > 0) {\n targetChange.targetIds.forEach(fn);\n } else {\n this.targetStates.forEach((_, targetId) => {\n if (this.isActiveTarget(targetId)) {\n fn(targetId);\n }\n });\n }\n }\n\n /**\n * Handles existence filters and synthesizes deletes for filter mismatches.\n * Targets that are invalidated by filter mismatches are added to\n * `pendingTargetResets`.\n */\n handleExistenceFilter(watchChange: ExistenceFilterChange): void {\n const targetId = watchChange.targetId;\n const expectedCount = watchChange.existenceFilter.count;\n\n const targetData = this.targetDataForActiveTarget(targetId);\n if (targetData) {\n const target = targetData.target;\n if (targetIsDocumentTarget(target)) {\n if (expectedCount === 0) {\n // The existence filter told us the document does not exist. We deduce\n // that this document does not exist and apply a deleted document to\n // our updates. Without applying this deleted document there might be\n // another query that will raise this document as part of a snapshot\n // until it is resolved, essentially exposing inconsistency between\n // queries.\n const key = new DocumentKey(target.path);\n this.removeDocumentFromTarget(\n targetId,\n key,\n MutableDocument.newNoDocument(key, SnapshotVersion.min())\n );\n } else {\n hardAssert(\n expectedCount === 1,\n 'Single document existence filter with count: ' + expectedCount\n );\n }\n } else {\n const currentSize = this.getCurrentDocumentCountForTarget(targetId);\n // Existence filter mismatch. Mark the documents as being in limbo, and\n // raise a snapshot with `isFromCache:true`.\n if (currentSize !== expectedCount) {\n // Apply bloom filter to identify and mark removed documents.\n const bloomFilter = this.parseBloomFilter(watchChange);\n const status = bloomFilter\n ? this.applyBloomFilter(bloomFilter, watchChange, currentSize)\n : BloomFilterApplicationStatus.Skipped;\n\n if (status !== BloomFilterApplicationStatus.Success) {\n // If bloom filter application fails, we reset the mapping and\n // trigger re-run of the query.\n this.resetTarget(targetId);\n\n const purpose: TargetPurpose =\n status === BloomFilterApplicationStatus.FalsePositive\n ? TargetPurpose.ExistenceFilterMismatchBloom\n : TargetPurpose.ExistenceFilterMismatch;\n this.pendingTargetResets = this.pendingTargetResets.insert(\n targetId,\n purpose\n );\n }\n testingHooksSpi?.notifyOnExistenceFilterMismatch(\n createExistenceFilterMismatchInfoForTestingHooks(\n currentSize,\n watchChange.existenceFilter,\n this.metadataProvider.getDatabaseId(),\n bloomFilter,\n status\n )\n );\n }\n }\n }\n }\n\n /**\n * Parse the bloom filter from the \"unchanged_names\" field of an existence\n * filter.\n */\n private parseBloomFilter(\n watchChange: ExistenceFilterChange\n ): BloomFilter | null {\n const unchangedNames = watchChange.existenceFilter.unchangedNames;\n if (!unchangedNames || !unchangedNames.bits) {\n return null;\n }\n\n const {\n bits: { bitmap = '', padding = 0 },\n hashCount = 0\n } = unchangedNames;\n\n let normalizedBitmap: Uint8Array;\n try {\n normalizedBitmap = normalizeByteString(bitmap).toUint8Array();\n } catch (err) {\n if (err instanceof Base64DecodeError) {\n logWarn(\n 'Decoding the base64 bloom filter in existence filter failed (' +\n err.message +\n '); ignoring the bloom filter and falling back to full re-query.'\n );\n return null;\n } else {\n throw err;\n }\n }\n\n let bloomFilter: BloomFilter;\n try {\n // BloomFilter throws error if the inputs are invalid.\n bloomFilter = new BloomFilter(normalizedBitmap, padding, hashCount);\n } catch (err) {\n if (err instanceof BloomFilterError) {\n logWarn('BloomFilter error: ', err);\n } else {\n logWarn('Applying bloom filter failed: ', err);\n }\n return null;\n }\n\n if (bloomFilter.bitCount === 0) {\n return null;\n }\n\n return bloomFilter;\n }\n\n /**\n * Apply bloom filter to remove the deleted documents, and return the\n * application status.\n */\n private applyBloomFilter(\n bloomFilter: BloomFilter,\n watchChange: ExistenceFilterChange,\n currentCount: number\n ): BloomFilterApplicationStatus {\n const expectedCount = watchChange.existenceFilter.count;\n\n const removedDocumentCount = this.filterRemovedDocuments(\n bloomFilter,\n watchChange.targetId\n );\n\n return expectedCount === currentCount - removedDocumentCount\n ? BloomFilterApplicationStatus.Success\n : BloomFilterApplicationStatus.FalsePositive;\n }\n\n /**\n * Filter out removed documents based on bloom filter membership result and\n * return number of documents removed.\n */\n private filterRemovedDocuments(\n bloomFilter: BloomFilter,\n targetId: number\n ): number {\n const existingKeys = this.metadataProvider.getRemoteKeysForTarget(targetId);\n let removalCount = 0;\n\n existingKeys.forEach(key => {\n const databaseId = this.metadataProvider.getDatabaseId();\n const documentPath =\n `projects/${databaseId.projectId}` +\n `/databases/${databaseId.database}` +\n `/documents/${key.path.canonicalString()}`;\n\n if (!bloomFilter.mightContain(documentPath)) {\n this.removeDocumentFromTarget(targetId, key, /*updatedDocument=*/ null);\n removalCount++;\n }\n });\n\n return removalCount;\n }\n\n /**\n * Converts the currently accumulated state into a remote event at the\n * provided snapshot version. Resets the accumulated changes before returning.\n */\n createRemoteEvent(snapshotVersion: SnapshotVersion): RemoteEvent {\n const targetChanges = new Map();\n\n this.targetStates.forEach((targetState, targetId) => {\n const targetData = this.targetDataForActiveTarget(targetId);\n if (targetData) {\n if (targetState.current && targetIsDocumentTarget(targetData.target)) {\n // Document queries for document that don't exist can produce an empty\n // result set. To update our local cache, we synthesize a document\n // delete if we have not previously received the document. This\n // resolves the limbo state of the document, removing it from\n // limboDocumentRefs.\n //\n // TODO(dimond): Ideally we would have an explicit lookup target\n // instead resulting in an explicit delete message and we could\n // remove this special logic.\n const key = new DocumentKey(targetData.target.path);\n if (\n this.pendingDocumentUpdates.get(key) === null &&\n !this.targetContainsDocument(targetId, key)\n ) {\n this.removeDocumentFromTarget(\n targetId,\n key,\n MutableDocument.newNoDocument(key, snapshotVersion)\n );\n }\n }\n\n if (targetState.hasPendingChanges) {\n targetChanges.set(targetId, targetState.toTargetChange());\n targetState.clearPendingChanges();\n }\n }\n });\n\n let resolvedLimboDocuments = documentKeySet();\n\n // We extract the set of limbo-only document updates as the GC logic\n // special-cases documents that do not appear in the target cache.\n //\n // TODO(gsoltis): Expand on this comment once GC is available in the JS\n // client.\n this.pendingDocumentTargetMapping.forEach((key, targets) => {\n let isOnlyLimboTarget = true;\n\n targets.forEachWhile(targetId => {\n const targetData = this.targetDataForActiveTarget(targetId);\n if (\n targetData &&\n targetData.purpose !== TargetPurpose.LimboResolution\n ) {\n isOnlyLimboTarget = false;\n return false;\n }\n\n return true;\n });\n\n if (isOnlyLimboTarget) {\n resolvedLimboDocuments = resolvedLimboDocuments.add(key);\n }\n });\n\n this.pendingDocumentUpdates.forEach((_, doc) =>\n doc.setReadTime(snapshotVersion)\n );\n\n const remoteEvent = new RemoteEvent(\n snapshotVersion,\n targetChanges,\n this.pendingTargetResets,\n this.pendingDocumentUpdates,\n resolvedLimboDocuments\n );\n\n this.pendingDocumentUpdates = mutableDocumentMap();\n this.pendingDocumentTargetMapping = documentTargetMap();\n this.pendingTargetResets = new SortedMap(\n primitiveComparator\n );\n\n return remoteEvent;\n }\n\n /**\n * Adds the provided document to the internal list of document updates and\n * its document key to the given target's mapping.\n */\n // Visible for testing.\n addDocumentToTarget(targetId: TargetId, document: MutableDocument): void {\n if (!this.isActiveTarget(targetId)) {\n return;\n }\n\n const changeType = this.targetContainsDocument(targetId, document.key)\n ? ChangeType.Modified\n : ChangeType.Added;\n\n const targetState = this.ensureTargetState(targetId);\n targetState.addDocumentChange(document.key, changeType);\n\n this.pendingDocumentUpdates = this.pendingDocumentUpdates.insert(\n document.key,\n document\n );\n\n this.pendingDocumentTargetMapping =\n this.pendingDocumentTargetMapping.insert(\n document.key,\n this.ensureDocumentTargetMapping(document.key).add(targetId)\n );\n }\n\n /**\n * Removes the provided document from the target mapping. If the\n * document no longer matches the target, but the document's state is still\n * known (e.g. we know that the document was deleted or we received the change\n * that caused the filter mismatch), the new document can be provided\n * to update the remote document cache.\n */\n // Visible for testing.\n removeDocumentFromTarget(\n targetId: TargetId,\n key: DocumentKey,\n updatedDocument: MutableDocument | null\n ): void {\n if (!this.isActiveTarget(targetId)) {\n return;\n }\n\n const targetState = this.ensureTargetState(targetId);\n if (this.targetContainsDocument(targetId, key)) {\n targetState.addDocumentChange(key, ChangeType.Removed);\n } else {\n // The document may have entered and left the target before we raised a\n // snapshot, so we can just ignore the change.\n targetState.removeDocumentChange(key);\n }\n\n this.pendingDocumentTargetMapping =\n this.pendingDocumentTargetMapping.insert(\n key,\n this.ensureDocumentTargetMapping(key).delete(targetId)\n );\n\n if (updatedDocument) {\n this.pendingDocumentUpdates = this.pendingDocumentUpdates.insert(\n key,\n updatedDocument\n );\n }\n }\n\n removeTarget(targetId: TargetId): void {\n this.targetStates.delete(targetId);\n }\n\n /**\n * Returns the current count of documents in the target. This includes both\n * the number of documents that the LocalStore considers to be part of the\n * target as well as any accumulated changes.\n */\n private getCurrentDocumentCountForTarget(targetId: TargetId): number {\n const targetState = this.ensureTargetState(targetId);\n const targetChange = targetState.toTargetChange();\n return (\n this.metadataProvider.getRemoteKeysForTarget(targetId).size +\n targetChange.addedDocuments.size -\n targetChange.removedDocuments.size\n );\n }\n\n /**\n * Increment the number of acks needed from watch before we can consider the\n * server to be 'in-sync' with the client's active targets.\n */\n recordPendingTargetRequest(targetId: TargetId): void {\n // For each request we get we need to record we need a response for it.\n const targetState = this.ensureTargetState(targetId);\n targetState.recordPendingTargetRequest();\n }\n\n private ensureTargetState(targetId: TargetId): TargetState {\n let result = this.targetStates.get(targetId);\n if (!result) {\n result = new TargetState();\n this.targetStates.set(targetId, result);\n }\n return result;\n }\n\n private ensureDocumentTargetMapping(key: DocumentKey): SortedSet {\n let targetMapping = this.pendingDocumentTargetMapping.get(key);\n\n if (!targetMapping) {\n targetMapping = new SortedSet(primitiveComparator);\n this.pendingDocumentTargetMapping =\n this.pendingDocumentTargetMapping.insert(key, targetMapping);\n }\n\n return targetMapping;\n }\n\n /**\n * Verifies that the user is still interested in this target (by calling\n * `getTargetDataForTarget()`) and that we are not waiting for pending ADDs\n * from watch.\n */\n protected isActiveTarget(targetId: TargetId): boolean {\n const targetActive = this.targetDataForActiveTarget(targetId) !== null;\n if (!targetActive) {\n logDebug(LOG_TAG, 'Detected inactive target', targetId);\n }\n return targetActive;\n }\n\n /**\n * Returns the TargetData for an active target (i.e. a target that the user\n * is still interested in that has no outstanding target change requests).\n */\n protected targetDataForActiveTarget(targetId: TargetId): TargetData | null {\n const targetState = this.targetStates.get(targetId);\n return targetState && targetState.isPending\n ? null\n : this.metadataProvider.getTargetDataForTarget(targetId);\n }\n\n /**\n * Resets the state of a Watch target to its initial state (e.g. sets\n * 'current' to false, clears the resume token and removes its target mapping\n * from all documents).\n */\n private resetTarget(targetId: TargetId): void {\n debugAssert(\n !this.targetStates.get(targetId)!.isPending,\n 'Should only reset active targets'\n );\n this.targetStates.set(targetId, new TargetState());\n\n // Trigger removal for any documents currently mapped to this target.\n // These removals will be part of the initial snapshot if Watch does not\n // resend these documents.\n const existingKeys = this.metadataProvider.getRemoteKeysForTarget(targetId);\n existingKeys.forEach(key => {\n this.removeDocumentFromTarget(targetId, key, /*updatedDocument=*/ null);\n });\n }\n /**\n * Returns whether the LocalStore considers the document to be part of the\n * specified target.\n */\n private targetContainsDocument(\n targetId: TargetId,\n key: DocumentKey\n ): boolean {\n const existingKeys = this.metadataProvider.getRemoteKeysForTarget(targetId);\n return existingKeys.has(key);\n }\n}\n\nfunction documentTargetMap(): SortedMap> {\n return new SortedMap>(\n DocumentKey.comparator\n );\n}\n\nfunction snapshotChangesMap(): SortedMap {\n return new SortedMap(DocumentKey.comparator);\n}\n\nfunction createExistenceFilterMismatchInfoForTestingHooks(\n localCacheCount: number,\n existenceFilter: ExistenceFilter,\n databaseId: DatabaseId,\n bloomFilter: BloomFilter | null,\n bloomFilterStatus: BloomFilterApplicationStatus\n): TestingHooksExistenceFilterMismatchInfo {\n const result: TestingHooksExistenceFilterMismatchInfo = {\n localCacheCount,\n existenceFilterCount: existenceFilter.count,\n databaseId: databaseId.database,\n projectId: databaseId.projectId\n };\n\n const unchangedNames = existenceFilter.unchangedNames;\n if (unchangedNames) {\n result.bloomFilter = {\n applied: bloomFilterStatus === BloomFilterApplicationStatus.Success,\n hashCount: unchangedNames?.hashCount ?? 0,\n bitmapLength: unchangedNames?.bits?.bitmap?.length ?? 0,\n padding: unchangedNames?.bits?.padding ?? 0,\n mightContain: (value: string): boolean =>\n bloomFilter?.mightContain(value) ?? false\n };\n }\n\n return result;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Aggregate } from '../core/aggregate';\nimport { Bound } from '../core/bound';\nimport { DatabaseId } from '../core/database_info';\nimport {\n CompositeFilter,\n compositeFilterIsFlatConjunction,\n CompositeOperator,\n FieldFilter,\n Filter,\n Operator\n} from '../core/filter';\nimport { Direction, OrderBy } from '../core/order_by';\nimport {\n LimitType,\n newQuery,\n newQueryForPath,\n Query,\n queryToTarget\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { targetIsDocumentTarget, Target } from '../core/target';\nimport { TargetId } from '../core/types';\nimport { Timestamp } from '../lite-api/timestamp';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldMask } from '../model/field_mask';\nimport {\n DeleteMutation,\n FieldTransform,\n Mutation,\n MutationResult,\n PatchMutation,\n Precondition,\n SetMutation,\n VerifyMutation\n} from '../model/mutation';\nimport { normalizeTimestamp } from '../model/normalize';\nimport { ObjectValue } from '../model/object_value';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport {\n ArrayRemoveTransformOperation,\n ArrayUnionTransformOperation,\n NumericIncrementTransformOperation,\n ServerTimestampTransform,\n TransformOperation\n} from '../model/transform_operation';\nimport { isNanValue, isNullValue } from '../model/values';\nimport {\n ApiClientObjectMap as ProtoApiClientObjectMap,\n BatchGetDocumentsResponse as ProtoBatchGetDocumentsResponse,\n CompositeFilterOp as ProtoCompositeFilterOp,\n Cursor as ProtoCursor,\n Document as ProtoDocument,\n DocumentMask as ProtoDocumentMask,\n DocumentsTarget as ProtoDocumentsTarget,\n FieldFilterOp as ProtoFieldFilterOp,\n FieldReference as ProtoFieldReference,\n FieldTransform as ProtoFieldTransform,\n Filter as ProtoFilter,\n ListenResponse as ProtoListenResponse,\n Order as ProtoOrder,\n OrderDirection as ProtoOrderDirection,\n Precondition as ProtoPrecondition,\n QueryTarget as ProtoQueryTarget,\n RunAggregationQueryRequest as ProtoRunAggregationQueryRequest,\n Aggregation as ProtoAggregation,\n Status as ProtoStatus,\n Target as ProtoTarget,\n TargetChangeTargetChangeType as ProtoTargetChangeTargetChangeType,\n Timestamp as ProtoTimestamp,\n Write as ProtoWrite,\n WriteResult as ProtoWriteResult\n} from '../protos/firestore_proto_api';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { Code, FirestoreError } from '../util/error';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { ExistenceFilter } from './existence_filter';\nimport { Serializer } from './number_serializer';\nimport { mapCodeFromRpcCode } from './rpc_error';\nimport {\n DocumentWatchChange,\n ExistenceFilterChange,\n WatchChange,\n WatchTargetChange,\n WatchTargetChangeState\n} from './watch_change';\n\nconst DIRECTIONS = (() => {\n const dirs: { [dir: string]: ProtoOrderDirection } = {};\n dirs[Direction.ASCENDING] = 'ASCENDING';\n dirs[Direction.DESCENDING] = 'DESCENDING';\n return dirs;\n})();\n\nconst OPERATORS = (() => {\n const ops: { [op: string]: ProtoFieldFilterOp } = {};\n ops[Operator.LESS_THAN] = 'LESS_THAN';\n ops[Operator.LESS_THAN_OR_EQUAL] = 'LESS_THAN_OR_EQUAL';\n ops[Operator.GREATER_THAN] = 'GREATER_THAN';\n ops[Operator.GREATER_THAN_OR_EQUAL] = 'GREATER_THAN_OR_EQUAL';\n ops[Operator.EQUAL] = 'EQUAL';\n ops[Operator.NOT_EQUAL] = 'NOT_EQUAL';\n ops[Operator.ARRAY_CONTAINS] = 'ARRAY_CONTAINS';\n ops[Operator.IN] = 'IN';\n ops[Operator.NOT_IN] = 'NOT_IN';\n ops[Operator.ARRAY_CONTAINS_ANY] = 'ARRAY_CONTAINS_ANY';\n return ops;\n})();\n\nconst COMPOSITE_OPERATORS = (() => {\n const ops: { [op: string]: ProtoCompositeFilterOp } = {};\n ops[CompositeOperator.AND] = 'AND';\n ops[CompositeOperator.OR] = 'OR';\n return ops;\n})();\n\nfunction assertPresent(value: unknown, description: string): asserts value {\n debugAssert(!isNullOrUndefined(value), description + ' is missing');\n}\n\n/**\n * This class generates JsonObject values for the Datastore API suitable for\n * sending to either GRPC stub methods or via the JSON/HTTP REST API.\n *\n * The serializer supports both Protobuf.js and Proto3 JSON formats. By\n * setting `useProto3Json` to true, the serializer will use the Proto3 JSON\n * format.\n *\n * For a description of the Proto3 JSON format check\n * https://developers.google.com/protocol-buffers/docs/proto3#json\n *\n * TODO(klimt): We can remove the databaseId argument if we keep the full\n * resource name in documents.\n */\nexport class JsonProtoSerializer implements Serializer {\n constructor(\n readonly databaseId: DatabaseId,\n readonly useProto3Json: boolean\n ) {}\n}\n\nfunction fromRpcStatus(status: ProtoStatus): FirestoreError {\n const code =\n status.code === undefined ? Code.UNKNOWN : mapCodeFromRpcCode(status.code);\n return new FirestoreError(code, status.message || '');\n}\n\n/**\n * Returns a value for a number (or null) that's appropriate to put into\n * a google.protobuf.Int32Value proto.\n * DO NOT USE THIS FOR ANYTHING ELSE.\n * This method cheats. It's typed as returning \"number\" because that's what\n * our generated proto interfaces say Int32Value must be. But GRPC actually\n * expects a { value: } struct.\n */\nfunction toInt32Proto(\n serializer: JsonProtoSerializer,\n val: number | null\n): number | { value: number } | null {\n if (serializer.useProto3Json || isNullOrUndefined(val)) {\n return val;\n } else {\n return { value: val };\n }\n}\n\n/**\n * Returns a number (or null) from a google.protobuf.Int32Value proto.\n */\nfunction fromInt32Proto(\n val: number | { value: number } | undefined\n): number | null {\n let result;\n if (typeof val === 'object') {\n result = val.value;\n } else {\n result = val;\n }\n return isNullOrUndefined(result) ? null : result;\n}\n\n/**\n * Returns a value for a Date that's appropriate to put into a proto.\n */\nexport function toTimestamp(\n serializer: JsonProtoSerializer,\n timestamp: Timestamp\n): ProtoTimestamp {\n if (serializer.useProto3Json) {\n // Serialize to ISO-8601 date format, but with full nano resolution.\n // Since JS Date has only millis, let's only use it for the seconds and\n // then manually add the fractions to the end.\n const jsDateStr = new Date(timestamp.seconds * 1000).toISOString();\n // Remove .xxx frac part and Z in the end.\n const strUntilSeconds = jsDateStr.replace(/\\.\\d*/, '').replace('Z', '');\n // Pad the fraction out to 9 digits (nanos).\n const nanoStr = ('000000000' + timestamp.nanoseconds).slice(-9);\n\n return `${strUntilSeconds}.${nanoStr}Z`;\n } else {\n return {\n seconds: '' + timestamp.seconds,\n nanos: timestamp.nanoseconds\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } as any;\n }\n}\n\nfunction fromTimestamp(date: ProtoTimestamp): Timestamp {\n const timestamp = normalizeTimestamp(date);\n return new Timestamp(timestamp.seconds, timestamp.nanos);\n}\n\n/**\n * Returns a value for bytes that's appropriate to put in a proto.\n *\n * Visible for testing.\n */\nexport function toBytes(\n serializer: JsonProtoSerializer,\n bytes: ByteString\n): string | Uint8Array {\n if (serializer.useProto3Json) {\n return bytes.toBase64();\n } else {\n return bytes.toUint8Array();\n }\n}\n\n/**\n * Returns a ByteString based on the proto string value.\n */\nexport function fromBytes(\n serializer: JsonProtoSerializer,\n value: string | Uint8Array | undefined\n): ByteString {\n if (serializer.useProto3Json) {\n hardAssert(\n value === undefined || typeof value === 'string',\n 'value must be undefined or a string when using proto3 Json'\n );\n return ByteString.fromBase64String(value ? value : '');\n } else {\n hardAssert(\n value === undefined ||\n // Check if the value is an instance of both Buffer and Uint8Array,\n // despite the fact that Buffer extends Uint8Array. In some\n // environments, such as jsdom, the prototype chain of Buffer\n // does not indicate that it extends Uint8Array.\n value instanceof Buffer ||\n value instanceof Uint8Array,\n 'value must be undefined, Buffer, or Uint8Array'\n );\n return ByteString.fromUint8Array(value ? value : new Uint8Array());\n }\n}\n\nexport function toVersion(\n serializer: JsonProtoSerializer,\n version: SnapshotVersion\n): ProtoTimestamp {\n return toTimestamp(serializer, version.toTimestamp());\n}\n\nexport function fromVersion(version: ProtoTimestamp): SnapshotVersion {\n hardAssert(!!version, \"Trying to deserialize version that isn't set\");\n return SnapshotVersion.fromTimestamp(fromTimestamp(version));\n}\n\nexport function toResourceName(\n databaseId: DatabaseId,\n path: ResourcePath\n): string {\n return toResourcePath(databaseId, path).canonicalString();\n}\n\nexport function toResourcePath(\n databaseId: DatabaseId,\n path?: ResourcePath\n): ResourcePath {\n const resourcePath = fullyQualifiedPrefixPath(databaseId).child('documents');\n return path === undefined ? resourcePath : resourcePath.child(path);\n}\n\nfunction fromResourceName(name: string): ResourcePath {\n const resource = ResourcePath.fromString(name);\n hardAssert(\n isValidResourceName(resource),\n 'Tried to deserialize invalid key ' + resource.toString()\n );\n return resource;\n}\n\nexport function toName(\n serializer: JsonProtoSerializer,\n key: DocumentKey\n): string {\n return toResourceName(serializer.databaseId, key.path);\n}\n\nexport function fromName(\n serializer: JsonProtoSerializer,\n name: string\n): DocumentKey {\n const resource = fromResourceName(name);\n\n if (resource.get(1) !== serializer.databaseId.projectId) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Tried to deserialize key from different project: ' +\n resource.get(1) +\n ' vs ' +\n serializer.databaseId.projectId\n );\n }\n\n if (resource.get(3) !== serializer.databaseId.database) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Tried to deserialize key from different database: ' +\n resource.get(3) +\n ' vs ' +\n serializer.databaseId.database\n );\n }\n return new DocumentKey(extractLocalPathFromResourceName(resource));\n}\n\nfunction toQueryPath(\n serializer: JsonProtoSerializer,\n path: ResourcePath\n): string {\n return toResourceName(serializer.databaseId, path);\n}\n\nfunction fromQueryPath(name: string): ResourcePath {\n const resourceName = fromResourceName(name);\n // In v1beta1 queries for collections at the root did not have a trailing\n // \"/documents\". In v1 all resource paths contain \"/documents\". Preserve the\n // ability to read the v1beta1 form for compatibility with queries persisted\n // in the local target cache.\n if (resourceName.length === 4) {\n return ResourcePath.emptyPath();\n }\n return extractLocalPathFromResourceName(resourceName);\n}\n\nexport function getEncodedDatabaseId(serializer: JsonProtoSerializer): string {\n const path = new ResourcePath([\n 'projects',\n serializer.databaseId.projectId,\n 'databases',\n serializer.databaseId.database\n ]);\n return path.canonicalString();\n}\n\nfunction fullyQualifiedPrefixPath(databaseId: DatabaseId): ResourcePath {\n return new ResourcePath([\n 'projects',\n databaseId.projectId,\n 'databases',\n databaseId.database\n ]);\n}\n\nfunction extractLocalPathFromResourceName(\n resourceName: ResourcePath\n): ResourcePath {\n hardAssert(\n resourceName.length > 4 && resourceName.get(4) === 'documents',\n 'tried to deserialize invalid key ' + resourceName.toString()\n );\n return resourceName.popFirst(5);\n}\n\n/** Creates a Document proto from key and fields (but no create/update time) */\nexport function toMutationDocument(\n serializer: JsonProtoSerializer,\n key: DocumentKey,\n fields: ObjectValue\n): ProtoDocument {\n return {\n name: toName(serializer, key),\n fields: fields.value.mapValue.fields\n };\n}\n\nexport function toDocument(\n serializer: JsonProtoSerializer,\n document: MutableDocument\n): ProtoDocument {\n debugAssert(\n !document.hasLocalMutations,\n \"Can't serialize documents with mutations.\"\n );\n return {\n name: toName(serializer, document.key),\n fields: document.data.value.mapValue.fields,\n updateTime: toTimestamp(serializer, document.version.toTimestamp()),\n createTime: toTimestamp(serializer, document.createTime.toTimestamp())\n };\n}\n\nexport function fromDocument(\n serializer: JsonProtoSerializer,\n document: ProtoDocument,\n hasCommittedMutations?: boolean\n): MutableDocument {\n const key = fromName(serializer, document.name!);\n const version = fromVersion(document.updateTime!);\n // If we read a document from persistence that is missing createTime, it's due\n // to older SDK versions not storing this information. In such cases, we'll\n // set the createTime to zero. This can be removed in the long term.\n const createTime = document.createTime\n ? fromVersion(document.createTime)\n : SnapshotVersion.min();\n const data = new ObjectValue({ mapValue: { fields: document.fields } });\n const result = MutableDocument.newFoundDocument(\n key,\n version,\n createTime,\n data\n );\n if (hasCommittedMutations) {\n result.setHasCommittedMutations();\n }\n return hasCommittedMutations ? result.setHasCommittedMutations() : result;\n}\n\nfunction fromFound(\n serializer: JsonProtoSerializer,\n doc: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n hardAssert(\n !!doc.found,\n 'Tried to deserialize a found document from a missing document.'\n );\n assertPresent(doc.found.name, 'doc.found.name');\n assertPresent(doc.found.updateTime, 'doc.found.updateTime');\n const key = fromName(serializer, doc.found.name);\n const version = fromVersion(doc.found.updateTime);\n const createTime = doc.found.createTime\n ? fromVersion(doc.found.createTime)\n : SnapshotVersion.min();\n const data = new ObjectValue({ mapValue: { fields: doc.found.fields } });\n return MutableDocument.newFoundDocument(key, version, createTime, data);\n}\n\nfunction fromMissing(\n serializer: JsonProtoSerializer,\n result: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n hardAssert(\n !!result.missing,\n 'Tried to deserialize a missing document from a found document.'\n );\n hardAssert(\n !!result.readTime,\n 'Tried to deserialize a missing document without a read time.'\n );\n const key = fromName(serializer, result.missing);\n const version = fromVersion(result.readTime);\n return MutableDocument.newNoDocument(key, version);\n}\n\nexport function fromBatchGetDocumentsResponse(\n serializer: JsonProtoSerializer,\n result: ProtoBatchGetDocumentsResponse\n): MutableDocument {\n if ('found' in result) {\n return fromFound(serializer, result);\n } else if ('missing' in result) {\n return fromMissing(serializer, result);\n }\n return fail('invalid batch get response: ' + JSON.stringify(result));\n}\n\nexport function fromWatchChange(\n serializer: JsonProtoSerializer,\n change: ProtoListenResponse\n): WatchChange {\n let watchChange: WatchChange;\n if ('targetChange' in change) {\n assertPresent(change.targetChange, 'targetChange');\n // proto3 default value is unset in JSON (undefined), so use 'NO_CHANGE'\n // if unset\n const state = fromWatchTargetChangeState(\n change.targetChange.targetChangeType || 'NO_CHANGE'\n );\n const targetIds: TargetId[] = change.targetChange.targetIds || [];\n\n const resumeToken = fromBytes(serializer, change.targetChange.resumeToken);\n const causeProto = change.targetChange!.cause;\n const cause = causeProto && fromRpcStatus(causeProto);\n watchChange = new WatchTargetChange(\n state,\n targetIds,\n resumeToken,\n cause || null\n );\n } else if ('documentChange' in change) {\n assertPresent(change.documentChange, 'documentChange');\n const entityChange = change.documentChange;\n assertPresent(entityChange.document, 'documentChange.name');\n assertPresent(entityChange.document.name, 'documentChange.document.name');\n assertPresent(\n entityChange.document.updateTime,\n 'documentChange.document.updateTime'\n );\n const key = fromName(serializer, entityChange.document.name);\n const version = fromVersion(entityChange.document.updateTime);\n const createTime = entityChange.document.createTime\n ? fromVersion(entityChange.document.createTime)\n : SnapshotVersion.min();\n const data = new ObjectValue({\n mapValue: { fields: entityChange.document.fields }\n });\n const doc = MutableDocument.newFoundDocument(\n key,\n version,\n createTime,\n data\n );\n const updatedTargetIds = entityChange.targetIds || [];\n const removedTargetIds = entityChange.removedTargetIds || [];\n watchChange = new DocumentWatchChange(\n updatedTargetIds,\n removedTargetIds,\n doc.key,\n doc\n );\n } else if ('documentDelete' in change) {\n assertPresent(change.documentDelete, 'documentDelete');\n const docDelete = change.documentDelete;\n assertPresent(docDelete.document, 'documentDelete.document');\n const key = fromName(serializer, docDelete.document);\n const version = docDelete.readTime\n ? fromVersion(docDelete.readTime)\n : SnapshotVersion.min();\n const doc = MutableDocument.newNoDocument(key, version);\n const removedTargetIds = docDelete.removedTargetIds || [];\n watchChange = new DocumentWatchChange([], removedTargetIds, doc.key, doc);\n } else if ('documentRemove' in change) {\n assertPresent(change.documentRemove, 'documentRemove');\n const docRemove = change.documentRemove;\n assertPresent(docRemove.document, 'documentRemove');\n const key = fromName(serializer, docRemove.document);\n const removedTargetIds = docRemove.removedTargetIds || [];\n watchChange = new DocumentWatchChange([], removedTargetIds, key, null);\n } else if ('filter' in change) {\n // TODO(dimond): implement existence filter parsing with strategy.\n assertPresent(change.filter, 'filter');\n const filter = change.filter;\n assertPresent(filter.targetId, 'filter.targetId');\n const { count = 0, unchangedNames } = filter;\n const existenceFilter = new ExistenceFilter(count, unchangedNames);\n const targetId = filter.targetId;\n watchChange = new ExistenceFilterChange(targetId, existenceFilter);\n } else {\n return fail('Unknown change type ' + JSON.stringify(change));\n }\n return watchChange;\n}\n\nfunction fromWatchTargetChangeState(\n state: ProtoTargetChangeTargetChangeType\n): WatchTargetChangeState {\n if (state === 'NO_CHANGE') {\n return WatchTargetChangeState.NoChange;\n } else if (state === 'ADD') {\n return WatchTargetChangeState.Added;\n } else if (state === 'REMOVE') {\n return WatchTargetChangeState.Removed;\n } else if (state === 'CURRENT') {\n return WatchTargetChangeState.Current;\n } else if (state === 'RESET') {\n return WatchTargetChangeState.Reset;\n } else {\n return fail('Got unexpected TargetChange.state: ' + state);\n }\n}\n\nexport function versionFromListenResponse(\n change: ProtoListenResponse\n): SnapshotVersion {\n // We have only reached a consistent snapshot for the entire stream if there\n // is a read_time set and it applies to all targets (i.e. the list of\n // targets is empty). The backend is guaranteed to send such responses.\n if (!('targetChange' in change)) {\n return SnapshotVersion.min();\n }\n const targetChange = change.targetChange!;\n if (targetChange.targetIds && targetChange.targetIds.length) {\n return SnapshotVersion.min();\n }\n if (!targetChange.readTime) {\n return SnapshotVersion.min();\n }\n return fromVersion(targetChange.readTime);\n}\n\nexport function toMutation(\n serializer: JsonProtoSerializer,\n mutation: Mutation\n): ProtoWrite {\n let result: ProtoWrite;\n if (mutation instanceof SetMutation) {\n result = {\n update: toMutationDocument(serializer, mutation.key, mutation.value)\n };\n } else if (mutation instanceof DeleteMutation) {\n result = { delete: toName(serializer, mutation.key) };\n } else if (mutation instanceof PatchMutation) {\n result = {\n update: toMutationDocument(serializer, mutation.key, mutation.data),\n updateMask: toDocumentMask(mutation.fieldMask)\n };\n } else if (mutation instanceof VerifyMutation) {\n result = {\n verify: toName(serializer, mutation.key)\n };\n } else {\n return fail('Unknown mutation type ' + mutation.type);\n }\n\n if (mutation.fieldTransforms.length > 0) {\n result.updateTransforms = mutation.fieldTransforms.map(transform =>\n toFieldTransform(serializer, transform)\n );\n }\n\n if (!mutation.precondition.isNone) {\n result.currentDocument = toPrecondition(serializer, mutation.precondition);\n }\n\n return result;\n}\n\nexport function fromMutation(\n serializer: JsonProtoSerializer,\n proto: ProtoWrite\n): Mutation {\n const precondition = proto.currentDocument\n ? fromPrecondition(proto.currentDocument)\n : Precondition.none();\n\n const fieldTransforms = proto.updateTransforms\n ? proto.updateTransforms.map(transform =>\n fromFieldTransform(serializer, transform)\n )\n : [];\n\n if (proto.update) {\n assertPresent(proto.update.name, 'name');\n const key = fromName(serializer, proto.update.name);\n const value = new ObjectValue({\n mapValue: { fields: proto.update.fields }\n });\n\n if (proto.updateMask) {\n const fieldMask = fromDocumentMask(proto.updateMask);\n return new PatchMutation(\n key,\n value,\n fieldMask,\n precondition,\n fieldTransforms\n );\n } else {\n return new SetMutation(key, value, precondition, fieldTransforms);\n }\n } else if (proto.delete) {\n const key = fromName(serializer, proto.delete);\n return new DeleteMutation(key, precondition);\n } else if (proto.verify) {\n const key = fromName(serializer, proto.verify);\n return new VerifyMutation(key, precondition);\n } else {\n return fail('unknown mutation proto: ' + JSON.stringify(proto));\n }\n}\n\nfunction toPrecondition(\n serializer: JsonProtoSerializer,\n precondition: Precondition\n): ProtoPrecondition {\n debugAssert(!precondition.isNone, \"Can't serialize an empty precondition\");\n if (precondition.updateTime !== undefined) {\n return {\n updateTime: toVersion(serializer, precondition.updateTime)\n };\n } else if (precondition.exists !== undefined) {\n return { exists: precondition.exists };\n } else {\n return fail('Unknown precondition');\n }\n}\n\nfunction fromPrecondition(precondition: ProtoPrecondition): Precondition {\n if (precondition.updateTime !== undefined) {\n return Precondition.updateTime(fromVersion(precondition.updateTime));\n } else if (precondition.exists !== undefined) {\n return Precondition.exists(precondition.exists);\n } else {\n return Precondition.none();\n }\n}\n\nfunction fromWriteResult(\n proto: ProtoWriteResult,\n commitTime: ProtoTimestamp\n): MutationResult {\n // NOTE: Deletes don't have an updateTime.\n let version = proto.updateTime\n ? fromVersion(proto.updateTime)\n : fromVersion(commitTime);\n\n if (version.isEqual(SnapshotVersion.min())) {\n // The Firestore Emulator currently returns an update time of 0 for\n // deletes of non-existing documents (rather than null). This breaks the\n // test \"get deleted doc while offline with source=cache\" as NoDocuments\n // with version 0 are filtered by IndexedDb's RemoteDocumentCache.\n // TODO(#2149): Remove this when Emulator is fixed\n version = fromVersion(commitTime);\n }\n\n return new MutationResult(version, proto.transformResults || []);\n}\n\nexport function fromWriteResults(\n protos: ProtoWriteResult[] | undefined,\n commitTime?: ProtoTimestamp\n): MutationResult[] {\n if (protos && protos.length > 0) {\n hardAssert(\n commitTime !== undefined,\n 'Received a write result without a commit time'\n );\n return protos.map(proto => fromWriteResult(proto, commitTime));\n } else {\n return [];\n }\n}\n\nfunction toFieldTransform(\n serializer: JsonProtoSerializer,\n fieldTransform: FieldTransform\n): ProtoFieldTransform {\n const transform = fieldTransform.transform;\n if (transform instanceof ServerTimestampTransform) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n setToServerValue: 'REQUEST_TIME'\n };\n } else if (transform instanceof ArrayUnionTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n appendMissingElements: {\n values: transform.elements\n }\n };\n } else if (transform instanceof ArrayRemoveTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n removeAllFromArray: {\n values: transform.elements\n }\n };\n } else if (transform instanceof NumericIncrementTransformOperation) {\n return {\n fieldPath: fieldTransform.field.canonicalString(),\n increment: transform.operand\n };\n } else {\n throw fail('Unknown transform: ' + fieldTransform.transform);\n }\n}\n\nfunction fromFieldTransform(\n serializer: JsonProtoSerializer,\n proto: ProtoFieldTransform\n): FieldTransform {\n let transform: TransformOperation | null = null;\n if ('setToServerValue' in proto) {\n hardAssert(\n proto.setToServerValue === 'REQUEST_TIME',\n 'Unknown server value transform proto: ' + JSON.stringify(proto)\n );\n transform = new ServerTimestampTransform();\n } else if ('appendMissingElements' in proto) {\n const values = proto.appendMissingElements!.values || [];\n transform = new ArrayUnionTransformOperation(values);\n } else if ('removeAllFromArray' in proto) {\n const values = proto.removeAllFromArray!.values || [];\n transform = new ArrayRemoveTransformOperation(values);\n } else if ('increment' in proto) {\n transform = new NumericIncrementTransformOperation(\n serializer,\n proto.increment!\n );\n } else {\n fail('Unknown transform proto: ' + JSON.stringify(proto));\n }\n const fieldPath = FieldPath.fromServerFormat(proto.fieldPath!);\n return new FieldTransform(fieldPath, transform!);\n}\n\nexport function toDocumentsTarget(\n serializer: JsonProtoSerializer,\n target: Target\n): ProtoDocumentsTarget {\n return { documents: [toQueryPath(serializer, target.path)] };\n}\n\nexport function fromDocumentsTarget(\n documentsTarget: ProtoDocumentsTarget\n): Target {\n const count = documentsTarget.documents!.length;\n hardAssert(\n count === 1,\n 'DocumentsTarget contained other than 1 document: ' + count\n );\n const name = documentsTarget.documents![0];\n return queryToTarget(newQueryForPath(fromQueryPath(name)));\n}\n\nexport function toQueryTarget(\n serializer: JsonProtoSerializer,\n target: Target\n): { queryTarget: ProtoQueryTarget; parent: ResourcePath } {\n // Dissect the path into parent, collectionId, and optional key filter.\n const queryTarget: ProtoQueryTarget = { structuredQuery: {} };\n const path = target.path;\n let parent: ResourcePath;\n if (target.collectionGroup !== null) {\n debugAssert(\n path.length % 2 === 0,\n 'Collection Group queries should be within a document path or root.'\n );\n parent = path;\n queryTarget.structuredQuery!.from = [\n {\n collectionId: target.collectionGroup,\n allDescendants: true\n }\n ];\n } else {\n debugAssert(\n path.length % 2 !== 0,\n 'Document queries with filters are not supported.'\n );\n parent = path.popLast();\n queryTarget.structuredQuery!.from = [{ collectionId: path.lastSegment() }];\n }\n queryTarget.parent = toQueryPath(serializer, parent);\n\n const where = toFilters(target.filters);\n if (where) {\n queryTarget.structuredQuery!.where = where;\n }\n\n const orderBy = toOrder(target.orderBy);\n if (orderBy) {\n queryTarget.structuredQuery!.orderBy = orderBy;\n }\n\n const limit = toInt32Proto(serializer, target.limit);\n if (limit !== null) {\n queryTarget.structuredQuery!.limit = limit;\n }\n\n if (target.startAt) {\n queryTarget.structuredQuery!.startAt = toStartAtCursor(target.startAt);\n }\n if (target.endAt) {\n queryTarget.structuredQuery!.endAt = toEndAtCursor(target.endAt);\n }\n\n return { queryTarget, parent };\n}\n\nexport function toRunAggregationQueryRequest(\n serializer: JsonProtoSerializer,\n target: Target,\n aggregates: Aggregate[],\n skipAliasing?: boolean\n): {\n request: ProtoRunAggregationQueryRequest;\n aliasMap: Record;\n parent: ResourcePath;\n} {\n const { queryTarget, parent } = toQueryTarget(serializer, target);\n const aliasMap: Record = {};\n\n const aggregations: ProtoAggregation[] = [];\n let aggregationNum = 0;\n\n aggregates.forEach(aggregate => {\n // Map all client-side aliases to a unique short-form\n // alias. This avoids issues with client-side aliases that\n // exceed the 1500-byte string size limit.\n const serverAlias = skipAliasing\n ? aggregate.alias\n : `aggregate_${aggregationNum++}`;\n aliasMap[serverAlias] = aggregate.alias;\n\n if (aggregate.aggregateType === 'count') {\n aggregations.push({\n alias: serverAlias,\n count: {}\n });\n } else if (aggregate.aggregateType === 'avg') {\n aggregations.push({\n alias: serverAlias,\n avg: {\n field: toFieldPathReference(aggregate.fieldPath!)\n }\n });\n } else if (aggregate.aggregateType === 'sum') {\n aggregations.push({\n alias: serverAlias,\n sum: {\n field: toFieldPathReference(aggregate.fieldPath!)\n }\n });\n }\n });\n\n return {\n request: {\n structuredAggregationQuery: {\n aggregations,\n structuredQuery: queryTarget.structuredQuery\n },\n parent: queryTarget.parent\n },\n aliasMap,\n parent\n };\n}\n\nexport function convertQueryTargetToQuery(target: ProtoQueryTarget): Query {\n let path = fromQueryPath(target.parent!);\n\n const query = target.structuredQuery!;\n const fromCount = query.from ? query.from.length : 0;\n let collectionGroup: string | null = null;\n if (fromCount > 0) {\n hardAssert(\n fromCount === 1,\n 'StructuredQuery.from with more than one collection is not supported.'\n );\n const from = query.from![0];\n if (from.allDescendants) {\n collectionGroup = from.collectionId!;\n } else {\n path = path.child(from.collectionId!);\n }\n }\n\n let filterBy: Filter[] = [];\n if (query.where) {\n filterBy = fromFilters(query.where);\n }\n\n let orderBy: OrderBy[] = [];\n if (query.orderBy) {\n orderBy = fromOrder(query.orderBy);\n }\n\n let limit: number | null = null;\n if (query.limit) {\n limit = fromInt32Proto(query.limit);\n }\n\n let startAt: Bound | null = null;\n if (query.startAt) {\n startAt = fromStartAtCursor(query.startAt);\n }\n\n let endAt: Bound | null = null;\n if (query.endAt) {\n endAt = fromEndAtCursor(query.endAt);\n }\n\n return newQuery(\n path,\n collectionGroup,\n orderBy,\n filterBy,\n limit,\n LimitType.First,\n startAt,\n endAt\n );\n}\n\nexport function fromQueryTarget(target: ProtoQueryTarget): Target {\n return queryToTarget(convertQueryTargetToQuery(target));\n}\n\nexport function toListenRequestLabels(\n serializer: JsonProtoSerializer,\n targetData: TargetData\n): ProtoApiClientObjectMap | null {\n const value = toLabel(targetData.purpose);\n if (value == null) {\n return null;\n } else {\n return {\n 'goog-listen-tags': value\n };\n }\n}\n\nexport function toLabel(purpose: TargetPurpose): string | null {\n switch (purpose) {\n case TargetPurpose.Listen:\n return null;\n case TargetPurpose.ExistenceFilterMismatch:\n return 'existence-filter-mismatch';\n case TargetPurpose.ExistenceFilterMismatchBloom:\n return 'existence-filter-mismatch-bloom';\n case TargetPurpose.LimboResolution:\n return 'limbo-document';\n default:\n return fail('Unrecognized query purpose: ' + purpose);\n }\n}\n\nexport function toTarget(\n serializer: JsonProtoSerializer,\n targetData: TargetData\n): ProtoTarget {\n let result: ProtoTarget;\n const target = targetData.target;\n\n if (targetIsDocumentTarget(target)) {\n result = { documents: toDocumentsTarget(serializer, target) };\n } else {\n result = { query: toQueryTarget(serializer, target).queryTarget };\n }\n\n result.targetId = targetData.targetId;\n\n if (targetData.resumeToken.approximateByteSize() > 0) {\n result.resumeToken = toBytes(serializer, targetData.resumeToken);\n const expectedCount = toInt32Proto(serializer, targetData.expectedCount);\n if (expectedCount !== null) {\n result.expectedCount = expectedCount;\n }\n } else if (targetData.snapshotVersion.compareTo(SnapshotVersion.min()) > 0) {\n // TODO(wuandy): Consider removing above check because it is most likely true.\n // Right now, many tests depend on this behaviour though (leaving min() out\n // of serialization).\n result.readTime = toTimestamp(\n serializer,\n targetData.snapshotVersion.toTimestamp()\n );\n const expectedCount = toInt32Proto(serializer, targetData.expectedCount);\n if (expectedCount !== null) {\n result.expectedCount = expectedCount;\n }\n }\n\n return result;\n}\n\nfunction toFilters(filters: Filter[]): ProtoFilter | undefined {\n if (filters.length === 0) {\n return;\n }\n\n return toFilter(CompositeFilter.create(filters, CompositeOperator.AND));\n}\n\nfunction fromFilters(filter: ProtoFilter): Filter[] {\n const result = fromFilter(filter);\n\n if (\n result instanceof CompositeFilter &&\n compositeFilterIsFlatConjunction(result)\n ) {\n return result.getFilters();\n }\n\n return [result];\n}\n\nfunction fromFilter(filter: ProtoFilter): Filter {\n if (filter.unaryFilter !== undefined) {\n return fromUnaryFilter(filter);\n } else if (filter.fieldFilter !== undefined) {\n return fromFieldFilter(filter);\n } else if (filter.compositeFilter !== undefined) {\n return fromCompositeFilter(filter);\n } else {\n return fail('Unknown filter: ' + JSON.stringify(filter));\n }\n}\n\nfunction toOrder(orderBys: OrderBy[]): ProtoOrder[] | undefined {\n if (orderBys.length === 0) {\n return;\n }\n return orderBys.map(order => toPropertyOrder(order));\n}\n\nfunction fromOrder(orderBys: ProtoOrder[]): OrderBy[] {\n return orderBys.map(order => fromPropertyOrder(order));\n}\n\nfunction toStartAtCursor(cursor: Bound): ProtoCursor {\n return {\n before: cursor.inclusive,\n values: cursor.position\n };\n}\n\nfunction toEndAtCursor(cursor: Bound): ProtoCursor {\n return {\n before: !cursor.inclusive,\n values: cursor.position\n };\n}\n\nfunction fromStartAtCursor(cursor: ProtoCursor): Bound {\n const inclusive = !!cursor.before;\n const position = cursor.values || [];\n return new Bound(position, inclusive);\n}\n\nfunction fromEndAtCursor(cursor: ProtoCursor): Bound {\n const inclusive = !cursor.before;\n const position = cursor.values || [];\n return new Bound(position, inclusive);\n}\n\n// visible for testing\nexport function toDirection(dir: Direction): ProtoOrderDirection {\n return DIRECTIONS[dir];\n}\n\n// visible for testing\nexport function fromDirection(\n dir: ProtoOrderDirection | undefined\n): Direction | undefined {\n switch (dir) {\n case 'ASCENDING':\n return Direction.ASCENDING;\n case 'DESCENDING':\n return Direction.DESCENDING;\n default:\n return undefined;\n }\n}\n\n// visible for testing\nexport function toOperatorName(op: Operator): ProtoFieldFilterOp {\n return OPERATORS[op];\n}\n\nexport function toCompositeOperatorName(\n op: CompositeOperator\n): ProtoCompositeFilterOp {\n return COMPOSITE_OPERATORS[op];\n}\n\nexport function fromOperatorName(op: ProtoFieldFilterOp): Operator {\n switch (op) {\n case 'EQUAL':\n return Operator.EQUAL;\n case 'NOT_EQUAL':\n return Operator.NOT_EQUAL;\n case 'GREATER_THAN':\n return Operator.GREATER_THAN;\n case 'GREATER_THAN_OR_EQUAL':\n return Operator.GREATER_THAN_OR_EQUAL;\n case 'LESS_THAN':\n return Operator.LESS_THAN;\n case 'LESS_THAN_OR_EQUAL':\n return Operator.LESS_THAN_OR_EQUAL;\n case 'ARRAY_CONTAINS':\n return Operator.ARRAY_CONTAINS;\n case 'IN':\n return Operator.IN;\n case 'NOT_IN':\n return Operator.NOT_IN;\n case 'ARRAY_CONTAINS_ANY':\n return Operator.ARRAY_CONTAINS_ANY;\n case 'OPERATOR_UNSPECIFIED':\n return fail('Unspecified operator');\n default:\n return fail('Unknown operator');\n }\n}\n\nexport function fromCompositeOperatorName(\n op: ProtoCompositeFilterOp\n): CompositeOperator {\n switch (op) {\n case 'AND':\n return CompositeOperator.AND;\n case 'OR':\n return CompositeOperator.OR;\n default:\n return fail('Unknown operator');\n }\n}\n\nexport function toFieldPathReference(path: FieldPath): ProtoFieldReference {\n return { fieldPath: path.canonicalString() };\n}\n\nexport function fromFieldPathReference(\n fieldReference: ProtoFieldReference\n): FieldPath {\n return FieldPath.fromServerFormat(fieldReference.fieldPath!);\n}\n\n// visible for testing\nexport function toPropertyOrder(orderBy: OrderBy): ProtoOrder {\n return {\n field: toFieldPathReference(orderBy.field),\n direction: toDirection(orderBy.dir)\n };\n}\n\nexport function fromPropertyOrder(orderBy: ProtoOrder): OrderBy {\n return new OrderBy(\n fromFieldPathReference(orderBy.field!),\n fromDirection(orderBy.direction)\n );\n}\n\n// visible for testing\nexport function toFilter(filter: Filter): ProtoFilter {\n if (filter instanceof FieldFilter) {\n return toUnaryOrFieldFilter(filter);\n } else if (filter instanceof CompositeFilter) {\n return toCompositeFilter(filter);\n } else {\n return fail('Unrecognized filter type ' + JSON.stringify(filter));\n }\n}\n\nexport function toCompositeFilter(filter: CompositeFilter): ProtoFilter {\n const protos = filter.getFilters().map(filter => toFilter(filter));\n\n if (protos.length === 1) {\n return protos[0];\n }\n\n return {\n compositeFilter: {\n op: toCompositeOperatorName(filter.op),\n filters: protos\n }\n };\n}\n\nexport function toUnaryOrFieldFilter(filter: FieldFilter): ProtoFilter {\n if (filter.op === Operator.EQUAL) {\n if (isNanValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NAN'\n }\n };\n } else if (isNullValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NULL'\n }\n };\n }\n } else if (filter.op === Operator.NOT_EQUAL) {\n if (isNanValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NOT_NAN'\n }\n };\n } else if (isNullValue(filter.value)) {\n return {\n unaryFilter: {\n field: toFieldPathReference(filter.field),\n op: 'IS_NOT_NULL'\n }\n };\n }\n }\n return {\n fieldFilter: {\n field: toFieldPathReference(filter.field),\n op: toOperatorName(filter.op),\n value: filter.value\n }\n };\n}\n\nexport function fromUnaryFilter(filter: ProtoFilter): Filter {\n switch (filter.unaryFilter!.op!) {\n case 'IS_NAN':\n const nanField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(nanField, Operator.EQUAL, {\n doubleValue: NaN\n });\n case 'IS_NULL':\n const nullField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(nullField, Operator.EQUAL, {\n nullValue: 'NULL_VALUE'\n });\n case 'IS_NOT_NAN':\n const notNanField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(notNanField, Operator.NOT_EQUAL, {\n doubleValue: NaN\n });\n case 'IS_NOT_NULL':\n const notNullField = fromFieldPathReference(filter.unaryFilter!.field!);\n return FieldFilter.create(notNullField, Operator.NOT_EQUAL, {\n nullValue: 'NULL_VALUE'\n });\n case 'OPERATOR_UNSPECIFIED':\n return fail('Unspecified filter');\n default:\n return fail('Unknown filter');\n }\n}\n\nexport function fromFieldFilter(filter: ProtoFilter): FieldFilter {\n return FieldFilter.create(\n fromFieldPathReference(filter.fieldFilter!.field!),\n fromOperatorName(filter.fieldFilter!.op!),\n filter.fieldFilter!.value!\n );\n}\n\nexport function fromCompositeFilter(filter: ProtoFilter): CompositeFilter {\n return CompositeFilter.create(\n filter.compositeFilter!.filters!.map(filter => fromFilter(filter)),\n fromCompositeOperatorName(filter.compositeFilter!.op!)\n );\n}\n\nexport function toDocumentMask(fieldMask: FieldMask): ProtoDocumentMask {\n const canonicalFields: string[] = [];\n fieldMask.fields.forEach(field =>\n canonicalFields.push(field.canonicalString())\n );\n return {\n fieldPaths: canonicalFields\n };\n}\n\nexport function fromDocumentMask(proto: ProtoDocumentMask): FieldMask {\n const paths = proto.fieldPaths || [];\n return new FieldMask(paths.map(path => FieldPath.fromServerFormat(path)));\n}\n\nexport function isValidResourceName(path: ResourcePath): boolean {\n // Resource names have at least 4 components (project ID, database ID)\n return (\n path.length >= 4 &&\n path.get(0) === 'projects' &&\n path.get(2) === 'databases'\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { Target } from '../core/target';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { ByteString } from '../util/byte_string';\n\n/** An enumeration of the different purposes we have for targets. */\nexport const enum TargetPurpose {\n /** A regular, normal query target. */\n Listen = 'TargetPurposeListen',\n\n /**\n * The query target was used to refill a query after an existence filter\n * mismatch.\n */\n ExistenceFilterMismatch = 'TargetPurposeExistenceFilterMismatch',\n\n /**\n * The query target was used if the query is the result of a false positive in\n * the bloom filter.\n */\n ExistenceFilterMismatchBloom = 'TargetPurposeExistenceFilterMismatchBloom',\n\n /** The query target was used to resolve a limbo document. */\n LimboResolution = 'TargetPurposeLimboResolution'\n}\n\n/**\n * An immutable set of metadata that the local store tracks for each target.\n */\nexport class TargetData {\n constructor(\n /** The target being listened to. */\n readonly target: Target,\n /**\n * The target ID to which the target corresponds; Assigned by the\n * LocalStore for user listens and by the SyncEngine for limbo watches.\n */\n readonly targetId: TargetId,\n /** The purpose of the target. */\n readonly purpose: TargetPurpose,\n /**\n * The sequence number of the last transaction during which this target data\n * was modified.\n */\n readonly sequenceNumber: ListenSequenceNumber,\n /** The latest snapshot version seen for this target. */\n readonly snapshotVersion: SnapshotVersion = SnapshotVersion.min(),\n /**\n * The maximum snapshot version at which the associated view\n * contained no limbo documents.\n */\n readonly lastLimboFreeSnapshotVersion: SnapshotVersion = SnapshotVersion.min(),\n /**\n * An opaque, server-assigned token that allows watching a target to be\n * resumed after disconnecting without retransmitting all the data that\n * matches the target. The resume token essentially identifies a point in\n * time from which the server should resume sending results.\n */\n readonly resumeToken: ByteString = ByteString.EMPTY_BYTE_STRING,\n /**\n * The number of documents that last matched the query at the resume token or\n * read time. Documents are counted only when making a listen request with\n * resume token or read time, otherwise, keep it null.\n */\n readonly expectedCount: number | null = null\n ) {}\n\n /** Creates a new target data instance with an updated sequence number. */\n withSequenceNumber(sequenceNumber: number): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n sequenceNumber,\n this.snapshotVersion,\n this.lastLimboFreeSnapshotVersion,\n this.resumeToken,\n this.expectedCount\n );\n }\n\n /**\n * Creates a new target data instance with an updated resume token and\n * snapshot version.\n */\n withResumeToken(\n resumeToken: ByteString,\n snapshotVersion: SnapshotVersion\n ): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n this.sequenceNumber,\n snapshotVersion,\n this.lastLimboFreeSnapshotVersion,\n resumeToken,\n /* expectedCount= */ null\n );\n }\n\n /**\n * Creates a new target data instance with an updated expected count.\n */\n withExpectedCount(expectedCount: number): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n this.sequenceNumber,\n this.snapshotVersion,\n this.lastLimboFreeSnapshotVersion,\n this.resumeToken,\n expectedCount\n );\n }\n\n /**\n * Creates a new target data instance with an updated last limbo free\n * snapshot version number.\n */\n withLastLimboFreeSnapshotVersion(\n lastLimboFreeSnapshotVersion: SnapshotVersion\n ): TargetData {\n return new TargetData(\n this.target,\n this.targetId,\n this.purpose,\n this.sequenceNumber,\n this.snapshotVersion,\n lastLimboFreeSnapshotVersion,\n this.resumeToken,\n this.expectedCount\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Timestamp } from '../api/timestamp';\nimport { BundleMetadata, NamedQuery } from '../core/bundle';\nimport { LimitType, Query, queryWithLimit } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetIsDocumentTarget } from '../core/target';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n FieldIndex,\n IndexOffset,\n IndexSegment,\n IndexState\n} from '../model/field_index';\nimport { MutationBatch } from '../model/mutation_batch';\nimport { Overlay } from '../model/overlay';\nimport { FieldPath } from '../model/path';\nimport {\n BundledQuery as ProtoBundledQuery,\n BundleMetadata as ProtoBundleMetadata,\n NamedQuery as ProtoNamedQuery\n} from '../protos/firestore_bundle_proto';\nimport { DocumentsTarget as PublicDocumentsTarget } from '../protos/firestore_proto_api';\nimport {\n convertQueryTargetToQuery,\n fromDocument,\n fromDocumentsTarget,\n fromMutation,\n fromQueryTarget,\n fromVersion,\n JsonProtoSerializer,\n toDocument,\n toDocumentsTarget,\n toMutation,\n toQueryTarget\n} from '../remote/serializer';\nimport { debugAssert, fail } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\n\nimport {\n decodeResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport {\n DbBundle,\n DbDocumentOverlay,\n DbIndexConfiguration,\n DbIndexState,\n DbMutationBatch,\n DbNamedQuery,\n DbQuery,\n DbRemoteDocument,\n DbTarget,\n DbTimestamp\n} from './indexeddb_schema';\nimport { DbDocumentOverlayKey, DbTimestampKey } from './indexeddb_sentinels';\nimport { TargetData, TargetPurpose } from './target_data';\n\n/** Serializer for values stored in the LocalStore. */\nexport class LocalSerializer {\n constructor(readonly remoteSerializer: JsonProtoSerializer) {}\n}\n\n/** Decodes a remote document from storage locally to a Document. */\nexport function fromDbRemoteDocument(\n localSerializer: LocalSerializer,\n remoteDoc: DbRemoteDocument\n): MutableDocument {\n let doc: MutableDocument;\n if (remoteDoc.document) {\n doc = fromDocument(\n localSerializer.remoteSerializer,\n remoteDoc.document,\n !!remoteDoc.hasCommittedMutations\n );\n } else if (remoteDoc.noDocument) {\n const key = DocumentKey.fromSegments(remoteDoc.noDocument.path);\n const version = fromDbTimestamp(remoteDoc.noDocument.readTime);\n doc = MutableDocument.newNoDocument(key, version);\n if (remoteDoc.hasCommittedMutations) {\n doc.setHasCommittedMutations();\n }\n } else if (remoteDoc.unknownDocument) {\n const key = DocumentKey.fromSegments(remoteDoc.unknownDocument.path);\n const version = fromDbTimestamp(remoteDoc.unknownDocument.version);\n doc = MutableDocument.newUnknownDocument(key, version);\n } else {\n return fail('Unexpected DbRemoteDocument');\n }\n\n if (remoteDoc.readTime) {\n doc.setReadTime(fromDbTimestampKey(remoteDoc.readTime));\n }\n\n return doc;\n}\n\n/** Encodes a document for storage locally. */\nexport function toDbRemoteDocument(\n localSerializer: LocalSerializer,\n document: MutableDocument\n): DbRemoteDocument {\n const key = document.key;\n const remoteDoc: DbRemoteDocument = {\n prefixPath: key.getCollectionPath().popLast().toArray(),\n collectionGroup: key.collectionGroup,\n documentId: key.path.lastSegment(),\n readTime: toDbTimestampKey(document.readTime),\n hasCommittedMutations: document.hasCommittedMutations\n };\n\n if (document.isFoundDocument()) {\n remoteDoc.document = toDocument(localSerializer.remoteSerializer, document);\n } else if (document.isNoDocument()) {\n remoteDoc.noDocument = {\n path: key.path.toArray(),\n readTime: toDbTimestamp(document.version)\n };\n } else if (document.isUnknownDocument()) {\n remoteDoc.unknownDocument = {\n path: key.path.toArray(),\n version: toDbTimestamp(document.version)\n };\n } else {\n return fail('Unexpected Document ' + document);\n }\n return remoteDoc;\n}\n\nexport function toDbTimestampKey(\n snapshotVersion: SnapshotVersion\n): DbTimestampKey {\n const timestamp = snapshotVersion.toTimestamp();\n return [timestamp.seconds, timestamp.nanoseconds];\n}\n\nexport function fromDbTimestampKey(\n dbTimestampKey: DbTimestampKey\n): SnapshotVersion {\n const timestamp = new Timestamp(dbTimestampKey[0], dbTimestampKey[1]);\n return SnapshotVersion.fromTimestamp(timestamp);\n}\n\nexport function toDbTimestamp(snapshotVersion: SnapshotVersion): DbTimestamp {\n const timestamp = snapshotVersion.toTimestamp();\n return { seconds: timestamp.seconds, nanoseconds: timestamp.nanoseconds };\n}\n\nfunction fromDbTimestamp(dbTimestamp: DbTimestamp): SnapshotVersion {\n const timestamp = new Timestamp(dbTimestamp.seconds, dbTimestamp.nanoseconds);\n return SnapshotVersion.fromTimestamp(timestamp);\n}\n\n/** Encodes a batch of mutations into a DbMutationBatch for local storage. */\nexport function toDbMutationBatch(\n localSerializer: LocalSerializer,\n userId: string,\n batch: MutationBatch\n): DbMutationBatch {\n const serializedBaseMutations = batch.baseMutations.map(m =>\n toMutation(localSerializer.remoteSerializer, m)\n );\n const serializedMutations = batch.mutations.map(m =>\n toMutation(localSerializer.remoteSerializer, m)\n );\n return {\n userId,\n batchId: batch.batchId,\n localWriteTimeMs: batch.localWriteTime.toMillis(),\n baseMutations: serializedBaseMutations,\n mutations: serializedMutations\n };\n}\n\n/** Decodes a DbMutationBatch into a MutationBatch */\nexport function fromDbMutationBatch(\n localSerializer: LocalSerializer,\n dbBatch: DbMutationBatch\n): MutationBatch {\n const baseMutations = (dbBatch.baseMutations || []).map(m =>\n fromMutation(localSerializer.remoteSerializer, m)\n );\n\n // Squash old transform mutations into existing patch or set mutations.\n // The replacement of representing `transforms` with `update_transforms`\n // on the SDK means that old `transform` mutations stored in IndexedDB need\n // to be updated to `update_transforms`.\n // TODO(b/174608374): Remove this code once we perform a schema migration.\n for (let i = 0; i < dbBatch.mutations.length - 1; ++i) {\n const currentMutation = dbBatch.mutations[i];\n const hasTransform =\n i + 1 < dbBatch.mutations.length &&\n dbBatch.mutations[i + 1].transform !== undefined;\n if (hasTransform) {\n debugAssert(\n dbBatch.mutations[i].transform === undefined &&\n dbBatch.mutations[i].update !== undefined,\n 'TransformMutation should be preceded by a patch or set mutation'\n );\n const transformMutation = dbBatch.mutations[i + 1];\n currentMutation.updateTransforms =\n transformMutation.transform!.fieldTransforms;\n dbBatch.mutations.splice(i + 1, 1);\n ++i;\n }\n }\n\n const mutations = dbBatch.mutations.map(m =>\n fromMutation(localSerializer.remoteSerializer, m)\n );\n const timestamp = Timestamp.fromMillis(dbBatch.localWriteTimeMs);\n return new MutationBatch(\n dbBatch.batchId,\n timestamp,\n baseMutations,\n mutations\n );\n}\n\n/** Decodes a DbTarget into TargetData */\nexport function fromDbTarget(dbTarget: DbTarget): TargetData {\n const version = fromDbTimestamp(dbTarget.readTime);\n const lastLimboFreeSnapshotVersion =\n dbTarget.lastLimboFreeSnapshotVersion !== undefined\n ? fromDbTimestamp(dbTarget.lastLimboFreeSnapshotVersion)\n : SnapshotVersion.min();\n\n let target: Target;\n if (isDocumentQuery(dbTarget.query)) {\n target = fromDocumentsTarget(dbTarget.query);\n } else {\n target = fromQueryTarget(dbTarget.query);\n }\n return new TargetData(\n target,\n dbTarget.targetId,\n TargetPurpose.Listen,\n dbTarget.lastListenSequenceNumber,\n version,\n lastLimboFreeSnapshotVersion,\n ByteString.fromBase64String(dbTarget.resumeToken)\n );\n}\n\n/** Encodes TargetData into a DbTarget for storage locally. */\nexport function toDbTarget(\n localSerializer: LocalSerializer,\n targetData: TargetData\n): DbTarget {\n debugAssert(\n TargetPurpose.Listen === targetData.purpose,\n 'Only queries with purpose ' +\n TargetPurpose.Listen +\n ' may be stored, got ' +\n targetData.purpose\n );\n const dbTimestamp = toDbTimestamp(targetData.snapshotVersion);\n const dbLastLimboFreeTimestamp = toDbTimestamp(\n targetData.lastLimboFreeSnapshotVersion\n );\n let queryProto: DbQuery;\n if (targetIsDocumentTarget(targetData.target)) {\n queryProto = toDocumentsTarget(\n localSerializer.remoteSerializer,\n targetData.target\n );\n } else {\n queryProto = toQueryTarget(\n localSerializer.remoteSerializer,\n targetData.target\n ).queryTarget;\n }\n\n // We can't store the resumeToken as a ByteString in IndexedDb, so we\n // convert it to a base64 string for storage.\n const resumeToken = targetData.resumeToken.toBase64();\n\n // lastListenSequenceNumber is always 0 until we do real GC.\n return {\n targetId: targetData.targetId,\n canonicalId: canonifyTarget(targetData.target),\n readTime: dbTimestamp,\n resumeToken,\n lastListenSequenceNumber: targetData.sequenceNumber,\n lastLimboFreeSnapshotVersion: dbLastLimboFreeTimestamp,\n query: queryProto\n };\n}\n\n/**\n * A helper function for figuring out what kind of query has been stored.\n */\nfunction isDocumentQuery(dbQuery: DbQuery): dbQuery is PublicDocumentsTarget {\n return (dbQuery as PublicDocumentsTarget).documents !== undefined;\n}\n\n/** Encodes a DbBundle to a BundleMetadata object. */\nexport function fromDbBundle(dbBundle: DbBundle): BundleMetadata {\n return {\n id: dbBundle.bundleId,\n createTime: fromDbTimestamp(dbBundle.createTime),\n version: dbBundle.version\n };\n}\n\n/** Encodes a BundleMetadata to a DbBundle. */\nexport function toDbBundle(metadata: ProtoBundleMetadata): DbBundle {\n return {\n bundleId: metadata.id!,\n createTime: toDbTimestamp(fromVersion(metadata.createTime!)),\n version: metadata.version!\n };\n}\n\n/** Encodes a DbNamedQuery to a NamedQuery. */\nexport function fromDbNamedQuery(dbNamedQuery: DbNamedQuery): NamedQuery {\n return {\n name: dbNamedQuery.name,\n query: fromBundledQuery(dbNamedQuery.bundledQuery),\n readTime: fromDbTimestamp(dbNamedQuery.readTime)\n };\n}\n\n/** Encodes a NamedQuery from a bundle proto to a DbNamedQuery. */\nexport function toDbNamedQuery(query: ProtoNamedQuery): DbNamedQuery {\n return {\n name: query.name!,\n readTime: toDbTimestamp(fromVersion(query.readTime!)),\n bundledQuery: query.bundledQuery!\n };\n}\n\n/**\n * Encodes a `BundledQuery` from bundle proto to a Query object.\n *\n * This reconstructs the original query used to build the bundle being loaded,\n * including features exists only in SDKs (for example: limit-to-last).\n */\nexport function fromBundledQuery(bundledQuery: ProtoBundledQuery): Query {\n const query = convertQueryTargetToQuery({\n parent: bundledQuery.parent!,\n structuredQuery: bundledQuery.structuredQuery!\n });\n if (bundledQuery.limitType === 'LAST') {\n debugAssert(\n !!query.limit,\n 'Bundled query has limitType LAST, but limit is null'\n );\n return queryWithLimit(query, query.limit, LimitType.Last);\n }\n return query;\n}\n\n/** Encodes a NamedQuery proto object to a NamedQuery model object. */\nexport function fromProtoNamedQuery(namedQuery: ProtoNamedQuery): NamedQuery {\n return {\n name: namedQuery.name!,\n query: fromBundledQuery(namedQuery.bundledQuery!),\n readTime: fromVersion(namedQuery.readTime!)\n };\n}\n\n/** Decodes a BundleMetadata proto into a BundleMetadata object. */\nexport function fromBundleMetadata(\n metadata: ProtoBundleMetadata\n): BundleMetadata {\n return {\n id: metadata.id!,\n version: metadata.version!,\n createTime: fromVersion(metadata.createTime!)\n };\n}\n\n/** Encodes a DbDocumentOverlay object to an Overlay model object. */\nexport function fromDbDocumentOverlay(\n localSerializer: LocalSerializer,\n dbDocumentOverlay: DbDocumentOverlay\n): Overlay {\n return new Overlay(\n dbDocumentOverlay.largestBatchId,\n fromMutation(\n localSerializer.remoteSerializer,\n dbDocumentOverlay.overlayMutation\n )\n );\n}\n\n/** Decodes an Overlay model object into a DbDocumentOverlay object. */\nexport function toDbDocumentOverlay(\n localSerializer: LocalSerializer,\n userId: string,\n overlay: Overlay\n): DbDocumentOverlay {\n const [_, collectionPath, documentId] = toDbDocumentOverlayKey(\n userId,\n overlay.mutation.key\n );\n return {\n userId,\n collectionPath,\n documentId,\n collectionGroup: overlay.mutation.key.getCollectionGroup(),\n largestBatchId: overlay.largestBatchId,\n overlayMutation: toMutation(\n localSerializer.remoteSerializer,\n overlay.mutation\n )\n };\n}\n\n/**\n * Returns the DbDocumentOverlayKey corresponding to the given user and\n * document key.\n */\nexport function toDbDocumentOverlayKey(\n userId: string,\n docKey: DocumentKey\n): DbDocumentOverlayKey {\n const docId = docKey.path.lastSegment();\n const collectionPath = encodeResourcePath(docKey.path.popLast());\n return [userId, collectionPath, docId];\n}\n\nexport function toDbIndexConfiguration(\n index: FieldIndex\n): DbIndexConfiguration {\n return {\n indexId: index.indexId,\n collectionGroup: index.collectionGroup,\n fields: index.fields.map(s => [s.fieldPath.canonicalString(), s.kind])\n };\n}\n\nexport function fromDbIndexConfiguration(\n index: DbIndexConfiguration,\n state: DbIndexState | null\n): FieldIndex {\n const decodedState = state\n ? new IndexState(\n state.sequenceNumber,\n new IndexOffset(\n fromDbTimestamp(state.readTime),\n new DocumentKey(decodeResourcePath(state.documentKey)),\n state.largestBatchId\n )\n )\n : IndexState.empty();\n const decodedSegments = index.fields.map(\n ([fieldPath, kind]) =>\n new IndexSegment(FieldPath.fromServerFormat(fieldPath), kind)\n );\n return new FieldIndex(\n index.indexId!,\n index.collectionGroup,\n decodedSegments,\n decodedState\n );\n}\n\nexport function toDbIndexState(\n indexId: number,\n uid: string,\n sequenceNumber: number,\n offset: IndexOffset\n): DbIndexState {\n return {\n indexId,\n uid,\n sequenceNumber,\n readTime: toDbTimestamp(offset.readTime),\n documentKey: encodeResourcePath(offset.documentKey.path),\n largestBatchId: offset.largestBatchId\n };\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKey } from '../model/document_key';\nimport {\n normalizeByteString,\n normalizeNumber,\n normalizeTimestamp\n} from '../model/normalize';\nimport {\n isVectorValue,\n VECTOR_MAP_VECTORS_KEY,\n isMaxValue\n} from '../model/values';\nimport { ArrayValue, MapValue, Value } from '../protos/firestore_proto_api';\nimport { fail } from '../util/assert';\nimport { isNegativeZero } from '../util/types';\n\nimport { DirectionalIndexByteEncoder } from './directional_index_byte_encoder';\n\n// Note: This code is copied from the backend. Code that is not used by\n// Firestore was removed.\n\nconst INDEX_TYPE_NULL = 5;\nconst INDEX_TYPE_BOOLEAN = 10;\nconst INDEX_TYPE_NAN = 13;\nconst INDEX_TYPE_NUMBER = 15;\nconst INDEX_TYPE_TIMESTAMP = 20;\nconst INDEX_TYPE_STRING = 25;\nconst INDEX_TYPE_BLOB = 30;\nconst INDEX_TYPE_REFERENCE = 37;\nconst INDEX_TYPE_GEOPOINT = 45;\nconst INDEX_TYPE_ARRAY = 50;\nconst INDEX_TYPE_VECTOR = 53;\nconst INDEX_TYPE_MAP = 55;\nconst INDEX_TYPE_REFERENCE_SEGMENT = 60;\n\n// A terminator that indicates that a truncatable value was not truncated.\n// This must be smaller than all other type labels.\nconst NOT_TRUNCATED = 2;\n\n/** Firestore index value writer. */\nexport class FirestoreIndexValueWriter {\n static INSTANCE = new FirestoreIndexValueWriter();\n\n private constructor() {}\n\n // The write methods below short-circuit writing terminators for values\n // containing a (terminating) truncated value.\n //\n // As an example, consider the resulting encoding for:\n //\n // [\"bar\", [2, \"foo\"]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TERM, TERM, TERM)\n // [\"bar\", [2, truncated(\"foo\")]] -> (STRING, \"bar\", TERM, ARRAY, NUMBER, 2, STRING, \"foo\", TRUNC)\n // [\"bar\", truncated([\"foo\"])] -> (STRING, \"bar\", TERM, ARRAY. STRING, \"foo\", TERM, TRUNC)\n\n /** Writes an index value. */\n writeIndexValue(value: Value, encoder: DirectionalIndexByteEncoder): void {\n this.writeIndexValueAux(value, encoder);\n // Write separator to split index values\n // (see go/firestore-storage-format#encodings).\n encoder.writeInfinity();\n }\n\n private writeIndexValueAux(\n indexValue: Value,\n encoder: DirectionalIndexByteEncoder\n ): void {\n if ('nullValue' in indexValue) {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_NULL);\n } else if ('booleanValue' in indexValue) {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_BOOLEAN);\n encoder.writeNumber(indexValue.booleanValue ? 1 : 0);\n } else if ('integerValue' in indexValue) {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_NUMBER);\n encoder.writeNumber(normalizeNumber(indexValue.integerValue));\n } else if ('doubleValue' in indexValue) {\n const n = normalizeNumber(indexValue.doubleValue);\n if (isNaN(n)) {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_NAN);\n } else {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_NUMBER);\n if (isNegativeZero(n)) {\n // -0.0, 0 and 0.0 are all considered the same\n encoder.writeNumber(0.0);\n } else {\n encoder.writeNumber(n);\n }\n }\n } else if ('timestampValue' in indexValue) {\n let timestamp = indexValue.timestampValue!;\n this.writeValueTypeLabel(encoder, INDEX_TYPE_TIMESTAMP);\n if (typeof timestamp === 'string') {\n timestamp = normalizeTimestamp(timestamp);\n }\n encoder.writeString(`${timestamp.seconds || ''}`);\n encoder.writeNumber(timestamp.nanos || 0);\n } else if ('stringValue' in indexValue) {\n this.writeIndexString(indexValue.stringValue!, encoder);\n this.writeTruncationMarker(encoder);\n } else if ('bytesValue' in indexValue) {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_BLOB);\n encoder.writeBytes(normalizeByteString(indexValue.bytesValue!));\n this.writeTruncationMarker(encoder);\n } else if ('referenceValue' in indexValue) {\n this.writeIndexEntityRef(indexValue.referenceValue!, encoder);\n } else if ('geoPointValue' in indexValue) {\n const geoPoint = indexValue.geoPointValue!;\n this.writeValueTypeLabel(encoder, INDEX_TYPE_GEOPOINT);\n encoder.writeNumber(geoPoint.latitude || 0);\n encoder.writeNumber(geoPoint.longitude || 0);\n } else if ('mapValue' in indexValue) {\n if (isMaxValue(indexValue)) {\n this.writeValueTypeLabel(encoder, Number.MAX_SAFE_INTEGER);\n } else if (isVectorValue(indexValue)) {\n this.writeIndexVector(indexValue.mapValue!, encoder);\n } else {\n this.writeIndexMap(indexValue.mapValue!, encoder);\n this.writeTruncationMarker(encoder);\n }\n } else if ('arrayValue' in indexValue) {\n this.writeIndexArray(indexValue.arrayValue!, encoder);\n this.writeTruncationMarker(encoder);\n } else {\n fail('unknown index value type ' + indexValue);\n }\n }\n\n private writeIndexString(\n stringIndexValue: string,\n encoder: DirectionalIndexByteEncoder\n ): void {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_STRING);\n this.writeUnlabeledIndexString(stringIndexValue, encoder);\n }\n\n private writeUnlabeledIndexString(\n stringIndexValue: string,\n encoder: DirectionalIndexByteEncoder\n ): void {\n encoder.writeString(stringIndexValue);\n }\n\n private writeIndexMap(\n mapIndexValue: MapValue,\n encoder: DirectionalIndexByteEncoder\n ): void {\n const map = mapIndexValue.fields || {};\n this.writeValueTypeLabel(encoder, INDEX_TYPE_MAP);\n for (const key of Object.keys(map)) {\n this.writeIndexString(key, encoder);\n this.writeIndexValueAux(map[key], encoder);\n }\n }\n\n private writeIndexVector(\n mapIndexValue: MapValue,\n encoder: DirectionalIndexByteEncoder\n ): void {\n const map = mapIndexValue.fields || {};\n this.writeValueTypeLabel(encoder, INDEX_TYPE_VECTOR);\n\n // Vectors sort first by length\n const key = VECTOR_MAP_VECTORS_KEY;\n const length = map[key].arrayValue?.values?.length || 0;\n this.writeValueTypeLabel(encoder, INDEX_TYPE_NUMBER);\n encoder.writeNumber(normalizeNumber(length));\n\n // Vectors then sort by position value\n this.writeIndexString(key, encoder);\n this.writeIndexValueAux(map[key], encoder);\n }\n\n private writeIndexArray(\n arrayIndexValue: ArrayValue,\n encoder: DirectionalIndexByteEncoder\n ): void {\n const values = arrayIndexValue.values || [];\n this.writeValueTypeLabel(encoder, INDEX_TYPE_ARRAY);\n for (const element of values) {\n this.writeIndexValueAux(element, encoder);\n }\n }\n\n private writeIndexEntityRef(\n referenceValue: string,\n encoder: DirectionalIndexByteEncoder\n ): void {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_REFERENCE);\n const path = DocumentKey.fromName(referenceValue).path;\n path.forEach(segment => {\n this.writeValueTypeLabel(encoder, INDEX_TYPE_REFERENCE_SEGMENT);\n this.writeUnlabeledIndexString(segment, encoder);\n });\n }\n\n private writeValueTypeLabel(\n encoder: DirectionalIndexByteEncoder,\n typeOrder: number\n ): void {\n encoder.writeNumber(typeOrder);\n }\n\n private writeTruncationMarker(encoder: DirectionalIndexByteEncoder): void {\n // While the SDK does not implement truncation, the truncation marker is\n // used to terminate all variable length values (which are strings, bytes,\n // references, arrays and maps).\n encoder.writeNumber(NOT_TRUNCATED);\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Target } from '../core/target';\nimport { DocumentMap } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldIndex, IndexOffset } from '../model/field_index';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { IndexManager, IndexType } from './index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * An in-memory implementation of IndexManager.\n */\nexport class MemoryIndexManager implements IndexManager {\n private collectionParentIndex = new MemoryCollectionParentIndex();\n\n addToCollectionParentIndex(\n transaction: PersistenceTransaction,\n collectionPath: ResourcePath\n ): PersistencePromise {\n this.collectionParentIndex.add(collectionPath);\n return PersistencePromise.resolve();\n }\n\n getCollectionParents(\n transaction: PersistenceTransaction,\n collectionId: string\n ): PersistencePromise {\n return PersistencePromise.resolve(\n this.collectionParentIndex.getEntries(collectionId)\n );\n }\n\n addFieldIndex(\n transaction: PersistenceTransaction,\n index: FieldIndex\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n\n deleteFieldIndex(\n transaction: PersistenceTransaction,\n index: FieldIndex\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n\n deleteAllFieldIndexes(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n\n createTargetIndexes(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n\n getDocumentsMatchingTarget(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n\n getIndexType(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(IndexType.NONE);\n }\n\n getFieldIndexes(\n transaction: PersistenceTransaction,\n collectionGroup?: string\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve([]);\n }\n\n getNextCollectionGroupToUpdate(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve(null);\n }\n\n getMinOffset(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n\n getMinOffsetFromCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string\n ): PersistencePromise {\n return PersistencePromise.resolve(IndexOffset.min());\n }\n\n updateCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string,\n offset: IndexOffset\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n\n updateIndexEntries(\n transaction: PersistenceTransaction,\n documents: DocumentMap\n ): PersistencePromise {\n // Field indices are not supported with memory persistence.\n return PersistencePromise.resolve();\n }\n}\n\n/**\n * Internal implementation of the collection-parent index exposed by MemoryIndexManager.\n * Also used for in-memory caching by IndexedDbIndexManager and initial index population\n * in indexeddb_schema.ts\n */\nexport class MemoryCollectionParentIndex {\n private index = {} as {\n [collectionId: string]: SortedSet;\n };\n\n // Returns false if the entry already existed.\n add(collectionPath: ResourcePath): boolean {\n debugAssert(collectionPath.length % 2 === 1, 'Expected a collection path.');\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n const existingParents =\n this.index[collectionId] ||\n new SortedSet(ResourcePath.comparator);\n const added = !existingParents.has(parentPath);\n this.index[collectionId] = existingParents.add(parentPath);\n return added;\n }\n\n has(collectionPath: ResourcePath): boolean {\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n const existingParents = this.index[collectionId];\n return existingParents && existingParents.has(parentPath);\n }\n\n getEntries(collectionId: string): ResourcePath[] {\n const parentPaths =\n this.index[collectionId] ||\n new SortedSet(ResourcePath.comparator);\n return parentPaths.toArray();\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { Bound } from '../core/bound';\nimport { DatabaseId } from '../core/database_info';\nimport {\n CompositeFilter,\n CompositeOperator,\n FieldFilter,\n Filter,\n Operator\n} from '../core/filter';\nimport {\n canonifyTarget,\n newTarget,\n Target,\n targetEquals,\n targetGetArrayValues,\n targetGetLowerBound,\n targetGetNotInValues,\n targetGetSegmentCount,\n targetGetUpperBound,\n targetHasLimit\n} from '../core/target';\nimport { FirestoreIndexValueWriter } from '../index/firestore_index_value_writer';\nimport { IndexByteEncoder } from '../index/index_byte_encoder';\nimport { IndexEntry, indexEntryComparator } from '../index/index_entry';\nimport { documentKeySet, DocumentMap } from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n FieldIndex,\n fieldIndexGetArraySegment,\n fieldIndexGetDirectionalSegments,\n fieldIndexGetKeyOrder,\n fieldIndexToString,\n IndexKind,\n IndexOffset,\n indexOffsetComparator,\n IndexSegment\n} from '../model/field_index';\nimport { FieldPath, ResourcePath } from '../model/path';\nimport { TargetIndexMatcher } from '../model/target_index_matcher';\nimport { isArray, refValue } from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { debugAssert, fail, hardAssert } from '../util/assert';\nimport { logDebug } from '../util/log';\nimport { getDnfTerms } from '../util/logic_utils';\nimport { immediateSuccessor, primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { diffSortedSets, SortedSet } from '../util/sorted_set';\n\nimport {\n decodeResourcePath,\n encodeResourcePath\n} from './encoded_resource_path';\nimport { IndexManager, IndexType } from './index_manager';\nimport {\n DbCollectionParent,\n DbIndexConfiguration,\n DbIndexEntry,\n DbIndexState\n} from './indexeddb_schema';\nimport {\n DbCollectionParentKey,\n DbCollectionParentStore,\n DbIndexConfigurationCollectionGroupIndex,\n DbIndexConfigurationKey,\n DbIndexConfigurationStore,\n DbIndexEntryDocumentKeyIndex,\n DbIndexEntryKey,\n DbIndexEntryStore,\n DbIndexStateKey,\n DbIndexStateSequenceNumberIndex,\n DbIndexStateStore\n} from './indexeddb_sentinels';\nimport { getStore } from './indexeddb_transaction';\nimport {\n fromDbIndexConfiguration,\n toDbIndexConfiguration,\n toDbIndexState\n} from './local_serializer';\nimport { MemoryCollectionParentIndex } from './memory_index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { SimpleDbStore } from './simple_db';\n\nconst LOG_TAG = 'IndexedDbIndexManager';\n\nconst EMPTY_VALUE = new Uint8Array(0);\n\n/**\n * A persisted implementation of IndexManager.\n *\n * PORTING NOTE: Unlike iOS and Android, the Web SDK does not memoize index\n * data as it supports multi-tab access.\n */\nexport class IndexedDbIndexManager implements IndexManager {\n /**\n * An in-memory copy of the index entries we've already written since the SDK\n * launched. Used to avoid re-writing the same entry repeatedly.\n *\n * This is *NOT* a complete cache of what's in persistence and so can never be\n * used to satisfy reads.\n */\n private collectionParentsCache = new MemoryCollectionParentIndex();\n\n private readonly uid: string;\n\n /**\n * Maps from a target to its equivalent list of sub-targets. Each sub-target\n * contains only one term from the target's disjunctive normal form (DNF).\n */\n private targetToDnfSubTargets = new ObjectMap(\n t => canonifyTarget(t),\n (l, r) => targetEquals(l, r)\n );\n\n constructor(user: User, private readonly databaseId: DatabaseId) {\n this.uid = user.uid || '';\n }\n\n /**\n * Adds a new entry to the collection parent index.\n *\n * Repeated calls for the same collectionPath should be avoided within a\n * transaction as IndexedDbIndexManager only caches writes once a transaction\n * has been committed.\n */\n addToCollectionParentIndex(\n transaction: PersistenceTransaction,\n collectionPath: ResourcePath\n ): PersistencePromise {\n debugAssert(collectionPath.length % 2 === 1, 'Expected a collection path.');\n if (!this.collectionParentsCache.has(collectionPath)) {\n const collectionId = collectionPath.lastSegment();\n const parentPath = collectionPath.popLast();\n\n transaction.addOnCommittedListener(() => {\n // Add the collection to the in memory cache only if the transaction was\n // successfully committed.\n this.collectionParentsCache.add(collectionPath);\n });\n\n const collectionParent: DbCollectionParent = {\n collectionId,\n parent: encodeResourcePath(parentPath)\n };\n return collectionParentsStore(transaction).put(collectionParent);\n }\n return PersistencePromise.resolve();\n }\n\n getCollectionParents(\n transaction: PersistenceTransaction,\n collectionId: string\n ): PersistencePromise {\n const parentPaths = [] as ResourcePath[];\n const range = IDBKeyRange.bound(\n [collectionId, ''],\n [immediateSuccessor(collectionId), ''],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n );\n return collectionParentsStore(transaction)\n .loadAll(range)\n .next(entries => {\n for (const entry of entries) {\n // This collectionId guard shouldn't be necessary (and isn't as long\n // as we're running in a real browser), but there's a bug in\n // indexeddbshim that breaks our range in our tests running in node:\n // https://github.com/axemclion/IndexedDBShim/issues/334\n if (entry.collectionId !== collectionId) {\n break;\n }\n parentPaths.push(decodeResourcePath(entry.parent));\n }\n return parentPaths;\n });\n }\n\n addFieldIndex(\n transaction: PersistenceTransaction,\n index: FieldIndex\n ): PersistencePromise {\n // TODO(indexing): Verify that the auto-incrementing index ID works in\n // Safari & Firefox.\n const indexes = indexConfigurationStore(transaction);\n const dbIndex = toDbIndexConfiguration(index);\n delete dbIndex.indexId; // `indexId` is auto-populated by IndexedDb\n const result = indexes.add(dbIndex);\n if (index.indexState) {\n const states = indexStateStore(transaction);\n return result.next(indexId => {\n states.put(\n toDbIndexState(\n indexId,\n this.uid,\n index.indexState.sequenceNumber,\n index.indexState.offset\n )\n );\n });\n } else {\n return result.next();\n }\n }\n\n deleteFieldIndex(\n transaction: PersistenceTransaction,\n index: FieldIndex\n ): PersistencePromise {\n const indexes = indexConfigurationStore(transaction);\n const states = indexStateStore(transaction);\n const entries = indexEntriesStore(transaction);\n return indexes\n .delete(index.indexId)\n .next(() =>\n states.delete(\n IDBKeyRange.bound(\n [index.indexId],\n [index.indexId + 1],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n )\n )\n )\n .next(() =>\n entries.delete(\n IDBKeyRange.bound(\n [index.indexId],\n [index.indexId + 1],\n /*lowerOpen=*/ false,\n /*upperOpen=*/ true\n )\n )\n );\n }\n\n deleteAllFieldIndexes(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n const indexes = indexConfigurationStore(transaction);\n const entries = indexEntriesStore(transaction);\n const states = indexStateStore(transaction);\n\n return indexes\n .deleteAll()\n .next(() => entries.deleteAll())\n .next(() => states.deleteAll());\n }\n\n createTargetIndexes(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n return PersistencePromise.forEach(\n this.getSubTargets(target),\n (subTarget: Target) => {\n return this.getIndexType(transaction, subTarget).next(type => {\n if (type === IndexType.NONE || type === IndexType.PARTIAL) {\n const targetIndexMatcher = new TargetIndexMatcher(subTarget);\n const fieldIndex = targetIndexMatcher.buildTargetIndex();\n if (fieldIndex != null) {\n return this.addFieldIndex(transaction, fieldIndex);\n }\n }\n });\n }\n );\n }\n\n getDocumentsMatchingTarget(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n const indexEntries = indexEntriesStore(transaction);\n\n let canServeTarget = true;\n const indexes = new Map();\n\n return PersistencePromise.forEach(\n this.getSubTargets(target),\n (subTarget: Target) => {\n return this.getFieldIndex(transaction, subTarget).next(index => {\n canServeTarget &&= !!index;\n indexes.set(subTarget, index);\n });\n }\n ).next(() => {\n if (!canServeTarget) {\n return PersistencePromise.resolve(null as DocumentKey[] | null);\n } else {\n let existingKeys = documentKeySet();\n const result: DocumentKey[] = [];\n return PersistencePromise.forEach(indexes, (index, subTarget) => {\n logDebug(\n LOG_TAG,\n `Using index ${fieldIndexToString(\n index!\n )} to execute ${canonifyTarget(target)}`\n );\n\n const arrayValues = targetGetArrayValues(subTarget, index!);\n const notInValues = targetGetNotInValues(subTarget, index!);\n const lowerBound = targetGetLowerBound(subTarget, index!);\n const upperBound = targetGetUpperBound(subTarget, index!);\n\n const lowerBoundEncoded = this.encodeBound(\n index!,\n subTarget,\n lowerBound\n );\n const upperBoundEncoded = this.encodeBound(\n index!,\n subTarget,\n upperBound\n );\n const notInEncoded = this.encodeValues(\n index!,\n subTarget,\n notInValues\n );\n\n const indexRanges = this.generateIndexRanges(\n index!.indexId,\n arrayValues,\n lowerBoundEncoded,\n lowerBound.inclusive,\n upperBoundEncoded,\n upperBound.inclusive,\n notInEncoded\n );\n return PersistencePromise.forEach(\n indexRanges,\n (indexRange: IDBKeyRange) => {\n return indexEntries\n .loadFirst(indexRange, target.limit)\n .next(entries => {\n entries.forEach(entry => {\n const documentKey = DocumentKey.fromSegments(\n entry.documentKey\n );\n if (!existingKeys.has(documentKey)) {\n existingKeys = existingKeys.add(documentKey);\n result.push(documentKey);\n }\n });\n });\n }\n );\n }).next(() => result as DocumentKey[] | null);\n }\n });\n }\n\n private getSubTargets(target: Target): Target[] {\n let subTargets = this.targetToDnfSubTargets.get(target);\n if (subTargets) {\n return subTargets;\n }\n\n if (target.filters.length === 0) {\n subTargets = [target];\n } else {\n // There is an implicit AND operation between all the filters stored in the target\n const dnf: Filter[] = getDnfTerms(\n CompositeFilter.create(target.filters, CompositeOperator.AND)\n );\n\n subTargets = dnf.map(term =>\n newTarget(\n target.path,\n target.collectionGroup,\n target.orderBy,\n term.getFilters(),\n target.limit,\n target.startAt,\n target.endAt\n )\n );\n }\n\n this.targetToDnfSubTargets.set(target, subTargets);\n return subTargets;\n }\n\n /**\n * Constructs a key range query on `DbIndexEntryStore` that unions all\n * bounds.\n */\n private generateIndexRanges(\n indexId: number,\n arrayValues: ProtoValue[] | null,\n lowerBounds: Uint8Array[],\n lowerBoundInclusive: boolean,\n upperBounds: Uint8Array[],\n upperBoundInclusive: boolean,\n notInValues: Uint8Array[]\n ): IDBKeyRange[] {\n // The number of total index scans we union together. This is similar to a\n // distributed normal form, but adapted for array values. We create a single\n // index range per value in an ARRAY_CONTAINS or ARRAY_CONTAINS_ANY filter\n // combined with the values from the query bounds.\n const totalScans =\n (arrayValues != null ? arrayValues.length : 1) *\n Math.max(lowerBounds.length, upperBounds.length);\n const scansPerArrayElement =\n totalScans / (arrayValues != null ? arrayValues.length : 1);\n\n const indexRanges: IDBKeyRange[] = [];\n for (let i = 0; i < totalScans; ++i) {\n const arrayValue = arrayValues\n ? this.encodeSingleElement(arrayValues[i / scansPerArrayElement])\n : EMPTY_VALUE;\n\n const lowerBound = this.generateLowerBound(\n indexId,\n arrayValue,\n lowerBounds[i % scansPerArrayElement],\n lowerBoundInclusive\n );\n const upperBound = this.generateUpperBound(\n indexId,\n arrayValue,\n upperBounds[i % scansPerArrayElement],\n upperBoundInclusive\n );\n\n const notInBound = notInValues.map(notIn =>\n this.generateLowerBound(\n indexId,\n arrayValue,\n notIn,\n /* inclusive= */ true\n )\n );\n\n indexRanges.push(...this.createRange(lowerBound, upperBound, notInBound));\n }\n\n return indexRanges;\n }\n\n /** Generates the lower bound for `arrayValue` and `directionalValue`. */\n private generateLowerBound(\n indexId: number,\n arrayValue: Uint8Array,\n directionalValue: Uint8Array,\n inclusive: boolean\n ): IndexEntry {\n const entry = new IndexEntry(\n indexId,\n DocumentKey.empty(),\n arrayValue,\n directionalValue\n );\n return inclusive ? entry : entry.successor();\n }\n\n /** Generates the upper bound for `arrayValue` and `directionalValue`. */\n private generateUpperBound(\n indexId: number,\n arrayValue: Uint8Array,\n directionalValue: Uint8Array,\n inclusive: boolean\n ): IndexEntry {\n const entry = new IndexEntry(\n indexId,\n DocumentKey.empty(),\n arrayValue,\n directionalValue\n );\n return inclusive ? entry.successor() : entry;\n }\n\n private getFieldIndex(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n const targetIndexMatcher = new TargetIndexMatcher(target);\n const collectionGroup =\n target.collectionGroup != null\n ? target.collectionGroup\n : target.path.lastSegment();\n\n return this.getFieldIndexes(transaction, collectionGroup).next(indexes => {\n // Return the index with the most number of segments.\n let index: FieldIndex | null = null;\n for (const candidate of indexes) {\n const matches = targetIndexMatcher.servedByIndex(candidate);\n if (\n matches &&\n (!index || candidate.fields.length > index.fields.length)\n ) {\n index = candidate;\n }\n }\n return index;\n });\n }\n\n getIndexType(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n let indexType = IndexType.FULL;\n const subTargets = this.getSubTargets(target);\n return PersistencePromise.forEach(subTargets, (target: Target) => {\n return this.getFieldIndex(transaction, target).next(index => {\n if (!index) {\n indexType = IndexType.NONE;\n } else if (\n indexType !== IndexType.NONE &&\n index.fields.length < targetGetSegmentCount(target)\n ) {\n indexType = IndexType.PARTIAL;\n }\n });\n }).next(() => {\n // OR queries have more than one sub-target (one sub-target per DNF term). We currently consider\n // OR queries that have a `limit` to have a partial index. For such queries we perform sorting\n // and apply the limit in memory as a post-processing step.\n if (\n targetHasLimit(target) &&\n subTargets.length > 1 &&\n indexType === IndexType.FULL\n ) {\n return IndexType.PARTIAL;\n }\n\n return indexType;\n });\n }\n\n /**\n * Returns the byte encoded form of the directional values in the field index.\n * Returns `null` if the document does not have all fields specified in the\n * index.\n */\n private encodeDirectionalElements(\n fieldIndex: FieldIndex,\n document: Document\n ): Uint8Array | null {\n const encoder = new IndexByteEncoder();\n for (const segment of fieldIndexGetDirectionalSegments(fieldIndex)) {\n const field = document.data.field(segment.fieldPath);\n if (field == null) {\n return null;\n }\n const directionalEncoder = encoder.forKind(segment.kind);\n FirestoreIndexValueWriter.INSTANCE.writeIndexValue(\n field,\n directionalEncoder\n );\n }\n return encoder.encodedBytes();\n }\n\n /** Encodes a single value to the ascending index format. */\n private encodeSingleElement(value: ProtoValue): Uint8Array {\n const encoder = new IndexByteEncoder();\n FirestoreIndexValueWriter.INSTANCE.writeIndexValue(\n value,\n encoder.forKind(IndexKind.ASCENDING)\n );\n return encoder.encodedBytes();\n }\n\n /**\n * Returns an encoded form of the document key that sorts based on the key\n * ordering of the field index.\n */\n private encodeDirectionalKey(\n fieldIndex: FieldIndex,\n documentKey: DocumentKey\n ): Uint8Array {\n const encoder = new IndexByteEncoder();\n FirestoreIndexValueWriter.INSTANCE.writeIndexValue(\n refValue(this.databaseId, documentKey),\n encoder.forKind(fieldIndexGetKeyOrder(fieldIndex))\n );\n return encoder.encodedBytes();\n }\n\n /**\n * Encodes the given field values according to the specification in `target`.\n * For IN queries, a list of possible values is returned.\n */\n private encodeValues(\n fieldIndex: FieldIndex,\n target: Target,\n values: ProtoValue[] | null\n ): Uint8Array[] {\n if (values === null) {\n return [];\n }\n\n let encoders: IndexByteEncoder[] = [];\n encoders.push(new IndexByteEncoder());\n\n let valueIdx = 0;\n for (const segment of fieldIndexGetDirectionalSegments(fieldIndex)) {\n const value = values[valueIdx++];\n for (const encoder of encoders) {\n if (this.isInFilter(target, segment.fieldPath) && isArray(value)) {\n encoders = this.expandIndexValues(encoders, segment, value);\n } else {\n const directionalEncoder = encoder.forKind(segment.kind);\n FirestoreIndexValueWriter.INSTANCE.writeIndexValue(\n value,\n directionalEncoder\n );\n }\n }\n }\n return this.getEncodedBytes(encoders);\n }\n\n /**\n * Encodes the given bounds according to the specification in `target`. For IN\n * queries, a list of possible values is returned.\n */\n private encodeBound(\n fieldIndex: FieldIndex,\n target: Target,\n bound: Bound\n ): Uint8Array[] {\n return this.encodeValues(fieldIndex, target, bound.position);\n }\n\n /** Returns the byte representation for the provided encoders. */\n private getEncodedBytes(encoders: IndexByteEncoder[]): Uint8Array[] {\n const result: Uint8Array[] = [];\n for (let i = 0; i < encoders.length; ++i) {\n result[i] = encoders[i].encodedBytes();\n }\n return result;\n }\n\n /**\n * Creates a separate encoder for each element of an array.\n *\n * The method appends each value to all existing encoders (e.g. filter(\"a\",\n * \"==\", \"a1\").filter(\"b\", \"in\", [\"b1\", \"b2\"]) becomes [\"a1,b1\", \"a1,b2\"]). A\n * list of new encoders is returned.\n */\n private expandIndexValues(\n encoders: IndexByteEncoder[],\n segment: IndexSegment,\n value: ProtoValue\n ): IndexByteEncoder[] {\n const prefixes = [...encoders];\n const results: IndexByteEncoder[] = [];\n for (const arrayElement of value.arrayValue!.values || []) {\n for (const prefix of prefixes) {\n const clonedEncoder = new IndexByteEncoder();\n clonedEncoder.seed(prefix.encodedBytes());\n FirestoreIndexValueWriter.INSTANCE.writeIndexValue(\n arrayElement,\n clonedEncoder.forKind(segment.kind)\n );\n results.push(clonedEncoder);\n }\n }\n return results;\n }\n\n private isInFilter(target: Target, fieldPath: FieldPath): boolean {\n return !!target.filters.find(\n f =>\n f instanceof FieldFilter &&\n f.field.isEqual(fieldPath) &&\n (f.op === Operator.IN || f.op === Operator.NOT_IN)\n );\n }\n\n getFieldIndexes(\n transaction: PersistenceTransaction,\n collectionGroup?: string\n ): PersistencePromise {\n const indexes = indexConfigurationStore(transaction);\n const states = indexStateStore(transaction);\n\n return (\n collectionGroup\n ? indexes.loadAll(\n DbIndexConfigurationCollectionGroupIndex,\n IDBKeyRange.bound(collectionGroup, collectionGroup)\n )\n : indexes.loadAll()\n ).next(indexConfigs => {\n const result: FieldIndex[] = [];\n return PersistencePromise.forEach(\n indexConfigs,\n (indexConfig: DbIndexConfiguration) => {\n return states\n .get([indexConfig.indexId!, this.uid])\n .next(indexState => {\n result.push(fromDbIndexConfiguration(indexConfig, indexState));\n });\n }\n ).next(() => result);\n });\n }\n\n getNextCollectionGroupToUpdate(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return this.getFieldIndexes(transaction).next(indexes => {\n if (indexes.length === 0) {\n return null;\n }\n indexes.sort((l, r) => {\n const cmp = l.indexState.sequenceNumber - r.indexState.sequenceNumber;\n return cmp !== 0\n ? cmp\n : primitiveComparator(l.collectionGroup, r.collectionGroup);\n });\n return indexes[0].collectionGroup;\n });\n }\n\n updateCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string,\n offset: IndexOffset\n ): PersistencePromise {\n const indexes = indexConfigurationStore(transaction);\n const states = indexStateStore(transaction);\n return this.getNextSequenceNumber(transaction).next(nextSequenceNumber =>\n indexes\n .loadAll(\n DbIndexConfigurationCollectionGroupIndex,\n IDBKeyRange.bound(collectionGroup, collectionGroup)\n )\n .next(configs =>\n PersistencePromise.forEach(configs, (config: DbIndexConfiguration) =>\n states.put(\n toDbIndexState(\n config.indexId!,\n this.uid,\n nextSequenceNumber,\n offset\n )\n )\n )\n )\n );\n }\n\n updateIndexEntries(\n transaction: PersistenceTransaction,\n documents: DocumentMap\n ): PersistencePromise {\n // Porting Note: `getFieldIndexes()` on Web does not cache index lookups as\n // it could be used across different IndexedDB transactions. As any cached\n // data might be invalidated by other multi-tab clients, we can only trust\n // data within a single IndexedDB transaction. We therefore add a cache\n // here.\n const memoizedIndexes = new Map();\n return PersistencePromise.forEach(documents, (key, doc) => {\n const memoizedCollectionIndexes = memoizedIndexes.get(\n key.collectionGroup\n );\n const fieldIndexes = memoizedCollectionIndexes\n ? PersistencePromise.resolve(memoizedCollectionIndexes)\n : this.getFieldIndexes(transaction, key.collectionGroup);\n\n return fieldIndexes.next(fieldIndexes => {\n memoizedIndexes.set(key.collectionGroup, fieldIndexes);\n return PersistencePromise.forEach(\n fieldIndexes,\n (fieldIndex: FieldIndex) => {\n return this.getExistingIndexEntries(\n transaction,\n key,\n fieldIndex\n ).next(existingEntries => {\n const newEntries = this.computeIndexEntries(doc, fieldIndex);\n if (!existingEntries.isEqual(newEntries)) {\n return this.updateEntries(\n transaction,\n doc,\n fieldIndex,\n existingEntries,\n newEntries\n );\n }\n return PersistencePromise.resolve();\n });\n }\n );\n });\n });\n }\n\n private addIndexEntry(\n transaction: PersistenceTransaction,\n document: Document,\n fieldIndex: FieldIndex,\n indexEntry: IndexEntry\n ): PersistencePromise {\n const indexEntries = indexEntriesStore(transaction);\n return indexEntries.put({\n indexId: indexEntry.indexId,\n uid: this.uid,\n arrayValue: indexEntry.arrayValue,\n directionalValue: indexEntry.directionalValue,\n orderedDocumentKey: this.encodeDirectionalKey(fieldIndex, document.key),\n documentKey: document.key.path.toArray()\n });\n }\n\n private deleteIndexEntry(\n transaction: PersistenceTransaction,\n document: Document,\n fieldIndex: FieldIndex,\n indexEntry: IndexEntry\n ): PersistencePromise {\n const indexEntries = indexEntriesStore(transaction);\n return indexEntries.delete([\n indexEntry.indexId,\n this.uid,\n indexEntry.arrayValue,\n indexEntry.directionalValue,\n this.encodeDirectionalKey(fieldIndex, document.key),\n document.key.path.toArray()\n ]);\n }\n\n private getExistingIndexEntries(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey,\n fieldIndex: FieldIndex\n ): PersistencePromise> {\n const indexEntries = indexEntriesStore(transaction);\n let results = new SortedSet(indexEntryComparator);\n return indexEntries\n .iterate(\n {\n index: DbIndexEntryDocumentKeyIndex,\n range: IDBKeyRange.only([\n fieldIndex.indexId,\n this.uid,\n this.encodeDirectionalKey(fieldIndex, documentKey)\n ])\n },\n (_, entry) => {\n results = results.add(\n new IndexEntry(\n fieldIndex.indexId,\n documentKey,\n entry.arrayValue,\n entry.directionalValue\n )\n );\n }\n )\n .next(() => results);\n }\n\n /** Creates the index entries for the given document. */\n private computeIndexEntries(\n document: Document,\n fieldIndex: FieldIndex\n ): SortedSet {\n let results = new SortedSet(indexEntryComparator);\n\n const directionalValue = this.encodeDirectionalElements(\n fieldIndex,\n document\n );\n if (directionalValue == null) {\n return results;\n }\n\n const arraySegment = fieldIndexGetArraySegment(fieldIndex);\n if (arraySegment != null) {\n const value = document.data.field(arraySegment.fieldPath);\n if (isArray(value)) {\n for (const arrayValue of value.arrayValue!.values || []) {\n results = results.add(\n new IndexEntry(\n fieldIndex.indexId,\n document.key,\n this.encodeSingleElement(arrayValue),\n directionalValue\n )\n );\n }\n }\n } else {\n results = results.add(\n new IndexEntry(\n fieldIndex.indexId,\n document.key,\n EMPTY_VALUE,\n directionalValue\n )\n );\n }\n\n return results;\n }\n\n /**\n * Updates the index entries for the provided document by deleting entries\n * that are no longer referenced in `newEntries` and adding all newly added\n * entries.\n */\n private updateEntries(\n transaction: PersistenceTransaction,\n document: Document,\n fieldIndex: FieldIndex,\n existingEntries: SortedSet,\n newEntries: SortedSet\n ): PersistencePromise {\n logDebug(LOG_TAG, \"Updating index entries for document '%s'\", document.key);\n\n const promises: Array> = [];\n diffSortedSets(\n existingEntries,\n newEntries,\n indexEntryComparator,\n /* onAdd= */ entry => {\n promises.push(\n this.addIndexEntry(transaction, document, fieldIndex, entry)\n );\n },\n /* onRemove= */ entry => {\n promises.push(\n this.deleteIndexEntry(transaction, document, fieldIndex, entry)\n );\n }\n );\n\n return PersistencePromise.waitFor(promises);\n }\n\n private getNextSequenceNumber(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n let nextSequenceNumber = 1;\n const states = indexStateStore(transaction);\n return states\n .iterate(\n {\n index: DbIndexStateSequenceNumberIndex,\n reverse: true,\n range: IDBKeyRange.upperBound([this.uid, Number.MAX_SAFE_INTEGER])\n },\n (_, state, controller) => {\n controller.done();\n nextSequenceNumber = state.sequenceNumber + 1;\n }\n )\n .next(() => nextSequenceNumber);\n }\n\n /**\n * Returns a new set of IDB ranges that splits the existing range and excludes\n * any values that match the `notInValue` from these ranges. As an example,\n * '[foo > 2 && foo != 3]` becomes `[foo > 2 && < 3, foo > 3]`.\n */\n private createRange(\n lower: IndexEntry,\n upper: IndexEntry,\n notInValues: IndexEntry[]\n ): IDBKeyRange[] {\n // The notIn values need to be sorted and unique so that we can return a\n // sorted set of non-overlapping ranges.\n notInValues = notInValues\n .sort((l, r) => indexEntryComparator(l, r))\n .filter(\n (el, i, values) => !i || indexEntryComparator(el, values[i - 1]) !== 0\n );\n\n const bounds: IndexEntry[] = [];\n bounds.push(lower);\n for (const notInValue of notInValues) {\n const cmpToLower = indexEntryComparator(notInValue, lower);\n const cmpToUpper = indexEntryComparator(notInValue, upper);\n\n if (cmpToLower === 0) {\n // `notInValue` is the lower bound. We therefore need to raise the bound\n // to the next value.\n bounds[0] = lower.successor();\n } else if (cmpToLower > 0 && cmpToUpper < 0) {\n // `notInValue` is in the middle of the range\n bounds.push(notInValue);\n bounds.push(notInValue.successor());\n } else if (cmpToUpper > 0) {\n // `notInValue` (and all following values) are out of the range\n break;\n }\n }\n bounds.push(upper);\n\n const ranges: IDBKeyRange[] = [];\n for (let i = 0; i < bounds.length; i += 2) {\n // If we encounter two bounds that will create an unmatchable key range,\n // then we return an empty set of key ranges.\n if (this.isRangeMatchable(bounds[i], bounds[i + 1])) {\n return [];\n }\n\n const lowerBound = [\n bounds[i].indexId,\n this.uid,\n bounds[i].arrayValue,\n bounds[i].directionalValue,\n EMPTY_VALUE,\n []\n ] as DbIndexEntryKey;\n\n const upperBound = [\n bounds[i + 1].indexId,\n this.uid,\n bounds[i + 1].arrayValue,\n bounds[i + 1].directionalValue,\n EMPTY_VALUE,\n []\n ] as DbIndexEntryKey;\n\n ranges.push(IDBKeyRange.bound(lowerBound, upperBound));\n }\n return ranges;\n }\n\n isRangeMatchable(lowerBound: IndexEntry, upperBound: IndexEntry): boolean {\n // If lower bound is greater than the upper bound, then the key\n // range can never be matched.\n return indexEntryComparator(lowerBound, upperBound) > 0;\n }\n\n getMinOffsetFromCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string\n ): PersistencePromise {\n return this.getFieldIndexes(transaction, collectionGroup).next(\n getMinOffsetFromFieldIndexes\n );\n }\n\n getMinOffset(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n return PersistencePromise.mapArray(\n this.getSubTargets(target),\n (subTarget: Target) =>\n this.getFieldIndex(transaction, subTarget).next(index =>\n index ? index : fail('Target cannot be served from index')\n )\n ).next(getMinOffsetFromFieldIndexes);\n }\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the collectionParents\n * document store.\n */\nfunction collectionParentsStore(\n txn: PersistenceTransaction\n): SimpleDbStore {\n return getStore(\n txn,\n DbCollectionParentStore\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index entry object store.\n */\nfunction indexEntriesStore(\n txn: PersistenceTransaction\n): SimpleDbStore {\n return getStore(txn, DbIndexEntryStore);\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index configuration object store.\n */\nfunction indexConfigurationStore(\n txn: PersistenceTransaction\n): SimpleDbStore {\n return getStore(\n txn,\n DbIndexConfigurationStore\n );\n}\n\n/**\n * Helper to get a typed SimpleDbStore for the index state object store.\n */\nfunction indexStateStore(\n txn: PersistenceTransaction\n): SimpleDbStore {\n return getStore(txn, DbIndexStateStore);\n}\n\nfunction getMinOffsetFromFieldIndexes(fieldIndexes: FieldIndex[]): IndexOffset {\n hardAssert(\n fieldIndexes.length !== 0,\n 'Found empty index group when looking for least recent index offset.'\n );\n\n let minOffset: IndexOffset = fieldIndexes[0].indexState.offset;\n let maxBatchId: number = minOffset.largestBatchId;\n for (let i = 1; i < fieldIndexes.length; i++) {\n const newOffset: IndexOffset = fieldIndexes[i].indexState.offset;\n if (indexOffsetComparator(newOffset, minOffset) < 0) {\n minOffset = newOffset;\n }\n if (maxBatchId < newOffset.largestBatchId) {\n maxBatchId = newOffset.largestBatchId;\n }\n }\n return new IndexOffset(minOffset.readTime, minOffset.documentKey, maxBatchId);\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { TargetData } from './target_data';\n\n/**\n * Describes a map whose keys are active target ids. We do not care about the type of the\n * values.\n */\nexport type ActiveTargets = SortedMap;\n\nexport const GC_DID_NOT_RUN: LruResults = {\n didRun: false,\n sequenceNumbersCollected: 0,\n targetsRemoved: 0,\n documentsRemoved: 0\n};\n\nexport const LRU_COLLECTION_DISABLED = -1;\nexport const LRU_DEFAULT_CACHE_SIZE_BYTES = 40 * 1024 * 1024;\n\nexport class LruParams {\n private static readonly DEFAULT_COLLECTION_PERCENTILE = 10;\n private static readonly DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT = 1000;\n\n static withCacheSize(cacheSize: number): LruParams {\n return new LruParams(\n cacheSize,\n LruParams.DEFAULT_COLLECTION_PERCENTILE,\n LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT\n );\n }\n\n static readonly DEFAULT: LruParams = new LruParams(\n LRU_DEFAULT_CACHE_SIZE_BYTES,\n LruParams.DEFAULT_COLLECTION_PERCENTILE,\n LruParams.DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT\n );\n\n static readonly DISABLED: LruParams = new LruParams(\n LRU_COLLECTION_DISABLED,\n 0,\n 0\n );\n\n constructor(\n // When we attempt to collect, we will only do so if the cache size is greater than this\n // threshold. Passing `COLLECTION_DISABLED` here will cause collection to always be skipped.\n readonly cacheSizeCollectionThreshold: number,\n // The percentage of sequence numbers that we will attempt to collect\n readonly percentileToCollect: number,\n // A cap on the total number of sequence numbers that will be collected. This prevents\n // us from collecting a huge number of sequence numbers if the cache has grown very large.\n readonly maximumSequenceNumbersToCollect: number\n ) {}\n}\n\nexport interface LruGarbageCollector {\n readonly params: LruParams;\n\n collect(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise;\n\n /** Given a percentile of target to collect, returns the number of targets to collect. */\n calculateTargetCount(\n txn: PersistenceTransaction,\n percentile: number\n ): PersistencePromise;\n\n /** Returns the nth sequence number, counting in order from the smallest. */\n nthSequenceNumber(\n txn: PersistenceTransaction,\n n: number\n ): PersistencePromise;\n\n /**\n * Removes documents that have a sequence number equal to or less than the\n * upper bound and are not otherwise pinned.\n */\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise;\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise;\n\n /**\n * Removes targets with a sequence number equal to or less than the given\n * upper bound, and removes document associations with those targets.\n */\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise;\n}\n\n/**\n * Describes the results of a garbage collection run. `didRun` will be set to\n * `false` if collection was skipped (either it is disabled or the cache size\n * has not hit the threshold). If collection ran, the other fields will be\n * filled in with the details of the results.\n */\nexport interface LruResults {\n readonly didRun: boolean;\n readonly sequenceNumbersCollected: number;\n readonly targetsRemoved: number;\n readonly documentsRemoved: number;\n}\n\n/**\n * Persistence layers intending to use LRU Garbage collection should have\n * reference delegates that implement this interface. This interface defines the\n * operations that the LRU garbage collector needs from the persistence layer.\n */\nexport interface LruDelegate {\n readonly garbageCollector: LruGarbageCollector;\n\n /** Enumerates all the targets in the TargetCache. */\n forEachTarget(\n txn: PersistenceTransaction,\n f: (target: TargetData) => void\n ): PersistencePromise;\n\n getSequenceNumberCount(\n txn: PersistenceTransaction\n ): PersistencePromise;\n\n /**\n * Enumerates sequence numbers for documents not associated with a target.\n * Note that this may include duplicate sequence numbers.\n */\n forEachOrphanedDocumentSequenceNumber(\n txn: PersistenceTransaction,\n f: (sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise;\n\n /**\n * Removes all targets that have a sequence number less than or equal to\n * `upperBound`, and are not present in the `activeTargetIds` set.\n *\n * @returns the number of targets removed.\n */\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise;\n\n /**\n * Removes all unreferenced documents from the cache that have a sequence\n * number less than or equal to the given `upperBound`.\n *\n * @returns the number of documents removed.\n */\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise;\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TargetId } from './types';\n\n/** Offset to ensure non-overlapping target ids. */\nconst OFFSET = 2;\n\n/**\n * Generates monotonically increasing target IDs for sending targets to the\n * watch stream.\n *\n * The client constructs two generators, one for the target cache, and one for\n * for the sync engine (to generate limbo documents targets). These\n * generators produce non-overlapping IDs (by using even and odd IDs\n * respectively).\n *\n * By separating the target ID space, the query cache can generate target IDs\n * that persist across client restarts, while sync engine can independently\n * generate in-memory target IDs that are transient and can be reused after a\n * restart.\n */\nexport class TargetIdGenerator {\n constructor(private lastId: number) {}\n\n next(): TargetId {\n this.lastId += OFFSET;\n return this.lastId;\n }\n\n static forTargetCache(): TargetIdGenerator {\n // The target cache generator must return '2' in its first call to `next()`\n // as there is no differentiation in the protocol layer between an unset\n // number and the number '0'. If we were to sent a target with target ID\n // '0', the backend would consider it unset and replace it with its own ID.\n return new TargetIdGenerator(2 - OFFSET);\n }\n\n static forSyncEngine(): TargetIdGenerator {\n // Sync engine assigns target IDs for limbo document detection.\n return new TargetIdGenerator(1 - OFFSET);\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirestoreError } from '../api';\nimport { ListenSequence } from '../core/listen_sequence';\nimport { ListenSequenceNumber } from '../core/types';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { getLogLevel, logDebug, LogLevel } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { ignoreIfPrimaryLeaseLoss, LocalStore } from './local_store';\nimport {\n ActiveTargets,\n GC_DID_NOT_RUN,\n LRU_COLLECTION_DISABLED,\n LruDelegate,\n LruGarbageCollector,\n LruParams,\n LruResults\n} from './lru_garbage_collector';\nimport { Scheduler } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { isIndexedDbTransactionError } from './simple_db';\n\nconst LOG_TAG = 'LruGarbageCollector';\n\nexport const LRU_MINIMUM_CACHE_SIZE_BYTES = 1 * 1024 * 1024;\n\n/** How long we wait to try running LRU GC after SDK initialization. */\nconst INITIAL_GC_DELAY_MS = 1 * 60 * 1000;\n/** Minimum amount of time between GC checks, after the first one. */\nconst REGULAR_GC_DELAY_MS = 5 * 60 * 1000;\n\n// The type and comparator for the items contained in the SortedSet used in\n// place of a priority queue for the RollingSequenceNumberBuffer.\ntype BufferEntry = [ListenSequenceNumber, number];\n\nfunction bufferEntryComparator(\n [aSequence, aIndex]: BufferEntry,\n [bSequence, bIndex]: BufferEntry\n): number {\n const seqCmp = primitiveComparator(aSequence, bSequence);\n if (seqCmp === 0) {\n // This order doesn't matter, but we can bias against churn by sorting\n // entries created earlier as less than newer entries.\n return primitiveComparator(aIndex, bIndex);\n } else {\n return seqCmp;\n }\n}\n\n/**\n * Used to calculate the nth sequence number. Keeps a rolling buffer of the\n * lowest n values passed to `addElement`, and finally reports the largest of\n * them in `maxValue`.\n */\nclass RollingSequenceNumberBuffer {\n private buffer: SortedSet = new SortedSet(\n bufferEntryComparator\n );\n\n private previousIndex = 0;\n\n constructor(private readonly maxElements: number) {}\n\n private nextIndex(): number {\n return ++this.previousIndex;\n }\n\n addElement(sequenceNumber: ListenSequenceNumber): void {\n const entry: BufferEntry = [sequenceNumber, this.nextIndex()];\n if (this.buffer.size < this.maxElements) {\n this.buffer = this.buffer.add(entry);\n } else {\n const highestValue = this.buffer.last()!;\n if (bufferEntryComparator(entry, highestValue) < 0) {\n this.buffer = this.buffer.delete(highestValue).add(entry);\n }\n }\n }\n\n get maxValue(): ListenSequenceNumber {\n // Guaranteed to be non-empty. If we decide we are not collecting any\n // sequence numbers, nthSequenceNumber below short-circuits. If we have\n // decided that we are collecting n sequence numbers, it's because n is some\n // percentage of the existing sequence numbers. That means we should never\n // be in a situation where we are collecting sequence numbers but don't\n // actually have any.\n return this.buffer.last()![0];\n }\n}\n\n/**\n * This class is responsible for the scheduling of LRU garbage collection. It handles checking\n * whether or not GC is enabled, as well as which delay to use before the next run.\n */\nexport class LruScheduler implements Scheduler {\n private gcTask: DelayedOperation | null;\n\n constructor(\n private readonly garbageCollector: LruGarbageCollector,\n private readonly asyncQueue: AsyncQueue,\n private readonly localStore: LocalStore\n ) {\n this.gcTask = null;\n }\n\n start(): void {\n debugAssert(\n this.gcTask === null,\n 'Cannot start an already started LruScheduler'\n );\n if (\n this.garbageCollector.params.cacheSizeCollectionThreshold !==\n LRU_COLLECTION_DISABLED\n ) {\n this.scheduleGC(INITIAL_GC_DELAY_MS);\n }\n }\n\n stop(): void {\n if (this.gcTask) {\n this.gcTask.cancel();\n this.gcTask = null;\n }\n }\n\n get started(): boolean {\n return this.gcTask !== null;\n }\n\n private scheduleGC(delay: number): void {\n debugAssert(\n this.gcTask === null,\n 'Cannot schedule GC while a task is pending'\n );\n logDebug(LOG_TAG, `Garbage collection scheduled in ${delay}ms`);\n this.gcTask = this.asyncQueue.enqueueAfterDelay(\n TimerId.LruGarbageCollection,\n delay,\n async () => {\n this.gcTask = null;\n try {\n await this.localStore.collectGarbage(this.garbageCollector);\n } catch (e) {\n if (isIndexedDbTransactionError(e as Error)) {\n logDebug(\n LOG_TAG,\n 'Ignoring IndexedDB error during garbage collection: ',\n e\n );\n } else {\n await ignoreIfPrimaryLeaseLoss(e as FirestoreError);\n }\n }\n await this.scheduleGC(REGULAR_GC_DELAY_MS);\n }\n );\n }\n}\n\n/**\n * Implements the steps for LRU garbage collection.\n */\nclass LruGarbageCollectorImpl implements LruGarbageCollector {\n constructor(\n private readonly delegate: LruDelegate,\n readonly params: LruParams\n ) {}\n\n calculateTargetCount(\n txn: PersistenceTransaction,\n percentile: number\n ): PersistencePromise {\n return this.delegate.getSequenceNumberCount(txn).next(targetCount => {\n return Math.floor((percentile / 100.0) * targetCount);\n });\n }\n\n nthSequenceNumber(\n txn: PersistenceTransaction,\n n: number\n ): PersistencePromise {\n if (n === 0) {\n return PersistencePromise.resolve(ListenSequence.INVALID);\n }\n\n const buffer = new RollingSequenceNumberBuffer(n);\n return this.delegate\n .forEachTarget(txn, target => buffer.addElement(target.sequenceNumber))\n .next(() => {\n return this.delegate.forEachOrphanedDocumentSequenceNumber(\n txn,\n sequenceNumber => buffer.addElement(sequenceNumber)\n );\n })\n .next(() => buffer.maxValue);\n }\n\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise {\n return this.delegate.removeTargets(txn, upperBound, activeTargetIds);\n }\n\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise {\n return this.delegate.removeOrphanedDocuments(txn, upperBound);\n }\n\n collect(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise {\n if (this.params.cacheSizeCollectionThreshold === LRU_COLLECTION_DISABLED) {\n logDebug('LruGarbageCollector', 'Garbage collection skipped; disabled');\n return PersistencePromise.resolve(GC_DID_NOT_RUN);\n }\n\n return this.getCacheSize(txn).next(cacheSize => {\n if (cacheSize < this.params.cacheSizeCollectionThreshold) {\n logDebug(\n 'LruGarbageCollector',\n `Garbage collection skipped; Cache size ${cacheSize} ` +\n `is lower than threshold ${this.params.cacheSizeCollectionThreshold}`\n );\n return GC_DID_NOT_RUN;\n } else {\n return this.runGarbageCollection(txn, activeTargetIds);\n }\n });\n }\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise {\n return this.delegate.getCacheSize(txn);\n }\n\n private runGarbageCollection(\n txn: PersistenceTransaction,\n activeTargetIds: ActiveTargets\n ): PersistencePromise {\n let upperBoundSequenceNumber: number;\n let sequenceNumbersToCollect: number, targetsRemoved: number;\n // Timestamps for various pieces of the process\n let countedTargetsTs: number,\n foundUpperBoundTs: number,\n removedTargetsTs: number,\n removedDocumentsTs: number;\n const startTs = Date.now();\n return this.calculateTargetCount(txn, this.params.percentileToCollect)\n .next(sequenceNumbers => {\n // Cap at the configured max\n if (sequenceNumbers > this.params.maximumSequenceNumbersToCollect) {\n logDebug(\n 'LruGarbageCollector',\n 'Capping sequence numbers to collect down ' +\n `to the maximum of ${this.params.maximumSequenceNumbersToCollect} ` +\n `from ${sequenceNumbers}`\n );\n sequenceNumbersToCollect =\n this.params.maximumSequenceNumbersToCollect;\n } else {\n sequenceNumbersToCollect = sequenceNumbers;\n }\n countedTargetsTs = Date.now();\n\n return this.nthSequenceNumber(txn, sequenceNumbersToCollect);\n })\n .next(upperBound => {\n upperBoundSequenceNumber = upperBound;\n foundUpperBoundTs = Date.now();\n\n return this.removeTargets(\n txn,\n upperBoundSequenceNumber,\n activeTargetIds\n );\n })\n .next(numTargetsRemoved => {\n targetsRemoved = numTargetsRemoved;\n removedTargetsTs = Date.now();\n\n return this.removeOrphanedDocuments(txn, upperBoundSequenceNumber);\n })\n .next(documentsRemoved => {\n removedDocumentsTs = Date.now();\n\n if (getLogLevel() <= LogLevel.DEBUG) {\n const desc =\n 'LRU Garbage Collection\\n' +\n `\\tCounted targets in ${countedTargetsTs - startTs}ms\\n` +\n `\\tDetermined least recently used ${sequenceNumbersToCollect} in ` +\n `${foundUpperBoundTs - countedTargetsTs}ms\\n` +\n `\\tRemoved ${targetsRemoved} targets in ` +\n `${removedTargetsTs - foundUpperBoundTs}ms\\n` +\n `\\tRemoved ${documentsRemoved} documents in ` +\n `${removedDocumentsTs - removedTargetsTs}ms\\n` +\n `Total Duration: ${removedDocumentsTs - startTs}ms`;\n logDebug('LruGarbageCollector', desc);\n }\n\n return PersistencePromise.resolve({\n didRun: true,\n sequenceNumbersCollected: sequenceNumbersToCollect,\n targetsRemoved,\n documentsRemoved\n });\n });\n }\n}\n\nexport function newLruGarbageCollector(\n delegate: LruDelegate,\n params: LruParams\n): LruGarbageCollector {\n return new LruGarbageCollectorImpl(delegate, params);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { DocumentKeySet, MutableDocumentMap } from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert } from '../util/assert';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * An in-memory buffer of entries to be written to a RemoteDocumentCache.\n * It can be used to batch up a set of changes to be written to the cache, but\n * additionally supports reading entries back with the `getEntry()` method,\n * falling back to the underlying RemoteDocumentCache if no entry is\n * buffered.\n *\n * Entries added to the cache *must* be read first. This is to facilitate\n * calculating the size delta of the pending changes.\n *\n * PORTING NOTE: This class was implemented then removed from other platforms.\n * If byte-counting ends up being needed on the other platforms, consider\n * porting this class as part of that implementation work.\n */\nexport abstract class RemoteDocumentChangeBuffer {\n // A mapping of document key to the new cache entry that should be written.\n protected changes: ObjectMap = new ObjectMap(\n key => key.toString(),\n (l, r) => l.isEqual(r)\n );\n\n private changesApplied = false;\n\n protected abstract getFromCache(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise;\n\n protected abstract getAllFromCache(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise;\n\n protected abstract applyChanges(\n transaction: PersistenceTransaction\n ): PersistencePromise;\n\n /**\n * Buffers a `RemoteDocumentCache.addEntry()` call.\n *\n * You can only modify documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */\n addEntry(document: MutableDocument): void {\n this.assertNotApplied();\n this.changes.set(document.key, document);\n }\n\n /**\n * Buffers a `RemoteDocumentCache.removeEntry()` call.\n *\n * You can only remove documents that have already been retrieved via\n * `getEntry()/getEntries()` (enforced via IndexedDbs `apply()`).\n */\n removeEntry(key: DocumentKey, readTime: SnapshotVersion): void {\n this.assertNotApplied();\n this.changes.set(\n key,\n MutableDocument.newInvalidDocument(key).setReadTime(readTime)\n );\n }\n\n /**\n * Looks up an entry in the cache. The buffered changes will first be checked,\n * and if no buffered change applies, this will forward to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKey - The key of the entry to look up.\n * @returns The cached document or an invalid document if we have nothing\n * cached.\n */\n getEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise {\n this.assertNotApplied();\n const bufferedEntry = this.changes.get(documentKey);\n if (bufferedEntry !== undefined) {\n return PersistencePromise.resolve(bufferedEntry);\n } else {\n return this.getFromCache(transaction, documentKey);\n }\n }\n\n /**\n * Looks up several entries in the cache, forwarding to\n * `RemoteDocumentCache.getEntry()`.\n *\n * @param transaction - The transaction in which to perform any persistence\n * operations.\n * @param documentKeys - The keys of the entries to look up.\n * @returns A map of cached documents, indexed by key. If an entry cannot be\n * found, the corresponding key will be mapped to an invalid document.\n */\n getEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise {\n return this.getAllFromCache(transaction, documentKeys);\n }\n\n /**\n * Applies buffered changes to the underlying RemoteDocumentCache, using\n * the provided transaction.\n */\n apply(transaction: PersistenceTransaction): PersistencePromise {\n this.assertNotApplied();\n this.changesApplied = true;\n return this.applyChanges(transaction);\n }\n\n /** Helper to assert this.changes is not null */\n protected assertNotApplied(): void {\n debugAssert(!this.changesApplied, 'Changes have already been applied.');\n }\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Document } from '../model/document';\nimport { FieldMask } from '../model/field_mask';\n\n/**\n * Represents a local view (overlay) of a document, and the fields that are\n * locally mutated.\n */\nexport class OverlayedDocument {\n constructor(\n readonly overlayedDocument: Document,\n\n /**\n * The fields that are locally mutated by patch mutations.\n *\n * If the overlayed\tdocument is from set or delete mutations, this is `null`.\n * If there is no overlay (mutation) for the document, this is an empty `FieldMask`.\n */\n readonly mutatedFields: FieldMask | null\n ) {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n asCollectionQueryAtPath,\n isCollectionGroupQuery,\n isDocumentQuery,\n Query,\n queryMatches\n} from '../core/query';\nimport { Timestamp } from '../lite-api/timestamp';\nimport {\n DocumentKeySet,\n OverlayMap,\n DocumentMap,\n MutableDocumentMap,\n newDocumentKeyMap,\n newMutationMap,\n newOverlayMap,\n documentMap,\n mutableDocumentMap,\n documentKeySet,\n DocumentKeyMap,\n convertOverlayedDocumentMapToDocumentMap,\n OverlayedDocumentMap,\n newOverlayedDocumentMap\n} from '../model/collections';\nimport { Document, MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { IndexOffset, INITIAL_LARGEST_BATCH_ID } from '../model/field_index';\nimport { FieldMask } from '../model/field_mask';\nimport {\n calculateOverlayMutation,\n mutationApplyToLocalView,\n PatchMutation\n} from '../model/mutation';\nimport { Overlay } from '../model/overlay';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { DocumentOverlayCache } from './document_overlay_cache';\nimport { IndexManager } from './index_manager';\nimport { LocalWriteResult } from './local_store_impl';\nimport { MutationQueue } from './mutation_queue';\nimport { OverlayedDocument } from './overlayed_document';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { QueryContext } from './query_context';\nimport { RemoteDocumentCache } from './remote_document_cache';\n\n/**\n * A readonly view of the local state of all documents we're tracking (i.e. we\n * have a cached version in remoteDocumentCache or local mutations for the\n * document). The view is computed by applying the mutations in the\n * MutationQueue to the RemoteDocumentCache.\n */\nexport class LocalDocumentsView {\n constructor(\n readonly remoteDocumentCache: RemoteDocumentCache,\n readonly mutationQueue: MutationQueue,\n readonly documentOverlayCache: DocumentOverlayCache,\n readonly indexManager: IndexManager\n ) {}\n\n /**\n * Get the local view of the document identified by `key`.\n *\n * @returns Local view of the document or null if we don't have any cached\n * state for it.\n */\n getDocument(\n transaction: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n let overlay: Overlay | null = null;\n return this.documentOverlayCache\n .getOverlay(transaction, key)\n .next(value => {\n overlay = value;\n return this.remoteDocumentCache.getEntry(transaction, key);\n })\n .next(document => {\n if (overlay !== null) {\n mutationApplyToLocalView(\n overlay.mutation,\n document,\n FieldMask.empty(),\n Timestamp.now()\n );\n }\n return document as Document;\n });\n }\n\n /**\n * Gets the local view of the documents identified by `keys`.\n *\n * If we don't have cached state for a document in `keys`, a NoDocument will\n * be stored for that key in the resulting set.\n */\n getDocuments(\n transaction: PersistenceTransaction,\n keys: DocumentKeySet\n ): PersistencePromise {\n return this.remoteDocumentCache\n .getEntries(transaction, keys)\n .next(docs =>\n this.getLocalViewOfDocuments(transaction, docs, documentKeySet()).next(\n () => docs as DocumentMap\n )\n );\n }\n\n /**\n * Similar to `getDocuments`, but creates the local view from the given\n * `baseDocs` without retrieving documents from the local store.\n *\n * @param transaction - The transaction this operation is scoped to.\n * @param docs - The documents to apply local mutations to get the local views.\n * @param existenceStateChanged - The set of document keys whose existence state\n * is changed. This is useful to determine if some documents overlay needs\n * to be recalculated.\n */\n getLocalViewOfDocuments(\n transaction: PersistenceTransaction,\n docs: MutableDocumentMap,\n existenceStateChanged: DocumentKeySet = documentKeySet()\n ): PersistencePromise {\n const overlays = newOverlayMap();\n return this.populateOverlays(transaction, overlays, docs).next(() => {\n return this.computeViews(\n transaction,\n docs,\n overlays,\n existenceStateChanged\n ).next(computeViewsResult => {\n let result = documentMap();\n computeViewsResult.forEach((documentKey, overlayedDocument) => {\n result = result.insert(\n documentKey,\n overlayedDocument.overlayedDocument\n );\n });\n return result;\n });\n });\n }\n\n /**\n * Gets the overlayed documents for the given document map, which will include\n * the local view of those documents and a `FieldMask` indicating which fields\n * are mutated locally, `null` if overlay is a Set or Delete mutation.\n */\n getOverlayedDocuments(\n transaction: PersistenceTransaction,\n docs: MutableDocumentMap\n ): PersistencePromise {\n const overlays = newOverlayMap();\n return this.populateOverlays(transaction, overlays, docs).next(() =>\n this.computeViews(transaction, docs, overlays, documentKeySet())\n );\n }\n\n /**\n * Fetches the overlays for {@code docs} and adds them to provided overlay map\n * if the map does not already contain an entry for the given document key.\n */\n private populateOverlays(\n transaction: PersistenceTransaction,\n overlays: OverlayMap,\n docs: MutableDocumentMap\n ): PersistencePromise {\n const missingOverlays: DocumentKey[] = [];\n docs.forEach(key => {\n if (!overlays.has(key)) {\n missingOverlays.push(key);\n }\n });\n return this.documentOverlayCache\n .getOverlays(transaction, missingOverlays)\n .next(result => {\n result.forEach((key, val) => {\n overlays.set(key, val);\n });\n });\n }\n\n /**\n * Computes the local view for the given documents.\n *\n * @param docs - The documents to compute views for. It also has the base\n * version of the documents.\n * @param overlays - The overlays that need to be applied to the given base\n * version of the documents.\n * @param existenceStateChanged - A set of documents whose existence states\n * might have changed. This is used to determine if we need to re-calculate\n * overlays from mutation queues.\n * @return A map represents the local documents view.\n */\n computeViews(\n transaction: PersistenceTransaction,\n docs: MutableDocumentMap,\n overlays: OverlayMap,\n existenceStateChanged: DocumentKeySet\n ): PersistencePromise {\n let recalculateDocuments = mutableDocumentMap();\n const mutatedFields = newDocumentKeyMap();\n const results = newOverlayedDocumentMap();\n docs.forEach((_, doc) => {\n const overlay = overlays.get(doc.key);\n // Recalculate an overlay if the document's existence state changed due to\n // a remote event *and* the overlay is a PatchMutation. This is because\n // document existence state can change if some patch mutation's\n // preconditions are met.\n // NOTE: we recalculate when `overlay` is undefined as well, because there\n // might be a patch mutation whose precondition does not match before the\n // change (hence overlay is undefined), but would now match.\n if (\n existenceStateChanged.has(doc.key) &&\n (overlay === undefined || overlay.mutation instanceof PatchMutation)\n ) {\n recalculateDocuments = recalculateDocuments.insert(doc.key, doc);\n } else if (overlay !== undefined) {\n mutatedFields.set(doc.key, overlay.mutation.getFieldMask());\n mutationApplyToLocalView(\n overlay.mutation,\n doc,\n overlay.mutation.getFieldMask(),\n Timestamp.now()\n );\n } else {\n // no overlay exists\n // Using EMPTY to indicate there is no overlay for the document.\n mutatedFields.set(doc.key, FieldMask.empty());\n }\n });\n\n return this.recalculateAndSaveOverlays(\n transaction,\n recalculateDocuments\n ).next(recalculatedFields => {\n recalculatedFields.forEach((documentKey, mask) =>\n mutatedFields.set(documentKey, mask)\n );\n docs.forEach((documentKey, document) =>\n results.set(\n documentKey,\n new OverlayedDocument(\n document,\n mutatedFields.get(documentKey) ?? null\n )\n )\n );\n return results;\n });\n }\n\n private recalculateAndSaveOverlays(\n transaction: PersistenceTransaction,\n docs: MutableDocumentMap\n ): PersistencePromise> {\n const masks = newDocumentKeyMap();\n // A reverse lookup map from batch id to the documents within that batch.\n let documentsByBatchId = new SortedMap(\n (key1: number, key2: number) => key1 - key2\n );\n let processed = documentKeySet();\n return this.mutationQueue\n .getAllMutationBatchesAffectingDocumentKeys(transaction, docs)\n .next(batches => {\n for (const batch of batches) {\n batch.keys().forEach(key => {\n const baseDoc = docs.get(key);\n if (baseDoc === null) {\n return;\n }\n let mask: FieldMask | null = masks.get(key) || FieldMask.empty();\n mask = batch.applyToLocalView(baseDoc, mask);\n masks.set(key, mask);\n const newSet = (\n documentsByBatchId.get(batch.batchId) || documentKeySet()\n ).add(key);\n documentsByBatchId = documentsByBatchId.insert(\n batch.batchId,\n newSet\n );\n });\n }\n })\n .next(() => {\n const promises: Array> = [];\n // Iterate in descending order of batch IDs, and skip documents that are\n // already saved.\n const iter = documentsByBatchId.getReverseIterator();\n while (iter.hasNext()) {\n const entry = iter.getNext();\n const batchId = entry.key;\n const keys = entry.value;\n const overlays = newMutationMap();\n keys.forEach(key => {\n if (!processed.has(key)) {\n const overlayMutation = calculateOverlayMutation(\n docs.get(key)!,\n masks.get(key)!\n );\n if (overlayMutation !== null) {\n overlays.set(key, overlayMutation);\n }\n processed = processed.add(key);\n }\n });\n promises.push(\n this.documentOverlayCache.saveOverlays(\n transaction,\n batchId,\n overlays\n )\n );\n }\n return PersistencePromise.waitFor(promises);\n })\n .next(() => masks);\n }\n\n /**\n * Recalculates overlays by reading the documents from remote document cache\n * first, and saves them after they are calculated.\n */\n recalculateAndSaveOverlaysForDocumentKeys(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise> {\n return this.remoteDocumentCache\n .getEntries(transaction, documentKeys)\n .next(docs => this.recalculateAndSaveOverlays(transaction, docs));\n }\n\n /**\n * Performs a query against the local view of all documents.\n *\n * @param transaction - The persistence transaction.\n * @param query - The query to match documents against.\n * @param offset - Read time and key to start scanning by (exclusive).\n * @param context - A optional tracker to keep a record of important details\n * during database local query execution.\n */\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n offset: IndexOffset,\n context?: QueryContext\n ): PersistencePromise {\n if (isDocumentQuery(query)) {\n return this.getDocumentsMatchingDocumentQuery(transaction, query.path);\n } else if (isCollectionGroupQuery(query)) {\n return this.getDocumentsMatchingCollectionGroupQuery(\n transaction,\n query,\n offset,\n context\n );\n } else {\n return this.getDocumentsMatchingCollectionQuery(\n transaction,\n query,\n offset,\n context\n );\n }\n }\n\n /**\n * Given a collection group, returns the next documents that follow the provided offset, along\n * with an updated batch ID.\n *\n * \n );\n}\n\nexport default Login;","import React, { useEffect, useState } from 'react';\nimport { Link } from 'react-router-dom';\nimport bigdoc from '../asset/bigdoc.png';\nimport master from '../asset/master.png';\nimport event from '../asset/event.png';\nimport exitt from '../asset/exitt.png';\nimport bigpa from '../asset/bigpa.png';\nimport school from '../asset/school.png';\nimport datacenter from '../asset/datacenter.png';\nimport { auth } from '../firebase';\nimport { signOut } from 'firebase/auth';\nimport { useNavigate } from 'react-router-dom';\nimport '../css/Map.css';\n\nfunction Map() {\n const [isOn, setIsOn] = useState(false);\n const navigate = useNavigate();\n\n\n useEffect(() => {\n\n const timer = setTimeout(() => {\n setIsOn(true);\n }, 200);\n\n return () => clearTimeout(timer);\n }, []);\n\n const handleLogout = async () => {\n try {\n await signOut(auth); // Firebase 로그아웃 실행\n alert('로그아웃 되었습니다.');\n navigate('/');\n } catch (error) {\n console.error(\"로그아웃 중 오류 발생:\", error);\n }\n };\n\n\n return (\n <>\n
    \n \n \n
    \n
    \n
    \n
    \n \n \n

    지식 도서관

    \n \n \n \n

    트로피 홀

    \n \n \n \n

    이벤트 광장

    \n \n
    \n \n

    이탈경로

    \n
    \n \n \n

    기업 타워

    \n \n \n \n

    복지 플라자

    \n \n \n \n

    프로토콜 센터

    \n \n
    \n
    \n
    \n
    \n
    \n\n
    \n
    \n \n

    트로피 홀

    \n \n \n

    이벤트 광장

    \n \n \n

    기업 타워

    \n \n \n

    지식 도서관

    \n \n \n

    이탈경로

    \n
    \n
    \n
    \n \n );\n}\n\nexport default Map;","import { useEffect } from 'react';\nimport { useLocation } from 'react-router-dom';\n\nconst ScrollToTop = () => {\n const { pathname } = useLocation();\n\n useEffect(() => {\n window.scrollTo(0, 0);\n }, [pathname]);\n\n return null;\n}\n\nexport default ScrollToTop;","import React, { useState } from 'react';\nimport { createUserWithEmailAndPassword, signInWithEmailAndPassword, signOut } from 'firebase/auth';\nimport { auth, db } from '../firebase';\nimport { doc, setDoc } from 'firebase/firestore';\nimport { useNavigate } from 'react-router-dom';\n\nfunction SignUp() {\n const [name, setName] = useState('');\n const [team, setTeam] = useState('');\n const [phone, setPhone] = useState('');\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const navigate = useNavigate();\n const adminEmail = 'admin@jungdari.com'; \n const adminPassword = '2080114'; \n\n const handleSignUp = async (e) => {\n e.preventDefault();\n\n if (!team) {\n alert('팀을 선택해주세요.');\n return;\n }\n\n try {\n // 새 유저 계정 생성\n const userCredential = await createUserWithEmailAndPassword(auth, email, password);\n const user = userCredential.user;\n\n // Firestore에 새 유저 정보 저장\n await setDoc(doc(db, 'users', user.uid), {\n name,\n team,\n phone,\n email,\n createdAt: new Date().toISOString(),\n });\n\n // 새 유저 로그아웃\n await signOut(auth);\n\n // 관리자 계정으로 다시 로그인\n await signInWithEmailAndPassword(auth, adminEmail, adminPassword);\n\n alert('회원생성이 완료되었습니다.');\n navigate('/map');\n } catch (error) {\n alert(`회원 생성 중 오류가 발생했습니다: ${error.message}`);\n console.error(error);\n }\n };\n\n return (\n
    \n

    회원가입

    \n
    \n setName(e.target.value)}\n />\n setTeam(e.target.value)}\n >\n \n \n \n \n \n \n \n \n \n setPhone(e.target.value)}\n />\n setEmail(e.target.value)}\n />\n setPassword(e.target.value)}\n />\n \n \n
    \n );\n}\n\nexport default SignUp;","import React, { useEffect, useRef, useState } from 'react';\nimport { database, db, ref, set, onValue, remove, doc, getDoc } from '../firebase';\nimport { push, update } from \"firebase/database\"; // push를 firebase/database에서 직접 가져오기\nimport Matter from 'matter-js';\n\nfunction Event({ userObj }) {\n const gameCanvasRef = useRef(null);\n const renderInstanceRef = useRef(null);\n const userId = userObj.uid;\n const inputRef = useRef(null); // 입력창을 참조하기 위한 useRef\n const [players, setPlayers] = useState({});\n const [userName, setUserName] = useState(\"\");\n const [chatMessage, setChatMessage] = useState('');\n const [chatHistory, setChatHistory] = useState([]);\n const chatContainerRef = useRef(null); // 채팅창 참조 ref\n const bubbleMessagesRef = useRef({}); // 말풍선 메시지를 useRef로 변경\n\n // Firestore에서 유저 이름 가져오기\n useEffect(() => {\n const fetchUserName = async () => {\n try {\n const userDoc = await getDoc(doc(db, \"users\", userId));\n if (userDoc.exists()) {\n setUserName(userDoc.data().name);\n } else {\n console.error(\"유저 데이터가 없습니다.\");\n }\n } catch (error) {\n console.error(\"Firestore에서 유저 이름을 가져오는 중 오류 발생:\", error);\n }\n };\n fetchUserName();\n }, [userId]);\n\n // 사용자가 페이지를 떠날 때 해당 사용자의 데이터를 Firebase에서 삭제하는 함수\n const handleBeforeUnload = () => {\n remove(ref(database, `library/players/${userId}`));\n };\n\n // 페이지 벗어나기 전 이벤트 리스너 등록\n useEffect(() => {\n window.addEventListener(\"beforeunload\", handleBeforeUnload);\n \n // 컴포넌트 언마운트 시 이벤트 리스너 제거\n return () => window.removeEventListener(\"beforeunload\", handleBeforeUnload);\n }, [handleBeforeUnload]);\n\n // 채팅 메시지 전송 함수\n const sendMessage = (message) => {\n const chatRef = ref(database, 'library/chats'); // 'library' 경로 하위에 chats 추가\n const newMessageRef = push(chatRef);\n set(newMessageRef, {\n userId: userId,\n userName: userName,\n message: message,\n timestamp: Date.now(),\n seenAsBubble: false // 초기 상태: 아직 말풍선으로 표시되지 않음\n });\n bubbleMessagesRef.current = { ...bubbleMessagesRef.current, [userId]: message }; // 현재 사용자 말풍선만 업데이트\n\n setTimeout(() => {\n delete bubbleMessagesRef.current[userId];\n }, 3000);\n };\n\n const handleInputChange = (e) => setChatMessage(e.target.value);\n const handleSendMessage = () => {\n if (chatMessage.trim() !== '') {\n sendMessage(chatMessage);\n setChatMessage(''); // 입력창 비우기\n document.activeElement.blur(); // 포커스 해제하여 커서 제거\n }\n };\n\n // 전역 키 이벤트로 엔터 키가 눌렸을 때 포커스를 설정하는 함수\n useEffect(() => {\n const handleGlobalKeyPress = (e) => {\n if (e.key === 'Enter' && document.activeElement !== inputRef.current) {\n // 커서가 없을 때만 입력창에 포커스\n inputRef.current.focus();\n }\n };\n\n // 전역 키보드 이벤트 리스너 등록\n window.addEventListener('keydown', handleGlobalKeyPress);\n \n // 컴포넌트 언마운트 시 이벤트 리스너 제거\n return () => window.removeEventListener('keydown', handleGlobalKeyPress);\n }, []);\n\n const handleKeyPress = (e) => {\n if (e.key === 'Enter') handleSendMessage();\n };\n\n // Firebase에서 실시간으로 채팅 데이터 가져오기\n useEffect(() => {\n const chatRef = ref(database, 'library/chats'); // 'library' 경로 하위에 chats 추가\n onValue(chatRef, (snapshot) => {\n const chats = snapshot.val() || {};\n const messages = Object.entries(chats).map(([key, msg]) => ({ key, ...msg }));\n setChatHistory(messages);\n\n messages.forEach((msg) => {\n if (!msg.seenAsBubble && msg.userId !== userId) {\n // 다른 사용자의 말풍선을 처음 표시할 때만 보여주기\n bubbleMessagesRef.current[msg.userId] = msg.message;\n\n // 말풍선으로 표시한 후 Firebase에서 seenAsBubble 필드 업데이트\n const messageRef = ref(database, `library/chats/${msg.key}`); // 'library' 경로 하위에 chats 추가\n update(messageRef, { seenAsBubble: true });\n\n // 3초 후 말풍선 제거\n setTimeout(() => delete bubbleMessagesRef.current[msg.userId], 3000);\n }\n });\n });\n }, [userId]);\n\n // 채팅 메시지가 추가될 때 스크롤을 맨 아래로 이동시키는 useEffect\n useEffect(() => {\n if (chatContainerRef.current) {\n chatContainerRef.current.scrollTop = chatContainerRef.current.scrollHeight;\n }\n }, [chatHistory]);\n\n useEffect(() => {\n const { Engine, Render, Runner, Bodies, World, Body, Events } = Matter;\n const engine = Engine.create();\n const world = engine.world;\n\n // Matter.js 렌더링 설정\n // 기존 렌더가 있는지 확인하고 없을 때만 생성\n if (!renderInstanceRef.current) {\n const render = Render.create({\n element: gameCanvasRef.current,\n engine: engine,\n options: {\n width: 1480,\n height: 840,\n wireframes: false,\n background: '/eventback.jpg'\n }\n });\n\n Render.run(render);\n renderInstanceRef.current = render; // 렌더 인스턴스를 참조에 저장\n }\n \n const runner = Runner.create();\n Runner.run(runner, engine);\n\n engine.gravity.y = 0;\n\n // 플랫폼, 벽, 센서 플랫폼 추가\n const ground = Bodies.rectangle(1500, 890, 3000, 360, { isStatic: true, label: 'ground' });\n const platform1 = Bodies.rectangle(1400, 600, 200, 220, { isStatic: true, label: 'platform' });\n const platform2 = Bodies.rectangle(1760, 500, 200, 160, { isStatic: true, label: 'platform' });\n const platform3 = Bodies.rectangle(2060, -100, 800, 120, { isStatic: true, label: 'platform' });\n const leftwall = Bodies.rectangle(-400, 600, 1000, 2000, { isStatic: true, label: 'platform' });\n const rightwall = Bodies.rectangle(3400, 600, 1000, 2000, { isStatic: true, label: 'platform' });\n \n const sensorPlatform = Bodies.rectangle(2400, 610, 120, 200, {\n isStatic: true,\n label: 'sensorPlatform',\n isSensor: true,\n render: { \n sprite: {\n texture: '/doors.png',\n xScale: 0.8,\n yScale: 0.7,\n opacity: 0.5,\n zIndex: -1\n }\n }\n });\n \n const sensorPlatform1 = Bodies.rectangle(2360, -320, 120, 200, {\n isStatic: true,\n label: 'sensorPlatform1',\n isSensor: true,\n render: { \n sprite: {\n texture: '/doors.png',\n xScale: 0.8,\n yScale: 0.7,\n opacity: 0.5,\n zIndex: -1\n }\n }\n });\n \n World.add(world, [ground, platform1, platform2, platform3, leftwall, rightwall, sensorPlatform, sensorPlatform1]);\n\n // 사용자 캐릭터 생성\n const localPlayer = Bodies.rectangle(800, 500, 60, 140, {\n label: userId,\n restitution: 0.1,\n friction: 0,\n inertia: Infinity,\n render: {\n sprite: {\n texture: '/down1.png',\n xScale: 1,\n yScale: 1\n }\n }\n });\n World.add(world, localPlayer);\n\n const otherPlayers = {}; // 다른 플레이어 저장용 객체\n\n const drawSpeechBubble = (context, text, x, y) => {\n const padding = 10;\n const textWidth = context.measureText(text).width;\n\n context.fillStyle = 'rgba(0, 0, 0, 0.6)';\n context.fillRect(x - textWidth / 2 - padding, y - -40, textWidth + padding * 2, 30);\n\n context.fillStyle = \"white\";\n context.fillText(text, x, y - -60);\n };\n\n\n// 다른 플레이어의 위치와 이름을 Firebase에서 실시간 구독\nconst playersRef = ref(database, 'library/players'); // 'library' 경로 하위에 players 추가\nonValue(playersRef, (snapshot) => {\n const playersData = snapshot.val() || {};\n const newPlayers = { ...players };\n\n Object.entries(playersData).forEach(([id, playerData]) => {\n if (id !== userId) {\n if (!otherPlayers[id]) {\n // 다른 플레이어의 캐릭터가 없으면 새로 생성하여 추가\n otherPlayers[id] = {\n body: Bodies.rectangle(playerData.x, playerData.y, 60, 140, {\n label: id,\n isStatic: false,\n render: {\n sprite: {\n texture: '/down1.png',\n xScale: 1,\n yScale: 1\n }\n }\n }),\n name: playerData.name,\n position: { x: playerData.x, y: playerData.y },\n facingLeft: playerData.facingLeft || false,\n facingTop: playerData.facingTop || false,\n moving: playerData.moving || false,\n currentFrame: playerData.currentFrame || 0,\n standFrame: playerData.standFrame || 0\n };\n World.add(world, otherPlayers[id].body);\n } else {\n // 위치 및 상태 업데이트\n Body.setPosition(otherPlayers[id].body, { x: playerData.x, y: playerData.y });\n otherPlayers[id].name = playerData.name;\n otherPlayers[id].position = { x: playerData.x, y: playerData.y };\n otherPlayers[id].facingLeft = playerData.facingLeft;\n otherPlayers[id].facingTop = playerData.facingTop;\n otherPlayers[id].moving = playerData.moving;\n otherPlayers[id].currentFrame = playerData.currentFrame;\n otherPlayers[id].standFrame = playerData.standFrame;\n\n // 캐릭터 이미지 업데이트\n if (otherPlayers[id].moving) {\n if (otherPlayers[id].facingTop) {\n otherPlayers[id].body.render.sprite.texture = otherPlayers[id].facingTop\n ? walkFramesUp[otherPlayers[id].currentFrame]\n : walkFramesDown[otherPlayers[id].currentFrame];\n } else {\n otherPlayers[id].body.render.sprite.texture = otherPlayers[id].facingLeft\n ? walkFramesLeft[otherPlayers[id].currentFrame]\n : walkFramesRight[otherPlayers[id].currentFrame];\n }\n } else {\n if (otherPlayers[id].facingTop) {\n otherPlayers[id].body.render.sprite.texture = otherPlayers[id].facingTop\n ? standFramesUp[otherPlayers[id].standFrame]\n : standFramesDown[otherPlayers[id].standFrame];\n } else {\n otherPlayers[id].body.render.sprite.texture = otherPlayers[id].facingLeft\n ? standFramesLeft[otherPlayers[id].standFrame]\n : standFramesRight[otherPlayers[id].standFrame];\n }\n }\n }\n }\n });\n\n // 화면에서 사라져야 할 플레이어 제거\n Object.keys(otherPlayers).forEach((id) => {\n if (!(id in playersData)) { \n World.remove(world, otherPlayers[id].body);\n delete otherPlayers[id];\n }\n });\n\n setPlayers(newPlayers);\n});\n // 플레이어의 위치 및 상태 업데이트\n const updatePlayerState = () => {\n set(ref(database, `library/players/${userId}`), {\n x: localPlayer.position.x,\n y: localPlayer.position.y,\n name: userName,\n direction: moveRight ? 'right' : moveLeft ? 'left' : 'stand',\n isJumping: isJumping,\n facingLeft: facingLeft,\n facingTop: facingTop,\n moving: moveLeft || moveRight,\n currentFrame: currentFrame, // 현재 애니메이션 프레임\n standFrame: standFrame // 대기 상태 프레임\n });\n };\n\n // 애니메이션 및 이동 상태\n let moveLeft = false;\n let moveRight = false;\n let moveUp = false;\n let moveDown = false;\n\n let isJumping = false;\n let facingLeft = false;\n let facingTop = false;\n const maxSpeed = 8;\n const walkFramesRight = ['/right1.png', '/right2.png'];\n const walkFramesLeft = ['/left1.png', '/left2.png'];\n const walkFramesUp = ['/up1.png', '/up2.png'];\n const walkFramesDown = ['/down1.png', '/down2.png'];\n \n const standFramesRight = ['/right_stand1.png', '/right_stand2.png'];\n const standFramesLeft = ['/left_stand1.png', '/left_stand2.png'];\n const standFramesUp = ['/up_stand1.png', '/up_stand2.png'];\n const standFramesDown = ['/stand1.png', '/stand2.png'];\n let currentFrame = 0;\n let standFrame = 0;\n let onSensorPlatform = false;\n let onSensorPlatform1 = false;\n\n // 키 이벤트 및 이동 제어\n document.addEventListener('keydown', (event) => {\n const inputFocused = document.activeElement.tagName === 'INPUT'; // 입력창에 포커스 확인\n\n if (event.key === 'ArrowLeft') {\n moveLeft = true;\n facingLeft = true;\n }\n if (event.key === 'ArrowRight') {\n moveRight = true;\n facingLeft = false;\n }\n if (event.key === 'ArrowUp') {\n moveUp = true;\n facingTop = true;\n }\n if (event.key === 'ArrowDown') {\n moveDown = true;\n facingTop = false;\n }\n updatePlayerState();\n\n if (event.key === 'ArrowUp' && onSensorPlatform) {\n Body.setPosition(localPlayer, { x: localPlayer.position.x - 400, y: localPlayer.position.y - 1000 });\n onSensorPlatform = false;\n }\n if (event.key === 'ArrowUp' && onSensorPlatform1) {\n window.location.href = '/map';\n onSensorPlatform1 = false;\n }\n });\n\n document.addEventListener('keyup', (event) => {\n if (event.key === 'ArrowLeft') moveLeft = false;\n if (event.key === 'ArrowRight') moveRight = false;\n if (event.key === 'ArrowUp') moveUp = false;\n if (event.key === 'ArrowDown') moveDown = false;\n updatePlayerState();\n });\n\n // 충돌 이벤트 - 점프 상태 해제 및 이미지 전환\n Events.on(engine, 'collisionStart', (event) => {\n const pairs = event.pairs;\n pairs.forEach((pair) => {\n if ((pair.bodyA.label === 'sensorPlatform' && pair.bodyB === localPlayer) ||\n (pair.bodyB.label === 'sensorPlatform' && pair.bodyA === localPlayer)) {\n onSensorPlatform = true;\n }\n if ((pair.bodyA.label === 'sensorPlatform1' && pair.bodyB === localPlayer) ||\n (pair.bodyB.label === 'sensorPlatform1' && pair.bodyA === localPlayer)) {\n onSensorPlatform1 = true;\n }\n });\n });\n\n // 충돌 종료 시 이벤트\n Events.on(engine, 'collisionEnd', (event) => {\n const pairs = event.pairs;\n pairs.forEach((pair) => {\n if ((pair.bodyA === localPlayer && pair.bodyB.label === 'sensorPlatform') ||\n (pair.bodyB === localPlayer && pair.bodyA.label === 'sensorPlatform')) {\n onSensorPlatform = false;\n } else if ((pair.bodyA === localPlayer && pair.bodyB.label === 'sensorPlatform1') ||\n (pair.bodyB === localPlayer && pair.bodyA.label === 'sensorPlatform1')) {\n onSensorPlatform1 = false;\n }\n });\n });\n\n // 캐릭터 이름 표시\n Events.on(renderInstanceRef.current, 'afterRender', function() {\n currentFrame = (currentFrame + 1) % walkFramesUp.length;\n standFrame = (standFrame + 1) % standFramesUp.length;\n \n if (moveUp) {\n // 위로 이동 중\n localPlayer.render.sprite.texture = walkFramesUp[currentFrame];\n } else if (moveDown) {\n // 아래로 이동 중\n localPlayer.render.sprite.texture = walkFramesDown[currentFrame];\n } else if (moveLeft) {\n // 왼쪽으로 이동 중\n localPlayer.render.sprite.texture = walkFramesLeft[currentFrame];\n } else if (moveRight) {\n // 오른쪽으로 이동 중\n localPlayer.render.sprite.texture = walkFramesRight[currentFrame];\n } else {\n // 멈춘 상태\n if (facingTop) {\n localPlayer.render.sprite.texture = standFramesUp[standFrame];\n } else if (!facingTop && !facingLeft) {\n localPlayer.render.sprite.texture = standFramesDown[standFrame];\n } else if (facingLeft) {\n localPlayer.render.sprite.texture = standFramesLeft[standFrame];\n } else {\n localPlayer.render.sprite.texture = standFramesRight[standFrame];\n }\n }\n\n\n const context = renderInstanceRef.current.context;\n context.font = \"bold 16px Arial\";\n context.textAlign = \"center\";\n const canvasX = renderInstanceRef.current.options.width / 2;\n const canvasY = renderInstanceRef.current.options.height / 2 - -240;\n const padding = 10;\n const textWidth = context.measureText(userName).width;\n context.fillStyle = 'rgba(0, 0, 0, 0.5)';\n context.fillRect(canvasX - textWidth / 2 - padding, canvasY - 8 - padding, textWidth + padding * 2, 26);\n context.fillStyle = \"white\";\n context.fillText(userName, canvasX, canvasY);\n\n // 다른 플레이어 이름 표시 - 캐릭터 위치에 고정\n Object.values(otherPlayers).forEach(({ body, name }) => {\n const { x, y } = body.position;\n\n // 월드 좌표를 화면 좌표로 변환\n const screenX = (x - renderInstanceRef.current.bounds.min.x) * (renderInstanceRef.current.options.width / (renderInstanceRef.current.bounds.max.x - renderInstanceRef.current.bounds.min.x));\n const screenY = (y - renderInstanceRef.current.bounds.min.y) * (renderInstanceRef.current.options.height / (renderInstanceRef.current.bounds.max.y - renderInstanceRef.current.bounds.min.y)) - -100;\n\n const nameTextWidth = context.measureText(name).width;\n context.fillStyle = 'rgba(0, 0, 0, 0.5)';\n context.fillRect(screenX - nameTextWidth / 2 - padding, screenY - 8 - padding, nameTextWidth + padding * 2, 26);\n context.fillStyle = \"white\";\n context.fillText(name, screenX, screenY);\n });\n // 화면 좌표로 변환\n const toScreenPosition = (worldX, worldY) => {\n const { min, max } = renderInstanceRef.current.bounds;\n const { width, height } = renderInstanceRef.current.options;\n return {\n x: (worldX - min.x) * (width / (max.x - min.x)),\n y: (worldY - min.y) * (height / (max.y - min.y))\n };\n };\n\n // 내 캐릭터 이름 및 말풍선\n const localScreenPos = toScreenPosition(localPlayer.position.x, localPlayer.position.y);\n if (bubbleMessagesRef.current[userId]) {\n drawSpeechBubble(context, bubbleMessagesRef.current[userId], localScreenPos.x, localScreenPos.y - 150);\n }\n\n // 다른 플레이어의 이름과 말풍선 표시\n Object.values(otherPlayers).forEach(({ body, name }) => {\n const { x, y } = toScreenPosition(body.position.x, body.position.y);\n if (bubbleMessagesRef.current[body.label]) {\n drawSpeechBubble(context, bubbleMessagesRef.current[body.label], x, y - 150);\n }\n });\n\n });\n\n Events.on(engine, 'beforeUpdate', () => {\n // 각도 및 회전 속도 고정 (회전 방지)\n Body.setAngle(localPlayer, 0);\n Body.setAngularVelocity(localPlayer, 0);\n \n let velocityX = 0;\n let velocityY = 0;\n \n if (moveLeft) {\n velocityX = -maxSpeed;\n facingLeft = true;\n facingTop = false;\n } else if (moveRight) {\n velocityX = maxSpeed;\n facingLeft = false;\n facingTop = false;\n }\n \n if (moveUp) {\n velocityY = -maxSpeed;\n facingTop = true;\n } else if (moveDown) {\n velocityY = maxSpeed;\n facingTop = false;\n }\n \n // 캐릭터의 속도를 설정\n Body.setVelocity(localPlayer, { x: velocityX, y: velocityY });\n \n // 매 프레임마다 Firebase에 위치 업데이트\n updatePlayerState();\n \n // 다른 플레이어의 위치를 스무스하게 이동\n Object.keys(otherPlayers).forEach((id) => {\n const otherPlayer = otherPlayers[id];\n const { x: targetX, y: targetY } = otherPlayer.position;\n \n const lerp = (start, end, amount) => (1 - amount) * start + amount * end;\n const smoothFactor = 0.1;\n \n const newX = lerp(otherPlayer.body.position.x, targetX, smoothFactor);\n const newY = lerp(otherPlayer.body.position.y, targetY, smoothFactor);\n \n Body.setPosition(otherPlayer.body, { x: newX, y: newY });\n \n // 각도 및 회전 속도 고정\n Body.setAngle(otherPlayer.body, 0);\n Body.setAngularVelocity(otherPlayer.body, 0);\n });\n \n Render.lookAt(renderInstanceRef.current, {\n min: { x: localPlayer.position.x - 700, y: localPlayer.position.y - 600 },\n max: { x: localPlayer.position.x + 700, y: localPlayer.position.y + 300 }\n });\n });\n\n return () => {\n // 언마운트 시 렌더 정리 및 캔버스 초기화\n if (renderInstanceRef.current) {\n Render.stop(renderInstanceRef.current);\n renderInstanceRef.current = null; // 렌더 인스턴스 참조 해제\n }\n World.clear(world);\n Engine.clear(engine);\n Runner.stop(runner);\n remove(ref(database, `library/players/${userId}`));\n if (gameCanvasRef.current) {\n gameCanvasRef.current.innerHTML = \"\"; // 캔버스 내부 초기화\n }\n };\n }, [userObj, userId, userName]);\n\n return (\n
    \n
    \n
    \n
    \n
    \n
    \n {chatHistory.map((chat, index) => (\n
    \n {chat.userName}: {chat.message}\n
    \n ))}\n
    \n \n \n
    \n
    \n )\n}\n\nexport default Event;","import React, { useState } from 'react';\nimport { db } from '../firebase';\nimport { collection, addDoc } from 'firebase/firestore';\nimport { useNavigate } from 'react-router-dom';\nimport '../css/VoteCreate.css';\n\nfunction VoteCreation() {\n const [title, setTitle] = useState('');\n const [deadline, setDeadline] = useState('');\n const [questions, setQuestions] = useState({\n ABILITY: '',\n HELPING: '',\n FUNFUN: '',\n SHARING: '',\n KINDNESS: '',\n PASSION: '',\n EFFORT: '',\n EXTRA: ''\n });\n\n const [note, setNote] = useState({ title: '', answer: [] });\n const [isLoading, setIsLoading] = useState(false);\n const navigate = useNavigate();\n\n const handleInputChange = (key, value) => {\n setQuestions(prev => ({\n ...prev,\n [key]: value\n }));\n };\n\n const handleNoteTitleChange = (value) => {\n setNote(prev => ({\n ...prev,\n title: value // title만 업데이트\n }));\n };\n\n const createVote = async () => {\n if (!title || !deadline || Object.values(questions).some(q => !q) || !note.title) {\n alert('모든 필드를 입력해주세요.');\n return;\n }\n\n const formattedQuestions = {};\n for (const key in questions) {\n formattedQuestions[key] = { question: questions[key], responses: [] };\n }\n\n try {\n setIsLoading(true);\n await addDoc(collection(db, 'bigpieVote'), {\n vote_title: title,\n state: 0,\n resultType: false,\n created_at: new Date(),\n deadline,\n questions: formattedQuestions,\n note,\n submittedUsers: []\n });\n alert('투표가 성공적으로 생성되었습니다.');\n navigate('/votelist');\n } catch (error) {\n alert('투표 생성 중 오류가 발생했습니다.');\n console.log(error)\n } finally {\n setIsLoading(false);\n }\n };\n\n return (\n
    \n {isLoading ? (\n
    로딩중...
    \n ) : (\n <>\n

    칭찬직원 생성

    \n setTitle(e.target.value)}\n />\n setDeadline(e.target.value)}\n />\n {Object.keys(questions).map((key) => (\n
    \n handleInputChange(key, e.target.value)}\n />\n
    \n ))}\n
    \n handleNoteTitleChange(e.target.value)}\n />\n
    \n \n \n )}\n
    \n );\n}\n\nexport default VoteCreation;","import React, { useEffect, useState } from 'react';\nimport { db } from '../firebase';\nimport { collection, getDocs, query, orderBy, doc, updateDoc } from 'firebase/firestore';\nimport { useNavigate } from 'react-router-dom';\n\nfunction VoteList() {\n const [votes, setVotes] = useState([]);\n\n const [selectedVote, setSelectedVote] = useState(null);\n const [modalOpen, setModalOpen] = useState(false);\n const [allUsers, setAllUsers] = useState([]);\n\n const navigate = useNavigate();\n\n useEffect(() => {\n const fetchVotes = async () => {\n try {\n const q = query(collection(db, 'bigpieVote'), orderBy('created_at', 'desc'));\n const querySnapshot = await getDocs(q);\n\n const voteList = querySnapshot.docs.map(doc => ({\n id: doc.id,\n ...doc.data()\n }));\n setVotes(voteList);\n } catch (error) {\n console.error('투표 목록 가져오기 오류:', error);\n }\n };\n\n const fetchUsers = async () => {\n try {\n const usersSnapshot = await getDocs(collection(db, 'users'));\n const users = usersSnapshot.docs\n .map(userDoc => ({ id: userDoc.id, ...userDoc.data() }))\n .filter(user => user.role !== 'admin');\n setAllUsers(users);\n } catch (error) {\n console.error('유저 목록 가져오기 오류:', error);\n }\n };\n\n fetchVotes();\n fetchUsers();\n }, []);\n\n const toggleResultType = async (id, currentValue) => {\n try {\n const voteDoc = doc(db, 'bigpieVote', id);\n await updateDoc(voteDoc, { resultType: !currentValue });\n setVotes(prevVotes =>\n prevVotes.map(vote =>\n vote.id === id ? { ...vote, resultType: !currentValue } : vote\n )\n );\n } catch (error) {\n console.error('결과 타입 변경 오류:', error);\n }\n };\n\n const handleCheckClick = (vote) => {\n setSelectedVote(vote);\n setModalOpen(true);\n };\n\n const closeModal = () => {\n setModalOpen(false);\n setSelectedVote(null);\n };\n\n const stateTextAndColor = (state) => {\n if (state === 0) return { text: '진행전', color: 'gray' };\n if (state === 1) return { text: '진행중', color: 'red' };\n if (state === 2) return { text: '마감완료', color: 'blue' };\n return { text: '', color: 'transparent' };\n };\n\n const totalUsers = allUsers.length;\n const submittedUsersCount = selectedVote?.submittedUsers?.length || 0;\n const notSubmittedUsersCount = totalUsers - submittedUsersCount;\n\n return (\n
    \n

    투표 목록

    \n \n \n \n \n \n \n \n \n \n \n \n \n \n {votes.map((vote) => {\n const stateInfo = stateTextAndColor(vote.state);\n\n return (\n \n \n \n \n \n \n \n \n \n );\n })}\n \n
    제목생성일마감일투표 상태인원체크결과 표시
    {vote.vote_title}{new Date(vote.created_at.seconds * 1000).toISOString().split('T')[0]}{vote.deadline}\n \n {stateInfo.text}\n \n \n handleCheckClick(vote)}\n style={{\n backgroundColor: 'green',\n color: 'white',\n padding: '5px',\n border: 'none',\n cursor: 'pointer'\n }}\n >\n 확인하기\n \n \n toggleResultType(vote.id, vote.resultType)}\n style={{\n backgroundColor: vote.resultType ? 'skyblue' : 'gray',\n color: 'white',\n padding: '5px',\n border: 'none',\n cursor: 'pointer'\n }}\n >\n {vote.resultType ? '활성' : '비활성'}\n \n \n navigate(`/vote/${vote.id}`)}\n style={{\n backgroundColor: 'green',\n color: 'white',\n padding: '5px',\n border: 'none',\n cursor: 'pointer'\n }}\n >\n 상세보기\n \n
    \n
    \n navigate('/votecreate')}\n style={{ marginTop: '20px', backgroundColor: 'blue', color: 'white', padding: '10px', border: 'none' }}\n >\n 투표 생성\n \n
    \n\n {/* 모달 */}\n {modalOpen && selectedVote && (\n \n \n \n X\n \n

    {selectedVote.vote_title} - 제출 상태

    \n

    \n 전체 유저: {totalUsers}명 / 제출: {submittedUsersCount}명 / 미제출: {notSubmittedUsersCount}명\n

    \n
    \n

    제출 완료

    \n \n \n \n \n \n \n \n \n {allUsers\n .filter(user => selectedVote.submittedUsers?.includes(user.id))\n .map(user => (\n \n \n \n \n ))}\n \n
    이름
    {user.team}{user.name}
    \n
    \n
    \n

    미제출

    \n \n \n \n \n \n \n \n \n {allUsers\n .filter(user => !selectedVote.submittedUsers?.includes(user.id))\n .map(user => (\n \n \n \n \n ))}\n \n
    이름
    {user.team}{user.name}
    \n
    \n
    \n
    \n )}\n \n );\n}\n\nexport default VoteList;","import React, { useEffect, useState } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { db } from '../firebase';\nimport { collection, getDocs, doc, deleteDoc, updateDoc } from 'firebase/firestore';\n\nfunction MemberList() {\n const [users, setUsers] = useState([]);\n const [totalUsers, setTotalUsers] = useState(0);\n const [isModalOpen, setIsModalOpen] = useState(false);\n const [selectedUser, setSelectedUser] = useState(null);\n const [formData, setFormData] = useState({ email: '', name: '', team: '', newPassword: '' });\n const navigate = useNavigate();\n\n useEffect(() => {\n const fetchUsers = async () => {\n try {\n const querySnapshot = await getDocs(collection(db, 'users'));\n const userList = querySnapshot.docs\n .map((doc) => ({ id: doc.id, ...doc.data() }))\n .filter((user) => user.role !== 'admin') // 어드민 제외\n .sort((a, b) => new Date(b.createdAt) - new Date(a.createdAt)); // 최신순 정렬\n\n setUsers(userList);\n setTotalUsers(userList.length); // 총 회원 수\n } catch (error) {\n console.error('유저 목록 가져오기 오류:', error);\n }\n };\n\n fetchUsers();\n }, []);\n\n const handleDelete = async (id) => {\n try {\n await deleteDoc(doc(db, 'users', id));\n setUsers((prevUsers) => prevUsers.filter((user) => user.id !== id)); // 로컬 상태에서 삭제\n setTotalUsers((prevCount) => prevCount - 1); // 총 회원 수 갱신\n alert('회원이 삭제되었습니다.');\n } catch (error) {\n console.error('회원 삭제 오류:', error);\n }\n };\n\n const handleOpenModal = (user) => {\n setSelectedUser(user);\n setFormData({\n email: user.email || '',\n name: user.name || '',\n team: user.team || '',\n newPassword: '',\n });\n setIsModalOpen(true);\n };\n\n const handleCloseModal = () => {\n setSelectedUser(null);\n setFormData({ email: '', name: '', team: '', newPassword: '' });\n setIsModalOpen(false);\n };\n\n const handleInputChange = (field, value) => {\n setFormData((prevData) => ({ ...prevData, [field]: value }));\n };\n\n const handleSaveChanges = async () => {\n if (!formData.email || !formData.name || !formData.team) {\n alert('모든 필드를 입력해주세요.');\n return;\n }\n\n try {\n const userDoc = doc(db, 'users', selectedUser.id);\n\n // Firestore에 업데이트\n await updateDoc(userDoc, {\n email: formData.email,\n name: formData.name,\n team: formData.team,\n });\n\n // 비밀번호 변경이 요청된 경우 Firebase Functions 호출\n if (formData.newPassword) {\n try {\n const response = await fetch(\n 'http://43.202.29.32:5040/updatePassword',\n {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ uid: selectedUser.id, newPassword: formData.newPassword }),\n }\n );\n \n if (!response.ok) {\n const errorData = await response.json();\n throw new Error(`비밀번호 수정 오류: ${errorData.message}`);\n }\n } catch (error) {\n console.error('비밀번호 변경 API 호출 오류:', error);\n alert('비밀번호 수정 중 오류가 발생했습니다.');\n return;\n }\n }\n\n alert('회원 정보가 성공적으로 수정되었습니다.');\n handleCloseModal();\n\n // 로컬 상태 업데이트\n setUsers((prevUsers) =>\n prevUsers.map((user) =>\n user.id === selectedUser.id\n ? { ...user, email: formData.email, name: formData.name, team: formData.team }\n : user\n )\n );\n } catch (error) {\n console.error('회원 정보 수정 오류:', error);\n alert('회원 정보 수정 중 오류가 발생했습니다.');\n }\n };\n\n return (\n
    \n

    회원 목록

    \n

    총 회원 수: {totalUsers}명

    \n \n \n \n \n \n \n \n \n \n \n \n \n {users.map((user, index) => (\n \n {/* 역순 번호: 가장 높은 번호가 위로 */}\n \n \n \n \n \n \n \n ))}\n \n
    No.이메일이름수정하기삭제하기
    {users.length - index}{user.email || 'N/A'}{user.name || 'N/A'}{user.team || 'N/A'}\n handleOpenModal(user)}\n style={{\n backgroundColor: 'blue',\n color: 'white',\n padding: '5px',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n 수정하기\n \n \n handleDelete(user.id)}\n style={{\n backgroundColor: 'red',\n color: 'white',\n padding: '5px',\n border: 'none',\n cursor: 'pointer',\n }}\n >\n 삭제하기\n \n
    \n\n {/* 수정 모달 */}\n {isModalOpen && selectedUser && (\n \n \n \n X\n \n

    {selectedUser.name} - 회원 정보 수정

    \n
    \n \n handleInputChange('email', e.target.value)}\n style={{ width: '100%' }}\n readOnly\n />\n
    \n
    \n \n handleInputChange('name', e.target.value)}\n style={{ width: '100%' }}\n />\n
    \n
    \n \n handleInputChange('team', e.target.value)}\n style={{ width: '100%' }}\n />\n
    \n
    \n \n handleInputChange('newPassword', e.target.value)}\n style={{ width: '100%' }}\n />\n
    \n \n 수정하기\n \n
    \n \n )}\n\n
    \n navigate('/signup')}\n style={{\n padding: '10px 20px',\n border: 'none',\n borderRadius: '5px',\n cursor: 'pointer',\n fontSize: '16px',\n }}\n >\n 회원 생성\n \n
    \n\n \n );\n}\n\nexport default MemberList;","/*! xlsx.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported XLSX */\n/*global process:false, Buffer:false, ArrayBuffer:false, DataView:false, Deno:false */\nvar XLSX = {};\nXLSX.version = '0.18.5';\nvar current_codepage = 1200, current_ansi = 1252;\n\nvar VALID_ANSI = [ 874, 932, 936, 949, 950, 1250, 1251, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 10000 ];\n/* ECMA-376 Part I 18.4.1 charset to codepage mapping */\nvar CS2CP = ({\n\t/*::[*/0/*::]*/: 1252, /* ANSI */\n\t/*::[*/1/*::]*/: 65001, /* DEFAULT */\n\t/*::[*/2/*::]*/: 65001, /* SYMBOL */\n\t/*::[*/77/*::]*/: 10000, /* MAC */\n\t/*::[*/128/*::]*/: 932, /* SHIFTJIS */\n\t/*::[*/129/*::]*/: 949, /* HANGUL */\n\t/*::[*/130/*::]*/: 1361, /* JOHAB */\n\t/*::[*/134/*::]*/: 936, /* GB2312 */\n\t/*::[*/136/*::]*/: 950, /* CHINESEBIG5 */\n\t/*::[*/161/*::]*/: 1253, /* GREEK */\n\t/*::[*/162/*::]*/: 1254, /* TURKISH */\n\t/*::[*/163/*::]*/: 1258, /* VIETNAMESE */\n\t/*::[*/177/*::]*/: 1255, /* HEBREW */\n\t/*::[*/178/*::]*/: 1256, /* ARABIC */\n\t/*::[*/186/*::]*/: 1257, /* BALTIC */\n\t/*::[*/204/*::]*/: 1251, /* RUSSIAN */\n\t/*::[*/222/*::]*/: 874, /* THAI */\n\t/*::[*/238/*::]*/: 1250, /* EASTEUROPE */\n\t/*::[*/255/*::]*/: 1252, /* OEM */\n\t/*::[*/69/*::]*/: 6969 /* MISC */\n}/*:any*/);\n\nvar set_ansi = function(cp/*:number*/) { if(VALID_ANSI.indexOf(cp) == -1) return; current_ansi = CS2CP[0] = cp; };\nfunction reset_ansi() { set_ansi(1252); }\n\nvar set_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };\nfunction reset_cp() { set_cp(1200); reset_ansi(); }\n\nfunction char_codes(data/*:string*/)/*:Array*/ { var o/*:Array*/ = []; for(var i = 0, len = data.length; i < len; ++i) o[i] = data.charCodeAt(i); return o; }\n\nfunction utf16leread(data/*:string*/)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i) + (data.charCodeAt(2*i+1)<<8));\n\treturn o.join(\"\");\n}\nfunction utf16beread(data/*:string*/)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\tfor(var i = 0; i < (data.length>>1); ++i) o[i] = String.fromCharCode(data.charCodeAt(2*i+1) + (data.charCodeAt(2*i)<<8));\n\treturn o.join(\"\");\n}\n\nvar debom = function(data/*:string*/)/*:string*/ {\n\tvar c1 = data.charCodeAt(0), c2 = data.charCodeAt(1);\n\tif(c1 == 0xFF && c2 == 0xFE) return utf16leread(data.slice(2));\n\tif(c1 == 0xFE && c2 == 0xFF) return utf16beread(data.slice(2));\n\tif(c1 == 0xFEFF) return data.slice(1);\n\treturn data;\n};\n\nvar _getchar = function _gc1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };\nvar _getansi = function _ga1(x/*:number*/)/*:string*/ { return String.fromCharCode(x); };\n\nvar $cptable;\nfunction set_cptable(cptable) {\n\t$cptable = cptable;\n\tset_cp = function(cp/*:number*/) { current_codepage = cp; set_ansi(cp); };\n\tdebom = function(data/*:string*/) {\n\t\tif(data.charCodeAt(0) === 0xFF && data.charCodeAt(1) === 0xFE) { return $cptable.utils.decode(1200, char_codes(data.slice(2))); }\n\t\treturn data;\n\t};\n\t_getchar = function _gc2(x/*:number*/)/*:string*/ {\n\t\tif(current_codepage === 1200) return String.fromCharCode(x);\n\t\treturn $cptable.utils.decode(current_codepage, [x&255,x>>8])[0];\n\t};\n\t_getansi = function _ga2(x/*:number*/)/*:string*/ {\n\t\treturn $cptable.utils.decode(current_ansi, [x])[0];\n\t};\n\tcpdoit();\n}\nexport { set_cptable };\nvar DENSE = null;\nvar DIF_XL = true;\nvar Base64_map = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\nfunction Base64_encode(input) {\n var o = \"\";\n var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n for (var i = 0; i < input.length; ) {\n c1 = input.charCodeAt(i++);\n e1 = c1 >> 2;\n c2 = input.charCodeAt(i++);\n e2 = (c1 & 3) << 4 | c2 >> 4;\n c3 = input.charCodeAt(i++);\n e3 = (c2 & 15) << 2 | c3 >> 6;\n e4 = c3 & 63;\n if (isNaN(c2)) {\n e3 = e4 = 64;\n } else if (isNaN(c3)) {\n e4 = 64;\n }\n o += Base64_map.charAt(e1) + Base64_map.charAt(e2) + Base64_map.charAt(e3) + Base64_map.charAt(e4);\n }\n return o;\n}\nfunction Base64_decode(input) {\n var o = \"\";\n var c1 = 0, c2 = 0, c3 = 0, e1 = 0, e2 = 0, e3 = 0, e4 = 0;\n input = input.replace(/[^\\w\\+\\/\\=]/g, \"\");\n for (var i = 0; i < input.length; ) {\n e1 = Base64_map.indexOf(input.charAt(i++));\n e2 = Base64_map.indexOf(input.charAt(i++));\n c1 = e1 << 2 | e2 >> 4;\n o += String.fromCharCode(c1);\n e3 = Base64_map.indexOf(input.charAt(i++));\n c2 = (e2 & 15) << 4 | e3 >> 2;\n if (e3 !== 64) {\n o += String.fromCharCode(c2);\n }\n e4 = Base64_map.indexOf(input.charAt(i++));\n c3 = (e3 & 3) << 6 | e4;\n if (e4 !== 64) {\n o += String.fromCharCode(c3);\n }\n }\n return o;\n}\nvar has_buf = /*#__PURE__*/(function() { return typeof Buffer !== 'undefined' && typeof process !== 'undefined' && typeof process.versions !== 'undefined' && !!process.versions.node; })();\n\nvar Buffer_from = /*#__PURE__*/(function() {\n\tif(typeof Buffer !== 'undefined') {\n\t\tvar nbfs = !Buffer.from;\n\t\tif(!nbfs) try { Buffer.from(\"foo\", \"utf8\"); } catch(e) { nbfs = true; }\n\t\treturn nbfs ? function(buf, enc) { return (enc) ? new Buffer(buf, enc) : new Buffer(buf); } : Buffer.from.bind(Buffer);\n\t}\n\treturn function() {};\n})();\n\n\nfunction new_raw_buf(len/*:number*/) {\n\t/* jshint -W056 */\n\tif(has_buf) return Buffer.alloc ? Buffer.alloc(len) : new Buffer(len);\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nfunction new_unsafe_buf(len/*:number*/) {\n\t/* jshint -W056 */\n\tif(has_buf) return Buffer.allocUnsafe ? Buffer.allocUnsafe(len) : new Buffer(len);\n\treturn typeof Uint8Array != \"undefined\" ? new Uint8Array(len) : new Array(len);\n\t/* jshint +W056 */\n}\n\nvar s2a = function s2a(s/*:string*/)/*:any*/ {\n\tif(has_buf) return Buffer_from(s, \"binary\");\n\treturn s.split(\"\").map(function(x/*:string*/)/*:number*/{ return x.charCodeAt(0) & 0xff; });\n};\n\nfunction s2ab(s/*:string*/)/*:any*/ {\n\tif(typeof ArrayBuffer === 'undefined') return s2a(s);\n\tvar buf = new ArrayBuffer(s.length), view = new Uint8Array(buf);\n\tfor (var i=0; i!=s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;\n\treturn buf;\n}\n\nfunction a2s(data/*:any*/)/*:string*/ {\n\tif(Array.isArray(data)) return data.map(function(c) { return String.fromCharCode(c); }).join(\"\");\n\tvar o/*:Array*/ = []; for(var i = 0; i < data.length; ++i) o[i] = String.fromCharCode(data[i]); return o.join(\"\");\n}\n\nfunction a2u(data/*:Array*/)/*:Uint8Array*/ {\n\tif(typeof Uint8Array === 'undefined') throw new Error(\"Unsupported\");\n\treturn new Uint8Array(data);\n}\n\nfunction ab2a(data/*:ArrayBuffer|Uint8Array*/)/*:Array*/ {\n\tif(typeof ArrayBuffer == 'undefined') throw new Error(\"Unsupported\");\n\tif(data instanceof ArrayBuffer) return ab2a(new Uint8Array(data));\n\t/*:: if(data instanceof ArrayBuffer) throw new Error(\"unreachable\"); */\n\tvar o = new Array(data.length);\n\tfor(var i = 0; i < data.length; ++i) o[i] = data[i];\n\treturn o;\n}\n\nvar bconcat = has_buf ? function(bufs) { return Buffer.concat(bufs.map(function(buf) { return Buffer.isBuffer(buf) ? buf : Buffer_from(buf); })); } : function(bufs) {\n\tif(typeof Uint8Array !== \"undefined\") {\n\t\tvar i = 0, maxlen = 0;\n\t\tfor(i = 0; i < bufs.length; ++i) maxlen += bufs[i].length;\n\t\tvar o = new Uint8Array(maxlen);\n\t\tvar len = 0;\n\t\tfor(i = 0, maxlen = 0; i < bufs.length; maxlen += len, ++i) {\n\t\t\tlen = bufs[i].length;\n\t\t\tif(bufs[i] instanceof Uint8Array) o.set(bufs[i], maxlen);\n\t\t\telse if(typeof bufs[i] == \"string\") { throw \"wtf\"; }\n\t\t\telse o.set(new Uint8Array(bufs[i]), maxlen);\n\t\t}\n\t\treturn o;\n\t}\n\treturn [].concat.apply([], bufs.map(function(buf) { return Array.isArray(buf) ? buf : [].slice.call(buf); }));\n};\n\nfunction utf8decode(content/*:string*/) {\n\tvar out = [], widx = 0, L = content.length + 250;\n\tvar o = new_raw_buf(content.length + 255);\n\tfor(var ridx = 0; ridx < content.length; ++ridx) {\n\t\tvar c = content.charCodeAt(ridx);\n\t\tif(c < 0x80) o[widx++] = c;\n\t\telse if(c < 0x800) {\n\t\t\to[widx++] = (192|((c>>6)&31));\n\t\t\to[widx++] = (128|(c&63));\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64;\n\t\t\tvar d = content.charCodeAt(++ridx)&1023;\n\t\t\to[widx++] = (240|((c>>8)&7));\n\t\t\to[widx++] = (128|((c>>2)&63));\n\t\t\to[widx++] = (128|((d>>6)&15)|((c&3)<<4));\n\t\t\to[widx++] = (128|(d&63));\n\t\t} else {\n\t\t\to[widx++] = (224|((c>>12)&15));\n\t\t\to[widx++] = (128|((c>>6)&63));\n\t\t\to[widx++] = (128|(c&63));\n\t\t}\n\t\tif(widx > L) {\n\t\t\tout.push(o.slice(0, widx));\n\t\t\twidx = 0;\n\t\t\to = new_raw_buf(65535);\n\t\t\tL = 65530;\n\t\t}\n\t}\n\tout.push(o.slice(0, widx));\n\treturn bconcat(out);\n}\n\nvar chr0 = /\\u0000/g, chr1 = /[\\u0001-\\u0006]/g;\n/*::\ndeclare type Block = any;\ndeclare type BufArray = {\n\tnewblk(sz:number):Block;\n\tnext(sz:number):Block;\n\tend():any;\n\tpush(buf:Block):void;\n};\n\ntype RecordHopperCB = {(d:any, Rn:string, RT:number):?boolean;};\n\ntype EvertType = {[string]:string};\ntype EvertNumType = {[string]:number};\ntype EvertArrType = {[string]:Array};\n\ntype StringConv = {(string):string};\n\n*/\n/* ssf.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/*jshint -W041 */\nfunction _strrev(x/*:string*/)/*:string*/ { var o = \"\", i = x.length-1; while(i>=0) o += x.charAt(i--); return o; }\nfunction pad0(v/*:any*/,d/*:number*/)/*:string*/{var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad_(v/*:any*/,d/*:number*/)/*:string*/{var t=\"\"+v;return t.length>=d?t:fill(' ',d-t.length)+t;}\nfunction rpad_(v/*:any*/,d/*:number*/)/*:string*/{var t=\"\"+v; return t.length>=d?t:t+fill(' ',d-t.length);}\nfunction pad0r1(v/*:any*/,d/*:number*/)/*:string*/{var t=\"\"+Math.round(v); return t.length>=d?t:fill('0',d-t.length)+t;}\nfunction pad0r2(v/*:any*/,d/*:number*/)/*:string*/{var t=\"\"+v; return t.length>=d?t:fill('0',d-t.length)+t;}\nvar p2_32 = /*#__PURE__*/Math.pow(2,32);\nfunction pad0r(v/*:any*/,d/*:number*/)/*:string*/{if(v>p2_32||v<-p2_32) return pad0r1(v,d); var i = Math.round(v); return pad0r2(i,d); }\n/* yes, in 2022 this is still faster than string compare */\nfunction SSF_isgeneral(s/*:string*/, i/*:?number*/)/*:boolean*/ { i = i || 0; return s.length >= 7 + i && (s.charCodeAt(i)|32) === 103 && (s.charCodeAt(i+1)|32) === 101 && (s.charCodeAt(i+2)|32) === 110 && (s.charCodeAt(i+3)|32) === 101 && (s.charCodeAt(i+4)|32) === 114 && (s.charCodeAt(i+5)|32) === 97 && (s.charCodeAt(i+6)|32) === 108; }\nvar days/*:Array >*/ = [\n\t['Sun', 'Sunday'],\n\t['Mon', 'Monday'],\n\t['Tue', 'Tuesday'],\n\t['Wed', 'Wednesday'],\n\t['Thu', 'Thursday'],\n\t['Fri', 'Friday'],\n\t['Sat', 'Saturday']\n];\nvar months/*:Array >*/ = [\n\t['J', 'Jan', 'January'],\n\t['F', 'Feb', 'February'],\n\t['M', 'Mar', 'March'],\n\t['A', 'Apr', 'April'],\n\t['M', 'May', 'May'],\n\t['J', 'Jun', 'June'],\n\t['J', 'Jul', 'July'],\n\t['A', 'Aug', 'August'],\n\t['S', 'Sep', 'September'],\n\t['O', 'Oct', 'October'],\n\t['N', 'Nov', 'November'],\n\t['D', 'Dec', 'December']\n];\nfunction SSF_init_table(t/*:any*/) {\n\tif(!t) t = {};\n\tt[0]= 'General';\n\tt[1]= '0';\n\tt[2]= '0.00';\n\tt[3]= '#,##0';\n\tt[4]= '#,##0.00';\n\tt[9]= '0%';\n\tt[10]= '0.00%';\n\tt[11]= '0.00E+00';\n\tt[12]= '# ?/?';\n\tt[13]= '# ??/??';\n\tt[14]= 'm/d/yy';\n\tt[15]= 'd-mmm-yy';\n\tt[16]= 'd-mmm';\n\tt[17]= 'mmm-yy';\n\tt[18]= 'h:mm AM/PM';\n\tt[19]= 'h:mm:ss AM/PM';\n\tt[20]= 'h:mm';\n\tt[21]= 'h:mm:ss';\n\tt[22]= 'm/d/yy h:mm';\n\tt[37]= '#,##0 ;(#,##0)';\n\tt[38]= '#,##0 ;[Red](#,##0)';\n\tt[39]= '#,##0.00;(#,##0.00)';\n\tt[40]= '#,##0.00;[Red](#,##0.00)';\n\tt[45]= 'mm:ss';\n\tt[46]= '[h]:mm:ss';\n\tt[47]= 'mmss.0';\n\tt[48]= '##0.0E+0';\n\tt[49]= '@';\n\tt[56]= '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"';\n\treturn t;\n}\n/* repeated to satiate webpack */\nvar table_fmt = {\n\t0: 'General',\n\t1: '0',\n\t2: '0.00',\n\t3: '#,##0',\n\t4: '#,##0.00',\n\t9: '0%',\n\t10: '0.00%',\n\t11: '0.00E+00',\n\t12: '# ?/?',\n\t13: '# ??/??',\n\t14: 'm/d/yy',\n\t15: 'd-mmm-yy',\n\t16: 'd-mmm',\n\t17: 'mmm-yy',\n\t18: 'h:mm AM/PM',\n\t19: 'h:mm:ss AM/PM',\n\t20: 'h:mm',\n\t21: 'h:mm:ss',\n\t22: 'm/d/yy h:mm',\n\t37: '#,##0 ;(#,##0)',\n\t38: '#,##0 ;[Red](#,##0)',\n\t39: '#,##0.00;(#,##0.00)',\n\t40: '#,##0.00;[Red](#,##0.00)',\n\t45: 'mm:ss',\n\t46: '[h]:mm:ss',\n\t47: 'mmss.0',\n\t48: '##0.0E+0',\n\t49: '@',\n\t56: '\"上午/下午 \"hh\"時\"mm\"分\"ss\"秒 \"'\n};\n\n/* Defaults determined by systematically testing in Excel 2019 */\n\n/* These formats appear to default to other formats in the table */\nvar SSF_default_map = {\n\t5: 37, 6: 38, 7: 39, 8: 40, // 5 -> 37 ... 8 -> 40\n\n\t23: 0, 24: 0, 25: 0, 26: 0, // 23 -> 0 ... 26 -> 0\n\n\t27: 14, 28: 14, 29: 14, 30: 14, 31: 14, // 27 -> 14 ... 31 -> 14\n\n\t50: 14, 51: 14, 52: 14, 53: 14, 54: 14, // 50 -> 14 ... 58 -> 14\n\t55: 14, 56: 14, 57: 14, 58: 14,\n\t59: 1, 60: 2, 61: 3, 62: 4, // 59 -> 1 ... 62 -> 4\n\n\t67: 9, 68: 10, // 67 -> 9 ... 68 -> 10\n\t69: 12, 70: 13, 71: 14, // 69 -> 12 ... 71 -> 14\n\t72: 14, 73: 15, 74: 16, 75: 17, // 72 -> 14 ... 75 -> 17\n\t76: 20, 77: 21, 78: 22, // 76 -> 20 ... 78 -> 22\n\t79: 45, 80: 46, 81: 47, // 79 -> 45 ... 81 -> 47\n\t82: 0 // 82 -> 0 ... 65536 -> 0 (omitted)\n};\n\n\n/* These formats technically refer to Accounting formats with no equivalent */\nvar SSF_default_str = {\n\t// 5 -- Currency, 0 decimal, black negative\n\t5: '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t63: '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\n\t// 6 -- Currency, 0 decimal, red negative\n\t6: '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t64: '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\n\t// 7 -- Currency, 2 decimal, black negative\n\t7: '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t65: '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\n\t// 8 -- Currency, 2 decimal, red negative\n\t8: '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t66: '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\n\t// 41 -- Accounting, 0 decimal, No Symbol\n\t41: '_(* #,##0_);_(* \\\\(#,##0\\\\);_(* \"-\"_);_(@_)',\n\n\t// 42 -- Accounting, 0 decimal, $ Symbol\n\t42: '_(\"$\"* #,##0_);_(\"$\"* \\\\(#,##0\\\\);_(\"$\"* \"-\"_);_(@_)',\n\n\t// 43 -- Accounting, 2 decimal, No Symbol\n\t43: '_(* #,##0.00_);_(* \\\\(#,##0.00\\\\);_(* \"-\"??_);_(@_)',\n\n\t// 44 -- Accounting, 2 decimal, $ Symbol\n\t44: '_(\"$\"* #,##0.00_);_(\"$\"* \\\\(#,##0.00\\\\);_(\"$\"* \"-\"??_);_(@_)'\n};\n\nfunction SSF_frac(x/*:number*/, D/*:number*/, mixed/*:?boolean*/)/*:Array*/ {\n\tvar sgn = x < 0 ? -1 : 1;\n\tvar B = x * sgn;\n\tvar P_2 = 0, P_1 = 1, P = 0;\n\tvar Q_2 = 1, Q_1 = 0, Q = 0;\n\tvar A = Math.floor(B);\n\twhile(Q_1 < D) {\n\t\tA = Math.floor(B);\n\t\tP = A * P_1 + P_2;\n\t\tQ = A * Q_1 + Q_2;\n\t\tif((B - A) < 0.00000005) break;\n\t\tB = 1 / (B - A);\n\t\tP_2 = P_1; P_1 = P;\n\t\tQ_2 = Q_1; Q_1 = Q;\n\t}\n\tif(Q > D) { if(Q_1 > D) { Q = Q_2; P = P_2; } else { Q = Q_1; P = P_1; } }\n\tif(!mixed) return [0, sgn * P, Q];\n\tvar q = Math.floor(sgn * P/Q);\n\treturn [q, sgn*P - q*Q, Q];\n}\nfunction SSF_parse_date_code(v/*:number*/,opts/*:?any*/,b2/*:?boolean*/) {\n\tif(v > 2958465 || v < 0) return null;\n\tvar date = (v|0), time = Math.floor(86400 * (v - date)), dow=0;\n\tvar dout=[];\n\tvar out={D:date, T:time, u:86400*(v-date)-time,y:0,m:0,d:0,H:0,M:0,S:0,q:0};\n\tif(Math.abs(out.u) < 1e-6) out.u = 0;\n\tif(opts && opts.date1904) date += 1462;\n\tif(out.u > 0.9999) {\n\t\tout.u = 0;\n\t\tif(++time == 86400) { out.T = time = 0; ++date; ++out.D; }\n\t}\n\tif(date === 60) {dout = b2 ? [1317,10,29] : [1900,2,29]; dow=3;}\n\telse if(date === 0) {dout = b2 ? [1317,8,29] : [1900,1,0]; dow=6;}\n\telse {\n\t\tif(date > 60) --date;\n\t\t/* 1 = Jan 1 1900 in Gregorian */\n\t\tvar d = new Date(1900, 0, 1);\n\t\td.setDate(d.getDate() + date - 1);\n\t\tdout = [d.getFullYear(), d.getMonth()+1,d.getDate()];\n\t\tdow = d.getDay();\n\t\tif(date < 60) dow = (dow + 6) % 7;\n\t\tif(b2) dow = SSF_fix_hijri(d, dout);\n\t}\n\tout.y = dout[0]; out.m = dout[1]; out.d = dout[2];\n\tout.S = time % 60; time = Math.floor(time / 60);\n\tout.M = time % 60; time = Math.floor(time / 60);\n\tout.H = time;\n\tout.q = dow;\n\treturn out;\n}\nvar SSFbasedate = /*#__PURE__*/new Date(1899, 11, 31, 0, 0, 0);\nvar SSFdnthresh = /*#__PURE__*/SSFbasedate.getTime();\nvar SSFbase1904 = /*#__PURE__*/new Date(1900, 2, 1, 0, 0, 0);\nfunction datenum_local(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {\n\tvar epoch = /*#__PURE__*/v.getTime();\n\tif(date1904) epoch -= 1461*24*60*60*1000;\n\telse if(v >= SSFbase1904) epoch += 24*60*60*1000;\n\treturn (epoch - (SSFdnthresh + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/SSFbasedate.getTimezoneOffset()) * 60000)) / (24 * 60 * 60 * 1000);\n}\n/* ECMA-376 18.8.30 numFmt*/\n/* Note: `toPrecision` uses standard form when prec > E and E >= -6 */\n/* exponent >= -9 and <= 9 */\nfunction SSF_strip_decimal(o/*:string*/)/*:string*/ {\n\treturn (o.indexOf(\".\") == -1) ? o : o.replace(/(?:\\.0*|(\\.\\d*[1-9])0+)$/, \"$1\");\n}\n\n/* General Exponential always shows 2 digits exp and trims the mantissa */\nfunction SSF_normalize_exp(o/*:string*/)/*:string*/ {\n\tif(o.indexOf(\"E\") == -1) return o;\n\treturn o.replace(/(?:\\.0*|(\\.\\d*[1-9])0+)[Ee]/,\"$1E\").replace(/(E[+-])(\\d)$/,\"$10$2\");\n}\n\n/* exponent >= -9 and <= 9 */\nfunction SSF_small_exp(v/*:number*/)/*:string*/ {\n\tvar w = (v<0?12:11);\n\tvar o = SSF_strip_decimal(v.toFixed(12)); if(o.length <= w) return o;\n\to = v.toPrecision(10); if(o.length <= w) return o;\n\treturn v.toExponential(5);\n}\n\n/* exponent >= 11 or <= -10 likely exponential */\nfunction SSF_large_exp(v/*:number*/)/*:string*/ {\n\tvar o = SSF_strip_decimal(v.toFixed(11));\n\treturn (o.length > (v<0?12:11) || o === \"0\" || o === \"-0\") ? v.toPrecision(6) : o;\n}\n\nfunction SSF_general_num(v/*:number*/)/*:string*/ {\n\tvar V = Math.floor(Math.log(Math.abs(v))*Math.LOG10E), o;\n\n\tif(V >= -4 && V <= -1) o = v.toPrecision(10+V);\n\telse if(Math.abs(V) <= 9) o = SSF_small_exp(v);\n\telse if(V === 10) o = v.toFixed(10).substr(0,12);\n\telse o = SSF_large_exp(v);\n\n\treturn SSF_strip_decimal(SSF_normalize_exp(o.toUpperCase()));\n}\n\n\n/*\n\t\"General\" rules:\n\t- text is passed through (\"@\")\n\t- booleans are rendered as TRUE/FALSE\n\t- \"up to 11 characters\" displayed for numbers\n\t- Default date format (code 14) used for Dates\n\n\tThe longest 32-bit integer text is \"-2147483648\", exactly 11 chars\n\tTODO: technically the display depends on the width of the cell\n*/\nfunction SSF_general(v/*:any*/, opts/*:any*/) {\n\tswitch(typeof v) {\n\t\tcase 'string': return v;\n\t\tcase 'boolean': return v ? \"TRUE\" : \"FALSE\";\n\t\tcase 'number': return (v|0) === v ? v.toString(10) : SSF_general_num(v);\n\t\tcase 'undefined': return \"\";\n\t\tcase 'object':\n\t\t\tif(v == null) return \"\";\n\t\t\tif(v instanceof Date) return SSF_format(14, datenum_local(v, opts && opts.date1904), opts);\n\t}\n\tthrow new Error(\"unsupported value in General format: \" + v);\n}\n\nfunction SSF_fix_hijri(date/*:Date*/, o/*:[number, number, number]*/) {\n /* TODO: properly adjust y/m/d and */\n o[0] -= 581;\n var dow = date.getDay();\n if(date < 60) dow = (dow + 6) % 7;\n return dow;\n}\n//var THAI_DIGITS = \"\\u0E50\\u0E51\\u0E52\\u0E53\\u0E54\\u0E55\\u0E56\\u0E57\\u0E58\\u0E59\".split(\"\");\nfunction SSF_write_date(type/*:number*/, fmt/*:string*/, val, ss0/*:?number*/)/*:string*/ {\n\tvar o=\"\", ss=0, tt=0, y = val.y, out, outl = 0;\n\tswitch(type) {\n\t\tcase 98: /* 'b' buddhist year */\n\t\t\ty = val.y + 543;\n\t\t\t/* falls through */\n\t\tcase 121: /* 'y' year */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = y % 100; outl = 2; break;\n\t\t\tdefault: out = y % 10000; outl = 4; break;\n\t\t} break;\n\t\tcase 109: /* 'm' month */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.m; outl = fmt.length; break;\n\t\t\tcase 3: return months[val.m-1][1];\n\t\t\tcase 5: return months[val.m-1][0];\n\t\t\tdefault: return months[val.m-1][2];\n\t\t} break;\n\t\tcase 100: /* 'd' day */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.d; outl = fmt.length; break;\n\t\t\tcase 3: return days[val.q][0];\n\t\t\tdefault: return days[val.q][1];\n\t\t} break;\n\t\tcase 104: /* 'h' 12-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = 1+(val.H+11)%12; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 72: /* 'H' 24-hour */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.H; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad hour format: ' + fmt;\n\t\t} break;\n\t\tcase 77: /* 'M' minutes */\n\t\tswitch(fmt.length) {\n\t\t\tcase 1: case 2: out = val.M; outl = fmt.length; break;\n\t\t\tdefault: throw 'bad minute format: ' + fmt;\n\t\t} break;\n\t\tcase 115: /* 's' seconds */\n\t\t\tif(fmt != 's' && fmt != 'ss' && fmt != '.0' && fmt != '.00' && fmt != '.000') throw 'bad second format: ' + fmt;\n\t\t\tif(val.u === 0 && (fmt == \"s\" || fmt == \"ss\")) return pad0(val.S, fmt.length);\n\t\t\t/*::if(!ss0) ss0 = 0; */\n\t\t\tif(ss0 >= 2) tt = ss0 === 3 ? 1000 : 100;\n\t\t\telse tt = ss0 === 1 ? 10 : 1;\n\t\t\tss = Math.round((tt)*(val.S + val.u));\n\t\t\tif(ss >= 60*tt) ss = 0;\n\t\t\tif(fmt === 's') return ss === 0 ? \"0\" : \"\"+ss/tt;\n\t\t\to = pad0(ss,2 + ss0);\n\t\t\tif(fmt === 'ss') return o.substr(0,2);\n\t\t\treturn \".\" + o.substr(2,fmt.length-1);\n\t\tcase 90: /* 'Z' absolute time */\n\t\tswitch(fmt) {\n\t\t\tcase '[h]': case '[hh]': out = val.D*24+val.H; break;\n\t\t\tcase '[m]': case '[mm]': out = (val.D*24+val.H)*60+val.M; break;\n\t\t\tcase '[s]': case '[ss]': out = ((val.D*24+val.H)*60+val.M)*60+Math.round(val.S+val.u); break;\n\t\t\tdefault: throw 'bad abstime format: ' + fmt;\n\t\t} outl = fmt.length === 3 ? 1 : 2; break;\n\t\tcase 101: /* 'e' era */\n\t\t\tout = y; outl = 1; break;\n\t}\n\tvar outstr = outl > 0 ? pad0(out, outl) : \"\";\n\treturn outstr;\n}\n\n\n/*jshint -W086 */\n/*jshint +W086 */\nfunction commaify(s/*:string*/)/*:string*/ {\n\tvar w = 3;\n\tif(s.length <= w) return s;\n\tvar j = (s.length % w), o = s.substr(0,j);\n\tfor(; j!=s.length; j+=w) o+=(o.length > 0 ? \",\" : \"\") + s.substr(j,w);\n\treturn o;\n}\nvar pct1 = /%/g;\nfunction write_num_pct(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{\n\tvar sfmt = fmt.replace(pct1,\"\"), mul = fmt.length - sfmt.length;\n\treturn write_num(type, sfmt, val * Math.pow(10,2*mul)) + fill(\"%\",mul);\n}\n\nfunction write_num_cm(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/{\n\tvar idx = fmt.length - 1;\n\twhile(fmt.charCodeAt(idx-1) === 44) --idx;\n\treturn write_num(type, fmt.substr(0,idx), val / Math.pow(10,3*(fmt.length-idx)));\n}\n\nfunction write_num_exp(fmt/*:string*/, val/*:number*/)/*:string*/{\n\tvar o/*:string*/;\n\tvar idx = fmt.indexOf(\"E\") - fmt.indexOf(\".\") - 1;\n\tif(fmt.match(/^#+0.0E\\+0$/)) {\n\t\tif(val == 0) return \"0.0E+0\";\n\t\telse if(val < 0) return \"-\" + write_num_exp(fmt, -val);\n\t\tvar period = fmt.indexOf(\".\"); if(period === -1) period=fmt.indexOf('E');\n\t\tvar ee = Math.floor(Math.log(val)*Math.LOG10E)%period;\n\t\tif(ee < 0) ee += period;\n\t\to = (val/Math.pow(10,ee)).toPrecision(idx+1+(period+ee)%period);\n\t\tif(o.indexOf(\"e\") === -1) {\n\t\t\tvar fakee = Math.floor(Math.log(val)*Math.LOG10E);\n\t\t\tif(o.indexOf(\".\") === -1) o = o.charAt(0) + \".\" + o.substr(1) + \"E+\" + (fakee - o.length+ee);\n\t\t\telse o += \"E+\" + (fakee - ee);\n\t\t\twhile(o.substr(0,2) === \"0.\") {\n\t\t\t\to = o.charAt(0) + o.substr(2,period) + \".\" + o.substr(2+period);\n\t\t\t\to = o.replace(/^0+([1-9])/,\"$1\").replace(/^0+\\./,\"0.\");\n\t\t\t}\n\t\t\to = o.replace(/\\+-/,\"-\");\n\t\t}\n\t\to = o.replace(/^([+-]?)(\\d*)\\.(\\d*)[Ee]/,function($$,$1,$2,$3) { return $1 + $2 + $3.substr(0,(period+ee)%period) + \".\" + $3.substr(ee) + \"E\"; });\n\t} else o = val.toExponential(idx);\n\tif(fmt.match(/E\\+00$/) && o.match(/e[+-]\\d$/)) o = o.substr(0,o.length-1) + \"0\" + o.charAt(o.length-1);\n\tif(fmt.match(/E\\-/) && o.match(/e\\+/)) o = o.replace(/e\\+/,\"e\");\n\treturn o.replace(\"e\",\"E\");\n}\nvar frac1 = /# (\\?+)( ?)\\/( ?)(\\d+)/;\nfunction write_num_f1(r/*:Array*/, aval/*:number*/, sign/*:string*/)/*:string*/ {\n\tvar den = parseInt(r[4],10), rr = Math.round(aval * den), base = Math.floor(rr/den);\n\tvar myn = (rr - base*den), myd = den;\n\treturn sign + (base === 0 ? \"\" : \"\"+base) + \" \" + (myn === 0 ? fill(\" \", r[1].length + 1 + r[4].length) : pad_(myn,r[1].length) + r[2] + \"/\" + r[3] + pad0(myd,r[4].length));\n}\nfunction write_num_f2(r/*:Array*/, aval/*:number*/, sign/*:string*/)/*:string*/ {\n\treturn sign + (aval === 0 ? \"\" : \"\"+aval) + fill(\" \", r[1].length + 2 + r[4].length);\n}\nvar dec1 = /^#*0*\\.([0#]+)/;\nvar closeparen = /\\).*[0#]/;\nvar phone = /\\(###\\) ###\\\\?-####/;\nfunction hashq(str/*:string*/)/*:string*/ {\n\tvar o = \"\", cc;\n\tfor(var i = 0; i != str.length; ++i) switch((cc=str.charCodeAt(i))) {\n\t\tcase 35: break;\n\t\tcase 63: o+= \" \"; break;\n\t\tcase 48: o+= \"0\"; break;\n\t\tdefault: o+= String.fromCharCode(cc);\n\t}\n\treturn o;\n}\nfunction rnd(val/*:number*/, d/*:number*/)/*:string*/ { var dd = Math.pow(10,d); return \"\"+(Math.round(val * dd)/dd); }\nfunction dec(val/*:number*/, d/*:number*/)/*:number*/ {\n\tvar _frac = val - Math.floor(val), dd = Math.pow(10,d);\n\tif (d < ('' + Math.round(_frac * dd)).length) return 0;\n\treturn Math.round(_frac * dd);\n}\nfunction carry(val/*:number*/, d/*:number*/)/*:number*/ {\n\tif (d < ('' + Math.round((val-Math.floor(val))*Math.pow(10,d))).length) {\n\t\treturn 1;\n\t}\n\treturn 0;\n}\nfunction flr(val/*:number*/)/*:string*/ {\n\tif(val < 2147483647 && val > -2147483648) return \"\"+(val >= 0 ? (val|0) : (val-1|0));\n\treturn \"\"+Math.floor(val);\n}\nfunction write_num_flt(type/*:string*/, fmt/*:string*/, val/*:number*/)/*:string*/ {\n\tif(type.charCodeAt(0) === 40 && !fmt.match(closeparen)) {\n\t\tvar ffmt = fmt.replace(/\\( */,\"\").replace(/ \\)/,\"\").replace(/\\)/,\"\");\n\t\tif(val >= 0) return write_num_flt('n', ffmt, val);\n\t\treturn '(' + write_num_flt('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_flt(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r/*:?Array*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0r(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = pad0r(val,0); if(o === \"0\") o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f1(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0r(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\n\t\to = rnd(val, r[1].length).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1])).replace(/\\.(\\d*)$/,function($$, $1) { return \".\" + $1 + fill(\"0\", hashq(/*::(*/r/*::||[\"\"])*/[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + rnd(aval, r[2].length).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify(pad0r(aval,0));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_flt(type, fmt, -val) : commaify(\"\"+(Math.floor(val) + carry(val, r[1].length))) + \".\" + pad0(dec(val, r[1].length),r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_flt(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_flt(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri= 0) return write_num_int('n', ffmt, val);\n\t\treturn '(' + write_num_int('n', ffmt, -val) + ')';\n\t}\n\tif(fmt.charCodeAt(fmt.length - 1) === 44) return write_num_cm2(type, fmt, val);\n\tif(fmt.indexOf('%') !== -1) return write_num_pct2(type, fmt, val);\n\tif(fmt.indexOf('E') !== -1) return write_num_exp2(fmt, val);\n\tif(fmt.charCodeAt(0) === 36) return \"$\"+write_num_int(type,fmt.substr(fmt.charAt(1)==' '?2:1),val);\n\tvar o;\n\tvar r/*:?Array*/, ri, ff, aval = Math.abs(val), sign = val < 0 ? \"-\" : \"\";\n\tif(fmt.match(/^00+$/)) return sign + pad0(aval,fmt.length);\n\tif(fmt.match(/^[#?]+$/)) {\n\t\to = (\"\"+val); if(val === 0) o = \"\";\n\t\treturn o.length > fmt.length ? o : hashq(fmt.substr(0,fmt.length-o.length)) + o;\n\t}\n\tif((r = fmt.match(frac1))) return write_num_f2(r, aval, sign);\n\tif(fmt.match(/^#+0+$/)) return sign + pad0(aval,fmt.length - fmt.indexOf(\"0\"));\n\tif((r = fmt.match(dec1))) {\n\t\t/*:: if(!Array.isArray(r)) throw new Error(\"unreachable\"); */\n\t\to = (\"\"+val).replace(/^([^\\.]+)$/,\"$1.\"+hashq(r[1])).replace(/\\.$/,\".\"+hashq(r[1]));\n\t\to = o.replace(/\\.(\\d*)$/,function($$, $1) {\n\t\t/*:: if(!Array.isArray(r)) throw new Error(\"unreachable\"); */\n\t\t\treturn \".\" + $1 + fill(\"0\", hashq(r[1]).length-$1.length); });\n\t\treturn fmt.indexOf(\"0.\") !== -1 ? o : o.replace(/^0\\./,\".\");\n\t}\n\tfmt = fmt.replace(/^#+([0.])/, \"$1\");\n\tif((r = fmt.match(/^(0*)\\.(#*)$/))) {\n\t\treturn sign + (\"\"+aval).replace(/\\.(\\d*[1-9])0*$/,\".$1\").replace(/^(-?\\d*)$/,\"$1.\").replace(/^0\\./,r[1].length?\"0.\":\".\");\n\t}\n\tif((r = fmt.match(/^#{1,3},##0(\\.?)$/))) return sign + commaify((\"\"+aval));\n\tif((r = fmt.match(/^#,##0\\.([#0]*0)$/))) {\n\t\treturn val < 0 ? \"-\" + write_num_int(type, fmt, -val) : commaify((\"\"+val)) + \".\" + fill('0',r[1].length);\n\t}\n\tif((r = fmt.match(/^#,#*,#0/))) return write_num_int(type,fmt.replace(/^#,#*,/,\"\"),val);\n\tif((r = fmt.match(/^([0#]+)(\\\\?-([0#]+))+$/))) {\n\t\to = _strrev(write_num_int(type, fmt.replace(/[\\\\-]/g,\"\"), val));\n\t\tri = 0;\n\t\treturn _strrev(_strrev(fmt.replace(/\\\\/g,\"\")).replace(/[0#]/g,function(x){return ri*/ {\n\tvar out/*:Array*/ = [];\n\tvar in_str = false/*, cc*/;\n\tfor(var i = 0, j = 0; i < fmt.length; ++i) switch((/*cc=*/fmt.charCodeAt(i))) {\n\t\tcase 34: /* '\"' */\n\t\t\tin_str = !in_str; break;\n\t\tcase 95: case 42: case 92: /* '_' '*' '\\\\' */\n\t\t\t++i; break;\n\t\tcase 59: /* ';' */\n\t\t\tout[out.length] = fmt.substr(j,i-j);\n\t\t\tj = i+1;\n\t}\n\tout[out.length] = fmt.substr(j);\n\tif(in_str === true) throw new Error(\"Format |\" + fmt + \"| unterminated string \");\n\treturn out;\n}\n\nvar SSF_abstime = /\\[[HhMmSs\\u0E0A\\u0E19\\u0E17]*\\]/;\nfunction fmt_is_date(fmt/*:string*/)/*:boolean*/ {\n\tvar i = 0, /*cc = 0,*/ c = \"\", o = \"\";\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt.charAt(i))) {\n\t\t\tcase 'G': if(SSF_isgeneral(fmt, i)) i+= 6; i++; break;\n\t\t\tcase '\"': for(;(/*cc=*/fmt.charCodeAt(++i)) !== 34 && i < fmt.length;){/*empty*/} ++i; break;\n\t\t\tcase '\\\\': i+=2; break;\n\t\t\tcase '_': i+=2; break;\n\t\t\tcase '@': ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt.charAt(i+1) === \"1\" || fmt.charAt(i+1) === \"2\") return true;\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g': return true;\n\t\t\tcase 'A': case 'a': case '上':\n\t\t\t\tif(fmt.substr(i, 3).toUpperCase() === \"A/P\") return true;\n\t\t\t\tif(fmt.substr(i, 5).toUpperCase() === \"AM/PM\") return true;\n\t\t\t\tif(fmt.substr(i, 5).toUpperCase() === \"上午/下午\") return true;\n\t\t\t\t++i; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\n\t\t\t\tif(o.match(SSF_abstime)) return true;\n\t\t\t\tbreak;\n\t\t\tcase '.':\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\twhile(i < fmt.length && (\"0#?.,E+-%\".indexOf(c=fmt.charAt(++i)) > -1 || (c=='\\\\' && fmt.charAt(i+1) == \"-\" && \"0#\".indexOf(fmt.charAt(i+2))>-1))){/* empty */}\n\t\t\t\tbreak;\n\t\t\tcase '?': while(fmt.charAt(++i) === c){/* empty */} break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break;\n\t\t\tcase '(': case ')': ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\twhile(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1){/* empty */} break;\n\t\t\tcase ' ': ++i; break;\n\t\t\tdefault: ++i; break;\n\t\t}\n\t}\n\treturn false;\n}\n\nfunction eval_fmt(fmt/*:string*/, v/*:any*/, opts/*:any*/, flen/*:number*/) {\n\tvar out = [], o = \"\", i = 0, c = \"\", lst='t', dt, j, cc;\n\tvar hr='H';\n\t/* Tokenize */\n\twhile(i < fmt.length) {\n\t\tswitch((c = fmt.charAt(i))) {\n\t\t\tcase 'G': /* General */\n\t\t\t\tif(!SSF_isgeneral(fmt, i)) throw new Error('unrecognized character ' + c + ' in ' +fmt);\n\t\t\t\tout[out.length] = {t:'G', v:'General'}; i+=7; break;\n\t\t\tcase '\"': /* Literal text */\n\t\t\t\tfor(o=\"\";(cc=fmt.charCodeAt(++i)) !== 34 && i < fmt.length;) o += String.fromCharCode(cc);\n\t\t\t\tout[out.length] = {t:'t', v:o}; ++i; break;\n\t\t\tcase '\\\\': var w = fmt.charAt(++i), t = (w === \"(\" || w === \")\") ? w : 't';\n\t\t\t\tout[out.length] = {t:t, v:w}; ++i; break;\n\t\t\tcase '_': out[out.length] = {t:'t', v:\" \"}; i+=2; break;\n\t\t\tcase '@': /* Text Placeholder */\n\t\t\t\tout[out.length] = {t:'T', v:v}; ++i; break;\n\t\t\tcase 'B': case 'b':\n\t\t\t\tif(fmt.charAt(i+1) === \"1\" || fmt.charAt(i+1) === \"2\") {\n\t\t\t\t\tif(dt==null) { dt=SSF_parse_date_code(v, opts, fmt.charAt(i+1) === \"2\"); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'X', v:fmt.substr(i,2)}; lst = c; i+=2; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase 'M': case 'D': case 'Y': case 'H': case 'S': case 'E':\n\t\t\t\tc = c.toLowerCase();\n\t\t\t\t/* falls through */\n\t\t\tcase 'm': case 'd': case 'y': case 'h': case 's': case 'e': case 'g':\n\t\t\t\tif(v < 0) return \"\";\n\t\t\t\tif(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\to = c; while(++i < fmt.length && fmt.charAt(i).toLowerCase() === c) o+=c;\n\t\t\t\tif(c === 'm' && lst.toLowerCase() === 'h') c = 'M';\n\t\t\t\tif(c === 'h') c = hr;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase 'A': case 'a': case '上':\n\t\t\t\tvar q={t:c, v:c};\n\t\t\t\tif(dt==null) dt=SSF_parse_date_code(v, opts);\n\t\t\t\tif(fmt.substr(i, 3).toUpperCase() === \"A/P\") { if(dt!=null) q.v = dt.H >= 12 ? \"P\" : \"A\"; q.t = 'T'; hr='h';i+=3;}\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"AM/PM\") { if(dt!=null) q.v = dt.H >= 12 ? \"PM\" : \"AM\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse if(fmt.substr(i,5).toUpperCase() === \"上午/下午\") { if(dt!=null) q.v = dt.H >= 12 ? \"下午\" : \"上午\"; q.t = 'T'; i+=5; hr='h'; }\n\t\t\t\telse { q.t = \"t\"; ++i; }\n\t\t\t\tif(dt==null && q.t === 'T') return \"\";\n\t\t\t\tout[out.length] = q; lst = c; break;\n\t\t\tcase '[':\n\t\t\t\to = c;\n\t\t\t\twhile(fmt.charAt(i++) !== ']' && i < fmt.length) o += fmt.charAt(i);\n\t\t\t\tif(o.slice(-1) !== ']') throw 'unterminated \"[\" block: |' + o + '|';\n\t\t\t\tif(o.match(SSF_abstime)) {\n\t\t\t\t\tif(dt==null) { dt=SSF_parse_date_code(v, opts); if(dt==null) return \"\"; }\n\t\t\t\t\tout[out.length] = {t:'Z', v:o.toLowerCase()};\n\t\t\t\t\tlst = o.charAt(1);\n\t\t\t\t} else if(o.indexOf(\"$\") > -1) {\n\t\t\t\t\to = (o.match(/\\$([^-\\[\\]]*)/)||[])[1]||\"$\";\n\t\t\t\t\tif(!fmt_is_date(fmt)) out[out.length] = {t:'t',v:o};\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t/* Numbers */\n\t\t\tcase '.':\n\t\t\t\tif(dt != null) {\n\t\t\t\t\to = c; while(++i < fmt.length && (c=fmt.charAt(i)) === \"0\") o += c;\n\t\t\t\t\tout[out.length] = {t:'s', v:o}; break;\n\t\t\t\t}\n\t\t\t\t/* falls through */\n\t\t\tcase '0': case '#':\n\t\t\t\to = c; while(++i < fmt.length && \"0#?.,E+-%\".indexOf(c=fmt.charAt(i)) > -1) o += c;\n\t\t\t\tout[out.length] = {t:'n', v:o}; break;\n\t\t\tcase '?':\n\t\t\t\to = c; while(fmt.charAt(++i) === c) o+=c;\n\t\t\t\tout[out.length] = {t:c, v:o}; lst = c; break;\n\t\t\tcase '*': ++i; if(fmt.charAt(i) == ' ' || fmt.charAt(i) == '*') ++i; break; // **\n\t\t\tcase '(': case ')': out[out.length] = {t:(flen===1?'t':c), v:c}; ++i; break;\n\t\t\tcase '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':\n\t\t\t\to = c; while(i < fmt.length && \"0123456789\".indexOf(fmt.charAt(++i)) > -1) o+=fmt.charAt(i);\n\t\t\t\tout[out.length] = {t:'D', v:o}; break;\n\t\t\tcase ' ': out[out.length] = {t:c, v:c}; ++i; break;\n\t\t\tcase '$': out[out.length] = {t:'t', v:'$'}; ++i; break;\n\t\t\tdefault:\n\t\t\t\tif(\",$-+/():!^&'~{}<>=€acfijklopqrtuvwxzP\".indexOf(c) === -1) throw new Error('unrecognized character ' + c + ' in ' + fmt);\n\t\t\t\tout[out.length] = {t:'t', v:c}; ++i; break;\n\t\t}\n\t}\n\n\t/* Scan for date/time parts */\n\tvar bt = 0, ss0 = 0, ssm;\n\tfor(i=out.length-1, lst='t'; i >= 0; --i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 'h': case 'H': out[i].t = hr; lst='h'; if(bt < 1) bt = 1; break;\n\t\t\tcase 's':\n\t\t\t\tif((ssm=out[i].v.match(/\\.0+$/))) ss0=Math.max(ss0,ssm[0].length-1);\n\t\t\t\tif(bt < 3) bt = 3;\n\t\t\t/* falls through */\n\t\t\tcase 'd': case 'y': case 'M': case 'e': lst=out[i].t; break;\n\t\t\tcase 'm': if(lst === 's') { out[i].t = 'M'; if(bt < 2) bt = 2; } break;\n\t\t\tcase 'X': /*if(out[i].v === \"B2\");*/\n\t\t\t\tbreak;\n\t\t\tcase 'Z':\n\t\t\t\tif(bt < 1 && out[i].v.match(/[Hh]/)) bt = 1;\n\t\t\t\tif(bt < 2 && out[i].v.match(/[Mm]/)) bt = 2;\n\t\t\t\tif(bt < 3 && out[i].v.match(/[Ss]/)) bt = 3;\n\t\t}\n\t}\n\t/* time rounding depends on presence of minute / second / usec fields */\n\tswitch(bt) {\n\t\tcase 0: break;\n\t\tcase 1:\n\t\t\t/*::if(!dt) break;*/\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tif(dt.M >= 60) { dt.M = 0; ++dt.H; }\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t/*::if(!dt) break;*/\n\t\t\tif(dt.u >= 0.5) { dt.u = 0; ++dt.S; }\n\t\t\tif(dt.S >= 60) { dt.S = 0; ++dt.M; }\n\t\t\tbreak;\n\t}\n\n\t/* replace fields */\n\tvar nstr = \"\", jj;\n\tfor(i=0; i < out.length; ++i) {\n\t\tswitch(out[i].t) {\n\t\t\tcase 't': case 'T': case ' ': case 'D': break;\n\t\t\tcase 'X': out[i].v = \"\"; out[i].t = \";\"; break;\n\t\t\tcase 'd': case 'm': case 'y': case 'h': case 'H': case 'M': case 's': case 'e': case 'b': case 'Z':\n\t\t\t\t/*::if(!dt) throw \"unreachable\"; */\n\t\t\t\tout[i].v = SSF_write_date(out[i].t.charCodeAt(0), out[i].v, dt, ss0);\n\t\t\t\tout[i].t = 't'; break;\n\t\t\tcase 'n': case '?':\n\t\t\t\tjj = i+1;\n\t\t\t\twhile(out[jj] != null && (\n\t\t\t\t\t(c=out[jj].t) === \"?\" || c === \"D\" ||\n\t\t\t\t\t((c === \" \" || c === \"t\") && out[jj+1] != null && (out[jj+1].t === '?' || out[jj+1].t === \"t\" && out[jj+1].v === '/')) ||\n\t\t\t\t\t(out[i].t === '(' && (c === ' ' || c === 'n' || c === ')')) ||\n\t\t\t\t\t(c === 't' && (out[jj].v === '/' || out[jj].v === ' ' && out[jj+1] != null && out[jj+1].t == '?'))\n\t\t\t\t)) {\n\t\t\t\t\tout[i].v += out[jj].v;\n\t\t\t\t\tout[jj] = {v:\"\", t:\";\"}; ++jj;\n\t\t\t\t}\n\t\t\t\tnstr += out[i].v;\n\t\t\t\ti = jj-1; break;\n\t\t\tcase 'G': out[i].t = 't'; out[i].v = SSF_general(v,opts); break;\n\t\t}\n\t}\n\tvar vv = \"\", myv, ostr;\n\tif(nstr.length > 0) {\n\t\tif(nstr.charCodeAt(0) == 40) /* '(' */ {\n\t\t\tmyv = (v<0&&nstr.charCodeAt(0) === 45 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t} else {\n\t\t\tmyv = (v<0 && flen > 1 ? -v : v);\n\t\t\tostr = write_num('n', nstr, myv);\n\t\t\tif(myv < 0 && out[0] && out[0].t == 't') {\n\t\t\t\tostr = ostr.substr(1);\n\t\t\t\tout[0].v = \"-\" + out[0].v;\n\t\t\t}\n\t\t}\n\t\tjj=ostr.length-1;\n\t\tvar decpt = out.length;\n\t\tfor(i=0; i < out.length; ++i) if(out[i] != null && out[i].t != 't' && out[i].v.indexOf(\".\") > -1) { decpt = i; break; }\n\t\tvar lasti=out.length;\n\t\tif(decpt === out.length && ostr.indexOf(\"E\") === -1) {\n\t\t\tfor(i=out.length-1; i>= 0;--i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tif(jj>=out[i].v.length-1) { jj -= out[i].v.length; out[i].v = ostr.substr(jj+1, out[i].v.length); }\n\t\t\t\telse if(jj < 0) out[i].v = \"\";\n\t\t\t\telse { out[i].v = ostr.substr(0, jj+1); jj = -1; }\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti= 0; --i) {\n\t\t\t\tif(out[i] == null || 'n?'.indexOf(out[i].t) === -1) continue;\n\t\t\t\tj=out[i].v.indexOf(\".\")>-1&&i===decpt?out[i].v.indexOf(\".\")-1:out[i].v.length-1;\n\t\t\t\tvv = out[i].v.substr(j+1);\n\t\t\t\tfor(; j>=0; --j) {\n\t\t\t\t\tif(jj>=0 && (out[i].v.charAt(j) === \"0\" || out[i].v.charAt(j) === \"#\")) vv = ostr.charAt(jj--) + vv;\n\t\t\t\t}\n\t\t\t\tout[i].v = vv;\n\t\t\t\tout[i].t = 't';\n\t\t\t\tlasti = i;\n\t\t\t}\n\t\t\tif(jj>=0 && lasti-1&&i===decpt?out[i].v.indexOf(\".\")+1:0;\n\t\t\t\tvv = out[i].v.substr(0,j);\n\t\t\t\tfor(; j-1) {\n\t\tmyv = (flen >1 && v < 0 && i>0 && out[i-1].v === \"-\" ? -v:v);\n\t\tout[i].v = write_num(out[i].t, out[i].v, myv);\n\t\tout[i].t = 't';\n\t}\n\tvar retval = \"\";\n\tfor(i=0; i !== out.length; ++i) if(out[i] != null) retval += out[i].v;\n\treturn retval;\n}\n\nvar cfregex2 = /\\[(=|>[=]?|<[>=]?)(-?\\d+(?:\\.\\d*)?)\\]/;\nfunction chkcond(v, rr) {\n\tif(rr == null) return false;\n\tvar thresh = parseFloat(rr[2]);\n\tswitch(rr[1]) {\n\t\tcase \"=\": if(v == thresh) return true; break;\n\t\tcase \">\": if(v > thresh) return true; break;\n\t\tcase \"<\": if(v < thresh) return true; break;\n\t\tcase \"<>\": if(v != thresh) return true; break;\n\t\tcase \">=\": if(v >= thresh) return true; break;\n\t\tcase \"<=\": if(v <= thresh) return true; break;\n\t}\n\treturn false;\n}\nfunction choose_fmt(f/*:string*/, v/*:any*/) {\n\tvar fmt = SSF_split_fmt(f);\n\tvar l = fmt.length, lat = fmt[l-1].indexOf(\"@\");\n\tif(l<4 && lat>-1) --l;\n\tif(fmt.length > 4) throw new Error(\"cannot find right format for |\" + fmt.join(\"|\") + \"|\");\n\tif(typeof v !== \"number\") return [4, fmt.length === 4 || lat>-1?fmt[fmt.length-1]:\"@\"];\n\tswitch(fmt.length) {\n\t\tcase 1: fmt = lat>-1 ? [\"General\", \"General\", \"General\", fmt[0]] : [fmt[0], fmt[0], fmt[0], \"@\"]; break;\n\t\tcase 2: fmt = lat>-1 ? [fmt[0], fmt[0], fmt[0], fmt[1]] : [fmt[0], fmt[1], fmt[0], \"@\"]; break;\n\t\tcase 3: fmt = lat>-1 ? [fmt[0], fmt[1], fmt[0], fmt[2]] : [fmt[0], fmt[1], fmt[2], \"@\"]; break;\n\t\tcase 4: break;\n\t}\n\tvar ff = v > 0 ? fmt[0] : v < 0 ? fmt[1] : fmt[2];\n\tif(fmt[0].indexOf(\"[\") === -1 && fmt[1].indexOf(\"[\") === -1) return [l, ff];\n\tif(fmt[0].match(/\\[[=<>]/) != null || fmt[1].match(/\\[[=<>]/) != null) {\n\t\tvar m1 = fmt[0].match(cfregex2);\n\t\tvar m2 = fmt[1].match(cfregex2);\n\t\treturn chkcond(v, m1) ? [l, fmt[0]] : chkcond(v, m2) ? [l, fmt[1]] : [l, fmt[m1 != null && m2 != null ? 2 : 1]];\n\t}\n\treturn [l, ff];\n}\nfunction SSF_format(fmt/*:string|number*/,v/*:any*/,o/*:?any*/) {\n\tif(o == null) o = {};\n\tvar sfmt = \"\";\n\tswitch(typeof fmt) {\n\t\tcase \"string\":\n\t\t\tif(fmt == \"m/d/yy\" && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = fmt;\n\t\t\tbreak;\n\t\tcase \"number\":\n\t\t\tif(fmt == 14 && o.dateNF) sfmt = o.dateNF;\n\t\t\telse sfmt = (o.table != null ? (o.table/*:any*/) : table_fmt)[fmt];\n\t\t\tif(sfmt == null) sfmt = (o.table && o.table[SSF_default_map[fmt]]) || table_fmt[SSF_default_map[fmt]];\n\t\t\tif(sfmt == null) sfmt = SSF_default_str[fmt] || \"General\";\n\t\t\tbreak;\n\t}\n\tif(SSF_isgeneral(sfmt,0)) return SSF_general(v, o);\n\tif(v instanceof Date) v = datenum_local(v, o.date1904);\n\tvar f = choose_fmt(sfmt, v);\n\tif(SSF_isgeneral(f[1])) return SSF_general(v, o);\n\tif(v === true) v = \"TRUE\"; else if(v === false) v = \"FALSE\";\n\telse if(v === \"\" || v == null) return \"\";\n\treturn eval_fmt(f[1], v, o, f[0]);\n}\nfunction SSF_load(fmt/*:string*/, idx/*:?number*/)/*:number*/ {\n\tif(typeof idx != 'number') {\n\t\tidx = +idx || -1;\n/*::if(typeof idx != 'number') return 0x188; */\n\t\tfor(var i = 0; i < 0x0188; ++i) {\n/*::if(typeof idx != 'number') return 0x188; */\n\t\t\tif(table_fmt[i] == undefined) { if(idx < 0) idx = i; continue; }\n\t\t\tif(table_fmt[i] == fmt) { idx = i; break; }\n\t\t}\n/*::if(typeof idx != 'number') return 0x188; */\n\t\tif(idx < 0) idx = 0x187;\n\t}\n/*::if(typeof idx != 'number') return 0x188; */\n\ttable_fmt[idx] = fmt;\n\treturn idx;\n}\nfunction SSF_load_table(tbl/*:SSFTable*/)/*:void*/ {\n\tfor(var i=0; i!=0x0188; ++i)\n\t\tif(tbl[i] !== undefined) SSF_load(tbl[i], i);\n}\n\nfunction make_ssf() {\n\ttable_fmt = SSF_init_table();\n}\n\nvar SSF = {\n\tformat: SSF_format,\n\tload: SSF_load,\n\t_table: table_fmt,\n\tload_table: SSF_load_table,\n\tparse_date_code: SSF_parse_date_code,\n\tis_date: fmt_is_date,\n\tget_table: function get_table() { return SSF._table = table_fmt; }\n};\n\nvar SSFImplicit/*{[number]:string}*/ = ({\n\t\"5\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"6\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"7\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"8\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"23\": 'General', \"24\": 'General', \"25\": 'General', \"26\": 'General',\n\t\"27\": 'm/d/yy', \"28\": 'm/d/yy', \"29\": 'm/d/yy', \"30\": 'm/d/yy', \"31\": 'm/d/yy',\n\t\"32\": 'h:mm:ss', \"33\": 'h:mm:ss', \"34\": 'h:mm:ss', \"35\": 'h:mm:ss',\n\t\"36\": 'm/d/yy',\n\t\"41\": '_(* #,##0_);_(* \\(#,##0\\);_(* \"-\"_);_(@_)',\n\t\"42\": '_(\"$\"* #,##0_);_(\"$\"* \\(#,##0\\);_(\"$\"* \"-\"_);_(@_)',\n\t\"43\": '_(* #,##0.00_);_(* \\(#,##0.00\\);_(* \"-\"??_);_(@_)',\n\t\"44\": '_(\"$\"* #,##0.00_);_(\"$\"* \\(#,##0.00\\);_(\"$\"* \"-\"??_);_(@_)',\n\t\"50\": 'm/d/yy', \"51\": 'm/d/yy', \"52\": 'm/d/yy', \"53\": 'm/d/yy', \"54\": 'm/d/yy',\n\t\"55\": 'm/d/yy', \"56\": 'm/d/yy', \"57\": 'm/d/yy', \"58\": 'm/d/yy',\n\t\"59\": '0',\n\t\"60\": '0.00',\n\t\"61\": '#,##0',\n\t\"62\": '#,##0.00',\n\t\"63\": '\"$\"#,##0_);\\\\(\"$\"#,##0\\\\)',\n\t\"64\": '\"$\"#,##0_);[Red]\\\\(\"$\"#,##0\\\\)',\n\t\"65\": '\"$\"#,##0.00_);\\\\(\"$\"#,##0.00\\\\)',\n\t\"66\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\"67\": '0%',\n\t\"68\": '0.00%',\n\t\"69\": '# ?/?',\n\t\"70\": '# ??/??',\n\t\"71\": 'm/d/yy',\n\t\"72\": 'm/d/yy',\n\t\"73\": 'd-mmm-yy',\n\t\"74\": 'd-mmm',\n\t\"75\": 'mmm-yy',\n\t\"76\": 'h:mm',\n\t\"77\": 'h:mm:ss',\n\t\"78\": 'm/d/yy h:mm',\n\t\"79\": 'mm:ss',\n\t\"80\": '[h]:mm:ss',\n\t\"81\": 'mmss.0'\n}/*:any*/);\n\n/* dateNF parse TODO: move to SSF */\nvar dateNFregex = /[dD]+|[mM]+|[yYeE]+|[Hh]+|[Ss]+/g;\nfunction dateNF_regex(dateNF/*:string|number*/)/*:RegExp*/ {\n\tvar fmt = typeof dateNF == \"number\" ? table_fmt[dateNF] : dateNF;\n\tfmt = fmt.replace(dateNFregex, \"(\\\\d+)\");\n\treturn new RegExp(\"^\" + fmt + \"$\");\n}\nfunction dateNF_fix(str/*:string*/, dateNF/*:string*/, match/*:Array*/)/*:string*/ {\n\tvar Y = -1, m = -1, d = -1, H = -1, M = -1, S = -1;\n\t(dateNF.match(dateNFregex)||[]).forEach(function(n, i) {\n\t\tvar v = parseInt(match[i+1], 10);\n\t\tswitch(n.toLowerCase().charAt(0)) {\n\t\t\tcase 'y': Y = v; break; case 'd': d = v; break;\n\t\t\tcase 'h': H = v; break; case 's': S = v; break;\n\t\t\tcase 'm': if(H >= 0) M = v; else m = v; break;\n\t\t}\n\t});\n\tif(S >= 0 && M == -1 && m >= 0) { M = m; m = -1; }\n\tvar datestr = ((\"\" + (Y>=0?Y: new Date().getFullYear())).slice(-4) + \"-\" + (\"00\" + (m>=1?m:1)).slice(-2) + \"-\" + (\"00\" + (d>=1?d:1)).slice(-2));\n\tif(datestr.length == 7) datestr = \"0\" + datestr;\n\tif(datestr.length == 8) datestr = \"20\" + datestr;\n\tvar timestr = ((\"00\" + (H>=0?H:0)).slice(-2) + \":\" + (\"00\" + (M>=0?M:0)).slice(-2) + \":\" + (\"00\" + (S>=0?S:0)).slice(-2));\n\tif(H == -1 && M == -1 && S == -1) return datestr;\n\tif(Y == -1 && m == -1 && d == -1) return timestr;\n\treturn datestr + \"T\" + timestr;\n}\n\n/*::\ndeclare var ReadShift:any;\ndeclare var CheckField:any;\ndeclare var prep_blob:any;\ndeclare var __readUInt32LE:any;\ndeclare var __readInt32LE:any;\ndeclare var __toBuffer:any;\ndeclare var __utf16le:any;\ndeclare var bconcat:any;\ndeclare var s2a:any;\ndeclare var chr0:any;\ndeclare var chr1:any;\ndeclare var has_buf:boolean;\ndeclare var new_buf:any;\ndeclare var new_raw_buf:any;\ndeclare var new_unsafe_buf:any;\ndeclare var Buffer_from:any;\n*/\n/* cfb.js (C) 2013-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*jshint eqnull:true */\n/*exported CFB */\n/*global Uint8Array:false, Uint16Array:false */\n\n/*::\ntype SectorEntry = {\n\tname?:string;\n\tnodes?:Array;\n\tdata:RawBytes;\n};\ntype SectorList = {\n\t[k:string|number]:SectorEntry;\n\tname:?string;\n\tfat_addrs:Array;\n\tssz:number;\n}\ntype CFBFiles = {[n:string]:CFBEntry};\n*/\n/* crc32.js (C) 2014-present SheetJS -- http://sheetjs.com */\n/* vim: set ts=2: */\n/*exported CRC32 */\nvar CRC32 = /*#__PURE__*/(function() {\nvar CRC32 = {};\nCRC32.version = '1.2.0';\n/* see perf/crc32table.js */\n/*global Int32Array */\nfunction signed_crc_table()/*:any*/ {\n\tvar c = 0, table/*:Array*/ = new Array(256);\n\n\tfor(var n =0; n != 256; ++n){\n\t\tc = n;\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\tc = ((c&1) ? (-306674912 ^ (c >>> 1)) : (c >>> 1));\n\t\ttable[n] = c;\n\t}\n\n\treturn typeof Int32Array !== 'undefined' ? new Int32Array(table) : table;\n}\n\nvar T0 = signed_crc_table();\nfunction slice_by_16_tables(T) {\n\tvar c = 0, v = 0, n = 0, table/*:Array*/ = typeof Int32Array !== 'undefined' ? new Int32Array(4096) : new Array(4096) ;\n\n\tfor(n = 0; n != 256; ++n) table[n] = T[n];\n\tfor(n = 0; n != 256; ++n) {\n\t\tv = T[n];\n\t\tfor(c = 256 + n; c < 4096; c += 256) v = table[c] = (v >>> 8) ^ T[v & 0xFF];\n\t}\n\tvar out = [];\n\tfor(n = 1; n != 16; ++n) out[n - 1] = typeof Int32Array !== 'undefined' ? table.subarray(n * 256, n * 256 + 256) : table.slice(n * 256, n * 256 + 256);\n\treturn out;\n}\nvar TT = slice_by_16_tables(T0);\nvar T1 = TT[0], T2 = TT[1], T3 = TT[2], T4 = TT[3], T5 = TT[4];\nvar T6 = TT[5], T7 = TT[6], T8 = TT[7], T9 = TT[8], Ta = TT[9];\nvar Tb = TT[10], Tc = TT[11], Td = TT[12], Te = TT[13], Tf = TT[14];\nfunction crc32_bstr(bstr/*:string*/, seed/*:number*/)/*:number*/ {\n\tvar C = seed/*:: ? 0 : 0 */ ^ -1;\n\tfor(var i = 0, L = bstr.length; i < L;) C = (C>>>8) ^ T0[(C^bstr.charCodeAt(i++))&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_buf(B/*:Uint8Array|Array*/, seed/*:number*/)/*:number*/ {\n\tvar C = seed/*:: ? 0 : 0 */ ^ -1, L = B.length - 15, i = 0;\n\tfor(; i < L;) C =\n\t\tTf[B[i++] ^ (C & 255)] ^\n\t\tTe[B[i++] ^ ((C >> 8) & 255)] ^\n\t\tTd[B[i++] ^ ((C >> 16) & 255)] ^\n\t\tTc[B[i++] ^ (C >>> 24)] ^\n\t\tTb[B[i++]] ^ Ta[B[i++]] ^ T9[B[i++]] ^ T8[B[i++]] ^\n\t\tT7[B[i++]] ^ T6[B[i++]] ^ T5[B[i++]] ^ T4[B[i++]] ^\n\t\tT3[B[i++]] ^ T2[B[i++]] ^ T1[B[i++]] ^ T0[B[i++]];\n\tL += 15;\n\twhile(i < L) C = (C>>>8) ^ T0[(C^B[i++])&0xFF];\n\treturn ~C;\n}\n\nfunction crc32_str(str/*:string*/, seed/*:number*/)/*:number*/ {\n\tvar C = seed ^ -1;\n\tfor(var i = 0, L = str.length, c = 0, d = 0; i < L;) {\n\t\tc = str.charCodeAt(i++);\n\t\tif(c < 0x80) {\n\t\t\tC = (C>>>8) ^ T0[(C^c)&0xFF];\n\t\t} else if(c < 0x800) {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (192|((c>>6)&31)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t} else if(c >= 0xD800 && c < 0xE000) {\n\t\t\tc = (c&1023)+64; d = str.charCodeAt(i++)&1023;\n\t\t\tC = (C>>>8) ^ T0[(C ^ (240|((c>>8)&7)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>2)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((d>>6)&15)|((c&3)<<4)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(d&63)))&0xFF];\n\t\t} else {\n\t\t\tC = (C>>>8) ^ T0[(C ^ (224|((c>>12)&15)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|((c>>6)&63)))&0xFF];\n\t\t\tC = (C>>>8) ^ T0[(C ^ (128|(c&63)))&0xFF];\n\t\t}\n\t}\n\treturn ~C;\n}\nCRC32.table = T0;\nCRC32.bstr = crc32_bstr;\nCRC32.buf = crc32_buf;\nCRC32.str = crc32_str;\nreturn CRC32;\n})();\n/* [MS-CFB] v20171201 */\nvar CFB = /*#__PURE__*/(function _CFB(){\nvar exports = {};\nexports.version = '1.2.1';\n/* [MS-CFB] 2.6.4 */\nfunction namecmp(l/*:string*/, r/*:string*/)/*:number*/ {\n\tvar L = l.split(\"/\"), R = r.split(\"/\");\n\tfor(var i = 0, c = 0, Z = Math.min(L.length, R.length); i < Z; ++i) {\n\t\tif((c = L[i].length - R[i].length)) return c;\n\t\tif(L[i] != R[i]) return L[i] < R[i] ? -1 : 1;\n\t}\n\treturn L.length - R.length;\n}\nfunction dirname(p/*:string*/)/*:string*/ {\n\tif(p.charAt(p.length - 1) == \"/\") return (p.slice(0,-1).indexOf(\"/\") === -1) ? p : dirname(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(0, c+1);\n}\n\nfunction filename(p/*:string*/)/*:string*/ {\n\tif(p.charAt(p.length - 1) == \"/\") return filename(p.slice(0, -1));\n\tvar c = p.lastIndexOf(\"/\");\n\treturn (c === -1) ? p : p.slice(c+1);\n}\n/* -------------------------------------------------------------------------- */\n/* DOS Date format:\n high|YYYYYYYm.mmmddddd.HHHHHMMM.MMMSSSSS|low\n add 1980 to stored year\n stored second should be doubled\n*/\n\n/* write JS date to buf as a DOS date */\nfunction write_dos_date(buf/*:CFBlob*/, date/*:Date|string*/) {\n\tif(typeof date === \"string\") date = new Date(date);\n\tvar hms/*:number*/ = date.getHours();\n\thms = hms << 6 | date.getMinutes();\n\thms = hms << 5 | (date.getSeconds()>>>1);\n\tbuf.write_shift(2, hms);\n\tvar ymd/*:number*/ = (date.getFullYear() - 1980);\n\tymd = ymd << 4 | (date.getMonth()+1);\n\tymd = ymd << 5 | date.getDate();\n\tbuf.write_shift(2, ymd);\n}\n\n/* read four bytes from buf and interpret as a DOS date */\nfunction parse_dos_date(buf/*:CFBlob*/)/*:Date*/ {\n\tvar hms = buf.read_shift(2) & 0xFFFF;\n\tvar ymd = buf.read_shift(2) & 0xFFFF;\n\tvar val = new Date();\n\tvar d = ymd & 0x1F; ymd >>>= 5;\n\tvar m = ymd & 0x0F; ymd >>>= 4;\n\tval.setMilliseconds(0);\n\tval.setFullYear(ymd + 1980);\n\tval.setMonth(m-1);\n\tval.setDate(d);\n\tvar S = hms & 0x1F; hms >>>= 5;\n\tvar M = hms & 0x3F; hms >>>= 6;\n\tval.setHours(hms);\n\tval.setMinutes(M);\n\tval.setSeconds(S<<1);\n\treturn val;\n}\nfunction parse_extra_field(blob/*:CFBlob*/)/*:any*/ {\n\tprep_blob(blob, 0);\n\tvar o = /*::(*/{}/*:: :any)*/;\n\tvar flags = 0;\n\twhile(blob.l <= blob.length - 4) {\n\t\tvar type = blob.read_shift(2);\n\t\tvar sz = blob.read_shift(2), tgt = blob.l + sz;\n\t\tvar p = {};\n\t\tswitch(type) {\n\t\t\t/* UNIX-style Timestamps */\n\t\t\tcase 0x5455: {\n\t\t\t\tflags = blob.read_shift(1);\n\t\t\t\tif(flags & 1) p.mtime = blob.read_shift(4);\n\t\t\t\t/* for some reason, CD flag corresponds to LFH */\n\t\t\t\tif(sz > 5) {\n\t\t\t\t\tif(flags & 2) p.atime = blob.read_shift(4);\n\t\t\t\t\tif(flags & 4) p.ctime = blob.read_shift(4);\n\t\t\t\t}\n\t\t\t\tif(p.mtime) p.mt = new Date(p.mtime*1000);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n\t\tblob.l = tgt;\n\t\to[type] = p;\n\t}\n\treturn o;\n}\nvar fs/*:: = require('fs'); */;\nfunction get_fs() { return fs || (fs = {}); }\nfunction parse(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {\nif(file[0] == 0x50 && file[1] == 0x4b) return parse_zip(file, options);\nif((file[0] | 0x20) == 0x6d && (file[1]|0x20) == 0x69) return parse_mad(file, options);\nif(file.length < 512) throw new Error(\"CFB file size \" + file.length + \" < 512\");\nvar mver = 3;\nvar ssz = 512;\nvar nmfs = 0; // number of mini FAT sectors\nvar difat_sec_cnt = 0;\nvar dir_start = 0;\nvar minifat_start = 0;\nvar difat_start = 0;\n\nvar fat_addrs/*:Array*/ = []; // locations of FAT sectors\n\n/* [MS-CFB] 2.2 Compound File Header */\nvar blob/*:CFBlob*/ = /*::(*/file.slice(0,512)/*:: :any)*/;\nprep_blob(blob, 0);\n\n/* major version */\nvar mv = check_get_mver(blob);\nmver = mv[0];\nswitch(mver) {\n\tcase 3: ssz = 512; break; case 4: ssz = 4096; break;\n\tcase 0: if(mv[1] == 0) return parse_zip(file, options);\n\t/* falls through */\n\tdefault: throw new Error(\"Major Version: Expected 3 or 4 saw \" + mver);\n}\n\n/* reprocess header */\nif(ssz !== 512) { blob = /*::(*/file.slice(0,ssz)/*:: :any)*/; prep_blob(blob, 28 /* blob.l */); }\n/* Save header for final object */\nvar header/*:RawBytes*/ = file.slice(0,ssz);\n\ncheck_shifts(blob, mver);\n\n// Number of Directory Sectors\nvar dir_cnt/*:number*/ = blob.read_shift(4, 'i');\nif(mver === 3 && dir_cnt !== 0) throw new Error('# Directory Sectors: Expected 0 saw ' + dir_cnt);\n\n// Number of FAT Sectors\nblob.l += 4;\n\n// First Directory Sector Location\ndir_start = blob.read_shift(4, 'i');\n\n// Transaction Signature\nblob.l += 4;\n\n// Mini Stream Cutoff Size\nblob.chk('00100000', 'Mini Stream Cutoff Size: ');\n\n// First Mini FAT Sector Location\nminifat_start = blob.read_shift(4, 'i');\n\n// Number of Mini FAT Sectors\nnmfs = blob.read_shift(4, 'i');\n\n// First DIFAT sector location\ndifat_start = blob.read_shift(4, 'i');\n\n// Number of DIFAT Sectors\ndifat_sec_cnt = blob.read_shift(4, 'i');\n\n// Grab FAT Sector Locations\nfor(var q = -1, j = 0; j < 109; ++j) { /* 109 = (512 - blob.l)>>>2; */\n\tq = blob.read_shift(4, 'i');\n\tif(q<0) break;\n\tfat_addrs[j] = q;\n}\n\n/** Break the file up into sectors */\nvar sectors/*:Array*/ = sectorify(file, ssz);\n\nsleuth_fat(difat_start, difat_sec_cnt, sectors, ssz, fat_addrs);\n\n/** Chains */\nvar sector_list/*:SectorList*/ = make_sector_list(sectors, dir_start, fat_addrs, ssz);\n\nsector_list[dir_start].name = \"!Directory\";\nif(nmfs > 0 && minifat_start !== ENDOFCHAIN) sector_list[minifat_start].name = \"!MiniFAT\";\nsector_list[fat_addrs[0]].name = \"!FAT\";\nsector_list.fat_addrs = fat_addrs;\nsector_list.ssz = ssz;\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nvar files/*:CFBFiles*/ = {}, Paths/*:Array*/ = [], FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = [];\nread_directory(dir_start, sector_list, sectors, Paths, nmfs, files, FileIndex, minifat_start);\n\nbuild_full_paths(FileIndex, FullPaths, Paths);\nPaths.shift();\n\nvar o = {\n\tFileIndex: FileIndex,\n\tFullPaths: FullPaths\n};\n\n// $FlowIgnore\nif(options && options.raw) o.raw = {header: header, sectors: sectors};\nreturn o;\n} // parse\n\n/* [MS-CFB] 2.2 Compound File Header -- read up to major version */\nfunction check_get_mver(blob/*:CFBlob*/)/*:[number, number]*/ {\n\tif(blob[blob.l] == 0x50 && blob[blob.l + 1] == 0x4b) return [0, 0];\n\t// header signature 8\n\tblob.chk(HEADER_SIGNATURE, 'Header Signature: ');\n\n\t// clsid 16\n\t//blob.chk(HEADER_CLSID, 'CLSID: ');\n\tblob.l += 16;\n\n\t// minor version 2\n\tvar mver/*:number*/ = blob.read_shift(2, 'u');\n\n\treturn [blob.read_shift(2,'u'), mver];\n}\nfunction check_shifts(blob/*:CFBlob*/, mver/*:number*/)/*:void*/ {\n\tvar shift = 0x09;\n\n\t// Byte Order\n\t//blob.chk('feff', 'Byte Order: '); // note: some writers put 0xffff\n\tblob.l += 2;\n\n\t// Sector Shift\n\tswitch((shift = blob.read_shift(2))) {\n\t\tcase 0x09: if(mver != 3) throw new Error('Sector Shift: Expected 9 saw ' + shift); break;\n\t\tcase 0x0c: if(mver != 4) throw new Error('Sector Shift: Expected 12 saw ' + shift); break;\n\t\tdefault: throw new Error('Sector Shift: Expected 9 or 12 saw ' + shift);\n\t}\n\n\t// Mini Sector Shift\n\tblob.chk('0600', 'Mini Sector Shift: ');\n\n\t// Reserved\n\tblob.chk('000000000000', 'Reserved: ');\n}\n\n/** Break the file up into sectors */\nfunction sectorify(file/*:RawBytes*/, ssz/*:number*/)/*:Array*/ {\n\tvar nsectors = Math.ceil(file.length/ssz)-1;\n\tvar sectors/*:Array*/ = [];\n\tfor(var i=1; i < nsectors; ++i) sectors[i-1] = file.slice(i*ssz,(i+1)*ssz);\n\tsectors[nsectors-1] = file.slice(nsectors*ssz);\n\treturn sectors;\n}\n\n/* [MS-CFB] 2.6.4 Red-Black Tree */\nfunction build_full_paths(FI/*:CFBFileIndex*/, FP/*:Array*/, Paths/*:Array*/)/*:void*/ {\n\tvar i = 0, L = 0, R = 0, C = 0, j = 0, pl = Paths.length;\n\tvar dad/*:Array*/ = [], q/*:Array*/ = [];\n\n\tfor(; i < pl; ++i) { dad[i]=q[i]=i; FP[i]=Paths[i]; }\n\n\tfor(; j < q.length; ++j) {\n\t\ti = q[j];\n\t\tL = FI[i].L; R = FI[i].R; C = FI[i].C;\n\t\tif(dad[i] === i) {\n\t\t\tif(L !== -1 /*NOSTREAM*/ && dad[L] !== L) dad[i] = dad[L];\n\t\t\tif(R !== -1 && dad[R] !== R) dad[i] = dad[R];\n\t\t}\n\t\tif(C !== -1 /*NOSTREAM*/) dad[C] = i;\n\t\tif(L !== -1 && i != dad[i]) { dad[L] = dad[i]; if(q.lastIndexOf(L) < j) q.push(L); }\n\t\tif(R !== -1 && i != dad[i]) { dad[R] = dad[i]; if(q.lastIndexOf(R) < j) q.push(R); }\n\t}\n\tfor(i=1; i < pl; ++i) if(dad[i] === i) {\n\t\tif(R !== -1 /*NOSTREAM*/ && dad[R] !== R) dad[i] = dad[R];\n\t\telse if(L !== -1 && dad[L] !== L) dad[i] = dad[L];\n\t}\n\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type === 0 /* unknown */) continue;\n\t\tj = i;\n\t\tif(j != dad[j]) do {\n\t\t\tj = dad[j];\n\t\t\tFP[i] = FP[j] + \"/\" + FP[i];\n\t\t} while (j !== 0 && -1 !== dad[j] && j != dad[j]);\n\t\tdad[i] = -1;\n\t}\n\n\tFP[0] += \"/\";\n\tfor(i=1; i < pl; ++i) {\n\t\tif(FI[i].type !== 2 /* stream */) FP[i] += \"/\";\n\t}\n}\n\nfunction get_mfat_entry(entry/*:CFBEntry*/, payload/*:RawBytes*/, mini/*:?RawBytes*/)/*:CFBlob*/ {\n\tvar start = entry.start, size = entry.size;\n\t//return (payload.slice(start*MSSZ, start*MSSZ + size)/*:any*/);\n\tvar o = [];\n\tvar idx = start;\n\twhile(mini && size > 0 && idx >= 0) {\n\t\to.push(payload.slice(idx * MSSZ, idx * MSSZ + MSSZ));\n\t\tsize -= MSSZ;\n\t\tidx = __readInt32LE(mini, idx * 4);\n\t}\n\tif(o.length === 0) return (new_buf(0)/*:any*/);\n\treturn (bconcat(o).slice(0, entry.size)/*:any*/);\n}\n\n/** Chase down the rest of the DIFAT chain to build a comprehensive list\n DIFAT chains by storing the next sector number as the last 32 bits */\nfunction sleuth_fat(idx/*:number*/, cnt/*:number*/, sectors/*:Array*/, ssz/*:number*/, fat_addrs)/*:void*/ {\n\tvar q/*:number*/ = ENDOFCHAIN;\n\tif(idx === ENDOFCHAIN) {\n\t\tif(cnt !== 0) throw new Error(\"DIFAT chain shorter than expected\");\n\t} else if(idx !== -1 /*FREESECT*/) {\n\t\tvar sector = sectors[idx], m = (ssz>>>2)-1;\n\t\tif(!sector) return;\n\t\tfor(var i = 0; i < m; ++i) {\n\t\t\tif((q = __readInt32LE(sector,i*4)) === ENDOFCHAIN) break;\n\t\t\tfat_addrs.push(q);\n\t\t}\n\t\tsleuth_fat(__readInt32LE(sector,ssz-4),cnt - 1, sectors, ssz, fat_addrs);\n\t}\n}\n\n/** Follow the linked list of sectors for a given starting point */\nfunction get_sector_list(sectors/*:Array*/, start/*:number*/, fat_addrs/*:Array*/, ssz/*:number*/, chkd/*:?Array*/)/*:SectorEntry*/ {\n\tvar buf/*:Array*/ = [], buf_chain/*:Array*/ = [];\n\tif(!chkd) chkd = [];\n\tvar modulus = ssz - 1, j = 0, jj = 0;\n\tfor(j=start; j>=0;) {\n\t\tchkd[j] = true;\n\t\tbuf[buf.length] = j;\n\t\tbuf_chain.push(sectors[j]);\n\t\tvar addr = fat_addrs[Math.floor(j*4/ssz)];\n\t\tjj = ((j*4) & modulus);\n\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\tif(!sectors[addr]) break;\n\t\tj = __readInt32LE(sectors[addr], jj);\n\t}\n\treturn {nodes: buf, data:__toBuffer([buf_chain])};\n}\n\n/** Chase down the sector linked lists */\nfunction make_sector_list(sectors/*:Array*/, dir_start/*:number*/, fat_addrs/*:Array*/, ssz/*:number*/)/*:SectorList*/ {\n\tvar sl = sectors.length, sector_list/*:SectorList*/ = ([]/*:any*/);\n\tvar chkd/*:Array*/ = [], buf/*:Array*/ = [], buf_chain/*:Array*/ = [];\n\tvar modulus = ssz - 1, i=0, j=0, k=0, jj=0;\n\tfor(i=0; i < sl; ++i) {\n\t\tbuf = ([]/*:Array*/);\n\t\tk = (i + dir_start); if(k >= sl) k-=sl;\n\t\tif(chkd[k]) continue;\n\t\tbuf_chain = [];\n\t\tvar seen = [];\n\t\tfor(j=k; j>=0;) {\n\t\t\tseen[j] = true;\n\t\t\tchkd[j] = true;\n\t\t\tbuf[buf.length] = j;\n\t\t\tbuf_chain.push(sectors[j]);\n\t\t\tvar addr/*:number*/ = fat_addrs[Math.floor(j*4/ssz)];\n\t\t\tjj = ((j*4) & modulus);\n\t\t\tif(ssz < 4 + jj) throw new Error(\"FAT boundary crossed: \" + j + \" 4 \"+ssz);\n\t\t\tif(!sectors[addr]) break;\n\t\t\tj = __readInt32LE(sectors[addr], jj);\n\t\t\tif(seen[j]) break;\n\t\t}\n\t\tsector_list[k] = ({nodes: buf, data:__toBuffer([buf_chain])}/*:SectorEntry*/);\n\t}\n\treturn sector_list;\n}\n\n/* [MS-CFB] 2.6.1 Compound File Directory Entry */\nfunction read_directory(dir_start/*:number*/, sector_list/*:SectorList*/, sectors/*:Array*/, Paths/*:Array*/, nmfs, files, FileIndex, mini) {\n\tvar minifat_store = 0, pl = (Paths.length?2:0);\n\tvar sector = sector_list[dir_start].data;\n\tvar i = 0, namelen = 0, name;\n\tfor(; i < sector.length; i+= 128) {\n\t\tvar blob/*:CFBlob*/ = /*::(*/sector.slice(i, i+128)/*:: :any)*/;\n\t\tprep_blob(blob, 64);\n\t\tnamelen = blob.read_shift(2);\n\t\tname = __utf16le(blob,0,namelen-pl);\n\t\tPaths.push(name);\n\t\tvar o/*:CFBEntry*/ = ({\n\t\t\tname: name,\n\t\t\ttype: blob.read_shift(1),\n\t\t\tcolor: blob.read_shift(1),\n\t\t\tL: blob.read_shift(4, 'i'),\n\t\t\tR: blob.read_shift(4, 'i'),\n\t\t\tC: blob.read_shift(4, 'i'),\n\t\t\tclsid: blob.read_shift(16),\n\t\t\tstate: blob.read_shift(4, 'i'),\n\t\t\tstart: 0,\n\t\t\tsize: 0\n\t\t});\n\t\tvar ctime/*:number*/ = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(ctime !== 0) o.ct = read_date(blob, blob.l-8);\n\t\tvar mtime/*:number*/ = blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2) + blob.read_shift(2);\n\t\tif(mtime !== 0) o.mt = read_date(blob, blob.l-8);\n\t\to.start = blob.read_shift(4, 'i');\n\t\to.size = blob.read_shift(4, 'i');\n\t\tif(o.size < 0 && o.start < 0) { o.size = o.type = 0; o.start = ENDOFCHAIN; o.name = \"\"; }\n\t\tif(o.type === 5) { /* root */\n\t\t\tminifat_store = o.start;\n\t\t\tif(nmfs > 0 && minifat_store !== ENDOFCHAIN) sector_list[minifat_store].name = \"!StreamData\";\n\t\t\t/*minifat_size = o.size;*/\n\t\t} else if(o.size >= 4096 /* MSCSZ */) {\n\t\t\to.storage = 'fat';\n\t\t\tif(sector_list[o.start] === undefined) sector_list[o.start] = get_sector_list(sectors, o.start, sector_list.fat_addrs, sector_list.ssz);\n\t\t\tsector_list[o.start].name = o.name;\n\t\t\to.content = (sector_list[o.start].data.slice(0,o.size)/*:any*/);\n\t\t} else {\n\t\t\to.storage = 'minifat';\n\t\t\tif(o.size < 0) o.size = 0;\n\t\t\telse if(minifat_store !== ENDOFCHAIN && o.start !== ENDOFCHAIN && sector_list[minifat_store]) {\n\t\t\t\to.content = get_mfat_entry(o, sector_list[minifat_store].data, (sector_list[mini]||{}).data);\n\t\t\t}\n\t\t}\n\t\tif(o.content) prep_blob(o.content, 0);\n\t\tfiles[name] = o;\n\t\tFileIndex.push(o);\n\t}\n}\n\nfunction read_date(blob/*:RawBytes|CFBlob*/, offset/*:number*/)/*:Date*/ {\n\treturn new Date(( ( (__readUInt32LE(blob,offset+4)/1e7)*Math.pow(2,32)+__readUInt32LE(blob,offset)/1e7 ) - 11644473600)*1000);\n}\n\nfunction read_file(filename/*:string*/, options/*:CFBReadOpts*/) {\n\tget_fs();\n\treturn parse(fs.readFileSync(filename), options);\n}\n\nfunction read(blob/*:RawBytes|string*/, options/*:CFBReadOpts*/) {\n\tvar type = options && options.type;\n\tif(!type) {\n\t\tif(has_buf && Buffer.isBuffer(blob)) type = \"buffer\";\n\t}\n\tswitch(type || \"base64\") {\n\t\tcase \"file\": /*:: if(typeof blob !== 'string') throw \"Must pass a filename when type='file'\"; */return read_file(blob, options);\n\t\tcase \"base64\": /*:: if(typeof blob !== 'string') throw \"Must pass a base64-encoded binary string when type='file'\"; */return parse(s2a(Base64_decode(blob)), options);\n\t\tcase \"binary\": /*:: if(typeof blob !== 'string') throw \"Must pass a binary string when type='file'\"; */return parse(s2a(blob), options);\n\t}\n\treturn parse(/*::typeof blob == 'string' ? new Buffer(blob, 'utf-8') : */blob, options);\n}\n\nfunction init_cfb(cfb/*:CFBContainer*/, opts/*:?any*/)/*:void*/ {\n\tvar o = opts || {}, root = o.root || \"Root Entry\";\n\tif(!cfb.FullPaths) cfb.FullPaths = [];\n\tif(!cfb.FileIndex) cfb.FileIndex = [];\n\tif(cfb.FullPaths.length !== cfb.FileIndex.length) throw new Error(\"inconsistent CFB structure\");\n\tif(cfb.FullPaths.length === 0) {\n\t\tcfb.FullPaths[0] = root + \"/\";\n\t\tcfb.FileIndex[0] = ({ name: root, type: 5 }/*:any*/);\n\t}\n\tif(o.CLSID) cfb.FileIndex[0].clsid = o.CLSID;\n\tseed_cfb(cfb);\n}\nfunction seed_cfb(cfb/*:CFBContainer*/)/*:void*/ {\n\tvar nm = \"\\u0001Sh33tJ5\";\n\tif(CFB.find(cfb, \"/\" + nm)) return;\n\tvar p = new_buf(4); p[0] = 55; p[1] = p[3] = 50; p[2] = 54;\n\tcfb.FileIndex.push(({ name: nm, type: 2, content:p, size:4, L:69, R:69, C:69 }/*:any*/));\n\tcfb.FullPaths.push(cfb.FullPaths[0] + nm);\n\trebuild_cfb(cfb);\n}\nfunction rebuild_cfb(cfb/*:CFBContainer*/, f/*:?boolean*/)/*:void*/ {\n\tinit_cfb(cfb);\n\tvar gc = false, s = false;\n\tfor(var i = cfb.FullPaths.length - 1; i >= 0; --i) {\n\t\tvar _file = cfb.FileIndex[i];\n\t\tswitch(_file.type) {\n\t\t\tcase 0:\n\t\t\t\tif(s) gc = true;\n\t\t\t\telse { cfb.FileIndex.pop(); cfb.FullPaths.pop(); }\n\t\t\t\tbreak;\n\t\t\tcase 1: case 2: case 5:\n\t\t\t\ts = true;\n\t\t\t\tif(isNaN(_file.R * _file.L * _file.C)) gc = true;\n\t\t\t\tif(_file.R > -1 && _file.L > -1 && _file.R == _file.L) gc = true;\n\t\t\t\tbreak;\n\t\t\tdefault: gc = true; break;\n\t\t}\n\t}\n\tif(!gc && !f) return;\n\n\tvar now = new Date(1987, 1, 19), j = 0;\n\t// Track which names exist\n\tvar fullPaths = Object.create ? Object.create(null) : {};\n\tvar data/*:Array<[string, CFBEntry]>*/ = [];\n\tfor(i = 0; i < cfb.FullPaths.length; ++i) {\n\t\tfullPaths[cfb.FullPaths[i]] = true;\n\t\tif(cfb.FileIndex[i].type === 0) continue;\n\t\tdata.push([cfb.FullPaths[i], cfb.FileIndex[i]]);\n\t}\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar dad = dirname(data[i][0]);\n\t\ts = fullPaths[dad];\n\t\tif(!s) {\n\t\t\tdata.push([dad, ({\n\t\t\t\tname: filename(dad).replace(\"/\",\"\"),\n\t\t\t\ttype: 1,\n\t\t\t\tclsid: HEADER_CLSID,\n\t\t\t\tct: now, mt: now,\n\t\t\t\tcontent: null\n\t\t\t}/*:any*/)]);\n\t\t\t// Add name to set\n\t\t\tfullPaths[dad] = true;\n\t\t}\n\t}\n\n\tdata.sort(function(x,y) { return namecmp(x[0], y[0]); });\n\tcfb.FullPaths = []; cfb.FileIndex = [];\n\tfor(i = 0; i < data.length; ++i) { cfb.FullPaths[i] = data[i][0]; cfb.FileIndex[i] = data[i][1]; }\n\tfor(i = 0; i < data.length; ++i) {\n\t\tvar elt = cfb.FileIndex[i];\n\t\tvar nm = cfb.FullPaths[i];\n\n\t\telt.name = filename(nm).replace(\"/\",\"\");\n\t\telt.L = elt.R = elt.C = -(elt.color = 1);\n\t\telt.size = elt.content ? elt.content.length : 0;\n\t\telt.start = 0;\n\t\telt.clsid = (elt.clsid || HEADER_CLSID);\n\t\tif(i === 0) {\n\t\t\telt.C = data.length > 1 ? 1 : -1;\n\t\t\telt.size = 0;\n\t\t\telt.type = 5;\n\t\t} else if(nm.slice(-1) == \"/\") {\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==nm) break;\n\t\t\telt.C = j >= data.length ? -1 : j;\n\t\t\tfor(j=i+1;j < data.length; ++j) if(dirname(cfb.FullPaths[j])==dirname(nm)) break;\n\t\t\telt.R = j >= data.length ? -1 : j;\n\t\t\telt.type = 1;\n\t\t} else {\n\t\t\tif(dirname(cfb.FullPaths[i+1]||\"\") == dirname(nm)) elt.R = i + 1;\n\t\t\telt.type = 2;\n\t\t}\n\t}\n\n}\n\nfunction _write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|string*/ {\n\tvar _opts = options || {};\n\t/* MAD is order-sensitive, skip rebuild and sort */\n\tif(_opts.fileType == 'mad') return write_mad(cfb, _opts);\n\trebuild_cfb(cfb);\n\tswitch(_opts.fileType) {\n\t\tcase 'zip': return write_zip(cfb, _opts);\n\t\t//case 'mad': return write_mad(cfb, _opts);\n\t}\n\tvar L = (function(cfb/*:CFBContainer*/)/*:Array*/{\n\t\tvar mini_size = 0, fat_size = 0;\n\t\tfor(var i = 0; i < cfb.FileIndex.length; ++i) {\n\t\t\tvar file = cfb.FileIndex[i];\n\t\t\tif(!file.content) continue;\n\t\t\t/*:: if(file.content == null) throw new Error(\"unreachable\"); */\n\t\t\tvar flen = file.content.length;\n\t\t\tif(flen > 0){\n\t\t\t\tif(flen < 0x1000) mini_size += (flen + 0x3F) >> 6;\n\t\t\t\telse fat_size += (flen + 0x01FF) >> 9;\n\t\t\t}\n\t\t}\n\t\tvar dir_cnt = (cfb.FullPaths.length +3) >> 2;\n\t\tvar mini_cnt = (mini_size + 7) >> 3;\n\t\tvar mfat_cnt = (mini_size + 0x7F) >> 7;\n\t\tvar fat_base = mini_cnt + fat_size + dir_cnt + mfat_cnt;\n\t\tvar fat_cnt = (fat_base + 0x7F) >> 7;\n\t\tvar difat_cnt = fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\twhile(((fat_base + fat_cnt + difat_cnt + 0x7F) >> 7) > fat_cnt) difat_cnt = ++fat_cnt <= 109 ? 0 : Math.ceil((fat_cnt-109)/0x7F);\n\t\tvar L = [1, difat_cnt, fat_cnt, mfat_cnt, dir_cnt, fat_size, mini_size, 0];\n\t\tcfb.FileIndex[0].size = mini_size << 6;\n\t\tL[7] = (cfb.FileIndex[0].start=L[0]+L[1]+L[2]+L[3]+L[4]+L[5])+((L[6]+7) >> 3);\n\t\treturn L;\n\t})(cfb);\n\tvar o = new_buf(L[7] << 9);\n\tvar i = 0, T = 0;\n\t{\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(1, HEADER_SIG[i]);\n\t\tfor(i = 0; i < 8; ++i) o.write_shift(2, 0);\n\t\to.write_shift(2, 0x003E);\n\t\to.write_shift(2, 0x0003);\n\t\to.write_shift(2, 0xFFFE);\n\t\to.write_shift(2, 0x0009);\n\t\to.write_shift(2, 0x0006);\n\t\tfor(i = 0; i < 3; ++i) o.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, L[2]);\n\t\to.write_shift(4, L[0] + L[1] + L[2] + L[3] - 1);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, 1<<12);\n\t\to.write_shift(4, L[3] ? L[0] + L[1] + L[2] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[3]);\n\t\to.write_shift(-4, L[1] ? L[0] - 1: ENDOFCHAIN);\n\t\to.write_shift(4, L[1]);\n\t\tfor(i = 0; i < 109; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t}\n\tif(L[1]) {\n\t\tfor(T = 0; T < L[1]; ++T) {\n\t\t\tfor(; i < 236 + T * 127; ++i) o.write_shift(-4, i < L[2] ? L[1] + i : -1);\n\t\t\to.write_shift(-4, T === L[1] - 1 ? ENDOFCHAIN : T + 1);\n\t\t}\n\t}\n\tvar chainit = function(w/*:number*/)/*:void*/ {\n\t\tfor(T += w; i> 9);\n\t}\n\tchainit((L[6] + 7) >> 3);\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tT = i = 0;\n\tfor(j = 0; j < cfb.FileIndex.length; ++j) {\n\t\tfile = cfb.FileIndex[j];\n\t\tif(!file.content) continue;\n\t\t/*:: if(file.content == null) throw new Error(\"unreachable\"); */\n\t\tflen = file.content.length;\n\t\tif(!flen || flen >= 0x1000) continue;\n\t\tfile.start = T;\n\t\tchainit((flen + 0x3F) >> 6);\n\t}\n\twhile(o.l & 0x1FF) o.write_shift(-4, consts.ENDOFCHAIN);\n\tfor(i = 0; i < L[4]<<2; ++i) {\n\t\tvar nm = cfb.FullPaths[i];\n\t\tif(!nm || nm.length === 0) {\n\t\t\tfor(j = 0; j < 17; ++j) o.write_shift(4, 0);\n\t\t\tfor(j = 0; j < 3; ++j) o.write_shift(4, -1);\n\t\t\tfor(j = 0; j < 12; ++j) o.write_shift(4, 0);\n\t\t\tcontinue;\n\t\t}\n\t\tfile = cfb.FileIndex[i];\n\t\tif(i === 0) file.start = file.size ? file.start - 1 : ENDOFCHAIN;\n\t\tvar _nm/*:string*/ = (i === 0 && _opts.root) || file.name;\n\t\tflen = 2*(_nm.length+1);\n\t\to.write_shift(64, _nm, \"utf16le\");\n\t\to.write_shift(2, flen);\n\t\to.write_shift(1, file.type);\n\t\to.write_shift(1, file.color);\n\t\to.write_shift(-4, file.L);\n\t\to.write_shift(-4, file.R);\n\t\to.write_shift(-4, file.C);\n\t\tif(!file.clsid) for(j = 0; j < 4; ++j) o.write_shift(4, 0);\n\t\telse o.write_shift(16, file.clsid, \"hex\");\n\t\to.write_shift(4, file.state || 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, 0); o.write_shift(4, 0);\n\t\to.write_shift(4, file.start);\n\t\to.write_shift(4, file.size); o.write_shift(4, 0);\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\n\t\t/*:: if(!file.content) throw new Error(\"unreachable\"); */\n\t\tif(file.size >= 0x1000) {\n\t\t\to.l = (file.start+1) << 9;\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 511) & -512;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x1FF; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tfor(i = 1; i < cfb.FileIndex.length; ++i) {\n\t\tfile = cfb.FileIndex[i];\n\t\t/*:: if(!file.content) throw new Error(\"unreachable\"); */\n\t\tif(file.size > 0 && file.size < 0x1000) {\n\t\t\tif (has_buf && Buffer.isBuffer(file.content)) {\n\t\t\t\tfile.content.copy(o, o.l, 0, file.size);\n\t\t\t\t// o is a 0-filled Buffer so just set next offset\n\t\t\t\to.l += (file.size + 63) & -64;\n\t\t\t} else {\n\t\t\t\tfor(j = 0; j < file.size; ++j) o.write_shift(1, file.content[j]);\n\t\t\t\tfor(; j & 0x3F; ++j) o.write_shift(1, 0);\n\t\t\t}\n\t\t}\n\t}\n\tif (has_buf) {\n\t\to.l = o.length;\n\t} else {\n\t\t// When using Buffer, already 0-filled\n\t\twhile(o.l < o.length) o.write_shift(1, 0);\n\t}\n\treturn o;\n}\n/* [MS-CFB] 2.6.4 (Unicode 3.0.1 case conversion) */\nfunction find(cfb/*:CFBContainer*/, path/*:string*/)/*:?CFBEntry*/ {\n\tvar UCFullPaths/*:Array*/ = cfb.FullPaths.map(function(x) { return x.toUpperCase(); });\n\tvar UCPaths/*:Array*/ = UCFullPaths.map(function(x) { var y = x.split(\"/\"); return y[y.length - (x.slice(-1) == \"/\" ? 2 : 1)]; });\n\tvar k/*:boolean*/ = false;\n\tif(path.charCodeAt(0) === 47 /* \"/\" */) { k = true; path = UCFullPaths[0].slice(0, -1) + path; }\n\telse k = path.indexOf(\"/\") !== -1;\n\tvar UCPath/*:string*/ = path.toUpperCase();\n\tvar w/*:number*/ = k === true ? UCFullPaths.indexOf(UCPath) : UCPaths.indexOf(UCPath);\n\tif(w !== -1) return cfb.FileIndex[w];\n\n\tvar m = !UCPath.match(chr1);\n\tUCPath = UCPath.replace(chr0,'');\n\tif(m) UCPath = UCPath.replace(chr1,'!');\n\tfor(w = 0; w < UCFullPaths.length; ++w) {\n\t\tif((m ? UCFullPaths[w].replace(chr1,'!') : UCFullPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t\tif((m ? UCPaths[w].replace(chr1,'!') : UCPaths[w]).replace(chr0,'') == UCPath) return cfb.FileIndex[w];\n\t}\n\treturn null;\n}\n/** CFB Constants */\nvar MSSZ = 64; /* Mini Sector Size = 1<<6 */\n//var MSCSZ = 4096; /* Mini Stream Cutoff Size */\n/* 2.1 Compound File Sector Numbers and Types */\nvar ENDOFCHAIN = -2;\n/* 2.2 Compound File Header */\nvar HEADER_SIGNATURE = 'd0cf11e0a1b11ae1';\nvar HEADER_SIG = [0xD0, 0xCF, 0x11, 0xE0, 0xA1, 0xB1, 0x1A, 0xE1];\nvar HEADER_CLSID = '00000000000000000000000000000000';\nvar consts = {\n\t/* 2.1 Compund File Sector Numbers and Types */\n\tMAXREGSECT: -6,\n\tDIFSECT: -4,\n\tFATSECT: -3,\n\tENDOFCHAIN: ENDOFCHAIN,\n\tFREESECT: -1,\n\t/* 2.2 Compound File Header */\n\tHEADER_SIGNATURE: HEADER_SIGNATURE,\n\tHEADER_MINOR_VERSION: '3e00',\n\tMAXREGSID: -6,\n\tNOSTREAM: -1,\n\tHEADER_CLSID: HEADER_CLSID,\n\t/* 2.6.1 Compound File Directory Entry */\n\tEntryTypes: ['unknown','storage','stream','lockbytes','property','root']\n};\n\nfunction write_file(cfb/*:CFBContainer*/, filename/*:string*/, options/*:CFBWriteOpts*/)/*:void*/ {\n\tget_fs();\n\tvar o = _write(cfb, options);\n\t/*:: if(typeof Buffer == 'undefined' || !Buffer.isBuffer(o) || !(o instanceof Buffer)) throw new Error(\"unreachable\"); */\n\tfs.writeFileSync(filename, o);\n}\n\nfunction a2s(o/*:RawBytes*/)/*:string*/ {\n\tvar out = new Array(o.length);\n\tfor(var i = 0; i < o.length; ++i) out[i] = String.fromCharCode(o[i]);\n\treturn out.join(\"\");\n}\n\nfunction write(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes|string*/ {\n\tvar o = _write(cfb, options);\n\tswitch(options && options.type || \"buffer\") {\n\t\tcase \"file\": get_fs(); fs.writeFileSync(options.filename, (o/*:any*/)); return o;\n\t\tcase \"binary\": return typeof o == \"string\" ? o : a2s(o);\n\t\tcase \"base64\": return Base64_encode(typeof o == \"string\" ? o : a2s(o));\n\t\tcase \"buffer\": if(has_buf) return Buffer.isBuffer(o) ? o : Buffer_from(o);\n\t\t\t/* falls through */\n\t\tcase \"array\": return typeof o == \"string\" ? s2a(o) : o;\n\t}\n\treturn o;\n}\n/* node < 8.1 zlib does not expose bytesRead, so default to pure JS */\nvar _zlib;\nfunction use_zlib(zlib) { try {\n\tvar InflateRaw = zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tInflRaw._processChunk(new Uint8Array([3, 0]), InflRaw._finishFlushFlag);\n\tif(InflRaw.bytesRead) _zlib = zlib;\n\telse throw new Error(\"zlib does not expose bytesRead\");\n} catch(e) {console.error(\"cannot use native zlib: \" + (e.message || e)); } }\n\nfunction _inflateRawSync(payload, usz) {\n\tif(!_zlib) return _inflate(payload, usz);\n\tvar InflateRaw = _zlib.InflateRaw;\n\tvar InflRaw = new InflateRaw();\n\tvar out = InflRaw._processChunk(payload.slice(payload.l), InflRaw._finishFlushFlag);\n\tpayload.l += InflRaw.bytesRead;\n\treturn out;\n}\n\nfunction _deflateRawSync(payload) {\n\treturn _zlib ? _zlib.deflateRawSync(payload) : _deflate(payload);\n}\nvar CLEN_ORDER = [ 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 ];\n\n/* LEN_ID = [ 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285 ]; */\nvar LEN_LN = [ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13 , 15, 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258 ];\n\n/* DST_ID = [ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29 ]; */\nvar DST_LN = [ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577 ];\n\nfunction bit_swap_8(n) { var t = (((((n<<1)|(n<<11)) & 0x22110) | (((n<<5)|(n<<15)) & 0x88440))); return ((t>>16) | (t>>8) |t)&0xFF; }\n\nvar use_typed_arrays = typeof Uint8Array !== 'undefined';\n\nvar bitswap8 = use_typed_arrays ? new Uint8Array(1<<8) : [];\nfor(var q = 0; q < (1<<8); ++q) bitswap8[q] = bit_swap_8(q);\n\nfunction bit_swap_n(n, b) {\n\tvar rev = bitswap8[n & 0xFF];\n\tif(b <= 8) return rev >>> (8-b);\n\trev = (rev << 8) | bitswap8[(n>>8)&0xFF];\n\tif(b <= 16) return rev >>> (16-b);\n\trev = (rev << 8) | bitswap8[(n>>16)&0xFF];\n\treturn rev >>> (24-b);\n}\n\n/* helpers for unaligned bit reads */\nfunction read_bits_2(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 6 ? 0 : buf[h+1]<<8))>>>w)& 0x03; }\nfunction read_bits_3(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 5 ? 0 : buf[h+1]<<8))>>>w)& 0x07; }\nfunction read_bits_4(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 4 ? 0 : buf[h+1]<<8))>>>w)& 0x0F; }\nfunction read_bits_5(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 3 ? 0 : buf[h+1]<<8))>>>w)& 0x1F; }\nfunction read_bits_7(buf, bl) { var w = (bl&7), h = (bl>>>3); return ((buf[h]|(w <= 1 ? 0 : buf[h+1]<<8))>>>w)& 0x7F; }\n\n/* works up to n = 3 * 8 + 1 = 25 */\nfunction read_bits_n(buf, bl, n) {\n\tvar w = (bl&7), h = (bl>>>3), f = ((1<>> w;\n\tif(n < 8 - w) return v & f;\n\tv |= buf[h+1]<<(8-w);\n\tif(n < 16 - w) return v & f;\n\tv |= buf[h+2]<<(16-w);\n\tif(n < 24 - w) return v & f;\n\tv |= buf[h+3]<<(24-w);\n\treturn v & f;\n}\n\n/* helpers for unaligned bit writes */\nfunction write_bits_3(buf, bl, v) { var w = bl & 7, h = bl >>> 3;\n\tif(w <= 5) buf[h] |= (v & 7) << w;\n\telse {\n\t\tbuf[h] |= (v << w) & 0xFF;\n\t\tbuf[h+1] = (v&7) >> (8-w);\n\t}\n\treturn bl + 3;\n}\n\nfunction write_bits_1(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv = (v&1) << w;\n\tbuf[h] |= v;\n\treturn bl + 1;\n}\nfunction write_bits_8(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v;\n\treturn bl + 8;\n}\nfunction write_bits_16(buf, bl, v) {\n\tvar w = bl & 7, h = bl >>> 3;\n\tv <<= w;\n\tbuf[h] |= v & 0xFF; v >>>= 8;\n\tbuf[h+1] = v & 0xFF;\n\tbuf[h+2] = v >>> 8;\n\treturn bl + 16;\n}\n\n/* until ArrayBuffer#realloc is a thing, fake a realloc */\nfunction realloc(b, sz/*:number*/) {\n\tvar L = b.length, M = 2*L > sz ? 2*L : sz + 5, i = 0;\n\tif(L >= sz) return b;\n\tif(has_buf) {\n\t\tvar o = new_unsafe_buf(M);\n\t\t// $FlowIgnore\n\t\tif(b.copy) b.copy(o);\n\t\telse for(; i < b.length; ++i) o[i] = b[i];\n\t\treturn o;\n\t} else if(use_typed_arrays) {\n\t\tvar a = new Uint8Array(M);\n\t\tif(a.set) a.set(b);\n\t\telse for(; i < L; ++i) a[i] = b[i];\n\t\treturn a;\n\t}\n\tb.length = M;\n\treturn b;\n}\n\n/* zero-filled arrays for older browsers */\nfunction zero_fill_array(n) {\n\tvar o = new Array(n);\n\tfor(var i = 0; i < n; ++i) o[i] = 0;\n\treturn o;\n}\n\n/* build tree (used for literals and lengths) */\nfunction build_tree(clens, cmap, MAX/*:number*/)/*:number*/ {\n\tvar maxlen = 1, w = 0, i = 0, j = 0, ccode = 0, L = clens.length;\n\n\tvar bl_count = use_typed_arrays ? new Uint16Array(32) : zero_fill_array(32);\n\tfor(i = 0; i < 32; ++i) bl_count[i] = 0;\n\n\tfor(i = L; i < MAX; ++i) clens[i] = 0;\n\tL = clens.length;\n\n\tvar ctree = use_typed_arrays ? new Uint16Array(L) : zero_fill_array(L); // []\n\n\t/* build code tree */\n\tfor(i = 0; i < L; ++i) {\n\t\tbl_count[(w = clens[i])]++;\n\t\tif(maxlen < w) maxlen = w;\n\t\tctree[i] = 0;\n\t}\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) bl_count[i+16] = (ccode = (ccode + bl_count[i-1])<<1);\n\tfor(i = 0; i < L; ++i) {\n\t\tccode = clens[i];\n\t\tif(ccode != 0) ctree[i] = bl_count[ccode+16]++;\n\t}\n\n\t/* cmap[maxlen + 4 bits] = (off&15) + (lit<<4) reverse mapping */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bit_swap_n(ctree[i], maxlen)>>(maxlen-cleni);\n\t\t\tfor(j = (1<<(maxlen + 4 - cleni)) - 1; j>=0; --j)\n\t\t\t\tcmap[ccode|(j<*/ = [];\n\tvar i = 0;\n\tfor(;i<32; i++) dlens.push(5);\n\tbuild_tree(dlens, fix_dmap, 32);\n\n\tvar clens/*:Array*/ = [];\n\ti = 0;\n\tfor(; i<=143; i++) clens.push(8);\n\tfor(; i<=255; i++) clens.push(9);\n\tfor(; i<=279; i++) clens.push(7);\n\tfor(; i<=287; i++) clens.push(8);\n\tbuild_tree(clens, fix_lmap, 288);\n})();var _deflateRaw = /*#__PURE__*/(function _deflateRawIIFE() {\n\tvar DST_LN_RE = use_typed_arrays ? new Uint8Array(0x8000) : [];\n\tvar j = 0, k = 0;\n\tfor(; j < DST_LN.length - 1; ++j) {\n\t\tfor(; k < DST_LN[j+1]; ++k) DST_LN_RE[k] = j;\n\t}\n\tfor(;k < 32768; ++k) DST_LN_RE[k] = 29;\n\n\tvar LEN_LN_RE = use_typed_arrays ? new Uint8Array(0x103) : [];\n\tfor(j = 0, k = 0; j < LEN_LN.length - 1; ++j) {\n\t\tfor(; k < LEN_LN[j+1]; ++k) LEN_LN_RE[k] = j;\n\t}\n\n\tfunction write_stored(data, out) {\n\t\tvar boff = 0;\n\t\twhile(boff < data.length) {\n\t\t\tvar L = Math.min(0xFFFF, data.length - boff);\n\t\t\tvar h = boff + L == data.length;\n\t\t\tout.write_shift(1, +h);\n\t\t\tout.write_shift(2, L);\n\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t}\n\t\treturn out.l;\n\t}\n\n\t/* Fixed Huffman */\n\tfunction write_huff_fixed(data, out) {\n\t\tvar bl = 0;\n\t\tvar boff = 0;\n\t\tvar addrs = use_typed_arrays ? new Uint16Array(0x8000) : [];\n\t\twhile(boff < data.length) {\n\t\t\tvar L = /* data.length - boff; */ Math.min(0xFFFF, data.length - boff);\n\n\t\t\t/* write a stored block for short data */\n\t\t\tif(L < 10) {\n\t\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length)); // jshint ignore:line\n\t\t\t\tif(bl & 7) bl += 8 - (bl & 7);\n\t\t\t\tout.l = (bl / 8) | 0;\n\t\t\t\tout.write_shift(2, L);\n\t\t\t\tout.write_shift(2, (~L) & 0xFFFF);\n\t\t\t\twhile(L-- > 0) out[out.l++] = data[boff++];\n\t\t\t\tbl = out.l * 8;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tbl = write_bits_3(out, bl, +!!(boff + L == data.length) + 2); // jshint ignore:line\n\t\t\tvar hash = 0;\n\t\t\twhile(L-- > 0) {\n\t\t\t\tvar d = data[boff];\n\t\t\t\thash = ((hash << 5) ^ d) & 0x7FFF;\n\n\t\t\t\tvar match = -1, mlen = 0;\n\n\t\t\t\tif((match = addrs[hash])) {\n\t\t\t\t\tmatch |= boff & ~0x7FFF;\n\t\t\t\t\tif(match > boff) match -= 0x8000;\n\t\t\t\t\tif(match < boff) while(data[match + mlen] == data[boff + mlen] && mlen < 250) ++mlen;\n\t\t\t\t}\n\n\t\t\t\tif(mlen > 2) {\n\t\t\t\t\t/* Copy Token */\n\t\t\t\t\td = LEN_LN_RE[mlen];\n\t\t\t\t\tif(d <= 22) bl = write_bits_8(out, bl, bitswap8[d+1]>>1) - 1;\n\t\t\t\t\telse {\n\t\t\t\t\t\twrite_bits_8(out, bl, 3);\n\t\t\t\t\t\tbl += 5;\n\t\t\t\t\t\twrite_bits_8(out, bl, bitswap8[d-23]>>5);\n\t\t\t\t\t\tbl += 3;\n\t\t\t\t\t}\n\t\t\t\t\tvar len_eb = (d < 8) ? 0 : ((d - 4)>>2);\n\t\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, mlen - LEN_LN[d]);\n\t\t\t\t\t\tbl += len_eb;\n\t\t\t\t\t}\n\n\t\t\t\t\td = DST_LN_RE[boff - match];\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]>>3);\n\t\t\t\t\tbl -= 3;\n\n\t\t\t\t\tvar dst_eb = d < 4 ? 0 : (d-2)>>1;\n\t\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\t\twrite_bits_16(out, bl, boff - match - DST_LN[d]);\n\t\t\t\t\t\tbl += dst_eb;\n\t\t\t\t\t}\n\t\t\t\t\tfor(var q = 0; q < mlen; ++q) {\n\t\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t\thash = ((hash << 5) ^ data[boff]) & 0x7FFF;\n\t\t\t\t\t\t++boff;\n\t\t\t\t\t}\n\t\t\t\t\tL-= mlen - 1;\n\t\t\t\t} else {\n\t\t\t\t\t/* Literal Token */\n\t\t\t\t\tif(d <= 143) d = d + 48;\n\t\t\t\t\telse bl = write_bits_1(out, bl, 1);\n\t\t\t\t\tbl = write_bits_8(out, bl, bitswap8[d]);\n\t\t\t\t\taddrs[hash] = boff & 0x7FFF;\n\t\t\t\t\t++boff;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tbl = write_bits_8(out, bl, 0) - 1;\n\t\t}\n\t\tout.l = ((bl + 7)/8)|0;\n\t\treturn out.l;\n\t}\n\treturn function _deflateRaw(data, out) {\n\t\tif(data.length < 8) return write_stored(data, out);\n\t\treturn write_huff_fixed(data, out);\n\t};\n})();\n\nfunction _deflate(data) {\n\tvar buf = new_buf(50+Math.floor(data.length*1.1));\n\tvar off = _deflateRaw(data, buf);\n\treturn buf.slice(0, off);\n}\n/* modified inflate function also moves original read head */\n\nvar dyn_lmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_dmap = use_typed_arrays ? new Uint16Array(32768) : zero_fill_array(32768);\nvar dyn_cmap = use_typed_arrays ? new Uint16Array(128) : zero_fill_array(128);\nvar dyn_len_1 = 1, dyn_len_2 = 1;\n\n/* 5.5.3 Expanding Huffman Codes */\nfunction dyn(data, boff/*:number*/) {\n\t/* nomenclature from RFC1951 refers to bit values; these are offset by the implicit constant */\n\tvar _HLIT = read_bits_5(data, boff) + 257; boff += 5;\n\tvar _HDIST = read_bits_5(data, boff) + 1; boff += 5;\n\tvar _HCLEN = read_bits_4(data, boff) + 4; boff += 4;\n\tvar w = 0;\n\n\t/* grab and store code lengths */\n\tvar clens = use_typed_arrays ? new Uint8Array(19) : zero_fill_array(19);\n\tvar ctree = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];\n\tvar maxlen = 1;\n\tvar bl_count = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar next_code = use_typed_arrays ? new Uint8Array(8) : zero_fill_array(8);\n\tvar L = clens.length; /* 19 */\n\tfor(var i = 0; i < _HCLEN; ++i) {\n\t\tclens[CLEN_ORDER[i]] = w = read_bits_3(data, boff);\n\t\tif(maxlen < w) maxlen = w;\n\t\tbl_count[w]++;\n\t\tboff += 3;\n\t}\n\n\t/* build code tree */\n\tvar ccode = 0;\n\tbl_count[0] = 0;\n\tfor(i = 1; i <= maxlen; ++i) next_code[i] = ccode = (ccode + bl_count[i-1])<<1;\n\tfor(i = 0; i < L; ++i) if((ccode = clens[i]) != 0) ctree[i] = next_code[ccode]++;\n\t/* cmap[7 bits from stream] = (off&7) + (lit<<3) */\n\tvar cleni = 0;\n\tfor(i = 0; i < L; ++i) {\n\t\tcleni = clens[i];\n\t\tif(cleni != 0) {\n\t\t\tccode = bitswap8[ctree[i]]>>(8-cleni);\n\t\t\tfor(var j = (1<<(7-cleni))-1; j>=0; --j) dyn_cmap[ccode|(j<*/ = [];\n\tmaxlen = 1;\n\tfor(; hcodes.length < _HLIT + _HDIST;) {\n\t\tccode = dyn_cmap[read_bits_7(data, boff)];\n\t\tboff += ccode & 7;\n\t\tswitch((ccode >>>= 3)) {\n\t\t\tcase 16:\n\t\t\t\tw = 3 + read_bits_2(data, boff); boff += 2;\n\t\t\t\tccode = hcodes[hcodes.length - 1];\n\t\t\t\twhile(w-- > 0) hcodes.push(ccode);\n\t\t\t\tbreak;\n\t\t\tcase 17:\n\t\t\t\tw = 3 + read_bits_3(data, boff); boff += 3;\n\t\t\t\twhile(w-- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tcase 18:\n\t\t\t\tw = 11 + read_bits_7(data, boff); boff += 7;\n\t\t\t\twhile(w -- > 0) hcodes.push(0);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\thcodes.push(ccode);\n\t\t\t\tif(maxlen < ccode) maxlen = ccode;\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* build literal / length trees */\n\tvar h1 = hcodes.slice(0, _HLIT), h2 = hcodes.slice(_HLIT);\n\tfor(i = _HLIT; i < 286; ++i) h1[i] = 0;\n\tfor(i = _HDIST; i < 30; ++i) h2[i] = 0;\n\tdyn_len_1 = build_tree(h1, dyn_lmap, 286);\n\tdyn_len_2 = build_tree(h2, dyn_dmap, 30);\n\treturn boff;\n}\n\n/* return [ data, bytesRead ] */\nfunction inflate(data, usz/*:number*/) {\n\t/* shortcircuit for empty buffer [0x03, 0x00] */\n\tif(data[0] == 3 && !(data[1] & 0x3)) { return [new_raw_buf(usz), 2]; }\n\n\t/* bit offset */\n\tvar boff = 0;\n\n\t/* header includes final bit and type bits */\n\tvar header = 0;\n\n\tvar outbuf = new_unsafe_buf(usz ? usz : (1<<18));\n\tvar woff = 0;\n\tvar OL = outbuf.length>>>0;\n\tvar max_len_1 = 0, max_len_2 = 0;\n\n\twhile((header&1) == 0) {\n\t\theader = read_bits_3(data, boff); boff += 3;\n\t\tif((header >>> 1) == 0) {\n\t\t\t/* Stored block */\n\t\t\tif(boff & 7) boff += 8 - (boff&7);\n\t\t\t/* 2 bytes sz, 2 bytes bit inverse */\n\t\t\tvar sz = data[boff>>>3] | data[(boff>>>3)+1]<<8;\n\t\t\tboff += 32;\n\t\t\t/* push sz bytes */\n\t\t\tif(sz > 0) {\n\t\t\t\tif(!usz && OL < woff + sz) { outbuf = realloc(outbuf, woff + sz); OL = outbuf.length; }\n\t\t\t\twhile(sz-- > 0) { outbuf[woff++] = data[boff>>>3]; boff += 8; }\n\t\t\t}\n\t\t\tcontinue;\n\t\t} else if((header >> 1) == 1) {\n\t\t\t/* Fixed Huffman */\n\t\t\tmax_len_1 = 9; max_len_2 = 5;\n\t\t} else {\n\t\t\t/* Dynamic Huffman */\n\t\t\tboff = dyn(data, boff);\n\t\t\tmax_len_1 = dyn_len_1; max_len_2 = dyn_len_2;\n\t\t}\n\t\tfor(;;) { // while(true) is apparently out of vogue in modern JS circles\n\t\t\tif(!usz && (OL < woff + 32767)) { outbuf = realloc(outbuf, woff + 32767); OL = outbuf.length; }\n\t\t\t/* ingest code and move read head */\n\t\t\tvar bits = read_bits_n(data, boff, max_len_1);\n\t\t\tvar code = (header>>>1) == 1 ? fix_lmap[bits] : dyn_lmap[bits];\n\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t/* 0-255 are literals, 256 is end of block token, 257+ are copy tokens */\n\t\t\tif(((code>>>8)&0xFF) === 0) outbuf[woff++] = code;\n\t\t\telse if(code == 256) break;\n\t\t\telse {\n\t\t\t\tcode -= 257;\n\t\t\t\tvar len_eb = (code < 8) ? 0 : ((code-4)>>2); if(len_eb > 5) len_eb = 0;\n\t\t\t\tvar tgt = woff + LEN_LN[code];\n\t\t\t\t/* length extra bits */\n\t\t\t\tif(len_eb > 0) {\n\t\t\t\t\ttgt += read_bits_n(data, boff, len_eb);\n\t\t\t\t\tboff += len_eb;\n\t\t\t\t}\n\n\t\t\t\t/* dist code */\n\t\t\t\tbits = read_bits_n(data, boff, max_len_2);\n\t\t\t\tcode = (header>>>1) == 1 ? fix_dmap[bits] : dyn_dmap[bits];\n\t\t\t\tboff += code & 15; code >>>= 4;\n\t\t\t\tvar dst_eb = (code < 4 ? 0 : (code-2)>>1);\n\t\t\t\tvar dst = DST_LN[code];\n\t\t\t\t/* dist extra bits */\n\t\t\t\tif(dst_eb > 0) {\n\t\t\t\t\tdst += read_bits_n(data, boff, dst_eb);\n\t\t\t\t\tboff += dst_eb;\n\t\t\t\t}\n\n\t\t\t\t/* in the common case, manual byte copy is faster than TA set / Buffer copy */\n\t\t\t\tif(!usz && OL < tgt) { outbuf = realloc(outbuf, tgt + 100); OL = outbuf.length; }\n\t\t\t\twhile(woff < tgt) { outbuf[woff] = outbuf[woff - dst]; ++woff; }\n\t\t\t}\n\t\t}\n\t}\n\tif(usz) return [outbuf, (boff+7)>>>3];\n\treturn [outbuf.slice(0, woff), (boff+7)>>>3];\n}\n\nfunction _inflate(payload, usz) {\n\tvar data = payload.slice(payload.l||0);\n\tvar out = inflate(data, usz);\n\tpayload.l += out[1];\n\treturn out[0];\n}\n\nfunction warn_or_throw(wrn, msg) {\n\tif(wrn) { if(typeof console !== 'undefined') console.error(msg); }\n\telse throw new Error(msg);\n}\n\nfunction parse_zip(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {\n\tvar blob/*:CFBlob*/ = /*::(*/file/*:: :any)*/;\n\tprep_blob(blob, 0);\n\n\tvar FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o, { root: options.root });\n\n\t/* find end of central directory, start just after signature */\n\tvar i = blob.length - 4;\n\twhile((blob[i] != 0x50 || blob[i+1] != 0x4b || blob[i+2] != 0x05 || blob[i+3] != 0x06) && i >= 0) --i;\n\tblob.l = i + 4;\n\n\t/* parse end of central directory */\n\tblob.l += 4;\n\tvar fcnt = blob.read_shift(2);\n\tblob.l += 6;\n\tvar start_cd = blob.read_shift(4);\n\n\t/* parse central directory */\n\tblob.l = start_cd;\n\n\tfor(i = 0; i < fcnt; ++i) {\n\t\t/* trust local file header instead of CD entry */\n\t\tblob.l += 20;\n\t\tvar csz = blob.read_shift(4);\n\t\tvar usz = blob.read_shift(4);\n\t\tvar namelen = blob.read_shift(2);\n\t\tvar efsz = blob.read_shift(2);\n\t\tvar fcsz = blob.read_shift(2);\n\t\tblob.l += 8;\n\t\tvar offset = blob.read_shift(4);\n\t\tvar EF = parse_extra_field(/*::(*/blob.slice(blob.l+namelen, blob.l+namelen+efsz)/*:: :any)*/);\n\t\tblob.l += namelen + efsz + fcsz;\n\n\t\tvar L = blob.l;\n\t\tblob.l = offset + 4;\n\t\tparse_local_file(blob, csz, usz, o, EF);\n\t\tblob.l = L;\n\t}\n\treturn o;\n}\n\n\n/* head starts just after local file header signature */\nfunction parse_local_file(blob/*:CFBlob*/, csz/*:number*/, usz/*:number*/, o/*:CFBContainer*/, EF) {\n\t/* [local file header] */\n\tblob.l += 2;\n\tvar flags = blob.read_shift(2);\n\tvar meth = blob.read_shift(2);\n\tvar date = parse_dos_date(blob);\n\n\tif(flags & 0x2041) throw new Error(\"Unsupported ZIP encryption\");\n\tvar crc32 = blob.read_shift(4);\n\tvar _csz = blob.read_shift(4);\n\tvar _usz = blob.read_shift(4);\n\n\tvar namelen = blob.read_shift(2);\n\tvar efsz = blob.read_shift(2);\n\n\t// TODO: flags & (1<<11) // UTF8\n\tvar name = \"\"; for(var i = 0; i < namelen; ++i) name += String.fromCharCode(blob[blob.l++]);\n\tif(efsz) {\n\t\tvar ef = parse_extra_field(/*::(*/blob.slice(blob.l, blob.l + efsz)/*:: :any)*/);\n\t\tif((ef[0x5455]||{}).mt) date = ef[0x5455].mt;\n\t\tif(((EF||{})[0x5455]||{}).mt) date = EF[0x5455].mt;\n\t}\n\tblob.l += efsz;\n\n\t/* [encryption header] */\n\n\t/* [file data] */\n\tvar data = blob.slice(blob.l, blob.l + _csz);\n\tswitch(meth) {\n\t\tcase 8: data = _inflateRawSync(blob, _usz); break;\n\t\tcase 0: break; // TODO: scan for magic number\n\t\tdefault: throw new Error(\"Unsupported ZIP Compression method \" + meth);\n\t}\n\n\t/* [data descriptor] */\n\tvar wrn = false;\n\tif(flags & 8) {\n\t\tcrc32 = blob.read_shift(4);\n\t\tif(crc32 == 0x08074b50) { crc32 = blob.read_shift(4); wrn = true; }\n\t\t_csz = blob.read_shift(4);\n\t\t_usz = blob.read_shift(4);\n\t}\n\n\tif(_csz != csz) warn_or_throw(wrn, \"Bad compressed size: \" + csz + \" != \" + _csz);\n\tif(_usz != usz) warn_or_throw(wrn, \"Bad uncompressed size: \" + usz + \" != \" + _usz);\n\t//var _crc32 = CRC32.buf(data, 0);\n\t//if((crc32>>0) != (_crc32>>0)) warn_or_throw(wrn, \"Bad CRC32 checksum: \" + crc32 + \" != \" + _crc32);\n\tcfb_add(o, name, data, {unsafe: true, mt: date});\n}\nfunction write_zip(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:RawBytes*/ {\n\tvar _opts = options || {};\n\tvar out = [], cdirs = [];\n\tvar o/*:CFBlob*/ = new_buf(1);\n\tvar method = (_opts.compression ? 8 : 0), flags = 0;\n\tvar desc = false;\n\tif(desc) flags |= 8;\n\tvar i = 0, j = 0;\n\n\tvar start_cd = 0, fcnt = 0;\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tvar crcs = [];\n\tvar sz_cd = 0;\n\n\tfor(i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length); fi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\t\tvar start = start_cd;\n\n\t\t/* TODO: CP437 filename */\n\t\tvar namebuf = new_buf(fp.length);\n\t\tfor(j = 0; j < fp.length; ++j) namebuf.write_shift(1, fp.charCodeAt(j) & 0x7F);\n\t\tnamebuf = namebuf.slice(0, namebuf.l);\n\t\tcrcs[fcnt] = CRC32.buf(/*::((*/fi.content/*::||[]):any)*/, 0);\n\n\t\tvar outbuf = fi.content/*::||[]*/;\n\t\tif(method == 8) outbuf = _deflateRawSync(outbuf);\n\n\t\t/* local file header */\n\t\to = new_buf(30);\n\t\to.write_shift(4, 0x04034b50);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\t/* TODO: last mod file time/date */\n\t\tif(fi.mt) write_dos_date(o, fi.mt);\n\t\telse o.write_shift(4, 0);\n\t\to.write_shift(-4, (flags & 8) ? 0 : crcs[fcnt]);\n\t\to.write_shift(4, (flags & 8) ? 0 : outbuf.length);\n\t\to.write_shift(4, (flags & 8) ? 0 : /*::(*/fi.content/*::||[])*/.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\n\t\tstart_cd += o.length;\n\t\tout.push(o);\n\t\tstart_cd += namebuf.length;\n\t\tout.push(namebuf);\n\n\t\t/* TODO: extra fields? */\n\n\t\t/* TODO: encryption header ? */\n\n\t\tstart_cd += outbuf.length;\n\t\tout.push(outbuf);\n\n\t\t/* data descriptor */\n\t\tif(flags & 8) {\n\t\t\to = new_buf(12);\n\t\t\to.write_shift(-4, crcs[fcnt]);\n\t\t\to.write_shift(4, outbuf.length);\n\t\t\to.write_shift(4, /*::(*/fi.content/*::||[])*/.length);\n\t\t\tstart_cd += o.l;\n\t\t\tout.push(o);\n\t\t}\n\n\t\t/* central directory */\n\t\to = new_buf(46);\n\t\to.write_shift(4, 0x02014b50);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 20);\n\t\to.write_shift(2, flags);\n\t\to.write_shift(2, method);\n\t\to.write_shift(4, 0); /* TODO: last mod file time/date */\n\t\to.write_shift(-4, crcs[fcnt]);\n\n\t\to.write_shift(4, outbuf.length);\n\t\to.write_shift(4, /*::(*/fi.content/*::||[])*/.length);\n\t\to.write_shift(2, namebuf.length);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(4, 0);\n\t\to.write_shift(4, start);\n\n\t\tsz_cd += o.l;\n\t\tcdirs.push(o);\n\t\tsz_cd += namebuf.length;\n\t\tcdirs.push(namebuf);\n\t\t++fcnt;\n\t}\n\n\t/* end of central directory */\n\to = new_buf(22);\n\to.write_shift(4, 0x06054b50);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, fcnt);\n\to.write_shift(2, fcnt);\n\to.write_shift(4, sz_cd);\n\to.write_shift(4, start_cd);\n\to.write_shift(2, 0);\n\n\treturn bconcat(([bconcat((out/*:any*/)), bconcat(cdirs), o]/*:any*/));\n}\nvar ContentTypeMap = ({\n\t\"htm\": \"text/html\",\n\t\"xml\": \"text/xml\",\n\n\t\"gif\": \"image/gif\",\n\t\"jpg\": \"image/jpeg\",\n\t\"png\": \"image/png\",\n\n\t\"mso\": \"application/x-mso\",\n\t\"thmx\": \"application/vnd.ms-officetheme\",\n\t\"sh33tj5\": \"application/octet-stream\"\n}/*:any*/);\n\nfunction get_content_type(fi/*:CFBEntry*/, fp/*:string*/)/*:string*/ {\n\tif(fi.ctype) return fi.ctype;\n\n\tvar ext = fi.name || \"\", m = ext.match(/\\.([^\\.]+)$/);\n\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\n\tif(fp) {\n\t\tm = (ext = fp).match(/[\\.\\\\]([^\\.\\\\])+$/);\n\t\tif(m && ContentTypeMap[m[1]]) return ContentTypeMap[m[1]];\n\t}\n\n\treturn \"application/octet-stream\";\n}\n\n/* 76 character chunks TODO: intertwine encoding */\nfunction write_base64_76(bstr/*:string*/)/*:string*/ {\n\tvar data = Base64_encode(bstr);\n\tvar o = [];\n\tfor(var i = 0; i < data.length; i+= 76) o.push(data.slice(i, i+76));\n\treturn o.join(\"\\r\\n\") + \"\\r\\n\";\n}\n\n/*\nRules for QP:\n\t- escape =## applies for all non-display characters and literal \"=\"\n\t- space or tab at end of line must be encoded\n\t- \\r\\n newlines can be preserved, but bare \\r and \\n must be escaped\n\t- lines must not exceed 76 characters, use soft breaks =\\r\\n\n\nTODO: Some files from word appear to write line extensions with bare equals:\n\n```\n*/ = [], split = encoded.split(\"\\r\\n\");\n\tfor(var si = 0; si < split.length; ++si) {\n\t\tvar str = split[si];\n\t\tif(str.length == 0) { o.push(\"\"); continue; }\n\t\tfor(var i = 0; i < str.length;) {\n\t\t\tvar end = 76;\n\t\t\tvar tmp = str.slice(i, i + end);\n\t\t\tif(tmp.charAt(end - 1) == \"=\") end --;\n\t\t\telse if(tmp.charAt(end - 2) == \"=\") end -= 2;\n\t\t\telse if(tmp.charAt(end - 3) == \"=\") end -= 3;\n\t\t\ttmp = str.slice(i, i + end);\n\t\t\ti += end;\n\t\t\tif(i < str.length) tmp += \"=\";\n\t\t\to.push(tmp);\n\t\t}\n\t}\n\n\treturn o.join(\"\\r\\n\");\n}\nfunction parse_quoted_printable(data/*:Array*/)/*:RawBytes*/ {\n\tvar o = [];\n\n\t/* unify long lines */\n\tfor(var di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\twhile(di <= data.length && line.charAt(line.length - 1) == \"=\") line = line.slice(0, line.length - 1) + data[++di];\n\t\to.push(line);\n\t}\n\n\t/* decode */\n\tfor(var oi = 0; oi < o.length; ++oi) o[oi] = o[oi].replace(/[=][0-9A-Fa-f]{2}/g, function($$) { return String.fromCharCode(parseInt($$.slice(1), 16)); });\n\treturn s2a(o.join(\"\\r\\n\"));\n}\n\n\nfunction parse_mime(cfb/*:CFBContainer*/, data/*:Array*/, root/*:string*/)/*:void*/ {\n\tvar fname = \"\", cte = \"\", ctype = \"\", fdata;\n\tvar di = 0;\n\tfor(;di < 10; ++di) {\n\t\tvar line = data[di];\n\t\tif(!line || line.match(/^\\s*$/)) break;\n\t\tvar m = line.match(/^(.*?):\\s*([^\\s].*)$/);\n\t\tif(m) switch(m[1].toLowerCase()) {\n\t\t\tcase \"content-location\": fname = m[2].trim(); break;\n\t\t\tcase \"content-type\": ctype = m[2].trim(); break;\n\t\t\tcase \"content-transfer-encoding\": cte = m[2].trim(); break;\n\t\t}\n\t}\n\t++di;\n\tswitch(cte.toLowerCase()) {\n\t\tcase 'base64': fdata = s2a(Base64_decode(data.slice(di).join(\"\"))); break;\n\t\tcase 'quoted-printable': fdata = parse_quoted_printable(data.slice(di)); break;\n\t\tdefault: throw new Error(\"Unsupported Content-Transfer-Encoding \" + cte);\n\t}\n\tvar file = cfb_add(cfb, fname.slice(root.length), fdata, {unsafe: true});\n\tif(ctype) file.ctype = ctype;\n}\n\nfunction parse_mad(file/*:RawBytes*/, options/*:CFBReadOpts*/)/*:CFBContainer*/ {\n\tif(a2s(file.slice(0,13)).toLowerCase() != \"mime-version:\") throw new Error(\"Unsupported MAD header\");\n\tvar root = (options && options.root || \"\");\n\t// $FlowIgnore\n\tvar data = (has_buf && Buffer.isBuffer(file) ? file.toString(\"binary\") : a2s(file)).split(\"\\r\\n\");\n\tvar di = 0, row = \"\";\n\n\t/* if root is not specified, scan for the common prefix */\n\tfor(di = 0; di < data.length; ++di) {\n\t\trow = data[di];\n\t\tif(!/^Content-Location:/i.test(row)) continue;\n\t\trow = row.slice(row.indexOf(\"file\"));\n\t\tif(!root) root = row.slice(0, row.lastIndexOf(\"/\") + 1);\n\t\tif(row.slice(0, root.length) == root) continue;\n\t\twhile(root.length > 0) {\n\t\t\troot = root.slice(0, root.length - 1);\n\t\t\troot = root.slice(0, root.lastIndexOf(\"/\") + 1);\n\t\t\tif(row.slice(0,root.length) == root) break;\n\t\t}\n\t}\n\n\tvar mboundary = (data[1] || \"\").match(/boundary=\"(.*?)\"/);\n\tif(!mboundary) throw new Error(\"MAD cannot find boundary\");\n\tvar boundary = \"--\" + (mboundary[1] || \"\");\n\n\tvar FileIndex/*:CFBFileIndex*/ = [], FullPaths/*:Array*/ = [];\n\tvar o = {\n\t\tFileIndex: FileIndex,\n\t\tFullPaths: FullPaths\n\t};\n\tinit_cfb(o);\n\tvar start_di, fcnt = 0;\n\tfor(di = 0; di < data.length; ++di) {\n\t\tvar line = data[di];\n\t\tif(line !== boundary && line !== boundary + \"--\") continue;\n\t\tif(fcnt++) parse_mime(o, data.slice(start_di, di), root);\n\t\tstart_di = di;\n\t}\n\treturn o;\n}\n\nfunction write_mad(cfb/*:CFBContainer*/, options/*:CFBWriteOpts*/)/*:string*/ {\n\tvar opts = options || {};\n\tvar boundary = opts.boundary || \"SheetJS\";\n\tboundary = '------=' + boundary;\n\n\tvar out = [\n\t\t'MIME-Version: 1.0',\n\t\t'Content-Type: multipart/related; boundary=\"' + boundary.slice(2) + '\"',\n\t\t'',\n\t\t'',\n\t\t''\n\t];\n\n\tvar root = cfb.FullPaths[0], fp = root, fi = cfb.FileIndex[0];\n\tfor(var i = 1; i < cfb.FullPaths.length; ++i) {\n\t\tfp = cfb.FullPaths[i].slice(root.length);\n\t\tfi = cfb.FileIndex[i];\n\t\tif(!fi.size || !fi.content || fp == \"\\u0001Sh33tJ5\") continue;\n\n\t\t/* Normalize filename */\n\t\tfp = fp.replace(/[\\x00-\\x08\\x0B\\x0C\\x0E-\\x1F\\x7E-\\xFF]/g, function(c) {\n\t\t\treturn \"_x\" + c.charCodeAt(0).toString(16) + \"_\";\n\t\t}).replace(/[\\u0080-\\uFFFF]/g, function(u) {\n\t\t\treturn \"_u\" + u.charCodeAt(0).toString(16) + \"_\";\n\t\t});\n\n\t\t/* Extract content as binary string */\n\t\tvar ca = fi.content;\n\t\t// $FlowIgnore\n\t\tvar cstr = has_buf && Buffer.isBuffer(ca) ? ca.toString(\"binary\") : a2s(ca);\n\n\t\t/* 4/5 of first 1024 chars ascii -> quoted printable, else base64 */\n\t\tvar dispcnt = 0, L = Math.min(1024, cstr.length), cc = 0;\n\t\tfor(var csl = 0; csl <= L; ++csl) if((cc=cstr.charCodeAt(csl)) >= 0x20 && cc < 0x80) ++dispcnt;\n\t\tvar qp = dispcnt >= L * 4 / 5;\n\n\t\tout.push(boundary);\n\t\tout.push('Content-Location: ' + (opts.root || 'file:///C:/SheetJS/') + fp);\n\t\tout.push('Content-Transfer-Encoding: ' + (qp ? 'quoted-printable' : 'base64'));\n\t\tout.push('Content-Type: ' + get_content_type(fi, fp));\n\t\tout.push('');\n\n\t\tout.push(qp ? write_quoted_printable(cstr) : write_base64_76(cstr));\n\t}\n\tout.push(boundary + '--\\r\\n');\n\treturn out.join(\"\\r\\n\");\n}\nfunction cfb_new(opts/*:?any*/)/*:CFBContainer*/ {\n\tvar o/*:CFBContainer*/ = ({}/*:any*/);\n\tinit_cfb(o, opts);\n\treturn o;\n}\n\nfunction cfb_add(cfb/*:CFBContainer*/, name/*:string*/, content/*:?RawBytes*/, opts/*:?any*/)/*:CFBEntry*/ {\n\tvar unsafe = opts && opts.unsafe;\n\tif(!unsafe) init_cfb(cfb);\n\tvar file = !unsafe && CFB.find(cfb, name);\n\tif(!file) {\n\t\tvar fpath/*:string*/ = cfb.FullPaths[0];\n\t\tif(name.slice(0, fpath.length) == fpath) fpath = name;\n\t\telse {\n\t\t\tif(fpath.slice(-1) != \"/\") fpath += \"/\";\n\t\t\tfpath = (fpath + name).replace(\"//\",\"/\");\n\t\t}\n\t\tfile = ({name: filename(name), type: 2}/*:any*/);\n\t\tcfb.FileIndex.push(file);\n\t\tcfb.FullPaths.push(fpath);\n\t\tif(!unsafe) CFB.utils.cfb_gc(cfb);\n\t}\n\t/*:: if(!file) throw new Error(\"unreachable\"); */\n\tfile.content = (content/*:any*/);\n\tfile.size = content ? content.length : 0;\n\tif(opts) {\n\t\tif(opts.CLSID) file.clsid = opts.CLSID;\n\t\tif(opts.mt) file.mt = opts.mt;\n\t\tif(opts.ct) file.ct = opts.ct;\n\t}\n\treturn file;\n}\n\nfunction cfb_del(cfb/*:CFBContainer*/, name/*:string*/)/*:boolean*/ {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex.splice(j, 1);\n\t\tcfb.FullPaths.splice(j, 1);\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_mov(cfb/*:CFBContainer*/, old_name/*:string*/, new_name/*:string*/)/*:boolean*/ {\n\tinit_cfb(cfb);\n\tvar file = CFB.find(cfb, old_name);\n\tif(file) for(var j = 0; j < cfb.FileIndex.length; ++j) if(cfb.FileIndex[j] == file) {\n\t\tcfb.FileIndex[j].name = filename(new_name);\n\t\tcfb.FullPaths[j] = new_name;\n\t\treturn true;\n\t}\n\treturn false;\n}\n\nfunction cfb_gc(cfb/*:CFBContainer*/)/*:void*/ { rebuild_cfb(cfb, true); }\n\nexports.find = find;\nexports.read = read;\nexports.parse = parse;\nexports.write = write;\nexports.writeFile = write_file;\nexports.utils = {\n\tcfb_new: cfb_new,\n\tcfb_add: cfb_add,\n\tcfb_del: cfb_del,\n\tcfb_mov: cfb_mov,\n\tcfb_gc: cfb_gc,\n\tReadShift: ReadShift,\n\tCheckField: CheckField,\n\tprep_blob: prep_blob,\n\tbconcat: bconcat,\n\tuse_zlib: use_zlib,\n\t_deflateRaw: _deflate,\n\t_inflateRaw: _inflate,\n\tconsts: consts\n};\n\nreturn exports;\n})();\n\nlet _fs = void 0;\nfunction set_fs(fs) { _fs = fs; }\nexport { set_fs };\n\n/* normalize data for blob ctor */\nfunction blobify(data) {\n\tif(typeof data === \"string\") return s2ab(data);\n\tif(Array.isArray(data)) return a2u(data);\n\treturn data;\n}\n/* write or download file */\nfunction write_dl(fname/*:string*/, payload/*:any*/, enc/*:?string*/) {\n\t/*global IE_SaveFile, Blob, navigator, saveAs, document, File, chrome */\n\tif(typeof _fs !== 'undefined' && _fs.writeFileSync) return enc ? _fs.writeFileSync(fname, payload, enc) : _fs.writeFileSync(fname, payload);\n\tif(typeof Deno !== 'undefined') {\n\t\t/* in this spot, it's safe to assume typed arrays and TextEncoder/TextDecoder exist */\n\t\tif(enc && typeof payload == \"string\") switch(enc) {\n\t\t\tcase \"utf8\": payload = new TextEncoder(enc).encode(payload); break;\n\t\t\tcase \"binary\": payload = s2ab(payload); break;\n\t\t\t/* TODO: binary equivalent */\n\t\t\tdefault: throw new Error(\"Unsupported encoding \" + enc);\n\t\t}\n\t\treturn Deno.writeFileSync(fname, payload);\n\t}\n\tvar data = (enc == \"utf8\") ? utf8write(payload) : payload;\n\t/*:: declare var IE_SaveFile: any; */\n\tif(typeof IE_SaveFile !== 'undefined') return IE_SaveFile(data, fname);\n\tif(typeof Blob !== 'undefined') {\n\t\tvar blob = new Blob([blobify(data)], {type:\"application/octet-stream\"});\n\t\t/*:: declare var navigator: any; */\n\t\tif(typeof navigator !== 'undefined' && navigator.msSaveBlob) return navigator.msSaveBlob(blob, fname);\n\t\t/*:: declare var saveAs: any; */\n\t\tif(typeof saveAs !== 'undefined') return saveAs(blob, fname);\n\t\tif(typeof URL !== 'undefined' && typeof document !== 'undefined' && document.createElement && URL.createObjectURL) {\n\t\t\tvar url = URL.createObjectURL(blob);\n\t\t\t/*:: declare var chrome: any; */\n\t\t\tif(typeof chrome === 'object' && typeof (chrome.downloads||{}).download == \"function\") {\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn chrome.downloads.download({ url: url, filename: fname, saveAs: true});\n\t\t\t}\n\t\t\tvar a = document.createElement(\"a\");\n\t\t\tif(a.download != null) {\n\t\t\t\t/*:: if(document.body == null) throw new Error(\"unreachable\"); */\n\t\t\t\ta.download = fname; a.href = url; document.body.appendChild(a); a.click();\n\t\t\t\t/*:: if(document.body == null) throw new Error(\"unreachable\"); */ document.body.removeChild(a);\n\t\t\t\tif(URL.revokeObjectURL && typeof setTimeout !== 'undefined') setTimeout(function() { URL.revokeObjectURL(url); }, 60000);\n\t\t\t\treturn url;\n\t\t\t}\n\t\t}\n\t}\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar out = File(fname); out.open(\"w\"); out.encoding = \"binary\";\n\t\tif(Array.isArray(payload)) payload = a2s(payload);\n\t\tout.write(payload); out.close(); return payload;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"cannot save file \" + fname);\n}\n\n/* read binary data from file */\nfunction read_binary(path/*:string*/) {\n\tif(typeof _fs !== 'undefined') return _fs.readFileSync(path);\n\tif(typeof Deno !== 'undefined') return Deno.readFileSync(path);\n\t// $FlowIgnore\n\tif(typeof $ !== 'undefined' && typeof File !== 'undefined' && typeof Folder !== 'undefined') try { // extendscript\n\t\t// $FlowIgnore\n\t\tvar infile = File(path); infile.open(\"r\"); infile.encoding = \"binary\";\n\t\tvar data = infile.read(); infile.close();\n\t\treturn data;\n\t} catch(e) { if(!e.message || !e.message.match(/onstruct/)) throw e; }\n\tthrow new Error(\"Cannot access file \" + path);\n}\nfunction keys(o/*:any*/)/*:Array*/ {\n\tvar ks = Object.keys(o), o2 = [];\n\tfor(var i = 0; i < ks.length; ++i) if(Object.prototype.hasOwnProperty.call(o, ks[i])) o2.push(ks[i]);\n\treturn o2;\n}\n\nfunction evert_key(obj/*:any*/, key/*:string*/)/*:EvertType*/ {\n\tvar o = ([]/*:any*/), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) if(o[obj[K[i]][key]] == null) o[obj[K[i]][key]] = K[i];\n\treturn o;\n}\n\nfunction evert(obj/*:any*/)/*:EvertType*/ {\n\tvar o = ([]/*:any*/), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = K[i];\n\treturn o;\n}\n\nfunction evert_num(obj/*:any*/)/*:EvertNumType*/ {\n\tvar o = ([]/*:any*/), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) o[obj[K[i]]] = parseInt(K[i],10);\n\treturn o;\n}\n\nfunction evert_arr(obj/*:any*/)/*:EvertArrType*/ {\n\tvar o/*:EvertArrType*/ = ([]/*:any*/), K = keys(obj);\n\tfor(var i = 0; i !== K.length; ++i) {\n\t\tif(o[obj[K[i]]] == null) o[obj[K[i]]] = [];\n\t\to[obj[K[i]]].push(K[i]);\n\t}\n\treturn o;\n}\n\nvar basedate = /*#__PURE__*/new Date(1899, 11, 30, 0, 0, 0); // 2209161600000\nfunction datenum(v/*:Date*/, date1904/*:?boolean*/)/*:number*/ {\n\tvar epoch = /*#__PURE__*/v.getTime();\n\tif(date1904) epoch -= 1462*24*60*60*1000;\n\tvar dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/v.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000;\n\treturn (epoch - dnthresh) / (24 * 60 * 60 * 1000);\n}\nvar refdate = /*#__PURE__*/new Date();\nvar dnthresh = /*#__PURE__*/basedate.getTime() + (/*#__PURE__*/refdate.getTimezoneOffset() - /*#__PURE__*/basedate.getTimezoneOffset()) * 60000;\nvar refoffset = /*#__PURE__*/refdate.getTimezoneOffset();\nfunction numdate(v/*:number*/)/*:Date*/ {\n\tvar out = new Date();\n\tout.setTime(v * 24 * 60 * 60 * 1000 + dnthresh);\n\tif (out.getTimezoneOffset() !== refoffset) {\n\t\tout.setTime(out.getTime() + (out.getTimezoneOffset() - refoffset) * 60000);\n\t}\n\treturn out;\n}\n\n/* ISO 8601 Duration */\nfunction parse_isodur(s) {\n\tvar sec = 0, mt = 0, time = false;\n\tvar m = s.match(/P([0-9\\.]+Y)?([0-9\\.]+M)?([0-9\\.]+D)?T([0-9\\.]+H)?([0-9\\.]+M)?([0-9\\.]+S)?/);\n\tif(!m) throw new Error(\"|\" + s + \"| is not an ISO8601 Duration\");\n\tfor(var i = 1; i != m.length; ++i) {\n\t\tif(!m[i]) continue;\n\t\tmt = 1;\n\t\tif(i > 3) time = true;\n\t\tswitch(m[i].slice(m[i].length-1)) {\n\t\t\tcase 'Y':\n\t\t\t\tthrow new Error(\"Unsupported ISO Duration Field: \" + m[i].slice(m[i].length-1));\n\t\t\tcase 'D': mt *= 24;\n\t\t\t\t/* falls through */\n\t\t\tcase 'H': mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'M':\n\t\t\t\tif(!time) throw new Error(\"Unsupported ISO Duration Field: M\");\n\t\t\t\telse mt *= 60;\n\t\t\t\t/* falls through */\n\t\t\tcase 'S': break;\n\t\t}\n\t\tsec += mt * parseInt(m[i], 10);\n\t}\n\treturn sec;\n}\n\nvar good_pd_date_1 = /*#__PURE__*/new Date('2017-02-19T19:06:09.000Z');\nvar good_pd_date = /*#__PURE__*/isNaN(/*#__PURE__*/good_pd_date_1.getFullYear()) ? /*#__PURE__*/new Date('2/19/17') : good_pd_date_1;\nvar good_pd = /*#__PURE__*/good_pd_date.getFullYear() == 2017;\n/* parses a date as a local date */\nfunction parseDate(str/*:string|Date*/, fixdate/*:?number*/)/*:Date*/ {\n\tvar d = new Date(str);\n\tif(good_pd) {\n\t\t/*:: if(fixdate == null) fixdate = 0; */\n\t\tif(fixdate > 0) d.setTime(d.getTime() + d.getTimezoneOffset() * 60 * 1000);\n\t\telse if(fixdate < 0) d.setTime(d.getTime() - d.getTimezoneOffset() * 60 * 1000);\n\t\treturn d;\n\t}\n\tif(str instanceof Date) return str;\n\tif(good_pd_date.getFullYear() == 1917 && !isNaN(d.getFullYear())) {\n\t\tvar s = d.getFullYear();\n\t\tif(str.indexOf(\"\" + s) > -1) return d;\n\t\td.setFullYear(d.getFullYear() + 100); return d;\n\t}\n\tvar n = str.match(/\\d+/g)||[\"2017\",\"2\",\"19\",\"0\",\"0\",\"0\"];\n\tvar out = new Date(+n[0], +n[1] - 1, +n[2], (+n[3]||0), (+n[4]||0), (+n[5]||0));\n\tif(str.indexOf(\"Z\") > -1) out = new Date(out.getTime() - out.getTimezoneOffset() * 60 * 1000);\n\treturn out;\n}\n\nfunction cc2str(arr/*:Array*/, debomit)/*:string*/ {\n\tif(has_buf && Buffer.isBuffer(arr)) {\n\t\tif(debomit) {\n\t\t\tif(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(arr.slice(2).toString(\"utf16le\"));\n\t\t\tif(arr[1] == 0xFE && arr[2] == 0xFF) return utf8write(utf16beread(arr.slice(2).toString(\"binary\")));\n\t\t}\n\t\treturn arr.toString(\"binary\");\n\t}\n\n\tif(typeof TextDecoder !== \"undefined\") try {\n\t\tif(debomit) {\n\t\t\tif(arr[0] == 0xFF && arr[1] == 0xFE) return utf8write(new TextDecoder(\"utf-16le\").decode(arr.slice(2)));\n\t\t\tif(arr[0] == 0xFE && arr[1] == 0xFF) return utf8write(new TextDecoder(\"utf-16be\").decode(arr.slice(2)));\n\t\t}\n\t\tvar rev = {\n\t\t\t\"\\u20ac\": \"\\x80\", \"\\u201a\": \"\\x82\", \"\\u0192\": \"\\x83\", \"\\u201e\": \"\\x84\",\n\t\t\t\"\\u2026\": \"\\x85\", \"\\u2020\": \"\\x86\", \"\\u2021\": \"\\x87\", \"\\u02c6\": \"\\x88\",\n\t\t\t\"\\u2030\": \"\\x89\", \"\\u0160\": \"\\x8a\", \"\\u2039\": \"\\x8b\", \"\\u0152\": \"\\x8c\",\n\t\t\t\"\\u017d\": \"\\x8e\", \"\\u2018\": \"\\x91\", \"\\u2019\": \"\\x92\", \"\\u201c\": \"\\x93\",\n\t\t\t\"\\u201d\": \"\\x94\", \"\\u2022\": \"\\x95\", \"\\u2013\": \"\\x96\", \"\\u2014\": \"\\x97\",\n\t\t\t\"\\u02dc\": \"\\x98\", \"\\u2122\": \"\\x99\", \"\\u0161\": \"\\x9a\", \"\\u203a\": \"\\x9b\",\n\t\t\t\"\\u0153\": \"\\x9c\", \"\\u017e\": \"\\x9e\", \"\\u0178\": \"\\x9f\"\n\t\t};\n\t\tif(Array.isArray(arr)) arr = new Uint8Array(arr);\n\t\treturn new TextDecoder(\"latin1\").decode(arr).replace(/[€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ]/g, function(c) { return rev[c] || c; });\n\t} catch(e) {}\n\n\tvar o = [];\n\tfor(var i = 0; i != arr.length; ++i) o.push(String.fromCharCode(arr[i]));\n\treturn o.join(\"\");\n}\n\nfunction dup(o/*:any*/)/*:any*/ {\n\tif(typeof JSON != 'undefined' && !Array.isArray(o)) return JSON.parse(JSON.stringify(o));\n\tif(typeof o != 'object' || o == null) return o;\n\tif(o instanceof Date) return new Date(o.getTime());\n\tvar out = {};\n\tfor(var k in o) if(Object.prototype.hasOwnProperty.call(o, k)) out[k] = dup(o[k]);\n\treturn out;\n}\n\nfunction fill(c/*:string*/,l/*:number*/)/*:string*/ { var o = \"\"; while(o.length < l) o+=c; return o; }\n\n/* TODO: stress test */\nfunction fuzzynum(s/*:string*/)/*:number*/ {\n\tvar v/*:number*/ = Number(s);\n\tif(!isNaN(v)) return isFinite(v) ? v : NaN;\n\tif(!/\\d/.test(s)) return v;\n\tvar wt = 1;\n\tvar ss = s.replace(/([\\d]),([\\d])/g,\"$1$2\").replace(/[$]/g,\"\").replace(/[%]/g, function() { wt *= 100; return \"\";});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\tss = ss.replace(/[(](.*)[)]/,function($$, $1) { wt = -wt; return $1;});\n\tif(!isNaN(v = Number(ss))) return v / wt;\n\treturn v;\n}\nvar lower_months = ['january', 'february', 'march', 'april', 'may', 'june', 'july', 'august', 'september', 'october', 'november', 'december'];\nfunction fuzzydate(s/*:string*/)/*:Date*/ {\n\tvar o = new Date(s), n = new Date(NaN);\n\tvar y = o.getYear(), m = o.getMonth(), d = o.getDate();\n\tif(isNaN(d)) return n;\n\tvar lower = s.toLowerCase();\n\tif(lower.match(/jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec/)) {\n\t\tlower = lower.replace(/[^a-z]/g,\"\").replace(/([^a-z]|^)[ap]m?([^a-z]|$)/,\"\");\n\t\tif(lower.length > 3 && lower_months.indexOf(lower) == -1) return n;\n\t} else if(lower.match(/[a-z]/)) return n;\n\tif(y < 0 || y > 8099) return n;\n\tif((m > 0 || d > 1) && y != 101) return o;\n\tif(s.match(/[^-0-9:,\\/\\\\]/)) return n;\n\treturn o;\n}\n\nvar split_regex = /*#__PURE__*/(function() {\n\tvar safe_split_regex = \"abacaba\".split(/(:?b)/i).length == 5;\n\treturn function split_regex(str/*:string*/, re, def/*:string*/)/*:Array*/ {\n\t\tif(safe_split_regex || typeof re == \"string\") return str.split(re);\n\t\tvar p = str.split(re), o = [p[0]];\n\t\tfor(var i = 1; i < p.length; ++i) { o.push(def); o.push(p[i]); }\n\t\treturn o;\n\t};\n})();\nfunction getdatastr(data)/*:?string*/ {\n\tif(!data) return null;\n\tif(data.content && data.type) return cc2str(data.content, true);\n\tif(data.data) return debom(data.data);\n\tif(data.asNodeBuffer && has_buf) return debom(data.asNodeBuffer().toString('binary'));\n\tif(data.asBinary) return debom(data.asBinary());\n\tif(data._data && data._data.getContent) return debom(cc2str(Array.prototype.slice.call(data._data.getContent(),0)));\n\treturn null;\n}\n\nfunction getdatabin(data) {\n\tif(!data) return null;\n\tif(data.data) return char_codes(data.data);\n\tif(data.asNodeBuffer && has_buf) return data.asNodeBuffer();\n\tif(data._data && data._data.getContent) {\n\t\tvar o = data._data.getContent();\n\t\tif(typeof o == \"string\") return char_codes(o);\n\t\treturn Array.prototype.slice.call(o);\n\t}\n\tif(data.content && data.type) return data.content;\n\treturn null;\n}\n\nfunction getdata(data) { return (data && data.name.slice(-4) === \".bin\") ? getdatabin(data) : getdatastr(data); }\n\n/* Part 2 Section 10.1.2 \"Mapping Content Types\" Names are case-insensitive */\n/* OASIS does not comment on filename case sensitivity */\nfunction safegetzipfile(zip, file/*:string*/) {\n\tvar k = zip.FullPaths || keys(zip.files);\n\tvar f = file.toLowerCase().replace(/[\\/]/g, '\\\\'), g = f.replace(/\\\\/g,'\\/');\n\tfor(var i=0; i\\/]+)\\s*=\\s*((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:')|([^'\">\\s]+))/g;\nvar tagregex1=/<[\\/\\?]?[a-zA-Z0-9:_-]+(?:\\s+[^\"\\s?>\\/]+\\s*=\\s*(?:\"[^\"]*\"|'[^']*'|[^'\">\\s=]+))*\\s*[\\/\\?]?>/mg, tagregex2 = /<[^>]*>/g;\nvar tagregex = /*#__PURE__*/XML_HEADER.match(tagregex1) ? tagregex1 : tagregex2;\nvar nsregex=/<\\w*:/, nsregex2 = /<(\\/?)\\w+:/;\nfunction parsexmltag(tag/*:string*/, skip_root/*:?boolean*/, skip_LC/*:?boolean*/)/*:any*/ {\n\tvar z = ({}/*:any*/);\n\tvar eq = 0, c = 0;\n\tfor(; eq !== tag.length; ++eq) if((c = tag.charCodeAt(eq)) === 32 || c === 10 || c === 13) break;\n\tif(!skip_root) z[0] = tag.slice(0, eq);\n\tif(eq === tag.length) return z;\n\tvar m = tag.match(attregexg), j=0, v=\"\", i=0, q=\"\", cc=\"\", quot = 1;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\tcc = m[i];\n\t\tfor(c=0; c != cc.length; ++c) if(cc.charCodeAt(c) === 61) break;\n\t\tq = cc.slice(0,c).trim();\n\t\twhile(cc.charCodeAt(c+1) == 32) ++c;\n\t\tquot = ((eq=cc.charCodeAt(c+1)) == 34 || eq == 39) ? 1 : 0;\n\t\tv = cc.slice(c+1+quot, cc.length-quot);\n\t\tfor(j=0;j!=q.length;++j) if(q.charCodeAt(j) === 58) break;\n\t\tif(j===q.length) {\n\t\t\tif(q.indexOf(\"_\") > 0) q = q.slice(0, q.indexOf(\"_\")); // from ods\n\t\t\tz[q] = v;\n\t\t\tif(!skip_LC) z[q.toLowerCase()] = v;\n\t\t}\n\t\telse {\n\t\t\tvar k = (j===5 && q.slice(0,5)===\"xmlns\"?\"xmlns\":\"\")+q.slice(j+1);\n\t\t\tif(z[k] && q.slice(j-3,j) == \"ext\") continue; // from ods\n\t\t\tz[k] = v;\n\t\t\tif(!skip_LC) z[k.toLowerCase()] = v;\n\t\t}\n\t}\n\treturn z;\n}\nfunction strip_ns(x/*:string*/)/*:string*/ { return x.replace(nsregex2, \"<$1\"); }\n\nvar encodings = {\n\t'"': '\"',\n\t''': \"'\",\n\t'>': '>',\n\t'<': '<',\n\t'&': '&'\n};\nvar rencoding = /*#__PURE__*/evert(encodings);\n//var rencstr = \"&<>'\\\"\".split(\"\");\n\n// TODO: CP remap (need to read file version to determine OS)\nvar unescapexml/*:StringConv*/ = /*#__PURE__*/(function() {\n\t/* 22.4.2.4 bstr (Basic String) */\n\tvar encregex = /&(?:quot|apos|gt|lt|amp|#x?([\\da-fA-F]+));/ig, coderegex = /_x([\\da-fA-F]{4})_/ig;\n\treturn function unescapexml(text/*:string*/)/*:string*/ {\n\t\tvar s = text + '', i = s.indexOf(\"-1?16:10))||$$; }).replace(coderegex,function(m,c) {return String.fromCharCode(parseInt(c,16));});\n\t\tvar j = s.indexOf(\"]]>\");\n\t\treturn unescapexml(s.slice(0, i)) + s.slice(i+9,j) + unescapexml(s.slice(j+3));\n\t};\n})();\n\nvar decregex=/[&<>'\"]/g, charegex = /[\\u0000-\\u0008\\u000b-\\u001f]/g;\nfunction escapexml(text/*:string*/)/*:string*/{\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(charegex,function(s) { return \"_x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \"_\";});\n}\nfunction escapexmltag(text/*:string*/)/*:string*/{ return escapexml(text).replace(/ /g,\"_x0020_\"); }\n\nvar htmlcharegex = /[\\u0000-\\u001f]/g;\nfunction escapehtml(text/*:string*/)/*:string*/{\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(/\\n/g, \"
    \").replace(htmlcharegex,function(s) { return \"&#x\" + (\"000\"+s.charCodeAt(0).toString(16)).slice(-4) + \";\"; });\n}\n\nfunction escapexlml(text/*:string*/)/*:string*/{\n\tvar s = text + '';\n\treturn s.replace(decregex, function(y) { return rencoding[y]; }).replace(htmlcharegex,function(s) { return \"&#x\" + (s.charCodeAt(0).toString(16)).toUpperCase() + \";\"; });\n}\n\n/* TODO: handle codepages */\nvar xlml_fixstr/*:StringConv*/ = /*#__PURE__*/(function() {\n\tvar entregex = /&#(\\d+);/g;\n\tfunction entrepl($$/*:string*/,$1/*:string*/)/*:string*/ { return String.fromCharCode(parseInt($1,10)); }\n\treturn function xlml_fixstr(str/*:string*/)/*:string*/ { return str.replace(entregex,entrepl); };\n})();\nfunction xlml_unfixstr(str/*:string*/)/*:string*/ { return str.replace(/(\\r\\n|[\\r\\n])/g,\"\\ \"); }\n\nfunction parsexmlbool(value/*:any*/)/*:boolean*/ {\n\tswitch(value) {\n\t\tcase 1: case true: case '1': case 'true': case 'TRUE': return true;\n\t\t/* case '0': case 'false': case 'FALSE':*/\n\t\tdefault: return false;\n\t}\n}\n\nfunction utf8reada(orig/*:string*/)/*:string*/ {\n\tvar out = \"\", i = 0, c = 0, d = 0, e = 0, f = 0, w = 0;\n\twhile (i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tif (c < 128) { out += String.fromCharCode(c); continue; }\n\t\td = orig.charCodeAt(i++);\n\t\tif (c>191 && c<224) { f = ((c & 31) << 6); f |= (d & 63); out += String.fromCharCode(f); continue; }\n\t\te = orig.charCodeAt(i++);\n\t\tif (c < 240) { out += String.fromCharCode(((c & 15) << 12) | ((d & 63) << 6) | (e & 63)); continue; }\n\t\tf = orig.charCodeAt(i++);\n\t\tw = (((c & 7) << 18) | ((d & 63) << 12) | ((e & 63) << 6) | (f & 63))-65536;\n\t\tout += String.fromCharCode(0xD800 + ((w>>>10)&1023));\n\t\tout += String.fromCharCode(0xDC00 + (w&1023));\n\t}\n\treturn out;\n}\n\nfunction utf8readb(data) {\n\tvar out = new_raw_buf(2*data.length), w, i, j = 1, k = 0, ww=0, c;\n\tfor(i = 0; i < data.length; i+=j) {\n\t\tj = 1;\n\t\tif((c=data.charCodeAt(i)) < 128) w = c;\n\t\telse if(c < 224) { w = (c&31)*64+(data.charCodeAt(i+1)&63); j=2; }\n\t\telse if(c < 240) { w=(c&15)*4096+(data.charCodeAt(i+1)&63)*64+(data.charCodeAt(i+2)&63); j=3; }\n\t\telse { j = 4;\n\t\t\tw = (c & 7)*262144+(data.charCodeAt(i+1)&63)*4096+(data.charCodeAt(i+2)&63)*64+(data.charCodeAt(i+3)&63);\n\t\t\tw -= 65536; ww = 0xD800 + ((w>>>10)&1023); w = 0xDC00 + (w&1023);\n\t\t}\n\t\tif(ww !== 0) { out[k++] = ww&255; out[k++] = ww>>>8; ww = 0; }\n\t\tout[k++] = w%256; out[k++] = w>>>8;\n\t}\n\treturn out.slice(0,k).toString('ucs2');\n}\n\nfunction utf8readc(data) { return Buffer_from(data, 'binary').toString('utf8'); }\n\nvar utf8corpus = \"foo bar baz\\u00e2\\u0098\\u0083\\u00f0\\u009f\\u008d\\u00a3\";\nvar utf8read = has_buf && (/*#__PURE__*/utf8readc(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readc || /*#__PURE__*/utf8readb(utf8corpus) == /*#__PURE__*/utf8reada(utf8corpus) && utf8readb) || utf8reada;\n\nvar utf8write/*:StringConv*/ = has_buf ? function(data) { return Buffer_from(data, 'utf8').toString(\"binary\"); } : function(orig/*:string*/)/*:string*/ {\n\tvar out/*:Array*/ = [], i = 0, c = 0, d = 0;\n\twhile(i < orig.length) {\n\t\tc = orig.charCodeAt(i++);\n\t\tswitch(true) {\n\t\t\tcase c < 128: out.push(String.fromCharCode(c)); break;\n\t\t\tcase c < 2048:\n\t\t\t\tout.push(String.fromCharCode(192 + (c >> 6)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t\t\tbreak;\n\t\t\tcase c >= 55296 && c < 57344:\n\t\t\t\tc -= 55296; d = orig.charCodeAt(i++) - 56320 + (c<<10);\n\t\t\t\tout.push(String.fromCharCode(240 + ((d >>18) & 7)));\n\t\t\t\tout.push(String.fromCharCode(144 + ((d >>12) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((d >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (d & 63)));\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tout.push(String.fromCharCode(224 + (c >> 12)));\n\t\t\t\tout.push(String.fromCharCode(128 + ((c >> 6) & 63)));\n\t\t\t\tout.push(String.fromCharCode(128 + (c & 63)));\n\t\t}\n\t}\n\treturn out.join(\"\");\n};\n\n// matches ... extracts content\nvar matchtag = /*#__PURE__*/(function() {\n\tvar mtcache/*:{[k:string]:RegExp}*/ = ({}/*:any*/);\n\treturn function matchtag(f/*:string*/,g/*:?string*/)/*:RegExp*/ {\n\t\tvar t = f+\"|\"+(g||\"\");\n\t\tif(mtcache[t]) return mtcache[t];\n\t\treturn (mtcache[t] = new RegExp('<(?:\\\\w+:)?'+f+'(?: xml:space=\"preserve\")?(?:[^>]*)>([\\\\s\\\\S]*?)',((g||\"\")/*:any*/)));\n\t};\n})();\n\nvar htmldecode/*:{(s:string):string}*/ = /*#__PURE__*/(function() {\n\tvar entities/*:Array<[RegExp, string]>*/ = [\n\t\t['nbsp', ' '], ['middot', '·'],\n\t\t['quot', '\"'], ['apos', \"'\"], ['gt', '>'], ['lt', '<'], ['amp', '&']\n\t].map(function(x/*:[string, string]*/) { return [new RegExp('&' + x[0] + ';', \"ig\"), x[1]]; });\n\treturn function htmldecode(str/*:string*/)/*:string*/ {\n\t\tvar o = str\n\t\t\t\t// Remove new lines and spaces from start of content\n\t\t\t\t.replace(/^[\\t\\n\\r ]+/, \"\")\n\t\t\t\t// Remove new lines and spaces from end of content\n\t\t\t\t.replace(/[\\t\\n\\r ]+$/,\"\")\n\t\t\t\t// Added line which removes any white space characters after and before html tags\n\t\t\t\t.replace(/>\\s+/g,\">\").replace(/\\s+ tags with new lines\n\t\t\t\t.replace(/<\\s*[bB][rR]\\s*\\/?>/g,\"\\n\")\n\t\t\t\t// Strip HTML elements\n\t\t\t\t.replace(/<[^>]*>/g,\"\");\n\t\tfor(var i = 0; i < entities.length; ++i) o = o.replace(entities[i][0], entities[i][1]);\n\t\treturn o;\n\t};\n})();\n\nvar vtregex = /*#__PURE__*/(function(){ var vt_cache = {};\n\treturn function vt_regex(bt) {\n\t\tif(vt_cache[bt] !== undefined) return vt_cache[bt];\n\t\treturn (vt_cache[bt] = new RegExp(\"<(?:vt:)?\" + bt + \">([\\\\s\\\\S]*?)\", 'g') );\n};})();\nvar vtvregex = /<\\/?(?:vt:)?variant>/g, vtmregex = /<(?:vt:)([^>]*)>([\\s\\S]*)*/ {\n\tvar h = parsexmltag(data);\n\n\tvar matches/*:Array*/ = data.match(vtregex(h.baseType))||[];\n\tvar res/*:Array*/ = [];\n\tif(matches.length != h.size) {\n\t\tif(opts.WTF) throw new Error(\"unexpected vector length \" + matches.length + \" != \" + h.size);\n\t\treturn res;\n\t}\n\tmatches.forEach(function(x/*:string*/) {\n\t\tvar v = x.replace(vtvregex,\"\").match(vtmregex);\n\t\tif(v) res.push({v:utf8read(v[2]), t:v[1]});\n\t});\n\treturn res;\n}\n\nvar wtregex = /(^\\s|\\s$|\\n)/;\nfunction writetag(f/*:string*/,g/*:string*/)/*:string*/ { return '<' + f + (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + ''; }\n\nfunction wxt_helper(h)/*:string*/ { return keys(h).map(function(k) { return \" \" + k + '=\"' + h[k] + '\"';}).join(\"\"); }\nfunction writextag(f/*:string*/,g/*:?string*/,h) { return '<' + f + ((h != null) ? wxt_helper(h) : \"\") + ((g != null) ? (g.match(wtregex)?' xml:space=\"preserve\"' : \"\") + '>' + g + '';}\n\nfunction write_w3cdtf(d/*:Date*/, t/*:?boolean*/)/*:string*/ { try { return d.toISOString().replace(/\\.\\d*/,\"\"); } catch(e) { if(t) throw e; } return \"\"; }\n\nfunction write_vt(s, xlsx/*:?boolean*/)/*:string*/ {\n\tswitch(typeof s) {\n\t\tcase 'string':\n\t\t\tvar o = writextag('vt:lpwstr', escapexml(s));\n\t\t\tif(xlsx) o = o.replace(/"/g, \"_x0022_\");\n\t\t\treturn o;\n\t\tcase 'number': return writextag((s|0)==s?'vt:i4':'vt:r8', escapexml(String(s)));\n\t\tcase 'boolean': return writextag('vt:bool',s?'true':'false');\n\t}\n\tif(s instanceof Date) return writextag('vt:filetime', write_w3cdtf(s));\n\tthrow new Error(\"Unable to serialize \" + s);\n}\n\nfunction xlml_normalize(d)/*:string*/ {\n\tif(has_buf &&/*::typeof Buffer !== \"undefined\" && d != null && d instanceof Buffer &&*/ Buffer.isBuffer(d)) return d.toString('utf8');\n\tif(typeof d === 'string') return d;\n\t/* duktape */\n\tif(typeof Uint8Array !== 'undefined' && d instanceof Uint8Array) return utf8read(a2s(ab2a(d)));\n\tthrow new Error(\"Bad input format: expected Buffer or string\");\n}\n/* UOS uses CJK in tags */\nvar xlmlregex = /<(\\/?)([^\\s?>:\\/]+)(?:[\\s?:\\/][^>]*)?>/mg;\n//var xlmlregex = /<(\\/?)([a-z0-9]*:|)(\\w+)[^>]*>/mg;\n\nvar XMLNS = ({\n\tCORE_PROPS: 'http://schemas.openxmlformats.org/package/2006/metadata/core-properties',\n\tCUST_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/custom-properties\",\n\tEXT_PROPS: \"http://schemas.openxmlformats.org/officeDocument/2006/extended-properties\",\n\tCT: 'http://schemas.openxmlformats.org/package/2006/content-types',\n\tRELS: 'http://schemas.openxmlformats.org/package/2006/relationships',\n\tTCMNT: 'http://schemas.microsoft.com/office/spreadsheetml/2018/threadedcomments',\n\t'dc': 'http://purl.org/dc/elements/1.1/',\n\t'dcterms': 'http://purl.org/dc/terms/',\n\t'dcmitype': 'http://purl.org/dc/dcmitype/',\n\t'mx': 'http://schemas.microsoft.com/office/mac/excel/2008/main',\n\t'r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships',\n\t'sjs': 'http://schemas.openxmlformats.org/package/2006/sheetjs/core-properties',\n\t'vt': 'http://schemas.openxmlformats.org/officeDocument/2006/docPropsVTypes',\n\t'xsi': 'http://www.w3.org/2001/XMLSchema-instance',\n\t'xsd': 'http://www.w3.org/2001/XMLSchema'\n}/*:any*/);\n\nvar XMLNS_main = [\n\t'http://schemas.openxmlformats.org/spreadsheetml/2006/main',\n\t'http://purl.oclc.org/ooxml/spreadsheetml/main',\n\t'http://schemas.microsoft.com/office/excel/2006/main',\n\t'http://schemas.microsoft.com/office/excel/2006/2'\n];\n\nvar XLMLNS = ({\n\t'o': 'urn:schemas-microsoft-com:office:office',\n\t'x': 'urn:schemas-microsoft-com:office:excel',\n\t'ss': 'urn:schemas-microsoft-com:office:spreadsheet',\n\t'dt': 'uuid:C2F41010-65B3-11d1-A29F-00AA00C14882',\n\t'mv': 'http://macVmlSchemaUri',\n\t'v': 'urn:schemas-microsoft-com:vml',\n\t'html': 'http://www.w3.org/TR/REC-html40'\n}/*:any*/);\nfunction read_double_le(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ {\n\tvar s = 1 - 2 * (b[idx + 7] >>> 7);\n\tvar e = ((b[idx + 7] & 0x7f) << 4) + ((b[idx + 6] >>> 4) & 0x0f);\n\tvar m = (b[idx+6]&0x0f);\n\tfor(var i = 5; i >= 0; --i) m = m * 256 + b[idx + i];\n\tif(e == 0x7ff) return m == 0 ? (s * Infinity) : NaN;\n\tif(e == 0) e = -1022;\n\telse { e -= 1023; m += Math.pow(2,52); }\n\treturn s * Math.pow(2, e - 52) * m;\n}\n\nfunction write_double_le(b/*:RawBytes|CFBlob*/, v/*:number*/, idx/*:number*/) {\n\tvar bs = ((((v < 0) || (1/v == -Infinity)) ? 1 : 0) << 7), e = 0, m = 0;\n\tvar av = bs ? (-v) : v;\n\tif(!isFinite(av)) { e = 0x7ff; m = isNaN(v) ? 0x6969 : 0; }\n\telse if(av == 0) e = m = 0;\n\telse {\n\t\te = Math.floor(Math.log(av) / Math.LN2);\n\t\tm = av * Math.pow(2, 52 - e);\n\t\tif((e <= -1023) && (!isFinite(m) || (m < Math.pow(2,52)))) { e = -1022; }\n\t\telse { m -= Math.pow(2,52); e+=1023; }\n\t}\n\tfor(var i = 0; i <= 5; ++i, m/=256) b[idx + i] = m & 0xff;\n\tb[idx + 6] = ((e & 0x0f) << 4) | (m & 0xf);\n\tb[idx + 7] = (e >> 4) | bs;\n}\n\nvar ___toBuffer = function(bufs/*:Array >*/)/*:RawBytes*/ { var x=[],w=10240; for(var i=0;i 0 && Buffer.isBuffer(bufs[0][0])) ? Buffer.concat(bufs[0].map(function(x) { return Buffer.isBuffer(x) ? x : Buffer_from(x); })) : ___toBuffer(bufs);} : ___toBuffer;\n\nvar ___utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/)/*:string*/ { var ss/*:Array*/=[]; for(var i=s; i*/=[]; for(var i=s; i 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __lpstr = ___lpstr;\n\nvar ___cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __cpstr = ___cpstr;\n\nvar ___lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len-1) : \"\";};\nvar __lpwstr = ___lpwstr;\n\nvar ___lpp4 = function lpp4_(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf16le(b, i+4,i+4+len) : \"\";};\nvar __lpp4 = ___lpp4;\n\nvar ___8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? __utf8(b, i+4,i+4+len) : \"\";};\nvar __8lpp4 = ___8lpp4;\n\nvar ___double = function(b/*:RawBytes|CFBlob*/, idx/*:number*/) { return read_double_le(b, idx);};\nvar __double = ___double;\n\nvar is_buf = function is_buf_a(a) { return Array.isArray(a) || (typeof Uint8Array !== \"undefined\" && a instanceof Uint8Array); };\n\nif(has_buf/*:: && typeof Buffer !== 'undefined'*/) {\n\t__lpstr = function lpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__cpstr = function cpstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___cpstr(b, i); var len = b.readUInt32LE(i); return len > 0 ? b.toString('utf8',i+4,i+4+len-1) : \"\";};\n\t__lpwstr = function lpwstr_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpwstr(b, i); var len = 2*b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len-1);};\n\t__lpp4 = function lpp4_b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf16le',i+4,i+4+len);};\n\t__8lpp4 = function lpp4_8b(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(!Buffer.isBuffer(b)/*:: || !(b instanceof Buffer)*/) return ___8lpp4(b, i); var len = b.readUInt32LE(i); return b.toString('utf8',i+4,i+4+len);};\n\t__double = function double_(b/*:RawBytes|CFBlob*/, i/*:number*/) { if(Buffer.isBuffer(b)/*::&& b instanceof Buffer*/) return b.readDoubleLE(i); return ___double(b,i); };\n\tis_buf = function is_buf_b(a) { return Buffer.isBuffer(a) || Array.isArray(a) || (typeof Uint8Array !== \"undefined\" && a instanceof Uint8Array); };\n}\n\n/* from js-xls */\nfunction cpdoit() {\n\t__utf16le = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { return $cptable.utils.decode(1200, b.slice(s,e)).replace(chr0, ''); };\n\t__utf8 = function(b/*:RawBytes|CFBlob*/,s/*:number*/,e/*:number*/) { return $cptable.utils.decode(65001, b.slice(s,e)); };\n\t__lpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(current_ansi, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__cpstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(current_codepage, b.slice(i+4, i+4+len-1)) : \"\";};\n\t__lpwstr = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = 2*__readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(1200, b.slice(i+4,i+4+len-1)) : \"\";};\n\t__lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(1200, b.slice(i+4,i+4+len)) : \"\";};\n\t__8lpp4 = function(b/*:RawBytes|CFBlob*/,i/*:number*/) { var len = __readUInt32LE(b,i); return len > 0 ? $cptable.utils.decode(65001, b.slice(i+4,i+4+len)) : \"\";};\n}\nif(typeof $cptable !== 'undefined') cpdoit();\n\nvar __readUInt8 = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx]; };\nvar __readUInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+1]*(1<<8))+b[idx]; };\nvar __readInt16LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { var u = (b[idx+1]*(1<<8))+b[idx]; return (u < 0x8000) ? u : ((0xffff - u + 1) * -1); };\nvar __readUInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return b[idx+3]*(1<<24)+(b[idx+2]<<16)+(b[idx+1]<<8)+b[idx]; };\nvar __readInt32LE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx+3]<<24)|(b[idx+2]<<16)|(b[idx+1]<<8)|b[idx]; };\nvar __readInt32BE = function(b/*:RawBytes|CFBlob*/, idx/*:number*/)/*:number*/ { return (b[idx]<<24)|(b[idx+1]<<16)|(b[idx+2]<<8)|b[idx+3]; };\n\nfunction ReadShift(size/*:number*/, t/*:?string*/)/*:number|string*/ {\n\tvar o=\"\", oI/*:: :number = 0*/, oR, oo=[], w, vv, i, loc;\n\tswitch(t) {\n\t\tcase 'dbcs':\n\t\t\tloc = this.l;\n\t\t\tif(has_buf && Buffer.isBuffer(this)) o = this.slice(this.l, this.l+2*size).toString(\"utf16le\");\n\t\t\telse for(i = 0; i < size; ++i) { o+=String.fromCharCode(__readUInt16LE(this, loc)); loc+=2; }\n\t\t\tsize *= 2;\n\t\t\tbreak;\n\n\t\tcase 'utf8': o = __utf8(this, this.l, this.l + size); break;\n\t\tcase 'utf16le': size *= 2; o = __utf16le(this, this.l, this.l + size); break;\n\n\t\tcase 'wstr':\n\t\t\tif(typeof $cptable !== 'undefined') o = $cptable.utils.decode(current_codepage, this.slice(this.l, this.l+2*size));\n\t\t\telse return ReadShift.call(this, size, 'dbcs');\n\t\t\tsize = 2 * size; break;\n\n\t\t/* [MS-OLEDS] 2.1.4 LengthPrefixedAnsiString */\n\t\tcase 'lpstr-ansi': o = __lpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\tcase 'lpstr-cp': o = __cpstr(this, this.l); size = 4 + __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OLEDS] 2.1.5 LengthPrefixedUnicodeString */\n\t\tcase 'lpwstr': o = __lpwstr(this, this.l); size = 4 + 2 * __readUInt32LE(this, this.l); break;\n\t\t/* [MS-OFFCRYPTO] 2.1.2 Length-Prefixed Padded Unicode String (UNICODE-LP-P4) */\n\t\tcase 'lpp4': size = 4 + __readUInt32LE(this, this.l); o = __lpp4(this, this.l); if(size & 0x02) size += 2; break;\n\t\t/* [MS-OFFCRYPTO] 2.1.3 Length-Prefixed UTF-8 String (UTF-8-LP-P4) */\n\t\tcase '8lpp4': size = 4 + __readUInt32LE(this, this.l); o = __8lpp4(this, this.l); if(size & 0x03) size += 4 - (size & 0x03); break;\n\n\t\tcase 'cstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt8(this, this.l + size++))!==0) oo.push(_getchar(w));\n\t\t\to = oo.join(\"\"); break;\n\t\tcase '_wstr': size = 0; o = \"\";\n\t\t\twhile((w=__readUInt16LE(this,this.l +size))!==0){oo.push(_getchar(w));size+=2;}\n\t\t\tsize+=2; o = oo.join(\"\"); break;\n\n\t\t/* sbcs and dbcs support continue records in the SST way TODO codepages */\n\t\tcase 'dbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i < size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt16LE(this, loc)));\n\t\t\t\tloc+=2;\n\t\t\t} o = oo.join(\"\"); size *= 2; break;\n\n\t\tcase 'cpstr':\n\t\t\tif(typeof $cptable !== 'undefined') {\n\t\t\t\to = $cptable.utils.decode(current_codepage, this.slice(this.l, this.l + size));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t/* falls through */\n\t\tcase 'sbcs-cont': o = \"\"; loc = this.l;\n\t\t\tfor(i = 0; i != size; ++i) {\n\t\t\t\tif(this.lens && this.lens.indexOf(loc) !== -1) {\n\t\t\t\t\tw = __readUInt8(this, loc);\n\t\t\t\t\tthis.l = loc + 1;\n\t\t\t\t\tvv = ReadShift.call(this, size-i, w ? 'dbcs-cont' : 'sbcs-cont');\n\t\t\t\t\treturn oo.join(\"\") + vv;\n\t\t\t\t}\n\t\t\t\too.push(_getchar(__readUInt8(this, loc)));\n\t\t\t\tloc+=1;\n\t\t\t} o = oo.join(\"\"); break;\n\n\t\tdefault:\n\tswitch(size) {\n\t\tcase 1: oI = __readUInt8(this, this.l); this.l++; return oI;\n\t\tcase 2: oI = (t === 'i' ? __readInt16LE : __readUInt16LE)(this, this.l); this.l += 2; return oI;\n\t\tcase 4: case -4:\n\t\t\tif(t === 'i' || ((this[this.l+3] & 0x80)===0)) { oI = ((size > 0) ? __readInt32LE : __readInt32BE)(this, this.l); this.l += 4; return oI; }\n\t\t\telse { oR = __readUInt32LE(this, this.l); this.l += 4; } return oR;\n\t\tcase 8: case -8:\n\t\t\tif(t === 'f') {\n\t\t\t\tif(size == 8) oR = __double(this, this.l);\n\t\t\t\telse oR = __double([this[this.l+7],this[this.l+6],this[this.l+5],this[this.l+4],this[this.l+3],this[this.l+2],this[this.l+1],this[this.l+0]], 0);\n\t\t\t\tthis.l += 8; return oR;\n\t\t\t} else size = 8;\n\t\t/* falls through */\n\t\tcase 16: o = __hexlify(this, this.l, size); break;\n\t}}\n\tthis.l+=size; return o;\n}\n\nvar __writeUInt32LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); b[idx+2] = ((val >>> 16) & 0xFF); b[idx+3] = ((val >>> 24) & 0xFF); };\nvar __writeInt32LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >> 8) & 0xFF); b[idx+2] = ((val >> 16) & 0xFF); b[idx+3] = ((val >> 24) & 0xFF); };\nvar __writeUInt16LE = function(b/*:RawBytes|CFBlob*/, val/*:number*/, idx/*:number*/)/*:void*/ { b[idx] = (val & 0xFF); b[idx+1] = ((val >>> 8) & 0xFF); };\n\nfunction WriteShift(t/*:number*/, val/*:string|number*/, f/*:?string*/)/*:any*/ {\n\tvar size = 0, i = 0;\n\tif(f === 'dbcs') {\n\t\t/*:: if(typeof val !== 'string') throw new Error(\"unreachable\"); */\n\t\tfor(i = 0; i != val.length; ++i) __writeUInt16LE(this, val.charCodeAt(i), this.l + 2 * i);\n\t\tsize = 2 * val.length;\n\t} else if(f === 'sbcs') {\n\t\tif(typeof $cptable !== 'undefined' && current_ansi == 874) {\n\t\t\t/* TODO: use tables directly, don't encode */\n\t\t\t/*:: if(typeof val !== \"string\") throw new Error(\"unreachable\"); */\n\t\t\tfor(i = 0; i != val.length; ++i) {\n\t\t\t\tvar cppayload = $cptable.utils.encode(current_ansi, val.charAt(i));\n\t\t\t\tthis[this.l + i] = cppayload[0];\n\t\t\t}\n\t\t} else {\n\t\t\t/*:: if(typeof val !== 'string') throw new Error(\"unreachable\"); */\n\t\t\tval = val.replace(/[^\\x00-\\x7F]/g, \"_\");\n\t\t\t/*:: if(typeof val !== 'string') throw new Error(\"unreachable\"); */\n\t\t\tfor(i = 0; i != val.length; ++i) this[this.l + i] = (val.charCodeAt(i) & 0xFF);\n\t\t}\n\t\tsize = val.length;\n\t} else if(f === 'hex') {\n\t\tfor(; i < t; ++i) {\n\t\t\t/*:: if(typeof val !== \"string\") throw new Error(\"unreachable\"); */\n\t\t\tthis[this.l++] = (parseInt(val.slice(2*i, 2*i+2), 16)||0);\n\t\t} return this;\n\t} else if(f === 'utf16le') {\n\t\t\t/*:: if(typeof val !== \"string\") throw new Error(\"unreachable\"); */\n\t\t\tvar end/*:number*/ = Math.min(this.l + t, this.length);\n\t\t\tfor(i = 0; i < Math.min(val.length, t); ++i) {\n\t\t\t\tvar cc = val.charCodeAt(i);\n\t\t\t\tthis[this.l++] = (cc & 0xff);\n\t\t\t\tthis[this.l++] = (cc >> 8);\n\t\t\t}\n\t\t\twhile(this.l < end) this[this.l++] = 0;\n\t\t\treturn this;\n\t} else /*:: if(typeof val === 'number') */ switch(t) {\n\t\tcase 1: size = 1; this[this.l] = val&0xFF; break;\n\t\tcase 2: size = 2; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; break;\n\t\tcase 3: size = 3; this[this.l] = val&0xFF; val >>>= 8; this[this.l+1] = val&0xFF; val >>>= 8; this[this.l+2] = val&0xFF; break;\n\t\tcase 4: size = 4; __writeUInt32LE(this, val, this.l); break;\n\t\tcase 8: size = 8; if(f === 'f') { write_double_le(this, val, this.l); break; }\n\t\t/* falls through */\n\t\tcase 16: break;\n\t\tcase -4: size = 4; __writeInt32LE(this, val, this.l); break;\n\t}\n\tthis.l += size; return this;\n}\n\nfunction CheckField(hexstr/*:string*/, fld/*:string*/)/*:void*/ {\n\tvar m = __hexlify(this,this.l,hexstr.length>>1);\n\tif(m !== hexstr) throw new Error(fld + 'Expected ' + hexstr + ' saw ' + m);\n\tthis.l += hexstr.length>>1;\n}\n\nfunction prep_blob(blob, pos/*:number*/)/*:void*/ {\n\tblob.l = pos;\n\tblob.read_shift = /*::(*/ReadShift/*:: :any)*/;\n\tblob.chk = CheckField;\n\tblob.write_shift = WriteShift;\n}\n\nfunction parsenoop(blob, length/*:: :number, opts?:any */) { blob.l += length; }\n\nfunction new_buf(sz/*:number*/)/*:Block*/ {\n\tvar o = new_raw_buf(sz);\n\tprep_blob(o, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.1.4 Record */\nfunction recordhopper(data, cb/*:RecordHopperCB*/, opts/*:?any*/) {\n\tif(!data) return;\n\tvar tmpbyte, cntbyte, length;\n\tprep_blob(data, data.l || 0);\n\tvar L = data.length, RT = 0, tgt = 0;\n\twhile(data.l < L) {\n\t\tRT = data.read_shift(1);\n\t\tif(RT & 0x80) RT = (RT & 0x7F) + ((data.read_shift(1) & 0x7F)<<7);\n\t\tvar R = XLSBRecordEnum[RT] || XLSBRecordEnum[0xFFFF];\n\t\ttmpbyte = data.read_shift(1);\n\t\tlength = tmpbyte & 0x7F;\n\t\tfor(cntbyte = 1; cntbyte <4 && (tmpbyte & 0x80); ++cntbyte) length += ((tmpbyte = data.read_shift(1)) & 0x7F)<<(7*cntbyte);\n\t\ttgt = data.l + length;\n\t\tvar d = R.f && R.f(data, length, opts);\n\t\tdata.l = tgt;\n\t\tif(cb(d, R, RT)) return;\n\t}\n}\n\n/* control buffer usage for fixed-length buffers */\nfunction buf_array()/*:BufArray*/ {\n\tvar bufs/*:Array*/ = [], blksz = has_buf ? 256 : 2048;\n\tvar newblk = function ba_newblk(sz/*:number*/)/*:Block*/ {\n\t\tvar o/*:Block*/ = (new_buf(sz)/*:any*/);\n\t\tprep_blob(o, 0);\n\t\treturn o;\n\t};\n\n\tvar curbuf/*:Block*/ = newblk(blksz);\n\n\tvar endbuf = function ba_endbuf() {\n\t\tif(!curbuf) return;\n\t\tif(curbuf.length > curbuf.l) { curbuf = curbuf.slice(0, curbuf.l); curbuf.l = curbuf.length; }\n\t\tif(curbuf.length > 0) bufs.push(curbuf);\n\t\tcurbuf = null;\n\t};\n\n\tvar next = function ba_next(sz/*:number*/)/*:Block*/ {\n\t\tif(curbuf && (sz < (curbuf.length - curbuf.l))) return curbuf;\n\t\tendbuf();\n\t\treturn (curbuf = newblk(Math.max(sz+1, blksz)));\n\t};\n\n\tvar end = function ba_end() {\n\t\tendbuf();\n\t\treturn bconcat(bufs);\n\t};\n\n\tvar push = function ba_push(buf) { endbuf(); curbuf = buf; if(curbuf.l == null) curbuf.l = curbuf.length; next(blksz); };\n\n\treturn ({ next:next, push:push, end:end, _bufs:bufs }/*:any*/);\n}\n\nfunction write_record(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/) {\n\tvar t/*:number*/ = +type, l;\n\tif(isNaN(t)) return; // TODO: throw something here?\n\tif(!length) length = XLSBRecordEnum[t].p || (payload||[]).length || 0;\n\tl = 1 + (t >= 0x80 ? 1 : 0) + 1/* + length*/;\n\tif(length >= 0x80) ++l; if(length >= 0x4000) ++l; if(length >= 0x200000) ++l;\n\tvar o = ba.next(l);\n\tif(t <= 0x7F) o.write_shift(1, t);\n\telse {\n\t\to.write_shift(1, (t & 0x7F) + 0x80);\n\t\to.write_shift(1, (t >> 7));\n\t}\n\tfor(var i = 0; i != 4; ++i) {\n\t\tif(length >= 0x80) { o.write_shift(1, (length & 0x7F)+0x80); length >>= 7; }\n\t\telse { o.write_shift(1, length); break; }\n\t}\n\tif(/*:: length != null &&*/length > 0 && is_buf(payload)) ba.push(payload);\n}\n/* XLS ranges enforced */\nfunction shift_cell_xls(cell/*:CellAddress*/, tgt/*:any*/, opts/*:?any*/)/*:CellAddress*/ {\n\tvar out = dup(cell);\n\tif(tgt.s) {\n\t\tif(out.cRel) out.c += tgt.s.c;\n\t\tif(out.rRel) out.r += tgt.s.r;\n\t} else {\n\t\tif(out.cRel) out.c += tgt.c;\n\t\tif(out.rRel) out.r += tgt.r;\n\t}\n\tif(!opts || opts.biff < 12) {\n\t\twhile(out.c >= 0x100) out.c -= 0x100;\n\t\twhile(out.r >= 0x10000) out.r -= 0x10000;\n\t}\n\treturn out;\n}\n\nfunction shift_range_xls(cell, range, opts) {\n\tvar out = dup(cell);\n\tout.s = shift_cell_xls(out.s, range.s, opts);\n\tout.e = shift_cell_xls(out.e, range.s, opts);\n\treturn out;\n}\n\nfunction encode_cell_xls(c/*:CellAddress*/, biff/*:number*/)/*:string*/ {\n\tif(c.cRel && c.c < 0) { c = dup(c); while(c.c < 0) c.c += (biff > 8) ? 0x4000 : 0x100; }\n\tif(c.rRel && c.r < 0) { c = dup(c); while(c.r < 0) c.r += (biff > 8) ? 0x100000 : ((biff > 5) ? 0x10000 : 0x4000); }\n\tvar s = encode_cell(c);\n\tif(!c.cRel && c.cRel != null) s = fix_col(s);\n\tif(!c.rRel && c.rRel != null) s = fix_row(s);\n\treturn s;\n}\n\nfunction encode_range_xls(r, opts)/*:string*/ {\n\tif(r.s.r == 0 && !r.s.rRel) {\n\t\tif(r.e.r == (opts.biff >= 12 ? 0xFFFFF : (opts.biff >= 8 ? 0x10000 : 0x4000)) && !r.e.rRel) {\n\t\t\treturn (r.s.cRel ? \"\" : \"$\") + encode_col(r.s.c) + \":\" + (r.e.cRel ? \"\" : \"$\") + encode_col(r.e.c);\n\t\t}\n\t}\n\tif(r.s.c == 0 && !r.s.cRel) {\n\t\tif(r.e.c == (opts.biff >= 12 ? 0x3FFF : 0xFF) && !r.e.cRel) {\n\t\t\treturn (r.s.rRel ? \"\" : \"$\") + encode_row(r.s.r) + \":\" + (r.e.rRel ? \"\" : \"$\") + encode_row(r.e.r);\n\t\t}\n\t}\n\treturn encode_cell_xls(r.s, opts.biff) + \":\" + encode_cell_xls(r.e, opts.biff);\n}\nfunction decode_row(rowstr/*:string*/)/*:number*/ { return parseInt(unfix_row(rowstr),10) - 1; }\nfunction encode_row(row/*:number*/)/*:string*/ { return \"\" + (row + 1); }\nfunction fix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/([A-Z]|^)(\\d+)$/,\"$1$$$2\"); }\nfunction unfix_row(cstr/*:string*/)/*:string*/ { return cstr.replace(/\\$(\\d+)$/,\"$1\"); }\n\nfunction decode_col(colstr/*:string*/)/*:number*/ { var c = unfix_col(colstr), d = 0, i = 0; for(; i !== c.length; ++i) d = 26*d + c.charCodeAt(i) - 64; return d - 1; }\nfunction encode_col(col/*:number*/)/*:string*/ { if(col < 0) throw new Error(\"invalid column \" + col); var s=\"\"; for(++col; col; col=Math.floor((col-1)/26)) s = String.fromCharCode(((col-1)%26) + 65) + s; return s; }\nfunction fix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^([A-Z])/,\"$$$1\"); }\nfunction unfix_col(cstr/*:string*/)/*:string*/ { return cstr.replace(/^\\$([A-Z])/,\"$1\"); }\n\nfunction split_cell(cstr/*:string*/)/*:Array*/ { return cstr.replace(/(\\$?[A-Z]*)(\\$?\\d*)/,\"$1,$2\").split(\",\"); }\n//function decode_cell(cstr/*:string*/)/*:CellAddress*/ { var splt = split_cell(cstr); return { c:decode_col(splt[0]), r:decode_row(splt[1]) }; }\nfunction decode_cell(cstr/*:string*/)/*:CellAddress*/ {\n\tvar R = 0, C = 0;\n\tfor(var i = 0; i < cstr.length; ++i) {\n\t\tvar cc = cstr.charCodeAt(i);\n\t\tif(cc >= 48 && cc <= 57) R = 10 * R + (cc - 48);\n\t\telse if(cc >= 65 && cc <= 90) C = 26 * C + (cc - 64);\n\t}\n\treturn { c: C - 1, r:R - 1 };\n}\n//function encode_cell(cell/*:CellAddress*/)/*:string*/ { return encode_col(cell.c) + encode_row(cell.r); }\nfunction encode_cell(cell/*:CellAddress*/)/*:string*/ {\n\tvar col = cell.c + 1;\n\tvar s=\"\";\n\tfor(; col; col=((col-1)/26)|0) s = String.fromCharCode(((col-1)%26) + 65) + s;\n\treturn s + (cell.r + 1);\n}\nfunction decode_range(range/*:string*/)/*:Range*/ {\n\tvar idx = range.indexOf(\":\");\n\tif(idx == -1) return { s: decode_cell(range), e: decode_cell(range) };\n\treturn { s: decode_cell(range.slice(0, idx)), e: decode_cell(range.slice(idx + 1)) };\n}\n/*# if only one arg, it is assumed to be a Range. If 2 args, both are cell addresses */\nfunction encode_range(cs/*:CellAddrSpec|Range*/,ce/*:?CellAddrSpec*/)/*:string*/ {\n\tif(typeof ce === 'undefined' || typeof ce === 'number') {\n/*:: if(!(cs instanceof Range)) throw \"unreachable\"; */\n\t\treturn encode_range(cs.s, cs.e);\n\t}\n/*:: if((cs instanceof Range)) throw \"unreachable\"; */\n\tif(typeof cs !== 'string') cs = encode_cell((cs/*:any*/));\n\tif(typeof ce !== 'string') ce = encode_cell((ce/*:any*/));\n/*:: if(typeof cs !== 'string') throw \"unreachable\"; */\n/*:: if(typeof ce !== 'string') throw \"unreachable\"; */\n\treturn cs == ce ? cs : cs + \":\" + ce;\n}\n\nfunction safe_decode_range(range/*:string*/)/*:Range*/ {\n\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\tvar idx = 0, i = 0, cc = 0;\n\tvar len = range.length;\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.s.c = --idx;\n\n\tfor(idx = 0; i < len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.s.r = --idx;\n\n\tif(i === len || cc != 10) { o.e.c=o.s.c; o.e.r=o.s.r; return o; }\n\t++i;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\tidx = 26*idx + cc;\n\t}\n\to.e.c = --idx;\n\n\tfor(idx = 0; i != len; ++i) {\n\t\tif((cc=range.charCodeAt(i)-48) < 0 || cc > 9) break;\n\t\tidx = 10*idx + cc;\n\t}\n\to.e.r = --idx;\n\treturn o;\n}\n\nfunction safe_format_cell(cell/*:Cell*/, v/*:any*/) {\n\tvar q = (cell.t == 'd' && v instanceof Date);\n\tif(cell.z != null) try { return (cell.w = SSF_format(cell.z, q ? datenum(v) : v)); } catch(e) { }\n\ttry { return (cell.w = SSF_format((cell.XF||{}).numFmtId||(q ? 14 : 0), q ? datenum(v) : v)); } catch(e) { return ''+v; }\n}\n\nfunction format_cell(cell/*:Cell*/, v/*:any*/, o/*:any*/) {\n\tif(cell == null || cell.t == null || cell.t == 'z') return \"\";\n\tif(cell.w !== undefined) return cell.w;\n\tif(cell.t == 'd' && !cell.z && o && o.dateNF) cell.z = o.dateNF;\n\tif(cell.t == \"e\") return BErr[cell.v] || cell.v;\n\tif(v == undefined) return safe_format_cell(cell, cell.v);\n\treturn safe_format_cell(cell, v);\n}\n\nfunction sheet_to_workbook(sheet/*:Worksheet*/, opts)/*:Workbook*/ {\n\tvar n = opts && opts.sheet ? opts.sheet : \"Sheet1\";\n\tvar sheets = {}; sheets[n] = sheet;\n\treturn { SheetNames: [n], Sheets: sheets };\n}\n\nfunction sheet_add_aoa(_ws/*:?Worksheet*/, data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ {\n\tvar o = opts || {};\n\tvar dense = _ws ? Array.isArray(_ws) : o.dense;\n\tif(DENSE != null && dense == null) dense = DENSE;\n\tvar ws/*:Worksheet*/ = _ws || (dense ? ([]/*:any*/) : ({}/*:any*/));\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin/*:CellAddress*/ = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t\tif(!ws[\"!ref\"]) ws[\"!ref\"] = \"A1:A1\";\n\t}\n\tvar range/*:Range*/ = ({s: {c:10000000, r:10000000}, e: {c:0, r:0}}/*:any*/);\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.s.c = _range.s.c;\n\t\trange.s.r = _range.s.r;\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) range.e.r = _R = _range.e.r + 1;\n\t}\n\tfor(var R = 0; R != data.length; ++R) {\n\t\tif(!data[R]) continue;\n\t\tif(!Array.isArray(data[R])) throw new Error(\"aoa_to_sheet expects an array of arrays\");\n\t\tfor(var C = 0; C != data[R].length; ++C) {\n\t\t\tif(typeof data[R][C] === 'undefined') continue;\n\t\t\tvar cell/*:Cell*/ = ({v: data[R][C] }/*:any*/);\n\t\t\tvar __R = _R + R, __C = _C + C;\n\t\t\tif(range.s.r > __R) range.s.r = __R;\n\t\t\tif(range.s.c > __C) range.s.c = __C;\n\t\t\tif(range.e.r < __R) range.e.r = __R;\n\t\t\tif(range.e.c < __C) range.e.c = __C;\n\t\t\tif(data[R][C] && typeof data[R][C] === 'object' && !Array.isArray(data[R][C]) && !(data[R][C] instanceof Date)) cell = data[R][C];\n\t\t\telse {\n\t\t\t\tif(Array.isArray(cell.v)) { cell.f = data[R][C][1]; cell.v = cell.v[0]; }\n\t\t\t\tif(cell.v === null) {\n\t\t\t\t\tif(cell.f) cell.t = 'n';\n\t\t\t\t\telse if(o.nullError) { cell.t = 'e'; cell.v = 0; }\n\t\t\t\t\telse if(!o.sheetStubs) continue;\n\t\t\t\t\telse cell.t = 'z';\n\t\t\t\t}\n\t\t\t\telse if(typeof cell.v === 'number') cell.t = 'n';\n\t\t\t\telse if(typeof cell.v === 'boolean') cell.t = 'b';\n\t\t\t\telse if(cell.v instanceof Date) {\n\t\t\t\t\tcell.z = o.dateNF || table_fmt[14];\n\t\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.w = SSF_format(cell.z, datenum(cell.v)); }\n\t\t\t\t\telse { cell.t = 'n'; cell.v = datenum(cell.v); cell.w = SSF_format(cell.z, cell.v); }\n\t\t\t\t}\n\t\t\t\telse cell.t = 's';\n\t\t\t}\n\t\t\tif(dense) {\n\t\t\t\tif(!ws[__R]) ws[__R] = [];\n\t\t\t\tif(ws[__R][__C] && ws[__R][__C].z) cell.z = ws[__R][__C].z;\n\t\t\t\tws[__R][__C] = cell;\n\t\t\t} else {\n\t\t\t\tvar cell_ref = encode_cell(({c:__C,r:__R}/*:any*/));\n\t\t\t\tif(ws[cell_ref] && ws[cell_ref].z) cell.z = ws[cell_ref].z;\n\t\t\t\tws[cell_ref] = cell;\n\t\t\t}\n\t\t}\n\t}\n\tif(range.s.c < 10000000) ws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction aoa_to_sheet(data/*:AOA*/, opts/*:?any*/)/*:Worksheet*/ { return sheet_add_aoa(null, data, opts); }\n\nfunction parse_Int32LE(data) {\n\treturn data.read_shift(4, 'i');\n}\nfunction write_UInt32LE(x/*:number*/, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(4, x);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.168 */\nfunction parse_XLWideString(data/*::, length*/)/*:string*/ {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLWideString(data/*:string*/, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(4 + 2 * data.length); }\n\to.write_shift(4, data.length);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.91 */\n//function parse_LPWideString(data/*::, length*/)/*:string*/ {\n//\tvar cchCharacters = data.read_shift(2);\n//\treturn cchCharacters === 0 ? \"\" : data.read_shift(cchCharacters, \"utf16le\");\n//}\n\n/* [MS-XLSB] 2.5.143 */\nfunction parse_StrRun(data) {\n\treturn { ich: data.read_shift(2), ifnt: data.read_shift(2) };\n}\nfunction write_StrRun(run, o) {\n\tif (!o) o = new_buf(4);\n\to.write_shift(2, run.ich || 0);\n\to.write_shift(2, run.ifnt || 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.121 */\nfunction parse_RichStr(data, length/*:number*/)/*:XLString*/ {\n\tvar start = data.l;\n\tvar flags = data.read_shift(1);\n\tvar str = parse_XLWideString(data);\n\tvar rgsStrRun = [];\n\tvar z = ({ t: str, h: str }/*:any*/);\n\tif ((flags & 1) !== 0) { /* fRichStr */\n\t\t/* TODO: formatted string */\n\t\tvar dwSizeStrRun = data.read_shift(4);\n\t\tfor (var i = 0; i != dwSizeStrRun; ++i) rgsStrRun.push(parse_StrRun(data));\n\t\tz.r = rgsStrRun;\n\t}\n\telse z.r = [{ ich: 0, ifnt: 0 }];\n\t//if((flags & 2) !== 0) { /* fExtStr */\n\t//\t/* TODO: phonetic string */\n\t//}\n\tdata.l = start + length;\n\treturn z;\n}\nfunction write_RichStr(str/*:XLString*/, o/*:?Block*/)/*:Block*/ {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(15 + 4 * str.t.length); }\n\to.write_shift(1, 0);\n\twrite_XLWideString(str.t, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n/* [MS-XLSB] 2.4.328 BrtCommentText (RichStr w/1 run) */\nvar parse_BrtCommentText = parse_RichStr;\nfunction write_BrtCommentText(str/*:XLString*/, o/*:?Block*/)/*:Block*/ {\n\t/* TODO: formatted string */\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(23 + 4 * str.t.length); }\n\to.write_shift(1, 1);\n\twrite_XLWideString(str.t, o);\n\to.write_shift(4, 1);\n\twrite_StrRun({ ich: 0, ifnt: 0 }, o);\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.9 */\nfunction parse_XLSBCell(data)/*:any*/ {\n\tvar col = data.read_shift(4);\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) << 16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c: col, iStyleRef: iStyleRef };\n}\nfunction write_XLSBCell(cell/*:any*/, o/*:?Block*/) {\n\tif (o == null) o = new_buf(8);\n\to.write_shift(-4, cell.c);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* Short XLSB Cell does not include column */\nfunction parse_XLSBShortCell(data)/*:any*/ {\n\tvar iStyleRef = data.read_shift(2);\n\tiStyleRef += data.read_shift(1) <<16;\n\tdata.l++; //var fPhShow = data.read_shift(1);\n\treturn { c:-1, iStyleRef: iStyleRef };\n}\nfunction write_XLSBShortCell(cell/*:any*/, o/*:?Block*/) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(3, cell.iStyleRef || cell.s);\n\to.write_shift(1, 0); /* fPhShow */\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.21 */\nvar parse_XLSBCodeName = parse_XLWideString;\nvar write_XLSBCodeName = write_XLWideString;\n\n/* [MS-XLSB] 2.5.166 */\nfunction parse_XLNullableWideString(data/*::, length*/)/*:string*/ {\n\tvar cchCharacters = data.read_shift(4);\n\treturn cchCharacters === 0 || cchCharacters === 0xFFFFFFFF ? \"\" : data.read_shift(cchCharacters, 'dbcs');\n}\nfunction write_XLNullableWideString(data/*:string*/, o) {\n\tvar _null = false; if (o == null) { _null = true; o = new_buf(127); }\n\to.write_shift(4, data.length > 0 ? data.length : 0xFFFFFFFF);\n\tif (data.length > 0) o.write_shift(0, data, 'dbcs');\n\treturn _null ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.5.165 */\nvar parse_XLNameWideString = parse_XLWideString;\n//var write_XLNameWideString = write_XLWideString;\n\n/* [MS-XLSB] 2.5.114 */\nvar parse_RelID = parse_XLNullableWideString;\nvar write_RelID = write_XLNullableWideString;\n\n\n/* [MS-XLS] 2.5.217 ; [MS-XLSB] 2.5.122 */\nfunction parse_RkNumber(data)/*:number*/ {\n\tvar b = data.slice(data.l, data.l + 4);\n\tvar fX100 = (b[0] & 1), fInt = (b[0] & 2);\n\tdata.l += 4;\n\tvar RK = fInt === 0 ? __double([0, 0, 0, 0, (b[0] & 0xFC), b[1], b[2], b[3]], 0) : __readInt32LE(b, 0) >> 2;\n\treturn fX100 ? (RK / 100) : RK;\n}\nfunction write_RkNumber(data/*:number*/, o) {\n\tif (o == null) o = new_buf(4);\n\tvar fX100 = 0, fInt = 0, d100 = data * 100;\n\tif ((data == (data | 0)) && (data >= -(1 << 29)) && (data < (1 << 29))) { fInt = 1; }\n\telse if ((d100 == (d100 | 0)) && (d100 >= -(1 << 29)) && (d100 < (1 << 29))) { fInt = 1; fX100 = 1; }\n\tif (fInt) o.write_shift(-4, ((fX100 ? d100 : data) << 2) + (fX100 + 2));\n\telse throw new Error(\"unsupported RkNumber \" + data); // TODO\n}\n\n\n/* [MS-XLSB] 2.5.117 RfX */\nfunction parse_RfX(data /*::, length*/)/*:Range*/ {\n\tvar cell/*:Range*/ = ({ s: {}, e: {} }/*:any*/);\n\tcell.s.r = data.read_shift(4);\n\tcell.e.r = data.read_shift(4);\n\tcell.s.c = data.read_shift(4);\n\tcell.e.c = data.read_shift(4);\n\treturn cell;\n}\nfunction write_RfX(r/*:Range*/, o) {\n\tif (!o) o = new_buf(16);\n\to.write_shift(4, r.s.r);\n\to.write_shift(4, r.e.r);\n\to.write_shift(4, r.s.c);\n\to.write_shift(4, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.153 UncheckedRfX */\nvar parse_UncheckedRfX = parse_RfX;\nvar write_UncheckedRfX = write_RfX;\n\n/* [MS-XLSB] 2.5.155 UncheckedSqRfX */\n//function parse_UncheckedSqRfX(data) {\n//\tvar cnt = data.read_shift(4);\n//\tvar out = [];\n//\tfor(var i = 0; i < cnt; ++i) {\n//\t\tvar rng = parse_UncheckedRfX(data);\n//\t\tout.push(encode_range(rng));\n//\t}\n//\treturn out.join(\",\");\n//}\n//function write_UncheckedSqRfX(sqrfx/*:string*/) {\n//\tvar parts = sqrfx.split(/\\s*,\\s*/);\n//\tvar o = new_buf(4); o.write_shift(4, parts.length);\n//\tvar out = [o];\n//\tparts.forEach(function(rng) {\n//\t\tout.push(write_UncheckedRfX(safe_decode_range(rng)));\n//\t});\n//\treturn bconcat(out);\n//}\n\n/* [MS-XLS] 2.5.342 ; [MS-XLSB] 2.5.171 */\n/* TODO: error checking, NaN and Infinity values are not valid Xnum */\nfunction parse_Xnum(data/*::, length*/) {\n\tif(data.length - data.l < 8) throw \"XLS Xnum Buffer underflow\";\n\treturn data.read_shift(8, 'f');\n}\nfunction write_Xnum(data, o) { return (o || new_buf(8)).write_shift(8, data, 'f'); }\n\n/* [MS-XLSB] 2.4.324 BrtColor */\nfunction parse_BrtColor(data/*::, length*/) {\n\tvar out = {};\n\tvar d = data.read_shift(1);\n\n\t//var fValidRGB = d & 1;\n\tvar xColorType = d >>> 1;\n\n\tvar index = data.read_shift(1);\n\tvar nTS = data.read_shift(2, 'i');\n\tvar bR = data.read_shift(1);\n\tvar bG = data.read_shift(1);\n\tvar bB = data.read_shift(1);\n\tdata.l++; //var bAlpha = data.read_shift(1);\n\n\tswitch (xColorType) {\n\t\tcase 0: out.auto = 1; break;\n\t\tcase 1:\n\t\t\tout.index = index;\n\t\t\tvar icv = XLSIcv[index];\n\t\t\t/* automatic pseudo index 81 */\n\t\t\tif (icv) out.rgb = rgb2Hex(icv);\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\t/* if(!fValidRGB) throw new Error(\"invalid\"); */\n\t\t\tout.rgb = rgb2Hex([bR, bG, bB]);\n\t\t\tbreak;\n\t\tcase 3: out.theme = index; break;\n\t}\n\tif (nTS != 0) out.tint = nTS > 0 ? nTS / 32767 : nTS / 32768;\n\n\treturn out;\n}\nfunction write_BrtColor(color, o) {\n\tif (!o) o = new_buf(8);\n\tif (!color || color.auto) { o.write_shift(4, 0); o.write_shift(4, 0); return o; }\n\tif (color.index != null) {\n\t\to.write_shift(1, 0x02);\n\t\to.write_shift(1, color.index);\n\t} else if (color.theme != null) {\n\t\to.write_shift(1, 0x06);\n\t\to.write_shift(1, color.theme);\n\t} else {\n\t\to.write_shift(1, 0x05);\n\t\to.write_shift(1, 0);\n\t}\n\tvar nTS = color.tint || 0;\n\tif (nTS > 0) nTS *= 32767;\n\telse if (nTS < 0) nTS *= 32768;\n\to.write_shift(2, nTS);\n\tif (!color.rgb || color.theme != null) {\n\t\to.write_shift(2, 0);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(1, 0);\n\t} else {\n\t\tvar rgb = (color.rgb || 'FFFFFF');\n\t\tif (typeof rgb == 'number') rgb = (\"000000\" + rgb.toString(16)).slice(-6);\n\t\to.write_shift(1, parseInt(rgb.slice(0, 2), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(2, 4), 16));\n\t\to.write_shift(1, parseInt(rgb.slice(4, 6), 16));\n\t\to.write_shift(1, 0xFF);\n\t}\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.52 */\nfunction parse_FontFlags(data/*::, length, opts*/) {\n\tvar d = data.read_shift(1);\n\tdata.l++;\n\tvar out = {\n\t\tfBold: d & 0x01,\n\t\tfItalic: d & 0x02,\n\t\tfUnderline: d & 0x04,\n\t\tfStrikeout: d & 0x08,\n\t\tfOutline: d & 0x10,\n\t\tfShadow: d & 0x20,\n\t\tfCondense: d & 0x40,\n\t\tfExtend: d & 0x80\n\t};\n\treturn out;\n}\nfunction write_FontFlags(font, o) {\n\tif (!o) o = new_buf(2);\n\tvar grbit =\n\t\t(font.italic ? 0x02 : 0) |\n\t\t(font.strike ? 0x08 : 0) |\n\t\t(font.outline ? 0x10 : 0) |\n\t\t(font.shadow ? 0x20 : 0) |\n\t\t(font.condense ? 0x40 : 0) |\n\t\t(font.extend ? 0x80 : 0);\n\to.write_shift(1, grbit);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-OLEDS] 2.3.1 and 2.3.2 */\nfunction parse_ClipboardFormatOrString(o, w/*:number*/)/*:string*/ {\n\t// $FlowIgnore\n\tvar ClipFmt = { 2: \"BITMAP\", 3: \"METAFILEPICT\", 8: \"DIB\", 14: \"ENHMETAFILE\" };\n\tvar m/*:number*/ = o.read_shift(4);\n\tswitch (m) {\n\t\tcase 0x00000000: return \"\";\n\t\tcase 0xffffffff: case 0xfffffffe: return ClipFmt[o.read_shift(4)] || \"\";\n\t}\n\tif (m > 0x190) throw new Error(\"Unsupported Clipboard: \" + m.toString(16));\n\to.l -= 4;\n\treturn o.read_shift(0, w == 1 ? \"lpstr\" : \"lpwstr\");\n}\nfunction parse_ClipboardFormatOrAnsiString(o) { return parse_ClipboardFormatOrString(o, 1); }\nfunction parse_ClipboardFormatOrUnicodeString(o) { return parse_ClipboardFormatOrString(o, 2); }\n\n/* [MS-OLEPS] 2.2 PropertyType */\n// Note: some tree shakers cannot handle VT_VECTOR | $CONST, hence extra vars\n//var VT_EMPTY = 0x0000;\n//var VT_NULL = 0x0001;\nvar VT_I2 = 0x0002;\nvar VT_I4 = 0x0003;\n//var VT_R4 = 0x0004;\n//var VT_R8 = 0x0005;\n//var VT_CY = 0x0006;\n//var VT_DATE = 0x0007;\n//var VT_BSTR = 0x0008;\n//var VT_ERROR = 0x000A;\nvar VT_BOOL = 0x000B;\nvar VT_VARIANT = 0x000C;\n//var VT_DECIMAL = 0x000E;\n//var VT_I1 = 0x0010;\n//var VT_UI1 = 0x0011;\n//var VT_UI2 = 0x0012;\nvar VT_UI4 = 0x0013;\n//var VT_I8 = 0x0014;\n//var VT_UI8 = 0x0015;\n//var VT_INT = 0x0016;\n//var VT_UINT = 0x0017;\nvar VT_LPSTR = 0x001E;\n//var VT_LPWSTR = 0x001F;\nvar VT_FILETIME = 0x0040;\nvar VT_BLOB = 0x0041;\n//var VT_STREAM = 0x0042;\n//var VT_STORAGE = 0x0043;\n//var VT_STREAMED_Object = 0x0044;\n//var VT_STORED_Object = 0x0045;\n//var VT_BLOB_Object = 0x0046;\nvar VT_CF = 0x0047;\n//var VT_CLSID = 0x0048;\n//var VT_VERSIONED_STREAM = 0x0049;\nvar VT_VECTOR = 0x1000;\nvar VT_VECTOR_VARIANT = 0x100C;\nvar VT_VECTOR_LPSTR = 0x101E;\n//var VT_ARRAY = 0x2000;\n\nvar VT_STRING = 0x0050; // 2.3.3.1.11 VtString\nvar VT_USTR = 0x0051; // 2.3.3.1.12 VtUnalignedString\nvar VT_CUSTOM = [VT_STRING, VT_USTR];\n\n/* [MS-OSHARED] 2.3.3.2.2.1 Document Summary Information PIDDSI */\nvar DocSummaryPIDDSI = {\n\t/*::[*/0x01/*::]*/: { n: 'CodePage', t: VT_I2 },\n\t/*::[*/0x02/*::]*/: { n: 'Category', t: VT_STRING },\n\t/*::[*/0x03/*::]*/: { n: 'PresentationFormat', t: VT_STRING },\n\t/*::[*/0x04/*::]*/: { n: 'ByteCount', t: VT_I4 },\n\t/*::[*/0x05/*::]*/: { n: 'LineCount', t: VT_I4 },\n\t/*::[*/0x06/*::]*/: { n: 'ParagraphCount', t: VT_I4 },\n\t/*::[*/0x07/*::]*/: { n: 'SlideCount', t: VT_I4 },\n\t/*::[*/0x08/*::]*/: { n: 'NoteCount', t: VT_I4 },\n\t/*::[*/0x09/*::]*/: { n: 'HiddenCount', t: VT_I4 },\n\t/*::[*/0x0a/*::]*/: { n: 'MultimediaClipCount', t: VT_I4 },\n\t/*::[*/0x0b/*::]*/: { n: 'ScaleCrop', t: VT_BOOL },\n\t/*::[*/0x0c/*::]*/: { n: 'HeadingPairs', t: VT_VECTOR_VARIANT /* VT_VECTOR | VT_VARIANT */ },\n\t/*::[*/0x0d/*::]*/: { n: 'TitlesOfParts', t: VT_VECTOR_LPSTR /* VT_VECTOR | VT_LPSTR */ },\n\t/*::[*/0x0e/*::]*/: { n: 'Manager', t: VT_STRING },\n\t/*::[*/0x0f/*::]*/: { n: 'Company', t: VT_STRING },\n\t/*::[*/0x10/*::]*/: { n: 'LinksUpToDate', t: VT_BOOL },\n\t/*::[*/0x11/*::]*/: { n: 'CharacterCount', t: VT_I4 },\n\t/*::[*/0x13/*::]*/: { n: 'SharedDoc', t: VT_BOOL },\n\t/*::[*/0x16/*::]*/: { n: 'HyperlinksChanged', t: VT_BOOL },\n\t/*::[*/0x17/*::]*/: { n: 'AppVersion', t: VT_I4, p: 'version' },\n\t/*::[*/0x18/*::]*/: { n: 'DigSig', t: VT_BLOB },\n\t/*::[*/0x1A/*::]*/: { n: 'ContentType', t: VT_STRING },\n\t/*::[*/0x1B/*::]*/: { n: 'ContentStatus', t: VT_STRING },\n\t/*::[*/0x1C/*::]*/: { n: 'Language', t: VT_STRING },\n\t/*::[*/0x1D/*::]*/: { n: 'Version', t: VT_STRING },\n\t/*::[*/0xFF/*::]*/: {},\n\t/* [MS-OLEPS] 2.18 */\n\t/*::[*/0x80000000/*::]*/: { n: 'Locale', t: VT_UI4 },\n\t/*::[*/0x80000003/*::]*/: { n: 'Behavior', t: VT_UI4 },\n\t/*::[*/0x72627262/*::]*/: {}\n};\n\n/* [MS-OSHARED] 2.3.3.2.1.1 Summary Information Property Set PIDSI */\nvar SummaryPIDSI = {\n\t/*::[*/0x01/*::]*/: { n: 'CodePage', t: VT_I2 },\n\t/*::[*/0x02/*::]*/: { n: 'Title', t: VT_STRING },\n\t/*::[*/0x03/*::]*/: { n: 'Subject', t: VT_STRING },\n\t/*::[*/0x04/*::]*/: { n: 'Author', t: VT_STRING },\n\t/*::[*/0x05/*::]*/: { n: 'Keywords', t: VT_STRING },\n\t/*::[*/0x06/*::]*/: { n: 'Comments', t: VT_STRING },\n\t/*::[*/0x07/*::]*/: { n: 'Template', t: VT_STRING },\n\t/*::[*/0x08/*::]*/: { n: 'LastAuthor', t: VT_STRING },\n\t/*::[*/0x09/*::]*/: { n: 'RevNumber', t: VT_STRING },\n\t/*::[*/0x0A/*::]*/: { n: 'EditTime', t: VT_FILETIME },\n\t/*::[*/0x0B/*::]*/: { n: 'LastPrinted', t: VT_FILETIME },\n\t/*::[*/0x0C/*::]*/: { n: 'CreatedDate', t: VT_FILETIME },\n\t/*::[*/0x0D/*::]*/: { n: 'ModifiedDate', t: VT_FILETIME },\n\t/*::[*/0x0E/*::]*/: { n: 'PageCount', t: VT_I4 },\n\t/*::[*/0x0F/*::]*/: { n: 'WordCount', t: VT_I4 },\n\t/*::[*/0x10/*::]*/: { n: 'CharCount', t: VT_I4 },\n\t/*::[*/0x11/*::]*/: { n: 'Thumbnail', t: VT_CF },\n\t/*::[*/0x12/*::]*/: { n: 'Application', t: VT_STRING },\n\t/*::[*/0x13/*::]*/: { n: 'DocSecurity', t: VT_I4 },\n\t/*::[*/0xFF/*::]*/: {},\n\t/* [MS-OLEPS] 2.18 */\n\t/*::[*/0x80000000/*::]*/: { n: 'Locale', t: VT_UI4 },\n\t/*::[*/0x80000003/*::]*/: { n: 'Behavior', t: VT_UI4 },\n\t/*::[*/0x72627262/*::]*/: {}\n};\n\n/* [MS-XLS] 2.4.63 Country/Region codes */\nvar CountryEnum = {\n\t/*::[*/0x0001/*::]*/: \"US\", // United States\n\t/*::[*/0x0002/*::]*/: \"CA\", // Canada\n\t/*::[*/0x0003/*::]*/: \"\", // Latin America (except Brazil)\n\t/*::[*/0x0007/*::]*/: \"RU\", // Russia\n\t/*::[*/0x0014/*::]*/: \"EG\", // Egypt\n\t/*::[*/0x001E/*::]*/: \"GR\", // Greece\n\t/*::[*/0x001F/*::]*/: \"NL\", // Netherlands\n\t/*::[*/0x0020/*::]*/: \"BE\", // Belgium\n\t/*::[*/0x0021/*::]*/: \"FR\", // France\n\t/*::[*/0x0022/*::]*/: \"ES\", // Spain\n\t/*::[*/0x0024/*::]*/: \"HU\", // Hungary\n\t/*::[*/0x0027/*::]*/: \"IT\", // Italy\n\t/*::[*/0x0029/*::]*/: \"CH\", // Switzerland\n\t/*::[*/0x002B/*::]*/: \"AT\", // Austria\n\t/*::[*/0x002C/*::]*/: \"GB\", // United Kingdom\n\t/*::[*/0x002D/*::]*/: \"DK\", // Denmark\n\t/*::[*/0x002E/*::]*/: \"SE\", // Sweden\n\t/*::[*/0x002F/*::]*/: \"NO\", // Norway\n\t/*::[*/0x0030/*::]*/: \"PL\", // Poland\n\t/*::[*/0x0031/*::]*/: \"DE\", // Germany\n\t/*::[*/0x0034/*::]*/: \"MX\", // Mexico\n\t/*::[*/0x0037/*::]*/: \"BR\", // Brazil\n\t/*::[*/0x003d/*::]*/: \"AU\", // Australia\n\t/*::[*/0x0040/*::]*/: \"NZ\", // New Zealand\n\t/*::[*/0x0042/*::]*/: \"TH\", // Thailand\n\t/*::[*/0x0051/*::]*/: \"JP\", // Japan\n\t/*::[*/0x0052/*::]*/: \"KR\", // Korea\n\t/*::[*/0x0054/*::]*/: \"VN\", // Viet Nam\n\t/*::[*/0x0056/*::]*/: \"CN\", // China\n\t/*::[*/0x005A/*::]*/: \"TR\", // Turkey\n\t/*::[*/0x0069/*::]*/: \"JS\", // Ramastan\n\t/*::[*/0x00D5/*::]*/: \"DZ\", // Algeria\n\t/*::[*/0x00D8/*::]*/: \"MA\", // Morocco\n\t/*::[*/0x00DA/*::]*/: \"LY\", // Libya\n\t/*::[*/0x015F/*::]*/: \"PT\", // Portugal\n\t/*::[*/0x0162/*::]*/: \"IS\", // Iceland\n\t/*::[*/0x0166/*::]*/: \"FI\", // Finland\n\t/*::[*/0x01A4/*::]*/: \"CZ\", // Czech Republic\n\t/*::[*/0x0376/*::]*/: \"TW\", // Taiwan\n\t/*::[*/0x03C1/*::]*/: \"LB\", // Lebanon\n\t/*::[*/0x03C2/*::]*/: \"JO\", // Jordan\n\t/*::[*/0x03C3/*::]*/: \"SY\", // Syria\n\t/*::[*/0x03C4/*::]*/: \"IQ\", // Iraq\n\t/*::[*/0x03C5/*::]*/: \"KW\", // Kuwait\n\t/*::[*/0x03C6/*::]*/: \"SA\", // Saudi Arabia\n\t/*::[*/0x03CB/*::]*/: \"AE\", // United Arab Emirates\n\t/*::[*/0x03CC/*::]*/: \"IL\", // Israel\n\t/*::[*/0x03CE/*::]*/: \"QA\", // Qatar\n\t/*::[*/0x03D5/*::]*/: \"IR\", // Iran\n\t/*::[*/0xFFFF/*::]*/: \"US\" // United States\n};\n\n/* [MS-XLS] 2.5.127 */\nvar XLSFillPattern = [\n\tnull,\n\t'solid',\n\t'mediumGray',\n\t'darkGray',\n\t'lightGray',\n\t'darkHorizontal',\n\t'darkVertical',\n\t'darkDown',\n\t'darkUp',\n\t'darkGrid',\n\t'darkTrellis',\n\t'lightHorizontal',\n\t'lightVertical',\n\t'lightDown',\n\t'lightUp',\n\t'lightGrid',\n\t'lightTrellis',\n\t'gray125',\n\t'gray0625'\n];\n\nfunction rgbify(arr/*:Array*/)/*:Array<[number, number, number]>*/ { return arr.map(function(x) { return [(x>>16)&255,(x>>8)&255,x&255]; }); }\n\n/* [MS-XLS] 2.5.161 */\n/* [MS-XLSB] 2.5.75 Icv */\nvar _XLSIcv = /*#__PURE__*/ rgbify([\n\t/* Color Constants */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t/* Overridable Defaults */\n\t0x000000,\n\t0xFFFFFF,\n\t0xFF0000,\n\t0x00FF00,\n\t0x0000FF,\n\t0xFFFF00,\n\t0xFF00FF,\n\t0x00FFFF,\n\n\t0x800000,\n\t0x008000,\n\t0x000080,\n\t0x808000,\n\t0x800080,\n\t0x008080,\n\t0xC0C0C0,\n\t0x808080,\n\t0x9999FF,\n\t0x993366,\n\t0xFFFFCC,\n\t0xCCFFFF,\n\t0x660066,\n\t0xFF8080,\n\t0x0066CC,\n\t0xCCCCFF,\n\n\t0x000080,\n\t0xFF00FF,\n\t0xFFFF00,\n\t0x00FFFF,\n\t0x800080,\n\t0x800000,\n\t0x008080,\n\t0x0000FF,\n\t0x00CCFF,\n\t0xCCFFFF,\n\t0xCCFFCC,\n\t0xFFFF99,\n\t0x99CCFF,\n\t0xFF99CC,\n\t0xCC99FF,\n\t0xFFCC99,\n\n\t0x3366FF,\n\t0x33CCCC,\n\t0x99CC00,\n\t0xFFCC00,\n\t0xFF9900,\n\t0xFF6600,\n\t0x666699,\n\t0x969696,\n\t0x003366,\n\t0x339966,\n\t0x003300,\n\t0x333300,\n\t0x993300,\n\t0x993366,\n\t0x333399,\n\t0x333333,\n\n\t/* Other entries to appease BIFF8/12 */\n\t0xFFFFFF, /* 0x40 icvForeground ?? */\n\t0x000000, /* 0x41 icvBackground ?? */\n\t0x000000, /* 0x42 icvFrame ?? */\n\t0x000000, /* 0x43 icv3D ?? */\n\t0x000000, /* 0x44 icv3DText ?? */\n\t0x000000, /* 0x45 icv3DHilite ?? */\n\t0x000000, /* 0x46 icv3DShadow ?? */\n\t0x000000, /* 0x47 icvHilite ?? */\n\t0x000000, /* 0x48 icvCtlText ?? */\n\t0x000000, /* 0x49 icvCtlScrl ?? */\n\t0x000000, /* 0x4A icvCtlInv ?? */\n\t0x000000, /* 0x4B icvCtlBody ?? */\n\t0x000000, /* 0x4C icvCtlFrame ?? */\n\t0x000000, /* 0x4D icvCtlFore ?? */\n\t0x000000, /* 0x4E icvCtlBack ?? */\n\t0x000000, /* 0x4F icvCtlNeutral */\n\t0x000000, /* 0x50 icvInfoBk ?? */\n\t0x000000 /* 0x51 icvInfoText ?? */\n]);\nvar XLSIcv = /*#__PURE__*/dup(_XLSIcv);\n\n/* [MS-XLSB] 2.5.97.2 */\nvar BErr = {\n\t/*::[*/0x00/*::]*/: \"#NULL!\",\n\t/*::[*/0x07/*::]*/: \"#DIV/0!\",\n\t/*::[*/0x0F/*::]*/: \"#VALUE!\",\n\t/*::[*/0x17/*::]*/: \"#REF!\",\n\t/*::[*/0x1D/*::]*/: \"#NAME?\",\n\t/*::[*/0x24/*::]*/: \"#NUM!\",\n\t/*::[*/0x2A/*::]*/: \"#N/A\",\n\t/*::[*/0x2B/*::]*/: \"#GETTING_DATA\",\n\t/*::[*/0xFF/*::]*/: \"#WTF?\"\n};\n//var RBErr = evert_num(BErr);\nvar RBErr = {\n\t\"#NULL!\": 0x00,\n\t\"#DIV/0!\": 0x07,\n\t\"#VALUE!\": 0x0F,\n\t\"#REF!\": 0x17,\n\t\"#NAME?\": 0x1D,\n\t\"#NUM!\": 0x24,\n\t\"#N/A\": 0x2A,\n\t\"#GETTING_DATA\": 0x2B,\n\t\"#WTF?\": 0xFF\n};\n\n/* Parts enumerated in OPC spec, MS-XLSB and MS-XLSX */\n/* 12.3 Part Summary */\n/* 14.2 Part Summary */\n/* [MS-XLSX] 2.1 Part Enumerations ; [MS-XLSB] 2.1.7 Part Enumeration */\nvar ct2type/*{[string]:string}*/ = ({\n\t/* Workbook */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\": \"workbooks\",\n\t\"application/vnd.ms-excel.sheet.macroEnabled.main+xml\": \"workbooks\",\n\t\"application/vnd.ms-excel.sheet.binary.macroEnabled.main\": \"workbooks\",\n\t\"application/vnd.ms-excel.addin.macroEnabled.main+xml\": \"workbooks\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\": \"workbooks\",\n\n\t/* Worksheet */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\": \"sheets\",\n\t\"application/vnd.ms-excel.worksheet\": \"sheets\",\n\t\"application/vnd.ms-excel.binIndexWs\": \"TODO\", /* Binary Index */\n\n\t/* Chartsheet */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\": \"charts\",\n\t\"application/vnd.ms-excel.chartsheet\": \"charts\",\n\n\t/* Macrosheet */\n\t\"application/vnd.ms-excel.macrosheet+xml\": \"macros\",\n\t\"application/vnd.ms-excel.macrosheet\": \"macros\",\n\t\"application/vnd.ms-excel.intlmacrosheet\": \"TODO\",\n\t\"application/vnd.ms-excel.binIndexMs\": \"TODO\", /* Binary Index */\n\n\t/* Dialogsheet */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\": \"dialogs\",\n\t\"application/vnd.ms-excel.dialogsheet\": \"dialogs\",\n\n\t/* Shared Strings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\": \"strs\",\n\t\"application/vnd.ms-excel.sharedStrings\": \"strs\",\n\n\t/* Styles */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\": \"styles\",\n\t\"application/vnd.ms-excel.styles\": \"styles\",\n\n\t/* File Properties */\n\t\"application/vnd.openxmlformats-package.core-properties+xml\": \"coreprops\",\n\t\"application/vnd.openxmlformats-officedocument.custom-properties+xml\": \"custprops\",\n\t\"application/vnd.openxmlformats-officedocument.extended-properties+xml\": \"extprops\",\n\n\t/* Custom Data Properties */\n\t\"application/vnd.openxmlformats-officedocument.customXmlProperties+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.customProperty\": \"TODO\",\n\n\t/* Comments */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\": \"comments\",\n\t\"application/vnd.ms-excel.comments\": \"comments\",\n\t\"application/vnd.ms-excel.threadedcomments+xml\": \"threadedcomments\",\n\t\"application/vnd.ms-excel.person+xml\": \"people\",\n\n\t/* Metadata (Stock/Geography and Dynamic Array) */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\": \"metadata\",\n\t\"application/vnd.ms-excel.sheetMetadata\": \"metadata\",\n\n\t/* PivotTable */\n\t\"application/vnd.ms-excel.pivotTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml\": \"TODO\",\n\n\t/* Chart Objects */\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chart+xml\": \"TODO\",\n\n\t/* Chart Colors */\n\t\"application/vnd.ms-office.chartcolorstyle+xml\": \"TODO\",\n\n\t/* Chart Style */\n\t\"application/vnd.ms-office.chartstyle+xml\": \"TODO\",\n\n\t/* Chart Advanced */\n\t\"application/vnd.ms-office.chartex+xml\": \"TODO\",\n\n\t/* Calculation Chain */\n\t\"application/vnd.ms-excel.calcChain\": \"calcchains\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.calcChain+xml\": \"calcchains\",\n\n\t/* Printer Settings */\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.printerSettings\": \"TODO\",\n\n\t/* ActiveX */\n\t\"application/vnd.ms-office.activeX\": \"TODO\",\n\t\"application/vnd.ms-office.activeX+xml\": \"TODO\",\n\n\t/* Custom Toolbars */\n\t\"application/vnd.ms-excel.attachedToolbars\": \"TODO\",\n\n\t/* External Data Connections */\n\t\"application/vnd.ms-excel.connections\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.connections+xml\": \"TODO\",\n\n\t/* External Links */\n\t\"application/vnd.ms-excel.externalLink\": \"links\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.externalLink+xml\": \"links\",\n\n\t/* PivotCache */\n\t\"application/vnd.ms-excel.pivotCacheDefinition\": \"TODO\",\n\t\"application/vnd.ms-excel.pivotCacheRecords\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml\": \"TODO\",\n\n\t/* Query Table */\n\t\"application/vnd.ms-excel.queryTable\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.queryTable+xml\": \"TODO\",\n\n\t/* Shared Workbook */\n\t\"application/vnd.ms-excel.userNames\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionHeaders\": \"TODO\",\n\t\"application/vnd.ms-excel.revisionLog\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionHeaders+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.revisionLog+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.userNames+xml\": \"TODO\",\n\n\t/* Single Cell Table */\n\t\"application/vnd.ms-excel.tableSingleCells\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.tableSingleCells+xml\": \"TODO\",\n\n\t/* Slicer */\n\t\"application/vnd.ms-excel.slicer\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache\": \"TODO\",\n\t\"application/vnd.ms-excel.slicer+xml\": \"TODO\",\n\t\"application/vnd.ms-excel.slicerCache+xml\": \"TODO\",\n\n\t/* Sort Map */\n\t\"application/vnd.ms-excel.wsSortMap\": \"TODO\",\n\n\t/* Table */\n\t\"application/vnd.ms-excel.table\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.table+xml\": \"TODO\",\n\n\t/* Themes */\n\t\"application/vnd.openxmlformats-officedocument.theme+xml\": \"themes\",\n\n\t/* Theme Override */\n\t\"application/vnd.openxmlformats-officedocument.themeOverride+xml\": \"TODO\",\n\n\t/* Timeline */\n\t\"application/vnd.ms-excel.Timeline+xml\": \"TODO\", /* verify */\n\t\"application/vnd.ms-excel.TimelineCache+xml\": \"TODO\", /* verify */\n\n\t/* VBA */\n\t\"application/vnd.ms-office.vbaProject\": \"vba\",\n\t\"application/vnd.ms-office.vbaProjectSignature\": \"TODO\",\n\n\t/* Volatile Dependencies */\n\t\"application/vnd.ms-office.volatileDependencies\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.spreadsheetml.volatileDependencies+xml\": \"TODO\",\n\n\t/* Control Properties */\n\t\"application/vnd.ms-excel.controlproperties+xml\": \"TODO\",\n\n\t/* Data Model */\n\t\"application/vnd.openxmlformats-officedocument.model+data\": \"TODO\",\n\n\t/* Survey */\n\t\"application/vnd.ms-excel.Survey+xml\": \"TODO\",\n\n\t/* Drawing */\n\t\"application/vnd.openxmlformats-officedocument.drawing+xml\": \"drawings\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramColors+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramData+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramLayout+xml\": \"TODO\",\n\t\"application/vnd.openxmlformats-officedocument.drawingml.diagramStyle+xml\": \"TODO\",\n\n\t/* VML */\n\t\"application/vnd.openxmlformats-officedocument.vmlDrawing\": \"TODO\",\n\n\t\"application/vnd.openxmlformats-package.relationships+xml\": \"rels\",\n\t\"application/vnd.openxmlformats-officedocument.oleObject\": \"TODO\",\n\n\t/* Image */\n\t\"image/png\": \"TODO\",\n\n\t\"sheet\": \"js\"\n}/*:any*/);\n\nvar CT_LIST = {\n\t\tworkbooks: {\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\",\n\t\t\txlsm: \"application/vnd.ms-excel.sheet.macroEnabled.main+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheet.binary.macroEnabled.main\",\n\t\t\txlam: \"application/vnd.ms-excel.addin.macroEnabled.main+xml\",\n\t\t\txltx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.template.main+xml\"\n\t\t},\n\t\tstrs: { /* Shared Strings */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sharedStrings\"\n\t\t},\n\t\tcomments: { /* Comments */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.comments\"\n\t\t},\n\t\tsheets: { /* Worksheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.worksheet\"\n\t\t},\n\t\tcharts: { /* Chartsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.chartsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.chartsheet\"\n\t\t},\n\t\tdialogs: { /* Dialogsheet */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.dialogsheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.dialogsheet\"\n\t\t},\n\t\tmacros: { /* Macrosheet (Excel 4.0 Macros) */\n\t\t\txlsx: \"application/vnd.ms-excel.macrosheet+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.macrosheet\"\n\t\t},\n\t\tmetadata: { /* Metadata (Stock/Geography and Dynamic Array) */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.sheetMetadata+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.sheetMetadata\"\n\t\t},\n\t\tstyles: { /* Styles */\n\t\t\txlsx: \"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\",\n\t\t\txlsb: \"application/vnd.ms-excel.styles\"\n\t\t}\n};\n\nfunction new_ct()/*:any*/ {\n\treturn ({\n\t\tworkbooks:[], sheets:[], charts:[], dialogs:[], macros:[],\n\t\trels:[], strs:[], comments:[], threadedcomments:[], links:[],\n\t\tcoreprops:[], extprops:[], custprops:[], themes:[], styles:[],\n\t\tcalcchains:[], vba: [], drawings: [], metadata: [], people:[],\n\t\tTODO:[], xmlns: \"\" }/*:any*/);\n}\n\nfunction parse_ct(data/*:?string*/) {\n\tvar ct = new_ct();\n\tif(!data || !data.match) return ct;\n\tvar ctext = {};\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0].replace(nsregex,\"<\")) {\n\t\t\tcase ' 0 ? ct.calcchains[0] : \"\";\n\tct.sst = ct.strs.length > 0 ? ct.strs[0] : \"\";\n\tct.style = ct.styles.length > 0 ? ct.styles[0] : \"\";\n\tct.defaults = ctext;\n\tdelete ct.calcchains;\n\treturn ct;\n}\n\nfunction write_ct(ct, opts)/*:string*/ {\n\tvar type2ct/*{[string]:Array}*/ = evert_arr(ct2type);\n\n\tvar o/*:Array*/ = [], v;\n\to[o.length] = (XML_HEADER);\n\to[o.length] = writextag('Types', null, {\n\t\t'xmlns': XMLNS.CT,\n\t\t'xmlns:xsd': XMLNS.xsd,\n\t\t'xmlns:xsi': XMLNS.xsi\n\t});\n\n\to = o.concat([\n\t\t['xml', 'application/xml'],\n\t\t['bin', 'application/vnd.ms-excel.sheet.binary.macroEnabled.main'],\n\t\t['vml', 'application/vnd.openxmlformats-officedocument.vmlDrawing'],\n\t\t['data', 'application/vnd.openxmlformats-officedocument.model+data'],\n\t\t/* from test files */\n\t\t['bmp', 'image/bmp'],\n\t\t['png', 'image/png'],\n\t\t['gif', 'image/gif'],\n\t\t['emf', 'image/x-emf'],\n\t\t['wmf', 'image/x-wmf'],\n\t\t['jpg', 'image/jpeg'], ['jpeg', 'image/jpeg'],\n\t\t['tif', 'image/tiff'], ['tiff', 'image/tiff'],\n\t\t['pdf', 'application/pdf'],\n\t\t['rels', 'application/vnd.openxmlformats-package.relationships+xml']\n\t].map(function(x) {\n\t\treturn writextag('Default', null, {'Extension':x[0], 'ContentType': x[1]});\n\t}));\n\n\t/* only write first instance */\n\tvar f1 = function(w) {\n\t\tif(ct[w] && ct[w].length > 0) {\n\t\t\tv = ct[w][0];\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx']\n\t\t\t}));\n\t\t}\n\t};\n\n\t/* book type-specific */\n\tvar f2 = function(w) {\n\t\t(ct[w]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': CT_LIST[w][opts.bookType] || CT_LIST[w]['xlsx']\n\t\t\t}));\n\t\t});\n\t};\n\n\t/* standard type */\n\tvar f3 = function(t) {\n\t\t(ct[t]||[]).forEach(function(v) {\n\t\t\to[o.length] = (writextag('Override', null, {\n\t\t\t\t'PartName': (v[0] == '/' ? \"\":\"/\") + v,\n\t\t\t\t'ContentType': type2ct[t][0]\n\t\t\t}));\n\t\t});\n\t};\n\n\tf1('workbooks');\n\tf2('sheets');\n\tf2('charts');\n\tf3('themes');\n\t['strs', 'styles'].forEach(f1);\n\t['coreprops', 'extprops', 'custprops'].forEach(f3);\n\tf3('vba');\n\tf3('comments');\n\tf3('threadedcomments');\n\tf3('drawings');\n\tf2('metadata');\n\tf3('people');\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 9.3 Relationships */\nvar RELS = ({\n\tWB: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tSHEET: \"http://sheetjs.openxmlformats.org/officeDocument/2006/relationships/officeDocument\",\n\tHLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink\",\n\tVML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing\",\n\tXPATH: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLinkPath\",\n\tXMISS: \"http://schemas.microsoft.com/office/2006/relationships/xlExternalLinkPath/xlPathMissing\",\n\tXLINK: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/externalLink\",\n\tCXML: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXml\",\n\tCXMLP: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/customXmlProps\",\n\tCMNT: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments\",\n\tCORE_PROPS: \"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\",\n\tEXT_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/extended-properties',\n\tCUST_PROPS: 'http://schemas.openxmlformats.org/officeDocument/2006/relationships/custom-properties',\n\tSST: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings\",\n\tSTY: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\",\n\tTHEME: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/theme\",\n\tCHART: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chart\",\n\tCHARTEX: \"http://schemas.microsoft.com/office/2014/relationships/chartEx\",\n\tCS: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/chartsheet\",\n\tWS: [\n\t\t\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\",\n\t\t\"http://purl.oclc.org/ooxml/officeDocument/relationships/worksheet\"\n\t],\n\tDS: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/dialogsheet\",\n\tMS: \"http://schemas.microsoft.com/office/2006/relationships/xlMacrosheet\",\n\tIMG: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image\",\n\tDRAW: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing\",\n\tXLMETA: \"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sheetMetadata\",\n\tTCMNT: \"http://schemas.microsoft.com/office/2017/10/relationships/threadedComment\",\n\tPEOPLE: \"http://schemas.microsoft.com/office/2017/10/relationships/person\",\n\tVBA: \"http://schemas.microsoft.com/office/2006/relationships/vbaProject\"\n}/*:any*/);\n\n\n/* 9.3.3 Representing Relationships */\nfunction get_rels_path(file/*:string*/)/*:string*/ {\n\tvar n = file.lastIndexOf(\"/\");\n\treturn file.slice(0,n+1) + '_rels/' + file.slice(n+1) + \".rels\";\n}\n\nfunction parse_rels(data/*:?string*/, currentFilePath/*:string*/) {\n\tvar rels = {\"!id\":{}};\n\tif (!data) return rels;\n\tif (currentFilePath.charAt(0) !== '/') {\n\t\tcurrentFilePath = '/'+currentFilePath;\n\t}\n\tvar hash = {};\n\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\t/* 9.3.2.2 OPC_Relationships */\n\t\tif (y[0] === '2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\nfunction add_rels(rels, rId/*:number*/, f, type, relobj, targetmode/*:?string*/)/*:number*/ {\n\tif(!relobj) relobj = {};\n\tif(!rels['!id']) rels['!id'] = {};\n\tif(!rels['!idx']) rels['!idx'] = 1;\n\tif(rId < 0) for(rId = rels['!idx']; rels['!id']['rId' + rId]; ++rId){/* empty */}\n\trels['!idx'] = rId + 1;\n\trelobj.Id = 'rId' + rId;\n\trelobj.Type = type;\n\trelobj.Target = f;\n\tif(targetmode) relobj.TargetMode = targetmode;\n\telse if([RELS.HLINK, RELS.XPATH, RELS.XMISS].indexOf(relobj.Type) > -1) relobj.TargetMode = \"External\";\n\tif(rels['!id'][relobj.Id]) throw new Error(\"Cannot rewrite rId \" + rId);\n\trels['!id'][relobj.Id] = relobj;\n\trels[('/' + relobj.Target).replace(\"//\",\"/\")] = relobj;\n\treturn rId;\n}\n/* Open Document Format for Office Applications (OpenDocument) Version 1.2 */\n/* Part 3 Section 4 Manifest File */\nvar CT_ODS = \"application/vnd.oasis.opendocument.spreadsheet\";\nfunction parse_manifest(d, opts) {\n\tvar str = xlml_normalize(d);\n\tvar Rn;\n\tvar FEtag;\n\twhile((Rn = xlmlregex.exec(str))) switch(Rn[3]) {\n\t\tcase 'manifest': break; // 4.2 \n\t\tcase 'file-entry': // 4.3 \n\t\t\tFEtag = parsexmltag(Rn[0], false);\n\t\t\tif(FEtag.path == '/' && FEtag.type !== CT_ODS) throw new Error(\"This OpenDocument is not a spreadsheet\");\n\t\t\tbreak;\n\t\tcase 'encryption-data': // 4.4 \n\t\tcase 'algorithm': // 4.5 \n\t\tcase 'start-key-generation': // 4.6 \n\t\tcase 'key-derivation': // 4.7 \n\t\t\tthrow new Error(\"Unsupported ODS Encryption\");\n\t\tdefault: if(opts && opts.WTF) throw Rn;\n\t}\n}\n\nfunction write_manifest(manifest/*:Array >*/)/*:string*/ {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\to.push(' \\n');\n\tfor(var i = 0; i < manifest.length; ++i) o.push(' \\n');\n\to.push('');\n\treturn o.join(\"\");\n}\n\n/* Part 3 Section 6 Metadata Manifest File */\nfunction write_rdf_type(file/*:string*/, res/*:string*/, tag/*:?string*/) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf_has(base/*:string*/, file/*:string*/) {\n\treturn [\n\t\t' \\n',\n\t\t' \\n',\n\t\t' \\n'\n\t].join(\"\");\n}\nfunction write_rdf(rdf) {\n\tvar o = [XML_HEADER];\n\to.push('\\n');\n\tfor(var i = 0; i != rdf.length; ++i) {\n\t\to.push(write_rdf_type(rdf[i][0], rdf[i][1]));\n\t\to.push(write_rdf_has(\"\",rdf[i][0]));\n\t}\n\to.push(write_rdf_type(\"\",\"Document\", \"pkg\"));\n\to.push('');\n\treturn o.join(\"\");\n}\n/* TODO: pull properties */\nfunction write_meta_ods(/*:: wb: Workbook, opts: any*/)/*:string*/ {\n\treturn 'Sheet' + 'JS ' + XLSX.version + '';\n}\n\n/* ECMA-376 Part II 11.1 Core Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar CORE_PROPS/*:Array >*/ = [\n\t[\"cp:category\", \"Category\"],\n\t[\"cp:contentStatus\", \"ContentStatus\"],\n\t[\"cp:keywords\", \"Keywords\"],\n\t[\"cp:lastModifiedBy\", \"LastAuthor\"],\n\t[\"cp:lastPrinted\", \"LastPrinted\"],\n\t[\"cp:revision\", \"RevNumber\"],\n\t[\"cp:version\", \"Version\"],\n\t[\"dc:creator\", \"Author\"],\n\t[\"dc:description\", \"Comments\"],\n\t[\"dc:identifier\", \"Identifier\"],\n\t[\"dc:language\", \"Language\"],\n\t[\"dc:subject\", \"Subject\"],\n\t[\"dc:title\", \"Title\"],\n\t[\"dcterms:created\", \"CreatedDate\", 'date'],\n\t[\"dcterms:modified\", \"ModifiedDate\", 'date']\n];\n\nvar CORE_PROPS_REGEX/*:Array*/ = /*#__PURE__*/(function() {\n\tvar r = new Array(CORE_PROPS.length);\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar g = \"(?:\"+ f[0].slice(0,f[0].indexOf(\":\")) +\":)\"+ f[0].slice(f[0].indexOf(\":\")+1);\n\t\tr[i] = new RegExp(\"<\" + g + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + g + \">\");\n\t}\n\treturn r;\n})();\n\nfunction parse_core_props(data) {\n\tvar p = {};\n\tdata = utf8read(data);\n\n\tfor(var i = 0; i < CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i], cur = data.match(CORE_PROPS_REGEX[i]);\n\t\tif(cur != null && cur.length > 0) p[f[1]] = unescapexml(cur[1]);\n\t\tif(f[2] === 'date' && p[f[1]]) p[f[1]] = parseDate(p[f[1]]);\n\t}\n\n\treturn p;\n}\n\nfunction cp_doit(f, g, h, o, p) {\n\tif(p[f] != null || g == null || g === \"\") return;\n\tp[f] = g;\n\tg = escapexml(g);\n\to[o.length] = (h ? writextag(f,g,h) : writetag(f,g));\n}\n\nfunction write_core_props(cp, _opts) {\n\tvar opts = _opts || {};\n\tvar o = [XML_HEADER, writextag('cp:coreProperties', null, {\n\t\t//'xmlns': XMLNS.CORE_PROPS,\n\t\t'xmlns:cp': XMLNS.CORE_PROPS,\n\t\t'xmlns:dc': XMLNS.dc,\n\t\t'xmlns:dcterms': XMLNS.dcterms,\n\t\t'xmlns:dcmitype': XMLNS.dcmitype,\n\t\t'xmlns:xsi': XMLNS.xsi\n\t})], p = {};\n\tif(!cp && !opts.Props) return o.join(\"\");\n\n\tif(cp) {\n\t\tif(cp.CreatedDate != null) cp_doit(\"dcterms:created\", typeof cp.CreatedDate === \"string\" ? cp.CreatedDate : write_w3cdtf(cp.CreatedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t\tif(cp.ModifiedDate != null) cp_doit(\"dcterms:modified\", typeof cp.ModifiedDate === \"string\" ? cp.ModifiedDate : write_w3cdtf(cp.ModifiedDate, opts.WTF), {\"xsi:type\":\"dcterms:W3CDTF\"}, o, p);\n\t}\n\n\tfor(var i = 0; i != CORE_PROPS.length; ++i) {\n\t\tvar f = CORE_PROPS[i];\n\t\tvar v = opts.Props && opts.Props[f[1]] != null ? opts.Props[f[1]] : cp ? cp[f[1]] : null;\n\t\tif(v === true) v = \"1\";\n\t\telse if(v === false) v = \"0\";\n\t\telse if(typeof v == \"number\") v = String(v);\n\t\tif(v != null) cp_doit(f[0], v, null, o, p);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.3 Extended File Properties Part */\n/* [MS-OSHARED] 2.3.3.2.[1-2].1 (PIDSI/PIDDSI) */\nvar EXT_PROPS/*:Array >*/ = [\n\t[\"Application\", \"Application\", \"string\"],\n\t[\"AppVersion\", \"AppVersion\", \"string\"],\n\t[\"Company\", \"Company\", \"string\"],\n\t[\"DocSecurity\", \"DocSecurity\", \"string\"],\n\t[\"Manager\", \"Manager\", \"string\"],\n\t[\"HyperlinksChanged\", \"HyperlinksChanged\", \"bool\"],\n\t[\"SharedDoc\", \"SharedDoc\", \"bool\"],\n\t[\"LinksUpToDate\", \"LinksUpToDate\", \"bool\"],\n\t[\"ScaleCrop\", \"ScaleCrop\", \"bool\"],\n\t[\"HeadingPairs\", \"HeadingPairs\", \"raw\"],\n\t[\"TitlesOfParts\", \"TitlesOfParts\", \"raw\"]\n];\n\nvar PseudoPropsPairs = [\n\t\"Worksheets\", \"SheetNames\",\n\t\"NamedRanges\", \"DefinedNames\",\n\t\"Chartsheets\", \"ChartNames\"\n];\nfunction load_props_pairs(HP/*:string|Array>*/, TOP, props, opts) {\n\tvar v = [];\n\tif(typeof HP == \"string\") v = parseVector(HP, opts);\n\telse for(var j = 0; j < HP.length; ++j) v = v.concat(HP[j].map(function(hp) { return {v:hp}; }));\n\tvar parts = (typeof TOP == \"string\") ? parseVector(TOP, opts).map(function (x) { return x.v; }) : TOP;\n\tvar idx = 0, len = 0;\n\tif(parts.length > 0) for(var i = 0; i !== v.length; i += 2) {\n\t\tlen = +(v[i+1].v);\n\t\tswitch(v[i].v) {\n\t\t\tcase \"Worksheets\":\n\t\t\tcase \"工作表\":\n\t\t\tcase \"Листы\":\n\t\t\tcase \"أوراق العمل\":\n\t\t\tcase \"ワークシート\":\n\t\t\tcase \"גליונות עבודה\":\n\t\t\tcase \"Arbeitsblätter\":\n\t\t\tcase \"Çalışma Sayfaları\":\n\t\t\tcase \"Feuilles de calcul\":\n\t\t\tcase \"Fogli di lavoro\":\n\t\t\tcase \"Folhas de cálculo\":\n\t\t\tcase \"Planilhas\":\n\t\t\tcase \"Regneark\":\n\t\t\tcase \"Hojas de cálculo\":\n\t\t\tcase \"Werkbladen\":\n\t\t\t\tprops.Worksheets = len;\n\t\t\t\tprops.SheetNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Named Ranges\":\n\t\t\tcase \"Rangos con nombre\":\n\t\t\tcase \"名前付き一覧\":\n\t\t\tcase \"Benannte Bereiche\":\n\t\t\tcase \"Navngivne områder\":\n\t\t\t\tprops.NamedRanges = len;\n\t\t\t\tprops.DefinedNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\n\t\t\tcase \"Charts\":\n\t\t\tcase \"Diagramme\":\n\t\t\t\tprops.Chartsheets = len;\n\t\t\t\tprops.ChartNames = parts.slice(idx, idx + len);\n\t\t\t\tbreak;\n\t\t}\n\t\tidx += len;\n\t}\n}\n\nfunction parse_ext_props(data, p, opts) {\n\tvar q = {}; if(!p) p = {};\n\tdata = utf8read(data);\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tvar xml = (data.match(matchtag(f[0]))||[])[1];\n\t\tswitch(f[2]) {\n\t\t\tcase \"string\": if(xml) p[f[1]] = unescapexml(xml); break;\n\t\t\tcase \"bool\": p[f[1]] = xml === \"true\"; break;\n\t\t\tcase \"raw\":\n\t\t\t\tvar cur = data.match(new RegExp(\"<\" + f[0] + \"[^>]*>([\\\\s\\\\S]*?)<\\/\" + f[0] + \">\"));\n\t\t\t\tif(cur && cur.length > 0) q[f[1]] = cur[1];\n\t\t\t\tbreak;\n\t\t}\n\t});\n\n\tif(q.HeadingPairs && q.TitlesOfParts) load_props_pairs(q.HeadingPairs, q.TitlesOfParts, p, opts);\n\n\treturn p;\n}\n\nfunction write_ext_props(cp/*::, opts*/)/*:string*/ {\n\tvar o/*:Array*/ = [], W = writextag;\n\tif(!cp) cp = {};\n\tcp.Application = \"SheetJS\";\n\to[o.length] = (XML_HEADER);\n\to[o.length] = (writextag('Properties', null, {\n\t\t'xmlns': XMLNS.EXT_PROPS,\n\t\t'xmlns:vt': XMLNS.vt\n\t}));\n\n\tEXT_PROPS.forEach(function(f) {\n\t\tif(cp[f[1]] === undefined) return;\n\t\tvar v;\n\t\tswitch(f[2]) {\n\t\t\tcase 'string': v = escapexml(String(cp[f[1]])); break;\n\t\t\tcase 'bool': v = cp[f[1]] ? 'true' : 'false'; break;\n\t\t}\n\t\tif(v !== undefined) o[o.length] = (W(f[0], v));\n\t});\n\n\t/* TODO: HeadingPairs, TitlesOfParts */\n\to[o.length] = (W('HeadingPairs', W('vt:vector', W('vt:variant', 'Worksheets')+W('vt:variant', W('vt:i4', String(cp.Worksheets))), {size:2, baseType:\"variant\"})));\n\to[o.length] = (W('TitlesOfParts', W('vt:vector', cp.SheetNames.map(function(s) { return \"\" + escapexml(s) + \"\"; }).join(\"\"), {size: cp.Worksheets, baseType:\"lpstr\"})));\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* 15.2.12.2 Custom File Properties Part */\nvar custregex = /<[^>]+>[^<]*/g;\nfunction parse_cust_props(data/*:string*/, opts) {\n\tvar p = {}, name = \"\";\n\tvar m = data.match(custregex);\n\tif(m) for(var i = 0; i != m.length; ++i) {\n\t\tvar x = m[i], y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': name = null; break;\n\t\t\tdefault: if (x.indexOf('');\n\t\t\t\tvar type = toks[0].slice(4), text = toks[1];\n\t\t\t\t/* 22.4.2.32 (CT_Variant). Omit the binary types from 22.4 (Variant Types) */\n\t\t\t\tswitch(type) {\n\t\t\t\t\tcase 'lpstr': case 'bstr': case 'lpwstr':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'bool':\n\t\t\t\t\t\tp[name] = parsexmlbool(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'i1': case 'i2': case 'i4': case 'i8': case 'int': case 'uint':\n\t\t\t\t\t\tp[name] = parseInt(text, 10);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'r4': case 'r8': case 'decimal':\n\t\t\t\t\t\tp[name] = parseFloat(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'filetime': case 'date':\n\t\t\t\t\t\tp[name] = parseDate(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'cy': case 'error':\n\t\t\t\t\t\tp[name] = unescapexml(text);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tif(type.slice(-1) == '/') break;\n\t\t\t\t\t\tif(opts.WTF && typeof console !== 'undefined') console.warn('Unexpected', x, type, toks);\n\t\t\t\t}\n\t\t\t} else if(x.slice(0,2) === \"2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* Common Name -> XLML Name */\nvar XLMLDocPropsMap = {\n\tTitle: 'Title',\n\tSubject: 'Subject',\n\tAuthor: 'Author',\n\tKeywords: 'Keywords',\n\tComments: 'Description',\n\tLastAuthor: 'LastAuthor',\n\tRevNumber: 'Revision',\n\tApplication: 'AppName',\n\t/* TotalTime: 'TotalTime', */\n\tLastPrinted: 'LastPrinted',\n\tCreatedDate: 'Created',\n\tModifiedDate: 'LastSaved',\n\t/* Pages */\n\t/* Words */\n\t/* Characters */\n\tCategory: 'Category',\n\t/* PresentationFormat */\n\tManager: 'Manager',\n\tCompany: 'Company',\n\t/* Guid */\n\t/* HyperlinkBase */\n\t/* Bytes */\n\t/* Lines */\n\t/* Paragraphs */\n\t/* CharactersWithSpaces */\n\tAppVersion: 'Version',\n\n\tContentStatus: 'ContentStatus', /* NOTE: missing from schema */\n\tIdentifier: 'Identifier', /* NOTE: missing from schema */\n\tLanguage: 'Language' /* NOTE: missing from schema */\n};\nvar evert_XLMLDPM;\n\nfunction xlml_set_prop(Props, tag/*:string*/, val) {\n\tif(!evert_XLMLDPM) evert_XLMLDPM = evert(XLMLDocPropsMap);\n\ttag = evert_XLMLDPM[tag] || tag;\n\tProps[tag] = val;\n}\n\nfunction xlml_write_docprops(Props, opts) {\n\tvar o/*:Array*/ = [];\n\tkeys(XLMLDocPropsMap).map(function(m) {\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(CORE_PROPS[i][1] == m) return CORE_PROPS[i];\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(EXT_PROPS[i][1] == m) return EXT_PROPS[i];\n\t\tthrow m;\n\t}).forEach(function(p) {\n\t\tif(Props[p[1]] == null) return;\n\t\tvar m = opts && opts.Props && opts.Props[p[1]] != null ? opts.Props[p[1]] : Props[p[1]];\n\t\tswitch(p[2]) {\n\t\t\tcase 'date': m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"Z\"); break;\n\t\t}\n\t\tif(typeof m == 'number') m = String(m);\n\t\telse if(m === true || m === false) { m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) m = new Date(m).toISOString().replace(/\\.\\d*Z/,\"\");\n\t\to.push(writetag(XLMLDocPropsMap[p[1]] || p[1], m));\n\t});\n\treturn writextag('DocumentProperties', o.join(\"\"), {xmlns:XLMLNS.o });\n}\nfunction xlml_write_custprops(Props, Custprops/*::, opts*/) {\n\tvar BLACKLIST = [\"Worksheets\",\"SheetNames\"];\n\tvar T = 'CustomDocumentProperties';\n\tvar o/*:Array*/ = [];\n\tif(Props) keys(Props).forEach(function(k) {\n\t\t/*:: if(!Props) return; */\n\t\tif(!Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tfor(var i = 0; i < CORE_PROPS.length; ++i) if(k == CORE_PROPS[i][1]) return;\n\t\tfor(i = 0; i < EXT_PROPS.length; ++i) if(k == EXT_PROPS[i][1]) return;\n\t\tfor(i = 0; i < BLACKLIST.length; ++i) if(k == BLACKLIST[i]) return;\n\n\t\tvar m = Props[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\tif(Custprops) keys(Custprops).forEach(function(k) {\n\t\t/*:: if(!Custprops) return; */\n\t\tif(!Object.prototype.hasOwnProperty.call(Custprops, k)) return;\n\t\tif(Props && Object.prototype.hasOwnProperty.call(Props, k)) return;\n\t\tvar m = Custprops[k];\n\t\tvar t = \"string\";\n\t\tif(typeof m == 'number') { t = \"float\"; m = String(m); }\n\t\telse if(m === true || m === false) { t = \"boolean\"; m = m ? \"1\" : \"0\"; }\n\t\telse if(m instanceof Date) { t = \"dateTime.tz\"; m = m.toISOString(); }\n\t\telse m = String(m);\n\t\to.push(writextag(escapexmltag(k), m, {\"dt:dt\":t}));\n\t});\n\treturn '<' + T + ' xmlns=\"' + XLMLNS.o + '\">' + o.join(\"\") + '';\n}\n/* [MS-DTYP] 2.3.3 FILETIME */\n/* [MS-OLEDS] 2.1.3 FILETIME (Packet Version) */\n/* [MS-OLEPS] 2.8 FILETIME (Packet Version) */\nfunction parse_FILETIME(blob) {\n\tvar dwLowDateTime = blob.read_shift(4), dwHighDateTime = blob.read_shift(4);\n\treturn new Date(((dwHighDateTime/1e7*Math.pow(2,32) + dwLowDateTime/1e7) - 11644473600)*1000).toISOString().replace(/\\.000/,\"\");\n}\nfunction write_FILETIME(time/*:string|Date*/) {\n\tvar date = (typeof time == \"string\") ? new Date(Date.parse(time)) : time;\n\tvar t = date.getTime() / 1000 + 11644473600;\n\tvar l = t % Math.pow(2,32), h = (t - l) / Math.pow(2,32);\n\tl *= 1e7; h *= 1e7;\n\tvar w = (l / Math.pow(2,32)) | 0;\n\tif(w > 0) { l = l % Math.pow(2,32); h += w; }\n\tvar o = new_buf(8); o.write_shift(4, l); o.write_shift(4, h); return o;\n}\n\n/* [MS-OSHARED] 2.3.3.1.4 Lpstr */\nfunction parse_lpstr(blob, type, pad/*:?number*/) {\n\tvar start = blob.l;\n\tvar str = blob.read_shift(0, 'lpstr-cp');\n\tif(pad) while((blob.l - start) & 3) ++blob.l;\n\treturn str;\n}\n\n/* [MS-OSHARED] 2.3.3.1.6 Lpwstr */\nfunction parse_lpwstr(blob, type, pad) {\n\tvar str = blob.read_shift(0, 'lpwstr');\n\tif(pad) blob.l += (4 - ((str.length+1) & 3)) & 3;\n\treturn str;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.11 VtString */\n/* [MS-OSHARED] 2.3.3.1.12 VtUnalignedString */\nfunction parse_VtStringBase(blob, stringType, pad) {\n\tif(stringType === 0x1F /*VT_LPWSTR*/) return parse_lpwstr(blob);\n\treturn parse_lpstr(blob, stringType, pad);\n}\n\nfunction parse_VtString(blob, t/*:number*/, pad/*:?boolean*/) { return parse_VtStringBase(blob, t, pad === false ? 0: 4); }\nfunction parse_VtUnalignedString(blob, t/*:number*/) { if(!t) throw new Error(\"VtUnalignedString must have positive length\"); return parse_VtStringBase(blob, t, 0); }\n\n/* [MS-OSHARED] 2.3.3.1.7 VtVecLpwstrValue */\nfunction parse_VtVecLpwstrValue(blob)/*:Array*/ {\n\tvar length = blob.read_shift(4);\n\tvar ret/*:Array*/ = [];\n\tfor(var i = 0; i != length; ++i) {\n\t\tvar start = blob.l;\n\t\tret[i] = blob.read_shift(0, 'lpwstr').replace(chr0,'');\n\t\tif((blob.l - start) & 0x02) blob.l += 2;\n\t}\n\treturn ret;\n}\n\n/* [MS-OSHARED] 2.3.3.1.9 VtVecUnalignedLpstrValue */\nfunction parse_VtVecUnalignedLpstrValue(blob)/*:Array*/ {\n\tvar length = blob.read_shift(4);\n\tvar ret/*:Array*/ = [];\n\tfor(var i = 0; i != length; ++i) ret[i] = blob.read_shift(0, 'lpstr-cp').replace(chr0,'');\n\treturn ret;\n}\n\n\n/* [MS-OSHARED] 2.3.3.1.13 VtHeadingPair */\nfunction parse_VtHeadingPair(blob) {\n\tvar start = blob.l;\n\tvar headingString = parse_TypedPropertyValue(blob, VT_USTR);\n\tif(blob[blob.l] == 0x00 && blob[blob.l+1] == 0x00 && ((blob.l - start) & 0x02)) blob.l += 2;\n\tvar headerParts = parse_TypedPropertyValue(blob, VT_I4);\n\treturn [headingString, headerParts];\n}\n\n/* [MS-OSHARED] 2.3.3.1.14 VtVecHeadingPairValue */\nfunction parse_VtVecHeadingPairValue(blob) {\n\tvar cElements = blob.read_shift(4);\n\tvar out = [];\n\tfor(var i = 0; i < cElements / 2; ++i) out.push(parse_VtHeadingPair(blob));\n\treturn out;\n}\n\n/* [MS-OLEPS] 2.18.1 Dictionary (uses 2.17, 2.16) */\nfunction parse_dictionary(blob,CodePage) {\n\tvar cnt = blob.read_shift(4);\n\tvar dict/*:{[number]:string}*/ = ({}/*:any*/);\n\tfor(var j = 0; j != cnt; ++j) {\n\t\tvar pid = blob.read_shift(4);\n\t\tvar len = blob.read_shift(4);\n\t\tdict[pid] = blob.read_shift(len, (CodePage === 0x4B0 ?'utf16le':'utf8')).replace(chr0,'').replace(chr1,'!');\n\t\tif(CodePage === 0x4B0 && (len % 2)) blob.l += 2;\n\t}\n\tif(blob.l & 3) blob.l = (blob.l>>2+1)<<2;\n\treturn dict;\n}\n\n/* [MS-OLEPS] 2.9 BLOB */\nfunction parse_BLOB(blob) {\n\tvar size = blob.read_shift(4);\n\tvar bytes = blob.slice(blob.l,blob.l+size);\n\tblob.l += size;\n\tif((size & 3) > 0) blob.l += (4 - (size & 3)) & 3;\n\treturn bytes;\n}\n\n/* [MS-OLEPS] 2.11 ClipboardData */\nfunction parse_ClipboardData(blob) {\n\t// TODO\n\tvar o = {};\n\to.Size = blob.read_shift(4);\n\t//o.Format = blob.read_shift(4);\n\tblob.l += o.Size + 3 - (o.Size - 1) % 4;\n\treturn o;\n}\n\n/* [MS-OLEPS] 2.15 TypedPropertyValue */\nfunction parse_TypedPropertyValue(blob, type/*:number*/, _opts)/*:any*/ {\n\tvar t = blob.read_shift(2), ret, opts = _opts||{};\n\tblob.l += 2;\n\tif(type !== VT_VARIANT)\n\tif(t !== type && VT_CUSTOM.indexOf(type)===-1 && !((type & 0xFFFE) == 0x101E && (t & 0xFFFE) == 0x101E)) throw new Error('Expected type ' + type + ' saw ' + t);\n\tswitch(type === VT_VARIANT ? t : type) {\n\t\tcase 0x02 /*VT_I2*/: ret = blob.read_shift(2, 'i'); if(!opts.raw) blob.l += 2; return ret;\n\t\tcase 0x03 /*VT_I4*/: ret = blob.read_shift(4, 'i'); return ret;\n\t\tcase 0x0B /*VT_BOOL*/: return blob.read_shift(4) !== 0x0;\n\t\tcase 0x13 /*VT_UI4*/: ret = blob.read_shift(4); return ret;\n\t\tcase 0x1E /*VT_LPSTR*/: return parse_lpstr(blob, t, 4).replace(chr0,'');\n\t\tcase 0x1F /*VT_LPWSTR*/: return parse_lpwstr(blob);\n\t\tcase 0x40 /*VT_FILETIME*/: return parse_FILETIME(blob);\n\t\tcase 0x41 /*VT_BLOB*/: return parse_BLOB(blob);\n\t\tcase 0x47 /*VT_CF*/: return parse_ClipboardData(blob);\n\t\tcase 0x50 /*VT_STRING*/: return parse_VtString(blob, t, !opts.raw).replace(chr0,'');\n\t\tcase 0x51 /*VT_USTR*/: return parse_VtUnalignedString(blob, t/*, 4*/).replace(chr0,'');\n\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: return parse_VtVecHeadingPairValue(blob);\n\t\tcase 0x101E /*VT_VECTOR|VT_LPSTR*/:\n\t\tcase 0x101F /*VT_VECTOR|VT_LPWSTR*/:\n\t\t\treturn t == 0x101F ? parse_VtVecLpwstrValue(blob) : parse_VtVecUnalignedLpstrValue(blob);\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + t);\n\t}\n}\nfunction write_TypedPropertyValue(type/*:number*/, value) {\n\tvar o = new_buf(4), p = new_buf(4);\n\to.write_shift(4, type == 0x50 ? 0x1F : type);\n\tswitch(type) {\n\t\tcase 0x03 /*VT_I4*/: p.write_shift(-4, value); break;\n\t\tcase 0x05 /*VT_I4*/: p = new_buf(8); p.write_shift(8, value, 'f'); break;\n\t\tcase 0x0B /*VT_BOOL*/: p.write_shift(4, value ? 0x01 : 0x00); break;\n\t\tcase 0x40 /*VT_FILETIME*/: /*:: if(typeof value !== \"string\" && !(value instanceof Date)) throw \"unreachable\"; */ p = write_FILETIME(value); break;\n\t\tcase 0x1F /*VT_LPWSTR*/:\n\t\tcase 0x50 /*VT_STRING*/:\n\t\t\t/*:: if(typeof value !== \"string\") throw \"unreachable\"; */\n\t\t\tp = new_buf(4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tp.write_shift(4, value.length + 1);\n\t\t\tp.write_shift(0, value, \"dbcs\");\n\t\t\twhile(p.l != p.length) p.write_shift(1, 0);\n\t\t\tbreak;\n\t\tdefault: throw new Error(\"TypedPropertyValue unrecognized type \" + type + \" \" + value);\n\t}\n\treturn bconcat([o, p]);\n}\n\n/* [MS-OLEPS] 2.20 PropertySet */\nfunction parse_PropertySet(blob, PIDSI) {\n\tvar start_addr = blob.l;\n\tvar size = blob.read_shift(4);\n\tvar NumProps = blob.read_shift(4);\n\tvar Props = [], i = 0;\n\tvar CodePage = 0;\n\tvar Dictionary = -1, DictObj/*:{[number]:string}*/ = ({}/*:any*/);\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tvar PropID = blob.read_shift(4);\n\t\tvar Offset = blob.read_shift(4);\n\t\tProps[i] = [PropID, Offset + start_addr];\n\t}\n\tProps.sort(function(x,y) { return x[1] - y[1]; });\n\tvar PropH = {};\n\tfor(i = 0; i != NumProps; ++i) {\n\t\tif(blob.l !== Props[i][1]) {\n\t\t\tvar fail = true;\n\t\t\tif(i>0 && PIDSI) switch(PIDSI[Props[i-1][0]].t) {\n\t\t\t\tcase 0x02 /*VT_I2*/: if(blob.l+2 === Props[i][1]) { blob.l+=2; fail = false; } break;\n\t\t\t\tcase 0x50 /*VT_STRING*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t\tcase 0x100C /*VT_VECTOR|VT_VARIANT*/: if(blob.l <= Props[i][1]) { blob.l=Props[i][1]; fail = false; } break;\n\t\t\t}\n\t\t\tif((!PIDSI||i==0) && blob.l <= Props[i][1]) { fail=false; blob.l = Props[i][1]; }\n\t\t\tif(fail) throw new Error(\"Read Error: Expected address \" + Props[i][1] + ' at ' + blob.l + ' :' + i);\n\t\t}\n\t\tif(PIDSI) {\n\t\t\tvar piddsi = PIDSI[Props[i][0]];\n\t\t\tPropH[piddsi.n] = parse_TypedPropertyValue(blob, piddsi.t, {raw:true});\n\t\t\tif(piddsi.p === 'version') PropH[piddsi.n] = String(PropH[piddsi.n] >> 16) + \".\" + (\"0000\" + String(PropH[piddsi.n] & 0xFFFF)).slice(-4);\n\t\t\tif(piddsi.n == \"CodePage\") switch(PropH[piddsi.n]) {\n\t\t\t\tcase 0: PropH[piddsi.n] = 1252;\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 874:\n\t\t\t\tcase 932:\n\t\t\t\tcase 936:\n\t\t\t\tcase 949:\n\t\t\t\tcase 950:\n\t\t\t\tcase 1250:\n\t\t\t\tcase 1251:\n\t\t\t\tcase 1253:\n\t\t\t\tcase 1254:\n\t\t\t\tcase 1255:\n\t\t\t\tcase 1256:\n\t\t\t\tcase 1257:\n\t\t\t\tcase 1258:\n\t\t\t\tcase 10000:\n\t\t\t\tcase 1200:\n\t\t\t\tcase 1201:\n\t\t\t\tcase 1252:\n\t\t\t\tcase 65000: case -536:\n\t\t\t\tcase 65001: case -535:\n\t\t\t\t\tset_cp(CodePage = (PropH[piddsi.n]>>>0) & 0xFFFF); break;\n\t\t\t\tdefault: throw new Error(\"Unsupported CodePage: \" + PropH[piddsi.n]);\n\t\t\t}\n\t\t} else {\n\t\t\tif(Props[i][0] === 0x1) {\n\t\t\t\tCodePage = PropH.CodePage = (parse_TypedPropertyValue(blob, VT_I2)/*:number*/);\n\t\t\t\tset_cp(CodePage);\n\t\t\t\tif(Dictionary !== -1) {\n\t\t\t\t\tvar oldpos = blob.l;\n\t\t\t\t\tblob.l = Props[Dictionary][1];\n\t\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t\t\tblob.l = oldpos;\n\t\t\t\t}\n\t\t\t} else if(Props[i][0] === 0) {\n\t\t\t\tif(CodePage === 0) { Dictionary = i; blob.l = Props[i+1][1]; continue; }\n\t\t\t\tDictObj = parse_dictionary(blob,CodePage);\n\t\t\t} else {\n\t\t\t\tvar name = DictObj[Props[i][0]];\n\t\t\t\tvar val;\n\t\t\t\t/* [MS-OSHARED] 2.3.3.2.3.1.2 + PROPVARIANT */\n\t\t\t\tswitch(blob[blob.l]) {\n\t\t\t\t\tcase 0x41 /*VT_BLOB*/: blob.l += 4; val = parse_BLOB(blob); break;\n\t\t\t\t\tcase 0x1E /*VT_LPSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x1F /*VT_LPWSTR*/: blob.l += 4; val = parse_VtString(blob, blob[blob.l-4]).replace(/\\u0000+$/,\"\"); break;\n\t\t\t\t\tcase 0x03 /*VT_I4*/: blob.l += 4; val = blob.read_shift(4, 'i'); break;\n\t\t\t\t\tcase 0x13 /*VT_UI4*/: blob.l += 4; val = blob.read_shift(4); break;\n\t\t\t\t\tcase 0x05 /*VT_R8*/: blob.l += 4; val = blob.read_shift(8, 'f'); break;\n\t\t\t\t\tcase 0x0B /*VT_BOOL*/: blob.l += 4; val = parsebool(blob, 4); break;\n\t\t\t\t\tcase 0x40 /*VT_FILETIME*/: blob.l += 4; val = parseDate(parse_FILETIME(blob)); break;\n\t\t\t\t\tdefault: throw new Error(\"unparsed value: \" + blob[blob.l]);\n\t\t\t\t}\n\t\t\t\tPropH[name] = val;\n\t\t\t}\n\t\t}\n\t}\n\tblob.l = start_addr + size; /* step ahead to skip padding */\n\treturn PropH;\n}\nvar XLSPSSkip = [ \"CodePage\", \"Thumbnail\", \"_PID_LINKBASE\", \"_PID_HLINKS\", \"SystemIdentifier\", \"FMTID\" ]; //.concat(PseudoPropsPairs);\nfunction guess_property_type(val/*:any*/)/*:number*/ {\n\tswitch(typeof val) {\n\t\tcase \"boolean\": return 0x0B;\n\t\tcase \"number\": return ((val|0)==val) ? 0x03 : 0x05;\n\t\tcase \"string\": return 0x1F;\n\t\tcase \"object\": if(val instanceof Date) return 0x40; break;\n\t}\n\treturn -1;\n}\nfunction write_PropertySet(entries, RE, PIDSI) {\n\tvar hdr = new_buf(8), piao = [], prop = [];\n\tvar sz = 8, i = 0;\n\n\tvar pr = new_buf(8), pio = new_buf(8);\n\tpr.write_shift(4, 0x0002);\n\tpr.write_shift(4, 0x04B0);\n\tpio.write_shift(4, 0x0001);\n\tprop.push(pr); piao.push(pio);\n\tsz += 8 + pr.length;\n\n\tif(!RE) {\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, 0);\n\t\tpiao.unshift(pio);\n\n\t\tvar bufs = [new_buf(4)];\n\t\tbufs[0].write_shift(4, entries.length);\n\t\tfor(i = 0; i < entries.length; ++i) {\n\t\t\tvar value = entries[i][0];\n\t\t\tpr = new_buf(4 + 4 + 2 * (value.length + 1) + (value.length % 2 ? 0 : 2));\n\t\t\tpr.write_shift(4, i+2);\n\t\t\tpr.write_shift(4, value.length + 1);\n\t\t\tpr.write_shift(0, value, \"dbcs\");\n\t\t\twhile(pr.l != pr.length) pr.write_shift(1, 0);\n\t\t\tbufs.push(pr);\n\t\t}\n\t\tpr = bconcat(bufs);\n\t\tprop.unshift(pr);\n\t\tsz += 8 + pr.length;\n\t}\n\n\tfor(i = 0; i < entries.length; ++i) {\n\t\tif(RE && !RE[entries[i][0]]) continue;\n\t\tif(XLSPSSkip.indexOf(entries[i][0]) > -1 || PseudoPropsPairs.indexOf(entries[i][0]) > -1) continue;\n\t\tif(entries[i][1] == null) continue;\n\n\t\tvar val = entries[i][1], idx = 0;\n\t\tif(RE) {\n\t\t\tidx = +RE[entries[i][0]];\n\t\t\tvar pinfo = (PIDSI/*:: || {}*/)[idx]/*:: || {} */;\n\t\t\tif(pinfo.p == \"version\" && typeof val == \"string\") {\n\t\t\t\t/*:: if(typeof val !== \"string\") throw \"unreachable\"; */\n\t\t\t\tvar arr = val.split(\".\");\n\t\t\t\tval = ((+arr[0])<<16) + ((+arr[1])||0);\n\t\t\t}\n\t\t\tpr = write_TypedPropertyValue(pinfo.t, val);\n\t\t} else {\n\t\t\tvar T = guess_property_type(val);\n\t\t\tif(T == -1) { T = 0x1F; val = String(val); }\n\t\t\tpr = write_TypedPropertyValue(T, val);\n\t\t}\n\t\tprop.push(pr);\n\n\t\tpio = new_buf(8);\n\t\tpio.write_shift(4, !RE ? 2+i : idx);\n\t\tpiao.push(pio);\n\n\t\tsz += 8 + pr.length;\n\t}\n\n\tvar w = 8 * (prop.length + 1);\n\tfor(i = 0; i < prop.length; ++i) { piao[i].write_shift(4, w); w += prop[i].length; }\n\thdr.write_shift(4, sz);\n\thdr.write_shift(4, prop.length);\n\treturn bconcat([hdr].concat(piao).concat(prop));\n}\n\n/* [MS-OLEPS] 2.21 PropertySetStream */\nfunction parse_PropertySetStream(file, PIDSI, clsid) {\n\tvar blob = file.content;\n\tif(!blob) return ({}/*:any*/);\n\tprep_blob(blob, 0);\n\n\tvar NumSets, FMTID0, FMTID1, Offset0, Offset1 = 0;\n\tblob.chk('feff', 'Byte Order: ');\n\n\t/*var vers = */blob.read_shift(2); // TODO: check version\n\tvar SystemIdentifier = blob.read_shift(4);\n\tvar CLSID = blob.read_shift(16);\n\tif(CLSID !== CFB.utils.consts.HEADER_CLSID && CLSID !== clsid) throw new Error(\"Bad PropertySet CLSID \" + CLSID);\n\tNumSets = blob.read_shift(4);\n\tif(NumSets !== 1 && NumSets !== 2) throw new Error(\"Unrecognized #Sets: \" + NumSets);\n\tFMTID0 = blob.read_shift(16); Offset0 = blob.read_shift(4);\n\n\tif(NumSets === 1 && Offset0 !== blob.l) throw new Error(\"Length mismatch: \" + Offset0 + \" !== \" + blob.l);\n\telse if(NumSets === 2) { FMTID1 = blob.read_shift(16); Offset1 = blob.read_shift(4); }\n\tvar PSet0 = parse_PropertySet(blob, PIDSI);\n\n\tvar rval = ({ SystemIdentifier: SystemIdentifier }/*:any*/);\n\tfor(var y in PSet0) rval[y] = PSet0[y];\n\t//rval.blob = blob;\n\trval.FMTID = FMTID0;\n\t//rval.PSet0 = PSet0;\n\tif(NumSets === 1) return rval;\n\tif(Offset1 - blob.l == 2) blob.l += 2;\n\tif(blob.l !== Offset1) throw new Error(\"Length mismatch 2: \" + blob.l + \" !== \" + Offset1);\n\tvar PSet1;\n\ttry { PSet1 = parse_PropertySet(blob, null); } catch(e) {/* empty */}\n\tfor(y in PSet1) rval[y] = PSet1[y];\n\trval.FMTID = [FMTID0, FMTID1]; // TODO: verify FMTID0/1\n\treturn rval;\n}\nfunction write_PropertySetStream(entries, clsid, RE, PIDSI/*:{[key:string|number]:any}*/, entries2/*:?any*/, clsid2/*:?any*/) {\n\tvar hdr = new_buf(entries2 ? 68 : 48);\n\tvar bufs = [hdr];\n\thdr.write_shift(2, 0xFFFE);\n\thdr.write_shift(2, 0x0000); /* TODO: type 1 props */\n\thdr.write_shift(4, 0x32363237);\n\thdr.write_shift(16, CFB.utils.consts.HEADER_CLSID, \"hex\");\n\thdr.write_shift(4, (entries2 ? 2 : 1));\n\thdr.write_shift(16, clsid, \"hex\");\n\thdr.write_shift(4, (entries2 ? 68 : 48));\n\tvar ps0 = write_PropertySet(entries, RE, PIDSI);\n\tbufs.push(ps0);\n\n\tif(entries2) {\n\t\tvar ps1 = write_PropertySet(entries2, null, null);\n\t\thdr.write_shift(16, clsid2, \"hex\");\n\t\thdr.write_shift(4, 68 + ps0.length);\n\t\tbufs.push(ps1);\n\t}\n\treturn bconcat(bufs);\n}\n\nfunction parsenoop2(blob, length) { blob.read_shift(length); return null; }\nfunction writezeroes(n, o) { if(!o) o=new_buf(n); for(var j=0; j= 12 ? 2 : 1);\n\tvar encoding = 'sbcs-cont';\n\tvar cp = current_codepage;\n\tif(opts && opts.biff >= 8) current_codepage = 1200;\n\tif(!opts || opts.biff == 8 ) {\n\t\tvar fHighByte = blob.read_shift(1);\n\t\tif(fHighByte) { encoding = 'dbcs-cont'; }\n\t} else if(opts.biff == 12) {\n\t\tencoding = 'wstr';\n\t}\n\tif(opts.biff >= 2 && opts.biff <= 5) encoding = 'cpstr';\n\tvar o = cch ? blob.read_shift(cch, encoding) : \"\";\n\tcurrent_codepage = cp;\n\treturn o;\n}\n\n/* 2.5.293 XLUnicodeRichExtendedString */\nfunction parse_XLUnicodeRichExtendedString(blob) {\n\tvar cp = current_codepage;\n\tcurrent_codepage = 1200;\n\tvar cch = blob.read_shift(2), flags = blob.read_shift(1);\n\tvar /*fHighByte = flags & 0x1,*/ fExtSt = flags & 0x4, fRichSt = flags & 0x8;\n\tvar width = 1 + (flags & 0x1); // 0x0 -> utf8, 0x1 -> dbcs\n\tvar cRun = 0, cbExtRst;\n\tvar z = {};\n\tif(fRichSt) cRun = blob.read_shift(2);\n\tif(fExtSt) cbExtRst = blob.read_shift(4);\n\tvar encoding = width == 2 ? 'dbcs-cont' : 'sbcs-cont';\n\tvar msg = cch === 0 ? \"\" : blob.read_shift(cch, encoding);\n\tif(fRichSt) blob.l += 4 * cRun; //TODO: parse this\n\tif(fExtSt) blob.l += cbExtRst; //TODO: parse this\n\tz.t = msg;\n\tif(!fRichSt) { z.raw = \"\" + z.t + \"\"; z.r = z.t; }\n\tcurrent_codepage = cp;\n\treturn z;\n}\nfunction write_XLUnicodeRichExtendedString(xlstr/*:: :XLString, opts*/) {\n\tvar str = (xlstr.t||\"\"), nfmts = 1;\n\n\tvar hdr = new_buf(3 + (nfmts > 1 ? 2 : 0));\n\thdr.write_shift(2, str.length);\n\thdr.write_shift(1, (nfmts > 1 ? 0x08 : 0x00) | 0x01);\n\tif(nfmts > 1) hdr.write_shift(2, nfmts);\n\n\tvar otext = new_buf(2 * str.length);\n\totext.write_shift(2 * str.length, str, 'utf16le');\n\n\tvar out = [hdr, otext];\n\n\treturn bconcat(out);\n}\n\n/* 2.5.296 XLUnicodeStringNoCch */\nfunction parse_XLUnicodeStringNoCch(blob, cch, opts) {\n\tvar retval;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return blob.read_shift(cch, 'cpstr');\n\t\tif(opts.biff >= 12) return blob.read_shift(cch, 'dbcs-cont');\n\t}\n\tvar fHighByte = blob.read_shift(1);\n\tif(fHighByte===0) { retval = blob.read_shift(cch, 'sbcs-cont'); }\n\telse { retval = blob.read_shift(cch, 'dbcs-cont'); }\n\treturn retval;\n}\n\n/* 2.5.294 XLUnicodeString */\nfunction parse_XLUnicodeString(blob, length, opts) {\n\tvar cch = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn parse_XLUnicodeStringNoCch(blob, cch, opts);\n}\n/* BIFF5 override */\nfunction parse_XLUnicodeString2(blob, length, opts) {\n\tif(opts.biff > 5) return parse_XLUnicodeString(blob, length, opts);\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, (opts.biff <= 4 || !blob.lens ) ? 'cpstr' : 'sbcs-cont');\n}\n/* TODO: BIFF5 and lower, codepage awareness */\nfunction write_XLUnicodeString(str, opts, o) {\n\tif(!o) o = new_buf(3 + 2 * str.length);\n\to.write_shift(2, str.length);\n\to.write_shift(1, 1);\n\to.write_shift(31, str, 'utf16le');\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.61 ControlInfo */\nfunction parse_ControlInfo(blob/*::, length, opts*/) {\n\tvar flags = blob.read_shift(1);\n\tblob.l++;\n\tvar accel = blob.read_shift(2);\n\tblob.l += 2;\n\treturn [flags, accel];\n}\n\n/* [MS-OSHARED] 2.3.7.6 URLMoniker TODO: flags */\nfunction parse_URLMoniker(blob/*::, length, opts*/) {\n\tvar len = blob.read_shift(4), start = blob.l;\n\tvar extra = false;\n\tif(len > 24) {\n\t\t/* look ahead */\n\t\tblob.l += len - 24;\n\t\tif(blob.read_shift(16) === \"795881f43b1d7f48af2c825dc4852763\") extra = true;\n\t\tblob.l = start;\n\t}\n\tvar url = blob.read_shift((extra?len-24:len)>>1, 'utf16le').replace(chr0,\"\");\n\tif(extra) blob.l += 24;\n\treturn url;\n}\n\n/* [MS-OSHARED] 2.3.7.8 FileMoniker TODO: all fields */\nfunction parse_FileMoniker(blob/*::, length*/) {\n\tvar cAnti = blob.read_shift(2);\n\tvar preamble = \"\"; while(cAnti-- > 0) preamble += \"../\";\n\tvar ansiPath = blob.read_shift(0, 'lpstr-ansi');\n\tblob.l += 2; //var endServer = blob.read_shift(2);\n\tif(blob.read_shift(2) != 0xDEAD) throw new Error(\"Bad FileMoniker\");\n\tvar sz = blob.read_shift(4);\n\tif(sz === 0) return preamble + ansiPath.replace(/\\\\/g,\"/\");\n\tvar bytes = blob.read_shift(4);\n\tif(blob.read_shift(2) != 3) throw new Error(\"Bad FileMoniker\");\n\tvar unicodePath = blob.read_shift(bytes>>1, 'utf16le').replace(chr0,\"\");\n\treturn preamble + unicodePath;\n}\n\n/* [MS-OSHARED] 2.3.7.2 HyperlinkMoniker TODO: all the monikers */\nfunction parse_HyperlinkMoniker(blob, length) {\n\tvar clsid = blob.read_shift(16); length -= 16;\n\tswitch(clsid) {\n\t\tcase \"e0c9ea79f9bace118c8200aa004ba90b\": return parse_URLMoniker(blob, length);\n\t\tcase \"0303000000000000c000000000000046\": return parse_FileMoniker(blob, length);\n\t\tdefault: throw new Error(\"Unsupported Moniker \" + clsid);\n\t}\n}\n\n/* [MS-OSHARED] 2.3.7.9 HyperlinkString */\nfunction parse_HyperlinkString(blob/*::, length*/) {\n\tvar len = blob.read_shift(4);\n\tvar o = len > 0 ? blob.read_shift(len, 'utf16le').replace(chr0, \"\") : \"\";\n\treturn o;\n}\nfunction write_HyperlinkString(str/*:string*/, o) {\n\tif(!o) o = new_buf(6 + str.length * 2);\n\to.write_shift(4, 1 + str.length);\n\tfor(var i = 0; i < str.length; ++i) o.write_shift(2, str.charCodeAt(i));\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-OSHARED] 2.3.7.1 Hyperlink Object */\nfunction parse_Hyperlink(blob, length)/*:Hyperlink*/ {\n\tvar end = blob.l + length;\n\tvar sVer = blob.read_shift(4);\n\tif(sVer !== 2) throw new Error(\"Unrecognized streamVersion: \" + sVer);\n\tvar flags = blob.read_shift(2);\n\tblob.l += 2;\n\tvar displayName, targetFrameName, moniker, oleMoniker, Loc=\"\", guid, fileTime;\n\tif(flags & 0x0010) displayName = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0080) targetFrameName = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0101) moniker = parse_HyperlinkString(blob, end - blob.l);\n\tif((flags & 0x0101) === 0x0001) oleMoniker = parse_HyperlinkMoniker(blob, end - blob.l);\n\tif(flags & 0x0008) Loc = parse_HyperlinkString(blob, end - blob.l);\n\tif(flags & 0x0020) guid = blob.read_shift(16);\n\tif(flags & 0x0040) fileTime = parse_FILETIME(blob/*, 8*/);\n\tblob.l = end;\n\tvar target = targetFrameName||moniker||oleMoniker||\"\";\n\tif(target && Loc) target+=\"#\"+Loc;\n\tif(!target) target = \"#\" + Loc;\n\tif((flags & 0x0002) && target.charAt(0) == \"/\" && target.charAt(1) != \"/\") target = \"file://\" + target;\n\tvar out = ({Target:target}/*:any*/);\n\tif(guid) out.guid = guid;\n\tif(fileTime) out.time = fileTime;\n\tif(displayName) out.Tooltip = displayName;\n\treturn out;\n}\nfunction write_Hyperlink(hl) {\n\tvar out = new_buf(512), i = 0;\n\tvar Target = hl.Target;\n\tif(Target.slice(0,7) == \"file://\") Target = Target.slice(7);\n\tvar hashidx = Target.indexOf(\"#\");\n\tvar F = hashidx > -1 ? 0x1f : 0x17;\n\tswitch(Target.charAt(0)) { case \"#\": F=0x1c; break; case \".\": F&=~2; break; }\n\tout.write_shift(4,2); out.write_shift(4, F);\n\tvar data = [8,6815827,6619237,4849780,83]; for(i = 0; i < data.length; ++i) out.write_shift(4, data[i]);\n\tif(F == 0x1C) {\n\t\tTarget = Target.slice(1);\n\t\twrite_HyperlinkString(Target, out);\n\t} else if(F & 0x02) {\n\t\tdata = \"e0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar Pretarget = hashidx > -1 ? Target.slice(0, hashidx) : Target;\n\t\tout.write_shift(4, 2*(Pretarget.length + 1));\n\t\tfor(i = 0; i < Pretarget.length; ++i) out.write_shift(2, Pretarget.charCodeAt(i));\n\t\tout.write_shift(2, 0);\n\t\tif(F & 0x08) write_HyperlinkString(hashidx > -1 ? Target.slice(hashidx+1): \"\", out);\n\t} else {\n\t\tdata = \"03 03 00 00 00 00 00 00 c0 00 00 00 00 00 00 46\".split(\" \");\n\t\tfor(i = 0; i < data.length; ++i) out.write_shift(1, parseInt(data[i], 16));\n\t\tvar P = 0;\n\t\twhile(Target.slice(P*3,P*3+3)==\"../\"||Target.slice(P*3,P*3+3)==\"..\\\\\") ++P;\n\t\tout.write_shift(2, P);\n\t\tout.write_shift(4, Target.length - 3 * P + 1);\n\t\tfor(i = 0; i < Target.length - 3 * P; ++i) out.write_shift(1, Target.charCodeAt(i + 3 * P) & 0xFF);\n\t\tout.write_shift(1, 0);\n\t\tout.write_shift(2, 0xFFFF);\n\t\tout.write_shift(2, 0xDEAD);\n\t\tfor(i = 0; i < 6; ++i) out.write_shift(4, 0);\n\t}\n\treturn out.slice(0, out.l);\n}\n\n/* 2.5.178 LongRGBA */\nfunction parse_LongRGBA(blob/*::, length*/) { var r = blob.read_shift(1), g = blob.read_shift(1), b = blob.read_shift(1), a = blob.read_shift(1); return [r,g,b,a]; }\n\n/* 2.5.177 LongRGB */\nfunction parse_LongRGB(blob, length) { var x = parse_LongRGBA(blob, length); x[3] = 0; return x; }\n\n\n/* [MS-XLS] 2.5.19 */\nfunction parse_XLSCell(blob/*::, length*/)/*:Cell*/ {\n\tvar rw = blob.read_shift(2); // 0-indexed\n\tvar col = blob.read_shift(2);\n\tvar ixfe = blob.read_shift(2);\n\treturn ({r:rw, c:col, ixfe:ixfe}/*:any*/);\n}\nfunction write_XLSCell(R/*:number*/, C/*:number*/, ixfe/*:?number*/, o) {\n\tif(!o) o = new_buf(6);\n\to.write_shift(2, R);\n\to.write_shift(2, C);\n\to.write_shift(2, ixfe||0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.134 */\nfunction parse_frtHeader(blob) {\n\tvar rt = blob.read_shift(2);\n\tvar flags = blob.read_shift(2); // TODO: parse these flags\n\tblob.l += 8;\n\treturn {type: rt, flags: flags};\n}\n\n\n\nfunction parse_OptXLUnicodeString(blob, length, opts) { return length === 0 ? \"\" : parse_XLUnicodeString2(blob, length, opts); }\n\n/* [MS-XLS] 2.5.344 */\nfunction parse_XTI(blob, length, opts) {\n\tvar w = opts.biff > 8 ? 4 : 2;\n\tvar iSupBook = blob.read_shift(w), itabFirst = blob.read_shift(w,'i'), itabLast = blob.read_shift(w,'i');\n\treturn [iSupBook, itabFirst, itabLast];\n}\n\n/* [MS-XLS] 2.5.218 */\nfunction parse_RkRec(blob) {\n\tvar ixfe = blob.read_shift(2);\n\tvar RK = parse_RkNumber(blob);\n\treturn [ixfe, RK];\n}\n\n/* [MS-XLS] 2.5.1 */\nfunction parse_AddinUdf(blob, length, opts) {\n\tblob.l += 4; length -= 4;\n\tvar l = blob.l + length;\n\tvar udfName = parse_ShortXLUnicodeString(blob, length, opts);\n\tvar cb = blob.read_shift(2);\n\tl -= blob.l;\n\tif(cb !== l) throw new Error(\"Malformed AddinUdf: padding = \" + l + \" != \" + cb);\n\tblob.l += cb;\n\treturn udfName;\n}\n\n/* [MS-XLS] 2.5.209 TODO: Check sizes */\nfunction parse_Ref8U(blob/*::, length*/) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(2);\n\tvar colLast = blob.read_shift(2);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\nfunction write_Ref8U(r/*:Range*/, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(2, r.s.r);\n\to.write_shift(2, r.e.r);\n\to.write_shift(2, r.s.c);\n\to.write_shift(2, r.e.c);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.211 */\nfunction parse_RefU(blob/*::, length*/) {\n\tvar rwFirst = blob.read_shift(2);\n\tvar rwLast = blob.read_shift(2);\n\tvar colFirst = blob.read_shift(1);\n\tvar colLast = blob.read_shift(1);\n\treturn {s:{c:colFirst, r:rwFirst}, e:{c:colLast,r:rwLast}};\n}\n\n/* [MS-XLS] 2.5.207 */\nvar parse_Ref = parse_RefU;\n\n/* [MS-XLS] 2.5.143 */\nfunction parse_FtCmo(blob/*::, length*/) {\n\tblob.l += 4;\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tblob.l+=12;\n\treturn [id, ot, flags];\n}\n\n/* [MS-XLS] 2.5.149 */\nfunction parse_FtNts(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.l += 16; // GUID TODO\n\tout.fSharedNote = blob.read_shift(2);\n\tblob.l += 4;\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.142 */\nfunction parse_FtCf(blob) {\n\tvar out = {};\n\tblob.l += 4;\n\tblob.cf = blob.read_shift(2);\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.140 - 2.5.154 and friends */\nfunction parse_FtSkip(blob) { blob.l += 2; blob.l += blob.read_shift(2); }\nvar FtTab = {\n\t/*::[*/0x00/*::]*/: parse_FtSkip, /* FtEnd */\n\t/*::[*/0x04/*::]*/: parse_FtSkip, /* FtMacro */\n\t/*::[*/0x05/*::]*/: parse_FtSkip, /* FtButton */\n\t/*::[*/0x06/*::]*/: parse_FtSkip, /* FtGmo */\n\t/*::[*/0x07/*::]*/: parse_FtCf, /* FtCf */\n\t/*::[*/0x08/*::]*/: parse_FtSkip, /* FtPioGrbit */\n\t/*::[*/0x09/*::]*/: parse_FtSkip, /* FtPictFmla */\n\t/*::[*/0x0A/*::]*/: parse_FtSkip, /* FtCbls */\n\t/*::[*/0x0B/*::]*/: parse_FtSkip, /* FtRbo */\n\t/*::[*/0x0C/*::]*/: parse_FtSkip, /* FtSbs */\n\t/*::[*/0x0D/*::]*/: parse_FtNts, /* FtNts */\n\t/*::[*/0x0E/*::]*/: parse_FtSkip, /* FtSbsFmla */\n\t/*::[*/0x0F/*::]*/: parse_FtSkip, /* FtGboData */\n\t/*::[*/0x10/*::]*/: parse_FtSkip, /* FtEdoData */\n\t/*::[*/0x11/*::]*/: parse_FtSkip, /* FtRboData */\n\t/*::[*/0x12/*::]*/: parse_FtSkip, /* FtCblsData */\n\t/*::[*/0x13/*::]*/: parse_FtSkip, /* FtLbsData */\n\t/*::[*/0x14/*::]*/: parse_FtSkip, /* FtCblsFmla */\n\t/*::[*/0x15/*::]*/: parse_FtCmo\n};\nfunction parse_FtArray(blob, length/*::, ot*/) {\n\tvar tgt = blob.l + length;\n\tvar fts = [];\n\twhile(blob.l < tgt) {\n\t\tvar ft = blob.read_shift(2);\n\t\tblob.l-=2;\n\t\ttry {\n\t\t\tfts.push(FtTab[ft](blob, tgt - blob.l));\n\t\t} catch(e) { blob.l = tgt; return fts; }\n\t}\n\tif(blob.l != tgt) blob.l = tgt; //throw new Error(\"bad Object Ft-sequence\");\n\treturn fts;\n}\n\n/* --- 2.4 Records --- */\n\n/* [MS-XLS] 2.4.21 */\nfunction parse_BOF(blob, length) {\n\tvar o = {BIFFVer:0, dt:0};\n\to.BIFFVer = blob.read_shift(2); length -= 2;\n\tif(length >= 2) { o.dt = blob.read_shift(2); blob.l -= 2; }\n\tswitch(o.BIFFVer) {\n\t\tcase 0x0600: /* BIFF8 */\n\t\tcase 0x0500: /* BIFF5 */\n\t\tcase 0x0400: /* BIFF4 */\n\t\tcase 0x0300: /* BIFF3 */\n\t\tcase 0x0200: /* BIFF2 */\n\t\tcase 0x0002: case 0x0007: /* BIFF2 */\n\t\t\tbreak;\n\t\tdefault: if(length > 6) throw new Error(\"Unexpected BIFF Ver \" + o.BIFFVer);\n\t}\n\n\tblob.read_shift(length);\n\treturn o;\n}\nfunction write_BOF(wb/*:Workbook*/, t/*:number*/, o) {\n\tvar h = 0x0600, w = 16;\n\tswitch(o.bookType) {\n\t\tcase 'biff8': break;\n\t\tcase 'biff5': h = 0x0500; w = 8; break;\n\t\tcase 'biff4': h = 0x0004; w = 6; break;\n\t\tcase 'biff3': h = 0x0003; w = 6; break;\n\t\tcase 'biff2': h = 0x0002; w = 4; break;\n\t\tcase 'xla': break;\n\t\tdefault: throw new Error(\"unsupported BIFF version\");\n\t}\n\tvar out = new_buf(w);\n\tout.write_shift(2, h);\n\tout.write_shift(2, t);\n\tif(w > 4) out.write_shift(2, 0x7262);\n\tif(w > 6) out.write_shift(2, 0x07CD);\n\tif(w > 8) {\n\t\tout.write_shift(2, 0xC009);\n\t\tout.write_shift(2, 0x0001);\n\t\tout.write_shift(2, 0x0706);\n\t\tout.write_shift(2, 0x0000);\n\t}\n\treturn out;\n}\n\n\n/* [MS-XLS] 2.4.146 */\nfunction parse_InterfaceHdr(blob, length) {\n\tif(length === 0) return 0x04b0;\n\tif((blob.read_shift(2))!==0x04b0){/* empty */}\n\treturn 0x04b0;\n}\n\n\n/* [MS-XLS] 2.4.349 */\nfunction parse_WriteAccess(blob, length, opts) {\n\tif(opts.enc) { blob.l += length; return \"\"; }\n\tvar l = blob.l;\n\t// TODO: make sure XLUnicodeString doesnt overrun\n\tvar UserName = parse_XLUnicodeString2(blob, 0, opts);\n\tblob.read_shift(length + l - blob.l);\n\treturn UserName;\n}\nfunction write_WriteAccess(s/*:string*/, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(b8 ? 112 : 54);\n\to.write_shift(opts.biff == 8 ? 2 : 1, 7);\n\tif(b8) o.write_shift(1, 0);\n\to.write_shift(4, 0x33336853);\n\to.write_shift(4, (0x00534A74 | (b8 ? 0 : 0x20000000)));\n\twhile(o.l < o.length) o.write_shift(1, (b8 ? 0 : 32));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.351 */\nfunction parse_WsBool(blob, length, opts) {\n\tvar flags = opts && opts.biff == 8 || length == 2 ? blob.read_shift(2) : (blob.l += length, 0);\n\treturn { fDialog: flags & 0x10, fBelow: flags & 0x40, fRight: flags & 0x80 };\n}\n\n/* [MS-XLS] 2.4.28 */\nfunction parse_BoundSheet8(blob, length, opts) {\n\tvar pos = blob.read_shift(4);\n\tvar hidden = blob.read_shift(1) & 0x03;\n\tvar dt = blob.read_shift(1);\n\tswitch(dt) {\n\t\tcase 0: dt = 'Worksheet'; break;\n\t\tcase 1: dt = 'Macrosheet'; break;\n\t\tcase 2: dt = 'Chartsheet'; break;\n\t\tcase 6: dt = 'VBAModule'; break;\n\t}\n\tvar name = parse_ShortXLUnicodeString(blob, 0, opts);\n\tif(name.length === 0) name = \"Sheet1\";\n\treturn { pos:pos, hs:hidden, dt:dt, name:name };\n}\nfunction write_BoundSheet8(data, opts) {\n\tvar w = (!opts || opts.biff >= 8 ? 2 : 1);\n\tvar o = new_buf(8 + w * data.name.length);\n\to.write_shift(4, data.pos);\n\to.write_shift(1, data.hs || 0);\n\to.write_shift(1, data.dt);\n\to.write_shift(1, data.name.length);\n\tif(opts.biff >= 8) o.write_shift(1, 1);\n\to.write_shift(w * data.name.length, data.name, opts.biff < 8 ? 'sbcs' : 'utf16le');\n\tvar out = o.slice(0, o.l);\n\tout.l = o.l; return out;\n}\n\n/* [MS-XLS] 2.4.265 TODO */\nfunction parse_SST(blob, length)/*:SST*/ {\n\tvar end = blob.l + length;\n\tvar cnt = blob.read_shift(4);\n\tvar ucnt = blob.read_shift(4);\n\tvar strs/*:SST*/ = ([]/*:any*/);\n\tfor(var i = 0; i != ucnt && blob.l < end; ++i) {\n\t\tstrs.push(parse_XLUnicodeRichExtendedString(blob));\n\t}\n\tstrs.Count = cnt; strs.Unique = ucnt;\n\treturn strs;\n}\nfunction write_SST(sst, opts) {\n\tvar header = new_buf(8);\n\theader.write_shift(4, sst.Count);\n\theader.write_shift(4, sst.Unique);\n\tvar strs = [];\n\tfor(var j = 0; j < sst.length; ++j) strs[j] = write_XLUnicodeRichExtendedString(sst[j], opts);\n\tvar o = bconcat([header].concat(strs));\n\t/*::(*/o/*:: :any)*/.parts = [header.length].concat(strs.map(function(str) { return str.length; }));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.107 */\nfunction parse_ExtSST(blob, length) {\n\tvar extsst = {};\n\textsst.dsst = blob.read_shift(2);\n\tblob.l += length-2;\n\treturn extsst;\n}\n\n\n/* [MS-XLS] 2.4.221 TODO: check BIFF2-4 */\nfunction parse_Row(blob) {\n\tvar z = ({}/*:any*/);\n\tz.r = blob.read_shift(2);\n\tz.c = blob.read_shift(2);\n\tz.cnt = blob.read_shift(2) - z.c;\n\tvar miyRw = blob.read_shift(2);\n\tblob.l += 4; // reserved(2), unused(2)\n\tvar flags = blob.read_shift(1); // various flags\n\tblob.l += 3; // reserved(8), ixfe(12), flags(4)\n\tif(flags & 0x07) z.level = flags & 0x07;\n\t// collapsed: flags & 0x10\n\tif(flags & 0x20) z.hidden = true;\n\tif(flags & 0x40) z.hpt = miyRw / 20;\n\treturn z;\n}\n\n\n/* [MS-XLS] 2.4.125 */\nfunction parse_ForceFullCalculation(blob) {\n\tvar header = parse_frtHeader(blob);\n\tif(header.type != 0x08A3) throw new Error(\"Invalid Future Record \" + header.type);\n\tvar fullcalc = blob.read_shift(4);\n\treturn fullcalc !== 0x0;\n}\n\n\n\n\n\n/* [MS-XLS] 2.4.215 rt */\nfunction parse_RecalcId(blob) {\n\tblob.read_shift(2);\n\treturn blob.read_shift(4);\n}\n\n/* [MS-XLS] 2.4.87 */\nfunction parse_DefaultRowHeight(blob, length, opts) {\n\tvar f = 0;\n\tif(!(opts && opts.biff == 2)) {\n\t\tf = blob.read_shift(2);\n\t}\n\tvar miyRw = blob.read_shift(2);\n\tif((opts && opts.biff == 2)) {\n\t\tf = 1 - (miyRw >> 15); miyRw &= 0x7fff;\n\t}\n\tvar fl = {Unsynced:f&1,DyZero:(f&2)>>1,ExAsc:(f&4)>>2,ExDsc:(f&8)>>3};\n\treturn [fl, miyRw];\n}\n\n/* [MS-XLS] 2.4.345 TODO */\nfunction parse_Window1(blob) {\n\tvar xWn = blob.read_shift(2), yWn = blob.read_shift(2), dxWn = blob.read_shift(2), dyWn = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), iTabCur = blob.read_shift(2), iTabFirst = blob.read_shift(2);\n\tvar ctabSel = blob.read_shift(2), wTabRatio = blob.read_shift(2);\n\treturn { Pos: [xWn, yWn], Dim: [dxWn, dyWn], Flags: flags, CurTab: iTabCur,\n\t\tFirstTab: iTabFirst, Selected: ctabSel, TabRatio: wTabRatio };\n}\nfunction write_Window1(/*::opts*/) {\n\tvar o = new_buf(18);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0x7260);\n\to.write_shift(2, 0x44c0);\n\to.write_shift(2, 0x38);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 1);\n\to.write_shift(2, 0x01f4);\n\treturn o;\n}\n/* [MS-XLS] 2.4.346 TODO */\nfunction parse_Window2(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff < 5) return {};\n\tvar f = blob.read_shift(2);\n\treturn { RTL: f & 0x40 };\n}\nfunction write_Window2(view) {\n\tvar o = new_buf(18), f = 0x6b6;\n\tif(view && view.RTL) f |= 0x40;\n\to.write_shift(2, f);\n\to.write_shift(4, 0);\n\to.write_shift(4, 64);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.189 TODO */\nfunction parse_Pane(/*blob, length, opts*/) {\n}\n\n/* [MS-XLS] 2.4.122 TODO */\nfunction parse_Font(blob, length, opts) {\n\tvar o/*:any*/ = {\n\t\tdyHeight: blob.read_shift(2),\n\t\tfl: blob.read_shift(2)\n\t};\n\tswitch((opts && opts.biff) || 8) {\n\t\tcase 2: break;\n\t\tcase 3: case 4: blob.l += 2; break;\n\t\tdefault: blob.l += 10; break;\n\t}\n\to.name = parse_ShortXLUnicodeString(blob, 0, opts);\n\treturn o;\n}\nfunction write_Font(data, opts) {\n\tvar name = data.name || \"Arial\";\n\tvar b5 = (opts && (opts.biff == 5)), w = (b5 ? (15 + name.length) : (16 + 2 * name.length));\n\tvar o = new_buf(w);\n\to.write_shift(2, (data.sz || 12) * 20);\n\to.write_shift(4, 0);\n\to.write_shift(2, 400);\n\to.write_shift(4, 0);\n\to.write_shift(2, 0);\n\to.write_shift(1, name.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * name.length, name, (b5 ? \"sbcs\" : \"utf16le\"));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.149 */\nfunction parse_LabelSst(blob) {\n\tvar cell = parse_XLSCell(blob);\n\tcell.isst = blob.read_shift(4);\n\treturn cell;\n}\nfunction write_LabelSst(R/*:number*/, C/*:number*/, v/*:number*/, os/*:number*/ /*::, opts*/) {\n\tvar o = new_buf(10);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(4, v);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.148 */\nfunction parse_Label(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar target = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) blob.l++;\n\tvar str = parse_XLUnicodeString(blob, target - blob.l, opts);\n\tcell.val = str;\n\treturn cell;\n}\nfunction write_Label(R/*:number*/, C/*:number*/, v/*:string*/, os/*:number*/, opts) {\n\tvar b8 = !opts || opts.biff == 8;\n\tvar o = new_buf(6 + 2 + (+b8) + (1 + b8) * v.length);\n\twrite_XLSCell(R, C, os, o);\n\to.write_shift(2, v.length);\n\tif(b8) o.write_shift(1, 1);\n\to.write_shift((1 + b8) * v.length, v, b8 ? 'utf16le' : 'sbcs');\n\treturn o;\n}\n\n\n/* [MS-XLS] 2.4.126 Number Formats */\nfunction parse_Format(blob, length, opts) {\n\tvar numFmtId = blob.read_shift(2);\n\tvar fmtstr = parse_XLUnicodeString2(blob, 0, opts);\n\treturn [numFmtId, fmtstr];\n}\nfunction write_Format(i/*:number*/, f/*:string*/, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? (3 + f.length) : (5 + 2 * f.length));\n\to.write_shift(2, i);\n\to.write_shift((b5 ? 1 : 2), f.length);\n\tif(!b5) o.write_shift(1, 1);\n\to.write_shift((b5 ? 1 : 2) * f.length, f, (b5 ? 'sbcs' : 'utf16le'));\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(out.l == null) out.l = out.length;\n\treturn out;\n}\nvar parse_BIFF2Format = parse_XLUnicodeString2;\n\n/* [MS-XLS] 2.4.90 */\nfunction parse_Dimensions(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar r = blob.read_shift(w), R = blob.read_shift(w);\n\tvar c = blob.read_shift(2), C = blob.read_shift(2);\n\tblob.l = end;\n\treturn {s: {r:r, c:c}, e: {r:R, c:C}};\n}\nfunction write_Dimensions(range, opts) {\n\tvar w = opts.biff == 8 || !opts.biff ? 4 : 2;\n\tvar o = new_buf(2*w + 6);\n\to.write_shift(w, range.s.r);\n\to.write_shift(w, range.e.r + 1);\n\to.write_shift(2, range.s.c);\n\to.write_shift(2, range.e.c + 1);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.220 */\nfunction parse_RK(blob) {\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrec = parse_RkRec(blob);\n\treturn {r:rw, c:col, ixfe:rkrec[0], rknum:rkrec[1]};\n}\n\n/* [MS-XLS] 2.4.175 */\nfunction parse_MulRk(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar rkrecs = [];\n\twhile(blob.l < target) rkrecs.push(parse_RkRec(blob));\n\tif(blob.l !== target) throw new Error(\"MulRK read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(rkrecs.length != lastcol - col + 1) throw new Error(\"MulRK length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, rkrec:rkrecs};\n}\n/* [MS-XLS] 2.4.174 */\nfunction parse_MulBlank(blob, length) {\n\tvar target = blob.l + length - 2;\n\tvar rw = blob.read_shift(2), col = blob.read_shift(2);\n\tvar ixfes = [];\n\twhile(blob.l < target) ixfes.push(blob.read_shift(2));\n\tif(blob.l !== target) throw new Error(\"MulBlank read error\");\n\tvar lastcol = blob.read_shift(2);\n\tif(ixfes.length != lastcol - col + 1) throw new Error(\"MulBlank length mismatch\");\n\treturn {r:rw, c:col, C:lastcol, ixfe:ixfes};\n}\n\n/* [MS-XLS] 2.5.20 2.5.249 TODO: interpret values here */\nfunction parse_CellStyleXF(blob, length, style, opts) {\n\tvar o = {};\n\tvar a = blob.read_shift(4), b = blob.read_shift(4);\n\tvar c = blob.read_shift(4), d = blob.read_shift(2);\n\to.patternType = XLSFillPattern[c >> 26];\n\n\tif(!opts.cellStyles) return o;\n\to.alc = a & 0x07;\n\to.fWrap = (a >> 3) & 0x01;\n\to.alcV = (a >> 4) & 0x07;\n\to.fJustLast = (a >> 7) & 0x01;\n\to.trot = (a >> 8) & 0xFF;\n\to.cIndent = (a >> 16) & 0x0F;\n\to.fShrinkToFit = (a >> 20) & 0x01;\n\to.iReadOrder = (a >> 22) & 0x02;\n\to.fAtrNum = (a >> 26) & 0x01;\n\to.fAtrFnt = (a >> 27) & 0x01;\n\to.fAtrAlc = (a >> 28) & 0x01;\n\to.fAtrBdr = (a >> 29) & 0x01;\n\to.fAtrPat = (a >> 30) & 0x01;\n\to.fAtrProt = (a >> 31) & 0x01;\n\n\to.dgLeft = b & 0x0F;\n\to.dgRight = (b >> 4) & 0x0F;\n\to.dgTop = (b >> 8) & 0x0F;\n\to.dgBottom = (b >> 12) & 0x0F;\n\to.icvLeft = (b >> 16) & 0x7F;\n\to.icvRight = (b >> 23) & 0x7F;\n\to.grbitDiag = (b >> 30) & 0x03;\n\n\to.icvTop = c & 0x7F;\n\to.icvBottom = (c >> 7) & 0x7F;\n\to.icvDiag = (c >> 14) & 0x7F;\n\to.dgDiag = (c >> 21) & 0x0F;\n\n\to.icvFore = d & 0x7F;\n\to.icvBack = (d >> 7) & 0x7F;\n\to.fsxButton = (d >> 14) & 0x01;\n\treturn o;\n}\n//function parse_CellXF(blob, length, opts) {return parse_CellStyleXF(blob,length,0, opts);}\n//function parse_StyleXF(blob, length, opts) {return parse_CellStyleXF(blob,length,1, opts);}\n\n/* [MS-XLS] 2.4.353 TODO: actually do this right */\nfunction parse_XF(blob, length, opts) {\n\tvar o = {};\n\to.ifnt = blob.read_shift(2); o.numFmtId = blob.read_shift(2); o.flags = blob.read_shift(2);\n\to.fStyle = (o.flags >> 2) & 0x01;\n\tlength -= 6;\n\to.data = parse_CellStyleXF(blob, length, o.fStyle, opts);\n\treturn o;\n}\nfunction write_XF(data, ixfeP, opts, o) {\n\tvar b5 = (opts && (opts.biff == 5));\n\tif(!o) o = new_buf(b5 ? 16 : 20);\n\to.write_shift(2, 0);\n\tif(data.style) {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, 0xFFF4);\n\t} else {\n\t\to.write_shift(2, (data.numFmtId||0));\n\t\to.write_shift(2, (ixfeP<<4));\n\t}\n\tvar f = 0;\n\tif(data.numFmtId > 0 && b5) f |= 0x0400;\n\to.write_shift(4, f);\n\to.write_shift(4, 0);\n\tif(!b5) o.write_shift(4, 0);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.134 */\nfunction parse_Guts(blob) {\n\tblob.l += 4;\n\tvar out = [blob.read_shift(2), blob.read_shift(2)];\n\tif(out[0] !== 0) out[0]--;\n\tif(out[1] !== 0) out[1]--;\n\tif(out[0] > 7 || out[1] > 7) throw new Error(\"Bad Gutters: \" + out.join(\"|\"));\n\treturn out;\n}\nfunction write_Guts(guts/*:Array*/) {\n\tvar o = new_buf(8);\n\to.write_shift(4, 0);\n\to.write_shift(2, guts[0] ? guts[0] + 1 : 0);\n\to.write_shift(2, guts[1] ? guts[1] + 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.24 */\nfunction parse_BoolErr(blob, length, opts) {\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2 || length == 9) ++blob.l;\n\tvar val = parse_Bes(blob, 2);\n\tcell.val = val;\n\tcell.t = (val === true || val === false) ? 'b' : 'e';\n\treturn cell;\n}\nfunction write_BoolErr(R/*:number*/, C/*:number*/, v, os/*:number*/, opts, t/*:string*/) {\n\tvar o = new_buf(8);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Bes(v, t, o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.180 Number */\nfunction parse_Number(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 2) opts.biff = 5;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar xnum = parse_Xnum(blob, 8);\n\tcell.val = xnum;\n\treturn cell;\n}\nfunction write_Number(R/*:number*/, C/*:number*/, v, os/*:: :number, opts*/) {\n\tvar o = new_buf(14);\n\twrite_XLSCell(R, C, os, o);\n\twrite_Xnum(v, o);\n\treturn o;\n}\n\nvar parse_XLHeaderFooter = parse_OptXLUnicodeString; // TODO: parse 2.4.136\n\n/* [MS-XLS] 2.4.271 */\nfunction parse_SupBook(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar ctab = blob.read_shift(2);\n\tvar cch = blob.read_shift(2);\n\topts.sbcch = cch;\n\tif(cch == 0x0401 || cch == 0x3A01) return [cch, ctab];\n\tif(cch < 0x01 || cch >0xff) throw new Error(\"Unexpected SupBook type: \"+cch);\n\tvar virtPath = parse_XLUnicodeStringNoCch(blob, cch);\n\t/* TODO: 2.5.277 Virtual Path */\n\tvar rgst = [];\n\twhile(end > blob.l) rgst.push(parse_XLUnicodeString(blob));\n\treturn [cch, ctab, virtPath, rgst];\n}\n\n/* [MS-XLS] 2.4.105 TODO */\nfunction parse_ExternName(blob, length, opts) {\n\tvar flags = blob.read_shift(2);\n\tvar body;\n\tvar o = ({\n\t\tfBuiltIn: flags & 0x01,\n\t\tfWantAdvise: (flags >>> 1) & 0x01,\n\t\tfWantPict: (flags >>> 2) & 0x01,\n\t\tfOle: (flags >>> 3) & 0x01,\n\t\tfOleLink: (flags >>> 4) & 0x01,\n\t\tcf: (flags >>> 5) & 0x3FF,\n\t\tfIcon: flags >>> 15 & 0x01\n\t}/*:any*/);\n\tif(opts.sbcch === 0x3A01) body = parse_AddinUdf(blob, length-2, opts);\n\t//else throw new Error(\"unsupported SupBook cch: \" + opts.sbcch);\n\to.body = body || blob.read_shift(length-2);\n\tif(typeof body === \"string\") o.Name = body;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.150 TODO */\nvar XLSLblBuiltIn = [\n\t\"_xlnm.Consolidate_Area\",\n\t\"_xlnm.Auto_Open\",\n\t\"_xlnm.Auto_Close\",\n\t\"_xlnm.Extract\",\n\t\"_xlnm.Database\",\n\t\"_xlnm.Criteria\",\n\t\"_xlnm.Print_Area\",\n\t\"_xlnm.Print_Titles\",\n\t\"_xlnm.Recorder\",\n\t\"_xlnm.Data_Form\",\n\t\"_xlnm.Auto_Activate\",\n\t\"_xlnm.Auto_Deactivate\",\n\t\"_xlnm.Sheet_Title\",\n\t\"_xlnm._FilterDatabase\"\n];\nfunction parse_Lbl(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar flags = blob.read_shift(2);\n\tvar chKey = blob.read_shift(1);\n\tvar cch = blob.read_shift(1);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar itab = 0;\n\tif(!opts || opts.biff >= 5) {\n\t\tif(opts.biff != 5) blob.l += 2;\n\t\titab = blob.read_shift(2);\n\t\tif(opts.biff == 5) blob.l += 2;\n\t\tblob.l += 4;\n\t}\n\tvar name = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tif(flags & 0x20) name = XLSLblBuiltIn[name.charCodeAt(0)];\n\tvar npflen = target - blob.l; if(opts && opts.biff == 2) --npflen;\n\t/*jshint -W018 */\n\tvar rgce = (target == blob.l || cce === 0 || !(npflen > 0)) ? [] : parse_NameParsedFormula(blob, npflen, opts, cce);\n\t/*jshint +W018 */\n\treturn {\n\t\tchKey: chKey,\n\t\tName: name,\n\t\titab: itab,\n\t\trgce: rgce\n\t};\n}\n\n/* [MS-XLS] 2.4.106 TODO: verify filename encoding */\nfunction parse_ExternSheet(blob, length, opts) {\n\tif(opts.biff < 8) return parse_BIFF5ExternSheet(blob, length, opts);\n\tvar o = [], target = blob.l + length, len = blob.read_shift(opts.biff > 8 ? 4 : 2);\n\twhile(len-- !== 0) o.push(parse_XTI(blob, opts.biff > 8 ? 12 : 6, opts));\n\t\t// [iSupBook, itabFirst, itabLast];\n\tif(blob.l != target) throw new Error(\"Bad ExternSheet: \" + blob.l + \" != \" + target);\n\treturn o;\n}\nfunction parse_BIFF5ExternSheet(blob, length, opts) {\n\tif(blob[blob.l + 1] == 0x03) blob[blob.l]++;\n\tvar o = parse_ShortXLUnicodeString(blob, length, opts);\n\treturn o.charCodeAt(0) == 0x03 ? o.slice(1) : o;\n}\n\n/* [MS-XLS] 2.4.176 TODO: check older biff */\nfunction parse_NameCmt(blob, length, opts) {\n\tif(opts.biff < 8) { blob.l += length; return; }\n\tvar cchName = blob.read_shift(2);\n\tvar cchComment = blob.read_shift(2);\n\tvar name = parse_XLUnicodeStringNoCch(blob, cchName, opts);\n\tvar comment = parse_XLUnicodeStringNoCch(blob, cchComment, opts);\n\treturn [name, comment];\n}\n\n/* [MS-XLS] 2.4.260 */\nfunction parse_ShrFmla(blob, length, opts) {\n\tvar ref = parse_RefU(blob, 6);\n\tblob.l++;\n\tvar cUse = blob.read_shift(1);\n\tlength -= 8;\n\treturn [parse_SharedParsedFormula(blob, length, opts), cUse, ref];\n}\n\n/* [MS-XLS] 2.4.4 TODO */\nfunction parse_Array(blob, length, opts) {\n\tvar ref = parse_Ref(blob, 6);\n\t/* TODO: fAlwaysCalc */\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l ++; length -= 7; break;\n\t\tcase 3: case 4: blob.l += 2; length -= 8; break;\n\t\tdefault: blob.l += 6; length -= 12;\n\t}\n\treturn [ref, parse_ArrayParsedFormula(blob, length, opts, ref)];\n}\n\n/* [MS-XLS] 2.4.173 */\nfunction parse_MTRSettings(blob) {\n\tvar fMTREnabled = blob.read_shift(4) !== 0x00;\n\tvar fUserSetThreadCount = blob.read_shift(4) !== 0x00;\n\tvar cUserThreadCount = blob.read_shift(4);\n\treturn [fMTREnabled, fUserSetThreadCount, cUserThreadCount];\n}\n\n/* [MS-XLS] 2.5.186 TODO: BIFF5 */\nfunction parse_NoteSh(blob, length, opts) {\n\tif(opts.biff < 8) return;\n\tvar row = blob.read_shift(2), col = blob.read_shift(2);\n\tvar flags = blob.read_shift(2), idObj = blob.read_shift(2);\n\tvar stAuthor = parse_XLUnicodeString2(blob, 0, opts);\n\tif(opts.biff < 8) blob.read_shift(1);\n\treturn [{r:row,c:col}, stAuthor, idObj, flags];\n}\n\n/* [MS-XLS] 2.4.179 */\nfunction parse_Note(blob, length, opts) {\n\t/* TODO: Support revisions */\n\treturn parse_NoteSh(blob, length, opts);\n}\n\n/* [MS-XLS] 2.4.168 */\nfunction parse_MergeCells(blob, length)/*:Array*/ {\n\tvar merges/*:Array*/ = [];\n\tvar cmcs = blob.read_shift(2);\n\twhile (cmcs--) merges.push(parse_Ref8U(blob,length));\n\treturn merges;\n}\nfunction write_MergeCells(merges/*:Array*/) {\n\tvar o = new_buf(2 + merges.length * 8);\n\to.write_shift(2, merges.length);\n\tfor(var i = 0; i < merges.length; ++i) write_Ref8U(merges[i], o);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.181 TODO: parse all the things! */\nfunction parse_Obj(blob, length, opts) {\n\tif(opts && opts.biff < 8) return parse_BIFF5Obj(blob, length, opts);\n\tvar cmo = parse_FtCmo(blob, 22); // id, ot, flags\n\tvar fts = parse_FtArray(blob, length-22, cmo[1]);\n\treturn { cmo: cmo, ft:fts };\n}\n/* from older spec */\nvar parse_BIFF5OT = {\n0x08: function(blob, length) {\n\tvar tgt = blob.l + length;\n\tblob.l += 10; // todo\n\tvar cf = blob.read_shift(2);\n\tblob.l += 4;\n\tblob.l += 2; //var cbPictFmla = blob.read_shift(2);\n\tblob.l += 2;\n\tblob.l += 2; //var grbit = blob.read_shift(2);\n\tblob.l += 4;\n\tvar cchName = blob.read_shift(1);\n\tblob.l += cchName; // TODO: stName\n\tblob.l = tgt; // TODO: fmla\n\treturn { fmt:cf };\n}\n};\n\nfunction parse_BIFF5Obj(blob, length, opts) {\n\tblob.l += 4; //var cnt = blob.read_shift(4);\n\tvar ot = blob.read_shift(2);\n\tvar id = blob.read_shift(2);\n\tvar grbit = blob.read_shift(2);\n\tblob.l += 2; //var colL = blob.read_shift(2);\n\tblob.l += 2; //var dxL = blob.read_shift(2);\n\tblob.l += 2; //var rwT = blob.read_shift(2);\n\tblob.l += 2; //var dyT = blob.read_shift(2);\n\tblob.l += 2; //var colR = blob.read_shift(2);\n\tblob.l += 2; //var dxR = blob.read_shift(2);\n\tblob.l += 2; //var rwB = blob.read_shift(2);\n\tblob.l += 2; //var dyB = blob.read_shift(2);\n\tblob.l += 2; //var cbMacro = blob.read_shift(2);\n\tblob.l += 6;\n\tlength -= 36;\n\tvar fts = [];\n\tfts.push((parse_BIFF5OT[ot]||parsenoop)(blob, length, opts));\n\treturn { cmo: [id, ot, grbit], ft:fts };\n}\n\n/* [MS-XLS] 2.4.329 TODO: parse properly */\nfunction parse_TxO(blob, length, opts) {\n\tvar s = blob.l;\n\tvar texts = \"\";\ntry {\n\tblob.l += 4;\n\tvar ot = (opts.lastobj||{cmo:[0,0]}).cmo[1];\n\tvar controlInfo; // eslint-disable-line no-unused-vars\n\tif([0,5,7,11,12,14].indexOf(ot) == -1) blob.l += 6;\n\telse controlInfo = parse_ControlInfo(blob, 6, opts); // eslint-disable-line no-unused-vars\n\tvar cchText = blob.read_shift(2);\n\t/*var cbRuns = */blob.read_shift(2);\n\t/*var ifntEmpty = */parseuint16(blob, 2);\n\tvar len = blob.read_shift(2);\n\tblob.l += len;\n\t//var fmla = parse_ObjFmla(blob, s + length - blob.l);\n\n\tfor(var i = 1; i < blob.lens.length-1; ++i) {\n\t\tif(blob.l-s != blob.lens[i]) throw new Error(\"TxO: bad continue record\");\n\t\tvar hdr = blob[blob.l];\n\t\tvar t = parse_XLUnicodeStringNoCch(blob, blob.lens[i+1]-blob.lens[i]-1);\n\t\ttexts += t;\n\t\tif(texts.length >= (hdr ? cchText : 2*cchText)) break;\n\t}\n\tif(texts.length !== cchText && texts.length !== cchText*2) {\n\t\tthrow new Error(\"cchText: \" + cchText + \" != \" + texts.length);\n\t}\n\n\tblob.l = s + length;\n\t/* [MS-XLS] 2.5.272 TxORuns */\n//\tvar rgTxoRuns = [];\n//\tfor(var j = 0; j != cbRuns/8-1; ++j) blob.l += 8;\n//\tvar cchText2 = blob.read_shift(2);\n//\tif(cchText2 !== cchText) throw new Error(\"TxOLastRun mismatch: \" + cchText2 + \" \" + cchText);\n//\tblob.l += 6;\n//\tif(s + length != blob.l) throw new Error(\"TxO \" + (s + length) + \", at \" + blob.l);\n\treturn { t: texts };\n} catch(e) { blob.l = s + length; return { t: texts }; }\n}\n\n/* [MS-XLS] 2.4.140 */\nfunction parse_HLink(blob, length) {\n\tvar ref = parse_Ref8U(blob, 8);\n\tblob.l += 16; /* CLSID */\n\tvar hlink = parse_Hyperlink(blob, length-24);\n\treturn [ref, hlink];\n}\nfunction write_HLink(hl) {\n\tvar O = new_buf(24);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tvar clsid = \"d0 c9 ea 79 f9 ba ce 11 8c 82 00 aa 00 4b a9 0b\".split(\" \");\n\tfor(var i = 0; i < 16; ++i) O.write_shift(1, parseInt(clsid[i], 16));\n\treturn bconcat([O, write_Hyperlink(hl[1])]);\n}\n\n\n/* [MS-XLS] 2.4.141 */\nfunction parse_HLinkTooltip(blob, length) {\n\tblob.read_shift(2);\n\tvar ref = parse_Ref8U(blob, 8);\n\tvar wzTooltip = blob.read_shift((length-10)/2, 'dbcs-cont');\n\twzTooltip = wzTooltip.replace(chr0,\"\");\n\treturn [ref, wzTooltip];\n}\nfunction write_HLinkTooltip(hl) {\n\tvar TT = hl[1].Tooltip;\n\tvar O = new_buf(10 + 2 * (TT.length + 1));\n\tO.write_shift(2, 0x0800);\n\tvar ref = decode_cell(hl[0]);\n\tO.write_shift(2, ref.r); O.write_shift(2, ref.r);\n\tO.write_shift(2, ref.c); O.write_shift(2, ref.c);\n\tfor(var i = 0; i < TT.length; ++i) O.write_shift(2, TT.charCodeAt(i));\n\tO.write_shift(2, 0);\n\treturn O;\n}\n\n/* [MS-XLS] 2.4.63 */\nfunction parse_Country(blob)/*:[string|number, string|number]*/ {\n\tvar o = [0,0], d;\n\td = blob.read_shift(2); o[0] = CountryEnum[d] || d;\n\td = blob.read_shift(2); o[1] = CountryEnum[d] || d;\n\treturn o;\n}\nfunction write_Country(o) {\n\tif(!o) o = new_buf(4);\n\to.write_shift(2, 0x01);\n\to.write_shift(2, 0x01);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.50 ClrtClient */\nfunction parse_ClrtClient(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.188 */\nfunction parse_Palette(blob) {\n\tvar ccv = blob.read_shift(2);\n\tvar o = [];\n\twhile(ccv-->0) o.push(parse_LongRGB(blob, 8));\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.354 */\nfunction parse_XFCRC(blob) {\n\tblob.l += 2;\n\tvar o = {cxfs:0, crc:0};\n\to.cxfs = blob.read_shift(2);\n\to.crc = blob.read_shift(4);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.53 TODO: parse flags */\n/* [MS-XLSB] 2.4.323 TODO: parse flags */\nfunction parse_ColInfo(blob, length, opts) {\n\tif(!opts.cellStyles) return parsenoop(blob, length);\n\tvar w = opts && opts.biff >= 12 ? 4 : 2;\n\tvar colFirst = blob.read_shift(w);\n\tvar colLast = blob.read_shift(w);\n\tvar coldx = blob.read_shift(w);\n\tvar ixfe = blob.read_shift(w);\n\tvar flags = blob.read_shift(2);\n\tif(w == 2) blob.l += 2;\n\tvar o = ({s:colFirst, e:colLast, w:coldx, ixfe:ixfe, flags:flags}/*:any*/);\n\tif(opts.biff >= 5 || !opts.biff) o.level = (flags >> 8) & 0x7;\n\treturn o;\n}\nfunction write_ColInfo(col, idx) {\n\tvar o = new_buf(12);\n\to.write_shift(2, idx);\n\to.write_shift(2, idx);\n\to.write_shift(2, col.width * 256);\n\to.write_shift(2, 0);\n\tvar f = 0;\n\tif(col.hidden) f |= 1;\n\to.write_shift(1, f);\n\tf = col.level || 0;\n\to.write_shift(1, f);\n\to.write_shift(2, 0);\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.257 */\nfunction parse_Setup(blob, length) {\n\tvar o = {};\n\tif(length < 32) return o;\n\tblob.l += 16;\n\to.header = parse_Xnum(blob, 8);\n\to.footer = parse_Xnum(blob, 8);\n\tblob.l += 2;\n\treturn o;\n}\n\n/* [MS-XLS] 2.4.261 */\nfunction parse_ShtProps(blob, length, opts) {\n\tvar def = {area:false};\n\tif(opts.biff != 5) { blob.l += length; return def; }\n\tvar d = blob.read_shift(1); blob.l += 3;\n\tif((d & 0x10)) def.area = true;\n\treturn def;\n}\n\n/* [MS-XLS] 2.4.241 */\nfunction write_RRTabId(n/*:number*/) {\n\tvar out = new_buf(2 * n);\n\tfor(var i = 0; i < n; ++i) out.write_shift(2, i+1);\n\treturn out;\n}\n\nvar parse_Blank = parse_XLSCell; /* [MS-XLS] 2.4.20 Just the cell */\nvar parse_Scl = parseuint16a; /* [MS-XLS] 2.4.247 num, den */\nvar parse_String = parse_XLUnicodeString; /* [MS-XLS] 2.4.268 */\n\n/* --- Specific to versions before BIFF8 --- */\nfunction parse_ImData(blob) {\n\tvar cf = blob.read_shift(2);\n\tvar env = blob.read_shift(2);\n\tvar lcb = blob.read_shift(4);\n\tvar o = {fmt:cf, env:env, len:lcb, data:blob.slice(blob.l,blob.l+lcb)};\n\tblob.l += lcb;\n\treturn o;\n}\n\n/* BIFF2_??? where ??? is the name from [XLS] */\nfunction parse_BIFF2STR(blob, length, opts) {\n\tif(opts.biffguess && opts.biff == 5) opts.biff = 2;\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar str = parse_XLUnicodeString2(blob, length-7, opts);\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n\nfunction parse_BIFF2NUM(blob/*::, length*/) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = parse_Xnum(blob, 8);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2NUM(r/*:number*/, c/*:number*/, val/*:number*/) {\n\tvar out = new_buf(15);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(8, val, 'f');\n\treturn out;\n}\n\nfunction parse_BIFF2INT(blob) {\n\tvar cell = parse_XLSCell(blob, 6);\n\t++blob.l;\n\tvar num = blob.read_shift(2);\n\tcell.t = 'n';\n\tcell.val = num;\n\treturn cell;\n}\nfunction write_BIFF2INT(r/*:number*/, c/*:number*/, val/*:number*/) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(2, val);\n\treturn out;\n}\n\nfunction parse_BIFF2STRING(blob) {\n\tvar cch = blob.read_shift(1);\n\tif(cch === 0) { blob.l++; return \"\"; }\n\treturn blob.read_shift(cch, 'sbcs-cont');\n}\n\n/* TODO: convert to BIFF8 font struct */\nfunction parse_BIFF2FONTXTRA(blob, length) {\n\tblob.l += 6; // unknown\n\tblob.l += 2; // font weight \"bls\"\n\tblob.l += 1; // charset\n\tblob.l += 3; // unknown\n\tblob.l += 1; // font family\n\tblob.l += length - 13;\n}\n\n/* TODO: parse rich text runs */\nfunction parse_RString(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tvar cch = blob.read_shift(2);\n\tvar str = parse_XLUnicodeStringNoCch(blob, cch, opts);\n\tblob.l = end;\n\tcell.t = 'str';\n\tcell.val = str;\n\treturn cell;\n}\n/* from js-harb (C) 2014-present SheetJS */\nvar DBF_SUPPORTED_VERSIONS = [0x02, 0x03, 0x30, 0x31, 0x83, 0x8B, 0x8C, 0xF5];\nvar DBF = /*#__PURE__*/(function() {\nvar dbf_codepage_map = {\n\t/* Code Pages Supported by Visual FoxPro */\n\t/*::[*/0x01/*::]*/: 437, /*::[*/0x02/*::]*/: 850,\n\t/*::[*/0x03/*::]*/: 1252, /*::[*/0x04/*::]*/: 10000,\n\t/*::[*/0x64/*::]*/: 852, /*::[*/0x65/*::]*/: 866,\n\t/*::[*/0x66/*::]*/: 865, /*::[*/0x67/*::]*/: 861,\n\t/*::[*/0x68/*::]*/: 895, /*::[*/0x69/*::]*/: 620,\n\t/*::[*/0x6A/*::]*/: 737, /*::[*/0x6B/*::]*/: 857,\n\t/*::[*/0x78/*::]*/: 950, /*::[*/0x79/*::]*/: 949,\n\t/*::[*/0x7A/*::]*/: 936, /*::[*/0x7B/*::]*/: 932,\n\t/*::[*/0x7C/*::]*/: 874, /*::[*/0x7D/*::]*/: 1255,\n\t/*::[*/0x7E/*::]*/: 1256, /*::[*/0x96/*::]*/: 10007,\n\t/*::[*/0x97/*::]*/: 10029, /*::[*/0x98/*::]*/: 10006,\n\t/*::[*/0xC8/*::]*/: 1250, /*::[*/0xC9/*::]*/: 1251,\n\t/*::[*/0xCA/*::]*/: 1254, /*::[*/0xCB/*::]*/: 1253,\n\n\t/* shapefile DBF extension */\n\t/*::[*/0x00/*::]*/: 20127, /*::[*/0x08/*::]*/: 865,\n\t/*::[*/0x09/*::]*/: 437, /*::[*/0x0A/*::]*/: 850,\n\t/*::[*/0x0B/*::]*/: 437, /*::[*/0x0D/*::]*/: 437,\n\t/*::[*/0x0E/*::]*/: 850, /*::[*/0x0F/*::]*/: 437,\n\t/*::[*/0x10/*::]*/: 850, /*::[*/0x11/*::]*/: 437,\n\t/*::[*/0x12/*::]*/: 850, /*::[*/0x13/*::]*/: 932,\n\t/*::[*/0x14/*::]*/: 850, /*::[*/0x15/*::]*/: 437,\n\t/*::[*/0x16/*::]*/: 850, /*::[*/0x17/*::]*/: 865,\n\t/*::[*/0x18/*::]*/: 437, /*::[*/0x19/*::]*/: 437,\n\t/*::[*/0x1A/*::]*/: 850, /*::[*/0x1B/*::]*/: 437,\n\t/*::[*/0x1C/*::]*/: 863, /*::[*/0x1D/*::]*/: 850,\n\t/*::[*/0x1F/*::]*/: 852, /*::[*/0x22/*::]*/: 852,\n\t/*::[*/0x23/*::]*/: 852, /*::[*/0x24/*::]*/: 860,\n\t/*::[*/0x25/*::]*/: 850, /*::[*/0x26/*::]*/: 866,\n\t/*::[*/0x37/*::]*/: 850, /*::[*/0x40/*::]*/: 852,\n\t/*::[*/0x4D/*::]*/: 936, /*::[*/0x4E/*::]*/: 949,\n\t/*::[*/0x4F/*::]*/: 950, /*::[*/0x50/*::]*/: 874,\n\t/*::[*/0x57/*::]*/: 1252, /*::[*/0x58/*::]*/: 1252,\n\t/*::[*/0x59/*::]*/: 1252, /*::[*/0x6C/*::]*/: 863,\n\t/*::[*/0x86/*::]*/: 737, /*::[*/0x87/*::]*/: 852,\n\t/*::[*/0x88/*::]*/: 857, /*::[*/0xCC/*::]*/: 1257,\n\n\t/*::[*/0xFF/*::]*/: 16969\n};\nvar dbf_reverse_map = evert({\n\t/*::[*/0x01/*::]*/: 437, /*::[*/0x02/*::]*/: 850,\n\t/*::[*/0x03/*::]*/: 1252, /*::[*/0x04/*::]*/: 10000,\n\t/*::[*/0x64/*::]*/: 852, /*::[*/0x65/*::]*/: 866,\n\t/*::[*/0x66/*::]*/: 865, /*::[*/0x67/*::]*/: 861,\n\t/*::[*/0x68/*::]*/: 895, /*::[*/0x69/*::]*/: 620,\n\t/*::[*/0x6A/*::]*/: 737, /*::[*/0x6B/*::]*/: 857,\n\t/*::[*/0x78/*::]*/: 950, /*::[*/0x79/*::]*/: 949,\n\t/*::[*/0x7A/*::]*/: 936, /*::[*/0x7B/*::]*/: 932,\n\t/*::[*/0x7C/*::]*/: 874, /*::[*/0x7D/*::]*/: 1255,\n\t/*::[*/0x7E/*::]*/: 1256, /*::[*/0x96/*::]*/: 10007,\n\t/*::[*/0x97/*::]*/: 10029, /*::[*/0x98/*::]*/: 10006,\n\t/*::[*/0xC8/*::]*/: 1250, /*::[*/0xC9/*::]*/: 1251,\n\t/*::[*/0xCA/*::]*/: 1254, /*::[*/0xCB/*::]*/: 1253,\n\t/*::[*/0x00/*::]*/: 20127\n});\n/* TODO: find an actual specification */\nfunction dbf_to_aoa(buf, opts)/*:AOA*/ {\n\tvar out/*:AOA*/ = [];\n\tvar d/*:Block*/ = (new_raw_buf(1)/*:any*/);\n\tswitch(opts.type) {\n\t\tcase 'base64': d = s2a(Base64_decode(buf)); break;\n\t\tcase 'binary': d = s2a(buf); break;\n\t\tcase 'buffer':\n\t\tcase 'array': d = buf; break;\n\t}\n\tprep_blob(d, 0);\n\n\t/* header */\n\tvar ft = d.read_shift(1);\n\tvar memo = !!(ft & 0x88);\n\tvar vfp = false, l7 = false;\n\tswitch(ft) {\n\t\tcase 0x02: break; // dBASE II\n\t\tcase 0x03: break; // dBASE III\n\t\tcase 0x30: vfp = true; memo = true; break; // VFP\n\t\tcase 0x31: vfp = true; memo = true; break; // VFP with autoincrement\n\t\t// 0x43 dBASE IV SQL table files\n\t\t// 0x63 dBASE IV SQL system files\n\t\tcase 0x83: break; // dBASE III with memo\n\t\tcase 0x8B: break; // dBASE IV with memo\n\t\tcase 0x8C: l7 = true; break; // dBASE Level 7 with memo\n\t\t// case 0xCB dBASE IV SQL table files with memo\n\t\tcase 0xF5: break; // FoxPro 2.x with memo\n\t\t// case 0xFB FoxBASE\n\t\tdefault: throw new Error(\"DBF Unsupported Version: \" + ft.toString(16));\n\t}\n\n\tvar nrow = 0, fpos = 0x0209;\n\tif(ft == 0x02) nrow = d.read_shift(2);\n\td.l += 3; // dBASE II stores DDMMYY date, others use YYMMDD\n\tif(ft != 0x02) nrow = d.read_shift(4);\n\tif(nrow > 1048576) nrow = 1e6;\n\n\tif(ft != 0x02) fpos = d.read_shift(2); // header length\n\tvar rlen = d.read_shift(2); // record length\n\n\tvar /*flags = 0,*/ current_cp = opts.codepage || 1252;\n\tif(ft != 0x02) { // 20 reserved bytes\n\t\td.l+=16;\n\t\t/*flags = */d.read_shift(1);\n\t\t//if(memo && ((flags & 0x02) === 0)) throw new Error(\"DBF Flags \" + flags.toString(16) + \" ft \" + ft.toString(16));\n\n\t\t/* codepage present in FoxPro and dBASE Level 7 */\n\t\tif(d[d.l] !== 0) current_cp = dbf_codepage_map[d[d.l]];\n\t\td.l+=1;\n\n\t\td.l+=2;\n\t}\n\tif(l7) d.l += 36; // Level 7: 32 byte \"Language driver name\", 4 byte reserved\n\n/*:: type DBFField = { name:string; len:number; type:string; } */\n\tvar fields/*:Array*/ = [], field/*:DBFField*/ = ({}/*:any*/);\n\tvar hend = Math.min(d.length, (ft == 0x02 ? 0x209 : (fpos - 10 - (vfp ? 264 : 0))));\n\tvar ww = l7 ? 32 : 11;\n\twhile(d.l < hend && d[d.l] != 0x0d) {\n\t\tfield = ({}/*:any*/);\n\t\tfield.name = $cptable.utils.decode(current_cp, d.slice(d.l, d.l+ww)).replace(/[\\u0000\\r\\n].*$/g,\"\");\n\t\td.l += ww;\n\t\tfield.type = String.fromCharCode(d.read_shift(1));\n\t\tif(ft != 0x02 && !l7) field.offset = d.read_shift(4);\n\t\tfield.len = d.read_shift(1);\n\t\tif(ft == 0x02) field.offset = d.read_shift(2);\n\t\tfield.dec = d.read_shift(1);\n\t\tif(field.name.length) fields.push(field);\n\t\tif(ft != 0x02) d.l += l7 ? 13 : 14;\n\t\tswitch(field.type) {\n\t\t\tcase 'B': // Double (VFP) / Binary (dBASE L7)\n\t\t\t\tif((!vfp || field.len != 8) && opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase 'G': // General (FoxPro and dBASE L7)\n\t\t\tcase 'P': // Picture (FoxPro and dBASE L7)\n\t\t\t\tif(opts.WTF) console.log('Skipping ' + field.name + ':' + field.type);\n\t\t\t\tbreak;\n\t\t\tcase '+': // Autoincrement (dBASE L7 only)\n\t\t\tcase '0': // _NullFlags (VFP only)\n\t\t\tcase '@': // Timestamp (dBASE L7 only)\n\t\t\tcase 'C': // Character (dBASE II)\n\t\t\tcase 'D': // Date (dBASE III)\n\t\t\tcase 'F': // Float (dBASE IV)\n\t\t\tcase 'I': // Long (VFP and dBASE L7)\n\t\t\tcase 'L': // Logical (dBASE II)\n\t\t\tcase 'M': // Memo (dBASE III)\n\t\t\tcase 'N': // Number (dBASE II)\n\t\t\tcase 'O': // Double (dBASE L7 only)\n\t\t\tcase 'T': // Datetime (VFP only)\n\t\t\tcase 'Y': // Currency (VFP only)\n\t\t\t\tbreak;\n\t\t\tdefault: throw new Error('Unknown Field Type: ' + field.type);\n\t\t}\n\t}\n\n\tif(d[d.l] !== 0x0D) d.l = fpos-1;\n\tif(d.read_shift(1) !== 0x0D) throw new Error(\"DBF Terminator not found \" + d.l + \" \" + d[d.l]);\n\td.l = fpos;\n\n\t/* data */\n\tvar R = 0, C = 0;\n\tout[0] = [];\n\tfor(C = 0; C != fields.length; ++C) out[0][C] = fields[C].name;\n\twhile(nrow-- > 0) {\n\t\tif(d[d.l] === 0x2A) {\n\t\t\t// TODO: record marked as deleted -- create a hidden row?\n\t\t\td.l+=rlen;\n\t\t\tcontinue;\n\t\t}\n\t\t++d.l;\n\t\tout[++R] = []; C = 0;\n\t\tfor(C = 0; C != fields.length; ++C) {\n\t\t\tvar dd = d.slice(d.l, d.l+fields[C].len); d.l+=fields[C].len;\n\t\t\tprep_blob(dd, 0);\n\t\t\tvar s = $cptable.utils.decode(current_cp, dd);\n\t\t\tswitch(fields[C].type) {\n\t\t\t\tcase 'C':\n\t\t\t\t\t// NOTE: it is conventional to write ' / / ' for empty dates\n\t\t\t\t\tif(s.trim().length) out[R][C] = s.replace(/\\s+$/,\"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'D':\n\t\t\t\t\tif(s.length === 8) out[R][C] = new Date(+s.slice(0,4), +s.slice(4,6)-1, +s.slice(6,8));\n\t\t\t\t\telse out[R][C] = s;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'F': out[R][C] = parseFloat(s.trim()); break;\n\t\t\t\tcase '+': case 'I': out[R][C] = l7 ? dd.read_shift(-4, 'i') ^ 0x80000000 : dd.read_shift(4, 'i'); break;\n\t\t\t\tcase 'L': switch(s.trim().toUpperCase()) {\n\t\t\t\t\tcase 'Y': case 'T': out[R][C] = true; break;\n\t\t\t\t\tcase 'N': case 'F': out[R][C] = false; break;\n\t\t\t\t\tcase '': case '?': break;\n\t\t\t\t\tdefault: throw new Error(\"DBF Unrecognized L:|\" + s + \"|\");\n\t\t\t\t\t} break;\n\t\t\t\tcase 'M': /* TODO: handle memo files */\n\t\t\t\t\tif(!memo) throw new Error(\"DBF Unexpected MEMO for type \" + ft.toString(16));\n\t\t\t\t\tout[R][C] = \"##MEMO##\" + (l7 ? parseInt(s.trim(), 10): dd.read_shift(4));\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'N':\n\t\t\t\t\ts = s.replace(/\\u0000/g,\"\").trim();\n\t\t\t\t\t// NOTE: dBASE II interprets \" . \" as 0\n\t\t\t\t\tif(s && s != \".\") out[R][C] = +s || 0; break;\n\t\t\t\tcase '@':\n\t\t\t\t\t// NOTE: dBASE specs appear to be incorrect\n\t\t\t\t\tout[R][C] = new Date(dd.read_shift(-8, 'f') - 0x388317533400);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'T': out[R][C] = new Date((dd.read_shift(4) - 0x253D8C) * 0x5265C00 + dd.read_shift(4)); break;\n\t\t\t\tcase 'Y': out[R][C] = dd.read_shift(4,'i')/1e4 + (dd.read_shift(4, 'i')/1e4)*Math.pow(2,32); break;\n\t\t\t\tcase 'O': out[R][C] = -dd.read_shift(-8, 'f'); break;\n\t\t\t\tcase 'B': if(vfp && fields[C].len == 8) { out[R][C] = dd.read_shift(8,'f'); break; }\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'G': case 'P': dd.l += fields[C].len; break;\n\t\t\t\tcase '0':\n\t\t\t\t\tif(fields[C].name === '_NullFlags') break;\n\t\t\t\t\t/* falls through */\n\t\t\t\tdefault: throw new Error(\"DBF Unsupported data type \" + fields[C].type);\n\t\t\t}\n\t\t}\n\t}\n\tif(ft != 0x02) if(d.l < d.length && d[d.l++] != 0x1A) throw new Error(\"DBF EOF Marker missing \" + (d.l-1) + \" of \" + d.length + \" \" + d[d.l-1].toString(16));\n\tif(opts && opts.sheetRows) out = out.slice(0, opts.sheetRows);\n\topts.DBF = fields;\n\treturn out;\n}\n\nfunction dbf_to_sheet(buf, opts)/*:Worksheet*/ {\n\tvar o = opts || {};\n\tif(!o.dateNF) o.dateNF = \"yyyymmdd\";\n\tvar ws = aoa_to_sheet(dbf_to_aoa(buf, o), o);\n\tws[\"!cols\"] = o.DBF.map(function(field) { return {\n\t\twch: field.len,\n\t\tDBF: field\n\t};});\n\tdelete o.DBF;\n\treturn ws;\n}\n\nfunction dbf_to_workbook(buf, opts)/*:Workbook*/ {\n\ttry { return sheet_to_workbook(dbf_to_sheet(buf, opts), opts); }\n\tcatch(e) { if(opts && opts.WTF) throw e; }\n\treturn ({SheetNames:[],Sheets:{}});\n}\n\nvar _RLEN = { 'B': 8, 'C': 250, 'L': 1, 'D': 8, '?': 0, '': 0 };\nfunction sheet_to_dbf(ws/*:Worksheet*/, opts/*:WriteOpts*/) {\n\tvar o = opts || {};\n\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\tif(o.type == \"string\") throw new Error(\"Cannot write DBF to JS string\");\n\tvar ba = buf_array();\n\tvar aoa/*:AOA*/ = sheet_to_json(ws, {header:1, raw:true, cellDates:true});\n\tvar headers = aoa[0], data = aoa.slice(1), cols = ws[\"!cols\"] || [];\n\tvar i = 0, j = 0, hcnt = 0, rlen = 1;\n\tfor(i = 0; i < headers.length; ++i) {\n\t\tif(((cols[i]||{}).DBF||{}).name) { headers[i] = cols[i].DBF.name; ++hcnt; continue; }\n\t\tif(headers[i] == null) continue;\n\t\t++hcnt;\n\t\tif(typeof headers[i] === 'number') headers[i] = headers[i].toString(10);\n\t\tif(typeof headers[i] !== 'string') throw new Error(\"DBF Invalid column name \" + headers[i] + \" |\" + (typeof headers[i]) + \"|\");\n\t\tif(headers.indexOf(headers[i]) !== i) for(j=0; j<1024;++j)\n\t\t\tif(headers.indexOf(headers[i] + \"_\" + j) == -1) { headers[i] += \"_\" + j; break; }\n\t}\n\tvar range = safe_decode_range(ws['!ref']);\n\tvar coltypes/*:Array*/ = [];\n\tvar colwidths/*:Array*/ = [];\n\tvar coldecimals/*:Array*/ = [];\n\tfor(i = 0; i <= range.e.c - range.s.c; ++i) {\n\t\tvar guess = '', _guess = '', maxlen = 0;\n\t\tvar col/*:Array*/ = [];\n\t\tfor(j=0; j < data.length; ++j) {\n\t\t\tif(data[j][i] != null) col.push(data[j][i]);\n\t\t}\n\t\tif(col.length == 0 || headers[i] == null) { coltypes[i] = '?'; continue; }\n\t\tfor(j = 0; j < col.length; ++j) {\n\t\t\tswitch(typeof col[j]) {\n\t\t\t\t/* TODO: check if L2 compat is desired */\n\t\t\t\tcase 'number': _guess = 'B'; break;\n\t\t\t\tcase 'string': _guess = 'C'; break;\n\t\t\t\tcase 'boolean': _guess = 'L'; break;\n\t\t\t\tcase 'object': _guess = col[j] instanceof Date ? 'D' : 'C'; break;\n\t\t\t\tdefault: _guess = 'C';\n\t\t\t}\n\t\t\tmaxlen = Math.max(maxlen, String(col[j]).length);\n\t\t\tguess = guess && guess != _guess ? 'C' : _guess;\n\t\t\t//if(guess == 'C') break;\n\t\t}\n\t\tif(maxlen > 250) maxlen = 250;\n\t\t_guess = ((cols[i]||{}).DBF||{}).type;\n\t\t/* TODO: more fine grained control over DBF type resolution */\n\t\tif(_guess == 'C') {\n\t\t\tif(cols[i].DBF.len > maxlen) maxlen = cols[i].DBF.len;\n\t\t}\n\t\tif(guess == 'B' && _guess == 'N') {\n\t\t\tguess = 'N';\n\t\t\tcoldecimals[i] = cols[i].DBF.dec;\n\t\t\tmaxlen = cols[i].DBF.len;\n\t\t}\n\t\tcolwidths[i] = guess == 'C' || _guess == 'N' ? maxlen : (_RLEN[guess] || 0);\n\t\trlen += colwidths[i];\n\t\tcoltypes[i] = guess;\n\t}\n\n\tvar h = ba.next(32);\n\th.write_shift(4, 0x13021130);\n\th.write_shift(4, data.length);\n\th.write_shift(2, 296 + 32 * hcnt);\n\th.write_shift(2, rlen);\n\tfor(i=0; i < 4; ++i) h.write_shift(4, 0);\n\th.write_shift(4, 0x00000000 | ((+dbf_reverse_map[/*::String(*/current_ansi/*::)*/] || 0x03)<<8));\n\n\tfor(i = 0, j = 0; i < headers.length; ++i) {\n\t\tif(headers[i] == null) continue;\n\t\tvar hf = ba.next(32);\n\t\tvar _f = (headers[i].slice(-10) + \"\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\\x00\").slice(0, 11);\n\t\thf.write_shift(1, _f, \"sbcs\");\n\t\thf.write_shift(1, coltypes[i] == '?' ? 'C' : coltypes[i], \"sbcs\");\n\t\thf.write_shift(4, j);\n\t\thf.write_shift(1, colwidths[i] || _RLEN[coltypes[i]] || 0);\n\t\thf.write_shift(1, coldecimals[i] || 0);\n\t\thf.write_shift(1, 0x02);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(1, 0);\n\t\thf.write_shift(4, 0);\n\t\thf.write_shift(4, 0);\n\t\tj += (colwidths[i] || _RLEN[coltypes[i]] || 0);\n\t}\n\n\tvar hb = ba.next(264);\n\thb.write_shift(4, 0x0000000D);\n\tfor(i=0; i < 65;++i) hb.write_shift(4, 0x00000000);\n\tfor(i=0; i < data.length; ++i) {\n\t\tvar rout = ba.next(rlen);\n\t\trout.write_shift(1, 0);\n\t\tfor(j=0; j\":190, \"?\":191, \"{\":223\n\t}/*:any*/);\n\tvar sylk_char_regex = new RegExp(\"\\u001BN(\" + keys(sylk_escapes).join(\"|\").replace(/\\|\\|\\|/, \"|\\\\||\").replace(/([?()+])/g,\"\\\\$1\") + \"|\\\\|)\", \"gm\");\n\tvar sylk_char_fn = function(_, $1){ var o = sylk_escapes[$1]; return typeof o == \"number\" ? _getansi(o) : o; };\n\tvar decode_sylk_char = function($$, $1, $2) { var newcc = (($1.charCodeAt(0) - 0x20)<<4) | ($2.charCodeAt(0) - 0x30); return newcc == 59 ? $$ : _getansi(newcc); };\n\tsylk_escapes[\"|\"] = 254;\n\t/* TODO: find an actual specification */\n\tfunction sylk_to_aoa(d/*:RawData*/, opts)/*:[AOA, Worksheet]*/ {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return sylk_to_aoa_str(Base64_decode(d), opts);\n\t\t\tcase 'binary': return sylk_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return sylk_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return sylk_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction sylk_to_aoa_str(str/*:string*/, opts)/*:[AOA, Worksheet]*/ {\n\t\tvar records = str.split(/[\\n\\r]+/), R = -1, C = -1, ri = 0, rj = 0, arr/*:AOA*/ = [];\n\t\tvar formats/*:Array*/ = [];\n\t\tvar next_cell_format/*:string|null*/ = null;\n\t\tvar sht = {}, rowinfo/*:Array*/ = [], colinfo/*:Array*/ = [], cw/*:Array*/ = [];\n\t\tvar Mval = 0, j;\n\t\tif(+opts.codepage >= 0) set_cp(+opts.codepage);\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tMval = 0;\n\t\t\tvar rstr=records[ri].trim().replace(/\\x1B([\\x20-\\x2F])([\\x30-\\x3F])/g, decode_sylk_char).replace(sylk_char_regex, sylk_char_fn);\n\t\t\tvar record=rstr.replace(/;;/g, \"\\u0000\").split(\";\").map(function(x) { return x.replace(/\\u0000/g, \";\"); });\n\t\t\tvar RT=record[0], val;\n\t\t\tif(rstr.length > 0) switch(RT) {\n\t\t\tcase 'ID': break; /* header */\n\t\t\tcase 'E': break; /* EOF */\n\t\t\tcase 'B': break; /* dimensions */\n\t\t\tcase 'O': break; /* options? */\n\t\t\tcase 'W': break; /* window? */\n\t\t\tcase 'P':\n\t\t\t\tif(record[1].charAt(0) == 'P')\n\t\t\t\t\tformats.push(rstr.slice(3).replace(/;;/g, \";\"));\n\t\t\t\tbreak;\n\t\t\tcase 'C':\n\t\t\tvar C_seen_K = false, C_seen_X = false, C_seen_S = false, C_seen_E = false, _R = -1, _C = -1;\n\t\t\tfor(rj=1; rj -1 && arr[_R][_C];\n\t\t\t\tif(!shrbase || !shrbase[1]) throw new Error(\"SYLK shared formula cannot find base\");\n\t\t\t\tarr[R][C][1] = shift_formula_str(shrbase[1], {r: R - _R, c: C - _C});\n\t\t\t}\n\t\t\tbreak;\n\t\t\tcase 'F':\n\t\t\tvar F_seen = 0;\n\t\t\tfor(rj=1; rj 0) { rowinfo[R].hpt = Mval; rowinfo[R].hpx = pt2px(Mval); }\n\t\t\t\t\telse if(Mval === 0) rowinfo[R].hidden = true;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t\tif(F_seen < 1) next_cell_format = null; break;\n\t\t\tdefault: if(opts && opts.WTF) throw new Error(\"SYLK bad record \" + rstr);\n\t\t\t}\n\t\t}\n\t\tif(rowinfo.length > 0) sht['!rows'] = rowinfo;\n\t\tif(colinfo.length > 0) sht['!cols'] = colinfo;\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn [arr, sht];\n\t}\n\n\tfunction sylk_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ {\n\t\tvar aoasht = sylk_to_aoa(d, opts);\n\t\tvar aoa = aoasht[0], ws = aoasht[1];\n\t\tvar o = aoa_to_sheet(aoa, opts);\n\t\tkeys(ws).forEach(function(k) { o[k] = ws[k]; });\n\t\treturn o;\n\t}\n\n\tfunction sylk_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(sylk_to_sheet(d, opts), opts); }\n\n\tfunction write_ws_cell_sylk(cell/*:Cell*/, ws/*:Worksheet*/, R/*:number*/, C/*:number*//*::, opts*/)/*:string*/ {\n\t\tvar o = \"C;Y\" + (R+1) + \";X\" + (C+1) + \";K\";\n\t\tswitch(cell.t) {\n\t\t\tcase 'n':\n\t\t\t\to += (cell.v||0);\n\t\t\t\tif(cell.f && !cell.F) o += \";E\" + a1_to_rc(cell.f, {r:R, c:C}); break;\n\t\t\tcase 'b': o += cell.v ? \"TRUE\" : \"FALSE\"; break;\n\t\t\tcase 'e': o += cell.w || cell.v; break;\n\t\t\tcase 'd': o += '\"' + (cell.w || cell.v) + '\"'; break;\n\t\t\tcase 's': o += '\"' + cell.v.replace(/\"/g,\"\").replace(/;/g, \";;\") + '\"'; break;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction write_ws_cols_sylk(out, cols) {\n\t\tcols.forEach(function(col, i) {\n\t\t\tvar rec = \"F;W\" + (i+1) + \" \" + (i+1) + \" \";\n\t\t\tif(col.hidden) rec += \"0\";\n\t\t\telse {\n\t\t\t\tif(typeof col.width == 'number' && !col.wpx) col.wpx = width2px(col.width);\n\t\t\t\tif(typeof col.wpx == 'number' && !col.wch) col.wch = px2char(col.wpx);\n\t\t\t\tif(typeof col.wch == 'number') rec += Math.round(col.wch);\n\t\t\t}\n\t\t\tif(rec.charAt(rec.length - 1) != \" \") out.push(rec);\n\t\t});\n\t}\n\n\tfunction write_ws_rows_sylk(out/*:Array*/, rows/*:Array*/) {\n\t\trows.forEach(function(row, i) {\n\t\t\tvar rec = \"F;\";\n\t\t\tif(row.hidden) rec += \"M0;\";\n\t\t\telse if(row.hpt) rec += \"M\" + 20 * row.hpt + \";\";\n\t\t\telse if(row.hpx) rec += \"M\" + 20 * px2pt(row.hpx) + \";\";\n\t\t\tif(rec.length > 2) out.push(rec + \"R\" + (i+1));\n\t\t});\n\t}\n\n\tfunction sheet_to_sylk(ws/*:Worksheet*/, opts/*:?any*/)/*:string*/ {\n\t\tvar preamble/*:Array*/ = [\"ID;PWXL;N;E\"], o/*:Array*/ = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell/*:Cell*/;\n\t\tvar dense = Array.isArray(ws);\n\t\tvar RS = \"\\r\\n\";\n\n\t\tpreamble.push(\"P;PGeneral\");\n\t\tpreamble.push(\"F;P0;DG0G8;M255\");\n\t\tif(ws['!cols']) write_ws_cols_sylk(preamble, ws['!cols']);\n\t\tif(ws['!rows']) write_ws_rows_sylk(preamble, ws['!rows']);\n\n\t\tpreamble.push(\"B;Y\" + (r.e.r - r.s.r + 1) + \";X\" + (r.e.c - r.s.c + 1) + \";D\" + [r.s.c,r.s.r,r.e.c,r.e.r].join(\" \"));\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || (cell.v == null && (!cell.f || cell.F))) continue;\n\t\t\t\to.push(write_ws_cell_sylk(cell, ws, R, C, opts));\n\t\t\t}\n\t\t}\n\t\treturn preamble.join(RS) + RS + o.join(RS) + RS + \"E\" + RS;\n\t}\n\n\treturn {\n\t\tto_workbook: sylk_to_workbook,\n\t\tto_sheet: sylk_to_sheet,\n\t\tfrom_sheet: sheet_to_sylk\n\t};\n})();\n\nvar DIF = /*#__PURE__*/(function() {\n\tfunction dif_to_aoa(d/*:RawData*/, opts)/*:AOA*/ {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return dif_to_aoa_str(Base64_decode(d), opts);\n\t\t\tcase 'binary': return dif_to_aoa_str(d, opts);\n\t\t\tcase 'buffer': return dif_to_aoa_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return dif_to_aoa_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\tfunction dif_to_aoa_str(str/*:string*/, opts)/*:AOA*/ {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tif (records[ri].trim() === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\tif (R < 0) continue;\n\t\t\tvar metadata = records[ri].trim().split(\",\");\n\t\t\tvar type = metadata[0], value = metadata[1];\n\t\t\t++ri;\n\t\t\tvar data = records[ri] || \"\";\n\t\t\twhile(((data.match(/[\"]/g)||[]).length & 1) && ri < records.length - 1) data += \"\\n\" + records[++ri];\n\t\t\tdata = data.trim();\n\t\t\tswitch (+type) {\n\t\t\t\tcase -1:\n\t\t\t\t\tif (data === 'BOT') { arr[++R] = []; C = 0; continue; }\n\t\t\t\t\telse if (data !== 'EOD') throw new Error(\"Unrecognized DIF special command \" + data);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tif(data === 'TRUE') arr[R][C] = true;\n\t\t\t\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\t\t\t\telse if(!isNaN(fuzzynum(value))) arr[R][C] = fuzzynum(value);\n\t\t\t\t\telse if(!isNaN(fuzzydate(value).getDate())) arr[R][C] = parseDate(value);\n\t\t\t\t\telse arr[R][C] = value;\n\t\t\t\t\t++C; break;\n\t\t\t\tcase 1:\n\t\t\t\t\tdata = data.slice(1,data.length-1);\n\t\t\t\t\tdata = data.replace(/\"\"/g, '\"');\n\t\t\t\t\tif(DIF_XL && data && data.match(/^=\".*\"$/)) data = data.slice(2, -1);\n\t\t\t\t\tarr[R][C++] = data !== '' ? data : null;\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (data === 'EOD') break;\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction dif_to_sheet(str/*:string*/, opts)/*:Worksheet*/ { return aoa_to_sheet(dif_to_aoa(str, opts), opts); }\n\tfunction dif_to_workbook(str/*:string*/, opts)/*:Workbook*/ { return sheet_to_workbook(dif_to_sheet(str, opts), opts); }\n\n\tvar sheet_to_dif = /*#__PURE__*/(function() {\n\t\tvar push_field = function pf(o/*:Array*/, topic/*:string*/, v/*:number*/, n/*:number*/, s/*:string*/) {\n\t\t\to.push(topic);\n\t\t\to.push(v + \",\" + n);\n\t\t\to.push('\"' + s.replace(/\"/g,'\"\"') + '\"');\n\t\t};\n\t\tvar push_value = function po(o/*:Array*/, type/*:number*/, v/*:any*/, s/*:string*/) {\n\t\t\to.push(type + \",\" + v);\n\t\t\to.push(type == 1 ? '\"' + s.replace(/\"/g,'\"\"') + '\"' : s);\n\t\t};\n\t\treturn function sheet_to_dif(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {\n\t\t\tvar o/*:Array*/ = [];\n\t\t\tvar r = safe_decode_range(ws['!ref']), cell/*:Cell*/;\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tpush_field(o, \"TABLE\", 0, 1, \"sheetjs\");\n\t\t\tpush_field(o, \"VECTORS\", 0, r.e.r - r.s.r + 1,\"\");\n\t\t\tpush_field(o, \"TUPLES\", 0, r.e.c - r.s.c + 1,\"\");\n\t\t\tpush_field(o, \"DATA\", 0, 0,\"\");\n\t\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\t\tpush_value(o, -1, 0, \"BOT\");\n\t\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\t\tif(!cell) { push_value(o, 1, 0, \"\"); continue;}\n\t\t\t\t\tswitch(cell.t) {\n\t\t\t\t\t\tcase 'n':\n\t\t\t\t\t\t\tvar val = DIF_XL ? cell.w : cell.v;\n\t\t\t\t\t\t\tif(!val && cell.v != null) val = cell.v;\n\t\t\t\t\t\t\tif(val == null) {\n\t\t\t\t\t\t\t\tif(DIF_XL && cell.f && !cell.F) push_value(o, 1, 0, \"=\" + cell.f);\n\t\t\t\t\t\t\t\telse push_value(o, 1, 0, \"\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\telse push_value(o, 0, val, \"V\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'b':\n\t\t\t\t\t\t\tpush_value(o, 0, cell.v ? 1 : 0, cell.v ? \"TRUE\" : \"FALSE\");\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 's':\n\t\t\t\t\t\t\tpush_value(o, 1, 0, (!DIF_XL || isNaN(cell.v)) ? cell.v : '=\"' + cell.v + '\"');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'd':\n\t\t\t\t\t\t\tif(!cell.w) cell.w = SSF_format(cell.z || table_fmt[14], datenum(parseDate(cell.v)));\n\t\t\t\t\t\t\tif(DIF_XL) push_value(o, 0, cell.w, \"V\");\n\t\t\t\t\t\t\telse push_value(o, 1, 0, cell.w);\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault: push_value(o, 1, 0, \"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tpush_value(o, -1, 0, \"EOD\");\n\t\t\tvar RS = \"\\r\\n\";\n\t\t\tvar oo = o.join(RS);\n\t\t\t//while((oo.length & 0x7F) != 0) oo += \"\\0\";\n\t\t\treturn oo;\n\t\t};\n\t})();\n\treturn {\n\t\tto_workbook: dif_to_workbook,\n\t\tto_sheet: dif_to_sheet,\n\t\tfrom_sheet: sheet_to_dif\n\t};\n})();\n\nvar ETH = /*#__PURE__*/(function() {\n\tfunction decode(s/*:string*/)/*:string*/ { return s.replace(/\\\\b/g,\"\\\\\").replace(/\\\\c/g,\":\").replace(/\\\\n/g,\"\\n\"); }\n\tfunction encode(s/*:string*/)/*:string*/ { return s.replace(/\\\\/g, \"\\\\b\").replace(/:/g, \"\\\\c\").replace(/\\n/g,\"\\\\n\"); }\n\n\tfunction eth_to_aoa(str/*:string*/, opts)/*:AOA*/ {\n\t\tvar records = str.split('\\n'), R = -1, C = -1, ri = 0, arr/*:AOA*/ = [];\n\t\tfor (; ri !== records.length; ++ri) {\n\t\t\tvar record = records[ri].trim().split(\":\");\n\t\t\tif(record[0] !== 'cell') continue;\n\t\t\tvar addr = decode_cell(record[1]);\n\t\t\tif(arr.length <= addr.r) for(R = arr.length; R <= addr.r; ++R) if(!arr[R]) arr[R] = [];\n\t\t\tR = addr.r; C = addr.c;\n\t\t\tswitch(record[2]) {\n\t\t\t\tcase 't': arr[R][C] = decode(record[3]); break;\n\t\t\t\tcase 'v': arr[R][C] = +record[3]; break;\n\t\t\t\tcase 'vtf': var _f = record[record.length - 1];\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 'vtc':\n\t\t\t\t\tswitch(record[3]) {\n\t\t\t\t\t\tcase 'nl': arr[R][C] = +record[4] ? true : false; break;\n\t\t\t\t\t\tdefault: arr[R][C] = +record[4]; break;\n\t\t\t\t\t}\n\t\t\t\t\tif(record[2] == 'vtf') arr[R][C] = [arr[R][C], _f];\n\t\t\t}\n\t\t}\n\t\tif(opts && opts.sheetRows) arr = arr.slice(0, opts.sheetRows);\n\t\treturn arr;\n\t}\n\n\tfunction eth_to_sheet(d/*:string*/, opts)/*:Worksheet*/ { return aoa_to_sheet(eth_to_aoa(d, opts), opts); }\n\tfunction eth_to_workbook(d/*:string*/, opts)/*:Workbook*/ { return sheet_to_workbook(eth_to_sheet(d, opts), opts); }\n\n\tvar header = [\n\t\t\"socialcalc:version:1.5\",\n\t\t\"MIME-Version: 1.0\",\n\t\t\"Content-Type: multipart/mixed; boundary=SocialCalcSpreadsheetControlSave\"\n\t].join(\"\\n\");\n\n\tvar sep = [\n\t\t\"--SocialCalcSpreadsheetControlSave\",\n\t\t\"Content-type: text/plain; charset=UTF-8\"\n\t].join(\"\\n\") + \"\\n\";\n\n\t/* TODO: the other parts */\n\tvar meta = [\n\t\t\"# SocialCalc Spreadsheet Control Save\",\n\t\t\"part:sheet\"\n\t].join(\"\\n\");\n\n\tvar end = \"--SocialCalcSpreadsheetControlSave--\";\n\n\tfunction sheet_to_eth_data(ws/*:Worksheet*/)/*:string*/ {\n\t\tif(!ws || !ws['!ref']) return \"\";\n\t\tvar o/*:Array*/ = [], oo/*:Array*/ = [], cell, coord = \"\";\n\t\tvar r = decode_range(ws['!ref']);\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tcoord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null || cell.t === 'z') continue;\n\t\t\t\too = [\"cell\", coord, 't'];\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 's': case 'str': oo.push(encode(cell.v)); break;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\tif(!cell.f) { oo[2]='v'; oo[3]=cell.v; }\n\t\t\t\t\t\telse { oo[2]='vtf'; oo[3]='n'; oo[4]=cell.v; oo[5]=encode(cell.f); }\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\too[2] = 'vt'+(cell.f?'f':'c'); oo[3]='nl'; oo[4]=cell.v?\"1\":\"0\";\n\t\t\t\t\t\too[5] = encode(cell.f||(cell.v?'TRUE':'FALSE'));\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\tvar t = datenum(parseDate(cell.v));\n\t\t\t\t\t\too[2] = 'vtc'; oo[3] = 'nd'; oo[4] = \"\"+t;\n\t\t\t\t\t\too[5] = cell.w || SSF_format(cell.z || table_fmt[14], t);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'e': continue;\n\t\t\t\t}\n\t\t\t\to.push(oo.join(\":\"));\n\t\t\t}\n\t\t}\n\t\to.push(\"sheet:c:\" + (r.e.c-r.s.c+1) + \":r:\" + (r.e.r-r.s.r+1) + \":tvf:1\");\n\t\to.push(\"valueformat:1:text-wiki\");\n\t\t//o.push(\"copiedfrom:\" + ws['!ref']); // clipboard only\n\t\treturn o.join(\"\\n\");\n\t}\n\n\tfunction sheet_to_eth(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {\n\t\treturn [header, sep, meta, sep, sheet_to_eth_data(ws), end].join(\"\\n\");\n\t\t// return [\"version:1.5\", sheet_to_eth_data(ws)].join(\"\\n\"); // clipboard form\n\t}\n\n\treturn {\n\t\tto_workbook: eth_to_workbook,\n\t\tto_sheet: eth_to_sheet,\n\t\tfrom_sheet: sheet_to_eth\n\t};\n})();\n\nvar PRN = /*#__PURE__*/(function() {\n\tfunction set_text_arr(data/*:string*/, arr/*:AOA*/, R/*:number*/, C/*:number*/, o/*:any*/) {\n\t\tif(o.raw) arr[R][C] = data;\n\t\telse if(data === \"\"){/* empty */}\n\t\telse if(data === 'TRUE') arr[R][C] = true;\n\t\telse if(data === 'FALSE') arr[R][C] = false;\n\t\telse if(!isNaN(fuzzynum(data))) arr[R][C] = fuzzynum(data);\n\t\telse if(!isNaN(fuzzydate(data).getDate())) arr[R][C] = parseDate(data);\n\t\telse arr[R][C] = data;\n\t}\n\n\tfunction prn_to_aoa_str(f/*:string*/, opts)/*:AOA*/ {\n\t\tvar o = opts || {};\n\t\tvar arr/*:AOA*/ = ([]/*:any*/);\n\t\tif(!f || f.length === 0) return arr;\n\t\tvar lines = f.split(/[\\r\\n]/);\n\t\tvar L = lines.length - 1;\n\t\twhile(L >= 0 && lines[L].length === 0) --L;\n\t\tvar start = 10, idx = 0;\n\t\tvar R = 0;\n\t\tfor(; R <= L; ++R) {\n\t\t\tidx = lines[R].indexOf(\" \");\n\t\t\tif(idx == -1) idx = lines[R].length; else idx++;\n\t\t\tstart = Math.max(start, idx);\n\t\t}\n\t\tfor(R = 0; R <= L; ++R) {\n\t\t\tarr[R] = [];\n\t\t\t/* TODO: confirm that widths are always 10 */\n\t\t\tvar C = 0;\n\t\t\tset_text_arr(lines[R].slice(0, start).trim(), arr, R, C, o);\n\t\t\tfor(C = 1; C <= (lines[R].length - start)/10 + 1; ++C)\n\t\t\t\tset_text_arr(lines[R].slice(start+(C-1)*10,start+C*10).trim(),arr,R,C,o);\n\t\t}\n\t\tif(o.sheetRows) arr = arr.slice(0, o.sheetRows);\n\t\treturn arr;\n\t}\n\n\t// List of accepted CSV separators\n\tvar guess_seps = {\n\t\t/*::[*/0x2C/*::]*/: ',',\n\t\t/*::[*/0x09/*::]*/: \"\\t\",\n\t\t/*::[*/0x3B/*::]*/: ';',\n\t\t/*::[*/0x7C/*::]*/: '|'\n\t};\n\n\t// CSV separator weights to be used in case of equal numbers\n\tvar guess_sep_weights = {\n\t\t/*::[*/0x2C/*::]*/: 3,\n\t\t/*::[*/0x09/*::]*/: 2,\n\t\t/*::[*/0x3B/*::]*/: 1,\n\t\t/*::[*/0x7C/*::]*/: 0\n\t};\n\n\tfunction guess_sep(str) {\n\t\tvar cnt = {}, instr = false, end = 0, cc = 0;\n\t\tfor(;end < str.length;++end) {\n\t\t\tif((cc=str.charCodeAt(end)) == 0x22) instr = !instr;\n\t\t\telse if(!instr && cc in guess_seps) cnt[cc] = (cnt[cc]||0)+1;\n\t\t}\n\n\t\tcc = [];\n\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\tcc.push([ cnt[end], end ]);\n\t\t}\n\n\t\tif ( !cc.length ) {\n\t\t\tcnt = guess_sep_weights;\n\t\t\tfor(end in cnt) if ( Object.prototype.hasOwnProperty.call(cnt, end) ) {\n\t\t\t\tcc.push([ cnt[end], end ]);\n\t\t\t}\n\t\t}\n\n\t\tcc.sort(function(a, b) { return a[0] - b[0] || guess_sep_weights[a[1]] - guess_sep_weights[b[1]]; });\n\n\t\treturn guess_seps[cc.pop()[1]] || 0x2C;\n\t}\n\n\tfunction dsv_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {\n\t\tvar o = opts || {};\n\t\tvar sep = \"\";\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/);\n\t\tvar range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:0}}/*:any*/);\n\n\t\tif(str.slice(0,4) == \"sep=\") {\n\t\t\t// If the line ends in \\r\\n\n\t\t\tif(str.charCodeAt(5) == 13 && str.charCodeAt(6) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(7);\n\t\t\t}\n\t\t\t// If line ends in \\r OR \\n\n\t\t\telse if(str.charCodeAt(5) == 13 || str.charCodeAt(5) == 10 ) {\n\t\t\t\tsep = str.charAt(4); str = str.slice(6);\n\t\t\t}\n\t\t\telse sep = guess_sep(str.slice(0,1024));\n\t\t}\n\t\telse if(o && o.FS) sep = o.FS;\n\t\telse sep = guess_sep(str.slice(0,1024));\n\t\tvar R = 0, C = 0, v = 0;\n\t\tvar start = 0, end = 0, sepcc = sep.charCodeAt(0), instr = false, cc=0, startcc=str.charCodeAt(0);\n\t\tstr = str.replace(/\\r\\n/mg, \"\\n\");\n\t\tvar _re/*:?RegExp*/ = o.dateNF != null ? dateNF_regex(o.dateNF) : null;\n\t\tfunction finish_cell() {\n\t\t\tvar s = str.slice(start, end);\n\t\t\tvar cell = ({}/*:any*/);\n\t\t\tif(s.charAt(0) == '\"' && s.charAt(s.length - 1) == '\"') s = s.slice(1,-1).replace(/\"\"/g,'\"');\n\t\t\tif(s.length === 0) cell.t = 'z';\n\t\t\telse if(o.raw) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.trim().length === 0) { cell.t = 's'; cell.v = s; }\n\t\t\telse if(s.charCodeAt(0) == 0x3D) {\n\t\t\t\tif(s.charCodeAt(1) == 0x22 && s.charCodeAt(s.length - 1) == 0x22) { cell.t = 's'; cell.v = s.slice(2,-1).replace(/\"\"/g,'\"'); }\n\t\t\t\telse if(fuzzyfmla(s)) { cell.t = 'n'; cell.f = s.slice(1); }\n\t\t\t\telse { cell.t = 's'; cell.v = s; } }\n\t\t\telse if(s == \"TRUE\") { cell.t = 'b'; cell.v = true; }\n\t\t\telse if(s == \"FALSE\") { cell.t = 'b'; cell.v = false; }\n\t\t\telse if(!isNaN(v = fuzzynum(s))) { cell.t = 'n'; if(o.cellText !== false) cell.w = s; cell.v = v; }\n\t\t\telse if(!isNaN(fuzzydate(s).getDate()) || _re && s.match(_re)) {\n\t\t\t\tcell.z = o.dateNF || table_fmt[14];\n\t\t\t\tvar k = 0;\n\t\t\t\tif(_re && s.match(_re)){ s=dateNF_fix(s, o.dateNF, (s.match(_re)||[])); k=1; }\n\t\t\t\tif(o.cellDates) { cell.t = 'd'; cell.v = parseDate(s, k); }\n\t\t\t\telse { cell.t = 'n'; cell.v = datenum(parseDate(s, k)); }\n\t\t\t\tif(o.cellText !== false) cell.w = SSF_format(cell.z, cell.v instanceof Date ? datenum(cell.v):cell.v);\n\t\t\t\tif(!o.cellNF) delete cell.z;\n\t\t\t} else {\n\t\t\t\tcell.t = 's';\n\t\t\t\tcell.v = s;\n\t\t\t}\n\t\t\tif(cell.t == 'z'){}\n\t\t\telse if(o.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = cell; }\n\t\t\telse ws[encode_cell({c:C,r:R})] = cell;\n\t\t\tstart = end+1; startcc = str.charCodeAt(start);\n\t\t\tif(range.e.c < C) range.e.c = C;\n\t\t\tif(range.e.r < R) range.e.r = R;\n\t\t\tif(cc == sepcc) ++C; else { C = 0; ++R; if(o.sheetRows && o.sheetRows <= R) return true; }\n\t\t}\n\t\touter: for(;end < str.length;++end) switch((cc=str.charCodeAt(end))) {\n\t\t\tcase 0x22: if(startcc === 0x22) instr = !instr; break;\n\t\t\tcase sepcc: case 0x0a: case 0x0d: if(!instr && finish_cell()) break outer; break;\n\t\t\tdefault: break;\n\t\t}\n\t\tif(end - start > 0) finish_cell();\n\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction prn_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {\n\t\tif(!(opts && opts.PRN)) return dsv_to_sheet_str(str, opts);\n\t\tif(opts.FS) return dsv_to_sheet_str(str, opts);\n\t\tif(str.slice(0,4) == \"sep=\") return dsv_to_sheet_str(str, opts);\n\t\tif(str.indexOf(\"\\t\") >= 0 || str.indexOf(\",\") >= 0 || str.indexOf(\";\") >= 0) return dsv_to_sheet_str(str, opts);\n\t\treturn aoa_to_sheet(prn_to_aoa_str(str, opts), opts);\n\t}\n\n\tfunction prn_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ {\n\t\tvar str = \"\", bytes = opts.type == 'string' ? [0,0,0,0] : firstbyte(d, opts);\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': str = Base64_decode(d); break;\n\t\t\tcase 'binary': str = d; break;\n\t\t\tcase 'buffer':\n\t\t\t\tif(opts.codepage == 65001) str = d.toString('utf8'); // TODO: test if buf\n\t\t\t\telse if(opts.codepage && typeof $cptable !== 'undefined') str = $cptable.utils.decode(opts.codepage, d);\n\t\t\t\telse str = has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d);\n\t\t\t\tbreak;\n\t\t\tcase 'array': str = cc2str(d); break;\n\t\t\tcase 'string': str = d; break;\n\t\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t\t}\n\t\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str.slice(3));\n\t\telse if(opts.type != 'string' && opts.type != 'buffer' && opts.codepage == 65001) str = utf8read(str);\n\t\telse if((opts.type == 'binary') && typeof $cptable !== 'undefined' && opts.codepage) str = $cptable.utils.decode(opts.codepage, $cptable.utils.encode(28591,str));\n\t\tif(str.slice(0,19) == \"socialcalc:version:\") return ETH.to_sheet(opts.type == 'string' ? str : utf8read(str), opts);\n\t\treturn prn_to_sheet_str(str, opts);\n\t}\n\n\tfunction prn_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(prn_to_sheet(d, opts), opts); }\n\n\tfunction sheet_to_prn(ws/*:Worksheet*//*::, opts:?any*/)/*:string*/ {\n\t\tvar o/*:Array*/ = [];\n\t\tvar r = safe_decode_range(ws['!ref']), cell/*:Cell*/;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\tvar oo/*:Array*/ = [];\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C] : ws[coord];\n\t\t\t\tif(!cell || cell.v == null) { oo.push(\" \"); continue; }\n\t\t\t\tvar w = (cell.w || (format_cell(cell), cell.w) || \"\").slice(0,10);\n\t\t\t\twhile(w.length < 10) w += \" \";\n\t\t\t\too.push(w + (C === 0 ? \" \" : \"\"));\n\t\t\t}\n\t\t\to.push(oo.join(\"\"));\n\t\t}\n\t\treturn o.join(\"\\n\");\n\t}\n\n\treturn {\n\t\tto_workbook: prn_to_workbook,\n\t\tto_sheet: prn_to_sheet,\n\t\tfrom_sheet: sheet_to_prn\n\t};\n})();\n\n/* Excel defaults to SYLK but warns if data is not valid */\nfunction read_wb_ID(d, opts) {\n\tvar o = opts || {}, OLD_WTF = !!o.WTF; o.WTF = true;\n\ttry {\n\t\tvar out = SYLK.to_workbook(d, o);\n\t\to.WTF = OLD_WTF;\n\t\treturn out;\n\t} catch(e) {\n\t\to.WTF = OLD_WTF;\n\t\tif(!e.message.match(/SYLK bad record ID/) && OLD_WTF) throw e;\n\t\treturn PRN.to_workbook(d, opts);\n\t}\n}\n\nvar WK_ = /*#__PURE__*/(function() {\n\tfunction lotushopper(data, cb/*:RecordHopperCB*/, opts/*:any*/) {\n\t\tif(!data) return;\n\t\tprep_blob(data, data.l || 0);\n\t\tvar Enum = opts.Enum || WK1Enum;\n\t\twhile(data.l < data.length) {\n\t\t\tvar RT = data.read_shift(2);\n\t\t\tvar R = Enum[RT] || Enum[0xFFFF];\n\t\t\tvar length = data.read_shift(2);\n\t\t\tvar tgt = data.l + length;\n\t\t\tvar d = R.f && R.f(data, length, opts);\n\t\t\tdata.l = tgt;\n\t\t\tif(cb(d, R, RT)) return;\n\t\t}\n\t}\n\n\tfunction lotus_to_workbook(d/*:RawData*/, opts) {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return lotus_to_workbook_buf(s2a(Base64_decode(d)), opts);\n\t\t\tcase 'binary': return lotus_to_workbook_buf(s2a(d), opts);\n\t\t\tcase 'buffer':\n\t\t\tcase 'array': return lotus_to_workbook_buf(d, opts);\n\t\t}\n\t\tthrow \"Unsupported type \" + opts.type;\n\t}\n\n\tfunction lotus_to_workbook_buf(d, opts)/*:Workbook*/ {\n\t\tif(!d) return d;\n\t\tvar o = opts || {};\n\t\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\t\tvar s/*:Worksheet*/ = ((o.dense ? [] : {})/*:any*/), n = \"Sheet1\", next_n = \"\", sidx = 0;\n\t\tvar sheets = {}, snames = [], realnames = [];\n\n\t\tvar refguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\tvar sheetRows = o.sheetRows || 0;\n\n\t\tif(d[2] == 0x00) {\n\t\t\tif(d[3] == 0x08 || d[3] == 0x09) {\n\t\t\t\tif(d.length >= 16 && d[14] == 0x05 && d[15] === 0x6c) throw new Error(\"Unsupported Works 3 for Mac file\");\n\t\t\t}\n\t\t}\n\n\t\tif(d[2] == 0x02) {\n\t\t\to.Enum = WK1Enum;\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0x00: /* BOF */\n\t\t\t\t\to.vers = val;\n\t\t\t\t\tif(val >= 0x1000) o.qpro = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x06: refguess = val; break; /* RANGE */\n\t\t\t\tcase 0xCC: if(val) next_n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0xDE: next_n = val; break; /* SHEETNAMELP */\n\t\t\t\tcase 0x0F: /* LABEL */\n\t\t\t\tcase 0x33: /* STRING */\n\t\t\t\t\tif(!o.qpro) val[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x0D: /* INTEGER */\n\t\t\t\tcase 0x0E: /* NUMBER */\n\t\t\t\tcase 0x10: /* FORMULA */\n\t\t\t\t\t/* TODO: actual translation of the format code */\n\t\t\t\t\tif(RT == 0x0E && (val[2] & 0x70) == 0x70 && (val[2] & 0x0F) > 1 && (val[2] & 0x0F) < 15) {\n\t\t\t\t\t\tval[1].z = o.dateNF || table_fmt[14];\n\t\t\t\t\t\tif(o.cellDates) { val[1].t = 'd'; val[1].v = numdate(val[1].v); }\n\t\t\t\t\t}\n\n\t\t\t\t\tif(o.qpro) {\n\t\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\t\tsidx = val[3]; n = next_n || \"Sheet\" + (sidx + 1); next_n = \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tvar tmpcell = o.dense ? (s[val[0].r]||[])[val[0].c] : s[encode_cell(val[0])];\n\t\t\t\t\tif(tmpcell) {\n\t\t\t\t\t\ttmpcell.t = val[1].t; tmpcell.v = val[1].v;\n\t\t\t\t\t\tif(val[1].z != null) tmpcell.z = val[1].z;\n\t\t\t\t\t\tif(val[1].f != null) tmpcell.f = val[1].f;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t}}, o);\n\t\t} else if(d[2] == 0x1A || d[2] == 0x0E) {\n\t\t\to.Enum = WK3Enum;\n\t\t\tif(d[2] == 0x0E) { o.qpro = true; d.l = 0; }\n\t\t\tlotushopper(d, function(val, R, RT) { switch(RT) {\n\t\t\t\tcase 0xCC: n = val; break; /* SHEETNAMECS */\n\t\t\t\tcase 0x16: /* LABEL16 */\n\t\t\t\t\tval[1].v = val[1].v.slice(1);\n\t\t\t\t\t/* falls through */\n\t\t\t\tcase 0x17: /* NUMBER17 */\n\t\t\t\tcase 0x18: /* NUMBER18 */\n\t\t\t\tcase 0x19: /* FORMULA19 */\n\t\t\t\tcase 0x25: /* NUMBER25 */\n\t\t\t\tcase 0x27: /* NUMBER27 */\n\t\t\t\tcase 0x28: /* FORMULA28 */\n\t\t\t\t\tif(val[3] > sidx) {\n\t\t\t\t\t\ts[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t\tsheets[n] = s;\n\t\t\t\t\t\tsnames.push(n);\n\t\t\t\t\t\ts = (o.dense ? [] : {});\n\t\t\t\t\t\trefguess = {s: {r:0, c:0}, e: {r:0, c:0} };\n\t\t\t\t\t\tsidx = val[3]; n = \"Sheet\" + (sidx + 1);\n\t\t\t\t\t}\n\t\t\t\t\tif(sheetRows > 0 && val[0].r >= sheetRows) break;\n\t\t\t\t\tif(o.dense) {\n\t\t\t\t\t\tif(!s[val[0].r]) s[val[0].r] = [];\n\t\t\t\t\t\ts[val[0].r][val[0].c] = val[1];\n\t\t\t\t\t} else s[encode_cell(val[0])] = val[1];\n\t\t\t\t\tif(refguess.e.c < val[0].c) refguess.e.c = val[0].c;\n\t\t\t\t\tif(refguess.e.r < val[0].r) refguess.e.r = val[0].r;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x1B: /* XFORMAT */\n\t\t\t\t\tif(val[0x36b0]) realnames[val[0x36b0][0]] = val[0x36b0][1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0601: /* SHEETINFOQP */\n\t\t\t\t\trealnames[val[0]] = val[1]; if(val[0] == sidx) n = val[1]; break;\n\t\t\t\tdefault: break;\n\t\t\t}}, o);\n\t\t} else throw new Error(\"Unrecognized LOTUS BOF \" + d[2]);\n\t\ts[\"!ref\"] = encode_range(refguess);\n\t\tsheets[next_n || n] = s;\n\t\tsnames.push(next_n || n);\n\t\tif(!realnames.length) return { SheetNames: snames, Sheets: sheets };\n\t\tvar osheets = {}, rnames = [];\n\t\t/* TODO: verify no collisions */\n\t\tfor(var i = 0; i < realnames.length; ++i) if(sheets[snames[i]]) {\n\t\t\trnames.push(realnames[i] || snames[i]);\n\t\t\tosheets[realnames[i]] = sheets[realnames[i]] || sheets[snames[i]];\n\t\t} else {\n\t\t\trnames.push(realnames[i]);\n\t\t\tosheets[realnames[i]] = ({ \"!ref\": \"A1\" });\n\t\t}\n\t\treturn { SheetNames: rnames, Sheets: osheets };\n\t}\n\n\tfunction sheet_to_wk1(ws/*:Worksheet*/, opts/*:WriteOpts*/) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK1 to JS string\");\n\t\tvar ba = buf_array();\n\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\tvar dense = Array.isArray(ws);\n\t\tvar cols = [];\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK1(0x0406));\n\t\twrite_biff_rec(ba, 0x06, write_RANGE(range));\n\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\tvar rr = encode_row(R);\n\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t/* TODO: formula records */\n\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\tif((cell.v|0)==cell.v && cell.v >= -32768 && cell.v <= 32767) write_biff_rec(ba, 0x0d, write_INTEGER(R, C, cell.v));\n\t\t\t\t\telse write_biff_rec(ba, 0x0e, write_NUMBER(R, C, cell.v));\n\t\t\t\t} else {\n\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\twrite_biff_rec(ba, 0x0F, write_LABEL(R, C, str.slice(0, 239)));\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\tfunction book_to_wk3(wb/*:Workbook*/, opts/*:WriteOpts*/) {\n\t\tvar o = opts || {};\n\t\tif(+o.codepage >= 0) set_cp(+o.codepage);\n\t\tif(o.type == \"string\") throw new Error(\"Cannot write WK3 to JS string\");\n\t\tvar ba = buf_array();\n\n\t\twrite_biff_rec(ba, 0x00, write_BOF_WK3(wb));\n\n\t\tfor(var i = 0, cnt = 0; i < wb.SheetNames.length; ++i) if((wb.Sheets[wb.SheetNames[i]] || {})[\"!ref\"]) write_biff_rec(ba, 0x1b, write_XFORMAT_SHEETNAME(wb.SheetNames[i], cnt++));\n\n\t\tvar wsidx = 0;\n\t\tfor(i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\tvar range = safe_decode_range(ws[\"!ref\"]);\n\t\t\tvar dense = Array.isArray(ws);\n\t\t\tvar cols = [];\n\t\t\tvar max_R = Math.min(range.e.r, 8191);\n\t\t\tfor(var R = range.s.r; R <= max_R; ++R) {\n\t\t\t\tvar rr = encode_row(R);\n\t\t\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\t\t\tvar ref = cols[C] + rr;\n\t\t\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\t\t\tif(!cell || cell.t == \"z\") continue;\n\t\t\t\t\t/* TODO: FORMULA19 NUMBER18 records */\n\t\t\t\t\tif(cell.t == \"n\") {\n\t\t\t\t\t\twrite_biff_rec(ba, 0x17, write_NUMBER_17(R, C, wsidx, cell.v));\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar str = format_cell(cell);\n\t\t\t\t\t\t/* TODO: max len? */\n\t\t\t\t\t\twrite_biff_rec(ba, 0x16, write_LABEL_16(R, C, wsidx, str.slice(0, 239)));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t++wsidx;\n\t\t}\n\n\t\twrite_biff_rec(ba, 0x01);\n\t\treturn ba.end();\n\t}\n\n\n\tfunction write_BOF_WK1(v/*:number*/) {\n\t\tvar out = new_buf(2);\n\t\tout.write_shift(2, v);\n\t\treturn out;\n\t}\n\n\tfunction write_BOF_WK3(wb/*:Workbook*/) {\n\t\tvar out = new_buf(26);\n\t\tout.write_shift(2, 0x1000);\n\t\tout.write_shift(2, 0x0004);\n\t\tout.write_shift(4, 0x0000);\n\t\tvar rows = 0, cols = 0, wscnt = 0;\n\t\tfor(var i = 0; i < wb.SheetNames.length; ++i) {\n\t\t\tvar name = wb.SheetNames[i];\n\t\t\tvar ws = wb.Sheets[name];\n\t\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\t\t++wscnt;\n\t\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\t\tif(rows < range.e.r) rows = range.e.r;\n\t\t\tif(cols < range.e.c) cols = range.e.c;\n\t\t}\n\t\tif(rows > 8191) rows = 8191;\n\t\tout.write_shift(2, rows);\n\t\tout.write_shift(1, wscnt);\n\t\tout.write_shift(1, cols);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(2, 0x00);\n\t\tout.write_shift(1, 0x01);\n\t\tout.write_shift(1, 0x02);\n\t\tout.write_shift(4, 0);\n\t\tout.write_shift(4, 0);\n\t\treturn out;\n\t}\n\n\tfunction parse_RANGE(blob, length, opts) {\n\t\tvar o = {s:{c:0,r:0},e:{c:0,r:0}};\n\t\tif(length == 8 && opts.qpro) {\n\t\t\to.s.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.s.r = blob.read_shift(2);\n\t\t\to.e.c = blob.read_shift(1);\n\t\t\tblob.l++;\n\t\t\to.e.r = blob.read_shift(2);\n\t\t\treturn o;\n\t\t}\n\t\to.s.c = blob.read_shift(2);\n\t\to.s.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\to.e.c = blob.read_shift(2);\n\t\to.e.r = blob.read_shift(2);\n\t\tif(length == 12 && opts.qpro) blob.l += 2;\n\t\tif(o.s.c == 0xFFFF) o.s.c = o.e.c = o.s.r = o.e.r = 0;\n\t\treturn o;\n\t}\n\tfunction write_RANGE(range) {\n\t\tvar out = new_buf(8);\n\t\tout.write_shift(2, range.s.c);\n\t\tout.write_shift(2, range.s.r);\n\t\tout.write_shift(2, range.e.c);\n\t\tout.write_shift(2, range.e.r);\n\t\treturn out;\n\t}\n\n\tfunction parse_cell(blob, length, opts) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0, 0];\n\t\tif(opts.qpro && opts.vers != 0x5120) {\n\t\t\to[0].c = blob.read_shift(1);\n\t\t\to[3] = blob.read_shift(1);\n\t\t\to[0].r = blob.read_shift(2);\n\t\t\tblob.l+=2;\n\t\t} else {\n\t\t\to[2] = blob.read_shift(1);\n\t\t\to[0].c = blob.read_shift(2); o[0].r = blob.read_shift(2);\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].t = 's';\n\t\tif(opts.vers == 0x5120) {\n\t\t\tblob.l++;\n\t\t\tvar len = blob.read_shift(1);\n\t\t\to[1].v = blob.read_shift(len, 'utf8');\n\t\t\treturn o;\n\t\t}\n\t\tif(opts.qpro) blob.l++;\n\t\to[1].v = blob.read_shift(tgt - blob.l, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL(R, C, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(7 + s.length);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, 0x27); // ??\n\t\tfor(var i = 0; i < o.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_INTEGER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(2, 'i');\n\t\treturn o;\n\t}\n\tfunction write_INTEGER(R, C, v) {\n\t\tvar o = new_buf(7);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(2, v, 'i');\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER(blob, length, opts) {\n\t\tvar o = parse_cell(blob, length, opts);\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\treturn o;\n\t}\n\tfunction write_NUMBER(R, C, v) {\n\t\tvar o = new_buf(13);\n\t\to.write_shift(1, 0xFF);\n\t\to.write_shift(2, C);\n\t\to.write_shift(2, R);\n\t\to.write_shift(8, v, 'f');\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA(blob, length, opts) {\n\t\tvar tgt = blob.l + length;\n\t\tvar o = parse_cell(blob, length, opts);\n\t\t/* TODO: formula */\n\t\to[1].v = blob.read_shift(8, 'f');\n\t\tif(opts.qpro) blob.l = tgt;\n\t\telse {\n\t\t\tvar flen = blob.read_shift(2);\n\t\t\twk1_fmla_to_csf(blob.slice(blob.l, blob.l + flen), o);\n\t\t\tblob.l += flen;\n\t\t}\n\t\treturn o;\n\t}\n\n\tfunction wk1_parse_rc(B, V, col) {\n\t\tvar rel = V & 0x8000;\n\t\tV &= ~0x8000;\n\t\tV = (rel ? B : 0) + ((V >= 0x2000) ? V - 0x4000 : V);\n\t\treturn (rel ? \"\" : \"$\") + (col ? encode_col(V) : encode_row(V));\n\t}\n\t/* var oprec = [\n\t\t8, 8, 8, 8, 8, 8, 8, 8, 6, 4, 4, 5, 5, 7, 3, 3,\n\t\t3, 3, 3, 3, 1, 1, 2, 6, 8, 8, 8, 8, 8, 8, 8, 8\n\t]; */\n\t/* TODO: flesh out */\n\tvar FuncTab = {\n\t\t0x33: [\"FALSE\", 0],\n\t\t0x34: [\"TRUE\", 0],\n\t\t0x46: [\"LEN\", 1],\n\t\t0x50: [\"SUM\", 69],\n\t\t0x51: [\"AVERAGEA\", 69],\n\t\t0x52: [\"COUNTA\", 69],\n\t\t0x53: [\"MINA\", 69],\n\t\t0x54: [\"MAXA\", 69],\n\t\t0x6F: [\"T\", 1]\n\t};\n\tvar BinOpTab = [\n\t\t \"\", \"\", \"\", \"\", \"\", \"\", \"\", \"\", // eslint-disable-line no-mixed-spaces-and-tabs\n\t\t \"\", \"+\", \"-\", \"*\", \"/\", \"^\", \"=\", \"<>\", // eslint-disable-line no-mixed-spaces-and-tabs\n\t\t\"<=\", \">=\", \"<\", \">\", \"\", \"\", \"\", \"\", // eslint-disable-line no-mixed-spaces-and-tabs\n\t\t \"&\", \"\", \"\", \"\", \"\", \"\", \"\", \"\" // eslint-disable-line no-mixed-spaces-and-tabs\n\t];\n\n\tfunction wk1_fmla_to_csf(blob, o) {\n\t\tprep_blob(blob, 0);\n\t\tvar out = [], argc = 0, R = \"\", C = \"\", argL = \"\", argR = \"\";\n\t\twhile(blob.l < blob.length) {\n\t\t\tvar cc = blob[blob.l++];\n\t\t\tswitch(cc) {\n\t\t\t\tcase 0x00: out.push(blob.read_shift(8, 'f')); break;\n\t\t\t\tcase 0x01: {\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x02: {\n\t\t\t\t\tvar c = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tvar r = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tC = wk1_parse_rc(o[0].c, blob.read_shift(2), true);\n\t\t\t\t\tR = wk1_parse_rc(o[0].r, blob.read_shift(2), false);\n\t\t\t\t\tout.push(c + r + \":\" + C + R);\n\t\t\t\t} break;\n\t\t\t\tcase 0x03:\n\t\t\t\t\tif(blob.l < blob.length) { console.error(\"WK1 premature formula end\"); return; }\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x04: out.push(\"(\" + out.pop() + \")\"); break;\n\t\t\t\tcase 0x05: out.push(blob.read_shift(2)); break;\n\t\t\t\tcase 0x06: {\n\t\t\t\t\t/* TODO: text encoding */\n\t\t\t\t\tvar Z = \"\"; while((cc = blob[blob.l++])) Z += String.fromCharCode(cc);\n\t\t\t\t\tout.push('\"' + Z.replace(/\"/g, '\"\"') + '\"');\n\t\t\t\t} break;\n\n\t\t\t\tcase 0x08: out.push(\"-\" + out.pop()); break;\n\t\t\t\tcase 0x17: out.push(\"+\" + out.pop()); break;\n\t\t\t\tcase 0x16: out.push(\"NOT(\" + out.pop() + \")\"); break;\n\n\t\t\t\tcase 0x14: case 0x15: {\n\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\tout.push([\"AND\", \"OR\"][cc - 0x14] + \"(\" + argL + \",\" + argR + \")\");\n\t\t\t\t} break;\n\n\t\t\t\tdefault:\n\t\t\t\t\tif(cc < 0x20 && BinOpTab[cc]) {\n\t\t\t\t\t\targR = out.pop(); argL = out.pop();\n\t\t\t\t\t\tout.push(argL + BinOpTab[cc] + argR);\n\t\t\t\t\t} else if(FuncTab[cc]) {\n\t\t\t\t\t\targc = FuncTab[cc][1];\n\t\t\t\t\t\tif(argc == 69) argc = blob[blob.l++];\n\t\t\t\t\t\tif(argc > out.length) { console.error(\"WK1 bad formula parse 0x\" + cc.toString(16) + \":|\" + out.join(\"|\") + \"|\"); return; }\n\t\t\t\t\t\tvar args = out.slice(-argc);\n\t\t\t\t\t\tout.length -= argc;\n\t\t\t\t\t\tout.push(FuncTab[cc][0] + \"(\" + args.join(\",\") + \")\");\n\t\t\t\t\t}\n\t\t\t\t\telse if(cc <= 0x07) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x18) return console.error(\"WK1 unsupported op \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x1E) return console.error(\"WK1 invalid opcode \" + cc.toString(16));\n\t\t\t\t\telse if(cc <= 0x73) return console.error(\"WK1 unsupported function opcode \" + cc.toString(16));\n\t\t\t\t\t// possible future functions ??\n\t\t\t\t\telse return console.error(\"WK1 unrecognized opcode \" + cc.toString(16));\n\t\t\t}\n\t\t}\n\t\tif(out.length == 1) o[1].f = \"\" + out[0];\n\t\telse console.error(\"WK1 bad formula parse |\" + out.join(\"|\") + \"|\");\n\t}\n\n\n\tfunction parse_cell_3(blob/*::, length*/) {\n\t\tvar o = [{c:0,r:0}, {t:'n',v:0}, 0];\n\t\to[0].r = blob.read_shift(2); o[3] = blob[blob.l++]; o[0].c = blob[blob.l++];\n\t\treturn o;\n\t}\n\n\tfunction parse_LABEL_16(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].t = 's';\n\t\to[1].v = blob.read_shift(length - 4, 'cstr');\n\t\treturn o;\n\t}\n\tfunction write_LABEL_16(R, C, wsidx, s) {\n\t\t/* TODO: encoding */\n\t\tvar o = new_buf(6 + s.length);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\to.write_shift(1, 0x27);\n\t\tfor(var i = 0; i < s.length; ++i) {\n\t\t\tvar cc = s.charCodeAt(i);\n\t\t\to.write_shift(1, cc >= 0x80 ? 0x5F : cc);\n\t\t}\n\t\to.write_shift(1, 0);\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_18(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\to[1].v = blob.read_shift(2);\n\t\tvar v = o[1].v >> 1;\n\t\tif(o[1].v & 0x1) {\n\t\t\tswitch(v & 0x07) {\n\t\t\t\tcase 0: v = (v >> 3) * 5000; break;\n\t\t\t\tcase 1: v = (v >> 3) * 500; break;\n\t\t\t\tcase 2: v = (v >> 3) / 20; break;\n\t\t\t\tcase 3: v = (v >> 3) / 200; break;\n\t\t\t\tcase 4: v = (v >> 3) / 2000; break;\n\t\t\t\tcase 5: v = (v >> 3) / 20000; break;\n\t\t\t\tcase 6: v = (v >> 3) / 16; break;\n\t\t\t\tcase 7: v = (v >> 3) / 64; break;\n\t\t\t}\n\t\t}\n\t\to[1].v = v;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_17(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\tvar v2 = blob.read_shift(4);\n\t\tvar e = blob.read_shift(2);\n\t\tif(e == 0xFFFF) {\n\t\t\tif(v1 === 0 && v2 === 0xC0000000) { o[1].t = \"e\"; o[1].v = 0x0F; } // ERR -> #VALUE!\n\t\t\telse if(v1 === 0 && v2 === 0xD0000000) { o[1].t = \"e\"; o[1].v = 0x2A; } // NA -> #N/A\n\t\t\telse o[1].v = 0;\n\t\t\treturn o;\n\t\t}\n\t\tvar s = e & 0x8000; e = (e&0x7FFF) - 16446;\n\t\to[1].v = (1 - s*2) * (v2 * Math.pow(2, e+32) + v1 * Math.pow(2, e));\n\t\treturn o;\n\t}\n\tfunction write_NUMBER_17(R, C, wsidx, v) {\n\t\tvar o = new_buf(14);\n\t\to.write_shift(2, R);\n\t\to.write_shift(1, wsidx);\n\t\to.write_shift(1, C);\n\t\tif(v == 0) {\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(4, 0);\n\t\t\to.write_shift(2, 0xFFFF);\n\t\t\treturn o;\n\t\t}\n\t\tvar s = 0, e = 0, v1 = 0, v2 = 0;\n\t\tif(v < 0) { s = 1; v = -v; }\n\t\te = Math.log2(v) | 0;\n\t\tv /= Math.pow(2, e-31);\n\t\tv2 = (v)>>>0;\n\t\tif((v2&0x80000000) == 0) { v/=2; ++e; v2 = v >>> 0; }\n\t\tv -= v2;\n\t\tv2 |= 0x80000000;\n\t\tv2 >>>= 0;\n\t\tv *= Math.pow(2, 32);\n\t\tv1 = v>>>0;\n\t\to.write_shift(4, v1);\n\t\to.write_shift(4, v2);\n\t\te += 0x3FFF + (s ? 0x8000 : 0);\n\t\to.write_shift(2, e);\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_19(blob, length) {\n\t\tvar o = parse_NUMBER_17(blob, 14);\n\t\tblob.l += length - 14; /* TODO: WK3 formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_25(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(4);\n\t\to[1].v = v1 >> 6;\n\t\treturn o;\n\t}\n\n\tfunction parse_NUMBER_27(blob, length) {\n\t\tvar o = parse_cell_3(blob, length);\n\t\tvar v1 = blob.read_shift(8,'f');\n\t\to[1].v = v1;\n\t\treturn o;\n\t}\n\n\tfunction parse_FORMULA_28(blob, length) {\n\t\tvar o = parse_NUMBER_27(blob, 14);\n\t\tblob.l += length - 10; /* TODO: formula */\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETNAMECS(blob, length) {\n\t\treturn blob[blob.l + length - 1] == 0 ? blob.read_shift(length, 'cstr') : \"\";\n\t}\n\n\tfunction parse_SHEETNAMELP(blob, length) {\n\t\tvar len = blob[blob.l++];\n\t\tif(len > length - 1) len = length - 1;\n\t\tvar o = \"\"; while(o.length < len) o += String.fromCharCode(blob[blob.l++]);\n\t\treturn o;\n\t}\n\n\tfunction parse_SHEETINFOQP(blob, length, opts) {\n\t\tif(!opts.qpro || length < 21) return;\n\t\tvar id = blob.read_shift(1);\n\t\tblob.l += 17;\n\t\tblob.l += 1; //var len = blob.read_shift(1);\n\t\tblob.l += 2;\n\t\tvar nm = blob.read_shift(length - 21, 'cstr');\n\t\treturn [id, nm];\n\t}\n\n\tfunction parse_XFORMAT(blob, length) {\n\t\tvar o = {}, tgt = blob.l + length;\n\t\twhile(blob.l < tgt) {\n\t\t\tvar dt = blob.read_shift(2);\n\t\t\tif(dt == 0x36b0) {\n\t\t\t\to[dt] = [0, \"\"];\n\t\t\t\to[dt][0] = blob.read_shift(2);\n\t\t\t\twhile(blob[blob.l]) { o[dt][1] += String.fromCharCode(blob[blob.l]); blob.l++; } blob.l++;\n\t\t\t}\n\t\t\t// TODO: 0x3a99 ??\n\t\t}\n\t\treturn o;\n\t}\n\tfunction write_XFORMAT_SHEETNAME(name, wsidx) {\n\t\tvar out = new_buf(5 + name.length);\n\t\tout.write_shift(2, 0x36b0);\n\t\tout.write_shift(2, wsidx);\n\t\tfor(var i = 0; i < name.length; ++i) {\n\t\t\tvar cc = name.charCodeAt(i);\n\t\t\tout[out.l++] = cc > 0x7F ? 0x5F : cc;\n\t\t}\n\t\tout[out.l++] = 0;\n\t\treturn out;\n\t}\n\n\tvar WK1Enum = {\n\t\t/*::[*/0x0000/*::]*/: { n:\"BOF\", f:parseuint16 },\n\t\t/*::[*/0x0001/*::]*/: { n:\"EOF\" },\n\t\t/*::[*/0x0002/*::]*/: { n:\"CALCMODE\" },\n\t\t/*::[*/0x0003/*::]*/: { n:\"CALCORDER\" },\n\t\t/*::[*/0x0004/*::]*/: { n:\"SPLIT\" },\n\t\t/*::[*/0x0005/*::]*/: { n:\"SYNC\" },\n\t\t/*::[*/0x0006/*::]*/: { n:\"RANGE\", f:parse_RANGE },\n\t\t/*::[*/0x0007/*::]*/: { n:\"WINDOW1\" },\n\t\t/*::[*/0x0008/*::]*/: { n:\"COLW1\" },\n\t\t/*::[*/0x0009/*::]*/: { n:\"WINTWO\" },\n\t\t/*::[*/0x000A/*::]*/: { n:\"COLW2\" },\n\t\t/*::[*/0x000B/*::]*/: { n:\"NAME\" },\n\t\t/*::[*/0x000C/*::]*/: { n:\"BLANK\" },\n\t\t/*::[*/0x000D/*::]*/: { n:\"INTEGER\", f:parse_INTEGER },\n\t\t/*::[*/0x000E/*::]*/: { n:\"NUMBER\", f:parse_NUMBER },\n\t\t/*::[*/0x000F/*::]*/: { n:\"LABEL\", f:parse_LABEL },\n\t\t/*::[*/0x0010/*::]*/: { n:\"FORMULA\", f:parse_FORMULA },\n\t\t/*::[*/0x0018/*::]*/: { n:\"TABLE\" },\n\t\t/*::[*/0x0019/*::]*/: { n:\"ORANGE\" },\n\t\t/*::[*/0x001A/*::]*/: { n:\"PRANGE\" },\n\t\t/*::[*/0x001B/*::]*/: { n:\"SRANGE\" },\n\t\t/*::[*/0x001C/*::]*/: { n:\"FRANGE\" },\n\t\t/*::[*/0x001D/*::]*/: { n:\"KRANGE1\" },\n\t\t/*::[*/0x0020/*::]*/: { n:\"HRANGE\" },\n\t\t/*::[*/0x0023/*::]*/: { n:\"KRANGE2\" },\n\t\t/*::[*/0x0024/*::]*/: { n:\"PROTEC\" },\n\t\t/*::[*/0x0025/*::]*/: { n:\"FOOTER\" },\n\t\t/*::[*/0x0026/*::]*/: { n:\"HEADER\" },\n\t\t/*::[*/0x0027/*::]*/: { n:\"SETUP\" },\n\t\t/*::[*/0x0028/*::]*/: { n:\"MARGINS\" },\n\t\t/*::[*/0x0029/*::]*/: { n:\"LABELFMT\" },\n\t\t/*::[*/0x002A/*::]*/: { n:\"TITLES\" },\n\t\t/*::[*/0x002B/*::]*/: { n:\"SHEETJS\" },\n\t\t/*::[*/0x002D/*::]*/: { n:\"GRAPH\" },\n\t\t/*::[*/0x002E/*::]*/: { n:\"NGRAPH\" },\n\t\t/*::[*/0x002F/*::]*/: { n:\"CALCCOUNT\" },\n\t\t/*::[*/0x0030/*::]*/: { n:\"UNFORMATTED\" },\n\t\t/*::[*/0x0031/*::]*/: { n:\"CURSORW12\" },\n\t\t/*::[*/0x0032/*::]*/: { n:\"WINDOW\" },\n\t\t/*::[*/0x0033/*::]*/: { n:\"STRING\", f:parse_LABEL },\n\t\t/*::[*/0x0037/*::]*/: { n:\"PASSWORD\" },\n\t\t/*::[*/0x0038/*::]*/: { n:\"LOCKED\" },\n\t\t/*::[*/0x003C/*::]*/: { n:\"QUERY\" },\n\t\t/*::[*/0x003D/*::]*/: { n:\"QUERYNAME\" },\n\t\t/*::[*/0x003E/*::]*/: { n:\"PRINT\" },\n\t\t/*::[*/0x003F/*::]*/: { n:\"PRINTNAME\" },\n\t\t/*::[*/0x0040/*::]*/: { n:\"GRAPH2\" },\n\t\t/*::[*/0x0041/*::]*/: { n:\"GRAPHNAME\" },\n\t\t/*::[*/0x0042/*::]*/: { n:\"ZOOM\" },\n\t\t/*::[*/0x0043/*::]*/: { n:\"SYMSPLIT\" },\n\t\t/*::[*/0x0044/*::]*/: { n:\"NSROWS\" },\n\t\t/*::[*/0x0045/*::]*/: { n:\"NSCOLS\" },\n\t\t/*::[*/0x0046/*::]*/: { n:\"RULER\" },\n\t\t/*::[*/0x0047/*::]*/: { n:\"NNAME\" },\n\t\t/*::[*/0x0048/*::]*/: { n:\"ACOMM\" },\n\t\t/*::[*/0x0049/*::]*/: { n:\"AMACRO\" },\n\t\t/*::[*/0x004A/*::]*/: { n:\"PARSE\" },\n\t\t/*::[*/0x0066/*::]*/: { n:\"PRANGES??\" },\n\t\t/*::[*/0x0067/*::]*/: { n:\"RRANGES??\" },\n\t\t/*::[*/0x0068/*::]*/: { n:\"FNAME??\" },\n\t\t/*::[*/0x0069/*::]*/: { n:\"MRANGES??\" },\n\t\t/*::[*/0x00CC/*::]*/: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n\t\t/*::[*/0x00DE/*::]*/: { n:\"SHEETNAMELP\", f:parse_SHEETNAMELP },\n\t\t/*::[*/0xFFFF/*::]*/: { n:\"\" }\n\t};\n\n\tvar WK3Enum = {\n\t\t/*::[*/0x0000/*::]*/: { n:\"BOF\" },\n\t\t/*::[*/0x0001/*::]*/: { n:\"EOF\" },\n\t\t/*::[*/0x0002/*::]*/: { n:\"PASSWORD\" },\n\t\t/*::[*/0x0003/*::]*/: { n:\"CALCSET\" },\n\t\t/*::[*/0x0004/*::]*/: { n:\"WINDOWSET\" },\n\t\t/*::[*/0x0005/*::]*/: { n:\"SHEETCELLPTR\" },\n\t\t/*::[*/0x0006/*::]*/: { n:\"SHEETLAYOUT\" },\n\t\t/*::[*/0x0007/*::]*/: { n:\"COLUMNWIDTH\" },\n\t\t/*::[*/0x0008/*::]*/: { n:\"HIDDENCOLUMN\" },\n\t\t/*::[*/0x0009/*::]*/: { n:\"USERRANGE\" },\n\t\t/*::[*/0x000A/*::]*/: { n:\"SYSTEMRANGE\" },\n\t\t/*::[*/0x000B/*::]*/: { n:\"ZEROFORCE\" },\n\t\t/*::[*/0x000C/*::]*/: { n:\"SORTKEYDIR\" },\n\t\t/*::[*/0x000D/*::]*/: { n:\"FILESEAL\" },\n\t\t/*::[*/0x000E/*::]*/: { n:\"DATAFILLNUMS\" },\n\t\t/*::[*/0x000F/*::]*/: { n:\"PRINTMAIN\" },\n\t\t/*::[*/0x0010/*::]*/: { n:\"PRINTSTRING\" },\n\t\t/*::[*/0x0011/*::]*/: { n:\"GRAPHMAIN\" },\n\t\t/*::[*/0x0012/*::]*/: { n:\"GRAPHSTRING\" },\n\t\t/*::[*/0x0013/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0014/*::]*/: { n:\"ERRCELL\" },\n\t\t/*::[*/0x0015/*::]*/: { n:\"NACELL\" },\n\t\t/*::[*/0x0016/*::]*/: { n:\"LABEL16\", f:parse_LABEL_16},\n\t\t/*::[*/0x0017/*::]*/: { n:\"NUMBER17\", f:parse_NUMBER_17 },\n\t\t/*::[*/0x0018/*::]*/: { n:\"NUMBER18\", f:parse_NUMBER_18 },\n\t\t/*::[*/0x0019/*::]*/: { n:\"FORMULA19\", f:parse_FORMULA_19},\n\t\t/*::[*/0x001A/*::]*/: { n:\"FORMULA1A\" },\n\t\t/*::[*/0x001B/*::]*/: { n:\"XFORMAT\", f:parse_XFORMAT },\n\t\t/*::[*/0x001C/*::]*/: { n:\"DTLABELMISC\" },\n\t\t/*::[*/0x001D/*::]*/: { n:\"DTLABELCELL\" },\n\t\t/*::[*/0x001E/*::]*/: { n:\"GRAPHWINDOW\" },\n\t\t/*::[*/0x001F/*::]*/: { n:\"CPA\" },\n\t\t/*::[*/0x0020/*::]*/: { n:\"LPLAUTO\" },\n\t\t/*::[*/0x0021/*::]*/: { n:\"QUERY\" },\n\t\t/*::[*/0x0022/*::]*/: { n:\"HIDDENSHEET\" },\n\t\t/*::[*/0x0023/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0025/*::]*/: { n:\"NUMBER25\", f:parse_NUMBER_25 },\n\t\t/*::[*/0x0026/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0027/*::]*/: { n:\"NUMBER27\", f:parse_NUMBER_27 },\n\t\t/*::[*/0x0028/*::]*/: { n:\"FORMULA28\", f:parse_FORMULA_28 },\n\t\t/*::[*/0x008E/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0093/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0096/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0097/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0098/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0099/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x009A/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x009B/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x009C/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00A3/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00AE/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00AF/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00B0/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00B1/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00B8/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00B9/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00BA/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00BB/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00BC/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00C3/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00C9/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00CC/*::]*/: { n:\"SHEETNAMECS\", f:parse_SHEETNAMECS },\n\t\t/*::[*/0x00CD/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00CE/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00CF/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x00D0/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0100/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0103/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0104/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0105/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0106/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0107/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0109/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x010A/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x010B/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x010C/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x010E/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x010F/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0180/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0185/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0186/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0189/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x018C/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0200/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0202/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0201/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0204/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0205/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0280/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0281/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0282/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0283/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0284/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0285/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0286/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0287/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0288/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0292/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0293/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0294/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0295/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0296/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0299/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x029A/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0300/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0304/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0601/*::]*/: { n:\"SHEETINFOQP\", f:parse_SHEETINFOQP },\n\t\t/*::[*/0x0640/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0642/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0701/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0702/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0703/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0704/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0780/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0800/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0801/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0804/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x0A80/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x2AF6/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x3231/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x6E49/*::]*/: { n:\"??\" },\n\t\t/*::[*/0x6F44/*::]*/: { n:\"??\" },\n\t\t/*::[*/0xFFFF/*::]*/: { n:\"\" }\n\t};\n\treturn {\n\t\tsheet_to_wk1: sheet_to_wk1,\n\t\tbook_to_wk3: book_to_wk3,\n\t\tto_workbook: lotus_to_workbook\n\t};\n})();\n/* 18.4.7 rPr CT_RPrElt */\nfunction parse_rpr(rpr) {\n\tvar font = {}, m = rpr.match(tagregex), i = 0;\n\tvar pass = false;\n\tif(m) for(;i!=m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(y[0].replace(/\\w*:/g,\"\")) {\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\t/* ** not required . */\n\t\t\tcase '':\n\t\t\tcase '': font.shadow = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty TODO */\n\t\t\tcase '':\n\t\t\tcase '': font.outline = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.5 rFont CT_FontName */\n\t\t\tcase '':\n\t\t\tcase '': font.strike = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '':\n\t\t\tcase '': font.u = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.2 b */\n\t\t\tcase '':\n\t\t\tcase '': font.b = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.26 i */\n\t\t\tcase '':\n\t\t\tcase '': font.i = 1; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.3.1.15 color CT_Color TODO: tint, theme, auto, indexed */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.8.18 family ST_FontFamily */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty TODO */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.8.35 scheme CT_FontScheme TODO */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault:\n\t\t\t\tif(y[0].charCodeAt(1) !== 47 && !pass) throw new Error('Unrecognized rich format ' + y[0]);\n\t\t}\n\t}\n\treturn font;\n}\n\nvar parse_rs = /*#__PURE__*/(function() {\n\tvar tregex = matchtag(\"t\"), rpregex = matchtag(\"rPr\");\n\t/* 18.4.4 r CT_RElt */\n\tfunction parse_r(r) {\n\t\t/* 18.4.12 t ST_Xstring */\n\t\tvar t = r.match(tregex)/*, cp = 65001*/;\n\t\tif(!t) return {t:\"s\", v:\"\"};\n\n\t\tvar o/*:Cell*/ = ({t:'s', v:unescapexml(t[1])}/*:any*/);\n\t\tvar rpr = r.match(rpregex);\n\t\tif(rpr) o.s = parse_rpr(rpr[1]);\n\t\treturn o;\n\t}\n\tvar rregex = /<(?:\\w+:)?r>/g, rend = /<\\/(?:\\w+:)?r>/;\n\treturn function parse_rs(rs) {\n\t\treturn rs.replace(rregex,\"\").split(rend).map(parse_r).filter(function(r) { return r.v; });\n\t};\n})();\n\n\n/* Parse a list of tags */\nvar rs_to_html = /*#__PURE__*/(function parse_rs_factory() {\n\tvar nlregex = /(\\r\\n|\\n)/g;\n\tfunction parse_rpr2(font, intro, outro) {\n\t\tvar style/*:Array*/ = [];\n\n\t\tif(font.u) style.push(\"text-decoration: underline;\");\n\t\tif(font.uval) style.push(\"text-underline-style:\" + font.uval + \";\");\n\t\tif(font.sz) style.push(\"font-size:\" + font.sz + \"pt;\");\n\t\tif(font.outline) style.push(\"text-effect: outline;\");\n\t\tif(font.shadow) style.push(\"text-shadow: auto;\");\n\t\tintro.push('');\n\n\t\tif(font.b) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.i) { intro.push(\"\"); outro.push(\"\"); }\n\t\tif(font.strike) { intro.push(\"\"); outro.push(\"\"); }\n\n\t\tvar align = font.valign || \"\";\n\t\tif(align == \"superscript\" || align == \"super\") align = \"sup\";\n\t\telse if(align == \"subscript\") align = \"sub\";\n\t\tif(align != \"\") { intro.push(\"<\" + align + \">\"); outro.push(\"\"); }\n\n\t\toutro.push(\"\");\n\t\treturn font;\n\t}\n\n\t/* 18.4.4 r CT_RElt */\n\tfunction r_to_html(r) {\n\t\tvar terms/*:[Array, string, Array]*/ = [[],r.v,[]];\n\t\tif(!r.v) return \"\";\n\n\t\tif(r.s) parse_rpr2(r.s, terms[0], terms[2]);\n\n\t\treturn terms[0].join(\"\") + terms[1].replace(nlregex,'
    ') + terms[2].join(\"\");\n\t}\n\n\treturn function parse_rs(rs) {\n\t\treturn rs.map(r_to_html).join(\"\");\n\t};\n})();\n\n/* 18.4.8 si CT_Rst */\nvar sitregex = /<(?:\\w+:)?t[^>]*>([^<]*)<\\/(?:\\w+:)?t>/g, sirregex = /<(?:\\w+:)?r>/;\nvar sirphregex = /<(?:\\w+:)?rPh.*?>([\\s\\S]*?)<\\/(?:\\w+:)?rPh>/g;\nfunction parse_si(x, opts) {\n\tvar html = opts ? opts.cellHTML : true;\n\tvar z = {};\n\tif(!x) return { t: \"\" };\n\t//var y;\n\t/* 18.4.12 t ST_Xstring (Plaintext String) */\n\t// TODO: is whitespace actually valid here?\n\tif(x.match(/^\\s*<(?:\\w+:)?t[^>]*>/)) {\n\t\tz.t = unescapexml(utf8read(x.slice(x.indexOf(\">\")+1).split(/<\\/(?:\\w+:)?t>/)[0]||\"\"));\n\t\tz.r = utf8read(x);\n\t\tif(html) z.h = escapehtml(z.t);\n\t}\n\t/* 18.4.4 r CT_RElt (Rich Text Run) */\n\telse if((/*y = */x.match(sirregex))) {\n\t\tz.r = utf8read(x);\n\t\tz.t = unescapexml(utf8read((x.replace(sirphregex, '').match(sitregex)||[]).join(\"\").replace(tagregex,\"\")));\n\t\tif(html) z.h = rs_to_html(parse_rs(z.r));\n\t}\n\t/* 18.4.3 phoneticPr CT_PhoneticPr (TODO: needed for Asian support) */\n\t/* 18.4.6 rPh CT_PhoneticRun (TODO: needed for Asian support) */\n\treturn z;\n}\n\n/* 18.4 Shared String Table */\nvar sstr0 = /<(?:\\w+:)?sst([^>]*)>([\\s\\S]*)<\\/(?:\\w+:)?sst>/;\nvar sstr1 = /<(?:\\w+:)?(?:si|sstItem)>/g;\nvar sstr2 = /<\\/(?:\\w+:)?(?:si|sstItem)>/;\nfunction parse_sst_xml(data/*:string*/, opts)/*:SST*/ {\n\tvar s/*:SST*/ = ([]/*:any*/), ss = \"\";\n\tif(!data) return s;\n\t/* 18.4.9 sst CT_Sst */\n\tvar sst = data.match(sstr0);\n\tif(sst) {\n\t\tss = sst[2].replace(sstr1,\"\").split(sstr2);\n\t\tfor(var i = 0; i != ss.length; ++i) {\n\t\t\tvar o = parse_si(ss[i].trim(), opts);\n\t\t\tif(o != null) s[s.length] = o;\n\t\t}\n\t\tsst = parsexmltag(sst[1]); s.Count = sst.count; s.Unique = sst.uniqueCount;\n\t}\n\treturn s;\n}\n\nvar straywsregex = /^\\s|\\s$|[\\t\\n\\r]/;\nfunction write_sst_xml(sst/*:SST*/, opts)/*:string*/ {\n\tif(!opts.bookSST) return \"\";\n\tvar o = [XML_HEADER];\n\to[o.length] = (writextag('sst', null, {\n\t\txmlns: XMLNS_main[0],\n\t\tcount: sst.Count,\n\t\tuniqueCount: sst.Unique\n\t}));\n\tfor(var i = 0; i != sst.length; ++i) { if(sst[i] == null) continue;\n\t\tvar s/*:XLString*/ = sst[i];\n\t\tvar sitag = \"\";\n\t\tif(s.r) sitag += s.r;\n\t\telse {\n\t\t\tsitag += \"\" + escapexml(s.t) + \"\";\n\t\t}\n\t\tsitag += \"\";\n\t\to[o.length] = (sitag);\n\t}\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.221 BrtBeginSst */\nfunction parse_BrtBeginSst(data) {\n\treturn [data.read_shift(4), data.read_shift(4)];\n}\n\n/* [MS-XLSB] 2.1.7.45 Shared Strings */\nfunction parse_sst_bin(data, opts)/*:SST*/ {\n\tvar s/*:SST*/ = ([]/*:any*/);\n\tvar pass = false;\n\trecordhopper(data, function hopper_sst(val, R, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009F: /* BrtBeginSst */\n\t\t\t\ts.Count = val[0]; s.Unique = val[1]; break;\n\t\t\tcase 0x0013: /* BrtSSTItem */\n\t\t\t\ts.push(val); break;\n\t\t\tcase 0x00A0: /* BrtEndSst */\n\t\t\t\treturn true;\n\n\t\t\tcase 0x0023: /* BrtFRTBegin */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* BrtFRTEnd */\n\t\t\t\tpass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif(R.T){}\n\t\t\t\tif(!pass || opts.WTF) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t});\n\treturn s;\n}\n\nfunction write_BrtBeginSst(sst, o) {\n\tif(!o) o = new_buf(8);\n\to.write_shift(4, sst.Count);\n\to.write_shift(4, sst.Unique);\n\treturn o;\n}\n\nvar write_BrtSSTItem = write_RichStr;\n\nfunction write_sst_bin(sst/*::, opts*/) {\n\tvar ba = buf_array();\n\twrite_record(ba, 0x009F /* BrtBeginSst */, write_BrtBeginSst(sst));\n\tfor(var i = 0; i < sst.length; ++i) write_record(ba, 0x0013 /* BrtSSTItem */, write_BrtSSTItem(sst[i]));\n\t/* FRTSST */\n\twrite_record(ba, 0x00A0 /* BrtEndSst */);\n\treturn ba.end();\n}\nfunction _JS2ANSI(str/*:string*/)/*:Array*/ {\n\tif(typeof $cptable !== 'undefined') return $cptable.utils.encode(current_ansi, str);\n\tvar o/*:Array*/ = [], oo = str.split(\"\");\n\tfor(var i = 0; i < oo.length; ++i) o[i] = oo[i].charCodeAt(0);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.4 Version */\nfunction parse_CRYPTOVersion(blob, length/*:?number*/) {\n\tvar o/*:any*/ = {};\n\to.Major = blob.read_shift(2);\n\to.Minor = blob.read_shift(2);\n\t/*:: if(length == null) return o; */\n\tif(length >= 4) blob.l += length - 4;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.5 DataSpaceVersionInfo */\nfunction parse_DataSpaceVersionInfo(blob) {\n\tvar o = {};\n\to.id = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6.1 DataSpaceMapEntry Structure */\nfunction parse_DataSpaceMapEntry(blob) {\n\tvar len = blob.read_shift(4);\n\tvar end = blob.l + len - 4;\n\tvar o = {};\n\tvar cnt = blob.read_shift(4);\n\tvar comps/*:Array<{t:number, v:string}>*/ = [];\n\t/* [MS-OFFCRYPTO] 2.1.6.2 DataSpaceReferenceComponent Structure */\n\twhile(cnt-- > 0) comps.push({ t: blob.read_shift(4), v: blob.read_shift(0, 'lpp4') });\n\to.name = blob.read_shift(0, 'lpp4');\n\to.comps = comps;\n\tif(blob.l != end) throw new Error(\"Bad DataSpaceMapEntry: \" + blob.l + \" != \" + end);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.6 DataSpaceMap */\nfunction parse_DataSpaceMap(blob) {\n\tvar o = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(parse_DataSpaceMapEntry(blob));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.7 DataSpaceDefinition */\nfunction parse_DataSpaceDefinition(blob)/*:Array*/ {\n\tvar o/*:Array*/ = [];\n\tblob.l += 4; // must be 0x8\n\tvar cnt = blob.read_shift(4);\n\twhile(cnt-- > 0) o.push(blob.read_shift(0, 'lpp4'));\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.1.8 DataSpaceDefinition */\nfunction parse_TransformInfoHeader(blob) {\n\tvar o = {};\n\t/*var len = */blob.read_shift(4);\n\tblob.l += 4; // must be 0x1\n\to.id = blob.read_shift(0, 'lpp4');\n\to.name = blob.read_shift(0, 'lpp4');\n\to.R = parse_CRYPTOVersion(blob, 4);\n\to.U = parse_CRYPTOVersion(blob, 4);\n\to.W = parse_CRYPTOVersion(blob, 4);\n\treturn o;\n}\n\nfunction parse_Primary(blob) {\n\t/* [MS-OFFCRYPTO] 2.2.6 IRMDSTransformInfo */\n\tvar hdr = parse_TransformInfoHeader(blob);\n\t/* [MS-OFFCRYPTO] 2.1.9 EncryptionTransformInfo */\n\thdr.ename = blob.read_shift(0, '8lpp4');\n\thdr.blksz = blob.read_shift(4);\n\thdr.cmode = blob.read_shift(4);\n\tif(blob.read_shift(4) != 0x04) throw new Error(\"Bad !Primary record\");\n\treturn hdr;\n}\n\n/* [MS-OFFCRYPTO] 2.3.2 Encryption Header */\nfunction parse_EncryptionHeader(blob, length/*:number*/) {\n\tvar tgt = blob.l + length;\n\tvar o = {};\n\to.Flags = (blob.read_shift(4) & 0x3F);\n\tblob.l += 4;\n\to.AlgID = blob.read_shift(4);\n\tvar valid = false;\n\tswitch(o.AlgID) {\n\t\tcase 0x660E: case 0x660F: case 0x6610: valid = (o.Flags == 0x24); break;\n\t\tcase 0x6801: valid = (o.Flags == 0x04); break;\n\t\tcase 0: valid = (o.Flags == 0x10 || o.Flags == 0x04 || o.Flags == 0x24); break;\n\t\tdefault: throw 'Unrecognized encryption algorithm: ' + o.AlgID;\n\t}\n\tif(!valid) throw new Error(\"Encryption Flags/AlgID mismatch\");\n\to.AlgIDHash = blob.read_shift(4);\n\to.KeySize = blob.read_shift(4);\n\to.ProviderType = blob.read_shift(4);\n\tblob.l += 8;\n\to.CSPName = blob.read_shift((tgt-blob.l)>>1, 'utf16le');\n\tblob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.3 Encryption Verifier */\nfunction parse_EncryptionVerifier(blob, length/*:number*/) {\n\tvar o = {}, tgt = blob.l + length;\n\tblob.l += 4; // SaltSize must be 0x10\n\to.Salt = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\to.Verifier = blob.slice(blob.l, blob.l+16); blob.l += 16;\n\t/*var sz = */blob.read_shift(4);\n\to.VerifierHash = blob.slice(blob.l, tgt); blob.l = tgt;\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.* EncryptionInfo Stream */\nfunction parse_EncryptionInfo(blob) {\n\tvar vers = parse_CRYPTOVersion(blob);\n\tswitch(vers.Minor) {\n\t\tcase 0x02: return [vers.Minor, parse_EncInfoStd(blob, vers)];\n\t\tcase 0x03: return [vers.Minor, parse_EncInfoExt(blob, vers)];\n\t\tcase 0x04: return [vers.Minor, parse_EncInfoAgl(blob, vers)];\n\t}\n\tthrow new Error(\"ECMA-376 Encrypted file unrecognized Version: \" + vers.Minor);\n}\n\n/* [MS-OFFCRYPTO] 2.3.4.5 EncryptionInfo Stream (Standard Encryption) */\nfunction parse_EncInfoStd(blob/*::, vers*/) {\n\tvar flags = blob.read_shift(4);\n\tif((flags & 0x3F) != 0x24) throw new Error(\"EncryptionInfo mismatch\");\n\tvar sz = blob.read_shift(4);\n\t//var tgt = blob.l + sz;\n\tvar hdr = parse_EncryptionHeader(blob, sz);\n\tvar verifier = parse_EncryptionVerifier(blob, blob.length - blob.l);\n\treturn { t:\"Std\", h:hdr, v:verifier };\n}\n/* [MS-OFFCRYPTO] 2.3.4.6 EncryptionInfo Stream (Extensible Encryption) */\nfunction parse_EncInfoExt(/*::blob, vers*/) { throw new Error(\"File is password-protected: ECMA-376 Extensible\"); }\n/* [MS-OFFCRYPTO] 2.3.4.10 EncryptionInfo Stream (Agile Encryption) */\nfunction parse_EncInfoAgl(blob/*::, vers*/) {\n\tvar KeyData = [\"saltSize\",\"blockSize\",\"keyBits\",\"hashSize\",\"cipherAlgorithm\",\"cipherChaining\",\"hashAlgorithm\",\"saltValue\"];\n\tblob.l+=4;\n\tvar xml = blob.read_shift(blob.length - blob.l, 'utf8');\n\tvar o = {};\n\txml.replace(tagregex, function xml_agile(x) {\n\t\tvar y/*:any*/ = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\t\t\tcase '': case '': break;\n\n\t\t\tcase '': break;\n\t\t\tcase ' 4 || vers.Major < 2) throw new Error('unrecognized major version code: ' + vers.Major);\n\to.Flags = blob.read_shift(4); length -= 4;\n\tvar sz = blob.read_shift(4); length -= 4;\n\to.EncryptionHeader = parse_EncryptionHeader(blob, sz); length -= sz;\n\to.EncryptionVerifier = parse_EncryptionVerifier(blob, length);\n\treturn o;\n}\n/* [MS-OFFCRYPTO] 2.3.6.1 RC4 Encryption Header */\nfunction parse_RC4Header(blob/*::, length*/) {\n\tvar o = {};\n\tvar vers = o.EncryptionVersionInfo = parse_CRYPTOVersion(blob, 4);\n\tif(vers.Major != 1 || vers.Minor != 1) throw 'unrecognized version code ' + vers.Major + ' : ' + vers.Minor;\n\to.Salt = blob.read_shift(16);\n\to.EncryptedVerifier = blob.read_shift(16);\n\to.EncryptedVerifierHash = blob.read_shift(16);\n\treturn o;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.1 Binary Document Password Verifier Derivation */\nfunction crypto_CreatePasswordVerifier_Method1(Password/*:string*/) {\n\tvar Verifier = 0x0000, PasswordArray;\n\tvar PasswordDecoded = _JS2ANSI(Password);\n\tvar len = PasswordDecoded.length + 1, i, PasswordByte;\n\tvar Intermediate1, Intermediate2, Intermediate3;\n\tPasswordArray = new_raw_buf(len);\n\tPasswordArray[0] = PasswordDecoded.length;\n\tfor(i = 1; i != len; ++i) PasswordArray[i] = PasswordDecoded[i-1];\n\tfor(i = len-1; i >= 0; --i) {\n\t\tPasswordByte = PasswordArray[i];\n\t\tIntermediate1 = ((Verifier & 0x4000) === 0x0000) ? 0 : 1;\n\t\tIntermediate2 = (Verifier << 1) & 0x7FFF;\n\t\tIntermediate3 = Intermediate1 | Intermediate2;\n\t\tVerifier = Intermediate3 ^ PasswordByte;\n\t}\n\treturn Verifier ^ 0xCE4B;\n}\n\n/* [MS-OFFCRYPTO] 2.3.7.2 Binary Document XOR Array Initialization */\nvar crypto_CreateXorArray_Method1 = /*#__PURE__*/(function() {\n\tvar PadArray = [0xBB, 0xFF, 0xFF, 0xBA, 0xFF, 0xFF, 0xB9, 0x80, 0x00, 0xBE, 0x0F, 0x00, 0xBF, 0x0F, 0x00];\n\tvar InitialCode = [0xE1F0, 0x1D0F, 0xCC9C, 0x84C0, 0x110C, 0x0E10, 0xF1CE, 0x313E, 0x1872, 0xE139, 0xD40F, 0x84F9, 0x280C, 0xA96A, 0x4EC3];\n\tvar XorMatrix = [0xAEFC, 0x4DD9, 0x9BB2, 0x2745, 0x4E8A, 0x9D14, 0x2A09, 0x7B61, 0xF6C2, 0xFDA5, 0xEB6B, 0xC6F7, 0x9DCF, 0x2BBF, 0x4563, 0x8AC6, 0x05AD, 0x0B5A, 0x16B4, 0x2D68, 0x5AD0, 0x0375, 0x06EA, 0x0DD4, 0x1BA8, 0x3750, 0x6EA0, 0xDD40, 0xD849, 0xA0B3, 0x5147, 0xA28E, 0x553D, 0xAA7A, 0x44D5, 0x6F45, 0xDE8A, 0xAD35, 0x4A4B, 0x9496, 0x390D, 0x721A, 0xEB23, 0xC667, 0x9CEF, 0x29FF, 0x53FE, 0xA7FC, 0x5FD9, 0x47D3, 0x8FA6, 0x0F6D, 0x1EDA, 0x3DB4, 0x7B68, 0xF6D0, 0xB861, 0x60E3, 0xC1C6, 0x93AD, 0x377B, 0x6EF6, 0xDDEC, 0x45A0, 0x8B40, 0x06A1, 0x0D42, 0x1A84, 0x3508, 0x6A10, 0xAA51, 0x4483, 0x8906, 0x022D, 0x045A, 0x08B4, 0x1168, 0x76B4, 0xED68, 0xCAF1, 0x85C3, 0x1BA7, 0x374E, 0x6E9C, 0x3730, 0x6E60, 0xDCC0, 0xA9A1, 0x4363, 0x86C6, 0x1DAD, 0x3331, 0x6662, 0xCCC4, 0x89A9, 0x0373, 0x06E6, 0x0DCC, 0x1021, 0x2042, 0x4084, 0x8108, 0x1231, 0x2462, 0x48C4];\n\tvar Ror = function(Byte) { return ((Byte/2) | (Byte*128)) & 0xFF; };\n\tvar XorRor = function(byte1, byte2) { return Ror(byte1 ^ byte2); };\n\tvar CreateXorKey_Method1 = function(Password) {\n\t\tvar XorKey = InitialCode[Password.length - 1];\n\t\tvar CurrentElement = 0x68;\n\t\tfor(var i = Password.length-1; i >= 0; --i) {\n\t\t\tvar Char = Password[i];\n\t\t\tfor(var j = 0; j != 7; ++j) {\n\t\t\t\tif(Char & 0x40) XorKey ^= XorMatrix[CurrentElement];\n\t\t\t\tChar *= 2; --CurrentElement;\n\t\t\t}\n\t\t}\n\t\treturn XorKey;\n\t};\n\treturn function(password/*:string*/) {\n\t\tvar Password = _JS2ANSI(password);\n\t\tvar XorKey = CreateXorKey_Method1(Password);\n\t\tvar Index = Password.length;\n\t\tvar ObfuscationArray = new_raw_buf(16);\n\t\tfor(var i = 0; i != 16; ++i) ObfuscationArray[i] = 0x00;\n\t\tvar Temp, PasswordLastChar, PadIndex;\n\t\tif((Index & 1) === 1) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[0], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tPasswordLastChar = Password[Password.length - 1];\n\t\t\tObfuscationArray[Index] = XorRor(PasswordLastChar, Temp);\n\t\t}\n\t\twhile(Index > 0) {\n\t\t\t--Index;\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t}\n\t\tIndex = 15;\n\t\tPadIndex = 15 - Password.length;\n\t\twhile(PadIndex > 0) {\n\t\t\tTemp = XorKey >> 8;\n\t\t\tObfuscationArray[Index] = XorRor(PadArray[PadIndex], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t\tTemp = XorKey & 0xFF;\n\t\t\tObfuscationArray[Index] = XorRor(Password[Index], Temp);\n\t\t\t--Index;\n\t\t\t--PadIndex;\n\t\t}\n\t\treturn ObfuscationArray;\n\t};\n})();\n\n/* [MS-OFFCRYPTO] 2.3.7.3 Binary Document XOR Data Transformation Method 1 */\nvar crypto_DecryptData_Method1 = function(password/*:string*/, Data, XorArrayIndex, XorArray, O) {\n\t/* If XorArray is set, use it; if O is not set, make changes in-place */\n\tif(!O) O = Data;\n\tif(!XorArray) XorArray = crypto_CreateXorArray_Method1(password);\n\tvar Index, Value;\n\tfor(Index = 0; Index != Data.length; ++Index) {\n\t\tValue = Data[Index];\n\t\tValue ^= XorArray[XorArrayIndex];\n\t\tValue = ((Value>>5) | (Value<<3)) & 0xFF;\n\t\tO[Index] = Value;\n\t\t++XorArrayIndex;\n\t}\n\treturn [O, XorArrayIndex, XorArray];\n};\n\nvar crypto_MakeXorDecryptor = function(password/*:string*/) {\n\tvar XorArrayIndex = 0, XorArray = crypto_CreateXorArray_Method1(password);\n\treturn function(Data) {\n\t\tvar O = crypto_DecryptData_Method1(\"\", Data, XorArrayIndex, XorArray);\n\t\tXorArrayIndex = O[1];\n\t\treturn O[0];\n\t};\n};\n\n/* 2.5.343 */\nfunction parse_XORObfuscation(blob, length, opts, out) {\n\tvar o = ({ key: parseuint16(blob), verificationBytes: parseuint16(blob) }/*:any*/);\n\tif(opts.password) o.verifier = crypto_CreatePasswordVerifier_Method1(opts.password);\n\tout.valid = o.verificationBytes === o.verifier;\n\tif(out.valid) out.insitu = crypto_MakeXorDecryptor(opts.password);\n\treturn o;\n}\n\n/* 2.4.117 */\nfunction parse_FilePassHeader(blob, length/*:number*/, oo) {\n\tvar o = oo || {}; o.Info = blob.read_shift(2); blob.l -= 2;\n\tif(o.Info === 1) o.Data = parse_RC4Header(blob, length);\n\telse o.Data = parse_RC4CryptoHeader(blob, length);\n\treturn o;\n}\nfunction parse_FilePass(blob, length/*:number*/, opts) {\n\tvar o = ({ Type: opts.biff >= 8 ? blob.read_shift(2) : 0 }/*:any*/); /* wEncryptionType */\n\tif(o.Type) parse_FilePassHeader(blob, length-2, o);\n\telse parse_XORObfuscation(blob, opts.biff >= 8 ? length : length - 2, opts, o);\n\treturn o;\n}\n\n\nvar RTF = /*#__PURE__*/(function() {\n\tfunction rtf_to_sheet(d/*:RawData*/, opts)/*:Worksheet*/ {\n\t\tswitch(opts.type) {\n\t\t\tcase 'base64': return rtf_to_sheet_str(Base64_decode(d), opts);\n\t\t\tcase 'binary': return rtf_to_sheet_str(d, opts);\n\t\t\tcase 'buffer': return rtf_to_sheet_str(has_buf && Buffer.isBuffer(d) ? d.toString('binary') : a2s(d), opts);\n\t\t\tcase 'array': return rtf_to_sheet_str(cc2str(d), opts);\n\t\t}\n\t\tthrow new Error(\"Unrecognized type \" + opts.type);\n\t}\n\n\t/* TODO: this is a stub */\n\tfunction rtf_to_sheet_str(str/*:string*/, opts)/*:Worksheet*/ {\n\t\tvar o = opts || {};\n\t\tvar ws/*:Worksheet*/ = o.dense ? ([]/*:any*/) : ({}/*:any*/);\n\n\t\tvar rows = str.match(/\\\\trowd.*?\\\\row\\b/g);\n\t\tif(!rows.length) throw new Error(\"RTF missing table\");\n\t\tvar range/*:Range*/ = ({s: {c:0, r:0}, e: {c:0, r:rows.length - 1}}/*:any*/);\n\t\trows.forEach(function(rowtf, R) {\n\t\t\tif(Array.isArray(ws)) ws[R] = [];\n\t\t\tvar rtfre = /\\\\\\w+\\b/g;\n\t\t\tvar last_index = 0;\n\t\t\tvar res;\n\t\t\tvar C = -1;\n\t\t\twhile((res = rtfre.exec(rowtf))) {\n\t\t\t\tswitch(res[0]) {\n\t\t\t\t\tcase \"\\\\cell\":\n\t\t\t\t\t\tvar data = rowtf.slice(last_index, rtfre.lastIndex - res[0].length);\n\t\t\t\t\t\tif(data[0] == \" \") data = data.slice(1);\n\t\t\t\t\t\t++C;\n\t\t\t\t\t\tif(data.length) {\n\t\t\t\t\t\t\t// TODO: value parsing, including codepage adjustments\n\t\t\t\t\t\t\tvar cell = {v: data, t:\"s\"};\n\t\t\t\t\t\t\tif(Array.isArray(ws)) ws[R][C] = cell;\n\t\t\t\t\t\t\telse ws[encode_cell({r:R, c:C})] = cell;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tlast_index = rtfre.lastIndex;\n\t\t\t}\n\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t});\n\t\tws['!ref'] = encode_range(range);\n\t\treturn ws;\n\t}\n\n\tfunction rtf_to_workbook(d/*:RawData*/, opts)/*:Workbook*/ { return sheet_to_workbook(rtf_to_sheet(d, opts), opts); }\n\n\t/* TODO: this is a stub */\n\tfunction sheet_to_rtf(ws/*:Worksheet*//*::, opts*/)/*:string*/ {\n\t\tvar o = [\"{\\\\rtf1\\\\ansi\"];\n\t\tvar r = safe_decode_range(ws['!ref']), cell/*:Cell*/;\n\t\tvar dense = Array.isArray(ws);\n\t\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\t\to.push(\"\\\\trowd\\\\trautofit1\");\n\t\t\tfor(var C = r.s.c; C <= r.e.c; ++C) o.push(\"\\\\cellx\" + (C+1));\n\t\t\to.push(\"\\\\pard\\\\intbl\");\n\t\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\t\tvar coord = encode_cell({r:R,c:C});\n\t\t\t\tcell = dense ? (ws[R]||[])[C]: ws[coord];\n\t\t\t\tif(!cell || cell.v == null && (!cell.f || cell.F)) continue;\n\t\t\t\to.push(\" \" + (cell.w || (format_cell(cell), cell.w)));\n\t\t\t\to.push(\"\\\\cell\");\n\t\t\t}\n\t\t\to.push(\"\\\\pard\\\\intbl\\\\row\");\n\t\t}\n\t\treturn o.join(\"\") + \"}\";\n\t}\n\n\treturn {\n\t\tto_workbook: rtf_to_workbook,\n\t\tto_sheet: rtf_to_sheet,\n\t\tfrom_sheet: sheet_to_rtf\n\t};\n})();\nfunction hex2RGB(h) {\n\tvar o = h.slice(h[0]===\"#\"?1:0).slice(0,6);\n\treturn [parseInt(o.slice(0,2),16),parseInt(o.slice(2,4),16),parseInt(o.slice(4,6),16)];\n}\nfunction rgb2Hex(rgb) {\n\tfor(var i=0,o=1; i!=3; ++i) o = o*256 + (rgb[i]>255?255:rgb[i]<0?0:rgb[i]);\n\treturn o.toString(16).toUpperCase().slice(1);\n}\n\nfunction rgb2HSL(rgb) {\n\tvar R = rgb[0]/255, G = rgb[1]/255, B=rgb[2]/255;\n\tvar M = Math.max(R, G, B), m = Math.min(R, G, B), C = M - m;\n\tif(C === 0) return [0, 0, R];\n\n\tvar H6 = 0, S = 0, L2 = (M + m);\n\tS = C / (L2 > 1 ? 2 - L2 : L2);\n\tswitch(M){\n\t\tcase R: H6 = ((G - B) / C + 6)%6; break;\n\t\tcase G: H6 = ((B - R) / C + 2); break;\n\t\tcase B: H6 = ((R - G) / C + 4); break;\n\t}\n\treturn [H6 / 6, S, L2 / 2];\n}\n\nfunction hsl2RGB(hsl){\n\tvar H = hsl[0], S = hsl[1], L = hsl[2];\n\tvar C = S * 2 * (L < 0.5 ? L : 1 - L), m = L - C/2;\n\tvar rgb = [m,m,m], h6 = 6*H;\n\n\tvar X;\n\tif(S !== 0) switch(h6|0) {\n\t\tcase 0: case 6: X = C * h6; rgb[0] += C; rgb[1] += X; break;\n\t\tcase 1: X = C * (2 - h6); rgb[0] += X; rgb[1] += C; break;\n\t\tcase 2: X = C * (h6 - 2); rgb[1] += C; rgb[2] += X; break;\n\t\tcase 3: X = C * (4 - h6); rgb[1] += X; rgb[2] += C; break;\n\t\tcase 4: X = C * (h6 - 4); rgb[2] += C; rgb[0] += X; break;\n\t\tcase 5: X = C * (6 - h6); rgb[2] += X; rgb[0] += C; break;\n\t}\n\tfor(var i = 0; i != 3; ++i) rgb[i] = Math.round(rgb[i]*255);\n\treturn rgb;\n}\n\n/* 18.8.3 bgColor tint algorithm */\nfunction rgb_tint(hex, tint) {\n\tif(tint === 0) return hex;\n\tvar hsl = rgb2HSL(hex2RGB(hex));\n\tif (tint < 0) hsl[2] = hsl[2] * (1 + tint);\n\telse hsl[2] = 1 - (1 - hsl[2]) * (1 - tint);\n\treturn rgb2Hex(hsl2RGB(hsl));\n}\n\n/* 18.3.1.13 width calculations */\n/* [MS-OI29500] 2.1.595 Column Width & Formatting */\nvar DEF_MDW = 6, MAX_MDW = 15, MIN_MDW = 1, MDW = DEF_MDW;\nfunction width2px(width) { return Math.floor(( width + (Math.round(128/MDW))/256 )* MDW ); }\nfunction px2char(px) { return (Math.floor((px - 5)/MDW * 100 + 0.5))/100; }\nfunction char2width(chr) { return (Math.round((chr * MDW + 5)/MDW*256))/256; }\n//function px2char_(px) { return (((px - 5)/MDW * 100 + 0.5))/100; }\n//function char2width_(chr) { return (((chr * MDW + 5)/MDW*256))/256; }\nfunction cycle_width(collw) { return char2width(px2char(width2px(collw))); }\n/* XLSX/XLSB/XLS specify width in units of MDW */\nfunction find_mdw_colw(collw) {\n\tvar delta = Math.abs(collw - cycle_width(collw)), _MDW = MDW;\n\tif(delta > 0.005) for(MDW=MIN_MDW; MDW 0.5) guess--;\n\t\tif(Math.abs(guess) < delta) { delta = Math.abs(guess); _MDW = MDW; }\n\t}\n\tMDW = _MDW;\n}*/\n\nfunction process_col(coll/*:ColInfo*/) {\n\tif(coll.width) {\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.MDW = MDW;\n\t} else if(coll.wpx) {\n\t\tcoll.wch = px2char(coll.wpx);\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.MDW = MDW;\n\t} else if(typeof coll.wch == 'number') {\n\t\tcoll.width = char2width(coll.wch);\n\t\tcoll.wpx = width2px(coll.width);\n\t\tcoll.MDW = MDW;\n\t}\n\tif(coll.customWidth) delete coll.customWidth;\n}\n\nvar DEF_PPI = 96, PPI = DEF_PPI;\nfunction px2pt(px) { return px * 96 / PPI; }\nfunction pt2px(pt) { return pt * PPI / 96; }\n\n/* [MS-EXSPXML3] 2.4.54 ST_enmPattern */\nvar XLMLPatternTypeMap = {\n\t\"None\": \"none\",\n\t\"Solid\": \"solid\",\n\t\"Gray50\": \"mediumGray\",\n\t\"Gray75\": \"darkGray\",\n\t\"Gray25\": \"lightGray\",\n\t\"HorzStripe\": \"darkHorizontal\",\n\t\"VertStripe\": \"darkVertical\",\n\t\"ReverseDiagStripe\": \"darkDown\",\n\t\"DiagStripe\": \"darkUp\",\n\t\"DiagCross\": \"darkGrid\",\n\t\"ThickDiagCross\": \"darkTrellis\",\n\t\"ThinHorzStripe\": \"lightHorizontal\",\n\t\"ThinVertStripe\": \"lightVertical\",\n\t\"ThinReverseDiagStripe\": \"lightDown\",\n\t\"ThinHorzCross\": \"lightGrid\"\n};\n\n/* 18.8.5 borders CT_Borders */\nfunction parse_borders(t, styles, themes, opts) {\n\tstyles.Borders = [];\n\tvar border = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.4 border CT_Border */\n\t\t\tcase '': case '':\n\t\t\t\tborder = /*::(*/{}/*:: :any)*/;\n\t\t\t\tif(y.diagonalUp) border.diagonalUp = parsexmlbool(y.diagonalUp);\n\t\t\t\tif(y.diagonalDown) border.diagonalDown = parsexmlbool(y.diagonalDown);\n\t\t\t\tstyles.Borders.push(border);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* note: not in spec, appears to be CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.43 top CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.6 bottom CT_BorderPr */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.13 diagonal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.25 horizontal CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.44 vertical CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.37 start CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.16 end CT_BorderPr */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '':\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in borders');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.21 fills CT_Fills */\nfunction parse_fills(t, styles, themes, opts) {\n\tstyles.Fills = [];\n\tvar fill = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.20 fill CT_Fill */\n\t\t\tcase '': case '':\n\t\t\t\tfill = {}; styles.Fills.push(fill); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.24 gradientFill CT_GradientFill */\n\t\t\tcase '': break;\n\t\t\tcase '': styles.Fills.push(fill); fill = {}; break;\n\n\t\t\t/* 18.8.32 patternFill CT_PatternFill */\n\t\t\tcase '':\n\t\t\t\tif(y.patternType) fill.patternType = y.patternType;\n\t\t\t\tbreak;\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.3 bgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.19 fgColor CT_Color */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.38 stop CT_GradientStop */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.? color CT_Color */\n\t\t\tcase '': break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fills');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.23 fonts CT_Fonts */\nfunction parse_fonts(t, styles, themes, opts) {\n\tstyles.Fonts = [];\n\tvar font = {};\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.22 font CT_Font */\n\t\t\tcase '': break;\n\t\t\tcase '': case '':\n\t\t\t\tstyles.Fonts.push(font);\n\t\t\t\tfont = {};\n\t\t\t\tbreak;\n\n\t\t\t/* 18.8.29 name CT_FontName */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.2 b CT_BooleanProperty */\n\t\t\tcase '': font.bold = 1; break;\n\n\t\t\t/* 18.8.26 i CT_BooleanProperty */\n\t\t\tcase '': font.italic = 1; break;\n\n\t\t\t/* 18.4.13 u CT_UnderlineProperty */\n\t\t\tcase '': font.underline = 1; break;\n\n\t\t\t/* 18.4.10 strike CT_BooleanProperty */\n\t\t\tcase '': font.strike = 1; break;\n\n\t\t\t/* 18.4.2 outline CT_BooleanProperty */\n\t\t\tcase '': font.outline = 1; break;\n\n\t\t\t/* 18.8.36 shadow CT_BooleanProperty */\n\t\t\tcase '': font.shadow = 1; break;\n\n\t\t\t/* 18.8.12 condense CT_BooleanProperty */\n\t\t\tcase '': font.condense = 1; break;\n\n\t\t\t/* 18.8.17 extend CT_BooleanProperty */\n\t\t\tcase '': font.extend = 1; break;\n\n\t\t\t/* 18.4.11 sz CT_FontSize */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.14 vertAlign CT_VerticalAlignFontProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.18 family CT_FontFamily */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.8.35 scheme CT_FontScheme */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.4.1 charset CT_IntProperty */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in fonts');\n\t\t\t}\n\t\t}\n\t});\n}\n\n/* 18.8.31 numFmts CT_NumFmts */\nfunction parse_numFmts(t, styles, opts) {\n\tstyles.NumberFmt = [];\n\tvar k/*Array*/ = (keys(table_fmt)/*:any*/);\n\tfor(var i=0; i < k.length; ++i) styles.NumberFmt[k[i]] = table_fmt[k[i]];\n\tvar m = t[0].match(tagregex);\n\tif(!m) return;\n\tfor(i=0; i < m.length; ++i) {\n\t\tvar y = parsexmltag(m[i]);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\t\t\tcase '0) {\n\t\t\t\t\tif(j > 0x188) {\n\t\t\t\t\t\tfor(j = 0x188; j > 0x3c; --j) if(styles.NumberFmt[j] == null) break;\n\t\t\t\t\t\tstyles.NumberFmt[j] = f;\n\t\t\t\t\t}\n\t\t\t\t\tSSF_load(f,j);\n\t\t\t\t}\n\t\t\t} break;\n\t\t\tcase '': break;\n\t\t\tdefault: if(opts.WTF) throw new Error('unrecognized ' + y[0] + ' in numFmts');\n\t\t}\n\t}\n}\n\nfunction write_numFmts(NF/*:{[n:number|string]:string}*//*::, opts*/) {\n\tvar o = [\"\"];\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) o[o.length] = (writextag('numFmt',null,{numFmtId:i,formatCode:escapexml(NF[i])}));\n\t});\n\tif(o.length === 1) return \"\";\n\to[o.length] = (\"\");\n\to[0] = writextag('numFmts', null, { count:o.length-2 }).replace(\"/>\", \">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8.10 cellXfs CT_CellXfs */\nvar cellXF_uint = [ \"numFmtId\", \"fillId\", \"fontId\", \"borderId\", \"xfId\" ];\nvar cellXF_bool = [ \"applyAlignment\", \"applyBorder\", \"applyFill\", \"applyFont\", \"applyNumberFormat\", \"applyProtection\", \"pivotButton\", \"quotePrefix\" ];\nfunction parse_cellXfs(t, styles, opts) {\n\tstyles.CellXf = [];\n\tvar xf;\n\tvar pass = false;\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x), i = 0;\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.8.45 xf CT_Xf */\n\t\t\tcase '':\n\t\t\t\txf = y;\n\t\t\t\tdelete xf[0];\n\t\t\t\tfor(i = 0; i < cellXF_uint.length; ++i) if(xf[cellXF_uint[i]])\n\t\t\t\t\txf[cellXF_uint[i]] = parseInt(xf[cellXF_uint[i]], 10);\n\t\t\t\tfor(i = 0; i < cellXF_bool.length; ++i) if(xf[cellXF_bool[i]])\n\t\t\t\t\txf[cellXF_bool[i]] = parsexmlbool(xf[cellXF_bool[i]]);\n\t\t\t\tif(styles.NumberFmt && xf.numFmtId > 0x188) {\n\t\t\t\t\tfor(i = 0x188; i > 0x3c; --i) if(styles.NumberFmt[xf.numFmtId] == styles.NumberFmt[i]) { xf.numFmtId = i; break; }\n\t\t\t\t}\n\t\t\t\tstyles.CellXf.push(xf); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.1 alignment CT_CellAlignment */\n\t\t\tcase '':\n\t\t\t\tvar alignment = {};\n\t\t\t\tif(y.vertical) alignment.vertical = y.vertical;\n\t\t\t\tif(y.horizontal) alignment.horizontal = y.horizontal;\n\t\t\t\tif(y.textRotation != null) alignment.textRotation = y.textRotation;\n\t\t\t\tif(y.indent) alignment.indent = y.indent;\n\t\t\t\tif(y.wrapText) alignment.wrapText = parsexmlbool(y.wrapText);\n\t\t\t\txf.alignment = alignment;\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.8.33 protection CT_CellProtection */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* note: sometimes mc:AlternateContent appears bare */\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': break;\n\t\t\tcase '': pass = false; break;\n\t\t\tdefault: if(opts && opts.WTF) {\n\t\t\t\tif(!pass) throw new Error('unrecognized ' + y[0] + ' in cellXfs');\n\t\t\t}\n\t\t}\n\t});\n}\n\nfunction write_cellXfs(cellXfs)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\to[o.length] = (writextag('cellXfs',null));\n\tcellXfs.forEach(function(c) {\n\t\to[o.length] = (writextag('xf', null, c));\n\t});\n\to[o.length] = (\"\");\n\tif(o.length === 2) return \"\";\n\to[0] = writextag('cellXfs',null, {count:o.length-2}).replace(\"/>\",\">\");\n\treturn o.join(\"\");\n}\n\n/* 18.8 Styles CT_Stylesheet*/\nvar parse_sty_xml= /*#__PURE__*/(function make_pstyx() {\nvar numFmtRegex = /<(?:\\w+:)?numFmts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?numFmts>/;\nvar cellXfRegex = /<(?:\\w+:)?cellXfs([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?cellXfs>/;\nvar fillsRegex = /<(?:\\w+:)?fills([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fills>/;\nvar fontsRegex = /<(?:\\w+:)?fonts([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?fonts>/;\nvar bordersRegex = /<(?:\\w+:)?borders([^>]*)>[\\S\\s]*?<\\/(?:\\w+:)?borders>/;\n\nreturn function parse_sty_xml(data, themes, opts) {\n\tvar styles = {};\n\tif(!data) return styles;\n\tdata = data.replace(//mg,\"\").replace(//gm,\"\");\n\t/* 18.8.39 styleSheet CT_Stylesheet */\n\tvar t;\n\n\t/* 18.8.31 numFmts CT_NumFmts ? */\n\tif((t=data.match(numFmtRegex))) parse_numFmts(t, styles, opts);\n\n\t/* 18.8.23 fonts CT_Fonts ? */\n\tif((t=data.match(fontsRegex))) parse_fonts(t, styles, themes, opts);\n\n\t/* 18.8.21 fills CT_Fills ? */\n\tif((t=data.match(fillsRegex))) parse_fills(t, styles, themes, opts);\n\n\t/* 18.8.5 borders CT_Borders ? */\n\tif((t=data.match(bordersRegex))) parse_borders(t, styles, themes, opts);\n\n\t/* 18.8.9 cellStyleXfs CT_CellStyleXfs ? */\n\t/* 18.8.8 cellStyles CT_CellStyles ? */\n\n\t/* 18.8.10 cellXfs CT_CellXfs ? */\n\tif((t=data.match(cellXfRegex))) parse_cellXfs(t, styles, opts);\n\n\t/* 18.8.15 dxfs CT_Dxfs ? */\n\t/* 18.8.42 tableStyles CT_TableStyles ? */\n\t/* 18.8.11 colors CT_Colors ? */\n\t/* 18.2.10 extLst CT_ExtensionList ? */\n\n\treturn styles;\n};\n})();\n\nfunction write_sty_xml(wb/*:Workbook*/, opts)/*:string*/ {\n\tvar o = [XML_HEADER, writextag('styleSheet', null, {\n\t\t'xmlns': XMLNS_main[0],\n\t\t'xmlns:vt': XMLNS.vt\n\t})], w;\n\tif(wb.SSF && (w = write_numFmts(wb.SSF)) != null) o[o.length] = w;\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\tif((w = write_cellXfs(opts.cellXfs))) o[o.length] = (w);\n\to[o.length] = ('');\n\to[o.length] = ('');\n\to[o.length] = ('');\n\n\tif(o.length>2){ o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.657 BrtFmt */\nfunction parse_BrtFmt(data, length/*:number*/) {\n\tvar numFmtId = data.read_shift(2);\n\tvar stFmtCode = parse_XLWideString(data,length-2);\n\treturn [numFmtId, stFmtCode];\n}\nfunction write_BrtFmt(i/*:number*/, f/*:string*/, o) {\n\tif(!o) o = new_buf(6 + 4 * f.length);\n\to.write_shift(2, i);\n\twrite_XLWideString(f, o);\n\tvar out = (o.length > o.l) ? o.slice(0, o.l) : o;\n\tif(o.l == null) o.l = o.length;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.4.659 BrtFont TODO */\nfunction parse_BrtFont(data, length/*:number*/, opts) {\n\tvar out = ({}/*:any*/);\n\n\tout.sz = data.read_shift(2) / 20;\n\n\tvar grbit = parse_FontFlags(data, 2, opts);\n\tif(grbit.fItalic) out.italic = 1;\n\tif(grbit.fCondense) out.condense = 1;\n\tif(grbit.fExtend) out.extend = 1;\n\tif(grbit.fShadow) out.shadow = 1;\n\tif(grbit.fOutline) out.outline = 1;\n\tif(grbit.fStrikeout) out.strike = 1;\n\n\tvar bls = data.read_shift(2);\n\tif(bls === 0x02BC) out.bold = 1;\n\n\tswitch(data.read_shift(2)) {\n\t\t/* case 0: out.vertAlign = \"baseline\"; break; */\n\t\tcase 1: out.vertAlign = \"superscript\"; break;\n\t\tcase 2: out.vertAlign = \"subscript\"; break;\n\t}\n\n\tvar underline = data.read_shift(1);\n\tif(underline != 0) out.underline = underline;\n\n\tvar family = data.read_shift(1);\n\tif(family > 0) out.family = family;\n\n\tvar bCharSet = data.read_shift(1);\n\tif(bCharSet > 0) out.charset = bCharSet;\n\n\tdata.l++;\n\tout.color = parse_BrtColor(data, 8);\n\n\tswitch(data.read_shift(1)) {\n\t\t/* case 0: out.scheme = \"none\": break; */\n\t\tcase 1: out.scheme = \"major\"; break;\n\t\tcase 2: out.scheme = \"minor\"; break;\n\t}\n\n\tout.name = parse_XLWideString(data, length - 21);\n\n\treturn out;\n}\nfunction write_BrtFont(font/*:any*/, o) {\n\tif(!o) o = new_buf(25+4*32);\n\to.write_shift(2, font.sz * 20);\n\twrite_FontFlags(font, o);\n\to.write_shift(2, font.bold ? 0x02BC : 0x0190);\n\tvar sss = 0;\n\tif(font.vertAlign == \"superscript\") sss = 1;\n\telse if(font.vertAlign == \"subscript\") sss = 2;\n\to.write_shift(2, sss);\n\to.write_shift(1, font.underline || 0);\n\to.write_shift(1, font.family || 0);\n\to.write_shift(1, font.charset || 0);\n\to.write_shift(1, 0);\n\twrite_BrtColor(font.color, o);\n\tvar scheme = 0;\n\tif(font.scheme == \"major\") scheme = 1;\n\tif(font.scheme == \"minor\") scheme = 2;\n\to.write_shift(1, scheme);\n\twrite_XLWideString(font.name, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.650 BrtFill */\nvar XLSBFillPTNames = [\n\t\"none\",\n\t\"solid\",\n\t\"mediumGray\",\n\t\"darkGray\",\n\t\"lightGray\",\n\t\"darkHorizontal\",\n\t\"darkVertical\",\n\t\"darkDown\",\n\t\"darkUp\",\n\t\"darkGrid\",\n\t\"darkTrellis\",\n\t\"lightHorizontal\",\n\t\"lightVertical\",\n\t\"lightDown\",\n\t\"lightUp\",\n\t\"lightGrid\",\n\t\"lightTrellis\",\n\t\"gray125\",\n\t\"gray0625\"\n];\nvar rev_XLSBFillPTNames/*:EvertNumType*/;\n/* TODO: gradient fill representation */\nvar parse_BrtFill = parsenoop;\nfunction write_BrtFill(fill, o) {\n\tif(!o) o = new_buf(4*3 + 8*7 + 16*1);\n\tif(!rev_XLSBFillPTNames) rev_XLSBFillPTNames = (evert(XLSBFillPTNames)/*:any*/);\n\tvar fls/*:number*/ = rev_XLSBFillPTNames[fill.patternType];\n\tif(fls == null) fls = 0x28;\n\to.write_shift(4, fls);\n\tvar j = 0;\n\tif(fls != 0x28) {\n\t\t/* TODO: custom FG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\t\t/* TODO: custom BG Color */\n\t\twrite_BrtColor({auto:1}, o);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0);\n\t} else {\n\t\tfor(; j < 4; ++j) o.write_shift(4, 0);\n\n\t\tfor(; j < 12; ++j) o.write_shift(4, 0); /* TODO */\n\t\t/* iGradientType */\n\t\t/* xnumDegree */\n\t\t/* xnumFillToLeft */\n\t\t/* xnumFillToRight */\n\t\t/* xnumFillToTop */\n\t\t/* xnumFillToBottom */\n\t\t/* cNumStop */\n\t\t/* xfillGradientStop */\n\t}\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.824 BrtXF */\nfunction parse_BrtXF(data, length/*:number*/) {\n\tvar tgt = data.l + length;\n\tvar ixfeParent = data.read_shift(2);\n\tvar ifmt = data.read_shift(2);\n\tdata.l = tgt;\n\treturn {ixfe:ixfeParent, numFmtId:ifmt };\n}\nfunction write_BrtXF(data, ixfeP, o) {\n\tif(!o) o = new_buf(16);\n\to.write_shift(2, ixfeP||0);\n\to.write_shift(2, data.numFmtId||0);\n\to.write_shift(2, 0); /* iFont */\n\to.write_shift(2, 0); /* iFill */\n\to.write_shift(2, 0); /* ixBorder */\n\to.write_shift(1, 0); /* trot */\n\to.write_shift(1, 0); /* indent */\n\tvar flow = 0;\n\to.write_shift(1, flow); /* flags */\n\to.write_shift(1, 0); /* flags */\n\to.write_shift(1, 0); /* xfGrbitAtr */\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.5.4 Blxf TODO */\nfunction write_Blxf(data, o) {\n\tif(!o) o = new_buf(10);\n\to.write_shift(1, 0); /* dg */\n\to.write_shift(1, 0);\n\to.write_shift(4, 0); /* color */\n\to.write_shift(4, 0); /* color */\n\treturn o;\n}\n/* [MS-XLSB] 2.4.302 BrtBorder TODO */\nvar parse_BrtBorder = parsenoop;\nfunction write_BrtBorder(border, o) {\n\tif(!o) o = new_buf(51);\n\to.write_shift(1, 0); /* diagonal */\n\twrite_Blxf(null, o); /* top */\n\twrite_Blxf(null, o); /* bottom */\n\twrite_Blxf(null, o); /* left */\n\twrite_Blxf(null, o); /* right */\n\twrite_Blxf(null, o); /* diag */\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.763 BrtStyle TODO */\nfunction write_BrtStyle(style, o) {\n\tif(!o) o = new_buf(12+4*10);\n\to.write_shift(4, style.xfId);\n\to.write_shift(2, 1);\n\to.write_shift(1, +style.builtinId);\n\to.write_shift(1, 0); /* iLevel */\n\twrite_XLNullableWideString(style.name || \"\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.272 BrtBeginTableStyles */\nfunction write_BrtBeginTableStyles(cnt, defTableStyle, defPivotStyle) {\n\tvar o = new_buf(4+256*2*4);\n\to.write_shift(4, cnt);\n\twrite_XLNullableWideString(defTableStyle, o);\n\twrite_XLNullableWideString(defPivotStyle, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction parse_sty_bin(data, themes, opts) {\n\tvar styles = {};\n\tstyles.NumberFmt = ([]/*:any*/);\n\tfor(var y in table_fmt) styles.NumberFmt[y] = table_fmt[y];\n\n\tstyles.CellXf = [];\n\tstyles.Fonts = [];\n\tvar state/*:Array*/ = [];\n\tvar pass = false;\n\trecordhopper(data, function hopper_sty(val, R, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x002C: /* BrtFmt */\n\t\t\t\tstyles.NumberFmt[val[0]] = val[1]; SSF_load(val[1], val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x002B: /* BrtFont */\n\t\t\t\tstyles.Fonts.push(val);\n\t\t\t\tif(val.color.theme != null && themes && themes.themeElements && themes.themeElements.clrScheme) {\n\t\t\t\t\tval.color.rgb = rgb_tint(themes.themeElements.clrScheme[val.color.theme].rgb, val.color.tint || 0);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0401: /* BrtKnownFonts */ break;\n\t\t\tcase 0x002D: /* BrtFill */\n\t\t\t\tbreak;\n\t\t\tcase 0x002E: /* BrtBorder */\n\t\t\t\tbreak;\n\t\t\tcase 0x002F: /* BrtXF */\n\t\t\t\tif(state[state.length - 1] == 0x0269 /* BrtBeginCellXFs */) {\n\t\t\t\t\tstyles.CellXf.push(val);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 0x0030: /* BrtStyle */\n\t\t\tcase 0x01FB: /* BrtDXF */\n\t\t\tcase 0x023C: /* BrtMRUColor */\n\t\t\tcase 0x01DB: /* BrtIndexedColor */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0493: /* BrtDXF14 */\n\t\t\tcase 0x0836: /* BrtDXF15 */\n\t\t\tcase 0x046A: /* BrtSlicerStyleElement */\n\t\t\tcase 0x0200: /* BrtTableStyleElement */\n\t\t\tcase 0x082F: /* BrtTimelineStyleElement */\n\t\t\tcase 0x0C00: /* BrtUid */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* BrtFRTBegin */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* BrtFRTEnd */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* BrtACBegin */\n\t\t\t\tstate.push(RT); pass = true; break;\n\t\t\tcase 0x0026: /* BrtACEnd */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif(R.T > 0) state.push(RT);\n\t\t\t\telse if(R.T < 0) state.pop();\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != 0x0025 /* BrtACBegin */)) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t});\n\treturn styles;\n}\n\nfunction write_FMTS_bin(ba, NF/*:?SSFTable*/) {\n\tif(!NF) return;\n\tvar cnt = 0;\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\n\t\t/*:: if(!NF) return; */\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) ++cnt;\n\t});\n\n\tif(cnt == 0) return;\n\twrite_record(ba, 0x0267 /* BrtBeginFmts */, write_UInt32LE(cnt));\n\t[[5,8],[23,26],[41,44],[/*63*/50,/*66],[164,*/392]].forEach(function(r) {\n\t\t/*:: if(!NF) return; */\n\t\tfor(var i = r[0]; i <= r[1]; ++i) if(NF[i] != null) write_record(ba, 0x002C /* BrtFmt */, write_BrtFmt(i, NF[i]));\n\t});\n\twrite_record(ba, 0x0268 /* BrtEndFmts */);\n}\n\nfunction write_FONTS_bin(ba/*::, data*/) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, 0x0263 /* BrtBeginFonts */, write_UInt32LE(cnt));\n\twrite_record(ba, 0x002B /* BrtFont */, write_BrtFont({\n\t\tsz:12,\n\t\tcolor: {theme:1},\n\t\tname: \"Calibri\",\n\t\tfamily: 2,\n\t\tscheme: \"minor\"\n\t}));\n\t/* 1*65491BrtFont [ACFONTS] */\n\twrite_record(ba, 0x0264 /* BrtEndFonts */);\n}\n\nfunction write_FILLS_bin(ba/*::, data*/) {\n\tvar cnt = 2;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, 0x025B /* BrtBeginFills */, write_UInt32LE(cnt));\n\twrite_record(ba, 0x002D /* BrtFill */, write_BrtFill({patternType:\"none\"}));\n\twrite_record(ba, 0x002D /* BrtFill */, write_BrtFill({patternType:\"gray125\"}));\n\t/* 1*65431BrtFill */\n\twrite_record(ba, 0x025C /* BrtEndFills */);\n}\n\nfunction write_BORDERS_bin(ba/*::, data*/) {\n\tvar cnt = 1;\n\n\tif(cnt == 0) return;\n\twrite_record(ba, 0x0265 /* BrtBeginBorders */, write_UInt32LE(cnt));\n\twrite_record(ba, 0x002E /* BrtBorder */, write_BrtBorder({}));\n\t/* 1*65430BrtBorder */\n\twrite_record(ba, 0x0266 /* BrtEndBorders */);\n}\n\nfunction write_CELLSTYLEXFS_bin(ba/*::, data*/) {\n\tvar cnt = 1;\n\twrite_record(ba, 0x0272 /* BrtBeginCellStyleXFs */, write_UInt32LE(cnt));\n\twrite_record(ba, 0x002F /* BrtXF */, write_BrtXF({\n\t\tnumFmtId: 0,\n\t\tfontId: 0,\n\t\tfillId: 0,\n\t\tborderId: 0\n\t}, 0xFFFF));\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, 0x0273 /* BrtEndCellStyleXFs */);\n}\n\nfunction write_CELLXFS_bin(ba, data) {\n\twrite_record(ba, 0x0269 /* BrtBeginCellXFs */, write_UInt32LE(data.length));\n\tdata.forEach(function(c) { write_record(ba, 0x002F /* BrtXF */, write_BrtXF(c,0)); });\n\t/* 1*65430(BrtXF *FRT) */\n\twrite_record(ba, 0x026A /* BrtEndCellXFs */);\n}\n\nfunction write_STYLES_bin(ba/*::, data*/) {\n\tvar cnt = 1;\n\n\twrite_record(ba, 0x026B /* BrtBeginStyles */, write_UInt32LE(cnt));\n\twrite_record(ba, 0x0030 /* BrtStyle */, write_BrtStyle({\n\t\txfId:0,\n\t\tbuiltinId:0,\n\t\tname:\"Normal\"\n\t}));\n\t/* 1*65430(BrtStyle *FRT) */\n\twrite_record(ba, 0x026C /* BrtEndStyles */);\n}\n\nfunction write_DXFS_bin(ba/*::, data*/) {\n\tvar cnt = 0;\n\n\twrite_record(ba, 0x01F9 /* BrtBeginDXFs */, write_UInt32LE(cnt));\n\t/* *2147483647(BrtDXF *FRT) */\n\twrite_record(ba, 0x01FA /* BrtEndDXFs */);\n}\n\nfunction write_TABLESTYLES_bin(ba/*::, data*/) {\n\tvar cnt = 0;\n\n\twrite_record(ba, 0x01FC /* BrtBeginTableStyles */, write_BrtBeginTableStyles(cnt, \"TableStyleMedium9\", \"PivotStyleMedium4\"));\n\t/* *TABLESTYLE */\n\twrite_record(ba, 0x01FD /* BrtEndTableStyles */);\n}\n\nfunction write_COLORPALETTE_bin(/*::ba, data*/) {\n\treturn;\n\t/* BrtBeginColorPalette [INDEXEDCOLORS] [MRUCOLORS] BrtEndColorPalette */\n}\n\n/* [MS-XLSB] 2.1.7.50 Styles */\nfunction write_sty_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, 0x0116 /* BrtBeginStyleSheet */);\n\twrite_FMTS_bin(ba, wb.SSF);\n\twrite_FONTS_bin(ba, wb);\n\twrite_FILLS_bin(ba, wb);\n\twrite_BORDERS_bin(ba, wb);\n\twrite_CELLSTYLEXFS_bin(ba, wb);\n\twrite_CELLXFS_bin(ba, opts.cellXfs);\n\twrite_STYLES_bin(ba, wb);\n\twrite_DXFS_bin(ba, wb);\n\twrite_TABLESTYLES_bin(ba, wb);\n\twrite_COLORPALETTE_bin(ba, wb);\n\t/* FRTSTYLESHEET*/\n\twrite_record(ba, 0x0117 /* BrtEndStyleSheet */);\n\treturn ba.end();\n}\n/* Even though theme layout is dk1 lt1 dk2 lt2, true order is lt1 dk1 lt2 dk2 */\nvar XLSXThemeClrScheme = [\n\t'', '', '', '',\n\t'', '', '',\n\t'', '', '',\n\t'', ''\n];\n/* 20.1.6.2 clrScheme CT_ColorScheme */\nfunction parse_clrScheme(t, themes, opts) {\n\tthemes.themeElements.clrScheme = [];\n\tvar color = {};\n\t(t[0].match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\t/* 20.1.6.2 clrScheme (Color Scheme) CT_ColorScheme */\n\t\t\tcase '': break;\n\n\t\t\t/* 20.1.2.3.32 srgbClr CT_SRgbColor */\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\tcase '': case '':\n\t\t\t\tif (y[0].charAt(1) === '/') {\n\t\t\t\t\tthemes.themeElements.clrScheme[XLSXThemeClrScheme.indexOf(y[0])] = color;\n\t\t\t\t\tcolor = {};\n\t\t\t\t} else {\n\t\t\t\t\tcolor.name = y[0].slice(3, y[0].length - 1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault: if(opts && opts.WTF) throw new Error('Unrecognized ' + y[0] + ' in clrScheme');\n\t\t}\n\t});\n}\n\n/* 20.1.4.1.18 fontScheme CT_FontScheme */\nfunction parse_fontScheme(/*::t, themes, opts*/) { }\n\n/* 20.1.4.1.15 fmtScheme CT_StyleMatrix */\nfunction parse_fmtScheme(/*::t, themes, opts*/) { }\n\nvar clrsregex = /]*)>[\\s\\S]*<\\/a:clrScheme>/;\nvar fntsregex = /]*)>[\\s\\S]*<\\/a:fontScheme>/;\nvar fmtsregex = /]*)>[\\s\\S]*<\\/a:fmtScheme>/;\n\n/* 20.1.6.10 themeElements CT_BaseStyles */\nfunction parse_themeElements(data, themes, opts) {\n\tthemes.themeElements = {};\n\n\tvar t;\n\n\t[\n\t\t/* clrScheme CT_ColorScheme */\n\t\t['clrScheme', clrsregex, parse_clrScheme],\n\t\t/* fontScheme CT_FontScheme */\n\t\t['fontScheme', fntsregex, parse_fontScheme],\n\t\t/* fmtScheme CT_StyleMatrix */\n\t\t['fmtScheme', fmtsregex, parse_fmtScheme]\n\t].forEach(function(m) {\n\t\tif(!(t=data.match(m[1]))) throw new Error(m[0] + ' not found in themeElements');\n\t\tm[2](t, themes, opts);\n\t});\n}\n\nvar themeltregex = /]*)>[\\s\\S]*<\\/a:themeElements>/;\n\n/* 14.2.7 Theme Part */\nfunction parse_theme_xml(data/*:string*/, opts) {\n\t/* 20.1.6.9 theme CT_OfficeStyleSheet */\n\tif(!data || data.length === 0) data = write_theme();\n\n\tvar t;\n\tvar themes = {};\n\n\t/* themeElements CT_BaseStyles */\n\tif(!(t=data.match(themeltregex))) throw new Error('themeElements not found in theme');\n\tparse_themeElements(t[0], themes, opts);\n\tthemes.raw = data;\n\treturn themes;\n}\n\nfunction write_theme(Themes, opts)/*:string*/ {\n\tif(opts && opts.themeXLSX) return opts.themeXLSX;\n\tif(Themes && typeof Themes.raw == \"string\") return Themes.raw;\n\tvar o = [XML_HEADER];\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\to[o.length] = '';\n\treturn o.join(\"\");\n}\n/* [MS-XLS] 2.4.326 TODO: payload is a zip file */\nfunction parse_Theme(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar dwThemeVersion = blob.read_shift(4);\n\tif(dwThemeVersion === 124226) return;\n\tif(!opts.cellStyles) { blob.l = end; return; }\n\tvar data = blob.slice(blob.l);\n\tblob.l = end;\n\tvar zip; try { zip = zip_read(data, {type: \"array\"}); } catch(e) { return; }\n\tvar themeXML = getzipstr(zip, \"theme/theme/theme1.xml\", true);\n\tif(!themeXML) return;\n\treturn parse_theme_xml(themeXML, opts);\n}\n\n/* 2.5.49 */\nfunction parse_ColorTheme(blob/*::, length*/) { return blob.read_shift(4); }\n\n/* 2.5.155 */\nfunction parse_FullColorExt(blob/*::, length*/) {\n\tvar o = {};\n\to.xclrType = blob.read_shift(2);\n\to.nTintShade = blob.read_shift(2);\n\tswitch(o.xclrType) {\n\t\tcase 0: blob.l += 4; break;\n\t\tcase 1: o.xclrValue = parse_IcvXF(blob, 4); break;\n\t\tcase 2: o.xclrValue = parse_LongRGBA(blob, 4); break;\n\t\tcase 3: o.xclrValue = parse_ColorTheme(blob, 4); break;\n\t\tcase 4: blob.l += 4; break;\n\t}\n\tblob.l += 8;\n\treturn o;\n}\n\n/* 2.5.164 TODO: read 7 bits*/\nfunction parse_IcvXF(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* 2.5.280 */\nfunction parse_XFExtGradient(blob, length) {\n\treturn parsenoop(blob, length);\n}\n\n/* [MS-XLS] 2.5.108 */\nfunction parse_ExtProp(blob/*::, length*/)/*:Array*/ {\n\tvar extType = blob.read_shift(2);\n\tvar cb = blob.read_shift(2) - 4;\n\tvar o = [extType];\n\tswitch(extType) {\n\t\tcase 0x04: case 0x05: case 0x07: case 0x08:\n\t\tcase 0x09: case 0x0A: case 0x0B: case 0x0D:\n\t\t\to[1] = parse_FullColorExt(blob, cb); break;\n\t\tcase 0x06: o[1] = parse_XFExtGradient(blob, cb); break;\n\t\tcase 0x0E: case 0x0F: o[1] = blob.read_shift(cb === 1 ? 1 : 2); break;\n\t\tdefault: throw new Error(\"Unrecognized ExtProp type: \" + extType + \" \" + cb);\n\t}\n\treturn o;\n}\n\n/* 2.4.355 */\nfunction parse_XFExt(blob, length) {\n\tvar end = blob.l + length;\n\tblob.l += 2;\n\tvar ixfe = blob.read_shift(2);\n\tblob.l += 2;\n\tvar cexts = blob.read_shift(2);\n\tvar ext/*:AOA*/ = [];\n\twhile(cexts-- > 0) ext.push(parse_ExtProp(blob, end-blob.l));\n\treturn {ixfe:ixfe, ext:ext};\n}\n\n/* xf is an XF, see parse_XFExt for xfext */\nfunction update_xfext(xf, xfext) {\n\txfext.forEach(function(xfe) {\n\t\tswitch(xfe[0]) { /* 2.5.108 extPropData */\n\t\t\tcase 0x04: break; /* foreground color */\n\t\t\tcase 0x05: break; /* background color */\n\t\t\tcase 0x06: break; /* gradient fill */\n\t\t\tcase 0x07: break; /* top cell border color */\n\t\t\tcase 0x08: break; /* bottom cell border color */\n\t\t\tcase 0x09: break; /* left cell border color */\n\t\t\tcase 0x0a: break; /* right cell border color */\n\t\t\tcase 0x0b: break; /* diagonal cell border color */\n\t\t\tcase 0x0d: /* text color */\n\t\t\t\tbreak;\n\t\t\tcase 0x0e: break; /* font scheme */\n\t\t\tcase 0x0f: break; /* indentation level */\n\t\t}\n\t});\n}\n\nfunction parse_BrtMdtinfo(data, length) {\n return {\n flags: data.read_shift(4),\n version: data.read_shift(4),\n name: parse_XLWideString(data, length - 8)\n };\n}\nfunction write_BrtMdtinfo(data) {\n var o = new_buf(12 + 2 * data.name.length);\n o.write_shift(4, data.flags);\n o.write_shift(4, data.version);\n write_XLWideString(data.name, o);\n return o.slice(0, o.l);\n}\nfunction parse_BrtMdb(data) {\n var out = [];\n var cnt = data.read_shift(4);\n while (cnt-- > 0)\n out.push([data.read_shift(4), data.read_shift(4)]);\n return out;\n}\nfunction write_BrtMdb(mdb) {\n var o = new_buf(4 + 8 * mdb.length);\n o.write_shift(4, mdb.length);\n for (var i = 0; i < mdb.length; ++i) {\n o.write_shift(4, mdb[i][0]);\n o.write_shift(4, mdb[i][1]);\n }\n return o;\n}\nfunction write_BrtBeginEsfmd(cnt, name) {\n var o = new_buf(8 + 2 * name.length);\n o.write_shift(4, cnt);\n write_XLWideString(name, o);\n return o.slice(0, o.l);\n}\nfunction parse_BrtBeginEsmdb(data) {\n data.l += 4;\n return data.read_shift(4) != 0;\n}\nfunction write_BrtBeginEsmdb(cnt, cm) {\n var o = new_buf(8);\n o.write_shift(4, cnt);\n o.write_shift(4, cm ? 1 : 0);\n return o;\n}\nfunction parse_xlmeta_bin(data, name, _opts) {\n var out = { Types: [], Cell: [], Value: [] };\n var opts = _opts || {};\n var state = [];\n var pass = false;\n var metatype = 2;\n recordhopper(data, function(val, R, RT) {\n switch (RT) {\n case 335:\n out.Types.push({ name: val.name });\n break;\n case 51:\n val.forEach(function(r) {\n if (metatype == 1)\n out.Cell.push({ type: out.Types[r[0] - 1].name, index: r[1] });\n else if (metatype == 0)\n out.Value.push({ type: out.Types[r[0] - 1].name, index: r[1] });\n });\n break;\n case 337:\n metatype = val ? 1 : 0;\n break;\n case 338:\n metatype = 2;\n break;\n case 35:\n state.push(RT);\n pass = true;\n break;\n case 36:\n state.pop();\n pass = false;\n break;\n default:\n if (R.T) {\n } else if (!pass || opts.WTF && state[state.length - 1] != 35)\n throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n }\n });\n return out;\n}\nfunction write_xlmeta_bin() {\n var ba = buf_array();\n write_record(ba, 332);\n write_record(ba, 334, write_UInt32LE(1));\n write_record(ba, 335, write_BrtMdtinfo({\n name: \"XLDAPR\",\n version: 12e4,\n flags: 3496657072\n }));\n write_record(ba, 336);\n write_record(ba, 339, write_BrtBeginEsfmd(1, \"XLDAPR\"));\n write_record(ba, 52);\n write_record(ba, 35, write_UInt32LE(514));\n write_record(ba, 4096, write_UInt32LE(0));\n write_record(ba, 4097, writeuint16(1));\n write_record(ba, 36);\n write_record(ba, 53);\n write_record(ba, 340);\n write_record(ba, 337, write_BrtBeginEsmdb(1, true));\n write_record(ba, 51, write_BrtMdb([[1, 0]]));\n write_record(ba, 338);\n write_record(ba, 333);\n return ba.end();\n}\nfunction parse_xlmeta_xml(data, name, opts) {\n var out = { Types: [], Cell: [], Value: [] };\n if (!data)\n return out;\n var pass = false;\n var metatype = 2;\n var lastmeta;\n data.replace(tagregex, function(x) {\n var y = parsexmltag(x);\n switch (strip_ns(y[0])) {\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n break;\n case \"\":\n metatype = 2;\n break;\n case \"\":\n metatype = 2;\n break;\n case \"\":\n case \"\":\n case \"\":\n break;\n case \"\":\n pass = false;\n break;\n case \"\\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n \\n');\n return o.join(\"\");\n}\n/* 18.6 Calculation Chain */\nfunction parse_cc_xml(data/*::, name, opts*/)/*:Array*/ {\n\tvar d = [];\n\tif(!data) return d;\n\tvar i = 1;\n\t(data.match(tagregex)||[]).forEach(function(x) {\n\t\tvar y = parsexmltag(x);\n\t\tswitch(y[0]) {\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.6.1 c CT_CalcCell 1 */\n\t\t\tcase ']*r:id=\"([^\"]*)\"/)||[\"\",\"\"])[1];\n\n\treturn rels['!id'][id].Target;\n}\n\n/* L.5.5.2 SpreadsheetML Comments + VML Schema */\nvar _shapeid = 1024;\nfunction write_comments_vml(rId/*:number*/, comments) {\n\tvar csize = [21600, 21600];\n\t/* L.5.2.1.2 Path Attribute */\n\tvar bbox = [\"m0,0l0\",csize[1],csize[0],csize[1],csize[0],\"0xe\"].join(\",\");\n\tvar o = [\n\t\twritextag(\"xml\", null, { 'xmlns:v': XLMLNS.v, 'xmlns:o': XLMLNS.o, 'xmlns:x': XLMLNS.x, 'xmlns:mv': XLMLNS.mv }).replace(/\\/>/,\">\"),\n\t\twritextag(\"o:shapelayout\", writextag(\"o:idmap\", null, {'v:ext':\"edit\", 'data':rId}), {'v:ext':\"edit\"}),\n\t\twritextag(\"v:shapetype\", [\n\t\t\twritextag(\"v:stroke\", null, {joinstyle:\"miter\"}),\n\t\t\twritextag(\"v:path\", null, {gradientshapeok:\"t\", 'o:connecttype':\"rect\"})\n\t\t].join(\"\"), {id:\"_x0000_t202\", 'o:spt':202, coordsize:csize.join(\",\"),path:bbox})\n\t];\n\twhile(_shapeid < rId * 1000) _shapeid += 1000;\n\n\tcomments.forEach(function(x) {\n\tvar c = decode_cell(x[0]);\n\tvar fillopts = /*::(*/{'color2':\"#BEFF82\", 'type':\"gradient\"}/*:: :any)*/;\n\tif(fillopts.type == \"gradient\") fillopts.angle = \"-180\";\n\tvar fillparm = fillopts.type == \"gradient\" ? writextag(\"o:fill\", null, {type:\"gradientUnscaled\", 'v:ext':\"view\"}) : null;\n\tvar fillxml = writextag('v:fill', fillparm, fillopts);\n\n\tvar shadata = ({on:\"t\", 'obscured':\"t\"}/*:any*/);\n\t++_shapeid;\n\n\to = o.concat([\n\t'',\n\t\tfillxml,\n\t\twritextag(\"v:shadow\", null, shadata),\n\t\twritextag(\"v:path\", null, {'o:connecttype':\"none\"}),\n\t\t'
    ',\n\t\t'',\n\t\t\t'',\n\t\t\t'',\n\t\t\t/* Part 4 19.4.2.3 Anchor (Anchor) */\n\t\t\twritetag('x:Anchor', [c.c+1, 0, c.r+1, 0, c.c+3, 20, c.r+5, 20].join(\",\")),\n\t\t\twritetag('x:AutoFill', \"False\"),\n\t\t\twritetag('x:Row', String(c.r)),\n\t\t\twritetag('x:Column', String(c.c)),\n\t\t\tx[1].hidden ? '' : '',\n\t\t'',\n\t''\n\t]); });\n\to.push('');\n\treturn o.join(\"\");\n}\nfunction sheet_insert_comments(sheet, comments/*:Array*/, threaded/*:boolean*/, people/*:?Array*/) {\n\tvar dense = Array.isArray(sheet);\n\tvar cell/*:Cell*/;\n\tcomments.forEach(function(comment) {\n\t\tvar r = decode_cell(comment.ref);\n\t\tif(dense) {\n\t\t\tif(!sheet[r.r]) sheet[r.r] = [];\n\t\t\tcell = sheet[r.r][r.c];\n\t\t} else cell = sheet[comment.ref];\n\t\tif (!cell) {\n\t\t\tcell = ({t:\"z\"}/*:any*/);\n\t\t\tif(dense) sheet[r.r][r.c] = cell;\n\t\t\telse sheet[comment.ref] = cell;\n\t\t\tvar range = safe_decode_range(sheet[\"!ref\"]||\"BDWGO1000001:A1\");\n\t\t\tif(range.s.r > r.r) range.s.r = r.r;\n\t\t\tif(range.e.r < r.r) range.e.r = r.r;\n\t\t\tif(range.s.c > r.c) range.s.c = r.c;\n\t\t\tif(range.e.c < r.c) range.e.c = r.c;\n\t\t\tvar encoded = encode_range(range);\n\t\t\tif (encoded !== sheet[\"!ref\"]) sheet[\"!ref\"] = encoded;\n\t\t}\n\n\t\tif (!cell.c) cell.c = [];\n\t\tvar o/*:Comment*/ = ({a: comment.author, t: comment.t, r: comment.r, T: threaded});\n\t\tif(comment.h) o.h = comment.h;\n\n\t\t/* threaded comments always override */\n\t\tfor(var i = cell.c.length - 1; i >= 0; --i) {\n\t\t\tif(!threaded && cell.c[i].T) return;\n\t\t\tif(threaded && !cell.c[i].T) cell.c.splice(i, 1);\n\t\t}\n\t\tif(threaded && people) for(i = 0; i < people.length; ++i) {\n\t\t\tif(o.a == people[i].id) { o.a = people[i].name || o.a; break; }\n\t\t}\n\t\tcell.c.push(o);\n\t});\n}\n\n/* 18.7 Comments */\nfunction parse_comments_xml(data/*:string*/, opts)/*:Array*/ {\n\t/* 18.7.6 CT_Comments */\n\tif(data.match(/<(?:\\w+:)?comments *\\/>/)) return [];\n\tvar authors/*:Array*/ = [];\n\tvar commentList/*:Array*/ = [];\n\tvar authtag = data.match(/<(?:\\w+:)?authors>([\\s\\S]*)<\\/(?:\\w+:)?authors>/);\n\tif(authtag && authtag[1]) authtag[1].split(/<\\/\\w*:?author>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar a = x.match(/<(?:\\w+:)?author[^>]*>(.*)/);\n\t\tif(a) authors.push(a[1]);\n\t});\n\tvar cmnttag = data.match(/<(?:\\w+:)?commentList>([\\s\\S]*)<\\/(?:\\w+:)?commentList>/);\n\tif(cmnttag && cmnttag[1]) cmnttag[1].split(/<\\/\\w*:?comment>/).forEach(function(x) {\n\t\tif(x === \"\" || x.trim() === \"\") return;\n\t\tvar cm = x.match(/<(?:\\w+:)?comment[^>]*>/);\n\t\tif(!cm) return;\n\t\tvar y = parsexmltag(cm[0]);\n\t\tvar comment/*:RawComment*/ = ({ author: y.authorId && authors[y.authorId] || \"sheetjsghost\", ref: y.ref, guid: y.guid }/*:any*/);\n\t\tvar cell = decode_cell(y.ref);\n\t\tif(opts.sheetRows && opts.sheetRows <= cell.r) return;\n\t\tvar textMatch = x.match(/<(?:\\w+:)?text>([\\s\\S]*)<\\/(?:\\w+:)?text>/);\n\t\tvar rt = !!textMatch && !!textMatch[1] && parse_si(textMatch[1]) || {r:\"\",t:\"\",h:\"\"};\n\t\tcomment.r = rt.r;\n\t\tif(rt.r == \"\") rt.t = rt.h = \"\";\n\t\tcomment.t = (rt.t||\"\").replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\t\tif(opts.cellHTML) comment.h = rt.h;\n\t\tcommentList.push(comment);\n\t});\n\treturn commentList;\n}\n\nfunction write_comments_xml(data/*::, opts*/) {\n\tvar o = [XML_HEADER, writextag('comments', null, { 'xmlns': XMLNS_main[0] })];\n\n\tvar iauthor/*:Array*/ = [];\n\to.push(\"\");\n\tdata.forEach(function(x) { x[1].forEach(function(w) { var a = escapexml(w.a);\n\t\tif(iauthor.indexOf(a) == -1) {\n\t\t\tiauthor.push(a);\n\t\t\to.push(\"\" + a + \"\");\n\t\t}\n\t\tif(w.T && w.ID && iauthor.indexOf(\"tc=\" + w.ID) == -1) {\n\t\t\tiauthor.push(\"tc=\" + w.ID);\n\t\t\to.push(\"\" + \"tc=\" + w.ID + \"\");\n\t\t}\n\t}); });\n\tif(iauthor.length == 0) { iauthor.push(\"SheetJ5\"); o.push(\"SheetJ5\"); }\n\to.push(\"\");\n\to.push(\"\");\n\tdata.forEach(function(d) {\n\t\t/* 18.7.3 CT_Comment */\n\t\tvar lastauthor = 0, ts = [];\n\t\tif(d[1][0] && d[1][0].T && d[1][0].ID) lastauthor = iauthor.indexOf(\"tc=\" + d[1][0].ID);\n\t\telse d[1].forEach(function(c) {\n\t\t\tif(c.a) lastauthor = iauthor.indexOf(escapexml(c.a));\n\t\t\tts.push(c.t||\"\");\n\t\t});\n\t\to.push('');\n\t\tif(ts.length <= 1) o.push(writetag(\"t\", escapexml(ts[0]||\"\")));\n\t\telse {\n\t\t\t/* based on Threaded Comments -> Comments projection */\n\t\t\tvar t = \"Comment:\\n \" + (ts[0]) + \"\\n\";\n\t\t\tfor(var i = 1; i < ts.length; ++i) t += \"Reply:\\n \" + ts[i] + \"\\n\";\n\t\t\to.push(writetag(\"t\", escapexml(t)));\n\t\t}\n\t\to.push('');\n\t});\n\to.push(\"\");\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSX] 2.1.17 */\nfunction parse_tcmnt_xml(data/*:string*/, opts)/*:Array*/ {\n\tvar out = [];\n\tvar pass = false, comment = {}, tidx = 0;\n\tdata.replace(tagregex, function xml_tcmnt(x, idx) {\n\t\tvar y/*:any*/ = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\n\t\t\t/* 2.6.205 threadedComment CT_ThreadedComment */\n\t\t\tcase '': if(comment.t != null) out.push(comment); break;\n\n\t\t\tcase '': case '': comment.t = data.slice(tidx, idx).replace(/\\r\\n/g, \"\\n\").replace(/\\r/g, \"\\n\"); break;\n\n\t\t\t/* 2.6.206 mentions CT_ThreadedCommentMentions TODO */\n\t\t\tcase '': pass = true; break;\n\t\t\tcase '': pass = false; break;\n\n\t\t\t/* 2.6.202 mention CT_Mention TODO */\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '
    ': case '': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '': pass=false; break;\n\n\t\t\tdefault: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in threaded comments');\n\t\t}\n\t\treturn x;\n\t});\n\treturn out;\n}\n\nfunction write_tcmnt_xml(comments, people, opts) {\n\tvar o = [XML_HEADER, writextag('ThreadedComments', null, { 'xmlns': XMLNS.TCMNT }).replace(/[\\/]>/, \">\")];\n\tcomments.forEach(function(carr) {\n\t\tvar rootid = \"\";\n\t\t(carr[1] || []).forEach(function(c, idx) {\n\t\t\tif(!c.T) { delete c.ID; return; }\n\t\t\tif(c.a && people.indexOf(c.a) == -1) people.push(c.a);\n\t\t\tvar tcopts = {\n\t\t\t\tref: carr[0],\n\t\t\t\tid: \"{54EE7951-7262-4200-6969-\" + (\"000000000000\" + opts.tcid++).slice(-12) + \"}\"\n\t\t\t};\n\t\t\tif(idx == 0) rootid = tcopts.id;\n\t\t\telse tcopts.parentId = rootid;\n\t\t\tc.ID = tcopts.id;\n\t\t\tif(c.a) tcopts.personId = \"{54EE7950-7262-4200-6969-\" + (\"000000000000\" + people.indexOf(c.a)).slice(-12) + \"}\";\n\t\t\to.push(writextag('threadedComment', writetag('text', c.t||\"\"), tcopts));\n\t\t});\n\t});\n\to.push('');\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSX] 2.1.18 */\nfunction parse_people_xml(data/*:string*/, opts) {\n\tvar out = [];\n\tvar pass = false;\n\tdata.replace(tagregex, function xml_tcmnt(x) {\n\t\tvar y/*:any*/ = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\n\t\t\t/* 2.6.203 person CT_Person TODO: providers */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.10 extLst CT_ExtensionList ? */\n\t\t\tcase '': case '': case '': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '': pass=false; break;\n\n\t\t\tdefault: if(!pass && opts.WTF) throw new Error('unrecognized ' + y[0] + ' in threaded comments');\n\t\t}\n\t\treturn x;\n\t});\n\treturn out;\n}\nfunction write_people_xml(people/*, opts*/) {\n\tvar o = [XML_HEADER, writextag('personList', null, {\n\t\t'xmlns': XMLNS.TCMNT,\n\t\t'xmlns:x': XMLNS_main[0]\n\t}).replace(/[\\/]>/, \">\")];\n\tpeople.forEach(function(person, idx) {\n\t\to.push(writextag('person', null, {\n\t\t\tdisplayName: person,\n\t\t\tid: \"{54EE7950-7262-4200-6969-\" + (\"000000000000\" + idx).slice(-12) + \"}\",\n\t\t\tuserId: person,\n\t\t\tproviderId: \"None\"\n\t\t}));\n\t});\n\to.push(\"\");\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.28 BrtBeginComment */\nfunction parse_BrtBeginComment(data) {\n\tvar out = {};\n\tout.iauthor = data.read_shift(4);\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tout.rfx = rfx.s;\n\tout.ref = encode_cell(rfx.s);\n\tdata.l += 16; /*var guid = parse_GUID(data); */\n\treturn out;\n}\nfunction write_BrtBeginComment(data, o) {\n\tif(o == null) o = new_buf(36);\n\to.write_shift(4, data[1].iauthor);\n\twrite_UncheckedRfX((data[0]/*:any*/), o);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\to.write_shift(4, 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.327 BrtCommentAuthor */\nvar parse_BrtCommentAuthor = parse_XLWideString;\nfunction write_BrtCommentAuthor(data) { return write_XLWideString(data.slice(0, 54)); }\n\n/* [MS-XLSB] 2.1.7.8 Comments */\nfunction parse_comments_bin(data, opts)/*:Array*/ {\n\tvar out/*:Array*/ = [];\n\tvar authors/*:Array*/ = [];\n\tvar c = {};\n\tvar pass = false;\n\trecordhopper(data, function hopper_cmnt(val, R, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x0278: /* 'BrtCommentAuthor' */\n\t\t\t\tauthors.push(val); break;\n\t\t\tcase 0x027B: /* 'BrtBeginComment' */\n\t\t\t\tc = val; break;\n\t\t\tcase 0x027D: /* 'BrtCommentText' */\n\t\t\t\tc.t = val.t; c.h = val.h; c.r = val.r; break;\n\t\t\tcase 0x027C: /* 'BrtEndComment' */\n\t\t\t\tc.author = authors[c.iauthor];\n\t\t\t\tdelete (c/*:any*/).iauthor;\n\t\t\t\tif(opts.sheetRows && c.rfx && opts.sheetRows <= c.rfx.r) break;\n\t\t\t\tif(!c.t) c.t = \"\";\n\t\t\t\tdelete c.rfx; out.push(c); break;\n\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */ break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */ break;\n\n\n\t\t\tdefault:\n\t\t\t\tif(R.T){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t});\n\treturn out;\n}\n\nfunction write_comments_bin(data/*::, opts*/) {\n\tvar ba = buf_array();\n\tvar iauthor/*:Array*/ = [];\n\twrite_record(ba, 0x0274 /* BrtBeginComments */);\n\n\twrite_record(ba, 0x0276 /* BrtBeginCommentAuthors */);\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tif(iauthor.indexOf(c.a) > -1) return;\n\t\t\tiauthor.push(c.a.slice(0,54));\n\t\t\twrite_record(ba, 0x0278 /* BrtCommentAuthor */, write_BrtCommentAuthor(c.a));\n\t\t});\n\t});\n\twrite_record(ba, 0x0277 /* BrtEndCommentAuthors */);\n\n\twrite_record(ba, 0x0279 /* BrtBeginCommentList */);\n\tdata.forEach(function(comment) {\n\t\tcomment[1].forEach(function(c) {\n\t\t\tc.iauthor = iauthor.indexOf(c.a);\n\t\t\tvar range = {s:decode_cell(comment[0]),e:decode_cell(comment[0])};\n\t\t\twrite_record(ba, 0x027B /* BrtBeginComment */, write_BrtBeginComment([range, c]));\n\t\t\tif(c.t && c.t.length > 0) write_record(ba, 0x027D /* BrtCommentText */, write_BrtCommentText(c));\n\t\t\twrite_record(ba, 0x027C /* BrtEndComment */);\n\t\t\tdelete c.iauthor;\n\t\t});\n\t});\n\twrite_record(ba, 0x027A /* BrtEndCommentList */);\n\n\twrite_record(ba, 0x0275 /* BrtEndComments */);\n\treturn ba.end();\n}\nvar CT_VBA = \"application/vnd.ms-office.vbaProject\";\nfunction make_vba_xls(cfb) {\n var newcfb = CFB.utils.cfb_new({ root: \"R\" });\n cfb.FullPaths.forEach(function(p, i) {\n if (p.slice(-1) === \"/\" || !p.match(/_VBA_PROJECT_CUR/))\n return;\n var newpath = p.replace(/^[^\\/]*/, \"R\").replace(/\\/_VBA_PROJECT_CUR\\u0000*/, \"\");\n CFB.utils.cfb_add(newcfb, newpath, cfb.FileIndex[i].content);\n });\n return CFB.write(newcfb);\n}\nfunction fill_vba_xls(cfb, vba) {\n vba.FullPaths.forEach(function(p, i) {\n if (i == 0)\n return;\n var newpath = p.replace(/[^\\/]*[\\/]/, \"/_VBA_PROJECT_CUR/\");\n if (newpath.slice(-1) !== \"/\")\n CFB.utils.cfb_add(cfb, newpath, vba.FileIndex[i].content);\n });\n}\nvar VBAFMTS = [\"xlsb\", \"xlsm\", \"xlam\", \"biff8\", \"xla\"];\n/* macro and dialog sheet stubs */\nfunction parse_ds_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; }\nfunction parse_ds_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'dialog'}; }\nfunction parse_ms_bin(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; }\nfunction parse_ms_xml(/*::data:any, opts, idx:number, rels, wb, themes, styles*/)/*:Worksheet*/ { return {'!type':'macro'}; }\n/* TODO: it will be useful to parse the function str */\nvar rc_to_a1 = /*#__PURE__*/(function(){\n\tvar rcregex = /(^|[^A-Za-z_])R(\\[?-?\\d+\\]|[1-9]\\d*|)C(\\[?-?\\d+\\]|[1-9]\\d*|)(?![A-Za-z0-9_])/g;\n\tvar rcbase/*:Cell*/ = ({r:0,c:0}/*:any*/);\n\tfunction rcfunc($$,$1,$2,$3) {\n\t\tvar cRel = false, rRel = false;\n\n\t\tif($2.length == 0) rRel = true;\n\t\telse if($2.charAt(0) == \"[\") { rRel = true; $2 = $2.slice(1, -1); }\n\n\t\tif($3.length == 0) cRel = true;\n\t\telse if($3.charAt(0) == \"[\") { cRel = true; $3 = $3.slice(1, -1); }\n\n\t\tvar R = $2.length>0?parseInt($2,10)|0:0, C = $3.length>0?parseInt($3,10)|0:0;\n\n\t\tif(cRel) C += rcbase.c; else --C;\n\t\tif(rRel) R += rcbase.r; else --R;\n\t\treturn $1 + (cRel ? \"\" : \"$\") + encode_col(C) + (rRel ? \"\" : \"$\") + encode_row(R);\n\t}\n\treturn function rc_to_a1(fstr/*:string*/, base/*:Cell*/)/*:string*/ {\n\t\trcbase = base;\n\t\treturn fstr.replace(rcregex, rcfunc);\n\t};\n})();\n\nvar crefregex = /(^|[^._A-Z0-9])([$]?)([A-Z]{1,2}|[A-W][A-Z]{2}|X[A-E][A-Z]|XF[A-D])([$]?)(10[0-3]\\d{4}|104[0-7]\\d{3}|1048[0-4]\\d{2}|10485[0-6]\\d|104857[0-6]|[1-9]\\d{0,5})(?![_.\\(A-Za-z0-9])/g;\nvar a1_to_rc = /*#__PURE__*/(function(){\n\treturn function a1_to_rc(fstr/*:string*/, base/*:CellAddress*/) {\n\t\treturn fstr.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\t\tvar c = decode_col($3) - ($2 ? 0 : base.c);\n\t\t\tvar r = decode_row($5) - ($4 ? 0 : base.r);\n\t\t\tvar R = (r == 0 ? \"\" : !$4 ? \"[\" + r + \"]\" : (r+1));\n\t\t\tvar C = (c == 0 ? \"\" : !$2 ? \"[\" + c + \"]\" : (c+1));\n\t\t\treturn $1 + \"R\" + R + \"C\" + C;\n\t\t});\n\t};\n})();\n\n/* no defined name can collide with a valid cell address A1:XFD1048576 ... except LOG10! */\nfunction shift_formula_str(f/*:string*/, delta/*:Cell*/)/*:string*/ {\n\treturn f.replace(crefregex, function($0, $1, $2, $3, $4, $5) {\n\t\treturn $1+($2==\"$\" ? $2+$3 : encode_col(decode_col($3)+delta.c))+($4==\"$\" ? $4+$5 : encode_row(decode_row($5) + delta.r));\n\t});\n}\n\nfunction shift_formula_xlsx(f/*:string*/, range/*:string*/, cell/*:string*/)/*:string*/ {\n\tvar r = decode_range(range), s = r.s, c = decode_cell(cell);\n\tvar delta = {r:c.r - s.r, c:c.c - s.c};\n\treturn shift_formula_str(f, delta);\n}\n\n/* TODO: parse formula */\nfunction fuzzyfmla(f/*:string*/)/*:boolean*/ {\n\tif(f.length == 1) return false;\n\treturn true;\n}\n\nfunction _xlfn(f/*:string*/)/*:string*/ {\n\treturn f.replace(/_xlfn\\./g,\"\");\n}\nfunction parseread1(blob) { blob.l+=1; return; }\n\n/* [MS-XLS] 2.5.51 */\nfunction parse_ColRelU(blob, length) {\n\tvar c = blob.read_shift(length == 1 ? 1 : 2);\n\treturn [c & 0x3FFF, (c >> 14) & 1, (c >> 15) & 1];\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.89 */\nfunction parse_RgceArea(blob, length, opts) {\n\tvar w = 2;\n\tif(opts) {\n\t\tif(opts.biff >= 2 && opts.biff <= 5) return parse_RgceArea_BIFF2(blob, length, opts);\n\t\telse if(opts.biff == 12) w = 4;\n\t}\n\tvar r=blob.read_shift(w), R=blob.read_shift(w);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n/* BIFF 2-5 encodes flags in the row field */\nfunction parse_RgceArea_BIFF2(blob/*::, length, opts*/) {\n\tvar r=parse_ColRelU(blob, 2), R=parse_ColRelU(blob, 2);\n\tvar c=blob.read_shift(1);\n\tvar C=blob.read_shift(1);\n\treturn { s:{r:r[0], c:c, cRel:r[1], rRel:r[2]}, e:{r:R[0], c:C, cRel:R[1], rRel:R[2]} };\n}\n\n/* [MS-XLS] 2.5.198.105 ; [MS-XLSB] 2.5.97.90 */\nfunction parse_RgceAreaRel(blob, length, opts) {\n\tif(opts.biff < 8) return parse_RgceArea_BIFF2(blob, length, opts);\n\tvar r=blob.read_shift(opts.biff == 12 ? 4 : 2), R=blob.read_shift(opts.biff == 12 ? 4 : 2);\n\tvar c=parse_ColRelU(blob, 2);\n\tvar C=parse_ColRelU(blob, 2);\n\treturn { s:{r:r, c:c[0], cRel:c[1], rRel:c[2]}, e:{r:R, c:C[0], cRel:C[1], rRel:C[2]} };\n}\n\n/* [MS-XLS] 2.5.198.109 ; [MS-XLSB] 2.5.97.91 */\nfunction parse_RgceLoc(blob, length, opts) {\n\tif(opts && opts.biff >= 2 && opts.biff <= 5) return parse_RgceLoc_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(opts && opts.biff == 12 ? 4 : 2);\n\tvar c = parse_ColRelU(blob, 2);\n\treturn {r:r, c:c[0], cRel:c[1], rRel:c[2]};\n}\nfunction parse_RgceLoc_BIFF2(blob/*::, length, opts*/) {\n\tvar r = parse_ColRelU(blob, 2);\n\tvar c = blob.read_shift(1);\n\treturn {r:r[0], c:c, cRel:r[1], rRel:r[2]};\n}\n\n/* [MS-XLS] 2.5.198.107, 2.5.47 */\nfunction parse_RgceElfLoc(blob/*::, length, opts*/) {\n\tvar r = blob.read_shift(2);\n\tvar c = blob.read_shift(2);\n\treturn {r:r, c:c & 0xFF, fQuoted:!!(c & 0x4000), cRel:c>>15, rRel:c>>15 };\n}\n\n/* [MS-XLS] 2.5.198.111 ; [MS-XLSB] 2.5.97.92 TODO */\nfunction parse_RgceLocRel(blob, length, opts) {\n\tvar biff = opts && opts.biff ? opts.biff : 8;\n\tif(biff >= 2 && biff <= 5) return parse_RgceLocRel_BIFF2(blob, length, opts);\n\tvar r = blob.read_shift(biff >= 12 ? 4 : 2);\n\tvar cl = blob.read_shift(2);\n\tvar cRel = (cl & 0x4000) >> 14, rRel = (cl & 0x8000) >> 15;\n\tcl &= 0x3FFF;\n\tif(rRel == 1) while(r > 0x7FFFF) r -= 0x100000;\n\tif(cRel == 1) while(cl > 0x1FFF) cl = cl - 0x4000;\n\treturn {r:r,c:cl,cRel:cRel,rRel:rRel};\n}\nfunction parse_RgceLocRel_BIFF2(blob/*::, length:number, opts*/) {\n\tvar rl = blob.read_shift(2);\n\tvar c = blob.read_shift(1);\n\tvar rRel = (rl & 0x8000) >> 15, cRel = (rl & 0x4000) >> 14;\n\trl &= 0x3FFF;\n\tif(rRel == 1 && rl >= 0x2000) rl = rl - 0x4000;\n\tif(cRel == 1 && c >= 0x80) c = c - 0x100;\n\treturn {r:rl,c:c,cRel:cRel,rRel:rRel};\n}\n\n/* [MS-XLS] 2.5.198.27 ; [MS-XLSB] 2.5.97.18 */\nfunction parse_PtgArea(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceArea(blob, opts.biff >= 2 && opts.biff <= 5 ? 6 : 8, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.28 ; [MS-XLSB] 2.5.97.19 */\nfunction parse_PtgArea3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2, 'i');\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tvar area = parse_RgceArea(blob, w, opts);\n\treturn [type, ixti, area];\n}\n\n/* [MS-XLS] 2.5.198.29 ; [MS-XLSB] 2.5.97.20 */\nfunction parse_PtgAreaErr(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts && (opts.biff > 8) ? 12 : (opts.biff < 8 ? 6 : 8);\n\treturn [type];\n}\n/* [MS-XLS] 2.5.198.30 ; [MS-XLSB] 2.5.97.21 */\nfunction parse_PtgAreaErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 8;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: blob.l += 12; w = 6; break;\n\t\tcase 12: w = 12; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.31 ; [MS-XLSB] 2.5.97.22 */\nfunction parse_PtgAreaN(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar area = parse_RgceAreaRel(blob, length - 1, opts);\n\treturn [type, area];\n}\n\n/* [MS-XLS] 2.5.198.32 ; [MS-XLSB] 2.5.97.23 */\nfunction parse_PtgArray(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tblob.l += opts.biff == 2 ? 6 : opts.biff == 12 ? 14 : 7;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.33 ; [MS-XLSB] 2.5.97.24 */\nfunction parse_PtgAttrBaxcel(blob) {\n\tvar bitSemi = blob[blob.l+1] & 0x01; /* 1 = volatile */\n\tvar bitBaxcel = 1;\n\tblob.l += 4;\n\treturn [bitSemi, bitBaxcel];\n}\n\n/* [MS-XLS] 2.5.198.34 ; [MS-XLSB] 2.5.97.25 */\nfunction parse_PtgAttrChoose(blob, length, opts)/*:Array*/ {\n\tblob.l +=2;\n\tvar offset = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\tvar o/*:Array*/ = [];\n\t/* offset is 1 less than the number of elements */\n\tfor(var i = 0; i <= offset; ++i) o.push(blob.read_shift(opts && opts.biff == 2 ? 1 : 2));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.35 ; [MS-XLSB] 2.5.97.26 */\nfunction parse_PtgAttrGoto(blob, length, opts) {\n\tvar bitGoto = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitGoto, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLS] 2.5.198.36 ; [MS-XLSB] 2.5.97.27 */\nfunction parse_PtgAttrIf(blob, length, opts) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(opts && opts.biff == 2 ? 1 : 2)];\n}\n\n/* [MS-XLSB] 2.5.97.28 */\nfunction parse_PtgAttrIfError(blob) {\n\tvar bitIf = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += 2;\n\treturn [bitIf, blob.read_shift(2)];\n}\n\n/* [MS-XLS] 2.5.198.37 ; [MS-XLSB] 2.5.97.29 */\nfunction parse_PtgAttrSemi(blob, length, opts) {\n\tvar bitSemi = (blob[blob.l+1] & 0xFF) ? 1 : 0;\n\tblob.l += opts && opts.biff == 2 ? 3 : 4;\n\treturn [bitSemi];\n}\n\n/* [MS-XLS] 2.5.198.40 ; [MS-XLSB] 2.5.97.32 */\nfunction parse_PtgAttrSpaceType(blob/*::, length*/) {\n\tvar type = blob.read_shift(1), cch = blob.read_shift(1);\n\treturn [type, cch];\n}\n\n/* [MS-XLS] 2.5.198.38 ; [MS-XLSB] 2.5.97.30 */\nfunction parse_PtgAttrSpace(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.39 ; [MS-XLSB] 2.5.97.31 */\nfunction parse_PtgAttrSpaceSemi(blob) {\n\tblob.read_shift(2);\n\treturn parse_PtgAttrSpaceType(blob, 2);\n}\n\n/* [MS-XLS] 2.5.198.84 ; [MS-XLSB] 2.5.97.68 TODO */\nfunction parse_PtgRef(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLoc(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.88 ; [MS-XLSB] 2.5.97.72 TODO */\nfunction parse_PtgRefN(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar loc = parse_RgceLocRel(blob, 0, opts);\n\treturn [type, loc];\n}\n\n/* [MS-XLS] 2.5.198.85 ; [MS-XLSB] 2.5.97.69 TODO */\nfunction parse_PtgRef3d(blob, length, opts) {\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tif(opts && opts.biff == 5) blob.l += 12;\n\tvar loc = parse_RgceLoc(blob, 0, opts); // TODO: or RgceLocRel\n\treturn [type, ixti, loc];\n}\n\n\n/* [MS-XLS] 2.5.198.62 ; [MS-XLSB] 2.5.97.45 TODO */\nfunction parse_PtgFunc(blob, length, opts) {\n\t//var ptg = blob[blob.l] & 0x1F;\n\tvar type = (blob[blob.l] & 0x60)>>5;\n\tblob.l += 1;\n\tvar iftab = blob.read_shift(opts && opts.biff <= 3 ? 1 : 2);\n\treturn [FtabArgc[iftab], Ftab[iftab], type];\n}\n/* [MS-XLS] 2.5.198.63 ; [MS-XLSB] 2.5.97.46 TODO */\nfunction parse_PtgFuncVar(blob, length, opts) {\n\tvar type = blob[blob.l++];\n\tvar cparams = blob.read_shift(1), tab = opts && opts.biff <= 3 ? [(type == 0x58 ? -1 : 0), blob.read_shift(1)]: parsetab(blob);\n\treturn [cparams, (tab[0] === 0 ? Ftab : Cetab)[tab[1]]];\n}\n\nfunction parsetab(blob) {\n\treturn [blob[blob.l+1]>>7, blob.read_shift(2) & 0x7FFF];\n}\n\n/* [MS-XLS] 2.5.198.41 ; [MS-XLSB] 2.5.97.33 */\nfunction parse_PtgAttrSum(blob, length, opts) {\n\tblob.l += opts && opts.biff == 2 ? 3 : 4; return;\n}\n\n/* [MS-XLS] 2.5.198.58 ; [MS-XLSB] 2.5.97.40 */\nfunction parse_PtgExp(blob, length, opts) {\n\tblob.l++;\n\tif(opts && opts.biff == 12) return [blob.read_shift(4, 'i'), 0];\n\tvar row = blob.read_shift(2);\n\tvar col = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [row, col];\n}\n\n/* [MS-XLS] 2.5.198.57 ; [MS-XLSB] 2.5.97.39 */\nfunction parse_PtgErr(blob) { blob.l++; return BErr[blob.read_shift(1)]; }\n\n/* [MS-XLS] 2.5.198.66 ; [MS-XLSB] 2.5.97.49 */\nfunction parse_PtgInt(blob) { blob.l++; return blob.read_shift(2); }\n\n/* [MS-XLS] 2.5.198.42 ; [MS-XLSB] 2.5.97.34 */\nfunction parse_PtgBool(blob) { blob.l++; return blob.read_shift(1)!==0;}\n\n/* [MS-XLS] 2.5.198.79 ; [MS-XLSB] 2.5.97.63 */\nfunction parse_PtgNum(blob) { blob.l++; return parse_Xnum(blob, 8); }\n\n/* [MS-XLS] 2.5.198.89 ; [MS-XLSB] 2.5.97.74 */\nfunction parse_PtgStr(blob, length, opts) { blob.l++; return parse_ShortXLUnicodeString(blob, length-1, opts); }\n\n/* [MS-XLS] 2.5.192.112 + 2.5.192.11{3,4,5,6,7} */\n/* [MS-XLSB] 2.5.97.93 + 2.5.97.9{4,5,6,7} */\nfunction parse_SerAr(blob, biff/*:number*/) {\n\tvar val = [blob.read_shift(1)];\n\tif(biff == 12) switch(val[0]) {\n\t\tcase 0x02: val[0] = 0x04; break; /* SerBool */\n\t\tcase 0x04: val[0] = 0x10; break; /* SerErr */\n\t\tcase 0x00: val[0] = 0x01; break; /* SerNum */\n\t\tcase 0x01: val[0] = 0x02; break; /* SerStr */\n\t}\n\tswitch(val[0]) {\n\t\tcase 0x04: /* SerBool -- boolean */\n\t\t\tval[1] = parsebool(blob, 1) ? 'TRUE' : 'FALSE';\n\t\t\tif(biff != 12) blob.l += 7; break;\n\t\tcase 0x25: /* appears to be an alias */\n\t\tcase 0x10: /* SerErr -- error */\n\t\t\tval[1] = BErr[blob[blob.l]];\n\t\t\tblob.l += ((biff == 12) ? 4 : 8); break;\n\t\tcase 0x00: /* SerNil -- honestly, I'm not sure how to reproduce this */\n\t\t\tblob.l += 8; break;\n\t\tcase 0x01: /* SerNum -- Xnum */\n\t\t\tval[1] = parse_Xnum(blob, 8); break;\n\t\tcase 0x02: /* SerStr -- XLUnicodeString (<256 chars) */\n\t\t\tval[1] = parse_XLUnicodeString2(blob, 0, {biff:biff > 0 && biff < 8 ? 2 : biff}); break;\n\t\tdefault: throw new Error(\"Bad SerAr: \" + val[0]); /* Unreachable */\n\t}\n\treturn val;\n}\n\n/* [MS-XLS] 2.5.198.61 ; [MS-XLSB] 2.5.97.44 */\nfunction parse_PtgExtraMem(blob, cce, opts) {\n\tvar count = blob.read_shift((opts.biff == 12) ? 4 : 2);\n\tvar out/*:Array*/ = [];\n\tfor(var i = 0; i != count; ++i) out.push(((opts.biff == 12) ? parse_UncheckedRfX : parse_Ref8U)(blob, 8));\n\treturn out;\n}\n\n/* [MS-XLS] 2.5.198.59 ; [MS-XLSB] 2.5.97.41 */\nfunction parse_PtgExtraArray(blob, length, opts) {\n\tvar rows = 0, cols = 0;\n\tif(opts.biff == 12) {\n\t\trows = blob.read_shift(4); // DRw\n\t\tcols = blob.read_shift(4); // DCol\n\t} else {\n\t\tcols = 1 + blob.read_shift(1); //DColByteU\n\t\trows = 1 + blob.read_shift(2); //DRw\n\t}\n\tif(opts.biff >= 2 && opts.biff < 8) { --rows; if(--cols == 0) cols = 0x100; }\n\t// $FlowIgnore\n\tfor(var i = 0, o/*:Array>*/ = []; i != rows && (o[i] = []); ++i)\n\t\tfor(var j = 0; j != cols; ++j) o[i][j] = parse_SerAr(blob, opts.biff);\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 */\nfunction parse_PtgName(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar w = (!opts || (opts.biff >= 8)) ? 4 : 2;\n\tvar nameindex = blob.read_shift(w);\n\tswitch(opts.biff) {\n\t\tcase 2: blob.l += 5; break;\n\t\tcase 3: case 4: blob.l += 8; break;\n\t\tcase 5: blob.l += 12; break;\n\t}\n\treturn [type, 0, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 */\nfunction parse_PtgNameX(blob, length, opts) {\n\tif(opts.biff == 5) return parse_PtgNameX_BIFF5(blob, length, opts);\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2); // XtiIndex\n\tvar nameindex = blob.read_shift(4);\n\treturn [type, ixti, nameindex];\n}\nfunction parse_PtgNameX_BIFF5(blob/*::, length, opts*/) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar ixti = blob.read_shift(2, 'i'); // XtiIndex\n\tblob.l += 8;\n\tvar nameindex = blob.read_shift(2);\n\tblob.l += 12;\n\treturn [type, ixti, nameindex];\n}\n\n/* [MS-XLS] 2.5.198.70 ; [MS-XLSB] 2.5.97.54 */\nfunction parse_PtgMemArea(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += (opts && opts.biff == 2 ? 3 : 4);\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n/* [MS-XLS] 2.5.198.72 ; [MS-XLSB] 2.5.97.56 */\nfunction parse_PtgMemFunc(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(opts && opts.biff == 2 ? 1 : 2);\n\treturn [type, cce];\n}\n\n\n/* [MS-XLS] 2.5.198.86 ; [MS-XLSB] 2.5.97.69 */\nfunction parse_PtgRefErr(blob, length, opts) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tblob.l += 4;\n\tif(opts.biff < 8) blob.l--;\n\tif(opts.biff == 12) blob.l += 2;\n\treturn [type];\n}\n\n/* [MS-XLS] 2.5.198.87 ; [MS-XLSB] 2.5.97.71 */\nfunction parse_PtgRefErr3d(blob, length, opts) {\n\tvar type = (blob[blob.l++] & 0x60) >> 5;\n\tvar ixti = blob.read_shift(2);\n\tvar w = 4;\n\tif(opts) switch(opts.biff) {\n\t\tcase 5: w = 15; break;\n\t\tcase 12: w = 6; break;\n\t}\n\tblob.l += w;\n\treturn [type, ixti];\n}\n\n/* [MS-XLS] 2.5.198.71 ; [MS-XLSB] 2.5.97.55 */\nvar parse_PtgMemErr = parsenoop;\n/* [MS-XLS] 2.5.198.73 ; [MS-XLSB] 2.5.97.57 */\nvar parse_PtgMemNoMem = parsenoop;\n/* [MS-XLS] 2.5.198.92 */\nvar parse_PtgTbl = parsenoop;\n\nfunction parse_PtgElfLoc(blob, length, opts) {\n\tblob.l += 2;\n\treturn [parse_RgceElfLoc(blob, 4, opts)];\n}\nfunction parse_PtgElfNoop(blob/*::, length, opts*/) {\n\tblob.l += 6;\n\treturn [];\n}\n/* [MS-XLS] 2.5.198.46 */\nvar parse_PtgElfCol = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.47 */\nvar parse_PtgElfColS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.48 */\nvar parse_PtgElfColSV = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.49 */\nvar parse_PtgElfColV = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.50 */\nfunction parse_PtgElfLel(blob/*::, length, opts*/) {\n\tblob.l += 2;\n\treturn [parseuint16(blob), blob.read_shift(2) & 0x01];\n}\n/* [MS-XLS] 2.5.198.51 */\nvar parse_PtgElfRadical = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.52 */\nvar parse_PtgElfRadicalLel = parse_PtgElfLel;\n/* [MS-XLS] 2.5.198.53 */\nvar parse_PtgElfRadicalS = parse_PtgElfNoop;\n/* [MS-XLS] 2.5.198.54 */\nvar parse_PtgElfRw = parse_PtgElfLoc;\n/* [MS-XLS] 2.5.198.55 */\nvar parse_PtgElfRwV = parse_PtgElfLoc;\n\n/* [MS-XLSB] 2.5.97.52 TODO */\nvar PtgListRT = [\n\t\"Data\",\n\t\"All\",\n\t\"Headers\",\n\t\"??\",\n\t\"?Data2\",\n\t\"??\",\n\t\"?DataHeaders\",\n\t\"??\",\n\t\"Totals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?DataTotals\",\n\t\"??\",\n\t\"??\",\n\t\"??\",\n\t\"?Current\"\n];\nfunction parse_PtgList(blob/*::, length, opts*/) {\n\tblob.l += 2;\n\tvar ixti = blob.read_shift(2);\n\tvar flags = blob.read_shift(2);\n\tvar idx = blob.read_shift(4);\n\tvar c = blob.read_shift(2);\n\tvar C = blob.read_shift(2);\n\tvar rt = PtgListRT[(flags >> 2) & 0x1F];\n\treturn {ixti: ixti, coltype:(flags&0x3), rt:rt, idx:idx, c:c, C:C};\n}\n/* [MS-XLS] 2.5.198.91 ; [MS-XLSB] 2.5.97.76 */\nfunction parse_PtgSxName(blob/*::, length, opts*/) {\n\tblob.l += 2;\n\treturn [blob.read_shift(4)];\n}\n\n/* [XLS] old spec */\nfunction parse_PtgSheet(blob, length, opts) {\n\tblob.l += 5;\n\tblob.l += 2;\n\tblob.l += (opts.biff == 2 ? 1 : 4);\n\treturn [\"PTGSHEET\"];\n}\nfunction parse_PtgEndSheet(blob, length, opts) {\n\tblob.l += (opts.biff == 2 ? 4 : 5);\n\treturn [\"PTGENDSHEET\"];\n}\nfunction parse_PtgMemAreaN(blob/*::, length, opts*/) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgMemNoMemN(blob/*::, length, opts*/) {\n\tvar type = (blob.read_shift(1) >>> 5) & 0x03;\n\tvar cce = blob.read_shift(2);\n\treturn [type, cce];\n}\nfunction parse_PtgAttrNoop(blob/*::, length, opts*/) {\n\tblob.l += 4;\n\treturn [0, 0];\n}\n\n/* [MS-XLS] 2.5.198.25 ; [MS-XLSB] 2.5.97.16 */\nvar PtgTypes = {\n\t/*::[*/0x01/*::]*/: { n:'PtgExp', f:parse_PtgExp },\n\t/*::[*/0x02/*::]*/: { n:'PtgTbl', f:parse_PtgTbl },\n\t/*::[*/0x03/*::]*/: { n:'PtgAdd', f:parseread1 },\n\t/*::[*/0x04/*::]*/: { n:'PtgSub', f:parseread1 },\n\t/*::[*/0x05/*::]*/: { n:'PtgMul', f:parseread1 },\n\t/*::[*/0x06/*::]*/: { n:'PtgDiv', f:parseread1 },\n\t/*::[*/0x07/*::]*/: { n:'PtgPower', f:parseread1 },\n\t/*::[*/0x08/*::]*/: { n:'PtgConcat', f:parseread1 },\n\t/*::[*/0x09/*::]*/: { n:'PtgLt', f:parseread1 },\n\t/*::[*/0x0A/*::]*/: { n:'PtgLe', f:parseread1 },\n\t/*::[*/0x0B/*::]*/: { n:'PtgEq', f:parseread1 },\n\t/*::[*/0x0C/*::]*/: { n:'PtgGe', f:parseread1 },\n\t/*::[*/0x0D/*::]*/: { n:'PtgGt', f:parseread1 },\n\t/*::[*/0x0E/*::]*/: { n:'PtgNe', f:parseread1 },\n\t/*::[*/0x0F/*::]*/: { n:'PtgIsect', f:parseread1 },\n\t/*::[*/0x10/*::]*/: { n:'PtgUnion', f:parseread1 },\n\t/*::[*/0x11/*::]*/: { n:'PtgRange', f:parseread1 },\n\t/*::[*/0x12/*::]*/: { n:'PtgUplus', f:parseread1 },\n\t/*::[*/0x13/*::]*/: { n:'PtgUminus', f:parseread1 },\n\t/*::[*/0x14/*::]*/: { n:'PtgPercent', f:parseread1 },\n\t/*::[*/0x15/*::]*/: { n:'PtgParen', f:parseread1 },\n\t/*::[*/0x16/*::]*/: { n:'PtgMissArg', f:parseread1 },\n\t/*::[*/0x17/*::]*/: { n:'PtgStr', f:parse_PtgStr },\n\t/*::[*/0x1A/*::]*/: { n:'PtgSheet', f:parse_PtgSheet },\n\t/*::[*/0x1B/*::]*/: { n:'PtgEndSheet', f:parse_PtgEndSheet },\n\t/*::[*/0x1C/*::]*/: { n:'PtgErr', f:parse_PtgErr },\n\t/*::[*/0x1D/*::]*/: { n:'PtgBool', f:parse_PtgBool },\n\t/*::[*/0x1E/*::]*/: { n:'PtgInt', f:parse_PtgInt },\n\t/*::[*/0x1F/*::]*/: { n:'PtgNum', f:parse_PtgNum },\n\t/*::[*/0x20/*::]*/: { n:'PtgArray', f:parse_PtgArray },\n\t/*::[*/0x21/*::]*/: { n:'PtgFunc', f:parse_PtgFunc },\n\t/*::[*/0x22/*::]*/: { n:'PtgFuncVar', f:parse_PtgFuncVar },\n\t/*::[*/0x23/*::]*/: { n:'PtgName', f:parse_PtgName },\n\t/*::[*/0x24/*::]*/: { n:'PtgRef', f:parse_PtgRef },\n\t/*::[*/0x25/*::]*/: { n:'PtgArea', f:parse_PtgArea },\n\t/*::[*/0x26/*::]*/: { n:'PtgMemArea', f:parse_PtgMemArea },\n\t/*::[*/0x27/*::]*/: { n:'PtgMemErr', f:parse_PtgMemErr },\n\t/*::[*/0x28/*::]*/: { n:'PtgMemNoMem', f:parse_PtgMemNoMem },\n\t/*::[*/0x29/*::]*/: { n:'PtgMemFunc', f:parse_PtgMemFunc },\n\t/*::[*/0x2A/*::]*/: { n:'PtgRefErr', f:parse_PtgRefErr },\n\t/*::[*/0x2B/*::]*/: { n:'PtgAreaErr', f:parse_PtgAreaErr },\n\t/*::[*/0x2C/*::]*/: { n:'PtgRefN', f:parse_PtgRefN },\n\t/*::[*/0x2D/*::]*/: { n:'PtgAreaN', f:parse_PtgAreaN },\n\t/*::[*/0x2E/*::]*/: { n:'PtgMemAreaN', f:parse_PtgMemAreaN },\n\t/*::[*/0x2F/*::]*/: { n:'PtgMemNoMemN', f:parse_PtgMemNoMemN },\n\t/*::[*/0x39/*::]*/: { n:'PtgNameX', f:parse_PtgNameX },\n\t/*::[*/0x3A/*::]*/: { n:'PtgRef3d', f:parse_PtgRef3d },\n\t/*::[*/0x3B/*::]*/: { n:'PtgArea3d', f:parse_PtgArea3d },\n\t/*::[*/0x3C/*::]*/: { n:'PtgRefErr3d', f:parse_PtgRefErr3d },\n\t/*::[*/0x3D/*::]*/: { n:'PtgAreaErr3d', f:parse_PtgAreaErr3d },\n\t/*::[*/0xFF/*::]*/: {}\n};\n/* These are duplicated in the PtgTypes table */\nvar PtgDupes = {\n\t/*::[*/0x40/*::]*/: 0x20, /*::[*/0x60/*::]*/: 0x20,\n\t/*::[*/0x41/*::]*/: 0x21, /*::[*/0x61/*::]*/: 0x21,\n\t/*::[*/0x42/*::]*/: 0x22, /*::[*/0x62/*::]*/: 0x22,\n\t/*::[*/0x43/*::]*/: 0x23, /*::[*/0x63/*::]*/: 0x23,\n\t/*::[*/0x44/*::]*/: 0x24, /*::[*/0x64/*::]*/: 0x24,\n\t/*::[*/0x45/*::]*/: 0x25, /*::[*/0x65/*::]*/: 0x25,\n\t/*::[*/0x46/*::]*/: 0x26, /*::[*/0x66/*::]*/: 0x26,\n\t/*::[*/0x47/*::]*/: 0x27, /*::[*/0x67/*::]*/: 0x27,\n\t/*::[*/0x48/*::]*/: 0x28, /*::[*/0x68/*::]*/: 0x28,\n\t/*::[*/0x49/*::]*/: 0x29, /*::[*/0x69/*::]*/: 0x29,\n\t/*::[*/0x4A/*::]*/: 0x2A, /*::[*/0x6A/*::]*/: 0x2A,\n\t/*::[*/0x4B/*::]*/: 0x2B, /*::[*/0x6B/*::]*/: 0x2B,\n\t/*::[*/0x4C/*::]*/: 0x2C, /*::[*/0x6C/*::]*/: 0x2C,\n\t/*::[*/0x4D/*::]*/: 0x2D, /*::[*/0x6D/*::]*/: 0x2D,\n\t/*::[*/0x4E/*::]*/: 0x2E, /*::[*/0x6E/*::]*/: 0x2E,\n\t/*::[*/0x4F/*::]*/: 0x2F, /*::[*/0x6F/*::]*/: 0x2F,\n\t/*::[*/0x58/*::]*/: 0x22, /*::[*/0x78/*::]*/: 0x22,\n\t/*::[*/0x59/*::]*/: 0x39, /*::[*/0x79/*::]*/: 0x39,\n\t/*::[*/0x5A/*::]*/: 0x3A, /*::[*/0x7A/*::]*/: 0x3A,\n\t/*::[*/0x5B/*::]*/: 0x3B, /*::[*/0x7B/*::]*/: 0x3B,\n\t/*::[*/0x5C/*::]*/: 0x3C, /*::[*/0x7C/*::]*/: 0x3C,\n\t/*::[*/0x5D/*::]*/: 0x3D, /*::[*/0x7D/*::]*/: 0x3D\n};\n\nvar Ptg18 = {\n\t/*::[*/0x01/*::]*/: { n:'PtgElfLel', f:parse_PtgElfLel },\n\t/*::[*/0x02/*::]*/: { n:'PtgElfRw', f:parse_PtgElfRw },\n\t/*::[*/0x03/*::]*/: { n:'PtgElfCol', f:parse_PtgElfCol },\n\t/*::[*/0x06/*::]*/: { n:'PtgElfRwV', f:parse_PtgElfRwV },\n\t/*::[*/0x07/*::]*/: { n:'PtgElfColV', f:parse_PtgElfColV },\n\t/*::[*/0x0A/*::]*/: { n:'PtgElfRadical', f:parse_PtgElfRadical },\n\t/*::[*/0x0B/*::]*/: { n:'PtgElfRadicalS', f:parse_PtgElfRadicalS },\n\t/*::[*/0x0D/*::]*/: { n:'PtgElfColS', f:parse_PtgElfColS },\n\t/*::[*/0x0F/*::]*/: { n:'PtgElfColSV', f:parse_PtgElfColSV },\n\t/*::[*/0x10/*::]*/: { n:'PtgElfRadicalLel', f:parse_PtgElfRadicalLel },\n\t/*::[*/0x19/*::]*/: { n:'PtgList', f:parse_PtgList },\n\t/*::[*/0x1D/*::]*/: { n:'PtgSxName', f:parse_PtgSxName },\n\t/*::[*/0xFF/*::]*/: {}\n};\nvar Ptg19 = {\n\t/*::[*/0x00/*::]*/: { n:'PtgAttrNoop', f:parse_PtgAttrNoop },\n\t/*::[*/0x01/*::]*/: { n:'PtgAttrSemi', f:parse_PtgAttrSemi },\n\t/*::[*/0x02/*::]*/: { n:'PtgAttrIf', f:parse_PtgAttrIf },\n\t/*::[*/0x04/*::]*/: { n:'PtgAttrChoose', f:parse_PtgAttrChoose },\n\t/*::[*/0x08/*::]*/: { n:'PtgAttrGoto', f:parse_PtgAttrGoto },\n\t/*::[*/0x10/*::]*/: { n:'PtgAttrSum', f:parse_PtgAttrSum },\n\t/*::[*/0x20/*::]*/: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n\t/*::[*/0x21/*::]*/: { n:'PtgAttrBaxcel', f:parse_PtgAttrBaxcel },\n\t/*::[*/0x40/*::]*/: { n:'PtgAttrSpace', f:parse_PtgAttrSpace },\n\t/*::[*/0x41/*::]*/: { n:'PtgAttrSpaceSemi', f:parse_PtgAttrSpaceSemi },\n\t/*::[*/0x80/*::]*/: { n:'PtgAttrIfError', f:parse_PtgAttrIfError },\n\t/*::[*/0xFF/*::]*/: {}\n};\n\n/* [MS-XLS] 2.5.198.103 ; [MS-XLSB] 2.5.97.87 */\nfunction parse_RgbExtra(blob, length, rgce, opts) {\n\tif(opts.biff < 8) return parsenoop(blob, length);\n\tvar target = blob.l + length;\n\tvar o = [];\n\tfor(var i = 0; i !== rgce.length; ++i) {\n\t\tswitch(rgce[i][0]) {\n\t\t\tcase 'PtgArray': /* PtgArray -> PtgExtraArray */\n\t\t\t\trgce[i][1] = parse_PtgExtraArray(blob, 0, opts);\n\t\t\t\to.push(rgce[i][1]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemArea': /* PtgMemArea -> PtgExtraMem */\n\t\t\t\trgce[i][2] = parse_PtgExtraMem(blob, rgce[i][1], opts);\n\t\t\t\to.push(rgce[i][2]);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgExp': /* PtgExp -> PtgExtraCol */\n\t\t\t\tif(opts && opts.biff == 12) {\n\t\t\t\t\trgce[i][1][1] = blob.read_shift(4);\n\t\t\t\t\to.push(rgce[i][1]);\n\t\t\t\t} break;\n\t\t\tcase 'PtgList': /* TODO: PtgList -> PtgExtraList */\n\t\t\tcase 'PtgElfRadicalS': /* TODO: PtgElfRadicalS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColS': /* TODO: PtgElfColS -> PtgExtraElf */\n\t\t\tcase 'PtgElfColSV': /* TODO: PtgElfColSV -> PtgExtraElf */\n\t\t\t\tthrow \"Unsupported \" + rgce[i][0];\n\t\t\tdefault: break;\n\t\t}\n\t}\n\tlength = target - blob.l;\n\t/* note: this is technically an error but Excel disregards */\n\t//if(target !== blob.l && blob.l !== target - length) throw new Error(target + \" != \" + blob.l);\n\tif(length !== 0) o.push(parsenoop(blob, length));\n\treturn o;\n}\n\n/* [MS-XLS] 2.5.198.104 ; [MS-XLSB] 2.5.97.88 */\nfunction parse_Rgce(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar R, id, ptgs = [];\n\twhile(target != blob.l) {\n\t\tlength = target - blob.l;\n\t\tid = blob[blob.l];\n\t\tR = PtgTypes[id] || PtgTypes[PtgDupes[id]];\n\t\tif(id === 0x18 || id === 0x19) R = (id === 0x18 ? Ptg18 : Ptg19)[blob[blob.l + 1]];\n\t\tif(!R || !R.f) { /*ptgs.push*/(parsenoop(blob, length)); }\n\t\telse { ptgs.push([R.n, R.f(blob, length, opts)]); }\n\t}\n\treturn ptgs;\n}\n\nfunction stringify_array(f/*:Array>*/)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\tfor(var i = 0; i < f.length; ++i) {\n\t\tvar x = f[i], r/*:Array*/ = [];\n\t\tfor(var j = 0; j < x.length; ++j) {\n\t\t\tvar y = x[j];\n\t\t\tif(y) switch(y[0]) {\n\t\t\t\t// TODO: handle embedded quotes\n\t\t\t\tcase 0x02:\n\t\t\t\t\t/*:: if(typeof y[1] != 'string') throw \"unreachable\"; */\n\t\t\t\t\tr.push('\"' + y[1].replace(/\"/g,'\"\"') + '\"'); break;\n\t\t\t\tdefault: r.push(y[1]);\n\t\t\t} else r.push(\"\");\n\t\t}\n\t\to.push(r.join(\",\"));\n\t}\n\treturn o.join(\";\");\n}\n\n/* [MS-XLS] 2.2.2 ; [MS-XLSB] 2.2.2 TODO */\nvar PtgBinOp = {\n\tPtgAdd: \"+\",\n\tPtgConcat: \"&\",\n\tPtgDiv: \"/\",\n\tPtgEq: \"=\",\n\tPtgGe: \">=\",\n\tPtgGt: \">\",\n\tPtgLe: \"<=\",\n\tPtgLt: \"<\",\n\tPtgMul: \"*\",\n\tPtgNe: \"<>\",\n\tPtgPower: \"^\",\n\tPtgSub: \"-\"\n};\n\n// List of invalid characters needs to be tested further\nfunction formula_quote_sheet_name(sname/*:string*/, opts)/*:string*/ {\n\tif(!sname && !(opts && opts.biff <= 5 && opts.biff >= 2)) throw new Error(\"empty sheet name\");\n\tif (/[^\\w\\u4E00-\\u9FFF\\u3040-\\u30FF]/.test(sname)) return \"'\" + sname + \"'\";\n\treturn sname;\n}\nfunction get_ixti_raw(supbooks, ixti/*:number*/, opts)/*:string*/ {\n\tif(!supbooks) return \"SH33TJSERR0\";\n\tif(opts.biff > 8 && (!supbooks.XTI || !supbooks.XTI[ixti])) return supbooks.SheetNames[ixti];\n\tif(!supbooks.XTI) return \"SH33TJSERR6\";\n\tvar XTI = supbooks.XTI[ixti];\n\tif(opts.biff < 8) {\n\t\tif(ixti > 10000) ixti-= 65536;\n\t\tif(ixti < 0) ixti = -ixti;\n\t\treturn ixti == 0 ? \"\" : supbooks.XTI[ixti - 1];\n\t}\n\tif(!XTI) return \"SH33TJSERR1\";\n\tvar o = \"\";\n\tif(opts.biff > 8) switch(supbooks[XTI[0]][0]) {\n\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\to = XTI[1] == -1 ? \"#REF\" : supbooks.SheetNames[XTI[1]];\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tif(opts.SID != null) return supbooks.SheetNames[opts.SID];\n\t\t\treturn \"SH33TJSSAME\" + supbooks[XTI[0]][0];\n\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\t/* falls through */\n\t\tdefault: return \"SH33TJSSRC\" + supbooks[XTI[0]][0];\n\t}\n\tswitch(supbooks[XTI[0]][0][0]) {\n\t\tcase 0x0401:\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks.SheetNames[XTI[1]] || \"SH33TJSERR3\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks.SheetNames[XTI[2]];\n\t\tcase 0x3A01: return supbooks[XTI[0]].slice(1).map(function(name) { return name.Name; }).join(\";;\"); //return \"SH33TJSERR8\";\n\t\tdefault:\n\t\t\tif(!supbooks[XTI[0]][0][3]) return \"SH33TJSERR2\";\n\t\t\to = XTI[1] == -1 ? \"#REF\" : (supbooks[XTI[0]][0][3][XTI[1]] || \"SH33TJSERR4\");\n\t\t\treturn XTI[1] == XTI[2] ? o : o + \":\" + supbooks[XTI[0]][0][3][XTI[2]];\n\t}\n}\nfunction get_ixti(supbooks, ixti/*:number*/, opts)/*:string*/ {\n\tvar ixtiraw = get_ixti_raw(supbooks, ixti, opts);\n\treturn ixtiraw == \"#REF\" ? ixtiraw : formula_quote_sheet_name(ixtiraw, opts);\n}\nfunction stringify_formula(formula/*Array*/, range, cell/*:any*/, supbooks, opts)/*:string*/ {\n\tvar biff = (opts && opts.biff) || 8;\n\tvar _range = /*range != null ? range :*/ {s:{c:0, r:0},e:{c:0, r:0}};\n\tvar stack/*:Array*/ = [], e1, e2, /*::type,*/ c/*:CellAddress*/, ixti=0, nameidx=0, r, sname=\"\";\n\tif(!formula[0] || !formula[0][0]) return \"\";\n\tvar last_sp = -1, sp = \"\";\n\tfor(var ff = 0, fflen = formula[0].length; ff < fflen; ++ff) {\n\t\tvar f = formula[0][ff];\n\t\tswitch(f[0]) {\n\t\t\tcase 'PtgUminus': /* [MS-XLS] 2.5.198.93 */\n\t\t\t\tstack.push(\"-\" + stack.pop()); break;\n\t\t\tcase 'PtgUplus': /* [MS-XLS] 2.5.198.95 */\n\t\t\t\tstack.push(\"+\" + stack.pop()); break;\n\t\t\tcase 'PtgPercent': /* [MS-XLS] 2.5.198.81 */\n\t\t\t\tstack.push(stack.pop() + \"%\"); break;\n\n\t\t\tcase 'PtgAdd': /* [MS-XLS] 2.5.198.26 */\n\t\t\tcase 'PtgConcat': /* [MS-XLS] 2.5.198.43 */\n\t\t\tcase 'PtgDiv': /* [MS-XLS] 2.5.198.45 */\n\t\t\tcase 'PtgEq': /* [MS-XLS] 2.5.198.56 */\n\t\t\tcase 'PtgGe': /* [MS-XLS] 2.5.198.64 */\n\t\t\tcase 'PtgGt': /* [MS-XLS] 2.5.198.65 */\n\t\t\tcase 'PtgLe': /* [MS-XLS] 2.5.198.68 */\n\t\t\tcase 'PtgLt': /* [MS-XLS] 2.5.198.69 */\n\t\t\tcase 'PtgMul': /* [MS-XLS] 2.5.198.75 */\n\t\t\tcase 'PtgNe': /* [MS-XLS] 2.5.198.78 */\n\t\t\tcase 'PtgPower': /* [MS-XLS] 2.5.198.82 */\n\t\t\tcase 'PtgSub': /* [MS-XLS] 2.5.198.90 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\" \", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tsp = fill(\"\\r\", formula[0][last_sp][1][1]); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tsp = \"\";\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\te2 = e2 + sp;\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(e2+PtgBinOp[f[0]]+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgIsect': /* [MS-XLS] 2.5.198.67 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\" \"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgUnion': /* [MS-XLS] 2.5.198.94 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\",\"+e1);\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRange': /* [MS-XLS] 2.5.198.83 */\n\t\t\t\te1 = stack.pop(); e2 = stack.pop();\n\t\t\t\tstack.push(e2+\":\"+e1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrChoose': /* [MS-XLS] 2.5.198.34 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrGoto': /* [MS-XLS] 2.5.198.35 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIf': /* [MS-XLS] 2.5.198.36 */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrIfError': /* [MS-XLSB] 2.5.97.28 */\n\t\t\t\tbreak;\n\n\n\t\t\tcase 'PtgRef': /* [MS-XLS] 2.5.198.84 */\n\t\t\t\t/*::type = f[1][0]; */c = shift_cell_xls((f[1][1]/*:any*/), _range, opts);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRefN': /* [MS-XLS] 2.5.198.88 */\n\t\t\t\t/*::type = f[1][0]; */c = cell ? shift_cell_xls((f[1][1]/*:any*/), cell, opts) : (f[1][1]/*:any*/);\n\t\t\t\tstack.push(encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgRef3d': /* [MS-XLS] 2.5.198.85 */\n\t\t\t\t/*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; c = shift_cell_xls((f[1][2]/*:any*/), _range, opts);\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tvar w = sname; /* IE9 fails on defined names */ // eslint-disable-line no-unused-vars\n\t\t\t\tstack.push(sname + \"!\" + encode_cell_xls(c, biff));\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgFunc': /* [MS-XLS] 2.5.198.62 */\n\t\t\tcase 'PtgFuncVar': /* [MS-XLS] 2.5.198.63 */\n\t\t\t\t/* f[1] = [argc, func, type] */\n\t\t\t\tvar argc/*:number*/ = (f[1][0]/*:any*/), func/*:string*/ = (f[1][1]/*:any*/);\n\t\t\t\tif(!argc) argc = 0;\n\t\t\t\targc &= 0x7F;\n\t\t\t\tvar args = argc == 0 ? [] : stack.slice(-argc);\n\t\t\t\tstack.length -= argc;\n\t\t\t\tif(func === 'User') func = args.shift();\n\t\t\t\tstack.push(func + \"(\" + args.join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgBool': /* [MS-XLS] 2.5.198.42 */\n\t\t\t\tstack.push(f[1] ? \"TRUE\" : \"FALSE\"); break;\n\t\t\tcase 'PtgInt': /* [MS-XLS] 2.5.198.66 */\n\t\t\t\tstack.push(/*::String(*/f[1]/*::)*/); break;\n\t\t\tcase 'PtgNum': /* [MS-XLS] 2.5.198.79 TODO: precision? */\n\t\t\t\tstack.push(String(f[1])); break;\n\t\t\tcase 'PtgStr': /* [MS-XLS] 2.5.198.89 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push('\"' + f[1].replace(/\"/g, '\"\"') + '\"'); break;\n\t\t\tcase 'PtgErr': /* [MS-XLS] 2.5.198.57 */\n\t\t\t\tstack.push(/*::String(*/f[1]/*::)*/); break;\n\t\t\tcase 'PtgAreaN': /* [MS-XLS] 2.5.198.31 TODO */\n\t\t\t\t/*::type = f[1][0]; */r = shift_range_xls(f[1][1], cell ? {s:cell} : _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r/*:any*/), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea': /* [MS-XLS] 2.5.198.27 TODO: fixed points */\n\t\t\t\t/*::type = f[1][0]; */r = shift_range_xls(f[1][1], _range, opts);\n\t\t\t\tstack.push(encode_range_xls((r/*:any*/), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgArea3d': /* [MS-XLS] 2.5.198.28 TODO */\n\t\t\t\t/*::type = f[1][0]; */ixti = /*::Number(*/f[1][1]/*::)*/; r = f[1][2];\n\t\t\t\tsname = get_ixti(supbooks, ixti, opts);\n\t\t\t\tstack.push(sname + \"!\" + encode_range_xls((r/*:any*/), opts));\n\t\t\t\tbreak;\n\t\t\tcase 'PtgAttrSum': /* [MS-XLS] 2.5.198.41 */\n\t\t\t\tstack.push(\"SUM(\" + stack.pop() + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrBaxcel': /* [MS-XLS] 2.5.198.33 */\n\t\t\tcase 'PtgAttrSemi': /* [MS-XLS] 2.5.198.37 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgName': /* [MS-XLS] 2.5.198.76 ; [MS-XLSB] 2.5.97.60 TODO: revisions */\n\t\t\t\t/* f[1] = type, 0, nameindex */\n\t\t\t\tnameidx = (f[1][2]/*:any*/);\n\t\t\t\tvar lbl = (supbooks.names||[])[nameidx-1] || (supbooks[0]||[])[nameidx];\n\t\t\t\tvar name = lbl ? lbl.Name : \"SH33TJSNAME\" + String(nameidx);\n\t\t\t\t/* [MS-XLSB] 2.5.97.10 Ftab -- last verified 20220204 */\n\t\t\t\tif(name && name.slice(0,6) == \"_xlfn.\" && !opts.xlfn) name = name.slice(6);\n\t\t\t\tstack.push(name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgNameX': /* [MS-XLS] 2.5.198.77 ; [MS-XLSB] 2.5.97.61 TODO: revisions */\n\t\t\t\t/* f[1] = type, ixti, nameindex */\n\t\t\t\tvar bookidx/*:number*/ = (f[1][1]/*:any*/); nameidx = (f[1][2]/*:any*/); var externbook;\n\t\t\t\t/* TODO: Properly handle missing values -- this should be using get_ixti_raw primarily */\n\t\t\t\tif(opts.biff <= 5) {\n\t\t\t\t\tif(bookidx < 0) bookidx = -bookidx;\n\t\t\t\t\tif(supbooks[bookidx]) externbook = supbooks[bookidx][nameidx];\n\t\t\t\t} else {\n\t\t\t\t\tvar o = \"\";\n\t\t\t\t\tif(((supbooks[bookidx]||[])[0]||[])[0] == 0x3A01){/* empty */}\n\t\t\t\t\telse if(((supbooks[bookidx]||[])[0]||[])[0] == 0x0401){\n\t\t\t\t\t\tif(supbooks[bookidx][nameidx] && supbooks[bookidx][nameidx].itab > 0) {\n\t\t\t\t\t\t\to = supbooks.SheetNames[supbooks[bookidx][nameidx].itab-1] + \"!\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\telse o = supbooks.SheetNames[nameidx-1]+ \"!\";\n\t\t\t\t\tif(supbooks[bookidx] && supbooks[bookidx][nameidx]) o += supbooks[bookidx][nameidx].Name;\n\t\t\t\t\telse if(supbooks[0] && supbooks[0][nameidx]) o += supbooks[0][nameidx].Name;\n\t\t\t\t\telse {\n\t\t\t\t\t\tvar ixtidata = (get_ixti_raw(supbooks, bookidx, opts)||\"\").split(\";;\");\n\t\t\t\t\t\tif(ixtidata[nameidx - 1]) o = ixtidata[nameidx - 1]; // TODO: confirm this is correct\n\t\t\t\t\t\telse o += \"SH33TJSERRX\";\n\t\t\t\t\t}\n\t\t\t\t\tstack.push(o);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(!externbook) externbook = {Name: \"SH33TJSERRY\"};\n\t\t\t\tstack.push(externbook.Name);\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgParen': /* [MS-XLS] 2.5.198.80 */\n\t\t\t\tvar lp = '(', rp = ')';\n\t\t\t\tif(last_sp >= 0) {\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\tswitch(formula[0][last_sp][1][0]) {\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 2: lp = fill(\" \", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 3: lp = fill(\"\\r\", formula[0][last_sp][1][1]) + lp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 4: rp = fill(\" \", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\tcase 5: rp = fill(\"\\r\", formula[0][last_sp][1][1]) + rp; break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + formula[0][last_sp][1][0]);\n\t\t\t\t\t}\n\t\t\t\t\tlast_sp = -1;\n\t\t\t\t}\n\t\t\t\tstack.push(lp + stack.pop() + rp); break;\n\n\t\t\tcase 'PtgRefErr': /* [MS-XLS] 2.5.198.86 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgRefErr3d': /* [MS-XLS] 2.5.198.87 */\n\t\t\t\tstack.push('#REF!'); break;\n\n\t\t\tcase 'PtgExp': /* [MS-XLS] 2.5.198.58 TODO */\n\t\t\t\tc = {c:(f[1][1]/*:any*/),r:(f[1][0]/*:any*/)};\n\t\t\t\tvar q = ({c: cell.c, r:cell.r}/*:any*/);\n\t\t\t\tif(supbooks.sharedf[encode_cell(c)]) {\n\t\t\t\t\tvar parsedf = (supbooks.sharedf[encode_cell(c)]);\n\t\t\t\t\tstack.push(stringify_formula(parsedf, _range, q, supbooks, opts));\n\t\t\t\t} else {\n\t\t\t\t\tvar fnd = false;\n\t\t\t\t\tfor(e1=0;e1!=supbooks.arrayf.length; ++e1) {\n\t\t\t\t\t\t/* TODO: should be something like range_has */\n\t\t\t\t\t\te2 = supbooks.arrayf[e1];\n\t\t\t\t\t\tif(c.c < e2[0].s.c || c.c > e2[0].e.c) continue;\n\t\t\t\t\t\tif(c.r < e2[0].s.r || c.r > e2[0].e.r) continue;\n\t\t\t\t\t\tstack.push(stringify_formula(e2[1], _range, q, supbooks, opts));\n\t\t\t\t\t\tfnd = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tif(!fnd) stack.push(/*::String(*/f[1]/*::)*/);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgArray': /* [MS-XLS] 2.5.198.32 TODO */\n\t\t\t\tstack.push(\"{\" + stringify_array(/*::(*/f[1]/*:: :any)*/) + \"}\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemArea': /* [MS-XLS] 2.5.198.70 TODO: confirm this is a non-display */\n\t\t\t\t//stack.push(\"(\" + f[2].map(encode_range).join(\",\") + \")\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAttrSpace': /* [MS-XLS] 2.5.198.38 */\n\t\t\tcase 'PtgAttrSpaceSemi': /* [MS-XLS] 2.5.198.39 */\n\t\t\t\tlast_sp = ff;\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgTbl': /* [MS-XLS] 2.5.198.92 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemErr': /* [MS-XLS] 2.5.198.71 */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMissArg': /* [MS-XLS] 2.5.198.74 */\n\t\t\t\tstack.push(\"\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgAreaErr': /* [MS-XLS] 2.5.198.29 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgAreaErr3d': /* [MS-XLS] 2.5.198.30 */\n\t\t\t\tstack.push(\"#REF!\"); break;\n\n\t\t\tcase 'PtgList': /* [MS-XLSB] 2.5.97.52 */\n\t\t\t\t// $FlowIgnore\n\t\t\t\tstack.push(\"Table\" + f[1].idx + \"[#\" + f[1].rt + \"]\");\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemAreaN':\n\t\t\tcase 'PtgMemNoMemN':\n\t\t\tcase 'PtgAttrNoop':\n\t\t\tcase 'PtgSheet':\n\t\t\tcase 'PtgEndSheet':\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgMemFunc': /* [MS-XLS] 2.5.198.72 TODO */\n\t\t\t\tbreak;\n\t\t\tcase 'PtgMemNoMem': /* [MS-XLS] 2.5.198.73 TODO */\n\t\t\t\tbreak;\n\n\t\t\tcase 'PtgElfCol': /* [MS-XLS] 2.5.198.46 */\n\t\t\tcase 'PtgElfColS': /* [MS-XLS] 2.5.198.47 */\n\t\t\tcase 'PtgElfColSV': /* [MS-XLS] 2.5.198.48 */\n\t\t\tcase 'PtgElfColV': /* [MS-XLS] 2.5.198.49 */\n\t\t\tcase 'PtgElfLel': /* [MS-XLS] 2.5.198.50 */\n\t\t\tcase 'PtgElfRadical': /* [MS-XLS] 2.5.198.51 */\n\t\t\tcase 'PtgElfRadicalLel': /* [MS-XLS] 2.5.198.52 */\n\t\t\tcase 'PtgElfRadicalS': /* [MS-XLS] 2.5.198.53 */\n\t\t\tcase 'PtgElfRw': /* [MS-XLS] 2.5.198.54 */\n\t\t\tcase 'PtgElfRwV': /* [MS-XLS] 2.5.198.55 */\n\t\t\t\tthrow new Error(\"Unsupported ELFs\");\n\n\t\t\tcase 'PtgSxName': /* [MS-XLS] 2.5.198.91 TODO -- find a test case */\n\t\t\t\tthrow new Error('Unrecognized Formula Token: ' + String(f));\n\t\t\tdefault: throw new Error('Unrecognized Formula Token: ' + String(f));\n\t\t}\n\t\tvar PtgNonDisp = ['PtgAttrSpace', 'PtgAttrSpaceSemi', 'PtgAttrGoto'];\n\t\tif(opts.biff != 3) if(last_sp >= 0 && PtgNonDisp.indexOf(formula[0][ff][0]) == -1) {\n\t\t\tf = formula[0][last_sp];\n\t\t\tvar _left = true;\n\t\t\tswitch(f[1][0]) {\n\t\t\t\t/* note: some bad XLSB files omit the PtgParen */\n\t\t\t\tcase 4: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 0:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\" \", f[1][1]); break;\n\t\t\t\tcase 5: _left = false;\n\t\t\t\t/* falls through */\n\t\t\t\tcase 1:\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tsp = fill(\"\\r\", f[1][1]); break;\n\t\t\t\tdefault:\n\t\t\t\t\tsp = \"\";\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(opts.WTF) throw new Error(\"Unexpected PtgAttrSpaceType \" + f[1][0]);\n\t\t\t}\n\t\t\tstack.push((_left ? sp : \"\") + stack.pop() + (_left ? \"\" : sp));\n\t\t\tlast_sp = -1;\n\t\t}\n\t}\n\tif(stack.length > 1 && opts.WTF) throw new Error(\"bad formula stack\");\n\treturn stack[0];\n}\n\n/* [MS-XLS] 2.5.198.1 TODO */\nfunction parse_ArrayParsedFormula(blob, length, opts/*::, ref*/) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.3 TODO */\nfunction parse_XLSCellParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length, len = opts.biff == 2 ? 1 : 2;\n\tvar rgcb, cce = blob.read_shift(len); // length of rgce\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(length !== cce + len) rgcb = parse_RgbExtra(blob, length - cce - len, rgce, opts);\n\tblob.l = target;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.21 */\nfunction parse_NameParsedFormula(blob, length, opts, cce) {\n\tvar target = blob.l + length;\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tvar rgcb;\n\tif(target !== blob.l) rgcb = parse_RgbExtra(blob, target - blob.l, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.198.118 TODO */\nfunction parse_SharedParsedFormula(blob, length, opts) {\n\tvar target = blob.l + length;\n\tvar rgcb, cce = blob.read_shift(2); // length of rgce\n\tvar rgce = parse_Rgce(blob, cce, opts);\n\tif(cce == 0xFFFF) return [[],parsenoop(blob, length-2)];\n\tif(length !== cce + 2) rgcb = parse_RgbExtra(blob, target - cce - 2, rgce, opts);\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLS] 2.5.133 TODO: how to emit empty strings? */\nfunction parse_FormulaValue(blob/*::, length*/) {\n\tvar b;\n\tif(__readUInt16LE(blob,blob.l + 6) !== 0xFFFF) return [parse_Xnum(blob),'n'];\n\tswitch(blob[blob.l]) {\n\t\tcase 0x00: blob.l += 8; return [\"String\", 's'];\n\t\tcase 0x01: b = blob[blob.l+2] === 0x1; blob.l += 8; return [b,'b'];\n\t\tcase 0x02: b = blob[blob.l+2]; blob.l += 8; return [b,'e'];\n\t\tcase 0x03: blob.l += 8; return [\"\",'s'];\n\t}\n\treturn [];\n}\nfunction write_FormulaValue(value) {\n\tif(value == null) {\n\t\t// Blank String Value\n\t\tvar o = new_buf(8);\n\t\to.write_shift(1, 0x03);\n\t\to.write_shift(1, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0);\n\t\to.write_shift(2, 0xFFFF);\n\t\treturn o;\n\t} else if(typeof value == \"number\") return write_Xnum(value);\n\treturn write_Xnum(0);\n}\n\n/* [MS-XLS] 2.4.127 TODO */\nfunction parse_Formula(blob, length, opts) {\n\tvar end = blob.l + length;\n\tvar cell = parse_XLSCell(blob, 6);\n\tif(opts.biff == 2) ++blob.l;\n\tvar val = parse_FormulaValue(blob,8);\n\tvar flags = blob.read_shift(1);\n\tif(opts.biff != 2) {\n\t\tblob.read_shift(1);\n\t\tif(opts.biff >= 5) {\n\t\t\t/*var chn = */blob.read_shift(4);\n\t\t}\n\t}\n\tvar cbf = parse_XLSCellParsedFormula(blob, end - blob.l, opts);\n\treturn {cell:cell, val:val[0], formula:cbf, shared: (flags >> 3) & 1, tt:val[1]};\n}\nfunction write_Formula(cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, os/*:number*/) {\n\t// Cell\n\tvar o1 = write_XLSCell(R, C, os);\n\n\t// FormulaValue\n\tvar o2 = write_FormulaValue(cell.v);\n\n\t// flags + cache\n\tvar o3 = new_buf(6);\n\tvar flags = 0x01 | 0x20;\n\to3.write_shift(2, flags);\n\to3.write_shift(4, 0);\n\n\t// CellParsedFormula\n\tvar bf = new_buf(cell.bf.length);\n\tfor(var i = 0; i < cell.bf.length; ++i) bf[i] = cell.bf[i];\n\n\tvar out = bconcat([o1, o2, o3, bf]);\n\treturn out;\n}\n\n\n/* XLSB Parsed Formula records have the same shape */\nfunction parse_XLSBParsedFormula(data, length, opts) {\n\tvar cce = data.read_shift(4);\n\tvar rgce = parse_Rgce(data, cce, opts);\n\tvar cb = data.read_shift(4);\n\tvar rgcb = cb > 0 ? parse_RgbExtra(data, cb, rgce, opts) : null;\n\treturn [rgce, rgcb];\n}\n\n/* [MS-XLSB] 2.5.97.1 ArrayParsedFormula */\nvar parse_XLSBArrayParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.4 CellParsedFormula */\nvar parse_XLSBCellParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.8 DVParsedFormula */\n//var parse_XLSBDVParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.9 FRTParsedFormula */\n//var parse_XLSBFRTParsedFormula = parse_XLSBParsedFormula2;\n/* [MS-XLSB] 2.5.97.12 NameParsedFormula */\nvar parse_XLSBNameParsedFormula = parse_XLSBParsedFormula;\n/* [MS-XLSB] 2.5.97.98 SharedParsedFormula */\nvar parse_XLSBSharedParsedFormula = parse_XLSBParsedFormula;\nvar Cetab = {\n 0: \"BEEP\",\n 1: \"OPEN\",\n 2: \"OPEN.LINKS\",\n 3: \"CLOSE.ALL\",\n 4: \"SAVE\",\n 5: \"SAVE.AS\",\n 6: \"FILE.DELETE\",\n 7: \"PAGE.SETUP\",\n 8: \"PRINT\",\n 9: \"PRINTER.SETUP\",\n 10: \"QUIT\",\n 11: \"NEW.WINDOW\",\n 12: \"ARRANGE.ALL\",\n 13: \"WINDOW.SIZE\",\n 14: \"WINDOW.MOVE\",\n 15: \"FULL\",\n 16: \"CLOSE\",\n 17: \"RUN\",\n 22: \"SET.PRINT.AREA\",\n 23: \"SET.PRINT.TITLES\",\n 24: \"SET.PAGE.BREAK\",\n 25: \"REMOVE.PAGE.BREAK\",\n 26: \"FONT\",\n 27: \"DISPLAY\",\n 28: \"PROTECT.DOCUMENT\",\n 29: \"PRECISION\",\n 30: \"A1.R1C1\",\n 31: \"CALCULATE.NOW\",\n 32: \"CALCULATION\",\n 34: \"DATA.FIND\",\n 35: \"EXTRACT\",\n 36: \"DATA.DELETE\",\n 37: \"SET.DATABASE\",\n 38: \"SET.CRITERIA\",\n 39: \"SORT\",\n 40: \"DATA.SERIES\",\n 41: \"TABLE\",\n 42: \"FORMAT.NUMBER\",\n 43: \"ALIGNMENT\",\n 44: \"STYLE\",\n 45: \"BORDER\",\n 46: \"CELL.PROTECTION\",\n 47: \"COLUMN.WIDTH\",\n 48: \"UNDO\",\n 49: \"CUT\",\n 50: \"COPY\",\n 51: \"PASTE\",\n 52: \"CLEAR\",\n 53: \"PASTE.SPECIAL\",\n 54: \"EDIT.DELETE\",\n 55: \"INSERT\",\n 56: \"FILL.RIGHT\",\n 57: \"FILL.DOWN\",\n 61: \"DEFINE.NAME\",\n 62: \"CREATE.NAMES\",\n 63: \"FORMULA.GOTO\",\n 64: \"FORMULA.FIND\",\n 65: \"SELECT.LAST.CELL\",\n 66: \"SHOW.ACTIVE.CELL\",\n 67: \"GALLERY.AREA\",\n 68: \"GALLERY.BAR\",\n 69: \"GALLERY.COLUMN\",\n 70: \"GALLERY.LINE\",\n 71: \"GALLERY.PIE\",\n 72: \"GALLERY.SCATTER\",\n 73: \"COMBINATION\",\n 74: \"PREFERRED\",\n 75: \"ADD.OVERLAY\",\n 76: \"GRIDLINES\",\n 77: \"SET.PREFERRED\",\n 78: \"AXES\",\n 79: \"LEGEND\",\n 80: \"ATTACH.TEXT\",\n 81: \"ADD.ARROW\",\n 82: \"SELECT.CHART\",\n 83: \"SELECT.PLOT.AREA\",\n 84: \"PATTERNS\",\n 85: \"MAIN.CHART\",\n 86: \"OVERLAY\",\n 87: \"SCALE\",\n 88: \"FORMAT.LEGEND\",\n 89: \"FORMAT.TEXT\",\n 90: \"EDIT.REPEAT\",\n 91: \"PARSE\",\n 92: \"JUSTIFY\",\n 93: \"HIDE\",\n 94: \"UNHIDE\",\n 95: \"WORKSPACE\",\n 96: \"FORMULA\",\n 97: \"FORMULA.FILL\",\n 98: \"FORMULA.ARRAY\",\n 99: \"DATA.FIND.NEXT\",\n 100: \"DATA.FIND.PREV\",\n 101: \"FORMULA.FIND.NEXT\",\n 102: \"FORMULA.FIND.PREV\",\n 103: \"ACTIVATE\",\n 104: \"ACTIVATE.NEXT\",\n 105: \"ACTIVATE.PREV\",\n 106: \"UNLOCKED.NEXT\",\n 107: \"UNLOCKED.PREV\",\n 108: \"COPY.PICTURE\",\n 109: \"SELECT\",\n 110: \"DELETE.NAME\",\n 111: \"DELETE.FORMAT\",\n 112: \"VLINE\",\n 113: \"HLINE\",\n 114: \"VPAGE\",\n 115: \"HPAGE\",\n 116: \"VSCROLL\",\n 117: \"HSCROLL\",\n 118: \"ALERT\",\n 119: \"NEW\",\n 120: \"CANCEL.COPY\",\n 121: \"SHOW.CLIPBOARD\",\n 122: \"MESSAGE\",\n 124: \"PASTE.LINK\",\n 125: \"APP.ACTIVATE\",\n 126: \"DELETE.ARROW\",\n 127: \"ROW.HEIGHT\",\n 128: \"FORMAT.MOVE\",\n 129: \"FORMAT.SIZE\",\n 130: \"FORMULA.REPLACE\",\n 131: \"SEND.KEYS\",\n 132: \"SELECT.SPECIAL\",\n 133: \"APPLY.NAMES\",\n 134: \"REPLACE.FONT\",\n 135: \"FREEZE.PANES\",\n 136: \"SHOW.INFO\",\n 137: \"SPLIT\",\n 138: \"ON.WINDOW\",\n 139: \"ON.DATA\",\n 140: \"DISABLE.INPUT\",\n 142: \"OUTLINE\",\n 143: \"LIST.NAMES\",\n 144: \"FILE.CLOSE\",\n 145: \"SAVE.WORKBOOK\",\n 146: \"DATA.FORM\",\n 147: \"COPY.CHART\",\n 148: \"ON.TIME\",\n 149: \"WAIT\",\n 150: \"FORMAT.FONT\",\n 151: \"FILL.UP\",\n 152: \"FILL.LEFT\",\n 153: \"DELETE.OVERLAY\",\n 155: \"SHORT.MENUS\",\n 159: \"SET.UPDATE.STATUS\",\n 161: \"COLOR.PALETTE\",\n 162: \"DELETE.STYLE\",\n 163: \"WINDOW.RESTORE\",\n 164: \"WINDOW.MAXIMIZE\",\n 166: \"CHANGE.LINK\",\n 167: \"CALCULATE.DOCUMENT\",\n 168: \"ON.KEY\",\n 169: \"APP.RESTORE\",\n 170: \"APP.MOVE\",\n 171: \"APP.SIZE\",\n 172: \"APP.MINIMIZE\",\n 173: \"APP.MAXIMIZE\",\n 174: \"BRING.TO.FRONT\",\n 175: \"SEND.TO.BACK\",\n 185: \"MAIN.CHART.TYPE\",\n 186: \"OVERLAY.CHART.TYPE\",\n 187: \"SELECT.END\",\n 188: \"OPEN.MAIL\",\n 189: \"SEND.MAIL\",\n 190: \"STANDARD.FONT\",\n 191: \"CONSOLIDATE\",\n 192: \"SORT.SPECIAL\",\n 193: \"GALLERY.3D.AREA\",\n 194: \"GALLERY.3D.COLUMN\",\n 195: \"GALLERY.3D.LINE\",\n 196: \"GALLERY.3D.PIE\",\n 197: \"VIEW.3D\",\n 198: \"GOAL.SEEK\",\n 199: \"WORKGROUP\",\n 200: \"FILL.GROUP\",\n 201: \"UPDATE.LINK\",\n 202: \"PROMOTE\",\n 203: \"DEMOTE\",\n 204: \"SHOW.DETAIL\",\n 206: \"UNGROUP\",\n 207: \"OBJECT.PROPERTIES\",\n 208: \"SAVE.NEW.OBJECT\",\n 209: \"SHARE\",\n 210: \"SHARE.NAME\",\n 211: \"DUPLICATE\",\n 212: \"APPLY.STYLE\",\n 213: \"ASSIGN.TO.OBJECT\",\n 214: \"OBJECT.PROTECTION\",\n 215: \"HIDE.OBJECT\",\n 216: \"SET.EXTRACT\",\n 217: \"CREATE.PUBLISHER\",\n 218: \"SUBSCRIBE.TO\",\n 219: \"ATTRIBUTES\",\n 220: \"SHOW.TOOLBAR\",\n 222: \"PRINT.PREVIEW\",\n 223: \"EDIT.COLOR\",\n 224: \"SHOW.LEVELS\",\n 225: \"FORMAT.MAIN\",\n 226: \"FORMAT.OVERLAY\",\n 227: \"ON.RECALC\",\n 228: \"EDIT.SERIES\",\n 229: \"DEFINE.STYLE\",\n 240: \"LINE.PRINT\",\n 243: \"ENTER.DATA\",\n 249: \"GALLERY.RADAR\",\n 250: \"MERGE.STYLES\",\n 251: \"EDITION.OPTIONS\",\n 252: \"PASTE.PICTURE\",\n 253: \"PASTE.PICTURE.LINK\",\n 254: \"SPELLING\",\n 256: \"ZOOM\",\n 259: \"INSERT.OBJECT\",\n 260: \"WINDOW.MINIMIZE\",\n 265: \"SOUND.NOTE\",\n 266: \"SOUND.PLAY\",\n 267: \"FORMAT.SHAPE\",\n 268: \"EXTEND.POLYGON\",\n 269: \"FORMAT.AUTO\",\n 272: \"GALLERY.3D.BAR\",\n 273: \"GALLERY.3D.SURFACE\",\n 274: \"FILL.AUTO\",\n 276: \"CUSTOMIZE.TOOLBAR\",\n 277: \"ADD.TOOL\",\n 278: \"EDIT.OBJECT\",\n 279: \"ON.DOUBLECLICK\",\n 280: \"ON.ENTRY\",\n 281: \"WORKBOOK.ADD\",\n 282: \"WORKBOOK.MOVE\",\n 283: \"WORKBOOK.COPY\",\n 284: \"WORKBOOK.OPTIONS\",\n 285: \"SAVE.WORKSPACE\",\n 288: \"CHART.WIZARD\",\n 289: \"DELETE.TOOL\",\n 290: \"MOVE.TOOL\",\n 291: \"WORKBOOK.SELECT\",\n 292: \"WORKBOOK.ACTIVATE\",\n 293: \"ASSIGN.TO.TOOL\",\n 295: \"COPY.TOOL\",\n 296: \"RESET.TOOL\",\n 297: \"CONSTRAIN.NUMERIC\",\n 298: \"PASTE.TOOL\",\n 302: \"WORKBOOK.NEW\",\n 305: \"SCENARIO.CELLS\",\n 306: \"SCENARIO.DELETE\",\n 307: \"SCENARIO.ADD\",\n 308: \"SCENARIO.EDIT\",\n 309: \"SCENARIO.SHOW\",\n 310: \"SCENARIO.SHOW.NEXT\",\n 311: \"SCENARIO.SUMMARY\",\n 312: \"PIVOT.TABLE.WIZARD\",\n 313: \"PIVOT.FIELD.PROPERTIES\",\n 314: \"PIVOT.FIELD\",\n 315: \"PIVOT.ITEM\",\n 316: \"PIVOT.ADD.FIELDS\",\n 318: \"OPTIONS.CALCULATION\",\n 319: \"OPTIONS.EDIT\",\n 320: \"OPTIONS.VIEW\",\n 321: \"ADDIN.MANAGER\",\n 322: \"MENU.EDITOR\",\n 323: \"ATTACH.TOOLBARS\",\n 324: \"VBAActivate\",\n 325: \"OPTIONS.CHART\",\n 328: \"VBA.INSERT.FILE\",\n 330: \"VBA.PROCEDURE.DEFINITION\",\n 336: \"ROUTING.SLIP\",\n 338: \"ROUTE.DOCUMENT\",\n 339: \"MAIL.LOGON\",\n 342: \"INSERT.PICTURE\",\n 343: \"EDIT.TOOL\",\n 344: \"GALLERY.DOUGHNUT\",\n 350: \"CHART.TREND\",\n 352: \"PIVOT.ITEM.PROPERTIES\",\n 354: \"WORKBOOK.INSERT\",\n 355: \"OPTIONS.TRANSITION\",\n 356: \"OPTIONS.GENERAL\",\n 370: \"FILTER.ADVANCED\",\n 373: \"MAIL.ADD.MAILER\",\n 374: \"MAIL.DELETE.MAILER\",\n 375: \"MAIL.REPLY\",\n 376: \"MAIL.REPLY.ALL\",\n 377: \"MAIL.FORWARD\",\n 378: \"MAIL.NEXT.LETTER\",\n 379: \"DATA.LABEL\",\n 380: \"INSERT.TITLE\",\n 381: \"FONT.PROPERTIES\",\n 382: \"MACRO.OPTIONS\",\n 383: \"WORKBOOK.HIDE\",\n 384: \"WORKBOOK.UNHIDE\",\n 385: \"WORKBOOK.DELETE\",\n 386: \"WORKBOOK.NAME\",\n 388: \"GALLERY.CUSTOM\",\n 390: \"ADD.CHART.AUTOFORMAT\",\n 391: \"DELETE.CHART.AUTOFORMAT\",\n 392: \"CHART.ADD.DATA\",\n 393: \"AUTO.OUTLINE\",\n 394: \"TAB.ORDER\",\n 395: \"SHOW.DIALOG\",\n 396: \"SELECT.ALL\",\n 397: \"UNGROUP.SHEETS\",\n 398: \"SUBTOTAL.CREATE\",\n 399: \"SUBTOTAL.REMOVE\",\n 400: \"RENAME.OBJECT\",\n 412: \"WORKBOOK.SCROLL\",\n 413: \"WORKBOOK.NEXT\",\n 414: \"WORKBOOK.PREV\",\n 415: \"WORKBOOK.TAB.SPLIT\",\n 416: \"FULL.SCREEN\",\n 417: \"WORKBOOK.PROTECT\",\n 420: \"SCROLLBAR.PROPERTIES\",\n 421: \"PIVOT.SHOW.PAGES\",\n 422: \"TEXT.TO.COLUMNS\",\n 423: \"FORMAT.CHARTTYPE\",\n 424: \"LINK.FORMAT\",\n 425: \"TRACER.DISPLAY\",\n 430: \"TRACER.NAVIGATE\",\n 431: \"TRACER.CLEAR\",\n 432: \"TRACER.ERROR\",\n 433: \"PIVOT.FIELD.GROUP\",\n 434: \"PIVOT.FIELD.UNGROUP\",\n 435: \"CHECKBOX.PROPERTIES\",\n 436: \"LABEL.PROPERTIES\",\n 437: \"LISTBOX.PROPERTIES\",\n 438: \"EDITBOX.PROPERTIES\",\n 439: \"PIVOT.REFRESH\",\n 440: \"LINK.COMBO\",\n 441: \"OPEN.TEXT\",\n 442: \"HIDE.DIALOG\",\n 443: \"SET.DIALOG.FOCUS\",\n 444: \"ENABLE.OBJECT\",\n 445: \"PUSHBUTTON.PROPERTIES\",\n 446: \"SET.DIALOG.DEFAULT\",\n 447: \"FILTER\",\n 448: \"FILTER.SHOW.ALL\",\n 449: \"CLEAR.OUTLINE\",\n 450: \"FUNCTION.WIZARD\",\n 451: \"ADD.LIST.ITEM\",\n 452: \"SET.LIST.ITEM\",\n 453: \"REMOVE.LIST.ITEM\",\n 454: \"SELECT.LIST.ITEM\",\n 455: \"SET.CONTROL.VALUE\",\n 456: \"SAVE.COPY.AS\",\n 458: \"OPTIONS.LISTS.ADD\",\n 459: \"OPTIONS.LISTS.DELETE\",\n 460: \"SERIES.AXES\",\n 461: \"SERIES.X\",\n 462: \"SERIES.Y\",\n 463: \"ERRORBAR.X\",\n 464: \"ERRORBAR.Y\",\n 465: \"FORMAT.CHART\",\n 466: \"SERIES.ORDER\",\n 467: \"MAIL.LOGOFF\",\n 468: \"CLEAR.ROUTING.SLIP\",\n 469: \"APP.ACTIVATE.MICROSOFT\",\n 470: \"MAIL.EDIT.MAILER\",\n 471: \"ON.SHEET\",\n 472: \"STANDARD.WIDTH\",\n 473: \"SCENARIO.MERGE\",\n 474: \"SUMMARY.INFO\",\n 475: \"FIND.FILE\",\n 476: \"ACTIVE.CELL.FONT\",\n 477: \"ENABLE.TIPWIZARD\",\n 478: \"VBA.MAKE.ADDIN\",\n 480: \"INSERTDATATABLE\",\n 481: \"WORKGROUP.OPTIONS\",\n 482: \"MAIL.SEND.MAILER\",\n 485: \"AUTOCORRECT\",\n 489: \"POST.DOCUMENT\",\n 491: \"PICKLIST\",\n 493: \"VIEW.SHOW\",\n 494: \"VIEW.DEFINE\",\n 495: \"VIEW.DELETE\",\n 509: \"SHEET.BACKGROUND\",\n 510: \"INSERT.MAP.OBJECT\",\n 511: \"OPTIONS.MENONO\",\n 517: \"MSOCHECKS\",\n 518: \"NORMAL\",\n 519: \"LAYOUT\",\n 520: \"RM.PRINT.AREA\",\n 521: \"CLEAR.PRINT.AREA\",\n 522: \"ADD.PRINT.AREA\",\n 523: \"MOVE.BRK\",\n 545: \"HIDECURR.NOTE\",\n 546: \"HIDEALL.NOTES\",\n 547: \"DELETE.NOTE\",\n 548: \"TRAVERSE.NOTES\",\n 549: \"ACTIVATE.NOTES\",\n 620: \"PROTECT.REVISIONS\",\n 621: \"UNPROTECT.REVISIONS\",\n 647: \"OPTIONS.ME\",\n 653: \"WEB.PUBLISH\",\n 667: \"NEWWEBQUERY\",\n 673: \"PIVOT.TABLE.CHART\",\n 753: \"OPTIONS.SAVE\",\n 755: \"OPTIONS.SPELL\",\n 808: \"HIDEALL.INKANNOTS\"\n};\nvar Ftab = {\n 0: \"COUNT\",\n 1: \"IF\",\n 2: \"ISNA\",\n 3: \"ISERROR\",\n 4: \"SUM\",\n 5: \"AVERAGE\",\n 6: \"MIN\",\n 7: \"MAX\",\n 8: \"ROW\",\n 9: \"COLUMN\",\n 10: \"NA\",\n 11: \"NPV\",\n 12: \"STDEV\",\n 13: \"DOLLAR\",\n 14: \"FIXED\",\n 15: \"SIN\",\n 16: \"COS\",\n 17: \"TAN\",\n 18: \"ATAN\",\n 19: \"PI\",\n 20: \"SQRT\",\n 21: \"EXP\",\n 22: \"LN\",\n 23: \"LOG10\",\n 24: \"ABS\",\n 25: \"INT\",\n 26: \"SIGN\",\n 27: \"ROUND\",\n 28: \"LOOKUP\",\n 29: \"INDEX\",\n 30: \"REPT\",\n 31: \"MID\",\n 32: \"LEN\",\n 33: \"VALUE\",\n 34: \"TRUE\",\n 35: \"FALSE\",\n 36: \"AND\",\n 37: \"OR\",\n 38: \"NOT\",\n 39: \"MOD\",\n 40: \"DCOUNT\",\n 41: \"DSUM\",\n 42: \"DAVERAGE\",\n 43: \"DMIN\",\n 44: \"DMAX\",\n 45: \"DSTDEV\",\n 46: \"VAR\",\n 47: \"DVAR\",\n 48: \"TEXT\",\n 49: \"LINEST\",\n 50: \"TREND\",\n 51: \"LOGEST\",\n 52: \"GROWTH\",\n 53: \"GOTO\",\n 54: \"HALT\",\n 55: \"RETURN\",\n 56: \"PV\",\n 57: \"FV\",\n 58: \"NPER\",\n 59: \"PMT\",\n 60: \"RATE\",\n 61: \"MIRR\",\n 62: \"IRR\",\n 63: \"RAND\",\n 64: \"MATCH\",\n 65: \"DATE\",\n 66: \"TIME\",\n 67: \"DAY\",\n 68: \"MONTH\",\n 69: \"YEAR\",\n 70: \"WEEKDAY\",\n 71: \"HOUR\",\n 72: \"MINUTE\",\n 73: \"SECOND\",\n 74: \"NOW\",\n 75: \"AREAS\",\n 76: \"ROWS\",\n 77: \"COLUMNS\",\n 78: \"OFFSET\",\n 79: \"ABSREF\",\n 80: \"RELREF\",\n 81: \"ARGUMENT\",\n 82: \"SEARCH\",\n 83: \"TRANSPOSE\",\n 84: \"ERROR\",\n 85: \"STEP\",\n 86: \"TYPE\",\n 87: \"ECHO\",\n 88: \"SET.NAME\",\n 89: \"CALLER\",\n 90: \"DEREF\",\n 91: \"WINDOWS\",\n 92: \"SERIES\",\n 93: \"DOCUMENTS\",\n 94: \"ACTIVE.CELL\",\n 95: \"SELECTION\",\n 96: \"RESULT\",\n 97: \"ATAN2\",\n 98: \"ASIN\",\n 99: \"ACOS\",\n 100: \"CHOOSE\",\n 101: \"HLOOKUP\",\n 102: \"VLOOKUP\",\n 103: \"LINKS\",\n 104: \"INPUT\",\n 105: \"ISREF\",\n 106: \"GET.FORMULA\",\n 107: \"GET.NAME\",\n 108: \"SET.VALUE\",\n 109: \"LOG\",\n 110: \"EXEC\",\n 111: \"CHAR\",\n 112: \"LOWER\",\n 113: \"UPPER\",\n 114: \"PROPER\",\n 115: \"LEFT\",\n 116: \"RIGHT\",\n 117: \"EXACT\",\n 118: \"TRIM\",\n 119: \"REPLACE\",\n 120: \"SUBSTITUTE\",\n 121: \"CODE\",\n 122: \"NAMES\",\n 123: \"DIRECTORY\",\n 124: \"FIND\",\n 125: \"CELL\",\n 126: \"ISERR\",\n 127: \"ISTEXT\",\n 128: \"ISNUMBER\",\n 129: \"ISBLANK\",\n 130: \"T\",\n 131: \"N\",\n 132: \"FOPEN\",\n 133: \"FCLOSE\",\n 134: \"FSIZE\",\n 135: \"FREADLN\",\n 136: \"FREAD\",\n 137: \"FWRITELN\",\n 138: \"FWRITE\",\n 139: \"FPOS\",\n 140: \"DATEVALUE\",\n 141: \"TIMEVALUE\",\n 142: \"SLN\",\n 143: \"SYD\",\n 144: \"DDB\",\n 145: \"GET.DEF\",\n 146: \"REFTEXT\",\n 147: \"TEXTREF\",\n 148: \"INDIRECT\",\n 149: \"REGISTER\",\n 150: \"CALL\",\n 151: \"ADD.BAR\",\n 152: \"ADD.MENU\",\n 153: \"ADD.COMMAND\",\n 154: \"ENABLE.COMMAND\",\n 155: \"CHECK.COMMAND\",\n 156: \"RENAME.COMMAND\",\n 157: \"SHOW.BAR\",\n 158: \"DELETE.MENU\",\n 159: \"DELETE.COMMAND\",\n 160: \"GET.CHART.ITEM\",\n 161: \"DIALOG.BOX\",\n 162: \"CLEAN\",\n 163: \"MDETERM\",\n 164: \"MINVERSE\",\n 165: \"MMULT\",\n 166: \"FILES\",\n 167: \"IPMT\",\n 168: \"PPMT\",\n 169: \"COUNTA\",\n 170: \"CANCEL.KEY\",\n 171: \"FOR\",\n 172: \"WHILE\",\n 173: \"BREAK\",\n 174: \"NEXT\",\n 175: \"INITIATE\",\n 176: \"REQUEST\",\n 177: \"POKE\",\n 178: \"EXECUTE\",\n 179: \"TERMINATE\",\n 180: \"RESTART\",\n 181: \"HELP\",\n 182: \"GET.BAR\",\n 183: \"PRODUCT\",\n 184: \"FACT\",\n 185: \"GET.CELL\",\n 186: \"GET.WORKSPACE\",\n 187: \"GET.WINDOW\",\n 188: \"GET.DOCUMENT\",\n 189: \"DPRODUCT\",\n 190: \"ISNONTEXT\",\n 191: \"GET.NOTE\",\n 192: \"NOTE\",\n 193: \"STDEVP\",\n 194: \"VARP\",\n 195: \"DSTDEVP\",\n 196: \"DVARP\",\n 197: \"TRUNC\",\n 198: \"ISLOGICAL\",\n 199: \"DCOUNTA\",\n 200: \"DELETE.BAR\",\n 201: \"UNREGISTER\",\n 204: \"USDOLLAR\",\n 205: \"FINDB\",\n 206: \"SEARCHB\",\n 207: \"REPLACEB\",\n 208: \"LEFTB\",\n 209: \"RIGHTB\",\n 210: \"MIDB\",\n 211: \"LENB\",\n 212: \"ROUNDUP\",\n 213: \"ROUNDDOWN\",\n 214: \"ASC\",\n 215: \"DBCS\",\n 216: \"RANK\",\n 219: \"ADDRESS\",\n 220: \"DAYS360\",\n 221: \"TODAY\",\n 222: \"VDB\",\n 223: \"ELSE\",\n 224: \"ELSE.IF\",\n 225: \"END.IF\",\n 226: \"FOR.CELL\",\n 227: \"MEDIAN\",\n 228: \"SUMPRODUCT\",\n 229: \"SINH\",\n 230: \"COSH\",\n 231: \"TANH\",\n 232: \"ASINH\",\n 233: \"ACOSH\",\n 234: \"ATANH\",\n 235: \"DGET\",\n 236: \"CREATE.OBJECT\",\n 237: \"VOLATILE\",\n 238: \"LAST.ERROR\",\n 239: \"CUSTOM.UNDO\",\n 240: \"CUSTOM.REPEAT\",\n 241: \"FORMULA.CONVERT\",\n 242: \"GET.LINK.INFO\",\n 243: \"TEXT.BOX\",\n 244: \"INFO\",\n 245: \"GROUP\",\n 246: \"GET.OBJECT\",\n 247: \"DB\",\n 248: \"PAUSE\",\n 251: \"RESUME\",\n 252: \"FREQUENCY\",\n 253: \"ADD.TOOLBAR\",\n 254: \"DELETE.TOOLBAR\",\n 255: \"User\",\n 256: \"RESET.TOOLBAR\",\n 257: \"EVALUATE\",\n 258: \"GET.TOOLBAR\",\n 259: \"GET.TOOL\",\n 260: \"SPELLING.CHECK\",\n 261: \"ERROR.TYPE\",\n 262: \"APP.TITLE\",\n 263: \"WINDOW.TITLE\",\n 264: \"SAVE.TOOLBAR\",\n 265: \"ENABLE.TOOL\",\n 266: \"PRESS.TOOL\",\n 267: \"REGISTER.ID\",\n 268: \"GET.WORKBOOK\",\n 269: \"AVEDEV\",\n 270: \"BETADIST\",\n 271: \"GAMMALN\",\n 272: \"BETAINV\",\n 273: \"BINOMDIST\",\n 274: \"CHIDIST\",\n 275: \"CHIINV\",\n 276: \"COMBIN\",\n 277: \"CONFIDENCE\",\n 278: \"CRITBINOM\",\n 279: \"EVEN\",\n 280: \"EXPONDIST\",\n 281: \"FDIST\",\n 282: \"FINV\",\n 283: \"FISHER\",\n 284: \"FISHERINV\",\n 285: \"FLOOR\",\n 286: \"GAMMADIST\",\n 287: \"GAMMAINV\",\n 288: \"CEILING\",\n 289: \"HYPGEOMDIST\",\n 290: \"LOGNORMDIST\",\n 291: \"LOGINV\",\n 292: \"NEGBINOMDIST\",\n 293: \"NORMDIST\",\n 294: \"NORMSDIST\",\n 295: \"NORMINV\",\n 296: \"NORMSINV\",\n 297: \"STANDARDIZE\",\n 298: \"ODD\",\n 299: \"PERMUT\",\n 300: \"POISSON\",\n 301: \"TDIST\",\n 302: \"WEIBULL\",\n 303: \"SUMXMY2\",\n 304: \"SUMX2MY2\",\n 305: \"SUMX2PY2\",\n 306: \"CHITEST\",\n 307: \"CORREL\",\n 308: \"COVAR\",\n 309: \"FORECAST\",\n 310: \"FTEST\",\n 311: \"INTERCEPT\",\n 312: \"PEARSON\",\n 313: \"RSQ\",\n 314: \"STEYX\",\n 315: \"SLOPE\",\n 316: \"TTEST\",\n 317: \"PROB\",\n 318: \"DEVSQ\",\n 319: \"GEOMEAN\",\n 320: \"HARMEAN\",\n 321: \"SUMSQ\",\n 322: \"KURT\",\n 323: \"SKEW\",\n 324: \"ZTEST\",\n 325: \"LARGE\",\n 326: \"SMALL\",\n 327: \"QUARTILE\",\n 328: \"PERCENTILE\",\n 329: \"PERCENTRANK\",\n 330: \"MODE\",\n 331: \"TRIMMEAN\",\n 332: \"TINV\",\n 334: \"MOVIE.COMMAND\",\n 335: \"GET.MOVIE\",\n 336: \"CONCATENATE\",\n 337: \"POWER\",\n 338: \"PIVOT.ADD.DATA\",\n 339: \"GET.PIVOT.TABLE\",\n 340: \"GET.PIVOT.FIELD\",\n 341: \"GET.PIVOT.ITEM\",\n 342: \"RADIANS\",\n 343: \"DEGREES\",\n 344: \"SUBTOTAL\",\n 345: \"SUMIF\",\n 346: \"COUNTIF\",\n 347: \"COUNTBLANK\",\n 348: \"SCENARIO.GET\",\n 349: \"OPTIONS.LISTS.GET\",\n 350: \"ISPMT\",\n 351: \"DATEDIF\",\n 352: \"DATESTRING\",\n 353: \"NUMBERSTRING\",\n 354: \"ROMAN\",\n 355: \"OPEN.DIALOG\",\n 356: \"SAVE.DIALOG\",\n 357: \"VIEW.GET\",\n 358: \"GETPIVOTDATA\",\n 359: \"HYPERLINK\",\n 360: \"PHONETIC\",\n 361: \"AVERAGEA\",\n 362: \"MAXA\",\n 363: \"MINA\",\n 364: \"STDEVPA\",\n 365: \"VARPA\",\n 366: \"STDEVA\",\n 367: \"VARA\",\n 368: \"BAHTTEXT\",\n 369: \"THAIDAYOFWEEK\",\n 370: \"THAIDIGIT\",\n 371: \"THAIMONTHOFYEAR\",\n 372: \"THAINUMSOUND\",\n 373: \"THAINUMSTRING\",\n 374: \"THAISTRINGLENGTH\",\n 375: \"ISTHAIDIGIT\",\n 376: \"ROUNDBAHTDOWN\",\n 377: \"ROUNDBAHTUP\",\n 378: \"THAIYEAR\",\n 379: \"RTD\",\n 380: \"CUBEVALUE\",\n 381: \"CUBEMEMBER\",\n 382: \"CUBEMEMBERPROPERTY\",\n 383: \"CUBERANKEDMEMBER\",\n 384: \"HEX2BIN\",\n 385: \"HEX2DEC\",\n 386: \"HEX2OCT\",\n 387: \"DEC2BIN\",\n 388: \"DEC2HEX\",\n 389: \"DEC2OCT\",\n 390: \"OCT2BIN\",\n 391: \"OCT2HEX\",\n 392: \"OCT2DEC\",\n 393: \"BIN2DEC\",\n 394: \"BIN2OCT\",\n 395: \"BIN2HEX\",\n 396: \"IMSUB\",\n 397: \"IMDIV\",\n 398: \"IMPOWER\",\n 399: \"IMABS\",\n 400: \"IMSQRT\",\n 401: \"IMLN\",\n 402: \"IMLOG2\",\n 403: \"IMLOG10\",\n 404: \"IMSIN\",\n 405: \"IMCOS\",\n 406: \"IMEXP\",\n 407: \"IMARGUMENT\",\n 408: \"IMCONJUGATE\",\n 409: \"IMAGINARY\",\n 410: \"IMREAL\",\n 411: \"COMPLEX\",\n 412: \"IMSUM\",\n 413: \"IMPRODUCT\",\n 414: \"SERIESSUM\",\n 415: \"FACTDOUBLE\",\n 416: \"SQRTPI\",\n 417: \"QUOTIENT\",\n 418: \"DELTA\",\n 419: \"GESTEP\",\n 420: \"ISEVEN\",\n 421: \"ISODD\",\n 422: \"MROUND\",\n 423: \"ERF\",\n 424: \"ERFC\",\n 425: \"BESSELJ\",\n 426: \"BESSELK\",\n 427: \"BESSELY\",\n 428: \"BESSELI\",\n 429: \"XIRR\",\n 430: \"XNPV\",\n 431: \"PRICEMAT\",\n 432: \"YIELDMAT\",\n 433: \"INTRATE\",\n 434: \"RECEIVED\",\n 435: \"DISC\",\n 436: \"PRICEDISC\",\n 437: \"YIELDDISC\",\n 438: \"TBILLEQ\",\n 439: \"TBILLPRICE\",\n 440: \"TBILLYIELD\",\n 441: \"PRICE\",\n 442: \"YIELD\",\n 443: \"DOLLARDE\",\n 444: \"DOLLARFR\",\n 445: \"NOMINAL\",\n 446: \"EFFECT\",\n 447: \"CUMPRINC\",\n 448: \"CUMIPMT\",\n 449: \"EDATE\",\n 450: \"EOMONTH\",\n 451: \"YEARFRAC\",\n 452: \"COUPDAYBS\",\n 453: \"COUPDAYS\",\n 454: \"COUPDAYSNC\",\n 455: \"COUPNCD\",\n 456: \"COUPNUM\",\n 457: \"COUPPCD\",\n 458: \"DURATION\",\n 459: \"MDURATION\",\n 460: \"ODDLPRICE\",\n 461: \"ODDLYIELD\",\n 462: \"ODDFPRICE\",\n 463: \"ODDFYIELD\",\n 464: \"RANDBETWEEN\",\n 465: \"WEEKNUM\",\n 466: \"AMORDEGRC\",\n 467: \"AMORLINC\",\n 468: \"CONVERT\",\n 724: \"SHEETJS\",\n 469: \"ACCRINT\",\n 470: \"ACCRINTM\",\n 471: \"WORKDAY\",\n 472: \"NETWORKDAYS\",\n 473: \"GCD\",\n 474: \"MULTINOMIAL\",\n 475: \"LCM\",\n 476: \"FVSCHEDULE\",\n 477: \"CUBEKPIMEMBER\",\n 478: \"CUBESET\",\n 479: \"CUBESETCOUNT\",\n 480: \"IFERROR\",\n 481: \"COUNTIFS\",\n 482: \"SUMIFS\",\n 483: \"AVERAGEIF\",\n 484: \"AVERAGEIFS\"\n};\nvar FtabArgc = {\n 2: 1,\n 3: 1,\n 10: 0,\n 15: 1,\n 16: 1,\n 17: 1,\n 18: 1,\n 19: 0,\n 20: 1,\n 21: 1,\n 22: 1,\n 23: 1,\n 24: 1,\n 25: 1,\n 26: 1,\n 27: 2,\n 30: 2,\n 31: 3,\n 32: 1,\n 33: 1,\n 34: 0,\n 35: 0,\n 38: 1,\n 39: 2,\n 40: 3,\n 41: 3,\n 42: 3,\n 43: 3,\n 44: 3,\n 45: 3,\n 47: 3,\n 48: 2,\n 53: 1,\n 61: 3,\n 63: 0,\n 65: 3,\n 66: 3,\n 67: 1,\n 68: 1,\n 69: 1,\n 70: 1,\n 71: 1,\n 72: 1,\n 73: 1,\n 74: 0,\n 75: 1,\n 76: 1,\n 77: 1,\n 79: 2,\n 80: 2,\n 83: 1,\n 85: 0,\n 86: 1,\n 89: 0,\n 90: 1,\n 94: 0,\n 95: 0,\n 97: 2,\n 98: 1,\n 99: 1,\n 101: 3,\n 102: 3,\n 105: 1,\n 106: 1,\n 108: 2,\n 111: 1,\n 112: 1,\n 113: 1,\n 114: 1,\n 117: 2,\n 118: 1,\n 119: 4,\n 121: 1,\n 126: 1,\n 127: 1,\n 128: 1,\n 129: 1,\n 130: 1,\n 131: 1,\n 133: 1,\n 134: 1,\n 135: 1,\n 136: 2,\n 137: 2,\n 138: 2,\n 140: 1,\n 141: 1,\n 142: 3,\n 143: 4,\n 144: 4,\n 161: 1,\n 162: 1,\n 163: 1,\n 164: 1,\n 165: 2,\n 172: 1,\n 175: 2,\n 176: 2,\n 177: 3,\n 178: 2,\n 179: 1,\n 184: 1,\n 186: 1,\n 189: 3,\n 190: 1,\n 195: 3,\n 196: 3,\n 197: 1,\n 198: 1,\n 199: 3,\n 201: 1,\n 207: 4,\n 210: 3,\n 211: 1,\n 212: 2,\n 213: 2,\n 214: 1,\n 215: 1,\n 225: 0,\n 229: 1,\n 230: 1,\n 231: 1,\n 232: 1,\n 233: 1,\n 234: 1,\n 235: 3,\n 244: 1,\n 247: 4,\n 252: 2,\n 257: 1,\n 261: 1,\n 271: 1,\n 273: 4,\n 274: 2,\n 275: 2,\n 276: 2,\n 277: 3,\n 278: 3,\n 279: 1,\n 280: 3,\n 281: 3,\n 282: 3,\n 283: 1,\n 284: 1,\n 285: 2,\n 286: 4,\n 287: 3,\n 288: 2,\n 289: 4,\n 290: 3,\n 291: 3,\n 292: 3,\n 293: 4,\n 294: 1,\n 295: 3,\n 296: 1,\n 297: 3,\n 298: 1,\n 299: 2,\n 300: 3,\n 301: 3,\n 302: 4,\n 303: 2,\n 304: 2,\n 305: 2,\n 306: 2,\n 307: 2,\n 308: 2,\n 309: 3,\n 310: 2,\n 311: 2,\n 312: 2,\n 313: 2,\n 314: 2,\n 315: 2,\n 316: 4,\n 325: 2,\n 326: 2,\n 327: 2,\n 328: 2,\n 331: 2,\n 332: 2,\n 337: 2,\n 342: 1,\n 343: 1,\n 346: 2,\n 347: 1,\n 350: 4,\n 351: 3,\n 352: 1,\n 353: 2,\n 360: 1,\n 368: 1,\n 369: 1,\n 370: 1,\n 371: 1,\n 372: 1,\n 373: 1,\n 374: 1,\n 375: 1,\n 376: 1,\n 377: 1,\n 378: 1,\n 382: 3,\n 385: 1,\n 392: 1,\n 393: 1,\n 396: 2,\n 397: 2,\n 398: 2,\n 399: 1,\n 400: 1,\n 401: 1,\n 402: 1,\n 403: 1,\n 404: 1,\n 405: 1,\n 406: 1,\n 407: 1,\n 408: 1,\n 409: 1,\n 410: 1,\n 414: 4,\n 415: 1,\n 416: 1,\n 417: 2,\n 420: 1,\n 421: 1,\n 422: 2,\n 424: 1,\n 425: 2,\n 426: 2,\n 427: 2,\n 428: 2,\n 430: 3,\n 438: 3,\n 439: 3,\n 440: 3,\n 443: 2,\n 444: 2,\n 445: 2,\n 446: 2,\n 447: 6,\n 448: 6,\n 449: 2,\n 450: 2,\n 464: 2,\n 468: 3,\n 476: 2,\n 479: 1,\n 480: 2,\n 65535: 0\n};\n/* Part 3 TODO: actually parse formulae */\nfunction ods_to_csf_formula(f/*:string*/)/*:string*/ {\n\tif(f.slice(0,3) == \"of:\") f = f.slice(3);\n\t/* 5.2 Basic Expressions */\n\tif(f.charCodeAt(0) == 61) {\n\t\tf = f.slice(1);\n\t\tif(f.charCodeAt(0) == 61) f = f.slice(1);\n\t}\n\tf = f.replace(/COM\\.MICROSOFT\\./g, \"\");\n\t/* Part 3 Section 5.8 References */\n\tf = f.replace(/\\[((?:\\.[A-Z]+[0-9]+)(?::\\.[A-Z]+[0-9]+)?)\\]/g, function($$, $1) { return $1.replace(/\\./g,\"\"); });\n\t/* TODO: something other than this */\n\tf = f.replace(/\\[.(#[A-Z]*[?!])\\]/g, \"$1\");\n\treturn f.replace(/[;~]/g,\",\").replace(/\\|/g,\";\");\n}\n\nfunction csf_to_ods_formula(f/*:string*/)/*:string*/ {\n\tvar o = \"of:=\" + f.replace(crefregex, \"$1[.$2$3$4$5]\").replace(/\\]:\\[/g,\":\");\n\t/* TODO: something other than this */\n\treturn o.replace(/;/g, \"|\").replace(/,/g,\";\");\n}\n\nfunction ods_to_csf_3D(r/*:string*/)/*:[string, string]*/ {\n\tvar a = r.split(\":\");\n\tvar s = a[0].split(\".\")[0];\n\treturn [s, a[0].split(\".\")[1] + (a.length > 1 ? (\":\" + (a[1].split(\".\")[1] || a[1].split(\".\")[0])) : \"\")];\n}\n\nfunction csf_to_ods_3D(r/*:string*/)/*:string*/ {\n\treturn r.replace(/\\./,\"!\");\n}\n\nvar strs = {}; // shared strings\nvar _ssfopts = {}; // spreadsheet formatting options\n\n\n/*global Map */\nvar browser_has_Map = typeof Map !== 'undefined';\n\nfunction get_sst_id(sst/*:SST*/, str/*:string*/, rev)/*:number*/ {\n\tvar i = 0, len = sst.length;\n\tif(rev) {\n\t\tif(browser_has_Map ? rev.has(str) : Object.prototype.hasOwnProperty.call(rev, str)) {\n\t\t\tvar revarr = browser_has_Map ? rev.get(str) : rev[str];\n\t\t\tfor(; i < revarr.length; ++i) {\n\t\t\t\tif(sst[revarr[i]].t === str) { sst.Count ++; return revarr[i]; }\n\t\t\t}\n\t\t}\n\t} else for(; i < len; ++i) {\n\t\tif(sst[i].t === str) { sst.Count ++; return i; }\n\t}\n\tsst[len] = ({t:str}/*:any*/); sst.Count ++; sst.Unique ++;\n\tif(rev) {\n\t\tif(browser_has_Map) {\n\t\t\tif(!rev.has(str)) rev.set(str, []);\n\t\t\trev.get(str).push(len);\n\t\t} else {\n\t\t\tif(!Object.prototype.hasOwnProperty.call(rev, str)) rev[str] = [];\n\t\t\trev[str].push(len);\n\t\t}\n\t}\n\treturn len;\n}\n\nfunction col_obj_w(C/*:number*/, col) {\n\tvar p = ({min:C+1,max:C+1}/*:any*/);\n\t/* wch (chars), wpx (pixels) */\n\tvar wch = -1;\n\tif(col.MDW) MDW = col.MDW;\n\tif(col.width != null) p.customWidth = 1;\n\telse if(col.wpx != null) wch = px2char(col.wpx);\n\telse if(col.wch != null) wch = col.wch;\n\tif(wch > -1) { p.width = char2width(wch); p.customWidth = 1; }\n\telse if(col.width != null) p.width = col.width;\n\tif(col.hidden) p.hidden = true;\n\tif(col.level != null) { p.outlineLevel = p.level = col.level; }\n\treturn p;\n}\n\nfunction default_margins(margins/*:Margins*/, mode/*:?string*/) {\n\tif(!margins) return;\n\tvar defs = [0.7, 0.7, 0.75, 0.75, 0.3, 0.3];\n\tif(mode == 'xlml') defs = [1, 1, 1, 1, 0.5, 0.5];\n\tif(margins.left == null) margins.left = defs[0];\n\tif(margins.right == null) margins.right = defs[1];\n\tif(margins.top == null) margins.top = defs[2];\n\tif(margins.bottom == null) margins.bottom = defs[3];\n\tif(margins.header == null) margins.header = defs[4];\n\tif(margins.footer == null) margins.footer = defs[5];\n}\n\nfunction get_cell_style(styles/*:Array*/, cell/*:Cell*/, opts) {\n\tvar z = opts.revssf[cell.z != null ? cell.z : \"General\"];\n\tvar i = 0x3c, len = styles.length;\n\tif(z == null && opts.ssf) {\n\t\tfor(; i < 0x188; ++i) if(opts.ssf[i] == null) {\n\t\t\tSSF_load(cell.z, i);\n\t\t\t// $FlowIgnore\n\t\t\topts.ssf[i] = cell.z;\n\t\t\topts.revssf[cell.z] = z = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\tfor(i = 0; i != len; ++i) if(styles[i].numFmtId === z) return i;\n\tstyles[len] = {\n\t\tnumFmtId:z,\n\t\tfontId:0,\n\t\tfillId:0,\n\t\tborderId:0,\n\t\txfId:0,\n\t\tapplyNumberFormat:1\n\t};\n\treturn len;\n}\n\nfunction safe_format(p/*:Cell*/, fmtid/*:number*/, fillid/*:?number*/, opts, themes, styles) {\n\ttry {\n\t\tif(opts.cellNF) p.z = table_fmt[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(p.t === 'z' && !opts.cellStyles) return;\n\tif(p.t === 'd' && typeof p.v === 'string') p.v = parseDate(p.v);\n\tif((!opts || opts.cellText !== false) && p.t !== 'z') try {\n\t\tif(table_fmt[fmtid] == null) SSF_load(SSFImplicit[fmtid] || \"General\", fmtid);\n\t\tif(p.t === 'e') p.w = p.w || BErr[p.v];\n\t\telse if(fmtid === 0) {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = p.v.toString(10);\n\t\t\t\telse p.w = SSF_general_num(p.v);\n\t\t\t}\n\t\t\telse if(p.t === 'd') {\n\t\t\t\tvar dd = datenum(p.v);\n\t\t\t\tif((dd|0) === dd) p.w = dd.toString(10);\n\t\t\t\telse p.w = SSF_general_num(dd);\n\t\t\t}\n\t\t\telse if(p.v === undefined) return \"\";\n\t\t\telse p.w = SSF_general(p.v,_ssfopts);\n\t\t}\n\t\telse if(p.t === 'd') p.w = SSF_format(fmtid,datenum(p.v),_ssfopts);\n\t\telse p.w = SSF_format(fmtid,p.v,_ssfopts);\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts.cellStyles) return;\n\tif(fillid != null) try {\n\t\tp.s = styles.Fills[fillid];\n\t\tif (p.s.fgColor && p.s.fgColor.theme && !p.s.fgColor.rgb) {\n\t\t\tp.s.fgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.fgColor.theme].rgb, p.s.fgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.fgColor.raw_rgb = themes.themeElements.clrScheme[p.s.fgColor.theme].rgb;\n\t\t}\n\t\tif (p.s.bgColor && p.s.bgColor.theme) {\n\t\t\tp.s.bgColor.rgb = rgb_tint(themes.themeElements.clrScheme[p.s.bgColor.theme].rgb, p.s.bgColor.tint || 0);\n\t\t\tif(opts.WTF) p.s.bgColor.raw_rgb = themes.themeElements.clrScheme[p.s.bgColor.theme].rgb;\n\t\t}\n\t} catch(e) { if(opts.WTF && styles.Fills) throw e; }\n}\n\nfunction check_ws(ws/*:Worksheet*/, sname/*:string*/, i/*:number*/) {\n\tif(ws && ws['!ref']) {\n\t\tvar range = safe_decode_range(ws['!ref']);\n\t\tif(range.e.c < range.s.c || range.e.r < range.s.r) throw new Error(\"Bad range (\" + i + \"): \" + ws['!ref']);\n\t}\n}\nfunction parse_ws_xml_dim(ws/*:Worksheet*/, s/*:string*/) {\n\tvar d = safe_decode_range(s);\n\tif(d.s.r<=d.e.r && d.s.c<=d.e.c && d.s.r>=0 && d.s.c>=0) ws[\"!ref\"] = encode_range(d);\n}\nvar mergecregex = /<(?:\\w:)?mergeCell ref=\"[A-Z0-9:]+\"\\s*[\\/]?>/g;\nvar sheetdataregex = /<(?:\\w+:)?sheetData[^>]*>([\\s\\S]*)<\\/(?:\\w+:)?sheetData>/;\nvar hlinkregex = /<(?:\\w:)?hyperlink [^>]*>/mg;\nvar dimregex = /\"(\\w*:\\w*)\"/;\nvar colregex = /<(?:\\w:)?col\\b[^>]*[\\/]?>/g;\nvar afregex = /<(?:\\w:)?autoFilter[^>]*([\\/]|>([\\s\\S]*)<\\/(?:\\w:)?autoFilter)>/g;\nvar marginregex= /<(?:\\w:)?pageMargins[^>]*\\/>/g;\nvar sheetprregex = /<(?:\\w:)?sheetPr\\b(?:[^>a-z][^>]*)?\\/>/;\nvar sheetprregex2= /<(?:\\w:)?sheetPr[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetPr)>/;\nvar svsregex = /<(?:\\w:)?sheetViews[^>]*(?:[\\/]|>([\\s\\S]*)<\\/(?:\\w:)?sheetViews)>/;\n\n/* 18.3 Worksheets */\nfunction parse_ws_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*:WBWBProps*/, themes, styles)/*:Worksheet*/ {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\n\t/* 18.3.1.99 worksheet CT_Worksheet */\n\tvar s = opts.dense ? ([]/*:any*/) : ({}/*:any*/);\n\tvar refguess/*:Range*/ = ({s: {r:2000000, c:2000000}, e: {r:0, c:0} }/*:any*/);\n\n\tvar data1 = \"\", data2 = \"\";\n\tvar mtch/*:?any*/ = data.match(sheetdataregex);\n\tif(mtch) {\n\t\tdata1 = data.slice(0, mtch.index);\n\t\tdata2 = data.slice(mtch.index + mtch[0].length);\n\t} else data1 = data2 = data;\n\n\t/* 18.3.1.82 sheetPr CT_SheetPr */\n\tvar sheetPr = data1.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\telse if((sheetPr = data1.match(sheetprregex2))) parse_ws_xml_sheetpr2(sheetPr[0], sheetPr[1]||\"\", s, wb, idx, styles, themes);\n\n\t/* 18.3.1.35 dimension CT_SheetDimension */\n\tvar ridx = (data1.match(/<(?:\\w*:)?dimension/)||{index:-1}).index;\n\tif(ridx > 0) {\n\t\tvar ref = data1.slice(ridx,ridx+50).match(dimregex);\n\t\tif(ref) parse_ws_xml_dim(s, ref[1]);\n\t}\n\n\t/* 18.3.1.88 sheetViews CT_SheetViews */\n\tvar svs = data1.match(svsregex);\n\tif(svs && svs[1]) parse_ws_xml_sheetviews(svs[1], wb);\n\n\t/* 18.3.1.17 cols CT_Cols */\n\tvar columns/*:Array*/ = [];\n\tif(opts.cellStyles) {\n\t\t/* 18.3.1.13 col CT_Col */\n\t\tvar cols = data1.match(colregex);\n\t\tif(cols) parse_ws_xml_cols(columns, cols);\n\t}\n\n\t/* 18.3.1.80 sheetData CT_SheetData ? */\n\tif(mtch) parse_ws_xml_data(mtch[1], s, opts, refguess, themes, styles);\n\n\t/* 18.3.1.2 autoFilter CT_AutoFilter */\n\tvar afilter = data2.match(afregex);\n\tif(afilter) s['!autofilter'] = parse_ws_xml_autofilter(afilter[0]);\n\n\t/* 18.3.1.55 mergeCells CT_MergeCells */\n\tvar merges/*:Array*/ = [];\n\tvar _merge = data2.match(mergecregex);\n\tif(_merge) for(ridx = 0; ridx != _merge.length; ++ridx)\n\t\tmerges[ridx] = safe_decode_range(_merge[ridx].slice(_merge[ridx].indexOf(\"\\\"\")+1));\n\n\t/* 18.3.1.48 hyperlinks CT_Hyperlinks */\n\tvar hlink = data2.match(hlinkregex);\n\tif(hlink) parse_ws_xml_hlinks(s, hlink, rels);\n\n\t/* 18.3.1.62 pageMargins CT_PageMargins */\n\tvar margins = data2.match(marginregex);\n\tif(margins) s['!margins'] = parse_ws_xml_margins(parsexmltag(margins[0]));\n\n\tif(!s[\"!ref\"] && refguess.e.c >= refguess.s.c && refguess.e.r >= refguess.s.r) s[\"!ref\"] = encode_range(refguess);\n\tif(opts.sheetRows > 0 && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(columns.length > 0) s[\"!cols\"] = columns;\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\treturn s;\n}\n\nfunction write_ws_xml_merges(merges/*:Array*/)/*:string*/ {\n\tif(merges.length === 0) return \"\";\n\tvar o = '';\n\tfor(var i = 0; i != merges.length; ++i) o += '';\n\treturn o + '';\n}\n\n/* 18.3.1.82-3 sheetPr CT_ChartsheetPr / CT_SheetPr */\nfunction parse_ws_xml_sheetpr(sheetPr/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/) {\n\tvar data = parsexmltag(sheetPr);\n\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\tif(data.codeName) wb.Sheets[idx].CodeName = unescapexml(utf8read(data.codeName));\n}\nfunction parse_ws_xml_sheetpr2(sheetPr/*:string*/, body/*:string*/, s, wb/*:WBWBProps*/, idx/*:number*/) {\n\tparse_ws_xml_sheetpr(sheetPr.slice(0, sheetPr.indexOf(\">\")), s, wb, idx);\n}\nfunction write_ws_xml_sheetpr(ws, wb, idx, opts, o) {\n\tvar needed = false;\n\tvar props = {}, payload = null;\n\tif(opts.bookType !== 'xlsx' && wb.vbaraw) {\n\t\tvar cname = wb.SheetNames[idx];\n\t\ttry { if(wb.Workbook) cname = wb.Workbook.Sheets[idx].CodeName || cname; } catch(e) {}\n\t\tneeded = true;\n\t\tprops.codeName = utf8write(escapexml(cname));\n\t}\n\n\tif(ws && ws[\"!outline\"]) {\n\t\tvar outlineprops = {summaryBelow:1, summaryRight:1};\n\t\tif(ws[\"!outline\"].above) outlineprops.summaryBelow = 0;\n\t\tif(ws[\"!outline\"].left) outlineprops.summaryRight = 0;\n\t\tpayload = (payload||\"\") + writextag('outlinePr', null, outlineprops);\n\t}\n\n\tif(!needed && !payload) return;\n\to[o.length] = (writextag('sheetPr', payload, props));\n}\n\n/* 18.3.1.85 sheetProtection CT_SheetProtection */\nvar sheetprot_deffalse = [\"objects\", \"scenarios\", \"selectLockedCells\", \"selectUnlockedCells\"];\nvar sheetprot_deftrue = [\n\t\"formatColumns\", \"formatRows\", \"formatCells\",\n\t\"insertColumns\", \"insertRows\", \"insertHyperlinks\",\n\t\"deleteColumns\", \"deleteRows\",\n\t\"sort\", \"autoFilter\", \"pivotTables\"\n];\nfunction write_ws_xml_protection(sp)/*:string*/ {\n\t// algorithmName, hashValue, saltValue, spinCount\n\tvar o = ({sheet:1}/*:any*/);\n\tsheetprot_deffalse.forEach(function(n) { if(sp[n] != null && sp[n]) o[n] = \"1\"; });\n\tsheetprot_deftrue.forEach(function(n) { if(sp[n] != null && !sp[n]) o[n] = \"0\"; });\n\t/* TODO: algorithm */\n\tif(sp.password) o.password = crypto_CreatePasswordVerifier_Method1(sp.password).toString(16).toUpperCase();\n\treturn writextag('sheetProtection', null, o);\n}\n\nfunction parse_ws_xml_hlinks(s, data/*:Array*/, rels) {\n\tvar dense = Array.isArray(s);\n\tfor(var i = 0; i != data.length; ++i) {\n\t\tvar val = parsexmltag(utf8read(data[i]), true);\n\t\tif(!val.ref) return;\n\t\tvar rel = ((rels || {})['!id']||[])[val.id];\n\t\tif(rel) {\n\t\t\tval.Target = rel.Target;\n\t\t\tif(val.location) val.Target += \"#\"+unescapexml(val.location);\n\t\t} else {\n\t\t\tval.Target = \"#\" + unescapexml(val.location);\n\t\t\trel = {Target: val.Target, TargetMode: 'Internal'};\n\t\t}\n\t\tval.Rel = rel;\n\t\tif(val.tooltip) { val.Tooltip = val.tooltip; delete val.tooltip; }\n\t\tvar rng = safe_decode_range(val.ref);\n\t\tfor(var R=rng.s.r;R<=rng.e.r;++R) for(var C=rng.s.c;C<=rng.e.c;++C) {\n\t\t\tvar addr = encode_cell({c:C,r:R});\n\t\t\tif(dense) {\n\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\tif(!s[R][C]) s[R][C] = {t:\"z\",v:undefined};\n\t\t\t\ts[R][C].l = val;\n\t\t\t} else {\n\t\t\t\tif(!s[addr]) s[addr] = {t:\"z\",v:undefined};\n\t\t\t\ts[addr].l = val;\n\t\t\t}\n\t\t}\n\t}\n}\n\nfunction parse_ws_xml_margins(margin) {\n\tvar o = {};\n\t[\"left\", \"right\", \"top\", \"bottom\", \"header\", \"footer\"].forEach(function(k) {\n\t\tif(margin[k]) o[k] = parseFloat(margin[k]);\n\t});\n\treturn o;\n}\nfunction write_ws_xml_margins(margin)/*:string*/ {\n\tdefault_margins(margin);\n\treturn writextag('pageMargins', null, margin);\n}\n\nfunction parse_ws_xml_cols(columns, cols) {\n\tvar seencol = false;\n\tfor(var coli = 0; coli != cols.length; ++coli) {\n\t\tvar coll = parsexmltag(cols[coli], true);\n\t\tif(coll.hidden) coll.hidden = parsexmlbool(coll.hidden);\n\t\tvar colm=parseInt(coll.min, 10)-1, colM=parseInt(coll.max,10)-1;\n\t\tif(coll.outlineLevel) coll.level = (+coll.outlineLevel || 0);\n\t\tdelete coll.min; delete coll.max; coll.width = +coll.width;\n\t\tif(!seencol && coll.width) { seencol = true; find_mdw_colw(coll.width); }\n\t\tprocess_col(coll);\n\t\twhile(colm <= colM) columns[colm++] = dup(coll);\n\t}\n}\nfunction write_ws_xml_cols(ws, cols)/*:string*/ {\n\tvar o = [\"\"], col;\n\tfor(var i = 0; i != cols.length; ++i) {\n\t\tif(!(col = cols[i])) continue;\n\t\to[o.length] = (writextag('col', null, col_obj_w(i, col)));\n\t}\n\to[o.length] = \"\";\n\treturn o.join(\"\");\n}\n\nfunction parse_ws_xml_autofilter(data/*:string*/) {\n\tvar o = { ref: (data.match(/ref=\"([^\"]*)\"/)||[])[1]};\n\treturn o;\n}\nfunction write_ws_xml_autofilter(data, ws, wb, idx)/*:string*/ {\n\tvar ref = typeof data.ref == \"string\" ? data.ref : encode_range(data.ref);\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]}/*:any*/);\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names/*: Array */ = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\treturn writextag(\"autoFilter\", null, {ref:ref});\n}\n\n/* 18.3.1.88 sheetViews CT_SheetViews */\n/* 18.3.1.87 sheetView CT_SheetView */\nvar sviewregex = /<(?:\\w:)?sheetView(?:[^>a-z][^>]*)?\\/?>/;\nfunction parse_ws_xml_sheetviews(data, wb/*:WBWBProps*/) {\n\tif(!wb.Views) wb.Views = [{}];\n\t(data.match(sviewregex)||[]).forEach(function(r/*:string*/, i/*:number*/) {\n\t\tvar tag = parsexmltag(r);\n\t\t// $FlowIgnore\n\t\tif(!wb.Views[i]) wb.Views[i] = {};\n\t\t// $FlowIgnore\n\t\tif(+tag.zoomScale) wb.Views[i].zoom = +tag.zoomScale;\n\t\t// $FlowIgnore\n\t\tif(parsexmlbool(tag.rightToLeft)) wb.Views[i].RTL = true;\n\t});\n}\nfunction write_ws_xml_sheetviews(ws, opts, idx, wb)/*:string*/ {\n\tvar sview = ({workbookViewId:\"0\"}/*:any*/);\n\t// $FlowIgnore\n\tif((((wb||{}).Workbook||{}).Views||[])[0]) sview.rightToLeft = wb.Workbook.Views[0].RTL ? \"1\" : \"0\";\n\treturn writextag(\"sheetViews\", writextag(\"sheetView\", null, sview), {});\n}\n\nfunction write_ws_xml_cell(cell/*:Cell*/, ref, ws, opts/*::, idx, wb*/)/*:string*/ {\n\tif(cell.c) ws['!comments'].push([ref, cell.c]);\n\tif(cell.v === undefined && typeof cell.f !== \"string\" || cell.t === 'z' && !cell.f) return \"\";\n\tvar vv = \"\";\n\tvar oldt = cell.t, oldv = cell.v;\n\tif(cell.t !== \"z\") switch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'n': vv = ''+cell.v; break;\n\t\tcase 'e': vv = BErr[cell.v]; break;\n\t\tcase 'd':\n\t\t\tif(opts && opts.cellDates) vv = parseDate(cell.v, -1).toISOString();\n\t\t\telse {\n\t\t\t\tcell = dup(cell);\n\t\t\t\tcell.t = 'n';\n\t\t\t\tvv = ''+(cell.v = datenum(parseDate(cell.v)));\n\t\t\t}\n\t\t\tif(typeof cell.z === 'undefined') cell.z = table_fmt[14];\n\t\t\tbreak;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar v = writetag('v', escapexml(vv)), o = ({r:ref}/*:any*/);\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tif(os !== 0) o.s = os;\n\tswitch(cell.t) {\n\t\tcase 'n': break;\n\t\tcase 'd': o.t = \"d\"; break;\n\t\tcase 'b': o.t = \"b\"; break;\n\t\tcase 'e': o.t = \"e\"; break;\n\t\tcase 'z': break;\n\t\tdefault: if(cell.v == null) { delete cell.t; break; }\n\t\t\tif(cell.v.length > 32767) throw new Error(\"Text length must not exceed 32767 characters\");\n\t\t\tif(opts && opts.bookSST) {\n\t\t\t\tv = writetag('v', ''+get_sst_id(opts.Strings, cell.v, opts.revStrings));\n\t\t\t\to.t = \"s\"; break;\n\t\t\t}\n\t\t\to.t = \"str\"; break;\n\t}\n\tif(cell.t != oldt) { cell.t = oldt; cell.v = oldv; }\n\tif(typeof cell.f == \"string\" && cell.f) {\n\t\tvar ff = cell.F && cell.F.slice(0, ref.length) == ref ? {t:\"array\", ref:cell.F} : null;\n\t\tv = writextag('f', escapexml(cell.f), ff) + (cell.v != null ? v : \"\");\n\t}\n\tif(cell.l) ws['!links'].push([ref, cell.l]);\n\tif(cell.D) o.cm = 1;\n\treturn writextag('c', v, o);\n}\n\nvar parse_ws_xml_data = /*#__PURE__*/(function() {\n\tvar cellregex = /<(?:\\w+:)?c[ \\/>]/, rowregex = /<\\/(?:\\w+:)?row>/;\n\tvar rregex = /r=[\"']([^\"']*)[\"']/, isregex = /<(?:\\w+:)?is>([\\S\\s]*?)<\\/(?:\\w+:)?is>/;\n\tvar refregex = /ref=[\"']([^\"']*)[\"']/;\n\tvar match_v = matchtag(\"v\"), match_f = matchtag(\"f\");\n\nreturn function parse_ws_xml_data(sdata/*:string*/, s, opts, guess/*:Range*/, themes, styles) {\n\tvar ri = 0, x = \"\", cells/*:Array*/ = [], cref/*:?Array*/ = [], idx=0, i=0, cc=0, d=\"\", p/*:any*/;\n\tvar tag, tagr = 0, tagc = 0;\n\tvar sstr, ftag;\n\tvar fmtid = 0, fillid = 0;\n\tvar do_format = Array.isArray(styles.CellXf), cf;\n\tvar arrayf/*:Array<[Range, string]>*/ = [];\n\tvar sharedf = [];\n\tvar dense = Array.isArray(s);\n\tvar rows/*:Array*/ = [], rowobj = {}, rowrite = false;\n\tvar sheetStubs = !!opts.sheetStubs;\n\tfor(var marr = sdata.split(rowregex), mt = 0, marrlen = marr.length; mt != marrlen; ++mt) {\n\t\tx = marr[mt].trim();\n\t\tvar xlen = x.length;\n\t\tif(xlen === 0) continue;\n\n\t\t/* 18.3.1.73 row CT_Row */\n\t\tvar rstarti = 0;\n\t\touta: for(ri = 0; ri < xlen; ++ri) switch(/*x.charCodeAt(ri)*/x[ri]) {\n\t\t\tcase \">\" /*62*/:\n\t\t\t\tif(/*x.charCodeAt(ri-1) != 47*/x[ri-1] != \"/\") { ++ri; break outa; }\n\t\t\t\tif(opts && opts.cellStyles) {\n\t\t\t\t\t// TODO: avoid duplication\n\t\t\t\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\t\t\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\t\t\t\trowobj = {}; rowrite = false;\n\t\t\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"<\" /*60*/: rstarti = ri; break;\n\t\t}\n\t\tif(rstarti >= ri) break;\n\t\ttag = parsexmltag(x.slice(rstarti,ri), true);\n\t\ttagr = tag.r != null ? parseInt(tag.r, 10) : tagr+1; tagc = -1;\n\t\tif(opts.sheetRows && opts.sheetRows < tagr) continue;\n\t\tif(guess.s.r > tagr - 1) guess.s.r = tagr - 1;\n\t\tif(guess.e.r < tagr - 1) guess.e.r = tagr - 1;\n\n\t\tif(opts && opts.cellStyles) {\n\t\t\trowobj = {}; rowrite = false;\n\t\t\tif(tag.ht) { rowrite = true; rowobj.hpt = parseFloat(tag.ht); rowobj.hpx = pt2px(rowobj.hpt); }\n\t\t\tif(tag.hidden == \"1\") { rowrite = true; rowobj.hidden = true; }\n\t\t\tif(tag.outlineLevel != null) { rowrite = true; rowobj.level = +tag.outlineLevel; }\n\t\t\tif(rowrite) rows[tagr-1] = rowobj;\n\t\t}\n\n\t\t/* 18.3.1.4 c CT_Cell */\n\t\tcells = x.slice(ri).split(cellregex);\n\t\tfor(var rslice = 0; rslice != cells.length; ++rslice) if(cells[rslice].trim().charAt(0) != \"<\") break;\n\t\tcells = cells.slice(rslice);\n\t\tfor(ri = 0; ri != cells.length; ++ri) {\n\t\t\tx = cells[ri].trim();\n\t\t\tif(x.length === 0) continue;\n\t\t\tcref = x.match(rregex); idx = ri; i=0; cc=0;\n\t\t\tx = \"\":\"\") + x;\n\t\t\tif(cref != null && cref.length === 2) {\n\t\t\t\tidx = 0; d=cref[1];\n\t\t\t\tfor(i=0; i != d.length; ++i) {\n\t\t\t\t\tif((cc=d.charCodeAt(i)-64) < 1 || cc > 26) break;\n\t\t\t\t\tidx = 26*idx + cc;\n\t\t\t\t}\n\t\t\t\t--idx;\n\t\t\t\ttagc = idx;\n\t\t\t} else ++tagc;\n\t\t\tfor(i = 0; i != x.length; ++i) if(x.charCodeAt(i) === 62) break; ++i;\n\t\t\ttag = parsexmltag(x.slice(0,i), true);\n\t\t\tif(!tag.r) tag.r = encode_cell({r:tagr-1, c:tagc});\n\t\t\td = x.slice(i);\n\t\t\tp = ({t:\"\"}/*:any*/);\n\n\t\t\tif((cref=d.match(match_v))!= null && /*::cref != null && */cref[1] !== '') p.v=unescapexml(cref[1]);\n\t\t\tif(opts.cellFormula) {\n\t\t\t\tif((cref=d.match(match_f))!= null && /*::cref != null && */cref[1] !== '') {\n\t\t\t\t\t/* TODO: match against XLSXFutureFunctions */\n\t\t\t\t\tp.f=unescapexml(utf8read(cref[1])).replace(/\\r\\n/g, \"\\n\");\n\t\t\t\t\tif(!opts.xlfn) p.f = _xlfn(p.f);\n\t\t\t\t\tif(/*::cref != null && cref[0] != null && */cref[0].indexOf('t=\"array\"') > -1) {\n\t\t\t\t\t\tp.F = (d.match(refregex)||[])[1];\n\t\t\t\t\t\tif(p.F.indexOf(\":\") > -1) arrayf.push([safe_decode_range(p.F), p.F]);\n\t\t\t\t\t} else if(/*::cref != null && cref[0] != null && */cref[0].indexOf('t=\"shared\"') > -1) {\n\t\t\t\t\t\t// TODO: parse formula\n\t\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\t\tvar ___f = unescapexml(utf8read(cref[1]));\n\t\t\t\t\t\tif(!opts.xlfn) ___f = _xlfn(___f);\n\t\t\t\t\t\tsharedf[parseInt(ftag.si, 10)] = [ftag, ___f, tag.r];\n\t\t\t\t\t}\n\t\t\t\t} else if((cref=d.match(/]*\\/>/))) {\n\t\t\t\t\tftag = parsexmltag(cref[0]);\n\t\t\t\t\tif(sharedf[ftag.si]) p.f = shift_formula_xlsx(sharedf[ftag.si][1], sharedf[ftag.si][2]/*[0].ref*/, tag.r);\n\t\t\t\t}\n\t\t\t\t/* TODO: factor out contains logic */\n\t\t\t\tvar _tag = decode_cell(tag.r);\n\t\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\tif(_tag.r >= arrayf[i][0].s.r && _tag.r <= arrayf[i][0].e.r)\n\t\t\t\t\t\tif(_tag.c >= arrayf[i][0].s.c && _tag.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\tp.F = arrayf[i][1];\n\t\t\t}\n\n\t\t\tif(tag.t == null && p.v === undefined) {\n\t\t\t\tif(p.f || p.F) {\n\t\t\t\t\tp.v = 0; p.t = \"n\";\n\t\t\t\t} else if(!sheetStubs) continue;\n\t\t\t\telse p.t = \"z\";\n\t\t\t}\n\t\t\telse p.t = tag.t || \"n\";\n\t\t\tif(guess.s.c > tagc) guess.s.c = tagc;\n\t\t\tif(guess.e.c < tagc) guess.e.c = tagc;\n\t\t\t/* 18.18.11 t ST_CellType */\n\t\t\tswitch(p.t) {\n\t\t\t\tcase 'n':\n\t\t\t\t\tif(p.v == \"\" || p.v == null) {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else p.v = parseFloat(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 's':\n\t\t\t\t\tif(typeof p.v == 'undefined') {\n\t\t\t\t\t\tif(!sheetStubs) continue;\n\t\t\t\t\t\tp.t = 'z';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsstr = strs[parseInt(p.v, 10)];\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tp.r = sstr.r;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'str':\n\t\t\t\t\tp.t = \"s\";\n\t\t\t\t\tp.v = (p.v!=null) ? utf8read(p.v) : '';\n\t\t\t\t\tif(opts.cellHTML) p.h = escapehtml(p.v);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'inlineStr':\n\t\t\t\t\tcref = d.match(isregex);\n\t\t\t\t\tp.t = 's';\n\t\t\t\t\tif(cref != null && (sstr = parse_si(cref[1]))) {\n\t\t\t\t\t\tp.v = sstr.t;\n\t\t\t\t\t\tif(opts.cellHTML) p.h = sstr.h;\n\t\t\t\t\t} else p.v = \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase 'b': p.v = parsexmlbool(p.v); break;\n\t\t\t\tcase 'd':\n\t\t\t\t\tif(opts.cellDates) p.v = parseDate(p.v, 1);\n\t\t\t\t\telse { p.v = datenum(parseDate(p.v, 1)); p.t = 'n'; }\n\t\t\t\t\tbreak;\n\t\t\t\t/* error string in .w, number in .v */\n\t\t\t\tcase 'e':\n\t\t\t\t\tif(!opts || opts.cellText !== false) p.w = p.v;\n\t\t\t\t\tp.v = RBErr[p.v]; break;\n\t\t\t}\n\t\t\t/* formatting */\n\t\t\tfmtid = fillid = 0;\n\t\t\tcf = null;\n\t\t\tif(do_format && tag.s !== undefined) {\n\t\t\t\tcf = styles.CellXf[tag.s];\n\t\t\t\tif(cf != null) {\n\t\t\t\t\tif(cf.numFmtId != null) fmtid = cf.numFmtId;\n\t\t\t\t\tif(opts.cellStyles) {\n\t\t\t\t\t\tif(cf.fillId != null) fillid = cf.fillId;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsafe_format(p, fmtid, fillid, opts, themes, styles);\n\t\t\tif(opts.cellDates && do_format && p.t == 'n' && fmt_is_date(table_fmt[fmtid])) { p.t = 'd'; p.v = numdate(p.v); }\n\t\t\tif(tag.cm && opts.xlmeta) {\n\t\t\t\tvar cm = (opts.xlmeta.Cell||[])[+tag.cm-1];\n\t\t\t\tif(cm && cm.type == 'XLDAPR') p.D = true;\n\t\t\t}\n\t\t\tif(dense) {\n\t\t\t\tvar _r = decode_cell(tag.r);\n\t\t\t\tif(!s[_r.r]) s[_r.r] = [];\n\t\t\t\ts[_r.r][_r.c] = p;\n\t\t\t} else s[tag.r] = p;\n\t\t}\n\t}\n\tif(rows.length > 0) s['!rows'] = rows;\n}; })();\n\nfunction write_ws_xml_data(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*//*::, rels*/)/*:string*/ {\n\tvar o/*:Array*/ = [], r/*:Array*/ = [], range = safe_decode_range(ws['!ref']), cell=\"\", ref, rr = \"\", cols/*:Array*/ = [], R=0, C=0, rows = ws['!rows'];\n\tvar dense = Array.isArray(ws);\n\tvar params = ({r:rr}/*:any*/), row/*:RowInfo*/, height = -1;\n\tfor(C = range.s.c; C <= range.e.c; ++C) cols[C] = encode_col(C);\n\tfor(R = range.s.r; R <= range.e.r; ++R) {\n\t\tr = [];\n\t\trr = encode_row(R);\n\t\tfor(C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tref = cols[C] + rr;\n\t\t\tvar _cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\tif(_cell === undefined) continue;\n\t\t\tif((cell = write_ws_xml_cell(_cell, ref, ws, opts, idx, wb)) != null) r.push(cell);\n\t\t}\n\t\tif(r.length > 0 || (rows && rows[R])) {\n\t\t\tparams = ({r:rr}/*:any*/);\n\t\t\tif(rows && rows[R]) {\n\t\t\t\trow = rows[R];\n\t\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\t\theight = -1;\n\t\t\t\tif(row.hpx) height = px2pt(row.hpx);\n\t\t\t\telse if(row.hpt) height = row.hpt;\n\t\t\t\tif(height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\t\tif(row.level) { params.outlineLevel = row.level; }\n\t\t\t}\n\t\t\to[o.length] = (writextag('row', r.join(\"\"), params));\n\t\t}\n\t}\n\tif(rows) for(; R < rows.length; ++R) {\n\t\tif(rows && rows[R]) {\n\t\t\tparams = ({r:R+1}/*:any*/);\n\t\t\trow = rows[R];\n\t\t\tif(row.hidden) params.hidden = 1;\n\t\t\theight = -1;\n\t\t\tif (row.hpx) height = px2pt(row.hpx);\n\t\t\telse if (row.hpt) height = row.hpt;\n\t\t\tif (height > -1) { params.ht = height; params.customHeight = 1; }\n\t\t\tif (row.level) { params.outlineLevel = row.level; }\n\t\t\to[o.length] = (writextag('row', \"\", params));\n\t\t}\n\t}\n\treturn o.join(\"\");\n}\n\nfunction write_ws_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {\n\tvar o = [XML_HEADER, writextag('worksheet', null, {\n\t\t'xmlns': XMLNS_main[0],\n\t\t'xmlns:r': XMLNS.r\n\t})];\n\tvar s = wb.SheetNames[idx], sidx = 0, rdata = \"\";\n\tvar ws = wb.Sheets[s];\n\tif(ws == null) ws = {};\n\tvar ref = ws['!ref'] || 'A1';\n\tvar range = safe_decode_range(ref);\n\tif(range.e.c > 0x3FFF || range.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + ref + \" exceeds format limit A1:XFD1048576\");\n\t\trange.e.c = Math.min(range.e.c, 0x3FFF);\n\t\trange.e.r = Math.min(range.e.c, 0xFFFFF);\n\t\tref = encode_range(range);\n\t}\n\tif(!rels) rels = {};\n\tws['!comments'] = [];\n\tvar _drawing = [];\n\n\twrite_ws_xml_sheetpr(ws, wb, idx, opts, o);\n\n\to[o.length] = (writextag('dimension', null, {'ref': ref}));\n\n\to[o.length] = write_ws_xml_sheetviews(ws, opts, idx, wb);\n\n\t/* TODO: store in WB, process styles */\n\tif(opts.sheetFormat) o[o.length] = (writextag('sheetFormatPr', null, {\n\t\tdefaultRowHeight:opts.sheetFormat.defaultRowHeight||'16',\n\t\tbaseColWidth:opts.sheetFormat.baseColWidth||'10',\n\t\toutlineLevelRow:opts.sheetFormat.outlineLevelRow||'7'\n\t}));\n\n\tif(ws['!cols'] != null && ws['!cols'].length > 0) o[o.length] = (write_ws_xml_cols(ws, ws['!cols']));\n\n\to[sidx = o.length] = '';\n\tws['!links'] = [];\n\tif(ws['!ref'] != null) {\n\t\trdata = write_ws_xml_data(ws, opts, idx, wb, rels);\n\t\tif(rdata.length > 0) o[o.length] = (rdata);\n\t}\n\tif(o.length>sidx+1) { o[o.length] = (''); o[sidx]=o[sidx].replace(\"/>\",\">\"); }\n\n\t/* sheetCalcPr */\n\n\tif(ws['!protect']) o[o.length] = write_ws_xml_protection(ws['!protect']);\n\n\t/* protectedRanges */\n\t/* scenarios */\n\n\tif(ws['!autofilter'] != null) o[o.length] = write_ws_xml_autofilter(ws['!autofilter'], ws, wb, idx);\n\n\t/* sortState */\n\t/* dataConsolidate */\n\t/* customSheetViews */\n\n\tif(ws['!merges'] != null && ws['!merges'].length > 0) o[o.length] = (write_ws_xml_merges(ws['!merges']));\n\n\t/* phoneticPr */\n\t/* conditionalFormatting */\n\t/* dataValidations */\n\n\tvar relc = -1, rel, rId = -1;\n\tif(/*::(*/ws['!links']/*::||[])*/.length > 0) {\n\t\to[o.length] = \"\";\n\t\t/*::(*/ws['!links']/*::||[])*/.forEach(function(l) {\n\t\t\tif(!l[1].Target) return;\n\t\t\trel = ({\"ref\":l[0]}/*:any*/);\n\t\t\tif(l[1].Target.charAt(0) != \"#\") {\n\t\t\t\trId = add_rels(rels, -1, escapexml(l[1].Target).replace(/#.*$/, \"\"), RELS.HLINK);\n\t\t\t\trel[\"r:id\"] = \"rId\"+rId;\n\t\t\t}\n\t\t\tif((relc = l[1].Target.indexOf(\"#\")) > -1) rel.location = escapexml(l[1].Target.slice(relc+1));\n\t\t\tif(l[1].Tooltip) rel.tooltip = escapexml(l[1].Tooltip);\n\t\t\to[o.length] = writextag(\"hyperlink\",null,rel);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\tdelete ws['!links'];\n\n\t/* printOptions */\n\n\tif(ws['!margins'] != null) o[o.length] = write_ws_xml_margins(ws['!margins']);\n\n\t/* pageSetup */\n\t/* headerFooter */\n\t/* rowBreaks */\n\t/* colBreaks */\n\t/* customProperties */\n\t/* cellWatches */\n\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) o[o.length] = writetag(\"ignoredErrors\", writextag(\"ignoredError\", null, {numberStoredAsText:1, sqref:ref}));\n\n\t/* smartTags */\n\n\tif(_drawing.length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\t\to[o.length] = writextag(\"drawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!drawing'] = _drawing;\n\t}\n\n\tif(ws['!comments'].length > 0) {\n\t\trId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\to[o.length] = writextag(\"legacyDrawing\", null, {\"r:id\":\"rId\" + rId});\n\t\tws['!legacy'] = rId;\n\t}\n\n\t/* legacyDrawingHF */\n\t/* picture */\n\t/* oleObjects */\n\t/* controls */\n\t/* webPublishItems */\n\t/* tableParts */\n\t/* extLst */\n\n\tif(o.length>1) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.726 BrtRowHdr */\nfunction parse_BrtRowHdr(data, length) {\n\tvar z = ({}/*:any*/);\n\tvar tgt = data.l + length;\n\tz.r = data.read_shift(4);\n\tdata.l += 4; // TODO: ixfe\n\tvar miyRw = data.read_shift(2);\n\tdata.l += 1; // TODO: top/bot padding\n\tvar flags = data.read_shift(1);\n\tdata.l = tgt;\n\tif(flags & 0x07) z.level = flags & 0x07;\n\tif(flags & 0x10) z.hidden = true;\n\tif(flags & 0x20) z.hpt = miyRw / 20;\n\treturn z;\n}\nfunction write_BrtRowHdr(R/*:number*/, range, ws) {\n\tvar o = new_buf(17+8*16);\n\tvar row = (ws['!rows']||[])[R]||{};\n\to.write_shift(4, R);\n\n\to.write_shift(4, 0); /* TODO: ixfe */\n\n\tvar miyRw = 0x0140;\n\tif(row.hpx) miyRw = px2pt(row.hpx) * 20;\n\telse if(row.hpt) miyRw = row.hpt * 20;\n\to.write_shift(2, miyRw);\n\n\to.write_shift(1, 0); /* top/bot padding */\n\n\tvar flags = 0x0;\n\tif(row.level) flags |= row.level;\n\tif(row.hidden) flags |= 0x10;\n\tif(row.hpx || row.hpt) flags |= 0x20;\n\to.write_shift(1, flags);\n\n\to.write_shift(1, 0); /* phonetic guide */\n\n\t/* [MS-XLSB] 2.5.8 BrtColSpan explains the mechanism */\n\tvar ncolspan = 0, lcs = o.l;\n\to.l += 4;\n\n\tvar caddr = {r:R, c:0};\n\tfor(var i = 0; i < 16; ++i) {\n\t\tif((range.s.c > ((i+1) << 10)) || (range.e.c < (i << 10))) continue;\n\t\tvar first = -1, last = -1;\n\t\tfor(var j = (i<<10); j < ((i+1)<<10); ++j) {\n\t\t\tcaddr.c = j;\n\t\t\tvar cell = Array.isArray(ws) ? (ws[caddr.r]||[])[caddr.c] : ws[encode_cell(caddr)];\n\t\t\tif(cell) { if(first < 0) first = j; last = j; }\n\t\t}\n\t\tif(first < 0) continue;\n\t\t++ncolspan;\n\t\to.write_shift(4, first);\n\t\to.write_shift(4, last);\n\t}\n\n\tvar l = o.l;\n\to.l = lcs;\n\to.write_shift(4, ncolspan);\n\to.l = l;\n\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction write_row_header(ba, ws, range, R) {\n\tvar o = write_BrtRowHdr(R, range, ws);\n\tif((o.length > 17) || (ws['!rows']||[])[R]) write_record(ba, 0x0000 /* BrtRowHdr */, o);\n}\n\n/* [MS-XLSB] 2.4.820 BrtWsDim */\nvar parse_BrtWsDim = parse_UncheckedRfX;\nvar write_BrtWsDim = write_UncheckedRfX;\n\n/* [MS-XLSB] 2.4.821 BrtWsFmtInfo */\nfunction parse_BrtWsFmtInfo(/*::data, length*/) {\n}\n//function write_BrtWsFmtInfo(ws, o) { }\n\n/* [MS-XLSB] 2.4.823 BrtWsProp */\nfunction parse_BrtWsProp(data, length) {\n\tvar z = {};\n\tvar f = data[data.l]; ++data.l;\n\tz.above = !(f & 0x40);\n\tz.left = !(f & 0x80);\n\t/* TODO: pull flags */\n\tdata.l += 18;\n\tz.name = parse_XLSBCodeName(data, length - 19);\n\treturn z;\n}\nfunction write_BrtWsProp(str, outl, o) {\n\tif(o == null) o = new_buf(84+4*str.length);\n\tvar f = 0xC0;\n\tif(outl) {\n\t\tif(outl.above) f &= ~0x40;\n\t\tif(outl.left) f &= ~0x80;\n\t}\n\to.write_shift(1, f);\n\tfor(var i = 1; i < 3; ++i) o.write_shift(1,0);\n\twrite_BrtColor({auto:1}, o);\n\to.write_shift(-4,-1);\n\to.write_shift(-4,-1);\n\twrite_XLSBCodeName(str, o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.306 BrtCellBlank */\nfunction parse_BrtCellBlank(data) {\n\tvar cell = parse_XLSBCell(data);\n\treturn [cell];\n}\nfunction write_BrtCellBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\treturn write_XLSBCell(ncell, o);\n}\nfunction parse_BrtShortBlank(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\treturn [cell];\n}\nfunction write_BrtShortBlank(cell, ncell, o) {\n\tif(o == null) o = new_buf(4);\n\treturn write_XLSBShortCell(ncell, o);\n}\n\n/* [MS-XLSB] 2.4.307 BrtCellBool */\nfunction parse_BrtCellBool(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtCellBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\nfunction parse_BrtShortBool(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar fBool = data.read_shift(1);\n\treturn [cell, fBool, 'b'];\n}\nfunction write_BrtShortBool(cell, ncell, o) {\n\tif(o == null) o = new_buf(5);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v ? 1 : 0);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.308 BrtCellError */\nfunction parse_BrtCellError(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtCellError(cell, ncell, o) {\n\tif(o == null) o = new_buf(9);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(1, cell.v);\n\treturn o;\n}\nfunction parse_BrtShortError(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar bError = data.read_shift(1);\n\treturn [cell, bError, 'e'];\n}\nfunction write_BrtShortError(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(1, cell.v);\n\to.write_shift(2, 0);\n\to.write_shift(1, 0);\n\treturn o;\n}\n\n\n/* [MS-XLSB] 2.4.311 BrtCellIsst */\nfunction parse_BrtCellIsst(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtCellIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\nfunction parse_BrtShortIsst(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar isst = data.read_shift(4);\n\treturn [cell, isst, 's'];\n}\nfunction write_BrtShortIsst(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\to.write_shift(4, ncell.v);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.313 BrtCellReal */\nfunction parse_BrtCellReal(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(16);\n\twrite_XLSBCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortReal(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_Xnum(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortReal(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_Xnum(cell.v, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.314 BrtCellRk */\nfunction parse_BrtCellRk(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtCellRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(12);\n\twrite_XLSBCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\nfunction parse_BrtShortRk(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_RkNumber(data);\n\treturn [cell, value, 'n'];\n}\nfunction write_BrtShortRk(cell, ncell, o) {\n\tif(o == null) o = new_buf(8);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_RkNumber(cell.v, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.323 BrtCellRString */\nfunction parse_BrtCellRString(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_RichStr(data);\n\treturn [cell, value, 'is'];\n}\n\n/* [MS-XLSB] 2.4.317 BrtCellSt */\nfunction parse_BrtCellSt(data) {\n\tvar cell = parse_XLSBCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtCellSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(12 + 4 * cell.v.length);\n\twrite_XLSBCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\nfunction parse_BrtShortSt(data) {\n\tvar cell = parse_XLSBShortCell(data);\n\tvar value = parse_XLWideString(data);\n\treturn [cell, value, 'str'];\n}\nfunction write_BrtShortSt(cell, ncell, o) {\n\tif(o == null) o = new_buf(8 + 4 * cell.v.length);\n\twrite_XLSBShortCell(ncell, o);\n\twrite_XLWideString(cell.v, o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.653 BrtFmlaBool */\nfunction parse_BrtFmlaBool(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'b'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.654 BrtFmlaError */\nfunction parse_BrtFmlaError(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = data.read_shift(1);\n\tvar o = [cell, value, 'e'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.655 BrtFmlaNum */\nfunction parse_BrtFmlaNum(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_Xnum(data);\n\tvar o = [cell, value, 'n'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.656 BrtFmlaString */\nfunction parse_BrtFmlaString(data, length, opts) {\n\tvar end = data.l + length;\n\tvar cell = parse_XLSBCell(data);\n\tcell.r = opts['!row'];\n\tvar value = parse_XLWideString(data);\n\tvar o = [cell, value, 'str'];\n\tif(opts.cellFormula) {\n\t\tdata.l += 2;\n\t\tvar formula = parse_XLSBCellParsedFormula(data, end - data.l, opts);\n\t\to[3] = stringify_formula(formula, null/*range*/, cell, opts.supbooks, opts);/* TODO */\n\t}\n\telse data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.682 BrtMergeCell */\nvar parse_BrtMergeCell = parse_UncheckedRfX;\nvar write_BrtMergeCell = write_UncheckedRfX;\n/* [MS-XLSB] 2.4.107 BrtBeginMergeCells */\nfunction write_BrtBeginMergeCells(cnt, o) {\n\tif(o == null) o = new_buf(4);\n\to.write_shift(4, cnt);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.662 BrtHLink */\nfunction parse_BrtHLink(data, length/*::, opts*/) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar relId = parse_XLNullableWideString(data);\n\tvar loc = parse_XLWideString(data);\n\tvar tooltip = parse_XLWideString(data);\n\tvar display = parse_XLWideString(data);\n\tdata.l = end;\n\tvar o = ({rfx:rfx, relId:relId, loc:loc, display:display}/*:any*/);\n\tif(tooltip) o.Tooltip = tooltip;\n\treturn o;\n}\nfunction write_BrtHLink(l, rId) {\n\tvar o = new_buf(50+4*(l[1].Target.length + (l[1].Tooltip || \"\").length));\n\twrite_UncheckedRfX({s:decode_cell(l[0]), e:decode_cell(l[0])}, o);\n\twrite_RelID(\"rId\" + rId, o);\n\tvar locidx = l[1].Target.indexOf(\"#\");\n\tvar loc = locidx == -1 ? \"\" : l[1].Target.slice(locidx+1);\n\twrite_XLWideString(loc || \"\", o);\n\twrite_XLWideString(l[1].Tooltip || \"\", o);\n\twrite_XLWideString(\"\", o);\n\treturn o.slice(0, o.l);\n}\n\n/* [MS-XLSB] 2.4.692 BrtPane */\nfunction parse_BrtPane(/*data, length, opts*/) {\n}\n\n/* [MS-XLSB] 2.4.6 BrtArrFmla */\nfunction parse_BrtArrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_RfX(data, 16);\n\tvar fAlwaysCalc = data.read_shift(1);\n\tvar o = [rfx]; o[2] = fAlwaysCalc;\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBArrayParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.750 BrtShrFmla */\nfunction parse_BrtShrFmla(data, length, opts) {\n\tvar end = data.l + length;\n\tvar rfx = parse_UncheckedRfX(data, 16);\n\tvar o = [rfx];\n\tif(opts.cellFormula) {\n\t\tvar formula = parse_XLSBSharedParsedFormula(data, end - data.l, opts);\n\t\to[1] = formula;\n\t\tdata.l = end;\n\t} else data.l = end;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.323 BrtColInfo */\n/* TODO: once XLS ColInfo is set, combine the functions */\nfunction write_BrtColInfo(C/*:number*/, col, o) {\n\tif(o == null) o = new_buf(18);\n\tvar p = col_obj_w(C, col);\n\to.write_shift(-4, C);\n\to.write_shift(-4, C);\n\to.write_shift(4, (p.width || 10) * 256);\n\to.write_shift(4, 0/*ixfe*/); // style\n\tvar flags = 0;\n\tif(col.hidden) flags |= 0x01;\n\tif(typeof p.width == 'number') flags |= 0x02;\n\tif(col.level) flags |= (col.level << 8);\n\to.write_shift(2, flags); // bit flag\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.678 BrtMargins */\nvar BrtMarginKeys = [\"left\",\"right\",\"top\",\"bottom\",\"header\",\"footer\"];\nfunction parse_BrtMargins(data/*::, length, opts*/)/*:Margins*/ {\n\tvar margins = ({}/*:any*/);\n\tBrtMarginKeys.forEach(function(k) { margins[k] = parse_Xnum(data, 8); });\n\treturn margins;\n}\nfunction write_BrtMargins(margins/*:Margins*/, o) {\n\tif(o == null) o = new_buf(6*8);\n\tdefault_margins(margins);\n\tBrtMarginKeys.forEach(function(k) { write_Xnum((margins/*:any*/)[k], o); });\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.299 BrtBeginWsView */\nfunction parse_BrtBeginWsView(data/*::, length, opts*/) {\n\tvar f = data.read_shift(2);\n\tdata.l += 28;\n\treturn { RTL: f & 0x20 };\n}\nfunction write_BrtBeginWsView(ws, Workbook, o) {\n\tif(o == null) o = new_buf(30);\n\tvar f = 0x39c;\n\tif((((Workbook||{}).Views||[])[0]||{}).RTL) f |= 0x20;\n\to.write_shift(2, f); // bit flag\n\to.write_shift(4, 0);\n\to.write_shift(4, 0); // view first row\n\to.write_shift(4, 0); // view first col\n\to.write_shift(1, 0); // gridline color ICV\n\to.write_shift(1, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 100); // zoom scale\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(2, 0);\n\to.write_shift(4, 0); // workbook view id\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.309 BrtCellIgnoreEC */\nfunction write_BrtCellIgnoreEC(ref) {\n\tvar o = new_buf(24);\n\to.write_shift(4, 4);\n\to.write_shift(4, 1);\n\twrite_UncheckedRfX(ref, o);\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.748 BrtSheetProtection */\nfunction write_BrtSheetProtection(sp, o) {\n\tif(o == null) o = new_buf(16*4+2);\n\to.write_shift(2, sp.password ? crypto_CreatePasswordVerifier_Method1(sp.password) : 0);\n\to.write_shift(4, 1); // this record should not be written if no protection\n\t[\n\t\t[\"objects\", false], // fObjects\n\t\t[\"scenarios\", false], // fScenarios\n\t\t[\"formatCells\", true], // fFormatCells\n\t\t[\"formatColumns\", true], // fFormatColumns\n\t\t[\"formatRows\", true], // fFormatRows\n\t\t[\"insertColumns\", true], // fInsertColumns\n\t\t[\"insertRows\", true], // fInsertRows\n\t\t[\"insertHyperlinks\", true], // fInsertHyperlinks\n\t\t[\"deleteColumns\", true], // fDeleteColumns\n\t\t[\"deleteRows\", true], // fDeleteRows\n\t\t[\"selectLockedCells\", false], // fSelLockedCells\n\t\t[\"sort\", true], // fSort\n\t\t[\"autoFilter\", true], // fAutoFilter\n\t\t[\"pivotTables\", true], // fPivotTables\n\t\t[\"selectUnlockedCells\", false] // fSelUnlockedCells\n\t].forEach(function(n) {\n\t\t/*:: if(o == null) throw \"unreachable\"; */\n\t\tif(n[1]) o.write_shift(4, sp[n[0]] != null && !sp[n[0]] ? 1 : 0);\n\t\telse o.write_shift(4, sp[n[0]] != null && sp[n[0]] ? 0 : 1);\n\t});\n\treturn o;\n}\n\nfunction parse_BrtDVal(/*data, length, opts*/) {\n}\nfunction parse_BrtDVal14(/*data, length, opts*/) {\n}\n/* [MS-XLSB] 2.1.7.61 Worksheet */\nfunction parse_ws_bin(data, _opts, idx, rels, wb/*:WBWBProps*/, themes, styles)/*:Worksheet*/ {\n\tif(!data) return data;\n\tvar opts = _opts || {};\n\tif(!rels) rels = {'!id':{}};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar s/*:Worksheet*/ = (opts.dense ? [] : {});\n\n\tvar ref;\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\tvar state/*:Array*/ = [];\n\tvar pass = false, end = false;\n\tvar row, p, cf, R, C, addr, sstr, rr, cell/*:Cell*/;\n\tvar merges/*:Array*/ = [];\n\topts.biff = 12;\n\topts['!row'] = 0;\n\n\tvar ai = 0, af = false;\n\n\tvar arrayf/*:Array<[Range, string]>*/ = [];\n\tvar sharedf = {};\n\tvar supbooks = opts.supbooks || /*::(*/wb/*:: :any)*/.supbooks || ([[]]/*:any*/);\n\tsupbooks.sharedf = sharedf;\n\tsupbooks.arrayf = arrayf;\n\tsupbooks.SheetNames = wb.SheetNames || wb.Sheets.map(function(x) { return x.name; });\n\tif(!opts.supbooks) {\n\t\topts.supbooks = supbooks;\n\t\tif(wb.Names) for(var i = 0; i < wb.Names.length; ++i) supbooks[0][i+1] = wb.Names[i];\n\t}\n\n\tvar colinfo/*:Array*/ = [], rowinfo/*:Array*/ = [];\n\tvar seencol = false;\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtShortReal\", f:parse_BrtShortReal };\n\n\tvar cm, vm;\n\n\trecordhopper(data, function ws_parse(val, RR, RT) {\n\t\tif(end) return;\n\t\tswitch(RT) {\n\t\t\tcase 0x0094: /* 'BrtWsDim' */\n\t\t\t\tref = val; break;\n\t\t\tcase 0x0000: /* 'BrtRowHdr' */\n\t\t\t\trow = val;\n\t\t\t\tif(opts.sheetRows && opts.sheetRows <= row.r) end=true;\n\t\t\t\trr = encode_row(R = row.r);\n\t\t\t\topts['!row'] = row.r;\n\t\t\t\tif(val.hidden || val.hpt || val.level != null) {\n\t\t\t\t\tif(val.hpt) val.hpx = pt2px(val.hpt);\n\t\t\t\t\trowinfo[val.r] = val;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0002: /* 'BrtCellRk' */\n\t\t\tcase 0x0003: /* 'BrtCellError' */\n\t\t\tcase 0x0004: /* 'BrtCellBool' */\n\t\t\tcase 0x0005: /* 'BrtCellReal' */\n\t\t\tcase 0x0006: /* 'BrtCellSt' */\n\t\t\tcase 0x0007: /* 'BrtCellIsst' */\n\t\t\tcase 0x0008: /* 'BrtFmlaString' */\n\t\t\tcase 0x0009: /* 'BrtFmlaNum' */\n\t\t\tcase 0x000A: /* 'BrtFmlaBool' */\n\t\t\tcase 0x000B: /* 'BrtFmlaError' */\n\t\t\tcase 0x000D: /* 'BrtShortRk' */\n\t\t\tcase 0x000E: /* 'BrtShortError' */\n\t\t\tcase 0x000F: /* 'BrtShortBool' */\n\t\t\tcase 0x0010: /* 'BrtShortReal' */\n\t\t\tcase 0x0011: /* 'BrtShortSt' */\n\t\t\tcase 0x0012: /* 'BrtShortIsst' */\n\t\t\tcase 0x003E: /* 'BrtCellRString' */\n\t\t\t\tp = ({t:val[2]}/*:any*/);\n\t\t\t\tswitch(val[2]) {\n\t\t\t\t\tcase 'n': p.v = val[1]; break;\n\t\t\t\t\tcase 's': sstr = strs[val[1]]; p.v = sstr.t; p.r = sstr.r; break;\n\t\t\t\t\tcase 'b': p.v = val[1] ? true : false; break;\n\t\t\t\t\tcase 'e': p.v = val[1]; if(opts.cellText !== false) p.w = BErr[p.v]; break;\n\t\t\t\t\tcase 'str': p.t = 's'; p.v = val[1]; break;\n\t\t\t\t\tcase 'is': p.t = 's'; p.v = val[1].t; break;\n\t\t\t\t}\n\t\t\t\tif((cf = styles.CellXf[val[0].iStyleRef])) safe_format(p,cf.numFmtId,null,opts, themes, styles);\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\taf = false;\n\t\t\t\t\tfor(ai = 0; ai < arrayf.length; ++ai) {\n\t\t\t\t\t\tvar aii = arrayf[ai];\n\t\t\t\t\t\tif(row.r >= aii[0].s.r && row.r <= aii[0].e.r)\n\t\t\t\t\t\t\tif(C >= aii[0].s.c && C <= aii[0].e.c) {\n\t\t\t\t\t\t\t\tp.F = encode_range(aii[0]); af = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif(!af && val.length > 3) p.f = val[3];\n\t\t\t\t}\n\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tif(opts.cellDates && cf && p.t == 'n' && fmt_is_date(table_fmt[cf.numFmtId])) {\n\t\t\t\t\tvar _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t\t\t}\n\t\t\t\tif(cm) {\n\t\t\t\t\tif(cm.type == 'XLDAPR') p.D = true;\n\t\t\t\t\tcm = void 0;\n\t\t\t\t}\n\t\t\t\tif(vm) vm = void 0;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0001: /* 'BrtCellBlank' */\n\t\t\tcase 0x000C: /* 'BrtShortBlank' */\n\t\t\t\tif(!opts.sheetStubs || pass) break;\n\t\t\t\tp = ({t:'z',v:void 0}/*:any*/);\n\t\t\t\tC = val[0].c == -1 ? C + 1 : val[0].c;\n\t\t\t\tif(opts.dense) { if(!s[R]) s[R] = []; s[R][C] = p; }\n\t\t\t\telse s[encode_col(C) + rr] = p;\n\t\t\t\tif(refguess.s.r > row.r) refguess.s.r = row.r;\n\t\t\t\tif(refguess.s.c > C) refguess.s.c = C;\n\t\t\t\tif(refguess.e.r < row.r) refguess.e.r = row.r;\n\t\t\t\tif(refguess.e.c < C) refguess.e.c = C;\n\t\t\t\tif(cm) {\n\t\t\t\t\tif(cm.type == 'XLDAPR') p.D = true;\n\t\t\t\t\tcm = void 0;\n\t\t\t\t}\n\t\t\t\tif(vm) vm = void 0;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00B0: /* 'BrtMergeCell' */\n\t\t\t\tmerges.push(val); break;\n\n\t\t\tcase 0x0031: { /* 'BrtCellMeta' */\n\t\t\t\tcm = ((opts.xlmeta||{}).Cell||[])[val-1];\n\t\t\t} break;\n\n\t\t\tcase 0x01EE: /* 'BrtHLink' */\n\t\t\t\tvar rel = rels['!id'][val.relId];\n\t\t\t\tif(rel) {\n\t\t\t\t\tval.Target = rel.Target;\n\t\t\t\t\tif(val.loc) val.Target += \"#\"+val.loc;\n\t\t\t\t\tval.Rel = rel;\n\t\t\t\t} else if(val.relId == '') {\n\t\t\t\t\tval.Target = \"#\" + val.loc;\n\t\t\t\t}\n\t\t\t\tfor(R=val.rfx.s.r;R<=val.rfx.e.r;++R) for(C=val.rfx.s.c;C<=val.rfx.e.c;++C) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!s[R]) s[R] = [];\n\t\t\t\t\t\tif(!s[R][C]) s[R][C] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[R][C].l = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\taddr = encode_cell({c:C,r:R});\n\t\t\t\t\t\tif(!s[addr]) s[addr] = {t:'z',v:undefined};\n\t\t\t\t\t\ts[addr].l = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01AA: /* 'BrtArrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tarrayf.push(val);\n\t\t\t\tcell = ((opts.dense ? s[R][C] : s[encode_col(C) + rr])/*:any*/);\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tcell.F = encode_range(val[0]);\n\t\t\t\tbreak;\n\t\t\tcase 0x01AB: /* 'BrtShrFmla' */\n\t\t\t\tif(!opts.cellFormula) break;\n\t\t\t\tsharedf[encode_cell(val[0].s)] = val[1];\n\t\t\t\tcell = (opts.dense ? s[R][C] : s[encode_col(C) + rr]);\n\t\t\t\tcell.f = stringify_formula(val[1], refguess, {r:row.r, c:C}, supbooks, opts);\n\t\t\t\tbreak;\n\n\t\t\t/* identical to 'ColInfo' in XLS */\n\t\t\tcase 0x003C: /* 'BrtColInfo' */\n\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, hidden: !!(val.flags & 0x01), level: val.level };\n\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 0x00A1: /* 'BrtBeginAFilter' */\n\t\t\t\ts['!autofilter'] = { ref:encode_range(val) };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\t\ts['!margins'] = val;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0093: /* 'BrtWsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tif(val.above || val.left) s['!outline'] = { above: val.above, left: val.left };\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0089: /* 'BrtBeginWsView' */\n\t\t\t\tif(!wb.Views) wb.Views = [{}];\n\t\t\t\tif(!wb.Views[0]) wb.Views[0] = {};\n\t\t\t\tif(val.RTL) wb.Views[0].RTL = true;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x01E5: /* 'BrtWsFmtInfo' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0040: /* 'BrtDVal' */\n\t\t\tcase 0x041D: /* 'BrtDVal14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0097: /* 'BrtPane' */\n\t\t\t\tbreak;\n\t\t\tcase 0x0098: /* 'BrtSel' */\n\t\t\tcase 0x00AF: /* 'BrtAFilterDateGroupItem' */\n\t\t\tcase 0x0284: /* 'BrtActiveX' */\n\t\t\tcase 0x0271: /* 'BrtBigName' */\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x018C: /* 'BrtBrk' */\n\t\t\tcase 0x0458: /* 'BrtCFIcon' */\n\t\t\tcase 0x047A: /* 'BrtCFRuleExt' */\n\t\t\tcase 0x01D7: /* 'BrtCFVO' */\n\t\t\tcase 0x041A: /* 'BrtCFVO14' */\n\t\t\tcase 0x0289: /* 'BrtCellIgnoreEC' */\n\t\t\tcase 0x0451: /* 'BrtCellIgnoreEC14' */\n\t\t\tcase 0x024D: /* 'BrtCellSmartTagProperty' */\n\t\t\tcase 0x025F: /* 'BrtCellWatch' */\n\t\t\tcase 0x0234: /* 'BrtColor' */\n\t\t\tcase 0x041F: /* 'BrtColor14' */\n\t\t\tcase 0x00A8: /* 'BrtColorFilter' */\n\t\t\tcase 0x00AE: /* 'BrtCustomFilter' */\n\t\t\tcase 0x049C: /* 'BrtCustomFilter14' */\n\t\t\tcase 0x01F3: /* 'BrtDRef' */\n\t\t\tcase 0x01FB: /* 'BrtDXF' */\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\tcase 0x00AB: /* 'BrtDynamicFilter' */\n\t\t\tcase 0x00A7: /* 'BrtFilter' */\n\t\t\tcase 0x0499: /* 'BrtFilter14' */\n\t\t\tcase 0x00A9: /* 'BrtIconFilter' */\n\t\t\tcase 0x049D: /* 'BrtIconFilter14' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x0295: /* 'BrtListPart' */\n\t\t\tcase 0x027F: /* 'BrtOleObject' */\n\t\t\tcase 0x01DE: /* 'BrtPageSetup' */\n\t\t\tcase 0x0219: /* 'BrtPhoneticInfo' */\n\t\t\tcase 0x01DD: /* 'BrtPrintOptions' */\n\t\t\tcase 0x0218: /* 'BrtRangeProtection' */\n\t\t\tcase 0x044F: /* 'BrtRangeProtection14' */\n\t\t\tcase 0x02A8: /* 'BrtRangeProtectionIso' */\n\t\t\tcase 0x0450: /* 'BrtRangeProtectionIso14' */\n\t\t\tcase 0x0400: /* 'BrtRwDescent' */\n\t\t\tcase 0x0297: /* 'BrtSheetCalcProp' */\n\t\t\tcase 0x0217: /* 'BrtSheetProtection' */\n\t\t\tcase 0x02A6: /* 'BrtSheetProtectionIso' */\n\t\t\tcase 0x01F8: /* 'BrtSlc' */\n\t\t\tcase 0x0413: /* 'BrtSparkline' */\n\t\t\tcase 0x01AC: /* 'BrtTable' */\n\t\t\tcase 0x00AA: /* 'BrtTop10Filter' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0032: /* 'BrtValueMeta' */\n\t\t\tcase 0x0816: /* 'BrtWebExtension' */\n\t\t\tcase 0x0415: /* 'BrtWsFmtInfoEx14' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(RT); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tdefault:\n\t\t\t\tif(RR.T){/* empty */}\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t}, opts);\n\n\tdelete opts.supbooks;\n\tdelete opts['!row'];\n\n\tif(!s[\"!ref\"] && (refguess.s.r < 2000000 || ref && (ref.e.r > 0 || ref.e.c > 0 || ref.s.r > 0 || ref.s.c > 0))) s[\"!ref\"] = encode_range(ref || refguess);\n\tif(opts.sheetRows && s[\"!ref\"]) {\n\t\tvar tmpref = safe_decode_range(s[\"!ref\"]);\n\t\tif(opts.sheetRows <= +tmpref.e.r) {\n\t\t\ttmpref.e.r = opts.sheetRows - 1;\n\t\t\tif(tmpref.e.r > refguess.e.r) tmpref.e.r = refguess.e.r;\n\t\t\tif(tmpref.e.r < tmpref.s.r) tmpref.s.r = tmpref.e.r;\n\t\t\tif(tmpref.e.c > refguess.e.c) tmpref.e.c = refguess.e.c;\n\t\t\tif(tmpref.e.c < tmpref.s.c) tmpref.s.c = tmpref.e.c;\n\t\t\ts[\"!fullref\"] = s[\"!ref\"];\n\t\t\ts[\"!ref\"] = encode_range(tmpref);\n\t\t}\n\t}\n\tif(merges.length > 0) s[\"!merges\"] = merges;\n\tif(colinfo.length > 0) s[\"!cols\"] = colinfo;\n\tif(rowinfo.length > 0) s[\"!rows\"] = rowinfo;\n\treturn s;\n}\n\n/* TODO: something useful -- this is a stub */\nfunction write_ws_bin_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*/, opts, ws/*:Worksheet*/, last_seen/*:boolean*/)/*:boolean*/ {\n\tif(cell.v === undefined) return false;\n\tvar vv = \"\";\n\tswitch(cell.t) {\n\t\tcase 'b': vv = cell.v ? \"1\" : \"0\"; break;\n\t\tcase 'd': // no BrtCellDate :(\n\t\t\tcell = dup(cell);\n\t\t\tcell.z = cell.z || table_fmt[14];\n\t\t\tcell.v = datenum(parseDate(cell.v)); cell.t = 'n';\n\t\t\tbreak;\n\t\t/* falls through */\n\t\tcase 'n': case 'e': vv = ''+cell.v; break;\n\t\tdefault: vv = cell.v; break;\n\t}\n\tvar o/*:any*/ = ({r:R, c:C}/*:any*/);\n\t/* TODO: cell style */\n\to.s = get_cell_style(opts.cellXfs, cell, opts);\n\tif(cell.l) ws['!links'].push([encode_cell(o), cell.l]);\n\tif(cell.c) ws['!comments'].push([encode_cell(o), cell.c]);\n\tswitch(cell.t) {\n\t\tcase 's': case 'str':\n\t\t\tif(opts.bookSST) {\n\t\t\t\tvv = get_sst_id(opts.Strings, (cell.v/*:any*/), opts.revStrings);\n\t\t\t\to.t = \"s\"; o.v = vv;\n\t\t\t\tif(last_seen) write_record(ba, 0x0012 /* BrtShortIsst */, write_BrtShortIsst(cell, o));\n\t\t\t\telse write_record(ba, 0x0007 /* BrtCellIsst */, write_BrtCellIsst(cell, o));\n\t\t\t} else {\n\t\t\t\to.t = \"str\";\n\t\t\t\tif(last_seen) write_record(ba, 0x0011 /* BrtShortSt */, write_BrtShortSt(cell, o));\n\t\t\t\telse write_record(ba, 0x0006 /* BrtCellSt */, write_BrtCellSt(cell, o));\n\t\t\t}\n\t\t\treturn true;\n\t\tcase 'n':\n\t\t\t/* TODO: determine threshold for Real vs RK */\n\t\t\tif(cell.v == (cell.v | 0) && cell.v > -1000 && cell.v < 1000) {\n\t\t\t\tif(last_seen) write_record(ba, 0x000D /* BrtShortRk */, write_BrtShortRk(cell, o));\n\t\t\t\telse write_record(ba, 0x0002 /* BrtCellRk */, write_BrtCellRk(cell, o));\n\t\t\t} else {\n\t\t\t\tif(last_seen) write_record(ba, 0x0010 /* BrtShortReal */, write_BrtShortReal(cell, o));\n\t\t\t\telse write_record(ba, 0x0005 /* BrtCellReal */, write_BrtCellReal(cell, o));\n\t\t\t} return true;\n\t\tcase 'b':\n\t\t\to.t = \"b\";\n\t\t\tif(last_seen) write_record(ba, 0x000F /* BrtShortBool */, write_BrtShortBool(cell, o));\n\t\t\telse write_record(ba, 0x0004 /* BrtCellBool */, write_BrtCellBool(cell, o));\n\t\t\treturn true;\n\t\tcase 'e':\n\t\t\to.t = \"e\";\n\t\t\tif(last_seen) write_record(ba, 0x000E /* BrtShortError */, write_BrtShortError(cell, o));\n\t\t\telse write_record(ba, 0x0003 /* BrtCellError */, write_BrtCellError(cell, o));\n\t\t\treturn true;\n\t}\n\tif(last_seen) write_record(ba, 0x000C /* BrtShortBlank */, write_BrtShortBlank(cell, o));\n\telse write_record(ba, 0x0001 /* BrtCellBlank */, write_BrtCellBlank(cell, o));\n\treturn true;\n}\n\nfunction write_CELLTABLE(ba, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref, rr = \"\", cols/*:Array*/ = [];\n\twrite_record(ba, 0x0091 /* BrtBeginSheetData */);\n\tvar dense = Array.isArray(ws);\n\tvar cap = range.e.r;\n\tif(ws['!rows']) cap = Math.max(range.e.r, ws['!rows'].length - 1);\n\tfor(var R = range.s.r; R <= cap; ++R) {\n\t\trr = encode_row(R);\n\t\t/* [ACCELLTABLE] */\n\t\t/* BrtRowHdr */\n\t\twrite_row_header(ba, ws, range, R);\n\t\tvar last_seen = false;\n\t\tif(R <= range.e.r) for(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\t/* *16384CELL */\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) { last_seen = false; continue; }\n\t\t\t/* write cell */\n\t\t\tlast_seen = write_ws_bin_cell(ba, cell, R, C, opts, ws, last_seen);\n\t\t}\n\t}\n\twrite_record(ba, 0x0092 /* BrtEndSheetData */);\n}\n\nfunction write_MERGECELLS(ba, ws/*:Worksheet*/) {\n\tif(!ws || !ws['!merges']) return;\n\twrite_record(ba, 0x00B1 /* BrtBeginMergeCells */, write_BrtBeginMergeCells(ws['!merges'].length));\n\tws['!merges'].forEach(function(m) { write_record(ba, 0x00B0 /* BrtMergeCell */, write_BrtMergeCell(m)); });\n\twrite_record(ba, 0x00B2 /* BrtEndMergeCells */);\n}\n\nfunction write_COLINFOS(ba, ws/*:Worksheet*//*::, idx:number, opts, wb:Workbook*/) {\n\tif(!ws || !ws['!cols']) return;\n\twrite_record(ba, 0x0186 /* BrtBeginColInfos */);\n\tws['!cols'].forEach(function(m, i) { if(m) write_record(ba, 0x003C /* 'BrtColInfo' */, write_BrtColInfo(i, m)); });\n\twrite_record(ba, 0x0187 /* BrtEndColInfos */);\n}\n\nfunction write_IGNOREECS(ba, ws/*:Worksheet*/) {\n\tif(!ws || !ws['!ref']) return;\n\twrite_record(ba, 0x0288 /* BrtBeginCellIgnoreECs */);\n\twrite_record(ba, 0x0289 /* BrtCellIgnoreEC */, write_BrtCellIgnoreEC(safe_decode_range(ws['!ref'])));\n\twrite_record(ba, 0x028A /* BrtEndCellIgnoreECs */);\n}\n\nfunction write_HLINKS(ba, ws/*:Worksheet*/, rels) {\n\t/* *BrtHLink */\n\tws['!links'].forEach(function(l) {\n\t\tif(!l[1].Target) return;\n\t\tvar rId = add_rels(rels, -1, l[1].Target.replace(/#.*$/, \"\"), RELS.HLINK);\n\t\twrite_record(ba, 0x01EE /* BrtHLink */, write_BrtHLink(l, rId));\n\t});\n\tdelete ws['!links'];\n}\nfunction write_LEGACYDRAWING(ba, ws/*:Worksheet*/, idx/*:number*/, rels) {\n\t/* [BrtLegacyDrawing] */\n\tif(ws['!comments'].length > 0) {\n\t\tvar rId = add_rels(rels, -1, \"../drawings/vmlDrawing\" + (idx+1) + \".vml\", RELS.VML);\n\t\twrite_record(ba, 0x0227 /* BrtLegacyDrawing */, write_RelID(\"rId\" + rId));\n\t\tws['!legacy'] = rId;\n\t}\n}\n\nfunction write_AUTOFILTER(ba, ws, wb, idx) {\n\tif(!ws['!autofilter']) return;\n\tvar data = ws['!autofilter'];\n\tvar ref = typeof data.ref === \"string\" ? data.ref : encode_range(data.ref);\n\n\t/* Update FilterDatabase defined name for the worksheet */\n\tif(!wb.Workbook) wb.Workbook = ({Sheets:[]}/*:any*/);\n\tif(!wb.Workbook.Names) wb.Workbook.Names = [];\n\tvar names/*: Array */ = wb.Workbook.Names;\n\tvar range = decode_range(ref);\n\tif(range.s.r == range.e.r) { range.e.r = decode_range(ws[\"!ref\"]).e.r; ref = encode_range(range); }\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar name = names[i];\n\t\tif(name.Name != '_xlnm._FilterDatabase') continue;\n\t\tif(name.Sheet != idx) continue;\n\t\tname.Ref = \"'\" + wb.SheetNames[idx] + \"'!\" + ref; break;\n\t}\n\tif(i == names.length) names.push({ Name: '_xlnm._FilterDatabase', Sheet: idx, Ref: \"'\" + wb.SheetNames[idx] + \"'!\" + ref });\n\n\twrite_record(ba, 0x00A1 /* BrtBeginAFilter */, write_UncheckedRfX(safe_decode_range(ref)));\n\t/* *FILTERCOLUMN */\n\t/* [SORTSTATE] */\n\t/* BrtEndAFilter */\n\twrite_record(ba, 0x00A2 /* BrtEndAFilter */);\n}\n\nfunction write_WSVIEWS2(ba, ws, Workbook) {\n\twrite_record(ba, 0x0085 /* BrtBeginWsViews */);\n\t{ /* 1*WSVIEW2 */\n\t\t/* [ACUID] */\n\t\twrite_record(ba, 0x0089 /* BrtBeginWsView */, write_BrtBeginWsView(ws, Workbook));\n\t\t/* [BrtPane] */\n\t\t/* *4BrtSel */\n\t\t/* *4SXSELECT */\n\t\t/* *FRT */\n\t\twrite_record(ba, 0x008A /* BrtEndWsView */);\n\t}\n\t/* *FRT */\n\twrite_record(ba, 0x0086 /* BrtEndWsViews */);\n}\n\nfunction write_WSFMTINFO(/*::ba, ws*/) {\n\t/* [ACWSFMTINFO] */\n\t// write_record(ba, 0x01E5 /* BrtWsFmtInfo */, write_BrtWsFmtInfo(ws));\n}\n\nfunction write_SHEETPROTECT(ba, ws) {\n\tif(!ws['!protect']) return;\n\t/* [BrtSheetProtectionIso] */\n\twrite_record(ba, 0x0217 /* BrtSheetProtection */, write_BrtSheetProtection(ws['!protect']));\n}\n\nfunction write_ws_bin(idx/*:number*/, opts, wb/*:Workbook*/, rels) {\n\tvar ba = buf_array();\n\tvar s = wb.SheetNames[idx], ws = wb.Sheets[s] || {};\n\tvar c/*:string*/ = s; try { if(wb && wb.Workbook) c = wb.Workbook.Sheets[idx].CodeName || c; } catch(e) {}\n\tvar r = safe_decode_range(ws['!ref'] || \"A1\");\n\tif(r.e.c > 0x3FFF || r.e.r > 0xFFFFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:XFD1048576\");\n\t\tr.e.c = Math.min(r.e.c, 0x3FFF);\n\t\tr.e.r = Math.min(r.e.c, 0xFFFFF);\n\t}\n\tws['!links'] = [];\n\t/* passed back to write_zip and removed there */\n\tws['!comments'] = [];\n\twrite_record(ba, 0x0081 /* BrtBeginSheet */);\n\tif(wb.vbaraw || ws['!outline']) write_record(ba, 0x0093 /* BrtWsProp */, write_BrtWsProp(c, ws['!outline']));\n\twrite_record(ba, 0x0094 /* BrtWsDim */, write_BrtWsDim(r));\n\twrite_WSVIEWS2(ba, ws, wb.Workbook);\n\twrite_WSFMTINFO(ba, ws);\n\twrite_COLINFOS(ba, ws, idx, opts, wb);\n\twrite_CELLTABLE(ba, ws, idx, opts, wb);\n\t/* [BrtSheetCalcProp] */\n\twrite_SHEETPROTECT(ba, ws);\n\t/* *([BrtRangeProtectionIso] BrtRangeProtection) */\n\t/* [SCENMAN] */\n\twrite_AUTOFILTER(ba, ws, wb, idx);\n\t/* [SORTSTATE] */\n\t/* [DCON] */\n\t/* [USERSHVIEWS] */\n\twrite_MERGECELLS(ba, ws);\n\t/* [BrtPhoneticInfo] */\n\t/* *CONDITIONALFORMATTING */\n\t/* [DVALS] */\n\twrite_HLINKS(ba, ws, rels);\n\t/* [BrtPrintOptions] */\n\tif(ws['!margins']) write_record(ba, 0x01DC /* BrtMargins */, write_BrtMargins(ws['!margins']));\n\t/* [BrtPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* [RWBRK] */\n\t/* [COLBRK] */\n\t/* *BrtBigName */\n\t/* [CELLWATCHES] */\n\tif(!opts || opts.ignoreEC || (opts.ignoreEC == (void 0))) write_IGNOREECS(ba, ws);\n\t/* [SMARTTAGS] */\n\t/* [BrtDrawing] */\n\twrite_LEGACYDRAWING(ba, ws, idx, rels);\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [OLEOBJECTS] */\n\t/* [ACTIVEXCONTROLS] */\n\t/* [WEBPUBITEMS] */\n\t/* [LISTPARTS] */\n\t/* FRTWORKSHEET */\n\twrite_record(ba, 0x0082 /* BrtEndSheet */);\n\treturn ba.end();\n}\nfunction parse_Cache(data/*:string*/)/*:[Array, string, ?string]*/ {\n\tvar col/*:Array*/ = [];\n\tvar num = data.match(/^/);\n\tvar f;\n\n\t/* 21.2.2.150 pt CT_NumVal */\n\t(data.match(/(.*?)<\\/c:pt>/mg)||[]).forEach(function(pt) {\n\t\tvar q = pt.match(/(.*)<\\/c:v><\\/c:pt>/);\n\t\tif(!q) return;\n\t\tcol[+q[1]] = num ? +q[2] : q[2];\n\t});\n\n\t/* 21.2.2.71 formatCode CT_Xstring */\n\tvar nf = unescapexml((data.match(/([\\s\\S]*?)<\\/c:formatCode>/) || [\"\",\"General\"])[1]);\n\n\t(data.match(/(.*?)<\\/c:f>/mg)||[]).forEach(function(F) { f = F.replace(/<.*?>/g,\"\"); });\n\n\treturn [col, nf, f];\n}\n\n/* 21.2 DrawingML - Charts */\nfunction parse_chart(data/*:?string*/, name/*:string*/, opts, rels, wb, csheet) {\n\tvar cs/*:Worksheet*/ = ((csheet || {\"!type\":\"chart\"})/*:any*/);\n\tif(!data) return csheet;\n\t/* 21.2.2.27 chart CT_Chart */\n\n\tvar C = 0, R = 0, col = \"A\";\n\tvar refguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\n\t/* 21.2.2.120 numCache CT_NumData */\n\t(data.match(/[\\s\\S]*?<\\/c:numCache>/gm)||[]).forEach(function(nc) {\n\t\tvar cache = parse_Cache(nc);\n\t\trefguess.s.r = refguess.s.c = 0;\n\t\trefguess.e.c = C;\n\t\tcol = encode_col(C);\n\t\tcache[0].forEach(function(n,i) {\n\t\t\tcs[col + encode_row(i)] = {t:'n', v:n, z:cache[1] };\n\t\t\tR = i;\n\t\t});\n\t\tif(refguess.e.r < R) refguess.e.r = R;\n\t\t++C;\n\t});\n\tif(C > 0) cs[\"!ref\"] = encode_range(refguess);\n\treturn cs;\n}\n/* 18.3 Worksheets also covers Chartsheets */\nfunction parse_cs_xml(data/*:?string*/, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {\n\tif(!data) return data;\n\t/* 18.3.1.12 chartsheet CT_ChartSheet */\n\tif(!rels) rels = {'!id':{}};\n\tvar s = ({'!type':\"chart\", '!drawel':null, '!rel':\"\"}/*:any*/);\n\tvar m;\n\n\t/* 18.3.1.83 sheetPr CT_ChartsheetPr */\n\tvar sheetPr = data.match(sheetprregex);\n\tif(sheetPr) parse_ws_xml_sheetpr(sheetPr[0], s, wb, idx);\n\n\t/* 18.3.1.36 drawing CT_Drawing */\n\tif((m = data.match(/drawing r:id=\"(.*?)\"/))) s['!rel'] = m[1];\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_xml(idx/*:number*/, opts, wb/*:Workbook*/, rels)/*:string*/ {\n\tvar o = [XML_HEADER, writextag('chartsheet', null, {\n\t\t'xmlns': XMLNS_main[0],\n\t\t'xmlns:r': XMLNS.r\n\t})];\n\to[o.length] = writextag(\"drawing\", null, {\"r:id\": \"rId1\"});\n\tadd_rels(rels, -1, \"../drawings/drawing\" + (idx+1) + \".xml\", RELS.DRAW);\n\tif(o.length>2) { o[o.length] = (''); o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n\n/* [MS-XLSB] 2.4.331 BrtCsProp */\nfunction parse_BrtCsProp(data, length/*:number*/) {\n\tdata.l += 10;\n\tvar name = parse_XLWideString(data, length - 10);\n\treturn { name: name };\n}\n\n/* [MS-XLSB] 2.1.7.7 Chart Sheet */\nfunction parse_cs_bin(data, opts, idx/*:number*/, rels, wb/*::, themes, styles*/)/*:Worksheet*/ {\n\tif(!data) return data;\n\tif(!rels) rels = {'!id':{}};\n\tvar s = {'!type':\"chart\", '!drawel':null, '!rel':\"\"};\n\tvar state/*:Array*/ = [];\n\tvar pass = false;\n\trecordhopper(data, function cs_parse(val, R, RT) {\n\t\tswitch(RT) {\n\n\t\t\tcase 0x0226: /* 'BrtDrawing' */\n\t\t\t\ts['!rel'] = val; break;\n\n\t\t\tcase 0x028B: /* 'BrtCsProp' */\n\t\t\t\tif(!wb.Sheets[idx]) wb.Sheets[idx] = {};\n\t\t\t\tif(val.name) wb.Sheets[idx].CodeName = val.name;\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0232: /* 'BrtBkHim' */\n\t\t\tcase 0x028C: /* 'BrtCsPageSetup' */\n\t\t\tcase 0x029D: /* 'BrtCsProtection' */\n\t\t\tcase 0x02A7: /* 'BrtCsProtectionIso' */\n\t\t\tcase 0x0227: /* 'BrtLegacyDrawing' */\n\t\t\tcase 0x0228: /* 'BrtLegacyDrawingHF' */\n\t\t\tcase 0x01DC: /* 'BrtMargins' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tpass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tpass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(RT); break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); break;\n\n\t\t\tdefault:\n\t\t\t\tif(R.T > 0) state.push(RT);\n\t\t\t\telse if(R.T < 0) state.pop();\n\t\t\t\telse if(!pass || opts.WTF) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t}, opts);\n\n\tif(rels['!id'][s['!rel']]) s['!drawel'] = rels['!id'][s['!rel']];\n\treturn s;\n}\nfunction write_cs_bin(/*::idx:number, opts, wb:Workbook, rels*/) {\n\tvar ba = buf_array();\n\twrite_record(ba, 0x0081 /* BrtBeginSheet */);\n\t/* [BrtCsProp] */\n\t/* CSVIEWS */\n\t/* [[BrtCsProtectionIso] BrtCsProtection] */\n\t/* [USERCSVIEWS] */\n\t/* [BrtMargins] */\n\t/* [BrtCsPageSetup] */\n\t/* [HEADERFOOTER] */\n\t/* BrtDrawing */\n\t/* [BrtLegacyDrawing] */\n\t/* [BrtLegacyDrawingHF] */\n\t/* [BrtBkHim] */\n\t/* [WEBPUBITEMS] */\n\t/* FRTCHARTSHEET */\n\twrite_record(ba, 0x0082 /* BrtEndSheet */);\n\treturn ba.end();\n}\n/* 18.2.28 (CT_WorkbookProtection) Defaults */\nvar WBPropsDef = [\n\t['allowRefreshQuery', false, \"bool\"],\n\t['autoCompressPictures', true, \"bool\"],\n\t['backupFile', false, \"bool\"],\n\t['checkCompatibility', false, \"bool\"],\n\t['CodeName', ''],\n\t['date1904', false, \"bool\"],\n\t['defaultThemeVersion', 0, \"int\"],\n\t['filterPrivacy', false, \"bool\"],\n\t['hidePivotFieldList', false, \"bool\"],\n\t['promptedSolutions', false, \"bool\"],\n\t['publishItems', false, \"bool\"],\n\t['refreshAllConnections', false, \"bool\"],\n\t['saveExternalLinkValues', true, \"bool\"],\n\t['showBorderUnselectedTables', true, \"bool\"],\n\t['showInkAnnotation', true, \"bool\"],\n\t['showObjects', 'all'],\n\t['showPivotChartFilter', false, \"bool\"],\n\t['updateLinks', 'userSet']\n];\n\n/* 18.2.30 (CT_BookView) Defaults */\nvar WBViewDef = [\n\t['activeTab', 0, \"int\"],\n\t['autoFilterDateGrouping', true, \"bool\"],\n\t['firstSheet', 0, \"int\"],\n\t['minimized', false, \"bool\"],\n\t['showHorizontalScroll', true, \"bool\"],\n\t['showSheetTabs', true, \"bool\"],\n\t['showVerticalScroll', true, \"bool\"],\n\t['tabRatio', 600, \"int\"],\n\t['visibility', 'visible']\n\t//window{Height,Width}, {x,y}Window\n];\n\n/* 18.2.19 (CT_Sheet) Defaults */\nvar SheetDef = [\n\t//['state', 'visible']\n];\n\n/* 18.2.2 (CT_CalcPr) Defaults */\nvar CalcPrDef = [\n\t['calcCompleted', 'true'],\n\t['calcMode', 'auto'],\n\t['calcOnSave', 'true'],\n\t['concurrentCalc', 'true'],\n\t['fullCalcOnLoad', 'false'],\n\t['fullPrecision', 'true'],\n\t['iterate', 'false'],\n\t['iterateCount', '100'],\n\t['iterateDelta', '0.001'],\n\t['refMode', 'A1']\n];\n\n/* 18.2.3 (CT_CustomWorkbookView) Defaults */\n/*var CustomWBViewDef = [\n\t['autoUpdate', 'false'],\n\t['changesSavedWin', 'false'],\n\t['includeHiddenRowCol', 'true'],\n\t['includePrintSettings', 'true'],\n\t['maximized', 'false'],\n\t['minimized', 'false'],\n\t['onlySync', 'false'],\n\t['personalView', 'false'],\n\t['showComments', 'commIndicator'],\n\t['showFormulaBar', 'true'],\n\t['showHorizontalScroll', 'true'],\n\t['showObjects', 'all'],\n\t['showSheetTabs', 'true'],\n\t['showStatusbar', 'true'],\n\t['showVerticalScroll', 'true'],\n\t['tabRatio', '600'],\n\t['xWindow', '0'],\n\t['yWindow', '0']\n];*/\n\nfunction push_defaults_array(target, defaults) {\n\tfor(var j = 0; j != target.length; ++j) { var w = target[j];\n\t\tfor(var i=0; i != defaults.length; ++i) { var z = defaults[i];\n\t\t\tif(w[z[0]] == null) w[z[0]] = z[1];\n\t\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof w[z[0]] == \"string\") w[z[0]] = parsexmlbool(w[z[0]]); break;\n\t\t\tcase \"int\": if(typeof w[z[0]] == \"string\") w[z[0]] = parseInt(w[z[0]], 10); break;\n\t\t\t}\n\t\t}\n\t}\n}\nfunction push_defaults(target, defaults) {\n\tfor(var i = 0; i != defaults.length; ++i) { var z = defaults[i];\n\t\tif(target[z[0]] == null) target[z[0]] = z[1];\n\t\telse switch(z[2]) {\n\t\t\tcase \"bool\": if(typeof target[z[0]] == \"string\") target[z[0]] = parsexmlbool(target[z[0]]); break;\n\t\t\tcase \"int\": if(typeof target[z[0]] == \"string\") target[z[0]] = parseInt(target[z[0]], 10); break;\n\t\t}\n\t}\n}\n\nfunction parse_wb_defaults(wb) {\n\tpush_defaults(wb.WBProps, WBPropsDef);\n\tpush_defaults(wb.CalcPr, CalcPrDef);\n\n\tpush_defaults_array(wb.WBView, WBViewDef);\n\tpush_defaults_array(wb.Sheets, SheetDef);\n\n\t_ssfopts.date1904 = parsexmlbool(wb.WBProps.date1904);\n}\n\nfunction safe1904(wb/*:Workbook*/)/*:string*/ {\n\t/* TODO: store date1904 somewhere else */\n\tif(!wb.Workbook) return \"false\";\n\tif(!wb.Workbook.WBProps) return \"false\";\n\treturn parsexmlbool(wb.Workbook.WBProps.date1904) ? \"true\" : \"false\";\n}\n\nvar badchars = /*#__PURE__*/\"][*?\\/\\\\\".split(\"\");\nfunction check_ws_name(n/*:string*/, safe/*:?boolean*/)/*:boolean*/ {\n\tif(n.length > 31) { if(safe) return false; throw new Error(\"Sheet names cannot exceed 31 chars\"); }\n\tvar _good = true;\n\tbadchars.forEach(function(c) {\n\t\tif(n.indexOf(c) == -1) return;\n\t\tif(!safe) throw new Error(\"Sheet name cannot contain : \\\\ / ? * [ ]\");\n\t\t_good = false;\n\t});\n\treturn _good;\n}\nfunction check_wb_names(N, S, codes) {\n\tN.forEach(function(n,i) {\n\t\tcheck_ws_name(n);\n\t\tfor(var j = 0; j < i; ++j) if(n == N[j]) throw new Error(\"Duplicate Sheet Name: \" + n);\n\t\tif(codes) {\n\t\t\tvar cn = (S && S[i] && S[i].CodeName) || n;\n\t\t\tif(cn.charCodeAt(0) == 95 && cn.length > 22) throw new Error(\"Bad Code Name: Worksheet\" + cn);\n\t\t}\n\t});\n}\nfunction check_wb(wb) {\n\tif(!wb || !wb.SheetNames || !wb.Sheets) throw new Error(\"Invalid Workbook\");\n\tif(!wb.SheetNames.length) throw new Error(\"Workbook is empty\");\n\tvar Sheets = (wb.Workbook && wb.Workbook.Sheets) || [];\n\tcheck_wb_names(wb.SheetNames, Sheets, !!wb.vbaraw);\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) check_ws(wb.Sheets[wb.SheetNames[i]], wb.SheetNames[i], i);\n\t/* TODO: validate workbook */\n}\n/* 18.2 Workbook */\nvar wbnsregex = /<\\w+:workbook/;\nfunction parse_wb_xml(data, opts)/*:WorkbookFile*/ {\n\tif(!data) throw new Error(\"Could not find file\");\n\tvar wb = /*::(*/{ AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, Names:[], xmlns: \"\" }/*::)*/;\n\tvar pass = false, xmlns = \"xmlns\";\n\tvar dname = {}, dnstart = 0;\n\tdata.replace(tagregex, function xml_wb(x, idx) {\n\t\tvar y/*:any*/ = parsexmltag(x);\n\t\tswitch(strip_ns(y[0])) {\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.13 fileVersion CT_FileVersion ? */\n\t\t\tcase '': case '': break;\n\n\t\t\t/* 18.2.12 fileSharing CT_FileSharing ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.28 workbookPr CT_WorkbookPr ? */\n\t\t\tcase '':\n\t\t\t\tWBPropsDef.forEach(function(w) {\n\t\t\t\t\tif(y[w[0]] == null) return;\n\t\t\t\t\tswitch(w[2]) {\n\t\t\t\t\t\tcase \"bool\": wb.WBProps[w[0]] = parsexmlbool(y[w[0]]); break;\n\t\t\t\t\t\tcase \"int\": wb.WBProps[w[0]] = parseInt(y[w[0]], 10); break;\n\t\t\t\t\t\tdefault: wb.WBProps[w[0]] = y[w[0]];\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif(y.codeName) wb.WBProps.CodeName = utf8read(y.codeName);\n\t\t\t\tbreak;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.29 workbookProtection CT_WorkbookProtection ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.1 bookViews CT_BookViews ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.30 workbookView CT_BookView + */\n\t\t\tcase '': delete y[0]; wb.WBView.push(y); break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.20 sheets CT_Sheets 1 */\n\t\t\tcase '': case '': break; // aggregate sheet\n\t\t\t/* 18.2.19 sheet CT_Sheet + */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.15 functionGroups CT_FunctionGroups ? */\n\t\t\tcase '': break;\n\t\t\t/* 18.2.14 functionGroup CT_FunctionGroup + */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.8 externalReference CT_ExternalReference + */\n\t\t\tcase '': break;\n\t\t\tcase '': case '': pass=false; break;\n\t\t\t/* 18.2.5 definedName CT_DefinedName + */\n\t\t\tcase '': {\n\t\t\t\tdname.Ref = unescapexml(utf8read(data.slice(dnstart, idx)));\n\t\t\t\twb.Names.push(dname);\n\t\t\t} break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.2 calcPr CT_CalcPr ? */\n\t\t\tcase '': delete y[0]; wb.CalcPr = y; break;\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.16 oleSize CT_OleSize ? (ref required) */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.18 pivotCaches CT_PivotCaches ? */\n\t\t\tcase '': case '': case '': break;\n\n\t\t\t/* 18.2.23 smartTagTypes CT_SmartTagTypes ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.22 smartTagType CT_SmartTagType ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.11 fileRecoveryPr CT_FileRecoveryPr ? */\n\t\t\tcase '': break;\n\n\t\t\t/* 18.2.26 webPublishObjects CT_WebPublishObjects ? */\n\t\t\tcase '': case '': break;\n\t\t\t/* 18.2.25 webPublishObject CT_WebPublishObject ? */\n\t\t\tcase '': case '': case '': break;\n\t\t\t/* 18.2.7 ext CT_Extension + */\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* Others */\n\t\t\tcase '': pass=true; break;\n\t\t\tcase '': pass=false; break;\n\n\t\t\t/* TODO */\n\t\t\tcase ' 0);\n\n\t/* fileVersion */\n\t/* fileSharing */\n\n\tvar workbookPr/*:any*/ = ({codeName:\"ThisWorkbook\"}/*:any*/);\n\tif(wb.Workbook && wb.Workbook.WBProps) {\n\t\tWBPropsDef.forEach(function(x) {\n\t\t\t/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw \"unreachable\"; */\n\t\t\tif((wb.Workbook.WBProps[x[0]]/*:any*/) == null) return;\n\t\t\tif((wb.Workbook.WBProps[x[0]]/*:any*/) == x[1]) return;\n\t\t\tworkbookPr[x[0]] = (wb.Workbook.WBProps[x[0]]/*:any*/);\n\t\t});\n\t\t/*:: if(!wb.Workbook || !wb.Workbook.WBProps) throw \"unreachable\"; */\n\t\tif(wb.Workbook.WBProps.CodeName) { workbookPr.codeName = wb.Workbook.WBProps.CodeName; delete workbookPr.CodeName; }\n\t}\n\to[o.length] = (writextag('workbookPr', null, workbookPr));\n\n\t/* workbookProtection */\n\n\tvar sheets = wb.Workbook && wb.Workbook.Sheets || [];\n\tvar i = 0;\n\n\t/* bookViews only written if first worksheet is hidden */\n\tif(sheets && sheets[0] && !!sheets[0].Hidden) {\n\t\to[o.length] = \"\";\n\t\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\t\tif(!sheets[i]) break;\n\t\t\tif(!sheets[i].Hidden) break;\n\t\t}\n\t\tif(i == wb.SheetNames.length) i = 0;\n\t\to[o.length] = '';\n\t\to[o.length] = \"\";\n\t}\n\n\to[o.length] = \"\";\n\tfor(i = 0; i != wb.SheetNames.length; ++i) {\n\t\tvar sht = ({name:escapexml(wb.SheetNames[i].slice(0,31))}/*:any*/);\n\t\tsht.sheetId = \"\"+(i+1);\n\t\tsht[\"r:id\"] = \"rId\"+(i+1);\n\t\tif(sheets[i]) switch(sheets[i].Hidden) {\n\t\t\tcase 1: sht.state = \"hidden\"; break;\n\t\t\tcase 2: sht.state = \"veryHidden\"; break;\n\t\t}\n\t\to[o.length] = (writextag('sheet',null,sht));\n\t}\n\to[o.length] = \"\";\n\n\t/* functionGroups */\n\t/* externalReferences */\n\n\tif(write_names) {\n\t\to[o.length] = \"\";\n\t\tif(wb.Workbook && wb.Workbook.Names) wb.Workbook.Names.forEach(function(n) {\n\t\t\tvar d/*:any*/ = {name:n.Name};\n\t\t\tif(n.Comment) d.comment = n.Comment;\n\t\t\tif(n.Sheet != null) d.localSheetId = \"\"+n.Sheet;\n\t\t\tif(n.Hidden) d.hidden = \"1\";\n\t\t\tif(!n.Ref) return;\n\t\t\to[o.length] = writextag('definedName', escapexml(n.Ref), d);\n\t\t});\n\t\to[o.length] = \"\";\n\t}\n\n\t/* calcPr */\n\t/* oleSize */\n\t/* customWorkbookViews */\n\t/* pivotCaches */\n\t/* smartTagPr */\n\t/* smartTagTypes */\n\t/* webPublishing */\n\t/* fileRecoveryPr */\n\t/* webPublishObjects */\n\t/* extLst */\n\n\tif(o.length>2){ o[o.length] = ''; o[1]=o[1].replace(\"/>\",\">\"); }\n\treturn o.join(\"\");\n}\n/* [MS-XLSB] 2.4.304 BrtBundleSh */\nfunction parse_BrtBundleSh(data, length/*:number*/) {\n\tvar z = {};\n\tz.Hidden = data.read_shift(4); //hsState ST_SheetState\n\tz.iTabID = data.read_shift(4);\n\tz.strRelID = parse_RelID(data,length-8);\n\tz.name = parse_XLWideString(data);\n\treturn z;\n}\nfunction write_BrtBundleSh(data, o) {\n\tif(!o) o = new_buf(127);\n\to.write_shift(4, data.Hidden);\n\to.write_shift(4, data.iTabID);\n\twrite_RelID(data.strRelID, o);\n\twrite_XLWideString(data.name.slice(0,31), o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.815 BrtWbProp */\nfunction parse_BrtWbProp(data, length)/*:WBProps*/ {\n\tvar o/*:WBProps*/ = ({}/*:any*/);\n\tvar flags = data.read_shift(4);\n\to.defaultThemeVersion = data.read_shift(4);\n\tvar strName = (length > 8) ? parse_XLWideString(data) : \"\";\n\tif(strName.length > 0) o.CodeName = strName;\n\to.autoCompressPictures = !!(flags & 0x10000);\n\to.backupFile = !!(flags & 0x40);\n\to.checkCompatibility = !!(flags & 0x1000);\n\to.date1904 = !!(flags & 0x01);\n\to.filterPrivacy = !!(flags & 0x08);\n\to.hidePivotFieldList = !!(flags & 0x400);\n\to.promptedSolutions = !!(flags & 0x10);\n\to.publishItems = !!(flags & 0x800);\n\to.refreshAllConnections = !!(flags & 0x40000);\n\to.saveExternalLinkValues = !!(flags & 0x80);\n\to.showBorderUnselectedTables = !!(flags & 0x04);\n\to.showInkAnnotation = !!(flags & 0x20);\n\to.showObjects = [\"all\", \"placeholders\", \"none\"][(flags >> 13) & 0x03];\n\to.showPivotChartFilter = !!(flags & 0x8000);\n\to.updateLinks = [\"userSet\", \"never\", \"always\"][(flags >> 8) & 0x03];\n\treturn o;\n}\nfunction write_BrtWbProp(data/*:?WBProps*/, o) {\n\tif(!o) o = new_buf(72);\n\tvar flags = 0;\n\tif(data) {\n\t\t/* TODO: mirror parse_BrtWbProp fields */\n\t\tif(data.filterPrivacy) flags |= 0x08;\n\t}\n\to.write_shift(4, flags);\n\to.write_shift(4, 0);\n\twrite_XLSBCodeName(data && data.CodeName || \"ThisWorkbook\", o);\n\treturn o.slice(0, o.l);\n}\n\nfunction parse_BrtFRTArchID$(data, length) {\n\tvar o = {};\n\tdata.read_shift(4);\n\to.ArchID = data.read_shift(4);\n\tdata.l += length - 8;\n\treturn o;\n}\n\n/* [MS-XLSB] 2.4.687 BrtName */\nfunction parse_BrtName(data, length, opts) {\n\tvar end = data.l + length;\n\tdata.l += 4; //var flags = data.read_shift(4);\n\tdata.l += 1; //var chKey = data.read_shift(1);\n\tvar itab = data.read_shift(4);\n\tvar name = parse_XLNameWideString(data);\n\tvar formula = parse_XLSBNameParsedFormula(data, 0, opts);\n\tvar comment = parse_XLNullableWideString(data);\n\t//if(0 /* fProc */) {\n\t\t// unusedstring1: XLNullableWideString\n\t\t// description: XLNullableWideString\n\t\t// helpTopic: XLNullableWideString\n\t\t// unusedstring2: XLNullableWideString\n\t//}\n\tdata.l = end;\n\tvar out = ({Name:name, Ptg:formula}/*:any*/);\n\tif(itab < 0xFFFFFFF) out.Sheet = itab;\n\tif(comment) out.Comment = comment;\n\treturn out;\n}\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction parse_wb_bin(data, opts)/*:WorkbookFile*/ {\n\tvar wb = { AppVersion:{}, WBProps:{}, WBView:[], Sheets:[], CalcPr:{}, xmlns: \"\" };\n\tvar state/*:Array*/ = [];\n\tvar pass = false;\n\n\tif(!opts) opts = {};\n\topts.biff = 12;\n\n\tvar Names = [];\n\tvar supbooks = ([[]]/*:any*/);\n\tsupbooks.SheetNames = [];\n\tsupbooks.XTI = [];\n\n\tXLSBRecordEnum[0x0010] = { n:\"BrtFRTArchID$\", f:parse_BrtFRTArchID$ };\n\n\trecordhopper(data, function hopper_wb(val, R, RT) {\n\t\tswitch(RT) {\n\t\t\tcase 0x009C: /* 'BrtBundleSh' */\n\t\t\t\tsupbooks.SheetNames.push(val.name);\n\t\t\t\twb.Sheets.push(val); break;\n\n\t\t\tcase 0x0099: /* 'BrtWbProp' */\n\t\t\t\twb.WBProps = val; break;\n\n\t\t\tcase 0x0027: /* 'BrtName' */\n\t\t\t\tif(val.Sheet != null) opts.SID = val.Sheet;\n\t\t\t\tval.Ref = stringify_formula(val.Ptg, null, null, supbooks, opts);\n\t\t\t\tdelete opts.SID;\n\t\t\t\tdelete val.Ptg;\n\t\t\t\tNames.push(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x040C: /* 'BrtNameExt' */ break;\n\n\t\t\tcase 0x0165: /* 'BrtSupSelf' */\n\t\t\tcase 0x0166: /* 'BrtSupSame' */\n\t\t\tcase 0x0163: /* 'BrtSupBookSrc' */\n\t\t\tcase 0x029B: /* 'BrtSupAddin' */\n\t\t\t\tif(!supbooks[0].length) supbooks[0] = [RT, val];\n\t\t\t\telse supbooks.push([RT, val]);\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = [];\n\t\t\t\tbreak;\n\t\t\tcase 0x016A: /* 'BrtExternSheet' */\n\t\t\t\tif(supbooks.length === 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val);\n\t\t\t\tsupbooks.XTI = supbooks.XTI.concat(val);\n\t\t\t\tbreak;\n\t\t\tcase 0x0169: /* 'BrtPlaceholderName' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0817: /* 'BrtAbsPath15' */\n\t\t\tcase 0x009E: /* 'BrtBookView' */\n\t\t\tcase 0x008F: /* 'BrtBeginBundleShs' */\n\t\t\tcase 0x0298: /* 'BrtBeginFnGroup' */\n\t\t\tcase 0x0161: /* 'BrtBeginExternals' */\n\t\t\t\tbreak;\n\n\t\t\t/* case 'BrtModelTimeGroupingCalcCol' */\n\t\t\tcase 0x0C00: /* 'BrtUid' */\n\t\t\tcase 0x0C01: /* 'BrtRevisionPtr' */\n\t\t\tcase 0x0216: /* 'BrtBookProtection' */\n\t\t\tcase 0x02A5: /* 'BrtBookProtectionIso' */\n\t\t\tcase 0x009D: /* 'BrtCalcProp' */\n\t\t\tcase 0x0262: /* 'BrtCrashRecErr' */\n\t\t\tcase 0x0802: /* 'BrtDecoupledPivotCacheID' */\n\t\t\tcase 0x009B: /* 'BrtFileRecover' */\n\t\t\tcase 0x0224: /* 'BrtFileSharing' */\n\t\t\tcase 0x02A4: /* 'BrtFileSharingIso' */\n\t\t\tcase 0x0080: /* 'BrtFileVersion' */\n\t\t\tcase 0x0299: /* 'BrtFnGroup' */\n\t\t\tcase 0x0850: /* 'BrtModelRelationship' */\n\t\t\tcase 0x084D: /* 'BrtModelTable' */\n\t\t\tcase 0x0225: /* 'BrtOleSize' */\n\t\t\tcase 0x0805: /* 'BrtPivotTableRef' */\n\t\t\tcase 0x0254: /* 'BrtSmartTagType' */\n\t\t\tcase 0x081C: /* 'BrtTableSlicerCacheID' */\n\t\t\tcase 0x081B: /* 'BrtTableSlicerCacheIDs' */\n\t\t\tcase 0x0822: /* 'BrtTimelineCachePivotCacheID' */\n\t\t\tcase 0x018D: /* 'BrtUserBookView' */\n\t\t\tcase 0x009A: /* 'BrtWbFactoid' */\n\t\t\tcase 0x045D: /* 'BrtWbProp14' */\n\t\t\tcase 0x0229: /* 'BrtWebOpt' */\n\t\t\tcase 0x082B: /* 'BrtWorkBookPr15' */\n\t\t\t\tbreak;\n\n\t\t\tcase 0x0023: /* 'BrtFRTBegin' */\n\t\t\t\tstate.push(RT); pass = true; break;\n\t\t\tcase 0x0024: /* 'BrtFRTEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\t\t\tcase 0x0025: /* 'BrtACBegin' */\n\t\t\t\tstate.push(RT); pass = true; break;\n\t\t\tcase 0x0026: /* 'BrtACEnd' */\n\t\t\t\tstate.pop(); pass = false; break;\n\n\t\t\tcase 0x0010: /* 'BrtFRTArchID$' */ break;\n\n\t\t\tdefault:\n\t\t\t\tif(R.T){/* empty */}\n\t\t\t\telse if(!pass || (opts.WTF && state[state.length-1] != 0x0025 /* BrtACBegin */ && state[state.length-1] != 0x0023 /* BrtFRTBegin */)) throw new Error(\"Unexpected record 0x\" + RT.toString(16));\n\t\t}\n\t}, opts);\n\n\tparse_wb_defaults(wb);\n\n\t// $FlowIgnore\n\twb.Names = Names;\n\n\t(wb/*:any*/).supbooks = supbooks;\n\treturn wb;\n}\n\nfunction write_BUNDLESHS(ba, wb/*::, opts*/) {\n\twrite_record(ba, 0x008F /* BrtBeginBundleShs */);\n\tfor(var idx = 0; idx != wb.SheetNames.length; ++idx) {\n\t\tvar viz = wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx] && wb.Workbook.Sheets[idx].Hidden || 0;\n\t\tvar d = { Hidden: viz, iTabID: idx+1, strRelID: 'rId' + (idx+1), name: wb.SheetNames[idx] };\n\t\twrite_record(ba, 0x009C /* BrtBundleSh */, write_BrtBundleSh(d));\n\t}\n\twrite_record(ba, 0x0090 /* BrtEndBundleShs */);\n}\n\n/* [MS-XLSB] 2.4.649 BrtFileVersion */\nfunction write_BrtFileVersion(data, o) {\n\tif(!o) o = new_buf(127);\n\tfor(var i = 0; i != 4; ++i) o.write_shift(4, 0);\n\twrite_XLWideString(\"SheetJS\", o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(XLSX.version, o);\n\twrite_XLWideString(\"7262\", o);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\n/* [MS-XLSB] 2.4.301 BrtBookView */\nfunction write_BrtBookView(idx, o) {\n\tif(!o) o = new_buf(29);\n\to.write_shift(-4, 0);\n\to.write_shift(-4, 460);\n\to.write_shift(4, 28800);\n\to.write_shift(4, 17600);\n\to.write_shift(4, 500);\n\to.write_shift(4, idx);\n\to.write_shift(4, idx);\n\tvar flags = 0x78;\n\to.write_shift(1, flags);\n\treturn o.length > o.l ? o.slice(0, o.l) : o;\n}\n\nfunction write_BOOKVIEWS(ba, wb/*::, opts*/) {\n\t/* required if hidden tab appears before visible tab */\n\tif(!wb.Workbook || !wb.Workbook.Sheets) return;\n\tvar sheets = wb.Workbook.Sheets;\n\tvar i = 0, vistab = -1, hidden = -1;\n\tfor(; i < sheets.length; ++i) {\n\t\tif(!sheets[i] || !sheets[i].Hidden && vistab == -1) vistab = i;\n\t\telse if(sheets[i].Hidden == 1 && hidden == -1) hidden = i;\n\t}\n\tif(hidden > vistab) return;\n\twrite_record(ba, 0x0087 /* BrtBeginBookViews */);\n\twrite_record(ba, 0x009E /* BrtBookView */, write_BrtBookView(vistab));\n\t/* 1*(BrtBookView *FRT) */\n\twrite_record(ba, 0x0088 /* BrtEndBookViews */);\n}\n\n/* [MS-XLSB] 2.4.305 BrtCalcProp */\n/*function write_BrtCalcProp(data, o) {\n\tif(!o) o = new_buf(26);\n\to.write_shift(4,0); // force recalc\n\to.write_shift(4,1);\n\to.write_shift(4,0);\n\twrite_Xnum(0, o);\n\to.write_shift(-4, 1023);\n\to.write_shift(1, 0x33);\n\to.write_shift(1, 0x00);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.4.646 BrtFileRecover */\n/*function write_BrtFileRecover(data, o) {\n\tif(!o) o = new_buf(1);\n\to.write_shift(1,0);\n\treturn o;\n}*/\n\n/* [MS-XLSB] 2.1.7.61 Workbook */\nfunction write_wb_bin(wb, opts) {\n\tvar ba = buf_array();\n\twrite_record(ba, 0x0083 /* BrtBeginBook */);\n\twrite_record(ba, 0x0080 /* BrtFileVersion */, write_BrtFileVersion());\n\t/* [[BrtFileSharingIso] BrtFileSharing] */\n\twrite_record(ba, 0x0099 /* BrtWbProp */, write_BrtWbProp(wb.Workbook && wb.Workbook.WBProps || null));\n\t/* [ACABSPATH] */\n\t/* [[BrtBookProtectionIso] BrtBookProtection] */\n\twrite_BOOKVIEWS(ba, wb, opts);\n\twrite_BUNDLESHS(ba, wb, opts);\n\t/* [FNGROUP] */\n\t/* [EXTERNALS] */\n\t/* *BrtName */\n\t/* write_record(ba, 0x009D BrtCalcProp, write_BrtCalcProp()); */\n\t/* [BrtOleSize] */\n\t/* *(BrtUserBookView *FRT) */\n\t/* [PIVOTCACHEIDS] */\n\t/* [BrtWbFactoid] */\n\t/* [SMARTTAGTYPES] */\n\t/* [BrtWebOpt] */\n\t/* write_record(ba, 0x009B BrtFileRecover, write_BrtFileRecover()); */\n\t/* [WEBPUBITEMS] */\n\t/* [CRERRS] */\n\t/* FRTWORKBOOK */\n\twrite_record(ba, 0x0084 /* BrtEndBook */);\n\n\treturn ba.end();\n}\nfunction parse_wb(data, name/*:string*/, opts)/*:WorkbookFile*/ {\n\tif(name.slice(-4)===\".bin\") return parse_wb_bin((data/*:any*/), opts);\n\treturn parse_wb_xml((data/*:any*/), opts);\n}\n\nfunction parse_ws(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ {\n\tif(name.slice(-4)===\".bin\") return parse_ws_bin((data/*:any*/), opts, idx, rels, wb, themes, styles);\n\treturn parse_ws_xml((data/*:any*/), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_cs(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ {\n\tif(name.slice(-4)===\".bin\") return parse_cs_bin((data/*:any*/), opts, idx, rels, wb, themes, styles);\n\treturn parse_cs_xml((data/*:any*/), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ms(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ {\n\tif(name.slice(-4)===\".bin\") return parse_ms_bin((data/*:any*/), opts, idx, rels, wb, themes, styles);\n\treturn parse_ms_xml((data/*:any*/), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_ds(data, name/*:string*/, idx/*:number*/, opts, rels, wb, themes, styles)/*:Worksheet*/ {\n\tif(name.slice(-4)===\".bin\") return parse_ds_bin((data/*:any*/), opts, idx, rels, wb, themes, styles);\n\treturn parse_ds_xml((data/*:any*/), opts, idx, rels, wb, themes, styles);\n}\n\nfunction parse_sty(data, name/*:string*/, themes, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_sty_bin((data/*:any*/), themes, opts);\n\treturn parse_sty_xml((data/*:any*/), themes, opts);\n}\n\nfunction parse_theme(data/*:string*/, name/*:string*/, opts) {\n\treturn parse_theme_xml(data, opts);\n}\n\nfunction parse_sst(data, name/*:string*/, opts)/*:SST*/ {\n\tif(name.slice(-4)===\".bin\") return parse_sst_bin((data/*:any*/), opts);\n\treturn parse_sst_xml((data/*:any*/), opts);\n}\n\nfunction parse_cmnt(data, name/*:string*/, opts)/*:Array*/ {\n\tif(name.slice(-4)===\".bin\") return parse_comments_bin((data/*:any*/), opts);\n\treturn parse_comments_xml((data/*:any*/), opts);\n}\n\nfunction parse_cc(data, name/*:string*/, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_cc_bin((data/*:any*/), name, opts);\n\treturn parse_cc_xml((data/*:any*/), name, opts);\n}\n\nfunction parse_xlink(data, rel, name/*:string*/, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_xlink_bin((data/*:any*/), rel, name, opts);\n\treturn parse_xlink_xml((data/*:any*/), rel, name, opts);\n}\n\nfunction parse_xlmeta(data, name/*:string*/, opts) {\n\tif(name.slice(-4)===\".bin\") return parse_xlmeta_bin((data/*:any*/), name, opts);\n\treturn parse_xlmeta_xml((data/*:any*/), name, opts);\n}\n\nfunction write_wb(wb, name/*:string*/, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_wb_bin : write_wb_xml)(wb, opts);\n}\n\nfunction write_ws(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_ws_bin : write_ws_xml)(data, opts, wb, rels);\n}\n\n// eslint-disable-next-line no-unused-vars\nfunction write_cs(data/*:number*/, name/*:string*/, opts, wb/*:Workbook*/, rels) {\n\treturn (name.slice(-4)===\".bin\" ? write_cs_bin : write_cs_xml)(data, opts, wb, rels);\n}\n\nfunction write_sty(data, name/*:string*/, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sty_bin : write_sty_xml)(data, opts);\n}\n\nfunction write_sst(data/*:SST*/, name/*:string*/, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_sst_bin : write_sst_xml)(data, opts);\n}\n\nfunction write_cmnt(data/*:Array*/, name/*:string*/, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_comments_bin : write_comments_xml)(data, opts);\n}\n/*\nfunction write_cc(data, name:string, opts) {\n\treturn (name.slice(-4)===\".bin\" ? write_cc_bin : write_cc_xml)(data, opts);\n}\n*/\n\nfunction write_xlmeta(name/*:string*/) {\n\treturn (name.slice(-4)===\".bin\" ? write_xlmeta_bin : write_xlmeta_xml)();\n}\nvar attregexg2=/([\\w:]+)=((?:\")([^\"]*)(?:\")|(?:')([^']*)(?:'))/g;\nvar attregex2=/([\\w:]+)=((?:\")(?:[^\"]*)(?:\")|(?:')(?:[^']*)(?:'))/;\nfunction xlml_parsexmltag(tag/*:string*/, skip_root/*:?boolean*/) {\n\tvar words = tag.split(/\\s+/);\n\tvar z/*:any*/ = ([]/*:any*/); if(!skip_root) z[0] = words[0];\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n/*:: if(!y || !y[2]) continue; */\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\nfunction xlml_parsexmltagobj(tag/*:string*/) {\n\tvar words = tag.split(/\\s+/);\n\tvar z = {};\n\tif(words.length === 1) return z;\n\tvar m = tag.match(attregexg2), y, j, w, i;\n\tif(m) for(i = 0; i != m.length; ++i) {\n\t\ty = m[i].match(attregex2);\n/*:: if(!y || !y[2]) continue; */\n\t\tif((j=y[1].indexOf(\":\")) === -1) z[y[1]] = y[2].slice(1,y[2].length-1);\n\t\telse {\n\t\t\tif(y[1].slice(0,6) === \"xmlns:\") w = \"xmlns\"+y[1].slice(6);\n\t\t\telse w = y[1].slice(j+1);\n\t\t\tz[w] = y[2].slice(1,y[2].length-1);\n\t\t}\n\t}\n\treturn z;\n}\n\n// ----\n\n/* map from xlml named formats to SSF TODO: localize */\nvar XLMLFormatMap/*: {[string]:string}*/;\n\nfunction xlml_format(format, value)/*:string*/ {\n\tvar fmt = XLMLFormatMap[format] || unescapexml(format);\n\tif(fmt === \"General\") return SSF_general(value);\n\treturn SSF_format(fmt, value);\n}\n\nfunction xlml_set_custprop(Custprops, key, cp, val/*:string*/) {\n\tvar oval/*:any*/ = val;\n\tswitch((cp[0].match(/dt:dt=\"([\\w.]+)\"/)||[\"\",\"\"])[1]) {\n\t\tcase \"boolean\": oval = parsexmlbool(val); break;\n\t\tcase \"i2\": case \"int\": oval = parseInt(val, 10); break;\n\t\tcase \"r4\": case \"float\": oval = parseFloat(val); break;\n\t\tcase \"date\": case \"dateTime.tz\": oval = parseDate(val); break;\n\t\tcase \"i8\": case \"string\": case \"fixed\": case \"uuid\": case \"bin.base64\": break;\n\t\tdefault: throw new Error(\"bad custprop:\" + cp[0]);\n\t}\n\tCustprops[unescapexml(key)] = oval;\n}\n\nfunction safe_format_xlml(cell/*:Cell*/, nf, o) {\n\tif(cell.t === 'z') return;\n\tif(!o || o.cellText !== false) try {\n\t\tif(cell.t === 'e') { cell.w = cell.w || BErr[cell.v]; }\n\t\telse if(nf === \"General\") {\n\t\t\tif(cell.t === 'n') {\n\t\t\t\tif((cell.v|0) === cell.v) cell.w = cell.v.toString(10);\n\t\t\t\telse cell.w = SSF_general_num(cell.v);\n\t\t\t}\n\t\t\telse cell.w = SSF_general(cell.v);\n\t\t}\n\t\telse cell.w = xlml_format(nf||\"General\", cell.v);\n\t} catch(e) { if(o.WTF) throw e; }\n\ttry {\n\t\tvar z = XLMLFormatMap[nf]||nf||\"General\";\n\t\tif(o.cellNF) cell.z = z;\n\t\tif(o.cellDates && cell.t == 'n' && fmt_is_date(z)) {\n\t\t\tvar _d = SSF_parse_date_code(cell.v); if(_d) { cell.t = 'd'; cell.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t\t}\n\t} catch(e) { if(o.WTF) throw e; }\n}\n\nfunction process_style_xlml(styles, stag, opts) {\n\tif(opts.cellStyles) {\n\t\tif(stag.Interior) {\n\t\t\tvar I = stag.Interior;\n\t\t\tif(I.Pattern) I.patternType = XLMLPatternTypeMap[I.Pattern] || I.Pattern;\n\t\t}\n\t}\n\tstyles[stag.ID] = stag;\n}\n\n/* TODO: there must exist some form of OSP-blessed spec */\nfunction parse_xlml_data(xml, ss, data, cell/*:any*/, base, styles, csty, row, arrayf, o) {\n\tvar nf = \"General\", sid = cell.StyleID, S = {}; o = o || {};\n\tvar interiors = [];\n\tvar i = 0;\n\tif(sid === undefined && row) sid = row.StyleID;\n\tif(sid === undefined && csty) sid = csty.StyleID;\n\twhile(styles[sid] !== undefined) {\n\t\tif(styles[sid].nf) nf = styles[sid].nf;\n\t\tif(styles[sid].Interior) interiors.push(styles[sid].Interior);\n\t\tif(!styles[sid].Parent) break;\n\t\tsid = styles[sid].Parent;\n\t}\n\tswitch(data.Type) {\n\t\tcase 'Boolean':\n\t\t\tcell.t = 'b';\n\t\t\tcell.v = parsexmlbool(xml);\n\t\t\tbreak;\n\t\tcase 'String':\n\t\t\tcell.t = 's'; cell.r = xlml_fixstr(unescapexml(xml));\n\t\t\tcell.v = (xml.indexOf(\"<\") > -1 ? unescapexml(ss||xml).replace(/<.*?>/g, \"\") : cell.r); // todo: BR etc\n\t\t\tbreak;\n\t\tcase 'DateTime':\n\t\t\tif(xml.slice(-1) != \"Z\") xml += \"Z\";\n\t\t\tcell.v = (parseDate(xml) - new Date(Date.UTC(1899, 11, 30))) / (24 * 60 * 60 * 1000);\n\t\t\tif(cell.v !== cell.v) cell.v = unescapexml(xml);\n\t\t\telse if(cell.v<60) cell.v = cell.v -1;\n\t\t\tif(!nf || nf == \"General\") nf = \"yyyy-mm-dd\";\n\t\t\t/* falls through */\n\t\tcase 'Number':\n\t\t\tif(cell.v === undefined) cell.v=+xml;\n\t\t\tif(!cell.t) cell.t = 'n';\n\t\t\tbreak;\n\t\tcase 'Error': cell.t = 'e'; cell.v = RBErr[xml]; if(o.cellText !== false) cell.w = xml; break;\n\t\tdefault:\n\t\t\tif(xml == \"\" && ss == \"\") { cell.t = 'z'; }\n\t\t\telse { cell.t = 's'; cell.v = xlml_fixstr(ss||xml); }\n\t\t\tbreak;\n\t}\n\tsafe_format_xlml(cell, nf, o);\n\tif(o.cellFormula !== false) {\n\t\tif(cell.Formula) {\n\t\t\tvar fstr = unescapexml(cell.Formula);\n\t\t\t/* strictly speaking, the leading = is required but some writers omit */\n\t\t\tif(fstr.charCodeAt(0) == 61 /* = */) fstr = fstr.slice(1);\n\t\t\tcell.f = rc_to_a1(fstr, base);\n\t\t\tdelete cell.Formula;\n\t\t\tif(cell.ArrayRange == \"RC\") cell.F = rc_to_a1(\"RC:RC\", base);\n\t\t\telse if(cell.ArrayRange) {\n\t\t\t\tcell.F = rc_to_a1(cell.ArrayRange, base);\n\t\t\t\tarrayf.push([safe_decode_range(cell.F), cell.F]);\n\t\t\t}\n\t\t} else {\n\t\t\tfor(i = 0; i < arrayf.length; ++i)\n\t\t\t\tif(base.r >= arrayf[i][0].s.r && base.r <= arrayf[i][0].e.r)\n\t\t\t\t\tif(base.c >= arrayf[i][0].s.c && base.c <= arrayf[i][0].e.c)\n\t\t\t\t\t\tcell.F = arrayf[i][1];\n\t\t}\n\t}\n\tif(o.cellStyles) {\n\t\tinteriors.forEach(function(x) {\n\t\t\tif(!S.patternType && x.patternType) S.patternType = x.patternType;\n\t\t});\n\t\tcell.s = S;\n\t}\n\tif(cell.StyleID !== undefined) cell.ixfe = cell.StyleID;\n}\n\nfunction xlml_clean_comment(comment/*:any*/) {\n\tcomment.t = comment.v || \"\";\n\tcomment.t = comment.t.replace(/\\r\\n/g,\"\\n\").replace(/\\r/g,\"\\n\");\n\tcomment.v = comment.w = comment.ixfe = undefined;\n}\n\n/* TODO: Everything */\nfunction parse_xlml_xml(d, _opts)/*:Workbook*/ {\n\tvar opts = _opts || {};\n\tmake_ssf();\n\tvar str = debom(xlml_normalize(d));\n\tif(opts.type == 'binary' || opts.type == 'array' || opts.type == 'base64') {\n\t\tif(typeof $cptable !== 'undefined') str = $cptable.utils.decode(65001, char_codes(str));\n\t\telse str = utf8read(str);\n\t}\n\tvar opening = str.slice(0, 1024).toLowerCase(), ishtml = false;\n\topening = opening.replace(/\".*?\"/g, \"\");\n\tif((opening.indexOf(\">\") & 1023) > Math.min((opening.indexOf(\",\") & 1023), (opening.indexOf(\";\")&1023))) { var _o = dup(opts); _o.type = \"string\"; return PRN.to_workbook(str, _o); }\n\tif(opening.indexOf(\"= 0) ishtml = true; });\n\tif(ishtml) return html_to_workbook(str, opts);\n\n\tXLMLFormatMap = ({\n\t\t\"General Number\": \"General\",\n\t\t\"General Date\": table_fmt[22],\n\t\t\"Long Date\": \"dddd, mmmm dd, yyyy\",\n\t\t\"Medium Date\": table_fmt[15],\n\t\t\"Short Date\": table_fmt[14],\n\t\t\"Long Time\": table_fmt[19],\n\t\t\"Medium Time\": table_fmt[18],\n\t\t\"Short Time\": table_fmt[20],\n\t\t\"Currency\": '\"$\"#,##0.00_);[Red]\\\\(\"$\"#,##0.00\\\\)',\n\t\t\"Fixed\": table_fmt[2],\n\t\t\"Standard\": table_fmt[4],\n\t\t\"Percent\": table_fmt[10],\n\t\t\"Scientific\": table_fmt[11],\n\t\t\"Yes/No\": '\"Yes\";\"Yes\";\"No\";@',\n\t\t\"True/False\": '\"True\";\"True\";\"False\";@',\n\t\t\"On/Off\": '\"Yes\";\"Yes\";\"No\";@'\n\t}/*:any*/);\n\n\n\tvar Rn;\n\tvar state = [], tmp;\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar sheets = {}, sheetnames/*:Array*/ = [], cursheet/*:Worksheet*/ = (opts.dense ? [] : {}), sheetname = \"\";\n\tvar cell = ({}/*:any*/), row = {};// eslint-disable-line no-unused-vars\n\tvar dtag = xlml_parsexmltag(''), didx = 0;\n\tvar c = 0, r = 0;\n\tvar refguess/*:Range*/ = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\tvar styles = {}, stag = {};\n\tvar ss = \"\", fidx = 0;\n\tvar merges/*:Array*/ = [];\n\tvar Props = {}, Custprops = {}, pidx = 0, cp = [];\n\tvar comments/*:Array*/ = [], comment/*:Comment*/ = ({}/*:any*/);\n\tvar cstys = [], csty, seencol = false;\n\tvar arrayf/*:Array<[Range, string]>*/ = [];\n\tvar rowinfo/*:Array*/ = [], rowobj = {}, cc = 0, rr = 0;\n\tvar Workbook/*:WBWBProps*/ = ({ Sheets:[], WBProps:{date1904:false} }/*:any*/), wsprops = {};\n\txlmlregex.lastIndex = 0;\n\tstr = str.replace(//mg,\"\");\n\tvar raw_Rn3 = \"\";\n\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3] = (raw_Rn3 = Rn[3]).toLowerCase())) {\n\t\tcase 'data' /*case 'Data'*/:\n\t\t\tif(raw_Rn3 == \"data\") {\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(state[state.length-1][1]) break;\n\t\t\tif(Rn[1]==='/') parse_xlml_data(str.slice(didx, Rn.index), ss, dtag, state[state.length-1][0]==/*\"Comment\"*/\"comment\"?comment:cell, {c:c,r:r}, styles, cstys[c], row, arrayf, opts);\n\t\t\telse { ss = \"\"; dtag = xlml_parsexmltag(Rn[0]); didx = Rn.index + Rn[0].length; }\n\t\t\tbreak;\n\t\tcase 'cell' /*case 'Cell'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif(comments.length > 0) cell.c = comments;\n\t\t\t\tif((!opts.sheetRows || opts.sheetRows > r) && cell.v !== undefined) {\n\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\tif(!cursheet[r]) cursheet[r] = [];\n\t\t\t\t\t\tcursheet[r][c] = cell;\n\t\t\t\t\t} else cursheet[encode_col(c) + encode_row(r)] = cell;\n\t\t\t\t}\n\t\t\t\tif(cell.HRef) {\n\t\t\t\t\tcell.l = ({Target:unescapexml(cell.HRef)}/*:any*/);\n\t\t\t\t\tif(cell.HRefScreenTip) cell.l.Tooltip = cell.HRefScreenTip;\n\t\t\t\t\tdelete cell.HRef; delete cell.HRefScreenTip;\n\t\t\t\t}\n\t\t\t\tif(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\tcc = c + (parseInt(cell.MergeAcross,10)|0);\n\t\t\t\t\trr = r + (parseInt(cell.MergeDown,10)|0);\n\t\t\t\t\tmerges.push({s:{c:c,r:r},e:{c:cc,r:rr}});\n\t\t\t\t}\n\t\t\t\tif(!opts.sheetStubs) { if(cell.MergeAcross) c = cc + 1; else ++c; }\n\t\t\t\telse if(cell.MergeAcross || cell.MergeDown) {\n\t\t\t\t\t/*:: if(!cc) cc = 0; if(!rr) rr = 0; */\n\t\t\t\t\tfor(var cma = c; cma <= cc; ++cma) {\n\t\t\t\t\t\tfor(var cmd = r; cmd <= rr; ++cmd) {\n\t\t\t\t\t\t\tif(cma > c || cmd > r) {\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!cursheet[cmd]) cursheet[cmd] = [];\n\t\t\t\t\t\t\t\t\tcursheet[cmd][cma] = {t:'z'};\n\t\t\t\t\t\t\t\t} else cursheet[encode_col(cma) + encode_row(cmd)] = {t:'z'};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tc = cc + 1;\n\t\t\t\t}\n\t\t\t\telse ++c;\n\t\t\t} else {\n\t\t\t\tcell = xlml_parsexmltagobj(Rn[0]);\n\t\t\t\tif(cell.Index) c = +cell.Index - 1;\n\t\t\t\tif(c < refguess.s.c) refguess.s.c = c;\n\t\t\t\tif(c > refguess.e.c) refguess.e.c = c;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") ++c;\n\t\t\t\tcomments = [];\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'row' /*case 'Row'*/:\n\t\t\tif(Rn[1]==='/' || Rn[0].slice(-2) === \"/>\") {\n\t\t\t\tif(r < refguess.s.r) refguess.s.r = r;\n\t\t\t\tif(r > refguess.e.r) refguess.e.r = r;\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") {\n\t\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\t}\n\t\t\t\tc = 0; ++r;\n\t\t\t} else {\n\t\t\t\trow = xlml_parsexmltag(Rn[0]);\n\t\t\t\tif(row.Index) r = +row.Index - 1;\n\t\t\t\trowobj = {};\n\t\t\t\tif(row.AutoFitHeight == \"0\" || row.Height) {\n\t\t\t\t\trowobj.hpx = parseInt(row.Height, 10); rowobj.hpt = px2pt(rowobj.hpx);\n\t\t\t\t\trowinfo[r] = rowobj;\n\t\t\t\t}\n\t\t\t\tif(row.Hidden == \"1\") { rowobj.hidden = true; rowinfo[r] = rowobj; }\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'worksheet' /*case 'Worksheet'*/: /* TODO: read range from FullRows/FullColumns */\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\tsheetnames.push(sheetname);\n\t\t\t\tif(refguess.s.r <= refguess.e.r && refguess.s.c <= refguess.e.c) {\n\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\tif(opts.sheetRows && opts.sheetRows <= refguess.e.r) {\n\t\t\t\t\t\tcursheet[\"!fullref\"] = cursheet[\"!ref\"];\n\t\t\t\t\t\trefguess.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tcursheet[\"!ref\"] = encode_range(refguess);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(merges.length) cursheet[\"!merges\"] = merges;\n\t\t\t\tif(cstys.length > 0) cursheet[\"!cols\"] = cstys;\n\t\t\t\tif(rowinfo.length > 0) cursheet[\"!rows\"] = rowinfo;\n\t\t\t\tsheets[sheetname] = cursheet;\n\t\t\t} else {\n\t\t\t\trefguess = {s: {r:2000000, c:2000000}, e: {r:0, c:0} };\n\t\t\t\tr = c = 0;\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tsheetname = unescapexml(tmp.Name);\n\t\t\t\tcursheet = (opts.dense ? [] : {});\n\t\t\t\tmerges = [];\n\t\t\t\tarrayf = [];\n\t\t\t\trowinfo = [];\n\t\t\t\twsprops = {name:sheetname, Hidden:0};\n\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 'table' /*case 'Table'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].slice(-2) == \"/>\") break;\n\t\t\telse {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\tcstys = []; seencol = false;\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'style' /*case 'Style'*/:\n\t\t\tif(Rn[1]==='/') process_style_xlml(styles, stag, opts);\n\t\t\telse stag = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\n\t\tcase 'numberformat' /*case 'NumberFormat'*/:\n\t\t\tstag.nf = unescapexml(xlml_parsexmltag(Rn[0]).Format || \"General\");\n\t\t\tif(XLMLFormatMap[stag.nf]) stag.nf = XLMLFormatMap[stag.nf];\n\t\t\tfor(var ssfidx = 0; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == stag.nf) break;\n\t\t\tif(ssfidx == 0x188) for(ssfidx = 0x39; ssfidx != 0x188; ++ssfidx) if(table_fmt[ssfidx] == null) { SSF_load(stag.nf, ssfidx); break; }\n\t\t\tbreak;\n\n\t\tcase 'column' /*case 'Column'*/:\n\t\t\tif(state[state.length-1][0] !== /*'Table'*/'table') break;\n\t\t\tcsty = xlml_parsexmltag(Rn[0]);\n\t\t\tif(csty.Hidden) { csty.hidden = true; delete csty.Hidden; }\n\t\t\tif(csty.Width) csty.wpx = parseInt(csty.Width, 10);\n\t\t\tif(!seencol && csty.wpx > 10) {\n\t\t\t\tseencol = true; MDW = DEF_MDW; //find_mdw_wpx(csty.wpx);\n\t\t\t\tfor(var _col = 0; _col < cstys.length; ++_col) if(cstys[_col]) process_col(cstys[_col]);\n\t\t\t}\n\t\t\tif(seencol) process_col(csty);\n\t\t\tcstys[(csty.Index-1||cstys.length)] = csty;\n\t\t\tfor(var i = 0; i < +csty.Span; ++i) cstys[cstys.length] = dup(csty);\n\t\t\tbreak;\n\n\t\tcase 'namedrange' /*case 'NamedRange'*/:\n\t\t\tif(Rn[1]==='/') break;\n\t\t\tif(!Workbook.Names) Workbook.Names = [];\n\t\t\tvar _NamedRange = parsexmltag(Rn[0]);\n\t\t\tvar _DefinedName/*:DefinedName*/ = ({\n\t\t\t\tName: _NamedRange.Name,\n\t\t\t\tRef: rc_to_a1(_NamedRange.RefersTo.slice(1), {r:0, c:0})\n\t\t\t}/*:any*/);\n\t\t\tif(Workbook.Sheets.length>0) _DefinedName.Sheet=Workbook.Sheets.length-1;\n\t\t\t/*:: if(Workbook.Names) */Workbook.Names.push(_DefinedName);\n\t\t\tbreak;\n\n\t\tcase 'namedcell' /*case 'NamedCell'*/: break;\n\t\tcase 'b' /*case 'B'*/: break;\n\t\tcase 'i' /*case 'I'*/: break;\n\t\tcase 'u' /*case 'U'*/: break;\n\t\tcase 's' /*case 'S'*/: break;\n\t\tcase 'em' /*case 'EM'*/: break;\n\t\tcase 'h2' /*case 'H2'*/: break;\n\t\tcase 'h3' /*case 'H3'*/: break;\n\t\tcase 'sub' /*case 'Sub'*/: break;\n\t\tcase 'sup' /*case 'Sup'*/: break;\n\t\tcase 'span' /*case 'Span'*/: break;\n\t\tcase 'alignment' /*case 'Alignment'*/:\n\t\t\tbreak;\n\t\tcase 'borders' /*case 'Borders'*/: break;\n\t\tcase 'border' /*case 'Border'*/: break;\n\t\tcase 'font' /*case 'Font'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") ss += str.slice(fidx, Rn.index);\n\t\t\telse fidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'interior' /*case 'Interior'*/:\n\t\t\tif(!opts.cellStyles) break;\n\t\t\tstag.Interior = xlml_parsexmltag(Rn[0]);\n\t\t\tbreak;\n\t\tcase 'protection' /*case 'Protection'*/: break;\n\n\t\tcase 'author' /*case 'Author'*/:\n\t\tcase 'title' /*case 'Title'*/:\n\t\tcase 'description' /*case 'Description'*/:\n\t\tcase 'created' /*case 'Created'*/:\n\t\tcase 'keywords' /*case 'Keywords'*/:\n\t\tcase 'subject' /*case 'Subject'*/:\n\t\tcase 'category' /*case 'Category'*/:\n\t\tcase 'company' /*case 'Company'*/:\n\t\tcase 'lastauthor' /*case 'LastAuthor'*/:\n\t\tcase 'lastsaved' /*case 'LastSaved'*/:\n\t\tcase 'lastprinted' /*case 'LastPrinted'*/:\n\t\tcase 'version' /*case 'Version'*/:\n\t\tcase 'revision' /*case 'Revision'*/:\n\t\tcase 'totaltime' /*case 'TotalTime'*/:\n\t\tcase 'hyperlinkbase' /*case 'HyperlinkBase'*/:\n\t\tcase 'manager' /*case 'Manager'*/:\n\t\tcase 'contentstatus' /*case 'ContentStatus'*/:\n\t\tcase 'identifier' /*case 'Identifier'*/:\n\t\tcase 'language' /*case 'Language'*/:\n\t\tcase 'appname' /*case 'AppName'*/:\n\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\telse if(Rn[1]===\"/\") xlml_set_prop(Props, raw_Rn3, str.slice(pidx, Rn.index));\n\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\tbreak;\n\t\tcase 'paragraphs' /*case 'Paragraphs'*/: break;\n\n\t\tcase 'styles' /*case 'Styles'*/:\n\t\tcase 'workbook' /*case 'Workbook'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse state.push([Rn[3], false]);\n\t\t\tbreak;\n\n\t\tcase 'comment' /*case 'Comment'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t\txlml_clean_comment(comment);\n\t\t\t\tcomments.push(comment);\n\t\t\t} else {\n\t\t\t\tstate.push([Rn[3], false]);\n\t\t\t\ttmp = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcomment = ({a:tmp.Author}/*:any*/);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'autofilter' /*case 'AutoFilter'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\tvar AutoFilter = xlml_parsexmltag(Rn[0]);\n\t\t\t\tcursheet['!autofilter'] = { ref:rc_to_a1(AutoFilter.Range).replace(/\\$/g,\"\") };\n\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'name' /*case 'Name'*/: break;\n\n\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\tif(Rn[1]==='/'){\n\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));\n\t\t\t} else {\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t}\n\t\t\tbreak;\n\n\t\tcase 'pixelsperinch' /*case 'PixelsPerInch'*/:\n\t\t\tbreak;\n\t\tcase 'componentoptions' /*case 'ComponentOptions'*/:\n\t\tcase 'documentproperties' /*case 'DocumentProperties'*/:\n\t\tcase 'customdocumentproperties' /*case 'CustomDocumentProperties'*/:\n\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/:\n\t\tcase 'pivottable' /*case 'PivotTable'*/:\n\t\tcase 'pivotcache' /*case 'PivotCache'*/:\n\t\tcase 'names' /*case 'Names'*/:\n\t\tcase 'mapinfo' /*case 'MapInfo'*/:\n\t\tcase 'pagebreaks' /*case 'PageBreaks'*/:\n\t\tcase 'querytable' /*case 'QueryTable'*/:\n\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\tcase 'schema' /*case 'Schema'*/: //case 'data' /*case 'data'*/:\n\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\tcase 'smarttagtype' /*case 'SmartTagType'*/:\n\t\tcase 'smarttags' /*case 'SmartTags'*/:\n\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/:\n\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/:\n\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/:\n\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw new Error(\"Bad state: \"+tmp.join(\"|\"));}\n\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\tbreak;\n\n\t\tcase 'null' /*case 'Null'*/: break;\n\n\t\tdefault:\n\t\t\t/* FODS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"document\") return parse_fods(str, opts);\n\t\t\t/* UOS file root is */\n\t\t\tif(state.length == 0 && Rn[3] == \"uof\"/*\"UOF\"*/) return parse_fods(str, opts);\n\n\t\t\tvar seen = true;\n\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t/* OfficeDocumentSettings */\n\t\t\t\tcase 'officedocumentsettings' /*case 'OfficeDocumentSettings'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'allowpng' /*case 'AllowPNG'*/: break;\n\t\t\t\t\tcase 'removepersonalinformation' /*case 'RemovePersonalInformation'*/: break;\n\t\t\t\t\tcase 'downloadcomponents' /*case 'DownloadComponents'*/: break;\n\t\t\t\t\tcase 'locationofcomponents' /*case 'LocationOfComponents'*/: break;\n\t\t\t\t\tcase 'colors' /*case 'Colors'*/: break;\n\t\t\t\t\tcase 'color' /*case 'Color'*/: break;\n\t\t\t\t\tcase 'index' /*case 'Index'*/: break;\n\t\t\t\t\tcase 'rgb' /*case 'RGB'*/: break;\n\t\t\t\t\tcase 'targetscreensize' /*case 'TargetScreenSize'*/: break;\n\t\t\t\t\tcase 'readonlyrecommended' /*case 'ReadOnlyRecommended'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ComponentOptions */\n\t\t\t\tcase 'componentoptions' /*case 'ComponentOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'toolbar' /*case 'Toolbar'*/: break;\n\t\t\t\t\tcase 'hideofficelogo' /*case 'HideOfficeLogo'*/: break;\n\t\t\t\t\tcase 'spreadsheetautofit' /*case 'SpreadsheetAutoFit'*/: break;\n\t\t\t\t\tcase 'label' /*case 'Label'*/: break;\n\t\t\t\t\tcase 'caption' /*case 'Caption'*/: break;\n\t\t\t\t\tcase 'maxheight' /*case 'MaxHeight'*/: break;\n\t\t\t\t\tcase 'maxwidth' /*case 'MaxWidth'*/: break;\n\t\t\t\t\tcase 'nextsheetnumber' /*case 'NextSheetNumber'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* ExcelWorkbook */\n\t\t\t\tcase 'excelworkbook' /*case 'ExcelWorkbook'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'date1904' /*case 'Date1904'*/:\n\t\t\t\t\t\t/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */\n\t\t\t\t\t\tWorkbook.WBProps.date1904 = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'windowheight' /*case 'WindowHeight'*/: break;\n\t\t\t\t\tcase 'windowwidth' /*case 'WindowWidth'*/: break;\n\t\t\t\t\tcase 'windowtopx' /*case 'WindowTopX'*/: break;\n\t\t\t\t\tcase 'windowtopy' /*case 'WindowTopY'*/: break;\n\t\t\t\t\tcase 'tabratio' /*case 'TabRatio'*/: break;\n\t\t\t\t\tcase 'protectstructure' /*case 'ProtectStructure'*/: break;\n\t\t\t\t\tcase 'protectwindow' /*case 'ProtectWindow'*/: break;\n\t\t\t\t\tcase 'protectwindows' /*case 'ProtectWindows'*/: break;\n\t\t\t\t\tcase 'activesheet' /*case 'ActiveSheet'*/: break;\n\t\t\t\t\tcase 'displayinknotes' /*case 'DisplayInkNotes'*/: break;\n\t\t\t\t\tcase 'firstvisiblesheet' /*case 'FirstVisibleSheet'*/: break;\n\t\t\t\t\tcase 'supbook' /*case 'SupBook'*/: break;\n\t\t\t\t\tcase 'sheetname' /*case 'SheetName'*/: break;\n\t\t\t\t\tcase 'sheetindex' /*case 'SheetIndex'*/: break;\n\t\t\t\t\tcase 'sheetindexfirst' /*case 'SheetIndexFirst'*/: break;\n\t\t\t\t\tcase 'sheetindexlast' /*case 'SheetIndexLast'*/: break;\n\t\t\t\t\tcase 'dll' /*case 'Dll'*/: break;\n\t\t\t\t\tcase 'acceptlabelsinformulas' /*case 'AcceptLabelsInFormulas'*/: break;\n\t\t\t\t\tcase 'donotsavelinkvalues' /*case 'DoNotSaveLinkValues'*/: break;\n\t\t\t\t\tcase 'iteration' /*case 'Iteration'*/: break;\n\t\t\t\t\tcase 'maxiterations' /*case 'MaxIterations'*/: break;\n\t\t\t\t\tcase 'maxchange' /*case 'MaxChange'*/: break;\n\t\t\t\t\tcase 'path' /*case 'Path'*/: break;\n\t\t\t\t\tcase 'xct' /*case 'Xct'*/: break;\n\t\t\t\t\tcase 'count' /*case 'Count'*/: break;\n\t\t\t\t\tcase 'selectedsheets' /*case 'SelectedSheets'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tcase 'uncalced' /*case 'Uncalced'*/: break;\n\t\t\t\t\tcase 'startupprompt' /*case 'StartupPrompt'*/: break;\n\t\t\t\t\tcase 'crn' /*case 'Crn'*/: break;\n\t\t\t\t\tcase 'externname' /*case 'ExternName'*/: break;\n\t\t\t\t\tcase 'formula' /*case 'Formula'*/: break;\n\t\t\t\t\tcase 'colfirst' /*case 'ColFirst'*/: break;\n\t\t\t\t\tcase 'collast' /*case 'ColLast'*/: break;\n\t\t\t\t\tcase 'wantadvise' /*case 'WantAdvise'*/: break;\n\t\t\t\t\tcase 'boolean' /*case 'Boolean'*/: break;\n\t\t\t\t\tcase 'error' /*case 'Error'*/: break;\n\t\t\t\t\tcase 'text' /*case 'Text'*/: break;\n\t\t\t\t\tcase 'ole' /*case 'OLE'*/: break;\n\t\t\t\t\tcase 'noautorecover' /*case 'NoAutoRecover'*/: break;\n\t\t\t\t\tcase 'publishobjects' /*case 'PublishObjects'*/: break;\n\t\t\t\t\tcase 'donotcalculatebeforesave' /*case 'DoNotCalculateBeforeSave'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'refmoder1c1' /*case 'RefModeR1C1'*/: break;\n\t\t\t\t\tcase 'embedsavesmarttags' /*case 'EmbedSaveSmartTags'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorkbookOptions */\n\t\t\t\tcase 'workbookoptions' /*case 'WorkbookOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'owcversion' /*case 'OWCVersion'*/: break;\n\t\t\t\t\tcase 'height' /*case 'Height'*/: break;\n\t\t\t\t\tcase 'width' /*case 'Width'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* WorksheetOptions */\n\t\t\t\tcase 'worksheetoptions' /*case 'WorksheetOptions'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'visible' /*case 'Visible'*/:\n\t\t\t\t\t\tif(Rn[0].slice(-2) === \"/>\"){/* empty */}\n\t\t\t\t\t\telse if(Rn[1]===\"/\") switch(str.slice(pidx, Rn.index)) {\n\t\t\t\t\t\t\tcase \"SheetHidden\": wsprops.Hidden = 1; break;\n\t\t\t\t\t\t\tcase \"SheetVeryHidden\": wsprops.Hidden = 2; break;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'header' /*case 'Header'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tif(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].header = +parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'footer' /*case 'Footer'*/:\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={}, 'xlml');\n\t\t\t\t\t\tif(!isNaN(+parsexmltag(Rn[0]).Margin)) cursheet['!margins'].footer = +parsexmltag(Rn[0]).Margin;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'pagemargins' /*case 'PageMargins'*/:\n\t\t\t\t\t\tvar pagemargins = parsexmltag(Rn[0]);\n\t\t\t\t\t\tif(!cursheet['!margins']) default_margins(cursheet['!margins']={},'xlml');\n\t\t\t\t\t\tif(!isNaN(+pagemargins.Top)) cursheet['!margins'].top = +pagemargins.Top;\n\t\t\t\t\t\tif(!isNaN(+pagemargins.Left)) cursheet['!margins'].left = +pagemargins.Left;\n\t\t\t\t\t\tif(!isNaN(+pagemargins.Right)) cursheet['!margins'].right = +pagemargins.Right;\n\t\t\t\t\t\tif(!isNaN(+pagemargins.Bottom)) cursheet['!margins'].bottom = +pagemargins.Bottom;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'displayrighttoleft' /*case 'DisplayRightToLeft'*/:\n\t\t\t\t\t\tif(!Workbook.Views) Workbook.Views = [];\n\t\t\t\t\t\tif(!Workbook.Views[0]) Workbook.Views[0] = {};\n\t\t\t\t\t\tWorkbook.Views[0].RTL = true;\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'freezepanes' /*case 'FreezePanes'*/: break;\n\t\t\t\t\tcase 'frozennosplit' /*case 'FrozenNoSplit'*/: break;\n\n\t\t\t\t\tcase 'splithorizontal' /*case 'SplitHorizontal'*/:\n\t\t\t\t\tcase 'splitvertical' /*case 'SplitVertical'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'donotdisplaygridlines' /*case 'DoNotDisplayGridlines'*/:\n\t\t\t\t\t\tbreak;\n\n\t\t\t\t\tcase 'activerow' /*case 'ActiveRow'*/: break;\n\t\t\t\t\tcase 'activecol' /*case 'ActiveCol'*/: break;\n\t\t\t\t\tcase 'toprowbottompane' /*case 'TopRowBottomPane'*/: break;\n\t\t\t\t\tcase 'leftcolumnrightpane' /*case 'LeftColumnRightPane'*/: break;\n\n\t\t\t\t\tcase 'unsynced' /*case 'Unsynced'*/: break;\n\t\t\t\t\tcase 'print' /*case 'Print'*/: break;\n\t\t\t\t\tcase 'printerrors' /*case 'PrintErrors'*/: break;\n\t\t\t\t\tcase 'panes' /*case 'Panes'*/: break;\n\t\t\t\t\tcase 'scale' /*case 'Scale'*/: break;\n\t\t\t\t\tcase 'pane' /*case 'Pane'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'layout' /*case 'Layout'*/: break;\n\t\t\t\t\tcase 'pagesetup' /*case 'PageSetup'*/: break;\n\t\t\t\t\tcase 'selected' /*case 'Selected'*/: break;\n\t\t\t\t\tcase 'protectobjects' /*case 'ProtectObjects'*/: break;\n\t\t\t\t\tcase 'enableselection' /*case 'EnableSelection'*/: break;\n\t\t\t\t\tcase 'protectscenarios' /*case 'ProtectScenarios'*/: break;\n\t\t\t\t\tcase 'validprinterinfo' /*case 'ValidPrinterInfo'*/: break;\n\t\t\t\t\tcase 'horizontalresolution' /*case 'HorizontalResolution'*/: break;\n\t\t\t\t\tcase 'verticalresolution' /*case 'VerticalResolution'*/: break;\n\t\t\t\t\tcase 'numberofcopies' /*case 'NumberofCopies'*/: break;\n\t\t\t\t\tcase 'activepane' /*case 'ActivePane'*/: break;\n\t\t\t\t\tcase 'toprowvisible' /*case 'TopRowVisible'*/: break;\n\t\t\t\t\tcase 'leftcolumnvisible' /*case 'LeftColumnVisible'*/: break;\n\t\t\t\t\tcase 'fittopage' /*case 'FitToPage'*/: break;\n\t\t\t\t\tcase 'rangeselection' /*case 'RangeSelection'*/: break;\n\t\t\t\t\tcase 'papersizeindex' /*case 'PaperSizeIndex'*/: break;\n\t\t\t\t\tcase 'pagelayoutzoom' /*case 'PageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'pagebreakzoom' /*case 'PageBreakZoom'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'fitwidth' /*case 'FitWidth'*/: break;\n\t\t\t\t\tcase 'fitheight' /*case 'FitHeight'*/: break;\n\t\t\t\t\tcase 'commentslayout' /*case 'CommentsLayout'*/: break;\n\t\t\t\t\tcase 'zoom' /*case 'Zoom'*/: break;\n\t\t\t\t\tcase 'lefttoright' /*case 'LeftToRight'*/: break;\n\t\t\t\t\tcase 'gridlines' /*case 'Gridlines'*/: break;\n\t\t\t\t\tcase 'allowsort' /*case 'AllowSort'*/: break;\n\t\t\t\t\tcase 'allowfilter' /*case 'AllowFilter'*/: break;\n\t\t\t\t\tcase 'allowinsertrows' /*case 'AllowInsertRows'*/: break;\n\t\t\t\t\tcase 'allowdeleterows' /*case 'AllowDeleteRows'*/: break;\n\t\t\t\t\tcase 'allowinsertcols' /*case 'AllowInsertCols'*/: break;\n\t\t\t\t\tcase 'allowdeletecols' /*case 'AllowDeleteCols'*/: break;\n\t\t\t\t\tcase 'allowinserthyperlinks' /*case 'AllowInsertHyperlinks'*/: break;\n\t\t\t\t\tcase 'allowformatcells' /*case 'AllowFormatCells'*/: break;\n\t\t\t\t\tcase 'allowsizecols' /*case 'AllowSizeCols'*/: break;\n\t\t\t\t\tcase 'allowsizerows' /*case 'AllowSizeRows'*/: break;\n\t\t\t\t\tcase 'nosummaryrowsbelowdetail' /*case 'NoSummaryRowsBelowDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].above = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'tabcolorindex' /*case 'TabColorIndex'*/: break;\n\t\t\t\t\tcase 'donotdisplayheadings' /*case 'DoNotDisplayHeadings'*/: break;\n\t\t\t\t\tcase 'showpagelayoutzoom' /*case 'ShowPageLayoutZoom'*/: break;\n\t\t\t\t\tcase 'nosummarycolumnsrightdetail' /*case 'NoSummaryColumnsRightDetail'*/:\n\t\t\t\t\t\tif(!cursheet[\"!outline\"]) cursheet[\"!outline\"] = {};\n\t\t\t\t\t\tcursheet[\"!outline\"].left = true;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'blackandwhite' /*case 'BlackAndWhite'*/: break;\n\t\t\t\t\tcase 'donotdisplayzeros' /*case 'DoNotDisplayZeros'*/: break;\n\t\t\t\t\tcase 'displaypagebreak' /*case 'DisplayPageBreak'*/: break;\n\t\t\t\t\tcase 'rowcolheadings' /*case 'RowColHeadings'*/: break;\n\t\t\t\t\tcase 'donotdisplayoutline' /*case 'DoNotDisplayOutline'*/: break;\n\t\t\t\t\tcase 'noorientation' /*case 'NoOrientation'*/: break;\n\t\t\t\t\tcase 'allowusepivottables' /*case 'AllowUsePivotTables'*/: break;\n\t\t\t\t\tcase 'zeroheight' /*case 'ZeroHeight'*/: break;\n\t\t\t\t\tcase 'viewablerange' /*case 'ViewableRange'*/: break;\n\t\t\t\t\tcase 'selection' /*case 'Selection'*/: break;\n\t\t\t\t\tcase 'protectcontents' /*case 'ProtectContents'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PivotTable */\n\t\t\t\tcase 'pivottable' /*case 'PivotTable'*/: case 'pivotcache' /*case 'PivotCache'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'immediateitemsondrop' /*case 'ImmediateItemsOnDrop'*/: break;\n\t\t\t\t\tcase 'showpagemultipleitemlabel' /*case 'ShowPageMultipleItemLabel'*/: break;\n\t\t\t\t\tcase 'compactrowindent' /*case 'CompactRowIndent'*/: break;\n\t\t\t\t\tcase 'location' /*case 'Location'*/: break;\n\t\t\t\t\tcase 'pivotfield' /*case 'PivotField'*/: break;\n\t\t\t\t\tcase 'orientation' /*case 'Orientation'*/: break;\n\t\t\t\t\tcase 'layoutform' /*case 'LayoutForm'*/: break;\n\t\t\t\t\tcase 'layoutsubtotallocation' /*case 'LayoutSubtotalLocation'*/: break;\n\t\t\t\t\tcase 'layoutcompactrow' /*case 'LayoutCompactRow'*/: break;\n\t\t\t\t\tcase 'position' /*case 'Position'*/: break;\n\t\t\t\t\tcase 'pivotitem' /*case 'PivotItem'*/: break;\n\t\t\t\t\tcase 'datatype' /*case 'DataType'*/: break;\n\t\t\t\t\tcase 'datafield' /*case 'DataField'*/: break;\n\t\t\t\t\tcase 'sourcename' /*case 'SourceName'*/: break;\n\t\t\t\t\tcase 'parentfield' /*case 'ParentField'*/: break;\n\t\t\t\t\tcase 'ptlineitems' /*case 'PTLineItems'*/: break;\n\t\t\t\t\tcase 'ptlineitem' /*case 'PTLineItem'*/: break;\n\t\t\t\t\tcase 'countofsameitems' /*case 'CountOfSameItems'*/: break;\n\t\t\t\t\tcase 'item' /*case 'Item'*/: break;\n\t\t\t\t\tcase 'itemtype' /*case 'ItemType'*/: break;\n\t\t\t\t\tcase 'ptsource' /*case 'PTSource'*/: break;\n\t\t\t\t\tcase 'cacheindex' /*case 'CacheIndex'*/: break;\n\t\t\t\t\tcase 'consolidationreference' /*case 'ConsolidationReference'*/: break;\n\t\t\t\t\tcase 'filename' /*case 'FileName'*/: break;\n\t\t\t\t\tcase 'reference' /*case 'Reference'*/: break;\n\t\t\t\t\tcase 'nocolumngrand' /*case 'NoColumnGrand'*/: break;\n\t\t\t\t\tcase 'norowgrand' /*case 'NoRowGrand'*/: break;\n\t\t\t\t\tcase 'blanklineafteritems' /*case 'BlankLineAfterItems'*/: break;\n\t\t\t\t\tcase 'hidden' /*case 'Hidden'*/: break;\n\t\t\t\t\tcase 'subtotal' /*case 'Subtotal'*/: break;\n\t\t\t\t\tcase 'basefield' /*case 'BaseField'*/: break;\n\t\t\t\t\tcase 'mapchilditems' /*case 'MapChildItems'*/: break;\n\t\t\t\t\tcase 'function' /*case 'Function'*/: break;\n\t\t\t\t\tcase 'refreshonfileopen' /*case 'RefreshOnFileOpen'*/: break;\n\t\t\t\t\tcase 'printsettitles' /*case 'PrintSetTitles'*/: break;\n\t\t\t\t\tcase 'mergelabels' /*case 'MergeLabels'*/: break;\n\t\t\t\t\tcase 'defaultversion' /*case 'DefaultVersion'*/: break;\n\t\t\t\t\tcase 'refreshname' /*case 'RefreshName'*/: break;\n\t\t\t\t\tcase 'refreshdate' /*case 'RefreshDate'*/: break;\n\t\t\t\t\tcase 'refreshdatecopy' /*case 'RefreshDateCopy'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tcase 'versionlastupdate' /*case 'VersionLastUpdate'*/: break;\n\t\t\t\t\tcase 'versionupdateablemin' /*case 'VersionUpdateableMin'*/: break;\n\t\t\t\t\tcase 'versionrefreshablemin' /*case 'VersionRefreshableMin'*/: break;\n\t\t\t\t\tcase 'calculation' /*case 'Calculation'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* PageBreaks */\n\t\t\t\tcase 'pagebreaks' /*case 'PageBreaks'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'colbreaks' /*case 'ColBreaks'*/: break;\n\t\t\t\t\tcase 'colbreak' /*case 'ColBreak'*/: break;\n\t\t\t\t\tcase 'rowbreaks' /*case 'RowBreaks'*/: break;\n\t\t\t\t\tcase 'rowbreak' /*case 'RowBreak'*/: break;\n\t\t\t\t\tcase 'colstart' /*case 'ColStart'*/: break;\n\t\t\t\t\tcase 'colend' /*case 'ColEnd'*/: break;\n\t\t\t\t\tcase 'rowend' /*case 'RowEnd'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* AutoFilter */\n\t\t\t\tcase 'autofilter' /*case 'AutoFilter'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'autofiltercolumn' /*case 'AutoFilterColumn'*/: break;\n\t\t\t\t\tcase 'autofiltercondition' /*case 'AutoFilterCondition'*/: break;\n\t\t\t\t\tcase 'autofilterand' /*case 'AutoFilterAnd'*/: break;\n\t\t\t\t\tcase 'autofilteror' /*case 'AutoFilterOr'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* QueryTable */\n\t\t\t\tcase 'querytable' /*case 'QueryTable'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'id' /*case 'Id'*/: break;\n\t\t\t\t\tcase 'autoformatfont' /*case 'AutoFormatFont'*/: break;\n\t\t\t\t\tcase 'autoformatpattern' /*case 'AutoFormatPattern'*/: break;\n\t\t\t\t\tcase 'querysource' /*case 'QuerySource'*/: break;\n\t\t\t\t\tcase 'querytype' /*case 'QueryType'*/: break;\n\t\t\t\t\tcase 'enableredirections' /*case 'EnableRedirections'*/: break;\n\t\t\t\t\tcase 'refreshedinxl9' /*case 'RefreshedInXl9'*/: break;\n\t\t\t\t\tcase 'urlstring' /*case 'URLString'*/: break;\n\t\t\t\t\tcase 'htmltables' /*case 'HTMLTables'*/: break;\n\t\t\t\t\tcase 'connection' /*case 'Connection'*/: break;\n\t\t\t\t\tcase 'commandtext' /*case 'CommandText'*/: break;\n\t\t\t\t\tcase 'refreshinfo' /*case 'RefreshInfo'*/: break;\n\t\t\t\t\tcase 'notitles' /*case 'NoTitles'*/: break;\n\t\t\t\t\tcase 'nextid' /*case 'NextId'*/: break;\n\t\t\t\t\tcase 'columninfo' /*case 'ColumnInfo'*/: break;\n\t\t\t\t\tcase 'overwritecells' /*case 'OverwriteCells'*/: break;\n\t\t\t\t\tcase 'donotpromptforfile' /*case 'DoNotPromptForFile'*/: break;\n\t\t\t\t\tcase 'textwizardsettings' /*case 'TextWizardSettings'*/: break;\n\t\t\t\t\tcase 'source' /*case 'Source'*/: break;\n\t\t\t\t\tcase 'number' /*case 'Number'*/: break;\n\t\t\t\t\tcase 'decimal' /*case 'Decimal'*/: break;\n\t\t\t\t\tcase 'thousandseparator' /*case 'ThousandSeparator'*/: break;\n\t\t\t\t\tcase 'trailingminusnumbers' /*case 'TrailingMinusNumbers'*/: break;\n\t\t\t\t\tcase 'formatsettings' /*case 'FormatSettings'*/: break;\n\t\t\t\t\tcase 'fieldtype' /*case 'FieldType'*/: break;\n\t\t\t\t\tcase 'delimiters' /*case 'Delimiters'*/: break;\n\t\t\t\t\tcase 'tab' /*case 'Tab'*/: break;\n\t\t\t\t\tcase 'comma' /*case 'Comma'*/: break;\n\t\t\t\t\tcase 'autoformatname' /*case 'AutoFormatName'*/: break;\n\t\t\t\t\tcase 'versionlastedit' /*case 'VersionLastEdit'*/: break;\n\t\t\t\t\tcase 'versionlastrefresh' /*case 'VersionLastRefresh'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'datavalidation' /*case 'DataValidation'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\tcase 'sorting' /*case 'Sorting'*/:\n\t\t\t\tcase 'conditionalformatting' /*case 'ConditionalFormatting'*/:\n\t\t\t\tswitch(Rn[3]) {\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'type' /*case 'Type'*/: break;\n\t\t\t\t\tcase 'min' /*case 'Min'*/: break;\n\t\t\t\t\tcase 'max' /*case 'Max'*/: break;\n\t\t\t\t\tcase 'sort' /*case 'Sort'*/: break;\n\t\t\t\t\tcase 'descending' /*case 'Descending'*/: break;\n\t\t\t\t\tcase 'order' /*case 'Order'*/: break;\n\t\t\t\t\tcase 'casesensitive' /*case 'CaseSensitive'*/: break;\n\t\t\t\t\tcase 'value' /*case 'Value'*/: break;\n\t\t\t\t\tcase 'errorstyle' /*case 'ErrorStyle'*/: break;\n\t\t\t\t\tcase 'errormessage' /*case 'ErrorMessage'*/: break;\n\t\t\t\t\tcase 'errortitle' /*case 'ErrorTitle'*/: break;\n\t\t\t\t\tcase 'cellrangelist' /*case 'CellRangeList'*/: break;\n\t\t\t\t\tcase 'inputmessage' /*case 'InputMessage'*/: break;\n\t\t\t\t\tcase 'inputtitle' /*case 'InputTitle'*/: break;\n\t\t\t\t\tcase 'combohide' /*case 'ComboHide'*/: break;\n\t\t\t\t\tcase 'inputhide' /*case 'InputHide'*/: break;\n\t\t\t\t\tcase 'condition' /*case 'Condition'*/: break;\n\t\t\t\t\tcase 'qualifier' /*case 'Qualifier'*/: break;\n\t\t\t\t\tcase 'useblank' /*case 'UseBlank'*/: break;\n\t\t\t\t\tcase 'value1' /*case 'Value1'*/: break;\n\t\t\t\t\tcase 'value2' /*case 'Value2'*/: break;\n\t\t\t\t\tcase 'format' /*case 'Format'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* MapInfo (schema) */\n\t\t\t\tcase 'mapinfo' /*case 'MapInfo'*/: case 'schema' /*case 'Schema'*/: case 'data' /*case 'data'*/: switch(Rn[3]) {\n\t\t\t\t\tcase 'map' /*case 'Map'*/: break;\n\t\t\t\t\tcase 'entry' /*case 'Entry'*/: break;\n\t\t\t\t\tcase 'range' /*case 'Range'*/: break;\n\t\t\t\t\tcase 'xpath' /*case 'XPath'*/: break;\n\t\t\t\t\tcase 'field' /*case 'Field'*/: break;\n\t\t\t\t\tcase 'xsdtype' /*case 'XSDType'*/: break;\n\t\t\t\t\tcase 'filteron' /*case 'FilterOn'*/: break;\n\t\t\t\t\tcase 'aggregate' /*case 'Aggregate'*/: break;\n\t\t\t\t\tcase 'elementtype' /*case 'ElementType'*/: break;\n\t\t\t\t\tcase 'attributetype' /*case 'AttributeType'*/: break;\n\t\t\t\t/* These are from xsd (XML Schema Definition) */\n\t\t\t\t\tcase 'schema' /*case 'schema'*/:\n\t\t\t\t\tcase 'element' /*case 'element'*/:\n\t\t\t\t\tcase 'complextype' /*case 'complexType'*/:\n\t\t\t\t\tcase 'datatype' /*case 'datatype'*/:\n\t\t\t\t\tcase 'all' /*case 'all'*/:\n\t\t\t\t\tcase 'attribute' /*case 'attribute'*/:\n\t\t\t\t\tcase 'extends' /*case 'extends'*/: break;\n\n\t\t\t\t\tcase 'row' /*case 'row'*/: break;\n\t\t\t\t\tdefault: seen = false;\n\t\t\t\t} break;\n\n\t\t\t\t/* SmartTags (can be anything) */\n\t\t\t\tcase 'smarttags' /*case 'SmartTags'*/: break;\n\n\t\t\t\tdefault: seen = false; break;\n\t\t\t}\n\t\t\tif(seen) break;\n\t\t\t/* CustomDocumentProperties */\n\t\t\tif(Rn[3].match(/!\\[CDATA/)) break;\n\t\t\tif(!state[state.length-1][1]) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t\t\tif(state[state.length-1][0]===/*'CustomDocumentProperties'*/'customdocumentproperties') {\n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") xlml_set_custprop(Custprops, raw_Rn3, cp, str.slice(pidx, Rn.index));\n\t\t\t\telse { cp = Rn; pidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(opts.WTF) throw 'Unrecognized tag: ' + Rn[3] + \"|\" + state.join(\"|\");\n\t}\n\tvar out = ({}/*:any*/);\n\tif(!opts.bookSheets && !opts.bookProps) out.Sheets = sheets;\n\tout.SheetNames = sheetnames;\n\tout.Workbook = Workbook;\n\tout.SSF = dup(table_fmt);\n\tout.Props = Props;\n\tout.Custprops = Custprops;\n\treturn out;\n}\n\nfunction parse_xlml(data/*:RawBytes|string*/, opts)/*:Workbook*/ {\n\tfix_read_opts(opts=opts||{});\n\tswitch(opts.type||\"base64\") {\n\t\tcase \"base64\": return parse_xlml_xml(Base64_decode(data), opts);\n\t\tcase \"binary\": case \"buffer\": case \"file\": return parse_xlml_xml(data, opts);\n\t\tcase \"array\": return parse_xlml_xml(a2s(data), opts);\n\t}\n\t/*:: throw new Error(\"unsupported type \" + opts.type); */\n}\n\n/* TODO */\nfunction write_props_xlml(wb/*:Workbook*/, opts)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\t/* DocumentProperties */\n\tif(wb.Props) o.push(xlml_write_docprops(wb.Props, opts));\n\t/* CustomDocumentProperties */\n\tif(wb.Custprops) o.push(xlml_write_custprops(wb.Props, wb.Custprops, opts));\n\treturn o.join(\"\");\n}\n/* TODO */\nfunction write_wb_xlml(/*::wb, opts*/)/*:string*/ {\n\t/* OfficeDocumentSettings */\n\t/* ExcelWorkbook */\n\treturn \"\";\n}\n/* TODO */\nfunction write_sty_xlml(wb, opts)/*:string*/ {\n\t/* Styles */\n\tvar styles/*:Array*/ = [''];\n\topts.cellXfs.forEach(function(xf, id) {\n\t\tvar payload/*:Array*/ = [];\n\t\tpayload.push(writextag('NumberFormat', null, {\"ss:Format\": escapexml(table_fmt[xf.numFmtId])}));\n\n\t\tvar o = /*::(*/{\"ss:ID\": \"s\" + (21+id)}/*:: :any)*/;\n\t\tstyles.push(writextag('Style', payload.join(\"\"), o));\n\t});\n\treturn writextag(\"Styles\", styles.join(\"\"));\n}\nfunction write_name_xlml(n) { return writextag(\"NamedRange\", null, {\"ss:Name\": n.Name, \"ss:RefersTo\":\"=\" + a1_to_rc(n.Ref, {r:0,c:0})}); }\nfunction write_names_xlml(wb/*::, opts*/)/*:string*/ {\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\n\t/*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error(\"unreachable\"); */\n\tvar names/*:Array*/ = wb.Workbook.Names;\n\tvar out/*:Array*/ = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != null) continue;\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn writextag(\"Names\", out.join(\"\"));\n}\nfunction write_ws_xlml_names(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ {\n\tif(!ws) return \"\";\n\tif(!((wb||{}).Workbook||{}).Names) return \"\";\n\t/*:: if(!wb || !wb.Workbook || !wb.Workbook.Names) throw new Error(\"unreachable\"); */\n\tvar names/*:Array*/ = wb.Workbook.Names;\n\tvar out/*:Array*/ = [];\n\tfor(var i = 0; i < names.length; ++i) {\n\t\tvar n = names[i];\n\t\tif(n.Sheet != idx) continue;\n\t\t/*switch(n.Name) {\n\t\t\tcase \"_\": continue;\n\t\t}*/\n\t\tif(n.Name.match(/^_xlfn\\./)) continue;\n\t\tout.push(write_name_xlml(n));\n\t}\n\treturn out.join(\"\");\n}\n/* WorksheetOptions */\nfunction write_ws_xlml_wsopts(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ {\n\tif(!ws) return \"\";\n\tvar o/*:Array*/ = [];\n\t/* NOTE: spec technically allows any order, but stick with implied order */\n\n\t/* FitToPage */\n\t/* DoNotDisplayColHeaders */\n\t/* DoNotDisplayRowHeaders */\n\t/* ViewableRange */\n\t/* Selection */\n\t/* GridlineColor */\n\t/* Name */\n\t/* ExcelWorksheetType */\n\t/* IntlMacro */\n\t/* Unsynced */\n\t/* Selected */\n\t/* CodeName */\n\n\tif(ws['!margins']) {\n\t\to.push(\"\");\n\t\tif(ws['!margins'].header) o.push(writextag(\"Header\", null, {'x:Margin':ws['!margins'].header}));\n\t\tif(ws['!margins'].footer) o.push(writextag(\"Footer\", null, {'x:Margin':ws['!margins'].footer}));\n\t\to.push(writextag(\"PageMargins\", null, {\n\t\t\t'x:Bottom': ws['!margins'].bottom || \"0.75\",\n\t\t\t'x:Left': ws['!margins'].left || \"0.7\",\n\t\t\t'x:Right': ws['!margins'].right || \"0.7\",\n\t\t\t'x:Top': ws['!margins'].top || \"0.75\"\n\t\t}));\n\t\to.push(\"\");\n\t}\n\n\t/* PageSetup */\n\t/* DisplayPageBreak */\n\t/* TransitionExpressionEvaluation */\n\t/* TransitionFormulaEntry */\n\t/* Print */\n\t/* Zoom */\n\t/* PageLayoutZoom */\n\t/* PageBreakZoom */\n\t/* ShowPageBreakZoom */\n\t/* DefaultRowHeight */\n\t/* DefaultColumnWidth */\n\t/* StandardWidth */\n\n\tif(wb && wb.Workbook && wb.Workbook.Sheets && wb.Workbook.Sheets[idx]) {\n\t\t/* Visible */\n\t\tif(wb.Workbook.Sheets[idx].Hidden) o.push(writextag(\"Visible\", (wb.Workbook.Sheets[idx].Hidden == 1 ? \"SheetHidden\" : \"SheetVeryHidden\"), {}));\n\t\telse {\n\t\t\t/* Selected */\n\t\t\tfor(var i = 0; i < idx; ++i) if(wb.Workbook.Sheets[i] && !wb.Workbook.Sheets[i].Hidden) break;\n\t\t\tif(i == idx) o.push(\"\");\n\t\t}\n\t}\n\n\t/* LeftColumnVisible */\n\n\tif(((((wb||{}).Workbook||{}).Views||[])[0]||{}).RTL) o.push(\"\");\n\n\t/* GridlineColorIndex */\n\t/* DisplayFormulas */\n\t/* DoNotDisplayGridlines */\n\t/* DoNotDisplayHeadings */\n\t/* DoNotDisplayOutline */\n\t/* ApplyAutomaticOutlineStyles */\n\t/* NoSummaryRowsBelowDetail */\n\t/* NoSummaryColumnsRightDetail */\n\t/* DoNotDisplayZeros */\n\t/* ActiveRow */\n\t/* ActiveColumn */\n\t/* FilterOn */\n\t/* RangeSelection */\n\t/* TopRowVisible */\n\t/* TopRowBottomPane */\n\t/* LeftColumnRightPane */\n\t/* ActivePane */\n\t/* SplitHorizontal */\n\t/* SplitVertical */\n\t/* FreezePanes */\n\t/* FrozenNoSplit */\n\t/* TabColorIndex */\n\t/* Panes */\n\n\t/* NOTE: Password not supported in XLML Format */\n\tif(ws['!protect']) {\n\t\to.push(writetag(\"ProtectContents\", \"True\"));\n\t\tif(ws['!protect'].objects) o.push(writetag(\"ProtectObjects\", \"True\"));\n\t\tif(ws['!protect'].scenarios) o.push(writetag(\"ProtectScenarios\", \"True\"));\n\t\tif(ws['!protect'].selectLockedCells != null && !ws['!protect'].selectLockedCells) o.push(writetag(\"EnableSelection\", \"NoSelection\"));\n\t\telse if(ws['!protect'].selectUnlockedCells != null && !ws['!protect'].selectUnlockedCells) o.push(writetag(\"EnableSelection\", \"UnlockedCells\"));\n\t[\n\t\t[ \"formatCells\", \"AllowFormatCells\" ],\n\t\t[ \"formatColumns\", \"AllowSizeCols\" ],\n\t\t[ \"formatRows\", \"AllowSizeRows\" ],\n\t\t[ \"insertColumns\", \"AllowInsertCols\" ],\n\t\t[ \"insertRows\", \"AllowInsertRows\" ],\n\t\t[ \"insertHyperlinks\", \"AllowInsertHyperlinks\" ],\n\t\t[ \"deleteColumns\", \"AllowDeleteCols\" ],\n\t\t[ \"deleteRows\", \"AllowDeleteRows\" ],\n\t\t[ \"sort\", \"AllowSort\" ],\n\t\t[ \"autoFilter\", \"AllowFilter\" ],\n\t\t[ \"pivotTables\", \"AllowUsePivotTables\" ]\n\t].forEach(function(x) { if(ws['!protect'][x[0]]) o.push(\"<\"+x[1]+\"/>\"); });\n\t}\n\n\tif(o.length == 0) return \"\";\n\treturn writextag(\"WorksheetOptions\", o.join(\"\"), {xmlns:XLMLNS.x});\n}\nfunction write_ws_xlml_comment(comments/*:Array*/)/*:string*/ {\n\treturn comments.map(function(c) {\n\t\t// TODO: formatted text\n\t\tvar t = xlml_unfixstr(c.t||\"\");\n\t\tvar d =writextag(\"ss:Data\", t, {\"xmlns\":\"http://www.w3.org/TR/REC-html40\"});\n\t\treturn writextag(\"Comment\", d, {\"ss:Author\":c.a});\n\t}).join(\"\");\n}\nfunction write_ws_xlml_cell(cell, ref/*:string*/, ws, opts, idx/*:number*/, wb, addr)/*:string*/{\n\tif(!cell || (cell.v == undefined && cell.f == undefined)) return \"\";\n\n\tvar attr = {};\n\tif(cell.f) attr[\"ss:Formula\"] = \"=\" + escapexml(a1_to_rc(cell.f, addr));\n\tif(cell.F && cell.F.slice(0, ref.length) == ref) {\n\t\tvar end = decode_cell(cell.F.slice(ref.length + 1));\n\t\tattr[\"ss:ArrayRange\"] = \"RC:R\" + (end.r == addr.r ? \"\" : \"[\" + (end.r - addr.r) + \"]\") + \"C\" + (end.c == addr.c ? \"\" : \"[\" + (end.c - addr.c) + \"]\");\n\t}\n\n\tif(cell.l && cell.l.Target) {\n\t\tattr[\"ss:HRef\"] = escapexml(cell.l.Target);\n\t\tif(cell.l.Tooltip) attr[\"x:HRefScreenTip\"] = escapexml(cell.l.Tooltip);\n\t}\n\n\tif(ws['!merges']) {\n\t\tvar marr = ws['!merges'];\n\t\tfor(var mi = 0; mi != marr.length; ++mi) {\n\t\t\tif(marr[mi].s.c != addr.c || marr[mi].s.r != addr.r) continue;\n\t\t\tif(marr[mi].e.c > marr[mi].s.c) attr['ss:MergeAcross'] = marr[mi].e.c - marr[mi].s.c;\n\t\t\tif(marr[mi].e.r > marr[mi].s.r) attr['ss:MergeDown'] = marr[mi].e.r - marr[mi].s.r;\n\t\t}\n\t}\n\n\tvar t = \"\", p = \"\";\n\tswitch(cell.t) {\n\t\tcase 'z': if(!opts.sheetStubs) return \"\"; break;\n\t\tcase 'n': t = 'Number'; p = String(cell.v); break;\n\t\tcase 'b': t = 'Boolean'; p = (cell.v ? \"1\" : \"0\"); break;\n\t\tcase 'e': t = 'Error'; p = BErr[cell.v]; break;\n\t\tcase 'd': t = 'DateTime'; p = new Date(cell.v).toISOString(); if(cell.z == null) cell.z = cell.z || table_fmt[14]; break;\n\t\tcase 's': t = 'String'; p = escapexlml(cell.v||\"\"); break;\n\t}\n\t/* TODO: cell style */\n\tvar os = get_cell_style(opts.cellXfs, cell, opts);\n\tattr[\"ss:StyleID\"] = \"s\" + (21+os);\n\tattr[\"ss:Index\"] = addr.c + 1;\n\tvar _v = (cell.v != null ? p : \"\");\n\tvar m = cell.t == 'z' ? \"\" : ('' + _v + '');\n\n\tif((cell.c||[]).length > 0) m += write_ws_xlml_comment(cell.c);\n\n\treturn writextag(\"Cell\", m, attr);\n}\nfunction write_ws_xlml_row(R/*:number*/, row)/*:string*/ {\n\tvar o = '';\n}\n/* TODO */\nfunction write_ws_xlml_table(ws/*:Worksheet*/, opts, idx/*:number*/, wb/*:Workbook*/)/*:string*/ {\n\tif(!ws['!ref']) return \"\";\n\tvar range/*:Range*/ = safe_decode_range(ws['!ref']);\n\tvar marr/*:Array*/ = ws['!merges'] || [], mi = 0;\n\tvar o/*:Array*/ = [];\n\tif(ws['!cols']) ws['!cols'].forEach(function(n, i) {\n\t\tprocess_col(n);\n\t\tvar w = !!n.width;\n\t\tvar p = col_obj_w(i, n);\n\t\tvar k/*:any*/ = {\"ss:Index\":i+1};\n\t\tif(w) k['ss:Width'] = width2px(p.width);\n\t\tif(n.hidden) k['ss:Hidden']=\"1\";\n\t\to.push(writextag(\"Column\",null,k));\n\t});\n\tvar dense = Array.isArray(ws);\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\tvar row = [write_ws_xlml_row(R, (ws['!rows']||[])[R])];\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tvar skip = false;\n\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(skip) continue;\n\t\t\tvar addr = {r:R,c:C};\n\t\t\tvar ref = encode_cell(addr), cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\trow.push(write_ws_xlml_cell(cell, ref, ws, opts, idx, wb, addr));\n\t\t}\n\t\trow.push(\"\");\n\t\tif(row.length > 2) o.push(row.join(\"\"));\n\t}\n\treturn o.join(\"\");\n}\nfunction write_ws_xlml(idx/*:number*/, opts, wb/*:Workbook*/)/*:string*/ {\n\tvar o/*:Array*/ = [];\n\tvar s = wb.SheetNames[idx];\n\tvar ws = wb.Sheets[s];\n\n\tvar t/*:string*/ = ws ? write_ws_xlml_names(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"\" + t + \"\");\n\n\t/* Table */\n\tt = ws ? write_ws_xlml_table(ws, opts, idx, wb) : \"\";\n\tif(t.length > 0) o.push(\"
    \" + t + \"
    \");\n\n\t/* WorksheetOptions */\n\to.push(write_ws_xlml_wsopts(ws, opts, idx, wb));\n\n\treturn o.join(\"\");\n}\nfunction write_xlml(wb, opts)/*:string*/ {\n\tif(!opts) opts = {};\n\tif(!wb.SSF) wb.SSF = dup(table_fmt);\n\tif(wb.SSF) {\n\t\tmake_ssf(); SSF_load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t\topts.cellXfs = [];\n\t\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\t}\n\tvar d/*:Array*/ = [];\n\td.push(write_props_xlml(wb, opts));\n\td.push(write_wb_xlml(wb, opts));\n\td.push(\"\");\n\td.push(\"\");\n\tfor(var i = 0; i < wb.SheetNames.length; ++i)\n\t\td.push(writextag(\"Worksheet\", write_ws_xlml(i, opts, wb), {\"ss:Name\":escapexml(wb.SheetNames[i])}));\n\td[2] = write_sty_xlml(wb, opts);\n\td[3] = write_names_xlml(wb, opts);\n\treturn XML_HEADER + writextag(\"Workbook\", d.join(\"\"), {\n\t\t'xmlns': XLMLNS.ss,\n\t\t'xmlns:o': XLMLNS.o,\n\t\t'xmlns:x': XLMLNS.x,\n\t\t'xmlns:ss': XLMLNS.ss,\n\t\t'xmlns:dt': XLMLNS.dt,\n\t\t'xmlns:html': XLMLNS.html\n\t});\n}\n/* [MS-OLEDS] 2.3.8 CompObjStream */\nfunction parse_compobj(obj/*:CFBEntry*/) {\n\tvar v = {};\n\tvar o = obj.content;\n\t/*:: if(o == null) return; */\n\n\t/* [MS-OLEDS] 2.3.7 CompObjHeader -- All fields MUST be ignored */\n\to.l = 28;\n\n\tv.AnsiUserType = o.read_shift(0, \"lpstr-ansi\");\n\tv.AnsiClipboardFormat = parse_ClipboardFormatOrAnsiString(o);\n\n\tif(o.length - o.l <= 4) return v;\n\n\tvar m/*:number*/ = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved1 = o.read_shift(0, \"lpstr-ansi\");\n\n\tif(o.length - o.l <= 4) return v;\n\tm = o.read_shift(4);\n\tif(m !== 0x71b239f4) return v;\n\tv.UnicodeClipboardFormat = parse_ClipboardFormatOrUnicodeString(o);\n\n\tm = o.read_shift(4);\n\tif(m == 0 || m > 40) return v;\n\to.l-=4; v.Reserved2 = o.read_shift(0, \"lpwstr\");\n}\n\n/*\n\tContinue logic for:\n\t- 2.4.58 Continue 0x003c\n\t- 2.4.59 ContinueBigName 0x043c\n\t- 2.4.60 ContinueFrt 0x0812\n\t- 2.4.61 ContinueFrt11 0x0875\n\t- 2.4.62 ContinueFrt12 0x087f\n*/\nvar CONTINUE_RT = [ 0x003c, 0x043c, 0x0812, 0x0875, 0x087f ];\nfunction slurp(RecordType, R, blob, length/*:number*/, opts)/*:any*/ {\n\tvar l = length;\n\tvar bufs = [];\n\tvar d = blob.slice(blob.l,blob.l+l);\n\tif(opts && opts.enc && opts.enc.insitu && d.length > 0) switch(RecordType) {\n\tcase 0x0009: case 0x0209: case 0x0409: case 0x0809/* BOF */: case 0x002f /* FilePass */: case 0x0195 /* FileLock */: case 0x00e1 /* InterfaceHdr */: case 0x0196 /* RRDInfo */: case 0x0138 /* RRDHead */: case 0x0194 /* UsrExcl */: case 0x000a /* EOF */:\n\t\tbreak;\n\tcase 0x0085 /* BoundSheet8 */:\n\t\tbreak;\n\tdefault:\n\t\topts.enc.insitu(d);\n\t}\n\tbufs.push(d);\n\tblob.l += l;\n\tvar nextrt = __readUInt16LE(blob,blob.l), next = XLSRecordEnum[nextrt];\n\tvar start = 0;\n\twhile(next != null && CONTINUE_RT.indexOf(nextrt) > -1) {\n\t\tl = __readUInt16LE(blob,blob.l+2);\n\t\tstart = blob.l + 4;\n\t\tif(nextrt == 0x0812 /* ContinueFrt */) start += 4;\n\t\telse if(nextrt == 0x0875 || nextrt == 0x087f) {\n\t\t\tstart += 12;\n\t\t}\n\t\td = blob.slice(start,blob.l+4+l);\n\t\tbufs.push(d);\n\t\tblob.l += 4+l;\n\t\tnext = (XLSRecordEnum[nextrt = __readUInt16LE(blob, blob.l)]);\n\t}\n\tvar b = (bconcat(bufs)/*:any*/);\n\tprep_blob(b, 0);\n\tvar ll = 0; b.lens = [];\n\tfor(var j = 0; j < bufs.length; ++j) { b.lens.push(ll); ll += bufs[j].length; }\n\tif(b.length < length) throw \"XLS Record 0x\" + RecordType.toString(16) + \" Truncated: \" + b.length + \" < \" + length;\n\treturn R.f(b, b.length, opts);\n}\n\nfunction safe_format_xf(p/*:any*/, opts/*:ParseOpts*/, date1904/*:?boolean*/) {\n\tif(p.t === 'z') return;\n\tif(!p.XF) return;\n\tvar fmtid = 0;\n\ttry {\n\t\tfmtid = p.z || p.XF.numFmtId || 0;\n\t\tif(opts.cellNF) p.z = table_fmt[fmtid];\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(!opts || opts.cellText !== false) try {\n\t\tif(p.t === 'e') { p.w = p.w || BErr[p.v]; }\n\t\telse if(fmtid === 0 || fmtid == \"General\") {\n\t\t\tif(p.t === 'n') {\n\t\t\t\tif((p.v|0) === p.v) p.w = p.v.toString(10);\n\t\t\t\telse p.w = SSF_general_num(p.v);\n\t\t\t}\n\t\t\telse p.w = SSF_general(p.v);\n\t\t}\n\t\telse p.w = SSF_format(fmtid,p.v, {date1904:!!date1904, dateNF: opts && opts.dateNF});\n\t} catch(e) { if(opts.WTF) throw e; }\n\tif(opts.cellDates && fmtid && p.t == 'n' && fmt_is_date(table_fmt[fmtid] || String(fmtid))) {\n\t\tvar _d = SSF_parse_date_code(p.v); if(_d) { p.t = 'd'; p.v = new Date(_d.y, _d.m-1,_d.d,_d.H,_d.M,_d.S,_d.u); }\n\t}\n}\n\nfunction make_cell(val, ixfe, t)/*:Cell*/ {\n\treturn ({v:val, ixfe:ixfe, t:t}/*:any*/);\n}\n\n// 2.3.2\nfunction parse_workbook(blob, options/*:ParseOpts*/)/*:Workbook*/ {\n\tvar wb = ({opts:{}}/*:any*/);\n\tvar Sheets = {};\n\tif(DENSE != null && options.dense == null) options.dense = DENSE;\n\tvar out/*:Worksheet*/ = ((options.dense ? [] : {})/*:any*/);\n\tvar Directory = {};\n\tvar range/*:Range*/ = ({}/*:any*/);\n\tvar last_formula = null;\n\tvar sst/*:SST*/ = ([]/*:any*/);\n\tvar cur_sheet = \"\";\n\tvar Preamble = {};\n\tvar lastcell, last_cell = \"\", cc/*:Cell*/, cmnt, rngC, rngR;\n\tvar sharedf = {};\n\tvar arrayf/*:Array<[Range, string]>*/ = [];\n\tvar temp_val/*:Cell*/;\n\tvar country;\n\tvar XFs = []; /* XF records */\n\tvar palette/*:Array<[number, number, number]>*/ = [];\n\tvar Workbook/*:WBWBProps*/ = ({ Sheets:[], WBProps:{date1904:false}, Views:[{}] }/*:any*/), wsprops = {};\n\tvar get_rgb = function getrgb(icv/*:number*/)/*:[number, number, number]*/ {\n\t\tif(icv < 8) return XLSIcv[icv];\n\t\tif(icv < 64) return palette[icv-8] || XLSIcv[icv];\n\t\treturn XLSIcv[icv];\n\t};\n\tvar process_cell_style = function pcs(cell, line/*:any*/, options) {\n\t\tvar xfd = line.XF.data;\n\t\tif(!xfd || !xfd.patternType || !options || !options.cellStyles) return;\n\t\tline.s = ({}/*:any*/);\n\t\tline.s.patternType = xfd.patternType;\n\t\tvar t;\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvFore)))) { line.s.fgColor = {rgb:t}; }\n\t\tif((t = rgb2Hex(get_rgb(xfd.icvBack)))) { line.s.bgColor = {rgb:t}; }\n\t};\n\tvar addcell = function addcell(cell/*:any*/, line/*:any*/, options/*:any*/) {\n\t\tif(file_depth > 1) return;\n\t\tif(options.sheetRows && cell.r >= options.sheetRows) return;\n\t\tif(options.cellStyles && line.XF && line.XF.data) process_cell_style(cell, line, options);\n\t\tdelete line.ixfe; delete line.XF;\n\t\tlastcell = cell;\n\t\tlast_cell = encode_cell(cell);\n\t\tif(!range || !range.s || !range.e) range = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\tif(cell.r < range.s.r) range.s.r = cell.r;\n\t\tif(cell.c < range.s.c) range.s.c = cell.c;\n\t\tif(cell.r + 1 > range.e.r) range.e.r = cell.r + 1;\n\t\tif(cell.c + 1 > range.e.c) range.e.c = cell.c + 1;\n\t\tif(options.cellFormula && line.f) {\n\t\t\tfor(var afi = 0; afi < arrayf.length; ++afi) {\n\t\t\t\tif(arrayf[afi][0].s.c > cell.c || arrayf[afi][0].s.r > cell.r) continue;\n\t\t\t\tif(arrayf[afi][0].e.c < cell.c || arrayf[afi][0].e.r < cell.r) continue;\n\t\t\t\tline.F = encode_range(arrayf[afi][0]);\n\t\t\t\tif(arrayf[afi][0].s.c != cell.c || arrayf[afi][0].s.r != cell.r) delete line.f;\n\t\t\t\tif(line.f) line.f = \"\" + stringify_formula(arrayf[afi][1], range, cell, supbooks, opts);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\t{\n\t\t\tif(options.dense) {\n\t\t\t\tif(!out[cell.r]) out[cell.r] = [];\n\t\t\t\tout[cell.r][cell.c] = line;\n\t\t\t} else out[last_cell] = line;\n\t\t}\n\t};\n\tvar opts = ({\n\t\tenc: false, // encrypted\n\t\tsbcch: 0, // cch in the preceding SupBook\n\t\tsnames: [], // sheetnames\n\t\tsharedf: sharedf, // shared formulae by address\n\t\tarrayf: arrayf, // array formulae array\n\t\trrtabid: [], // RRTabId\n\t\tlastuser: \"\", // Last User from WriteAccess\n\t\tbiff: 8, // BIFF version\n\t\tcodepage: 0, // CP from CodePage record\n\t\twinlocked: 0, // fLockWn from WinProtect\n\t\tcellStyles: !!options && !!options.cellStyles,\n\t\tWTF: !!options && !!options.wtf\n\t}/*:any*/);\n\tif(options.password) opts.password = options.password;\n\tvar themes;\n\tvar merges/*:Array*/ = [];\n\tvar objects = [];\n\tvar colinfo/*:Array*/ = [], rowinfo/*:Array*/ = [];\n\tvar seencol = false;\n\tvar supbooks = ([]/*:any*/); // 1-indexed, will hold extern names\n\tsupbooks.SheetNames = opts.snames;\n\tsupbooks.sharedf = opts.sharedf;\n\tsupbooks.arrayf = opts.arrayf;\n\tsupbooks.names = [];\n\tsupbooks.XTI = [];\n\tvar last_RT = 0;\n\tvar file_depth = 0; /* TODO: make a real stack */\n\tvar BIFF2Fmt = 0, BIFF2FmtTable/*:Array*/ = [];\n\tvar FilterDatabases = []; /* TODO: sort out supbooks and process elsewhere */\n\tvar last_lbl/*:?DefinedName*/;\n\n\t/* explicit override for some broken writers */\n\topts.codepage = 1200;\n\tset_cp(1200);\n\tvar seen_codepage = false;\n\twhile(blob.l < blob.length - 1) {\n\t\tvar s = blob.l;\n\t\tvar RecordType = blob.read_shift(2);\n\t\tif(RecordType === 0 && last_RT === 0x000a /* EOF */) break;\n\t\tvar length = (blob.l === blob.length ? 0 : blob.read_shift(2));\n\t\tvar R = XLSRecordEnum[RecordType];\n\t\t//console.log(RecordType.toString(16), RecordType, R, blob.l, length, blob.length);\n\t\t//if(!R) console.log(blob.slice(blob.l, blob.l + length));\n\t\tif(R && R.f) {\n\t\t\tif(options.bookSheets) {\n\t\t\t\tif(last_RT === 0x0085 /* BoundSheet8 */ && RecordType !== 0x0085 /* R.n !== 'BoundSheet8' */) break;\n\t\t\t}\n\t\t\tlast_RT = RecordType;\n\t\t\tif(R.r === 2 || R.r == 12) {\n\t\t\t\tvar rt = blob.read_shift(2); length -= 2;\n\t\t\t\tif(!opts.enc && rt !== RecordType && (((rt&0xFF)<<8)|(rt>>8)) !== RecordType) throw new Error(\"rt mismatch: \" + rt + \"!=\" + RecordType);\n\t\t\t\tif(R.r == 12){\n\t\t\t\t\tblob.l += 10; length -= 10;\n\t\t\t\t} // skip FRT\n\t\t\t}\n\t\t\t//console.error(R,blob.l,length,blob.length);\n\t\t\tvar val/*:any*/ = ({}/*:any*/);\n\t\t\tif(RecordType === 0x000a /* EOF */) val = /*::(*/R.f(blob, length, opts)/*:: :any)*/;\n\t\t\telse val = /*::(*/slurp(RecordType, R, blob, length, opts)/*:: :any)*/;\n\t\t\t/*:: val = (val:any); */\n\t\t\tif(file_depth == 0 && [0x0009, 0x0209, 0x0409, 0x0809].indexOf(last_RT) === -1 /* 'BOF' */) continue;\n\t\t\tswitch(RecordType) {\n\t\t\t\tcase 0x0022 /* Date1904 */:\n\t\t\t\t\t/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */\n\t\t\t\t\twb.opts.Date1904 = Workbook.WBProps.date1904 = val; break;\n\t\t\t\tcase 0x0086 /* WriteProtect */: wb.opts.WriteProtect = true; break;\n\t\t\t\tcase 0x002f /* FilePass */:\n\t\t\t\t\tif(!opts.enc) blob.l = 0;\n\t\t\t\t\topts.enc = val;\n\t\t\t\t\tif(!options.password) throw new Error(\"File is password-protected\");\n\t\t\t\t\tif(val.valid == null) throw new Error(\"Encryption scheme unsupported\");\n\t\t\t\t\tif(!val.valid) throw new Error(\"Password is incorrect\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x005c /* WriteAccess */: opts.lastuser = val; break;\n\t\t\t\tcase 0x0042 /* CodePage */:\n\t\t\t\t\tvar cpval = Number(val);\n\t\t\t\t\t/* overrides based on test cases */\n\t\t\t\t\tswitch(cpval) {\n\t\t\t\t\t\tcase 0x5212: cpval = 1200; break;\n\t\t\t\t\t\tcase 0x8000: cpval = 10000; break;\n\t\t\t\t\t\tcase 0x8001: cpval = 1252; break;\n\t\t\t\t\t}\n\t\t\t\t\tset_cp(opts.codepage = cpval);\n\t\t\t\t\tseen_codepage = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x013d /* RRTabId */: opts.rrtabid = val; break;\n\t\t\t\tcase 0x0019 /* WinProtect */: opts.winlocked = val; break;\n\t\t\t\tcase 0x01b7 /* RefreshAll */: wb.opts[\"RefreshAll\"] = val; break;\n\t\t\t\tcase 0x000c /* CalcCount */: wb.opts[\"CalcCount\"] = val; break;\n\t\t\t\tcase 0x0010 /* CalcDelta */: wb.opts[\"CalcDelta\"] = val; break;\n\t\t\t\tcase 0x0011 /* CalcIter */: wb.opts[\"CalcIter\"] = val; break;\n\t\t\t\tcase 0x000d /* CalcMode */: wb.opts[\"CalcMode\"] = val; break;\n\t\t\t\tcase 0x000e /* CalcPrecision */: wb.opts[\"CalcPrecision\"] = val; break;\n\t\t\t\tcase 0x005f /* CalcSaveRecalc */: wb.opts[\"CalcSaveRecalc\"] = val; break;\n\t\t\t\tcase 0x000f /* CalcRefMode */: opts.CalcRefMode = val; break; // TODO: implement R1C1\n\t\t\t\tcase 0x08a3 /* ForceFullCalculation */: wb.opts.FullCalc = val; break;\n\t\t\t\tcase 0x0081 /* WsBool */:\n\t\t\t\t\tif(val.fDialog) out[\"!type\"] = \"dialog\";\n\t\t\t\t\tif(!val.fBelow) (out[\"!outline\"] || (out[\"!outline\"] = {})).above = true;\n\t\t\t\t\tif(!val.fRight) (out[\"!outline\"] || (out[\"!outline\"] = {})).left = true;\n\t\t\t\t\tbreak; // TODO\n\t\t\t\tcase 0x00e0 /* XF */:\n\t\t\t\t\tXFs.push(val); break;\n\t\t\t\tcase 0x01ae /* SupBook */:\n\t\t\t\t\tsupbooks.push([val]);\n\t\t\t\t\tsupbooks[supbooks.length-1].XTI = [];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0023: case 0x0223 /* ExternName */:\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0018: case 0x0218 /* Lbl */:\n\t\t\t\t\tlast_lbl = ({\n\t\t\t\t\t\tName: val.Name,\n\t\t\t\t\t\tRef: stringify_formula(val.rgce,range,null,supbooks,opts)\n\t\t\t\t\t}/*:DefinedName*/);\n\t\t\t\t\tif(val.itab > 0) last_lbl.Sheet = val.itab - 1;\n\t\t\t\t\tsupbooks.names.push(last_lbl);\n\t\t\t\t\tif(!supbooks[0]) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length-1].push(val);\n\t\t\t\t\tif(val.Name == \"_xlnm._FilterDatabase\" && val.itab > 0)\n\t\t\t\t\t\tif(val.rgce && val.rgce[0] && val.rgce[0][0] && val.rgce[0][0][0] == 'PtgArea3d')\n\t\t\t\t\t\t\tFilterDatabases[val.itab - 1] = { ref: encode_range(val.rgce[0][0][1][2]) };\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0016 /* ExternCount */: opts.ExternCount = val; break;\n\t\t\t\tcase 0x0017 /* ExternSheet */:\n\t\t\t\t\tif(supbooks.length == 0) { supbooks[0] = []; supbooks[0].XTI = []; }\n\t\t\t\t\tsupbooks[supbooks.length - 1].XTI = supbooks[supbooks.length - 1].XTI.concat(val); supbooks.XTI = supbooks.XTI.concat(val); break;\n\t\t\t\tcase 0x0894 /* NameCmt */:\n\t\t\t\t\t/* TODO: search for correct name */\n\t\t\t\t\tif(opts.biff < 8) break;\n\t\t\t\t\tif(last_lbl != null) last_lbl.Comment = val[1];\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0012 /* Protect */: out[\"!protect\"] = val; break; /* for sheet or book */\n\t\t\t\tcase 0x0013 /* Password */: if(val !== 0 && opts.WTF) console.error(\"Password verifier: \" + val); break;\n\t\t\t\tcase 0x0085 /* BoundSheet8 */: {\n\t\t\t\t\tDirectory[val.pos] = val;\n\t\t\t\t\topts.snames.push(val.name);\n\t\t\t\t} break;\n\t\t\t\tcase 0x000a /* EOF */: {\n\t\t\t\t\tif(--file_depth) break;\n\t\t\t\t\tif(range.e) {\n\t\t\t\t\t\tif(range.e.r > 0 && range.e.c > 0) {\n\t\t\t\t\t\t\trange.e.r--; range.e.c--;\n\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\tif(options.sheetRows && options.sheetRows <= range.e.r) {\n\t\t\t\t\t\t\t\tvar tmpri = range.e.r;\n\t\t\t\t\t\t\t\trange.e.r = options.sheetRows - 1;\n\t\t\t\t\t\t\t\tout[\"!fullref\"] = out[\"!ref\"];\n\t\t\t\t\t\t\t\tout[\"!ref\"] = encode_range(range);\n\t\t\t\t\t\t\t\trange.e.r = tmpri;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\trange.e.r++; range.e.c++;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(merges.length > 0) out[\"!merges\"] = merges;\n\t\t\t\t\t\tif(objects.length > 0) out[\"!objects\"] = objects;\n\t\t\t\t\t\tif(colinfo.length > 0) out[\"!cols\"] = colinfo;\n\t\t\t\t\t\tif(rowinfo.length > 0) out[\"!rows\"] = rowinfo;\n\t\t\t\t\t\tWorkbook.Sheets.push(wsprops);\n\t\t\t\t\t}\n\t\t\t\t\tif(cur_sheet === \"\") Preamble = out; else Sheets[cur_sheet] = out;\n\t\t\t\t\tout = ((options.dense ? [] : {})/*:any*/);\n\t\t\t\t} break;\n\t\t\t\tcase 0x0009: case 0x0209: case 0x0409: case 0x0809 /* BOF */: {\n\t\t\t\t\tif(opts.biff === 8) opts.biff = {\n\t\t\t\t\t\t/*::[*/0x0009/*::]*/:2,\n\t\t\t\t\t\t/*::[*/0x0209/*::]*/:3,\n\t\t\t\t\t\t/*::[*/0x0409/*::]*/:4\n\t\t\t\t\t}[RecordType] || {\n\t\t\t\t\t\t/*::[*/0x0200/*::]*/:2,\n\t\t\t\t\t\t/*::[*/0x0300/*::]*/:3,\n\t\t\t\t\t\t/*::[*/0x0400/*::]*/:4,\n\t\t\t\t\t\t/*::[*/0x0500/*::]*/:5,\n\t\t\t\t\t\t/*::[*/0x0600/*::]*/:8,\n\t\t\t\t\t\t/*::[*/0x0002/*::]*/:2,\n\t\t\t\t\t\t/*::[*/0x0007/*::]*/:2\n\t\t\t\t\t}[val.BIFFVer] || 8;\n\t\t\t\t\topts.biffguess = val.BIFFVer == 0;\n\t\t\t\t\tif(val.BIFFVer == 0 && val.dt == 0x1000) { opts.biff = 5; seen_codepage = true; set_cp(opts.codepage = 28591); }\n\t\t\t\t\tif(opts.biff == 8 && val.BIFFVer == 0 && val.dt == 16) opts.biff = 2;\n\t\t\t\t\tif(file_depth++) break;\n\t\t\t\t\tout = ((options.dense ? [] : {})/*:any*/);\n\n\t\t\t\t\tif(opts.biff < 8 && !seen_codepage) { seen_codepage = true; set_cp(opts.codepage = options.codepage || 1252); }\n\n\t\t\t\t\tif(opts.biff < 5 || val.BIFFVer == 0 && val.dt == 0x1000) {\n\t\t\t\t\t\tif(cur_sheet === \"\") cur_sheet = \"Sheet1\";\n\t\t\t\t\t\trange = {s:{r:0,c:0},e:{r:0,c:0}};\n\t\t\t\t\t\t/* fake BoundSheet8 */\n\t\t\t\t\t\tvar fakebs8 = {pos: blob.l - length, name:cur_sheet};\n\t\t\t\t\t\tDirectory[fakebs8.pos] = fakebs8;\n\t\t\t\t\t\topts.snames.push(cur_sheet);\n\t\t\t\t\t}\n\t\t\t\t\telse cur_sheet = (Directory[s] || {name:\"\"}).name;\n\t\t\t\t\tif(val.dt == 0x20) out[\"!type\"] = \"chart\";\n\t\t\t\t\tif(val.dt == 0x40) out[\"!type\"] = \"macro\";\n\t\t\t\t\tmerges = [];\n\t\t\t\t\tobjects = [];\n\t\t\t\t\topts.arrayf = arrayf = [];\n\t\t\t\t\tcolinfo = []; rowinfo = [];\n\t\t\t\t\tseencol = false;\n\t\t\t\t\twsprops = {Hidden:(Directory[s]||{hs:0}).hs, name:cur_sheet };\n\t\t\t\t} break;\n\t\t\t\tcase 0x0203 /* Number */: case 0x0003 /* BIFF2NUM */: case 0x0002 /* BIFF2INT */: {\n\t\t\t\t\tif(out[\"!type\"] == \"chart\") if(options.dense ? (out[val.r]||[])[val.c]: out[encode_cell({c:val.c, r:val.r})]) ++val.c;\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe]||{}, v:val.val, t:'n'}/*:any*/);\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 0x0005: case 0x0205 /* BoolErr */: {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.val, t:val.t}/*:any*/);\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 0x027e /* RK */: {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], v:val.rknum, t:'n'}/*:any*/);\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 0x00bd /* MulRk */: {\n\t\t\t\t\tfor(var j = val.c; j <= val.C; ++j) {\n\t\t\t\t\t\tvar ixfe = val.rkrec[j-val.c][0];\n\t\t\t\t\t\ttemp_val= ({ixfe:ixfe, XF:XFs[ixfe], v:val.rkrec[j-val.c][1], t:'n'}/*:any*/);\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x0006: case 0x0206: case 0x0406 /* Formula */: {\n\t\t\t\t\tif(val.val == 'String') { last_formula = val; break; }\n\t\t\t\t\ttemp_val = make_cell(val.val, val.cell.ixfe, val.tt);\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\tvar _f = val.formula;\n\t\t\t\t\t\tif(_f && _f[0] && _f[0][0] && _f[0][0][0] == 'PtgExp') {\n\t\t\t\t\t\t\tvar _fr = _f[0][0][1][0], _fc = _f[0][0][1][1];\n\t\t\t\t\t\t\tvar _fe = encode_cell({r:_fr, c:_fc});\n\t\t\t\t\t\t\tif(sharedf[_fe]) temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t\t\telse temp_val.F = ((options.dense ? (out[_fr]||[])[_fc]: out[_fe]) || {}).F;\n\t\t\t\t\t\t} else temp_val.f = \"\"+stringify_formula(val.formula,range,val.cell,supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell(val.cell, temp_val, options);\n\t\t\t\t\tlast_formula = val;\n\t\t\t\t} break;\n\t\t\t\tcase 0x0007: case 0x0207 /* String */: {\n\t\t\t\t\tif(last_formula) { /* technically always true */\n\t\t\t\t\t\tlast_formula.val = val;\n\t\t\t\t\t\ttemp_val = make_cell(val, last_formula.cell.ixfe, 's');\n\t\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\t\tif(options.cellFormula) {\n\t\t\t\t\t\t\ttemp_val.f = \"\"+stringify_formula(last_formula.formula, range, last_formula.cell, supbooks, opts);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell(last_formula.cell, temp_val, options);\n\t\t\t\t\t\tlast_formula = null;\n\t\t\t\t\t} else throw new Error(\"String record expects Formula\");\n\t\t\t\t} break;\n\t\t\t\tcase 0x0021: case 0x0221 /* Array */: {\n\t\t\t\t\tarrayf.push(val);\n\t\t\t\t\tvar _arraystart = encode_cell(val[0].s);\n\t\t\t\t\tcc = options.dense ? (out[val[0].s.r]||[])[val[0].s.c] : out[_arraystart];\n\t\t\t\t\tif(options.cellFormula && cc) {\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tif(!_arraystart || !cc) break;\n\t\t\t\t\t\tcc.f = \"\"+stringify_formula(val[1], range, val[0], supbooks, opts);\n\t\t\t\t\t\tcc.F = encode_range(val[0]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x04bc /* ShrFmla */: {\n\t\t\t\t\tif(!options.cellFormula) break;\n\t\t\t\t\tif(last_cell) {\n\t\t\t\t\t\t/* TODO: capture range */\n\t\t\t\t\t\tif(!last_formula) break; /* technically unreachable */\n\t\t\t\t\t\tsharedf[encode_cell(last_formula.cell)]= val[0];\n\t\t\t\t\t\tcc = options.dense ? (out[last_formula.cell.r]||[])[last_formula.cell.c] : out[encode_cell(last_formula.cell)];\n\t\t\t\t\t\t(cc||{}).f = \"\"+stringify_formula(val[0], range, lastcell, supbooks, opts);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x00fd /* LabelSst */:\n\t\t\t\t\ttemp_val=make_cell(sst[val.isst].t, val.ixfe, 's');\n\t\t\t\t\tif(sst[val.isst].h) temp_val.h = sst[val.isst].h;\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0201 /* Blank */: if(options.sheetStubs) {\n\t\t\t\t\ttemp_val = ({ixfe: val.ixfe, XF: XFs[val.ixfe], t:'z'}/*:any*/);\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t} break;\n\t\t\t\tcase 0x00be /* MulBlank */: if(options.sheetStubs) {\n\t\t\t\t\tfor(var _j = val.c; _j <= val.C; ++_j) {\n\t\t\t\t\t\tvar _ixfe = val.ixfe[_j-val.c];\n\t\t\t\t\t\ttemp_val= ({ixfe:_ixfe, XF:XFs[_ixfe], t:'z'}/*:any*/);\n\t\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\t\taddcell({c:_j, r:val.r}, temp_val, options);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x00d6 /* RString */:\n\t\t\t\tcase 0x0204 /* Label */: case 0x0004 /* BIFF2STR */:\n\t\t\t\t\ttemp_val=make_cell(val.val, val.ixfe, 's');\n\t\t\t\t\ttemp_val.XF = XFs[temp_val.ixfe];\n\t\t\t\t\tif(BIFF2Fmt > 0) temp_val.z = BIFF2FmtTable[(temp_val.ixfe>>8) & 0x3F];\n\t\t\t\t\tsafe_format_xf(temp_val, options, wb.opts.Date1904);\n\t\t\t\t\taddcell({c:val.c, r:val.r}, temp_val, options);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase 0x0000: case 0x0200 /* Dimensions */: {\n\t\t\t\t\tif(file_depth === 1) range = val; /* TODO: stack */\n\t\t\t\t} break;\n\t\t\t\tcase 0x00fc /* SST */: {\n\t\t\t\t\tsst = val;\n\t\t\t\t} break;\n\t\t\t\tcase 0x041e /* Format */: { /* val = [id, fmt] */\n\t\t\t\t\tif(opts.biff == 4) {\n\t\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val[1];\n\t\t\t\t\t\tfor(var b4idx = 0; b4idx < BIFF2Fmt + 163; ++b4idx) if(table_fmt[b4idx] == val[1]) break;\n\t\t\t\t\t\tif(b4idx >= 163) SSF_load(val[1], BIFF2Fmt + 163);\n\t\t\t\t\t}\n\t\t\t\t\telse SSF_load(val[1], val[0]);\n\t\t\t\t} break;\n\t\t\t\tcase 0x001e /* BIFF2FORMAT */: {\n\t\t\t\t\tBIFF2FmtTable[BIFF2Fmt++] = val;\n\t\t\t\t\tfor(var b2idx = 0; b2idx < BIFF2Fmt + 163; ++b2idx) if(table_fmt[b2idx] == val) break;\n\t\t\t\t\tif(b2idx >= 163) SSF_load(val, BIFF2Fmt + 163);\n\t\t\t\t} break;\n\n\t\t\t\tcase 0x00e5 /* MergeCells */: merges = merges.concat(val); break;\n\n\t\t\t\tcase 0x005d /* Obj */: objects[val.cmo[0]] = opts.lastobj = val; break;\n\t\t\t\tcase 0x01b6 /* TxO */: opts.lastobj.TxO = val; break;\n\t\t\t\tcase 0x007f /* ImData */: opts.lastobj.ImData = val; break;\n\n\t\t\t\tcase 0x01b8 /* HLink */: {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc) cc.l = val[1];\n\t\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x0800 /* HLinkTooltip */: {\n\t\t\t\t\tfor(rngR = val[0].s.r; rngR <= val[0].e.r; ++rngR)\n\t\t\t\t\t\tfor(rngC = val[0].s.c; rngC <= val[0].e.c; ++rngC) {\n\t\t\t\t\t\t\tcc = options.dense ? (out[rngR]||[])[rngC] : out[encode_cell({c:rngC,r:rngR})];\n\t\t\t\t\t\t\tif(cc && cc.l) cc.l.Tooltip = val[1];\n\t\t\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x001c /* Note */: {\n\t\t\t\t\tif(opts.biff <= 5 && opts.biff >= 2) break; /* TODO: BIFF5 */\n\t\t\t\t\tcc = options.dense ? (out[val[0].r]||[])[val[0].c] : out[encode_cell(val[0])];\n\t\t\t\t\tvar noteobj = objects[val[2]];\n\t\t\t\t\tif(!cc) {\n\t\t\t\t\t\tif(options.dense) {\n\t\t\t\t\t\t\tif(!out[val[0].r]) out[val[0].r] = [];\n\t\t\t\t\t\t\tcc = out[val[0].r][val[0].c] = ({t:\"z\"}/*:any*/);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tcc = out[encode_cell(val[0])] = ({t:\"z\"}/*:any*/);\n\t\t\t\t\t\t}\n\t\t\t\t\t\trange.e.r = Math.max(range.e.r, val[0].r);\n\t\t\t\t\t\trange.s.r = Math.min(range.s.r, val[0].r);\n\t\t\t\t\t\trange.e.c = Math.max(range.e.c, val[0].c);\n\t\t\t\t\t\trange.s.c = Math.min(range.s.c, val[0].c);\n\t\t\t\t\t}\n\t\t\t\t\tif(!cc.c) cc.c = [];\n\t\t\t\t\tcmnt = {a:val[1],t:noteobj.TxO.t};\n\t\t\t\t\tcc.c.push(cmnt);\n\t\t\t\t} break;\n\t\t\t\tcase 0x087d /* XFExt */: update_xfext(XFs[val.ixfe], val.ext); break;\n\t\t\t\tcase 0x007d /* ColInfo */: {\n\t\t\t\t\tif(!opts.cellStyles) break;\n\t\t\t\t\twhile(val.e >= val.s) {\n\t\t\t\t\t\tcolinfo[val.e--] = { width: val.w/256, level: (val.level || 0), hidden: !!(val.flags & 1) };\n\t\t\t\t\t\tif(!seencol) { seencol = true; find_mdw_colw(val.w/256); }\n\t\t\t\t\t\tprocess_col(colinfo[val.e+1]);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x0208 /* Row */: {\n\t\t\t\t\tvar rowobj = {};\n\t\t\t\t\tif(val.level != null) { rowinfo[val.r] = rowobj; rowobj.level = val.level; }\n\t\t\t\t\tif(val.hidden) { rowinfo[val.r] = rowobj; rowobj.hidden = true; }\n\t\t\t\t\tif(val.hpt) {\n\t\t\t\t\t\trowinfo[val.r] = rowobj;\n\t\t\t\t\t\trowobj.hpt = val.hpt; rowobj.hpx = pt2px(val.hpt);\n\t\t\t\t\t}\n\t\t\t\t} break;\n\t\t\t\tcase 0x0026 /* LeftMargin */:\n\t\t\t\tcase 0x0027 /* RightMargin */:\n\t\t\t\tcase 0x0028 /* TopMargin */:\n\t\t\t\tcase 0x0029 /* BottomMargin */:\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'][({0x26: \"left\", 0x27:\"right\", 0x28:\"top\", 0x29:\"bottom\"})[RecordType]] = val;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x00a1 /* Setup */: // TODO\n\t\t\t\t\tif(!out['!margins']) default_margins(out['!margins'] = {});\n\t\t\t\t\tout['!margins'].header = val.header;\n\t\t\t\t\tout['!margins'].footer = val.footer;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x023e /* Window2 */: // TODO\n\t\t\t\t\t// $FlowIgnore\n\t\t\t\t\tif(val.RTL) Workbook.Views[0].RTL = true;\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0x0092 /* Palette */: palette = val; break;\n\t\t\t\tcase 0x0896 /* Theme */: themes = val; break;\n\t\t\t\tcase 0x008c /* Country */: country = val; break;\n\t\t\t\tcase 0x01ba /* CodeName */: {\n\t\t\t\t\t/*:: if(!Workbook.WBProps) Workbook.WBProps = {}; */\n\t\t\t\t\tif(!cur_sheet) Workbook.WBProps.CodeName = val || \"ThisWorkbook\";\n\t\t\t\t\telse wsprops.CodeName = val || wsprops.name;\n\t\t\t\t} break;\n\t\t\t}\n\t\t} else {\n\t\t\tif(!R) console.error(\"Missing Info for XLS Record 0x\" + RecordType.toString(16));\n\t\t\tblob.l += length;\n\t\t}\n\t}\n\twb.SheetNames=keys(Directory).sort(function(a,b) { return Number(a) - Number(b); }).map(function(x){return Directory[x].name;});\n\tif(!options.bookSheets) wb.Sheets=Sheets;\n\tif(!wb.SheetNames.length && Preamble[\"!ref\"]) {\n\t\twb.SheetNames.push(\"Sheet1\");\n\t\t/*jshint -W069 */\n\t\tif(wb.Sheets) wb.Sheets[\"Sheet1\"] = Preamble;\n\t\t/*jshint +W069 */\n\t} else wb.Preamble=Preamble;\n\tif(wb.Sheets) FilterDatabases.forEach(function(r,i) { wb.Sheets[wb.SheetNames[i]]['!autofilter'] = r; });\n\twb.Strings = sst;\n\twb.SSF = dup(table_fmt);\n\tif(opts.enc) wb.Encryption = opts.enc;\n\tif(themes) wb.Themes = themes;\n\twb.Metadata = {};\n\tif(country !== undefined) wb.Metadata.Country = country;\n\tif(supbooks.names.length > 0) Workbook.Names = supbooks.names;\n\twb.Workbook = Workbook;\n\treturn wb;\n}\n\n/* TODO: split props*/\nvar PSCLSID = {\n\tSI: \"e0859ff2f94f6810ab9108002b27b3d9\",\n\tDSI: \"02d5cdd59c2e1b10939708002b2cf9ae\",\n\tUDI: \"05d5cdd59c2e1b10939708002b2cf9ae\"\n};\nfunction parse_xls_props(cfb/*:CFBContainer*/, props, o) {\n\t/* [MS-OSHARED] 2.3.3.2.2 Document Summary Information Property Set */\n\tvar DSI = CFB.find(cfb, '/!DocumentSummaryInformation');\n\tif(DSI && DSI.size > 0) try {\n\t\tvar DocSummary = parse_PropertySetStream(DSI, DocSummaryPIDDSI, PSCLSID.DSI);\n\t\tfor(var d in DocSummary) props[d] = DocSummary[d];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\t/* [MS-OSHARED] 2.3.3.2.1 Summary Information Property Set*/\n\tvar SI = CFB.find(cfb, '/!SummaryInformation');\n\tif(SI && SI.size > 0) try {\n\t\tvar Summary = parse_PropertySetStream(SI, SummaryPIDSI, PSCLSID.SI);\n\t\tfor(var s in Summary) if(props[s] == null) props[s] = Summary[s];\n\t} catch(e) {if(o.WTF) throw e;/* empty */}\n\n\tif(props.HeadingPairs && props.TitlesOfParts) {\n\t\tload_props_pairs(props.HeadingPairs, props.TitlesOfParts, props, o);\n\t\tdelete props.HeadingPairs; delete props.TitlesOfParts;\n\t}\n}\nfunction write_xls_props(wb/*:Workbook*/, cfb/*:CFBContainer*/) {\n\tvar DSEntries = [], SEntries = [], CEntries = [];\n\tvar i = 0, Keys;\n\tvar DocSummaryRE/*:{[key:string]:string}*/ = evert_key(DocSummaryPIDDSI, \"n\");\n\tvar SummaryRE/*:{[key:string]:string}*/ = evert_key(SummaryPIDSI, \"n\");\n\tif(wb.Props) {\n\t\tKeys = keys(wb.Props);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Props[Keys[i]]]);\n\t}\n\tif(wb.Custprops) {\n\t\tKeys = keys(wb.Custprops);\n\t\t// $FlowIgnore\n\t\tfor(i = 0; i < Keys.length; ++i) if(!Object.prototype.hasOwnProperty.call((wb.Props||{}), Keys[i])) (Object.prototype.hasOwnProperty.call(DocSummaryRE, Keys[i]) ? DSEntries : Object.prototype.hasOwnProperty.call(SummaryRE, Keys[i]) ? SEntries : CEntries).push([Keys[i], wb.Custprops[Keys[i]]]);\n\t}\n\tvar CEntries2 = [];\n\tfor(i = 0; i < CEntries.length; ++i) {\n\t\tif(XLSPSSkip.indexOf(CEntries[i][0]) > -1 || PseudoPropsPairs.indexOf(CEntries[i][0]) > -1) continue;\n\t\tif(CEntries[i][1] == null) continue;\n\t\tCEntries2.push(CEntries[i]);\n\t}\n\tif(SEntries.length) CFB.utils.cfb_add(cfb, \"/\\u0005SummaryInformation\", write_PropertySetStream(SEntries, PSCLSID.SI, SummaryRE, SummaryPIDSI));\n\tif(DSEntries.length || CEntries2.length) CFB.utils.cfb_add(cfb, \"/\\u0005DocumentSummaryInformation\", write_PropertySetStream(DSEntries, PSCLSID.DSI, DocSummaryRE, DocSummaryPIDDSI, CEntries2.length ? CEntries2 : null, PSCLSID.UDI));\n}\n\nfunction parse_xlscfb(cfb/*:any*/, options/*:?ParseOpts*/)/*:Workbook*/ {\nif(!options) options = {};\nfix_read_opts(options);\nreset_cp();\nif(options.codepage) set_ansi(options.codepage);\nvar CompObj/*:?CFBEntry*/, WB/*:?any*/;\nif(cfb.FullPaths) {\n\tif(CFB.find(cfb, '/encryption')) throw new Error(\"File is password-protected\");\n\tCompObj = CFB.find(cfb, '!CompObj');\n\tWB = CFB.find(cfb, '/Workbook') || CFB.find(cfb, '/Book');\n} else {\n\tswitch(options.type) {\n\t\tcase 'base64': cfb = s2a(Base64_decode(cfb)); break;\n\t\tcase 'binary': cfb = s2a(cfb); break;\n\t\tcase 'buffer': break;\n\t\tcase 'array': if(!Array.isArray(cfb)) cfb = Array.prototype.slice.call(cfb); break;\n\t}\n\tprep_blob(cfb, 0);\n\tWB = ({content: cfb}/*:any*/);\n}\nvar /*::CompObjP, */WorkbookP/*:: :Workbook = XLSX.utils.book_new(); */;\n\nvar _data/*:?any*/;\nif(CompObj) /*::CompObjP = */parse_compobj(CompObj);\nif(options.bookProps && !options.bookSheets) WorkbookP = ({}/*:any*/);\nelse/*:: if(cfb instanceof CFBContainer) */ {\n\tvar T = has_buf ? 'buffer' : 'array';\n\tif(WB && WB.content) WorkbookP = parse_workbook(WB.content, options);\n\t/* Quattro Pro 7-8 */\n\telse if((_data=CFB.find(cfb, 'PerfectOffice_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Quattro Pro 9 */\n\telse if((_data=CFB.find(cfb, 'NativeContent_MAIN')) && _data.content) WorkbookP = WK_.to_workbook(_data.content, (options.type = T, options));\n\t/* Works 4 for Mac */\n\telse if((_data=CFB.find(cfb, 'MN0')) && _data.content) throw new Error(\"Unsupported Works 4 for Mac file\");\n\telse throw new Error(\"Cannot find Workbook stream\");\n\tif(options.bookVBA && cfb.FullPaths && CFB.find(cfb, '/_VBA_PROJECT_CUR/VBA/dir')) WorkbookP.vbaraw = make_vba_xls(cfb);\n}\n\nvar props = {};\nif(cfb.FullPaths) parse_xls_props(/*::((*/cfb/*:: :any):CFBContainer)*/, props, options);\n\nWorkbookP.Props = WorkbookP.Custprops = props; /* TODO: split up properties */\nif(options.bookFiles) WorkbookP.cfb = cfb;\n/*WorkbookP.CompObjP = CompObjP; // TODO: storage? */\nreturn WorkbookP;\n}\n\n\nfunction write_xlscfb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:CFBContainer*/ {\n\tvar o = opts || {};\n\tvar cfb = CFB.utils.cfb_new({root:\"R\"});\n\tvar wbpath = \"/Workbook\";\n\tswitch(o.bookType || \"xls\") {\n\t\tcase \"xls\": o.bookType = \"biff8\";\n\t\t/* falls through */\n\t\tcase \"xla\": if(!o.bookType) o.bookType = \"xla\";\n\t\t/* falls through */\n\t\tcase \"biff8\": wbpath = \"/Workbook\"; o.biff = 8; break;\n\t\tcase \"biff5\": wbpath = \"/Book\"; o.biff = 5; break;\n\t\tdefault: throw new Error(\"invalid type \" + o.bookType + \" for XLS CFB\");\n\t}\n\tCFB.utils.cfb_add(cfb, wbpath, write_biff_buf(wb, o));\n\tif(o.biff == 8 && (wb.Props || wb.Custprops)) write_xls_props(wb, cfb);\n\t// TODO: SI, DSI, CO\n\tif(o.biff == 8 && wb.vbaraw) fill_vba_xls(cfb, CFB.read(wb.vbaraw, {type: typeof wb.vbaraw == \"string\" ? \"binary\" : \"buffer\"}));\n\treturn cfb;\n}\n/* [MS-XLSB] 2.3 Record Enumeration */\nvar XLSBRecordEnum = {\n\t/*::[*/0x0000/*::]*/: { /* n:\"BrtRowHdr\", */ f:parse_BrtRowHdr },\n\t/*::[*/0x0001/*::]*/: { /* n:\"BrtCellBlank\", */ f:parse_BrtCellBlank },\n\t/*::[*/0x0002/*::]*/: { /* n:\"BrtCellRk\", */ f:parse_BrtCellRk },\n\t/*::[*/0x0003/*::]*/: { /* n:\"BrtCellError\", */ f:parse_BrtCellError },\n\t/*::[*/0x0004/*::]*/: { /* n:\"BrtCellBool\", */ f:parse_BrtCellBool },\n\t/*::[*/0x0005/*::]*/: { /* n:\"BrtCellReal\", */ f:parse_BrtCellReal },\n\t/*::[*/0x0006/*::]*/: { /* n:\"BrtCellSt\", */ f:parse_BrtCellSt },\n\t/*::[*/0x0007/*::]*/: { /* n:\"BrtCellIsst\", */ f:parse_BrtCellIsst },\n\t/*::[*/0x0008/*::]*/: { /* n:\"BrtFmlaString\", */ f:parse_BrtFmlaString },\n\t/*::[*/0x0009/*::]*/: { /* n:\"BrtFmlaNum\", */ f:parse_BrtFmlaNum },\n\t/*::[*/0x000A/*::]*/: { /* n:\"BrtFmlaBool\", */ f:parse_BrtFmlaBool },\n\t/*::[*/0x000B/*::]*/: { /* n:\"BrtFmlaError\", */ f:parse_BrtFmlaError },\n\t/*::[*/0x000C/*::]*/: { /* n:\"BrtShortBlank\", */ f:parse_BrtShortBlank },\n\t/*::[*/0x000D/*::]*/: { /* n:\"BrtShortRk\", */ f:parse_BrtShortRk },\n\t/*::[*/0x000E/*::]*/: { /* n:\"BrtShortError\", */ f:parse_BrtShortError },\n\t/*::[*/0x000F/*::]*/: { /* n:\"BrtShortBool\", */ f:parse_BrtShortBool },\n\t/*::[*/0x0010/*::]*/: { /* n:\"BrtShortReal\", */ f:parse_BrtShortReal },\n\t/*::[*/0x0011/*::]*/: { /* n:\"BrtShortSt\", */ f:parse_BrtShortSt },\n\t/*::[*/0x0012/*::]*/: { /* n:\"BrtShortIsst\", */ f:parse_BrtShortIsst },\n\t/*::[*/0x0013/*::]*/: { /* n:\"BrtSSTItem\", */ f:parse_RichStr },\n\t/*::[*/0x0014/*::]*/: { /* n:\"BrtPCDIMissing\" */ },\n\t/*::[*/0x0015/*::]*/: { /* n:\"BrtPCDINumber\" */ },\n\t/*::[*/0x0016/*::]*/: { /* n:\"BrtPCDIBoolean\" */ },\n\t/*::[*/0x0017/*::]*/: { /* n:\"BrtPCDIError\" */ },\n\t/*::[*/0x0018/*::]*/: { /* n:\"BrtPCDIString\" */ },\n\t/*::[*/0x0019/*::]*/: { /* n:\"BrtPCDIDatetime\" */ },\n\t/*::[*/0x001A/*::]*/: { /* n:\"BrtPCDIIndex\" */ },\n\t/*::[*/0x001B/*::]*/: { /* n:\"BrtPCDIAMissing\" */ },\n\t/*::[*/0x001C/*::]*/: { /* n:\"BrtPCDIANumber\" */ },\n\t/*::[*/0x001D/*::]*/: { /* n:\"BrtPCDIABoolean\" */ },\n\t/*::[*/0x001E/*::]*/: { /* n:\"BrtPCDIAError\" */ },\n\t/*::[*/0x001F/*::]*/: { /* n:\"BrtPCDIAString\" */ },\n\t/*::[*/0x0020/*::]*/: { /* n:\"BrtPCDIADatetime\" */ },\n\t/*::[*/0x0021/*::]*/: { /* n:\"BrtPCRRecord\" */ },\n\t/*::[*/0x0022/*::]*/: { /* n:\"BrtPCRRecordDt\" */ },\n\t/*::[*/0x0023/*::]*/: { /* n:\"BrtFRTBegin\", */ T:1 },\n\t/*::[*/0x0024/*::]*/: { /* n:\"BrtFRTEnd\", */ T:-1 },\n\t/*::[*/0x0025/*::]*/: { /* n:\"BrtACBegin\", */ T:1 },\n\t/*::[*/0x0026/*::]*/: { /* n:\"BrtACEnd\", */ T:-1 },\n\t/*::[*/0x0027/*::]*/: { /* n:\"BrtName\", */ f:parse_BrtName },\n\t/*::[*/0x0028/*::]*/: { /* n:\"BrtIndexRowBlock\" */ },\n\t/*::[*/0x002A/*::]*/: { /* n:\"BrtIndexBlock\" */ },\n\t/*::[*/0x002B/*::]*/: { /* n:\"BrtFont\", */ f:parse_BrtFont },\n\t/*::[*/0x002C/*::]*/: { /* n:\"BrtFmt\", */ f:parse_BrtFmt },\n\t/*::[*/0x002D/*::]*/: { /* n:\"BrtFill\", */ f:parse_BrtFill },\n\t/*::[*/0x002E/*::]*/: { /* n:\"BrtBorder\", */ f:parse_BrtBorder },\n\t/*::[*/0x002F/*::]*/: { /* n:\"BrtXF\", */ f:parse_BrtXF },\n\t/*::[*/0x0030/*::]*/: { /* n:\"BrtStyle\" */ },\n\t/*::[*/0x0031/*::]*/: { /* n:\"BrtCellMeta\", */ f:parse_Int32LE },\n\t/*::[*/0x0032/*::]*/: { /* n:\"BrtValueMeta\" */ },\n\t/*::[*/0x0033/*::]*/: { /* n:\"BrtMdb\" */ f:parse_BrtMdb },\n\t/*::[*/0x0034/*::]*/: { /* n:\"BrtBeginFmd\", */ T:1 },\n\t/*::[*/0x0035/*::]*/: { /* n:\"BrtEndFmd\", */ T:-1 },\n\t/*::[*/0x0036/*::]*/: { /* n:\"BrtBeginMdx\", */ T:1 },\n\t/*::[*/0x0037/*::]*/: { /* n:\"BrtEndMdx\", */ T:-1 },\n\t/*::[*/0x0038/*::]*/: { /* n:\"BrtBeginMdxTuple\", */ T:1 },\n\t/*::[*/0x0039/*::]*/: { /* n:\"BrtEndMdxTuple\", */ T:-1 },\n\t/*::[*/0x003A/*::]*/: { /* n:\"BrtMdxMbrIstr\" */ },\n\t/*::[*/0x003B/*::]*/: { /* n:\"BrtStr\" */ },\n\t/*::[*/0x003C/*::]*/: { /* n:\"BrtColInfo\", */ f:parse_ColInfo },\n\t/*::[*/0x003E/*::]*/: { /* n:\"BrtCellRString\", */ f:parse_BrtCellRString },\n\t/*::[*/0x003F/*::]*/: { /* n:\"BrtCalcChainItem$\", */ f:parse_BrtCalcChainItem$ },\n\t/*::[*/0x0040/*::]*/: { /* n:\"BrtDVal\", */ f:parse_BrtDVal },\n\t/*::[*/0x0041/*::]*/: { /* n:\"BrtSxvcellNum\" */ },\n\t/*::[*/0x0042/*::]*/: { /* n:\"BrtSxvcellStr\" */ },\n\t/*::[*/0x0043/*::]*/: { /* n:\"BrtSxvcellBool\" */ },\n\t/*::[*/0x0044/*::]*/: { /* n:\"BrtSxvcellErr\" */ },\n\t/*::[*/0x0045/*::]*/: { /* n:\"BrtSxvcellDate\" */ },\n\t/*::[*/0x0046/*::]*/: { /* n:\"BrtSxvcellNil\" */ },\n\t/*::[*/0x0080/*::]*/: { /* n:\"BrtFileVersion\" */ },\n\t/*::[*/0x0081/*::]*/: { /* n:\"BrtBeginSheet\", */ T:1 },\n\t/*::[*/0x0082/*::]*/: { /* n:\"BrtEndSheet\", */ T:-1 },\n\t/*::[*/0x0083/*::]*/: { /* n:\"BrtBeginBook\", */ T:1, f:parsenoop, p:0 },\n\t/*::[*/0x0084/*::]*/: { /* n:\"BrtEndBook\", */ T:-1 },\n\t/*::[*/0x0085/*::]*/: { /* n:\"BrtBeginWsViews\", */ T:1 },\n\t/*::[*/0x0086/*::]*/: { /* n:\"BrtEndWsViews\", */ T:-1 },\n\t/*::[*/0x0087/*::]*/: { /* n:\"BrtBeginBookViews\", */ T:1 },\n\t/*::[*/0x0088/*::]*/: { /* n:\"BrtEndBookViews\", */ T:-1 },\n\t/*::[*/0x0089/*::]*/: { /* n:\"BrtBeginWsView\", */ T:1, f:parse_BrtBeginWsView },\n\t/*::[*/0x008A/*::]*/: { /* n:\"BrtEndWsView\", */ T:-1 },\n\t/*::[*/0x008B/*::]*/: { /* n:\"BrtBeginCsViews\", */ T:1 },\n\t/*::[*/0x008C/*::]*/: { /* n:\"BrtEndCsViews\", */ T:-1 },\n\t/*::[*/0x008D/*::]*/: { /* n:\"BrtBeginCsView\", */ T:1 },\n\t/*::[*/0x008E/*::]*/: { /* n:\"BrtEndCsView\", */ T:-1 },\n\t/*::[*/0x008F/*::]*/: { /* n:\"BrtBeginBundleShs\", */ T:1 },\n\t/*::[*/0x0090/*::]*/: { /* n:\"BrtEndBundleShs\", */ T:-1 },\n\t/*::[*/0x0091/*::]*/: { /* n:\"BrtBeginSheetData\", */ T:1 },\n\t/*::[*/0x0092/*::]*/: { /* n:\"BrtEndSheetData\", */ T:-1 },\n\t/*::[*/0x0093/*::]*/: { /* n:\"BrtWsProp\", */ f:parse_BrtWsProp },\n\t/*::[*/0x0094/*::]*/: { /* n:\"BrtWsDim\", */ f:parse_BrtWsDim, p:16 },\n\t/*::[*/0x0097/*::]*/: { /* n:\"BrtPane\", */ f:parse_BrtPane },\n\t/*::[*/0x0098/*::]*/: { /* n:\"BrtSel\" */ },\n\t/*::[*/0x0099/*::]*/: { /* n:\"BrtWbProp\", */ f:parse_BrtWbProp },\n\t/*::[*/0x009A/*::]*/: { /* n:\"BrtWbFactoid\" */ },\n\t/*::[*/0x009B/*::]*/: { /* n:\"BrtFileRecover\" */ },\n\t/*::[*/0x009C/*::]*/: { /* n:\"BrtBundleSh\", */ f:parse_BrtBundleSh },\n\t/*::[*/0x009D/*::]*/: { /* n:\"BrtCalcProp\" */ },\n\t/*::[*/0x009E/*::]*/: { /* n:\"BrtBookView\" */ },\n\t/*::[*/0x009F/*::]*/: { /* n:\"BrtBeginSst\", */ T:1, f:parse_BrtBeginSst },\n\t/*::[*/0x00A0/*::]*/: { /* n:\"BrtEndSst\", */ T:-1 },\n\t/*::[*/0x00A1/*::]*/: { /* n:\"BrtBeginAFilter\", */ T:1, f:parse_UncheckedRfX },\n\t/*::[*/0x00A2/*::]*/: { /* n:\"BrtEndAFilter\", */ T:-1 },\n\t/*::[*/0x00A3/*::]*/: { /* n:\"BrtBeginFilterColumn\", */ T:1 },\n\t/*::[*/0x00A4/*::]*/: { /* n:\"BrtEndFilterColumn\", */ T:-1 },\n\t/*::[*/0x00A5/*::]*/: { /* n:\"BrtBeginFilters\", */ T:1 },\n\t/*::[*/0x00A6/*::]*/: { /* n:\"BrtEndFilters\", */ T:-1 },\n\t/*::[*/0x00A7/*::]*/: { /* n:\"BrtFilter\" */ },\n\t/*::[*/0x00A8/*::]*/: { /* n:\"BrtColorFilter\" */ },\n\t/*::[*/0x00A9/*::]*/: { /* n:\"BrtIconFilter\" */ },\n\t/*::[*/0x00AA/*::]*/: { /* n:\"BrtTop10Filter\" */ },\n\t/*::[*/0x00AB/*::]*/: { /* n:\"BrtDynamicFilter\" */ },\n\t/*::[*/0x00AC/*::]*/: { /* n:\"BrtBeginCustomFilters\", */ T:1 },\n\t/*::[*/0x00AD/*::]*/: { /* n:\"BrtEndCustomFilters\", */ T:-1 },\n\t/*::[*/0x00AE/*::]*/: { /* n:\"BrtCustomFilter\" */ },\n\t/*::[*/0x00AF/*::]*/: { /* n:\"BrtAFilterDateGroupItem\" */ },\n\t/*::[*/0x00B0/*::]*/: { /* n:\"BrtMergeCell\", */ f:parse_BrtMergeCell },\n\t/*::[*/0x00B1/*::]*/: { /* n:\"BrtBeginMergeCells\", */ T:1 },\n\t/*::[*/0x00B2/*::]*/: { /* n:\"BrtEndMergeCells\", */ T:-1 },\n\t/*::[*/0x00B3/*::]*/: { /* n:\"BrtBeginPivotCacheDef\", */ T:1 },\n\t/*::[*/0x00B4/*::]*/: { /* n:\"BrtEndPivotCacheDef\", */ T:-1 },\n\t/*::[*/0x00B5/*::]*/: { /* n:\"BrtBeginPCDFields\", */ T:1 },\n\t/*::[*/0x00B6/*::]*/: { /* n:\"BrtEndPCDFields\", */ T:-1 },\n\t/*::[*/0x00B7/*::]*/: { /* n:\"BrtBeginPCDField\", */ T:1 },\n\t/*::[*/0x00B8/*::]*/: { /* n:\"BrtEndPCDField\", */ T:-1 },\n\t/*::[*/0x00B9/*::]*/: { /* n:\"BrtBeginPCDSource\", */ T:1 },\n\t/*::[*/0x00BA/*::]*/: { /* n:\"BrtEndPCDSource\", */ T:-1 },\n\t/*::[*/0x00BB/*::]*/: { /* n:\"BrtBeginPCDSRange\", */ T:1 },\n\t/*::[*/0x00BC/*::]*/: { /* n:\"BrtEndPCDSRange\", */ T:-1 },\n\t/*::[*/0x00BD/*::]*/: { /* n:\"BrtBeginPCDFAtbl\", */ T:1 },\n\t/*::[*/0x00BE/*::]*/: { /* n:\"BrtEndPCDFAtbl\", */ T:-1 },\n\t/*::[*/0x00BF/*::]*/: { /* n:\"BrtBeginPCDIRun\", */ T:1 },\n\t/*::[*/0x00C0/*::]*/: { /* n:\"BrtEndPCDIRun\", */ T:-1 },\n\t/*::[*/0x00C1/*::]*/: { /* n:\"BrtBeginPivotCacheRecords\", */ T:1 },\n\t/*::[*/0x00C2/*::]*/: { /* n:\"BrtEndPivotCacheRecords\", */ T:-1 },\n\t/*::[*/0x00C3/*::]*/: { /* n:\"BrtBeginPCDHierarchies\", */ T:1 },\n\t/*::[*/0x00C4/*::]*/: { /* n:\"BrtEndPCDHierarchies\", */ T:-1 },\n\t/*::[*/0x00C5/*::]*/: { /* n:\"BrtBeginPCDHierarchy\", */ T:1 },\n\t/*::[*/0x00C6/*::]*/: { /* n:\"BrtEndPCDHierarchy\", */ T:-1 },\n\t/*::[*/0x00C7/*::]*/: { /* n:\"BrtBeginPCDHFieldsUsage\", */ T:1 },\n\t/*::[*/0x00C8/*::]*/: { /* n:\"BrtEndPCDHFieldsUsage\", */ T:-1 },\n\t/*::[*/0x00C9/*::]*/: { /* n:\"BrtBeginExtConnection\", */ T:1 },\n\t/*::[*/0x00CA/*::]*/: { /* n:\"BrtEndExtConnection\", */ T:-1 },\n\t/*::[*/0x00CB/*::]*/: { /* n:\"BrtBeginECDbProps\", */ T:1 },\n\t/*::[*/0x00CC/*::]*/: { /* n:\"BrtEndECDbProps\", */ T:-1 },\n\t/*::[*/0x00CD/*::]*/: { /* n:\"BrtBeginECOlapProps\", */ T:1 },\n\t/*::[*/0x00CE/*::]*/: { /* n:\"BrtEndECOlapProps\", */ T:-1 },\n\t/*::[*/0x00CF/*::]*/: { /* n:\"BrtBeginPCDSConsol\", */ T:1 },\n\t/*::[*/0x00D0/*::]*/: { /* n:\"BrtEndPCDSConsol\", */ T:-1 },\n\t/*::[*/0x00D1/*::]*/: { /* n:\"BrtBeginPCDSCPages\", */ T:1 },\n\t/*::[*/0x00D2/*::]*/: { /* n:\"BrtEndPCDSCPages\", */ T:-1 },\n\t/*::[*/0x00D3/*::]*/: { /* n:\"BrtBeginPCDSCPage\", */ T:1 },\n\t/*::[*/0x00D4/*::]*/: { /* n:\"BrtEndPCDSCPage\", */ T:-1 },\n\t/*::[*/0x00D5/*::]*/: { /* n:\"BrtBeginPCDSCPItem\", */ T:1 },\n\t/*::[*/0x00D6/*::]*/: { /* n:\"BrtEndPCDSCPItem\", */ T:-1 },\n\t/*::[*/0x00D7/*::]*/: { /* n:\"BrtBeginPCDSCSets\", */ T:1 },\n\t/*::[*/0x00D8/*::]*/: { /* n:\"BrtEndPCDSCSets\", */ T:-1 },\n\t/*::[*/0x00D9/*::]*/: { /* n:\"BrtBeginPCDSCSet\", */ T:1 },\n\t/*::[*/0x00DA/*::]*/: { /* n:\"BrtEndPCDSCSet\", */ T:-1 },\n\t/*::[*/0x00DB/*::]*/: { /* n:\"BrtBeginPCDFGroup\", */ T:1 },\n\t/*::[*/0x00DC/*::]*/: { /* n:\"BrtEndPCDFGroup\", */ T:-1 },\n\t/*::[*/0x00DD/*::]*/: { /* n:\"BrtBeginPCDFGItems\", */ T:1 },\n\t/*::[*/0x00DE/*::]*/: { /* n:\"BrtEndPCDFGItems\", */ T:-1 },\n\t/*::[*/0x00DF/*::]*/: { /* n:\"BrtBeginPCDFGRange\", */ T:1 },\n\t/*::[*/0x00E0/*::]*/: { /* n:\"BrtEndPCDFGRange\", */ T:-1 },\n\t/*::[*/0x00E1/*::]*/: { /* n:\"BrtBeginPCDFGDiscrete\", */ T:1 },\n\t/*::[*/0x00E2/*::]*/: { /* n:\"BrtEndPCDFGDiscrete\", */ T:-1 },\n\t/*::[*/0x00E3/*::]*/: { /* n:\"BrtBeginPCDSDTupleCache\", */ T:1 },\n\t/*::[*/0x00E4/*::]*/: { /* n:\"BrtEndPCDSDTupleCache\", */ T:-1 },\n\t/*::[*/0x00E5/*::]*/: { /* n:\"BrtBeginPCDSDTCEntries\", */ T:1 },\n\t/*::[*/0x00E6/*::]*/: { /* n:\"BrtEndPCDSDTCEntries\", */ T:-1 },\n\t/*::[*/0x00E7/*::]*/: { /* n:\"BrtBeginPCDSDTCEMembers\", */ T:1 },\n\t/*::[*/0x00E8/*::]*/: { /* n:\"BrtEndPCDSDTCEMembers\", */ T:-1 },\n\t/*::[*/0x00E9/*::]*/: { /* n:\"BrtBeginPCDSDTCEMember\", */ T:1 },\n\t/*::[*/0x00EA/*::]*/: { /* n:\"BrtEndPCDSDTCEMember\", */ T:-1 },\n\t/*::[*/0x00EB/*::]*/: { /* n:\"BrtBeginPCDSDTCQueries\", */ T:1 },\n\t/*::[*/0x00EC/*::]*/: { /* n:\"BrtEndPCDSDTCQueries\", */ T:-1 },\n\t/*::[*/0x00ED/*::]*/: { /* n:\"BrtBeginPCDSDTCQuery\", */ T:1 },\n\t/*::[*/0x00EE/*::]*/: { /* n:\"BrtEndPCDSDTCQuery\", */ T:-1 },\n\t/*::[*/0x00EF/*::]*/: { /* n:\"BrtBeginPCDSDTCSets\", */ T:1 },\n\t/*::[*/0x00F0/*::]*/: { /* n:\"BrtEndPCDSDTCSets\", */ T:-1 },\n\t/*::[*/0x00F1/*::]*/: { /* n:\"BrtBeginPCDSDTCSet\", */ T:1 },\n\t/*::[*/0x00F2/*::]*/: { /* n:\"BrtEndPCDSDTCSet\", */ T:-1 },\n\t/*::[*/0x00F3/*::]*/: { /* n:\"BrtBeginPCDCalcItems\", */ T:1 },\n\t/*::[*/0x00F4/*::]*/: { /* n:\"BrtEndPCDCalcItems\", */ T:-1 },\n\t/*::[*/0x00F5/*::]*/: { /* n:\"BrtBeginPCDCalcItem\", */ T:1 },\n\t/*::[*/0x00F6/*::]*/: { /* n:\"BrtEndPCDCalcItem\", */ T:-1 },\n\t/*::[*/0x00F7/*::]*/: { /* n:\"BrtBeginPRule\", */ T:1 },\n\t/*::[*/0x00F8/*::]*/: { /* n:\"BrtEndPRule\", */ T:-1 },\n\t/*::[*/0x00F9/*::]*/: { /* n:\"BrtBeginPRFilters\", */ T:1 },\n\t/*::[*/0x00FA/*::]*/: { /* n:\"BrtEndPRFilters\", */ T:-1 },\n\t/*::[*/0x00FB/*::]*/: { /* n:\"BrtBeginPRFilter\", */ T:1 },\n\t/*::[*/0x00FC/*::]*/: { /* n:\"BrtEndPRFilter\", */ T:-1 },\n\t/*::[*/0x00FD/*::]*/: { /* n:\"BrtBeginPNames\", */ T:1 },\n\t/*::[*/0x00FE/*::]*/: { /* n:\"BrtEndPNames\", */ T:-1 },\n\t/*::[*/0x00FF/*::]*/: { /* n:\"BrtBeginPName\", */ T:1 },\n\t/*::[*/0x0100/*::]*/: { /* n:\"BrtEndPName\", */ T:-1 },\n\t/*::[*/0x0101/*::]*/: { /* n:\"BrtBeginPNPairs\", */ T:1 },\n\t/*::[*/0x0102/*::]*/: { /* n:\"BrtEndPNPairs\", */ T:-1 },\n\t/*::[*/0x0103/*::]*/: { /* n:\"BrtBeginPNPair\", */ T:1 },\n\t/*::[*/0x0104/*::]*/: { /* n:\"BrtEndPNPair\", */ T:-1 },\n\t/*::[*/0x0105/*::]*/: { /* n:\"BrtBeginECWebProps\", */ T:1 },\n\t/*::[*/0x0106/*::]*/: { /* n:\"BrtEndECWebProps\", */ T:-1 },\n\t/*::[*/0x0107/*::]*/: { /* n:\"BrtBeginEcWpTables\", */ T:1 },\n\t/*::[*/0x0108/*::]*/: { /* n:\"BrtEndECWPTables\", */ T:-1 },\n\t/*::[*/0x0109/*::]*/: { /* n:\"BrtBeginECParams\", */ T:1 },\n\t/*::[*/0x010A/*::]*/: { /* n:\"BrtEndECParams\", */ T:-1 },\n\t/*::[*/0x010B/*::]*/: { /* n:\"BrtBeginECParam\", */ T:1 },\n\t/*::[*/0x010C/*::]*/: { /* n:\"BrtEndECParam\", */ T:-1 },\n\t/*::[*/0x010D/*::]*/: { /* n:\"BrtBeginPCDKPIs\", */ T:1 },\n\t/*::[*/0x010E/*::]*/: { /* n:\"BrtEndPCDKPIs\", */ T:-1 },\n\t/*::[*/0x010F/*::]*/: { /* n:\"BrtBeginPCDKPI\", */ T:1 },\n\t/*::[*/0x0110/*::]*/: { /* n:\"BrtEndPCDKPI\", */ T:-1 },\n\t/*::[*/0x0111/*::]*/: { /* n:\"BrtBeginDims\", */ T:1 },\n\t/*::[*/0x0112/*::]*/: { /* n:\"BrtEndDims\", */ T:-1 },\n\t/*::[*/0x0113/*::]*/: { /* n:\"BrtBeginDim\", */ T:1 },\n\t/*::[*/0x0114/*::]*/: { /* n:\"BrtEndDim\", */ T:-1 },\n\t/*::[*/0x0115/*::]*/: { /* n:\"BrtIndexPartEnd\" */ },\n\t/*::[*/0x0116/*::]*/: { /* n:\"BrtBeginStyleSheet\", */ T:1 },\n\t/*::[*/0x0117/*::]*/: { /* n:\"BrtEndStyleSheet\", */ T:-1 },\n\t/*::[*/0x0118/*::]*/: { /* n:\"BrtBeginSXView\", */ T:1 },\n\t/*::[*/0x0119/*::]*/: { /* n:\"BrtEndSXVI\", */ T:-1 },\n\t/*::[*/0x011A/*::]*/: { /* n:\"BrtBeginSXVI\", */ T:1 },\n\t/*::[*/0x011B/*::]*/: { /* n:\"BrtBeginSXVIs\", */ T:1 },\n\t/*::[*/0x011C/*::]*/: { /* n:\"BrtEndSXVIs\", */ T:-1 },\n\t/*::[*/0x011D/*::]*/: { /* n:\"BrtBeginSXVD\", */ T:1 },\n\t/*::[*/0x011E/*::]*/: { /* n:\"BrtEndSXVD\", */ T:-1 },\n\t/*::[*/0x011F/*::]*/: { /* n:\"BrtBeginSXVDs\", */ T:1 },\n\t/*::[*/0x0120/*::]*/: { /* n:\"BrtEndSXVDs\", */ T:-1 },\n\t/*::[*/0x0121/*::]*/: { /* n:\"BrtBeginSXPI\", */ T:1 },\n\t/*::[*/0x0122/*::]*/: { /* n:\"BrtEndSXPI\", */ T:-1 },\n\t/*::[*/0x0123/*::]*/: { /* n:\"BrtBeginSXPIs\", */ T:1 },\n\t/*::[*/0x0124/*::]*/: { /* n:\"BrtEndSXPIs\", */ T:-1 },\n\t/*::[*/0x0125/*::]*/: { /* n:\"BrtBeginSXDI\", */ T:1 },\n\t/*::[*/0x0126/*::]*/: { /* n:\"BrtEndSXDI\", */ T:-1 },\n\t/*::[*/0x0127/*::]*/: { /* n:\"BrtBeginSXDIs\", */ T:1 },\n\t/*::[*/0x0128/*::]*/: { /* n:\"BrtEndSXDIs\", */ T:-1 },\n\t/*::[*/0x0129/*::]*/: { /* n:\"BrtBeginSXLI\", */ T:1 },\n\t/*::[*/0x012A/*::]*/: { /* n:\"BrtEndSXLI\", */ T:-1 },\n\t/*::[*/0x012B/*::]*/: { /* n:\"BrtBeginSXLIRws\", */ T:1 },\n\t/*::[*/0x012C/*::]*/: { /* n:\"BrtEndSXLIRws\", */ T:-1 },\n\t/*::[*/0x012D/*::]*/: { /* n:\"BrtBeginSXLICols\", */ T:1 },\n\t/*::[*/0x012E/*::]*/: { /* n:\"BrtEndSXLICols\", */ T:-1 },\n\t/*::[*/0x012F/*::]*/: { /* n:\"BrtBeginSXFormat\", */ T:1 },\n\t/*::[*/0x0130/*::]*/: { /* n:\"BrtEndSXFormat\", */ T:-1 },\n\t/*::[*/0x0131/*::]*/: { /* n:\"BrtBeginSXFormats\", */ T:1 },\n\t/*::[*/0x0132/*::]*/: { /* n:\"BrtEndSxFormats\", */ T:-1 },\n\t/*::[*/0x0133/*::]*/: { /* n:\"BrtBeginSxSelect\", */ T:1 },\n\t/*::[*/0x0134/*::]*/: { /* n:\"BrtEndSxSelect\", */ T:-1 },\n\t/*::[*/0x0135/*::]*/: { /* n:\"BrtBeginISXVDRws\", */ T:1 },\n\t/*::[*/0x0136/*::]*/: { /* n:\"BrtEndISXVDRws\", */ T:-1 },\n\t/*::[*/0x0137/*::]*/: { /* n:\"BrtBeginISXVDCols\", */ T:1 },\n\t/*::[*/0x0138/*::]*/: { /* n:\"BrtEndISXVDCols\", */ T:-1 },\n\t/*::[*/0x0139/*::]*/: { /* n:\"BrtEndSXLocation\", */ T:-1 },\n\t/*::[*/0x013A/*::]*/: { /* n:\"BrtBeginSXLocation\", */ T:1 },\n\t/*::[*/0x013B/*::]*/: { /* n:\"BrtEndSXView\", */ T:-1 },\n\t/*::[*/0x013C/*::]*/: { /* n:\"BrtBeginSXTHs\", */ T:1 },\n\t/*::[*/0x013D/*::]*/: { /* n:\"BrtEndSXTHs\", */ T:-1 },\n\t/*::[*/0x013E/*::]*/: { /* n:\"BrtBeginSXTH\", */ T:1 },\n\t/*::[*/0x013F/*::]*/: { /* n:\"BrtEndSXTH\", */ T:-1 },\n\t/*::[*/0x0140/*::]*/: { /* n:\"BrtBeginISXTHRws\", */ T:1 },\n\t/*::[*/0x0141/*::]*/: { /* n:\"BrtEndISXTHRws\", */ T:-1 },\n\t/*::[*/0x0142/*::]*/: { /* n:\"BrtBeginISXTHCols\", */ T:1 },\n\t/*::[*/0x0143/*::]*/: { /* n:\"BrtEndISXTHCols\", */ T:-1 },\n\t/*::[*/0x0144/*::]*/: { /* n:\"BrtBeginSXTDMPS\", */ T:1 },\n\t/*::[*/0x0145/*::]*/: { /* n:\"BrtEndSXTDMPs\", */ T:-1 },\n\t/*::[*/0x0146/*::]*/: { /* n:\"BrtBeginSXTDMP\", */ T:1 },\n\t/*::[*/0x0147/*::]*/: { /* n:\"BrtEndSXTDMP\", */ T:-1 },\n\t/*::[*/0x0148/*::]*/: { /* n:\"BrtBeginSXTHItems\", */ T:1 },\n\t/*::[*/0x0149/*::]*/: { /* n:\"BrtEndSXTHItems\", */ T:-1 },\n\t/*::[*/0x014A/*::]*/: { /* n:\"BrtBeginSXTHItem\", */ T:1 },\n\t/*::[*/0x014B/*::]*/: { /* n:\"BrtEndSXTHItem\", */ T:-1 },\n\t/*::[*/0x014C/*::]*/: { /* n:\"BrtBeginMetadata\", */ T:1 },\n\t/*::[*/0x014D/*::]*/: { /* n:\"BrtEndMetadata\", */ T:-1 },\n\t/*::[*/0x014E/*::]*/: { /* n:\"BrtBeginEsmdtinfo\", */ T:1 },\n\t/*::[*/0x014F/*::]*/: { /* n:\"BrtMdtinfo\", */ f:parse_BrtMdtinfo },\n\t/*::[*/0x0150/*::]*/: { /* n:\"BrtEndEsmdtinfo\", */ T:-1 },\n\t/*::[*/0x0151/*::]*/: { /* n:\"BrtBeginEsmdb\", */ f:parse_BrtBeginEsmdb, T:1 },\n\t/*::[*/0x0152/*::]*/: { /* n:\"BrtEndEsmdb\", */ T:-1 },\n\t/*::[*/0x0153/*::]*/: { /* n:\"BrtBeginEsfmd\", */ T:1 },\n\t/*::[*/0x0154/*::]*/: { /* n:\"BrtEndEsfmd\", */ T:-1 },\n\t/*::[*/0x0155/*::]*/: { /* n:\"BrtBeginSingleCells\", */ T:1 },\n\t/*::[*/0x0156/*::]*/: { /* n:\"BrtEndSingleCells\", */ T:-1 },\n\t/*::[*/0x0157/*::]*/: { /* n:\"BrtBeginList\", */ T:1 },\n\t/*::[*/0x0158/*::]*/: { /* n:\"BrtEndList\", */ T:-1 },\n\t/*::[*/0x0159/*::]*/: { /* n:\"BrtBeginListCols\", */ T:1 },\n\t/*::[*/0x015A/*::]*/: { /* n:\"BrtEndListCols\", */ T:-1 },\n\t/*::[*/0x015B/*::]*/: { /* n:\"BrtBeginListCol\", */ T:1 },\n\t/*::[*/0x015C/*::]*/: { /* n:\"BrtEndListCol\", */ T:-1 },\n\t/*::[*/0x015D/*::]*/: { /* n:\"BrtBeginListXmlCPr\", */ T:1 },\n\t/*::[*/0x015E/*::]*/: { /* n:\"BrtEndListXmlCPr\", */ T:-1 },\n\t/*::[*/0x015F/*::]*/: { /* n:\"BrtListCCFmla\" */ },\n\t/*::[*/0x0160/*::]*/: { /* n:\"BrtListTrFmla\" */ },\n\t/*::[*/0x0161/*::]*/: { /* n:\"BrtBeginExternals\", */ T:1 },\n\t/*::[*/0x0162/*::]*/: { /* n:\"BrtEndExternals\", */ T:-1 },\n\t/*::[*/0x0163/*::]*/: { /* n:\"BrtSupBookSrc\", */ f:parse_RelID},\n\t/*::[*/0x0165/*::]*/: { /* n:\"BrtSupSelf\" */ },\n\t/*::[*/0x0166/*::]*/: { /* n:\"BrtSupSame\" */ },\n\t/*::[*/0x0167/*::]*/: { /* n:\"BrtSupTabs\" */ },\n\t/*::[*/0x0168/*::]*/: { /* n:\"BrtBeginSupBook\", */ T:1 },\n\t/*::[*/0x0169/*::]*/: { /* n:\"BrtPlaceholderName\" */ },\n\t/*::[*/0x016A/*::]*/: { /* n:\"BrtExternSheet\", */ f:parse_ExternSheet },\n\t/*::[*/0x016B/*::]*/: { /* n:\"BrtExternTableStart\" */ },\n\t/*::[*/0x016C/*::]*/: { /* n:\"BrtExternTableEnd\" */ },\n\t/*::[*/0x016E/*::]*/: { /* n:\"BrtExternRowHdr\" */ },\n\t/*::[*/0x016F/*::]*/: { /* n:\"BrtExternCellBlank\" */ },\n\t/*::[*/0x0170/*::]*/: { /* n:\"BrtExternCellReal\" */ },\n\t/*::[*/0x0171/*::]*/: { /* n:\"BrtExternCellBool\" */ },\n\t/*::[*/0x0172/*::]*/: { /* n:\"BrtExternCellError\" */ },\n\t/*::[*/0x0173/*::]*/: { /* n:\"BrtExternCellString\" */ },\n\t/*::[*/0x0174/*::]*/: { /* n:\"BrtBeginEsmdx\", */ T:1 },\n\t/*::[*/0x0175/*::]*/: { /* n:\"BrtEndEsmdx\", */ T:-1 },\n\t/*::[*/0x0176/*::]*/: { /* n:\"BrtBeginMdxSet\", */ T:1 },\n\t/*::[*/0x0177/*::]*/: { /* n:\"BrtEndMdxSet\", */ T:-1 },\n\t/*::[*/0x0178/*::]*/: { /* n:\"BrtBeginMdxMbrProp\", */ T:1 },\n\t/*::[*/0x0179/*::]*/: { /* n:\"BrtEndMdxMbrProp\", */ T:-1 },\n\t/*::[*/0x017A/*::]*/: { /* n:\"BrtBeginMdxKPI\", */ T:1 },\n\t/*::[*/0x017B/*::]*/: { /* n:\"BrtEndMdxKPI\", */ T:-1 },\n\t/*::[*/0x017C/*::]*/: { /* n:\"BrtBeginEsstr\", */ T:1 },\n\t/*::[*/0x017D/*::]*/: { /* n:\"BrtEndEsstr\", */ T:-1 },\n\t/*::[*/0x017E/*::]*/: { /* n:\"BrtBeginPRFItem\", */ T:1 },\n\t/*::[*/0x017F/*::]*/: { /* n:\"BrtEndPRFItem\", */ T:-1 },\n\t/*::[*/0x0180/*::]*/: { /* n:\"BrtBeginPivotCacheIDs\", */ T:1 },\n\t/*::[*/0x0181/*::]*/: { /* n:\"BrtEndPivotCacheIDs\", */ T:-1 },\n\t/*::[*/0x0182/*::]*/: { /* n:\"BrtBeginPivotCacheID\", */ T:1 },\n\t/*::[*/0x0183/*::]*/: { /* n:\"BrtEndPivotCacheID\", */ T:-1 },\n\t/*::[*/0x0184/*::]*/: { /* n:\"BrtBeginISXVIs\", */ T:1 },\n\t/*::[*/0x0185/*::]*/: { /* n:\"BrtEndISXVIs\", */ T:-1 },\n\t/*::[*/0x0186/*::]*/: { /* n:\"BrtBeginColInfos\", */ T:1 },\n\t/*::[*/0x0187/*::]*/: { /* n:\"BrtEndColInfos\", */ T:-1 },\n\t/*::[*/0x0188/*::]*/: { /* n:\"BrtBeginRwBrk\", */ T:1 },\n\t/*::[*/0x0189/*::]*/: { /* n:\"BrtEndRwBrk\", */ T:-1 },\n\t/*::[*/0x018A/*::]*/: { /* n:\"BrtBeginColBrk\", */ T:1 },\n\t/*::[*/0x018B/*::]*/: { /* n:\"BrtEndColBrk\", */ T:-1 },\n\t/*::[*/0x018C/*::]*/: { /* n:\"BrtBrk\" */ },\n\t/*::[*/0x018D/*::]*/: { /* n:\"BrtUserBookView\" */ },\n\t/*::[*/0x018E/*::]*/: { /* n:\"BrtInfo\" */ },\n\t/*::[*/0x018F/*::]*/: { /* n:\"BrtCUsr\" */ },\n\t/*::[*/0x0190/*::]*/: { /* n:\"BrtUsr\" */ },\n\t/*::[*/0x0191/*::]*/: { /* n:\"BrtBeginUsers\", */ T:1 },\n\t/*::[*/0x0193/*::]*/: { /* n:\"BrtEOF\" */ },\n\t/*::[*/0x0194/*::]*/: { /* n:\"BrtUCR\" */ },\n\t/*::[*/0x0195/*::]*/: { /* n:\"BrtRRInsDel\" */ },\n\t/*::[*/0x0196/*::]*/: { /* n:\"BrtRREndInsDel\" */ },\n\t/*::[*/0x0197/*::]*/: { /* n:\"BrtRRMove\" */ },\n\t/*::[*/0x0198/*::]*/: { /* n:\"BrtRREndMove\" */ },\n\t/*::[*/0x0199/*::]*/: { /* n:\"BrtRRChgCell\" */ },\n\t/*::[*/0x019A/*::]*/: { /* n:\"BrtRREndChgCell\" */ },\n\t/*::[*/0x019B/*::]*/: { /* n:\"BrtRRHeader\" */ },\n\t/*::[*/0x019C/*::]*/: { /* n:\"BrtRRUserView\" */ },\n\t/*::[*/0x019D/*::]*/: { /* n:\"BrtRRRenSheet\" */ },\n\t/*::[*/0x019E/*::]*/: { /* n:\"BrtRRInsertSh\" */ },\n\t/*::[*/0x019F/*::]*/: { /* n:\"BrtRRDefName\" */ },\n\t/*::[*/0x01A0/*::]*/: { /* n:\"BrtRRNote\" */ },\n\t/*::[*/0x01A1/*::]*/: { /* n:\"BrtRRConflict\" */ },\n\t/*::[*/0x01A2/*::]*/: { /* n:\"BrtRRTQSIF\" */ },\n\t/*::[*/0x01A3/*::]*/: { /* n:\"BrtRRFormat\" */ },\n\t/*::[*/0x01A4/*::]*/: { /* n:\"BrtRREndFormat\" */ },\n\t/*::[*/0x01A5/*::]*/: { /* n:\"BrtRRAutoFmt\" */ },\n\t/*::[*/0x01A6/*::]*/: { /* n:\"BrtBeginUserShViews\", */ T:1 },\n\t/*::[*/0x01A7/*::]*/: { /* n:\"BrtBeginUserShView\", */ T:1 },\n\t/*::[*/0x01A8/*::]*/: { /* n:\"BrtEndUserShView\", */ T:-1 },\n\t/*::[*/0x01A9/*::]*/: { /* n:\"BrtEndUserShViews\", */ T:-1 },\n\t/*::[*/0x01AA/*::]*/: { /* n:\"BrtArrFmla\", */ f:parse_BrtArrFmla },\n\t/*::[*/0x01AB/*::]*/: { /* n:\"BrtShrFmla\", */ f:parse_BrtShrFmla },\n\t/*::[*/0x01AC/*::]*/: { /* n:\"BrtTable\" */ },\n\t/*::[*/0x01AD/*::]*/: { /* n:\"BrtBeginExtConnections\", */ T:1 },\n\t/*::[*/0x01AE/*::]*/: { /* n:\"BrtEndExtConnections\", */ T:-1 },\n\t/*::[*/0x01AF/*::]*/: { /* n:\"BrtBeginPCDCalcMems\", */ T:1 },\n\t/*::[*/0x01B0/*::]*/: { /* n:\"BrtEndPCDCalcMems\", */ T:-1 },\n\t/*::[*/0x01B1/*::]*/: { /* n:\"BrtBeginPCDCalcMem\", */ T:1 },\n\t/*::[*/0x01B2/*::]*/: { /* n:\"BrtEndPCDCalcMem\", */ T:-1 },\n\t/*::[*/0x01B3/*::]*/: { /* n:\"BrtBeginPCDHGLevels\", */ T:1 },\n\t/*::[*/0x01B4/*::]*/: { /* n:\"BrtEndPCDHGLevels\", */ T:-1 },\n\t/*::[*/0x01B5/*::]*/: { /* n:\"BrtBeginPCDHGLevel\", */ T:1 },\n\t/*::[*/0x01B6/*::]*/: { /* n:\"BrtEndPCDHGLevel\", */ T:-1 },\n\t/*::[*/0x01B7/*::]*/: { /* n:\"BrtBeginPCDHGLGroups\", */ T:1 },\n\t/*::[*/0x01B8/*::]*/: { /* n:\"BrtEndPCDHGLGroups\", */ T:-1 },\n\t/*::[*/0x01B9/*::]*/: { /* n:\"BrtBeginPCDHGLGroup\", */ T:1 },\n\t/*::[*/0x01BA/*::]*/: { /* n:\"BrtEndPCDHGLGroup\", */ T:-1 },\n\t/*::[*/0x01BB/*::]*/: { /* n:\"BrtBeginPCDHGLGMembers\", */ T:1 },\n\t/*::[*/0x01BC/*::]*/: { /* n:\"BrtEndPCDHGLGMembers\", */ T:-1 },\n\t/*::[*/0x01BD/*::]*/: { /* n:\"BrtBeginPCDHGLGMember\", */ T:1 },\n\t/*::[*/0x01BE/*::]*/: { /* n:\"BrtEndPCDHGLGMember\", */ T:-1 },\n\t/*::[*/0x01BF/*::]*/: { /* n:\"BrtBeginQSI\", */ T:1 },\n\t/*::[*/0x01C0/*::]*/: { /* n:\"BrtEndQSI\", */ T:-1 },\n\t/*::[*/0x01C1/*::]*/: { /* n:\"BrtBeginQSIR\", */ T:1 },\n\t/*::[*/0x01C2/*::]*/: { /* n:\"BrtEndQSIR\", */ T:-1 },\n\t/*::[*/0x01C3/*::]*/: { /* n:\"BrtBeginDeletedNames\", */ T:1 },\n\t/*::[*/0x01C4/*::]*/: { /* n:\"BrtEndDeletedNames\", */ T:-1 },\n\t/*::[*/0x01C5/*::]*/: { /* n:\"BrtBeginDeletedName\", */ T:1 },\n\t/*::[*/0x01C6/*::]*/: { /* n:\"BrtEndDeletedName\", */ T:-1 },\n\t/*::[*/0x01C7/*::]*/: { /* n:\"BrtBeginQSIFs\", */ T:1 },\n\t/*::[*/0x01C8/*::]*/: { /* n:\"BrtEndQSIFs\", */ T:-1 },\n\t/*::[*/0x01C9/*::]*/: { /* n:\"BrtBeginQSIF\", */ T:1 },\n\t/*::[*/0x01CA/*::]*/: { /* n:\"BrtEndQSIF\", */ T:-1 },\n\t/*::[*/0x01CB/*::]*/: { /* n:\"BrtBeginAutoSortScope\", */ T:1 },\n\t/*::[*/0x01CC/*::]*/: { /* n:\"BrtEndAutoSortScope\", */ T:-1 },\n\t/*::[*/0x01CD/*::]*/: { /* n:\"BrtBeginConditionalFormatting\", */ T:1 },\n\t/*::[*/0x01CE/*::]*/: { /* n:\"BrtEndConditionalFormatting\", */ T:-1 },\n\t/*::[*/0x01CF/*::]*/: { /* n:\"BrtBeginCFRule\", */ T:1 },\n\t/*::[*/0x01D0/*::]*/: { /* n:\"BrtEndCFRule\", */ T:-1 },\n\t/*::[*/0x01D1/*::]*/: { /* n:\"BrtBeginIconSet\", */ T:1 },\n\t/*::[*/0x01D2/*::]*/: { /* n:\"BrtEndIconSet\", */ T:-1 },\n\t/*::[*/0x01D3/*::]*/: { /* n:\"BrtBeginDatabar\", */ T:1 },\n\t/*::[*/0x01D4/*::]*/: { /* n:\"BrtEndDatabar\", */ T:-1 },\n\t/*::[*/0x01D5/*::]*/: { /* n:\"BrtBeginColorScale\", */ T:1 },\n\t/*::[*/0x01D6/*::]*/: { /* n:\"BrtEndColorScale\", */ T:-1 },\n\t/*::[*/0x01D7/*::]*/: { /* n:\"BrtCFVO\" */ },\n\t/*::[*/0x01D8/*::]*/: { /* n:\"BrtExternValueMeta\" */ },\n\t/*::[*/0x01D9/*::]*/: { /* n:\"BrtBeginColorPalette\", */ T:1 },\n\t/*::[*/0x01DA/*::]*/: { /* n:\"BrtEndColorPalette\", */ T:-1 },\n\t/*::[*/0x01DB/*::]*/: { /* n:\"BrtIndexedColor\" */ },\n\t/*::[*/0x01DC/*::]*/: { /* n:\"BrtMargins\", */ f:parse_BrtMargins },\n\t/*::[*/0x01DD/*::]*/: { /* n:\"BrtPrintOptions\" */ },\n\t/*::[*/0x01DE/*::]*/: { /* n:\"BrtPageSetup\" */ },\n\t/*::[*/0x01DF/*::]*/: { /* n:\"BrtBeginHeaderFooter\", */ T:1 },\n\t/*::[*/0x01E0/*::]*/: { /* n:\"BrtEndHeaderFooter\", */ T:-1 },\n\t/*::[*/0x01E1/*::]*/: { /* n:\"BrtBeginSXCrtFormat\", */ T:1 },\n\t/*::[*/0x01E2/*::]*/: { /* n:\"BrtEndSXCrtFormat\", */ T:-1 },\n\t/*::[*/0x01E3/*::]*/: { /* n:\"BrtBeginSXCrtFormats\", */ T:1 },\n\t/*::[*/0x01E4/*::]*/: { /* n:\"BrtEndSXCrtFormats\", */ T:-1 },\n\t/*::[*/0x01E5/*::]*/: { /* n:\"BrtWsFmtInfo\", */ f:parse_BrtWsFmtInfo },\n\t/*::[*/0x01E6/*::]*/: { /* n:\"BrtBeginMgs\", */ T:1 },\n\t/*::[*/0x01E7/*::]*/: { /* n:\"BrtEndMGs\", */ T:-1 },\n\t/*::[*/0x01E8/*::]*/: { /* n:\"BrtBeginMGMaps\", */ T:1 },\n\t/*::[*/0x01E9/*::]*/: { /* n:\"BrtEndMGMaps\", */ T:-1 },\n\t/*::[*/0x01EA/*::]*/: { /* n:\"BrtBeginMG\", */ T:1 },\n\t/*::[*/0x01EB/*::]*/: { /* n:\"BrtEndMG\", */ T:-1 },\n\t/*::[*/0x01EC/*::]*/: { /* n:\"BrtBeginMap\", */ T:1 },\n\t/*::[*/0x01ED/*::]*/: { /* n:\"BrtEndMap\", */ T:-1 },\n\t/*::[*/0x01EE/*::]*/: { /* n:\"BrtHLink\", */ f:parse_BrtHLink },\n\t/*::[*/0x01EF/*::]*/: { /* n:\"BrtBeginDCon\", */ T:1 },\n\t/*::[*/0x01F0/*::]*/: { /* n:\"BrtEndDCon\", */ T:-1 },\n\t/*::[*/0x01F1/*::]*/: { /* n:\"BrtBeginDRefs\", */ T:1 },\n\t/*::[*/0x01F2/*::]*/: { /* n:\"BrtEndDRefs\", */ T:-1 },\n\t/*::[*/0x01F3/*::]*/: { /* n:\"BrtDRef\" */ },\n\t/*::[*/0x01F4/*::]*/: { /* n:\"BrtBeginScenMan\", */ T:1 },\n\t/*::[*/0x01F5/*::]*/: { /* n:\"BrtEndScenMan\", */ T:-1 },\n\t/*::[*/0x01F6/*::]*/: { /* n:\"BrtBeginSct\", */ T:1 },\n\t/*::[*/0x01F7/*::]*/: { /* n:\"BrtEndSct\", */ T:-1 },\n\t/*::[*/0x01F8/*::]*/: { /* n:\"BrtSlc\" */ },\n\t/*::[*/0x01F9/*::]*/: { /* n:\"BrtBeginDXFs\", */ T:1 },\n\t/*::[*/0x01FA/*::]*/: { /* n:\"BrtEndDXFs\", */ T:-1 },\n\t/*::[*/0x01FB/*::]*/: { /* n:\"BrtDXF\" */ },\n\t/*::[*/0x01FC/*::]*/: { /* n:\"BrtBeginTableStyles\", */ T:1 },\n\t/*::[*/0x01FD/*::]*/: { /* n:\"BrtEndTableStyles\", */ T:-1 },\n\t/*::[*/0x01FE/*::]*/: { /* n:\"BrtBeginTableStyle\", */ T:1 },\n\t/*::[*/0x01FF/*::]*/: { /* n:\"BrtEndTableStyle\", */ T:-1 },\n\t/*::[*/0x0200/*::]*/: { /* n:\"BrtTableStyleElement\" */ },\n\t/*::[*/0x0201/*::]*/: { /* n:\"BrtTableStyleClient\" */ },\n\t/*::[*/0x0202/*::]*/: { /* n:\"BrtBeginVolDeps\", */ T:1 },\n\t/*::[*/0x0203/*::]*/: { /* n:\"BrtEndVolDeps\", */ T:-1 },\n\t/*::[*/0x0204/*::]*/: { /* n:\"BrtBeginVolType\", */ T:1 },\n\t/*::[*/0x0205/*::]*/: { /* n:\"BrtEndVolType\", */ T:-1 },\n\t/*::[*/0x0206/*::]*/: { /* n:\"BrtBeginVolMain\", */ T:1 },\n\t/*::[*/0x0207/*::]*/: { /* n:\"BrtEndVolMain\", */ T:-1 },\n\t/*::[*/0x0208/*::]*/: { /* n:\"BrtBeginVolTopic\", */ T:1 },\n\t/*::[*/0x0209/*::]*/: { /* n:\"BrtEndVolTopic\", */ T:-1 },\n\t/*::[*/0x020A/*::]*/: { /* n:\"BrtVolSubtopic\" */ },\n\t/*::[*/0x020B/*::]*/: { /* n:\"BrtVolRef\" */ },\n\t/*::[*/0x020C/*::]*/: { /* n:\"BrtVolNum\" */ },\n\t/*::[*/0x020D/*::]*/: { /* n:\"BrtVolErr\" */ },\n\t/*::[*/0x020E/*::]*/: { /* n:\"BrtVolStr\" */ },\n\t/*::[*/0x020F/*::]*/: { /* n:\"BrtVolBool\" */ },\n\t/*::[*/0x0210/*::]*/: { /* n:\"BrtBeginCalcChain$\", */ T:1 },\n\t/*::[*/0x0211/*::]*/: { /* n:\"BrtEndCalcChain$\", */ T:-1 },\n\t/*::[*/0x0212/*::]*/: { /* n:\"BrtBeginSortState\", */ T:1 },\n\t/*::[*/0x0213/*::]*/: { /* n:\"BrtEndSortState\", */ T:-1 },\n\t/*::[*/0x0214/*::]*/: { /* n:\"BrtBeginSortCond\", */ T:1 },\n\t/*::[*/0x0215/*::]*/: { /* n:\"BrtEndSortCond\", */ T:-1 },\n\t/*::[*/0x0216/*::]*/: { /* n:\"BrtBookProtection\" */ },\n\t/*::[*/0x0217/*::]*/: { /* n:\"BrtSheetProtection\" */ },\n\t/*::[*/0x0218/*::]*/: { /* n:\"BrtRangeProtection\" */ },\n\t/*::[*/0x0219/*::]*/: { /* n:\"BrtPhoneticInfo\" */ },\n\t/*::[*/0x021A/*::]*/: { /* n:\"BrtBeginECTxtWiz\", */ T:1 },\n\t/*::[*/0x021B/*::]*/: { /* n:\"BrtEndECTxtWiz\", */ T:-1 },\n\t/*::[*/0x021C/*::]*/: { /* n:\"BrtBeginECTWFldInfoLst\", */ T:1 },\n\t/*::[*/0x021D/*::]*/: { /* n:\"BrtEndECTWFldInfoLst\", */ T:-1 },\n\t/*::[*/0x021E/*::]*/: { /* n:\"BrtBeginECTwFldInfo\", */ T:1 },\n\t/*::[*/0x0224/*::]*/: { /* n:\"BrtFileSharing\" */ },\n\t/*::[*/0x0225/*::]*/: { /* n:\"BrtOleSize\" */ },\n\t/*::[*/0x0226/*::]*/: { /* n:\"BrtDrawing\", */ f:parse_RelID },\n\t/*::[*/0x0227/*::]*/: { /* n:\"BrtLegacyDrawing\" */ },\n\t/*::[*/0x0228/*::]*/: { /* n:\"BrtLegacyDrawingHF\" */ },\n\t/*::[*/0x0229/*::]*/: { /* n:\"BrtWebOpt\" */ },\n\t/*::[*/0x022A/*::]*/: { /* n:\"BrtBeginWebPubItems\", */ T:1 },\n\t/*::[*/0x022B/*::]*/: { /* n:\"BrtEndWebPubItems\", */ T:-1 },\n\t/*::[*/0x022C/*::]*/: { /* n:\"BrtBeginWebPubItem\", */ T:1 },\n\t/*::[*/0x022D/*::]*/: { /* n:\"BrtEndWebPubItem\", */ T:-1 },\n\t/*::[*/0x022E/*::]*/: { /* n:\"BrtBeginSXCondFmt\", */ T:1 },\n\t/*::[*/0x022F/*::]*/: { /* n:\"BrtEndSXCondFmt\", */ T:-1 },\n\t/*::[*/0x0230/*::]*/: { /* n:\"BrtBeginSXCondFmts\", */ T:1 },\n\t/*::[*/0x0231/*::]*/: { /* n:\"BrtEndSXCondFmts\", */ T:-1 },\n\t/*::[*/0x0232/*::]*/: { /* n:\"BrtBkHim\" */ },\n\t/*::[*/0x0234/*::]*/: { /* n:\"BrtColor\" */ },\n\t/*::[*/0x0235/*::]*/: { /* n:\"BrtBeginIndexedColors\", */ T:1 },\n\t/*::[*/0x0236/*::]*/: { /* n:\"BrtEndIndexedColors\", */ T:-1 },\n\t/*::[*/0x0239/*::]*/: { /* n:\"BrtBeginMRUColors\", */ T:1 },\n\t/*::[*/0x023A/*::]*/: { /* n:\"BrtEndMRUColors\", */ T:-1 },\n\t/*::[*/0x023C/*::]*/: { /* n:\"BrtMRUColor\" */ },\n\t/*::[*/0x023D/*::]*/: { /* n:\"BrtBeginDVals\", */ T:1 },\n\t/*::[*/0x023E/*::]*/: { /* n:\"BrtEndDVals\", */ T:-1 },\n\t/*::[*/0x0241/*::]*/: { /* n:\"BrtSupNameStart\" */ },\n\t/*::[*/0x0242/*::]*/: { /* n:\"BrtSupNameValueStart\" */ },\n\t/*::[*/0x0243/*::]*/: { /* n:\"BrtSupNameValueEnd\" */ },\n\t/*::[*/0x0244/*::]*/: { /* n:\"BrtSupNameNum\" */ },\n\t/*::[*/0x0245/*::]*/: { /* n:\"BrtSupNameErr\" */ },\n\t/*::[*/0x0246/*::]*/: { /* n:\"BrtSupNameSt\" */ },\n\t/*::[*/0x0247/*::]*/: { /* n:\"BrtSupNameNil\" */ },\n\t/*::[*/0x0248/*::]*/: { /* n:\"BrtSupNameBool\" */ },\n\t/*::[*/0x0249/*::]*/: { /* n:\"BrtSupNameFmla\" */ },\n\t/*::[*/0x024A/*::]*/: { /* n:\"BrtSupNameBits\" */ },\n\t/*::[*/0x024B/*::]*/: { /* n:\"BrtSupNameEnd\" */ },\n\t/*::[*/0x024C/*::]*/: { /* n:\"BrtEndSupBook\", */ T:-1 },\n\t/*::[*/0x024D/*::]*/: { /* n:\"BrtCellSmartTagProperty\" */ },\n\t/*::[*/0x024E/*::]*/: { /* n:\"BrtBeginCellSmartTag\", */ T:1 },\n\t/*::[*/0x024F/*::]*/: { /* n:\"BrtEndCellSmartTag\", */ T:-1 },\n\t/*::[*/0x0250/*::]*/: { /* n:\"BrtBeginCellSmartTags\", */ T:1 },\n\t/*::[*/0x0251/*::]*/: { /* n:\"BrtEndCellSmartTags\", */ T:-1 },\n\t/*::[*/0x0252/*::]*/: { /* n:\"BrtBeginSmartTags\", */ T:1 },\n\t/*::[*/0x0253/*::]*/: { /* n:\"BrtEndSmartTags\", */ T:-1 },\n\t/*::[*/0x0254/*::]*/: { /* n:\"BrtSmartTagType\" */ },\n\t/*::[*/0x0255/*::]*/: { /* n:\"BrtBeginSmartTagTypes\", */ T:1 },\n\t/*::[*/0x0256/*::]*/: { /* n:\"BrtEndSmartTagTypes\", */ T:-1 },\n\t/*::[*/0x0257/*::]*/: { /* n:\"BrtBeginSXFilters\", */ T:1 },\n\t/*::[*/0x0258/*::]*/: { /* n:\"BrtEndSXFilters\", */ T:-1 },\n\t/*::[*/0x0259/*::]*/: { /* n:\"BrtBeginSXFILTER\", */ T:1 },\n\t/*::[*/0x025A/*::]*/: { /* n:\"BrtEndSXFilter\", */ T:-1 },\n\t/*::[*/0x025B/*::]*/: { /* n:\"BrtBeginFills\", */ T:1 },\n\t/*::[*/0x025C/*::]*/: { /* n:\"BrtEndFills\", */ T:-1 },\n\t/*::[*/0x025D/*::]*/: { /* n:\"BrtBeginCellWatches\", */ T:1 },\n\t/*::[*/0x025E/*::]*/: { /* n:\"BrtEndCellWatches\", */ T:-1 },\n\t/*::[*/0x025F/*::]*/: { /* n:\"BrtCellWatch\" */ },\n\t/*::[*/0x0260/*::]*/: { /* n:\"BrtBeginCRErrs\", */ T:1 },\n\t/*::[*/0x0261/*::]*/: { /* n:\"BrtEndCRErrs\", */ T:-1 },\n\t/*::[*/0x0262/*::]*/: { /* n:\"BrtCrashRecErr\" */ },\n\t/*::[*/0x0263/*::]*/: { /* n:\"BrtBeginFonts\", */ T:1 },\n\t/*::[*/0x0264/*::]*/: { /* n:\"BrtEndFonts\", */ T:-1 },\n\t/*::[*/0x0265/*::]*/: { /* n:\"BrtBeginBorders\", */ T:1 },\n\t/*::[*/0x0266/*::]*/: { /* n:\"BrtEndBorders\", */ T:-1 },\n\t/*::[*/0x0267/*::]*/: { /* n:\"BrtBeginFmts\", */ T:1 },\n\t/*::[*/0x0268/*::]*/: { /* n:\"BrtEndFmts\", */ T:-1 },\n\t/*::[*/0x0269/*::]*/: { /* n:\"BrtBeginCellXFs\", */ T:1 },\n\t/*::[*/0x026A/*::]*/: { /* n:\"BrtEndCellXFs\", */ T:-1 },\n\t/*::[*/0x026B/*::]*/: { /* n:\"BrtBeginStyles\", */ T:1 },\n\t/*::[*/0x026C/*::]*/: { /* n:\"BrtEndStyles\", */ T:-1 },\n\t/*::[*/0x0271/*::]*/: { /* n:\"BrtBigName\" */ },\n\t/*::[*/0x0272/*::]*/: { /* n:\"BrtBeginCellStyleXFs\", */ T:1 },\n\t/*::[*/0x0273/*::]*/: { /* n:\"BrtEndCellStyleXFs\", */ T:-1 },\n\t/*::[*/0x0274/*::]*/: { /* n:\"BrtBeginComments\", */ T:1 },\n\t/*::[*/0x0275/*::]*/: { /* n:\"BrtEndComments\", */ T:-1 },\n\t/*::[*/0x0276/*::]*/: { /* n:\"BrtBeginCommentAuthors\", */ T:1 },\n\t/*::[*/0x0277/*::]*/: { /* n:\"BrtEndCommentAuthors\", */ T:-1 },\n\t/*::[*/0x0278/*::]*/: { /* n:\"BrtCommentAuthor\", */ f:parse_BrtCommentAuthor },\n\t/*::[*/0x0279/*::]*/: { /* n:\"BrtBeginCommentList\", */ T:1 },\n\t/*::[*/0x027A/*::]*/: { /* n:\"BrtEndCommentList\", */ T:-1 },\n\t/*::[*/0x027B/*::]*/: { /* n:\"BrtBeginComment\", */ T:1, f:parse_BrtBeginComment},\n\t/*::[*/0x027C/*::]*/: { /* n:\"BrtEndComment\", */ T:-1 },\n\t/*::[*/0x027D/*::]*/: { /* n:\"BrtCommentText\", */ f:parse_BrtCommentText },\n\t/*::[*/0x027E/*::]*/: { /* n:\"BrtBeginOleObjects\", */ T:1 },\n\t/*::[*/0x027F/*::]*/: { /* n:\"BrtOleObject\" */ },\n\t/*::[*/0x0280/*::]*/: { /* n:\"BrtEndOleObjects\", */ T:-1 },\n\t/*::[*/0x0281/*::]*/: { /* n:\"BrtBeginSxrules\", */ T:1 },\n\t/*::[*/0x0282/*::]*/: { /* n:\"BrtEndSxRules\", */ T:-1 },\n\t/*::[*/0x0283/*::]*/: { /* n:\"BrtBeginActiveXControls\", */ T:1 },\n\t/*::[*/0x0284/*::]*/: { /* n:\"BrtActiveX\" */ },\n\t/*::[*/0x0285/*::]*/: { /* n:\"BrtEndActiveXControls\", */ T:-1 },\n\t/*::[*/0x0286/*::]*/: { /* n:\"BrtBeginPCDSDTCEMembersSortBy\", */ T:1 },\n\t/*::[*/0x0288/*::]*/: { /* n:\"BrtBeginCellIgnoreECs\", */ T:1 },\n\t/*::[*/0x0289/*::]*/: { /* n:\"BrtCellIgnoreEC\" */ },\n\t/*::[*/0x028A/*::]*/: { /* n:\"BrtEndCellIgnoreECs\", */ T:-1 },\n\t/*::[*/0x028B/*::]*/: { /* n:\"BrtCsProp\", */ f:parse_BrtCsProp },\n\t/*::[*/0x028C/*::]*/: { /* n:\"BrtCsPageSetup\" */ },\n\t/*::[*/0x028D/*::]*/: { /* n:\"BrtBeginUserCsViews\", */ T:1 },\n\t/*::[*/0x028E/*::]*/: { /* n:\"BrtEndUserCsViews\", */ T:-1 },\n\t/*::[*/0x028F/*::]*/: { /* n:\"BrtBeginUserCsView\", */ T:1 },\n\t/*::[*/0x0290/*::]*/: { /* n:\"BrtEndUserCsView\", */ T:-1 },\n\t/*::[*/0x0291/*::]*/: { /* n:\"BrtBeginPcdSFCIEntries\", */ T:1 },\n\t/*::[*/0x0292/*::]*/: { /* n:\"BrtEndPCDSFCIEntries\", */ T:-1 },\n\t/*::[*/0x0293/*::]*/: { /* n:\"BrtPCDSFCIEntry\" */ },\n\t/*::[*/0x0294/*::]*/: { /* n:\"BrtBeginListParts\", */ T:1 },\n\t/*::[*/0x0295/*::]*/: { /* n:\"BrtListPart\" */ },\n\t/*::[*/0x0296/*::]*/: { /* n:\"BrtEndListParts\", */ T:-1 },\n\t/*::[*/0x0297/*::]*/: { /* n:\"BrtSheetCalcProp\" */ },\n\t/*::[*/0x0298/*::]*/: { /* n:\"BrtBeginFnGroup\", */ T:1 },\n\t/*::[*/0x0299/*::]*/: { /* n:\"BrtFnGroup\" */ },\n\t/*::[*/0x029A/*::]*/: { /* n:\"BrtEndFnGroup\", */ T:-1 },\n\t/*::[*/0x029B/*::]*/: { /* n:\"BrtSupAddin\" */ },\n\t/*::[*/0x029C/*::]*/: { /* n:\"BrtSXTDMPOrder\" */ },\n\t/*::[*/0x029D/*::]*/: { /* n:\"BrtCsProtection\" */ },\n\t/*::[*/0x029F/*::]*/: { /* n:\"BrtBeginWsSortMap\", */ T:1 },\n\t/*::[*/0x02A0/*::]*/: { /* n:\"BrtEndWsSortMap\", */ T:-1 },\n\t/*::[*/0x02A1/*::]*/: { /* n:\"BrtBeginRRSort\", */ T:1 },\n\t/*::[*/0x02A2/*::]*/: { /* n:\"BrtEndRRSort\", */ T:-1 },\n\t/*::[*/0x02A3/*::]*/: { /* n:\"BrtRRSortItem\" */ },\n\t/*::[*/0x02A4/*::]*/: { /* n:\"BrtFileSharingIso\" */ },\n\t/*::[*/0x02A5/*::]*/: { /* n:\"BrtBookProtectionIso\" */ },\n\t/*::[*/0x02A6/*::]*/: { /* n:\"BrtSheetProtectionIso\" */ },\n\t/*::[*/0x02A7/*::]*/: { /* n:\"BrtCsProtectionIso\" */ },\n\t/*::[*/0x02A8/*::]*/: { /* n:\"BrtRangeProtectionIso\" */ },\n\t/*::[*/0x02A9/*::]*/: { /* n:\"BrtDValList\" */ },\n\t/*::[*/0x0400/*::]*/: { /* n:\"BrtRwDescent\" */ },\n\t/*::[*/0x0401/*::]*/: { /* n:\"BrtKnownFonts\" */ },\n\t/*::[*/0x0402/*::]*/: { /* n:\"BrtBeginSXTupleSet\", */ T:1 },\n\t/*::[*/0x0403/*::]*/: { /* n:\"BrtEndSXTupleSet\", */ T:-1 },\n\t/*::[*/0x0404/*::]*/: { /* n:\"BrtBeginSXTupleSetHeader\", */ T:1 },\n\t/*::[*/0x0405/*::]*/: { /* n:\"BrtEndSXTupleSetHeader\", */ T:-1 },\n\t/*::[*/0x0406/*::]*/: { /* n:\"BrtSXTupleSetHeaderItem\" */ },\n\t/*::[*/0x0407/*::]*/: { /* n:\"BrtBeginSXTupleSetData\", */ T:1 },\n\t/*::[*/0x0408/*::]*/: { /* n:\"BrtEndSXTupleSetData\", */ T:-1 },\n\t/*::[*/0x0409/*::]*/: { /* n:\"BrtBeginSXTupleSetRow\", */ T:1 },\n\t/*::[*/0x040A/*::]*/: { /* n:\"BrtEndSXTupleSetRow\", */ T:-1 },\n\t/*::[*/0x040B/*::]*/: { /* n:\"BrtSXTupleSetRowItem\" */ },\n\t/*::[*/0x040C/*::]*/: { /* n:\"BrtNameExt\" */ },\n\t/*::[*/0x040D/*::]*/: { /* n:\"BrtPCDH14\" */ },\n\t/*::[*/0x040E/*::]*/: { /* n:\"BrtBeginPCDCalcMem14\", */ T:1 },\n\t/*::[*/0x040F/*::]*/: { /* n:\"BrtEndPCDCalcMem14\", */ T:-1 },\n\t/*::[*/0x0410/*::]*/: { /* n:\"BrtSXTH14\" */ },\n\t/*::[*/0x0411/*::]*/: { /* n:\"BrtBeginSparklineGroup\", */ T:1 },\n\t/*::[*/0x0412/*::]*/: { /* n:\"BrtEndSparklineGroup\", */ T:-1 },\n\t/*::[*/0x0413/*::]*/: { /* n:\"BrtSparkline\" */ },\n\t/*::[*/0x0414/*::]*/: { /* n:\"BrtSXDI14\" */ },\n\t/*::[*/0x0415/*::]*/: { /* n:\"BrtWsFmtInfoEx14\" */ },\n\t/*::[*/0x0416/*::]*/: { /* n:\"BrtBeginConditionalFormatting14\", */ T:1 },\n\t/*::[*/0x0417/*::]*/: { /* n:\"BrtEndConditionalFormatting14\", */ T:-1 },\n\t/*::[*/0x0418/*::]*/: { /* n:\"BrtBeginCFRule14\", */ T:1 },\n\t/*::[*/0x0419/*::]*/: { /* n:\"BrtEndCFRule14\", */ T:-1 },\n\t/*::[*/0x041A/*::]*/: { /* n:\"BrtCFVO14\" */ },\n\t/*::[*/0x041B/*::]*/: { /* n:\"BrtBeginDatabar14\", */ T:1 },\n\t/*::[*/0x041C/*::]*/: { /* n:\"BrtBeginIconSet14\", */ T:1 },\n\t/*::[*/0x041D/*::]*/: { /* n:\"BrtDVal14\", */ f: parse_BrtDVal14 },\n\t/*::[*/0x041E/*::]*/: { /* n:\"BrtBeginDVals14\", */ T:1 },\n\t/*::[*/0x041F/*::]*/: { /* n:\"BrtColor14\" */ },\n\t/*::[*/0x0420/*::]*/: { /* n:\"BrtBeginSparklines\", */ T:1 },\n\t/*::[*/0x0421/*::]*/: { /* n:\"BrtEndSparklines\", */ T:-1 },\n\t/*::[*/0x0422/*::]*/: { /* n:\"BrtBeginSparklineGroups\", */ T:1 },\n\t/*::[*/0x0423/*::]*/: { /* n:\"BrtEndSparklineGroups\", */ T:-1 },\n\t/*::[*/0x0425/*::]*/: { /* n:\"BrtSXVD14\" */ },\n\t/*::[*/0x0426/*::]*/: { /* n:\"BrtBeginSXView14\", */ T:1 },\n\t/*::[*/0x0427/*::]*/: { /* n:\"BrtEndSXView14\", */ T:-1 },\n\t/*::[*/0x0428/*::]*/: { /* n:\"BrtBeginSXView16\", */ T:1 },\n\t/*::[*/0x0429/*::]*/: { /* n:\"BrtEndSXView16\", */ T:-1 },\n\t/*::[*/0x042A/*::]*/: { /* n:\"BrtBeginPCD14\", */ T:1 },\n\t/*::[*/0x042B/*::]*/: { /* n:\"BrtEndPCD14\", */ T:-1 },\n\t/*::[*/0x042C/*::]*/: { /* n:\"BrtBeginExtConn14\", */ T:1 },\n\t/*::[*/0x042D/*::]*/: { /* n:\"BrtEndExtConn14\", */ T:-1 },\n\t/*::[*/0x042E/*::]*/: { /* n:\"BrtBeginSlicerCacheIDs\", */ T:1 },\n\t/*::[*/0x042F/*::]*/: { /* n:\"BrtEndSlicerCacheIDs\", */ T:-1 },\n\t/*::[*/0x0430/*::]*/: { /* n:\"BrtBeginSlicerCacheID\", */ T:1 },\n\t/*::[*/0x0431/*::]*/: { /* n:\"BrtEndSlicerCacheID\", */ T:-1 },\n\t/*::[*/0x0433/*::]*/: { /* n:\"BrtBeginSlicerCache\", */ T:1 },\n\t/*::[*/0x0434/*::]*/: { /* n:\"BrtEndSlicerCache\", */ T:-1 },\n\t/*::[*/0x0435/*::]*/: { /* n:\"BrtBeginSlicerCacheDef\", */ T:1 },\n\t/*::[*/0x0436/*::]*/: { /* n:\"BrtEndSlicerCacheDef\", */ T:-1 },\n\t/*::[*/0x0437/*::]*/: { /* n:\"BrtBeginSlicersEx\", */ T:1 },\n\t/*::[*/0x0438/*::]*/: { /* n:\"BrtEndSlicersEx\", */ T:-1 },\n\t/*::[*/0x0439/*::]*/: { /* n:\"BrtBeginSlicerEx\", */ T:1 },\n\t/*::[*/0x043A/*::]*/: { /* n:\"BrtEndSlicerEx\", */ T:-1 },\n\t/*::[*/0x043B/*::]*/: { /* n:\"BrtBeginSlicer\", */ T:1 },\n\t/*::[*/0x043C/*::]*/: { /* n:\"BrtEndSlicer\", */ T:-1 },\n\t/*::[*/0x043D/*::]*/: { /* n:\"BrtSlicerCachePivotTables\" */ },\n\t/*::[*/0x043E/*::]*/: { /* n:\"BrtBeginSlicerCacheOlapImpl\", */ T:1 },\n\t/*::[*/0x043F/*::]*/: { /* n:\"BrtEndSlicerCacheOlapImpl\", */ T:-1 },\n\t/*::[*/0x0440/*::]*/: { /* n:\"BrtBeginSlicerCacheLevelsData\", */ T:1 },\n\t/*::[*/0x0441/*::]*/: { /* n:\"BrtEndSlicerCacheLevelsData\", */ T:-1 },\n\t/*::[*/0x0442/*::]*/: { /* n:\"BrtBeginSlicerCacheLevelData\", */ T:1 },\n\t/*::[*/0x0443/*::]*/: { /* n:\"BrtEndSlicerCacheLevelData\", */ T:-1 },\n\t/*::[*/0x0444/*::]*/: { /* n:\"BrtBeginSlicerCacheSiRanges\", */ T:1 },\n\t/*::[*/0x0445/*::]*/: { /* n:\"BrtEndSlicerCacheSiRanges\", */ T:-1 },\n\t/*::[*/0x0446/*::]*/: { /* n:\"BrtBeginSlicerCacheSiRange\", */ T:1 },\n\t/*::[*/0x0447/*::]*/: { /* n:\"BrtEndSlicerCacheSiRange\", */ T:-1 },\n\t/*::[*/0x0448/*::]*/: { /* n:\"BrtSlicerCacheOlapItem\" */ },\n\t/*::[*/0x0449/*::]*/: { /* n:\"BrtBeginSlicerCacheSelections\", */ T:1 },\n\t/*::[*/0x044A/*::]*/: { /* n:\"BrtSlicerCacheSelection\" */ },\n\t/*::[*/0x044B/*::]*/: { /* n:\"BrtEndSlicerCacheSelections\", */ T:-1 },\n\t/*::[*/0x044C/*::]*/: { /* n:\"BrtBeginSlicerCacheNative\", */ T:1 },\n\t/*::[*/0x044D/*::]*/: { /* n:\"BrtEndSlicerCacheNative\", */ T:-1 },\n\t/*::[*/0x044E/*::]*/: { /* n:\"BrtSlicerCacheNativeItem\" */ },\n\t/*::[*/0x044F/*::]*/: { /* n:\"BrtRangeProtection14\" */ },\n\t/*::[*/0x0450/*::]*/: { /* n:\"BrtRangeProtectionIso14\" */ },\n\t/*::[*/0x0451/*::]*/: { /* n:\"BrtCellIgnoreEC14\" */ },\n\t/*::[*/0x0457/*::]*/: { /* n:\"BrtList14\" */ },\n\t/*::[*/0x0458/*::]*/: { /* n:\"BrtCFIcon\" */ },\n\t/*::[*/0x0459/*::]*/: { /* n:\"BrtBeginSlicerCachesPivotCacheIDs\", */ T:1 },\n\t/*::[*/0x045A/*::]*/: { /* n:\"BrtEndSlicerCachesPivotCacheIDs\", */ T:-1 },\n\t/*::[*/0x045B/*::]*/: { /* n:\"BrtBeginSlicers\", */ T:1 },\n\t/*::[*/0x045C/*::]*/: { /* n:\"BrtEndSlicers\", */ T:-1 },\n\t/*::[*/0x045D/*::]*/: { /* n:\"BrtWbProp14\" */ },\n\t/*::[*/0x045E/*::]*/: { /* n:\"BrtBeginSXEdit\", */ T:1 },\n\t/*::[*/0x045F/*::]*/: { /* n:\"BrtEndSXEdit\", */ T:-1 },\n\t/*::[*/0x0460/*::]*/: { /* n:\"BrtBeginSXEdits\", */ T:1 },\n\t/*::[*/0x0461/*::]*/: { /* n:\"BrtEndSXEdits\", */ T:-1 },\n\t/*::[*/0x0462/*::]*/: { /* n:\"BrtBeginSXChange\", */ T:1 },\n\t/*::[*/0x0463/*::]*/: { /* n:\"BrtEndSXChange\", */ T:-1 },\n\t/*::[*/0x0464/*::]*/: { /* n:\"BrtBeginSXChanges\", */ T:1 },\n\t/*::[*/0x0465/*::]*/: { /* n:\"BrtEndSXChanges\", */ T:-1 },\n\t/*::[*/0x0466/*::]*/: { /* n:\"BrtSXTupleItems\" */ },\n\t/*::[*/0x0468/*::]*/: { /* n:\"BrtBeginSlicerStyle\", */ T:1 },\n\t/*::[*/0x0469/*::]*/: { /* n:\"BrtEndSlicerStyle\", */ T:-1 },\n\t/*::[*/0x046A/*::]*/: { /* n:\"BrtSlicerStyleElement\" */ },\n\t/*::[*/0x046B/*::]*/: { /* n:\"BrtBeginStyleSheetExt14\", */ T:1 },\n\t/*::[*/0x046C/*::]*/: { /* n:\"BrtEndStyleSheetExt14\", */ T:-1 },\n\t/*::[*/0x046D/*::]*/: { /* n:\"BrtBeginSlicerCachesPivotCacheID\", */ T:1 },\n\t/*::[*/0x046E/*::]*/: { /* n:\"BrtEndSlicerCachesPivotCacheID\", */ T:-1 },\n\t/*::[*/0x046F/*::]*/: { /* n:\"BrtBeginConditionalFormattings\", */ T:1 },\n\t/*::[*/0x0470/*::]*/: { /* n:\"BrtEndConditionalFormattings\", */ T:-1 },\n\t/*::[*/0x0471/*::]*/: { /* n:\"BrtBeginPCDCalcMemExt\", */ T:1 },\n\t/*::[*/0x0472/*::]*/: { /* n:\"BrtEndPCDCalcMemExt\", */ T:-1 },\n\t/*::[*/0x0473/*::]*/: { /* n:\"BrtBeginPCDCalcMemsExt\", */ T:1 },\n\t/*::[*/0x0474/*::]*/: { /* n:\"BrtEndPCDCalcMemsExt\", */ T:-1 },\n\t/*::[*/0x0475/*::]*/: { /* n:\"BrtPCDField14\" */ },\n\t/*::[*/0x0476/*::]*/: { /* n:\"BrtBeginSlicerStyles\", */ T:1 },\n\t/*::[*/0x0477/*::]*/: { /* n:\"BrtEndSlicerStyles\", */ T:-1 },\n\t/*::[*/0x0478/*::]*/: { /* n:\"BrtBeginSlicerStyleElements\", */ T:1 },\n\t/*::[*/0x0479/*::]*/: { /* n:\"BrtEndSlicerStyleElements\", */ T:-1 },\n\t/*::[*/0x047A/*::]*/: { /* n:\"BrtCFRuleExt\" */ },\n\t/*::[*/0x047B/*::]*/: { /* n:\"BrtBeginSXCondFmt14\", */ T:1 },\n\t/*::[*/0x047C/*::]*/: { /* n:\"BrtEndSXCondFmt14\", */ T:-1 },\n\t/*::[*/0x047D/*::]*/: { /* n:\"BrtBeginSXCondFmts14\", */ T:1 },\n\t/*::[*/0x047E/*::]*/: { /* n:\"BrtEndSXCondFmts14\", */ T:-1 },\n\t/*::[*/0x0480/*::]*/: { /* n:\"BrtBeginSortCond14\", */ T:1 },\n\t/*::[*/0x0481/*::]*/: { /* n:\"BrtEndSortCond14\", */ T:-1 },\n\t/*::[*/0x0482/*::]*/: { /* n:\"BrtEndDVals14\", */ T:-1 },\n\t/*::[*/0x0483/*::]*/: { /* n:\"BrtEndIconSet14\", */ T:-1 },\n\t/*::[*/0x0484/*::]*/: { /* n:\"BrtEndDatabar14\", */ T:-1 },\n\t/*::[*/0x0485/*::]*/: { /* n:\"BrtBeginColorScale14\", */ T:1 },\n\t/*::[*/0x0486/*::]*/: { /* n:\"BrtEndColorScale14\", */ T:-1 },\n\t/*::[*/0x0487/*::]*/: { /* n:\"BrtBeginSxrules14\", */ T:1 },\n\t/*::[*/0x0488/*::]*/: { /* n:\"BrtEndSxrules14\", */ T:-1 },\n\t/*::[*/0x0489/*::]*/: { /* n:\"BrtBeginPRule14\", */ T:1 },\n\t/*::[*/0x048A/*::]*/: { /* n:\"BrtEndPRule14\", */ T:-1 },\n\t/*::[*/0x048B/*::]*/: { /* n:\"BrtBeginPRFilters14\", */ T:1 },\n\t/*::[*/0x048C/*::]*/: { /* n:\"BrtEndPRFilters14\", */ T:-1 },\n\t/*::[*/0x048D/*::]*/: { /* n:\"BrtBeginPRFilter14\", */ T:1 },\n\t/*::[*/0x048E/*::]*/: { /* n:\"BrtEndPRFilter14\", */ T:-1 },\n\t/*::[*/0x048F/*::]*/: { /* n:\"BrtBeginPRFItem14\", */ T:1 },\n\t/*::[*/0x0490/*::]*/: { /* n:\"BrtEndPRFItem14\", */ T:-1 },\n\t/*::[*/0x0491/*::]*/: { /* n:\"BrtBeginCellIgnoreECs14\", */ T:1 },\n\t/*::[*/0x0492/*::]*/: { /* n:\"BrtEndCellIgnoreECs14\", */ T:-1 },\n\t/*::[*/0x0493/*::]*/: { /* n:\"BrtDxf14\" */ },\n\t/*::[*/0x0494/*::]*/: { /* n:\"BrtBeginDxF14s\", */ T:1 },\n\t/*::[*/0x0495/*::]*/: { /* n:\"BrtEndDxf14s\", */ T:-1 },\n\t/*::[*/0x0499/*::]*/: { /* n:\"BrtFilter14\" */ },\n\t/*::[*/0x049A/*::]*/: { /* n:\"BrtBeginCustomFilters14\", */ T:1 },\n\t/*::[*/0x049C/*::]*/: { /* n:\"BrtCustomFilter14\" */ },\n\t/*::[*/0x049D/*::]*/: { /* n:\"BrtIconFilter14\" */ },\n\t/*::[*/0x049E/*::]*/: { /* n:\"BrtPivotCacheConnectionName\" */ },\n\t/*::[*/0x0800/*::]*/: { /* n:\"BrtBeginDecoupledPivotCacheIDs\", */ T:1 },\n\t/*::[*/0x0801/*::]*/: { /* n:\"BrtEndDecoupledPivotCacheIDs\", */ T:-1 },\n\t/*::[*/0x0802/*::]*/: { /* n:\"BrtDecoupledPivotCacheID\" */ },\n\t/*::[*/0x0803/*::]*/: { /* n:\"BrtBeginPivotTableRefs\", */ T:1 },\n\t/*::[*/0x0804/*::]*/: { /* n:\"BrtEndPivotTableRefs\", */ T:-1 },\n\t/*::[*/0x0805/*::]*/: { /* n:\"BrtPivotTableRef\" */ },\n\t/*::[*/0x0806/*::]*/: { /* n:\"BrtSlicerCacheBookPivotTables\" */ },\n\t/*::[*/0x0807/*::]*/: { /* n:\"BrtBeginSxvcells\", */ T:1 },\n\t/*::[*/0x0808/*::]*/: { /* n:\"BrtEndSxvcells\", */ T:-1 },\n\t/*::[*/0x0809/*::]*/: { /* n:\"BrtBeginSxRow\", */ T:1 },\n\t/*::[*/0x080A/*::]*/: { /* n:\"BrtEndSxRow\", */ T:-1 },\n\t/*::[*/0x080C/*::]*/: { /* n:\"BrtPcdCalcMem15\" */ },\n\t/*::[*/0x0813/*::]*/: { /* n:\"BrtQsi15\" */ },\n\t/*::[*/0x0814/*::]*/: { /* n:\"BrtBeginWebExtensions\", */ T:1 },\n\t/*::[*/0x0815/*::]*/: { /* n:\"BrtEndWebExtensions\", */ T:-1 },\n\t/*::[*/0x0816/*::]*/: { /* n:\"BrtWebExtension\" */ },\n\t/*::[*/0x0817/*::]*/: { /* n:\"BrtAbsPath15\" */ },\n\t/*::[*/0x0818/*::]*/: { /* n:\"BrtBeginPivotTableUISettings\", */ T:1 },\n\t/*::[*/0x0819/*::]*/: { /* n:\"BrtEndPivotTableUISettings\", */ T:-1 },\n\t/*::[*/0x081B/*::]*/: { /* n:\"BrtTableSlicerCacheIDs\" */ },\n\t/*::[*/0x081C/*::]*/: { /* n:\"BrtTableSlicerCacheID\" */ },\n\t/*::[*/0x081D/*::]*/: { /* n:\"BrtBeginTableSlicerCache\", */ T:1 },\n\t/*::[*/0x081E/*::]*/: { /* n:\"BrtEndTableSlicerCache\", */ T:-1 },\n\t/*::[*/0x081F/*::]*/: { /* n:\"BrtSxFilter15\" */ },\n\t/*::[*/0x0820/*::]*/: { /* n:\"BrtBeginTimelineCachePivotCacheIDs\", */ T:1 },\n\t/*::[*/0x0821/*::]*/: { /* n:\"BrtEndTimelineCachePivotCacheIDs\", */ T:-1 },\n\t/*::[*/0x0822/*::]*/: { /* n:\"BrtTimelineCachePivotCacheID\" */ },\n\t/*::[*/0x0823/*::]*/: { /* n:\"BrtBeginTimelineCacheIDs\", */ T:1 },\n\t/*::[*/0x0824/*::]*/: { /* n:\"BrtEndTimelineCacheIDs\", */ T:-1 },\n\t/*::[*/0x0825/*::]*/: { /* n:\"BrtBeginTimelineCacheID\", */ T:1 },\n\t/*::[*/0x0826/*::]*/: { /* n:\"BrtEndTimelineCacheID\", */ T:-1 },\n\t/*::[*/0x0827/*::]*/: { /* n:\"BrtBeginTimelinesEx\", */ T:1 },\n\t/*::[*/0x0828/*::]*/: { /* n:\"BrtEndTimelinesEx\", */ T:-1 },\n\t/*::[*/0x0829/*::]*/: { /* n:\"BrtBeginTimelineEx\", */ T:1 },\n\t/*::[*/0x082A/*::]*/: { /* n:\"BrtEndTimelineEx\", */ T:-1 },\n\t/*::[*/0x082B/*::]*/: { /* n:\"BrtWorkBookPr15\" */ },\n\t/*::[*/0x082C/*::]*/: { /* n:\"BrtPCDH15\" */ },\n\t/*::[*/0x082D/*::]*/: { /* n:\"BrtBeginTimelineStyle\", */ T:1 },\n\t/*::[*/0x082E/*::]*/: { /* n:\"BrtEndTimelineStyle\", */ T:-1 },\n\t/*::[*/0x082F/*::]*/: { /* n:\"BrtTimelineStyleElement\" */ },\n\t/*::[*/0x0830/*::]*/: { /* n:\"BrtBeginTimelineStylesheetExt15\", */ T:1 },\n\t/*::[*/0x0831/*::]*/: { /* n:\"BrtEndTimelineStylesheetExt15\", */ T:-1 },\n\t/*::[*/0x0832/*::]*/: { /* n:\"BrtBeginTimelineStyles\", */ T:1 },\n\t/*::[*/0x0833/*::]*/: { /* n:\"BrtEndTimelineStyles\", */ T:-1 },\n\t/*::[*/0x0834/*::]*/: { /* n:\"BrtBeginTimelineStyleElements\", */ T:1 },\n\t/*::[*/0x0835/*::]*/: { /* n:\"BrtEndTimelineStyleElements\", */ T:-1 },\n\t/*::[*/0x0836/*::]*/: { /* n:\"BrtDxf15\" */ },\n\t/*::[*/0x0837/*::]*/: { /* n:\"BrtBeginDxfs15\", */ T:1 },\n\t/*::[*/0x0838/*::]*/: { /* n:\"BrtEndDxfs15\", */ T:-1 },\n\t/*::[*/0x0839/*::]*/: { /* n:\"BrtSlicerCacheHideItemsWithNoData\" */ },\n\t/*::[*/0x083A/*::]*/: { /* n:\"BrtBeginItemUniqueNames\", */ T:1 },\n\t/*::[*/0x083B/*::]*/: { /* n:\"BrtEndItemUniqueNames\", */ T:-1 },\n\t/*::[*/0x083C/*::]*/: { /* n:\"BrtItemUniqueName\" */ },\n\t/*::[*/0x083D/*::]*/: { /* n:\"BrtBeginExtConn15\", */ T:1 },\n\t/*::[*/0x083E/*::]*/: { /* n:\"BrtEndExtConn15\", */ T:-1 },\n\t/*::[*/0x083F/*::]*/: { /* n:\"BrtBeginOledbPr15\", */ T:1 },\n\t/*::[*/0x0840/*::]*/: { /* n:\"BrtEndOledbPr15\", */ T:-1 },\n\t/*::[*/0x0841/*::]*/: { /* n:\"BrtBeginDataFeedPr15\", */ T:1 },\n\t/*::[*/0x0842/*::]*/: { /* n:\"BrtEndDataFeedPr15\", */ T:-1 },\n\t/*::[*/0x0843/*::]*/: { /* n:\"BrtTextPr15\" */ },\n\t/*::[*/0x0844/*::]*/: { /* n:\"BrtRangePr15\" */ },\n\t/*::[*/0x0845/*::]*/: { /* n:\"BrtDbCommand15\" */ },\n\t/*::[*/0x0846/*::]*/: { /* n:\"BrtBeginDbTables15\", */ T:1 },\n\t/*::[*/0x0847/*::]*/: { /* n:\"BrtEndDbTables15\", */ T:-1 },\n\t/*::[*/0x0848/*::]*/: { /* n:\"BrtDbTable15\" */ },\n\t/*::[*/0x0849/*::]*/: { /* n:\"BrtBeginDataModel\", */ T:1 },\n\t/*::[*/0x084A/*::]*/: { /* n:\"BrtEndDataModel\", */ T:-1 },\n\t/*::[*/0x084B/*::]*/: { /* n:\"BrtBeginModelTables\", */ T:1 },\n\t/*::[*/0x084C/*::]*/: { /* n:\"BrtEndModelTables\", */ T:-1 },\n\t/*::[*/0x084D/*::]*/: { /* n:\"BrtModelTable\" */ },\n\t/*::[*/0x084E/*::]*/: { /* n:\"BrtBeginModelRelationships\", */ T:1 },\n\t/*::[*/0x084F/*::]*/: { /* n:\"BrtEndModelRelationships\", */ T:-1 },\n\t/*::[*/0x0850/*::]*/: { /* n:\"BrtModelRelationship\" */ },\n\t/*::[*/0x0851/*::]*/: { /* n:\"BrtBeginECTxtWiz15\", */ T:1 },\n\t/*::[*/0x0852/*::]*/: { /* n:\"BrtEndECTxtWiz15\", */ T:-1 },\n\t/*::[*/0x0853/*::]*/: { /* n:\"BrtBeginECTWFldInfoLst15\", */ T:1 },\n\t/*::[*/0x0854/*::]*/: { /* n:\"BrtEndECTWFldInfoLst15\", */ T:-1 },\n\t/*::[*/0x0855/*::]*/: { /* n:\"BrtBeginECTWFldInfo15\", */ T:1 },\n\t/*::[*/0x0856/*::]*/: { /* n:\"BrtFieldListActiveItem\" */ },\n\t/*::[*/0x0857/*::]*/: { /* n:\"BrtPivotCacheIdVersion\" */ },\n\t/*::[*/0x0858/*::]*/: { /* n:\"BrtSXDI15\" */ },\n\t/*::[*/0x0859/*::]*/: { /* n:\"BrtBeginModelTimeGroupings\", */ T:1 },\n\t/*::[*/0x085A/*::]*/: { /* n:\"BrtEndModelTimeGroupings\", */ T:-1 },\n\t/*::[*/0x085B/*::]*/: { /* n:\"BrtBeginModelTimeGrouping\", */ T:1 },\n\t/*::[*/0x085C/*::]*/: { /* n:\"BrtEndModelTimeGrouping\", */ T:-1 },\n\t/*::[*/0x085D/*::]*/: { /* n:\"BrtModelTimeGroupingCalcCol\" */ },\n\t/*::[*/0x0C00/*::]*/: { /* n:\"BrtUid\" */ },\n\t/*::[*/0x0C01/*::]*/: { /* n:\"BrtRevisionPtr\" */ },\n\t/*::[*/0x1000/*::]*/: { /* n:\"BrtBeginDynamicArrayPr\", */ T:1 },\n\t/*::[*/0x1001/*::]*/: { /* n:\"BrtEndDynamicArrayPr\", */ T:-1 },\n\t/*::[*/0x138A/*::]*/: { /* n:\"BrtBeginRichValueBlock\", */ T:1 },\n\t/*::[*/0x138B/*::]*/: { /* n:\"BrtEndRichValueBlock\", */ T:-1 },\n\t/*::[*/0x13D9/*::]*/: { /* n:\"BrtBeginRichFilters\", */ T:1 },\n\t/*::[*/0x13DA/*::]*/: { /* n:\"BrtEndRichFilters\", */ T:-1 },\n\t/*::[*/0x13DB/*::]*/: { /* n:\"BrtRichFilter\" */ },\n\t/*::[*/0x13DC/*::]*/: { /* n:\"BrtBeginRichFilterColumn\", */ T:1 },\n\t/*::[*/0x13DD/*::]*/: { /* n:\"BrtEndRichFilterColumn\", */ T:-1 },\n\t/*::[*/0x13DE/*::]*/: { /* n:\"BrtBeginCustomRichFilters\", */ T:1 },\n\t/*::[*/0x13DF/*::]*/: { /* n:\"BrtEndCustomRichFilters\", */ T:-1 },\n\t/*::[*/0x13E0/*::]*/: { /* n:\"BrtCustomRichFilter\" */ },\n\t/*::[*/0x13E1/*::]*/: { /* n:\"BrtTop10RichFilter\" */ },\n\t/*::[*/0x13E2/*::]*/: { /* n:\"BrtDynamicRichFilter\" */ },\n\t/*::[*/0x13E4/*::]*/: { /* n:\"BrtBeginRichSortCondition\", */ T:1 },\n\t/*::[*/0x13E5/*::]*/: { /* n:\"BrtEndRichSortCondition\", */ T:-1 },\n\t/*::[*/0x13E6/*::]*/: { /* n:\"BrtRichFilterDateGroupItem\" */ },\n\t/*::[*/0x13E7/*::]*/: { /* n:\"BrtBeginCalcFeatures\", */ T:1 },\n\t/*::[*/0x13E8/*::]*/: { /* n:\"BrtEndCalcFeatures\", */ T:-1 },\n\t/*::[*/0x13E9/*::]*/: { /* n:\"BrtCalcFeature\" */ },\n\t/*::[*/0x13EB/*::]*/: { /* n:\"BrtExternalLinksPr\" */ },\n\t/*::[*/0xFFFF/*::]*/: { n:\"\" }\n};\n\n/* [MS-XLS] 2.3 Record Enumeration (and other sources) */\nvar XLSRecordEnum = {\n\t/* [MS-XLS] 2.3 Record Enumeration 2021-08-17 */\n\t/*::[*/0x0006/*::]*/: { /* n:\"Formula\", */ f:parse_Formula },\n\t/*::[*/0x000a/*::]*/: { /* n:\"EOF\", */ f:parsenoop2 },\n\t/*::[*/0x000c/*::]*/: { /* n:\"CalcCount\", */ f:parseuint16 }, //\n\t/*::[*/0x000d/*::]*/: { /* n:\"CalcMode\", */ f:parseuint16 }, //\n\t/*::[*/0x000e/*::]*/: { /* n:\"CalcPrecision\", */ f:parsebool }, //\n\t/*::[*/0x000f/*::]*/: { /* n:\"CalcRefMode\", */ f:parsebool }, //\n\t/*::[*/0x0010/*::]*/: { /* n:\"CalcDelta\", */ f:parse_Xnum }, //\n\t/*::[*/0x0011/*::]*/: { /* n:\"CalcIter\", */ f:parsebool }, //\n\t/*::[*/0x0012/*::]*/: { /* n:\"Protect\", */ f:parsebool },\n\t/*::[*/0x0013/*::]*/: { /* n:\"Password\", */ f:parseuint16 },\n\t/*::[*/0x0014/*::]*/: { /* n:\"Header\", */ f:parse_XLHeaderFooter },\n\t/*::[*/0x0015/*::]*/: { /* n:\"Footer\", */ f:parse_XLHeaderFooter },\n\t/*::[*/0x0017/*::]*/: { /* n:\"ExternSheet\", */ f:parse_ExternSheet },\n\t/*::[*/0x0018/*::]*/: { /* n:\"Lbl\", */ f:parse_Lbl },\n\t/*::[*/0x0019/*::]*/: { /* n:\"WinProtect\", */ f:parsebool },\n\t/*::[*/0x001a/*::]*/: { /* n:\"VerticalPageBreaks\", */ },\n\t/*::[*/0x001b/*::]*/: { /* n:\"HorizontalPageBreaks\", */ },\n\t/*::[*/0x001c/*::]*/: { /* n:\"Note\", */ f:parse_Note },\n\t/*::[*/0x001d/*::]*/: { /* n:\"Selection\", */ },\n\t/*::[*/0x0022/*::]*/: { /* n:\"Date1904\", */ f:parsebool },\n\t/*::[*/0x0023/*::]*/: { /* n:\"ExternName\", */ f:parse_ExternName },\n\t/*::[*/0x0026/*::]*/: { /* n:\"LeftMargin\", */ f:parse_Xnum }, // *\n\t/*::[*/0x0027/*::]*/: { /* n:\"RightMargin\", */ f:parse_Xnum }, // *\n\t/*::[*/0x0028/*::]*/: { /* n:\"TopMargin\", */ f:parse_Xnum }, // *\n\t/*::[*/0x0029/*::]*/: { /* n:\"BottomMargin\", */ f:parse_Xnum }, // *\n\t/*::[*/0x002a/*::]*/: { /* n:\"PrintRowCol\", */ f:parsebool },\n\t/*::[*/0x002b/*::]*/: { /* n:\"PrintGrid\", */ f:parsebool },\n\t/*::[*/0x002f/*::]*/: { /* n:\"FilePass\", */ f:parse_FilePass },\n\t/*::[*/0x0031/*::]*/: { /* n:\"Font\", */ f:parse_Font },\n\t/*::[*/0x0033/*::]*/: { /* n:\"PrintSize\", */ f:parseuint16 },\n\t/*::[*/0x003c/*::]*/: { /* n:\"Continue\", */ },\n\t/*::[*/0x003d/*::]*/: { /* n:\"Window1\", */ f:parse_Window1 },\n\t/*::[*/0x0040/*::]*/: { /* n:\"Backup\", */ f:parsebool },\n\t/*::[*/0x0041/*::]*/: { /* n:\"Pane\", */ f:parse_Pane },\n\t/*::[*/0x0042/*::]*/: { /* n:\"CodePage\", */ f:parseuint16 },\n\t/*::[*/0x004d/*::]*/: { /* n:\"Pls\", */ },\n\t/*::[*/0x0050/*::]*/: { /* n:\"DCon\", */ },\n\t/*::[*/0x0051/*::]*/: { /* n:\"DConRef\", */ },\n\t/*::[*/0x0052/*::]*/: { /* n:\"DConName\", */ },\n\t/*::[*/0x0055/*::]*/: { /* n:\"DefColWidth\", */ f:parseuint16 },\n\t/*::[*/0x0059/*::]*/: { /* n:\"XCT\", */ },\n\t/*::[*/0x005a/*::]*/: { /* n:\"CRN\", */ },\n\t/*::[*/0x005b/*::]*/: { /* n:\"FileSharing\", */ },\n\t/*::[*/0x005c/*::]*/: { /* n:\"WriteAccess\", */ f:parse_WriteAccess },\n\t/*::[*/0x005d/*::]*/: { /* n:\"Obj\", */ f:parse_Obj },\n\t/*::[*/0x005e/*::]*/: { /* n:\"Uncalced\", */ },\n\t/*::[*/0x005f/*::]*/: { /* n:\"CalcSaveRecalc\", */ f:parsebool }, //\n\t/*::[*/0x0060/*::]*/: { /* n:\"Template\", */ },\n\t/*::[*/0x0061/*::]*/: { /* n:\"Intl\", */ },\n\t/*::[*/0x0063/*::]*/: { /* n:\"ObjProtect\", */ f:parsebool },\n\t/*::[*/0x007d/*::]*/: { /* n:\"ColInfo\", */ f:parse_ColInfo },\n\t/*::[*/0x0080/*::]*/: { /* n:\"Guts\", */ f:parse_Guts },\n\t/*::[*/0x0081/*::]*/: { /* n:\"WsBool\", */ f:parse_WsBool },\n\t/*::[*/0x0082/*::]*/: { /* n:\"GridSet\", */ f:parseuint16 },\n\t/*::[*/0x0083/*::]*/: { /* n:\"HCenter\", */ f:parsebool },\n\t/*::[*/0x0084/*::]*/: { /* n:\"VCenter\", */ f:parsebool },\n\t/*::[*/0x0085/*::]*/: { /* n:\"BoundSheet8\", */ f:parse_BoundSheet8 },\n\t/*::[*/0x0086/*::]*/: { /* n:\"WriteProtect\", */ },\n\t/*::[*/0x008c/*::]*/: { /* n:\"Country\", */ f:parse_Country },\n\t/*::[*/0x008d/*::]*/: { /* n:\"HideObj\", */ f:parseuint16 },\n\t/*::[*/0x0090/*::]*/: { /* n:\"Sort\", */ },\n\t/*::[*/0x0092/*::]*/: { /* n:\"Palette\", */ f:parse_Palette },\n\t/*::[*/0x0097/*::]*/: { /* n:\"Sync\", */ },\n\t/*::[*/0x0098/*::]*/: { /* n:\"LPr\", */ },\n\t/*::[*/0x0099/*::]*/: { /* n:\"DxGCol\", */ },\n\t/*::[*/0x009a/*::]*/: { /* n:\"FnGroupName\", */ },\n\t/*::[*/0x009b/*::]*/: { /* n:\"FilterMode\", */ },\n\t/*::[*/0x009c/*::]*/: { /* n:\"BuiltInFnGroupCount\", */ f:parseuint16 },\n\t/*::[*/0x009d/*::]*/: { /* n:\"AutoFilterInfo\", */ },\n\t/*::[*/0x009e/*::]*/: { /* n:\"AutoFilter\", */ },\n\t/*::[*/0x00a0/*::]*/: { /* n:\"Scl\", */ f:parse_Scl },\n\t/*::[*/0x00a1/*::]*/: { /* n:\"Setup\", */ f:parse_Setup },\n\t/*::[*/0x00ae/*::]*/: { /* n:\"ScenMan\", */ },\n\t/*::[*/0x00af/*::]*/: { /* n:\"SCENARIO\", */ },\n\t/*::[*/0x00b0/*::]*/: { /* n:\"SxView\", */ },\n\t/*::[*/0x00b1/*::]*/: { /* n:\"Sxvd\", */ },\n\t/*::[*/0x00b2/*::]*/: { /* n:\"SXVI\", */ },\n\t/*::[*/0x00b4/*::]*/: { /* n:\"SxIvd\", */ },\n\t/*::[*/0x00b5/*::]*/: { /* n:\"SXLI\", */ },\n\t/*::[*/0x00b6/*::]*/: { /* n:\"SXPI\", */ },\n\t/*::[*/0x00b8/*::]*/: { /* n:\"DocRoute\", */ },\n\t/*::[*/0x00b9/*::]*/: { /* n:\"RecipName\", */ },\n\t/*::[*/0x00bd/*::]*/: { /* n:\"MulRk\", */ f:parse_MulRk },\n\t/*::[*/0x00be/*::]*/: { /* n:\"MulBlank\", */ f:parse_MulBlank },\n\t/*::[*/0x00c1/*::]*/: { /* n:\"Mms\", */ f:parsenoop2 },\n\t/*::[*/0x00c5/*::]*/: { /* n:\"SXDI\", */ },\n\t/*::[*/0x00c6/*::]*/: { /* n:\"SXDB\", */ },\n\t/*::[*/0x00c7/*::]*/: { /* n:\"SXFDB\", */ },\n\t/*::[*/0x00c8/*::]*/: { /* n:\"SXDBB\", */ },\n\t/*::[*/0x00c9/*::]*/: { /* n:\"SXNum\", */ },\n\t/*::[*/0x00ca/*::]*/: { /* n:\"SxBool\", */ f:parsebool },\n\t/*::[*/0x00cb/*::]*/: { /* n:\"SxErr\", */ },\n\t/*::[*/0x00cc/*::]*/: { /* n:\"SXInt\", */ },\n\t/*::[*/0x00cd/*::]*/: { /* n:\"SXString\", */ },\n\t/*::[*/0x00ce/*::]*/: { /* n:\"SXDtr\", */ },\n\t/*::[*/0x00cf/*::]*/: { /* n:\"SxNil\", */ },\n\t/*::[*/0x00d0/*::]*/: { /* n:\"SXTbl\", */ },\n\t/*::[*/0x00d1/*::]*/: { /* n:\"SXTBRGIITM\", */ },\n\t/*::[*/0x00d2/*::]*/: { /* n:\"SxTbpg\", */ },\n\t/*::[*/0x00d3/*::]*/: { /* n:\"ObProj\", */ },\n\t/*::[*/0x00d5/*::]*/: { /* n:\"SXStreamID\", */ },\n\t/*::[*/0x00d7/*::]*/: { /* n:\"DBCell\", */ },\n\t/*::[*/0x00d8/*::]*/: { /* n:\"SXRng\", */ },\n\t/*::[*/0x00d9/*::]*/: { /* n:\"SxIsxoper\", */ },\n\t/*::[*/0x00da/*::]*/: { /* n:\"BookBool\", */ f:parseuint16 },\n\t/*::[*/0x00dc/*::]*/: { /* n:\"DbOrParamQry\", */ },\n\t/*::[*/0x00dd/*::]*/: { /* n:\"ScenarioProtect\", */ f:parsebool },\n\t/*::[*/0x00de/*::]*/: { /* n:\"OleObjectSize\", */ },\n\t/*::[*/0x00e0/*::]*/: { /* n:\"XF\", */ f:parse_XF },\n\t/*::[*/0x00e1/*::]*/: { /* n:\"InterfaceHdr\", */ f:parse_InterfaceHdr },\n\t/*::[*/0x00e2/*::]*/: { /* n:\"InterfaceEnd\", */ f:parsenoop2 },\n\t/*::[*/0x00e3/*::]*/: { /* n:\"SXVS\", */ },\n\t/*::[*/0x00e5/*::]*/: { /* n:\"MergeCells\", */ f:parse_MergeCells },\n\t/*::[*/0x00e9/*::]*/: { /* n:\"BkHim\", */ },\n\t/*::[*/0x00eb/*::]*/: { /* n:\"MsoDrawingGroup\", */ },\n\t/*::[*/0x00ec/*::]*/: { /* n:\"MsoDrawing\", */ },\n\t/*::[*/0x00ed/*::]*/: { /* n:\"MsoDrawingSelection\", */ },\n\t/*::[*/0x00ef/*::]*/: { /* n:\"PhoneticInfo\", */ },\n\t/*::[*/0x00f0/*::]*/: { /* n:\"SxRule\", */ },\n\t/*::[*/0x00f1/*::]*/: { /* n:\"SXEx\", */ },\n\t/*::[*/0x00f2/*::]*/: { /* n:\"SxFilt\", */ },\n\t/*::[*/0x00f4/*::]*/: { /* n:\"SxDXF\", */ },\n\t/*::[*/0x00f5/*::]*/: { /* n:\"SxItm\", */ },\n\t/*::[*/0x00f6/*::]*/: { /* n:\"SxName\", */ },\n\t/*::[*/0x00f7/*::]*/: { /* n:\"SxSelect\", */ },\n\t/*::[*/0x00f8/*::]*/: { /* n:\"SXPair\", */ },\n\t/*::[*/0x00f9/*::]*/: { /* n:\"SxFmla\", */ },\n\t/*::[*/0x00fb/*::]*/: { /* n:\"SxFormat\", */ },\n\t/*::[*/0x00fc/*::]*/: { /* n:\"SST\", */ f:parse_SST },\n\t/*::[*/0x00fd/*::]*/: { /* n:\"LabelSst\", */ f:parse_LabelSst },\n\t/*::[*/0x00ff/*::]*/: { /* n:\"ExtSST\", */ f:parse_ExtSST },\n\t/*::[*/0x0100/*::]*/: { /* n:\"SXVDEx\", */ },\n\t/*::[*/0x0103/*::]*/: { /* n:\"SXFormula\", */ },\n\t/*::[*/0x0122/*::]*/: { /* n:\"SXDBEx\", */ },\n\t/*::[*/0x0137/*::]*/: { /* n:\"RRDInsDel\", */ },\n\t/*::[*/0x0138/*::]*/: { /* n:\"RRDHead\", */ },\n\t/*::[*/0x013b/*::]*/: { /* n:\"RRDChgCell\", */ },\n\t/*::[*/0x013d/*::]*/: { /* n:\"RRTabId\", */ f:parseuint16a },\n\t/*::[*/0x013e/*::]*/: { /* n:\"RRDRenSheet\", */ },\n\t/*::[*/0x013f/*::]*/: { /* n:\"RRSort\", */ },\n\t/*::[*/0x0140/*::]*/: { /* n:\"RRDMove\", */ },\n\t/*::[*/0x014a/*::]*/: { /* n:\"RRFormat\", */ },\n\t/*::[*/0x014b/*::]*/: { /* n:\"RRAutoFmt\", */ },\n\t/*::[*/0x014d/*::]*/: { /* n:\"RRInsertSh\", */ },\n\t/*::[*/0x014e/*::]*/: { /* n:\"RRDMoveBegin\", */ },\n\t/*::[*/0x014f/*::]*/: { /* n:\"RRDMoveEnd\", */ },\n\t/*::[*/0x0150/*::]*/: { /* n:\"RRDInsDelBegin\", */ },\n\t/*::[*/0x0151/*::]*/: { /* n:\"RRDInsDelEnd\", */ },\n\t/*::[*/0x0152/*::]*/: { /* n:\"RRDConflict\", */ },\n\t/*::[*/0x0153/*::]*/: { /* n:\"RRDDefName\", */ },\n\t/*::[*/0x0154/*::]*/: { /* n:\"RRDRstEtxp\", */ },\n\t/*::[*/0x015f/*::]*/: { /* n:\"LRng\", */ },\n\t/*::[*/0x0160/*::]*/: { /* n:\"UsesELFs\", */ f:parsebool },\n\t/*::[*/0x0161/*::]*/: { /* n:\"DSF\", */ f:parsenoop2 },\n\t/*::[*/0x0191/*::]*/: { /* n:\"CUsr\", */ },\n\t/*::[*/0x0192/*::]*/: { /* n:\"CbUsr\", */ },\n\t/*::[*/0x0193/*::]*/: { /* n:\"UsrInfo\", */ },\n\t/*::[*/0x0194/*::]*/: { /* n:\"UsrExcl\", */ },\n\t/*::[*/0x0195/*::]*/: { /* n:\"FileLock\", */ },\n\t/*::[*/0x0196/*::]*/: { /* n:\"RRDInfo\", */ },\n\t/*::[*/0x0197/*::]*/: { /* n:\"BCUsrs\", */ },\n\t/*::[*/0x0198/*::]*/: { /* n:\"UsrChk\", */ },\n\t/*::[*/0x01a9/*::]*/: { /* n:\"UserBView\", */ },\n\t/*::[*/0x01aa/*::]*/: { /* n:\"UserSViewBegin\", */ },\n\t/*::[*/0x01ab/*::]*/: { /* n:\"UserSViewEnd\", */ },\n\t/*::[*/0x01ac/*::]*/: { /* n:\"RRDUserView\", */ },\n\t/*::[*/0x01ad/*::]*/: { /* n:\"Qsi\", */ },\n\t/*::[*/0x01ae/*::]*/: { /* n:\"SupBook\", */ f:parse_SupBook },\n\t/*::[*/0x01af/*::]*/: { /* n:\"Prot4Rev\", */ f:parsebool },\n\t/*::[*/0x01b0/*::]*/: { /* n:\"CondFmt\", */ },\n\t/*::[*/0x01b1/*::]*/: { /* n:\"CF\", */ },\n\t/*::[*/0x01b2/*::]*/: { /* n:\"DVal\", */ },\n\t/*::[*/0x01b5/*::]*/: { /* n:\"DConBin\", */ },\n\t/*::[*/0x01b6/*::]*/: { /* n:\"TxO\", */ f:parse_TxO },\n\t/*::[*/0x01b7/*::]*/: { /* n:\"RefreshAll\", */ f:parsebool }, //\n\t/*::[*/0x01b8/*::]*/: { /* n:\"HLink\", */ f:parse_HLink },\n\t/*::[*/0x01b9/*::]*/: { /* n:\"Lel\", */ },\n\t/*::[*/0x01ba/*::]*/: { /* n:\"CodeName\", */ f:parse_XLUnicodeString },\n\t/*::[*/0x01bb/*::]*/: { /* n:\"SXFDBType\", */ },\n\t/*::[*/0x01bc/*::]*/: { /* n:\"Prot4RevPass\", */ f:parseuint16 },\n\t/*::[*/0x01bd/*::]*/: { /* n:\"ObNoMacros\", */ },\n\t/*::[*/0x01be/*::]*/: { /* n:\"Dv\", */ },\n\t/*::[*/0x01c0/*::]*/: { /* n:\"Excel9File\", */ f:parsenoop2 },\n\t/*::[*/0x01c1/*::]*/: { /* n:\"RecalcId\", */ f:parse_RecalcId, r:2},\n\t/*::[*/0x01c2/*::]*/: { /* n:\"EntExU2\", */ f:parsenoop2 },\n\t/*::[*/0x0200/*::]*/: { /* n:\"Dimensions\", */ f:parse_Dimensions },\n\t/*::[*/0x0201/*::]*/: { /* n:\"Blank\", */ f:parse_Blank },\n\t/*::[*/0x0203/*::]*/: { /* n:\"Number\", */ f:parse_Number },\n\t/*::[*/0x0204/*::]*/: { /* n:\"Label\", */ f:parse_Label },\n\t/*::[*/0x0205/*::]*/: { /* n:\"BoolErr\", */ f:parse_BoolErr },\n\t/*::[*/0x0207/*::]*/: { /* n:\"String\", */ f:parse_String },\n\t/*::[*/0x0208/*::]*/: { /* n:\"Row\", */ f:parse_Row },\n\t/*::[*/0x020b/*::]*/: { /* n:\"Index\", */ },\n\t/*::[*/0x0221/*::]*/: { /* n:\"Array\", */ f:parse_Array },\n\t/*::[*/0x0225/*::]*/: { /* n:\"DefaultRowHeight\", */ f:parse_DefaultRowHeight },\n\t/*::[*/0x0236/*::]*/: { /* n:\"Table\", */ },\n\t/*::[*/0x023e/*::]*/: { /* n:\"Window2\", */ f:parse_Window2 },\n\t/*::[*/0x027e/*::]*/: { /* n:\"RK\", */ f:parse_RK },\n\t/*::[*/0x0293/*::]*/: { /* n:\"Style\", */ },\n\t/*::[*/0x0418/*::]*/: { /* n:\"BigName\", */ },\n\t/*::[*/0x041e/*::]*/: { /* n:\"Format\", */ f:parse_Format },\n\t/*::[*/0x043c/*::]*/: { /* n:\"ContinueBigName\", */ },\n\t/*::[*/0x04bc/*::]*/: { /* n:\"ShrFmla\", */ f:parse_ShrFmla },\n\t/*::[*/0x0800/*::]*/: { /* n:\"HLinkTooltip\", */ f:parse_HLinkTooltip },\n\t/*::[*/0x0801/*::]*/: { /* n:\"WebPub\", */ },\n\t/*::[*/0x0802/*::]*/: { /* n:\"QsiSXTag\", */ },\n\t/*::[*/0x0803/*::]*/: { /* n:\"DBQueryExt\", */ },\n\t/*::[*/0x0804/*::]*/: { /* n:\"ExtString\", */ },\n\t/*::[*/0x0805/*::]*/: { /* n:\"TxtQry\", */ },\n\t/*::[*/0x0806/*::]*/: { /* n:\"Qsir\", */ },\n\t/*::[*/0x0807/*::]*/: { /* n:\"Qsif\", */ },\n\t/*::[*/0x0808/*::]*/: { /* n:\"RRDTQSIF\", */ },\n\t/*::[*/0x0809/*::]*/: { /* n:\"BOF\", */ f:parse_BOF },\n\t/*::[*/0x080a/*::]*/: { /* n:\"OleDbConn\", */ },\n\t/*::[*/0x080b/*::]*/: { /* n:\"WOpt\", */ },\n\t/*::[*/0x080c/*::]*/: { /* n:\"SXViewEx\", */ },\n\t/*::[*/0x080d/*::]*/: { /* n:\"SXTH\", */ },\n\t/*::[*/0x080e/*::]*/: { /* n:\"SXPIEx\", */ },\n\t/*::[*/0x080f/*::]*/: { /* n:\"SXVDTEx\", */ },\n\t/*::[*/0x0810/*::]*/: { /* n:\"SXViewEx9\", */ },\n\t/*::[*/0x0812/*::]*/: { /* n:\"ContinueFrt\", */ },\n\t/*::[*/0x0813/*::]*/: { /* n:\"RealTimeData\", */ },\n\t/*::[*/0x0850/*::]*/: { /* n:\"ChartFrtInfo\", */ },\n\t/*::[*/0x0851/*::]*/: { /* n:\"FrtWrapper\", */ },\n\t/*::[*/0x0852/*::]*/: { /* n:\"StartBlock\", */ },\n\t/*::[*/0x0853/*::]*/: { /* n:\"EndBlock\", */ },\n\t/*::[*/0x0854/*::]*/: { /* n:\"StartObject\", */ },\n\t/*::[*/0x0855/*::]*/: { /* n:\"EndObject\", */ },\n\t/*::[*/0x0856/*::]*/: { /* n:\"CatLab\", */ },\n\t/*::[*/0x0857/*::]*/: { /* n:\"YMult\", */ },\n\t/*::[*/0x0858/*::]*/: { /* n:\"SXViewLink\", */ },\n\t/*::[*/0x0859/*::]*/: { /* n:\"PivotChartBits\", */ },\n\t/*::[*/0x085a/*::]*/: { /* n:\"FrtFontList\", */ },\n\t/*::[*/0x0862/*::]*/: { /* n:\"SheetExt\", */ },\n\t/*::[*/0x0863/*::]*/: { /* n:\"BookExt\", */ r:12},\n\t/*::[*/0x0864/*::]*/: { /* n:\"SXAddl\", */ },\n\t/*::[*/0x0865/*::]*/: { /* n:\"CrErr\", */ },\n\t/*::[*/0x0866/*::]*/: { /* n:\"HFPicture\", */ },\n\t/*::[*/0x0867/*::]*/: { /* n:\"FeatHdr\", */ f:parsenoop2 },\n\t/*::[*/0x0868/*::]*/: { /* n:\"Feat\", */ },\n\t/*::[*/0x086a/*::]*/: { /* n:\"DataLabExt\", */ },\n\t/*::[*/0x086b/*::]*/: { /* n:\"DataLabExtContents\", */ },\n\t/*::[*/0x086c/*::]*/: { /* n:\"CellWatch\", */ },\n\t/*::[*/0x0871/*::]*/: { /* n:\"FeatHdr11\", */ },\n\t/*::[*/0x0872/*::]*/: { /* n:\"Feature11\", */ },\n\t/*::[*/0x0874/*::]*/: { /* n:\"DropDownObjIds\", */ },\n\t/*::[*/0x0875/*::]*/: { /* n:\"ContinueFrt11\", */ },\n\t/*::[*/0x0876/*::]*/: { /* n:\"DConn\", */ },\n\t/*::[*/0x0877/*::]*/: { /* n:\"List12\", */ },\n\t/*::[*/0x0878/*::]*/: { /* n:\"Feature12\", */ },\n\t/*::[*/0x0879/*::]*/: { /* n:\"CondFmt12\", */ },\n\t/*::[*/0x087a/*::]*/: { /* n:\"CF12\", */ },\n\t/*::[*/0x087b/*::]*/: { /* n:\"CFEx\", */ },\n\t/*::[*/0x087c/*::]*/: { /* n:\"XFCRC\", */ f:parse_XFCRC, r:12 },\n\t/*::[*/0x087d/*::]*/: { /* n:\"XFExt\", */ f:parse_XFExt, r:12 },\n\t/*::[*/0x087e/*::]*/: { /* n:\"AutoFilter12\", */ },\n\t/*::[*/0x087f/*::]*/: { /* n:\"ContinueFrt12\", */ },\n\t/*::[*/0x0884/*::]*/: { /* n:\"MDTInfo\", */ },\n\t/*::[*/0x0885/*::]*/: { /* n:\"MDXStr\", */ },\n\t/*::[*/0x0886/*::]*/: { /* n:\"MDXTuple\", */ },\n\t/*::[*/0x0887/*::]*/: { /* n:\"MDXSet\", */ },\n\t/*::[*/0x0888/*::]*/: { /* n:\"MDXProp\", */ },\n\t/*::[*/0x0889/*::]*/: { /* n:\"MDXKPI\", */ },\n\t/*::[*/0x088a/*::]*/: { /* n:\"MDB\", */ },\n\t/*::[*/0x088b/*::]*/: { /* n:\"PLV\", */ },\n\t/*::[*/0x088c/*::]*/: { /* n:\"Compat12\", */ f:parsebool, r:12 },\n\t/*::[*/0x088d/*::]*/: { /* n:\"DXF\", */ },\n\t/*::[*/0x088e/*::]*/: { /* n:\"TableStyles\", */ r:12 },\n\t/*::[*/0x088f/*::]*/: { /* n:\"TableStyle\", */ },\n\t/*::[*/0x0890/*::]*/: { /* n:\"TableStyleElement\", */ },\n\t/*::[*/0x0892/*::]*/: { /* n:\"StyleExt\", */ },\n\t/*::[*/0x0893/*::]*/: { /* n:\"NamePublish\", */ },\n\t/*::[*/0x0894/*::]*/: { /* n:\"NameCmt\", */ f:parse_NameCmt, r:12 },\n\t/*::[*/0x0895/*::]*/: { /* n:\"SortData\", */ },\n\t/*::[*/0x0896/*::]*/: { /* n:\"Theme\", */ f:parse_Theme, r:12 },\n\t/*::[*/0x0897/*::]*/: { /* n:\"GUIDTypeLib\", */ },\n\t/*::[*/0x0898/*::]*/: { /* n:\"FnGrp12\", */ },\n\t/*::[*/0x0899/*::]*/: { /* n:\"NameFnGrp12\", */ },\n\t/*::[*/0x089a/*::]*/: { /* n:\"MTRSettings\", */ f:parse_MTRSettings, r:12 },\n\t/*::[*/0x089b/*::]*/: { /* n:\"CompressPictures\", */ f:parsenoop2 },\n\t/*::[*/0x089c/*::]*/: { /* n:\"HeaderFooter\", */ },\n\t/*::[*/0x089d/*::]*/: { /* n:\"CrtLayout12\", */ },\n\t/*::[*/0x089e/*::]*/: { /* n:\"CrtMlFrt\", */ },\n\t/*::[*/0x089f/*::]*/: { /* n:\"CrtMlFrtContinue\", */ },\n\t/*::[*/0x08a3/*::]*/: { /* n:\"ForceFullCalculation\", */ f:parse_ForceFullCalculation },\n\t/*::[*/0x08a4/*::]*/: { /* n:\"ShapePropsStream\", */ },\n\t/*::[*/0x08a5/*::]*/: { /* n:\"TextPropsStream\", */ },\n\t/*::[*/0x08a6/*::]*/: { /* n:\"RichTextStream\", */ },\n\t/*::[*/0x08a7/*::]*/: { /* n:\"CrtLayout12A\", */ },\n\t/*::[*/0x1001/*::]*/: { /* n:\"Units\", */ },\n\t/*::[*/0x1002/*::]*/: { /* n:\"Chart\", */ },\n\t/*::[*/0x1003/*::]*/: { /* n:\"Series\", */ },\n\t/*::[*/0x1006/*::]*/: { /* n:\"DataFormat\", */ },\n\t/*::[*/0x1007/*::]*/: { /* n:\"LineFormat\", */ },\n\t/*::[*/0x1009/*::]*/: { /* n:\"MarkerFormat\", */ },\n\t/*::[*/0x100a/*::]*/: { /* n:\"AreaFormat\", */ },\n\t/*::[*/0x100b/*::]*/: { /* n:\"PieFormat\", */ },\n\t/*::[*/0x100c/*::]*/: { /* n:\"AttachedLabel\", */ },\n\t/*::[*/0x100d/*::]*/: { /* n:\"SeriesText\", */ },\n\t/*::[*/0x1014/*::]*/: { /* n:\"ChartFormat\", */ },\n\t/*::[*/0x1015/*::]*/: { /* n:\"Legend\", */ },\n\t/*::[*/0x1016/*::]*/: { /* n:\"SeriesList\", */ },\n\t/*::[*/0x1017/*::]*/: { /* n:\"Bar\", */ },\n\t/*::[*/0x1018/*::]*/: { /* n:\"Line\", */ },\n\t/*::[*/0x1019/*::]*/: { /* n:\"Pie\", */ },\n\t/*::[*/0x101a/*::]*/: { /* n:\"Area\", */ },\n\t/*::[*/0x101b/*::]*/: { /* n:\"Scatter\", */ },\n\t/*::[*/0x101c/*::]*/: { /* n:\"CrtLine\", */ },\n\t/*::[*/0x101d/*::]*/: { /* n:\"Axis\", */ },\n\t/*::[*/0x101e/*::]*/: { /* n:\"Tick\", */ },\n\t/*::[*/0x101f/*::]*/: { /* n:\"ValueRange\", */ },\n\t/*::[*/0x1020/*::]*/: { /* n:\"CatSerRange\", */ },\n\t/*::[*/0x1021/*::]*/: { /* n:\"AxisLine\", */ },\n\t/*::[*/0x1022/*::]*/: { /* n:\"CrtLink\", */ },\n\t/*::[*/0x1024/*::]*/: { /* n:\"DefaultText\", */ },\n\t/*::[*/0x1025/*::]*/: { /* n:\"Text\", */ },\n\t/*::[*/0x1026/*::]*/: { /* n:\"FontX\", */ f:parseuint16 },\n\t/*::[*/0x1027/*::]*/: { /* n:\"ObjectLink\", */ },\n\t/*::[*/0x1032/*::]*/: { /* n:\"Frame\", */ },\n\t/*::[*/0x1033/*::]*/: { /* n:\"Begin\", */ },\n\t/*::[*/0x1034/*::]*/: { /* n:\"End\", */ },\n\t/*::[*/0x1035/*::]*/: { /* n:\"PlotArea\", */ },\n\t/*::[*/0x103a/*::]*/: { /* n:\"Chart3d\", */ },\n\t/*::[*/0x103c/*::]*/: { /* n:\"PicF\", */ },\n\t/*::[*/0x103d/*::]*/: { /* n:\"DropBar\", */ },\n\t/*::[*/0x103e/*::]*/: { /* n:\"Radar\", */ },\n\t/*::[*/0x103f/*::]*/: { /* n:\"Surf\", */ },\n\t/*::[*/0x1040/*::]*/: { /* n:\"RadarArea\", */ },\n\t/*::[*/0x1041/*::]*/: { /* n:\"AxisParent\", */ },\n\t/*::[*/0x1043/*::]*/: { /* n:\"LegendException\", */ },\n\t/*::[*/0x1044/*::]*/: { /* n:\"ShtProps\", */ f:parse_ShtProps },\n\t/*::[*/0x1045/*::]*/: { /* n:\"SerToCrt\", */ },\n\t/*::[*/0x1046/*::]*/: { /* n:\"AxesUsed\", */ },\n\t/*::[*/0x1048/*::]*/: { /* n:\"SBaseRef\", */ },\n\t/*::[*/0x104a/*::]*/: { /* n:\"SerParent\", */ },\n\t/*::[*/0x104b/*::]*/: { /* n:\"SerAuxTrend\", */ },\n\t/*::[*/0x104e/*::]*/: { /* n:\"IFmtRecord\", */ },\n\t/*::[*/0x104f/*::]*/: { /* n:\"Pos\", */ },\n\t/*::[*/0x1050/*::]*/: { /* n:\"AlRuns\", */ },\n\t/*::[*/0x1051/*::]*/: { /* n:\"BRAI\", */ },\n\t/*::[*/0x105b/*::]*/: { /* n:\"SerAuxErrBar\", */ },\n\t/*::[*/0x105c/*::]*/: { /* n:\"ClrtClient\", */ f:parse_ClrtClient },\n\t/*::[*/0x105d/*::]*/: { /* n:\"SerFmt\", */ },\n\t/*::[*/0x105f/*::]*/: { /* n:\"Chart3DBarShape\", */ },\n\t/*::[*/0x1060/*::]*/: { /* n:\"Fbi\", */ },\n\t/*::[*/0x1061/*::]*/: { /* n:\"BopPop\", */ },\n\t/*::[*/0x1062/*::]*/: { /* n:\"AxcExt\", */ },\n\t/*::[*/0x1063/*::]*/: { /* n:\"Dat\", */ },\n\t/*::[*/0x1064/*::]*/: { /* n:\"PlotGrowth\", */ },\n\t/*::[*/0x1065/*::]*/: { /* n:\"SIIndex\", */ },\n\t/*::[*/0x1066/*::]*/: { /* n:\"GelFrame\", */ },\n\t/*::[*/0x1067/*::]*/: { /* n:\"BopPopCustom\", */ },\n\t/*::[*/0x1068/*::]*/: { /* n:\"Fbi2\", */ },\n\n\t/*::[*/0x0000/*::]*/: { /* n:\"Dimensions\", */ f:parse_Dimensions },\n\t/*::[*/0x0001/*::]*/: { /* n:\"BIFF2BLANK\", */ },\n\t/*::[*/0x0002/*::]*/: { /* n:\"BIFF2INT\", */ f:parse_BIFF2INT },\n\t/*::[*/0x0003/*::]*/: { /* n:\"BIFF2NUM\", */ f:parse_BIFF2NUM },\n\t/*::[*/0x0004/*::]*/: { /* n:\"BIFF2STR\", */ f:parse_BIFF2STR },\n\t/*::[*/0x0005/*::]*/: { /* n:\"BoolErr\", */ f:parse_BoolErr },\n\t/*::[*/0x0007/*::]*/: { /* n:\"String\", */ f:parse_BIFF2STRING },\n\t/*::[*/0x0008/*::]*/: { /* n:\"BIFF2ROW\", */ },\n\t/*::[*/0x0009/*::]*/: { /* n:\"BOF\", */ f:parse_BOF },\n\t/*::[*/0x000b/*::]*/: { /* n:\"Index\", */ },\n\t/*::[*/0x0016/*::]*/: { /* n:\"ExternCount\", */ f:parseuint16 },\n\t/*::[*/0x001e/*::]*/: { /* n:\"BIFF2FORMAT\", */ f:parse_BIFF2Format },\n\t/*::[*/0x001f/*::]*/: { /* n:\"BIFF2FMTCNT\", */ }, /* 16-bit cnt of BIFF2FORMAT records */\n\t/*::[*/0x0020/*::]*/: { /* n:\"BIFF2COLINFO\", */ },\n\t/*::[*/0x0021/*::]*/: { /* n:\"Array\", */ f:parse_Array },\n\t/*::[*/0x0024/*::]*/: { /* n:\"COLWIDTH\", */ },\n\t/*::[*/0x0025/*::]*/: { /* n:\"DefaultRowHeight\", */ f:parse_DefaultRowHeight },\n\t// 0x2c ??\n\t// 0x2d ??\n\t// 0x2e ??\n\t// 0x30 FONTCOUNT: number of fonts\n\t/*::[*/0x0032/*::]*/: { /* n:\"BIFF2FONTXTRA\", */ f:parse_BIFF2FONTXTRA },\n\t// 0x35: INFOOPTS\n\t// 0x36: TABLE (BIFF2 only)\n\t// 0x37: TABLE2 (BIFF2 only)\n\t// 0x38: WNDESK\n\t// 0x39 ??\n\t// 0x3a: BEGINPREF\n\t// 0x3b: ENDPREF\n\t/*::[*/0x003e/*::]*/: { /* n:\"BIFF2WINDOW2\", */ },\n\t// 0x3f ??\n\t// 0x46: SHOWSCROLL\n\t// 0x47: SHOWFORMULA\n\t// 0x48: STATUSBAR\n\t// 0x49: SHORTMENUS\n\t// 0x4A:\n\t// 0x4B:\n\t// 0x4C:\n\t// 0x4E:\n\t// 0x4F:\n\t// 0x58: TOOLBAR (BIFF3)\n\n\t/* - - - */\n\t/*::[*/0x0034/*::]*/: { /* n:\"DDEObjName\", */ },\n\t/*::[*/0x0043/*::]*/: { /* n:\"BIFF2XF\", */ },\n\t/*::[*/0x0044/*::]*/: { /* n:\"BIFF2XFINDEX\", */ f:parseuint16 },\n\t/*::[*/0x0045/*::]*/: { /* n:\"BIFF2FONTCLR\", */ },\n\t/*::[*/0x0056/*::]*/: { /* n:\"BIFF4FMTCNT\", */ }, /* 16-bit cnt, similar to BIFF2 */\n\t/*::[*/0x007e/*::]*/: { /* n:\"RK\", */ }, /* Not necessarily same as 0x027e */\n\t/*::[*/0x007f/*::]*/: { /* n:\"ImData\", */ f:parse_ImData },\n\t/*::[*/0x0087/*::]*/: { /* n:\"Addin\", */ },\n\t/*::[*/0x0088/*::]*/: { /* n:\"Edg\", */ },\n\t/*::[*/0x0089/*::]*/: { /* n:\"Pub\", */ },\n\t// 0x8A\n\t// 0x8B LH: alternate menu key flag (BIFF3/4)\n\t// 0x8E\n\t// 0x8F\n\t/*::[*/0x0091/*::]*/: { /* n:\"Sub\", */ },\n\t// 0x93 STYLE\n\t/*::[*/0x0094/*::]*/: { /* n:\"LHRecord\", */ },\n\t/*::[*/0x0095/*::]*/: { /* n:\"LHNGraph\", */ },\n\t/*::[*/0x0096/*::]*/: { /* n:\"Sound\", */ },\n\t// 0xA2 FNPROTO: function prototypes (BIFF4)\n\t// 0xA3\n\t// 0xA8\n\t/*::[*/0x00a9/*::]*/: { /* n:\"CoordList\", */ },\n\t/*::[*/0x00ab/*::]*/: { /* n:\"GCW\", */ },\n\t/*::[*/0x00bc/*::]*/: { /* n:\"ShrFmla\", */ }, /* Not necessarily same as 0x04bc */\n\t/*::[*/0x00bf/*::]*/: { /* n:\"ToolbarHdr\", */ },\n\t/*::[*/0x00c0/*::]*/: { /* n:\"ToolbarEnd\", */ },\n\t/*::[*/0x00c2/*::]*/: { /* n:\"AddMenu\", */ },\n\t/*::[*/0x00c3/*::]*/: { /* n:\"DelMenu\", */ },\n\t/*::[*/0x00d6/*::]*/: { /* n:\"RString\", */ f:parse_RString },\n\t/*::[*/0x00df/*::]*/: { /* n:\"UDDesc\", */ },\n\t/*::[*/0x00ea/*::]*/: { /* n:\"TabIdConf\", */ },\n\t/*::[*/0x0162/*::]*/: { /* n:\"XL5Modify\", */ },\n\t/*::[*/0x01a5/*::]*/: { /* n:\"FileSharing2\", */ },\n\t/*::[*/0x0206/*::]*/: { /* n:\"Formula\", */ f:parse_Formula },\n\t/*::[*/0x0209/*::]*/: { /* n:\"BOF\", */ f:parse_BOF },\n\t/*::[*/0x0218/*::]*/: { /* n:\"Lbl\", */ f:parse_Lbl },\n\t/*::[*/0x0223/*::]*/: { /* n:\"ExternName\", */ f:parse_ExternName },\n\t/*::[*/0x0231/*::]*/: { /* n:\"Font\", */ },\n\t/*::[*/0x0243/*::]*/: { /* n:\"BIFF3XF\", */ },\n\t/*::[*/0x0406/*::]*/: { /* n:\"Formula\", */ f:parse_Formula },\n\t/*::[*/0x0409/*::]*/: { /* n:\"BOF\", */ f:parse_BOF },\n\t/*::[*/0x0443/*::]*/: { /* n:\"BIFF4XF\", */ },\n\t/*::[*/0x086d/*::]*/: { /* n:\"FeatInfo\", */ },\n\t/*::[*/0x0873/*::]*/: { /* n:\"FeatInfo11\", */ },\n\t/*::[*/0x0881/*::]*/: { /* n:\"SXAddl12\", */ },\n\t/*::[*/0x08c0/*::]*/: { /* n:\"AutoWebPub\", */ },\n\t/*::[*/0x08c1/*::]*/: { /* n:\"ListObj\", */ },\n\t/*::[*/0x08c2/*::]*/: { /* n:\"ListField\", */ },\n\t/*::[*/0x08c3/*::]*/: { /* n:\"ListDV\", */ },\n\t/*::[*/0x08c4/*::]*/: { /* n:\"ListCondFmt\", */ },\n\t/*::[*/0x08c5/*::]*/: { /* n:\"ListCF\", */ },\n\t/*::[*/0x08c6/*::]*/: { /* n:\"FMQry\", */ },\n\t/*::[*/0x08c7/*::]*/: { /* n:\"FMSQry\", */ },\n\t/*::[*/0x08c8/*::]*/: { /* n:\"PLV\", */ },\n\t/*::[*/0x08c9/*::]*/: { /* n:\"LnExt\", */ },\n\t/*::[*/0x08ca/*::]*/: { /* n:\"MkrExt\", */ },\n\t/*::[*/0x08cb/*::]*/: { /* n:\"CrtCoopt\", */ },\n\t/*::[*/0x08d6/*::]*/: { /* n:\"FRTArchId$\", */ r:12 },\n\n\t/*::[*/0x7262/*::]*/: {}\n};\n\nfunction write_biff_rec(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/)/*:void*/ {\n\tvar t/*:number*/ = type;\n\tif(isNaN(t)) return;\n\tvar len = length || (payload||[]).length || 0;\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, len);\n\tif(/*:: len != null &&*/len > 0 && is_buf(payload)) ba.push(payload);\n}\n\nfunction write_biff_continue(ba/*:BufArray*/, type/*:number*/, payload, length/*:?number*/)/*:void*/ {\n\tvar len = length || (payload||[]).length || 0;\n\tif(len <= 8224) return write_biff_rec(ba, type, payload, len);\n\tvar t = type;\n\tif(isNaN(t)) return;\n\tvar parts = payload.parts || [], sidx = 0;\n\tvar i = 0, w = 0;\n\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\tvar o = ba.next(4);\n\to.write_shift(2, t);\n\to.write_shift(2, w);\n\tba.push(payload.slice(i, i + w));\n\ti += w;\n\twhile(i < len) {\n\t\to = ba.next(4);\n\t\to.write_shift(2, 0x3c); // TODO: figure out correct continue type\n\t\tw = 0;\n\t\twhile(w + (parts[sidx] || 8224) <= 8224) { w+= (parts[sidx] || 8224); sidx++; }\n\t\to.write_shift(2, w);\n\t\tba.push(payload.slice(i, i+w)); i+= w;\n\t}\n}\n\nfunction write_BIFF2Cell(out, r/*:number*/, c/*:number*/) {\n\tif(!out) out = new_buf(7);\n\tout.write_shift(2, r);\n\tout.write_shift(2, c);\n\tout.write_shift(2, 0);\n\tout.write_shift(1, 0);\n\treturn out;\n}\n\nfunction write_BIFF2BERR(r/*:number*/, c/*:number*/, val, t/*:?string*/) {\n\tvar out = new_buf(9);\n\twrite_BIFF2Cell(out, r, c);\n\twrite_Bes(val, t || 'b', out);\n\treturn out;\n}\n\n/* TODO: codepage, large strings */\nfunction write_BIFF2LABEL(r/*:number*/, c/*:number*/, val) {\n\tvar out = new_buf(8 + 2*val.length);\n\twrite_BIFF2Cell(out, r, c);\n\tout.write_shift(1, val.length);\n\tout.write_shift(val.length, val, 'sbcs');\n\treturn out.l < out.length ? out.slice(0, out.l) : out;\n}\n\nfunction write_ws_biff2_cell(ba/*:BufArray*/, cell/*:Cell*/, R/*:number*/, C/*:number*//*::, opts*/) {\n\tif(cell.v != null) switch(cell.t) {\n\t\tcase 'd': case 'n':\n\t\t\tvar v = cell.t == 'd' ? datenum(parseDate(cell.v)) : cell.v;\n\t\t\tif((v == (v|0)) && (v >= 0) && (v < 65536))\n\t\t\t\twrite_biff_rec(ba, 0x0002, write_BIFF2INT(R, C, v));\n\t\t\telse\n\t\t\t\twrite_biff_rec(ba, 0x0003, write_BIFF2NUM(R,C, v));\n\t\t\treturn;\n\t\tcase 'b': case 'e': write_biff_rec(ba, 0x0005, write_BIFF2BERR(R, C, cell.v, cell.t)); return;\n\t\t/* TODO: codepage, sst */\n\t\tcase 's': case 'str':\n\t\t\twrite_biff_rec(ba, 0x0004, write_BIFF2LABEL(R, C, (cell.v||\"\").slice(0,255)));\n\t\t\treturn;\n\t}\n\twrite_biff_rec(ba, 0x0001, write_BIFF2Cell(null, R, C));\n}\n\nfunction write_ws_biff2(ba/*:BufArray*/, ws/*:Worksheet*/, idx/*:number*/, opts/*::, wb:Workbook*/) {\n\tvar dense = Array.isArray(ws);\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\"), ref/*:string*/, rr = \"\", cols/*:Array*/ = [];\n\tif(range.e.c > 0xFF || range.e.r > 0x3FFF) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, 0x3FFF);\n\t\tref = encode_range(range);\n\t}\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff2_cell(ba, cell, R, C, opts);\n\t\t}\n\t}\n}\n\n/* Based on test files */\nfunction write_biff2_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {\n\tvar o = opts || {};\n\tif(DENSE != null && o.dense == null) o.dense = DENSE;\n\tvar ba = buf_array();\n\tvar idx = 0;\n\tfor(var i=0;i*/ = [];\n\tvar range = safe_decode_range(ws['!ref'] || \"A1\");\n\tvar MAX_ROWS = b8 ? 65536 : 16384;\n\tif(range.e.c > 0xFF || range.e.r >= MAX_ROWS) {\n\t\tif(opts.WTF) throw new Error(\"Range \" + (ws['!ref'] || \"A1\") + \" exceeds format limit A1:IV16384\");\n\t\trange.e.c = Math.min(range.e.c, 0xFF);\n\t\trange.e.r = Math.min(range.e.c, MAX_ROWS-1);\n\t}\n\n\twrite_biff_rec(ba, 0x0809, write_BOF(wb, 0x10, opts));\n\t/* [Uncalced] Index */\n\twrite_biff_rec(ba, 0x000d /* CalcMode */, writeuint16(1));\n\twrite_biff_rec(ba, 0x000c /* CalcCount */, writeuint16(100));\n\twrite_biff_rec(ba, 0x000f /* CalcRefMode */, writebool(true));\n\twrite_biff_rec(ba, 0x0011 /* CalcIter */, writebool(false));\n\twrite_biff_rec(ba, 0x0010 /* CalcDelta */, write_Xnum(0.001));\n\twrite_biff_rec(ba, 0x005f /* CalcSaveRecalc */, writebool(true));\n\twrite_biff_rec(ba, 0x002a /* PrintRowCol */, writebool(false));\n\twrite_biff_rec(ba, 0x002b /* PrintGrid */, writebool(false));\n\twrite_biff_rec(ba, 0x0082 /* GridSet */, writeuint16(1));\n\twrite_biff_rec(ba, 0x0080 /* Guts */, write_Guts([0,0]));\n\t/* DefaultRowHeight WsBool [Sync] [LPr] [HorizontalPageBreaks] [VerticalPageBreaks] */\n\t/* Header (string) */\n\t/* Footer (string) */\n\twrite_biff_rec(ba, 0x0083 /* HCenter */, writebool(false));\n\twrite_biff_rec(ba, 0x0084 /* VCenter */, writebool(false));\n\t/* ... */\n\tif(b8) write_ws_cols_biff8(ba, ws[\"!cols\"]);\n\t/* ... */\n\twrite_biff_rec(ba, 0x200, write_Dimensions(range, opts));\n\t/* ... */\n\n\tif(b8) ws['!links'] = [];\n\tfor(var R = range.s.r; R <= range.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(var C = range.s.c; C <= range.e.c; ++C) {\n\t\t\tif(R === range.s.r) cols[C] = encode_col(C);\n\t\t\tref = cols[C] + rr;\n\t\t\tvar cell = dense ? (ws[R]||[])[C] : ws[ref];\n\t\t\tif(!cell) continue;\n\t\t\t/* write cell */\n\t\t\twrite_ws_biff8_cell(ba, cell, R, C, opts);\n\t\t\tif(b8 && cell.l) ws['!links'].push([ref, cell.l]);\n\t\t}\n\t}\n\tvar cname/*:string*/ = _sheet.CodeName || _sheet.name || s;\n\t/* ... */\n\tif(b8) write_biff_rec(ba, 0x023e /* Window2 */, write_Window2((_WB.Views||[])[0]));\n\t/* ... */\n\tif(b8 && (ws['!merges']||[]).length) write_biff_rec(ba, 0x00e5 /* MergeCells */, write_MergeCells(ws['!merges']));\n\t/* [LRng] *QUERYTABLE [PHONETICINFO] CONDFMTS */\n\tif(b8) write_ws_biff8_hlinks(ba, ws);\n\t/* [DVAL] */\n\twrite_biff_rec(ba, 0x01ba /* CodeName */, write_XLUnicodeString(cname, opts));\n\t/* *WebPub *CellWatch [SheetExt] */\n\tif(b8) write_FEAT(ba, ws);\n\t/* *FEAT11 *RECORD12 */\n\twrite_biff_rec(ba, 0x000a /* EOF */);\n\treturn ba.end();\n}\n\n/* [MS-XLS] 2.1.7.20.3 */\nfunction write_biff8_global(wb/*:Workbook*/, bufs, opts/*:WriteOpts*/) {\n\tvar A = buf_array();\n\tvar _WB/*:WBWBProps*/ = ((wb||{}).Workbook||{}/*:any*/);\n\tvar _sheets/*:Array*/ = (_WB.Sheets||[]);\n\tvar _wb/*:WBProps*/ = /*::((*/_WB.WBProps||{/*::CodeName:\"ThisWorkbook\"*/}/*:: ):any)*/;\n\tvar b8 = opts.biff == 8, b5 = opts.biff == 5;\n\twrite_biff_rec(A, 0x0809, write_BOF(wb, 0x05, opts));\n\tif(opts.bookType == \"xla\") write_biff_rec(A, 0x0087 /* Addin */);\n\twrite_biff_rec(A, 0x00e1 /* InterfaceHdr */, b8 ? writeuint16(0x04b0) : null);\n\twrite_biff_rec(A, 0x00c1 /* Mms */, writezeroes(2));\n\tif(b5) write_biff_rec(A, 0x00bf /* ToolbarHdr */);\n\tif(b5) write_biff_rec(A, 0x00c0 /* ToolbarEnd */);\n\twrite_biff_rec(A, 0x00e2 /* InterfaceEnd */);\n\twrite_biff_rec(A, 0x005c /* WriteAccess */, write_WriteAccess(\"SheetJS\", opts));\n\t/* [FileSharing] */\n\twrite_biff_rec(A, 0x0042 /* CodePage */, writeuint16(b8 ? 0x04b0 : 0x04E4));\n\t/* *2047 Lel */\n\tif(b8) write_biff_rec(A, 0x0161 /* DSF */, writeuint16(0));\n\tif(b8) write_biff_rec(A, 0x01c0 /* Excel9File */);\n\twrite_biff_rec(A, 0x013d /* RRTabId */, write_RRTabId(wb.SheetNames.length));\n\tif(b8 && wb.vbaraw) write_biff_rec(A, 0x00d3 /* ObProj */);\n\t/* [ObNoMacros] */\n\tif(b8 && wb.vbaraw) {\n\t\tvar cname/*:string*/ = _wb.CodeName || \"ThisWorkbook\";\n\t\twrite_biff_rec(A, 0x01ba /* CodeName */, write_XLUnicodeString(cname, opts));\n\t}\n\twrite_biff_rec(A, 0x009c /* BuiltInFnGroupCount */, writeuint16(0x11));\n\t/* *FnGroupName *FnGrp12 */\n\t/* *Lbl */\n\t/* [OleObjectSize] */\n\twrite_biff_rec(A, 0x0019 /* WinProtect */, writebool(false));\n\twrite_biff_rec(A, 0x0012 /* Protect */, writebool(false));\n\twrite_biff_rec(A, 0x0013 /* Password */, writeuint16(0));\n\tif(b8) write_biff_rec(A, 0x01af /* Prot4Rev */, writebool(false));\n\tif(b8) write_biff_rec(A, 0x01bc /* Prot4RevPass */, writeuint16(0));\n\twrite_biff_rec(A, 0x003d /* Window1 */, write_Window1(opts));\n\twrite_biff_rec(A, 0x0040 /* Backup */, writebool(false));\n\twrite_biff_rec(A, 0x008d /* HideObj */, writeuint16(0));\n\twrite_biff_rec(A, 0x0022 /* Date1904 */, writebool(safe1904(wb)==\"true\"));\n\twrite_biff_rec(A, 0x000e /* CalcPrecision */, writebool(true));\n\tif(b8) write_biff_rec(A, 0x01b7 /* RefreshAll */, writebool(false));\n\twrite_biff_rec(A, 0x00DA /* BookBool */, writeuint16(0));\n\t/* ... */\n\twrite_FONTS_biff8(A, wb, opts);\n\twrite_FMTS_biff8(A, wb.SSF, opts);\n\twrite_CELLXFS_biff8(A, opts);\n\t/* ... */\n\tif(b8) write_biff_rec(A, 0x0160 /* UsesELFs */, writebool(false));\n\tvar a = A.end();\n\n\tvar C = buf_array();\n\t/* METADATA [MTRSettings] [ForceFullCalculation] */\n\tif(b8) write_biff_rec(C, 0x008C, write_Country());\n\t/* *SUPBOOK *LBL *RTD [RecalcId] *HFPicture *MSODRAWINGGROUP */\n\n\t/* BIFF8: [SST *Continue] ExtSST */\n\tif(b8 && opts.Strings) write_biff_continue(C, 0x00FC, write_SST(opts.Strings, opts));\n\n\t/* *WebPub [WOpt] [CrErr] [BookExt] *FeatHdr *DConn [THEME] [CompressPictures] [Compat12] [GUIDTypeLib] */\n\twrite_biff_rec(C, 0x000A /* EOF */);\n\tvar c = C.end();\n\n\tvar B = buf_array();\n\tvar blen = 0, j = 0;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) blen += (b8 ? 12 : 11) + (b8 ? 2 : 1) * wb.SheetNames[j].length;\n\tvar start = a.length + blen + c.length;\n\tfor(j = 0; j < wb.SheetNames.length; ++j) {\n\t\tvar _sheet/*:WBWSProp*/ = _sheets[j] || ({}/*:any*/);\n\t\twrite_biff_rec(B, 0x0085 /* BoundSheet8 */, write_BoundSheet8({pos:start, hs:_sheet.Hidden||0, dt:0, name:wb.SheetNames[j]}, opts));\n\t\tstart += bufs[j].length;\n\t}\n\t/* 1*BoundSheet8 */\n\tvar b = B.end();\n\tif(blen != b.length) throw new Error(\"BS8 \" + blen + \" != \" + b.length);\n\n\tvar out = [];\n\tif(a.length) out.push(a);\n\tif(b.length) out.push(b);\n\tif(c.length) out.push(c);\n\treturn bconcat(out);\n}\n\n/* [MS-XLS] 2.1.7.20 Workbook Stream */\nfunction write_biff8_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {\n\tvar o = opts || {};\n\tvar bufs = [];\n\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = dup(table_fmt);\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(); SSF_load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\to.revssf = evert_num(wb.SSF); o.revssf[wb.SSF[65535]] = 0;\n\t\to.ssf = wb.SSF;\n\t}\n\n\to.Strings = /*::((*/[]/*:: :any):SST)*/; o.Strings.Count = 0; o.Strings.Unique = 0;\n\tfix_write_opts(o);\n\n\to.cellXfs = [];\n\tget_cell_style(o.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tfor(var i = 0; i < wb.SheetNames.length; ++i) bufs[bufs.length] = write_ws_biff8(i, o, wb);\n\tbufs.unshift(write_biff8_global(wb, bufs, o));\n\treturn bconcat(bufs);\n}\n\nfunction write_biff_buf(wb/*:Workbook*/, opts/*:WriteOpts*/) {\n\tfor(var i = 0; i <= wb.SheetNames.length; ++i) {\n\t\tvar ws = wb.Sheets[wb.SheetNames[i]];\n\t\tif(!ws || !ws[\"!ref\"]) continue;\n\t\tvar range = decode_range(ws[\"!ref\"]);\n\t\tif(range.e.c > 255) { // note: 255 is IV\n\t\tif(typeof console != \"undefined\" && console.error) console.error(\"Worksheet '\" + wb.SheetNames[i] + \"' extends beyond column IV (255). Data may be lost.\");\n\t\t}\n\t}\n\n\tvar o = opts || {};\n\tswitch(o.biff || 2) {\n\t\tcase 8: case 5: return write_biff8_buf(wb, opts);\n\t\tcase 4: case 3: case 2: return write_biff2_buf(wb, opts);\n\t}\n\tthrow new Error(\"invalid type \" + o.bookType + \" for BIFF\");\n}\n/* note: browser DOM element cannot see mso- style attrs, must parse */\nfunction html_to_sheet(str/*:string*/, _opts)/*:Workbook*/ {\n\tvar opts = _opts || {};\n\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\tvar ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);\n\tstr = str.replace(//g, \"\");\n\tvar mtch/*:any*/ = str.match(/\");\n\tvar mtch2/*:any*/ = str.match(/<\\/table/i);\n\tvar i/*:number*/ = mtch.index, j/*:number*/ = mtch2 && mtch2.index || str.length;\n\tvar rows = split_regex(str.slice(i, j), /(:?]*>)/i, \"\");\n\tvar R = -1, C = 0, RS = 0, CS = 0;\n\tvar range/*:Range*/ = {s:{r:10000000, c:10000000},e:{r:0,c:0}};\n\tvar merges/*:Array*/ = [];\n\tfor(i = 0; i < rows.length; ++i) {\n\t\tvar row = rows[i].trim();\n\t\tvar hd = row.slice(0,3).toLowerCase();\n\t\tif(hd == \"/i);\n\t\tfor(j = 0; j < cells.length; ++j) {\n\t\t\tvar cell = cells[j].trim();\n\t\t\tif(!cell.match(/\")) > -1) m = m.slice(cc+1);\n\t\t\tfor(var midx = 0; midx < merges.length; ++midx) {\n\t\t\t\tvar _merge/*:Range*/ = merges[midx];\n\t\t\t\tif(_merge.s.c == C && _merge.s.r < R && R <= _merge.e.r) { C = _merge.e.c + 1; midx = -1; }\n\t\t\t}\n\t\t\tvar tag = parsexmltag(cell.slice(0, cell.indexOf(\">\")));\n\t\t\tCS = tag.colspan ? +tag.colspan : 1;\n\t\t\tif((RS = +tag.rowspan)>1 || CS>1) merges.push({s:{r:R,c:C},e:{r:R + (RS||1) - 1, c:C + CS - 1}});\n\t\t\tvar _t/*:string*/ = tag.t || tag[\"data-t\"] || \"\";\n\t\t\t/* TODO: generate stub cells */\n\t\t\tif(!m.length) { C += CS; continue; }\n\t\t\tm = htmldecode(m);\n\t\t\tif(range.s.r > R) range.s.r = R; if(range.e.r < R) range.e.r = R;\n\t\t\tif(range.s.c > C) range.s.c = C; if(range.e.c < C) range.e.c = C;\n\t\t\tif(!m.length) { C += CS; continue; }\n\t\t\tvar o/*:Cell*/ = {t:'s', v:m};\n\t\t\tif(opts.raw || !m.trim().length || _t == 's'){}\n\t\t\telse if(m === 'TRUE') o = {t:'b', v:true};\n\t\t\telse if(m === 'FALSE') o = {t:'b', v:false};\n\t\t\telse if(!isNaN(fuzzynum(m))) o = {t:'n', v:fuzzynum(m)};\n\t\t\telse if(!isNaN(fuzzydate(m).getDate())) {\n\t\t\t\to = ({t:'d', v:parseDate(m)}/*:any*/);\n\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);\n\t\t\t\to.z = opts.dateNF || table_fmt[14];\n\t\t\t}\n\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = o; }\n\t\t\telse ws[encode_cell({r:R, c:C})] = o;\n\t\t\tC += CS;\n\t\t}\n\t}\n\tws['!ref'] = encode_range(range);\n\tif(merges.length) ws[\"!merges\"] = merges;\n\treturn ws;\n}\nfunction make_html_row(ws/*:Worksheet*/, r/*:Range*/, R/*:number*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {\n\tvar M/*:Array*/ = (ws['!merges'] ||[]);\n\tvar oo/*:Array*/ = [];\n\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\tvar RS = 0, CS = 0;\n\t\tfor(var j = 0; j < M.length; ++j) {\n\t\t\tif(M[j].s.r > R || M[j].s.c > C) continue;\n\t\t\tif(M[j].e.r < R || M[j].e.c < C) continue;\n\t\t\tif(M[j].s.r < R || M[j].s.c < C) { RS = -1; break; }\n\t\t\tRS = M[j].e.r - M[j].s.r + 1; CS = M[j].e.c - M[j].s.c + 1; break;\n\t\t}\n\t\tif(RS < 0) continue;\n\t\tvar coord = encode_cell({r:R,c:C});\n\t\tvar cell = o.dense ? (ws[R]||[])[C] : ws[coord];\n\t\t/* TODO: html entities */\n\t\tvar w = (cell && cell.v != null) && (cell.h || escapehtml(cell.w || (format_cell(cell), cell.w) || \"\")) || \"\";\n\t\tvar sp = ({}/*:any*/);\n\t\tif(RS > 1) sp.rowspan = RS;\n\t\tif(CS > 1) sp.colspan = CS;\n\t\tif(o.editable) w = '' + w + '';\n\t\telse if(cell) {\n\t\t\tsp[\"data-t\"] = cell && cell.t || 'z';\n\t\t\tif(cell.v != null) sp[\"data-v\"] = cell.v;\n\t\t\tif(cell.z != null) sp[\"data-z\"] = cell.z;\n\t\t\tif(cell.l && (cell.l.Target || \"#\").charAt(0) != \"#\") w = '' + w + '';\n\t\t}\n\t\tsp.id = (o.id || \"sjs\") + \"-\" + coord;\n\t\too.push(writextag('td', w, sp));\n\t}\n\tvar preamble = \"\";\n\treturn preamble + oo.join(\"\") + \"\";\n}\n\nvar HTML_BEGIN = 'SheetJS Table Export';\nvar HTML_END = '';\n\nfunction html_to_workbook(str/*:string*/, opts)/*:Workbook*/ {\n\tvar mtch = str.match(/[\\s\\S]*?<\\/table>/gi);\n\tif(!mtch || mtch.length == 0) throw new Error(\"Invalid HTML: could not find
    \");\n\tif(mtch.length == 1) return sheet_to_workbook(html_to_sheet(mtch[0], opts), opts);\n\tvar wb = book_new();\n\tmtch.forEach(function(s, idx) { book_append_sheet(wb, html_to_sheet(s, opts), \"Sheet\" + (idx+1)); });\n\treturn wb;\n}\n\nfunction make_html_preamble(ws/*:Worksheet*/, R/*:Range*/, o/*:Sheet2HTMLOpts*/)/*:string*/ {\n\tvar out/*:Array*/ = [];\n\treturn out.join(\"\") + '';\n}\n\nfunction sheet_to_html(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*//*, wb:?Workbook*/)/*:string*/ {\n\tvar o = opts || {};\n\tvar header = o.header != null ? o.header : HTML_BEGIN;\n\tvar footer = o.footer != null ? o.footer : HTML_END;\n\tvar out/*:Array*/ = [header];\n\tvar r = decode_range(ws['!ref']);\n\to.dense = Array.isArray(ws);\n\tout.push(make_html_preamble(ws, r, o));\n\tfor(var R = r.s.r; R <= r.e.r; ++R) out.push(make_html_row(ws, r, R, o));\n\tout.push(\"
    \" + footer);\n\treturn out.join(\"\");\n}\n\nfunction sheet_add_dom(ws/*:Worksheet*/, table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {\n\tvar opts = _opts || {};\n\tif(DENSE != null) opts.dense = DENSE;\n\tvar or_R = 0, or_C = 0;\n\tif(opts.origin != null) {\n\t\tif(typeof opts.origin == 'number') or_R = opts.origin;\n\t\telse {\n\t\t\tvar _origin/*:CellAddress*/ = typeof opts.origin == \"string\" ? decode_cell(opts.origin) : opts.origin;\n\t\t\tor_R = _origin.r; or_C = _origin.c;\n\t\t}\n\t}\n\n\tvar rows/*:HTMLCollection*/ = table.getElementsByTagName('tr');\n\tvar sheetRows = Math.min(opts.sheetRows||10000000, rows.length);\n\tvar range/*:Range*/ = {s:{r:0,c:0},e:{r:or_R,c:or_C}};\n\tif(ws[\"!ref\"]) {\n\t\tvar _range/*:Range*/ = decode_range(ws[\"!ref\"]);\n\t\trange.s.r = Math.min(range.s.r, _range.s.r);\n\t\trange.s.c = Math.min(range.s.c, _range.s.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\tif(or_R == -1) range.e.r = or_R = _range.e.r + 1;\n\t}\n\tvar merges/*:Array*/ = [], midx = 0;\n\tvar rowinfo/*:Array*/ = ws[\"!rows\"] || (ws[\"!rows\"] = []);\n\tvar _R = 0, R = 0, _C = 0, C = 0, RS = 0, CS = 0;\n\tif(!ws[\"!cols\"]) ws['!cols'] = [];\n\tfor(; _R < rows.length && R < sheetRows; ++_R) {\n\t\tvar row/*:HTMLTableRowElement*/ = rows[_R];\n\t\tif (is_dom_element_hidden(row)) {\n\t\t\tif (opts.display) continue;\n\t\t\trowinfo[R] = {hidden: true};\n\t\t}\n\t\tvar elts/*:HTMLCollection*/ = (row.children/*:any*/);\n\t\tfor(_C = C = 0; _C < elts.length; ++_C) {\n\t\t\tvar elt/*:HTMLTableCellElement*/ = elts[_C];\n\t\t\tif (opts.display && is_dom_element_hidden(elt)) continue;\n\t\t\tvar v/*:?string*/ = elt.hasAttribute('data-v') ? elt.getAttribute('data-v') : elt.hasAttribute('v') ? elt.getAttribute('v') : htmldecode(elt.innerHTML);\n\t\t\tvar z/*:?string*/ = elt.getAttribute('data-z') || elt.getAttribute('z');\n\t\t\tfor(midx = 0; midx < merges.length; ++midx) {\n\t\t\t\tvar m/*:Range*/ = merges[midx];\n\t\t\t\tif(m.s.c == C + or_C && m.s.r < R + or_R && R + or_R <= m.e.r) { C = m.e.c+1 - or_C; midx = -1; }\n\t\t\t}\n\t\t\t/* TODO: figure out how to extract nonstandard mso- style */\n\t\t\tCS = +elt.getAttribute(\"colspan\") || 1;\n\t\t\tif( ((RS = (+elt.getAttribute(\"rowspan\") || 1)))>1 || CS>1) merges.push({s:{r:R + or_R,c:C + or_C},e:{r:R + or_R + (RS||1) - 1, c:C + or_C + (CS||1) - 1}});\n\t\t\tvar o/*:Cell*/ = {t:'s', v:v};\n\t\t\tvar _t/*:string*/ = elt.getAttribute(\"data-t\") || elt.getAttribute(\"t\") || \"\";\n\t\t\tif(v != null) {\n\t\t\t\tif(v.length == 0) o.t = _t || 'z';\n\t\t\t\telse if(opts.raw || v.trim().length == 0 || _t == \"s\"){}\n\t\t\t\telse if(v === 'TRUE') o = {t:'b', v:true};\n\t\t\t\telse if(v === 'FALSE') o = {t:'b', v:false};\n\t\t\t\telse if(!isNaN(fuzzynum(v))) o = {t:'n', v:fuzzynum(v)};\n\t\t\t\telse if(!isNaN(fuzzydate(v).getDate())) {\n\t\t\t\t\to = ({t:'d', v:parseDate(v)}/*:any*/);\n\t\t\t\t\tif(!opts.cellDates) o = ({t:'n', v:datenum(o.v)}/*:any*/);\n\t\t\t\t\to.z = opts.dateNF || table_fmt[14];\n\t\t\t\t}\n\t\t\t}\n\t\t\tif(o.z === undefined && z != null) o.z = z;\n\t\t\t/* The first link is used. Links are assumed to be fully specified.\n\t\t\t * TODO: The right way to process relative links is to make a new */\n\t\t\tvar l = \"\", Aelts = elt.getElementsByTagName(\"A\");\n\t\t\tif(Aelts && Aelts.length) for(var Aelti = 0; Aelti < Aelts.length; ++Aelti)\tif(Aelts[Aelti].hasAttribute(\"href\")) {\n\t\t\t\tl = Aelts[Aelti].getAttribute(\"href\"); if(l.charAt(0) != \"#\") break;\n\t\t\t}\n\t\t\tif(l && l.charAt(0) != \"#\") o.l = ({ Target: l });\n\t\t\tif(opts.dense) { if(!ws[R + or_R]) ws[R + or_R] = []; ws[R + or_R][C + or_C] = o; }\n\t\t\telse ws[encode_cell({c:C + or_C, r:R + or_R})] = o;\n\t\t\tif(range.e.c < C + or_C) range.e.c = C + or_C;\n\t\t\tC += CS;\n\t\t}\n\t\t++R;\n\t}\n\tif(merges.length) ws['!merges'] = (ws[\"!merges\"] || []).concat(merges);\n\trange.e.r = Math.max(range.e.r, R - 1 + or_R);\n\tws['!ref'] = encode_range(range);\n\tif(R >= sheetRows) ws['!fullref'] = encode_range((range.e.r = rows.length-_R+R-1 + or_R,range)); // We can count the real number of rows to parse but we don't to improve the performance\n\treturn ws;\n}\n\nfunction parse_dom_table(table/*:HTMLElement*/, _opts/*:?any*/)/*:Worksheet*/ {\n\tvar opts = _opts || {};\n\tvar ws/*:Worksheet*/ = opts.dense ? ([]/*:any*/) : ({}/*:any*/);\n\treturn sheet_add_dom(ws, table, _opts);\n}\n\nfunction table_to_book(table/*:HTMLElement*/, opts/*:?any*/)/*:Workbook*/ {\n\treturn sheet_to_workbook(parse_dom_table(table, opts), opts);\n}\n\nfunction is_dom_element_hidden(element/*:HTMLElement*/)/*:boolean*/ {\n\tvar display/*:string*/ = '';\n\tvar get_computed_style/*:?function*/ = get_get_computed_style_function(element);\n\tif(get_computed_style) display = get_computed_style(element).getPropertyValue('display');\n\tif(!display) display = element.style && element.style.display;\n\treturn display === 'none';\n}\n\n/* global getComputedStyle */\nfunction get_get_computed_style_function(element/*:HTMLElement*/)/*:?function*/ {\n\t// The proper getComputedStyle implementation is the one defined in the element window\n\tif(element.ownerDocument.defaultView && typeof element.ownerDocument.defaultView.getComputedStyle === 'function') return element.ownerDocument.defaultView.getComputedStyle;\n\t// If it is not available, try to get one from the global namespace\n\tif(typeof getComputedStyle === 'function') return getComputedStyle;\n\treturn null;\n}\n/* OpenDocument */\nfunction parse_text_p(text/*:string*//*::, tag*/)/*:Array*/ {\n\t/* 6.1.2 White Space Characters */\n\tvar fixed = text\n\t\t.replace(/[\\t\\r\\n]/g, \" \").trim().replace(/ +/g, \" \")\n\t\t.replace(//g,\" \")\n\t\t.replace(//g, function($$,$1) { return Array(parseInt($1,10)+1).join(\" \"); })\n\t\t.replace(/]*\\/>/g,\"\\t\")\n\t\t.replace(//g,\"\\n\");\n\tvar v = unescapexml(fixed.replace(/<[^>]*>/g,\"\"));\n\n\treturn [v];\n}\n\nvar number_formats_ods = {\n\t/* ods name: [short ssf fmt, long ssf fmt] */\n\tday: [\"d\", \"dd\"],\n\tmonth: [\"m\", \"mm\"],\n\tyear: [\"y\", \"yy\"],\n\thours: [\"h\", \"hh\"],\n\tminutes: [\"m\", \"mm\"],\n\tseconds: [\"s\", \"ss\"],\n\t\"am-pm\": [\"A/P\", \"AM/PM\"],\n\t\"day-of-week\": [\"ddd\", \"dddd\"],\n\tera: [\"e\", \"ee\"],\n\t/* there is no native representation of LO \"Q\" format */\n\tquarter: [\"\\\\Qm\", \"m\\\\\\\"th quarter\\\"\"]\n};\n\n\nfunction parse_content_xml(d/*:string*/, _opts)/*:Workbook*/ {\n\t\tvar opts = _opts || {};\n\t\tif(DENSE != null && opts.dense == null) opts.dense = DENSE;\n\t\tvar str = xlml_normalize(d);\n\t\tvar state/*:Array*/ = [], tmp;\n\t\tvar tag/*:: = {}*/;\n\t\tvar NFtag = {name:\"\"}, NF = \"\", pidx = 0;\n\t\tvar sheetag/*:: = {name:\"\", '名称':\"\"}*/;\n\t\tvar rowtag/*:: = {'行号':\"\"}*/;\n\t\tvar Sheets = {}, SheetNames/*:Array*/ = [];\n\t\tvar ws = opts.dense ? ([]/*:any*/) : ({}/*:any*/);\n\t\tvar Rn, q/*:: :any = ({t:\"\", v:null, z:null, w:\"\",c:[],}:any)*/;\n\t\tvar ctag = ({value:\"\"}/*:any*/);\n\t\tvar textp = \"\", textpidx = 0, textptag/*:: = {}*/;\n\t\tvar textR = [];\n\t\tvar R = -1, C = -1, range = {s: {r:1000000,c:10000000}, e: {r:0, c:0}};\n\t\tvar row_ol = 0;\n\t\tvar number_format_map = {};\n\t\tvar merges/*:Array*/ = [], mrange = {}, mR = 0, mC = 0;\n\t\tvar rowinfo/*:Array*/ = [], rowpeat = 1, colpeat = 1;\n\t\tvar arrayf/*:Array<[Range, string]>*/ = [];\n\t\tvar WB = {Names:[]};\n\t\tvar atag = ({}/*:any*/);\n\t\tvar _Ref/*:[string, string]*/ = [\"\", \"\"];\n\t\tvar comments/*:Array*/ = [], comment/*:Comment*/ = ({}/*:any*/);\n\t\tvar creator = \"\", creatoridx = 0;\n\t\tvar isstub = false, intable = false;\n\t\tvar i = 0;\n\t\txlmlregex.lastIndex = 0;\n\t\tstr = str.replace(//mg,\"\").replace(//gm,\"\");\n\t\twhile((Rn = xlmlregex.exec(str))) switch((Rn[3]=Rn[3].replace(/_.*$/,\"\"))) {\n\n\t\t\tcase 'table': case '工作表': // 9.1.2 \n\t\t\t\tif(Rn[1]==='/') {\n\t\t\t\t\tif(range.e.c >= range.s.c && range.e.r >= range.s.r) ws['!ref'] = encode_range(range);\n\t\t\t\t\telse ws['!ref'] = \"A1:A1\";\n\t\t\t\t\tif(opts.sheetRows > 0 && opts.sheetRows <= range.e.r) {\n\t\t\t\t\t\tws['!fullref'] = ws['!ref'];\n\t\t\t\t\t\trange.e.r = opts.sheetRows - 1;\n\t\t\t\t\t\tws['!ref'] = encode_range(range);\n\t\t\t\t\t}\n\t\t\t\t\tif(merges.length) ws['!merges'] = merges;\n\t\t\t\t\tif(rowinfo.length) ws[\"!rows\"] = rowinfo;\n\t\t\t\t\tsheetag.name = sheetag['名称'] || sheetag.name;\n\t\t\t\t\tif(typeof JSON !== 'undefined') JSON.stringify(sheetag);\n\t\t\t\t\tSheetNames.push(sheetag.name);\n\t\t\t\t\tSheets[sheetag.name] = ws;\n\t\t\t\t\tintable = false;\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tsheetag = parsexmltag(Rn[0], false);\n\t\t\t\t\tR = C = -1;\n\t\t\t\t\trange.s.r = range.s.c = 10000000; range.e.r = range.e.c = 0;\n\t\t\t\t\tws = opts.dense ? ([]/*:any*/) : ({}/*:any*/); merges = [];\n\t\t\t\t\trowinfo = [];\n\t\t\t\t\tintable = true;\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'table-row-group': // 9.1.9 \n\t\t\t\tif(Rn[1] === \"/\") --row_ol; else ++row_ol;\n\t\t\t\tbreak;\n\t\t\tcase 'table-row': case '行': // 9.1.3 \n\t\t\t\tif(Rn[1] === '/') { R+=rowpeat; rowpeat = 1; break; }\n\t\t\t\trowtag = parsexmltag(Rn[0], false);\n\t\t\t\tif(rowtag['行号']) R = rowtag['行号'] - 1; else if(R == -1) R = 0;\n\t\t\t\trowpeat = +rowtag['number-rows-repeated'] || 1;\n\t\t\t\t/* TODO: remove magic */\n\t\t\t\tif(rowpeat < 10) for(i = 0; i < rowpeat; ++i) if(row_ol > 0) rowinfo[R + i] = {level: row_ol};\n\t\t\t\tC = -1; break;\n\t\t\tcase 'covered-table-cell': // 9.1.5 \n\t\t\t\tif(Rn[1] !== '/') ++C;\n\t\t\t\tif(opts.sheetStubs) {\n\t\t\t\t\tif(opts.dense) { if(!ws[R]) ws[R] = []; ws[R][C] = {t:'z'}; }\n\t\t\t\t\telse ws[encode_cell({r:R,c:C})] = {t:'z'};\n\t\t\t\t}\n\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\tbreak; /* stub */\n\t\t\tcase 'table-cell': case '数据':\n\t\t\t\tif(Rn[0].charAt(Rn[0].length-2) === '/') {\n\t\t\t\t\t++C;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tq = ({t:'z', v:null/*:: , z:null, w:\"\",c:[]*/}/*:any*/);\n\t\t\t\t\tif(ctag.formula && opts.cellFormula != false) q.f = ods_to_csf_formula(unescapexml(ctag.formula));\n\t\t\t\t\tif((ctag['数据类型'] || ctag['value-type']) == \"string\") {\n\t\t\t\t\t\tq.t = \"s\"; q.v = unescapexml(ctag['string-value'] || \"\");\n\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\tif(!ws[R]) ws[R] = [];\n\t\t\t\t\t\t\tws[R][C] = q;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tws[encode_cell({r:R,c:C})] = q;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tC+= colpeat-1;\n\t\t\t\t} else if(Rn[1]!=='/') {\n\t\t\t\t\t++C;\n\t\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\t\tcolpeat = 1;\n\t\t\t\t\tvar rptR = rowpeat ? R + rowpeat - 1 : R;\n\t\t\t\t\tif(C > range.e.c) range.e.c = C;\n\t\t\t\t\tif(C < range.s.c) range.s.c = C;\n\t\t\t\t\tif(R < range.s.r) range.s.r = R;\n\t\t\t\t\tif(rptR > range.e.r) range.e.r = rptR;\n\t\t\t\t\tctag = parsexmltag(Rn[0], false);\n\t\t\t\t\tcomments = []; comment = ({}/*:any*/);\n\t\t\t\t\tq = ({t:ctag['数据类型'] || ctag['value-type'], v:null/*:: , z:null, w:\"\",c:[]*/}/*:any*/);\n\t\t\t\t\tif(opts.cellFormula) {\n\t\t\t\t\t\tif(ctag.formula) ctag.formula = unescapexml(ctag.formula);\n\t\t\t\t\t\tif(ctag['number-matrix-columns-spanned'] && ctag['number-matrix-rows-spanned']) {\n\t\t\t\t\t\t\tmR = parseInt(ctag['number-matrix-rows-spanned'],10) || 0;\n\t\t\t\t\t\t\tmC = parseInt(ctag['number-matrix-columns-spanned'],10) || 0;\n\t\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\t\tq.F = encode_range(mrange);\n\t\t\t\t\t\t\tarrayf.push([mrange, q.F]);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif(ctag.formula) q.f = ods_to_csf_formula(ctag.formula);\n\t\t\t\t\t\telse for(i = 0; i < arrayf.length; ++i)\n\t\t\t\t\t\t\tif(R >= arrayf[i][0].s.r && R <= arrayf[i][0].e.r)\n\t\t\t\t\t\t\t\tif(C >= arrayf[i][0].s.c && C <= arrayf[i][0].e.c)\n\t\t\t\t\t\t\t\t\tq.F = arrayf[i][1];\n\t\t\t\t\t}\n\t\t\t\t\tif(ctag['number-columns-spanned'] || ctag['number-rows-spanned']) {\n\t\t\t\t\t\tmR = parseInt(ctag['number-rows-spanned'],10) || 0;\n\t\t\t\t\t\tmC = parseInt(ctag['number-columns-spanned'],10) || 0;\n\t\t\t\t\t\tmrange = {s: {r:R,c:C}, e:{r:R + mR-1,c:C + mC-1}};\n\t\t\t\t\t\tmerges.push(mrange);\n\t\t\t\t\t}\n\n\t\t\t\t\t/* 19.675.2 table:number-columns-repeated */\n\t\t\t\t\tif(ctag['number-columns-repeated']) colpeat = parseInt(ctag['number-columns-repeated'], 10);\n\n\t\t\t\t\t/* 19.385 office:value-type */\n\t\t\t\t\tswitch(q.t) {\n\t\t\t\t\t\tcase 'boolean': q.t = 'b'; q.v = parsexmlbool(ctag['boolean-value']); break;\n\t\t\t\t\t\tcase 'float': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'percentage': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'currency': q.t = 'n'; q.v = parseFloat(ctag.value); break;\n\t\t\t\t\t\tcase 'date': q.t = 'd'; q.v = parseDate(ctag['date-value']);\n\t\t\t\t\t\t\tif(!opts.cellDates) { q.t = 'n'; q.v = datenum(q.v); }\n\t\t\t\t\t\t\tq.z = 'm/d/yy'; break;\n\t\t\t\t\t\tcase 'time': q.t = 'n'; q.v = parse_isodur(ctag['time-value'])/86400;\n\t\t\t\t\t\t\tif(opts.cellDates) { q.t = 'd'; q.v = numdate(q.v); }\n\t\t\t\t\t\t\tq.z = 'HH:MM:SS'; break;\n\t\t\t\t\t\tcase 'number': q.t = 'n'; q.v = parseFloat(ctag['数据数值']); break;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tif(q.t === 'string' || q.t === 'text' || !q.t) {\n\t\t\t\t\t\t\t\tq.t = 's';\n\t\t\t\t\t\t\t\tif(ctag['string-value'] != null) { textp = unescapexml(ctag['string-value']); textR = []; }\n\t\t\t\t\t\t\t} else throw new Error('Unsupported value type ' + q.t);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tisstub = false;\n\t\t\t\t\tif(q.t === 's') {\n\t\t\t\t\t\tq.v = textp || '';\n\t\t\t\t\t\tif(textR.length) q.R = textR;\n\t\t\t\t\t\tisstub = textpidx == 0;\n\t\t\t\t\t}\n\t\t\t\t\tif(atag.Target) q.l = atag;\n\t\t\t\t\tif(comments.length > 0) { q.c = comments; comments = []; }\n\t\t\t\t\tif(textp && opts.cellText !== false) q.w = textp;\n\t\t\t\t\tif(isstub) { q.t = \"z\"; delete q.v; }\n\t\t\t\t\tif(!isstub || opts.sheetStubs) {\n\t\t\t\t\t\tif(!(opts.sheetRows && opts.sheetRows <= R)) {\n\t\t\t\t\t\t\tfor(var rpt = 0; rpt < rowpeat; ++rpt) {\n\t\t\t\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\t\t\t\tif(opts.dense) {\n\t\t\t\t\t\t\t\t\tif(!ws[R + rpt]) ws[R + rpt] = [];\n\t\t\t\t\t\t\t\t\tws[R + rpt][C] = rpt == 0 ? q : dup(q);\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[R + rpt][C + colpeat] = dup(q);\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tws[encode_cell({r:R + rpt,c:C})] = q;\n\t\t\t\t\t\t\t\t\twhile(--colpeat > 0) ws[encode_cell({r:R + rpt,c:C + colpeat})] = dup(q);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\tif(range.e.c <= C) range.e.c = C;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tcolpeat = parseInt(ctag['number-columns-repeated']||\"1\", 10);\n\t\t\t\t\tC += colpeat-1; colpeat = 0;\n\t\t\t\t\tq = {/*:: t:\"\", v:null, z:null, w:\"\",c:[]*/};\n\t\t\t\t\ttextp = \"\"; textR = [];\n\t\t\t\t}\n\t\t\t\tatag = ({}/*:any*/);\n\t\t\t\tbreak; // 9.1.4 \n\n\t\t\t/* pure state */\n\t\t\tcase 'document': // TODO: is the root for FODS\n\t\t\tcase 'document-content': case '电子表格文档': // 3.1.3.2 \n\t\t\tcase 'spreadsheet': case '主体': // 3.7 \n\t\t\tcase 'scripts': // 3.12 \n\t\t\tcase 'styles': // TODO \n\t\t\tcase 'font-face-decls': // 3.14 \n\t\t\tcase 'master-styles': // 3.15.4 -- relevant for FODS\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], true]);\n\t\t\t\tbreak;\n\n\t\t\tcase 'annotation': // 14.1 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t\tcomment.t = textp;\n\t\t\t\t\tif(textR.length) /*::(*/comment/*:: :any)*/.R = textR;\n\t\t\t\t\tcomment.a = creator;\n\t\t\t\t\tcomments.push(comment);\n\t\t\t\t}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') {state.push([Rn[3], false]);}\n\t\t\t\tcreator = \"\"; creatoridx = 0;\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'creator': // 4.3.2.7 \n\t\t\t\tif(Rn[1]==='/') { creator = str.slice(creatoridx,Rn.index); }\n\t\t\t\telse creatoridx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\t/* ignore state */\n\t\t\tcase 'meta': case '元数据': // TODO: FODS/UOF\n\t\t\tcase 'settings': // TODO: \n\t\t\tcase 'config-item-set': // TODO: \n\t\t\tcase 'config-item-map-indexed': // TODO: \n\t\t\tcase 'config-item-map-entry': // TODO: \n\t\t\tcase 'config-item-map-named': // TODO: \n\t\t\tcase 'shapes': // 9.2.8 \n\t\t\tcase 'frame': // 10.4.2 \n\t\t\tcase 'text-box': // 10.4.3 \n\t\t\tcase 'image': // 10.4.4 \n\t\t\tcase 'data-pilot-tables': // 9.6.2 \n\t\t\tcase 'list-style': // 16.30 \n\t\t\tcase 'form': // 13.13 \n\t\t\tcase 'dde-links': // 9.8 \n\t\t\tcase 'event-listeners': // TODO\n\t\t\tcase 'chart': // TODO\n\t\t\t\tif(Rn[1]==='/'){if((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;}\n\t\t\t\telse if(Rn[0].charAt(Rn[0].length-2) !== '/') state.push([Rn[3], false]);\n\t\t\t\ttextp = \"\"; textpidx = 0; textR = [];\n\t\t\t\tbreak;\n\n\t\t\tcase 'scientific-number': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-symbol': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'currency-style': // TODO: \n\t\t\t\tbreak;\n\t\t\tcase 'number-style': // 16.27.2 \n\t\t\tcase 'percentage-style': // 16.27.9 \n\t\t\tcase 'date-style': // 16.27.10 \n\t\t\tcase 'time-style': // 16.27.18 \n\t\t\t\tif(Rn[1]==='/'){\n\t\t\t\t\tnumber_format_map[NFtag.name] = NF;\n\t\t\t\t\tif((tmp=state.pop())[0]!==Rn[3]) throw \"Bad state: \"+tmp;\n\t\t\t\t} else if(Rn[0].charAt(Rn[0].length-2) !== '/') {\n\t\t\t\t\tNF = \"\";\n\t\t\t\t\tNFtag = parsexmltag(Rn[0], false);\n\t\t\t\t\tstate.push([Rn[3], true]);\n\t\t\t\t} break;\n\n\t\t\tcase 'script': break; // 3.13 \n\t\t\tcase 'libraries': break; // TODO: \n\t\t\tcase 'automatic-styles': break; // 3.15.3 \n\n\t\t\tcase 'default-style': // TODO: \n\t\t\tcase 'page-layout': break; // TODO: \n\t\t\tcase 'style': // 16.2 \n\t\t\t\tbreak;\n\t\t\tcase 'map': break; // 16.3 \n\t\t\tcase 'font-face': break; // 16.21 \n\n\t\t\tcase 'paragraph-properties': break; // 17.6 \n\t\t\tcase 'table-properties': break; // 17.15 \n\t\t\tcase 'table-column-properties': break; // 17.16 \n\t\t\tcase 'table-row-properties': break; // 17.17 \n\t\t\tcase 'table-cell-properties': break; // 17.18 \n\n\t\t\tcase 'number': // 16.27.3 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats_ods[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'fraction': break; // TODO 16.27.6 \n\n\t\t\tcase 'day': // 16.27.11 \n\t\t\tcase 'month': // 16.27.12 \n\t\t\tcase 'year': // 16.27.13 \n\t\t\tcase 'era': // 16.27.14 \n\t\t\tcase 'day-of-week': // 16.27.15 \n\t\t\tcase 'week-of-year': // 16.27.16 \n\t\t\tcase 'quarter': // 16.27.17 \n\t\t\tcase 'hours': // 16.27.19 \n\t\t\tcase 'minutes': // 16.27.20 \n\t\t\tcase 'seconds': // 16.27.21 \n\t\t\tcase 'am-pm': // 16.27.22 \n\t\t\t\tswitch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t\t\tNF += number_formats_ods[Rn[3]][tag.style==='long'?1:0]; break;\n\t\t\t\t} break;\n\n\t\t\tcase 'boolean-style': break; // 16.27.23 \n\t\t\tcase 'boolean': break; // 16.27.24 \n\t\t\tcase 'text-style': break; // 16.27.25 \n\t\t\tcase 'text': // 16.27.26 \n\t\t\t\tif(Rn[0].slice(-2) === \"/>\") break;\n\t\t\t\telse if(Rn[1]===\"/\") switch(state[state.length-1][0]) {\n\t\t\t\t\tcase 'number-style':\n\t\t\t\t\tcase 'date-style':\n\t\t\t\t\tcase 'time-style':\n\t\t\t\t\t\tNF += str.slice(pidx, Rn.index);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse pidx = Rn.index + Rn[0].length;\n\t\t\t\tbreak;\n\n\t\t\tcase 'named-range': // 9.4.12 \n\t\t\t\ttag = parsexmltag(Rn[0], false);\n\t\t\t\t_Ref = ods_to_csf_3D(tag['cell-range-address']);\n\t\t\t\tvar nrange = ({Name:tag.name, Ref:_Ref[0] + '!' + _Ref[1]}/*:any*/);\n\t\t\t\tif(intable) nrange.Sheet = SheetNames.length;\n\t\t\t\tWB.Names.push(nrange);\n\t\t\t\tbreak;\n\n\t\t\tcase 'text-content': break; // 16.27.27 \n\t\t\tcase 'text-properties': break; // 16.27.27 \n\t\t\tcase 'embedded-text': break; // 16.27.4 \n\n\t\t\tcase 'body': case '电子表格': break; // 3.3 16.9.6 19.726.3\n\n\t\t\tcase 'forms': break; // 12.25.2 13.2\n\t\t\tcase 'table-column': break; // 9.1.6 \n\t\t\tcase 'table-header-rows': break; // 9.1.7 \n\t\t\tcase 'table-rows': break; // 9.1.12 \n\t\t\t/* TODO: outline levels */\n\t\t\tcase 'table-column-group': break; // 9.1.10 \n\t\t\tcase 'table-header-columns': break; // 9.1.11 \n\t\t\tcase 'table-columns': break; // 9.1.12 \n\n\t\t\tcase 'null-date': break; // 9.4.2 TODO: date1904\n\n\t\t\tcase 'graphic-properties': break; // 17.21 \n\t\t\tcase 'calculation-settings': break; // 9.4.1 \n\t\t\tcase 'named-expressions': break; // 9.4.11 \n\t\t\tcase 'label-range': break; // 9.4.9 \n\t\t\tcase 'label-ranges': break; // 9.4.10 \n\t\t\tcase 'named-expression': break; // 9.4.13 \n\t\t\tcase 'sort': break; // 9.4.19 \n\t\t\tcase 'sort-by': break; // 9.4.20 \n\t\t\tcase 'sort-groups': break; // 9.4.22 \n\n\t\t\tcase 'tab': break; // 6.1.4 \n\t\t\tcase 'line-break': break; // 6.1.5 \n\t\t\tcase 'span': break; // 6.1.7 \n\t\t\tcase 'p': case '文本串': // 5.1.3 \n\t\t\t\tif(['master-styles'].indexOf(state[state.length-1][0]) > -1) break;\n\t\t\t\tif(Rn[1]==='/' && (!ctag || !ctag['string-value'])) {\n\t\t\t\t\tvar ptp = parse_text_p(str.slice(textpidx,Rn.index), textptag);\n\t\t\t\t\ttextp = (textp.length > 0 ? textp + \"\\n\" : \"\") + ptp[0];\n\t\t\t\t} else { textptag = parsexmltag(Rn[0], false); textpidx = Rn.index + Rn[0].length; }\n\t\t\t\tbreak; // \n\t\t\tcase 's': break; // \n\n\t\t\tcase 'database-range': // 9.4.15 \n\t\t\t\tif(Rn[1]==='/') break;\n\t\t\t\ttry {\n\t\t\t\t\t_Ref = ods_to_csf_3D(parsexmltag(Rn[0])['target-range-address']);\n\t\t\t\t\tSheets[_Ref[0]]['!autofilter'] = { ref:_Ref[1] };\n\t\t\t\t} catch(e) {/* empty */}\n\t\t\t\tbreak;\n\n\t\t\tcase 'date': break; // <*:date>\n\n\t\t\tcase 'object': break; // 10.4.6.2 \n\t\t\tcase 'title': case '标题': break; // <*:title> OR \n\t\t\tcase 'desc': break; // <*:desc>\n\t\t\tcase 'binary-data': break; // 10.4.5 TODO: b64 blob\n\n\t\t\t/* 9.2 Advanced Tables */\n\t\t\tcase 'table-source': break; // 9.2.6\n\t\t\tcase 'scenario': break; // 9.2.6\n\n\t\t\tcase 'iteration': break; // 9.4.3 \n\t\t\tcase 'content-validations': break; // 9.4.4 \n\t\t\tcase 'filter': break; // 9.5.2 \n\t\t\tcase 'filter-and': break; // 9.5.3 \n\t\t\tcase 'filter-or': break; // 9.5.4 \n\t\t\tcase 'filter-condition': break; // 9.5.5 \n\n\t\t\tcase 'list-level-style-bullet': break; // 16.31 \n\t\t\tcase 'page-count': break; // TODO \n\t\t\tcase 'time': break; // TODO \n\n\t\t\t/* 9.3 Advanced Table Cells */\n\t\t\tcase 'cell-range-source': break; // 9.3.1 \n\t\t\tcase 'property': break; // 13.8 \n\n\t\t\tcase 'a': // 6.1.8 hyperlink\n\t\t\t\tif(Rn[1]!== '/') {\n\t\t\t\t\tatag = parsexmltag(Rn[0], false);\n\t\t\t\t\tif(!atag.href) break;\n\t\t\t\t\tatag.Target = unescapexml(atag.href); delete atag.href;\n\t\t\t\t\tif(atag.Target.charAt(0) == \"#\" && atag.Target.indexOf(\".\") > -1) {\n\t\t\t\t\t\t_Ref = ods_to_csf_3D(atag.Target.slice(1));\n\t\t\t\t\t\tatag.Target = \"#\" + _Ref[0] + \"!\" + _Ref[1];\n\t\t\t\t\t} else if(atag.Target.match(/^\\.\\.[\\\\\\/]/)) atag.Target = atag.Target.slice(3);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\t/* non-standard */\n\t\t\tcase 'table-protection': break;\n\t\t\tcase 'data-pilot-grand-total': break; // ',\n\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t\t'',\n\t\t\t'',\n\t\t''\n\t].join(\"\");\n\n\tvar payload = '' + master_styles + '';\n\n\treturn function wso(/*::wb, opts*/) {\n\t\treturn XML_HEADER + payload;\n\t};\n})();\nvar write_content_ods/*:{(wb:any, opts:any):string}*/ = /* @__PURE__ */(function() {\n\t/* 6.1.2 White Space Characters */\n\tvar write_text_p = function(text/*:string*/)/*:string*/ {\n\t\treturn escapexml(text)\n\t\t\t.replace(/ +/g, function($$){return '';})\n\t\t\t.replace(/\\t/g, \"\")\n\t\t\t.replace(/\\n/g, \"\")\n\t\t\t.replace(/^ /, \"\").replace(/ $/, \"\");\n\t};\n\n\tvar null_cell_xml = ' \\n';\n\tvar covered_cell_xml = ' \\n';\n\tvar write_ws = function(ws, wb/*:Workbook*/, i/*:number*//*::, opts*/)/*:string*/ {\n\t\t/* Section 9 Tables */\n\t\tvar o/*:Array*/ = [];\n\t\to.push(' \\n');\n\t\tvar R=0,C=0, range = decode_range(ws['!ref']||\"A1\");\n\t\tvar marr/*:Array*/ = ws['!merges'] || [], mi = 0;\n\t\tvar dense = Array.isArray(ws);\n\t\tif(ws[\"!cols\"]) {\n\t\t\tfor(C = 0; C <= range.e.c; ++C) o.push(' \\n');\n\t\t}\n\t\tvar H = \"\", ROWS = ws[\"!rows\"]||[];\n\t\tfor(R = 0; R < range.s.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t}\n\t\tfor(; R <= range.e.r; ++R) {\n\t\t\tH = ROWS[R] ? ' table:style-name=\"ro' + ROWS[R].ods + '\"' : \"\";\n\t\t\to.push(' \\n');\n\t\t\tfor(C=0; C < range.s.c; ++C) o.push(null_cell_xml);\n\t\t\tfor(; C <= range.e.c; ++C) {\n\t\t\t\tvar skip = false, ct = {}, textp = \"\";\n\t\t\t\tfor(mi = 0; mi != marr.length; ++mi) {\n\t\t\t\t\tif(marr[mi].s.c > C) continue;\n\t\t\t\t\tif(marr[mi].s.r > R) continue;\n\t\t\t\t\tif(marr[mi].e.c < C) continue;\n\t\t\t\t\tif(marr[mi].e.r < R) continue;\n\t\t\t\t\tif(marr[mi].s.c != C || marr[mi].s.r != R) skip = true;\n\t\t\t\t\tct['table:number-columns-spanned'] = (marr[mi].e.c - marr[mi].s.c + 1);\n\t\t\t\t\tct['table:number-rows-spanned'] = (marr[mi].e.r - marr[mi].s.r + 1);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(skip) { o.push(covered_cell_xml); continue; }\n\t\t\t\tvar ref = encode_cell({r:R, c:C}), cell = dense ? (ws[R]||[])[C]: ws[ref];\n\t\t\t\tif(cell && cell.f) {\n\t\t\t\t\tct['table:formula'] = escapexml(csf_to_ods_formula(cell.f));\n\t\t\t\t\tif(cell.F) {\n\t\t\t\t\t\tif(cell.F.slice(0, ref.length) == ref) {\n\t\t\t\t\t\t\tvar _Fref = decode_range(cell.F);\n\t\t\t\t\t\t\tct['table:number-matrix-columns-spanned'] = (_Fref.e.c - _Fref.s.c + 1);\n\t\t\t\t\t\t\tct['table:number-matrix-rows-spanned'] = (_Fref.e.r - _Fref.s.r + 1);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif(!cell) { o.push(null_cell_xml); continue; }\n\t\t\t\tswitch(cell.t) {\n\t\t\t\t\tcase 'b':\n\t\t\t\t\t\ttextp = (cell.v ? 'TRUE' : 'FALSE');\n\t\t\t\t\t\tct['office:value-type'] = \"boolean\";\n\t\t\t\t\t\tct['office:boolean-value'] = (cell.v ? 'true' : 'false');\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'n':\n\t\t\t\t\t\ttextp = (cell.w||String(cell.v||0));\n\t\t\t\t\t\tct['office:value-type'] = \"float\";\n\t\t\t\t\t\tct['office:value'] = (cell.v||0);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 's': case 'str':\n\t\t\t\t\t\ttextp = cell.v == null ? \"\" : cell.v;\n\t\t\t\t\t\tct['office:value-type'] = \"string\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 'd':\n\t\t\t\t\t\ttextp = (cell.w||(parseDate(cell.v).toISOString()));\n\t\t\t\t\t\tct['office:value-type'] = \"date\";\n\t\t\t\t\t\tct['office:date-value'] = (parseDate(cell.v).toISOString());\n\t\t\t\t\t\tct['table:style-name'] = \"ce1\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t//case 'e':\n\t\t\t\t\tdefault: o.push(null_cell_xml); continue;\n\t\t\t\t}\n\t\t\t\tvar text_p = write_text_p(textp);\n\t\t\t\tif(cell.l && cell.l.Target) {\n\t\t\t\t\tvar _tgt = cell.l.Target;\n\t\t\t\t\t_tgt = _tgt.charAt(0) == \"#\" ? \"#\" + csf_to_ods_3D(_tgt.slice(1)) : _tgt;\n\t\t\t\t\t// TODO: choose correct parent path format based on link delimiters\n\t\t\t\t\tif(_tgt.charAt(0) != \"#\" && !_tgt.match(/^\\w+:/)) _tgt = '../' + _tgt;\n\t\t\t\t\ttext_p = writextag('text:a', text_p, {'xlink:href': _tgt.replace(/&/g, \"&\")});\n\t\t\t\t}\n\t\t\t\to.push(' ' + writextag('table:table-cell', writextag('text:p', text_p, {}), ct) + '\\n');\n\t\t\t}\n\t\t\to.push(' \\n');\n\t\t}\n\t\to.push(' \\n');\n\t\treturn o.join(\"\");\n\t};\n\n\tvar write_automatic_styles_ods = function(o/*:Array*/, wb) {\n\t\to.push(' \\n');\n\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' /\\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* column styles */\n\t\tvar cidx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!cols\"]) {\n\t\t\t\tfor(var C = 0; C < ws[\"!cols\"].length; ++C) if(ws[\"!cols\"][C]) {\n\t\t\t\t\tvar colobj = ws[\"!cols\"][C];\n\t\t\t\t\tif(colobj.width == null && colobj.wpx == null && colobj.wch == null) continue;\n\t\t\t\t\tprocess_col(colobj);\n\t\t\t\t\tcolobj.ods = cidx;\n\t\t\t\t\tvar w = ws[\"!cols\"][C].wpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++cidx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* row styles */\n\t\tvar ridx = 0;\n\t\twb.SheetNames.map(function(n) { return wb.Sheets[n]; }).forEach(function(ws) {\n\t\t\tif(!ws) return;\n\t\t\tif(ws[\"!rows\"]) {\n\t\t\t\tfor(var R = 0; R < ws[\"!rows\"].length; ++R) if(ws[\"!rows\"][R]) {\n\t\t\t\t\tws[\"!rows\"][R].ods = ridx;\n\t\t\t\t\tvar h = ws[\"!rows\"][R].hpx + \"px\";\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\to.push(' \\n');\n\t\t\t\t\t++ridx;\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t/* table */\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\n\t\t/* table cells, text */\n\t\to.push(' \\n');\n\n\t\t/* page-layout */\n\n\t\to.push(' \\n');\n\t};\n\n\treturn function wcx(wb, opts) {\n\t\tvar o = [XML_HEADER];\n\t\t/* 3.1.3.2 */\n\t\tvar attr = wxt_helper({\n\t\t\t'xmlns:office': \"urn:oasis:names:tc:opendocument:xmlns:office:1.0\",\n\t\t\t'xmlns:table': \"urn:oasis:names:tc:opendocument:xmlns:table:1.0\",\n\t\t\t'xmlns:style': \"urn:oasis:names:tc:opendocument:xmlns:style:1.0\",\n\t\t\t'xmlns:text': \"urn:oasis:names:tc:opendocument:xmlns:text:1.0\",\n\t\t\t'xmlns:draw': \"urn:oasis:names:tc:opendocument:xmlns:drawing:1.0\",\n\t\t\t'xmlns:fo': \"urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0\",\n\t\t\t'xmlns:xlink': \"http://www.w3.org/1999/xlink\",\n\t\t\t'xmlns:dc': \"http://purl.org/dc/elements/1.1/\",\n\t\t\t'xmlns:meta': \"urn:oasis:names:tc:opendocument:xmlns:meta:1.0\",\n\t\t\t'xmlns:number': \"urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0\",\n\t\t\t'xmlns:presentation': \"urn:oasis:names:tc:opendocument:xmlns:presentation:1.0\",\n\t\t\t'xmlns:svg': \"urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0\",\n\t\t\t'xmlns:chart': \"urn:oasis:names:tc:opendocument:xmlns:chart:1.0\",\n\t\t\t'xmlns:dr3d': \"urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0\",\n\t\t\t'xmlns:math': \"http://www.w3.org/1998/Math/MathML\",\n\t\t\t'xmlns:form': \"urn:oasis:names:tc:opendocument:xmlns:form:1.0\",\n\t\t\t'xmlns:script': \"urn:oasis:names:tc:opendocument:xmlns:script:1.0\",\n\t\t\t'xmlns:ooo': \"http://openoffice.org/2004/office\",\n\t\t\t'xmlns:ooow': \"http://openoffice.org/2004/writer\",\n\t\t\t'xmlns:oooc': \"http://openoffice.org/2004/calc\",\n\t\t\t'xmlns:dom': \"http://www.w3.org/2001/xml-events\",\n\t\t\t'xmlns:xforms': \"http://www.w3.org/2002/xforms\",\n\t\t\t'xmlns:xsd': \"http://www.w3.org/2001/XMLSchema\",\n\t\t\t'xmlns:xsi': \"http://www.w3.org/2001/XMLSchema-instance\",\n\t\t\t'xmlns:sheet': \"urn:oasis:names:tc:opendocument:sh33tjs:1.0\",\n\t\t\t'xmlns:rpt': \"http://openoffice.org/2005/report\",\n\t\t\t'xmlns:of': \"urn:oasis:names:tc:opendocument:xmlns:of:1.2\",\n\t\t\t'xmlns:xhtml': \"http://www.w3.org/1999/xhtml\",\n\t\t\t'xmlns:grddl': \"http://www.w3.org/2003/g/data-view#\",\n\t\t\t'xmlns:tableooo': \"http://openoffice.org/2009/table\",\n\t\t\t'xmlns:drawooo': \"http://openoffice.org/2010/draw\",\n\t\t\t'xmlns:calcext': \"urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0\",\n\t\t\t'xmlns:loext': \"urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0\",\n\t\t\t'xmlns:field': \"urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0\",\n\t\t\t'xmlns:formx': \"urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0\",\n\t\t\t'xmlns:css3t': \"http://www.w3.org/TR/css3-text/\",\n\t\t\t'office:version': \"1.2\"\n\t\t});\n\n\t\tvar fods = wxt_helper({\n\t\t\t'xmlns:config': \"urn:oasis:names:tc:opendocument:xmlns:config:1.0\",\n\t\t\t'office:mimetype': \"application/vnd.oasis.opendocument.spreadsheet\"\n\t\t});\n\n\t\tif(opts.bookType == \"fods\") {\n\t\t\to.push('\\n');\n\t\t\to.push(write_meta_ods().replace(/office:document-meta/g, \"office:meta\"));\n\t\t\t// TODO: settings (equiv of settings.xml for ODS)\n\t\t} else o.push('\\n');\n\t\t// o.push(' \\n');\n\t\twrite_automatic_styles_ods(o, wb);\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tfor(var i = 0; i != wb.SheetNames.length; ++i) o.push(write_ws(wb.Sheets[wb.SheetNames[i]], wb, i, opts));\n\t\to.push(' \\n');\n\t\to.push(' \\n');\n\t\tif(opts.bookType == \"fods\") o.push('');\n\t\telse o.push('');\n\t\treturn o.join(\"\");\n\t};\n})();\n\nfunction write_ods(wb/*:any*/, opts/*:any*/) {\n\tif(opts.bookType == \"fods\") return write_content_ods(wb, opts);\n\n\tvar zip = zip_new();\n\tvar f = \"\";\n\n\tvar manifest/*:Array >*/ = [];\n\tvar rdf/*:Array<[string, string]>*/ = [];\n\n\t/* Part 3 Section 3.3 MIME Media Type */\n\tf = \"mimetype\";\n\tzip_add_file(zip, f, \"application/vnd.oasis.opendocument.spreadsheet\");\n\n\t/* Part 1 Section 2.2 Documents */\n\tf = \"content.xml\";\n\tzip_add_file(zip, f, write_content_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"ContentFile\"]);\n\n\t/* TODO: these are hard-coded styles to satiate excel */\n\tf = \"styles.xml\";\n\tzip_add_file(zip, f, write_styles_ods(wb, opts));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"StylesFile\"]);\n\n\t/* TODO: this is hard-coded to satiate excel */\n\tf = \"meta.xml\";\n\tzip_add_file(zip, f, XML_HEADER + write_meta_ods(/*::wb, opts*/));\n\tmanifest.push([f, \"text/xml\"]);\n\trdf.push([f, \"MetadataFile\"]);\n\n\t/* Part 3 Section 6 Metadata Manifest File */\n\tf = \"manifest.rdf\";\n\tzip_add_file(zip, f, write_rdf(rdf/*, opts*/));\n\tmanifest.push([f, \"application/rdf+xml\"]);\n\n\t/* Part 3 Section 4 Manifest File */\n\tf = \"META-INF/manifest.xml\";\n\tzip_add_file(zip, f, write_manifest(manifest/*, opts*/));\n\n\treturn zip;\n}\n\n/*! sheetjs (C) 2013-present SheetJS -- http://sheetjs.com */\nfunction u8_to_dataview(array) {\n return new DataView(array.buffer, array.byteOffset, array.byteLength);\n}\nfunction u8str(u8) {\n return typeof TextDecoder != \"undefined\" ? new TextDecoder().decode(u8) : utf8read(a2s(u8));\n}\nfunction stru8(str) {\n return typeof TextEncoder != \"undefined\" ? new TextEncoder().encode(str) : s2a(utf8write(str));\n}\nfunction u8contains(body, search) {\n outer:\n for (var L = 0; L <= body.length - search.length; ++L) {\n for (var j = 0; j < search.length; ++j)\n if (body[L + j] != search[j])\n continue outer;\n return true;\n }\n return false;\n}\nfunction u8concat(u8a) {\n var len = u8a.reduce(function(acc, x) {\n return acc + x.length;\n }, 0);\n var out = new Uint8Array(len);\n var off = 0;\n u8a.forEach(function(u8) {\n out.set(u8, off);\n off += u8.length;\n });\n return out;\n}\nfunction popcnt(x) {\n x -= x >> 1 & 1431655765;\n x = (x & 858993459) + (x >> 2 & 858993459);\n return (x + (x >> 4) & 252645135) * 16843009 >>> 24;\n}\nfunction readDecimal128LE(buf, offset) {\n var exp = (buf[offset + 15] & 127) << 7 | buf[offset + 14] >> 1;\n var mantissa = buf[offset + 14] & 1;\n for (var j = offset + 13; j >= offset; --j)\n mantissa = mantissa * 256 + buf[j];\n return (buf[offset + 15] & 128 ? -mantissa : mantissa) * Math.pow(10, exp - 6176);\n}\nfunction writeDecimal128LE(buf, offset, value) {\n var exp = Math.floor(value == 0 ? 0 : Math.LOG10E * Math.log(Math.abs(value))) + 6176 - 20;\n var mantissa = value / Math.pow(10, exp - 6176);\n buf[offset + 15] |= exp >> 7;\n buf[offset + 14] |= (exp & 127) << 1;\n for (var i = 0; mantissa >= 1; ++i, mantissa /= 256)\n buf[offset + i] = mantissa & 255;\n buf[offset + 15] |= value >= 0 ? 0 : 128;\n}\nfunction parse_varint49(buf, ptr) {\n var l = ptr ? ptr[0] : 0;\n var usz = buf[l] & 127;\n varint:\n if (buf[l++] >= 128) {\n usz |= (buf[l] & 127) << 7;\n if (buf[l++] < 128)\n break varint;\n usz |= (buf[l] & 127) << 14;\n if (buf[l++] < 128)\n break varint;\n usz |= (buf[l] & 127) << 21;\n if (buf[l++] < 128)\n break varint;\n usz += (buf[l] & 127) * Math.pow(2, 28);\n ++l;\n if (buf[l++] < 128)\n break varint;\n usz += (buf[l] & 127) * Math.pow(2, 35);\n ++l;\n if (buf[l++] < 128)\n break varint;\n usz += (buf[l] & 127) * Math.pow(2, 42);\n ++l;\n if (buf[l++] < 128)\n break varint;\n }\n if (ptr)\n ptr[0] = l;\n return usz;\n}\nfunction write_varint49(v) {\n var usz = new Uint8Array(7);\n usz[0] = v & 127;\n var L = 1;\n sz:\n if (v > 127) {\n usz[L - 1] |= 128;\n usz[L] = v >> 7 & 127;\n ++L;\n if (v <= 16383)\n break sz;\n usz[L - 1] |= 128;\n usz[L] = v >> 14 & 127;\n ++L;\n if (v <= 2097151)\n break sz;\n usz[L - 1] |= 128;\n usz[L] = v >> 21 & 127;\n ++L;\n if (v <= 268435455)\n break sz;\n usz[L - 1] |= 128;\n usz[L] = v / 256 >>> 21 & 127;\n ++L;\n if (v <= 34359738367)\n break sz;\n usz[L - 1] |= 128;\n usz[L] = v / 65536 >>> 21 & 127;\n ++L;\n if (v <= 4398046511103)\n break sz;\n usz[L - 1] |= 128;\n usz[L] = v / 16777216 >>> 21 & 127;\n ++L;\n }\n return usz.slice(0, L);\n}\nfunction varint_to_i32(buf) {\n var l = 0, i32 = buf[l] & 127;\n varint:\n if (buf[l++] >= 128) {\n i32 |= (buf[l] & 127) << 7;\n if (buf[l++] < 128)\n break varint;\n i32 |= (buf[l] & 127) << 14;\n if (buf[l++] < 128)\n break varint;\n i32 |= (buf[l] & 127) << 21;\n if (buf[l++] < 128)\n break varint;\n i32 |= (buf[l] & 127) << 28;\n }\n return i32;\n}\nfunction parse_shallow(buf) {\n var out = [], ptr = [0];\n while (ptr[0] < buf.length) {\n var off = ptr[0];\n var num = parse_varint49(buf, ptr);\n var type = num & 7;\n num = Math.floor(num / 8);\n var len = 0;\n var res;\n if (num == 0)\n break;\n switch (type) {\n case 0:\n {\n var l = ptr[0];\n while (buf[ptr[0]++] >= 128)\n ;\n res = buf.slice(l, ptr[0]);\n }\n break;\n case 5:\n len = 4;\n res = buf.slice(ptr[0], ptr[0] + len);\n ptr[0] += len;\n break;\n case 1:\n len = 8;\n res = buf.slice(ptr[0], ptr[0] + len);\n ptr[0] += len;\n break;\n case 2:\n len = parse_varint49(buf, ptr);\n res = buf.slice(ptr[0], ptr[0] + len);\n ptr[0] += len;\n break;\n case 3:\n case 4:\n default:\n throw new Error(\"PB Type \".concat(type, \" for Field \").concat(num, \" at offset \").concat(off));\n }\n var v = { data: res, type: type };\n if (out[num] == null)\n out[num] = [v];\n else\n out[num].push(v);\n }\n return out;\n}\nfunction write_shallow(proto) {\n var out = [];\n proto.forEach(function(field, idx) {\n field.forEach(function(item) {\n if (!item.data)\n return;\n out.push(write_varint49(idx * 8 + item.type));\n if (item.type == 2)\n out.push(write_varint49(item.data.length));\n out.push(item.data);\n });\n });\n return u8concat(out);\n}\nfunction mappa(data, cb) {\n return (data == null ? void 0 : data.map(function(d) {\n return cb(d.data);\n })) || [];\n}\nfunction parse_iwa_file(buf) {\n var _a;\n var out = [], ptr = [0];\n while (ptr[0] < buf.length) {\n var len = parse_varint49(buf, ptr);\n var ai = parse_shallow(buf.slice(ptr[0], ptr[0] + len));\n ptr[0] += len;\n var res = {\n id: varint_to_i32(ai[1][0].data),\n messages: []\n };\n ai[2].forEach(function(b) {\n var mi = parse_shallow(b.data);\n var fl = varint_to_i32(mi[3][0].data);\n res.messages.push({\n meta: mi,\n data: buf.slice(ptr[0], ptr[0] + fl)\n });\n ptr[0] += fl;\n });\n if ((_a = ai[3]) == null ? void 0 : _a[0])\n res.merge = varint_to_i32(ai[3][0].data) >>> 0 > 0;\n out.push(res);\n }\n return out;\n}\nfunction write_iwa_file(ias) {\n var bufs = [];\n ias.forEach(function(ia) {\n var ai = [];\n ai[1] = [{ data: write_varint49(ia.id), type: 0 }];\n ai[2] = [];\n if (ia.merge != null)\n ai[3] = [{ data: write_varint49(+!!ia.merge), type: 0 }];\n var midata = [];\n ia.messages.forEach(function(mi) {\n midata.push(mi.data);\n mi.meta[3] = [{ type: 0, data: write_varint49(mi.data.length) }];\n ai[2].push({ data: write_shallow(mi.meta), type: 2 });\n });\n var aipayload = write_shallow(ai);\n bufs.push(write_varint49(aipayload.length));\n bufs.push(aipayload);\n midata.forEach(function(mid) {\n return bufs.push(mid);\n });\n });\n return u8concat(bufs);\n}\nfunction parse_snappy_chunk(type, buf) {\n if (type != 0)\n throw new Error(\"Unexpected Snappy chunk type \".concat(type));\n var ptr = [0];\n var usz = parse_varint49(buf, ptr);\n var chunks = [];\n while (ptr[0] < buf.length) {\n var tag = buf[ptr[0]] & 3;\n if (tag == 0) {\n var len = buf[ptr[0]++] >> 2;\n if (len < 60)\n ++len;\n else {\n var c = len - 59;\n len = buf[ptr[0]];\n if (c > 1)\n len |= buf[ptr[0] + 1] << 8;\n if (c > 2)\n len |= buf[ptr[0] + 2] << 16;\n if (c > 3)\n len |= buf[ptr[0] + 3] << 24;\n len >>>= 0;\n len++;\n ptr[0] += c;\n }\n chunks.push(buf.slice(ptr[0], ptr[0] + len));\n ptr[0] += len;\n continue;\n } else {\n var offset = 0, length = 0;\n if (tag == 1) {\n length = (buf[ptr[0]] >> 2 & 7) + 4;\n offset = (buf[ptr[0]++] & 224) << 3;\n offset |= buf[ptr[0]++];\n } else {\n length = (buf[ptr[0]++] >> 2) + 1;\n if (tag == 2) {\n offset = buf[ptr[0]] | buf[ptr[0] + 1] << 8;\n ptr[0] += 2;\n } else {\n offset = (buf[ptr[0]] | buf[ptr[0] + 1] << 8 | buf[ptr[0] + 2] << 16 | buf[ptr[0] + 3] << 24) >>> 0;\n ptr[0] += 4;\n }\n }\n chunks = [u8concat(chunks)];\n if (offset == 0)\n throw new Error(\"Invalid offset 0\");\n if (offset > chunks[0].length)\n throw new Error(\"Invalid offset beyond length\");\n if (length >= offset) {\n chunks.push(chunks[0].slice(-offset));\n length -= offset;\n while (length >= chunks[chunks.length - 1].length) {\n chunks.push(chunks[chunks.length - 1]);\n length -= chunks[chunks.length - 1].length;\n }\n }\n chunks.push(chunks[0].slice(-offset, -offset + length));\n }\n }\n var o = u8concat(chunks);\n if (o.length != usz)\n throw new Error(\"Unexpected length: \".concat(o.length, \" != \").concat(usz));\n return o;\n}\nfunction decompress_iwa_file(buf) {\n var out = [];\n var l = 0;\n while (l < buf.length) {\n var t = buf[l++];\n var len = buf[l] | buf[l + 1] << 8 | buf[l + 2] << 16;\n l += 3;\n out.push(parse_snappy_chunk(t, buf.slice(l, l + len)));\n l += len;\n }\n if (l !== buf.length)\n throw new Error(\"data is not a valid framed stream!\");\n return u8concat(out);\n}\nfunction compress_iwa_file(buf) {\n var out = [];\n var l = 0;\n while (l < buf.length) {\n var c = Math.min(buf.length - l, 268435455);\n var frame = new Uint8Array(4);\n out.push(frame);\n var usz = write_varint49(c);\n var L = usz.length;\n out.push(usz);\n if (c <= 60) {\n L++;\n out.push(new Uint8Array([c - 1 << 2]));\n } else if (c <= 256) {\n L += 2;\n out.push(new Uint8Array([240, c - 1 & 255]));\n } else if (c <= 65536) {\n L += 3;\n out.push(new Uint8Array([244, c - 1 & 255, c - 1 >> 8 & 255]));\n } else if (c <= 16777216) {\n L += 4;\n out.push(new Uint8Array([248, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255]));\n } else if (c <= 4294967296) {\n L += 5;\n out.push(new Uint8Array([252, c - 1 & 255, c - 1 >> 8 & 255, c - 1 >> 16 & 255, c - 1 >>> 24 & 255]));\n }\n out.push(buf.slice(l, l + c));\n L += c;\n frame[0] = 0;\n frame[1] = L & 255;\n frame[2] = L >> 8 & 255;\n frame[3] = L >> 16 & 255;\n l += c;\n }\n return u8concat(out);\n}\nfunction parse_old_storage(buf, sst, rsst, v) {\n var dv = u8_to_dataview(buf);\n var flags = dv.getUint32(4, true);\n var data_offset = (v > 1 ? 12 : 8) + popcnt(flags & (v > 1 ? 3470 : 398)) * 4;\n var ridx = -1, sidx = -1, ieee = NaN, dt = new Date(2001, 0, 1);\n if (flags & 512) {\n ridx = dv.getUint32(data_offset, true);\n data_offset += 4;\n }\n data_offset += popcnt(flags & (v > 1 ? 12288 : 4096)) * 4;\n if (flags & 16) {\n sidx = dv.getUint32(data_offset, true);\n data_offset += 4;\n }\n if (flags & 32) {\n ieee = dv.getFloat64(data_offset, true);\n data_offset += 8;\n }\n if (flags & 64) {\n dt.setTime(dt.getTime() + dv.getFloat64(data_offset, true) * 1e3);\n data_offset += 8;\n }\n var ret;\n switch (buf[2]) {\n case 0:\n break;\n case 2:\n ret = { t: \"n\", v: ieee };\n break;\n case 3:\n ret = { t: \"s\", v: sst[sidx] };\n break;\n case 5:\n ret = { t: \"d\", v: dt };\n break;\n case 6:\n ret = { t: \"b\", v: ieee > 0 };\n break;\n case 7:\n ret = { t: \"n\", v: ieee / 86400 };\n break;\n case 8:\n ret = { t: \"e\", v: 0 };\n break;\n case 9:\n {\n if (ridx > -1)\n ret = { t: \"s\", v: rsst[ridx] };\n else if (sidx > -1)\n ret = { t: \"s\", v: sst[sidx] };\n else if (!isNaN(ieee))\n ret = { t: \"n\", v: ieee };\n else\n throw new Error(\"Unsupported cell type \".concat(buf.slice(0, 4)));\n }\n break;\n default:\n throw new Error(\"Unsupported cell type \".concat(buf.slice(0, 4)));\n }\n return ret;\n}\nfunction parse_new_storage(buf, sst, rsst) {\n var dv = u8_to_dataview(buf);\n var flags = dv.getUint32(8, true);\n var data_offset = 12;\n var ridx = -1, sidx = -1, d128 = NaN, ieee = NaN, dt = new Date(2001, 0, 1);\n if (flags & 1) {\n d128 = readDecimal128LE(buf, data_offset);\n data_offset += 16;\n }\n if (flags & 2) {\n ieee = dv.getFloat64(data_offset, true);\n data_offset += 8;\n }\n if (flags & 4) {\n dt.setTime(dt.getTime() + dv.getFloat64(data_offset, true) * 1e3);\n data_offset += 8;\n }\n if (flags & 8) {\n sidx = dv.getUint32(data_offset, true);\n data_offset += 4;\n }\n if (flags & 16) {\n ridx = dv.getUint32(data_offset, true);\n data_offset += 4;\n }\n var ret;\n switch (buf[1]) {\n case 0:\n break;\n case 2:\n ret = { t: \"n\", v: d128 };\n break;\n case 3:\n ret = { t: \"s\", v: sst[sidx] };\n break;\n case 5:\n ret = { t: \"d\", v: dt };\n break;\n case 6:\n ret = { t: \"b\", v: ieee > 0 };\n break;\n case 7:\n ret = { t: \"n\", v: ieee / 86400 };\n break;\n case 8:\n ret = { t: \"e\", v: 0 };\n break;\n case 9:\n {\n if (ridx > -1)\n ret = { t: \"s\", v: rsst[ridx] };\n else\n throw new Error(\"Unsupported cell type \".concat(buf[1], \" : \").concat(flags & 31, \" : \").concat(buf.slice(0, 4)));\n }\n break;\n case 10:\n ret = { t: \"n\", v: d128 };\n break;\n default:\n throw new Error(\"Unsupported cell type \".concat(buf[1], \" : \").concat(flags & 31, \" : \").concat(buf.slice(0, 4)));\n }\n return ret;\n}\nfunction write_new_storage(cell, sst) {\n var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;\n out[0] = 5;\n switch (cell.t) {\n case \"n\":\n out[1] = 2;\n writeDecimal128LE(out, l, cell.v);\n flags |= 1;\n l += 16;\n break;\n case \"b\":\n out[1] = 6;\n dv.setFloat64(l, cell.v ? 1 : 0, true);\n flags |= 2;\n l += 8;\n break;\n case \"s\":\n if (sst.indexOf(cell.v) == -1)\n throw new Error(\"Value \".concat(cell.v, \" missing from SST!\"));\n out[1] = 3;\n dv.setUint32(l, sst.indexOf(cell.v), true);\n flags |= 8;\n l += 4;\n break;\n default:\n throw \"unsupported cell type \" + cell.t;\n }\n dv.setUint32(8, flags, true);\n return out.slice(0, l);\n}\nfunction write_old_storage(cell, sst) {\n var out = new Uint8Array(32), dv = u8_to_dataview(out), l = 12, flags = 0;\n out[0] = 3;\n switch (cell.t) {\n case \"n\":\n out[2] = 2;\n dv.setFloat64(l, cell.v, true);\n flags |= 32;\n l += 8;\n break;\n case \"b\":\n out[2] = 6;\n dv.setFloat64(l, cell.v ? 1 : 0, true);\n flags |= 32;\n l += 8;\n break;\n case \"s\":\n if (sst.indexOf(cell.v) == -1)\n throw new Error(\"Value \".concat(cell.v, \" missing from SST!\"));\n out[2] = 3;\n dv.setUint32(l, sst.indexOf(cell.v), true);\n flags |= 16;\n l += 4;\n break;\n default:\n throw \"unsupported cell type \" + cell.t;\n }\n dv.setUint32(4, flags, true);\n return out.slice(0, l);\n}\nfunction parse_cell_storage(buf, sst, rsst) {\n switch (buf[0]) {\n case 0:\n case 1:\n case 2:\n case 3:\n return parse_old_storage(buf, sst, rsst, buf[0]);\n case 5:\n return parse_new_storage(buf, sst, rsst);\n default:\n throw new Error(\"Unsupported payload version \".concat(buf[0]));\n }\n}\nfunction parse_TSP_Reference(buf) {\n var pb = parse_shallow(buf);\n return parse_varint49(pb[1][0].data);\n}\nfunction write_TSP_Reference(idx) {\n var out = [];\n out[1] = [{ type: 0, data: write_varint49(idx) }];\n return write_shallow(out);\n}\nfunction parse_TST_TableDataList(M, root) {\n var pb = parse_shallow(root.data);\n var type = varint_to_i32(pb[1][0].data);\n var entries = pb[3];\n var data = [];\n (entries || []).forEach(function(entry) {\n var le = parse_shallow(entry.data);\n var key = varint_to_i32(le[1][0].data) >>> 0;\n switch (type) {\n case 1:\n data[key] = u8str(le[3][0].data);\n break;\n case 8:\n {\n var rt = M[parse_TSP_Reference(le[9][0].data)][0];\n var rtp = parse_shallow(rt.data);\n var rtpref = M[parse_TSP_Reference(rtp[1][0].data)][0];\n var mtype = varint_to_i32(rtpref.meta[1][0].data);\n if (mtype != 2001)\n throw new Error(\"2000 unexpected reference to \".concat(mtype));\n var tswpsa = parse_shallow(rtpref.data);\n data[key] = tswpsa[3].map(function(x) {\n return u8str(x.data);\n }).join(\"\");\n }\n break;\n }\n });\n return data;\n}\nfunction parse_TST_TileRowInfo(u8, type) {\n var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, _l, _m, _n;\n var pb = parse_shallow(u8);\n var R = varint_to_i32(pb[1][0].data) >>> 0;\n var cnt = varint_to_i32(pb[2][0].data) >>> 0;\n var wide_offsets = ((_b = (_a = pb[8]) == null ? void 0 : _a[0]) == null ? void 0 : _b.data) && varint_to_i32(pb[8][0].data) > 0 || false;\n var used_storage_u8, used_storage;\n if (((_d = (_c = pb[7]) == null ? void 0 : _c[0]) == null ? void 0 : _d.data) && type != 0) {\n used_storage_u8 = (_f = (_e = pb[7]) == null ? void 0 : _e[0]) == null ? void 0 : _f.data;\n used_storage = (_h = (_g = pb[6]) == null ? void 0 : _g[0]) == null ? void 0 : _h.data;\n } else if (((_j = (_i = pb[4]) == null ? void 0 : _i[0]) == null ? void 0 : _j.data) && type != 1) {\n used_storage_u8 = (_l = (_k = pb[4]) == null ? void 0 : _k[0]) == null ? void 0 : _l.data;\n used_storage = (_n = (_m = pb[3]) == null ? void 0 : _m[0]) == null ? void 0 : _n.data;\n } else\n throw \"NUMBERS Tile missing \".concat(type, \" cell storage\");\n var width = wide_offsets ? 4 : 1;\n var used_storage_offsets = u8_to_dataview(used_storage_u8);\n var offsets = [];\n for (var C = 0; C < used_storage_u8.length / 2; ++C) {\n var off = used_storage_offsets.getUint16(C * 2, true);\n if (off < 65535)\n offsets.push([C, off]);\n }\n if (offsets.length != cnt)\n throw \"Expected \".concat(cnt, \" cells, found \").concat(offsets.length);\n var cells = [];\n for (C = 0; C < offsets.length - 1; ++C)\n cells[offsets[C][0]] = used_storage.subarray(offsets[C][1] * width, offsets[C + 1][1] * width);\n if (offsets.length >= 1)\n cells[offsets[offsets.length - 1][0]] = used_storage.subarray(offsets[offsets.length - 1][1] * width);\n return { R: R, cells: cells };\n}\nfunction parse_TST_Tile(M, root) {\n var _a;\n var pb = parse_shallow(root.data);\n var storage = ((_a = pb == null ? void 0 : pb[7]) == null ? void 0 : _a[0]) ? varint_to_i32(pb[7][0].data) >>> 0 > 0 ? 1 : 0 : -1;\n var ri = mappa(pb[5], function(u8) {\n return parse_TST_TileRowInfo(u8, storage);\n });\n return {\n nrows: varint_to_i32(pb[4][0].data) >>> 0,\n data: ri.reduce(function(acc, x) {\n if (!acc[x.R])\n acc[x.R] = [];\n x.cells.forEach(function(cell, C) {\n if (acc[x.R][C])\n throw new Error(\"Duplicate cell r=\".concat(x.R, \" c=\").concat(C));\n acc[x.R][C] = cell;\n });\n return acc;\n }, [])\n };\n}\nfunction parse_TST_TableModelArchive(M, root, ws) {\n var _a;\n var pb = parse_shallow(root.data);\n var range = { s: { r: 0, c: 0 }, e: { r: 0, c: 0 } };\n range.e.r = (varint_to_i32(pb[6][0].data) >>> 0) - 1;\n if (range.e.r < 0)\n throw new Error(\"Invalid row varint \".concat(pb[6][0].data));\n range.e.c = (varint_to_i32(pb[7][0].data) >>> 0) - 1;\n if (range.e.c < 0)\n throw new Error(\"Invalid col varint \".concat(pb[7][0].data));\n ws[\"!ref\"] = encode_range(range);\n var store = parse_shallow(pb[4][0].data);\n var sst = parse_TST_TableDataList(M, M[parse_TSP_Reference(store[4][0].data)][0]);\n var rsst = ((_a = store[17]) == null ? void 0 : _a[0]) ? parse_TST_TableDataList(M, M[parse_TSP_Reference(store[17][0].data)][0]) : [];\n var tile = parse_shallow(store[3][0].data);\n var _R = 0;\n tile[1].forEach(function(t) {\n var tl = parse_shallow(t.data);\n var ref = M[parse_TSP_Reference(tl[2][0].data)][0];\n var mtype = varint_to_i32(ref.meta[1][0].data);\n if (mtype != 6002)\n throw new Error(\"6001 unexpected reference to \".concat(mtype));\n var _tile = parse_TST_Tile(M, ref);\n _tile.data.forEach(function(row, R) {\n row.forEach(function(buf, C) {\n var addr = encode_cell({ r: _R + R, c: C });\n var res = parse_cell_storage(buf, sst, rsst);\n if (res)\n ws[addr] = res;\n });\n });\n _R += _tile.nrows;\n });\n}\nfunction parse_TST_TableInfoArchive(M, root) {\n var pb = parse_shallow(root.data);\n var out = { \"!ref\": \"A1\" };\n var tableref = M[parse_TSP_Reference(pb[2][0].data)];\n var mtype = varint_to_i32(tableref[0].meta[1][0].data);\n if (mtype != 6001)\n throw new Error(\"6000 unexpected reference to \".concat(mtype));\n parse_TST_TableModelArchive(M, tableref[0], out);\n return out;\n}\nfunction parse_TN_SheetArchive(M, root) {\n var _a;\n var pb = parse_shallow(root.data);\n var out = {\n name: ((_a = pb[1]) == null ? void 0 : _a[0]) ? u8str(pb[1][0].data) : \"\",\n sheets: []\n };\n var shapeoffs = mappa(pb[2], parse_TSP_Reference);\n shapeoffs.forEach(function(off) {\n M[off].forEach(function(m) {\n var mtype = varint_to_i32(m.meta[1][0].data);\n if (mtype == 6e3)\n out.sheets.push(parse_TST_TableInfoArchive(M, m));\n });\n });\n return out;\n}\nfunction parse_TN_DocumentArchive(M, root) {\n var out = book_new();\n var pb = parse_shallow(root.data);\n var sheetoffs = mappa(pb[1], parse_TSP_Reference);\n sheetoffs.forEach(function(off) {\n M[off].forEach(function(m) {\n var mtype = varint_to_i32(m.meta[1][0].data);\n if (mtype == 2) {\n var root2 = parse_TN_SheetArchive(M, m);\n root2.sheets.forEach(function(sheet, idx) {\n book_append_sheet(out, sheet, idx == 0 ? root2.name : root2.name + \"_\" + idx, true);\n });\n }\n });\n });\n if (out.SheetNames.length == 0)\n throw new Error(\"Empty NUMBERS file\");\n return out;\n}\nfunction parse_numbers_iwa(cfb) {\n var _a, _b, _c, _d;\n var M = {}, indices = [];\n cfb.FullPaths.forEach(function(p) {\n if (p.match(/\\.iwpv2/))\n throw new Error(\"Unsupported password protection\");\n });\n cfb.FileIndex.forEach(function(s) {\n if (!s.name.match(/\\.iwa$/))\n return;\n var o;\n try {\n o = decompress_iwa_file(s.content);\n } catch (e) {\n return console.log(\"?? \" + s.content.length + \" \" + (e.message || e));\n }\n var packets;\n try {\n packets = parse_iwa_file(o);\n } catch (e) {\n return console.log(\"## \" + (e.message || e));\n }\n packets.forEach(function(packet) {\n M[packet.id] = packet.messages;\n indices.push(packet.id);\n });\n });\n if (!indices.length)\n throw new Error(\"File has no messages\");\n var docroot = ((_d = (_c = (_b = (_a = M == null ? void 0 : M[1]) == null ? void 0 : _a[0]) == null ? void 0 : _b.meta) == null ? void 0 : _c[1]) == null ? void 0 : _d[0].data) && varint_to_i32(M[1][0].meta[1][0].data) == 1 && M[1][0];\n if (!docroot)\n indices.forEach(function(idx) {\n M[idx].forEach(function(iwam) {\n var mtype = varint_to_i32(iwam.meta[1][0].data) >>> 0;\n if (mtype == 1) {\n if (!docroot)\n docroot = iwam;\n else\n throw new Error(\"Document has multiple roots\");\n }\n });\n });\n if (!docroot)\n throw new Error(\"Cannot find Document root\");\n return parse_TN_DocumentArchive(M, docroot);\n}\nfunction write_tile_row(tri, data, SST) {\n var _a, _b, _c, _d;\n if (!((_a = tri[6]) == null ? void 0 : _a[0]) || !((_b = tri[7]) == null ? void 0 : _b[0]))\n throw \"Mutation only works on post-BNC storages!\";\n var wide_offsets = ((_d = (_c = tri[8]) == null ? void 0 : _c[0]) == null ? void 0 : _d.data) && varint_to_i32(tri[8][0].data) > 0 || false;\n if (wide_offsets)\n throw \"Math only works with normal offsets\";\n var cnt = 0;\n var dv = u8_to_dataview(tri[7][0].data), last_offset = 0, cell_storage = [];\n var _dv = u8_to_dataview(tri[4][0].data), _last_offset = 0, _cell_storage = [];\n for (var C = 0; C < data.length; ++C) {\n if (data[C] == null) {\n dv.setUint16(C * 2, 65535, true);\n _dv.setUint16(C * 2, 65535);\n continue;\n }\n dv.setUint16(C * 2, last_offset, true);\n _dv.setUint16(C * 2, _last_offset, true);\n var celload, _celload;\n switch (typeof data[C]) {\n case \"string\":\n celload = write_new_storage({ t: \"s\", v: data[C] }, SST);\n _celload = write_old_storage({ t: \"s\", v: data[C] }, SST);\n break;\n case \"number\":\n celload = write_new_storage({ t: \"n\", v: data[C] }, SST);\n _celload = write_old_storage({ t: \"n\", v: data[C] }, SST);\n break;\n case \"boolean\":\n celload = write_new_storage({ t: \"b\", v: data[C] }, SST);\n _celload = write_old_storage({ t: \"b\", v: data[C] }, SST);\n break;\n default:\n throw new Error(\"Unsupported value \" + data[C]);\n }\n cell_storage.push(celload);\n last_offset += celload.length;\n _cell_storage.push(_celload);\n _last_offset += _celload.length;\n ++cnt;\n }\n tri[2][0].data = write_varint49(cnt);\n for (; C < tri[7][0].data.length / 2; ++C) {\n dv.setUint16(C * 2, 65535, true);\n _dv.setUint16(C * 2, 65535, true);\n }\n tri[6][0].data = u8concat(cell_storage);\n tri[3][0].data = u8concat(_cell_storage);\n return cnt;\n}\nfunction write_numbers_iwa(wb, opts) {\n if (!opts || !opts.numbers)\n throw new Error(\"Must pass a `numbers` option -- check the README\");\n var ws = wb.Sheets[wb.SheetNames[0]];\n if (wb.SheetNames.length > 1)\n console.error(\"The Numbers writer currently writes only the first table\");\n var range = decode_range(ws[\"!ref\"]);\n range.s.r = range.s.c = 0;\n var trunc = false;\n if (range.e.c > 9) {\n trunc = true;\n range.e.c = 9;\n }\n if (range.e.r > 49) {\n trunc = true;\n range.e.r = 49;\n }\n if (trunc)\n console.error(\"The Numbers writer is currently limited to \".concat(encode_range(range)));\n var data = sheet_to_json(ws, { range: range, header: 1 });\n var SST = [\"~Sh33tJ5~\"];\n data.forEach(function(row) {\n return row.forEach(function(cell) {\n if (typeof cell == \"string\")\n SST.push(cell);\n });\n });\n var dependents = {};\n var indices = [];\n var cfb = CFB.read(opts.numbers, { type: \"base64\" });\n cfb.FileIndex.map(function(fi, idx) {\n return [fi, cfb.FullPaths[idx]];\n }).forEach(function(row) {\n var fi = row[0], fp = row[1];\n if (fi.type != 2)\n return;\n if (!fi.name.match(/\\.iwa/))\n return;\n var old_content = fi.content;\n var raw1 = decompress_iwa_file(old_content);\n var x2 = parse_iwa_file(raw1);\n x2.forEach(function(packet2) {\n indices.push(packet2.id);\n dependents[packet2.id] = { deps: [], location: fp, type: varint_to_i32(packet2.messages[0].meta[1][0].data) };\n });\n });\n indices.sort(function(x2, y2) {\n return x2 - y2;\n });\n var indices_varint = indices.filter(function(x2) {\n return x2 > 1;\n }).map(function(x2) {\n return [x2, write_varint49(x2)];\n });\n cfb.FileIndex.map(function(fi, idx) {\n return [fi, cfb.FullPaths[idx]];\n }).forEach(function(row) {\n var fi = row[0], fp = row[1];\n if (!fi.name.match(/\\.iwa/))\n return;\n var x2 = parse_iwa_file(decompress_iwa_file(fi.content));\n x2.forEach(function(ia) {\n ia.messages.forEach(function(m) {\n indices_varint.forEach(function(ivi) {\n if (ia.messages.some(function(mess) {\n return varint_to_i32(mess.meta[1][0].data) != 11006 && u8contains(mess.data, ivi[1]);\n })) {\n dependents[ivi[0]].deps.push(ia.id);\n }\n });\n });\n });\n });\n function get_unique_msgid() {\n for (var i = 927262; i < 2e6; ++i)\n if (!dependents[i])\n return i;\n throw new Error(\"Too many messages\");\n }\n var entry = CFB.find(cfb, dependents[1].location);\n var x = parse_iwa_file(decompress_iwa_file(entry.content));\n var docroot;\n for (var xi = 0; xi < x.length; ++xi) {\n var packet = x[xi];\n if (packet.id == 1)\n docroot = packet;\n }\n var sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[1][0].data);\n entry = CFB.find(cfb, dependents[sheetrootref].location);\n x = parse_iwa_file(decompress_iwa_file(entry.content));\n for (xi = 0; xi < x.length; ++xi) {\n packet = x[xi];\n if (packet.id == sheetrootref)\n docroot = packet;\n }\n sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[2][0].data);\n entry = CFB.find(cfb, dependents[sheetrootref].location);\n x = parse_iwa_file(decompress_iwa_file(entry.content));\n for (xi = 0; xi < x.length; ++xi) {\n packet = x[xi];\n if (packet.id == sheetrootref)\n docroot = packet;\n }\n sheetrootref = parse_TSP_Reference(parse_shallow(docroot.messages[0].data)[2][0].data);\n entry = CFB.find(cfb, dependents[sheetrootref].location);\n x = parse_iwa_file(decompress_iwa_file(entry.content));\n for (xi = 0; xi < x.length; ++xi) {\n packet = x[xi];\n if (packet.id == sheetrootref)\n docroot = packet;\n }\n var pb = parse_shallow(docroot.messages[0].data);\n {\n pb[6][0].data = write_varint49(range.e.r + 1);\n pb[7][0].data = write_varint49(range.e.c + 1);\n var cruidsref = parse_TSP_Reference(pb[46][0].data);\n var oldbucket = CFB.find(cfb, dependents[cruidsref].location);\n var _x = parse_iwa_file(decompress_iwa_file(oldbucket.content));\n {\n for (var j = 0; j < _x.length; ++j) {\n if (_x[j].id == cruidsref)\n break;\n }\n if (_x[j].id != cruidsref)\n throw \"Bad ColumnRowUIDMapArchive\";\n var cruids = parse_shallow(_x[j].messages[0].data);\n cruids[1] = [];\n cruids[2] = [], cruids[3] = [];\n for (var C = 0; C <= range.e.c; ++C) {\n var uuid = [];\n uuid[1] = uuid[2] = [{ type: 0, data: write_varint49(C + 420690) }];\n cruids[1].push({ type: 2, data: write_shallow(uuid) });\n cruids[2].push({ type: 0, data: write_varint49(C) });\n cruids[3].push({ type: 0, data: write_varint49(C) });\n }\n cruids[4] = [];\n cruids[5] = [], cruids[6] = [];\n for (var R = 0; R <= range.e.r; ++R) {\n uuid = [];\n uuid[1] = uuid[2] = [{ type: 0, data: write_varint49(R + 726270) }];\n cruids[4].push({ type: 2, data: write_shallow(uuid) });\n cruids[5].push({ type: 0, data: write_varint49(R) });\n cruids[6].push({ type: 0, data: write_varint49(R) });\n }\n _x[j].messages[0].data = write_shallow(cruids);\n }\n oldbucket.content = compress_iwa_file(write_iwa_file(_x));\n oldbucket.size = oldbucket.content.length;\n delete pb[46];\n var store = parse_shallow(pb[4][0].data);\n {\n store[7][0].data = write_varint49(range.e.r + 1);\n var row_headers = parse_shallow(store[1][0].data);\n var row_header_ref = parse_TSP_Reference(row_headers[2][0].data);\n oldbucket = CFB.find(cfb, dependents[row_header_ref].location);\n _x = parse_iwa_file(decompress_iwa_file(oldbucket.content));\n {\n if (_x[0].id != row_header_ref)\n throw \"Bad HeaderStorageBucket\";\n var base_bucket = parse_shallow(_x[0].messages[0].data);\n for (R = 0; R < data.length; ++R) {\n var _bucket = parse_shallow(base_bucket[2][0].data);\n _bucket[1][0].data = write_varint49(R);\n _bucket[4][0].data = write_varint49(data[R].length);\n base_bucket[2][R] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) };\n }\n _x[0].messages[0].data = write_shallow(base_bucket);\n }\n oldbucket.content = compress_iwa_file(write_iwa_file(_x));\n oldbucket.size = oldbucket.content.length;\n var col_header_ref = parse_TSP_Reference(store[2][0].data);\n oldbucket = CFB.find(cfb, dependents[col_header_ref].location);\n _x = parse_iwa_file(decompress_iwa_file(oldbucket.content));\n {\n if (_x[0].id != col_header_ref)\n throw \"Bad HeaderStorageBucket\";\n base_bucket = parse_shallow(_x[0].messages[0].data);\n for (C = 0; C <= range.e.c; ++C) {\n _bucket = parse_shallow(base_bucket[2][0].data);\n _bucket[1][0].data = write_varint49(C);\n _bucket[4][0].data = write_varint49(range.e.r + 1);\n base_bucket[2][C] = { type: base_bucket[2][0].type, data: write_shallow(_bucket) };\n }\n _x[0].messages[0].data = write_shallow(base_bucket);\n }\n oldbucket.content = compress_iwa_file(write_iwa_file(_x));\n oldbucket.size = oldbucket.content.length;\n var sstref = parse_TSP_Reference(store[4][0].data);\n (function() {\n var sentry = CFB.find(cfb, dependents[sstref].location);\n var sx = parse_iwa_file(decompress_iwa_file(sentry.content));\n var sstroot;\n for (var sxi = 0; sxi < sx.length; ++sxi) {\n var packet2 = sx[sxi];\n if (packet2.id == sstref)\n sstroot = packet2;\n }\n var sstdata = parse_shallow(sstroot.messages[0].data);\n {\n sstdata[3] = [];\n var newsst = [];\n SST.forEach(function(str, i) {\n newsst[1] = [{ type: 0, data: write_varint49(i) }];\n newsst[2] = [{ type: 0, data: write_varint49(1) }];\n newsst[3] = [{ type: 2, data: stru8(str) }];\n sstdata[3].push({ type: 2, data: write_shallow(newsst) });\n });\n }\n sstroot.messages[0].data = write_shallow(sstdata);\n var sy = write_iwa_file(sx);\n var raw32 = compress_iwa_file(sy);\n sentry.content = raw32;\n sentry.size = sentry.content.length;\n })();\n var tile = parse_shallow(store[3][0].data);\n {\n var t = tile[1][0];\n delete tile[2];\n var tl = parse_shallow(t.data);\n {\n var tileref = parse_TSP_Reference(tl[2][0].data);\n (function() {\n var tentry = CFB.find(cfb, dependents[tileref].location);\n var tx = parse_iwa_file(decompress_iwa_file(tentry.content));\n var tileroot;\n for (var sxi = 0; sxi < tx.length; ++sxi) {\n var packet2 = tx[sxi];\n if (packet2.id == tileref)\n tileroot = packet2;\n }\n var tiledata = parse_shallow(tileroot.messages[0].data);\n {\n delete tiledata[6];\n delete tile[7];\n var rowload = new Uint8Array(tiledata[5][0].data);\n tiledata[5] = [];\n var cnt = 0;\n for (var R2 = 0; R2 <= range.e.r; ++R2) {\n var tilerow = parse_shallow(rowload);\n cnt += write_tile_row(tilerow, data[R2], SST);\n tilerow[1][0].data = write_varint49(R2);\n tiledata[5].push({ data: write_shallow(tilerow), type: 2 });\n }\n tiledata[1] = [{ type: 0, data: write_varint49(range.e.c + 1) }];\n tiledata[2] = [{ type: 0, data: write_varint49(range.e.r + 1) }];\n tiledata[3] = [{ type: 0, data: write_varint49(cnt) }];\n tiledata[4] = [{ type: 0, data: write_varint49(range.e.r + 1) }];\n }\n tileroot.messages[0].data = write_shallow(tiledata);\n var ty = write_iwa_file(tx);\n var raw32 = compress_iwa_file(ty);\n tentry.content = raw32;\n tentry.size = tentry.content.length;\n })();\n }\n t.data = write_shallow(tl);\n }\n store[3][0].data = write_shallow(tile);\n }\n pb[4][0].data = write_shallow(store);\n }\n docroot.messages[0].data = write_shallow(pb);\n var y = write_iwa_file(x);\n var raw3 = compress_iwa_file(y);\n entry.content = raw3;\n entry.size = entry.content.length;\n return cfb;\n}\nfunction fix_opts_func(defaults/*:Array >*/)/*:{(o:any):void}*/ {\n\treturn function fix_opts(opts) {\n\t\tfor(var i = 0; i != defaults.length; ++i) {\n\t\t\tvar d = defaults[i];\n\t\t\tif(opts[d[0]] === undefined) opts[d[0]] = d[1];\n\t\t\tif(d[2] === 'n') opts[d[0]] = Number(opts[d[0]]);\n\t\t}\n\t};\n}\n\nfunction fix_read_opts(opts) {\nfix_opts_func([\n\t['cellNF', false], /* emit cell number format string as .z */\n\t['cellHTML', true], /* emit html string as .h */\n\t['cellFormula', true], /* emit formulae as .f */\n\t['cellStyles', false], /* emits style/theme as .s */\n\t['cellText', true], /* emit formatted text as .w */\n\t['cellDates', false], /* emit date cells with type `d` */\n\n\t['sheetStubs', false], /* emit empty cells */\n\t['sheetRows', 0, 'n'], /* read n rows (0 = read all rows) */\n\n\t['bookDeps', false], /* parse calculation chains */\n\t['bookSheets', false], /* only try to get sheet names (no Sheets) */\n\t['bookProps', false], /* only try to get properties (no Sheets) */\n\t['bookFiles', false], /* include raw file structure (keys, files, cfb) */\n\t['bookVBA', false], /* include vba raw data (vbaraw) */\n\n\t['password',''], /* password */\n\t['WTF', false] /* WTF mode (throws errors) */\n])(opts);\n}\n\nfunction fix_write_opts(opts) {\nfix_opts_func([\n\t['cellDates', false], /* write date cells with type `d` */\n\n\t['bookSST', false], /* Generate Shared String Table */\n\n\t['bookType', 'xlsx'], /* Type of workbook (xlsx/m/b) */\n\n\t['compression', false], /* Use file compression */\n\n\t['WTF', false] /* WTF mode (throws errors) */\n])(opts);\n}\nfunction get_sheet_type(n/*:string*/)/*:string*/ {\n\tif(RELS.WS.indexOf(n) > -1) return \"sheet\";\n\tif(RELS.CS && n == RELS.CS) return \"chart\";\n\tif(RELS.DS && n == RELS.DS) return \"dialog\";\n\tif(RELS.MS && n == RELS.MS) return \"macro\";\n\treturn (n && n.length) ? n : \"sheet\";\n}\nfunction safe_parse_wbrels(wbrels, sheets) {\n\tif(!wbrels) return 0;\n\ttry {\n\t\twbrels = sheets.map(function pwbr(w) { if(!w.id) w.id = w.strRelID; return [w.name, wbrels['!id'][w.id].Target, get_sheet_type(wbrels['!id'][w.id].Type)]; });\n\t} catch(e) { return null; }\n\treturn !wbrels || wbrels.length === 0 ? null : wbrels;\n}\n\nfunction safe_parse_sheet(zip, path/*:string*/, relsPath/*:string*/, sheet, idx/*:number*/, sheetRels, sheets, stype/*:string*/, opts, wb, themes, styles) {\n\ttry {\n\t\tsheetRels[sheet]=parse_rels(getzipstr(zip, relsPath, true), path);\n\t\tvar data = getzipdata(zip, path);\n\t\tvar _ws;\n\t\tswitch(stype) {\n\t\t\tcase 'sheet': _ws = parse_ws(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'chart': _ws = parse_cs(data, path, idx, opts, sheetRels[sheet], wb, themes, styles);\n\t\t\t\tif(!_ws || !_ws['!drawel']) break;\n\t\t\t\tvar dfile = resolve_path(_ws['!drawel'].Target, path);\n\t\t\t\tvar drelsp = get_rels_path(dfile);\n\t\t\t\tvar draw = parse_drawing(getzipstr(zip, dfile, true), parse_rels(getzipstr(zip, drelsp, true), dfile));\n\t\t\t\tvar chartp = resolve_path(draw, dfile);\n\t\t\t\tvar crelsp = get_rels_path(chartp);\n\t\t\t\t_ws = parse_chart(getzipstr(zip, chartp, true), chartp, opts, parse_rels(getzipstr(zip, crelsp, true), chartp), wb, _ws);\n\t\t\t\tbreak;\n\t\t\tcase 'macro': _ws = parse_ms(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tcase 'dialog': _ws = parse_ds(data, path, idx, opts, sheetRels[sheet], wb, themes, styles); break;\n\t\t\tdefault: throw new Error(\"Unrecognized sheet type \" + stype);\n\t\t}\n\t\tsheets[sheet] = _ws;\n\n\t\t/* scan rels for comments and threaded comments */\n\t\tvar tcomments = [];\n\t\tif(sheetRels && sheetRels[sheet]) keys(sheetRels[sheet]).forEach(function(n) {\n\t\t\tvar dfile = \"\";\n\t\t\tif(sheetRels[sheet][n].Type == RELS.CMNT) {\n\t\t\t\tdfile = resolve_path(sheetRels[sheet][n].Target, path);\n\t\t\t\tvar comments = parse_cmnt(getzipdata(zip, dfile, true), dfile, opts);\n\t\t\t\tif(!comments || !comments.length) return;\n\t\t\t\tsheet_insert_comments(_ws, comments, false);\n\t\t\t}\n\t\t\tif(sheetRels[sheet][n].Type == RELS.TCMNT) {\n\t\t\t\tdfile = resolve_path(sheetRels[sheet][n].Target, path);\n\t\t\t\ttcomments = tcomments.concat(parse_tcmnt_xml(getzipdata(zip, dfile, true), opts));\n\t\t\t}\n\t\t});\n\t\tif(tcomments && tcomments.length) sheet_insert_comments(_ws, tcomments, true, opts.people || []);\n\t} catch(e) { if(opts.WTF) throw e; }\n}\n\nfunction strip_front_slash(x/*:string*/)/*:string*/ { return x.charAt(0) == '/' ? x.slice(1) : x; }\n\nfunction parse_zip(zip/*:ZIP*/, opts/*:?ParseOpts*/)/*:Workbook*/ {\n\tmake_ssf();\n\topts = opts || {};\n\tfix_read_opts(opts);\n\n\t/* OpenDocument Part 3 Section 2.2.1 OpenDocument Package */\n\tif(safegetzipfile(zip, 'META-INF/manifest.xml')) return parse_ods(zip, opts);\n\t/* UOC */\n\tif(safegetzipfile(zip, 'objectdata.xml')) return parse_ods(zip, opts);\n\t/* Numbers */\n\tif(safegetzipfile(zip, 'Index/Document.iwa')) {\n\t\tif(typeof Uint8Array == \"undefined\") throw new Error('NUMBERS file parsing requires Uint8Array support');\n\t\tif(typeof parse_numbers_iwa != \"undefined\") {\n\t\t\tif(zip.FileIndex) return parse_numbers_iwa(zip);\n\t\t\tvar _zip = CFB.utils.cfb_new();\n\t\t\tzipentries(zip).forEach(function(e) { zip_add_file(_zip, e, getzipbin(zip, e)); });\n\t\t\treturn parse_numbers_iwa(_zip);\n\t\t}\n\t\tthrow new Error('Unsupported NUMBERS file');\n\t}\n\tif(!safegetzipfile(zip, '[Content_Types].xml')) {\n\t\tif(safegetzipfile(zip, 'index.xml.gz')) throw new Error('Unsupported NUMBERS 08 file');\n\t\tif(safegetzipfile(zip, 'index.xml')) throw new Error('Unsupported NUMBERS 09 file');\n\t\tthrow new Error('Unsupported ZIP file');\n\t}\n\n\tvar entries = zipentries(zip);\n\tvar dir = parse_ct((getzipstr(zip, '[Content_Types].xml')/*:?any*/));\n\tvar xlsb = false;\n\tvar sheets, binname;\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.xml\";\n\t\tif(getzipdata(zip,binname, true)) dir.workbooks.push(binname);\n\t}\n\tif(dir.workbooks.length === 0) {\n\t\tbinname = \"xl/workbook.bin\";\n\t\tif(!getzipdata(zip,binname,true)) throw new Error(\"Could not find workbook\");\n\t\tdir.workbooks.push(binname);\n\t\txlsb = true;\n\t}\n\tif(dir.workbooks[0].slice(-3) == \"bin\") xlsb = true;\n\n\tvar themes = ({}/*:any*/);\n\tvar styles = ({}/*:any*/);\n\tif(!opts.bookSheets && !opts.bookProps) {\n\t\tstrs = [];\n\t\tif(dir.sst) try { strs=parse_sst(getzipdata(zip, strip_front_slash(dir.sst)), dir.sst, opts); } catch(e) { if(opts.WTF) throw e; }\n\n\t\tif(opts.cellStyles && dir.themes.length) themes = parse_theme(getzipstr(zip, dir.themes[0].replace(/^\\//,''), true)||\"\",dir.themes[0], opts);\n\n\t\tif(dir.style) styles = parse_sty(getzipdata(zip, strip_front_slash(dir.style)), dir.style, themes, opts);\n\t}\n\n\t/*var externbooks = */dir.links.map(function(link) {\n\t\ttry {\n\t\t\tvar rels = parse_rels(getzipstr(zip, get_rels_path(strip_front_slash(link))), link);\n\t\t\treturn parse_xlink(getzipdata(zip, strip_front_slash(link)), rels, link, opts);\n\t\t} catch(e) {}\n\t});\n\n\tvar wb = parse_wb(getzipdata(zip, strip_front_slash(dir.workbooks[0])), dir.workbooks[0], opts);\n\n\tvar props = {}, propdata = \"\";\n\n\tif(dir.coreprops.length) {\n\t\tpropdata = getzipdata(zip, strip_front_slash(dir.coreprops[0]), true);\n\t\tif(propdata) props = parse_core_props(propdata);\n\t\tif(dir.extprops.length !== 0) {\n\t\t\tpropdata = getzipdata(zip, strip_front_slash(dir.extprops[0]), true);\n\t\t\tif(propdata) parse_ext_props(propdata, props, opts);\n\t\t}\n\t}\n\n\tvar custprops = {};\n\tif(!opts.bookSheets || opts.bookProps) {\n\t\tif (dir.custprops.length !== 0) {\n\t\t\tpropdata = getzipstr(zip, strip_front_slash(dir.custprops[0]), true);\n\t\t\tif(propdata) custprops = parse_cust_props(propdata, opts);\n\t\t}\n\t}\n\n\tvar out = ({}/*:any*/);\n\tif(opts.bookSheets || opts.bookProps) {\n\t\tif(wb.Sheets) sheets = wb.Sheets.map(function pluck(x){ return x.name; });\n\t\telse if(props.Worksheets && props.SheetNames.length > 0) sheets=props.SheetNames;\n\t\tif(opts.bookProps) { out.Props = props; out.Custprops = custprops; }\n\t\tif(opts.bookSheets && typeof sheets !== 'undefined') out.SheetNames = sheets;\n\t\tif(opts.bookSheets ? out.SheetNames : opts.bookProps) return out;\n\t}\n\tsheets = {};\n\n\tvar deps = {};\n\tif(opts.bookDeps && dir.calcchain) deps=parse_cc(getzipdata(zip, strip_front_slash(dir.calcchain)),dir.calcchain,opts);\n\n\tvar i=0;\n\tvar sheetRels = ({}/*:any*/);\n\tvar path, relsPath;\n\n\t{\n\t\tvar wbsheets = wb.Sheets;\n\t\tprops.Worksheets = wbsheets.length;\n\t\tprops.SheetNames = [];\n\t\tfor(var j = 0; j != wbsheets.length; ++j) {\n\t\t\tprops.SheetNames[j] = wbsheets[j].name;\n\t\t}\n\t}\n\n\tvar wbext = xlsb ? \"bin\" : \"xml\";\n\tvar wbrelsi = dir.workbooks[0].lastIndexOf(\"/\");\n\tvar wbrelsfile = (dir.workbooks[0].slice(0, wbrelsi+1) + \"_rels/\" + dir.workbooks[0].slice(wbrelsi+1) + \".rels\").replace(/^\\//,\"\");\n\tif(!safegetzipfile(zip, wbrelsfile)) wbrelsfile = 'xl/_rels/workbook.' + wbext + '.rels';\n\tvar wbrels = parse_rels(getzipstr(zip, wbrelsfile, true), wbrelsfile.replace(/_rels.*/, \"s5s\"));\n\n\tif((dir.metadata || []).length >= 1) {\n\t\t/* TODO: MDX and other types of metadata */\n\t\topts.xlmeta = parse_xlmeta(getzipdata(zip, strip_front_slash(dir.metadata[0])),dir.metadata[0],opts);\n\t}\n\n\tif((dir.people || []).length >= 1) {\n\t\topts.people = parse_people_xml(getzipdata(zip, strip_front_slash(dir.people[0])),opts);\n\t}\n\n\tif(wbrels) wbrels = safe_parse_wbrels(wbrels, wb.Sheets);\n\n\t/* Numbers iOS hack */\n\tvar nmode = (getzipdata(zip,\"xl/worksheets/sheet.xml\",true))?1:0;\n\twsloop: for(i = 0; i != props.Worksheets; ++i) {\n\t\tvar stype = \"sheet\";\n\t\tif(wbrels && wbrels[i]) {\n\t\t\tpath = 'xl/' + (wbrels[i][1]).replace(/[\\/]?xl\\//, \"\");\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrels[i][1];\n\t\t\tif(!safegetzipfile(zip, path)) path = wbrelsfile.replace(/_rels\\/.*$/,\"\") + wbrels[i][1];\n\t\t\tstype = wbrels[i][2];\n\t\t} else {\n\t\t\tpath = 'xl/worksheets/sheet'+(i+1-nmode)+\".\" + wbext;\n\t\t\tpath = path.replace(/sheet0\\./,\"sheet.\");\n\t\t}\n\t\trelsPath = path.replace(/^(.*)(\\/)([^\\/]*)$/, \"$1/_rels/$3.rels\");\n\t\tif(opts && opts.sheets != null) switch(typeof opts.sheets) {\n\t\t\tcase \"number\": if(i != opts.sheets) continue wsloop; break;\n\t\t\tcase \"string\": if(props.SheetNames[i].toLowerCase() != opts.sheets.toLowerCase()) continue wsloop; break;\n\t\t\tdefault: if(Array.isArray && Array.isArray(opts.sheets)) {\n\t\t\t\tvar snjseen = false;\n\t\t\t\tfor(var snj = 0; snj != opts.sheets.length; ++snj) {\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"number\" && opts.sheets[snj] == i) snjseen=1;\n\t\t\t\t\tif(typeof opts.sheets[snj] == \"string\" && opts.sheets[snj].toLowerCase() == props.SheetNames[i].toLowerCase()) snjseen = 1;\n\t\t\t\t}\n\t\t\t\tif(!snjseen) continue wsloop;\n\t\t\t}\n\t\t}\n\t\tsafe_parse_sheet(zip, path, relsPath, props.SheetNames[i], i, sheetRels, sheets, stype, opts, wb, themes, styles);\n\t}\n\n\tout = ({\n\t\tDirectory: dir,\n\t\tWorkbook: wb,\n\t\tProps: props,\n\t\tCustprops: custprops,\n\t\tDeps: deps,\n\t\tSheets: sheets,\n\t\tSheetNames: props.SheetNames,\n\t\tStrings: strs,\n\t\tStyles: styles,\n\t\tThemes: themes,\n\t\tSSF: dup(table_fmt)\n\t}/*:any*/);\n\tif(opts && opts.bookFiles) {\n\t\tif(zip.files) {\n\t\t\tout.keys = entries;\n\t\t\tout.files = zip.files;\n\t\t} else {\n\t\t\tout.keys = [];\n\t\t\tout.files = {};\n\t\t\tzip.FullPaths.forEach(function(p, idx) {\n\t\t\t\tp = p.replace(/^Root Entry[\\/]/, \"\");\n\t\t\t\tout.keys.push(p);\n\t\t\t\tout.files[p] = zip.FileIndex[idx];\n\t\t\t});\n\t\t}\n\t}\n\tif(opts && opts.bookVBA) {\n\t\tif(dir.vba.length > 0) out.vbaraw = getzipdata(zip,strip_front_slash(dir.vba[0]),true);\n\t\telse if(dir.defaults && dir.defaults.bin === CT_VBA) out.vbaraw = getzipdata(zip, 'xl/vbaProject.bin',true);\n\t}\n\treturn out;\n}\n\n/* [MS-OFFCRYPTO] 2.1.1 */\nfunction parse_xlsxcfb(cfb, _opts/*:?ParseOpts*/)/*:Workbook*/ {\n\tvar opts = _opts || {};\n\tvar f = 'Workbook', data = CFB.find(cfb, f);\n\ttry {\n\tf = '/!DataSpaces/Version';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var version = */parse_DataSpaceVersionInfo(data.content);\n\n\t/* 2.3.4.1 */\n\tf = '/!DataSpaces/DataSpaceMap';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar dsm = parse_DataSpaceMap(data.content);\n\tif(dsm.length !== 1 || dsm[0].comps.length !== 1 || dsm[0].comps[0].t !== 0 || dsm[0].name !== \"StrongEncryptionDataSpace\" || dsm[0].comps[0].v !== \"EncryptedPackage\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.2 */\n\tf = '/!DataSpaces/DataSpaceInfo/StrongEncryptionDataSpace';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar seds = parse_DataSpaceDefinition(data.content);\n\tif(seds.length != 1 || seds[0] != \"StrongEncryptionTransform\")\n\t\tthrow new Error(\"ECMA-376 Encrypted file bad \" + f);\n\n\t/* 2.3.4.3 */\n\tf = '/!DataSpaces/TransformInfo/StrongEncryptionTransform/!Primary';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\t/*var hdr = */parse_Primary(data.content);\n\t} catch(e) {}\n\n\tf = '/EncryptionInfo';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\tvar einfo = parse_EncryptionInfo(data.content);\n\n\t/* 2.3.4.4 */\n\tf = '/EncryptedPackage';\n\tdata = CFB.find(cfb, f); if(!data || !data.content) throw new Error(\"ECMA-376 Encrypted file missing \" + f);\n\n/*global decrypt_agile */\n/*:: declare var decrypt_agile:any; */\n\tif(einfo[0] == 0x04 && typeof decrypt_agile !== 'undefined') return decrypt_agile(einfo[1], data.content, opts.password || \"\", opts);\n/*global decrypt_std76 */\n/*:: declare var decrypt_std76:any; */\n\tif(einfo[0] == 0x02 && typeof decrypt_std76 !== 'undefined') return decrypt_std76(einfo[1], data.content, opts.password || \"\", opts);\n\tthrow new Error(\"File is password-protected\");\n}\n\nfunction write_zip(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {\n\tif(opts.bookType == \"ods\") return write_ods(wb, opts);\n\tif(opts.bookType == \"numbers\") return write_numbers_iwa(wb, opts);\n\tif(opts.bookType == \"xlsb\") return write_zip_xlsxb(wb, opts);\n\treturn write_zip_xlsx(wb, opts);\n}\n\n/* XLSX and XLSB writing are very similar. Originally they were unified in one\n export function. This is horrible for tree shaking in the common case (most\n applications need to export files in one format) so this function supports\n both formats while write_zip_xlsx only handles XLSX */\nfunction write_zip_xlsxb(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {\n\t_shapeid = 1024;\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = dup(table_fmt);\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(); SSF_load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tif(browser_has_Map) opts.revStrings = new Map();\n\telse { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }\n\tvar wbext = opts.bookType == \"xlsb\" ? \"bin\" : \"xml\";\n\tvar vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;\n\tvar ct = new_ct();\n\tfix_write_opts(opts = opts || {});\n\tvar zip = zip_new();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tf = \"docProps/core.xml\";\n\tzip_add_file(zip, f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\n\t/*::if(!wb.Props) throw \"unreachable\"; */\n\tf = \"docProps/app.xml\";\n\tif(wb.Props && wb.Props.SheetNames){/* empty */}\n\telse if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;\n\telse {\n\t\tvar _sn = [];\n\t\tfor(var _i = 0; _i < wb.SheetNames.length; ++_i)\n\t\t\tif((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);\n\t\twb.Props.SheetNames = _sn;\n\t}\n\twb.Props.Worksheets = wb.Props.SheetNames.length;\n\tzip_add_file(zip, f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip_add_file(zip, f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tvar wsrels = {'!id':{}};\n\t\tvar ws = wb.Sheets[wb.SheetNames[rId-1]];\n\t\tvar _type = (ws || {})[\"!type\"] || \"sheet\";\n\t\tswitch(_type) {\n\t\tcase \"chart\":\n\t\t\t/* falls through */\n\t\tdefault:\n\t\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\t\tzip_add_file(zip, f, write_ws(rId-1, f, opts, wb, wsrels));\n\t\t\tct.sheets.push(f);\n\t\t\tadd_rels(opts.wbrels, -1, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS[0]);\n\t\t}\n\n\t\tif(ws) {\n\t\t\tvar comments = ws['!comments'];\n\t\t\tvar need_vml = false;\n\t\t\tvar cf = \"\";\n\t\t\tif(comments && comments.length > 0) {\n\t\t\t\tcf = \"xl/comments\" + rId + \".\" + wbext;\n\t\t\t\tzip_add_file(zip, cf, write_cmnt(comments, cf, opts));\n\t\t\t\tct.comments.push(cf);\n\t\t\t\tadd_rels(wsrels, -1, \"../comments\" + rId + \".\" + wbext, RELS.CMNT);\n\t\t\t\tneed_vml = true;\n\t\t\t}\n\t\t\tif(ws['!legacy']) {\n\t\t\t\tif(need_vml) zip_add_file(zip, \"xl/drawings/vmlDrawing\" + (rId) + \".vml\", write_comments_vml(rId, ws['!comments']));\n\t\t\t}\n\t\t\tdelete ws['!comments'];\n\t\t\tdelete ws['!legacy'];\n\t\t}\n\n\t\tif(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip_add_file(zip, f, write_sst(opts.Strings, f, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip_add_file(zip, f, write_wb(wb, f, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip_add_file(zip, f, write_theme(wb.Themes, opts));\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, -1, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip_add_file(zip, f, write_sty(wb, f, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, -1, \"styles.\" + wbext, RELS.STY);\n\n\tif(wb.vbaraw && vbafmt) {\n\t\tf = \"xl/vbaProject.bin\";\n\t\tzip_add_file(zip, f, wb.vbaraw);\n\t\tct.vba.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"vbaProject.bin\", RELS.VBA);\n\t}\n\n\tf = \"xl/metadata.\" + wbext;\n\tzip_add_file(zip, f, write_xlmeta(f));\n\tct.metadata.push(f);\n\tadd_rels(opts.wbrels, -1, \"metadata.\" + wbext, RELS.XLMETA);\n\n\tzip_add_file(zip, \"[Content_Types].xml\", write_ct(ct, opts));\n\tzip_add_file(zip, '_rels/.rels', write_rels(opts.rels));\n\tzip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\n\tdelete opts.revssf; delete opts.ssf;\n\treturn zip;\n}\n\nfunction write_zip_xlsx(wb/*:Workbook*/, opts/*:WriteOpts*/)/*:ZIP*/ {\n\t_shapeid = 1024;\n\tif(wb && !wb.SSF) {\n\t\twb.SSF = dup(table_fmt);\n\t}\n\tif(wb && wb.SSF) {\n\t\tmake_ssf(); SSF_load_table(wb.SSF);\n\t\t// $FlowIgnore\n\t\topts.revssf = evert_num(wb.SSF); opts.revssf[wb.SSF[65535]] = 0;\n\t\topts.ssf = wb.SSF;\n\t}\n\topts.rels = {}; opts.wbrels = {};\n\topts.Strings = /*::((*/[]/*:: :any):SST)*/; opts.Strings.Count = 0; opts.Strings.Unique = 0;\n\tif(browser_has_Map) opts.revStrings = new Map();\n\telse { opts.revStrings = {}; opts.revStrings.foo = []; delete opts.revStrings.foo; }\n\tvar wbext = \"xml\";\n\tvar vbafmt = VBAFMTS.indexOf(opts.bookType) > -1;\n\tvar ct = new_ct();\n\tfix_write_opts(opts = opts || {});\n\tvar zip = zip_new();\n\tvar f = \"\", rId = 0;\n\n\topts.cellXfs = [];\n\tget_cell_style(opts.cellXfs, {}, {revssf:{\"General\":0}});\n\n\tif(!wb.Props) wb.Props = {};\n\n\tf = \"docProps/core.xml\";\n\tzip_add_file(zip, f, write_core_props(wb.Props, opts));\n\tct.coreprops.push(f);\n\tadd_rels(opts.rels, 2, f, RELS.CORE_PROPS);\n\n\t/*::if(!wb.Props) throw \"unreachable\"; */\n\tf = \"docProps/app.xml\";\n\tif(wb.Props && wb.Props.SheetNames){/* empty */}\n\telse if(!wb.Workbook || !wb.Workbook.Sheets) wb.Props.SheetNames = wb.SheetNames;\n\telse {\n\t\tvar _sn = [];\n\t\tfor(var _i = 0; _i < wb.SheetNames.length; ++_i)\n\t\t\tif((wb.Workbook.Sheets[_i]||{}).Hidden != 2) _sn.push(wb.SheetNames[_i]);\n\t\twb.Props.SheetNames = _sn;\n\t}\n\twb.Props.Worksheets = wb.Props.SheetNames.length;\n\tzip_add_file(zip, f, write_ext_props(wb.Props, opts));\n\tct.extprops.push(f);\n\tadd_rels(opts.rels, 3, f, RELS.EXT_PROPS);\n\n\tif(wb.Custprops !== wb.Props && keys(wb.Custprops||{}).length > 0) {\n\t\tf = \"docProps/custom.xml\";\n\t\tzip_add_file(zip, f, write_cust_props(wb.Custprops, opts));\n\t\tct.custprops.push(f);\n\t\tadd_rels(opts.rels, 4, f, RELS.CUST_PROPS);\n\t}\n\n\tvar people = [\"SheetJ5\"];\n\topts.tcid = 0;\n\n\tfor(rId=1;rId <= wb.SheetNames.length; ++rId) {\n\t\tvar wsrels = {'!id':{}};\n\t\tvar ws = wb.Sheets[wb.SheetNames[rId-1]];\n\t\tvar _type = (ws || {})[\"!type\"] || \"sheet\";\n\t\tswitch(_type) {\n\t\tcase \"chart\":\n\t\t\t/* falls through */\n\t\tdefault:\n\t\t\tf = \"xl/worksheets/sheet\" + rId + \".\" + wbext;\n\t\t\tzip_add_file(zip, f, write_ws_xml(rId-1, opts, wb, wsrels));\n\t\t\tct.sheets.push(f);\n\t\t\tadd_rels(opts.wbrels, -1, \"worksheets/sheet\" + rId + \".\" + wbext, RELS.WS[0]);\n\t\t}\n\n\t\tif(ws) {\n\t\t\tvar comments = ws['!comments'];\n\t\t\tvar need_vml = false;\n\t\t\tvar cf = \"\";\n\t\t\tif(comments && comments.length > 0) {\n\t\t\t\tvar needtc = false;\n\t\t\t\tcomments.forEach(function(carr) {\n\t\t\t\t\tcarr[1].forEach(function(c) { if(c.T == true) needtc = true; });\n\t\t\t\t});\n\t\t\t\tif(needtc) {\n\t\t\t\t\tcf = \"xl/threadedComments/threadedComment\" + rId + \".\" + wbext;\n\t\t\t\t\tzip_add_file(zip, cf, write_tcmnt_xml(comments, people, opts));\n\t\t\t\t\tct.threadedcomments.push(cf);\n\t\t\t\t\tadd_rels(wsrels, -1, \"../threadedComments/threadedComment\" + rId + \".\" + wbext, RELS.TCMNT);\n\t\t\t\t}\n\n\t\t\t\tcf = \"xl/comments\" + rId + \".\" + wbext;\n\t\t\t\tzip_add_file(zip, cf, write_comments_xml(comments, opts));\n\t\t\t\tct.comments.push(cf);\n\t\t\t\tadd_rels(wsrels, -1, \"../comments\" + rId + \".\" + wbext, RELS.CMNT);\n\t\t\t\tneed_vml = true;\n\t\t\t}\n\t\t\tif(ws['!legacy']) {\n\t\t\t\tif(need_vml) zip_add_file(zip, \"xl/drawings/vmlDrawing\" + (rId) + \".vml\", write_comments_vml(rId, ws['!comments']));\n\t\t\t}\n\t\t\tdelete ws['!comments'];\n\t\t\tdelete ws['!legacy'];\n\t\t}\n\n\t\tif(wsrels['!id'].rId1) zip_add_file(zip, get_rels_path(f), write_rels(wsrels));\n\t}\n\n\tif(opts.Strings != null && opts.Strings.length > 0) {\n\t\tf = \"xl/sharedStrings.\" + wbext;\n\t\tzip_add_file(zip, f, write_sst_xml(opts.Strings, opts));\n\t\tct.strs.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"sharedStrings.\" + wbext, RELS.SST);\n\t}\n\n\tf = \"xl/workbook.\" + wbext;\n\tzip_add_file(zip, f, write_wb_xml(wb, opts));\n\tct.workbooks.push(f);\n\tadd_rels(opts.rels, 1, f, RELS.WB);\n\n\t/* TODO: something more intelligent with themes */\n\n\tf = \"xl/theme/theme1.xml\";\n\tzip_add_file(zip, f, write_theme(wb.Themes, opts));\n\tct.themes.push(f);\n\tadd_rels(opts.wbrels, -1, \"theme/theme1.xml\", RELS.THEME);\n\n\t/* TODO: something more intelligent with styles */\n\n\tf = \"xl/styles.\" + wbext;\n\tzip_add_file(zip, f, write_sty_xml(wb, opts));\n\tct.styles.push(f);\n\tadd_rels(opts.wbrels, -1, \"styles.\" + wbext, RELS.STY);\n\n\tif(wb.vbaraw && vbafmt) {\n\t\tf = \"xl/vbaProject.bin\";\n\t\tzip_add_file(zip, f, wb.vbaraw);\n\t\tct.vba.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"vbaProject.bin\", RELS.VBA);\n\t}\n\n\tf = \"xl/metadata.\" + wbext;\n\tzip_add_file(zip, f, write_xlmeta_xml());\n\tct.metadata.push(f);\n\tadd_rels(opts.wbrels, -1, \"metadata.\" + wbext, RELS.XLMETA);\n\n\tif(people.length > 1) {\n\t\tf = \"xl/persons/person.xml\";\n\t\tzip_add_file(zip, f, write_people_xml(people, opts));\n\t\tct.people.push(f);\n\t\tadd_rels(opts.wbrels, -1, \"persons/person.xml\", RELS.PEOPLE);\n\t}\n\n\tzip_add_file(zip, \"[Content_Types].xml\", write_ct(ct, opts));\n\tzip_add_file(zip, '_rels/.rels', write_rels(opts.rels));\n\tzip_add_file(zip, 'xl/_rels/workbook.' + wbext + '.rels', write_rels(opts.wbrels));\n\n\tdelete opts.revssf; delete opts.ssf;\n\treturn zip;\n}\n\nfunction firstbyte(f/*:RawData*/,o/*:?TypeOpts*/)/*:Array*/ {\n\tvar x = \"\";\n\tswitch((o||{}).type || \"base64\") {\n\t\tcase 'buffer': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tcase 'base64': x = Base64_decode(f.slice(0,12)); break;\n\t\tcase 'binary': x = f; break;\n\t\tcase 'array': return [f[0], f[1], f[2], f[3], f[4], f[5], f[6], f[7]];\n\t\tdefault: throw new Error(\"Unrecognized type \" + (o && o.type || \"undefined\"));\n\t}\n\treturn [x.charCodeAt(0), x.charCodeAt(1), x.charCodeAt(2), x.charCodeAt(3), x.charCodeAt(4), x.charCodeAt(5), x.charCodeAt(6), x.charCodeAt(7)];\n}\n\nfunction read_cfb(cfb/*:CFBContainer*/, opts/*:?ParseOpts*/)/*:Workbook*/ {\n\tif(CFB.find(cfb, \"EncryptedPackage\")) return parse_xlsxcfb(cfb, opts);\n\treturn parse_xlscfb(cfb, opts);\n}\n\nfunction read_zip(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {\n\tvar zip, d = data;\n\tvar o = opts||{};\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tzip = zip_read(d, o);\n\treturn parse_zip(zip, o);\n}\n\nfunction read_plaintext(data/*:string*/, o/*:ParseOpts*/)/*:Workbook*/ {\n\tvar i = 0;\n\tmain: while(i < data.length) switch(data.charCodeAt(i)) {\n\t\tcase 0x0A: case 0x0D: case 0x20: ++i; break;\n\t\tcase 0x3C: return parse_xlml(data.slice(i),o);\n\t\tdefault: break main;\n\t}\n\treturn PRN.to_workbook(data, o);\n}\n\nfunction read_plaintext_raw(data/*:RawData*/, o/*:ParseOpts*/)/*:Workbook*/ {\n\tvar str = \"\", bytes = firstbyte(data, o);\n\tswitch(o.type) {\n\t\tcase 'base64': str = Base64_decode(data); break;\n\t\tcase 'binary': str = data; break;\n\t\tcase 'buffer': str = data.toString('binary'); break;\n\t\tcase 'array': str = cc2str(data); break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tif(bytes[0] == 0xEF && bytes[1] == 0xBB && bytes[2] == 0xBF) str = utf8read(str);\n\to.type = \"binary\";\n\treturn read_plaintext(str, o);\n}\n\nfunction read_utf16(data/*:RawData*/, o/*:ParseOpts*/)/*:Workbook*/ {\n\tvar d = data;\n\tif(o.type == 'base64') d = Base64_decode(d);\n\td = $cptable.utils.decode(1200, d.slice(2), 'str');\n\to.type = \"binary\";\n\treturn read_plaintext(d, o);\n}\n\nfunction bstrify(data/*:string*/)/*:string*/ {\n\treturn !data.match(/[^\\x00-\\x7F]/) ? data : utf8write(data);\n}\n\nfunction read_prn(data, d, o, str) {\n\tif(str) { o.type = \"string\"; return PRN.to_workbook(data, o); }\n\treturn PRN.to_workbook(d, o);\n}\n\nfunction readSync(data/*:RawData*/, opts/*:?ParseOpts*/)/*:Workbook*/ {\n\treset_cp();\n\tvar o = opts||{};\n\tif(typeof ArrayBuffer !== 'undefined' && data instanceof ArrayBuffer) return readSync(new Uint8Array(data), (o = dup(o), o.type = \"array\", o));\n\tif(typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && !o.type) o.type = typeof Deno !== \"undefined\" ? \"buffer\" : \"array\";\n\tvar d = data, n = [0,0,0,0], str = false;\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\t_ssfopts = {};\n\tif(o.dateNF) _ssfopts.dateNF = o.dateNF;\n\tif(!o.type) o.type = (has_buf && Buffer.isBuffer(data)) ? \"buffer\" : \"base64\";\n\tif(o.type == \"file\") { o.type = has_buf ? \"buffer\" : \"binary\"; d = read_binary(data); if(typeof Uint8Array !== 'undefined' && !has_buf) o.type = \"array\"; }\n\tif(o.type == \"string\") { str = true; o.type = \"binary\"; o.codepage = 65001; d = bstrify(data); }\n\tif(o.type == 'array' && typeof Uint8Array !== 'undefined' && data instanceof Uint8Array && typeof ArrayBuffer !== 'undefined') {\n\t\t// $FlowIgnore\n\t\tvar ab=new ArrayBuffer(3), vu=new Uint8Array(ab); vu.foo=\"bar\";\n\t\t// $FlowIgnore\n\t\tif(!vu.foo) {o=dup(o); o.type='array'; return readSync(ab2a(d), o);}\n\t}\n\tswitch((n = firstbyte(d, o))[0]) {\n\t\tcase 0xD0: if(n[1] === 0xCF && n[2] === 0x11 && n[3] === 0xE0 && n[4] === 0xA1 && n[5] === 0xB1 && n[6] === 0x1A && n[7] === 0xE1) return read_cfb(CFB.read(d, o), o); break;\n\t\tcase 0x09: if(n[1] <= 0x08) return parse_xlscfb(d, o); break;\n\t\tcase 0x3C: return parse_xlml(d, o);\n\t\tcase 0x49:\n\t\t\tif(n[1] === 0x49 && n[2] === 0x2a && n[3] === 0x00) throw new Error(\"TIFF Image File is not a spreadsheet\");\n\t\t\tif(n[1] === 0x44) return read_wb_ID(d, o);\n\t\t\tbreak;\n\t\tcase 0x54: if(n[1] === 0x41 && n[2] === 0x42 && n[3] === 0x4C) return DIF.to_workbook(d, o); break;\n\t\tcase 0x50: return (n[1] === 0x4B && n[2] < 0x09 && n[3] < 0x09) ? read_zip(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xEF: return n[3] === 0x3C ? parse_xlml(d, o) : read_prn(data, d, o, str);\n\t\tcase 0xFF:\n\t\t\tif(n[1] === 0xFE) { return read_utf16(d, o); }\n\t\t\telse if(n[1] === 0x00 && n[2] === 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\tbreak;\n\t\tcase 0x00:\n\t\t\tif(n[1] === 0x00) {\n\t\t\t\tif(n[2] >= 0x02 && n[3] === 0x00) return WK_.to_workbook(d, o);\n\t\t\t\tif(n[2] === 0x00 && (n[3] === 0x08 || n[3] === 0x09)) return WK_.to_workbook(d, o);\n\t\t\t}\n\t\t\tbreak;\n\t\tcase 0x03: case 0x83: case 0x8B: case 0x8C: return DBF.to_workbook(d, o);\n\t\tcase 0x7B: if(n[1] === 0x5C && n[2] === 0x72 && n[3] === 0x74) return RTF.to_workbook(d, o); break;\n\t\tcase 0x0A: case 0x0D: case 0x20: return read_plaintext_raw(d, o);\n\t\tcase 0x89: if(n[1] === 0x50 && n[2] === 0x4E && n[3] === 0x47) throw new Error(\"PNG Image File is not a spreadsheet\"); break;\n\t}\n\tif(DBF_SUPPORTED_VERSIONS.indexOf(n[0]) > -1 && n[2] <= 12 && n[3] <= 31) return DBF.to_workbook(d, o);\n\treturn read_prn(data, d, o, str);\n}\n\nfunction readFileSync(filename/*:string*/, opts/*:?ParseOpts*/)/*:Workbook*/ {\n\tvar o = opts||{}; o.type = 'file';\n\treturn readSync(filename, o);\n}\nfunction write_cfb_ctr(cfb/*:CFBContainer*/, o/*:WriteOpts*/)/*:any*/ {\n\tswitch(o.type) {\n\t\tcase \"base64\": case \"binary\": break;\n\t\tcase \"buffer\": case \"array\": o.type = \"\"; break;\n\t\tcase \"file\": return write_dl(o.file, CFB.write(cfb, {type:has_buf ? 'buffer' : \"\"}));\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\treturn CFB.write(cfb, o);\n}\n\n/*:: declare var encrypt_agile:any; */\nfunction write_zip_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {\n\tvar o = dup(opts||{});\n\tvar z = write_zip(wb, o);\n\treturn write_zip_denouement(z, o);\n}\nfunction write_zip_typeXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {\n\tvar o = dup(opts||{});\n\tvar z = write_zip_xlsx(wb, o);\n\treturn write_zip_denouement(z, o);\n}\nfunction write_zip_denouement(z/*:any*/, o/*:?WriteOpts*/)/*:any*/ {\n\tvar oopts = {};\n\tvar ftype = has_buf ? \"nodebuffer\" : (typeof Uint8Array !== \"undefined\" ? \"array\" : \"string\");\n\tif(o.compression) oopts.compression = 'DEFLATE';\n\tif(o.password) oopts.type = ftype;\n\telse switch(o.type) {\n\t\tcase \"base64\": oopts.type = \"base64\"; break;\n\t\tcase \"binary\": oopts.type = \"string\"; break;\n\t\tcase \"string\": throw new Error(\"'string' output type invalid for '\" + o.bookType + \"' files\");\n\t\tcase \"buffer\":\n\t\tcase \"file\": oopts.type = ftype; break;\n\t\tdefault: throw new Error(\"Unrecognized type \" + o.type);\n\t}\n\tvar out = z.FullPaths ? CFB.write(z, {fileType:\"zip\", type: /*::(*/{\"nodebuffer\": \"buffer\", \"string\": \"binary\"}/*:: :any)*/[oopts.type] || oopts.type, compression: !!o.compression}) : z.generate(oopts);\n\tif(typeof Deno !== \"undefined\") {\n\t\tif(typeof out == \"string\") {\n\t\t\tif(o.type == \"binary\" || o.type == \"base64\") return out;\n\t\t\tout = new Uint8Array(s2ab(out));\n\t\t}\n\t}\n/*jshint -W083 */\n\tif(o.password && typeof encrypt_agile !== 'undefined') return write_cfb_ctr(encrypt_agile(out, o.password), o); // eslint-disable-line no-undef\n/*jshint +W083 */\n\tif(o.type === \"file\") return write_dl(o.file, out);\n\treturn o.type == \"string\" ? utf8read(/*::(*/out/*:: :any)*/) : out;\n}\n\nfunction write_cfb_type(wb/*:Workbook*/, opts/*:?WriteOpts*/)/*:any*/ {\n\tvar o = opts||{};\n\tvar cfb/*:CFBContainer*/ = write_xlscfb(wb, o);\n\treturn write_cfb_ctr(cfb, o);\n}\n\nfunction write_string_type(out/*:string*/, opts/*:WriteOpts*/, bom/*:?string*/)/*:any*/ {\n\tif(!bom) bom = \"\";\n\tvar o = bom + out;\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64_encode(utf8write(o));\n\t\tcase \"binary\": return utf8write(o);\n\t\tcase \"string\": return out;\n\t\tcase \"file\": return write_dl(opts.file, o, 'utf8');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(o, 'utf8');\n\t\t\telse if(typeof TextEncoder !== \"undefined\") return new TextEncoder().encode(o);\n\t\t\telse return write_string_type(o, {type:'binary'}).split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\nfunction write_stxt_type(out/*:string*/, opts/*:WriteOpts*/)/*:any*/ {\n\tswitch(opts.type) {\n\t\tcase \"base64\": return Base64_encode(out);\n\t\tcase \"binary\": return out;\n\t\tcase \"string\": return out; /* override in sheet_to_txt */\n\t\tcase \"file\": return write_dl(opts.file, out, 'binary');\n\t\tcase \"buffer\": {\n\t\t\tif(has_buf) return Buffer_from(out, 'binary');\n\t\t\telse return out.split(\"\").map(function(c) { return c.charCodeAt(0); });\n\t\t}\n\t}\n\tthrow new Error(\"Unrecognized type \" + opts.type);\n}\n\n/* TODO: test consistency */\nfunction write_binary_type(out, opts/*:WriteOpts*/)/*:any*/ {\n\tswitch(opts.type) {\n\t\tcase \"string\":\n\t\tcase \"base64\":\n\t\tcase \"binary\":\n\t\t\tvar bstr = \"\";\n\t\t\t// $FlowIgnore\n\t\t\tfor(var i = 0; i < out.length; ++i) bstr += String.fromCharCode(out[i]);\n\t\t\treturn opts.type == 'base64' ? Base64_encode(bstr) : opts.type == 'string' ? utf8read(bstr) : bstr;\n\t\tcase \"file\": return write_dl(opts.file, out);\n\t\tcase \"buffer\": return out;\n\t\tdefault: throw new Error(\"Unrecognized type \" + opts.type);\n\t}\n}\n\nfunction writeSyncXLSX(wb/*:Workbook*/, opts/*:?WriteOpts*/) {\n\treset_cp();\n\tcheck_wb(wb);\n\tvar o = dup(opts||{});\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\tif(o.type == \"array\") { o.type = \"binary\"; var out/*:string*/ = (writeSyncXLSX(wb, o)/*:any*/); o.type = \"array\"; return s2ab(out); }\n\treturn write_zip_typeXLSX(wb, o);\n}\n\nfunction writeSync(wb/*:Workbook*/, opts/*:?WriteOpts*/) {\n\treset_cp();\n\tcheck_wb(wb);\n\tvar o = dup(opts||{});\n\tif(o.cellStyles) { o.cellNF = true; o.sheetStubs = true; }\n\tif(o.type == \"array\") { o.type = \"binary\"; var out/*:string*/ = (writeSync(wb, o)/*:any*/); o.type = \"array\"; return s2ab(out); }\n\tvar idx = 0;\n\tif(o.sheet) {\n\t\tif(typeof o.sheet == \"number\") idx = o.sheet;\n\t\telse idx = wb.SheetNames.indexOf(o.sheet);\n\t\tif(!wb.SheetNames[idx]) throw new Error(\"Sheet not found: \" + o.sheet + \" : \" + (typeof o.sheet));\n\t}\n\tswitch(o.bookType || 'xlsb') {\n\t\tcase 'xml':\n\t\tcase 'xlml': return write_string_type(write_xlml(wb, o), o);\n\t\tcase 'slk':\n\t\tcase 'sylk': return write_string_type(SYLK.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'htm':\n\t\tcase 'html': return write_string_type(sheet_to_html(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'txt': return write_stxt_type(sheet_to_txt(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'csv': return write_string_type(sheet_to_csv(wb.Sheets[wb.SheetNames[idx]], o), o, \"\\ufeff\");\n\t\tcase 'dif': return write_string_type(DIF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'dbf': return write_binary_type(DBF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'prn': return write_string_type(PRN.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'rtf': return write_string_type(RTF.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'eth': return write_string_type(ETH.from_sheet(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'fods': return write_string_type(write_ods(wb, o), o);\n\t\tcase 'wk1': return write_binary_type(WK_.sheet_to_wk1(wb.Sheets[wb.SheetNames[idx]], o), o);\n\t\tcase 'wk3': return write_binary_type(WK_.book_to_wk3(wb, o), o);\n\t\tcase 'biff2': if(!o.biff) o.biff = 2; /* falls through */\n\t\tcase 'biff3': if(!o.biff) o.biff = 3; /* falls through */\n\t\tcase 'biff4': if(!o.biff) o.biff = 4; return write_binary_type(write_biff_buf(wb, o), o);\n\t\tcase 'biff5': if(!o.biff) o.biff = 5; /* falls through */\n\t\tcase 'biff8':\n\t\tcase 'xla':\n\t\tcase 'xls': if(!o.biff) o.biff = 8; return write_cfb_type(wb, o);\n\t\tcase 'xlsx':\n\t\tcase 'xlsm':\n\t\tcase 'xlam':\n\t\tcase 'xlsb':\n\t\tcase 'numbers':\n\t\tcase 'ods': return write_zip_type(wb, o);\n\t\tdefault: throw new Error (\"Unrecognized bookType |\" + o.bookType + \"|\");\n\t}\n}\n\nfunction resolve_book_type(o/*:WriteFileOpts*/) {\n\tif(o.bookType) return;\n\tvar _BT = {\n\t\t\"xls\": \"biff8\",\n\t\t\"htm\": \"html\",\n\t\t\"slk\": \"sylk\",\n\t\t\"socialcalc\": \"eth\",\n\t\t\"Sh33tJS\": \"WTF\"\n\t};\n\tvar ext = o.file.slice(o.file.lastIndexOf(\".\")).toLowerCase();\n\tif(ext.match(/^\\.[a-z]+$/)) o.bookType = ext.slice(1);\n\to.bookType = _BT[o.bookType] || o.bookType;\n}\n\nfunction writeFileSync(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOpts*/) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\treturn writeSync(wb, o);\n}\n\nfunction writeFileSyncXLSX(wb/*:Workbook*/, filename/*:string*/, opts/*:?WriteFileOpts*/) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\treturn writeSyncXLSX(wb, o);\n}\n\n\nfunction writeFileAsync(filename/*:string*/, wb/*:Workbook*/, opts/*:?WriteFileOpts*/, cb/*:?(e?:ErrnoError)=>void*/) {\n\tvar o = opts||{}; o.type = 'file';\n\to.file = filename;\n\tresolve_book_type(o);\n\to.type = 'buffer';\n\tvar _cb = cb; if(!(_cb instanceof Function)) _cb = (opts/*:any*/);\n\treturn _fs.writeFile(filename, writeSync(wb, o), _cb);\n}\n/*::\ntype MJRObject = {\n\trow: any;\n\tisempty: boolean;\n};\n*/\nfunction make_json_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array*/, header/*:number*/, hdr/*:Array*/, dense/*:boolean*/, o/*:Sheet2JSONOpts*/)/*:MJRObject*/ {\n\tvar rr = encode_row(R);\n\tvar defval = o.defval, raw = o.raw || !Object.prototype.hasOwnProperty.call(o, \"raw\");\n\tvar isempty = true;\n\tvar row/*:any*/ = (header === 1) ? [] : {};\n\tif(header !== 1) {\n\t\tif(Object.defineProperty) try { Object.defineProperty(row, '__rowNum__', {value:R, enumerable:false}); } catch(e) { row.__rowNum__ = R; }\n\t\telse row.__rowNum__ = R;\n\t}\n\tif(!dense || sheet[R]) for (var C = r.s.c; C <= r.e.c; ++C) {\n\t\tvar val = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tif(val === undefined || val.t === undefined) {\n\t\t\tif(defval === undefined) continue;\n\t\t\tif(hdr[C] != null) { row[hdr[C]] = defval; }\n\t\t\tcontinue;\n\t\t}\n\t\tvar v = val.v;\n\t\tswitch(val.t){\n\t\t\tcase 'z': if(v == null) break; continue;\n\t\t\tcase 'e': v = (v == 0 ? null : void 0); break;\n\t\t\tcase 's': case 'd': case 'b': case 'n': break;\n\t\t\tdefault: throw new Error('unrecognized type ' + val.t);\n\t\t}\n\t\tif(hdr[C] != null) {\n\t\t\tif(v == null) {\n\t\t\t\tif(val.t == \"e\" && v === null) row[hdr[C]] = null;\n\t\t\t\telse if(defval !== undefined) row[hdr[C]] = defval;\n\t\t\t\telse if(raw && v === null) row[hdr[C]] = null;\n\t\t\t\telse continue;\n\t\t\t} else {\n\t\t\t\trow[hdr[C]] = raw && (val.t !== \"n\" || (val.t === \"n\" && o.rawNumbers !== false)) ? v : format_cell(val,v,o);\n\t\t\t}\n\t\t\tif(v != null) isempty = false;\n\t\t}\n\t}\n\treturn { row: row, isempty: isempty };\n}\n\n\nfunction sheet_to_json(sheet/*:Worksheet*/, opts/*:?Sheet2JSONOpts*/) {\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array*/ = [], v=0, vv=\"\";\n\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\tvar o = opts || {};\n\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\telse if(o.header == null) header = 0;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols/*:Array*/ = [];\n\tvar out/*:Array*/ = [];\n\tvar outi = 0, counter = 0;\n\tvar dense = Array.isArray(sheet);\n\tvar R = r.s.r, C = 0;\n\tvar header_cnt = {};\n\tif(dense && !sheet[R]) sheet[R] = [];\n\tvar colinfo/*:Array*/ = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo/*:Array*/ = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tif(((colinfo[C]||{}).hidden)) continue;\n\t\tcols[C] = encode_col(C);\n\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\tcounter = header_cnt[v] || 0;\n\t\t\t\tif(!counter) header_cnt[v] = 1;\n\t\t\t\telse {\n\t\t\t\t\tdo { vv = v + \"_\" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;\n\t\t\t\t\theader_cnt[vv] = 1;\n\t\t\t\t}\n\t\t\t\thdr[C] = vv;\n\t\t}\n\t}\n\tfor (R = r.s.r + offset; R <= r.e.r; ++R) {\n\t\tif ((rowinfo[R]||{}).hidden) continue;\n\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) out[outi++] = row.row;\n\t}\n\tout.length = outi;\n\treturn out;\n}\n\nvar qreg = /\"/g;\nfunction make_csv_row(sheet/*:Worksheet*/, r/*:Range*/, R/*:number*/, cols/*:Array*/, fs/*:number*/, rs/*:number*/, FS/*:string*/, o/*:Sheet2CSVOpts*/)/*:?string*/ {\n\tvar isempty = true;\n\tvar row/*:Array*/ = [], txt = \"\", rr = encode_row(R);\n\tfor(var C = r.s.c; C <= r.e.c; ++C) {\n\t\tif (!cols[C]) continue;\n\t\tvar val = o.dense ? (sheet[R]||[])[C]: sheet[cols[C] + rr];\n\t\tif(val == null) txt = \"\";\n\t\telse if(val.v != null) {\n\t\t\tisempty = false;\n\t\t\ttxt = ''+(o.rawNumbers && val.t == \"n\" ? val.v : format_cell(val, null, o));\n\t\t\tfor(var i = 0, cc = 0; i !== txt.length; ++i) if((cc = txt.charCodeAt(i)) === fs || cc === rs || cc === 34 || o.forceQuotes) {txt = \"\\\"\" + txt.replace(qreg, '\"\"') + \"\\\"\"; break; }\n\t\t\tif(txt == \"ID\") txt = '\"ID\"';\n\t\t} else if(val.f != null && !val.F) {\n\t\t\tisempty = false;\n\t\t\ttxt = '=' + val.f; if(txt.indexOf(\",\") >= 0) txt = '\"' + txt.replace(qreg, '\"\"') + '\"';\n\t\t} else txt = \"\";\n\t\t/* NOTE: Excel CSV does not support array formulae */\n\t\trow.push(txt);\n\t}\n\tif(o.blankrows === false && isempty) return null;\n\treturn row.join(FS);\n}\n\nfunction sheet_to_csv(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/)/*:string*/ {\n\tvar out/*:Array*/ = [];\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) return \"\";\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\tvar row = \"\", cols/*:Array*/ = [];\n\to.dense = Array.isArray(sheet);\n\tvar colinfo/*:Array*/ = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo/*:Array*/ = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\tvar w = 0;\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\tif ((rowinfo[R]||{}).hidden) continue;\n\t\trow = make_csv_row(sheet, r, R, cols, fs, rs, FS, o);\n\t\tif(row == null) { continue; }\n\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\tif(row || (o.blankrows !== false)) out.push((w++ ? RS : \"\") + row);\n\t}\n\tdelete o.dense;\n\treturn out.join(\"\");\n}\n\nfunction sheet_to_txt(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {\n\tif(!opts) opts = {}; opts.FS = \"\\t\"; opts.RS = \"\\n\";\n\tvar s = sheet_to_csv(sheet, opts);\n\tif(typeof $cptable == 'undefined' || opts.type == 'string') return s;\n\tvar o = $cptable.utils.encode(1200, s, 'str');\n\treturn String.fromCharCode(255) + String.fromCharCode(254) + o;\n}\n\nfunction sheet_to_formulae(sheet/*:Worksheet*/)/*:Array*/ {\n\tvar y = \"\", x, val=\"\";\n\tif(sheet == null || sheet[\"!ref\"] == null) return [];\n\tvar r = safe_decode_range(sheet['!ref']), rr = \"\", cols/*:Array*/ = [], C;\n\tvar cmds/*:Array*/ = [];\n\tvar dense = Array.isArray(sheet);\n\tfor(C = r.s.c; C <= r.e.c; ++C) cols[C] = encode_col(C);\n\tfor(var R = r.s.r; R <= r.e.r; ++R) {\n\t\trr = encode_row(R);\n\t\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\t\ty = cols[C] + rr;\n\t\t\tx = dense ? (sheet[R]||[])[C] : sheet[y];\n\t\t\tval = \"\";\n\t\t\tif(x === undefined) continue;\n\t\t\telse if(x.F != null) {\n\t\t\t\ty = x.F;\n\t\t\t\tif(!x.f) continue;\n\t\t\t\tval = x.f;\n\t\t\t\tif(y.indexOf(\":\") == -1) y = y + \":\" + y;\n\t\t\t}\n\t\t\tif(x.f != null) val = x.f;\n\t\t\telse if(x.t == 'z') continue;\n\t\t\telse if(x.t == 'n' && x.v != null) val = \"\" + x.v;\n\t\t\telse if(x.t == 'b') val = x.v ? \"TRUE\" : \"FALSE\";\n\t\t\telse if(x.w !== undefined) val = \"'\" + x.w;\n\t\t\telse if(x.v === undefined) continue;\n\t\t\telse if(x.t == 's') val = \"'\" + x.v;\n\t\t\telse val = \"\"+x.v;\n\t\t\tcmds[cmds.length] = y + \"=\" + val;\n\t\t}\n\t}\n\treturn cmds;\n}\n\nfunction sheet_add_json(_ws/*:?Worksheet*/, js/*:Array*/, opts)/*:Worksheet*/ {\n\tvar o = opts || {};\n\tvar offset = +!o.skipHeader;\n\tvar ws/*:Worksheet*/ = _ws || ({}/*:any*/);\n\tvar _R = 0, _C = 0;\n\tif(ws && o.origin != null) {\n\t\tif(typeof o.origin == 'number') _R = o.origin;\n\t\telse {\n\t\t\tvar _origin/*:CellAddress*/ = typeof o.origin == \"string\" ? decode_cell(o.origin) : o.origin;\n\t\t\t_R = _origin.r; _C = _origin.c;\n\t\t}\n\t}\n\tvar cell/*:Cell*/;\n\tvar range/*:Range*/ = ({s: {c:0, r:0}, e: {c:_C, r:_R + js.length - 1 + offset}}/*:any*/);\n\tif(ws['!ref']) {\n\t\tvar _range = safe_decode_range(ws['!ref']);\n\t\trange.e.c = Math.max(range.e.c, _range.e.c);\n\t\trange.e.r = Math.max(range.e.r, _range.e.r);\n\t\tif(_R == -1) { _R = _range.e.r + 1; range.e.r = _R + js.length - 1 + offset; }\n\t} else {\n\t\tif(_R == -1) { _R = 0; range.e.r = js.length - 1 + offset; }\n\t}\n\tvar hdr/*:Array*/ = o.header || [], C = 0;\n\n\tjs.forEach(function (JS, R/*:number*/) {\n\t\tkeys(JS).forEach(function(k) {\n\t\t\tif((C=hdr.indexOf(k)) == -1) hdr[C=hdr.length] = k;\n\t\t\tvar v = JS[k];\n\t\t\tvar t = 'z';\n\t\t\tvar z = \"\";\n\t\t\tvar ref = encode_cell({c:_C + C,r:_R + R + offset});\n\t\t\tcell = ws_get_cell_stub(ws, ref);\n\t\t\tif(v && typeof v === 'object' && !(v instanceof Date)){\n\t\t\t\tws[ref] = v;\n\t\t\t} else {\n\t\t\t\tif(typeof v == 'number') t = 'n';\n\t\t\t\telse if(typeof v == 'boolean') t = 'b';\n\t\t\t\telse if(typeof v == 'string') t = 's';\n\t\t\t\telse if(v instanceof Date) {\n\t\t\t\t\tt = 'd';\n\t\t\t\t\tif(!o.cellDates) { t = 'n'; v = datenum(v); }\n\t\t\t\t\tz = (o.dateNF || table_fmt[14]);\n\t\t\t\t}\n\t\t\t\telse if(v === null && o.nullError) { t = 'e'; v = 0; }\n\t\t\t\tif(!cell) ws[ref] = cell = ({t:t, v:v}/*:any*/);\n\t\t\t\telse {\n\t\t\t\t\tcell.t = t; cell.v = v;\n\t\t\t\t\tdelete cell.w; delete cell.R;\n\t\t\t\t\tif(z) cell.z = z;\n\t\t\t\t}\n\t\t\t\tif(z) cell.z = z;\n\t\t\t}\n\t\t});\n\t});\n\trange.e.c = Math.max(range.e.c, _C + hdr.length - 1);\n\tvar __R = encode_row(_R);\n\tif(offset) for(C = 0; C < hdr.length; ++C) ws[encode_col(C + _C) + __R] = {t:'s', v:hdr[C]};\n\tws['!ref'] = encode_range(range);\n\treturn ws;\n}\nfunction json_to_sheet(js/*:Array*/, opts)/*:Worksheet*/ { return sheet_add_json(null, js, opts); }\n\n/* get cell, creating a stub if necessary */\nfunction ws_get_cell_stub(ws/*:Worksheet*/, R, C/*:?number*/)/*:Cell*/ {\n\t/* A1 cell address */\n\tif(typeof R == \"string\") {\n\t\t/* dense */\n\t\tif(Array.isArray(ws)) {\n\t\t\tvar RC = decode_cell(R);\n\t\t\tif(!ws[RC.r]) ws[RC.r] = [];\n\t\t\treturn ws[RC.r][RC.c] || (ws[RC.r][RC.c] = {t:'z'});\n\t\t}\n\t\treturn ws[R] || (ws[R] = {t:'z'});\n\t}\n\t/* cell address object */\n\tif(typeof R != \"number\") return ws_get_cell_stub(ws, encode_cell(R));\n\t/* R and C are 0-based indices */\n\treturn ws_get_cell_stub(ws, encode_cell({r:R,c:C||0}));\n}\n\n/* find sheet index for given name / validate index */\nfunction wb_sheet_idx(wb/*:Workbook*/, sh/*:number|string*/) {\n\tif(typeof sh == \"number\") {\n\t\tif(sh >= 0 && wb.SheetNames.length > sh) return sh;\n\t\tthrow new Error(\"Cannot find sheet # \" + sh);\n\t} else if(typeof sh == \"string\") {\n\t\tvar idx = wb.SheetNames.indexOf(sh);\n\t\tif(idx > -1) return idx;\n\t\tthrow new Error(\"Cannot find sheet name |\" + sh + \"|\");\n\t} else throw new Error(\"Cannot find sheet |\" + sh + \"|\");\n}\n\n/* simple blank workbook object */\nfunction book_new()/*:Workbook*/ {\n\treturn { SheetNames: [], Sheets: {} };\n}\n\n/* add a worksheet to the end of a given workbook */\nfunction book_append_sheet(wb/*:Workbook*/, ws/*:Worksheet*/, name/*:?string*/, roll/*:?boolean*/)/*:string*/ {\n\tvar i = 1;\n\tif(!name) for(; i <= 0xFFFF; ++i, name = undefined) if(wb.SheetNames.indexOf(name = \"Sheet\" + i) == -1) break;\n\tif(!name || wb.SheetNames.length >= 0xFFFF) throw new Error(\"Too many worksheets\");\n\tif(roll && wb.SheetNames.indexOf(name) >= 0) {\n\t\tvar m = name.match(/(^.*?)(\\d+)$/);\n\t\ti = m && +m[2] || 0;\n\t\tvar root = m && m[1] || name;\n\t\tfor(++i; i <= 0xFFFF; ++i) if(wb.SheetNames.indexOf(name = root + i) == -1) break;\n\t}\n\tcheck_ws_name(name);\n\tif(wb.SheetNames.indexOf(name) >= 0) throw new Error(\"Worksheet with name |\" + name + \"| already exists!\");\n\n\twb.SheetNames.push(name);\n\twb.Sheets[name] = ws;\n\treturn name;\n}\n\n/* set sheet visibility (visible/hidden/very hidden) */\nfunction book_set_sheet_visibility(wb/*:Workbook*/, sh/*:number|string*/, vis/*:number*/) {\n\tif(!wb.Workbook) wb.Workbook = {};\n\tif(!wb.Workbook.Sheets) wb.Workbook.Sheets = [];\n\n\tvar idx = wb_sheet_idx(wb, sh);\n\t// $FlowIgnore\n\tif(!wb.Workbook.Sheets[idx]) wb.Workbook.Sheets[idx] = {};\n\n\tswitch(vis) {\n\t\tcase 0: case 1: case 2: break;\n\t\tdefault: throw new Error(\"Bad sheet visibility setting \" + vis);\n\t}\n\t// $FlowIgnore\n\twb.Workbook.Sheets[idx].Hidden = vis;\n}\n\n/* set number format */\nfunction cell_set_number_format(cell/*:Cell*/, fmt/*:string|number*/) {\n\tcell.z = fmt;\n\treturn cell;\n}\n\n/* set cell hyperlink */\nfunction cell_set_hyperlink(cell/*:Cell*/, target/*:string*/, tooltip/*:?string*/) {\n\tif(!target) {\n\t\tdelete cell.l;\n\t} else {\n\t\tcell.l = ({ Target: target }/*:Hyperlink*/);\n\t\tif(tooltip) cell.l.Tooltip = tooltip;\n\t}\n\treturn cell;\n}\nfunction cell_set_internal_link(cell/*:Cell*/, range/*:string*/, tooltip/*:?string*/) { return cell_set_hyperlink(cell, \"#\" + range, tooltip); }\n\n/* add to cell comments */\nfunction cell_add_comment(cell/*:Cell*/, text/*:string*/, author/*:?string*/) {\n\tif(!cell.c) cell.c = [];\n\tcell.c.push({t:text, a:author||\"SheetJS\"});\n}\n\n/* set array formula and flush related cells */\nfunction sheet_set_array_formula(ws/*:Worksheet*/, range, formula/*:string*/, dynamic/*:boolean*/) {\n\tvar rng = typeof range != \"string\" ? range : safe_decode_range(range);\n\tvar rngstr = typeof range == \"string\" ? range : encode_range(range);\n\tfor(var R = rng.s.r; R <= rng.e.r; ++R) for(var C = rng.s.c; C <= rng.e.c; ++C) {\n\t\tvar cell = ws_get_cell_stub(ws, R, C);\n\t\tcell.t = 'n';\n\t\tcell.F = rngstr;\n\t\tdelete cell.v;\n\t\tif(R == rng.s.r && C == rng.s.c) {\n\t\t\tcell.f = formula;\n\t\t\tif(dynamic) cell.D = true;\n\t\t}\n\t}\n\treturn ws;\n}\n\nvar utils/*:any*/ = {\n\tencode_col: encode_col,\n\tencode_row: encode_row,\n\tencode_cell: encode_cell,\n\tencode_range: encode_range,\n\tdecode_col: decode_col,\n\tdecode_row: decode_row,\n\tsplit_cell: split_cell,\n\tdecode_cell: decode_cell,\n\tdecode_range: decode_range,\n\tformat_cell: format_cell,\n\tsheet_add_aoa: sheet_add_aoa,\n\tsheet_add_json: sheet_add_json,\n\tsheet_add_dom: sheet_add_dom,\n\taoa_to_sheet: aoa_to_sheet,\n\tjson_to_sheet: json_to_sheet,\n\ttable_to_sheet: parse_dom_table,\n\ttable_to_book: table_to_book,\n\tsheet_to_csv: sheet_to_csv,\n\tsheet_to_txt: sheet_to_txt,\n\tsheet_to_json: sheet_to_json,\n\tsheet_to_html: sheet_to_html,\n\tsheet_to_formulae: sheet_to_formulae,\n\tsheet_to_row_object_array: sheet_to_json,\n\tsheet_get_cell: ws_get_cell_stub,\n\tbook_new: book_new,\n\tbook_append_sheet: book_append_sheet,\n\tbook_set_sheet_visibility: book_set_sheet_visibility,\n\tcell_set_number_format: cell_set_number_format,\n\tcell_set_hyperlink: cell_set_hyperlink,\n\tcell_set_internal_link: cell_set_internal_link,\n\tcell_add_comment: cell_add_comment,\n\tsheet_set_array_formula: sheet_set_array_formula,\n\tconsts: {\n\t\tSHEET_VISIBLE: 0,\n\t\tSHEET_HIDDEN: 1,\n\t\tSHEET_VERY_HIDDEN: 2\n\t}\n};\n\nvar _Readable;\nfunction set_readable(R) { _Readable = R; }\n\nfunction write_csv_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {\n\tvar stream = _Readable();\n\tvar o = opts == null ? {} : opts;\n\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\tvar r = safe_decode_range(sheet[\"!ref\"]);\n\tvar FS = o.FS !== undefined ? o.FS : \",\", fs = FS.charCodeAt(0);\n\tvar RS = o.RS !== undefined ? o.RS : \"\\n\", rs = RS.charCodeAt(0);\n\tvar endregex = new RegExp((FS==\"|\" ? \"\\\\|\" : FS)+\"+$\");\n\tvar row/*:?string*/ = \"\", cols/*:Array*/ = [];\n\to.dense = Array.isArray(sheet);\n\tvar colinfo/*:Array*/ = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo/*:Array*/ = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(var C = r.s.c; C <= r.e.c; ++C) if (!((colinfo[C]||{}).hidden)) cols[C] = encode_col(C);\n\tvar R = r.s.r;\n\tvar BOM = false, w = 0;\n\tstream._read = function() {\n\t\tif(!BOM) { BOM = true; return stream.push(\"\\uFEFF\"); }\n\t\twhile(R <= r.e.r) {\n\t\t\t++R;\n\t\t\tif ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\trow = make_csv_row(sheet, r, R-1, cols, fs, rs, FS, o);\n\t\t\tif(row != null) {\n\t\t\t\tif(o.strip) row = row.replace(endregex,\"\");\n\t\t\t\tif(row || (o.blankrows !== false)) return stream.push((w++ ? RS : \"\") + row);\n\t\t\t}\n\t\t}\n\t\treturn stream.push(null);\n\t};\n\treturn stream;\n}\n\nfunction write_html_stream(ws/*:Worksheet*/, opts/*:?Sheet2HTMLOpts*/) {\n\tvar stream = _Readable();\n\n\tvar o = opts || {};\n\tvar header = o.header != null ? o.header : HTML_BEGIN;\n\tvar footer = o.footer != null ? o.footer : HTML_END;\n\tstream.push(header);\n\tvar r = decode_range(ws['!ref']);\n\to.dense = Array.isArray(ws);\n\tstream.push(make_html_preamble(ws, r, o));\n\tvar R = r.s.r;\n\tvar end = false;\n\tstream._read = function() {\n\t\tif(R > r.e.r) {\n\t\t\tif(!end) { end = true; stream.push(\"\" + footer); }\n\t\t\treturn stream.push(null);\n\t\t}\n\t\twhile(R <= r.e.r) {\n\t\t\tstream.push(make_html_row(ws, r, R, o));\n\t\t\t++R;\n\t\t\tbreak;\n\t\t}\n\t};\n\treturn stream;\n}\n\nfunction write_json_stream(sheet/*:Worksheet*/, opts/*:?Sheet2CSVOpts*/) {\n\tvar stream = _Readable({objectMode:true});\n\n\tif(sheet == null || sheet[\"!ref\"] == null) { stream.push(null); return stream; }\n\tvar val = {t:'n',v:0}, header = 0, offset = 1, hdr/*:Array*/ = [], v=0, vv=\"\";\n\tvar r = {s:{r:0,c:0},e:{r:0,c:0}};\n\tvar o = opts || {};\n\tvar range = o.range != null ? o.range : sheet[\"!ref\"];\n\tif(o.header === 1) header = 1;\n\telse if(o.header === \"A\") header = 2;\n\telse if(Array.isArray(o.header)) header = 3;\n\tswitch(typeof range) {\n\t\tcase 'string': r = safe_decode_range(range); break;\n\t\tcase 'number': r = safe_decode_range(sheet[\"!ref\"]); r.s.r = range; break;\n\t\tdefault: r = range;\n\t}\n\tif(header > 0) offset = 0;\n\tvar rr = encode_row(r.s.r);\n\tvar cols/*:Array*/ = [];\n\tvar counter = 0;\n\tvar dense = Array.isArray(sheet);\n\tvar R = r.s.r, C = 0;\n\tvar header_cnt = {};\n\tif(dense && !sheet[R]) sheet[R] = [];\n\tvar colinfo/*:Array*/ = o.skipHidden && sheet[\"!cols\"] || [];\n\tvar rowinfo/*:Array*/ = o.skipHidden && sheet[\"!rows\"] || [];\n\tfor(C = r.s.c; C <= r.e.c; ++C) {\n\t\tif(((colinfo[C]||{}).hidden)) continue;\n\t\tcols[C] = encode_col(C);\n\t\tval = dense ? sheet[R][C] : sheet[cols[C] + rr];\n\t\tswitch(header) {\n\t\t\tcase 1: hdr[C] = C - r.s.c; break;\n\t\t\tcase 2: hdr[C] = cols[C]; break;\n\t\t\tcase 3: hdr[C] = o.header[C - r.s.c]; break;\n\t\t\tdefault:\n\t\t\t\tif(val == null) val = {w: \"__EMPTY\", t: \"s\"};\n\t\t\t\tvv = v = format_cell(val, null, o);\n\t\t\t\tcounter = header_cnt[v] || 0;\n\t\t\t\tif(!counter) header_cnt[v] = 1;\n\t\t\t\telse {\n\t\t\t\t\tdo { vv = v + \"_\" + (counter++); } while(header_cnt[vv]); header_cnt[v] = counter;\n\t\t\t\t\theader_cnt[vv] = 1;\n\t\t\t\t}\n\t\t\t\thdr[C] = vv;\n\t\t}\n\t}\n\tR = r.s.r + offset;\n\tstream._read = function() {\n\t\twhile(R <= r.e.r) {\n\t\t\tif ((rowinfo[R-1]||{}).hidden) continue;\n\t\t\tvar row = make_json_row(sheet, r, R, cols, header, hdr, dense, o);\n\t\t\t++R;\n\t\t\tif((row.isempty === false) || (header === 1 ? o.blankrows !== false : !!o.blankrows)) {\n\t\t\t\tstream.push(row.row);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\treturn stream.push(null);\n\t};\n\treturn stream;\n}\n\nvar __stream = {\n\tto_json: write_json_stream,\n\tto_html: write_html_stream,\n\tto_csv: write_csv_stream,\n set_readable: set_readable\n};\nexport const version = XLSX.version;\nexport {\n\tparse_xlscfb,\n\tparse_zip,\n\treadSync as read,\n\treadFileSync as readFile,\n\treadFileSync,\n\twriteSync as write,\n\twriteFileSync as writeFile,\n\twriteFileSync,\n\twriteFileAsync,\n\twriteSyncXLSX as writeXLSX,\n\twriteFileSyncXLSX as writeFileXLSX,\n\tutils,\n\t__stream as stream,\n\tSSF,\n\tCFB\n};\n","import React, { useState, useEffect } from 'react';\nimport { useParams, useNavigate } from 'react-router-dom';\nimport { db } from '../firebase';\nimport { doc, getDoc, updateDoc, collection, query, where, getDocs } from 'firebase/firestore';\nimport * as XLSX from 'xlsx';\n\nfunction VoteDetail() {\n const { id } = useParams(); // URL에서 vote ID 가져오기\n const navigate = useNavigate();\n\n const [vote, setVote] = useState(null); // 투표 데이터 저장\n const [isLoading, setIsLoading] = useState(true); // 로딩 상태\n\n const [userMap, setUserMap] = useState({}); // uid와 이름 매핑\n const [scoresByQuestion, setScoresByQuestion] = useState({}); // 각 질문별 타겟 점수 저장\n\n const [editedFields, setEditedFields] = useState({}); // 수정된 필드 관리\n\n useEffect(() => {\n const fetchVote = async () => {\n try {\n const voteDoc = doc(db, 'bigpieVote', id);\n const voteSnapshot = await getDoc(voteDoc);\n\n if (voteSnapshot.exists()) {\n const voteData = voteSnapshot.data();\n setVote({ id: voteSnapshot.id, ...voteData });\n\n // Firestore에서 `scoreByQuestion` 필드 가져오기\n if (voteData.scoresByQuestion) {\n setScoresByQuestion(voteData.scoresByQuestion);\n }\n } else {\n console.error('투표를 찾을 수 없습니다.');\n }\n } catch (error) {\n console.error('투표 상세정보를 가져오는 중 오류 발생:', error);\n } finally {\n setIsLoading(false);\n }\n };\n\n fetchVote();\n }, [id]);\n\n\n useEffect(() => {\n const fetchUsers = async () => {\n try {\n const querySnapshot = await getDocs(collection(db, 'users'));\n const userData = {};\n querySnapshot.forEach((doc) => {\n userData[doc.id] = doc.data().name;\n });\n setUserMap(userData);\n } catch (error) {\n console.error('유저 데이터 가져오기 오류:', error);\n }\n };\n \n fetchUsers();\n }, []);\n\n\n // 엑셀 데이터 생성 및 다운로드\n const downloadExcel = () => {\n if (!vote) {\n alert(\"다운로드할 투표 데이터가 없습니다.\");\n return;\n }\n\n const tableData = [];\n \n // 질문 순서 고정\n const orderedKeys = ['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'];\n \n orderedKeys.forEach((key) => {\n const question = vote.questions[key];\n if (!question) return; // 질문이 없는 경우 건너뛰기\n \n // responses가 객체인지 확인하고 배열로 변환\n const responses = question.responses\n ? Object.values(question.responses).flat()\n : []; // responses가 없으면 빈 배열\n \n // groupedByTarget에 데이터 정리\n const groupedByTarget = responses.reduce((acc, response) => {\n if (response.reason !== 'null') { // 'null'인 경우 제외\n if (!acc[response.target]) acc[response.target] = [];\n acc[response.target].push(response);\n }\n return acc;\n }, {});\n \n const sortedTargets = Object.keys(groupedByTarget).sort();\n if (sortedTargets.length === 0) return;\n\n sortedTargets.forEach((target) => {\n const responses = groupedByTarget[target];\n const targetScoreInfo = scoresByQuestion[key]?.[target] || {};\n\n responses.forEach((response, idx) => {\n tableData.push({\n 항목: key.toUpperCase(),\n 질문: question.question || \"\",\n 이름: idx === 0 ? userMap[target] || target : \"\",\n 최종순위: idx === 0 ? targetScoreInfo.rank || '-' : '',\n 총점: idx === 0 ? targetScoreInfo.score || 0 : '',\n 선정순위: response.rank,\n 선정이유: response.reason, // reason이 'null'이 아닌 값만 있음\n 작성자: userMap[response.writer] || response.writer,\n });\n });\n });\n });\n\n if (tableData.length === 0) {\n alert(\"다운로드할 유효한 데이터가 없습니다.\");\n return;\n }\n \n // 단일 시트로 생성\n const workbook = XLSX.utils.book_new();\n const worksheet = XLSX.utils.json_to_sheet(tableData);\n XLSX.utils.book_append_sheet(workbook, worksheet, '투표결과');\n \n // 엑셀 파일 다운로드\n XLSX.writeFile(workbook, '투표결과.xlsx');\n };\n\n\n// 질문별 점수 계산 함수 및 순위 매기기\nconst calculateScoresAndRank = (questions) => {\n console.log(\"입력된 questions 데이터:\", questions); // 입력 데이터 확인\n const scores = {};\n\n Object.keys(questions).forEach((key) => {\n const targetScores = {};\n\n // responses가 객체라면 배열로 변환\n const responses = questions[key].responses\n ? Object.values(questions[key].responses).flat()\n : [];\n\n // 타겟별 총점 계산\n responses.forEach((response) => {\n const score = response.rank === 1 ? 3 : response.rank === 2 ? 2 : response.rank === 3 ? 1 : 0;\n\n if (!targetScores[response.target]) {\n targetScores[response.target] = { score: 0, rank: null };\n }\n targetScores[response.target].score += score; // 총점 누적\n });\n\n console.log(`질문 ${key}의 총점 계산 결과:`, targetScores);\n\n // 최종순위 계산 (15점 이상인 타겟만 대상)\n const filteredTargets = Object.entries(targetScores)\n .filter(([_, value]) => value.score >= 15)\n .sort((a, b) => b[1].score - a[1].score);\n\n let currentRank = 1;\n let previousScore = null;\n let sameRankCount = 0;\n\n filteredTargets.forEach(([target, value]) => {\n if (value.score === previousScore) {\n sameRankCount++;\n } else {\n currentRank += sameRankCount;\n sameRankCount = 1;\n }\n targetScores[target].rank = currentRank; // 순위 부여\n previousScore = value.score;\n });\n\n console.log(`질문 ${key}의 최종 순위 부여 결과:`, targetScores);\n scores[key] = targetScores;\n });\n\n console.log(\"최종 점수와 순위 결과:\", scores);\n return scores;\n};\n\n const handleInputChange = (field, value) => {\n setEditedFields((prev) => ({\n ...prev,\n [field]: value,\n }));\n };\n\n const handleUpdate = async () => {\n try {\n if (editedFields.state === 1) {\n \n const q = query(\n collection(db, 'bigpieVote'),\n where('state', '==', 1),\n where('__name__', '!=', id)\n );\n const querySnapshot = await getDocs(q);\n\n if (!querySnapshot.empty) {\n alert('이미 진행중인 칭찬직원투표가 존재합니다.');\n return;\n }\n }\n\n // State가 2로 변경된 경우 점수 계산 및 저장\n if (editedFields.state === 2 && vote) {\n const calculatedScores = calculateScoresAndRank(vote.questions);\n console.log(\"Firestore에 업데이트할 scoresByQuestion:\", calculatedScores);\n \n const voteDoc = doc(db, 'bigpieVote', id);\n await updateDoc(voteDoc, { scoresByQuestion: calculatedScores });\n \n setScoresByQuestion(calculatedScores); // 로컬 상태에 점수 저장\n }\n\n const voteDoc = doc(db, 'bigpieVote', id);\n await updateDoc(voteDoc, editedFields);\n\n alert('투표가 성공적으로 수정되었습니다.');\n navigate('/votelist');\n } catch (error) {\n console.error('투표 수정 중 오류 발생:', error);\n }\n };\n\n if (isLoading) {\n return
    Loading...⏳
    ;\n }\n\n if (!vote) {\n return
    투표를 찾을 수 없습니다.
    ;\n }\n\n return (\n
    \n

    투표 상세정보

    \n
    \n \n handleInputChange('vote_title', e.target.value)}\n />\n
    \n
    \n \n \n
    \n
    \n \n handleInputChange('deadline', e.target.value)}\n />\n
    \n
    \n \n handleInputChange('state', Number(e.target.value))}\n >\n \n \n \n \n
    \n
    \n

    질문

    \n {['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'].map((key) => (\n
    \n \n \n handleInputChange(`questions.${key}.question`, e.target.value)\n }\n />\n
    \n ))}\n
    \n \n 수정하기\n \n\n \n 엑셀로 다운로드\n \n\n\n
    \n

    응답 결과

    \n {['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'].map((key) => {\n if (!vote.questions[key]) return null;\n\n // responses가 객체인지 확인하고 배열로 변환\n const responses = vote.questions[key].responses\n ? Object.values(vote.questions[key].responses).flat() // 객체를 배열로 평탄화\n : [];\n\n // groupedByTarget에 데이터 정리\n const groupedByTarget = responses.reduce((acc, response) => {\n if (response.reason !== 'null') { // 'null' 문자열을 가진 응답 제거\n if (!acc[response.target]) acc[response.target] = [];\n acc[response.target].push(response);\n }\n return acc;\n }, {});\n\n if (Object.keys(groupedByTarget).length === 0) return null;\n\n return (\n
    \n

    {key.toUpperCase()}: {vote.questions[key].question}

    \n {Object.keys(groupedByTarget).length > 0 ? (\n \n \n \n \n \n \n \n \n \n \n \n \n {Object.entries(groupedByTarget).map(([target, responses], index) => (\n \n {responses.map((response, idx) => (\n \n {/* 순위는 첫 행에만 표시 */}\n {idx === 0 && (\n \n {scoresByQuestion[key]?.[target]?.rank || '-'}\n \n )}\n {idx === 0 && (\n \n {userMap[target] || target}\n \n )}\n {idx === 0 && (\n \n {scoresByQuestion[key]?.[target]?.score || 0}\n \n )}\n \n \n \n \n ))}\n \n ))}\n \n
    최종순위이름총점선정순위선정이유작성자
    \n {response.rank}\n {response.reason}{userMap[response.writer] || response.writer}
    \n ) : (\n

    응답 없음

    \n )}\n
    \n );\n })}\n
    \n\n
    \n );\n}\n\nexport default VoteDetail;","import React, { useState, useEffect, useRef } from 'react';\nimport { db, auth } from '../firebase';\nimport { collection, query, where, orderBy, getDoc, getDocs, doc, updateDoc, runTransaction } from 'firebase/firestore';\nimport * as XLSX from 'xlsx';\nimport '../css/VoteArea.css';\n\nfunction VoteArea() {\n const [showVideo, setShowVideo] = useState(true);\n\n const [isModalOneOpen, setIsModalOneOpen] = useState(false);\n const [activeMenuOne, setActiveMenuOne] = useState(1);\n\n const [honorImageUrl, setHonorImageUrl] = useState(''); // 'honor' 컬렉션의 이미지 URL 상태\n const scrollContainerRef = useRef(null);\n\n const [resultVotes, setResultVotes] = useState([]); // resultType === true인 데이터\n const [activeVote, setActiveVote] = useState(null); // state === 1인 데이터\n const [activeQuestion, setActiveQuestion] = useState('ABILITY');\n const [activeNote, setActiveNote] = useState(false);\n const [noteContent, setNoteContent] = useState('');\n\n const [selectedVoteResponses, setSelectedVoteResponses] = useState(null); // 응답 결과\n\n const [teamUsers, setTeamUsers] = useState({}); // 질문과 순위별 유저 목록 관리\n const [userMap, setUserMap] = useState({});\n const [formResponses, setFormResponses] = useState({}); // 폼 상태\n const [submitted, setSubmitted] = useState(false); // 제출 상태\n\n\n const [isModalTwoOpen, setIsModalTwoOpen] = useState(false);\n const [monthHeroData, setMonthHeroData] = useState([]);\n const [currentIndex, setCurrentIndex] = useState(0);\n\n useEffect(() => {\n // 4초 후에 비디오 숨기기\n const timer = setTimeout(() => {\n setShowVideo(false);\n }, 4000);\n\n return () => clearTimeout(timer);\n }, []);\n\n\n\n const toggleModalOne = () => {\n setIsModalOneOpen(!isModalOneOpen);\n };\n\n const changeMenuOne = (menuOne) => {\n setActiveMenuOne(menuOne);\n };\n\n\n const toggleModalTwo = () => {\n setIsModalTwoOpen(!isModalTwoOpen);\n };\n\n\n useEffect(() => {\n\n const fetchUsers = async () => {\n try {\n const querySnapshot = await getDocs(collection(db, 'users'));\n const usersData = {};\n querySnapshot.forEach((doc) => {\n usersData[doc.id] = doc.data().name; // uid를 키로 하고 name을 값으로 저장\n });\n setUserMap(usersData);\n } catch (error) {\n console.error('Firestore users 데이터 가져오기 오류:', error);\n }\n };\n\n // resultType === true 데이터 가져오기\n const fetchResultVotes = async () => {\n try {\n const q = query(\n collection(db, 'bigpieVote'),\n where('resultType', '==', true),\n orderBy('created_at', 'desc')\n );\n const querySnapshot = await getDocs(q);\n const voteList = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n }));\n setResultVotes(voteList);\n } catch (error) {\n console.error('Firestore 데이터 가져오기 오류 (resultType):', error);\n }\n };\n\n // state === 1 데이터 가져오기\n const fetchActiveVote = async () => {\n try {\n const q = query(collection(db, 'bigpieVote'), where('state', '==', 1));\n const querySnapshot = await getDocs(q);\n \n if (!querySnapshot.empty) {\n const docSnapshot = querySnapshot.docs[0];\n const vote = { id: docSnapshot.id, ...docSnapshot.data() };\n setActiveVote(vote);\n \n const currentUserUid = auth.currentUser.uid;\n \n const initialForm = {};\n Object.keys(vote.questions).forEach((key) => {\n const question = vote.questions[key];\n const userResponses = question.responses?.[currentUserUid];\n \n // responses가 없으면 기본값 3개 생성\n initialForm[key] = userResponses\n ? userResponses\n : Array.from({ length: 3 }, (_, index) => ({\n team: '',\n target: '',\n reason: '',\n rank: index + 1, // Rank 값 자동 설정\n }));\n });\n \n setFormResponses(initialForm);\n \n // 제출 상태 확인\n setSubmitted(vote.submittedUsers?.includes(currentUserUid));\n }\n } catch (error) {\n console.error('Firestore 데이터 가져오기 오류 (state):', error);\n }\n };\n \n // 데이터 순차적으로 실행\n const fetchData = async () => {\n await fetchUsers(); // 사용자 데이터 먼저 가져오기\n await fetchResultVotes(); // resultVotes 가져오기\n await fetchActiveVote(); // activeVote 가져오기\n };\n\n fetchData();\n }, []);\n \n\n useEffect(() => {\n if (activeVote) {\n // 초기화된 질문과 순위 데이터를 기반으로 teamUsers 업데이트\n Object.keys(activeVote.questions).forEach((questionKey) => {\n const responses = activeVote.questions[questionKey].responses;\n \n // responses가 객체라면 배열로 변환\n const responsesArray = Array.isArray(responses)\n ? responses\n : Object.values(responses || {});\n \n responsesArray.forEach((response, index) => {\n if (response.team) {\n fetchTeamUsers(response.team, questionKey, index + 1);\n }\n });\n });\n }\n }, [activeVote]);\n\n useEffect(() => {\n if (activeVote && activeVote.note?.answer) {\n const currentUserUid = auth.currentUser.uid;\n const savedNote = activeVote.note.answer[currentUserUid]?.content || '';\n setNoteContent(savedNote); // 저장된 값이 있으면 설정\n }\n }, [activeVote]);\n\n\n //honor와 이달의 주인공 데이터가져오기\n useEffect(() => {\n const fetchHonorImage = async () => {\n try {\n const honorDocRef = doc(db, 'honor', 'unique_honor');\n const honorDoc = await getDoc(honorDocRef);\n \n if (honorDoc.exists()) {\n const data = honorDoc.data();\n setHonorImageUrl(data.imageUrl); // 'imageUrl' 속성 가져오기\n } else {\n console.error('Honor 문서가 존재하지 않습니다.');\n }\n } catch (error) {\n console.error('Honor 이미지 데이터 가져오기 오류:', error);\n }\n };\n\n const fetchMonthHeroData = async () => {\n try {\n const querySnapshot = await getDocs(collection(db, 'monthhero'));\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n }));\n setMonthHeroData(data);\n } catch (error) {\n console.error('Error fetching monthHero data:', error);\n }\n };\n \n fetchHonorImage();\n fetchMonthHeroData();\n }, []);\n\n // 슬라이드 이동 핸들러\n const handleNext = () => {\n setCurrentIndex((prevIndex) => (prevIndex + 1) % monthHeroData.length);\n };\n\n const handlePrev = () => {\n setCurrentIndex((prevIndex) =>\n prevIndex === 0 ? monthHeroData.length - 1 : prevIndex - 1\n );\n };\n\n // 휠 스크롤 핸들러\n const handleWheel = (e) => {\n if (scrollContainerRef.current) {\n e.preventDefault(); // 기본 세로 스크롤 동작 방지\n scrollContainerRef.current.scrollLeft += e.deltaY; // 세로 휠 이벤트를 가로 스크롤로 변환\n }\n };\n\n\n // 팀 선택 시 유저 목록 가져오기\n const fetchTeamUsers = async (team, questionKey, rank) => {\n try {\n const q = query(collection(db, 'users'), where('team', '==', team));\n const querySnapshot = await getDocs(q);\n const users = querySnapshot.docs.map((doc) => ({ uid: doc.id, ...doc.data() }));\n \n setTeamUsers((prev) => ({\n ...prev,\n [`${questionKey}-${rank}`]: users, // 질문별-순위별 유저 목록 저장\n }));\n } catch (error) {\n console.error('Firestore 유저 데이터 가져오기 오류:', error);\n }\n };\n\n const handleInputChange = (questionKey, index, field, value) => {\n const currentUserUid = auth.currentUser.uid;\n\n setFormResponses((prev) => {\n const updatedResponses = prev[questionKey].map((response, i) => {\n if (field === 'team' && i === index) {\n return { ...response, [field]: value, target: '' }; // target 초기화\n }\n return i === index ? { ...response, [field]: value } : response;\n });\n \n // 중복된 target 검사\n if (field === 'target') {\n const isDuplicate = updatedResponses.some(\n (res, i) => i !== index && res.target === value && value !== ''\n );\n \n if (isDuplicate) {\n alert('해당 질문에 대해 이미 선택된 대상입니다.');\n updatedResponses[index][field] = ''; // 중복이면 선택을 무효화\n }\n\n if (value === currentUserUid) {\n alert('자기 자신은 선택할 수 없습니다.');\n updatedResponses[index][field] = ''; // 자기 자신 선택 무효화\n }\n }\n \n return {\n ...prev,\n [questionKey]: updatedResponses,\n };\n });\n \n if (field === 'team') {\n fetchTeamUsers(value, questionKey, index + 1); // 팀 선택 시 유저 목록 갱신\n }\n };\n\n\n // 제출 버튼 비활성화 조건\n const isSubmitDisabled = submitted || Object.values(formResponses).some((responses) =>\n responses.some((response) => !response.team || !response.target || !response.reason)\n );\n\n \n\n const handleSave = async (retryCount = 0) => {\n if (!activeVote || !activeVote.id) {\n alert('저장할 수 없습니다. 다시 시도해주세요.');\n return;\n }\n \n try {\n const voteDoc = doc(db, 'bigpieVote', activeVote.id);\n const currentUserUid = auth.currentUser.uid;\n \n await runTransaction(db, async (transaction) => {\n const voteSnapshot = await transaction.get(voteDoc);\n if (!voteSnapshot.exists()) {\n throw new Error(\"투표 데이터가 존재하지 않습니다.\");\n }\n \n const voteData = voteSnapshot.data();\n const updatedQuestions = { ...voteData.questions };\n \n // 🔥 기존 응답이 없을 경우 초기화하여 저장\n Object.keys(formResponses).forEach((key) => {\n if (!updatedQuestions[key].responses) {\n updatedQuestions[key].responses = {}; // responses 필드가 없을 경우 빈 객체로 초기화\n }\n updatedQuestions[key].responses[currentUserUid] = formResponses[key].map((response) => ({\n ...response,\n writer: currentUserUid,\n }));\n });\n \n // 🔥 건의 내용이 존재하면 업데이트\n const newNoteResponse = noteContent.trim()\n ? { content: noteContent.trim(), writer: currentUserUid }\n : null;\n \n const updatedNoteResponses = newNoteResponse\n ? { ...(voteData.note?.answer || {}), [currentUserUid]: newNoteResponse }\n : voteData.note?.answer || {};\n \n transaction.update(voteDoc, {\n questions: updatedQuestions,\n \"note.answer\": updatedNoteResponses, // 건의 내용 업데이트\n });\n });\n \n alert('저장되었습니다.');\n } catch (error) {\n console.error('Firestore 저장 오류:', error);\n \n if (retryCount < 3) { // 🔥 최대 3번까지 자동 재시도\n console.warn(`재시도 중... (${retryCount + 1}/3)`);\n setTimeout(() => handleSave(retryCount + 1), 500); // 500ms 후 다시 시도\n } else {\n alert('저장 중 오류가 발생했습니다. 다시 시도해주세요.');\n }\n }\n };\n \n\n const handleSubmit = async (retryCount = 0) => {\n if (Object.values(formResponses).some((responses) =>\n responses.some((response) => !response.team || !response.target || !response.reason))) {\n alert('모든 필드를 입력해주세요.');\n return;\n }\n \n if (!activeVote || !activeVote.id) {\n alert('제출할 수 없습니다. 다시 시도해주세요.');\n return;\n }\n \n try {\n const voteDoc = doc(db, 'bigpieVote', activeVote.id);\n const currentUserUid = auth.currentUser.uid;\n \n await runTransaction(db, async (transaction) => {\n const voteSnapshot = await transaction.get(voteDoc);\n if (!voteSnapshot.exists()) {\n throw new Error(\"투표 데이터가 존재하지 않습니다.\");\n }\n \n const voteData = voteSnapshot.data();\n const updatedQuestions = { ...voteData.questions };\n \n // 🔥 기존 응답이 없을 경우 초기화하여 저장\n Object.keys(formResponses).forEach((key) => {\n if (!updatedQuestions[key].responses) {\n updatedQuestions[key].responses = {}; // 기존 응답이 없으면 빈 객체로 초기화\n }\n updatedQuestions[key].responses[currentUserUid] = formResponses[key].map((response) => ({\n ...response,\n writer: currentUserUid,\n }));\n });\n \n // 🔥 건의 내용이 존재하면 업데이트\n const newNoteResponse = noteContent.trim()\n ? { content: noteContent.trim(), writer: currentUserUid }\n : null;\n \n const updatedNoteResponses = newNoteResponse\n ? { ...(voteData.note?.answer || {}), [currentUserUid]: newNoteResponse }\n : voteData.note?.answer || {};\n \n // 🔥 제출한 사용자 목록 갱신 (중복 방지)\n const updatedSubmittedUsers = new Set([...(voteData.submittedUsers || []), currentUserUid]);\n \n transaction.update(voteDoc, {\n questions: updatedQuestions,\n \"note.answer\": updatedNoteResponses,\n submittedUsers: Array.from(updatedSubmittedUsers), // 🔥 Set → Array 변환 후 저장\n });\n });\n \n setSubmitted(true);\n alert('제출되었습니다.');\n } catch (error) {\n console.error('Firestore 제출 오류:', error);\n \n if (retryCount < 3) { // 🔥 최대 3번까지 자동 재시도\n console.warn(`재시도 중... (${retryCount + 1}/3)`);\n setTimeout(() => handleSubmit(retryCount + 1), 500); // 500ms 후 다시 시도\n } else {\n alert('제출 중 오류가 발생했습니다. 다시 시도해주세요.');\n }\n }\n };\n\n\n const handleQuestionClick = (key) => {\n setActiveQuestion(key);\n setActiveNote(false); // Note 선택 해제\n };\n\n const handleNoteClick = () => {\n setActiveQuestion(null); // 질문 선택 해제\n setActiveNote(true);\n };\n\n\n\n const handleVoteClick = async (voteId) => {\n try {\n const voteDoc = doc(db, 'bigpieVote', voteId);\n const voteSnapshot = await getDocs(query(collection(db, 'bigpieVote'), where('__name__', '==', voteId)));\n const selectedVote = voteSnapshot.docs[0];\n \n if (selectedVote) {\n const data = selectedVote.data();\n const responses = Object.keys(data.questions).map((questionKey) => ({\n key: questionKey, // key (a, b, c ...)\n question: data.questions[questionKey]?.question || '',\n responses: Object.values(data.questions[questionKey]?.responses || {}).flat(),\n scoreInfo: data.scoresByQuestion?.[questionKey] || {}, // 점수 및 순위 정보\n }));\n \n setSelectedVoteResponses(responses); // 응답 데이터를 상태에 저장\n } else {\n console.error('선택된 투표 항목을 찾을 수 없습니다.');\n }\n } catch (error) {\n console.error('Firestore 결과 가져오기 오류:', error);\n alert('결과를 불러오지 못했습니다.');\n }\n };\n\n\n // 엑셀 데이터 생성 및 다운로드\n const downloadExcel = () => {\n if (!selectedVoteResponses || selectedVoteResponses.length === 0) {\n alert(\"다운로드할 결과 데이터가 없습니다.\");\n return;\n }\n \n const tableData = [];\n const orderedKeys = ['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'];\n \n orderedKeys.forEach((key) => {\n const questionData = selectedVoteResponses.find((data) => data.key === key);\n if (!questionData) return; // key가 없으면 건너뜀\n \n const groupedByTarget = questionData.responses.reduce((acc, response) => {\n if (response.target && response.reason !== 'null') {\n if (!acc[response.target]) acc[response.target] = [];\n acc[response.target].push(response);\n }\n return acc;\n }, {});\n \n const sortedTargets = Object.keys(groupedByTarget).sort();\n if (sortedTargets.length === 0) return;\n \n sortedTargets.forEach((target) => {\n const responses = groupedByTarget[target];\n const targetScoreInfo = questionData.scoreInfo?.[target] || {};\n \n responses.forEach((response, idx) => {\n tableData.push({\n 항목: key.toUpperCase(),\n 질문: questionData.question || \"\",\n 이름: idx === 0 ? userMap[target] || target : \"\",\n 최종순위: idx === 0 ? targetScoreInfo.rank || '-' : '',\n 총점: idx === 0 ? targetScoreInfo.score || 0 : '',\n 선정순위: response.rank,\n 선정이유: response.reason, \n 작성자: userMap[response.writer] || response.writer,\n });\n });\n });\n });\n \n if (tableData.length === 0) {\n alert(\"다운로드할 유효한 데이터가 없습니다.\");\n return;\n }\n \n // 엑셀 파일 생성\n const workbook = XLSX.utils.book_new();\n const worksheet = XLSX.utils.json_to_sheet(tableData);\n XLSX.utils.book_append_sheet(workbook, worksheet, '투표결과');\n \n XLSX.writeFile(workbook, '투표결과.xlsx');\n };\n\n\n return (\n
    \n {showVideo ? (\n \n \n Your browser does not support the video tag.\n \n ) : (\n
    \n\n
    \n
    \n \n \n \n
    \n
    \n \n
    \n
    \n
    \n )}\n\n {isModalOneOpen && (\n
    \n
    \n\n \n\n
    \n changeMenuOne(1)}\n >\n 명예의 전당\n \n changeMenuOne(2)}\n >\n 역대 투표결과\n \n changeMenuOne(3)}\n >\n 투표하기\n \n
    \n\n
    \n {activeMenuOne === 1 && (\n
    \n {honorImageUrl ? (\n \n ) : (\n

    이미지를 불러오는 중...

    \n )}\n
    \n )}\n\n {activeMenuOne === 2 && (\n
    \n
    \n {resultVotes.length > 0 ? (\n resultVotes.map((vote) => (\n handleVoteClick(vote.id)} // 클릭 시 결과 가져오기\n >\n

    {vote.vote_title}

    \n
    \n ))\n ) : (\n

    표시할 항목이 없습니다.

    \n )}\n
    \n\n {/* 응답결과를 표시 */}\n
    \n {selectedVoteResponses ? (\n
    \n\n {['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'].map((key) => {\n\n const questionData = selectedVoteResponses.find((data) => data.key === key);\n if (!questionData) return null;\n\n const groupedByTarget = questionData.responses.reduce((acc, response) => {\n if (response.target && response.reason !== 'null') {\n if (!acc[response.target]) acc[response.target] = [];\n acc[response.target].push(response);\n }\n return acc;\n }, {});\n\n const sortedTargets = Object.keys(groupedByTarget).sort();\n if (sortedTargets.length === 0) return null;\n\n return (\n
    \n\n

    \n {`${key.toUpperCase()}. ${questionData.question}`}\n

    \n\n \n \n \n \n \n \n \n \n \n \n \n {sortedTargets.map((target) => {\n const responses = groupedByTarget[target];\n const targetScoreInfo = questionData.scoreInfo?.[target] || {};\n\n return responses.map((response, rIndex) => (\n \n\n {rIndex === 0 && (\n \n {userMap[target] || target || 'N/A'}\n \n )}\n\n {rIndex === 0 && (\n \n {targetScoreInfo.score || 0}\n \n )}\n\n {rIndex === 0 && (\n \n {targetScoreInfo.rank || '-'}\n \n )}\n\n \n\n \n \n ));\n })}\n \n
    이름총점최종순위선정순위선정이유
    \n {response.rank}\n {response.reason}
    \n
    \n );\n })}\n\n \n
    \n ) : (\n

    결과를 보려면 투표 항목을 클릭하세요.

    \n )}\n
    \n
    \n )}\n\n {activeMenuOne === 3 && (\n
    \n {/* 첫 번째 영역: 메뉴 ... */}\n
    \n {['ABILITY', 'HELPING', 'FUNFUN', 'SHARING', 'KINDNESS', 'PASSION', 'EFFORT', 'EXTRA'].map((key) => (\n handleQuestionClick(key)}\n >\n {key.toUpperCase()}\n
    \n ))}\n {activeVote && activeVote.note?.title && (\n \n 대표님께 건의해요\n
    \n )}\n
    \n {/* 두 번째 영역: 선택된 질문 */}\n
    \n {activeNote ? (\n
    \n

    {activeVote.note.title}

    \n
    \n setNoteContent(e.target.value)}\n placeholder=\"내용을 입력하세요\"\n />\n
    \n \n \n
    \n ) :activeVote && activeVote.questions[activeQuestion] ? (\n
    \n

    {activeVote.questions[activeQuestion].question}

    \n {formResponses[activeQuestion]?.map((response, index) => (\n
    \n {/* 팀 선택 */}\n \n handleInputChange(activeQuestion, index, 'team', e.target.value)\n }\n >\n \n \n \n \n \n \n \n \n \n\n {/* 대상 선택 */}\n \n handleInputChange(activeQuestion, index, 'target', e.target.value)\n }\n >\n \n {(teamUsers[`${activeQuestion}-${index + 1}`] || []).map((user) => (\n \n ))}\n \n\n {/* 이유 입력 */}\n \n handleInputChange(activeQuestion, index, 'reason', e.target.value)\n }\n />\n\n
    \n ))}\n \n
    \n ) : (\n

    표시할 질문이 없습니다.

    \n )}\n
    \n
    \n )}\n
    \n\n \n \n )}\n\n\n {isModalTwoOpen && (\n
    \n
    \n \n

    이달의 주인공

    \n\n {/* 슬라이드 영역 */}\n \n {monthHeroData.length > 0 && (\n <>\n {/* 왼쪽: 이미지 */}\n \n\n {/* 오른쪽: 텍스트 */}\n \n \n {monthHeroData[currentIndex]?.text}\n

    \n
    \n \n )}\n {monthHeroData.length === 0 && (\n

    데이터가 없습니다.

    \n )}\n
    \n\n {/* 슬라이드 버튼 */}\n \n \n 이전\n \n \n 다음\n \n \n \n \n )}\n \n );\n}\n\nexport default VoteArea;","import React, { useState, useEffect } from 'react';\nimport { db, storage } from '../firebase'; // Import Firestore and Storage instances\nimport { collection, addDoc, getDocs, deleteDoc, doc, orderBy, query } from 'firebase/firestore';\nimport { ref, uploadBytes, getDownloadURL, deleteObject } from 'firebase/storage';\n\nfunction MonthHero() {\n const [isModalOpen, setIsModalOpen] = useState(false); // State to manage modal visibility\n const [textInput, setTextInput] = useState(''); // State for text input\n const [imageFile, setImageFile] = useState(null); // State for image file\n const [isUploading, setIsUploading] = useState(false); // State to track upload status\n const [monthHeroData, setMonthHeroData] = useState([]);\n\n const toggleModal = () => {\n setIsModalOpen(!isModalOpen);\n };\n\n const handleFileChange = (e) => {\n if (e.target.files && e.target.files[0]) {\n setImageFile(e.target.files[0]);\n }\n };\n\n\n const fetchMonthHeroData = async () => {\n try {\n const q = query(collection(db, 'monthhero'), orderBy('createdAt', 'desc'));\n const querySnapshot = await getDocs(q);\n const data = querySnapshot.docs.map((doc) => ({\n id: doc.id,\n ...doc.data(),\n }));\n setMonthHeroData(data);\n } catch (error) {\n console.error('Error fetching monthHero data:', error);\n }\n };\n\n\n const handleSubmit = async () => {\n if (!textInput || !imageFile) {\n alert('이미지와 텍스트를 모두 입력해주세요.');\n return;\n }\n\n try {\n setIsUploading(true);\n\n const imageRef = ref(storage, `monthhero/${imageFile.name}`);\n await uploadBytes(imageRef, imageFile);\n const imageUrl = await getDownloadURL(imageRef);\n\n await addDoc(collection(db, 'monthhero'), {\n text: textInput,\n imageUrl: imageUrl,\n createdAt: new Date(),\n });\n\n alert('등록되었습니다!');\n setTextInput('');\n setImageFile(null);\n setIsModalOpen(false);\n\n // Fetch the updated data list\n fetchMonthHeroData();\n } catch (error) {\n console.error('Error adding document: ', error);\n alert('등록 중 오류가 발생했습니다.');\n } finally {\n setIsUploading(false);\n }\n };\n\n\n const handleDelete = async (id, imageUrl) => {\n try {\n // Delete the document from Firestore\n await deleteDoc(doc(db, 'monthhero', id));\n\n // Delete the associated image from storage\n const imageRef = ref(storage, imageUrl);\n await deleteObject(imageRef);\n\n alert('삭제되었습니다.');\n\n // Fetch the updated data list\n fetchMonthHeroData();\n } catch (error) {\n console.error('Error deleting document:', error);\n alert('삭제 중 오류가 발생했습니다.');\n }\n };\n\n useEffect(() => {\n fetchMonthHeroData();\n }, []);\n\n\n return (\n
    \n\n
    \n

    이달의 주인공

    \n \n \n \n \n \n \n \n \n \n {monthHeroData.map((item) => (\n \n \n \n \n \n ))}\n \n
    이미지텍스트삭제
    \n \n \n {item.text}\n \n handleDelete(item.id, item.imageUrl)}\n style={{\n padding: '5px 10px',\n backgroundColor: 'red',\n color: 'white',\n border: 'none',\n cursor: 'pointer',\n borderRadius: '5px',\n }}\n >\n 삭제하기\n \n
    \n
    \n\n \n 추가하기\n \n\n {isModalOpen && (\n \n \n {/* Close Button */}\n \n ✖\n \n\n

    모달창

    \n\n {/* Text Input */}\n setTextInput(e.target.value)}\n style={{\n width: '90%',\n height: '80px',\n marginBottom: '10px',\n padding: '10px',\n borderRadius: '5px',\n border: '1px solid #ccc',\n }}\n />\n\n {/* File Input */}\n \n\n {/* Submit Button */}\n \n {isUploading ? '등록 중...' : '등록하기'}\n \n
    \n \n )}\n \n );\n}\n\nexport default MonthHero;","import React, { useState } from 'react';\nimport { Link, useNavigate } from 'react-router-dom';\nimport { signOut } from 'firebase/auth';\nimport { auth } from '../firebase';\nimport '../css/Sidebar.css';\n\nfunction Sidebar() {\n const [openMenu, setOpenMenu] = useState({ members: false, trophy: false });\n const navigate = useNavigate();\n\n const toggleMenu = (menu) => {\n setOpenMenu((prev) => ({ ...prev, [menu]: !prev[menu] }));\n };\n\n const handleLogout = async () => {\n try {\n await signOut(auth); // Firebase 로그아웃 실행\n alert('로그아웃 되었습니다.');\n navigate('/');\n } catch (error) {\n console.error(\"로그아웃 중 오류 발생:\", error);\n }\n };\n\n\n return (\n
    \n

    BIGPIE C&T

    \n
      \n
    • \n toggleMenu('members')}\n >\n 회원관리\n
    \n {openMenu.members && (\n
      \n
    • \n \n 회원관리\n \n
    • \n
    \n )}\n \n\n
  • \n toggleMenu('trophy')}\n >\n 트로피홀\n \n {openMenu.trophy && (\n
      \n
    • \n \n 이달의 주인공\n \n
    • \n
    • \n \n 명예의 전당\n \n
    • \n
    • \n \n 투표관리\n \n
    • \n
    \n )}\n
  • \n \n\n \n \n );\n}\n\nexport default Sidebar;","import React, { useState, useEffect } from 'react';\nimport { db, storage } from '../firebase'; // Firestore와 Storage 인스턴스 임포트\nimport { doc, setDoc, getDoc } from 'firebase/firestore'; // setDoc은 문서를 덮어쓰기 가능\nimport { ref, uploadBytes, getDownloadURL, deleteObject } from 'firebase/storage';\n\nfunction Honor() {\n const [imageFile, setImageFile] = useState(null); // 업로드 이미지 상태\n const [isUploading, setIsUploading] = useState(false); // 업로드 상태 추적\n const [honorData, setHonorData] = useState(null); // Firestore에서 불러온 데이터\n\n const DOCUMENT_ID = 'unique_honor'; // Firestore 문서의 고정 ID\n\n // Firestore에서 데이터 가져오기\n const fetchHonorData = async () => {\n try {\n const docRef = doc(db, 'honor', DOCUMENT_ID);\n const docSnapshot = await getDoc(docRef);\n if (docSnapshot.exists()) {\n setHonorData(docSnapshot.data());\n } else {\n setHonorData(null);\n }\n } catch (error) {\n console.error('Error fetching honor data:', error);\n }\n };\n\n const handleFileChange = (e) => {\n if (e.target.files && e.target.files[0]) {\n setImageFile(e.target.files[0]);\n }\n };\n\n const handleSubmit = async () => {\n if (!imageFile) {\n alert('이미지를 선택해주세요.');\n return;\n }\n\n try {\n setIsUploading(true);\n\n // 기존 이미지 삭제 (Firestore와 Storage 모두에서)\n if (honorData && honorData.imageUrl) {\n const imageRef = ref(storage, honorData.imageUrl);\n await deleteObject(imageRef);\n }\n\n // 새 이미지 업로드\n const imageRef = ref(storage, `honor/${imageFile.name}`);\n await uploadBytes(imageRef, imageFile);\n const imageUrl = await getDownloadURL(imageRef);\n\n // Firestore에 새 데이터 저장 (덮어쓰기)\n const docRef = doc(db, 'honor', DOCUMENT_ID);\n await setDoc(docRef, {\n imageUrl: imageUrl,\n createdAt: new Date(),\n });\n\n alert('이미지가 업로드되었습니다!');\n setImageFile(null);\n\n // Fetch updated data\n fetchHonorData();\n } catch (error) {\n console.error('Error adding document: ', error);\n alert('업로드 중 오류가 발생했습니다.');\n } finally {\n setIsUploading(false);\n }\n };\n\n const formatDate = (date) => {\n const d = new Date(date.seconds * 1000);\n const yyyy = d.getFullYear();\n const mm = String(d.getMonth() + 1).padStart(2, '0');\n const dd = String(d.getDate()).padStart(2, '0');\n const hh = String(d.getHours()).padStart(2, '0');\n const mi = String(d.getMinutes()).padStart(2, '0');\n const ss = String(d.getSeconds()).padStart(2, '0');\n return `${yyyy}-${mm}-${dd} ${hh}:${mi}:${ss}`;\n };\n\n useEffect(() => {\n fetchHonorData();\n }, []);\n\n return (\n
    \n

    Honor 데이터

    \n {honorData && (\n
    \n \n

    업로드된 날짜: {formatDate(honorData.createdAt)}

    \n
    \n )}\n\n
    \n \n \n {isUploading ? '업로드 중...' : '업로드하기'}\n \n
    \n
    \n );\n}\n\nexport default Honor;","import React, { useState, useEffect } from 'react';\n\nfunction TypingEffect({ text, typeSpeed, reset }) {\n const [displayedText, setDisplayedText] = useState('');\n const [posText, setPosText] = useState(0);\n\n useEffect(() => {\n setDisplayedText('');\n setPosText(0);\n }, [reset]);\n\n useEffect(() => {\n const interval = setInterval(() => {\n setDisplayedText((prev) => prev + text[posText]);\n setPosText((prev) => prev + 1);\n }, typeSpeed);\n\n if (posText >= text.length) {\n clearInterval(interval);\n }\n\n return () => clearInterval(interval);\n }, [posText, text, typeSpeed]);\n\n return (\n <>\n {displayedText}\n \n \n );\n}\n\nexport default TypingEffect;","import React, { useState, useEffect } from \"react\";\nimport TypingEffect from '../component/TypingEffect';\nimport \"../css/Bigpie.css\";\nimport { Link } from \"react-router-dom\";\n\n\n\nfunction Bigpie() {\n const [showMessage, setShowMessage] = useState(false); // 말풍선 표시 여부\n const [hideOverlay, setHideOverlay] = useState(false); // 오버레이 숨김 여부\n \n useEffect(() => {\n const timestamp = localStorage.getItem(\"lastBubbleShown\");\n const currentTime = new Date().getTime();\n\n // If no timestamp or 30 minutes have passed, show the bubble\n if (!timestamp || currentTime - parseInt(timestamp) > 5 * 60 * 1000) {\n const timeout = setTimeout(() => {\n setShowMessage(true); // 말풍선 등장\n }, 100); // 약간의 딜레이 후 말풍선 표시\n return () => clearTimeout(timeout);\n } else {\n setHideOverlay(true); // Skip overlay if bubble shouldn't show\n }\n }, []);\n\n const handleNext = () => {\n setShowMessage(false); // 말풍선 사라짐\n localStorage.setItem(\"lastBubbleShown\", new Date().getTime().toString()); // Save timestamp\n setTimeout(() => {\n setHideOverlay(true); // 오버레이 제거\n }, 500); // 말풍선 애니메이션 시간과 동기화\n };\n \n return (\n
    \n {/* 오버레이 */}\n {!hideOverlay &&
    }\n \n {/* 이미지 섹션 */}\n
    \n
    \n
    \n \n {/* 말풍선 */}\n {showMessage && (\n
    \n

    \n \n

    \n \n
    \n )}\n \n {/* 버튼 섹션 */}\n
    \n
    \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n \n
    \n
    \n
    \n );\n }\n \n export default Bigpie;","import React from 'react';\nimport history from '../../asset/history.png'\n\nfunction History() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default History;","import React from 'react';\nimport organization from '../../asset/organization.png'\n\nfunction Organization() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Organization;","import React from 'react';\nimport mission from '../../asset/mission.png'\n\nfunction Mission() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Mission;","import React from 'react';\nimport Jungdali from '../../asset/jungdal.png';\n\nfunction Jungdal() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Jungdal;","import React from 'react';\nimport darlibaba from '../../asset/darlibaba.png'\n\nfunction Darlibaba() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Darlibaba;","import React from 'react';\nimport meo from '../../asset/meo.png'\n\nfunction Meo() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Meo;","import React from 'react';\nimport infra from '../../asset/infra.png'\n\nfunction Infra() {\n\n return (\n
    \n
    \n \n
    \n
    \n );\n}\n\nexport default Infra;","import { useState, useEffect } from 'react';\nimport { BrowserRouter as Router, Route, Routes } from 'react-router-dom';\nimport { auth } from './firebase';\nimport './App.css';\nimport Login from './Page/Login';\nimport Map from './Page/Map';\nimport ScrollToTop from './component/ScrollToTop';\nimport SignUp from './Page/SignUp';\nimport Event from './Page/Event';\nimport VoteCreation from './Page/VoteCreation';\nimport VoteList from './Page/VoteList';\nimport MemberList from './Page/memberList';\nimport VoteDetail from './Page/VoteDetail';\nimport VoteArea from './Page/VoteArea';\nimport MonthHero from './Page/MonthHero';\nimport Sidebar from './component/Sidebar';\nimport Honor from './Page/Honor';\nimport Bigpie from './Page/Bigpie';\nimport History from './Page/Sub/History';\nimport Organization from './Page/Sub/Organization';\nimport Mission from './Page/Sub/Mission';\nimport Jungdal from './Page/Sub/jungdal';\nimport Darlibaba from './Page/Sub/Darlibaba';\nimport Meo from './Page/Sub/Meo';\nimport Infra from './Page/Sub/Infra';\n\nfunction App() {\n\n const [userObj, setUserObj] = useState(null);\n const [role, setRole] = useState('');\n\n useEffect(() => {\n const unsubscribe = auth.onAuthStateChanged(async (user) => {\n if (user) {\n // 사용자 객체 저장\n setUserObj(user);\n \n // 사용자 토큰에서 Custom Claims 확인\n const idTokenResult = await user.getIdTokenResult();\n const userRole = idTokenResult.claims.role || 'user'; // 기본값 'user'\n setRole(userRole);\n } else {\n // 로그아웃 시 사용자 정보 초기화\n setUserObj(null);\n setRole(''); // 역할 정보 초기화\n }\n });\n \n // 컴포넌트 언마운트 시 이벤트 리스너 정리\n return unsubscribe;\n }, []);\n\n return (\n \n \n {userObj ? (\n
    \n {role === 'admin' ?\n
    \n \n
    \n \n } />\n } />\n } />\n } />\n } />\n } />\n } />\n \n
    \n
    \n :\n \n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n } />\n \n }\n
    \n ) : (\n \n } />\n \n )}\n
    \n );\n}\n\nexport default App;\n","const reportWebVitals = onPerfEntry => {\n if (onPerfEntry && onPerfEntry instanceof Function) {\n import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {\n getCLS(onPerfEntry);\n getFID(onPerfEntry);\n getFCP(onPerfEntry);\n getLCP(onPerfEntry);\n getTTFB(onPerfEntry);\n });\n }\n};\n\nexport default reportWebVitals;\n","import React from 'react';\nimport ReactDOM from 'react-dom/client';\nimport './index.css';\nimport App from './App';\nimport reportWebVitals from './reportWebVitals';\n\nconst root = ReactDOM.createRoot(document.getElementById('root'));\nroot.render(\n \n \n \n);\n\n// If you want to start measuring performance in your app, pass a function\n// to log results (for example: reportWebVitals(console.log))\n// or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals\nreportWebVitals();\n"],"names":["factory","modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","call","m","c","d","name","getter","o","Object","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","prototype","hasOwnProperty","p","s","Common","_baseDelta","_nextId","_seed","_nowStartTime","Date","_warnedOnce","_decomp","extend","obj","deep","argsStart","deepClone","arguments","length","source","prop","constructor","clone","keys","push","values","path","begin","end","split","slice","set","val","parts","shuffle","array","j","Math","floor","random","temp","choose","choices","isElement","HTMLElement","nodeType","nodeName","isArray","toString","isFunction","isPlainObject","isString","clamp","min","max","sign","now","window","performance","webkitNow","_seededRandom","colorToNumber","colorString","replace","charAt","parseInt","logLevel","log","console","apply","concat","Array","info","warn","warnOnce","message","join","deprecated","warning","chain","nextId","indexOf","haystack","needle","map","list","func","mapped","topologicalSort","graph","result","visited","node","_topologicalSort","neighbors","neighbor","funcs","_chained","lastResult","args","chainPathBefore","base","chainPathAfter","setDecomp","decomp","getDecomp","global","e","Bounds","vertices","bounds","x","y","update","velocity","Infinity","vertex","contains","point","overlaps","boundsA","boundsB","translate","vector","shift","position","deltaX","deltaY","Vector","magnitude","sqrt","magnitudeSquared","rotate","angle","output","cos","sin","rotateAbout","normalise","dot","vectorA","vectorB","cross","cross3","vectorC","add","sub","mult","scalar","div","perp","negate","neg","atan2","_temp","Vertices","points","body","index","isInternal","fromPath","match","parseFloat","centre","area","mean","average","signed","abs","inertia","mass","numerator","denominator","v","verticesLength","translateX","translateY","dx","dy","pointX","pointY","nextVertex","scale","scaleX","scaleY","delta","chamfer","radius","quality","qualityMin","qualityMax","newVertices","prevVertex","currentRadius","prevNormal","nextNormal","diagonalRadius","pow","radiusVector","midNormal","scaledVertex","precision","theta","acos","clockwiseSort","sort","vertexA","vertexB","isConvex","k","z","flag","hull","upper","lower","pop","Body","Sleeping","Axes","_timeCorrection","_inertiaScale","_nextCollidingGroupId","_nextNonCollidingGroupId","_nextCategory","options","defaults","id","type","label","plugin","force","torque","positionImpulse","constraintImpulse","totalContacts","speed","angularSpeed","angularVelocity","isSensor","isStatic","isSleeping","motion","sleepThreshold","density","restitution","friction","frictionStatic","frictionAir","collisionFilter","category","mask","group","slop","timeScale","render","visible","opacity","strokeStyle","fillStyle","lineWidth","sprite","xScale","yScale","xOffset","yOffset","events","circleRadius","positionPrev","anglePrev","parent","axes","deltaTime","_original","_initProperties","nextGroup","isNonColliding","nextCategory","defaultFillStyle","defaultStrokeStyle","defaultLineWidth","settings","setStatic","setMass","setDensity","setInertia","setVertices","setPosition","setAngle","setVelocity","setAngularVelocity","setSpeed","setAngularSpeed","setParts","setCentre","part","inverseMass","inverseInertia","moment","fromVertices","autoHull","hullCentre","total","_totalProperties","relative","updateVelocity","getVelocity","getSpeed","getAngularVelocity","getAngularSpeed","translation","rotation","totalArea","totalInertia","deltaTimeSquared","correction","velocityPrevX","velocityPrevY","updateVelocities","bodyVelocity","applyForce","offset","properties","Events","on","eventNames","callback","names","off","callbacks","newCallbacks","trigger","event","eventClone","Composite","isModified","bodies","constraints","composites","cache","allBodies","allConstraints","allComposites","setModified","composite","updateParents","updateChildren","childComposite","objects","addBody","addConstraint","addComposite","constraint","remove","removeBody","removeConstraint","removeComposite","compositeA","compositeB","removeCompositeAt","sleepCounter","splice","removeBodyAt","removeConstraintAt","clear","keepStatic","filter","move","rebase","recursive","_motionWakeThreshold","_motionSleepThreshold","_minBias","motionSleepThreshold","minMotion","maxMotion","afterCollisions","pairs","pair","isActive","collision","bodyA","bodyB","sleepingBody","movingBody","wasSleeping","Collision","Pair","_supports","_overlapAB","overlap","axis","_overlapBA","collided","parentA","parentB","depth","normal","tangent","penetration","supports","supportCount","collides","_overlapAxes","minOverlap","table","minAxis","normalX","normalY","supportsB","_findSupports","supportsA","verticesA","verticesB","overlapAB","overlapBA","verticesALength","verticesBLength","verticesAX","verticesAY","verticesBX","verticesBY","axesLength","overlapMin","Number","MAX_VALUE","overlapAxisNumber","axisX","axisY","minA","minB","maxA","maxB","direction","vertexC","distance","bodyAPositionX","bodyAPositionY","nearestDistance","Contact","timestamp","contacts","contactCount","separation","timeCreated","timeUpdated","supportA","contactA","supportB","contactB","setActive","Constraint","_warming","_torqueDampen","_minLength","pointA","pointB","initialPointA","initialPointB","stiffness","damping","angularStiffness","angleA","angleB","anchors","preSolveAll","impulse","solveAll","fixedA","fixedB","solve","pointAWorld","pointBWorld","currentLength","share","normalVelocity","relativeVelocity","difference","massTotal","resistanceTotal","zero","postSolveAll","pointAX","pointAY","gradient","toFixed","xx","Bodies","rectangle","width","height","trapezoid","slope","verticesPath","x1","x2","x3","circle","maxSides","sides","ceil","polygon","PI","yy","vertexSets","flagInternal","removeCollinear","minimumArea","removeDuplicatePoints","canDecomp","Boolean","quickDecomp","concave","makeCCW","removeCollinearPoints","decomposed","chunkVertices","partA","partB","pav","pbv","da","db","Detector","collisions","setBodies","detector","bodiesLength","canCollide","collisionIndex","_compareBoundsX","boundXMax","boundYMax","boundYMin","bodyAStatic","partsALength","partsASingle","partsBLength","partsBStart","filterA","filterB","Mouse","element","mouse","document","absolute","mousedownPosition","mouseupPosition","wheelDelta","button","pixelRatio","getAttribute","sourceEvents","mousemove","mousedown","mouseup","mousewheel","_getRelativeMousePosition","changedTouches","preventDefault","detail","setElement","addEventListener","passive","clearSourceEvents","setOffset","setScale","elementBounds","getBoundingClientRect","rootNode","documentElement","parentNode","scrollX","undefined","pageXOffset","scrollLeft","scrollY","pageYOffset","scrollTop","touches","pageX","left","pageY","top","clientWidth","clientHeight","Plugin","_registry","register","isPlugin","registered","pluginVersion","versionParse","version","number","registeredVersion","resolve","dependency","dependencyParse","range","install","isUsed","used","isFor","parsed","for","versionSatisfies","use","plugins","uses","dependencies","sortedDependencies","status","_warned","tracked","parsedBase","resolved","test","pattern","exec","major","minor","patch","isRange","operator","prerelease","normalImpulse","tangentImpulse","Engine","Resolver","Pairs","_deltaMax","engine","positionIterations","velocityIterations","constraintIterations","enableSleeping","gravity","timing","lastDelta","lastElapsed","lastUpdatesPerFrame","world","grid","buckets","broadphase","metrics","startTime","_bodiesApplyGravity","_bodiesUpdate","collisionStart","positionDamping","preSolvePosition","solvePosition","postSolvePosition","preSolveVelocity","solveVelocity","_bodiesUpdateVelocities","collisionActive","collisionEnd","_bodiesClearForces","merge","engineA","engineB","gravityScale","_restingThresh","_restingThreshTangent","_positionDampen","_positionWarming","_frictionNormalMultiplier","_frictionMaxStatic","pairsLength","contactShare","positionDampen","slopDampen","positionWarming","verticesTranslate","boundsUpdate","positionImpulseX","positionImpulseY","contact","contactVertex","impulseX","impulseY","maxFriction","timeScaleCubed","restingThresh","restingThreshTangent","frictionNormalMultiplier","frictionMaxStatic","tangentX","tangentY","inverseMassTotal","bodyAVelocityX","bodyAVelocityY","bodyAAngularVelocity","bodyBVelocityX","bodyBVelocityY","bodyBAngularVelocity","offsetAX","offsetAY","offsetBX","offsetBY","relativeVelocityX","relativeVelocityY","tangentVelocity","normalOverlap","normalForce","frictionLimit","oAcN","oBcN","contactNormalImpulse","contactTangentImpulse","pairUpdate","pairCreate","pairSetActive","pairsTable","pairsList","pairsListLength","pairsListIndex","collisionsLength","collisionStartIndex","collisionEndIndex","collisionActiveIndex","Matter","Composites","Grid","MouseConstraint","Query","Render","Runner","SAT","Svg","World","run","before","after","stack","columns","rows","columnGap","rowGap","lastBody","currentX","currentY","row","maxHeight","column","bodyHeight","bodyWidth","xOffsetA","yOffsetA","xOffsetB","yOffsetB","bodyAHeight","bodyAWidth","bodyBHeight","mesh","crossBrace","col","bodyC","pyramid","stackX","stackY","actualRows","lastBodyWidth","newtonsCradle","size","car","wheelSize","wheelAOffset","wheelBOffset","wheelA","wheelB","axelA","axelB","softBody","particleRadius","particleOptions","constraintOptions","bucketWidth","bucketHeight","forceUpdate","bucket","bucketId","gridChanged","newRegion","_getRegion","region","union","_regionUnion","startCol","endCol","startRow","endRow","_getBucketId","isInsideNewRegion","isInsideOldRegion","_bucketRemoveBody","_createBucket","_bucketAddBody","_createActivePairsList","regionA","regionB","_createRegion","gridPairs","pairId","bucketLength","pairKeys","pairKeysLength","canvas","mouseConstraint","_triggerEvents","mouseEvents","partsAStart","ray","startPoint","endPoint","rayWidth","rayAngle","rayLength","rayX","rayY","outside","_requestAnimationFrame","_cancelAnimationFrame","requestAnimationFrame","webkitRequestAnimationFrame","mozRequestAnimationFrame","msRequestAnimationFrame","setTimeout","cancelAnimationFrame","mozCancelAnimationFrame","webkitCancelAnimationFrame","msCancelAnimationFrame","_goodFps","_goodDelta","frameRequestId","historySize","deltaHistory","lastTime","lastTimestamp","timestampElapsed","timestampElapsedHistory","engineDeltaHistory","engineElapsedHistory","engineUpdatesHistory","elapsedHistory","background","wireframeBackground","wireframeStrokeStyle","hasBounds","enabled","wireframes","showSleeping","showDebug","showStats","showPerformance","showBounds","showVelocity","showCollisions","showSeparations","showAxes","showPositions","showAngleIndicator","showIds","showVertexNumbers","showConvexHulls","showInternalEdges","showMousePosition","_createCanvas","context","getContext","textures","controller","showBroadphase","setPixelRatio","appendChild","loop","time","_updateTiming","setTransform","stats","stop","_getPixelRatio","setAttribute","style","setSize","lookAt","padding","center","viewHeight","outerRatio","innerRatio","startViewTransform","boundsWidth","boundsHeight","boundsScaleX","boundsScaleY","endViewTransform","currentBackground","_applyBackground","globalCompositeOperation","fillRect","bodyConvexHulls","bodyWireframes","bodyBounds","bodyAxes","bodyPositions","bodyIds","separations","vertexNumbers","mousePosition","sections","font","textBaseline","textAlign","section","fillText","lastEngineUpdatesPerFrame","lastEngineDelta","deltaMean","_mean","elapsedMean","engineDeltaMean","engineUpdatesMean","engineElapsedMean","rateMean","neededUpdatesPerFrame","round","fps","gap","count","indicator","plotY","beginPath","moveTo","lineTo","stroke","start","arc","closePath","coils","fill","globalAlpha","texture","_getTexture","drawImage","rect","normalPosX","normalPosY","inspector","selected","item","data","setLineDash","selectStart","selectBounds","unshift","createElement","oncontextmenu","onselectstart","devicePixelRatio","webkitBackingStorePixelRatio","mozBackingStorePixelRatio","msBackingStorePixelRatio","oBackingStorePixelRatio","backingStorePixelRatio","imagePath","image","Image","src","cssBackground","backgroundSize","_maxFrameDelta","_frameDeltaFallback","_timeBufferMargin","_elapsedNextEstimate","_smoothingLowerBound","_smoothingUpperBound","runner","frameDelta","frameDeltaSmoothing","frameDeltaSnapping","frameDeltaHistory","frameDeltaHistorySize","timeBuffer","timeLastTick","maxUpdates","maxFrameTime","lastUpdatesDeferred","onFrame","_onNextFrame","tick","tickStartTime","engineDelta","updateCount","deltaHistorySorted","deltaHistoryWindow","updateStartTime","elapsedTimeTotal","elapsedTimeUpdates","elapsedNextEstimate","isFixed","deltaMin","deltaMax","_cancelNextFrame","Error","valuesLength","pathToVertices","sampleLength","il","segment","segments","segmentsQueue","lastSegment","lastPoint","lx","ly","addPoint","px","py","pathSegType","isRelative","addSegmentPoint","segType","pathSegTypeAsLetter","toUpperCase","_svgPathToAbsolute","getTotalLength","pathSegList","numberOfItems","getItem","getPathSegAtLength","getPointAtLength","x0","y0","y1","y2","segs","len","seg","replaceItem","createSVGPathSegMovetoAbs","createSVGPathSegLinetoAbs","createSVGPathSegLinetoHorizontalAbs","createSVGPathSegLinetoVerticalAbs","createSVGPathSegCurvetoCubicAbs","createSVGPathSegCurvetoCubicSmoothAbs","createSVGPathSegCurvetoQuadraticAbs","createSVGPathSegCurvetoQuadraticSmoothAbs","createSVGPathSegArcAbs","r1","r2","largeArcFlag","sweepFlag","aa","require","ca","a","b","encodeURIComponent","Set","ea","fa","ha","ia","ja","ka","la","ma","f","g","this","acceptsBooleans","attributeName","attributeNamespace","mustUseProperty","propertyName","sanitizeURL","removeEmptyString","forEach","toLowerCase","ra","sa","ta","pa","isNaN","qa","oa","removeAttribute","setAttributeNS","xlinkHref","ua","__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED","va","wa","ya","za","Aa","Ba","Ca","Da","Ea","Fa","Ga","Ha","Ia","Ja","iterator","Ka","La","A","assign","Ma","trim","Na","Oa","prepareStackTrace","Reflect","construct","h","displayName","includes","Pa","tag","Qa","$$typeof","_context","_payload","_init","Ra","Sa","Ta","Va","_valueTracker","getOwnPropertyDescriptor","configurable","getValue","setValue","stopTracking","Ua","Wa","checked","Xa","activeElement","Ya","defaultChecked","defaultValue","_wrapperState","initialChecked","Za","initialValue","controlled","ab","bb","cb","ownerDocument","eb","fb","defaultSelected","disabled","gb","dangerouslySetInnerHTML","children","hb","ib","jb","textContent","kb","lb","mb","nb","namespaceURI","innerHTML","valueOf","firstChild","removeChild","MSApp","execUnsafeLocalFunction","ob","lastChild","nodeValue","pb","animationIterationCount","aspectRatio","borderImageOutset","borderImageSlice","borderImageWidth","boxFlex","boxFlexGroup","boxOrdinalGroup","columnCount","flex","flexGrow","flexPositive","flexShrink","flexNegative","flexOrder","gridArea","gridRow","gridRowEnd","gridRowSpan","gridRowStart","gridColumn","gridColumnEnd","gridColumnSpan","gridColumnStart","fontWeight","lineClamp","lineHeight","order","orphans","tabSize","widows","zIndex","zoom","fillOpacity","floodOpacity","stopOpacity","strokeDasharray","strokeDashoffset","strokeMiterlimit","strokeOpacity","strokeWidth","qb","rb","sb","setProperty","substring","tb","menuitem","br","embed","hr","img","input","keygen","link","meta","param","track","wbr","ub","vb","is","wb","xb","target","srcElement","correspondingUseElement","yb","zb","Ab","Bb","Cb","stateNode","Db","Eb","Fb","Gb","Hb","Ib","Jb","Kb","Lb","Mb","removeEventListener","Nb","onError","Ob","Pb","Qb","Rb","Sb","Tb","Vb","alternate","return","flags","Wb","memoizedState","dehydrated","Xb","Zb","child","sibling","current","Yb","$b","ac","unstable_scheduleCallback","bc","unstable_cancelCallback","cc","unstable_shouldYield","dc","unstable_requestPaint","B","unstable_now","ec","unstable_getCurrentPriorityLevel","fc","unstable_ImmediatePriority","gc","unstable_UserBlockingPriority","hc","unstable_NormalPriority","ic","unstable_LowPriority","jc","unstable_IdlePriority","kc","lc","oc","clz32","pc","qc","LN2","rc","sc","tc","uc","pendingLanes","suspendedLanes","pingedLanes","entangledLanes","entanglements","vc","xc","yc","zc","Ac","eventTimes","Cc","C","Dc","Ec","Fc","Gc","Hc","Ic","Jc","Kc","Lc","Mc","Nc","Oc","Map","Pc","Qc","Rc","Sc","delete","pointerId","Tc","nativeEvent","blockedOn","domEventName","eventSystemFlags","targetContainers","Vc","Wc","priority","isDehydrated","containerInfo","Xc","Yc","dispatchEvent","Zc","$c","ad","bd","cd","ReactCurrentBatchConfig","dd","ed","transition","fd","gd","hd","Uc","stopPropagation","jd","kd","ld","md","nd","od","keyCode","charCode","pd","qd","rd","_reactName","_targetInst","currentTarget","isDefaultPrevented","defaultPrevented","returnValue","isPropagationStopped","cancelBubble","persist","isPersistent","wd","xd","yd","sd","eventPhase","bubbles","cancelable","timeStamp","isTrusted","td","ud","view","vd","Ad","screenX","screenY","clientX","clientY","ctrlKey","shiftKey","altKey","metaKey","getModifierState","zd","buttons","relatedTarget","fromElement","toElement","movementX","movementY","Bd","Dd","dataTransfer","Fd","Hd","animationName","elapsedTime","pseudoElement","Id","clipboardData","Jd","Ld","Md","Esc","Spacebar","Left","Up","Right","Down","Del","Win","Menu","Apps","Scroll","MozPrintableKey","Nd","Od","Alt","Control","Meta","Shift","Pd","Qd","String","fromCharCode","code","location","repeat","locale","which","Rd","Td","pressure","tangentialPressure","tiltX","tiltY","twist","pointerType","isPrimary","Vd","targetTouches","Xd","Yd","wheelDeltaX","wheelDeltaY","deltaZ","deltaMode","Zd","$d","ae","be","documentMode","ce","de","ee","fe","ge","he","ie","le","color","date","datetime","email","month","password","search","tel","text","url","week","me","ne","oe","listeners","pe","qe","re","se","te","ue","ve","we","xe","ye","ze","oninput","Ae","detachEvent","Be","Ce","attachEvent","De","Ee","Fe","He","Ie","Je","Ke","nextSibling","Le","compareDocumentPosition","Me","HTMLIFrameElement","contentWindow","href","Ne","contentEditable","Oe","focusedElem","selectionRange","selectionStart","selectionEnd","defaultView","getSelection","rangeCount","anchorNode","anchorOffset","focusNode","focusOffset","createRange","setStart","removeAllRanges","addRange","setEnd","focus","Pe","Qe","Re","Se","Te","Ue","Ve","We","animationend","animationiteration","animationstart","transitionend","Xe","Ye","Ze","animation","$e","af","bf","cf","df","ef","ff","gf","hf","lf","mf","nf","Ub","instance","listener","D","of","has","pf","qf","rf","sf","capture","J","u","w","F","tf","uf","parentWindow","vf","wf","na","xa","$a","ba","je","char","ke","xf","yf","zf","Af","Bf","Cf","Df","Ef","__html","Ff","Gf","clearTimeout","Hf","Promise","Jf","queueMicrotask","then","catch","If","Kf","Lf","Mf","previousSibling","Nf","Of","Pf","Qf","Rf","Sf","Tf","Uf","E","G","Vf","H","Wf","Xf","Yf","contextTypes","__reactInternalMemoizedUnmaskedChildContext","__reactInternalMemoizedMaskedChildContext","Zf","childContextTypes","$f","ag","bg","getChildContext","cg","__reactInternalMemoizedMergedChildContext","dg","eg","fg","gg","hg","jg","kg","lg","mg","ng","og","pg","qg","rg","sg","tg","ug","vg","wg","xg","yg","I","zg","Ag","Bg","elementType","deletions","Cg","pendingProps","overflow","treeContext","retryLane","Dg","Eg","Fg","Gg","memoizedProps","Hg","Ig","Jg","Kg","Lg","ref","_owner","_stringRef","refs","Mg","Ng","Og","Pg","Qg","props","Rg","implementation","Sg","Tg","q","next","done","Ug","Vg","Wg","Xg","Yg","Zg","$g","ah","_currentValue","bh","childLanes","ch","firstContext","lanes","dh","eh","memoizedValue","fh","gh","hh","interleaved","ih","jh","kh","updateQueue","baseState","firstBaseUpdate","lastBaseUpdate","shared","pending","effects","lh","mh","eventTime","lane","payload","nh","K","oh","ph","qh","rh","sh","th","uh","vh","wh","xh","yh","tagName","zh","Ah","Bh","L","Ch","revealOrder","Dh","Eh","_workInProgressVersionPrimary","Fh","ReactCurrentDispatcher","Gh","Hh","M","N","O","Ih","Jh","Kh","Lh","P","Mh","Nh","Oh","Ph","Qh","Rh","Sh","Th","baseQueue","queue","Uh","Vh","Wh","lastRenderedReducer","action","hasEagerState","eagerState","lastRenderedState","dispatch","Xh","Yh","Zh","$h","ai","getSnapshot","bi","ci","Q","di","lastEffect","stores","ei","fi","gi","hi","ii","destroy","deps","ji","ki","li","mi","ni","oi","pi","qi","ri","si","ti","ui","vi","wi","xi","yi","zi","Ai","R","Bi","readContext","useCallback","useContext","useEffect","useImperativeHandle","useInsertionEffect","useLayoutEffect","useMemo","useReducer","useRef","useState","useDebugValue","useDeferredValue","useTransition","useMutableSource","useSyncExternalStore","useId","unstable_isNewReconciler","identifierPrefix","Ci","defaultProps","Di","Ei","isMounted","_reactInternals","enqueueSetState","enqueueReplaceState","enqueueForceUpdate","Fi","shouldComponentUpdate","isPureReactComponent","Gi","contextType","state","updater","Hi","componentWillReceiveProps","UNSAFE_componentWillReceiveProps","Ii","getDerivedStateFromProps","getSnapshotBeforeUpdate","UNSAFE_componentWillMount","componentWillMount","componentDidMount","Ji","digest","Ki","Li","error","Mi","WeakMap","Ni","Oi","Pi","Qi","getDerivedStateFromError","componentDidCatch","Ri","componentStack","Si","pingCache","Ti","Ui","Vi","Wi","ReactCurrentOwner","Xi","Yi","Zi","$i","aj","compare","bj","cj","dj","baseLanes","cachePool","transitions","ej","fj","gj","hj","ij","UNSAFE_componentWillUpdate","componentWillUpdate","componentDidUpdate","jj","kj","pendingContext","lj","zj","Aj","Bj","Cj","mj","nj","oj","fallback","pj","qj","sj","dataset","dgst","tj","uj","_reactRetry","rj","subtreeFlags","vj","wj","isBackwards","rendering","renderingStartTime","last","tail","tailMode","xj","Dj","S","Ej","Fj","wasMultiple","multiple","suppressHydrationWarning","onClick","onclick","createElementNS","autoFocus","createTextNode","T","Gj","Hj","Ij","Jj","U","Kj","WeakSet","V","Lj","W","Mj","Nj","Pj","Qj","Rj","Sj","Tj","Uj","Vj","insertBefore","_reactRootContainer","Wj","X","Xj","Yj","Zj","onCommitFiberUnmount","componentWillUnmount","ak","bk","ck","dk","ek","isHidden","fk","gk","display","hk","ik","jk","kk","__reactInternalSnapshotBeforeUpdate","Vk","lk","mk","nk","ok","Y","Z","pk","qk","rk","sk","tk","uk","vk","wk","xk","yk","zk","Ak","Bk","Ck","Dk","callbackNode","expirationTimes","expiredLanes","wc","callbackPriority","ig","Ek","Fk","Gk","Hk","Ik","Jk","Kk","Lk","Mk","Nk","Ok","finishedWork","finishedLanes","Pk","timeoutHandle","Qk","Rk","Sk","Tk","Uk","mutableReadLanes","Bc","Oj","onCommitFiberRoot","mc","onRecoverableError","Wk","onPostCommitFiberRoot","Xk","Yk","$k","isReactComponent","pendingChildren","al","mutableSourceEagerHydrationData","bl","pendingSuspenseBoundaries","dl","el","fl","gl","hl","yj","Zk","kl","reportError","ll","_internalRoot","ml","nl","ol","pl","rl","ql","unmount","unstable_scheduleHydration","querySelectorAll","JSON","stringify","form","sl","usingClientEntryPoint","tl","findFiberByHostInstance","bundleType","rendererPackageName","ul","rendererConfig","overrideHookState","overrideHookStateDeletePath","overrideHookStateRenamePath","overrideProps","overridePropsDeletePath","overridePropsRenamePath","setErrorHandler","setSuspenseHandler","scheduleUpdate","currentDispatcherRef","findHostInstanceByFiber","findHostInstancesForRefresh","scheduleRefresh","scheduleRoot","setRefreshHandler","getCurrentFiber","reconcilerVersion","__REACT_DEVTOOLS_GLOBAL_HOOK__","vl","isDisabled","supportsFiber","inject","createPortal","cl","createRoot","unstable_strictMode","findDOMNode","flushSync","hydrate","hydrateRoot","hydratedSources","_getVersion","_source","unmountComponentAtNode","unstable_batchedUpdates","unstable_renderSubtreeIntoContainer","checkDCE","err","__self","__source","Fragment","jsx","jsxs","setState","escape","_status","_result","default","Children","toArray","only","Component","Profiler","PureComponent","StrictMode","Suspense","act","cloneElement","createContext","_currentValue2","_threadCount","Provider","Consumer","_defaultValue","_globalName","createFactory","createRef","forwardRef","isValidElement","lazy","memo","startTransition","unstable_act","sortIndex","setImmediate","expirationTime","priorityLevel","navigator","scheduling","isInputPending","MessageChannel","port2","port1","onmessage","postMessage","unstable_Profiling","unstable_continueExecution","unstable_forceFrameRate","unstable_getFirstCallbackNode","unstable_next","unstable_pauseExecution","unstable_runWithPriority","delay","unstable_wrapCallback","__webpack_module_cache__","cachedModule","__webpack_modules__","leafPrototypes","getProto","getPrototypeOf","def","getOwnPropertyNames","definition","chunkId","all","reduce","promises","miniCssF","globalThis","Function","inProgress","dataWebpackPrefix","script","needAttach","scripts","getElementsByTagName","charset","timeout","nc","onScriptComplete","prev","onerror","onload","doneFns","fn","head","installedChunks","installedChunkData","promise","reject","errorType","realSrc","request","webpackJsonpCallback","parentChunkLoadingFunction","chunkIds","moreModules","runtime","some","chunkLoadingGlobal","self","Action","PopStateEventType","invariant","cond","getHistoryState","usr","idx","createLocation","to","_extends","pathname","hash","parsePath","substr","createPath","_ref","parsedPath","hashIndex","searchIndex","getUrlBasedHistory","getLocation","createHref","validateLocation","v5Compat","globalHistory","history","Pop","getIndex","handlePop","nextIndex","createURL","origin","URL","replaceState","listen","encodeLocation","Push","historyState","pushState","DOMException","Replace","go","ResultType","matchRoutes","routes","locationArg","basename","matchRoutesImpl","allowPartial","stripBasename","branches","flattenRoutes","score","siblings","every","compareIndexes","routesMeta","childrenIndex","rankRouteBranches","matches","decoded","decodePath","matchRouteBranch","parentsMeta","parentPath","flattenRoute","route","relativePath","caseSensitive","startsWith","joinPaths","computeScore","_route$path","exploded","explodeOptionalSegments","first","rest","isOptional","endsWith","required","restExploded","subpath","paramRe","dynamicSegmentValue","indexRouteValue","emptySegmentValue","staticSegmentValue","splatPenalty","isSplat","initialScore","branch","matchedParams","matchedPathname","remainingPathname","matchPath","params","pathnameBase","normalizePathname","matcher","compiledParams","regexpSource","_","paramName","RegExp","compilePath","captureGroups","splatValue","decodeURIComponent","startIndex","nextChar","getInvalidPathError","field","dest","getPathContributingMatches","getResolveToMatches","v7_relativeSplatPath","pathMatches","resolveTo","toArg","routePathnames","locationPathname","isPathRelative","from","isEmptyPath","toPathname","routePathnameIndex","toSegments","fromPathname","resolvePathname","normalizeSearch","normalizeHash","resolvePath","hasExplicitTrailingSlash","hasCurrentTrailingSlash","paths","isRouteErrorResponse","statusText","internal","validMutationMethodsArr","validRequestMethodsArr","DataRouterContext","React","DataRouterStateContext","NavigationContext","LocationContext","RouteContext","outlet","isDataRoute","RouteErrorContext","useInRouterContext","useLocation","UNSAFE_invariant","useIsomorphicLayoutEffect","static","useNavigate","router","useDataRouterContext","DataRouterHook","UseNavigateStable","useCurrentRouteId","DataRouterStateHook","activeRef","navigate","fromRouteId","useNavigateStable","dataRouterContext","future","routePathnamesJson","UNSAFE_getResolveToMatches","parse","useNavigateUnstable","useResolvedPath","_temp2","useRoutesImpl","dataRouterState","parentMatches","routeMatch","parentParams","parentPathnameBase","locationFromContext","_parsedLocationArg$pa","parsedLocationArg","parentSegments","renderedMatches","_renderMatches","navigationType","DefaultErrorComponent","_state$errors","useDataRouterState","UseRouteError","routeId","errors","useRouteError","lightgrey","preStyles","backgroundColor","fontStyle","defaultErrorElement","RenderErrorBoundary","super","revalidation","errorInfo","routeContext","component","RenderedRoute","staticContext","errorElement","ErrorBoundary","_deepestRenderedBoundaryId","_dataRouterState","_future","v7_partialHydration","initialized","errorIndex","findIndex","renderFallback","fallbackIndex","HydrateFallback","hydrateFallbackElement","loaderData","needsToRunLoader","loader","reduceRight","shouldRenderHydrateFallback","alreadyWarned","getChildren","hookName","ctx","useRouteContext","thisRoute","Route","_props","Router","_ref5","basenameProp","locationProp","staticProp","navigationContext","locationContext","trailingPathname","Routes","_ref6","createRoutesFromChildren","treePath","hasErrorBoundary","shouldRevalidate","handle","__reactRouterVersion","startTransitionImpl","ReactDOM","BrowserRouter","_ref4","historyRef","setStateImpl","v7_startTransition","newState","isBrowser","ABSOLUTE_URL_REGEX","Link","_ref7","absoluteHref","reloadDocument","preventScrollReset","viewTransition","_objectWithoutPropertiesLoose","_excluded","UNSAFE_NavigationContext","isExternal","currentUrl","targetUrl","protocol","joinedPathname","useHref","internalOnClick","replaceProp","isModifiedEvent","shouldProcessLinkClick","useLinkClickHandler","CONSTANTS","assert","assertion","assertionError","stringToByteArray$1","str","out","charCodeAt","base64","byteToCharMap_","charToByteMap_","byteToCharMapWebSafe_","charToByteMapWebSafe_","ENCODED_VALS_BASE","ENCODED_VALS","ENCODED_VALS_WEBSAFE","HAS_NATIVE_SUPPORT","atob","encodeByteArray","webSafe","init_","byteToCharMap","byte1","haveByte2","byte2","haveByte3","byte3","outByte1","outByte2","outByte3","outByte4","encodeString","btoa","decodeString","bytes","pos","c1","c2","c3","byteArrayToString","decodeStringToByteArray","charToByteMap","byte4","DecodeBase64StringError","base64Encode","utf8Bytes","base64urlEncodeWithoutPadding","base64Decode","deepCopy","deepExtend","getTime","getDefaultsFromGlobal","getGlobal","__FIREBASE_DEFAULTS__","getDefaults","getDefaultsFromEnvVariable","process","defaultsJsonString","getDefaultsFromCookie","cookie","getDefaultEmulatorHost","productName","_a","_b","emulatorHosts","getDefaultEmulatorHostnameAndPort","host","separatorIndex","lastIndexOf","port","getDefaultAppConfig","config","getExperimentalSetting","Deferred","wrapCallback","createMockUserToken","token","projectId","uid","project","iat","user_id","iss","aud","exp","auth_time","firebase","sign_in_provider","identities","alg","getUA","isMobileCordova","isReactNative","isNodeSdk","isSafari","forceEnvironment","isNode","userAgent","isIndexedDBAvailable","indexedDB","FirebaseError","customData","setPrototypeOf","captureStackTrace","ErrorFactory","service","serviceName","fullCode","template","PATTERN","replaceTemplate","fullMessage","jsonEval","decode","header","claims","signature","safeGet","isEmpty","contextObj","res","deepEqual","aKeys","bKeys","aProp","bProp","isObject","thing","querystring","querystringParams","entries","arrayVal","querystringDecode","extractQuerystring","queryStart","fragmentStart","Sha1","chain_","buf_","W_","pad_","inbuf_","total_","blockSize","reset","compress_","buf","lengthMinusBlock","inbuf","totalBits","ObserverProxy","executor","onNoObservers","observers","unsubscribes","observerCount","task","finalized","forEachObserver","observer","close","complete","subscribe","nextOrObserver","methods","method","implementsAnyMethods","noop","unsub","unsubscribeOne","finalError","sendOne","errorPrefix","fnName","argName","stringLength","getModularInstance","_delegate","instanceFactory","multipleInstances","serviceProps","instantiationMode","onInstanceCreated","setInstantiationMode","setMultipleInstances","setServiceProps","setInstanceCreatedCallback","DEFAULT_ENTRY_NAME","container","instances","instancesDeferred","instancesOptions","onInitCallbacks","identifier","normalizedIdentifier","normalizeInstanceIdentifier","deferred","isInitialized","shouldAutoInitialize","getOrInitializeService","instanceIdentifier","getImmediate","optional","getComponent","setComponent","isComponentEager","instanceDeferred","clearInstance","services","INTERNAL","_delete","isComponentSet","getOptions","initialize","opts","onInit","existingCallbacks","existingInstance","invokeOnInitCallbacks","ComponentContainer","providers","addComponent","provider","getProvider","addOrOverwriteComponent","getProviders","LogLevel","levelStringToEnum","DEBUG","VERBOSE","INFO","WARN","ERROR","SILENT","defaultLogLevel","ConsoleMethod","defaultLogHandler","logType","toISOString","_len","_key","Logger","_logLevel","_logHandler","_userLogHandler","TypeError","setLogLevel","logHandler","userLogHandler","debug","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","_len6","_key6","idbProxyableTypes","cursorAdvanceMethods","cursorRequestMap","transactionDoneMap","transactionStoreNamesMap","transformCache","reverseTransformCache","idbProxyTraps","receiver","IDBTransaction","objectStoreNames","objectStore","wrap","wrapFunction","IDBDatabase","transaction","IDBCursor","advance","continue","continuePrimaryKey","unwrap","storeNames","tx","transformCachableValue","unlisten","cacheDonePromiseForTransaction","IDBObjectStore","IDBIndex","Proxy","instanceOfAny","IDBRequest","success","promisifyRequest","newValue","readMethods","writeMethods","cachedMethods","getMethod","targetFuncName","useIndex","isWrite","async","storeName","store","oldTraps","PlatformLoggerServiceImpl","getPlatformInfoString","isVersionServiceProvider","library","logString","logger","PLATFORM_LOG_STRING","name$q","name$p","name$n","name$o","name$l","name$m","name$k","name$j","name$i","name$h","name$g","name$f","name$e","name$d","name$c","name$b","name$a","name$9","name$8","name$7","name$6","name$5","name$4","name$3","name$1","name$2","_apps","_serverApps","_components","_addComponent","app","_registerComponent","componentName","serverApp","_getProvider","heartbeatController","triggerHeartbeat","_isFirebaseServerApp","ERROR_FACTORY","FirebaseAppImpl","_isDeleted","_options","_config","_name","_automaticDataCollectionEnabled","automaticDataCollectionEnabled","_container","checkDestroyed","isDeleted","appName","SDK_VERSION","initializeApp","rawConfig","existingApp","newApp","getApp","registerVersion","libraryKeyOrName","variant","libraryMismatch","versionMismatch","STORE_NAME","dbPromise","getDbPromise","blocked","upgrade","blocking","terminated","open","openPromise","oldVersion","newVersion","openDB","createObjectStore","originalErrorMessage","writeHeartbeatsToIndexedDB","heartbeatObject","put","computeKey","idbGetError","appId","HeartbeatServiceImpl","_heartbeatsCache","_storage","HeartbeatStorageImpl","_heartbeatsCachePromise","read","agent","getUTCDateString","heartbeats","lastSentHeartbeatDate","singleDateHeartbeat","hbTimestamp","overwrite","getHeartbeatsHeader","heartbeatsToSend","unsentEntries","heartbeatsCache","maxSize","heartbeatEntry","find","dates","countBytes","extractHeartbeatsForHeader","headerString","_canUseIndexedDBPromise","runIndexedDBEnvironmentCheck","preExist","DB_CHECK_NAME","onsuccess","deleteDatabase","onupgradeneeded","idbHeartbeatObject","readHeartbeatsFromIndexedDB","heartbeatsObject","existingHeartbeatsObject","version$1","__rest","getOwnPropertySymbols","propertyIsEnumerable","SuppressedError","_prodErrorMap","prodErrorMap","_DEFAULT_AUTH_ERROR_FACTORY","logClient","_logError","msg","_fail","authOrCode","createErrorInternal","_createError","_errorWithCustomMessage","auth","errorMap","_serverAppCurrentUserOperationNotSupportedError","fullParams","_errorFactory","_assert","_key7","debugFail","failure","debugAssert","_getCurrentUrl","_isHttpOrHttps","_getCurrentScheme","_isOnline","onLine","chrome","browser","isBrowserExtension","Delay","shortDelay","longDelay","isMobile","_emulatorUrl","emulator","FetchProvider","fetchImpl","headersImpl","responseImpl","fetch","headers","Headers","response","Response","SERVER_ERROR_MAP","DEFAULT_API_TIMEOUT_MS","_addTidIfNecessary","tenantId","_performApiRequest","_performFetchWithErrorHandling","query","apiKey","_getAdditionalHeaders","languageCode","fetchArgs","referrerPolicy","_getFinalTarget","apiHost","customErrorMap","fetchFn","_canInitEmulator","networkTimeout","NetworkTimeout","race","clearNetworkTimeout","json","_makeTaggedError","errorMessage","serverErrorCode","serverErrorMessage","authError","_performSignInRequest","serverResponse","_serverResponse","apiScheme","_parseEnforcementState","enforcementStateStr","timer","errorParams","phoneNumber","_tokenResponse","isEnterprise","grecaptcha","enterprise","RecaptchaConfig","siteKey","recaptchaEnforcementState","recaptchaKey","getProviderEnforcementState","providerStr","enforcementState","isProviderEnabled","isAnyProviderEnabled","getRecaptchaConfig","getAccountInfo","utcTimestampToDateString","utcTimestamp","toUTCString","secondsStringToMilliseconds","seconds","_parseToken","algorithm","_tokenExpiresIn","parsedToken","_logoutIfInvalidated","user","isUserInvalidated","currentUser","signOut","ProactiveRefresh","isRunning","timerId","errorBackoff","_start","schedule","_stop","getInterval","wasError","interval","stsTokenManager","iteration","getIdToken","UserMetadata","createdAt","lastLoginAt","_initializeTime","lastSignInTime","creationTime","_copy","metadata","toJSON","_reloadWithoutSaving","idToken","users","coreAccount","_notifyReloadListener","newProviderData","providerUserInfo","extractProviderData","providerData","original","newData","providerId","oldIsAnonymous","isAnonymous","newIsAnonymous","passwordHash","updates","localId","photoURL","photoUrl","emailVerified","rawId","StsTokenManager","refreshToken","accessToken","isExpired","updateFromServerResponse","expiresIn","updateTokensAndExpiration","updateFromIdToken","getToken","refresh","clearRefreshToken","oldToken","tokenApiHost","access_token","expires_in","refresh_token","requestStsToken","expiresInSec","fromJSON","manager","_assign","_clone","_performRefresh","assertStringOrUndefined","UserImpl","opt","proactiveRefresh","reloadUserInfo","reloadListener","forceRefresh","_persistUserIfCurrent","_notifyListenersIfCurrent","getIdTokenResult","userInternal","signInProvider","authTime","issuedAtTime","signInSecondFactor","reload","userInfo","newUser","_onReload","_startProactiveRefresh","_stopProactiveRefresh","_updateTokensIfNecessary","tokensRefreshed","deleteAccount","_redirectEventId","_fromJSON","_c","_d","_e","_f","_g","_h","plainObjectTokenManager","_fromIdTokenResponse","idTokenResponse","_fromGetAccountInfoResponse","instanceCache","_getInstance","cls","InMemoryPersistence","storage","_isAvailable","_set","_get","_remove","_addListener","_listener","_removeListener","inMemoryPersistence","_persistenceKeyName","PersistenceUserManager","persistence","userKey","fullUserKey","fullPersistenceKey","boundEventHandler","_onStorageEvent","setCurrentUser","getCurrentUser","blob","removeCurrentUser","savePersistenceForRedirect","setPersistence","newPersistence","persistenceHierarchy","availablePersistences","selectedPersistence","userToMigrate","migrationHierarchy","_shouldAllowMigration","_getBrowserName","_isIEMobile","_isFirefox","_isBlackBerry","_isWebOS","_isSafari","_isChromeIOS","_isAndroid","_isIOS","_isIE10","isIE","_isMobileBrowser","_getClientVersion","clientPlatform","reportedPlatform","frameworks","reportedFrameworks","AuthMiddlewareQueue","pushCallback","onAbort","wrappedCallback","runMiddleware","nextUser","onAbortStack","beforeStateCallback","reverse","originalMessage","PasswordPolicyImpl","responseOptions","customStrengthOptions","minPasswordLength","maxPasswordLength","containsLowercaseCharacter","containsLowercaseLetter","containsUppercaseCharacter","containsUppercaseLetter","containsNumericCharacter","containsNonAlphanumericCharacter","allowedNonAlphanumericCharacters","forceUpgradeOnSignin","schemaVersion","validatePassword","isValid","passwordPolicy","validatePasswordLengthOptions","validatePasswordCharacterOptions","meetsMinPasswordLength","meetsMaxPasswordLength","passwordChar","updatePasswordCharacterOptionsStatuses","AuthImpl","heartbeatServiceProvider","appCheckServiceProvider","emulatorConfig","operations","authStateSubscription","Subscription","idTokenSubscription","beforeStateQueue","redirectUser","isProactiveRefreshEnabled","EXPECTED_PASSWORD_POLICY_SCHEMA_VERSION","_isInitialized","_deleted","_initializationPromise","_popupRedirectResolver","_agentRecaptchaConfig","_tenantRecaptchaConfigs","_projectPasswordPolicy","_tenantPasswordPolicies","lastNotifiedUid","appVerificationDisabledForTesting","clientVersion","sdkClientVersion","_initializeWithPersistence","popupRedirectResolver","persistenceManager","_shouldInitProactively","_initialize","initializeCurrentUser","assertedPersistence","_currentUser","_updateCurrentUser","initializeCurrentUserFromIdToken","directlySetCurrentUser","authIdToken","previouslyStoredUser","futureCurrentUser","needsTocheckMiddleware","authDomain","getOrInitRedirectPersistenceManager","redirectUserEventId","storedUserEventId","tryRedirectSignIn","_overrideRedirectResult","reloadAndSetCurrentUserOrClear","redirectResolver","_completeRedirectFn","_setRedirectUser","useDeviceLanguage","navigatorLanguage","languages","language","_getUserLanguage","updateCurrentUser","userExtern","skipBeforeStateCallbacks","notifyAuthListeners","redirectPersistenceManager","_getRecaptchaConfig","_getPasswordPolicyInternal","_updatePasswordPolicy","_getPasswordPolicy","_getPersistence","_updateErrorMap","onAuthStateChanged","completed","registerStateListener","beforeAuthStateChanged","onIdTokenChanged","authStateReady","unsubscribe","revokeAccessToken","tokenType","revokeToken","redirectManager","resolver","_redirectPersistence","_redirectUserForId","currentUid","subscription","isUnsubscribed","addObserver","_logFramework","framework","_getFrameworks","heartbeatsHeader","appCheckToken","_getAppCheckToken","appCheckTokenResult","_logWarn","_castAuth","proxy","createSubscribe","externalJSProvider","loadJS","recaptchaV2Script","recaptchaEnterpriseScript","gapiScript","_loadJS","_generateCallbackName","prefix","MockGreCAPTCHATopLevel","MockGreCAPTCHA","ready","execute","_siteKey","_parameters","FAKE_TOKEN","RecaptchaEnterpriseVerifier","authExtern","verify","retrieveRecaptchaToken","clientType","retrieveSiteKey","injectRecaptchaFields","isCaptchaResp","isFakeToken","verifier","captchaResponse","newRequest","phoneEnrollmentInfo","recaptchaToken","phoneSignInInfo","handleRecaptchaFlow","authInstance","actionName","actionMethod","recaptchaAuthProvider","requestWithRecaptcha","requestWithRecaptchaFields","_initializeRecaptchaConfig","authInternal","connectAuthEmulator","disableWarnings","extractProtocol","authority","hostAndPort","bracketedIPv6","parsePort","extractHostAndPort","portStr","freeze","attachBanner","sty","innerText","border","bottom","margin","classList","readyState","emitEmulatorWarning","protocolEnd","AuthCredential","signInMethod","_getIdTokenResponse","_auth","_linkToIdToken","_idToken","_getReauthenticationResolver","linkEmailPassword","signInWithPassword","EmailAuthCredential","_email","_password","_tenantId","_fromEmailAndPassword","_fromEmailAndCode","oobCode","returnSecureToken","signInWithEmailLink$1","signInWithEmailLinkForLinking","signInWithIdp","OAuthCredential","pendingToken","_fromParams","cred","nonce","oauthToken","oauthTokenSecret","secret","buildRequest","autoCreate","requestUri","postBody","sendPhoneVerificationCode","VERIFY_PHONE_NUMBER_FOR_EXISTING_ERROR_MAP_","PhoneAuthCredential","_fromVerification","verificationId","verificationCode","_fromTokenResponse","temporaryProof","signInWithPhoneNumber$1","_makeVerificationRequest","linkWithPhoneNumber$1","operation","verifyPhoneNumberForExisting","sessionInfo","ActionCodeURL","actionLink","searchParams","parseMode","continueUrl","parseLink","doubleDeepLink","iOSDeepLink","parseDeepLink","EmailAuthProvider","PROVIDER_ID","credential","credentialWithLink","emailLink","actionCodeUrl","EMAIL_PASSWORD_SIGN_IN_METHOD","EMAIL_LINK_SIGN_IN_METHOD","FederatedAuthProvider","defaultLanguageCode","customParameters","setDefaultLanguage","setCustomParameters","customOAuthParameters","getCustomParameters","BaseOAuthProvider","scopes","addScope","scope","getScopes","FacebookAuthProvider","FACEBOOK_SIGN_IN_METHOD","credentialFromResult","userCredential","credentialFromTaggedObject","credentialFromError","_ref3","tokenResponse","oauthAccessToken","GoogleAuthProvider","GOOGLE_SIGN_IN_METHOD","oauthIdToken","GithubAuthProvider","GITHUB_SIGN_IN_METHOD","TwitterAuthProvider","TWITTER_SIGN_IN_METHOD","signUp","UserCredentialImpl","operationType","providerIdForResponse","_forOperation","MultiFactorError","_fromErrorAndOperation","_processCredentialSavingMfaContextIfNecessary","_link$1","bypassAuthState","_reauthenticate","_signInWithCredential","signInWithCredential","recachePasswordPolicy","signInWithEmailAndPassword","startEnrollPhoneMfa","STORAGE_AVAILABLE_KEY","BrowserPersistenceClass","storageRetriever","setItem","removeItem","BrowserLocalPersistence","localStorage","poll","onStorageEvent","localCache","pollTimer","fallbackToPolling","forAllChangedKeys","oldValue","_oldValue","notifyListeners","detachListener","stopPolling","triggerListeners","storedValue","startPolling","setInterval","StorageEvent","clearInterval","attachListener","browserLocalPersistence","BrowserSessionPersistence","sessionStorage","browserSessionPersistence","Receiver","eventTarget","handlersMap","handleEvent","receivers","isListeningto","newInstance","messageEvent","eventId","eventType","handlers","ports","handler","fulfilled","reason","_allSettled","_subscribe","eventHandler","_unsubscribe","_generateEventId","digits","Sender","removeMessageHandler","messageChannel","onMessage","_send","completionTimer","ackTimer","finally","_window","_isWorker","DB_NAME","DB_OBJECTSTORE_NAME","DB_DATA_KEYPATH","DBPromise","toPromise","getObjectStore","isReadWrite","_openDatabase","keyPath","_deleteDatabase","_putObject","_deleteObject","IndexedDBLocalPersistence","pendingWrites","sender","serviceWorkerReceiverAvailable","activeServiceWorker","_workerInitializationPromise","initializeServiceWorkerMessaging","_openDb","_withRetries","op","numAttempts","initializeReceiver","initializeSender","_origin","keyProcessed","_poll","_data","serviceWorker","active","_getActiveServiceWorker","results","notifyServiceWorker","_getServiceWorkerController","_withPendingWrite","write","getObject","getAllRequest","getAll","keysInResult","fbase_key","localKey","indexedDBLocalPersistence","startSignInPhoneMfa","RECAPTCHA_VERIFIER_TYPE","_verifyPhoneNumber","phoneInfoOptions","session","startPhoneMfaEnrollmentRequest","startPhoneMfaEnrollmentResponse","injectRecaptchaV2Token","phoneSessionInfo","mfaEnrollmentId","multiFactorHint","multiFactorUid","startPhoneMfaSignInRequest","mfaPendingCredential","startPhoneMfaSignInResponse","phoneResponseInfo","sendPhoneVerificationCodeRequest","sendPhoneVerificationCodeResponse","_reset","recaptchaV2Verifier","recaptchaV2Token","recaptchaVersion","PhoneAuthProvider","verifyPhoneNumber","phoneOptions","applicationVerifier","_ref12","_withDefaultResolver","resolverOverride","PHONE_SIGN_IN_METHOD","IdpCredential","_buildIdpRequest","sessionId","returnIdpCredential","_signIn","_reauth","_link","AbstractPopupRedirectOperation","pendingPromise","eventManager","onExecution","registerConsumer","onAuthEvent","urlResponse","getIdpTask","unregisterAndCleanUp","unregisterConsumer","cleanUp","_POLL_WINDOW_CLOSE_TIMEOUT","PopupOperation","authWindow","pollId","currentPopupAction","cancel","executeNotNull","_openPopup","associatedEvent","_originValidation","_isIframeWebStorageSupported","isSupported","pollUserCancellation","closed","redirectOutcomeMap","RedirectAction","readyOutcome","hasPendingRedirect","pendingRedirectKey","resolverPersistence","_getAndClearPendingRedirectStatus","_getRedirectResult","resolverExtern","AuthEventManager","cachedEventUids","consumers","queuedRedirectEvent","hasHandledPotentialRedirect","lastProcessedEventTime","authEventConsumer","isEventForConsumer","sendToConsumer","saveEventToCache","onEvent","hasEventBeenHandled","handled","consumer","isNullRedirectEvent","isRedirectEvent","eventIdMatches","eventUid","_ref13","IP_ADDRESS_REGEX","HTTP_REGEX","_validateOrigin","authorizedDomains","_getProjectConfig","domain","matchDomain","expected","hostname","ceUrl","escapedDomainPattern","NETWORK_TIMEOUT","resetUnloadedGapiModules","beacon","___jsl","hint","CP","loadGapi","loadGapiIframe","gapi","load","iframes","ontimeout","Iframe","cbName","cachedGApiLoader","PING_TIMEOUT","IFRAME_ATTRIBUTES","tabindex","EID_FROM_APIHOST","getIframeUrl","eid","fw","_openIframe","_loadGapi","where","messageHandlersFilter","CROSS_ORIGIN_IFRAMES_FILTER","attributes","dontclear","iframe","restyle","setHideOnLeave","networkError","networkErrorTimer","clearTimerAndResolve","ping","BASE_POPUP_OPTIONS","resizable","statusbar","toolbar","AuthPopup","_open","screen","availHeight","availWidth","scrollbars","optionsString","accum","_ref14","standalone","_isIOSStandalone","click","createEvent","initMouseEvent","openAsNewWindowIOS","newWin","WIDGET_PATH","EMULATOR_WIDGET_PATH","FIREBASE_APP_CHECK_FRAGMENT_ID","_getRedirectUrl","authType","redirectUrl","additionalParams","tid","paramsDict","appCheckTokenFragment","_ref15","getHandlerBase","WEB_STORAGE_SUPPORT_KEY","browserPopupRedirectResolver","eventManagers","originValidationPromises","_openRedirect","_setWindowLocation","initAndGetManager","iframeEvent","authEvent","send","AuthInterop","internalListeners","getUid","assertAuthConfigured","addAuthTokenListener","updateProactiveRefresh","removeAuthTokenListener","authIdTokenMaxAge","lastPostedIdToken","getScriptParentElement","_ref16","hierarchy","_initializeAuthInstance","_instanceIdentifier","_instance","getVersionForPlatform","setSDKVersion","DOMStorageWrapper","domStorage_","prefix_","prefixedName_","storedVal","MemoryStorage","cache_","isInMemoryStorage","createStoragefor","domStorageName","domStorage","PersistentStorage","SessionStorage","LUIDGenerator","sha1","high","stringToByteArray","sha1Bytes","buildLogMessage_","arg","firstLog_","enableLogging$1","logger_","persistent","varArgs","logWrapper","fatal","isInvalidJSONNumber","POSITIVE_INFINITY","NEGATIVE_INFINITY","MIN_NAME","MAX_NAME","nameCompare","aAsInt","tryParseInt","bAsInt","stringCompare","requireKey","ObjectToUniqueKey","splitStringBySize","segsize","dataSegs","each","doubleToIEEE754String","bias","ln","bits","hexByteString","hexByte","INTEGER_REGEXP_","intVal","exceptionGuard","setTimeoutNonBlocking","Deno","unrefTimer","AppCheckTokenProvider","appName_","appCheckProvider","appCheck","addTokenChangeListener","addTokenListener","notifyForInvalidToken","FirebaseAuthTokenProvider","firebaseOptions_","authProvider_","auth_","removeTokenChangeListener","EmulatorTokenProvider","OWNER","PROTOCOL_VERSION","FORGE_DOMAIN_RE","APP_CHECK_TOKEN_PARAM","WEBSOCKET","LONG_POLLING","RepoInfo","secure","namespace","webSocketOnly","nodeAdmin","persistenceKey","includeNamespaceInQueryParams","isUsingEmulator","_host","_domain","internalHost","isCacheableHost","isCustomHost","newHost","toURLString","repoInfoConnectionURL","repoInfo","connURL","repoInfoNeedsQueryParam","StatsCollection","counters_","incrementCounter","amount","collections","reporters","statsManagerGetCollection","hashString","PacketReceiver","onMessage_","pendingResponses","currentResponseNum","closeAfterResponse","onClose","closeAfter","responseNum","handleResponse","requestNum","toProcess","FIREBASE_LONGPOLL_START_PARAM","BrowserPollConnection","connId","applicationId","authToken","transportSessionId","lastSessionId","bytesSent","bytesReceived","everConnected_","log_","stats_","urlFn","onDisconnect","_this","curSegmentNum","onDisconnect_","myPacketOrderer","isClosed_","connectTimeoutTimer_","onClosed_","called","wrappedFn","executeWhenDOMReady","scriptTagHolder","FirebaseIFrameScriptHolder","command","arg1","arg2","arg3","arg4","incrementIncomingBytes_","sendNewPolls","pN","urlParams","uniqueCallbackIdentifier","connectURL","addTag","startLongPoll","addDisconnectPingFrame","forceAllow","forceAllow_","forceDisallow","forceDisallow_","isAvailable","Windows","UI","markConnectionHealthy","shutdown_","myDisconnFrame","dataStr","base64data","MAX_URL_DATA_SIZE","enqueueSegment","pw","commandCB","onMessageCB","outstandingRequests","pendingSegs","currentSerial","myIFrame","createIFrame_","iframeContents","doc","contentDocument","alive","myID","myPW","newRequest_","theURL","curDataString","theSeg","ts","addLongPollTag_","segnum","totalsegs","serial","doNewRequest","keepaliveTimeout","readyStateCB","loadCB","doNodeLongPoll","newScript","onreadystatechange","rstate","WebSocketImpl","MozWebSocket","WebSocket","WebSocketConnection","keepaliveTimer","frames","totalFrames","connectionURL_","device","platform","env","mySock","onopen","onclose","handleIncomingFrame","isOldAndroid","oldAndroidRegex","oldAndroidMatch","previouslyFailed","appendFrame_","fullMess","jsonMess","handleNewFrameCount_","frameCount","extractFrameCount_","mess","resetKeepAlive","remainingData","sendString_","responsesRequiredToBeHealthy","healthyTimeout","TransportManager","initTransports_","ALL_TRANSPORTS","IS_TRANSPORT_INITIALIZED","globalTransportInitialized_","isWebSocketsAvailable","isSkipPollConnection","transports_","transports","transport","initialTransport","upgradeTransport","Connection","repoInfo_","applicationId_","appCheckToken_","authToken_","onReady_","onKill_","connectionCount","pendingDataMessages","state_","transportManager_","start_","conn","conn_","nextTransportId_","primaryResponsesRequired_","onMessageReceived","connReceiver_","onConnectionLost","disconnReceiver_","tx_","rx_","secondaryConn_","isHealthy_","healthyTimeoutMS","healthyTimeout_","everConnected","onConnectionLost_","onSecondaryConnectionLost_","onPrimaryMessageReceived_","onSecondaryMessageReceived_","sendRequest","dataMsg","sendData_","tryCleanupConnection","onSecondaryControl_","controlData","cmd","upgradeIfSecondaryHealthy_","secondaryResponsesRequired_","parsedData","layer","proceedWithUpgrade_","onControl_","onDataMessage_","onPrimaryResponse_","handshakePayload","onHandshake_","onConnectionShutdown_","onReset_","sendPingOnPrimaryIfNecessary_","handshake","onConnectionEstablished_","tryStartUpgrade_","startUpgrade_","closeConnections_","ServerActions","pathString","onComplete","refreshAuthToken","refreshAppCheckToken","onDisconnectPut","onDisconnectMerge","onDisconnectCancel","reportStats","EventEmitter","allowedEvents_","listeners_","validateEventType_","eventData","getInitialEvent","et","OnlineMonitor","online_","getInstance","currentlyOnline","Path","pathOrString","pieceNum","pieces_","copyTo","pieceNum_","newEmptyPath","pathGetFront","pathGetLength","pathPopFront","pathGetBack","pathSlice","pathParent","pieces","pathChild","childPathObj","childPieces","pathIsEmpty","newRelativePath","outerPath","innerPath","outer","inner","pathCompare","right","leftKeys","rightKeys","cmp","pathEquals","other","pathContains","ValidationPath","errorPrefix_","parts_","byteLength_","validationPathCheckValid","validationPath","validationPathToErrorString","VisibilityMonitor","hidden","visibilityChange","visible_","RECONNECT_MIN_DELAY","PersistentConnection","onDataUpdate_","onConnectStatus_","onServerInfoUpdate_","authTokenProvider_","appCheckTokenProvider_","authOverride_","nextPersistentConnectionId_","interruptReasons_","listens","outstandingPuts_","outstandingGets_","outstandingPutCount_","outstandingGetCount_","onDisconnectRequestQueue_","connected_","reconnectDelay_","maxReconnectDelay_","securityDebugCallback_","establishConnectionTimer_","requestCBHash_","requestNumber_","realtime_","forceTokenRefresh_","invalidAuthTokenCount_","invalidAppCheckTokenCount_","firstConnection_","lastConnectionAttemptTime_","lastConnectionEstablishedTime_","onVisible_","onOnline_","onResponse","curReqNum","initConnection_","outstandingGet","_path","_queryObject","sendGet_","currentHashFn","queryId","_queryIdentifier","_queryParams","isDefault","loadsAllData","listenSpec","hashFn","sendListen_","req","warnOnListenWarnings_","removeListen_","warnings","indexSpec","indexPath","tryAuth","reduceReconnectDelayIfAdminCredential_","isAdmin","tryAppCheck","authMethod","isValidFormat","requestData","onAuthRevoked_","onAppCheckRevoked_","sendUnlisten_","queryObj","sendOnDisconnect_","putInternal","sendPut_","queued","errorReason","reqNum","onDataPush_","onListenRevoked_","onSecurityDebugPacket_","handleTimestamp_","sendConnectStats_","restoreState_","scheduleConnect_","establishConnection_","online","onRealtimeDisconnect_","cancelSentTransactions_","shouldReconnect_","timeSinceLastConnectAttempt","reconnectDelay","onDataMessage","onReady","nextConnectionId_","canceled","connection","closeFn","sendRequestFn","interrupt","resume","serverTimeOffset","normalizedPathString","statusCode","explanation","queries","clientName","NamedNode","Wrap","Index","getCompare","indexedValueChanged","oldNode","newNode","oldWrapped","newWrapped","minPost","MIN","__EMPTY_NODE","KeyIndex","isDefinedOn","maxPost","makePost","indexValue","KEY_INDEX","SortedMapIterator","startKey","comparator","isReverse_","resultGenerator_","nodeStack_","getNext","hasNext","peek","LLRBNode","RED","SortedMap","EMPTY_NODE","copy","inorderTraversal","reverseTraversal","min_","minKey","maxKey","insert","fixUp_","removeMin_","isRed_","moveRedLeft_","smallest","rotateRight_","moveRedRight_","rotateLeft_","colorFlip_","nr","checkMaxDepth_","blackDepth","check_","BLACK","comparator_","root_","getPredecessorKey","rightParent","getIterator","resultGenerator","getIteratorFrom","getReverseIteratorFrom","getReverseIterator","NAME_ONLY_COMPARATOR","NAME_COMPARATOR","MAX_NODE$2","priorityHashText","validatePriorityNode","priorityNode","isLeafNode","getPriority","__childrenNodeConstructor","nodeFromJSON$1","MAX_NODE$1","LeafNode","value_","priorityNode_","lazyHash_","updatePriority","newPriorityNode","getImmediateChild","childName","getChild","hasChild","getPredecessorChildName","childNode","updateImmediateChild","newChildNode","updateChild","front","numChildren","forEachChild","exportFormat","toHash","compareTo","compareToLeafNode_","otherLeaf","otherLeafType","thisLeafType","otherIndex","VALUE_TYPE_ORDER","thisIndex","withIndex","isIndexed","equals","PRIORITY_INDEX","aPriority","bPriority","indexCmp","LOG_2","Base12Num","num","current_","bits_","nextBitIsOne","buildChildSet","childList","keyFn","mapSortFn","buildBalancedTree","low","namedNode","middle","root","base12","buildPennant","chunkSize","childTree","attachPennant","pennant","isOne","buildFrom12Array","_defaultIndexMap","fallbackObject","IndexMap","indexes_","indexSet_","Default","indexKey","sortedMap","hasIndex","indexDefinition","addIndex","existingChildren","sawIndexedValue","iter","newIndex","indexName","newIndexSet","newIndexes","addToIndexes","indexedChildren","existingSnap","newChildren","removeFromIndexes","ChildrenNode","children_","indexMap_","newIndexMap","newPriority","newImmediateChild","numKeys","allIntegerKeys","childHash","resolveIndex_","predecessor","getFirstChildName","getFirstChild","getLastChildName","getLastChild","wrappedNode","startPost","endPost","MAX_NODE","otherChildrenNode","thisIter","otherIter","thisCurrent","otherCurrent","defineProperties","MAX","setMaxNode","nodeFromJSON","childData","childrenHavePriority","childSet","sortedChildSet","setNodeFromJSON","PathIndex","indexPath_","extractChild","snap","aChild","bChild","valueNode","VALUE_INDEX","changeValue","snapshotNode","changeChildAdded","changeChildRemoved","changeChildChanged","oldSnap","IndexedFilter","index_","newChild","affectedPath","optChangeAccumulator","oldChild","trackChildChange","updateFullNode","newSnap","filtersNodes","getIndexedFilter","RangedFilter","indexedFilter_","startPost_","getStartPost_","endPost_","getEndPost_","startIsInclusive_","startAfterSet_","endIsInclusive_","endBeforeSet_","getStartPost","getEndPost","isWithinStart","isWithinEnd","filtered","hasStart","startName","getIndexStartName","getIndexStartValue","hasEnd","endName","getIndexEndName","getIndexEndValue","LimitedFilter","withinDirectionalStart","reverse_","withinEndPost","withinStartPost","withinDirectionalEnd","compareRes","rangedFilter_","limit_","getLimit","isViewFromLeft","fullLimitUpdateChild_","childKey","childSnap","changeAccumulator","oldEventCache","newChildNamedNode","windowBoundary","inRange","oldChildSnap","nextChild","getChildAfterChild","compareNext","newEventCache","QueryParams","limitSet_","startSet_","startNameSet_","endSet_","endNameSet_","viewFrom_","indexStartValue_","indexStartName_","indexEndValue_","indexEndName_","hasLimit","hasAnchoredLimit","queryParamsToRestQueryStringParameters","queryParams","qs","orderBy","startParam","endParam","queryParamsGetQueryObject","viewFrom","ReadonlyRestClient","listens_","getListenId_","listenId","thisListen","queryStringParameters","restRequest_","xhr","XMLHttpRequest","responseText","SnapshotHolder","rootNode_","getNode","updateSnapshot","newSnapshotNode","newSparseSnapshotTree","sparseSnapshotTreeRemember","sparseSnapshotTree","sparseSnapshotTreeForEachTree","prefixPath","tree","sparseSnapshotTreeForEachChild","StatsListener","collection_","last_","newStats","stat","StatsReporter","collection","server_","statsToReport_","statsListener_","reportStats_","reportedStats","haveStatsToReport","OperationType","newOperationSourceServerTaggedQuery","fromUser","fromServer","tagged","AckUserWrite","affectedTree","revert","ACK_USER_WRITE","operationForChild","subtree","ListenComplete","LISTEN_COMPLETE","Overwrite","OVERWRITE","Merge","MERGE","CacheNode","node_","fullyInitialized_","filtered_","isFullyInitialized","isFiltered","isCompleteForPath","isCompleteForChild","EventGenerator","query_","eventGeneratorGenerateEventsForType","eventGenerator","changes","registrations","eventCache","filteredChanges","change","aWrapped","bWrapped","eventGeneratorCompareChanges","materializedChange","prevName","eventGeneratorMaterializeSingleChange","registration","respondsTo","newViewCache","serverCache","viewCacheUpdateEventSnap","viewCache","eventSnap","viewCacheUpdateServerSnap","serverSnap","viewCacheGetCompleteEventSnap","viewCacheGetCompleteServerSnap","emptyChildrenSingleton","ImmutableTree","fromObject","childPath","findRootMostMatchingPathAndValue","predicate","childExistingPathAndValue","findRootMostValueAndPath","toSet","setTree","newTree","fold","fold_","pathSoFar","findOnPath","findOnPath_","pathToFollow","foreachOnPath","foreachOnPath_","currentRelativePath","foreach","foreach_","foreachChild","CompoundWrite","writeTree_","empty","compoundWriteAddWrite","compoundWrite","rootmost","rootMostPath","newWriteTree","compoundWriteAddWrites","newWrite","compoundWriteRemoveWrite","compoundWriteHasCompleteWrite","compoundWriteGetCompleteNode","compoundWriteGetCompleteChildren","compoundWriteChildCompoundWrite","shadowingNode","compoundWriteIsEmpty","compoundWriteApply","applySubtreeWrite","writeTree","priorityWrite","writeTreeChildWrites","newWriteTreeRef","writeTreeRemoveWrite","writeId","allWrites","writeToRemove","removedWriteWasVisible","removedWriteOverlapsWithOtherWrites","currentWrite","writeTreeRecordContainsPath_","visibleWrites","writeTreeLayerTree_","writeTreeDefaultFilter_","lastWriteId","writeTreeResetTree_","writeRecord","writes","treeRoot","writePath","deepNode","writeTreeCalcCompleteEventCache","completeServerCache","writeIdsToExclude","includeHiddenWrites","subMerge","writeTreeRefCalcCompleteEventCache","writeTreeRef","writeTreeRefCalcCompleteEventChildren","completeServerChildren","completeChildren","topLevelSet","writeTreeCalcCompleteEventChildren","writeTreeRefCalcEventCacheAfterServerOverwrite","existingEventSnap","existingServerSnap","childMerge","writeTreeCalcEventCacheAfterServerOverwrite","writeTreeRefShadowingWrite","writeTreeShadowingWrite","writeTreeRefCalcIndexedSlice","completeServerData","toIterate","nodes","writeTreeCalcIndexedSlice","writeTreeRefCalcCompleteChild","existingServerCache","writeTreeCalcCompleteChild","writeTreeRefChild","ChildChangeAccumulator","changeMap","oldChange","oldType","getChanges","NO_COMPLETE_CHILD_SOURCE","getCompleteChild","WriteTreeCompleteChildSource","writes_","viewCache_","optCompleteServerCache_","serverNode","viewProcessorApplyOperation","viewProcessor","oldViewCache","writesCache","completeCache","accumulator","filterServerNode","viewProcessorApplyUserOverwrite","viewProcessorApplyServerOverwrite","changedChildren","curViewCache","viewProcessorCacheHasChild","viewProcessorApplyUserMerge","viewProcessorApplyServerMerge","ackUserWrite","serverChildren","viewProcessorRevertUserWrite","ackPath","mergePath","serverCachePath","viewProcessorAckUserWrite","oldServerNode","viewProcessorGenerateEventCacheAfterServerEvent","viewProcessorListenComplete","isLeafOrEmpty","oldCompleteSnap","viewProcessorMaybeAddValueEvent","changePath","oldEventSnap","completeEventChildren","completeNode","oldEventNode","updatedPriority","childChangePath","newEventChild","eventChildUpdate","changedSnap","oldServerSnap","newServerCache","serverFilter","newServerNode","viewProcessorApplyMerge","viewMergeTree","childMergeTree","isUnknownDeepMerge","View","initialViewCache","eventRegistrations_","indexFilter","processor_","newViewProcessor","initialServerCache","initialEventCache","eventGenerator_","viewGetCompleteServerCache","viewIsEmpty","viewRemoveEventRegistration","eventRegistration","cancelError","cancelEvents","maybeEvent","createCancelEvent","remaining","existing","hasAnyCallback","viewApplyOperation","viewGenerateEventsForChanges_","eventRegistrations","moves","eventGeneratorGenerateEventsForChanges","referenceConstructor$1","referenceConstructor","SyncPoint","views","syncPointApplyOperation","syncPoint","optCompleteServerCache","syncPointGetView","serverCacheComplete","eventCacheComplete","syncPointAddEventRegistration","viewAddEventRegistration","initialChanges","viewGetInitialEvents","syncPointRemoveEventRegistration","removed","hadCompleteView","syncPointHasCompleteView","viewQueryId","_repo","syncPointGetQueryViews","syncPointGetCompleteServerCache","syncPointViewForQuery","syncPointGetCompleteView","syncPointViewExistsForQuery","syncTreeNextQueryTag_","SyncTree","listenProvider_","syncPointTree_","pendingWriteTree_","tagToQueryMap","queryToTagMap","syncTreeApplyUserOverwrite","syncTree","writeTreeAddOverwrite","syncTreeApplyOperationToSyncPoints_","syncTreeApplyUserMerge","writeTreeAddMerge","changeTree","syncTreeAckUserWrite","record","writeTreeGetWrite","syncTreeApplyServerOverwrite","syncTreeRemoveEventRegistration","skipListenerDedup","maybeSyncPoint","removedAndEvents","removingDefault","covered","parentSyncPoint","newViews","maybeChildSyncPoint","childMap","childViews","syncTreeCollectDistinctViewsForSubTree_","newQuery","syncTreeCreateListenerForView_","startListening","syncTreeQueryForListening_","syncTreeTagForQuery","defaultTag","stopListening","queryToRemove","tagToRemove","syncTreeMakeQueryKey_","removedQuery","removedQueryKey","removedQueryTag","syncTreeRemoveTags_","syncTreeApplyTaggedQueryOverwrite","queryKey","syncTreeQueryKeyForTag_","syncTreeParseQueryKey_","queryPath","syncTreeApplyTaggedOperation_","syncTreeAddEventRegistration","skipSetupListener","foundAncestorDefaultView","pathToSyncPoint","sp","childSyncPoint","viewAlreadyExists","queriesToStop","childQueries","queryToStop","syncTreeSetupListener_","syncTreeCalcCompleteEventCache","syncTreeApplyOperationHelper_","syncPointTree","syncTreeApplyOperationDescendantsHelper_","childOperation","childServerCache","childWritesCache","viewGetServerCache","syncTreeApplyTaggedListenComplete","syncTreeApplyListenComplete","errorForServerCode","splitIndex","ExistingValueProvider","DeferredValueProvider","syncTree_","path_","resolveDeferredLeafValue","existingVal","serverValues","resolveScalarDeferredValue","resolveComplexDeferredValue","unused","existingNode","resolveDeferredValueTree","resolveDeferredValue","resolveDeferredValueSnapshot","rawPri","leafNode","childrenNode","Tree","childCount","treeSubTree","pathObj","treeGetValue","treeSetValue","treeUpdateParents","treeHasChildren","treeForEachChild","treeForEachDescendant","includeSelf","childrenFirst","treeGetPath","childEmpty","treeIsEmpty","childExists","treeUpdateChild","INVALID_KEY_REGEX_","INVALID_PATH_REGEX_","MAX_LEAF_SIZE_","isValidKey","isValidPathString","isValidPriority","validateFirebaseDataArg","validateFirebaseData","hasDotValue","hasActualChild","validationPathPush","validationPathPop","validateFirebaseMergeDataArg","errorPrefix$1","mergePaths","curPath","prevPath","validateFirebaseMergePaths","validatePathString","argumentName","validateWritablePath","validateUrl","parsedUrl","isValidRootPathString","EventQueue","eventLists_","recursionDepth_","eventQueueQueueEvents","eventQueue","eventDataList","currList","getPath","eventQueueRaiseEventsAtPath","eventQueueRaiseQueuedEventsMatchingPredicate","eventPath","eventQueueRaiseEventsForChangedPath","changedPath","sentAll","eventList","eventListRaise","eventFn","getEventRunner","INTERRUPT_REASON","Repo","forceRestClient_","appCheckProvider_","dataUpdateCount","eventQueue_","nextWriteId_","interceptServerDataCallback_","transactionQueueTree_","persistentConnection_","repoStart","repo","authOverride","isMerge","repoOnDataUpdate","repoOnConnectStatus","connectStatus","repoUpdateInfo","repoOnServerInfoUpdate","statsReporter_","creatorFunction","statsManagerGetOrCreateReporter","infoData_","infoSyncTree_","infoEvents","serverSyncTree_","repoServerTime","repoGenerateServerValues","taggedChildren","raw","syncTreeApplyTaggedQueryMerge","taggedSnap","syncTreeApplyServerMerge","repoRerunTransactions","repoLog","resolvedOnDisconnectTree","repoAbortTransactions","repoRunOnDisconnectEvents","repoGetNextWriteId","repoSetWithPriority","newVal","newNodeUnresolved","clearEvents","repoCallOnCompleteCallback","repoRemoveEventCallbackForQuery","repoInterrupt","repoGetLatestState","excludeSets","repoSendReadyTransactions","repoPruneCompletedTransactionsBelowNode","repoBuildTransactionQueue","setsToIgnore","txn","currentWriteId","latestState","snapToSend","latestHash","retryCount","currentOutputSnapshotRaw","dataToSend","pathToSend","currentOutputSnapshotResolved","unwatcher","abortReason","repoSendTransactionQueue","rootMostTransactionNode","repoGetAncestorTransactionNode","txnsToRerun","abortTransaction","currentNode","currentInputSnapshot","newDataNode","oldWriteId","newNodeResolved","applyLocally","repoRerunTransactionQueue","transactionNode","transactionQueue","repoAggregateTransactionQueuesForNode","nodeQueue","treeForEachAncestor","repoAbortTransactionsOnNode","lastSent","parseRepoInfo","dataURL","parseDatabaseURL","scheme","subdomain","colonInd","slashInd","questionMarkInd","pathStringDecoded","piece","queryString","kv","decodeQuery","hostWithoutPort","dotInd","PUSH_CHARS","nextPushId","lastPushTime","lastRandChars","duplicateTime","timeStampChars","DataEvent","snapshot","getEventType","exportVal","CancelEvent","CallbackContext","snapshotCallback","cancelCallback","onValue","expDataSnapshot","previousChildName","onCancel","hasCancelCallback","userCallback","QueryImpl","_orderByCalled","ReferenceImpl","isEqual","sameRepo","samePath","sameQueryIdentifier","pathToUrlEncodedString","DataSnapshot","_node","_index","childRef","exists","hasChildren","_checkNotDeleted","_root","childrenToMerge","changedKey","changedValue","repoUpdate","ValueEventRegistration","callbackContext","ChildEventRegistration","eventToCheck","cancelCallbackOrListenOptions","onlyOnce","onceCallback","dataSnapshot","repoAddEventCallbackForQuery","syncPointSetReferenceConstructor","syncTreeSetReferenceConstructor","repos","useRestClient","repoManagerDatabaseFromApp","authProvider","dbUrl","databaseURL","isEmulator","dbEmulatorHost","authTokenProvider","appRepos","repoManagerCreateRepo","Database","_repoInternal","_instanceStarted","_rootInternal","repoManagerDeleteRepo","apiName","simpleListen","echo","onEcho","SDK_VERSION$1","_ref2","registerDatabase","isFinite","and","or","xor","Md5","bloom_blob_es2018","multiply","modulo","toNumber","getBits","fromNumber","fromString","Integer","commonjsGlobal","writable","once","addListener","removeListener","OPEN","STAT_EVENT","NO_ERROR","TIMEOUT","abort","getResponseHeader","TextDecoder","stream","getAllResponseHeaders","PerformanceNavigationTiming","getEntriesByType","nextHopProtocol","loadTimes","wasFetchedViaSpdy","decodeURI","encodeURI","onabort","responseType","ga","credentials","Request","arrayBuffer","ReadableStream","getReader","Uint8Array","setRequestHeader","append","mozResponseArrayBuffer","internalChannelParams","xmlHttpFactory","useFetchStreams","supportsCrossDomainXhr","concurrentRequestLimit","fastHandshake","encodeInitMessageHeaders","forceLongPolling","detectBufferingProxy","longPollingTimeout","sendBeacon","AbortController","signal","messageUrlParams","messageHeaders","clientProtocolHeaderRequired","initMessageHeaders","messageContentType","sendRawJson","httpSessionIdParam","__headers__","__status__","__sm__","FormData","withCredentials","connect","OSID","OAID","__data__","createWebChannel","createWebChannelTransport","webchannel_blob_es2018","getStatEventTarget","Event","Stat","PROXY","NOPROXY","HTTP_ERROR","ErrorCode","COMPLETE","EventType","CLOSE","MESSAGE","WebChannel","FetchXmlHttpFactory","listenOnce","getLastError","getLastErrorCode","getStatus","getResponseJson","getResponseText","setWithCredentials","XhrIo","User","isAuthenticated","toKey","UNAUTHENTICATED","GOOGLE_CREDENTIALS","FIRST_PARTY","MOCK_USER","__PRIVATE_getLogLevel","__PRIVATE_logDebug","__PRIVATE_argToString","__PRIVATE_logError","__PRIVATE_logWarn","fail","__PRIVATE_hardAssert","__PRIVATE_debugCast","OK","CANCELLED","UNKNOWN","INVALID_ARGUMENT","DEADLINE_EXCEEDED","NOT_FOUND","ALREADY_EXISTS","PERMISSION_DENIED","RESOURCE_EXHAUSTED","FAILED_PRECONDITION","ABORTED","OUT_OF_RANGE","UNIMPLEMENTED","UNAVAILABLE","DATA_LOSS","FirestoreError","__PRIVATE_Deferred","__PRIVATE_OAuthToken","__PRIVATE_EmptyAuthCredentialsProvider","invalidateToken","enqueueRetryable","shutdown","__PRIVATE_EmulatorAuthCredentialsProvider","changeListener","__PRIVATE_FirebaseAuthCredentialsProvider","__PRIVATE_guardedChangeListener","__PRIVATE_awaitNextToken","__PRIVATE_registerAuth","__PRIVATE_FirstPartyToken","__PRIVATE_FirstPartyAuthCredentialsProvider","AppCheckToken","__PRIVATE_FirebaseAppCheckTokenProvider","onTokenChanged","__PRIVATE_registerAppCheck","removeTokenListener","__PRIVATE_randomBytes","crypto","msCrypto","getRandomValues","__PRIVATE_AutoId","newId","__PRIVATE_primitiveComparator","__PRIVATE_arrayEquals","Timestamp","nanoseconds","fromMillis","fromDate","toDate","toMillis","_compareTo","padStart","SnapshotVersion","fromTimestamp","toMicroseconds","toTimestamp","BasePath","limit","popFirst","popLast","firstSegment","isPrefixOf","isImmediateParentOf","ResourcePath","canonicalString","toUriEncodedString","emptyPath","FieldPath$1","isValidIdentifier","isKeyField","keyField","fromServerFormat","__PRIVATE_addCurrentSegment","DocumentKey","fromName","collectionGroup","hasCollectionId","getCollectionGroup","getCollectionPath","isDocumentKey","fromSegments","FieldIndex","indexId","fields","indexState","UNKNOWN_ID","__PRIVATE_newIndexOffsetSuccessorFromReadTime","IndexOffset","__PRIVATE_newIndexOffsetFromDocument","readTime","documentKey","largestBatchId","__PRIVATE_indexOffsetComparator","PersistenceTransaction","onCommittedListeners","addOnCommittedListener","raiseOnCommittedEvent","__PRIVATE_ignoreIfPrimaryLeaseLoss","PersistencePromise","nextCallback","catchCallback","isDone","callbackAttached","wrapFailure","wrapSuccess","wrapUserFunction","waitFor","mapArray","doWhile","__PRIVATE_getAndroidVersion","__PRIVATE_isIndexedDbTransactionError","__PRIVATE_ListenSequence","previousValue","sequenceNumberHandler","writeSequenceNumber","__PRIVATE_isNullOrUndefined","__PRIVATE_isNegativeZero","isSafeInteger","isInteger","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","__PRIVATE_encodeResourcePath","__PRIVATE_encodeSeparator","__PRIVATE_encodeSegment","__PRIVATE_objectSize","EMPTY","isReverse","nodeStack","fixUp","removeMin","isRed","moveRedLeft","rotateRight","moveRedRight","rotateLeft","colorFlip","checkMaxDepth","check","SortedSet","forEachInRange","forEachWhile","firstAfterOrEqual","SortedSetIterator","unionWith","FieldMask","covers","__PRIVATE_Base64DecodeError","ByteString","binaryString","fromBase64String","fromUint8Array","toBase64","toUint8Array","approximateByteSize","EMPTY_BYTE_STRING","__PRIVATE_normalizeTimestamp","nanos","__PRIVATE_normalizeNumber","__PRIVATE_normalizeByteString","__PRIVATE_isServerTimestamp","mapValue","__type__","stringValue","__PRIVATE_getPreviousValue","__previous_value__","__PRIVATE_getLocalWriteTime","__local_write_time__","timestampValue","DatabaseInfo","databaseId","ssl","autoDetectLongPolling","longPollingOptions","DatabaseId","database","isDefaultDatabase","__PRIVATE_typeOrder","__PRIVATE_isMaxValue","__PRIVATE_isVectorValue","__PRIVATE_valueEquals","booleanValue","bytesValue","referenceValue","geoPointValue","latitude","longitude","integerValue","doubleValue","arrayValue","__PRIVATE_arrayValueContains","__PRIVATE_valueCompare","__PRIVATE_compareTimestamps","__PRIVATE_compareArrays","canonicalId","__PRIVATE_canonifyValue","__PRIVATE_estimateByteSize","__PRIVATE_refValue","__PRIVATE_isNullValue","__PRIVATE_isNanValue","__PRIVATE_isMapValue","__PRIVATE_deepClone","ObjectValue","getFieldsMap","setAll","applyChanges","__PRIVATE_extractFieldMask","MutableDocument","documentType","createTime","documentState","newInvalidDocument","newFoundDocument","newNoDocument","newUnknownDocument","convertToFoundDocument","convertToNoDocument","convertToUnknownDocument","setHasCommittedMutations","setHasLocalMutations","setReadTime","hasLocalMutations","hasCommittedMutations","hasPendingWrites","isValidDocument","isFoundDocument","isNoDocument","isUnknownDocument","mutableCopy","Bound","inclusive","__PRIVATE_boundCompareToDocument","dir","__PRIVATE_boundEquals","OrderBy","__PRIVATE_orderByEquals","Filter","FieldFilter","createKeyFieldInFilter","__PRIVATE_KeyFieldFilter","__PRIVATE_ArrayContainsFilter","__PRIVATE_InFilter","__PRIVATE_NotInFilter","__PRIVATE_ArrayContainsAnyFilter","__PRIVATE_KeyFieldInFilter","__PRIVATE_KeyFieldNotInFilter","matchesComparison","isInequality","getFlattenedFilters","getFilters","CompositeFilter","filters","__PRIVATE_compositeFilterIsConjunction","__PRIVATE_compositeFilterIsFlatConjunction","__PRIVATE_compositeFilterIsFlat","__PRIVATE_canonifyFilter","__PRIVATE_filterEquals","__PRIVATE_stringifyFilter","__PRIVATE_extractDocumentKeysFromArrayValue","nullValue","__PRIVATE_TargetImpl","startAt","endAt","__PRIVATE_newTarget","__PRIVATE_canonifyTarget","__PRIVATE_targetEquals","__PRIVATE_targetIsDocumentTarget","__PRIVATE_QueryImpl","explicitOrderBy","limitType","__PRIVATE_newQuery","__PRIVATE_newQueryForPath","__PRIVATE_queryMatchesAllDocuments","__PRIVATE_isCollectionGroupQuery","__PRIVATE_queryNormalizedOrderBy","__PRIVATE_queryToTarget","__PRIVATE__queryToTarget","__PRIVATE_queryWithAddedFilter","__PRIVATE_queryWithLimit","__PRIVATE_queryEquals","__PRIVATE_canonifyQuery","__PRIVATE_stringifyQuery","__PRIVATE_queryMatches","__PRIVATE_queryCollectionGroup","__PRIVATE_newQueryComparator","__PRIVATE_compareDocs","ObjectMap","mapKeyFn","equalsFn","innerSize","__PRIVATE_mutableDocumentMap","documentMap","__PRIVATE_convertOverlayedDocumentMapToDocumentMap","overlayedDocument","__PRIVATE_newOverlayMap","__PRIVATE_newDocumentKeyMap","__PRIVATE_newMutationMap","__PRIVATE_documentKeySet","__PRIVATE_targetIdSet","__PRIVATE_toDouble","useProto3Json","__PRIVATE_toInteger","TransformOperation","__PRIVATE_applyTransformOperationToLocalView","__PRIVATE_ServerTimestampTransform","__PRIVATE_ArrayUnionTransformOperation","__PRIVATE_applyArrayUnionTransformOperation","__PRIVATE_ArrayRemoveTransformOperation","__PRIVATE_applyArrayRemoveTransformOperation","__PRIVATE_computeTransformOperationBaseValue","asNumber","serializer","__PRIVATE_applyTransformOperationToRemoteDocument","__PRIVATE_NumericIncrementTransformOperation","elements","__PRIVATE_coercedFieldValuesArray","MutationResult","transformResults","Precondition","updateTime","none","isNone","__PRIVATE_preconditionIsValidForDocument","Mutation","__PRIVATE_calculateOverlayMutation","__PRIVATE_DeleteMutation","__PRIVATE_SetMutation","__PRIVATE_PatchMutation","__PRIVATE_mutationApplyToRemoteDocument","__PRIVATE_serverTransformResults","fieldTransforms","precondition","__PRIVATE_getPatch","__PRIVATE_mutationApplyToLocalView","__PRIVATE_localTransformResults","fieldMask","__PRIVATE_mutationExtractBaseValue","transform","__PRIVATE_mutationEquals","__PRIVATE_fieldTransformEquals","getFieldMask","__PRIVATE_VerifyMutation","MutationBatch","batchId","localWriteTime","baseMutations","mutations","applyToRemoteDocument","mutationResults","applyToLocalView","applyToLocalDocumentSet","mutatedFields","MutationBatchResult","batch","commitVersion","docVersions","Overlay","mutation","getKey","ExistenceFilter","unchangedNames","__PRIVATE_isPermanentError","__PRIVATE_mapCodeFromRpcCode","__PRIVATE_newTextEncoder","TextEncoder","__PRIVATE_getMd5HashValue","encode","__PRIVATE_get64BitUints","DataView","buffer","getUint32","BloomFilter","bitmap","hashCount","__PRIVATE_BloomFilterError","mightContain","RemoteEvent","snapshotVersion","targetChanges","targetMismatches","documentUpdates","resolvedLimboDocuments","createSynthesizedRemoteEventForCurrentChange","TargetChange","createSynthesizedTargetChangeForCurrentChange","resumeToken","addedDocuments","modifiedDocuments","removedDocuments","__PRIVATE_DocumentWatchChange","removedTargetIds","__PRIVATE_ExistenceFilterChange","targetId","__PRIVATE_WatchTargetChange","targetIds","cause","__PRIVATE_TargetState","__PRIVATE_snapshotChangesMap","__PRIVATE_WatchChangeAggregator","__PRIVATE_documentTargetMap","forEachTarget","Ge","removeTarget","localCacheCount","existenceFilterCount","bloomFilter","applied","bitmapLength","tt","nt","getRemoteKeysForTarget","rt","it","purpose","st","ot","asc","desc","in","JsonProtoSerializer","__PRIVATE_toInt32Proto","__PRIVATE_toBytes","__PRIVATE_toVersion","__PRIVATE_fromVersion","__PRIVATE_toResourceName","__PRIVATE_toResourcePath","__PRIVATE_fromResourceName","__PRIVATE_isValidResourceName","__PRIVATE_toName","__PRIVATE_extractLocalPathFromResourceName","__PRIVATE_toQueryPath","__PRIVATE_fromQueryPath","__PRIVATE_getEncodedDatabaseId","__PRIVATE_toMutationDocument","toMutation","updateMask","__PRIVATE_toDocumentMask","updateTransforms","fieldPath","setToServerValue","appendMissingElements","removeAllFromArray","increment","currentDocument","__PRIVATE_toDocumentsTarget","documents","__PRIVATE_toQueryTarget","structuredQuery","collectionId","allDescendants","__PRIVATE_toFilter","__PRIVATE_toFieldPathReference","__PRIVATE_toDirection","_t","__PRIVATE_convertQueryTargetToQuery","__PRIVATE_fromFilter","__PRIVATE_fromFieldPathReference","unaryFilter","NaN","fieldFilter","compositeFilter","__PRIVATE_toOperatorName","__PRIVATE_toCompositeOperatorName","fieldPaths","TargetData","sequenceNumber","lastLimboFreeSnapshotVersion","expectedCount","withSequenceNumber","withResumeToken","withExpectedCount","withLastLimboFreeSnapshotVersion","__PRIVATE_LocalSerializer","ct","__PRIVATE_fromBundledQuery","__PRIVATE_FirestoreIndexValueWriter","It","Tt","Et","dt","At","Rt","Vt","ft","gt","yt","wt","St","bt","Dt","vt","__PRIVATE_MemoryIndexManager","un","__PRIVATE_MemoryCollectionParentIndex","addToCollectionParentIndex","getCollectionParents","getEntries","addFieldIndex","deleteFieldIndex","deleteAllFieldIndexes","createTargetIndexes","getDocumentsMatchingTarget","getIndexType","getFieldIndexes","getNextCollectionGroupToUpdate","getMinOffset","getMinOffsetFromCollectionGroup","updateCollectionGroup","updateIndexEntries","didRun","sequenceNumbersCollected","targetsRemoved","documentsRemoved","LruParams","cacheSizeCollectionThreshold","percentileToCollect","maximumSequenceNumbersToCollect","withCacheSize","DEFAULT_COLLECTION_PERCENTILE","DEFAULT_MAX_SEQUENCE_NUMBERS_TO_COLLECT","DEFAULT","DISABLED","__PRIVATE_TargetIdGenerator","Ln","Bn","kn","__PRIVATE_bufferEntryComparator","__PRIVATE_RollingSequenceNumberBuffer","Un","Wn","Gn","zn","maxValue","__PRIVATE_LruScheduler","garbageCollector","asyncQueue","localStore","jn","Hn","started","enqueueAfterDelay","collectGarbage","__PRIVATE_LruGarbageCollectorImpl","Jn","calculateTargetCount","Yn","nthSequenceNumber","Zn","removeTargets","removeOrphanedDocuments","collect","getCacheSize","Xn","__PRIVATE_newLruGarbageCollector","RemoteDocumentChangeBuffer","changesApplied","addEntry","assertNotApplied","removeEntry","getEntry","getFromCache","getAllFromCache","OverlayedDocument","LocalDocumentsView","remoteDocumentCache","mutationQueue","documentOverlayCache","indexManager","getDocument","getOverlay","getDocuments","getLocalViewOfDocuments","populateOverlays","computeViews","getOverlayedDocuments","getOverlays","recalculateAndSaveOverlays","getAllMutationBatchesAffectingDocumentKeys","saveOverlays","recalculateAndSaveOverlaysForDocumentKeys","getDocumentsMatchingQuery","getDocumentsMatchingDocumentQuery","getDocumentsMatchingCollectionGroupQuery","getDocumentsMatchingCollectionQuery","getNextDocuments","getAllFromCollectionGroup","getOverlaysForCollectionGroup","getOverlaysForCollection","__PRIVATE_MemoryBundleCache","Pr","getBundleMetadata","saveBundleMetadata","getNamedQuery","saveNamedQuery","bundledQuery","__PRIVATE_MemoryDocumentOverlayCache","overlays","Ir","ht","removeOverlaysForBatchId","__PRIVATE_MemoryGlobalsCache","sessionToken","getSessionToken","setSessionToken","__PRIVATE_ReferenceSet","Tr","__PRIVATE_DocReference","Er","dr","Ar","addReference","Rr","removeReference","Vr","mr","gr","pr","yr","containsKey","wr","__PRIVATE_MemoryMutationQueue","referenceDelegate","Sr","checkEmpty","addMutationBatch","lookupMutationBatch","Dr","getNextMutationBatchAfterBatchId","vr","getHighestUnacknowledgedBatchId","getAllMutationBatches","getAllMutationBatchesAffectingDocumentKey","Cr","getAllMutationBatchesAffectingQuery","removeMutationBatch","Fr","markPotentiallyOrphaned","On","performConsistencyCheck","__PRIVATE_MemoryRemoteDocumentCacheImpl","Mr","docs","setIndexManager","Or","newChangeBuffer","__PRIVATE_MemoryRemoteDocumentChangeBuffer","getSize","cr","__PRIVATE_MemoryTargetCache","Nr","lastRemoteSnapshotVersion","highestTargetId","Lr","Br","targetCount","kr","getLastRemoteSnapshotVersion","getHighestSequenceNumber","allocateTargetId","setTargetsMetadata","Kn","addTargetData","updateTargetData","removeTargetData","removeMatchingKeysForTargetId","getTargetCount","getTargetData","addMatchingKeys","removeMatchingKeys","getMatchingKeysForTargetId","__PRIVATE_MemoryPersistence","qr","Qr","Kr","$r","Ur","Wr","Gr","setDatabaseDeletedListener","setNetworkEnabled","getIndexManager","getDocumentOverlayCache","getMutationQueue","getGlobalsCache","getTargetCache","getRemoteDocumentCache","getBundleCache","runTransaction","__PRIVATE_MemoryTransaction","zr","jr","Hr","currentSequenceNumber","__PRIVATE_MemoryEagerDelegate","Jr","Yr","Zr","Xr","updateLimboDocument","__PRIVATE_MemoryLruDelegate","er","__PRIVATE_LocalViewChanges","fromCache","docChanges","QueryContext","_documentReadCount","documentReadCount","incrementDocumentReadCount","__PRIVATE_QueryEngine","es","rs","__PRIVATE_LocalStoreImpl","ss","os","_s","us","cs","ls","localDocuments","__PRIVATE_newLocalStore","__PRIVATE_localStoreHandleUserChange","hs","removedBatchIds","addedBatchIds","__PRIVATE_localStoreGetLastRemoteSnapshotVersion","__PRIVATE_populateDocumentChangeBuffer","Ps","Is","__PRIVATE_localStoreGetNextMutationBatch","__PRIVATE_localStoreAllocateTarget","__PRIVATE_localStoreReleaseTarget","__PRIVATE_localStoreExecuteQuery","__PRIVATE_setMaxReadTime","Ts","__PRIVATE_LocalClientState","activeTargetIds","fs","gs","Vs","updateTimeMs","__PRIVATE_MemorySharedClientState","so","oo","onlineStateHandler","addPendingMutation","updateMutationState","addLocalQueryTarget","updateQueryState","removeLocalQueryTarget","isLocalQueryTarget","clearQueryState","getAllActiveQueryTargets","isActiveQueryTarget","handleUserChange","setOnlineState","notifyBundleLoaded","__PRIVATE_NoopConnectivityMonitor","_o","__PRIVATE_BrowserConnectivityMonitor","ao","uo","co","lo","ho","Po","__PRIVATE_generateUniqueDebugId","BatchGetDocuments","Commit","RunQuery","RunAggregationQuery","__PRIVATE_StreamBridge","Io","To","Eo","Ao","Ro","Vo","mo","fo","po","yo","wo","So","bo","__PRIVATE_WebChannelConnection","databaseInfo","Do","vo","Co","Fo","Mo","xo","Oo","No","Lo","terminate","Bo","forwardChannelRequestTimeoutMs","timeoutSeconds","__PRIVATE_closeFn","__PRIVATE_unguardedEventListen","__PRIVATE_newSerializer","__PRIVATE_ExponentialBackoff","ko","qo","Qo","Ko","$o","Uo","Wo","Go","zo","jo","skipDelay","__PRIVATE_PersistentStream","Ho","Jo","authCredentialsProvider","appCheckCredentialsProvider","Yo","Zo","Xo","e_","t_","n_","r_","i_","s_","o_","__","a_","u_","c_","l_","h_","_ref9","P_","I_","T_","E_","onNext","enqueueAndForget","__PRIVATE_PersistentListenStream","targetChange","targetChangeType","Buffer","documentChange","documentDelete","documentRemove","__PRIVATE_fromWatchChange","d_","A_","addTarget","__PRIVATE_toListenRequestLabels","labels","R_","__PRIVATE_PersistentWriteStream","V_","lastStreamToken","m_","streamToken","writeResults","f_","__PRIVATE_fromWriteResults","commitTime","g_","p_","__PRIVATE_DatastoreImpl","authCredentials","appCheckCredentials","y_","w_","_ref10","_ref11","__PRIVATE_OnlineStateTracker","S_","b_","D_","v_","C_","F_","M_","x_","__PRIVATE_RemoteStoreImpl","datastore","remoteSyncer","O_","N_","L_","B_","k_","__PRIVATE_canUseNetwork","__PRIVATE_disableNetworkInternal","q_","__PRIVATE_enableNetworkInternal","__PRIVATE_remoteStoreListen","__PRIVATE_shouldStartWatchStream","__PRIVATE_startWatchStream","__PRIVATE_ensureWatchStream","__PRIVATE_sendWatchRequest","__PRIVATE_remoteStoreUnlisten","__PRIVATE_sendUnwatchRequest","Q_","__PRIVATE_getDatabaseId","__PRIVATE_cleanUpWatchStreamState","__PRIVATE_onWatchStreamConnected","__PRIVATE_onWatchStreamOpen","__PRIVATE_onWatchStreamClose","__PRIVATE_onWatchStreamChange","rejectListen","__PRIVATE_disableNetworkUntilRecovery","applyRemoteEvent","__PRIVATE_executeWithRecovery","__PRIVATE_fillWritePipeline","__PRIVATE_ensureWriteStream","__PRIVATE_canAddToWritePipeline","__PRIVATE_addToWritePipeline","__PRIVATE_shouldStartWriteStream","__PRIVATE_startWriteStream","__PRIVATE_onWriteStreamOpen","__PRIVATE_onWriteHandshakeComplete","__PRIVATE_onMutationResult","applySuccessfulWrite","__PRIVATE_onWriteStreamClose","rejectFailedWrite","__PRIVATE_remoteStoreHandleCredentialChange","verifyOperationInProgress","handleCredentialChange","__PRIVATE_remoteStoreApplyPrimaryState","K_","U_","__PRIVATE_onConnected","DelayedOperation","targetTimeMs","removalCallback","createAndSchedule","timerHandle","handleDelayElapsed","__PRIVATE_wrapInUserErrorIfRecoverable","DocumentSet","keyedMap","sortedSet","emptySet","__PRIVATE_DocumentChangeSet","G_","ViewSnapshot","oldDocs","mutatedKeys","syncStateChanged","excludesMetadataChanges","hasCachedResults","fromInitialDocuments","__PRIVATE_QueryListenersInfo","z_","j_","H_","J_","__PRIVATE_EventManagerImpl","__PRIVATE_newQueriesObjectMap","onlineState","Y_","__PRIVATE_eventManagerListen","onListen","onFirstRemoteStoreListen","Z_","X_","__PRIVATE_raiseSnapshotsInSyncEvent","__PRIVATE_eventManagerUnlisten","onUnlisten","onLastRemoteStoreUnlisten","__PRIVATE_eventManagerOnWatchChange","__PRIVATE_eventManagerOnWatchError","Cache","__PRIVATE_QueryListener","includeMetadataChanges","__PRIVATE_AddedLimboDocument","__PRIVATE_RemovedLimboDocument","__PRIVATE_View","__PRIVATE_QueryView","LimboResolution","__PRIVATE_SyncEngineImpl","remoteStore","sharedClientState","maxConcurrentLimboResolutions","isPrimaryClient","__PRIVATE_syncEngineListen","__PRIVATE_ensureWatchCallbacks","__PRIVATE_allocateTargetAndMaybeListen","__PRIVATE_triggerRemoteStoreListen","__PRIVATE_initializeViewAndComputeSnapshot","__PRIVATE_updateTrackedLimbos","__PRIVATE_syncEngineUnlisten","__PRIVATE_removeAndCleanupTarget","__PRIVATE_triggerRemoteStoreUnlisten","__PRIVATE_syncEngineApplyRemoteEvent","trackRemovals","__PRIVATE_localStoreApplyRemoteEventToLocalCache","__PRIVATE_syncEngineEmitNewSnapsAndNotifyLocalStore","__PRIVATE_syncEngineApplyOnlineStateChange","__PRIVATE_syncEngineRejectListen","__PRIVATE_pumpEnqueuedLimboResolutions","__PRIVATE_syncEngineApplySuccessfulWrite","__PRIVATE_localStoreAcknowledgeBatch","__PRIVATE_processUserCallback","__PRIVATE_triggerPendingWritesCallbacks","__PRIVATE_syncEngineRejectFailedWrite","__PRIVATE_removeLimboTarget","__PRIVATE_trackLimboChange","__PRIVATE_syncEngineHandleCredentialChange","__PRIVATE_syncEngineGetRemoteKeysForTarget","__PRIVATE_syncEngineEnsureWriteCallbacks","__PRIVATE_MemoryOfflineComponentProvider","kind","synchronizeTabs","gcScheduler","indexBackfillerScheduler","initialUser","build","__PRIVATE_LruGcMemoryOfflineComponentProvider","cacheSizeBytes","OnlineComponentProvider","createDatastore","createRemoteStore","createEventManager","syncEngine","createSyncEngine","__PRIVATE_AsyncObserver","muted","Transaction$2","readVersions","committed","lastTransactionError","writtenDocs","lookup","ensureCommitNotCalled","found","missing","__PRIVATE_fromBatchGetDocumentsResponse","recordVersion","preconditionForUpdate","commit","__PRIVATE_TransactionRunner","updateFunction","_u","maxAttempts","au","uu","cu","lu","hu","FirestoreClient","clientId","authCredentialListener","appCheckCredentialListener","_uninitializedComponentsProvider","configuration","setCredentialChangeListener","setAppCheckTokenChangeListener","enterRestrictedMode","enqueueAndForgetEvenWhileRestricted","_onlineComponents","_offlineComponents","__PRIVATE_setOfflineComponentProvider","__PRIVATE_setOnlineComponentProvider","__PRIVATE_ensureOfflineComponents","_offline","__PRIVATE_ensureOnlineComponents","_online","__PRIVATE_getSyncEngine","__PRIVATE_getDatastore","__PRIVATE_getEventManager","__PRIVATE_firestoreClientGetDocumentViaSnapshotListener","__PRIVATE_firestoreClientGetDocumentsViaSnapshotListener","__PRIVATE_cloneLongPollingOptions","__PRIVATE_validateNonEmptyArgument","__PRIVATE_validateDocumentPath","__PRIVATE_validateCollectionPath","__PRIVATE_valueDescription","__PRIVATE_cast","FirestoreSettingsImpl","ignoreUndefinedProperties","__PRIVATE_validateIsNotUsedTogether","experimentalForceLongPolling","experimentalAutoDetectLongPolling","experimentalLongPollingOptions","Firestore$1","_authCredentials","_appCheckCredentials","_databaseId","_app","_persistenceKey","_settings","_settingsFrozen","_terminateTask","_initialized","_terminated","_setSettings","sessionIndex","iamToken","authTokenFactory","client","_getSettings","_freezeSettings","_terminate","_restart","converter","_query","firestore","withConverter","DocumentReference","CollectionReference","_len7","_len8","_key8","__PRIVATE_AsyncQueueImpl","Pu","Iu","Tu","Eu","du","Au","Ru","Vu","visibilityState","mu","isShuttingDown","enqueue","fu","gu","pu","yu","wu","Su","bu","Du","Firestore","_queue","_firestoreClient","ensureFirestoreConfigured","__PRIVATE_configureFirestore","_componentsProvider","_offlineComponentProvider","_onlineComponentProvider","Bytes","_byteString","FieldPath","_len9","_key9","_internalPath","FieldValue","_methodName","GeoPoint","_lat","_long","VectorValue","_values","ParsedSetData","ParsedUpdateData","__PRIVATE_isWrite","__PRIVATE_ParseContextImpl","vu","Cu","Fu","Mu","xu","Ou","Nu","Lu","Bu","__PRIVATE_createError","methodName","ku","qu","__PRIVATE_UserDataReader","Qu","__PRIVATE_newUserDataReader","__PRIVATE_parseSetData","mergeFields","__PRIVATE_validatePlainObject","__PRIVATE_parseObject","__PRIVATE_fieldPathFromArgument$1","__PRIVATE_fieldMaskContains","__PRIVATE_DeleteFieldValueImpl","_toFieldTransform","__PRIVATE_parseUpdateData","__PRIVATE_fieldPathFromDotSeparatedString","__PRIVATE_parseData","__PRIVATE_parseUpdateVarargs","__PRIVATE_parseQueryValue","__PRIVATE_looksLikeJsonObject","DocumentSnapshot$1","_firestore","_userDataWriter","_document","_converter","QueryDocumentSnapshot$1","fromFirestore","convertValue","__PRIVATE_fieldPathFromArgument","__PRIVATE_validateHasExplicitOrderByForLimitToLast","AppliableConstraint","QueryConstraint","_len10","_key10","QueryCompositeFilterConstraint","QueryFieldFilterConstraint","_apply","_field","_op","_value","_create","_parse","__PRIVATE_validateNewFieldFilter","__PRIVATE_validateDisjunctiveFilterElements","__PRIVATE_parseDocumentIdValue","_queryConstraints","_getOperator","_getQueryConstraints","QueryOrderByConstraint","_direction","AbstractUserDataWriter","convertTimestamp","convertServerTimestamp","convertBytes","convertReference","convertGeoPoint","convertArray","convertObject","convertVectorValue","convertObjectMap","convertDocumentKey","__PRIVATE_applyFirestoreDataConverter","toFirestore","__PRIVATE_LiteUserDataWriter","SnapshotMetadata","DocumentSnapshot","_firestoreImpl","QueryDocumentSnapshot","serverTimestamps","QuerySnapshot","_snapshot","_cachedChanges","_cachedChangesIncludeMetadataChanges","oldIndex","__PRIVATE_resultChangeType","getDoc","__PRIVATE_convertToDocSnapshot","__PRIVATE_ExpUserDataWriter","getDocs","setDoc","executeWrite","updateDoc","_len17","_key17","deleteDoc","addDoc","__PRIVATE_syncEngineWrite","__PRIVATE_validateReference","Transaction","_transaction","_dataReader","_len20","_key20","DEFAULT_HOST","CONFIG_STORAGE_BUCKET_KEY","StorageError","status_","prependCode","_baseMessage","_codeEquals","StorageErrorCode","unknown","retryLimitExceeded","RETRY_LIMIT_EXCEEDED","CANCELED","cannotSliceBlob","CANNOT_SLICE_BLOB","invalidArgument","appDeleted","APP_DELETED","invalidFormat","format","INVALID_FORMAT","internalError","INTERNAL_ERROR","Location","isRoot","fullServerUrl","bucketOnlyServerUrl","makeFromBucketSpec","bucketString","bucketLocation","makeFromUrl","INVALID_DEFAULT_BUCKET","bucketDomain","gsRegex","httpModify","loc","firebaseStorageHost","groups","regex","indices","postModify","captures","bucketValue","pathValue","INVALID_URL","invalidUrl","FailRequest","promise_","getPromise","isNativeBlob","isNativeBlobDefined","Blob","validateNumber","argument","minValue","makeUrl","urlPart","makeQueryString","queryPart","isRetryStatusCode","additionalRetryCodes","isFiveHundredCode","isExtraRetryCode","isAdditionalRetryCode","NetworkRequest","url_","method_","headers_","body_","successCodes_","additionalRetryCodes_","callback_","errorCallback_","timeout_","progressCallback_","connectionFactory_","retry","pendingConnection_","backoffId_","canceled_","appDelete_","resolve_","reject_","doTheRequest","backoffCallback","RequestEndStatus","progressListener","progressEvent","loaded","lengthComputable","addUploadProgressListener","removeUploadProgressListener","hitServer","getErrorCode","wasCanceled","ABORT","successCode","backoffDone","requestWentThrough","wasSuccessCode","getResponse","isJustDef","getErrorText","doRequest","backoffCompleteCb","waitSeconds","retryTimeoutId","globalTimeoutId","hitTimeout","cancelState","triggeredCallback","triggerCallback","callWithDelay","millis","responseHandler","clearGlobalTimeout","waitMillis","stopped","wasTimeout","appDelete","getBlobBuilder","BlobBuilder","WebKitBlobBuilder","getBlob$1","getBlob","UNSUPPORTED_ENVIRONMENT","decodeBase64","encoded","polyFill","StringFormat","StringData","contentType","dataFromString","stringData","utf8Bytes_","base64Bytes_","dataUrl","DataURLParts","percentEncodedBytes_","dataURLBytes_","hasMinus","hasUnder","hasPlus","hasSlash","FbsBlob","elideCopy","blobType","data_","ArrayBuffer","byteLength","size_","type_","startByte","endByte","sliced","webkitSlice","mozSlice","sliceBlob","blobby","uint8Arrays","finalLength","merged","uploadData","jsonObjectOrNull","isNonArrayObject","lastComponent","noXform_","Mapping","server","local","xform","mappings_","getMappings","mappings","nameMapping","_metadata","fullPath","xformPath","sizeMapping","fromResource","resource","mapping","_makeStorageReference","addRef","fromResourceString","resourceString","toResourceString","RequestInfo","errorHandler","progressCallback","successCodes","handlerCheck","cndn","metadataHandler","downloadUrlHandler","tokens","alt","downloadUrlFromResourceString","_protocol","sharedErrorHandler","newErr","UNAUTHORIZED_APP","QUOTA_EXCEEDED","UNAUTHORIZED","objectErrorHandler","OBJECT_NOT_FOUND","metadataForUpload_","metadataClone","determineContentType_","multipartUpload","boundary","genBoundary","metadata_","preBlobPart","postBlobPart","maxUploadRetryTime","requestInfo","XhrConnection","sent_","xhr_","initXhr","errorCode_","sendPromise_","NETWORK_ERROR","upload","XhrTextConnection","newTextConnection","Reference","_service","_location","_newRef","newPath","_throwIfRoot","INVALID_ROOT_OPERATION","invalidRootOperation","uploadBytes$1","makeRequestWithTokens","finalMetadata","getDownloadURL$1","maxOperationRetryTime","getDownloadUrl","NO_DOWNLOAD_URL","deleteObject$1","_xhr","_text","deleteObject$2","_getChild$1","canonicalChildPath","refFromPath","FirebaseStorageImpl","_bucket","NO_DEFAULT_BUCKET","reference","ref$1","serviceOrRef","pathOrUrl","extractBucket","_authProvider","_appCheckProvider","_url","_firebaseVersion","_appId","_maxOperationRetryTime","_maxUploadRetryTime","_requests","_getAuthToken","_overrideAuthToken","tokenData","_makeRequest","requestFactory","firebaseVersion","addGmpidHeader_","addAuthHeader_","addVersionHeader_","addAppCheckHeader_","makeRequest","STORAGE_TYPE","uploadBytes","getDownloadURL","deleteObject","storageBucket","messagingSenderId","initializeAuth","authTokenSyncPath","isSecureContext","authTokenSyncUrl","mintCookie","idTokenResult","idTokenAge","authEmulatorHost","getAuth","mockUserToken","connectFirestoreEmulator","getFirestore","bucketUrl","storageInstance","connectStorageEmulator$1","connectStorageEmulator","getStorage","tokenProvider","repoManagerApplyEmulatorSettings","connectDatabaseEmulator","getDatabase","setEmail","setPassword","_jsxs","className","autoPlay","_jsx","onSubmit","alert","placeholder","onChange","isOn","setIsOn","handleLogout","_Fragment","class","bigdoc","master","cursor","bigpa","school","datacenter","ScrollToTop","scrollTo","setName","team","setTeam","phone","setPhone","signUpResponse","createUserWithEmailAndPassword","userObj","gameCanvasRef","renderInstanceRef","userId","inputRef","players","setPlayers","userName","setUserName","chatMessage","setChatMessage","chatHistory","setChatHistory","chatContainerRef","bubbleMessagesRef","userDoc","fetchUserName","handleBeforeUnload","sendMessage","newMessageRef","thenablePushRef","pushRef","seenAsBubble","handleSendMessage","blur","handleGlobalKeyPress","chats","messages","scrollHeight","ground","platform1","platform2","platform3","leftwall","rightwall","sensorPlatform","sensorPlatform1","localPlayer","otherPlayers","drawSpeechBubble","textWidth","measureText","playersData","newPlayers","playerData","facingLeft","facingTop","moving","currentFrame","standFrame","walkFramesUp","walkFramesDown","walkFramesLeft","walkFramesRight","standFramesUp","standFramesDown","standFramesLeft","standFramesRight","updatePlayerState","moveRight","moveLeft","isJumping","moveUp","moveDown","onSensorPlatform","onSensorPlatform1","canvasX","canvasY","nameTextWidth","toScreenPosition","worldX","worldY","localScreenPos","velocityX","velocityY","otherPlayer","targetX","targetY","lerp","newX","newY","boxSizing","borderTop","overflowY","marginBottom","chat","onKeyPress","marginLeft","title","setTitle","deadline","setDeadline","questions","setQuestions","ABILITY","HELPING","FUNFUN","SHARING","KINDNESS","PASSION","EFFORT","EXTRA","note","setNote","answer","isLoading","setIsLoading","handleInputChange","handleNoteTitleChange","formattedQuestions","question","responses","vote_title","resultType","created_at","submittedUsers","_selectedVote$submitt","votes","setVotes","selectedVote","setSelectedVote","modalOpen","setModalOpen","allUsers","setAllUsers","voteList","fetchVotes","role","fetchUsers","totalUsers","submittedUsersCount","notSubmittedUsersCount","borderCollapse","vote","stateInfo","handleCheckClick","currentValue","voteDoc","prevVotes","toggleResultType","marginTop","justifyContent","alignItems","borderRadius","closeModal","fontSize","_selectedVote$submitt2","_selectedVote$submitt3","setUsers","setTotalUsers","isModalOpen","setIsModalOpen","selectedUser","setSelectedUser","formData","setFormData","newPassword","userList","handleCloseModal","prevData","handleOpenModal","prevUsers","prevCount","handleDelete","readOnly","errorData","XLSX","current_codepage","current_ansi","VALID_ANSI","CS2CP","set_ansi","cp","set_cp","reset_cp","utf16beread","$cptable","_getchar","_getansi","Base64_map","Base64_encode","e1","e2","e3","e4","Base64_decode","has_buf","versions","Buffer_from","nbfs","enc","new_raw_buf","alloc","new_unsafe_buf","allocUnsafe","s2a","s2ab","a2s","bconcat","bufs","isBuffer","maxlen","chr0","chr1","_strrev","pad0","rpad_","p2_32","pad0r","pad0r1","pad0r2","SSF_isgeneral","days","months","table_fmt","SSF_default_map","SSF_default_str","SSF_frac","mixed","sgn","P_2","P_1","Q_2","Q_1","SSF_parse_date_code","b2","dow","dout","date1904","setDate","getDate","getFullYear","getMonth","getDay","SSF_fix_hijri","SSFbasedate","SSFdnthresh","SSFbase1904","datenum_local","epoch","getTimezoneOffset","SSF_strip_decimal","SSF_general_num","LOG10E","toPrecision","toExponential","SSF_small_exp","SSF_large_exp","SSF_normalize_exp","SSF_general","SSF_format","SSF_write_date","fmt","ss0","outl","commaify","pct1","write_num_exp","period","fakee","$$","$1","$2","$3","frac1","dec1","closeparen","hashq","rnd","dec","_frac","write_num_flt","ffmt","write_num","write_num_cm","sfmt","mul","write_num_pct","aval","den","rr","myn","myd","write_num_f1","carry","lres","rres","flr","write_num_exp2","write_num_int","write_num_cm2","write_num_pct2","write_num_f2","SSF_abstime","fmt_is_date","cfregex2","chkcond","thresh","choose_fmt","in_str","SSF_split_fmt","lat","m1","m2","dateNF","flen","lst","ssm","nstr","myv","ostr","vv","decpt","lasti","retval","eval_fmt","SSF_load","SSF_load_table","tbl","make_ssf","dateNFregex","CRC32","T0","Int32Array","signed_crc_table","TT","subarray","slice_by_16_tables","T1","T2","T3","T4","T5","T6","T7","T8","T9","bstr","seed","CFB","dirname","filename","write_dos_date","hms","getHours","getMinutes","getSeconds","write_shift","ymd","parse_extra_field","prep_blob","read_shift","sz","tgt","mtime","atime","ctime","mt","get_fs","file","parse_zip","mboundary","FileIndex","FullPaths","init_cfb","start_di","fcnt","line","parse_mime","parse_mad","mver","nmfs","difat_sec_cnt","dir_start","minifat_start","difat_start","ssz","fat_addrs","mv","chk","HEADER_SIGNATURE","check_get_mver","check_shifts","dir_cnt","sectors","nsectors","sectorify","sleuth_fat","sector_list","chkd","buf_chain","modulus","seen","addr","__readInt32LE","__toBuffer","make_sector_list","ENDOFCHAIN","Paths","files","mini","minifat_store","sector","namelen","__utf16le","clsid","read_date","get_sector_list","content","get_mfat_entry","read_directory","FI","FP","dad","build_full_paths","entry","MSSZ","new_buf","cnt","__readUInt32LE","cfb","CLSID","nm","rebuild_cfb","seed_cfb","_file","fullPaths","HEADER_CLSID","namecmp","elt","_write","_opts","fileType","fp","cstr","dispcnt","csl","qp","get_content_type","write_quoted_printable","write_base64_76","write_mad","cdirs","compression","start_cd","crcs","sz_cd","namebuf","outbuf","_deflateRawSync","write_zip","mini_size","fat_size","mfat_cnt","fat_base","fat_cnt","difat_cnt","HEADER_SIG","chainit","consts","DIFSECT","FATSECT","_nm","_zlib","MAXREGSECT","FREESECT","HEADER_MINOR_VERSION","MAXREGSID","NOSTREAM","EntryTypes","deflateRawSync","_deflate","CLEN_ORDER","LEN_LN","DST_LN","bit_swap_8","use_typed_arrays","bitswap8","bit_swap_n","rev","read_bits_2","read_bits_3","read_bits_5","read_bits_7","read_bits_n","write_bits_3","write_bits_1","write_bits_8","write_bits_16","realloc","zero_fill_array","build_tree","clens","cmap","ccode","bl_count","Uint16Array","ctree","cleni","fix_lmap","fix_dmap","dlens","_deflateRaw","DST_LN_RE","LEN_LN_RE","boff","write_stored","addrs","mlen","len_eb","dst_eb","write_huff_fixed","dyn_lmap","dyn_dmap","dyn_cmap","dyn_len_1","dyn_len_2","dyn","_HLIT","_HDIST","_HCLEN","read_bits_4","next_code","hcodes","h1","h2","_inflate","usz","woff","OL","max_len_1","max_len_2","dst","inflate","warn_or_throw","wrn","csz","efsz","fcsz","EF","parse_local_file","meth","setMilliseconds","setFullYear","setMonth","setHours","setMinutes","setSeconds","parse_dos_date","_csz","_usz","InflRaw","InflateRaw","_processChunk","_finishFlushFlag","bytesRead","_inflateRawSync","cfb_add","unsafe","ContentTypeMap","ctype","ext","tmp","fdata","fname","cte","parse_quoted_printable","fpath","utils","cfb_gc","UCFullPaths","UCPaths","UCPath","readFileSync","read_file","writeFileSync","writeFile","cfb_new","cfb_del","cfb_mov","old_name","new_name","ReadShift","CheckField","use_zlib","zlib","_inflateRaw","_fs","blobify","a2u","write_dl","utf8write","IE_SaveFile","msSaveBlob","saveAs","createObjectURL","downloads","download","revokeObjectURL","$","File","Folder","encoding","ks","o2","evert_key","evert","evert_num","basedate","datenum","refdate","dnthresh","refoffset","numdate","setTime","good_pd_date_1","good_pd_date","good_pd","parseDate","fixdate","cc2str","arr","debomit","dup","fuzzynum","lower_months","fuzzydate","getYear","zip_add_file","zip","widx","ridx","utf8decode","zip_new","XML_HEADER","encodings","rencoding","decregex","charegex","escapexml","escapexmltag","htmlcharegex","escapehtml","parsexmlbool","utf8reada","orig","utf8readb","ww","utf8readc","utf8corpus","utf8read","htmldecode","entities","wtregex","writetag","wxt_helper","writextag","write_w3cdtf","XMLNS","XMLNS_main","XLMLNS","___toBuffer","___utf16le","__readUInt16LE","___hexlify","__hexlify","___utf8","__readUInt8","__utf8","___lpstr","__lpstr","___cpstr","__cpstr","___lpwstr","__lpwstr","___lpp4","__lpp4","___8lpp4","__8lpp4","___double","read_double_le","__double","is_buf","cpdoit","readUInt32LE","readDoubleLE","__readInt16LE","__readInt32BE","oI","oR","lens","__writeUInt32LE","__writeInt32LE","__writeUInt16LE","WriteShift","cppayload","bs","av","write_double_le","hexstr","fld","parsenoop","buf_array","blksz","newblk","curbuf","endbuf","_bufs","write_record","XLSBRecordEnum","shift_cell_xls","cell","cRel","rRel","biff","shift_range_xls","encode_cell_xls","encode_cell","fix_row","encode_range_xls","encode_row","encode_col","decode_row","rowstr","decode_col","colstr","decode_cell","decode_range","encode_range","safe_decode_range","safe_format_cell","XF","numFmtId","format_cell","BErr","sheet_to_workbook","sheet","sheets","SheetNames","Sheets","sheet_add_aoa","_ws","dense","ws","_R","_C","_range","__R","__C","nullError","sheetStubs","cellDates","cell_ref","aoa_to_sheet","write_UInt32LE","parse_XLWideString","cchCharacters","write_XLWideString","_null","parse_StrRun","ich","ifnt","parse_RichStr","rgsStrRun","dwSizeStrRun","parse_BrtCommentText","write_BrtCommentText","write_StrRun","parse_XLSBCell","iStyleRef","write_XLSBCell","parse_XLSBShortCell","write_XLSBShortCell","parse_XLSBCodeName","write_XLSBCodeName","parse_XLNullableWideString","write_XLNullableWideString","parse_XLNameWideString","parse_RelID","write_RelID","parse_RkNumber","fX100","fInt","RK","write_RkNumber","d100","parse_RfX","parse_UncheckedRfX","write_UncheckedRfX","parse_Xnum","write_Xnum","write_BrtColor","auto","theme","nTS","tint","rgb","VT_STRING","DocSummaryPIDDSI","SummaryPIDSI","rgbify","XLSIcv","ct2type","CT_LIST","workbooks","xlsx","xlsm","xlsb","xlam","xltx","strs","comments","charts","dialogs","macros","styles","write_ct","type2ct","evert_arr","f1","bookType","f2","f3","RELS","WB","SHEET","HLINK","VML","XPATH","XMISS","XLINK","CXML","CXMLP","CMNT","CORE_PROPS","EXT_PROPS","CUST_PROPS","SST","STY","THEME","CHART","CHARTEX","CS","WS","DS","MS","IMG","DRAW","XLMETA","TCMNT","PEOPLE","VBA","get_rels_path","write_rels","rels","rid","add_rels","rId","relobj","targetmode","Type","Target","TargetMode","write_rdf_type","write_meta_ods","cp_doit","write_core_props","Props","CreatedDate","WTF","ModifiedDate","PseudoPropsPairs","write_ext_props","Application","Worksheets","baseType","write_cust_props","pid","write_vt","XLMLDocPropsMap","Title","Subject","Author","Keywords","Comments","LastAuthor","RevNumber","LastPrinted","Category","Manager","Company","AppVersion","ContentStatus","Identifier","Language","write_TypedPropertyValue","write_FILETIME","XLSPSSkip","guess_property_type","write_PropertySet","RE","PIDSI","hdr","piao","pio","pinfo","write_PropertySetStream","entries2","clsid2","ps0","ps1","parsebool","writebool","parseuint16","writeuint16","write_Bes","parse_ShortXLUnicodeString","cch","write_XLUnicodeRichExtendedString","xlstr","otext","parse_XLUnicodeStringNoCch","parse_XLUnicodeString","parse_XLUnicodeString2","write_XLUnicodeString","write_HyperlinkString","write_Hyperlink","hashidx","Pretarget","write_XLSCell","ixfe","parse_XTI","parse_Ref8U","rwFirst","rwLast","write_Ref8U","write_BOF","write_BoundSheet8","write_Format","b5","write_XF","ixfeP","parse_ExternSheet","parse_BIFF5ExternSheet","write_HLink","write_HLinkTooltip","Tooltip","parse_ColInfo","cellStyles","colFirst","colLast","coldx","level","DBF","dbf_codepage_map","dbf_reverse_map","dbf_to_sheet","vfp","l7","nrow","fpos","rlen","current_cp","codepage","hend","sheetRows","dbf_to_aoa","wch","_RLEN","to_workbook","to_sheet","from_sheet","aoa","sheet_to_json","cols","hcnt","coltypes","colwidths","coldecimals","guess","_guess","rout","_n","SYLK","sylk_escapes","AA","BA","CA","DA","HA","JA","AE","BE","CE","HE","AI","BI","CI","HI","AO","BO","CO","DO","HO","AU","BU","CU","HU","Hu","KC","DN","Dn","Hy","sylk_char_regex","sylk_char_fn","decode_sylk_char","newcc","sylk_to_aoa_str","records","formats","next_cell_format","sht","rowinfo","colinfo","cw","Mval","rstr","RT","C_seen_K","C_seen_X","C_seen_S","C_seen_E","formula","rc_to_a1","shrbase","shift_formula_str","F_seen","process_col","hpt","hpx","pt2px","sylk_to_sheet","aoasht","sylk_to_aoa","write_ws_cell_sylk","a1_to_rc","preamble","RS","rec","wpx","width2px","px2char","px2pt","write_ws_rows_sylk","coord","DIF","dif_to_aoa_str","dif_to_sheet","dif_to_aoa","sheet_to_dif","push_field","topic","push_value","ETH","eth_to_sheet","eth_to_aoa","sep","sheet_to_eth_data","PRN","set_text_arr","guess_seps","guess_sep_weights","guess_sep","instr","dsv_to_sheet_str","FS","sepcc","startcc","_re","dateNF_regex","finish_cell","datestr","timestr","dateNF_fix","cellText","cellNF","prn_to_sheet_str","lines","prn_to_aoa_str","prn_to_sheet","firstbyte","WK_","lotushopper","Enum","WK1Enum","lotus_to_workbook_buf","next_n","sidx","snames","realnames","refguess","vers","qpro","tmpcell","WK3Enum","osheets","rnames","parse_cell","parse_LABEL","write_LABEL","write_INTEGER","write_NUMBER","wk1_parse_rc","rel","FuncTab","BinOpTab","parse_cell_3","write_LABEL_16","wsidx","parse_NUMBER_17","v1","v2","write_NUMBER_17","log2","parse_NUMBER_27","parse_SHEETNAMECS","write_XFORMAT_SHEETNAME","argc","argL","argR","wk1_fmla_to_csf","sheet_to_wk1","write_biff_rec","write_BOF_WK1","write_RANGE","max_R","book_to_wk3","wscnt","write_BOF_WK3","straywsregex","write_sst_xml","sst","bookSST","xmlns","Count","uniqueCount","Unique","sitag","write_BrtSSTItem","write_sst_bin","write_BrtBeginSst","_JS2ANSI","crypto_CreatePasswordVerifier_Method1","Password","PasswordArray","Verifier","PasswordDecoded","RTF","rtf_to_sheet","rtf_to_sheet_str","rowtf","rtfre","last_index","lastIndex","rgb2Hex","MDW","char2width","chr","coll","customWidth","PPI","pt","write_sty_xml","SSF","NF","formatCode","write_numFmts","cellXfs","write_cellXfs","write_BrtFmt","write_BrtFont","grbit","italic","strike","outline","shadow","condense","write_FontFlags","bold","sss","vertAlign","underline","family","rev_XLSBFillPTNames","XLSBFillPTNames","parse_BrtFill","write_BrtFill","fls","patternType","write_BrtXF","write_Blxf","parse_BrtBorder","write_BORDERS_bin","write_STYLES_bin","xfId","builtinId","write_TABLESTYLES_bin","defTableStyle","defPivotStyle","write_BrtBeginTableStyles","write_sty_bin","write_FMTS_bin","write_FONTS_bin","write_FILLS_bin","fontId","fillId","borderId","write_CELLSTYLEXFS_bin","write_CELLXFS_bin","write_DXFS_bin","write_theme","Themes","themeXLSX","write_xlmeta_bin","write_BrtMdtinfo","write_BrtBeginEsfmd","cm","write_BrtBeginEsmdb","mdb","write_BrtMdb","write_xlmeta_xml","_shapeid","write_comments_vml","csize","bbox","joinstyle","gradientshapeok","coordsize","fillopts","fillparm","fillxml","fillcolor","strokecolor","write_comments_xml","iauthor","ID","lastauthor","write_tcmnt_xml","people","carr","rootid","tcopts","tcid","parentId","personId","parse_BrtCommentAuthor","write_comments_bin","comment","write_BrtCommentAuthor","write_BrtBeginComment","VBAFMTS","rcregex","rcbase","rcfunc","fstr","crefregex","$0","$4","$5","parseread1","parse_ColRelU","parse_RgceArea","parse_RgceArea_BIFF2","parse_RgceLoc","parse_RgceLoc_BIFF2","parse_RgceElfLoc","fQuoted","parse_PtgAttrBaxcel","bitSemi","parse_PtgAttrSpaceType","parse_SerAr","parse_PtgExtraMem","cce","parse_PtgExtraArray","parse_PtgElfLoc","parse_PtgElfNoop","parse_PtgElfLel","PtgListRT","PtgTypes","iftab","FtabArgc","Ftab","cparams","tab","parsetab","Cetab","nameindex","parse_RgceLocRel_BIFF2","parse_RgceLocRel","parse_RgceAreaRel","ixti","parse_PtgNameX_BIFF5","PtgDupes","Ptg18","coltype","Ptg19","bitIf","bitGoto","parse_RgbExtra","rgce","parse_Rgce","ptgs","stringify_array","PtgBinOp","PtgAdd","PtgConcat","PtgDiv","PtgEq","PtgGe","PtgGt","PtgLe","PtgLt","PtgMul","PtgNe","PtgPower","PtgSub","get_ixti_raw","supbooks","XTI","SID","Name","get_ixti","ixtiraw","sname","formula_quote_sheet_name","stringify_formula","nameidx","last_sp","fflen","lbl","xlfn","externbook","bookidx","itab","ixtidata","lp","rp","sharedf","parsedf","fnd","arrayf","_left","write_Formula","o1","write_FormulaValue","o3","parse_XLSBParsedFormula","parse_XLSBArrayParsedFormula","parse_XLSBCellParsedFormula","parse_XLSBNameParsedFormula","parse_XLSBSharedParsedFormula","browser_has_Map","get_sst_id","revarr","col_obj_w","outlineLevel","default_margins","margins","defs","footer","get_cell_style","revssf","ssf","applyNumberFormat","check_ws","sheetprot_deffalse","sheetprot_deftrue","write_ws_xml_cell","oldt","oldv","Strings","revStrings","write_ws_xml","rdata","_drawing","needed","vbaraw","cname","Workbook","CodeName","codeName","outlineprops","summaryBelow","summaryRight","above","write_ws_xml_sheetpr","sview","workbookViewId","Views","rightToLeft","RTL","write_ws_xml_sheetviews","sheetFormat","defaultRowHeight","baseColWidth","outlineLevelRow","write_ws_xml_cols","_cell","customHeight","write_ws_xml_data","write_ws_xml_protection","Names","Sheet","Ref","write_ws_xml_autofilter","merges","write_ws_xml_merges","relc","tooltip","ignoreEC","numberStoredAsText","sqref","write_row_header","miyRw","ncolspan","lcs","caddr","write_BrtRowHdr","parse_BrtWsDim","write_BrtWsDim","parse_BrtShortReal","parse_BrtMergeCell","write_BrtMergeCell","BrtMarginKeys","write_ws_bin_cell","last_seen","ncell","write_BrtShortIsst","write_BrtCellIsst","write_BrtShortSt","write_BrtCellSt","write_BrtShortRk","write_BrtCellRk","write_BrtShortReal","write_BrtCellReal","write_BrtShortBool","write_BrtCellBool","write_BrtShortError","write_BrtCellError","write_BrtShortBlank","write_BrtCellBlank","write_MERGECELLS","write_COLINFOS","write_BrtColInfo","write_IGNOREECS","write_BrtCellIgnoreEC","write_HLINKS","locidx","write_BrtHLink","write_WSVIEWS2","write_BrtBeginWsView","write_SHEETPROTECT","write_ws_bin","write_BrtWsProp","cap","write_CELLTABLE","write_AUTOFILTER","write_LEGACYDRAWING","WBPropsDef","badchars","check_ws_name","safe","_good","check_wb","codes","cn","check_wb_names","write_wb_xml","write_names","workbookPr","WBProps","Hidden","sheetId","Comment","localSheetId","write_BrtBundleSh","iTabID","strRelID","write_BOOKVIEWS","vistab","write_wb_bin","write_BrtFileVersion","filterPrivacy","write_BrtWbProp","write_BUNDLESHS","write_ws","write_cmnt","write_props_xlml","xlml_write_docprops","Custprops","BLACKLIST","xlml_write_custprops","write_name_xlml","write_ws_xlml_cell","attr","marr","_v","write_ws_xlml_row","write_ws_xlml","write_ws_xlml_names","skip","write_ws_xlml_table","scenarios","selectLockedCells","selectUnlockedCells","write_ws_xlml_wsopts","write_xlml","write_sty_xlml","write_names_xlml","PSCLSID","write_xlscfb","wbpath","write_biff_buf","Keys","DSEntries","SEntries","CEntries","DocSummaryRE","SummaryRE","CEntries2","write_xls_props","vba","newpath","fill_vba_xls","cellFormula","Ptg","fBold","fItalic","fUnderline","fStrikeout","fOutline","fShadow","fCondense","fExtend","parse_FontFlags","bCharSet","xColorType","bR","bG","bB","icv","parse_BrtColor","ixfeParent","ifmt","defaultThemeVersion","strName","autoCompressPictures","backupFile","checkCompatibility","hidePivotFieldList","promptedSolutions","publishItems","refreshAllConnections","saveExternalLinkValues","showBorderUnselectedTables","showInkAnnotation","showObjects","showPivotChartFilter","updateLinks","rfx","fAlwaysCalc","relId","write_BIFF2Cell","write_ws_biff2_cell","write_BIFF2INT","write_BIFF2NUM","write_BIFF2BERR","write_BIFF2LABEL","write_biff2_buf","write_ws_biff2","write_FONTS_biff8","write_Font","write_ws_cols_biff8","write_ColInfo","write_ws_biff8_cell","write_Number","write_BoolErr","write_LabelSst","b8","write_Label","write_ws_biff8","_WB","_sheet","MAX_ROWS","guts","write_Guts","write_Dimensions","write_Window2","write_MergeCells","HL","write_ws_biff8_hlinks","write_FEAT","write_biff8_global","_sheets","_wb","writezeroes","write_WriteAccess","write_RRTabId","write_Window1","safe1904","write_FMTS_biff8","write_CELLXFS_biff8","write_biff_continue","write_SST","blen","fix_write_opts","write_biff8_buf","make_html_row","rowspan","colspan","editable","HTML_BEGIN","HTML_END","make_html_preamble","sheet_to_html","sheet_add_dom","or_R","or_C","midx","is_dom_element_hidden","elts","hasAttribute","Aelts","Aelti","parse_dom_table","get_computed_style","getComputedStyle","get_get_computed_style_function","getPropertyValue","write_styles_ods","master_styles","write_content_ods","null_cell_xml","ods","ROWS","textp","_Fref","text_p","_tgt","fods","cidx","colobj","write_automatic_styles_ods","write_ods","manifest","rdf","write_rdf","write_manifest","u8_to_dataview","byteOffset","stru8","u8concat","u8a","acc","u8","parse_varint49","ptr","varint","write_varint49","varint_to_i32","i32","parse_shallow","write_shallow","proto","parse_iwa_file","write_iwa_file","ias","midata","aipayload","mid","parse_snappy_chunk","chunks","decompress_iwa_file","compress_iwa_file","frame","write_new_storage","dv","mantissa","writeDecimal128LE","setFloat64","setUint32","write_old_storage","parse_TSP_Reference","write_tile_row","tri","last_offset","cell_storage","_dv","_last_offset","_cell_storage","celload","_celload","setUint16","fix_opts_func","numbers","trunc","dependents","packet2","indices_varint","ivi","u8contains","docroot","packet","sheetrootref","cruidsref","oldbucket","_x","cruids","uuid","row_header_ref","base_bucket","col_header_ref","sstref","sstroot","sentry","sx","sxi","sstdata","newsst","raw32","tile","tileref","tileroot","tentry","tiledata","rowload","R2","tilerow","raw3","write_numbers_iwa","wbrels","foo","wbext","vbafmt","threadedcomments","links","coreprops","extprops","custprops","themes","calcchains","drawings","TODO","_sn","_i","wsrels","need_vml","rId1","write_sst","write_wb","write_sty","write_xlmeta","write_zip_xlsxb","write_zip_xlsx","needtc","person","write_people_xml","write_cfb_ctr","write_zip_denouement","oopts","ftype","generate","encrypt_agile","write_string_type","bom","write_binary_type","writeSync","write_stxt_type","sheet_to_txt","sheet_to_csv","write_cfb_type","write_zip_type","resolve_book_type","make_json_row","defval","isempty","__rowNum__","rawNumbers","outi","counter","header_cnt","skipHidden","blankrows","qreg","make_csv_row","txt","forceQuotes","endregex","strip","sheet_add_json","js","skipHeader","JS","ws_get_cell_stub","RC","book_new","book_append_sheet","roll","cell_set_hyperlink","split_cell","json_to_sheet","table_to_sheet","table_to_book","sheet_to_formulae","cmds","sheet_to_row_object_array","sheet_get_cell","book_set_sheet_visibility","vis","wb_sheet_idx","cell_set_number_format","cell_set_internal_link","cell_add_comment","author","sheet_set_array_formula","dynamic","rng","rngstr","SHEET_VISIBLE","SHEET_HIDDEN","SHEET_VERY_HIDDEN","useParams","setVote","userMap","setUserMap","scoresByQuestion","setScoresByQuestion","editedFields","setEditedFields","voteSnapshot","voteData","fetchVote","querySnapshot","userData","calculatedScores","scores","targetScores","flat","rank","filteredTargets","currentRank","previousScore","sameRankCount","calculateScoresAndRank","downloadExcel","tableData","groupedByTarget","sortedTargets","_scoresByQuestion$key","targetScoreInfo","항목","질문","이름","최종순위","총점","선정순위","선정이유","작성자","writer","workbook","worksheet","_scoresByQuestion$key2","_scoresByQuestion$key3","_scoresByQuestion$key4","_scoresByQuestion$key5","rowSpan","verticalAlign","_activeVote$note2","_formResponses$active","_monthHeroData$curren","_monthHeroData$curren2","showVideo","setShowVideo","isModalOneOpen","setIsModalOneOpen","activeMenuOne","setActiveMenuOne","honorImageUrl","setHonorImageUrl","scrollContainerRef","resultVotes","setResultVotes","activeVote","setActiveVote","activeQuestion","setActiveQuestion","activeNote","setActiveNote","noteContent","setNoteContent","selectedVoteResponses","setSelectedVoteResponses","teamUsers","setTeamUsers","formResponses","setFormResponses","submitted","setSubmitted","isModalTwoOpen","setIsModalTwoOpen","monthHeroData","setMonthHeroData","currentIndex","setCurrentIndex","toggleModalOne","changeMenuOne","menuOne","toggleModalTwo","usersData","fetchResultVotes","_vote$submittedUsers","docSnapshot","currentUserUid","initialForm","_question$responses","userResponses","fetchActiveVote","fetchData","questionKey","fetchTeamUsers","_activeVote$note","_activeVote$note$answ","savedNote","honorDocRef","honorDoc","imageUrl","fetchHonorImage","fetchMonthHeroData","updatedResponses","isSubmitDisabled","handleSave","_voteData$note","_voteData$note2","updatedQuestions","newNoteResponse","updatedNoteResponses","handleSubmit","_voteData$note3","_voteData$note4","updatedSubmittedUsers","playsInline","onWheel","overflowX","whiteSpace","userSelect","maxWidth","objectFit","textDecoration","voteId","_data$questions$quest","_data$questions$quest2","_data$scoresByQuestio","scoreInfo","handleVoteClick","questionData","_questionData$scoreIn2","rIndex","_questionData$scoreIn","handleQuestionClick","handleNoteClick","spellCheck","handlePrev","prevIndex","handleNext","textInput","setTextInput","imageFile","setImageFile","isUploading","setIsUploading","toggleModal","imageRef","accept","openMenu","setOpenMenu","members","trophy","toggleMenu","menu","honorData","setHonorData","DOCUMENT_ID","fetchHonorData","docRef","formatDate","marginRight","typeSpeed","displayedText","setDisplayedText","posText","setPosText","showMessage","setShowMessage","hideOverlay","setHideOverlay","currentTime","TypingEffect","organization","mission","Jungdali","darlibaba","meo","infra","setUserObj","setRole","userRole","Sidebar","MemberList","MonthHero","Honor","VoteList","VoteDetail","VoteCreation","SignUp","VoteArea","Bigpie","History","Organization","Mission","Jungdal","Darlibaba","Meo","Infra","Login","onPerfEntry","getCLS","getFID","getFCP","getLCP","getTTFB","getElementById","App","reportWebVitals"],"sourceRoot":""}

    The documents returned by this method are ordered by remote version from the provided\n * offset. If there are no more remote documents after the provided offset, documents with\n * mutations in order of batch id from the offset are returned. Since all documents in a batch are\n * returned together, the total number of documents returned can exceed {@code count}.\n *\n * @param transaction\n * @param collectionGroup The collection group for the documents.\n * @param offset The offset to index into.\n * @param count The number of documents to return\n * @return A LocalWriteResult with the documents that follow the provided offset and the last processed batch id.\n */\n getNextDocuments(\n transaction: PersistenceTransaction,\n collectionGroup: string,\n offset: IndexOffset,\n count: number\n ): PersistencePromise {\n return this.remoteDocumentCache\n .getAllFromCollectionGroup(transaction, collectionGroup, offset, count)\n .next((originalDocs: MutableDocumentMap) => {\n const overlaysPromise: PersistencePromise =\n count - originalDocs.size > 0\n ? this.documentOverlayCache.getOverlaysForCollectionGroup(\n transaction,\n collectionGroup,\n offset.largestBatchId,\n count - originalDocs.size\n )\n : PersistencePromise.resolve(newOverlayMap());\n // The callsite will use the largest batch ID together with the latest read time to create\n // a new index offset. Since we only process batch IDs if all remote documents have been read,\n // no overlay will increase the overall read time. This is why we only need to special case\n // the batch id.\n let largestBatchId = INITIAL_LARGEST_BATCH_ID;\n let modifiedDocs = originalDocs;\n return overlaysPromise.next(overlays => {\n return PersistencePromise.forEach(\n overlays,\n (key: DocumentKey, overlay: Overlay) => {\n if (largestBatchId < overlay.largestBatchId) {\n largestBatchId = overlay.largestBatchId;\n }\n if (originalDocs.get(key)) {\n return PersistencePromise.resolve();\n }\n return this.remoteDocumentCache\n .getEntry(transaction, key)\n .next(doc => {\n modifiedDocs = modifiedDocs.insert(key, doc);\n });\n }\n )\n .next(() =>\n this.populateOverlays(transaction, overlays, originalDocs)\n )\n .next(() =>\n this.computeViews(\n transaction,\n modifiedDocs,\n overlays,\n documentKeySet()\n )\n )\n .next(localDocs => ({\n batchId: largestBatchId,\n changes: convertOverlayedDocumentMapToDocumentMap(localDocs)\n }));\n });\n });\n }\n\n private getDocumentsMatchingDocumentQuery(\n transaction: PersistenceTransaction,\n docPath: ResourcePath\n ): PersistencePromise {\n // Just do a simple document lookup.\n return this.getDocument(transaction, new DocumentKey(docPath)).next(\n document => {\n let result = documentMap();\n if (document.isFoundDocument()) {\n result = result.insert(document.key, document);\n }\n return result;\n }\n );\n }\n\n private getDocumentsMatchingCollectionGroupQuery(\n transaction: PersistenceTransaction,\n query: Query,\n offset: IndexOffset,\n context?: QueryContext\n ): PersistencePromise {\n debugAssert(\n query.path.isEmpty(),\n 'Currently we only support collection group queries at the root.'\n );\n const collectionId = query.collectionGroup!;\n let results = documentMap();\n return this.indexManager\n .getCollectionParents(transaction, collectionId)\n .next(parents => {\n // Perform a collection query against each parent that contains the\n // collectionId and aggregate the results.\n return PersistencePromise.forEach(parents, (parent: ResourcePath) => {\n const collectionQuery = asCollectionQueryAtPath(\n query,\n parent.child(collectionId)\n );\n return this.getDocumentsMatchingCollectionQuery(\n transaction,\n collectionQuery,\n offset,\n context\n ).next(r => {\n r.forEach((key, doc) => {\n results = results.insert(key, doc);\n });\n });\n }).next(() => results);\n });\n }\n\n private getDocumentsMatchingCollectionQuery(\n transaction: PersistenceTransaction,\n query: Query,\n offset: IndexOffset,\n context?: QueryContext\n ): PersistencePromise {\n // Query the remote documents and overlay mutations.\n let overlays: OverlayMap;\n return this.documentOverlayCache\n .getOverlaysForCollection(transaction, query.path, offset.largestBatchId)\n .next(result => {\n overlays = result;\n return this.remoteDocumentCache.getDocumentsMatchingQuery(\n transaction,\n query,\n offset,\n overlays,\n context\n );\n })\n .next(remoteDocuments => {\n // As documents might match the query because of their overlay we need to\n // include documents for all overlays in the initial document set.\n overlays.forEach((_, overlay) => {\n const key = overlay.getKey();\n if (remoteDocuments.get(key) === null) {\n remoteDocuments = remoteDocuments.insert(\n key,\n MutableDocument.newInvalidDocument(key)\n );\n }\n });\n\n // Apply the overlays and match against the query.\n let results = documentMap();\n remoteDocuments.forEach((key, document) => {\n const overlay = overlays.get(key);\n if (overlay !== undefined) {\n mutationApplyToLocalView(\n overlay.mutation,\n document,\n FieldMask.empty(),\n Timestamp.now()\n );\n }\n // Finally, insert the documents that still match the query\n if (queryMatches(query, document)) {\n results = results.insert(key, document);\n }\n });\n return results;\n });\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BundleMetadata, NamedQuery } from '../core/bundle';\nimport {\n NamedQuery as ProtoNamedQuery,\n BundleMetadata as ProtoBundleMetadata\n} from '../protos/firestore_bundle_proto';\n\nimport { BundleCache } from './bundle_cache';\nimport {\n fromBundleMetadata,\n fromProtoNamedQuery,\n LocalSerializer\n} from './local_serializer';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\nexport class MemoryBundleCache implements BundleCache {\n private bundles = new Map();\n private namedQueries = new Map();\n\n constructor(private serializer: LocalSerializer) {}\n\n getBundleMetadata(\n transaction: PersistenceTransaction,\n bundleId: string\n ): PersistencePromise {\n return PersistencePromise.resolve(this.bundles.get(bundleId));\n }\n\n saveBundleMetadata(\n transaction: PersistenceTransaction,\n bundleMetadata: ProtoBundleMetadata\n ): PersistencePromise {\n this.bundles.set(bundleMetadata.id!, fromBundleMetadata(bundleMetadata));\n return PersistencePromise.resolve();\n }\n\n getNamedQuery(\n transaction: PersistenceTransaction,\n queryName: string\n ): PersistencePromise {\n return PersistencePromise.resolve(this.namedQueries.get(queryName));\n }\n\n saveNamedQuery(\n transaction: PersistenceTransaction,\n query: ProtoNamedQuery\n ): PersistencePromise {\n this.namedQueries.set(query.name!, fromProtoNamedQuery(query));\n return PersistencePromise.resolve();\n }\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n documentKeySet,\n DocumentKeySet,\n MutationMap,\n OverlayMap,\n newOverlayMap\n} from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { Overlay } from '../model/overlay';\nimport { ResourcePath } from '../model/path';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { DocumentOverlayCache } from './document_overlay_cache';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\n/**\n * An in-memory implementation of DocumentOverlayCache.\n */\nexport class MemoryDocumentOverlayCache implements DocumentOverlayCache {\n // A map sorted by DocumentKey, whose value is a pair of the largest batch id\n // for the overlay and the overlay itself.\n private overlays = new SortedMap(\n DocumentKey.comparator\n );\n private overlayByBatchId = new Map();\n\n getOverlay(\n transaction: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n return PersistencePromise.resolve(this.overlays.get(key));\n }\n\n getOverlays(\n transaction: PersistenceTransaction,\n keys: DocumentKey[]\n ): PersistencePromise {\n const result = newOverlayMap();\n return PersistencePromise.forEach(keys, (key: DocumentKey) => {\n return this.getOverlay(transaction, key).next(overlay => {\n if (overlay !== null) {\n result.set(key, overlay);\n }\n });\n }).next(() => result);\n }\n\n saveOverlays(\n transaction: PersistenceTransaction,\n largestBatchId: number,\n overlays: MutationMap\n ): PersistencePromise {\n overlays.forEach((_, mutation) => {\n this.saveOverlay(transaction, largestBatchId, mutation);\n });\n return PersistencePromise.resolve();\n }\n\n removeOverlaysForBatchId(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet,\n batchId: number\n ): PersistencePromise {\n const keys = this.overlayByBatchId.get(batchId);\n if (keys !== undefined) {\n keys.forEach(key => (this.overlays = this.overlays.remove(key)));\n this.overlayByBatchId.delete(batchId);\n }\n return PersistencePromise.resolve();\n }\n\n getOverlaysForCollection(\n transaction: PersistenceTransaction,\n collection: ResourcePath,\n sinceBatchId: number\n ): PersistencePromise {\n const result = newOverlayMap();\n\n const immediateChildrenPathLength = collection.length + 1;\n const prefix = new DocumentKey(collection.child(''));\n const iter = this.overlays.getIteratorFrom(prefix);\n while (iter.hasNext()) {\n const entry = iter.getNext();\n const overlay = entry.value;\n const key = overlay.getKey();\n if (!collection.isPrefixOf(key.path)) {\n break;\n }\n // Documents from sub-collections\n if (key.path.length !== immediateChildrenPathLength) {\n continue;\n }\n if (overlay.largestBatchId > sinceBatchId) {\n result.set(overlay.getKey(), overlay);\n }\n }\n\n return PersistencePromise.resolve(result);\n }\n\n getOverlaysForCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string,\n sinceBatchId: number,\n count: number\n ): PersistencePromise {\n let batchIdToOverlays = new SortedMap(\n (key1: number, key2: number) => key1 - key2\n );\n\n const iter = this.overlays.getIterator();\n while (iter.hasNext()) {\n const entry = iter.getNext();\n const overlay = entry.value;\n const key = overlay.getKey();\n if (key.getCollectionGroup() !== collectionGroup) {\n continue;\n }\n if (overlay.largestBatchId > sinceBatchId) {\n let overlaysForBatchId = batchIdToOverlays.get(overlay.largestBatchId);\n if (overlaysForBatchId === null) {\n overlaysForBatchId = newOverlayMap();\n batchIdToOverlays = batchIdToOverlays.insert(\n overlay.largestBatchId,\n overlaysForBatchId\n );\n }\n overlaysForBatchId.set(overlay.getKey(), overlay);\n }\n }\n\n const result = newOverlayMap();\n const batchIter = batchIdToOverlays.getIterator();\n while (batchIter.hasNext()) {\n const entry = batchIter.getNext();\n const overlays = entry.value;\n overlays.forEach((key, overlay) => result.set(key, overlay));\n if (result.size() >= count) {\n break;\n }\n }\n return PersistencePromise.resolve(result);\n }\n\n private saveOverlay(\n transaction: PersistenceTransaction,\n largestBatchId: number,\n mutation: Mutation\n ): void {\n // Remove the association of the overlay to its batch id.\n const existing = this.overlays.get(mutation.key);\n if (existing !== null) {\n const newSet = this.overlayByBatchId\n .get(existing.largestBatchId)!\n .delete(mutation.key);\n this.overlayByBatchId.set(existing.largestBatchId, newSet);\n }\n\n this.overlays = this.overlays.insert(\n mutation.key,\n new Overlay(largestBatchId, mutation)\n );\n\n // Create the association of this overlay to the given largestBatchId.\n let batch = this.overlayByBatchId.get(largestBatchId);\n if (batch === undefined) {\n batch = documentKeySet();\n this.overlayByBatchId.set(largestBatchId, batch);\n }\n this.overlayByBatchId.set(largestBatchId, batch.add(mutation.key));\n }\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { ByteString } from '../util/byte_string';\n\nimport { GlobalsCache } from './globals_cache';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\n\nexport class MemoryGlobalsCache implements GlobalsCache {\n private sessionToken: ByteString = ByteString.EMPTY_BYTE_STRING;\n\n getSessionToken(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve(this.sessionToken);\n }\n\n setSessionToken(\n transaction: PersistenceTransaction,\n sessionToken: ByteString\n ): PersistencePromise {\n this.sessionToken = sessionToken;\n return PersistencePromise.resolve();\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { BatchId, TargetId } from '../core/types';\nimport { documentKeySet, DocumentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\n/**\n * A collection of references to a document from some kind of numbered entity\n * (either a target ID or batch ID). As references are added to or removed from\n * the set corresponding events are emitted to a registered garbage collector.\n *\n * Each reference is represented by a DocumentReference object. Each of them\n * contains enough information to uniquely identify the reference. They are all\n * stored primarily in a set sorted by key. A document is considered garbage if\n * there's no references in that set (this can be efficiently checked thanks to\n * sorting by key).\n *\n * ReferenceSet also keeps a secondary set that contains references sorted by\n * IDs. This one is used to efficiently implement removal of all references by\n * some target ID.\n */\nexport class ReferenceSet {\n // A set of outstanding references to a document sorted by key.\n private refsByKey = new SortedSet(DocReference.compareByKey);\n\n // A set of outstanding references to a document sorted by target id.\n private refsByTarget = new SortedSet(DocReference.compareByTargetId);\n\n /** Returns true if the reference set contains no references. */\n isEmpty(): boolean {\n return this.refsByKey.isEmpty();\n }\n\n /** Adds a reference to the given document key for the given ID. */\n addReference(key: DocumentKey, id: TargetId | BatchId): void {\n const ref = new DocReference(key, id);\n this.refsByKey = this.refsByKey.add(ref);\n this.refsByTarget = this.refsByTarget.add(ref);\n }\n\n /** Add references to the given document keys for the given ID. */\n addReferences(keys: DocumentKeySet, id: TargetId | BatchId): void {\n keys.forEach(key => this.addReference(key, id));\n }\n\n /**\n * Removes a reference to the given document key for the given\n * ID.\n */\n removeReference(key: DocumentKey, id: TargetId | BatchId): void {\n this.removeRef(new DocReference(key, id));\n }\n\n removeReferences(keys: DocumentKeySet, id: TargetId | BatchId): void {\n keys.forEach(key => this.removeReference(key, id));\n }\n\n /**\n * Clears all references with a given ID. Calls removeRef() for each key\n * removed.\n */\n removeReferencesForId(id: TargetId | BatchId): DocumentKey[] {\n const emptyKey = new DocumentKey(new ResourcePath([]));\n const startRef = new DocReference(emptyKey, id);\n const endRef = new DocReference(emptyKey, id + 1);\n const keys: DocumentKey[] = [];\n this.refsByTarget.forEachInRange([startRef, endRef], ref => {\n this.removeRef(ref);\n keys.push(ref.key);\n });\n return keys;\n }\n\n removeAllReferences(): void {\n this.refsByKey.forEach(ref => this.removeRef(ref));\n }\n\n private removeRef(ref: DocReference): void {\n this.refsByKey = this.refsByKey.delete(ref);\n this.refsByTarget = this.refsByTarget.delete(ref);\n }\n\n referencesForId(id: TargetId | BatchId): DocumentKeySet {\n const emptyKey = new DocumentKey(new ResourcePath([]));\n const startRef = new DocReference(emptyKey, id);\n const endRef = new DocReference(emptyKey, id + 1);\n let keys = documentKeySet();\n this.refsByTarget.forEachInRange([startRef, endRef], ref => {\n keys = keys.add(ref.key);\n });\n return keys;\n }\n\n containsKey(key: DocumentKey): boolean {\n const ref = new DocReference(key, 0);\n const firstRef = this.refsByKey.firstAfterOrEqual(ref);\n return firstRef !== null && key.isEqual(firstRef.key);\n }\n}\n\nexport class DocReference {\n constructor(\n public key: DocumentKey,\n public targetOrBatchId: TargetId | BatchId\n ) {}\n\n /** Compare by key then by ID */\n static compareByKey(left: DocReference, right: DocReference): number {\n return (\n DocumentKey.comparator(left.key, right.key) ||\n primitiveComparator(left.targetOrBatchId, right.targetOrBatchId)\n );\n }\n\n /** Compare by ID then by key */\n static compareByTargetId(left: DocReference, right: DocReference): number {\n return (\n primitiveComparator(left.targetOrBatchId, right.targetOrBatchId) ||\n DocumentKey.comparator(left.key, right.key)\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isCollectionGroupQuery, Query } from '../core/query';\nimport { BatchId } from '../core/types';\nimport { Timestamp } from '../lite-api/timestamp';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { MutationBatch } from '../model/mutation_batch';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { IndexManager } from './index_manager';\nimport { MutationQueue } from './mutation_queue';\nimport { ReferenceDelegate } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { DocReference } from './reference_set';\n\nexport class MemoryMutationQueue implements MutationQueue {\n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n private mutationQueue: MutationBatch[] = [];\n\n /** Next value to use when assigning sequential IDs to each mutation batch. */\n private nextBatchId: BatchId = 1;\n\n /** An ordered mapping between documents and the mutations batch IDs. */\n private batchesByDocumentKey = new SortedSet(DocReference.compareByKey);\n\n constructor(\n private readonly indexManager: IndexManager,\n private readonly referenceDelegate: ReferenceDelegate\n ) {}\n\n checkEmpty(transaction: PersistenceTransaction): PersistencePromise {\n return PersistencePromise.resolve(this.mutationQueue.length === 0);\n }\n\n addMutationBatch(\n transaction: PersistenceTransaction,\n localWriteTime: Timestamp,\n baseMutations: Mutation[],\n mutations: Mutation[]\n ): PersistencePromise {\n debugAssert(mutations.length !== 0, 'Mutation batches should not be empty');\n\n const batchId = this.nextBatchId;\n this.nextBatchId++;\n\n if (this.mutationQueue.length > 0) {\n const prior = this.mutationQueue[this.mutationQueue.length - 1];\n debugAssert(\n prior.batchId < batchId,\n 'Mutation batchIDs must be monotonically increasing order'\n );\n }\n\n const batch = new MutationBatch(\n batchId,\n localWriteTime,\n baseMutations,\n mutations\n );\n this.mutationQueue.push(batch);\n\n // Track references by document key and index collection parents.\n for (const mutation of mutations) {\n this.batchesByDocumentKey = this.batchesByDocumentKey.add(\n new DocReference(mutation.key, batchId)\n );\n\n this.indexManager.addToCollectionParentIndex(\n transaction,\n mutation.key.path.popLast()\n );\n }\n\n return PersistencePromise.resolve(batch);\n }\n\n lookupMutationBatch(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise {\n return PersistencePromise.resolve(this.findMutationBatch(batchId));\n }\n\n getNextMutationBatchAfterBatchId(\n transaction: PersistenceTransaction,\n batchId: BatchId\n ): PersistencePromise {\n const nextBatchId = batchId + 1;\n\n // The requested batchId may still be out of range so normalize it to the\n // start of the queue.\n const rawIndex = this.indexOfBatchId(nextBatchId);\n const index = rawIndex < 0 ? 0 : rawIndex;\n return PersistencePromise.resolve(\n this.mutationQueue.length > index ? this.mutationQueue[index] : null\n );\n }\n\n getHighestUnacknowledgedBatchId(): PersistencePromise {\n return PersistencePromise.resolve(\n this.mutationQueue.length === 0 ? BATCHID_UNKNOWN : this.nextBatchId - 1\n );\n }\n\n getAllMutationBatches(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve(this.mutationQueue.slice());\n }\n\n getAllMutationBatchesAffectingDocumentKey(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise {\n const start = new DocReference(documentKey, 0);\n const end = new DocReference(documentKey, Number.POSITIVE_INFINITY);\n const result: MutationBatch[] = [];\n this.batchesByDocumentKey.forEachInRange([start, end], ref => {\n debugAssert(\n documentKey.isEqual(ref.key),\n \"Should only iterate over a single key's batches\"\n );\n const batch = this.findMutationBatch(ref.targetOrBatchId);\n debugAssert(\n batch !== null,\n 'Batches in the index must exist in the main table'\n );\n result.push(batch!);\n });\n\n return PersistencePromise.resolve(result);\n }\n\n getAllMutationBatchesAffectingDocumentKeys(\n transaction: PersistenceTransaction,\n documentKeys: SortedMap\n ): PersistencePromise {\n let uniqueBatchIDs = new SortedSet(primitiveComparator);\n\n documentKeys.forEach(documentKey => {\n const start = new DocReference(documentKey, 0);\n const end = new DocReference(documentKey, Number.POSITIVE_INFINITY);\n this.batchesByDocumentKey.forEachInRange([start, end], ref => {\n debugAssert(\n documentKey.isEqual(ref.key),\n \"For each key, should only iterate over a single key's batches\"\n );\n\n uniqueBatchIDs = uniqueBatchIDs.add(ref.targetOrBatchId);\n });\n });\n\n return PersistencePromise.resolve(this.findMutationBatches(uniqueBatchIDs));\n }\n\n getAllMutationBatchesAffectingQuery(\n transaction: PersistenceTransaction,\n query: Query\n ): PersistencePromise {\n debugAssert(\n !isCollectionGroupQuery(query),\n 'CollectionGroup queries should be handled in LocalDocumentsView'\n );\n // Use the query path as a prefix for testing if a document matches the\n // query.\n const prefix = query.path;\n const immediateChildrenPathLength = prefix.length + 1;\n\n // Construct a document reference for actually scanning the index. Unlike\n // the prefix the document key in this reference must have an even number of\n // segments. The empty segment can be used a suffix of the query path\n // because it precedes all other segments in an ordered traversal.\n let startPath = prefix;\n if (!DocumentKey.isDocumentKey(startPath)) {\n startPath = startPath.child('');\n }\n\n const start = new DocReference(new DocumentKey(startPath), 0);\n\n // Find unique batchIDs referenced by all documents potentially matching the\n // query.\n let uniqueBatchIDs = new SortedSet(primitiveComparator);\n\n this.batchesByDocumentKey.forEachWhile(ref => {\n const rowKeyPath = ref.key.path;\n if (!prefix.isPrefixOf(rowKeyPath)) {\n return false;\n } else {\n // Rows with document keys more than one segment longer than the query\n // path can't be matches. For example, a query on 'rooms' can't match\n // the document /rooms/abc/messages/xyx.\n // TODO(mcg): we'll need a different scanner when we implement\n // ancestor queries.\n if (rowKeyPath.length === immediateChildrenPathLength) {\n uniqueBatchIDs = uniqueBatchIDs.add(ref.targetOrBatchId);\n }\n return true;\n }\n }, start);\n\n return PersistencePromise.resolve(this.findMutationBatches(uniqueBatchIDs));\n }\n\n private findMutationBatches(batchIDs: SortedSet): MutationBatch[] {\n // Construct an array of matching batches, sorted by batchID to ensure that\n // multiple mutations affecting the same document key are applied in order.\n const result: MutationBatch[] = [];\n batchIDs.forEach(batchId => {\n const batch = this.findMutationBatch(batchId);\n if (batch !== null) {\n result.push(batch);\n }\n });\n return result;\n }\n\n removeMutationBatch(\n transaction: PersistenceTransaction,\n batch: MutationBatch\n ): PersistencePromise {\n // Find the position of the first batch for removal.\n const batchIndex = this.indexOfExistingBatchId(batch.batchId, 'removed');\n hardAssert(\n batchIndex === 0,\n 'Can only remove the first entry of the mutation queue'\n );\n this.mutationQueue.shift();\n\n let references = this.batchesByDocumentKey;\n return PersistencePromise.forEach(batch.mutations, (mutation: Mutation) => {\n const ref = new DocReference(mutation.key, batch.batchId);\n references = references.delete(ref);\n return this.referenceDelegate.markPotentiallyOrphaned(\n transaction,\n mutation.key\n );\n }).next(() => {\n this.batchesByDocumentKey = references;\n });\n }\n\n removeCachedMutationKeys(batchId: BatchId): void {\n // No-op since the memory mutation queue does not maintain a separate cache.\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n const ref = new DocReference(key, 0);\n const firstRef = this.batchesByDocumentKey.firstAfterOrEqual(ref);\n return PersistencePromise.resolve(key.isEqual(firstRef && firstRef.key));\n }\n\n performConsistencyCheck(\n txn: PersistenceTransaction\n ): PersistencePromise {\n if (this.mutationQueue.length === 0) {\n debugAssert(\n this.batchesByDocumentKey.isEmpty(),\n 'Document leak -- detected dangling mutation references when queue is empty.'\n );\n }\n return PersistencePromise.resolve();\n }\n\n /**\n * Finds the index of the given batchId in the mutation queue and asserts that\n * the resulting index is within the bounds of the queue.\n *\n * @param batchId - The batchId to search for\n * @param action - A description of what the caller is doing, phrased in passive\n * form (e.g. \"acknowledged\" in a routine that acknowledges batches).\n */\n private indexOfExistingBatchId(batchId: BatchId, action: string): number {\n const index = this.indexOfBatchId(batchId);\n debugAssert(\n index >= 0 && index < this.mutationQueue.length,\n 'Batches must exist to be ' + action\n );\n return index;\n }\n\n /**\n * Finds the index of the given batchId in the mutation queue. This operation\n * is O(1).\n *\n * @returns The computed index of the batch with the given batchId, based on\n * the state of the queue. Note this index can be negative if the requested\n * batchId has already been removed from the queue or past the end of the\n * queue if the batchId is larger than the last added batch.\n */\n private indexOfBatchId(batchId: BatchId): number {\n if (this.mutationQueue.length === 0) {\n // As an index this is past the end of the queue\n return 0;\n }\n\n // Examine the front of the queue to figure out the difference between the\n // batchId and indexes in the array. Note that since the queue is ordered\n // by batchId, if the first batch has a larger batchId then the requested\n // batchId doesn't exist in the queue.\n const firstBatchId = this.mutationQueue[0].batchId;\n return batchId - firstBatchId;\n }\n\n /**\n * A version of lookupMutationBatch that doesn't return a promise, this makes\n * other functions that uses this code easier to read and more efficient.\n */\n private findMutationBatch(batchId: BatchId): MutationBatch | null {\n const index = this.indexOfBatchId(batchId);\n if (index < 0 || index >= this.mutationQueue.length) {\n return null;\n }\n\n const batch = this.mutationQueue[index];\n debugAssert(batch.batchId === batchId, 'If found batch must match');\n return batch;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Query, queryMatches } from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n DocumentKeySet,\n MutableDocumentMap,\n mutableDocumentMap,\n OverlayMap\n} from '../model/collections';\nimport { Document, MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n IndexOffset,\n indexOffsetComparator,\n newIndexOffsetFromDocument\n} from '../model/field_index';\nimport { debugAssert, fail } from '../util/assert';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { IndexManager } from './index_manager';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { RemoteDocumentCache } from './remote_document_cache';\nimport { RemoteDocumentChangeBuffer } from './remote_document_change_buffer';\n\nexport type DocumentSizer = (doc: Document) => number;\n\n/** Miscellaneous collection types / constants. */\ninterface MemoryRemoteDocumentCacheEntry {\n document: Document;\n size: number;\n}\n\ntype DocumentEntryMap = SortedMap;\nfunction documentEntryMap(): DocumentEntryMap {\n return new SortedMap(\n DocumentKey.comparator\n );\n}\n\nexport interface MemoryRemoteDocumentCache extends RemoteDocumentCache {\n forEachDocumentKey(\n transaction: PersistenceTransaction,\n f: (key: DocumentKey) => PersistencePromise\n ): PersistencePromise;\n}\n\n/**\n * The memory-only RemoteDocumentCache for IndexedDb. To construct, invoke\n * `newMemoryRemoteDocumentCache()`.\n */\nclass MemoryRemoteDocumentCacheImpl implements MemoryRemoteDocumentCache {\n /** Underlying cache of documents and their read times. */\n private docs = documentEntryMap();\n private indexManager!: IndexManager;\n\n /** Size of all cached documents. */\n private size = 0;\n\n /**\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\n constructor(private readonly sizer: DocumentSizer) {}\n\n setIndexManager(indexManager: IndexManager): void {\n this.indexManager = indexManager;\n }\n\n /**\n * Adds the supplied entry to the cache and updates the cache size as appropriate.\n *\n * All calls of `addEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */\n addEntry(\n transaction: PersistenceTransaction,\n doc: MutableDocument\n ): PersistencePromise {\n debugAssert(\n !doc.readTime.isEqual(SnapshotVersion.min()),\n 'Cannot add a document with a read time of zero'\n );\n\n const key = doc.key;\n const entry = this.docs.get(key);\n const previousSize = entry ? entry.size : 0;\n const currentSize = this.sizer(doc);\n\n this.docs = this.docs.insert(key, {\n document: doc.mutableCopy(),\n size: currentSize\n });\n\n this.size += currentSize - previousSize;\n\n return this.indexManager.addToCollectionParentIndex(\n transaction,\n key.path.popLast()\n );\n }\n\n /**\n * Removes the specified entry from the cache and updates the cache size as appropriate.\n *\n * All calls of `removeEntry` are required to go through the RemoteDocumentChangeBuffer\n * returned by `newChangeBuffer()`.\n */\n removeEntry(documentKey: DocumentKey): void {\n const entry = this.docs.get(documentKey);\n if (entry) {\n this.docs = this.docs.remove(documentKey);\n this.size -= entry.size;\n }\n }\n\n getEntry(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise {\n const entry = this.docs.get(documentKey);\n return PersistencePromise.resolve(\n entry\n ? entry.document.mutableCopy()\n : MutableDocument.newInvalidDocument(documentKey)\n );\n }\n\n getEntries(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise {\n let results = mutableDocumentMap();\n documentKeys.forEach(documentKey => {\n const entry = this.docs.get(documentKey);\n results = results.insert(\n documentKey,\n entry\n ? entry.document.mutableCopy()\n : MutableDocument.newInvalidDocument(documentKey)\n );\n });\n return PersistencePromise.resolve(results);\n }\n\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n offset: IndexOffset,\n mutatedDocs: OverlayMap\n ): PersistencePromise {\n let results = mutableDocumentMap();\n\n // Documents are ordered by key, so we can use a prefix scan to narrow down\n // the documents we need to match the query against.\n const collectionPath = query.path;\n const prefix = new DocumentKey(collectionPath.child(''));\n const iterator = this.docs.getIteratorFrom(prefix);\n while (iterator.hasNext()) {\n const {\n key,\n value: { document }\n } = iterator.getNext();\n if (!collectionPath.isPrefixOf(key.path)) {\n break;\n }\n if (key.path.length > collectionPath.length + 1) {\n // Exclude entries from subcollections.\n continue;\n }\n if (\n indexOffsetComparator(newIndexOffsetFromDocument(document), offset) <= 0\n ) {\n // The document sorts before the offset.\n continue;\n }\n if (!mutatedDocs.has(document.key) && !queryMatches(query, document)) {\n // The document cannot possibly match the query.\n continue;\n }\n\n results = results.insert(document.key, document.mutableCopy());\n }\n return PersistencePromise.resolve(results);\n }\n\n getAllFromCollectionGroup(\n transaction: PersistenceTransaction,\n collectionGroup: string,\n offset: IndexOffset,\n limit: number\n ): PersistencePromise {\n // This method should only be called from the IndexBackfiller if persistence\n // is enabled.\n fail('getAllFromCollectionGroup() is not supported.');\n }\n\n forEachDocumentKey(\n transaction: PersistenceTransaction,\n f: (key: DocumentKey) => PersistencePromise\n ): PersistencePromise {\n return PersistencePromise.forEach(this.docs, (key: DocumentKey) => f(key));\n }\n\n newChangeBuffer(options?: {\n trackRemovals: boolean;\n }): RemoteDocumentChangeBuffer {\n // `trackRemovals` is ignores since the MemoryRemoteDocumentCache keeps\n // a separate changelog and does not need special handling for removals.\n return new MemoryRemoteDocumentChangeBuffer(this);\n }\n\n getSize(txn: PersistenceTransaction): PersistencePromise {\n return PersistencePromise.resolve(this.size);\n }\n}\n\n/**\n * Creates a new memory-only RemoteDocumentCache.\n *\n * @param sizer - Used to assess the size of a document. For eager GC, this is\n * expected to just return 0 to avoid unnecessarily doing the work of\n * calculating the size.\n */\nexport function newMemoryRemoteDocumentCache(\n sizer: DocumentSizer\n): MemoryRemoteDocumentCache {\n return new MemoryRemoteDocumentCacheImpl(sizer);\n}\n\n/**\n * Handles the details of adding and updating documents in the MemoryRemoteDocumentCache.\n */\nclass MemoryRemoteDocumentChangeBuffer extends RemoteDocumentChangeBuffer {\n constructor(private readonly documentCache: MemoryRemoteDocumentCacheImpl) {\n super();\n }\n\n protected applyChanges(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n const promises: Array> = [];\n this.changes.forEach((key, doc) => {\n if (doc.isValidDocument()) {\n promises.push(this.documentCache.addEntry(transaction, doc));\n } else {\n this.documentCache.removeEntry(key);\n }\n });\n return PersistencePromise.waitFor(promises);\n }\n\n protected getFromCache(\n transaction: PersistenceTransaction,\n documentKey: DocumentKey\n ): PersistencePromise {\n return this.documentCache.getEntry(transaction, documentKey);\n }\n\n protected getAllFromCache(\n transaction: PersistenceTransaction,\n documentKeys: DocumentKeySet\n ): PersistencePromise {\n return this.documentCache.getEntries(transaction, documentKeys);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetEquals } from '../core/target';\nimport { TargetIdGenerator } from '../core/target_id_generator';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { DocumentKeySet } from '../model/collections';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert } from '../util/assert';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { ActiveTargets } from './lru_garbage_collector';\nimport { Persistence } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { ReferenceSet } from './reference_set';\nimport { TargetCache } from './target_cache';\nimport { TargetData } from './target_data';\n\nexport class MemoryTargetCache implements TargetCache {\n /**\n * Maps a target to the data about that target\n */\n private targets = new ObjectMap(\n t => canonifyTarget(t),\n targetEquals\n );\n\n /** The last received snapshot version. */\n private lastRemoteSnapshotVersion = SnapshotVersion.min();\n /** The highest numbered target ID encountered. */\n private highestTargetId: TargetId = 0;\n /** The highest sequence number encountered. */\n private highestSequenceNumber: ListenSequenceNumber = 0;\n /**\n * A ordered bidirectional mapping between documents and the remote target\n * IDs.\n */\n private references = new ReferenceSet();\n\n private targetCount = 0;\n\n private targetIdGenerator = TargetIdGenerator.forTargetCache();\n\n constructor(private readonly persistence: Persistence) {}\n\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise {\n this.targets.forEach((_, targetData) => f(targetData));\n return PersistencePromise.resolve();\n }\n\n getLastRemoteSnapshotVersion(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve(this.lastRemoteSnapshotVersion);\n }\n\n getHighestSequenceNumber(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve(this.highestSequenceNumber);\n }\n\n allocateTargetId(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n this.highestTargetId = this.targetIdGenerator.next();\n return PersistencePromise.resolve(this.highestTargetId);\n }\n\n setTargetsMetadata(\n transaction: PersistenceTransaction,\n highestListenSequenceNumber: number,\n lastRemoteSnapshotVersion?: SnapshotVersion\n ): PersistencePromise {\n if (lastRemoteSnapshotVersion) {\n this.lastRemoteSnapshotVersion = lastRemoteSnapshotVersion;\n }\n if (highestListenSequenceNumber > this.highestSequenceNumber) {\n this.highestSequenceNumber = highestListenSequenceNumber;\n }\n return PersistencePromise.resolve();\n }\n\n private saveTargetData(targetData: TargetData): void {\n this.targets.set(targetData.target, targetData);\n const targetId = targetData.targetId;\n if (targetId > this.highestTargetId) {\n this.targetIdGenerator = new TargetIdGenerator(targetId);\n this.highestTargetId = targetId;\n }\n if (targetData.sequenceNumber > this.highestSequenceNumber) {\n this.highestSequenceNumber = targetData.sequenceNumber;\n }\n }\n\n addTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise {\n debugAssert(\n !this.targets.has(targetData.target),\n 'Adding a target that already exists'\n );\n this.saveTargetData(targetData);\n this.targetCount += 1;\n return PersistencePromise.resolve();\n }\n\n updateTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise {\n debugAssert(\n this.targets.has(targetData.target),\n 'Updating a nonexistent target'\n );\n this.saveTargetData(targetData);\n return PersistencePromise.resolve();\n }\n\n removeTargetData(\n transaction: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise {\n debugAssert(this.targetCount > 0, 'Removing a target from an empty cache');\n debugAssert(\n this.targets.has(targetData.target),\n 'Removing a nonexistent target from the cache'\n );\n this.targets.delete(targetData.target);\n this.references.removeReferencesForId(targetData.targetId);\n this.targetCount -= 1;\n return PersistencePromise.resolve();\n }\n\n removeTargets(\n transaction: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise {\n let count = 0;\n const removals: Array> = [];\n this.targets.forEach((key, targetData) => {\n if (\n targetData.sequenceNumber <= upperBound &&\n activeTargetIds.get(targetData.targetId) === null\n ) {\n this.targets.delete(key);\n removals.push(\n this.removeMatchingKeysForTargetId(transaction, targetData.targetId)\n );\n count++;\n }\n });\n return PersistencePromise.waitFor(removals).next(() => count);\n }\n\n getTargetCount(\n transaction: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve(this.targetCount);\n }\n\n getTargetData(\n transaction: PersistenceTransaction,\n target: Target\n ): PersistencePromise {\n const targetData = this.targets.get(target) || null;\n return PersistencePromise.resolve(targetData);\n }\n\n addMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise {\n this.references.addReferences(keys, targetId);\n return PersistencePromise.resolve();\n }\n\n removeMatchingKeys(\n txn: PersistenceTransaction,\n keys: DocumentKeySet,\n targetId: TargetId\n ): PersistencePromise {\n this.references.removeReferences(keys, targetId);\n const referenceDelegate = this.persistence.referenceDelegate;\n const promises: Array> = [];\n if (referenceDelegate) {\n keys.forEach(key => {\n promises.push(referenceDelegate.markPotentiallyOrphaned(txn, key));\n });\n }\n return PersistencePromise.waitFor(promises);\n }\n\n removeMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise {\n this.references.removeReferencesForId(targetId);\n return PersistencePromise.resolve();\n }\n\n getMatchingKeysForTargetId(\n txn: PersistenceTransaction,\n targetId: TargetId\n ): PersistencePromise {\n const matchingKeys = this.references.referencesForId(targetId);\n return PersistencePromise.resolve(matchingKeys);\n }\n\n containsKey(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n return PersistencePromise.resolve(this.references.containsKey(key));\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { ListenSequence } from '../core/listen_sequence';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { ListenSequenceNumber, TargetId } from '../core/types';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { estimateByteSize } from '../model/values';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { fail } from '../util/assert';\nimport { logDebug } from '../util/log';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { DocumentOverlayCache } from './document_overlay_cache';\nimport { encodeResourcePath } from './encoded_resource_path';\nimport { GlobalsCache } from './globals_cache';\nimport { IndexManager } from './index_manager';\nimport { LocalSerializer } from './local_serializer';\nimport {\n ActiveTargets,\n LruDelegate,\n LruGarbageCollector,\n LruParams\n} from './lru_garbage_collector';\nimport { newLruGarbageCollector } from './lru_garbage_collector_impl';\nimport { MemoryBundleCache } from './memory_bundle_cache';\nimport { MemoryDocumentOverlayCache } from './memory_document_overlay_cache';\nimport { MemoryGlobalsCache } from './memory_globals_cache';\nimport { MemoryIndexManager } from './memory_index_manager';\nimport { MemoryMutationQueue } from './memory_mutation_queue';\nimport {\n MemoryRemoteDocumentCache,\n newMemoryRemoteDocumentCache\n} from './memory_remote_document_cache';\nimport { MemoryTargetCache } from './memory_target_cache';\nimport { MutationQueue } from './mutation_queue';\nimport { Persistence, ReferenceDelegate } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport {\n PersistenceTransaction,\n PersistenceTransactionMode\n} from './persistence_transaction';\nimport { ReferenceSet } from './reference_set';\nimport { TargetData } from './target_data';\n\nconst LOG_TAG = 'MemoryPersistence';\n/**\n * A memory-backed instance of Persistence. Data is stored only in RAM and\n * not persisted across sessions.\n */\nexport class MemoryPersistence implements Persistence {\n /**\n * Note that these are retained here to make it easier to write tests\n * affecting both the in-memory and IndexedDB-backed persistence layers. Tests\n * can create a new LocalStore wrapping this Persistence instance and this\n * will make the in-memory persistence layer behave as if it were actually\n * persisting values.\n */\n private readonly indexManager: MemoryIndexManager;\n private readonly globalsCache: MemoryGlobalsCache;\n private mutationQueues: { [user: string]: MemoryMutationQueue } = {};\n private overlays: { [user: string]: MemoryDocumentOverlayCache } = {};\n private readonly remoteDocumentCache: MemoryRemoteDocumentCache;\n private readonly targetCache: MemoryTargetCache;\n private readonly bundleCache: MemoryBundleCache;\n private readonly listenSequence = new ListenSequence(0);\n private serializer: LocalSerializer;\n\n private _started = false;\n\n readonly referenceDelegate: MemoryReferenceDelegate;\n\n /**\n * The constructor accepts a factory for creating a reference delegate. This\n * allows both the delegate and this instance to have strong references to\n * each other without having nullable fields that would then need to be\n * checked or asserted on every access.\n */\n constructor(\n referenceDelegateFactory: (p: MemoryPersistence) => MemoryReferenceDelegate,\n serializer: JsonProtoSerializer\n ) {\n this._started = true;\n this.globalsCache = new MemoryGlobalsCache();\n this.referenceDelegate = referenceDelegateFactory(this);\n this.targetCache = new MemoryTargetCache(this);\n const sizer = (doc: Document): number =>\n this.referenceDelegate.documentSize(doc);\n this.indexManager = new MemoryIndexManager();\n this.remoteDocumentCache = newMemoryRemoteDocumentCache(sizer);\n this.serializer = new LocalSerializer(serializer);\n this.bundleCache = new MemoryBundleCache(this.serializer);\n }\n\n start(): Promise {\n return Promise.resolve();\n }\n\n shutdown(): Promise {\n // No durable state to ensure is closed on shutdown.\n this._started = false;\n return Promise.resolve();\n }\n\n get started(): boolean {\n return this._started;\n }\n\n setDatabaseDeletedListener(): void {\n // No op.\n }\n\n setNetworkEnabled(): void {\n // No op.\n }\n\n getIndexManager(user: User): MemoryIndexManager {\n // We do not currently support indices for memory persistence, so we can\n // return the same shared instance of the memory index manager.\n return this.indexManager;\n }\n\n getDocumentOverlayCache(user: User): DocumentOverlayCache {\n let overlay = this.overlays[user.toKey()];\n if (!overlay) {\n overlay = new MemoryDocumentOverlayCache();\n this.overlays[user.toKey()] = overlay;\n }\n return overlay;\n }\n\n getMutationQueue(user: User, indexManager: IndexManager): MutationQueue {\n let queue = this.mutationQueues[user.toKey()];\n if (!queue) {\n queue = new MemoryMutationQueue(indexManager, this.referenceDelegate);\n this.mutationQueues[user.toKey()] = queue;\n }\n return queue;\n }\n\n getGlobalsCache(): GlobalsCache {\n return this.globalsCache;\n }\n\n getTargetCache(): MemoryTargetCache {\n return this.targetCache;\n }\n\n getRemoteDocumentCache(): MemoryRemoteDocumentCache {\n return this.remoteDocumentCache;\n }\n\n getBundleCache(): MemoryBundleCache {\n return this.bundleCache;\n }\n\n runTransaction(\n action: string,\n mode: PersistenceTransactionMode,\n transactionOperation: (\n transaction: PersistenceTransaction\n ) => PersistencePromise\n ): Promise {\n logDebug(LOG_TAG, 'Starting transaction:', action);\n const txn = new MemoryTransaction(this.listenSequence.next());\n this.referenceDelegate.onTransactionStarted();\n return transactionOperation(txn)\n .next(result => {\n return this.referenceDelegate\n .onTransactionCommitted(txn)\n .next(() => result);\n })\n .toPromise()\n .then(result => {\n txn.raiseOnCommittedEvent();\n return result;\n });\n }\n\n mutationQueuesContainKey(\n transaction: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n return PersistencePromise.or(\n Object.values(this.mutationQueues).map(\n queue => () => queue.containsKey(transaction, key)\n )\n );\n }\n}\n\n/**\n * Memory persistence is not actually transactional, but future implementations\n * may have transaction-scoped state.\n */\nexport class MemoryTransaction extends PersistenceTransaction {\n constructor(readonly currentSequenceNumber: ListenSequenceNumber) {\n super();\n }\n}\n\nexport interface MemoryReferenceDelegate extends ReferenceDelegate {\n documentSize(doc: Document): number;\n onTransactionStarted(): void;\n onTransactionCommitted(txn: PersistenceTransaction): PersistencePromise;\n}\n\nexport class MemoryEagerDelegate implements MemoryReferenceDelegate {\n /** Tracks all documents that are active in Query views. */\n private localViewReferences: ReferenceSet = new ReferenceSet();\n /** The list of documents that are potentially GCed after each transaction. */\n private _orphanedDocuments: Set | null = null;\n\n private constructor(private readonly persistence: MemoryPersistence) {}\n\n static factory(persistence: MemoryPersistence): MemoryEagerDelegate {\n return new MemoryEagerDelegate(persistence);\n }\n\n private get orphanedDocuments(): Set {\n if (!this._orphanedDocuments) {\n throw fail('orphanedDocuments is only valid during a transaction.');\n } else {\n return this._orphanedDocuments;\n }\n }\n\n addReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise {\n this.localViewReferences.addReference(key, targetId);\n this.orphanedDocuments.delete(key.toString());\n return PersistencePromise.resolve();\n }\n\n removeReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise {\n this.localViewReferences.removeReference(key, targetId);\n this.orphanedDocuments.add(key.toString());\n return PersistencePromise.resolve();\n }\n\n markPotentiallyOrphaned(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n this.orphanedDocuments.add(key.toString());\n return PersistencePromise.resolve();\n }\n\n removeTarget(\n txn: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise {\n const orphaned = this.localViewReferences.removeReferencesForId(\n targetData.targetId\n );\n orphaned.forEach(key => this.orphanedDocuments.add(key.toString()));\n const cache = this.persistence.getTargetCache();\n return cache\n .getMatchingKeysForTargetId(txn, targetData.targetId)\n .next(keys => {\n keys.forEach(key => this.orphanedDocuments.add(key.toString()));\n })\n .next(() => cache.removeTargetData(txn, targetData));\n }\n\n onTransactionStarted(): void {\n this._orphanedDocuments = new Set();\n }\n\n onTransactionCommitted(\n txn: PersistenceTransaction\n ): PersistencePromise {\n // Remove newly orphaned documents.\n const cache = this.persistence.getRemoteDocumentCache();\n const changeBuffer = cache.newChangeBuffer();\n return PersistencePromise.forEach(\n this.orphanedDocuments,\n (path: string) => {\n const key = DocumentKey.fromPath(path);\n return this.isReferenced(txn, key).next(isReferenced => {\n if (!isReferenced) {\n changeBuffer.removeEntry(key, SnapshotVersion.min());\n }\n });\n }\n ).next(() => {\n this._orphanedDocuments = null;\n return changeBuffer.apply(txn);\n });\n }\n\n updateLimboDocument(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n return this.isReferenced(txn, key).next(isReferenced => {\n if (isReferenced) {\n this.orphanedDocuments.delete(key.toString());\n } else {\n this.orphanedDocuments.add(key.toString());\n }\n });\n }\n\n documentSize(doc: Document): number {\n // For eager GC, we don't care about the document size, there are no size thresholds.\n return 0;\n }\n\n private isReferenced(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n return PersistencePromise.or([\n () =>\n PersistencePromise.resolve(this.localViewReferences.containsKey(key)),\n () => this.persistence.getTargetCache().containsKey(txn, key),\n () => this.persistence.mutationQueuesContainKey(txn, key)\n ]);\n }\n}\n\nexport class MemoryLruDelegate implements ReferenceDelegate, LruDelegate {\n private orphanedSequenceNumbers: ObjectMap<\n DocumentKey,\n ListenSequenceNumber\n > = new ObjectMap(\n k => encodeResourcePath(k.path),\n (l, r) => l.isEqual(r)\n );\n\n readonly garbageCollector: LruGarbageCollector;\n\n constructor(\n private readonly persistence: MemoryPersistence,\n lruParams: LruParams\n ) {\n this.garbageCollector = newLruGarbageCollector(this, lruParams);\n }\n\n static factory(\n persistence: MemoryPersistence,\n lruParams: LruParams\n ): MemoryLruDelegate {\n return new MemoryLruDelegate(persistence, lruParams);\n }\n\n // No-ops, present so memory persistence doesn't have to care which delegate\n // it has.\n onTransactionStarted(): void {}\n\n onTransactionCommitted(\n txn: PersistenceTransaction\n ): PersistencePromise {\n return PersistencePromise.resolve();\n }\n\n forEachTarget(\n txn: PersistenceTransaction,\n f: (q: TargetData) => void\n ): PersistencePromise {\n return this.persistence.getTargetCache().forEachTarget(txn, f);\n }\n\n getSequenceNumberCount(\n txn: PersistenceTransaction\n ): PersistencePromise {\n const docCountPromise = this.orphanedDocumentCount(txn);\n const targetCountPromise = this.persistence\n .getTargetCache()\n .getTargetCount(txn);\n return targetCountPromise.next(targetCount =>\n docCountPromise.next(docCount => targetCount + docCount)\n );\n }\n\n private orphanedDocumentCount(\n txn: PersistenceTransaction\n ): PersistencePromise {\n let orphanedCount = 0;\n return this.forEachOrphanedDocumentSequenceNumber(txn, _ => {\n orphanedCount++;\n }).next(() => orphanedCount);\n }\n\n forEachOrphanedDocumentSequenceNumber(\n txn: PersistenceTransaction,\n f: (sequenceNumber: ListenSequenceNumber) => void\n ): PersistencePromise {\n return PersistencePromise.forEach(\n this.orphanedSequenceNumbers,\n (key, sequenceNumber) => {\n // Pass in the exact sequence number as the upper bound so we know it won't be pinned by\n // being too recent.\n return this.isPinned(txn, key, sequenceNumber).next(isPinned => {\n if (!isPinned) {\n return f(sequenceNumber);\n } else {\n return PersistencePromise.resolve();\n }\n });\n }\n );\n }\n\n removeTargets(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber,\n activeTargetIds: ActiveTargets\n ): PersistencePromise {\n return this.persistence\n .getTargetCache()\n .removeTargets(txn, upperBound, activeTargetIds);\n }\n\n removeOrphanedDocuments(\n txn: PersistenceTransaction,\n upperBound: ListenSequenceNumber\n ): PersistencePromise {\n let count = 0;\n const cache = this.persistence.getRemoteDocumentCache();\n const changeBuffer = cache.newChangeBuffer();\n const p = cache.forEachDocumentKey(txn, key => {\n return this.isPinned(txn, key, upperBound).next(isPinned => {\n if (!isPinned) {\n count++;\n changeBuffer.removeEntry(key, SnapshotVersion.min());\n }\n });\n });\n return p.next(() => changeBuffer.apply(txn)).next(() => count);\n }\n\n markPotentiallyOrphaned(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n removeTarget(\n txn: PersistenceTransaction,\n targetData: TargetData\n ): PersistencePromise {\n const updated = targetData.withSequenceNumber(txn.currentSequenceNumber);\n return this.persistence.getTargetCache().updateTargetData(txn, updated);\n }\n\n addReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n removeReference(\n txn: PersistenceTransaction,\n targetId: TargetId,\n key: DocumentKey\n ): PersistencePromise {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n updateLimboDocument(\n txn: PersistenceTransaction,\n key: DocumentKey\n ): PersistencePromise {\n this.orphanedSequenceNumbers.set(key, txn.currentSequenceNumber);\n return PersistencePromise.resolve();\n }\n\n documentSize(document: Document): number {\n let documentSize = document.key.toString().length;\n if (document.isFoundDocument()) {\n documentSize += estimateByteSize(document.data.value);\n }\n return documentSize;\n }\n\n private isPinned(\n txn: PersistenceTransaction,\n key: DocumentKey,\n upperBound: ListenSequenceNumber\n ): PersistencePromise {\n return PersistencePromise.or([\n () => this.persistence.mutationQueuesContainKey(txn, key),\n () => this.persistence.getTargetCache().containsKey(txn, key),\n () => {\n const orphanedAt = this.orphanedSequenceNumbers.get(key);\n return PersistencePromise.resolve(\n orphanedAt !== undefined && orphanedAt > upperBound\n );\n }\n ]);\n }\n\n getCacheSize(txn: PersistenceTransaction): PersistencePromise {\n return this.persistence.getRemoteDocumentCache().getSize(txn);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { TargetId } from '../core/types';\nimport { ChangeType, ViewSnapshot } from '../core/view_snapshot';\nimport { documentKeySet, DocumentKeySet } from '../model/collections';\n\n/**\n * A set of changes to what documents are currently in view and out of view for\n * a given query. These changes are sent to the LocalStore by the View (via\n * the SyncEngine) and are used to pin / unpin documents as appropriate.\n */\nexport class LocalViewChanges {\n constructor(\n readonly targetId: TargetId,\n readonly fromCache: boolean,\n readonly addedKeys: DocumentKeySet,\n readonly removedKeys: DocumentKeySet\n ) {}\n\n static fromSnapshot(\n targetId: TargetId,\n viewSnapshot: ViewSnapshot\n ): LocalViewChanges {\n let addedKeys = documentKeySet();\n let removedKeys = documentKeySet();\n\n for (const docChange of viewSnapshot.docChanges) {\n switch (docChange.type) {\n case ChangeType.Added:\n addedKeys = addedKeys.add(docChange.doc.key);\n break;\n case ChangeType.Removed:\n removedKeys = removedKeys.add(docChange.doc.key);\n break;\n default:\n // do nothing\n }\n }\n\n return new LocalViewChanges(\n targetId,\n viewSnapshot.fromCache,\n addedKeys,\n removedKeys\n );\n }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * A tracker to keep a record of important details during database local query\n * execution.\n */\nexport class QueryContext {\n /**\n * Counts the number of documents passed through during local query execution.\n */\n private _documentReadCount = 0;\n\n get documentReadCount(): number {\n return this._documentReadCount;\n }\n\n incrementDocumentReadCount(amount: number): void {\n this._documentReadCount += amount;\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getUA, isSafari } from '@firebase/util';\n\nimport {\n LimitType,\n newQueryComparator,\n Query,\n queryMatches,\n queryMatchesAllDocuments,\n queryToTarget,\n queryWithLimit,\n stringifyQuery\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport {\n documentKeySet,\n DocumentKeySet,\n DocumentMap\n} from '../model/collections';\nimport { Document } from '../model/document';\nimport {\n IndexOffset,\n INITIAL_LARGEST_BATCH_ID,\n newIndexOffsetSuccessorFromReadTime\n} from '../model/field_index';\nimport { debugAssert } from '../util/assert';\nimport { getLogLevel, logDebug, LogLevel } from '../util/log';\nimport { Iterable } from '../util/misc';\nimport { SortedSet } from '../util/sorted_set';\n\nimport { IndexManager, IndexType } from './index_manager';\nimport { LocalDocumentsView } from './local_documents_view';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { QueryContext } from './query_context';\nimport { getAndroidVersion } from './simple_db';\n\nconst DEFAULT_INDEX_AUTO_CREATION_MIN_COLLECTION_SIZE = 100;\n\n/**\n * This cost represents the evaluation result of\n * (([index, docKey] + [docKey, docContent]) per document in the result set)\n * / ([docKey, docContent] per documents in full collection scan) coming from\n * experiment [enter PR experiment URL here].\n */\nfunction getDefaultRelativeIndexReadCostPerDocument(): number {\n // These values were derived from an experiment where several members of the\n // Firestore SDK team ran a performance test in various environments.\n // Googlers can see b/299284287 for details.\n if (isSafari()) {\n return 8;\n } else if (getAndroidVersion(getUA()) > 0) {\n return 6;\n } else {\n return 4;\n }\n}\n\n/**\n * The Firestore query engine.\n *\n * Firestore queries can be executed in three modes. The Query Engine determines\n * what mode to use based on what data is persisted. The mode only determines\n * the runtime complexity of the query - the result set is equivalent across all\n * implementations.\n *\n * The Query engine will use indexed-based execution if a user has configured\n * any index that can be used to execute query (via `setIndexConfiguration()`).\n * Otherwise, the engine will try to optimize the query by re-using a previously\n * persisted query result. If that is not possible, the query will be executed\n * via a full collection scan.\n *\n * Index-based execution is the default when available. The query engine\n * supports partial indexed execution and merges the result from the index\n * lookup with documents that have not yet been indexed. The index evaluation\n * matches the backend's format and as such, the SDK can use indexing for all\n * queries that the backend supports.\n *\n * If no index exists, the query engine tries to take advantage of the target\n * document mapping in the TargetCache. These mappings exists for all queries\n * that have been synced with the backend at least once and allow the query\n * engine to only read documents that previously matched a query plus any\n * documents that were edited after the query was last listened to.\n *\n * There are some cases when this optimization is not guaranteed to produce\n * the same results as full collection scans. In these cases, query\n * processing falls back to full scans. These cases are:\n *\n * - Limit queries where a document that matched the query previously no longer\n * matches the query.\n *\n * - Limit queries where a document edit may cause the document to sort below\n * another document that is in the local cache.\n *\n * - Queries that have never been CURRENT or free of limbo documents.\n */\nexport class QueryEngine {\n private localDocumentsView!: LocalDocumentsView;\n private indexManager!: IndexManager;\n private initialized = false;\n\n indexAutoCreationEnabled = false;\n\n /**\n * SDK only decides whether it should create index when collection size is\n * larger than this.\n */\n indexAutoCreationMinCollectionSize =\n DEFAULT_INDEX_AUTO_CREATION_MIN_COLLECTION_SIZE;\n\n relativeIndexReadCostPerDocument =\n getDefaultRelativeIndexReadCostPerDocument();\n\n /** Sets the document view to query against. */\n initialize(\n localDocuments: LocalDocumentsView,\n indexManager: IndexManager\n ): void {\n this.localDocumentsView = localDocuments;\n this.indexManager = indexManager;\n this.initialized = true;\n }\n\n /** Returns all local documents matching the specified query. */\n getDocumentsMatchingQuery(\n transaction: PersistenceTransaction,\n query: Query,\n lastLimboFreeSnapshotVersion: SnapshotVersion,\n remoteKeys: DocumentKeySet\n ): PersistencePromise {\n debugAssert(this.initialized, 'initialize() not called');\n\n // Stores the result from executing the query; using this object is more\n // convenient than passing the result between steps of the persistence\n // transaction and improves readability comparatively.\n const queryResult: { result: DocumentMap | null } = { result: null };\n\n return this.performQueryUsingIndex(transaction, query)\n .next(result => {\n queryResult.result = result;\n })\n .next(() => {\n if (queryResult.result) {\n return;\n }\n return this.performQueryUsingRemoteKeys(\n transaction,\n query,\n remoteKeys,\n lastLimboFreeSnapshotVersion\n ).next(result => {\n queryResult.result = result;\n });\n })\n .next(() => {\n if (queryResult.result) {\n return;\n }\n const context = new QueryContext();\n return this.executeFullCollectionScan(transaction, query, context).next(\n result => {\n queryResult.result = result;\n if (this.indexAutoCreationEnabled) {\n return this.createCacheIndexes(\n transaction,\n query,\n context,\n result.size\n );\n }\n }\n );\n })\n .next(() => queryResult.result!);\n }\n\n createCacheIndexes(\n transaction: PersistenceTransaction,\n query: Query,\n context: QueryContext,\n resultSize: number\n ): PersistencePromise {\n if (context.documentReadCount < this.indexAutoCreationMinCollectionSize) {\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'SDK will not create cache indexes for query:',\n stringifyQuery(query),\n 'since it only creates cache indexes for collection contains',\n 'more than or equal to',\n this.indexAutoCreationMinCollectionSize,\n 'documents'\n );\n }\n return PersistencePromise.resolve();\n }\n\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'Query:',\n stringifyQuery(query),\n 'scans',\n context.documentReadCount,\n 'local documents and returns',\n resultSize,\n 'documents as results.'\n );\n }\n\n if (\n context.documentReadCount >\n this.relativeIndexReadCostPerDocument * resultSize\n ) {\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'The SDK decides to create cache indexes for query:',\n stringifyQuery(query),\n 'as using cache indexes may help improve performance.'\n );\n }\n return this.indexManager.createTargetIndexes(\n transaction,\n queryToTarget(query)\n );\n }\n\n return PersistencePromise.resolve();\n }\n\n /**\n * Performs an indexed query that evaluates the query based on a collection's\n * persisted index values. Returns `null` if an index is not available.\n */\n private performQueryUsingIndex(\n transaction: PersistenceTransaction,\n query: Query\n ): PersistencePromise {\n if (queryMatchesAllDocuments(query)) {\n // Queries that match all documents don't benefit from using\n // key-based lookups. It is more efficient to scan all documents in a\n // collection, rather than to perform individual lookups.\n return PersistencePromise.resolve(null);\n }\n\n let target = queryToTarget(query);\n return this.indexManager\n .getIndexType(transaction, target)\n .next(indexType => {\n if (indexType === IndexType.NONE) {\n // The target cannot be served from any index.\n return null;\n }\n\n if (query.limit !== null && indexType === IndexType.PARTIAL) {\n // We cannot apply a limit for targets that are served using a partial\n // index. If a partial index will be used to serve the target, the\n // query may return a superset of documents that match the target\n // (e.g. if the index doesn't include all the target's filters), or\n // may return the correct set of documents in the wrong order (e.g. if\n // the index doesn't include a segment for one of the orderBys).\n // Therefore, a limit should not be applied in such cases.\n query = queryWithLimit(query, null, LimitType.First);\n target = queryToTarget(query);\n }\n\n return this.indexManager\n .getDocumentsMatchingTarget(transaction, target)\n .next(keys => {\n debugAssert(\n !!keys,\n 'Index manager must return results for partial and full indexes.'\n );\n const sortedKeys = documentKeySet(...keys);\n return this.localDocumentsView\n .getDocuments(transaction, sortedKeys)\n .next(indexedDocuments => {\n return this.indexManager\n .getMinOffset(transaction, target)\n .next(offset => {\n const previousResults = this.applyQuery(\n query,\n indexedDocuments\n );\n\n if (\n this.needsRefill(\n query,\n previousResults,\n sortedKeys,\n offset.readTime\n )\n ) {\n // A limit query whose boundaries change due to local\n // edits can be re-run against the cache by excluding the\n // limit. This ensures that all documents that match the\n // query's filters are included in the result set. The SDK\n // can then apply the limit once all local edits are\n // incorporated.\n return this.performQueryUsingIndex(\n transaction,\n queryWithLimit(query, null, LimitType.First)\n );\n }\n\n return this.appendRemainingResults(\n transaction,\n previousResults,\n query,\n offset\n ) as PersistencePromise;\n });\n });\n });\n });\n }\n\n /**\n * Performs a query based on the target's persisted query mapping. Returns\n * `null` if the mapping is not available or cannot be used.\n */\n private performQueryUsingRemoteKeys(\n transaction: PersistenceTransaction,\n query: Query,\n remoteKeys: DocumentKeySet,\n lastLimboFreeSnapshotVersion: SnapshotVersion\n ): PersistencePromise {\n if (queryMatchesAllDocuments(query)) {\n // Queries that match all documents don't benefit from using\n // key-based lookups. It is more efficient to scan all documents in a\n // collection, rather than to perform individual lookups.\n return PersistencePromise.resolve(null);\n }\n\n // Queries that have never seen a snapshot without limbo free documents\n // should also be run as a full collection scan.\n if (lastLimboFreeSnapshotVersion.isEqual(SnapshotVersion.min())) {\n return PersistencePromise.resolve(null);\n }\n\n return this.localDocumentsView!.getDocuments(transaction, remoteKeys).next(\n documents => {\n const previousResults = this.applyQuery(query, documents);\n\n if (\n this.needsRefill(\n query,\n previousResults,\n remoteKeys,\n lastLimboFreeSnapshotVersion\n )\n ) {\n return PersistencePromise.resolve(null);\n }\n\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'Re-using previous result from %s to execute query: %s',\n lastLimboFreeSnapshotVersion.toString(),\n stringifyQuery(query)\n );\n }\n\n // Retrieve all results for documents that were updated since the last\n // limbo-document free remote snapshot.\n return this.appendRemainingResults(\n transaction,\n previousResults,\n query,\n newIndexOffsetSuccessorFromReadTime(\n lastLimboFreeSnapshotVersion,\n INITIAL_LARGEST_BATCH_ID\n )\n ).next(results => results);\n }\n );\n }\n\n /** Applies the query filter and sorting to the provided documents. */\n private applyQuery(\n query: Query,\n documents: DocumentMap\n ): SortedSet {\n // Sort the documents and re-apply the query filter since previously\n // matching documents do not necessarily still match the query.\n let queryResults = new SortedSet(newQueryComparator(query));\n documents.forEach((_, maybeDoc) => {\n if (queryMatches(query, maybeDoc)) {\n queryResults = queryResults.add(maybeDoc);\n }\n });\n return queryResults;\n }\n\n /**\n * Determines if a limit query needs to be refilled from cache, making it\n * ineligible for index-free execution.\n *\n * @param query - The query.\n * @param sortedPreviousResults - The documents that matched the query when it\n * was last synchronized, sorted by the query's comparator.\n * @param remoteKeys - The document keys that matched the query at the last\n * snapshot.\n * @param limboFreeSnapshotVersion - The version of the snapshot when the\n * query was last synchronized.\n */\n private needsRefill(\n query: Query,\n sortedPreviousResults: SortedSet,\n remoteKeys: DocumentKeySet,\n limboFreeSnapshotVersion: SnapshotVersion\n ): boolean {\n if (query.limit === null) {\n // Queries without limits do not need to be refilled.\n return false;\n }\n\n if (remoteKeys.size !== sortedPreviousResults.size) {\n // The query needs to be refilled if a previously matching document no\n // longer matches.\n return true;\n }\n\n // Limit queries are not eligible for index-free query execution if there is\n // a potential that an older document from cache now sorts before a document\n // that was previously part of the limit. This, however, can only happen if\n // the document at the edge of the limit goes out of limit.\n // If a document that is not the limit boundary sorts differently,\n // the boundary of the limit itself did not change and documents from cache\n // will continue to be \"rejected\" by this boundary. Therefore, we can ignore\n // any modifications that don't affect the last document.\n const docAtLimitEdge =\n query.limitType === LimitType.First\n ? sortedPreviousResults.last()\n : sortedPreviousResults.first();\n if (!docAtLimitEdge) {\n // We don't need to refill the query if there were already no documents.\n return false;\n }\n return (\n docAtLimitEdge.hasPendingWrites ||\n docAtLimitEdge.version.compareTo(limboFreeSnapshotVersion) > 0\n );\n }\n\n private executeFullCollectionScan(\n transaction: PersistenceTransaction,\n query: Query,\n context: QueryContext\n ): PersistencePromise {\n if (getLogLevel() <= LogLevel.DEBUG) {\n logDebug(\n 'QueryEngine',\n 'Using full collection scan to execute query:',\n stringifyQuery(query)\n );\n }\n\n return this.localDocumentsView!.getDocumentsMatchingQuery(\n transaction,\n query,\n IndexOffset.min(),\n context\n );\n }\n\n /**\n * Combines the results from an indexed execution with the remaining documents\n * that have not yet been indexed.\n */\n private appendRemainingResults(\n transaction: PersistenceTransaction,\n indexedResults: Iterable,\n query: Query,\n offset: IndexOffset\n ): PersistencePromise {\n // Retrieve all results for documents that were updated since the offset.\n return this.localDocumentsView\n .getDocumentsMatchingQuery(transaction, query, offset)\n .next(remainingResults => {\n // Merge with existing results\n indexedResults.forEach(d => {\n remainingResults = remainingResults.insert(d.key, d);\n });\n return remainingResults;\n });\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { BundleConverter, BundledDocuments, NamedQuery } from '../core/bundle';\nimport {\n newQueryForPath,\n Query,\n queryCollectionGroup,\n queryToTarget\n} from '../core/query';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { canonifyTarget, Target, targetEquals } from '../core/target';\nimport { BatchId, TargetId } from '../core/types';\nimport { Timestamp } from '../lite-api/timestamp';\nimport {\n convertOverlayedDocumentMapToDocumentMap,\n documentKeySet,\n DocumentKeySet,\n DocumentMap,\n mutableDocumentMap,\n MutableDocumentMap,\n OverlayedDocumentMap\n} from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n FieldIndex,\n fieldIndexSemanticComparator,\n INITIAL_LARGEST_BATCH_ID,\n newIndexOffsetSuccessorFromReadTime\n} from '../model/field_index';\nimport {\n mutationExtractBaseValue,\n Mutation,\n PatchMutation,\n Precondition\n} from '../model/mutation';\nimport { MutationBatch, MutationBatchResult } from '../model/mutation_batch';\nimport { extractFieldMask } from '../model/object_value';\nimport { ResourcePath } from '../model/path';\nimport {\n BundleMetadata,\n NamedQuery as ProtoNamedQuery\n} from '../protos/firestore_bundle_proto';\nimport { RemoteEvent, TargetChange } from '../remote/remote_event';\nimport { fromVersion, JsonProtoSerializer } from '../remote/serializer';\nimport { diffArrays } from '../util/array';\nimport { debugAssert, debugCast, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { logDebug } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { SortedMap } from '../util/sorted_map';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { BundleCache } from './bundle_cache';\nimport { DocumentOverlayCache } from './document_overlay_cache';\nimport { IndexManager } from './index_manager';\nimport { IndexedDbMutationQueue } from './indexeddb_mutation_queue';\nimport { IndexedDbPersistence } from './indexeddb_persistence';\nimport { IndexedDbTargetCache } from './indexeddb_target_cache';\nimport { LocalDocumentsView } from './local_documents_view';\nimport { fromBundledQuery } from './local_serializer';\nimport { LocalStore } from './local_store';\nimport { LocalViewChanges } from './local_view_changes';\nimport { LruGarbageCollector, LruResults } from './lru_garbage_collector';\nimport { MutationQueue } from './mutation_queue';\nimport { Persistence } from './persistence';\nimport { PersistencePromise } from './persistence_promise';\nimport { PersistenceTransaction } from './persistence_transaction';\nimport { QueryEngine } from './query_engine';\nimport { RemoteDocumentCache } from './remote_document_cache';\nimport { RemoteDocumentChangeBuffer } from './remote_document_change_buffer';\nimport { ClientId } from './shared_client_state';\nimport { isIndexedDbTransactionError } from './simple_db';\nimport { TargetCache } from './target_cache';\nimport { TargetData, TargetPurpose } from './target_data';\n\nexport const LOG_TAG = 'LocalStore';\n\n/**\n * The maximum time to leave a resume token buffered without writing it out.\n * This value is arbitrary: it's long enough to avoid several writes\n * (possibly indefinitely if updates come more frequently than this) but\n * short enough that restarting after crashing will still have a pretty\n * recent resume token.\n */\nconst RESUME_TOKEN_MAX_AGE_MICROS = 5 * 60 * 1e6;\n\n/** The result of a write to the local store. */\nexport interface LocalWriteResult {\n batchId: BatchId;\n changes: DocumentMap;\n}\n\n/** The result of a user-change operation in the local store. */\nexport interface UserChangeResult {\n readonly affectedDocuments: DocumentMap;\n readonly removedBatchIds: BatchId[];\n readonly addedBatchIds: BatchId[];\n}\n\n/** The result of executing a query against the local store. */\nexport interface QueryResult {\n readonly documents: DocumentMap;\n readonly remoteKeys: DocumentKeySet;\n}\n\n/**\n * Implements `LocalStore` interface.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass LocalStoreImpl implements LocalStore {\n /**\n * The set of all mutations that have been sent but not yet been applied to\n * the backend.\n */\n mutationQueue!: MutationQueue;\n\n /**\n * The overlays that can be used to short circuit applying all mutations from\n * mutation queue.\n */\n documentOverlayCache!: DocumentOverlayCache;\n\n /** The set of all cached remote documents. */\n remoteDocuments: RemoteDocumentCache;\n\n /**\n * The \"local\" view of all documents (layering mutationQueue on top of\n * remoteDocumentCache).\n */\n localDocuments!: LocalDocumentsView;\n\n /** Manages the list of active field and collection indices. */\n indexManager!: IndexManager;\n\n /** The set of all cached bundle metadata and named queries. */\n bundleCache: BundleCache;\n\n /** Maps a target to its `TargetData`. */\n targetCache: TargetCache;\n\n /**\n * Maps a targetID to data about its target.\n *\n * PORTING NOTE: We are using an immutable data structure on Web to make re-runs\n * of `applyRemoteEvent()` idempotent.\n */\n targetDataByTarget = new SortedMap(primitiveComparator);\n\n /** Maps a target to its targetID. */\n // TODO(wuandy): Evaluate if TargetId can be part of Target.\n targetIdByTarget = new ObjectMap(\n t => canonifyTarget(t),\n targetEquals\n );\n\n /**\n * A per collection group index of the last read time processed by\n * `getNewDocumentChanges()`.\n *\n * PORTING NOTE: This is only used for multi-tab synchronization.\n */\n collectionGroupReadTime = new Map();\n\n constructor(\n /** Manages our in-memory or durable persistence. */\n readonly persistence: Persistence,\n readonly queryEngine: QueryEngine,\n initialUser: User,\n readonly serializer: JsonProtoSerializer\n ) {\n debugAssert(\n persistence.started,\n 'LocalStore was passed an unstarted persistence implementation'\n );\n this.remoteDocuments = persistence.getRemoteDocumentCache();\n this.targetCache = persistence.getTargetCache();\n this.bundleCache = persistence.getBundleCache();\n\n this.initializeUserComponents(initialUser);\n }\n\n initializeUserComponents(user: User): void {\n // TODO(indexing): Add spec tests that test these components change after a\n // user change\n this.documentOverlayCache = this.persistence.getDocumentOverlayCache(user);\n this.indexManager = this.persistence.getIndexManager(user);\n this.mutationQueue = this.persistence.getMutationQueue(\n user,\n this.indexManager\n );\n this.localDocuments = new LocalDocumentsView(\n this.remoteDocuments,\n this.mutationQueue,\n this.documentOverlayCache,\n this.indexManager\n );\n this.remoteDocuments.setIndexManager(this.indexManager);\n this.queryEngine.initialize(this.localDocuments, this.indexManager);\n }\n\n collectGarbage(garbageCollector: LruGarbageCollector): Promise {\n return this.persistence.runTransaction(\n 'Collect garbage',\n 'readwrite-primary',\n txn => garbageCollector.collect(txn, this.targetDataByTarget)\n );\n }\n}\n\ninterface DocumentChangeResult {\n changedDocuments: MutableDocumentMap;\n existenceChangedKeys: DocumentKeySet;\n}\n\nexport function newLocalStore(\n /** Manages our in-memory or durable persistence. */\n persistence: Persistence,\n queryEngine: QueryEngine,\n initialUser: User,\n serializer: JsonProtoSerializer\n): LocalStore {\n return new LocalStoreImpl(persistence, queryEngine, initialUser, serializer);\n}\n\n/**\n * Tells the LocalStore that the currently authenticated user has changed.\n *\n * In response the local store switches the mutation queue to the new user and\n * returns any resulting document changes.\n */\n// PORTING NOTE: Android and iOS only return the documents affected by the\n// change.\nexport async function localStoreHandleUserChange(\n localStore: LocalStore,\n user: User\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n\n const result = await localStoreImpl.persistence.runTransaction(\n 'Handle user change',\n 'readonly',\n txn => {\n // Swap out the mutation queue, grabbing the pending mutation batches\n // before and after.\n let oldBatches: MutationBatch[];\n return localStoreImpl.mutationQueue\n .getAllMutationBatches(txn)\n .next(promisedOldBatches => {\n oldBatches = promisedOldBatches;\n localStoreImpl.initializeUserComponents(user);\n return localStoreImpl.mutationQueue.getAllMutationBatches(txn);\n })\n .next(newBatches => {\n const removedBatchIds: BatchId[] = [];\n const addedBatchIds: BatchId[] = [];\n\n // Union the old/new changed keys.\n let changedKeys = documentKeySet();\n\n for (const batch of oldBatches) {\n removedBatchIds.push(batch.batchId);\n for (const mutation of batch.mutations) {\n changedKeys = changedKeys.add(mutation.key);\n }\n }\n\n for (const batch of newBatches) {\n addedBatchIds.push(batch.batchId);\n for (const mutation of batch.mutations) {\n changedKeys = changedKeys.add(mutation.key);\n }\n }\n\n // Return the set of all (potentially) changed documents and the list\n // of mutation batch IDs that were affected by change.\n return localStoreImpl.localDocuments\n .getDocuments(txn, changedKeys)\n .next(affectedDocuments => {\n return {\n affectedDocuments,\n removedBatchIds,\n addedBatchIds\n };\n });\n });\n }\n );\n\n return result;\n}\n\n/* Accepts locally generated Mutations and commit them to storage. */\nexport function localStoreWriteLocally(\n localStore: LocalStore,\n mutations: Mutation[]\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const localWriteTime = Timestamp.now();\n const keys = mutations.reduce((keys, m) => keys.add(m.key), documentKeySet());\n\n let overlayedDocuments: OverlayedDocumentMap;\n let mutationBatch: MutationBatch;\n\n return localStoreImpl.persistence\n .runTransaction('Locally write mutations', 'readwrite', txn => {\n // Figure out which keys do not have a remote version in the cache, this\n // is needed to create the right overlay mutation: if no remote version\n // presents, we do not need to create overlays as patch mutations.\n // TODO(Overlay): Is there a better way to determine this? Using the\n // document version does not work because local mutations set them back\n // to 0.\n let remoteDocs = mutableDocumentMap();\n let docsWithoutRemoteVersion = documentKeySet();\n return localStoreImpl.remoteDocuments\n .getEntries(txn, keys)\n .next(docs => {\n remoteDocs = docs;\n remoteDocs.forEach((key, doc) => {\n if (!doc.isValidDocument()) {\n docsWithoutRemoteVersion = docsWithoutRemoteVersion.add(key);\n }\n });\n })\n .next(() => {\n // Load and apply all existing mutations. This lets us compute the\n // current base state for all non-idempotent transforms before applying\n // any additional user-provided writes.\n return localStoreImpl.localDocuments.getOverlayedDocuments(\n txn,\n remoteDocs\n );\n })\n .next((docs: OverlayedDocumentMap) => {\n overlayedDocuments = docs;\n\n // For non-idempotent mutations (such as `FieldValue.increment()`),\n // we record the base state in a separate patch mutation. This is\n // later used to guarantee consistent values and prevents flicker\n // even if the backend sends us an update that already includes our\n // transform.\n const baseMutations: Mutation[] = [];\n\n for (const mutation of mutations) {\n const baseValue = mutationExtractBaseValue(\n mutation,\n overlayedDocuments.get(mutation.key)!.overlayedDocument\n );\n if (baseValue != null) {\n // NOTE: The base state should only be applied if there's some\n // existing document to override, so use a Precondition of\n // exists=true\n baseMutations.push(\n new PatchMutation(\n mutation.key,\n baseValue,\n extractFieldMask(baseValue.value.mapValue),\n Precondition.exists(true)\n )\n );\n }\n }\n\n return localStoreImpl.mutationQueue.addMutationBatch(\n txn,\n localWriteTime,\n baseMutations,\n mutations\n );\n })\n .next(batch => {\n mutationBatch = batch;\n const overlays = batch.applyToLocalDocumentSet(\n overlayedDocuments,\n docsWithoutRemoteVersion\n );\n return localStoreImpl.documentOverlayCache.saveOverlays(\n txn,\n batch.batchId,\n overlays\n );\n });\n })\n .then(() => ({\n batchId: mutationBatch.batchId,\n changes: convertOverlayedDocumentMapToDocumentMap(overlayedDocuments)\n }));\n}\n\n/**\n * Acknowledges the given batch.\n *\n * On the happy path when a batch is acknowledged, the local store will\n *\n * + remove the batch from the mutation queue;\n * + apply the changes to the remote document cache;\n * + recalculate the latency compensated view implied by those changes (there\n * may be mutations in the queue that affect the documents but haven't been\n * acknowledged yet); and\n * + give the changed documents back the sync engine\n *\n * @returns The resulting (modified) documents.\n */\nexport function localStoreAcknowledgeBatch(\n localStore: LocalStore,\n batchResult: MutationBatchResult\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Acknowledge batch',\n 'readwrite-primary',\n txn => {\n const affected = batchResult.batch.keys();\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n return applyWriteToRemoteDocuments(\n localStoreImpl,\n txn,\n batchResult,\n documentBuffer\n )\n .next(() => documentBuffer.apply(txn))\n .next(() => localStoreImpl.mutationQueue.performConsistencyCheck(txn))\n .next(() =>\n localStoreImpl.documentOverlayCache.removeOverlaysForBatchId(\n txn,\n affected,\n batchResult.batch.batchId\n )\n )\n .next(() =>\n localStoreImpl.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(\n txn,\n getKeysWithTransformResults(batchResult)\n )\n )\n .next(() => localStoreImpl.localDocuments.getDocuments(txn, affected));\n }\n );\n}\n\nfunction getKeysWithTransformResults(\n batchResult: MutationBatchResult\n): DocumentKeySet {\n let result = documentKeySet();\n\n for (let i = 0; i < batchResult.mutationResults.length; ++i) {\n const mutationResult = batchResult.mutationResults[i];\n if (mutationResult.transformResults.length > 0) {\n result = result.add(batchResult.batch.mutations[i].key);\n }\n }\n return result;\n}\n\n/**\n * Removes mutations from the MutationQueue for the specified batch;\n * LocalDocuments will be recalculated.\n *\n * @returns The resulting modified documents.\n */\nexport function localStoreRejectBatch(\n localStore: LocalStore,\n batchId: BatchId\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Reject batch',\n 'readwrite-primary',\n txn => {\n let affectedKeys: DocumentKeySet;\n return localStoreImpl.mutationQueue\n .lookupMutationBatch(txn, batchId)\n .next((batch: MutationBatch | null) => {\n hardAssert(batch !== null, 'Attempt to reject nonexistent batch!');\n affectedKeys = batch.keys();\n return localStoreImpl.mutationQueue.removeMutationBatch(txn, batch);\n })\n .next(() => localStoreImpl.mutationQueue.performConsistencyCheck(txn))\n .next(() =>\n localStoreImpl.documentOverlayCache.removeOverlaysForBatchId(\n txn,\n affectedKeys,\n batchId\n )\n )\n .next(() =>\n localStoreImpl.localDocuments.recalculateAndSaveOverlaysForDocumentKeys(\n txn,\n affectedKeys\n )\n )\n .next(() =>\n localStoreImpl.localDocuments.getDocuments(txn, affectedKeys)\n );\n }\n );\n}\n\n/**\n * Returns the largest (latest) batch id in mutation queue that is pending\n * server response.\n *\n * Returns `BATCHID_UNKNOWN` if the queue is empty.\n */\nexport function localStoreGetHighestUnacknowledgedBatchId(\n localStore: LocalStore\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get highest unacknowledged batch id',\n 'readonly',\n txn => localStoreImpl.mutationQueue.getHighestUnacknowledgedBatchId(txn)\n );\n}\n\n/**\n * Returns the last consistent snapshot processed (used by the RemoteStore to\n * determine whether to buffer incoming snapshots from the backend).\n */\nexport function localStoreGetLastRemoteSnapshotVersion(\n localStore: LocalStore\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get last remote snapshot version',\n 'readonly',\n txn => localStoreImpl.targetCache.getLastRemoteSnapshotVersion(txn)\n );\n}\n\n/**\n * Updates the \"ground-state\" (remote) documents. We assume that the remote\n * event reflects any write batches that have been acknowledged or rejected\n * (i.e. we do not re-apply local mutations to updates from this event).\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nexport function localStoreApplyRemoteEventToLocalCache(\n localStore: LocalStore,\n remoteEvent: RemoteEvent\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const remoteVersion = remoteEvent.snapshotVersion;\n let newTargetDataByTargetMap = localStoreImpl.targetDataByTarget;\n\n return localStoreImpl.persistence\n .runTransaction('Apply remote event', 'readwrite-primary', txn => {\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n\n // Reset newTargetDataByTargetMap in case this transaction gets re-run.\n newTargetDataByTargetMap = localStoreImpl.targetDataByTarget;\n\n const promises = [] as Array>;\n remoteEvent.targetChanges.forEach((change, targetId) => {\n const oldTargetData = newTargetDataByTargetMap.get(targetId);\n if (!oldTargetData) {\n return;\n }\n\n // Only update the remote keys if the target is still active. This\n // ensures that we can persist the updated target data along with\n // the updated assignment.\n promises.push(\n localStoreImpl.targetCache\n .removeMatchingKeys(txn, change.removedDocuments, targetId)\n .next(() => {\n return localStoreImpl.targetCache.addMatchingKeys(\n txn,\n change.addedDocuments,\n targetId\n );\n })\n );\n\n let newTargetData = oldTargetData.withSequenceNumber(\n txn.currentSequenceNumber\n );\n if (remoteEvent.targetMismatches.get(targetId) !== null) {\n newTargetData = newTargetData\n .withResumeToken(\n ByteString.EMPTY_BYTE_STRING,\n SnapshotVersion.min()\n )\n .withLastLimboFreeSnapshotVersion(SnapshotVersion.min());\n } else if (change.resumeToken.approximateByteSize() > 0) {\n newTargetData = newTargetData.withResumeToken(\n change.resumeToken,\n remoteVersion\n );\n }\n\n newTargetDataByTargetMap = newTargetDataByTargetMap.insert(\n targetId,\n newTargetData\n );\n\n // Update the target data if there are target changes (or if\n // sufficient time has passed since the last update).\n if (shouldPersistTargetData(oldTargetData, newTargetData, change)) {\n promises.push(\n localStoreImpl.targetCache.updateTargetData(txn, newTargetData)\n );\n }\n });\n\n let changedDocs = mutableDocumentMap();\n let existenceChangedKeys = documentKeySet();\n remoteEvent.documentUpdates.forEach(key => {\n if (remoteEvent.resolvedLimboDocuments.has(key)) {\n promises.push(\n localStoreImpl.persistence.referenceDelegate.updateLimboDocument(\n txn,\n key\n )\n );\n }\n });\n\n // Each loop iteration only affects its \"own\" doc, so it's safe to get all\n // the remote documents in advance in a single call.\n promises.push(\n populateDocumentChangeBuffer(\n txn,\n documentBuffer,\n remoteEvent.documentUpdates\n ).next(result => {\n changedDocs = result.changedDocuments;\n existenceChangedKeys = result.existenceChangedKeys;\n })\n );\n\n // HACK: The only reason we allow a null snapshot version is so that we\n // can synthesize remote events when we get permission denied errors while\n // trying to resolve the state of a locally cached document that is in\n // limbo.\n if (!remoteVersion.isEqual(SnapshotVersion.min())) {\n const updateRemoteVersion = localStoreImpl.targetCache\n .getLastRemoteSnapshotVersion(txn)\n .next(lastRemoteSnapshotVersion => {\n debugAssert(\n remoteVersion.compareTo(lastRemoteSnapshotVersion) >= 0,\n 'Watch stream reverted to previous snapshot?? ' +\n remoteVersion +\n ' < ' +\n lastRemoteSnapshotVersion\n );\n return localStoreImpl.targetCache.setTargetsMetadata(\n txn,\n txn.currentSequenceNumber,\n remoteVersion\n );\n });\n promises.push(updateRemoteVersion);\n }\n\n return PersistencePromise.waitFor(promises)\n .next(() => documentBuffer.apply(txn))\n .next(() =>\n localStoreImpl.localDocuments.getLocalViewOfDocuments(\n txn,\n changedDocs,\n existenceChangedKeys\n )\n )\n .next(() => changedDocs);\n })\n .then(changedDocs => {\n localStoreImpl.targetDataByTarget = newTargetDataByTargetMap;\n return changedDocs;\n });\n}\n\n/**\n * Populates document change buffer with documents from backend or a bundle.\n * Returns the document changes resulting from applying those documents, and\n * also a set of documents whose existence state are changed as a result.\n *\n * @param txn - Transaction to use to read existing documents from storage.\n * @param documentBuffer - Document buffer to collect the resulted changes to be\n * applied to storage.\n * @param documents - Documents to be applied.\n */\nfunction populateDocumentChangeBuffer(\n txn: PersistenceTransaction,\n documentBuffer: RemoteDocumentChangeBuffer,\n documents: MutableDocumentMap\n): PersistencePromise {\n let updatedKeys = documentKeySet();\n let existenceChangedKeys = documentKeySet();\n documents.forEach(k => (updatedKeys = updatedKeys.add(k)));\n return documentBuffer.getEntries(txn, updatedKeys).next(existingDocs => {\n let changedDocuments = mutableDocumentMap();\n documents.forEach((key, doc) => {\n const existingDoc = existingDocs.get(key)!;\n\n // Check if see if there is a existence state change for this document.\n if (doc.isFoundDocument() !== existingDoc.isFoundDocument()) {\n existenceChangedKeys = existenceChangedKeys.add(key);\n }\n\n // Note: The order of the steps below is important, since we want\n // to ensure that rejected limbo resolutions (which fabricate\n // NoDocuments with SnapshotVersion.min()) never add documents to\n // cache.\n if (doc.isNoDocument() && doc.version.isEqual(SnapshotVersion.min())) {\n // NoDocuments with SnapshotVersion.min() are used in manufactured\n // events. We remove these documents from cache since we lost\n // access.\n documentBuffer.removeEntry(key, doc.readTime);\n changedDocuments = changedDocuments.insert(key, doc);\n } else if (\n !existingDoc.isValidDocument() ||\n doc.version.compareTo(existingDoc.version) > 0 ||\n (doc.version.compareTo(existingDoc.version) === 0 &&\n existingDoc.hasPendingWrites)\n ) {\n debugAssert(\n !SnapshotVersion.min().isEqual(doc.readTime),\n 'Cannot add a document when the remote version is zero'\n );\n documentBuffer.addEntry(doc);\n changedDocuments = changedDocuments.insert(key, doc);\n } else {\n logDebug(\n LOG_TAG,\n 'Ignoring outdated watch update for ',\n key,\n '. Current version:',\n existingDoc.version,\n ' Watch version:',\n doc.version\n );\n }\n });\n return { changedDocuments, existenceChangedKeys };\n });\n}\n\n/**\n * Returns true if the newTargetData should be persisted during an update of\n * an active target. TargetData should always be persisted when a target is\n * being released and should not call this function.\n *\n * While the target is active, TargetData updates can be omitted when nothing\n * about the target has changed except metadata like the resume token or\n * snapshot version. Occasionally it's worth the extra write to prevent these\n * values from getting too stale after a crash, but this doesn't have to be\n * too frequent.\n */\nfunction shouldPersistTargetData(\n oldTargetData: TargetData,\n newTargetData: TargetData,\n change: TargetChange\n): boolean {\n // Always persist target data if we don't already have a resume token.\n if (oldTargetData.resumeToken.approximateByteSize() === 0) {\n return true;\n }\n\n // Don't allow resume token changes to be buffered indefinitely. This\n // allows us to be reasonably up-to-date after a crash and avoids needing\n // to loop over all active queries on shutdown. Especially in the browser\n // we may not get time to do anything interesting while the current tab is\n // closing.\n const timeDelta =\n newTargetData.snapshotVersion.toMicroseconds() -\n oldTargetData.snapshotVersion.toMicroseconds();\n if (timeDelta >= RESUME_TOKEN_MAX_AGE_MICROS) {\n return true;\n }\n\n // Otherwise if the only thing that has changed about a target is its resume\n // token it's not worth persisting. Note that the RemoteStore keeps an\n // in-memory view of the currently active targets which includes the current\n // resume token, so stream failure or user changes will still use an\n // up-to-date resume token regardless of what we do here.\n const changes =\n change.addedDocuments.size +\n change.modifiedDocuments.size +\n change.removedDocuments.size;\n return changes > 0;\n}\n\n/**\n * Notifies local store of the changed views to locally pin documents.\n */\nexport async function localStoreNotifyLocalViewChanges(\n localStore: LocalStore,\n viewChanges: LocalViewChanges[]\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n try {\n await localStoreImpl.persistence.runTransaction(\n 'notifyLocalViewChanges',\n 'readwrite',\n txn => {\n return PersistencePromise.forEach(\n viewChanges,\n (viewChange: LocalViewChanges) => {\n return PersistencePromise.forEach(\n viewChange.addedKeys,\n (key: DocumentKey) =>\n localStoreImpl.persistence.referenceDelegate.addReference(\n txn,\n viewChange.targetId,\n key\n )\n ).next(() =>\n PersistencePromise.forEach(\n viewChange.removedKeys,\n (key: DocumentKey) =>\n localStoreImpl.persistence.referenceDelegate.removeReference(\n txn,\n viewChange.targetId,\n key\n )\n )\n );\n }\n );\n }\n );\n } catch (e) {\n if (isIndexedDbTransactionError(e as Error)) {\n // If `notifyLocalViewChanges` fails, we did not advance the sequence\n // number for the documents that were included in this transaction.\n // This might trigger them to be deleted earlier than they otherwise\n // would have, but it should not invalidate the integrity of the data.\n logDebug(LOG_TAG, 'Failed to update sequence numbers: ' + e);\n } else {\n throw e;\n }\n }\n\n for (const viewChange of viewChanges) {\n const targetId = viewChange.targetId;\n\n if (!viewChange.fromCache) {\n const targetData = localStoreImpl.targetDataByTarget.get(targetId);\n debugAssert(\n targetData !== null,\n `Can't set limbo-free snapshot version for unknown target: ${targetId}`\n );\n\n // Advance the last limbo free snapshot version\n const lastLimboFreeSnapshotVersion = targetData.snapshotVersion;\n const updatedTargetData = targetData.withLastLimboFreeSnapshotVersion(\n lastLimboFreeSnapshotVersion\n );\n localStoreImpl.targetDataByTarget =\n localStoreImpl.targetDataByTarget.insert(targetId, updatedTargetData);\n\n // TODO(b/272564316): Apply the optimization done on other platforms.\n // This is a problem for web because saving the updated targetData from\n // non-primary client conflicts with what primary client saved.\n }\n }\n}\n\n/**\n * Gets the mutation batch after the passed in batchId in the mutation queue\n * or null if empty.\n * @param afterBatchId - If provided, the batch to search after.\n * @returns The next mutation or null if there wasn't one.\n */\nexport function localStoreGetNextMutationBatch(\n localStore: LocalStore,\n afterBatchId?: BatchId\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get next mutation batch',\n 'readonly',\n txn => {\n if (afterBatchId === undefined) {\n afterBatchId = BATCHID_UNKNOWN;\n }\n return localStoreImpl.mutationQueue.getNextMutationBatchAfterBatchId(\n txn,\n afterBatchId\n );\n }\n );\n}\n\n/**\n * Reads the current value of a Document with a given key or null if not\n * found - used for testing.\n */\nexport function localStoreReadDocument(\n localStore: LocalStore,\n key: DocumentKey\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'read document',\n 'readonly',\n txn => localStoreImpl.localDocuments.getDocument(txn, key)\n );\n}\n\n/**\n * Assigns the given target an internal ID so that its results can be pinned so\n * they don't get GC'd. A target must be allocated in the local store before\n * the store can be used to manage its view.\n *\n * Allocating an already allocated `Target` will return the existing `TargetData`\n * for that `Target`.\n */\nexport function localStoreAllocateTarget(\n localStore: LocalStore,\n target: Target\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence\n .runTransaction('Allocate target', 'readwrite', txn => {\n let targetData: TargetData;\n return localStoreImpl.targetCache\n .getTargetData(txn, target)\n .next((cached: TargetData | null) => {\n if (cached) {\n // This target has been listened to previously, so reuse the\n // previous targetID.\n // TODO(mcg): freshen last accessed date?\n targetData = cached;\n return PersistencePromise.resolve(targetData);\n } else {\n return localStoreImpl.targetCache\n .allocateTargetId(txn)\n .next(targetId => {\n targetData = new TargetData(\n target,\n targetId,\n TargetPurpose.Listen,\n txn.currentSequenceNumber\n );\n return localStoreImpl.targetCache\n .addTargetData(txn, targetData)\n .next(() => targetData);\n });\n }\n });\n })\n .then(targetData => {\n // If Multi-Tab is enabled, the existing target data may be newer than\n // the in-memory data\n const cachedTargetData = localStoreImpl.targetDataByTarget.get(\n targetData.targetId\n );\n if (\n cachedTargetData === null ||\n targetData.snapshotVersion.compareTo(cachedTargetData.snapshotVersion) >\n 0\n ) {\n localStoreImpl.targetDataByTarget =\n localStoreImpl.targetDataByTarget.insert(\n targetData.targetId,\n targetData\n );\n localStoreImpl.targetIdByTarget.set(target, targetData.targetId);\n }\n return targetData;\n });\n}\n\n/**\n * Returns the TargetData as seen by the LocalStore, including updates that may\n * have not yet been persisted to the TargetCache.\n */\n// Visible for testing.\nexport function localStoreGetTargetData(\n localStore: LocalStore,\n transaction: PersistenceTransaction,\n target: Target\n): PersistencePromise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetId = localStoreImpl.targetIdByTarget.get(target);\n if (targetId !== undefined) {\n return PersistencePromise.resolve(\n localStoreImpl.targetDataByTarget.get(targetId)\n );\n } else {\n return localStoreImpl.targetCache.getTargetData(transaction, target);\n }\n}\n\n/**\n * Unpins all the documents associated with the given target. If\n * `keepPersistedTargetData` is set to false and Eager GC enabled, the method\n * directly removes the associated target data from the target cache.\n *\n * Releasing a non-existing `Target` is a no-op.\n */\n// PORTING NOTE: `keepPersistedTargetData` is multi-tab only.\nexport async function localStoreReleaseTarget(\n localStore: LocalStore,\n targetId: number,\n keepPersistedTargetData: boolean\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetData = localStoreImpl.targetDataByTarget.get(targetId);\n debugAssert(\n targetData !== null,\n `Tried to release nonexistent target: ${targetId}`\n );\n\n const mode = keepPersistedTargetData ? 'readwrite' : 'readwrite-primary';\n\n try {\n if (!keepPersistedTargetData) {\n await localStoreImpl.persistence.runTransaction(\n 'Release target',\n mode,\n txn => {\n return localStoreImpl.persistence.referenceDelegate.removeTarget(\n txn,\n targetData!\n );\n }\n );\n }\n } catch (e) {\n if (isIndexedDbTransactionError(e as Error)) {\n // All `releaseTarget` does is record the final metadata state for the\n // target, but we've been recording this periodically during target\n // activity. If we lose this write this could cause a very slight\n // difference in the order of target deletion during GC, but we\n // don't define exact LRU semantics so this is acceptable.\n logDebug(\n LOG_TAG,\n `Failed to update sequence numbers for target ${targetId}: ${e}`\n );\n } else {\n throw e;\n }\n }\n\n localStoreImpl.targetDataByTarget =\n localStoreImpl.targetDataByTarget.remove(targetId);\n localStoreImpl.targetIdByTarget.delete(targetData!.target);\n}\n\n/**\n * Runs the specified query against the local store and returns the results,\n * potentially taking advantage of query data from previous executions (such\n * as the set of remote keys).\n *\n * @param usePreviousResults - Whether results from previous executions can\n * be used to optimize this query execution.\n */\nexport function localStoreExecuteQuery(\n localStore: LocalStore,\n query: Query,\n usePreviousResults: boolean\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n let lastLimboFreeSnapshotVersion = SnapshotVersion.min();\n let remoteKeys = documentKeySet();\n\n return localStoreImpl.persistence.runTransaction(\n 'Execute query',\n 'readwrite', // Use readwrite instead of readonly so indexes can be created\n txn => {\n return localStoreGetTargetData(localStoreImpl, txn, queryToTarget(query))\n .next(targetData => {\n if (targetData) {\n lastLimboFreeSnapshotVersion =\n targetData.lastLimboFreeSnapshotVersion;\n return localStoreImpl.targetCache\n .getMatchingKeysForTargetId(txn, targetData.targetId)\n .next(result => {\n remoteKeys = result;\n });\n }\n })\n .next(() =>\n localStoreImpl.queryEngine.getDocumentsMatchingQuery(\n txn,\n query,\n usePreviousResults\n ? lastLimboFreeSnapshotVersion\n : SnapshotVersion.min(),\n usePreviousResults ? remoteKeys : documentKeySet()\n )\n )\n .next(documents => {\n setMaxReadTime(\n localStoreImpl,\n queryCollectionGroup(query),\n documents\n );\n return { documents, remoteKeys };\n });\n }\n );\n}\n\nfunction applyWriteToRemoteDocuments(\n localStoreImpl: LocalStoreImpl,\n txn: PersistenceTransaction,\n batchResult: MutationBatchResult,\n documentBuffer: RemoteDocumentChangeBuffer\n): PersistencePromise {\n const batch = batchResult.batch;\n const docKeys = batch.keys();\n let promiseChain = PersistencePromise.resolve();\n docKeys.forEach(docKey => {\n promiseChain = promiseChain\n .next(() => documentBuffer.getEntry(txn, docKey))\n .next(doc => {\n const ackVersion = batchResult.docVersions.get(docKey);\n hardAssert(\n ackVersion !== null,\n 'ackVersions should contain every doc in the write.'\n );\n if (doc.version.compareTo(ackVersion!) < 0) {\n batch.applyToRemoteDocument(doc, batchResult);\n if (doc.isValidDocument()) {\n // We use the commitVersion as the readTime rather than the\n // document's updateTime since the updateTime is not advanced\n // for updates that do not modify the underlying document.\n doc.setReadTime(batchResult.commitVersion);\n documentBuffer.addEntry(doc);\n }\n }\n });\n });\n return promiseChain.next(() =>\n localStoreImpl.mutationQueue.removeMutationBatch(txn, batch)\n );\n}\n\n/** Returns the local view of the documents affected by a mutation batch. */\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreLookupMutationDocuments(\n localStore: LocalStore,\n batchId: BatchId\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const mutationQueueImpl = debugCast(\n localStoreImpl.mutationQueue,\n IndexedDbMutationQueue // We only support IndexedDb in multi-tab mode.\n );\n return localStoreImpl.persistence.runTransaction(\n 'Lookup mutation documents',\n 'readonly',\n txn => {\n return mutationQueueImpl.lookupMutationKeys(txn, batchId).next(keys => {\n if (keys) {\n return localStoreImpl.localDocuments.getDocuments(\n txn,\n keys\n ) as PersistencePromise;\n } else {\n return PersistencePromise.resolve(null);\n }\n });\n }\n );\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreRemoveCachedMutationBatchMetadata(\n localStore: LocalStore,\n batchId: BatchId\n): void {\n const mutationQueueImpl = debugCast(\n debugCast(localStore, LocalStoreImpl).mutationQueue,\n IndexedDbMutationQueue // We only support IndexedDb in multi-tab mode.\n );\n mutationQueueImpl.removeCachedMutationKeys(batchId);\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetActiveClients(\n localStore: LocalStore\n): Promise {\n const persistenceImpl = debugCast(\n debugCast(localStore, LocalStoreImpl).persistence,\n IndexedDbPersistence // We only support IndexedDb in multi-tab mode.\n );\n return persistenceImpl.getActiveClients();\n}\n\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetCachedTarget(\n localStore: LocalStore,\n targetId: TargetId\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const targetCacheImpl = debugCast(\n localStoreImpl.targetCache,\n IndexedDbTargetCache // We only support IndexedDb in multi-tab mode.\n );\n const cachedTargetData = localStoreImpl.targetDataByTarget.get(targetId);\n if (cachedTargetData) {\n return Promise.resolve(cachedTargetData.target);\n } else {\n return localStoreImpl.persistence.runTransaction(\n 'Get target data',\n 'readonly',\n txn => {\n return targetCacheImpl\n .getTargetDataForTarget(txn, targetId)\n .next(targetData => (targetData ? targetData.target : null));\n }\n );\n }\n}\n\n/**\n * Returns the set of documents that have been updated since the last call.\n * If this is the first call, returns the set of changes since client\n * initialization. Further invocations will return document that have changed\n * since the prior call.\n */\n// PORTING NOTE: Multi-Tab only.\nexport function localStoreGetNewDocumentChanges(\n localStore: LocalStore,\n collectionGroup: string\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n\n // Get the current maximum read time for the collection. This should always\n // exist, but to reduce the chance for regressions we default to\n // SnapshotVersion.Min()\n // TODO(indexing): Consider removing the default value.\n const readTime =\n localStoreImpl.collectionGroupReadTime.get(collectionGroup) ||\n SnapshotVersion.min();\n\n return localStoreImpl.persistence\n .runTransaction('Get new document changes', 'readonly', txn =>\n localStoreImpl.remoteDocuments.getAllFromCollectionGroup(\n txn,\n collectionGroup,\n newIndexOffsetSuccessorFromReadTime(readTime, INITIAL_LARGEST_BATCH_ID),\n /* limit= */ Number.MAX_SAFE_INTEGER\n )\n )\n .then(changedDocs => {\n setMaxReadTime(localStoreImpl, collectionGroup, changedDocs);\n return changedDocs;\n });\n}\n\n/** Sets the collection group's maximum read time from the given documents. */\n// PORTING NOTE: Multi-Tab only.\nfunction setMaxReadTime(\n localStoreImpl: LocalStoreImpl,\n collectionGroup: string,\n changedDocs: SortedMap\n): void {\n let readTime =\n localStoreImpl.collectionGroupReadTime.get(collectionGroup) ||\n SnapshotVersion.min();\n changedDocs.forEach((_, doc) => {\n if (doc.readTime.compareTo(readTime) > 0) {\n readTime = doc.readTime;\n }\n });\n localStoreImpl.collectionGroupReadTime.set(collectionGroup, readTime);\n}\n\n/**\n * Creates a new target using the given bundle name, which will be used to\n * hold the keys of all documents from the bundle in query-document mappings.\n * This ensures that the loaded documents do not get garbage collected\n * right away.\n */\nfunction umbrellaTarget(bundleName: string): Target {\n // It is OK that the path used for the query is not valid, because this will\n // not be read and queried.\n return queryToTarget(\n newQueryForPath(ResourcePath.fromString(`__bundle__/docs/${bundleName}`))\n );\n}\n\n/**\n * Applies the documents from a bundle to the \"ground-state\" (remote)\n * documents.\n *\n * LocalDocuments are re-calculated if there are remaining mutations in the\n * queue.\n */\nexport async function localStoreApplyBundledDocuments(\n localStore: LocalStore,\n bundleConverter: BundleConverter,\n documents: BundledDocuments,\n bundleName: string\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n let documentKeys = documentKeySet();\n let documentMap = mutableDocumentMap();\n for (const bundleDoc of documents) {\n const documentKey = bundleConverter.toDocumentKey(bundleDoc.metadata.name!);\n if (bundleDoc.document) {\n documentKeys = documentKeys.add(documentKey);\n }\n const doc = bundleConverter.toMutableDocument(bundleDoc);\n doc.setReadTime(\n bundleConverter.toSnapshotVersion(bundleDoc.metadata.readTime!)\n );\n documentMap = documentMap.insert(documentKey, doc);\n }\n\n const documentBuffer = localStoreImpl.remoteDocuments.newChangeBuffer({\n trackRemovals: true // Make sure document removals show up in `getNewDocumentChanges()`\n });\n\n // Allocates a target to hold all document keys from the bundle, such that\n // they will not get garbage collected right away.\n const umbrellaTargetData = await localStoreAllocateTarget(\n localStoreImpl,\n umbrellaTarget(bundleName)\n );\n return localStoreImpl.persistence.runTransaction(\n 'Apply bundle documents',\n 'readwrite',\n txn => {\n return populateDocumentChangeBuffer(txn, documentBuffer, documentMap)\n .next(documentChangeResult => {\n documentBuffer.apply(txn);\n return documentChangeResult;\n })\n .next(documentChangeResult => {\n return localStoreImpl.targetCache\n .removeMatchingKeysForTargetId(txn, umbrellaTargetData.targetId)\n .next(() =>\n localStoreImpl.targetCache.addMatchingKeys(\n txn,\n documentKeys,\n umbrellaTargetData.targetId\n )\n )\n .next(() =>\n localStoreImpl.localDocuments.getLocalViewOfDocuments(\n txn,\n documentChangeResult.changedDocuments,\n documentChangeResult.existenceChangedKeys\n )\n )\n .next(() => documentChangeResult.changedDocuments);\n });\n }\n );\n}\n\n/**\n * Returns a promise of a boolean to indicate if the given bundle has already\n * been loaded and the create time is newer than the current loading bundle.\n */\nexport function localStoreHasNewerBundle(\n localStore: LocalStore,\n bundleMetadata: BundleMetadata\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const currentReadTime = fromVersion(bundleMetadata.createTime!);\n return localStoreImpl.persistence\n .runTransaction('hasNewerBundle', 'readonly', transaction => {\n return localStoreImpl.bundleCache.getBundleMetadata(\n transaction,\n bundleMetadata.id!\n );\n })\n .then(cached => {\n return !!cached && cached.createTime!.compareTo(currentReadTime) >= 0;\n });\n}\n\n/**\n * Saves the given `BundleMetadata` to local persistence.\n */\nexport function localStoreSaveBundle(\n localStore: LocalStore,\n bundleMetadata: BundleMetadata\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Save bundle',\n 'readwrite',\n transaction => {\n return localStoreImpl.bundleCache.saveBundleMetadata(\n transaction,\n bundleMetadata\n );\n }\n );\n}\n\n/**\n * Returns a promise of a `NamedQuery` associated with given query name. Promise\n * resolves to undefined if no persisted data can be found.\n */\nexport function localStoreGetNamedQuery(\n localStore: LocalStore,\n queryName: string\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Get named query',\n 'readonly',\n transaction =>\n localStoreImpl.bundleCache.getNamedQuery(transaction, queryName)\n );\n}\n\n/**\n * Saves the given `NamedQuery` to local persistence.\n */\nexport async function localStoreSaveNamedQuery(\n localStore: LocalStore,\n query: ProtoNamedQuery,\n documents: DocumentKeySet = documentKeySet()\n): Promise {\n // Allocate a target for the named query such that it can be resumed\n // from associated read time if users use it to listen.\n // NOTE: this also means if no corresponding target exists, the new target\n // will remain active and will not get collected, unless users happen to\n // unlisten the query somehow.\n const allocated = await localStoreAllocateTarget(\n localStore,\n queryToTarget(fromBundledQuery(query.bundledQuery!))\n );\n\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n return localStoreImpl.persistence.runTransaction(\n 'Save named query',\n 'readwrite',\n transaction => {\n const readTime = fromVersion(query.readTime!);\n // Simply save the query itself if it is older than what the SDK already\n // has.\n if (allocated.snapshotVersion.compareTo(readTime) >= 0) {\n return localStoreImpl.bundleCache.saveNamedQuery(transaction, query);\n }\n\n // Update existing target data because the query from the bundle is newer.\n const newTargetData = allocated.withResumeToken(\n ByteString.EMPTY_BYTE_STRING,\n readTime\n );\n localStoreImpl.targetDataByTarget =\n localStoreImpl.targetDataByTarget.insert(\n newTargetData.targetId,\n newTargetData\n );\n return localStoreImpl.targetCache\n .updateTargetData(transaction, newTargetData)\n .next(() =>\n localStoreImpl.targetCache.removeMatchingKeysForTargetId(\n transaction,\n allocated.targetId\n )\n )\n .next(() =>\n localStoreImpl.targetCache.addMatchingKeys(\n transaction,\n documents,\n allocated.targetId\n )\n )\n .next(() =>\n localStoreImpl.bundleCache.saveNamedQuery(transaction, query)\n );\n }\n );\n}\n\nexport async function localStoreConfigureFieldIndexes(\n localStore: LocalStore,\n newFieldIndexes: FieldIndex[]\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const indexManager = localStoreImpl.indexManager;\n const promises: Array> = [];\n return localStoreImpl.persistence.runTransaction(\n 'Configure indexes',\n 'readwrite',\n transaction =>\n indexManager\n .getFieldIndexes(transaction)\n .next(oldFieldIndexes =>\n diffArrays(\n oldFieldIndexes,\n newFieldIndexes,\n fieldIndexSemanticComparator,\n fieldIndex => {\n promises.push(\n indexManager.addFieldIndex(transaction, fieldIndex)\n );\n },\n fieldIndex => {\n promises.push(\n indexManager.deleteFieldIndex(transaction, fieldIndex)\n );\n }\n )\n )\n .next(() => PersistencePromise.waitFor(promises))\n );\n}\n\nexport function localStoreSetIndexAutoCreationEnabled(\n localStore: LocalStore,\n isEnabled: boolean\n): void {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n localStoreImpl.queryEngine.indexAutoCreationEnabled = isEnabled;\n}\n\nexport function localStoreDeleteAllFieldIndexes(\n localStore: LocalStore\n): Promise {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n const indexManager = localStoreImpl.indexManager;\n return localStoreImpl.persistence.runTransaction(\n 'Delete All Indexes',\n 'readwrite',\n transaction => indexManager.deleteAllFieldIndexes(transaction)\n );\n}\n\n/**\n * Test-only hooks into the SDK for use exclusively by tests.\n */\nexport class TestingHooks {\n private constructor() {\n throw new Error('creating instances is not supported');\n }\n\n static setIndexAutoCreationSettings(\n localStore: LocalStore,\n settings: {\n indexAutoCreationMinCollectionSize?: number;\n relativeIndexReadCostPerDocument?: number;\n }\n ): void {\n const localStoreImpl = debugCast(localStore, LocalStoreImpl);\n if (settings.indexAutoCreationMinCollectionSize !== undefined) {\n localStoreImpl.queryEngine.indexAutoCreationMinCollectionSize =\n settings.indexAutoCreationMinCollectionSize;\n }\n if (settings.relativeIndexReadCostPerDocument !== undefined) {\n localStoreImpl.queryEngine.relativeIndexReadCostPerDocument =\n settings.relativeIndexReadCostPerDocument;\n }\n }\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { ListenSequence } from '../core/listen_sequence';\nimport {\n BatchId,\n ListenSequenceNumber,\n MutationBatchState,\n OnlineState,\n TargetId\n} from '../core/types';\nimport { TargetIdSet, targetIdSet } from '../model/collections';\nimport { hardAssert, debugAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logError, logDebug } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { SortedMap } from '../util/sorted_map';\nimport { SortedSet } from '../util/sorted_set';\nimport { isSafeInteger, WindowLike } from '../util/types';\n\nimport {\n CLIENT_STATE_KEY_PREFIX,\n ClientStateSchema,\n createBundleLoadedKey,\n createWebStorageClientStateKey,\n createWebStorageMutationBatchKey,\n createWebStorageOnlineStateKey,\n createWebStorageQueryTargetMetadataKey,\n createWebStorageSequenceNumberKey,\n MUTATION_BATCH_KEY_PREFIX,\n MutationMetadataSchema,\n QUERY_TARGET_KEY_PREFIX,\n QueryTargetStateSchema,\n SharedOnlineStateSchema\n} from './shared_client_state_schema';\nimport {\n QueryTargetState,\n SharedClientStateSyncer\n} from './shared_client_state_syncer';\n\nconst LOG_TAG = 'SharedClientState';\n\n/**\n * A randomly-generated key assigned to each Firestore instance at startup.\n */\nexport type ClientId = string;\n\n/**\n * A `SharedClientState` keeps track of the global state of the mutations\n * and query targets for all active clients with the same persistence key (i.e.\n * project ID and FirebaseApp name). It relays local changes to other clients\n * and updates its local state as new state is observed.\n *\n * `SharedClientState` is primarily used for synchronization in Multi-Tab\n * environments. Each tab is responsible for registering its active query\n * targets and mutations. `SharedClientState` will then notify the listener\n * assigned to `.syncEngine` for updates to mutations and queries that\n * originated in other clients.\n *\n * To receive notifications, `.syncEngine` and `.onlineStateHandler` has to be\n * assigned before calling `start()`.\n */\nexport interface SharedClientState {\n onlineStateHandler: ((onlineState: OnlineState) => void) | null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null;\n\n /** Registers the Mutation Batch ID of a newly pending mutation. */\n addPendingMutation(batchId: BatchId): void;\n\n /**\n * Records that a pending mutation has been acknowledged or rejected.\n * Called by the primary client to notify secondary clients of mutation\n * results as they come back from the backend.\n */\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void;\n\n /**\n * Associates a new Query Target ID with the local Firestore client. Returns\n * the new query state for the query (which can be 'current' if the query is\n * already associated with another tab).\n *\n * If the target id is already associated with local client, the method simply\n * returns its `QueryTargetState`.\n */\n addLocalQueryTarget(\n targetId: TargetId,\n addToActiveTargetIds?: boolean\n ): QueryTargetState;\n\n /** Removes the Query Target ID association from the local client. */\n removeLocalQueryTarget(targetId: TargetId): void;\n\n /** Checks whether the target is associated with the local client. */\n isLocalQueryTarget(targetId: TargetId): boolean;\n\n /**\n * Processes an update to a query target.\n *\n * Called by the primary client to notify secondary clients of document\n * changes or state transitions that affect the provided query target.\n */\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void;\n\n /**\n * Removes the target's metadata entry.\n *\n * Called by the primary client when all clients stopped listening to a query\n * target.\n */\n clearQueryState(targetId: TargetId): void;\n\n /**\n * Gets the active Query Targets IDs for all active clients.\n *\n * The implementation for this may require O(n) runtime, where 'n' is the size\n * of the result set.\n */\n // Visible for testing\n getAllActiveQueryTargets(): SortedSet;\n\n /**\n * Checks whether the provided target ID is currently being listened to by\n * any of the active clients.\n *\n * The implementation may require O(n*log m) runtime, where 'n' is the number\n * of clients and 'm' the number of targets.\n */\n isActiveQueryTarget(targetId: TargetId): boolean;\n\n /**\n * Starts the SharedClientState, reads existing client data and registers\n * listeners for updates to new and existing clients.\n */\n start(): Promise;\n\n /** Shuts down the `SharedClientState` and its listeners. */\n shutdown(): void;\n\n /**\n * Changes the active user and removes all existing user-specific data. The\n * user change does not call back into SyncEngine (for example, no mutations\n * will be marked as removed).\n */\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void;\n\n /** Changes the shared online state of all clients. */\n setOnlineState(onlineState: OnlineState): void;\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void;\n\n /**\n * Notifies other clients when remote documents have changed due to loading\n * a bundle.\n *\n * @param collectionGroups The collection groups affected by this bundle.\n */\n notifyBundleLoaded(collectionGroups: Set): void;\n}\n\n/**\n * Holds the state of a mutation batch, including its user ID, batch ID and\n * whether the batch is 'pending', 'acknowledged' or 'rejected'.\n */\n// Visible for testing\nexport class MutationMetadata {\n constructor(\n readonly user: User,\n readonly batchId: BatchId,\n readonly state: MutationBatchState,\n readonly error?: FirestoreError\n ) {\n debugAssert(\n (error !== undefined) === (state === 'rejected'),\n `MutationMetadata must contain an error iff state is 'rejected'`\n );\n }\n\n /**\n * Parses a MutationMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n user: User,\n batchId: BatchId,\n value: string\n ): MutationMetadata | null {\n const mutationBatch = JSON.parse(value) as MutationMetadataSchema;\n\n let validData =\n typeof mutationBatch === 'object' &&\n ['pending', 'acknowledged', 'rejected'].indexOf(mutationBatch.state) !==\n -1 &&\n (mutationBatch.error === undefined ||\n typeof mutationBatch.error === 'object');\n\n let firestoreError: FirestoreError | undefined = undefined;\n\n if (validData && mutationBatch.error) {\n validData =\n typeof mutationBatch.error.message === 'string' &&\n typeof mutationBatch.error.code === 'string';\n if (validData) {\n firestoreError = new FirestoreError(\n mutationBatch.error.code as Code,\n mutationBatch.error.message\n );\n }\n }\n\n if (validData) {\n return new MutationMetadata(\n user,\n batchId,\n mutationBatch.state,\n firestoreError\n );\n } else {\n logError(\n LOG_TAG,\n `Failed to parse mutation state for ID '${batchId}': ${value}`\n );\n return null;\n }\n }\n\n toWebStorageJSON(): string {\n const batchMetadata: MutationMetadataSchema = {\n state: this.state,\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n\n if (this.error) {\n batchMetadata.error = {\n code: this.error.code,\n message: this.error.message\n };\n }\n\n return JSON.stringify(batchMetadata);\n }\n}\n\n/**\n * Holds the state of a query target, including its target ID and whether the\n * target is 'not-current', 'current' or 'rejected'.\n */\n// Visible for testing\nexport class QueryTargetMetadata {\n constructor(\n readonly targetId: TargetId,\n readonly state: QueryTargetState,\n readonly error?: FirestoreError\n ) {\n debugAssert(\n (error !== undefined) === (state === 'rejected'),\n `QueryTargetMetadata must contain an error iff state is 'rejected'`\n );\n }\n\n /**\n * Parses a QueryTargetMetadata from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n targetId: TargetId,\n value: string\n ): QueryTargetMetadata | null {\n const targetState = JSON.parse(value) as QueryTargetStateSchema;\n\n let validData =\n typeof targetState === 'object' &&\n ['not-current', 'current', 'rejected'].indexOf(targetState.state) !==\n -1 &&\n (targetState.error === undefined ||\n typeof targetState.error === 'object');\n\n let firestoreError: FirestoreError | undefined = undefined;\n\n if (validData && targetState.error) {\n validData =\n typeof targetState.error.message === 'string' &&\n typeof targetState.error.code === 'string';\n if (validData) {\n firestoreError = new FirestoreError(\n targetState.error.code as Code,\n targetState.error.message\n );\n }\n }\n\n if (validData) {\n return new QueryTargetMetadata(\n targetId,\n targetState.state,\n firestoreError\n );\n } else {\n logError(\n LOG_TAG,\n `Failed to parse target state for ID '${targetId}': ${value}`\n );\n return null;\n }\n }\n\n toWebStorageJSON(): string {\n const targetState: QueryTargetStateSchema = {\n state: this.state,\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n\n if (this.error) {\n targetState.error = {\n code: this.error.code,\n message: this.error.message\n };\n }\n\n return JSON.stringify(targetState);\n }\n}\n\n/**\n * Metadata state of a single client denoting the query targets it is actively\n * listening to the watch.\n */\n// Visible for testing.\nexport interface ClientState {\n readonly activeTargetIds: TargetIdSet;\n}\n\n/**\n * This class represents the immutable ClientState for a client read from\n * WebStorage, containing the list of active query targets.\n */\nclass RemoteClientState implements ClientState {\n private constructor(\n readonly clientId: ClientId,\n readonly activeTargetIds: TargetIdSet\n ) {}\n\n /**\n * Parses a RemoteClientState from the JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(\n clientId: ClientId,\n value: string\n ): RemoteClientState | null {\n const clientState = JSON.parse(value) as ClientStateSchema;\n\n let validData =\n typeof clientState === 'object' &&\n clientState.activeTargetIds instanceof Array;\n\n let activeTargetIdsSet = targetIdSet();\n\n for (let i = 0; validData && i < clientState.activeTargetIds.length; ++i) {\n validData = isSafeInteger(clientState.activeTargetIds[i]);\n activeTargetIdsSet = activeTargetIdsSet.add(\n clientState.activeTargetIds[i]\n );\n }\n\n if (validData) {\n return new RemoteClientState(clientId, activeTargetIdsSet);\n } else {\n logError(\n LOG_TAG,\n `Failed to parse client data for instance '${clientId}': ${value}`\n );\n return null;\n }\n }\n}\n\n/**\n * This class represents the online state for all clients participating in\n * multi-tab. The online state is only written to by the primary client, and\n * used in secondary clients to update their query views.\n */\nexport class SharedOnlineState {\n constructor(readonly clientId: string, readonly onlineState: OnlineState) {}\n\n /**\n * Parses a SharedOnlineState from its JSON representation in WebStorage.\n * Logs a warning and returns null if the format of the data is not valid.\n */\n static fromWebStorageEntry(value: string): SharedOnlineState | null {\n const onlineState = JSON.parse(value) as SharedOnlineStateSchema;\n\n const validData =\n typeof onlineState === 'object' &&\n ['Unknown', 'Online', 'Offline'].indexOf(onlineState.onlineState) !==\n -1 &&\n typeof onlineState.clientId === 'string';\n\n if (validData) {\n return new SharedOnlineState(\n onlineState.clientId,\n onlineState.onlineState as OnlineState\n );\n } else {\n logError(LOG_TAG, `Failed to parse online state: ${value}`);\n return null;\n }\n }\n}\n\n/**\n * Metadata state of the local client. Unlike `RemoteClientState`, this class is\n * mutable and keeps track of all pending mutations, which allows us to\n * update the range of pending mutation batch IDs as new mutations are added or\n * removed.\n *\n * The data in `LocalClientState` is not read from WebStorage and instead\n * updated via its instance methods. The updated state can be serialized via\n * `toWebStorageJSON()`.\n */\n// Visible for testing.\nexport class LocalClientState implements ClientState {\n activeTargetIds = targetIdSet();\n\n addQueryTarget(targetId: TargetId): void {\n this.activeTargetIds = this.activeTargetIds.add(targetId);\n }\n\n removeQueryTarget(targetId: TargetId): void {\n this.activeTargetIds = this.activeTargetIds.delete(targetId);\n }\n\n /**\n * Converts this entry into a JSON-encoded format we can use for WebStorage.\n * Does not encode `clientId` as it is part of the key in WebStorage.\n */\n toWebStorageJSON(): string {\n const data: ClientStateSchema = {\n activeTargetIds: this.activeTargetIds.toArray(),\n updateTimeMs: Date.now() // Modify the existing value to trigger update.\n };\n return JSON.stringify(data);\n }\n}\n\n/**\n * `WebStorageSharedClientState` uses WebStorage (window.localStorage) as the\n * backing store for the SharedClientState. It keeps track of all active\n * clients and supports modifications of the local client's data.\n */\nexport class WebStorageSharedClientState implements SharedClientState {\n syncEngine: SharedClientStateSyncer | null = null;\n onlineStateHandler: ((onlineState: OnlineState) => void) | null = null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null = null;\n\n private readonly storage: Storage;\n private readonly localClientStorageKey: string;\n private readonly sequenceNumberKey: string;\n private readonly storageListener = this.handleWebStorageEvent.bind(this);\n private readonly onlineStateKey: string;\n private readonly bundleLoadedKey: string;\n private readonly clientStateKeyRe: RegExp;\n private readonly mutationBatchKeyRe: RegExp;\n private readonly queryTargetKeyRe: RegExp;\n private activeClients = new SortedMap(\n primitiveComparator\n );\n private started = false;\n private currentUser: User;\n\n /**\n * Captures WebStorage events that occur before `start()` is called. These\n * events are replayed once `WebStorageSharedClientState` is started.\n */\n private earlyEvents: StorageEvent[] = [];\n\n constructor(\n private readonly window: WindowLike,\n private readonly queue: AsyncQueue,\n private readonly persistenceKey: string,\n private readonly localClientId: ClientId,\n initialUser: User\n ) {\n // Escape the special characters mentioned here:\n // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\n const escapedPersistenceKey = persistenceKey.replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n );\n\n this.storage = this.window.localStorage;\n this.currentUser = initialUser;\n this.localClientStorageKey = createWebStorageClientStateKey(\n this.persistenceKey,\n this.localClientId\n );\n this.sequenceNumberKey = createWebStorageSequenceNumberKey(\n this.persistenceKey\n );\n this.activeClients = this.activeClients.insert(\n this.localClientId,\n new LocalClientState()\n );\n\n this.clientStateKeyRe = new RegExp(\n `^${CLIENT_STATE_KEY_PREFIX}_${escapedPersistenceKey}_([^_]*)$`\n );\n this.mutationBatchKeyRe = new RegExp(\n `^${MUTATION_BATCH_KEY_PREFIX}_${escapedPersistenceKey}_(\\\\d+)(?:_(.*))?$`\n );\n this.queryTargetKeyRe = new RegExp(\n `^${QUERY_TARGET_KEY_PREFIX}_${escapedPersistenceKey}_(\\\\d+)$`\n );\n\n this.onlineStateKey = createWebStorageOnlineStateKey(this.persistenceKey);\n\n this.bundleLoadedKey = createBundleLoadedKey(this.persistenceKey);\n\n // Rather than adding the storage observer during start(), we add the\n // storage observer during initialization. This ensures that we collect\n // events before other components populate their initial state (during their\n // respective start() calls). Otherwise, we might for example miss a\n // mutation that is added after LocalStore's start() processed the existing\n // mutations but before we observe WebStorage events.\n this.window.addEventListener('storage', this.storageListener);\n }\n\n /** Returns 'true' if WebStorage is available in the current environment. */\n static isAvailable(window: WindowLike | null): window is WindowLike {\n return !!(window && window.localStorage);\n }\n\n async start(): Promise {\n debugAssert(!this.started, 'WebStorageSharedClientState already started');\n debugAssert(\n this.syncEngine !== null,\n 'syncEngine property must be set before calling start()'\n );\n debugAssert(\n this.onlineStateHandler !== null,\n 'onlineStateHandler property must be set before calling start()'\n );\n\n // Retrieve the list of existing clients to backfill the data in\n // SharedClientState.\n const existingClients = await this.syncEngine!.getActiveClients();\n\n for (const clientId of existingClients) {\n if (clientId === this.localClientId) {\n continue;\n }\n\n const storageItem = this.getItem(\n createWebStorageClientStateKey(this.persistenceKey, clientId)\n );\n if (storageItem) {\n const clientState = RemoteClientState.fromWebStorageEntry(\n clientId,\n storageItem\n );\n if (clientState) {\n this.activeClients = this.activeClients.insert(\n clientState.clientId,\n clientState\n );\n }\n }\n }\n\n this.persistClientState();\n\n // Check if there is an existing online state and call the callback handler\n // if applicable.\n const onlineStateJSON = this.storage.getItem(this.onlineStateKey);\n if (onlineStateJSON) {\n const onlineState = this.fromWebStorageOnlineState(onlineStateJSON);\n if (onlineState) {\n this.handleOnlineStateEvent(onlineState);\n }\n }\n\n for (const event of this.earlyEvents) {\n this.handleWebStorageEvent(event);\n }\n\n this.earlyEvents = [];\n\n // Register a window unload hook to remove the client metadata entry from\n // WebStorage even if `shutdown()` was not called.\n this.window.addEventListener('pagehide', () => this.shutdown());\n\n this.started = true;\n }\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void {\n this.setItem(this.sequenceNumberKey, JSON.stringify(sequenceNumber));\n }\n\n getAllActiveQueryTargets(): TargetIdSet {\n return this.extractActiveQueryTargets(this.activeClients);\n }\n\n isActiveQueryTarget(targetId: TargetId): boolean {\n let found = false;\n this.activeClients.forEach((key, value) => {\n if (value.activeTargetIds.has(targetId)) {\n found = true;\n }\n });\n return found;\n }\n\n addPendingMutation(batchId: BatchId): void {\n this.persistMutationState(batchId, 'pending');\n }\n\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void {\n this.persistMutationState(batchId, state, error);\n\n // Once a final mutation result is observed by other clients, they no longer\n // access the mutation's metadata entry. Since WebStorage replays events\n // in order, it is safe to delete the entry right after updating it.\n this.removeMutationState(batchId);\n }\n\n addLocalQueryTarget(\n targetId: TargetId,\n addToActiveTargetIds: boolean = true\n ): QueryTargetState {\n let queryState: QueryTargetState = 'not-current';\n\n // Lookup an existing query state if the target ID was already registered\n // by another tab\n if (this.isActiveQueryTarget(targetId)) {\n const storageItem = this.storage.getItem(\n createWebStorageQueryTargetMetadataKey(this.persistenceKey, targetId)\n );\n\n if (storageItem) {\n const metadata = QueryTargetMetadata.fromWebStorageEntry(\n targetId,\n storageItem\n );\n if (metadata) {\n queryState = metadata.state;\n }\n }\n }\n\n // If the query is listening to cache only, the target ID should not be registered with the\n // local Firestore client as an active watch target.\n if (addToActiveTargetIds) {\n this.localClientState.addQueryTarget(targetId);\n }\n\n this.persistClientState();\n return queryState;\n }\n\n removeLocalQueryTarget(targetId: TargetId): void {\n this.localClientState.removeQueryTarget(targetId);\n this.persistClientState();\n }\n\n isLocalQueryTarget(targetId: TargetId): boolean {\n return this.localClientState.activeTargetIds.has(targetId);\n }\n\n clearQueryState(targetId: TargetId): void {\n this.removeItem(\n createWebStorageQueryTargetMetadataKey(this.persistenceKey, targetId)\n );\n }\n\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n this.persistQueryTargetState(targetId, state, error);\n }\n\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void {\n removedBatchIds.forEach(batchId => {\n this.removeMutationState(batchId);\n });\n this.currentUser = user;\n addedBatchIds.forEach(batchId => {\n this.addPendingMutation(batchId);\n });\n }\n\n setOnlineState(onlineState: OnlineState): void {\n this.persistOnlineState(onlineState);\n }\n\n notifyBundleLoaded(collectionGroups: Set): void {\n this.persistBundleLoadedState(collectionGroups);\n }\n\n shutdown(): void {\n if (this.started) {\n this.window.removeEventListener('storage', this.storageListener);\n this.removeItem(this.localClientStorageKey);\n this.started = false;\n }\n }\n\n private getItem(key: string): string | null {\n const value = this.storage.getItem(key);\n logDebug(LOG_TAG, 'READ', key, value);\n return value;\n }\n\n private setItem(key: string, value: string): void {\n logDebug(LOG_TAG, 'SET', key, value);\n this.storage.setItem(key, value);\n }\n\n private removeItem(key: string): void {\n logDebug(LOG_TAG, 'REMOVE', key);\n this.storage.removeItem(key);\n }\n\n private handleWebStorageEvent(event: Event): void {\n // Note: The function is typed to take Event to be interface-compatible with\n // `Window.addEventListener`.\n const storageEvent = event as StorageEvent;\n if (storageEvent.storageArea === this.storage) {\n logDebug(LOG_TAG, 'EVENT', storageEvent.key, storageEvent.newValue);\n\n if (storageEvent.key === this.localClientStorageKey) {\n logError(\n 'Received WebStorage notification for local change. Another client might have ' +\n 'garbage-collected our state'\n );\n return;\n }\n\n this.queue.enqueueRetryable(async () => {\n if (!this.started) {\n this.earlyEvents.push(storageEvent);\n return;\n }\n\n if (storageEvent.key === null) {\n return;\n }\n\n if (this.clientStateKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue != null) {\n const clientState = this.fromWebStorageClientState(\n storageEvent.key,\n storageEvent.newValue\n );\n if (clientState) {\n return this.handleClientStateEvent(\n clientState.clientId,\n clientState\n );\n }\n } else {\n const clientId = this.fromWebStorageClientStateKey(\n storageEvent.key\n )!;\n return this.handleClientStateEvent(clientId, null);\n }\n } else if (this.mutationBatchKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue !== null) {\n const mutationMetadata = this.fromWebStorageMutationMetadata(\n storageEvent.key,\n storageEvent.newValue\n );\n if (mutationMetadata) {\n return this.handleMutationBatchEvent(mutationMetadata);\n }\n }\n } else if (this.queryTargetKeyRe.test(storageEvent.key)) {\n if (storageEvent.newValue !== null) {\n const queryTargetMetadata = this.fromWebStorageQueryTargetMetadata(\n storageEvent.key,\n storageEvent.newValue\n );\n if (queryTargetMetadata) {\n return this.handleQueryTargetEvent(queryTargetMetadata);\n }\n }\n } else if (storageEvent.key === this.onlineStateKey) {\n if (storageEvent.newValue !== null) {\n const onlineState = this.fromWebStorageOnlineState(\n storageEvent.newValue\n );\n if (onlineState) {\n return this.handleOnlineStateEvent(onlineState);\n }\n }\n } else if (storageEvent.key === this.sequenceNumberKey) {\n debugAssert(\n !!this.sequenceNumberHandler,\n 'Missing sequenceNumberHandler'\n );\n const sequenceNumber = fromWebStorageSequenceNumber(\n storageEvent.newValue\n );\n if (sequenceNumber !== ListenSequence.INVALID) {\n this.sequenceNumberHandler!(sequenceNumber);\n }\n } else if (storageEvent.key === this.bundleLoadedKey) {\n const collectionGroups = this.fromWebStoreBundleLoadedState(\n storageEvent.newValue!\n );\n await Promise.all(\n collectionGroups.map(cg =>\n this.syncEngine!.synchronizeWithChangedDocuments(cg)\n )\n );\n }\n });\n }\n }\n\n private get localClientState(): LocalClientState {\n return this.activeClients.get(this.localClientId) as LocalClientState;\n }\n\n private persistClientState(): void {\n this.setItem(\n this.localClientStorageKey,\n this.localClientState.toWebStorageJSON()\n );\n }\n\n private persistMutationState(\n batchId: BatchId,\n state: MutationBatchState,\n error?: FirestoreError\n ): void {\n const mutationState = new MutationMetadata(\n this.currentUser,\n batchId,\n state,\n error\n );\n const mutationKey = createWebStorageMutationBatchKey(\n this.persistenceKey,\n this.currentUser,\n batchId\n );\n this.setItem(mutationKey, mutationState.toWebStorageJSON());\n }\n\n private removeMutationState(batchId: BatchId): void {\n const mutationKey = createWebStorageMutationBatchKey(\n this.persistenceKey,\n this.currentUser,\n batchId\n );\n this.removeItem(mutationKey);\n }\n\n private persistOnlineState(onlineState: OnlineState): void {\n const entry: SharedOnlineStateSchema = {\n clientId: this.localClientId,\n onlineState\n };\n this.storage.setItem(this.onlineStateKey, JSON.stringify(entry));\n }\n\n private persistQueryTargetState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n const targetKey = createWebStorageQueryTargetMetadataKey(\n this.persistenceKey,\n targetId\n );\n const targetMetadata = new QueryTargetMetadata(targetId, state, error);\n this.setItem(targetKey, targetMetadata.toWebStorageJSON());\n }\n\n private persistBundleLoadedState(collectionGroups: Set): void {\n const json = JSON.stringify(Array.from(collectionGroups));\n this.setItem(this.bundleLoadedKey, json);\n }\n\n /**\n * Parses a client state key in WebStorage. Returns null if the key does not\n * match the expected key format.\n */\n private fromWebStorageClientStateKey(key: string): ClientId | null {\n const match = this.clientStateKeyRe.exec(key);\n return match ? match[1] : null;\n }\n\n /**\n * Parses a client state in WebStorage. Returns 'null' if the value could not\n * be parsed.\n */\n private fromWebStorageClientState(\n key: string,\n value: string\n ): RemoteClientState | null {\n const clientId = this.fromWebStorageClientStateKey(key);\n debugAssert(clientId !== null, `Cannot parse client state key '${key}'`);\n return RemoteClientState.fromWebStorageEntry(clientId, value);\n }\n\n /**\n * Parses a mutation batch state in WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageMutationMetadata(\n key: string,\n value: string\n ): MutationMetadata | null {\n const match = this.mutationBatchKeyRe.exec(key);\n debugAssert(match !== null, `Cannot parse mutation batch key '${key}'`);\n\n const batchId = Number(match[1]);\n const userId = match[2] !== undefined ? match[2] : null;\n return MutationMetadata.fromWebStorageEntry(\n new User(userId),\n batchId,\n value\n );\n }\n\n /**\n * Parses a query target state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageQueryTargetMetadata(\n key: string,\n value: string\n ): QueryTargetMetadata | null {\n const match = this.queryTargetKeyRe.exec(key);\n debugAssert(match !== null, `Cannot parse query target key '${key}'`);\n\n const targetId = Number(match[1]);\n return QueryTargetMetadata.fromWebStorageEntry(targetId, value);\n }\n\n /**\n * Parses an online state from WebStorage. Returns 'null' if the value\n * could not be parsed.\n */\n private fromWebStorageOnlineState(value: string): SharedOnlineState | null {\n return SharedOnlineState.fromWebStorageEntry(value);\n }\n\n private fromWebStoreBundleLoadedState(value: string): string[] {\n return JSON.parse(value) as string[];\n }\n\n private async handleMutationBatchEvent(\n mutationBatch: MutationMetadata\n ): Promise {\n if (mutationBatch.user.uid !== this.currentUser.uid) {\n logDebug(\n LOG_TAG,\n `Ignoring mutation for non-active user ${mutationBatch.user.uid}`\n );\n return;\n }\n\n return this.syncEngine!.applyBatchState(\n mutationBatch.batchId,\n mutationBatch.state,\n mutationBatch.error\n );\n }\n\n private handleQueryTargetEvent(\n targetMetadata: QueryTargetMetadata\n ): Promise {\n return this.syncEngine!.applyTargetState(\n targetMetadata.targetId,\n targetMetadata.state,\n targetMetadata.error\n );\n }\n\n private handleClientStateEvent(\n clientId: ClientId,\n clientState: RemoteClientState | null\n ): Promise {\n const updatedClients = clientState\n ? this.activeClients.insert(clientId, clientState)\n : this.activeClients.remove(clientId);\n\n const existingTargets = this.extractActiveQueryTargets(this.activeClients);\n const newTargets = this.extractActiveQueryTargets(updatedClients);\n\n const addedTargets: TargetId[] = [];\n const removedTargets: TargetId[] = [];\n\n newTargets.forEach(targetId => {\n if (!existingTargets.has(targetId)) {\n addedTargets.push(targetId);\n }\n });\n\n existingTargets.forEach(targetId => {\n if (!newTargets.has(targetId)) {\n removedTargets.push(targetId);\n }\n });\n\n return this.syncEngine!.applyActiveTargetsChange(\n addedTargets,\n removedTargets\n ).then(() => {\n this.activeClients = updatedClients;\n });\n }\n\n private handleOnlineStateEvent(onlineState: SharedOnlineState): void {\n // We check whether the client that wrote this online state is still active\n // by comparing its client ID to the list of clients kept active in\n // IndexedDb. If a client does not update their IndexedDb client state\n // within 5 seconds, it is considered inactive and we don't emit an online\n // state event.\n if (this.activeClients.get(onlineState.clientId)) {\n this.onlineStateHandler!(onlineState.onlineState);\n }\n }\n\n private extractActiveQueryTargets(\n clients: SortedMap\n ): SortedSet {\n let activeTargets = targetIdSet();\n clients.forEach((kev, value) => {\n activeTargets = activeTargets.unionWith(value.activeTargetIds);\n });\n return activeTargets;\n }\n}\n\nfunction fromWebStorageSequenceNumber(\n seqString: string | null\n): ListenSequenceNumber {\n let sequenceNumber = ListenSequence.INVALID;\n if (seqString != null) {\n try {\n const parsed = JSON.parse(seqString);\n hardAssert(\n typeof parsed === 'number',\n 'Found non-numeric sequence number'\n );\n sequenceNumber = parsed;\n } catch (e) {\n logError(LOG_TAG, 'Failed to read sequence number from WebStorage', e);\n }\n }\n return sequenceNumber;\n}\n\n/**\n * `MemorySharedClientState` is a simple implementation of SharedClientState for\n * clients using memory persistence. The state in this class remains fully\n * isolated and no synchronization is performed.\n */\nexport class MemorySharedClientState implements SharedClientState {\n private localState = new LocalClientState();\n private queryState: { [targetId: number]: QueryTargetState } = {};\n onlineStateHandler: ((onlineState: OnlineState) => void) | null = null;\n sequenceNumberHandler:\n | ((sequenceNumber: ListenSequenceNumber) => void)\n | null = null;\n\n addPendingMutation(batchId: BatchId): void {\n // No op.\n }\n\n updateMutationState(\n batchId: BatchId,\n state: 'acknowledged' | 'rejected',\n error?: FirestoreError\n ): void {\n // No op.\n }\n\n addLocalQueryTarget(\n targetId: TargetId,\n addToActiveTargetIds: boolean = true\n ): QueryTargetState {\n if (addToActiveTargetIds) {\n this.localState.addQueryTarget(targetId);\n }\n return this.queryState[targetId] || 'not-current';\n }\n\n updateQueryState(\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n ): void {\n this.queryState[targetId] = state;\n }\n\n removeLocalQueryTarget(targetId: TargetId): void {\n this.localState.removeQueryTarget(targetId);\n }\n\n isLocalQueryTarget(targetId: TargetId): boolean {\n return this.localState.activeTargetIds.has(targetId);\n }\n\n clearQueryState(targetId: TargetId): void {\n delete this.queryState[targetId];\n }\n\n getAllActiveQueryTargets(): TargetIdSet {\n return this.localState.activeTargetIds;\n }\n\n isActiveQueryTarget(targetId: TargetId): boolean {\n return this.localState.activeTargetIds.has(targetId);\n }\n\n start(): Promise {\n this.localState = new LocalClientState();\n return Promise.resolve();\n }\n\n handleUserChange(\n user: User,\n removedBatchIds: BatchId[],\n addedBatchIds: BatchId[]\n ): void {\n // No op.\n }\n\n setOnlineState(onlineState: OnlineState): void {\n // No op.\n }\n\n shutdown(): void {}\n\n writeSequenceNumber(sequenceNumber: ListenSequenceNumber): void {}\n\n notifyBundleLoaded(collectionGroups: Set): void {\n // No op.\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ConnectivityMonitor, NetworkStatus } from './connectivity_monitor';\n\nexport class NoopConnectivityMonitor implements ConnectivityMonitor {\n addCallback(callback: (status: NetworkStatus) => void): void {\n // No-op.\n }\n\n shutdown(): void {\n // No-op.\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n ConnectivityMonitor,\n ConnectivityMonitorCallback,\n NetworkStatus\n} from '../../remote/connectivity_monitor';\nimport { logDebug } from '../../util/log';\n\n// References to `window` are guarded by BrowserConnectivityMonitor.isAvailable()\n/* eslint-disable no-restricted-globals */\n\nconst LOG_TAG = 'ConnectivityMonitor';\n\n/**\n * Browser implementation of ConnectivityMonitor.\n */\nexport class BrowserConnectivityMonitor implements ConnectivityMonitor {\n private readonly networkAvailableListener = (): void =>\n this.onNetworkAvailable();\n private readonly networkUnavailableListener = (): void =>\n this.onNetworkUnavailable();\n private callbacks: ConnectivityMonitorCallback[] = [];\n\n constructor() {\n this.configureNetworkMonitoring();\n }\n\n addCallback(callback: (status: NetworkStatus) => void): void {\n this.callbacks.push(callback);\n }\n\n shutdown(): void {\n window.removeEventListener('online', this.networkAvailableListener);\n window.removeEventListener('offline', this.networkUnavailableListener);\n }\n\n private configureNetworkMonitoring(): void {\n window.addEventListener('online', this.networkAvailableListener);\n window.addEventListener('offline', this.networkUnavailableListener);\n }\n\n private onNetworkAvailable(): void {\n logDebug(LOG_TAG, 'Network connectivity changed: AVAILABLE');\n for (const callback of this.callbacks) {\n callback(NetworkStatus.AVAILABLE);\n }\n }\n\n private onNetworkUnavailable(): void {\n logDebug(LOG_TAG, 'Network connectivity changed: UNAVAILABLE');\n for (const callback of this.callbacks) {\n callback(NetworkStatus.UNAVAILABLE);\n }\n }\n\n // TODO(chenbrian): Consider passing in window either into this component or\n // here for testing via FakeWindow.\n /** Checks that all used attributes of window are available. */\n static isAvailable(): boolean {\n return (\n typeof window !== 'undefined' &&\n window.addEventListener !== undefined &&\n window.removeEventListener !== undefined\n );\n }\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * The value returned from the most recent invocation of\n * `generateUniqueDebugId()`, or null if it has never been invoked.\n */\nlet lastUniqueDebugId: number | null = null;\n\n/**\n * Generates and returns an initial value for `lastUniqueDebugId`.\n *\n * The returned value is randomly selected from a range of integers that are\n * represented as 8 hexadecimal digits. This means that (within reason) any\n * numbers generated by incrementing the returned number by 1 will also be\n * represented by 8 hexadecimal digits. This leads to all \"IDs\" having the same\n * length when converted to a hexadecimal string, making reading logs containing\n * these IDs easier to follow. And since the return value is randomly selected\n * it will help to differentiate between logs from different executions.\n */\nfunction generateInitialUniqueDebugId(): number {\n const minResult = 0x10000000;\n const maxResult = 0x90000000;\n const resultRange = maxResult - minResult;\n const resultOffset = Math.round(resultRange * Math.random());\n return minResult + resultOffset;\n}\n\n/**\n * Generates and returns a unique ID as a hexadecimal string.\n *\n * The returned ID is intended to be used in debug logging messages to help\n * correlate log messages that may be spatially separated in the logs, but\n * logically related. For example, a network connection could include the same\n * \"debug ID\" string in all of its log messages to help trace a specific\n * connection over time.\n *\n * @return the 10-character generated ID (e.g. \"0xa1b2c3d4\").\n */\nexport function generateUniqueDebugId(): string {\n if (lastUniqueDebugId === null) {\n lastUniqueDebugId = generateInitialUniqueDebugId();\n } else {\n lastUniqueDebugId++;\n }\n return '0x' + lastUniqueDebugId.toString(16);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SDK_VERSION } from '../../src/core/version';\nimport { Token } from '../api/credentials';\nimport {\n DatabaseId,\n DatabaseInfo,\n DEFAULT_DATABASE_NAME\n} from '../core/database_info';\nimport { ResourcePath } from '../model/path';\nimport { debugAssert } from '../util/assert';\nimport { generateUniqueDebugId } from '../util/debug_uid';\nimport { FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { StringMap } from '../util/types';\n\nimport { Connection, Stream } from './connection';\n\nconst LOG_TAG = 'RestConnection';\n\n/**\n * Maps RPC names to the corresponding REST endpoint name.\n *\n * We use array notation to avoid mangling.\n */\nconst RPC_NAME_URL_MAPPING: StringMap = {};\n\nRPC_NAME_URL_MAPPING['BatchGetDocuments'] = 'batchGet';\nRPC_NAME_URL_MAPPING['Commit'] = 'commit';\nRPC_NAME_URL_MAPPING['RunQuery'] = 'runQuery';\nRPC_NAME_URL_MAPPING['RunAggregationQuery'] = 'runAggregationQuery';\n\nconst RPC_URL_VERSION = 'v1';\n\n// SDK_VERSION is updated to different value at runtime depending on the entry point,\n// so we need to get its value when we need it in a function.\nfunction getGoogApiClientValue(): string {\n return 'gl-js/ fire/' + SDK_VERSION;\n}\n/**\n * Base class for all Rest-based connections to the backend (WebChannel and\n * HTTP).\n */\nexport abstract class RestConnection implements Connection {\n protected readonly databaseId: DatabaseId;\n protected readonly baseUrl: string;\n private readonly databasePath: string;\n private readonly requestParams: string;\n\n get shouldResourcePathBeIncludedInRequest(): boolean {\n // Both `invokeRPC()` and `invokeStreamingRPC()` use their `path` arguments to determine\n // where to run the query, and expect the `request` to NOT specify the \"path\".\n return false;\n }\n\n constructor(private readonly databaseInfo: DatabaseInfo) {\n this.databaseId = databaseInfo.databaseId;\n const proto = databaseInfo.ssl ? 'https' : 'http';\n const projectId = encodeURIComponent(this.databaseId.projectId);\n const databaseId = encodeURIComponent(this.databaseId.database);\n this.baseUrl = proto + '://' + databaseInfo.host;\n this.databasePath = `projects/${projectId}/databases/${databaseId}`;\n this.requestParams =\n this.databaseId.database === DEFAULT_DATABASE_NAME\n ? `project_id=${projectId}`\n : `project_id=${projectId}&database_id=${databaseId}`;\n }\n\n invokeRPC(\n rpcName: string,\n path: ResourcePath,\n req: Req,\n authToken: Token | null,\n appCheckToken: Token | null\n ): Promise {\n const streamId = generateUniqueDebugId();\n const url = this.makeUrl(rpcName, path.toUriEncodedString());\n logDebug(LOG_TAG, `Sending RPC '${rpcName}' ${streamId}:`, url, req);\n\n const headers: StringMap = {\n 'google-cloud-resource-prefix': this.databasePath,\n 'x-goog-request-params': this.requestParams\n };\n this.modifyHeadersForRequest(headers, authToken, appCheckToken);\n\n return this.performRPCRequest(rpcName, url, headers, req).then(\n response => {\n logDebug(LOG_TAG, `Received RPC '${rpcName}' ${streamId}: `, response);\n return response;\n },\n (err: FirestoreError) => {\n logWarn(\n LOG_TAG,\n `RPC '${rpcName}' ${streamId} failed with error: `,\n err,\n 'url: ',\n url,\n 'request:',\n req\n );\n throw err;\n }\n );\n }\n\n invokeStreamingRPC(\n rpcName: string,\n path: ResourcePath,\n request: Req,\n authToken: Token | null,\n appCheckToken: Token | null,\n expectedResponseCount?: number\n ): Promise {\n // The REST API automatically aggregates all of the streamed results, so we\n // can just use the normal invoke() method.\n return this.invokeRPC(\n rpcName,\n path,\n request,\n authToken,\n appCheckToken\n );\n }\n\n abstract openStream(\n rpcName: string,\n authToken: Token | null,\n appCheckToken: Token | null\n ): Stream;\n\n /**\n * Modifies the headers for a request, adding any authorization token if\n * present and any additional headers for the request.\n */\n protected modifyHeadersForRequest(\n headers: StringMap,\n authToken: Token | null,\n appCheckToken: Token | null\n ): void {\n headers['X-Goog-Api-Client'] = getGoogApiClientValue();\n\n // Content-Type: text/plain will avoid preflight requests which might\n // mess with CORS and redirects by proxies. If we add custom headers\n // we will need to change this code to potentially use the $httpOverwrite\n // parameter supported by ESF to avoid triggering preflight requests.\n headers['Content-Type'] = 'text/plain';\n\n if (this.databaseInfo.appId) {\n headers['X-Firebase-GMPID'] = this.databaseInfo.appId;\n }\n\n if (authToken) {\n authToken.headers.forEach((value, key) => (headers[key] = value));\n }\n if (appCheckToken) {\n appCheckToken.headers.forEach((value, key) => (headers[key] = value));\n }\n }\n\n /**\n * Performs an RPC request using an implementation specific networking layer.\n */\n protected abstract performRPCRequest(\n rpcName: string,\n url: string,\n headers: StringMap,\n body: Req\n ): Promise;\n\n private makeUrl(rpcName: string, path: string): string {\n const urlRpcName = RPC_NAME_URL_MAPPING[rpcName];\n debugAssert(\n urlRpcName !== undefined,\n 'Unknown REST mapping for: ' + rpcName\n );\n return `${this.baseUrl}/${RPC_URL_VERSION}/${path}:${urlRpcName}`;\n }\n\n /**\n * Closes and cleans up any resources associated with the connection. This\n * implementation is a no-op because there are no resources associated\n * with the RestConnection that need to be cleaned up.\n */\n terminate(): void {\n // No-op\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert } from '../util/assert';\nimport { FirestoreError } from '../util/error';\n\nimport { Stream } from './connection';\n\n/**\n * Provides a simple helper class that implements the Stream interface to\n * bridge to other implementations that are streams but do not implement the\n * interface. The stream callbacks are invoked with the callOn... methods.\n */\nexport class StreamBridge implements Stream {\n private wrappedOnConnected: (() => void) | undefined;\n private wrappedOnOpen: (() => void) | undefined;\n private wrappedOnClose: ((err?: FirestoreError) => void) | undefined;\n private wrappedOnMessage: ((msg: O) => void) | undefined;\n\n private sendFn: (msg: I) => void;\n private closeFn: () => void;\n\n constructor(args: { sendFn: (msg: I) => void; closeFn: () => void }) {\n this.sendFn = args.sendFn;\n this.closeFn = args.closeFn;\n }\n\n onConnected(callback: () => void): void {\n debugAssert(\n !this.wrappedOnConnected,\n 'Called onConnected on stream twice!'\n );\n this.wrappedOnConnected = callback;\n }\n\n onOpen(callback: () => void): void {\n debugAssert(!this.wrappedOnOpen, 'Called onOpen on stream twice!');\n this.wrappedOnOpen = callback;\n }\n\n onClose(callback: (err?: FirestoreError) => void): void {\n debugAssert(!this.wrappedOnClose, 'Called onClose on stream twice!');\n this.wrappedOnClose = callback;\n }\n\n onMessage(callback: (msg: O) => void): void {\n debugAssert(!this.wrappedOnMessage, 'Called onMessage on stream twice!');\n this.wrappedOnMessage = callback;\n }\n\n close(): void {\n this.closeFn();\n }\n\n send(msg: I): void {\n this.sendFn(msg);\n }\n\n callOnConnected(): void {\n debugAssert(\n this.wrappedOnConnected !== undefined,\n 'Cannot call onConnected because no callback was set'\n );\n this.wrappedOnConnected();\n }\n\n callOnOpen(): void {\n debugAssert(\n this.wrappedOnOpen !== undefined,\n 'Cannot call onOpen because no callback was set'\n );\n this.wrappedOnOpen();\n }\n\n callOnClose(err?: FirestoreError): void {\n debugAssert(\n this.wrappedOnClose !== undefined,\n 'Cannot call onClose because no callback was set'\n );\n this.wrappedOnClose(err);\n }\n\n callOnMessage(msg: O): void {\n debugAssert(\n this.wrappedOnMessage !== undefined,\n 'Cannot call onMessage because no callback was set'\n );\n this.wrappedOnMessage(msg);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n createWebChannelTransport,\n ErrorCode,\n EventType,\n WebChannel,\n WebChannelError,\n WebChannelOptions,\n XhrIo,\n getStatEventTarget,\n EventTarget,\n StatEvent,\n Event,\n Stat\n} from '@firebase/webchannel-wrapper/webchannel-blob';\n\nimport { Token } from '../../api/credentials';\nimport { ExperimentalLongPollingOptions } from '../../api/long_polling_options';\nimport { DatabaseInfo } from '../../core/database_info';\nimport { Stream } from '../../remote/connection';\nimport { RestConnection } from '../../remote/rest_connection';\nimport {\n mapCodeFromRpcStatus,\n mapCodeFromHttpResponseErrorStatus\n} from '../../remote/rpc_error';\nimport { StreamBridge } from '../../remote/stream_bridge';\nimport { fail, hardAssert } from '../../util/assert';\nimport { generateUniqueDebugId } from '../../util/debug_uid';\nimport { Code, FirestoreError } from '../../util/error';\nimport { logDebug, logWarn } from '../../util/log';\nimport { Rejecter, Resolver } from '../../util/promise';\nimport { StringMap } from '../../util/types';\n\nconst LOG_TAG = 'WebChannelConnection';\n\nconst RPC_STREAM_SERVICE = 'google.firestore.v1.Firestore';\n\nconst XHR_TIMEOUT_SECS = 15;\n\nexport class WebChannelConnection extends RestConnection {\n private readonly forceLongPolling: boolean;\n private readonly autoDetectLongPolling: boolean;\n private readonly useFetchStreams: boolean;\n private readonly longPollingOptions: ExperimentalLongPollingOptions;\n\n constructor(info: DatabaseInfo) {\n super(info);\n this.forceLongPolling = info.forceLongPolling;\n this.autoDetectLongPolling = info.autoDetectLongPolling;\n this.useFetchStreams = info.useFetchStreams;\n this.longPollingOptions = info.longPollingOptions;\n }\n\n protected performRPCRequest(\n rpcName: string,\n url: string,\n headers: StringMap,\n body: Req\n ): Promise {\n const streamId = generateUniqueDebugId();\n return new Promise((resolve: Resolver, reject: Rejecter) => {\n const xhr = new XhrIo();\n xhr.setWithCredentials(true);\n xhr.listenOnce(EventType.COMPLETE, () => {\n try {\n switch (xhr.getLastErrorCode()) {\n case ErrorCode.NO_ERROR:\n const json = xhr.getResponseJson() as Resp;\n logDebug(\n LOG_TAG,\n `XHR for RPC '${rpcName}' ${streamId} received:`,\n JSON.stringify(json)\n );\n resolve(json);\n break;\n case ErrorCode.TIMEOUT:\n logDebug(LOG_TAG, `RPC '${rpcName}' ${streamId} timed out`);\n reject(\n new FirestoreError(Code.DEADLINE_EXCEEDED, 'Request time out')\n );\n break;\n case ErrorCode.HTTP_ERROR:\n const status = xhr.getStatus();\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' ${streamId} failed with status:`,\n status,\n 'response text:',\n xhr.getResponseText()\n );\n if (status > 0) {\n let response = xhr.getResponseJson();\n if (Array.isArray(response)) {\n response = response[0];\n }\n const responseError = (response as WebChannelError)?.error;\n if (\n !!responseError &&\n !!responseError.status &&\n !!responseError.message\n ) {\n const firestoreErrorCode = mapCodeFromHttpResponseErrorStatus(\n responseError.status\n );\n reject(\n new FirestoreError(\n firestoreErrorCode,\n responseError.message\n )\n );\n } else {\n reject(\n new FirestoreError(\n Code.UNKNOWN,\n 'Server responded with status ' + xhr.getStatus()\n )\n );\n }\n } else {\n // If we received an HTTP_ERROR but there's no status code,\n // it's most probably a connection issue\n reject(\n new FirestoreError(Code.UNAVAILABLE, 'Connection failed.')\n );\n }\n break;\n default:\n fail(\n `RPC '${rpcName}' ${streamId} ` +\n 'failed with unanticipated webchannel error: ' +\n xhr.getLastErrorCode() +\n ': ' +\n xhr.getLastError() +\n ', giving up.'\n );\n }\n } finally {\n logDebug(LOG_TAG, `RPC '${rpcName}' ${streamId} completed.`);\n }\n });\n\n const requestString = JSON.stringify(body);\n logDebug(LOG_TAG, `RPC '${rpcName}' ${streamId} sending request:`, body);\n xhr.send(url, 'POST', requestString, headers, XHR_TIMEOUT_SECS);\n });\n }\n\n openStream(\n rpcName: string,\n authToken: Token | null,\n appCheckToken: Token | null\n ): Stream {\n const streamId = generateUniqueDebugId();\n const urlParts = [\n this.baseUrl,\n '/',\n RPC_STREAM_SERVICE,\n '/',\n rpcName,\n '/channel'\n ];\n const webchannelTransport = createWebChannelTransport();\n const requestStats = getStatEventTarget();\n const request: WebChannelOptions = {\n // Required for backend stickiness, routing behavior is based on this\n // parameter.\n httpSessionIdParam: 'gsessionid',\n initMessageHeaders: {},\n messageUrlParams: {\n // This param is used to improve routing and project isolation by the\n // backend and must be included in every request.\n database: `projects/${this.databaseId.projectId}/databases/${this.databaseId.database}`\n },\n sendRawJson: true,\n supportsCrossDomainXhr: true,\n internalChannelParams: {\n // Override the default timeout (randomized between 10-20 seconds) since\n // a large write batch on a slow internet connection may take a long\n // time to send to the backend. Rather than have WebChannel impose a\n // tight timeout which could lead to infinite timeouts and retries, we\n // set it very large (5-10 minutes) and rely on the browser's builtin\n // timeouts to kick in if the request isn't working.\n forwardChannelRequestTimeoutMs: 10 * 60 * 1000\n },\n forceLongPolling: this.forceLongPolling,\n detectBufferingProxy: this.autoDetectLongPolling\n };\n\n const longPollingTimeoutSeconds = this.longPollingOptions.timeoutSeconds;\n if (longPollingTimeoutSeconds !== undefined) {\n request.longPollingTimeout = Math.round(longPollingTimeoutSeconds * 1000);\n }\n\n if (this.useFetchStreams) {\n request.useFetchStreams = true;\n }\n\n this.modifyHeadersForRequest(\n request.initMessageHeaders!,\n authToken,\n appCheckToken\n );\n\n // Sending the custom headers we just added to request.initMessageHeaders\n // (Authorization, etc.) will trigger the browser to make a CORS preflight\n // request because the XHR will no longer meet the criteria for a \"simple\"\n // CORS request:\n // https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#Simple_requests\n //\n // Therefore to avoid the CORS preflight request (an extra network\n // roundtrip), we use the encodeInitMessageHeaders option to specify that\n // the headers should instead be encoded in the request's POST payload,\n // which is recognized by the webchannel backend.\n request.encodeInitMessageHeaders = true;\n\n const url = urlParts.join('');\n logDebug(\n LOG_TAG,\n `Creating RPC '${rpcName}' stream ${streamId}: ${url}`,\n request\n );\n const channel = webchannelTransport.createWebChannel(url, request);\n\n // WebChannel supports sending the first message with the handshake - saving\n // a network round trip. However, it will have to call send in the same\n // JS event loop as open. In order to enforce this, we delay actually\n // opening the WebChannel until send is called. Whether we have called\n // open is tracked with this variable.\n let opened = false;\n\n // A flag to determine whether the stream was closed (by us or through an\n // error/close event) to avoid delivering multiple close events or sending\n // on a closed stream\n let closed = false;\n\n const streamBridge = new StreamBridge({\n sendFn: (msg: Req) => {\n if (!closed) {\n if (!opened) {\n logDebug(\n LOG_TAG,\n `Opening RPC '${rpcName}' stream ${streamId} transport.`\n );\n channel.open();\n opened = true;\n }\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} sending:`,\n msg\n );\n channel.send(msg);\n } else {\n logDebug(\n LOG_TAG,\n `Not sending because RPC '${rpcName}' stream ${streamId} ` +\n 'is closed:',\n msg\n );\n }\n },\n closeFn: () => channel.close()\n });\n\n // Closure events are guarded and exceptions are swallowed, so catch any\n // exception and rethrow using a setTimeout so they become visible again.\n // Note that eventually this function could go away if we are confident\n // enough the code is exception free.\n const unguardedEventListen = (\n target: EventTarget,\n type: string | number,\n fn: (param: T) => void\n ): void => {\n // TODO(dimond): closure typing seems broken because WebChannel does\n // not implement goog.events.Listenable\n target.listen(type, (param: unknown) => {\n try {\n fn(param as T);\n } catch (e) {\n setTimeout(() => {\n throw e;\n }, 0);\n }\n });\n };\n\n unguardedEventListen(channel, WebChannel.EventType.OPEN, () => {\n if (!closed) {\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} transport opened.`\n );\n streamBridge.callOnConnected();\n }\n });\n\n unguardedEventListen(channel, WebChannel.EventType.CLOSE, () => {\n if (!closed) {\n closed = true;\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} transport closed`\n );\n streamBridge.callOnClose();\n }\n });\n\n unguardedEventListen(channel, WebChannel.EventType.ERROR, err => {\n if (!closed) {\n closed = true;\n logWarn(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} transport errored:`,\n err\n );\n streamBridge.callOnClose(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'The operation could not be completed'\n )\n );\n }\n });\n\n // WebChannel delivers message events as array. If batching is not enabled\n // (it's off by default) each message will be delivered alone, resulting in\n // a single element array.\n interface WebChannelResponse {\n data: Resp[];\n }\n\n unguardedEventListen(\n channel,\n WebChannel.EventType.MESSAGE,\n msg => {\n if (!closed) {\n const msgData = msg.data[0];\n hardAssert(!!msgData, 'Got a webchannel message without data.');\n // TODO(b/35143891): There is a bug in One Platform that caused errors\n // (and only errors) to be wrapped in an extra array. To be forward\n // compatible with the bug we need to check either condition. The latter\n // can be removed once the fix has been rolled out.\n // Use any because msgData.error is not typed.\n const msgDataOrError: WebChannelError | object = msgData;\n const error =\n msgDataOrError.error ||\n (msgDataOrError as WebChannelError[])[0]?.error;\n if (error) {\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} received error:`,\n error\n );\n // error.status will be a string like 'OK' or 'NOT_FOUND'.\n const status: string = error.status;\n let code = mapCodeFromRpcStatus(status);\n let message = error.message;\n if (code === undefined) {\n code = Code.INTERNAL;\n message =\n 'Unknown error status: ' +\n status +\n ' with message ' +\n error.message;\n }\n // Mark closed so no further events are propagated\n closed = true;\n streamBridge.callOnClose(new FirestoreError(code, message));\n channel.close();\n } else {\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} received:`,\n msgData\n );\n streamBridge.callOnMessage(msgData);\n }\n }\n }\n );\n\n unguardedEventListen(requestStats, Event.STAT_EVENT, event => {\n if (event.stat === Stat.PROXY) {\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} detected buffering proxy`\n );\n } else if (event.stat === Stat.NOPROXY) {\n logDebug(\n LOG_TAG,\n `RPC '${rpcName}' stream ${streamId} detected no buffering proxy`\n );\n }\n });\n\n setTimeout(() => {\n // Technically we could/should wait for the WebChannel opened event,\n // but because we want to send the first message with the WebChannel\n // handshake we pretend the channel opened here (asynchronously), and\n // then delay the actual open until the first message is sent.\n streamBridge.callOnOpen();\n }, 0);\n return streamBridge;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** The Platform's 'window' implementation or null if not available. */\nexport function getWindow(): Window | null {\n // `window` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return typeof window !== 'undefined' ? window : null;\n}\n\n/** The Platform's 'document' implementation or null if not available. */\nexport function getDocument(): Document | null {\n // `document` is not always available, e.g. in ReactNative and WebWorkers.\n // eslint-disable-next-line no-restricted-globals\n return typeof document !== 'undefined' ? document : null;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/** Return the Platform-specific serializer monitor. */\nimport { DatabaseId } from '../../core/database_info';\nimport { JsonProtoSerializer } from '../../remote/serializer';\n\nexport function newSerializer(databaseId: DatabaseId): JsonProtoSerializer {\n return new JsonProtoSerializer(databaseId, /* useProto3Json= */ true);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { logDebug } from '../util/log';\n\nconst LOG_TAG = 'ExponentialBackoff';\n\n/**\n * Initial backoff time in milliseconds after an error.\n * Set to 1s according to https://cloud.google.com/apis/design/errors.\n */\nconst DEFAULT_BACKOFF_INITIAL_DELAY_MS = 1000;\n\nconst DEFAULT_BACKOFF_FACTOR = 1.5;\n\n/** Maximum backoff time in milliseconds */\nconst DEFAULT_BACKOFF_MAX_DELAY_MS = 60 * 1000;\n\n/**\n * A helper for running delayed tasks following an exponential backoff curve\n * between attempts.\n *\n * Each delay is made up of a \"base\" delay which follows the exponential\n * backoff curve, and a +/- 50% \"jitter\" that is calculated and added to the\n * base delay. This prevents clients from accidentally synchronizing their\n * delays causing spikes of load to the backend.\n */\nexport class ExponentialBackoff {\n private currentBaseMs: number = 0;\n private timerPromise: DelayedOperation | null = null;\n /** The last backoff attempt, as epoch milliseconds. */\n private lastAttemptTime = Date.now();\n\n constructor(\n /**\n * The AsyncQueue to run backoff operations on.\n */\n private readonly queue: AsyncQueue,\n /**\n * The ID to use when scheduling backoff operations on the AsyncQueue.\n */\n private readonly timerId: TimerId,\n /**\n * The initial delay (used as the base delay on the first retry attempt).\n * Note that jitter will still be applied, so the actual delay could be as\n * little as 0.5*initialDelayMs.\n */\n private readonly initialDelayMs: number = DEFAULT_BACKOFF_INITIAL_DELAY_MS,\n /**\n * The multiplier to use to determine the extended base delay after each\n * attempt.\n */\n private readonly backoffFactor: number = DEFAULT_BACKOFF_FACTOR,\n /**\n * The maximum base delay after which no further backoff is performed.\n * Note that jitter will still be applied, so the actual delay could be as\n * much as 1.5*maxDelayMs.\n */\n private readonly maxDelayMs: number = DEFAULT_BACKOFF_MAX_DELAY_MS\n ) {\n this.reset();\n }\n\n /**\n * Resets the backoff delay.\n *\n * The very next backoffAndWait() will have no delay. If it is called again\n * (i.e. due to an error), initialDelayMs (plus jitter) will be used, and\n * subsequent ones will increase according to the backoffFactor.\n */\n reset(): void {\n this.currentBaseMs = 0;\n }\n\n /**\n * Resets the backoff delay to the maximum delay (e.g. for use after a\n * RESOURCE_EXHAUSTED error).\n */\n resetToMax(): void {\n this.currentBaseMs = this.maxDelayMs;\n }\n\n /**\n * Returns a promise that resolves after currentDelayMs, and increases the\n * delay for any subsequent attempts. If there was a pending backoff operation\n * already, it will be canceled.\n */\n backoffAndRun(op: () => Promise): void {\n // Cancel any pending backoff operation.\n this.cancel();\n\n // First schedule using the current base (which may be 0 and should be\n // honored as such).\n const desiredDelayWithJitterMs = Math.floor(\n this.currentBaseMs + this.jitterDelayMs()\n );\n\n // Guard against lastAttemptTime being in the future due to a clock change.\n const delaySoFarMs = Math.max(0, Date.now() - this.lastAttemptTime);\n\n // Guard against the backoff delay already being past.\n const remainingDelayMs = Math.max(\n 0,\n desiredDelayWithJitterMs - delaySoFarMs\n );\n\n if (remainingDelayMs > 0) {\n logDebug(\n LOG_TAG,\n `Backing off for ${remainingDelayMs} ms ` +\n `(base delay: ${this.currentBaseMs} ms, ` +\n `delay with jitter: ${desiredDelayWithJitterMs} ms, ` +\n `last attempt: ${delaySoFarMs} ms ago)`\n );\n }\n\n this.timerPromise = this.queue.enqueueAfterDelay(\n this.timerId,\n remainingDelayMs,\n () => {\n this.lastAttemptTime = Date.now();\n return op();\n }\n );\n\n // Apply backoff factor to determine next delay and ensure it is within\n // bounds.\n this.currentBaseMs *= this.backoffFactor;\n if (this.currentBaseMs < this.initialDelayMs) {\n this.currentBaseMs = this.initialDelayMs;\n }\n if (this.currentBaseMs > this.maxDelayMs) {\n this.currentBaseMs = this.maxDelayMs;\n }\n }\n\n skipBackoff(): void {\n if (this.timerPromise !== null) {\n this.timerPromise.skipDelay();\n this.timerPromise = null;\n }\n }\n\n cancel(): void {\n if (this.timerPromise !== null) {\n this.timerPromise.cancel();\n this.timerPromise = null;\n }\n }\n\n /** Returns a random value in the range [-currentBaseMs/2, currentBaseMs/2] */\n private jitterDelayMs(): number {\n return (Math.random() - 0.5) * this.currentBaseMs;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider, Token } from '../api/credentials';\nimport { User } from '../auth/user';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { TargetId } from '../core/types';\nimport { TargetData } from '../local/target_data';\nimport { Mutation, MutationResult } from '../model/mutation';\nimport {\n ListenRequest as ProtoListenRequest,\n ListenResponse as ProtoListenResponse,\n WriteRequest as ProtoWriteRequest,\n WriteResponse as ProtoWriteResponse\n} from '../protos/firestore_proto_api';\nimport { debugAssert, hardAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logError } from '../util/log';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { ExponentialBackoff } from './backoff';\nimport { Connection, Stream } from './connection';\nimport {\n fromVersion,\n fromWatchChange,\n fromWriteResults,\n getEncodedDatabaseId,\n JsonProtoSerializer,\n toListenRequestLabels,\n toMutation,\n toTarget,\n versionFromListenResponse\n} from './serializer';\nimport { WatchChange } from './watch_change';\n\nconst LOG_TAG = 'PersistentStream';\n\n// The generated proto interfaces for these class are missing the database\n// field. So we add it here.\n// TODO(b/36015800): Remove this once the api generator is fixed.\ninterface ListenRequest extends ProtoListenRequest {\n database?: string;\n}\nexport interface WriteRequest extends ProtoWriteRequest {\n database?: string;\n}\n/**\n * PersistentStream can be in one of 5 states (each described in detail below)\n * based on the following state transition diagram:\n *\n * start() called auth & connection succeeded\n * INITIAL ----------------> STARTING -----------------------------> OPEN\n * ^ | |\n * | | error occurred |\n * | \\-----------------------------v-----/\n * | |\n * backoff | |\n * elapsed | start() called |\n * \\--- BACKOFF <---------------- ERROR\n *\n * [any state] --------------------------> INITIAL\n * stop() called or\n * idle timer expired\n */\nconst enum PersistentStreamState {\n /**\n * The streaming RPC is not yet running and there's no error condition.\n * Calling start() will start the stream immediately without backoff.\n * While in this state isStarted() will return false.\n */\n Initial,\n\n /**\n * The stream is starting, either waiting for an auth token or for the stream\n * to successfully open. While in this state, isStarted() will return true but\n * isOpen() will return false.\n */\n Starting,\n\n /**\n * The streaming RPC is up and running. Requests and responses can flow\n * freely. Both isStarted() and isOpen() will return true.\n */\n Open,\n\n /**\n * The stream is healthy and has been connected for more than 10 seconds. We\n * therefore assume that the credentials we passed were valid. Both\n * isStarted() and isOpen() will return true.\n */\n Healthy,\n\n /**\n * The stream encountered an error. The next start attempt will back off.\n * While in this state isStarted() will return false.\n */\n Error,\n\n /**\n * An in-between state after an error where the stream is waiting before\n * re-starting. After waiting is complete, the stream will try to open.\n * While in this state isStarted() will return true but isOpen() will return\n * false.\n */\n Backoff\n}\n\n/**\n * Provides a common interface that is shared by the listeners for stream\n * events by the concrete implementation classes.\n */\nexport interface PersistentStreamListener {\n /**\n * Called after receiving an acknowledgement from the server, confirming that\n * we are able to connect to it.\n */\n onConnected: () => Promise;\n /**\n * Called after the stream was established and can accept outgoing\n * messages\n */\n onOpen: () => Promise;\n /**\n * Called after the stream has closed. If there was an error, the\n * FirestoreError will be set.\n */\n onClose: (err?: FirestoreError) => Promise;\n}\n\n/** The time a stream stays open after it is marked idle. */\nconst IDLE_TIMEOUT_MS = 60 * 1000;\n\n/** The time a stream stays open until we consider it healthy. */\nconst HEALTHY_TIMEOUT_MS = 10 * 1000;\n\n/**\n * A PersistentStream is an abstract base class that represents a streaming RPC\n * to the Firestore backend. It's built on top of the connections own support\n * for streaming RPCs, and adds several critical features for our clients:\n *\n * - Exponential backoff on failure\n * - Authentication via CredentialsProvider\n * - Dispatching all callbacks into the shared worker queue\n * - Closing idle streams after 60 seconds of inactivity\n *\n * Subclasses of PersistentStream implement serialization of models to and\n * from the JSON representation of the protocol buffers for a specific\n * streaming RPC.\n *\n * ## Starting and Stopping\n *\n * Streaming RPCs are stateful and need to be start()ed before messages can\n * be sent and received. The PersistentStream will call the onOpen() function\n * of the listener once the stream is ready to accept requests.\n *\n * Should a start() fail, PersistentStream will call the registered onClose()\n * listener with a FirestoreError indicating what went wrong.\n *\n * A PersistentStream can be started and stopped repeatedly.\n *\n * Generic types:\n * SendType: The type of the outgoing message of the underlying\n * connection stream\n * ReceiveType: The type of the incoming message of the underlying\n * connection stream\n * ListenerType: The type of the listener that will be used for callbacks\n */\nexport abstract class PersistentStream<\n SendType,\n ReceiveType,\n ListenerType extends PersistentStreamListener\n> {\n private state = PersistentStreamState.Initial;\n /**\n * A close count that's incremented every time the stream is closed; used by\n * getCloseGuardedDispatcher() to invalidate callbacks that happen after\n * close.\n */\n private closeCount = 0;\n\n private idleTimer: DelayedOperation | null = null;\n private healthCheck: DelayedOperation | null = null;\n private stream: Stream | null = null;\n\n protected backoff: ExponentialBackoff;\n\n constructor(\n private queue: AsyncQueue,\n connectionTimerId: TimerId,\n private idleTimerId: TimerId,\n private healthTimerId: TimerId,\n protected connection: Connection,\n private authCredentialsProvider: CredentialsProvider,\n private appCheckCredentialsProvider: CredentialsProvider,\n protected listener: ListenerType\n ) {\n this.backoff = new ExponentialBackoff(queue, connectionTimerId);\n }\n\n /**\n * Count of response messages received.\n */\n protected responseCount: number = 0;\n\n /**\n * Returns true if start() has been called and no error has occurred. True\n * indicates the stream is open or in the process of opening (which\n * encompasses respecting backoff, getting auth tokens, and starting the\n * actual RPC). Use isOpen() to determine if the stream is open and ready for\n * outbound requests.\n */\n isStarted(): boolean {\n return (\n this.state === PersistentStreamState.Starting ||\n this.state === PersistentStreamState.Backoff ||\n this.isOpen()\n );\n }\n\n /**\n * Returns true if the underlying RPC is open (the onOpen() listener has been\n * called) and the stream is ready for outbound requests.\n */\n isOpen(): boolean {\n return (\n this.state === PersistentStreamState.Open ||\n this.state === PersistentStreamState.Healthy\n );\n }\n\n /**\n * Starts the RPC. Only allowed if isStarted() returns false. The stream is\n * not immediately ready for use: onOpen() will be invoked when the RPC is\n * ready for outbound requests, at which point isOpen() will return true.\n *\n * When start returns, isStarted() will return true.\n */\n start(): void {\n this.responseCount = 0;\n if (this.state === PersistentStreamState.Error) {\n this.performBackoff();\n return;\n }\n\n debugAssert(\n this.state === PersistentStreamState.Initial,\n 'Already started'\n );\n this.auth();\n }\n\n /**\n * Stops the RPC. This call is idempotent and allowed regardless of the\n * current isStarted() state.\n *\n * When stop returns, isStarted() and isOpen() will both return false.\n */\n async stop(): Promise {\n if (this.isStarted()) {\n await this.close(PersistentStreamState.Initial);\n }\n }\n\n /**\n * After an error the stream will usually back off on the next attempt to\n * start it. If the error warrants an immediate restart of the stream, the\n * sender can use this to indicate that the receiver should not back off.\n *\n * Each error will call the onClose() listener. That function can decide to\n * inhibit backoff if required.\n */\n inhibitBackoff(): void {\n debugAssert(\n !this.isStarted(),\n 'Can only inhibit backoff in a stopped state'\n );\n\n this.state = PersistentStreamState.Initial;\n this.backoff.reset();\n }\n\n /**\n * Marks this stream as idle. If no further actions are performed on the\n * stream for one minute, the stream will automatically close itself and\n * notify the stream's onClose() handler with Status.OK. The stream will then\n * be in a !isStarted() state, requiring the caller to start the stream again\n * before further use.\n *\n * Only streams that are in state 'Open' can be marked idle, as all other\n * states imply pending network operations.\n */\n markIdle(): void {\n // Starts the idle time if we are in state 'Open' and are not yet already\n // running a timer (in which case the previous idle timeout still applies).\n if (this.isOpen() && this.idleTimer === null) {\n this.idleTimer = this.queue.enqueueAfterDelay(\n this.idleTimerId,\n IDLE_TIMEOUT_MS,\n () => this.handleIdleCloseTimer()\n );\n }\n }\n\n /** Sends a message to the underlying stream. */\n protected sendRequest(msg: SendType): void {\n this.cancelIdleCheck();\n this.stream!.send(msg);\n }\n\n /** Called by the idle timer when the stream should close due to inactivity. */\n private async handleIdleCloseTimer(): Promise {\n if (this.isOpen()) {\n // When timing out an idle stream there's no reason to force the stream into backoff when\n // it restarts so set the stream state to Initial instead of Error.\n return this.close(PersistentStreamState.Initial);\n }\n }\n\n /** Marks the stream as active again. */\n private cancelIdleCheck(): void {\n if (this.idleTimer) {\n this.idleTimer.cancel();\n this.idleTimer = null;\n }\n }\n\n /** Cancels the health check delayed operation. */\n private cancelHealthCheck(): void {\n if (this.healthCheck) {\n this.healthCheck.cancel();\n this.healthCheck = null;\n }\n }\n\n /**\n * Closes the stream and cleans up as necessary:\n *\n * * closes the underlying GRPC stream;\n * * calls the onClose handler with the given 'error';\n * * sets internal stream state to 'finalState';\n * * adjusts the backoff timer based on the error\n *\n * A new stream can be opened by calling start().\n *\n * @param finalState - the intended state of the stream after closing.\n * @param error - the error the connection was closed with.\n */\n private async close(\n finalState: PersistentStreamState,\n error?: FirestoreError\n ): Promise {\n debugAssert(this.isStarted(), 'Only started streams should be closed.');\n debugAssert(\n finalState === PersistentStreamState.Error || isNullOrUndefined(error),\n \"Can't provide an error when not in an error state.\"\n );\n\n // Cancel any outstanding timers (they're guaranteed not to execute).\n this.cancelIdleCheck();\n this.cancelHealthCheck();\n this.backoff.cancel();\n\n // Invalidates any stream-related callbacks (e.g. from auth or the\n // underlying stream), guaranteeing they won't execute.\n this.closeCount++;\n\n if (finalState !== PersistentStreamState.Error) {\n // If this is an intentional close ensure we don't delay our next connection attempt.\n this.backoff.reset();\n } else if (error && error.code === Code.RESOURCE_EXHAUSTED) {\n // Log the error. (Probably either 'quota exceeded' or 'max queue length reached'.)\n logError(error.toString());\n logError(\n 'Using maximum backoff delay to prevent overloading the backend.'\n );\n this.backoff.resetToMax();\n } else if (\n error &&\n error.code === Code.UNAUTHENTICATED &&\n this.state !== PersistentStreamState.Healthy\n ) {\n // \"unauthenticated\" error means the token was rejected. This should rarely\n // happen since both Auth and AppCheck ensure a sufficient TTL when we\n // request a token. If a user manually resets their system clock this can\n // fail, however. In this case, we should get a Code.UNAUTHENTICATED error\n // before we received the first message and we need to invalidate the token\n // to ensure that we fetch a new token.\n this.authCredentialsProvider.invalidateToken();\n this.appCheckCredentialsProvider.invalidateToken();\n }\n\n // Clean up the underlying stream because we are no longer interested in events.\n if (this.stream !== null) {\n this.tearDown();\n this.stream.close();\n this.stream = null;\n }\n\n // This state must be assigned before calling onClose() to allow the callback to\n // inhibit backoff or otherwise manipulate the state in its non-started state.\n this.state = finalState;\n\n // Notify the listener that the stream closed.\n await this.listener.onClose(error);\n }\n\n /**\n * Can be overridden to perform additional cleanup before the stream is closed.\n * Calling super.tearDown() is not required.\n */\n protected tearDown(): void {}\n\n /**\n * Used by subclasses to start the concrete RPC and return the underlying\n * connection stream.\n */\n protected abstract startRpc(\n authToken: Token | null,\n appCheckToken: Token | null\n ): Stream;\n\n /**\n * Called when the stream receives first message.\n * The function will be called on the right queue and must return a Promise.\n * @param message - The message received from the stream.\n */\n protected abstract onFirst(message: ReceiveType): Promise;\n\n /**\n * Called on subsequent messages after the stream has received first message.\n * The function will be called on the right queue and must return a Promise.\n * @param message - The message received from the stream.\n */\n protected abstract onNext(message: ReceiveType): Promise;\n\n private auth(): void {\n debugAssert(\n this.state === PersistentStreamState.Initial,\n 'Must be in initial state to auth'\n );\n\n this.state = PersistentStreamState.Starting;\n\n const dispatchIfNotClosed = this.getCloseGuardedDispatcher(this.closeCount);\n\n // TODO(mikelehen): Just use dispatchIfNotClosed, but see TODO below.\n const closeCount = this.closeCount;\n\n Promise.all([\n this.authCredentialsProvider.getToken(),\n this.appCheckCredentialsProvider.getToken()\n ]).then(\n ([authToken, appCheckToken]) => {\n // Stream can be stopped while waiting for authentication.\n // TODO(mikelehen): We really should just use dispatchIfNotClosed\n // and let this dispatch onto the queue, but that opened a spec test can\n // of worms that I don't want to deal with in this PR.\n if (this.closeCount === closeCount) {\n // Normally we'd have to schedule the callback on the AsyncQueue.\n // However, the following calls are safe to be called outside the\n // AsyncQueue since they don't chain asynchronous calls\n this.startStream(authToken, appCheckToken);\n }\n },\n (error: Error) => {\n dispatchIfNotClosed(() => {\n const rpcError = new FirestoreError(\n Code.UNKNOWN,\n 'Fetching auth token failed: ' + error.message\n );\n return this.handleStreamClose(rpcError);\n });\n }\n );\n }\n\n private startStream(\n authToken: Token | null,\n appCheckToken: Token | null\n ): void {\n debugAssert(\n this.state === PersistentStreamState.Starting,\n 'Trying to start stream in a non-starting state'\n );\n\n const dispatchIfNotClosed = this.getCloseGuardedDispatcher(this.closeCount);\n\n this.stream = this.startRpc(authToken, appCheckToken);\n this.stream.onConnected(() => {\n dispatchIfNotClosed(() => this.listener!.onConnected());\n });\n this.stream.onOpen(() => {\n dispatchIfNotClosed(() => {\n debugAssert(\n this.state === PersistentStreamState.Starting,\n 'Expected stream to be in state Starting, but was ' + this.state\n );\n this.state = PersistentStreamState.Open;\n debugAssert(\n this.healthCheck === null,\n 'Expected healthCheck to be null'\n );\n this.healthCheck = this.queue.enqueueAfterDelay(\n this.healthTimerId,\n HEALTHY_TIMEOUT_MS,\n () => {\n if (this.isOpen()) {\n this.state = PersistentStreamState.Healthy;\n }\n return Promise.resolve();\n }\n );\n return this.listener!.onOpen();\n });\n });\n this.stream.onClose((error?: FirestoreError) => {\n dispatchIfNotClosed(() => {\n return this.handleStreamClose(error);\n });\n });\n this.stream.onMessage((msg: ReceiveType) => {\n dispatchIfNotClosed(() => {\n if (++this.responseCount === 1) {\n return this.onFirst(msg);\n } else {\n return this.onNext(msg);\n }\n });\n });\n }\n\n private performBackoff(): void {\n debugAssert(\n this.state === PersistentStreamState.Error,\n 'Should only perform backoff when in Error state'\n );\n this.state = PersistentStreamState.Backoff;\n\n this.backoff.backoffAndRun(async () => {\n debugAssert(\n this.state === PersistentStreamState.Backoff,\n 'Backoff elapsed but state is now: ' + this.state\n );\n\n this.state = PersistentStreamState.Initial;\n this.start();\n debugAssert(this.isStarted(), 'PersistentStream should have started');\n });\n }\n\n // Visible for tests\n handleStreamClose(error?: FirestoreError): Promise {\n debugAssert(\n this.isStarted(),\n \"Can't handle server close on non-started stream\"\n );\n logDebug(LOG_TAG, `close with error: ${error}`);\n\n this.stream = null;\n\n // In theory the stream could close cleanly, however, in our current model\n // we never expect this to happen because if we stop a stream ourselves,\n // this callback will never be called. To prevent cases where we retry\n // without a backoff accidentally, we set the stream to error in all cases.\n return this.close(PersistentStreamState.Error, error);\n }\n\n /**\n * Returns a \"dispatcher\" function that dispatches operations onto the\n * AsyncQueue but only runs them if closeCount remains unchanged. This allows\n * us to turn auth / stream callbacks into no-ops if the stream is closed /\n * re-opened, etc.\n */\n private getCloseGuardedDispatcher(\n startCloseCount: number\n ): (fn: () => Promise) => void {\n return (fn: () => Promise): void => {\n this.queue.enqueueAndForget(() => {\n if (this.closeCount === startCloseCount) {\n return fn();\n } else {\n logDebug(\n LOG_TAG,\n 'stream callback skipped by getCloseGuardedDispatcher.'\n );\n return Promise.resolve();\n }\n });\n };\n }\n}\n\n/** Listener for the PersistentWatchStream */\nexport interface WatchStreamListener extends PersistentStreamListener {\n /**\n * Called on a watchChange. The snapshot parameter will be MIN if the watch\n * change did not have a snapshot associated with it.\n */\n onWatchChange: (\n watchChange: WatchChange,\n snapshot: SnapshotVersion\n ) => Promise;\n}\n\n/**\n * A PersistentStream that implements the Listen RPC.\n *\n * Once the Listen stream has called the onOpen() listener, any number of\n * listen() and unlisten() calls can be made to control what changes will be\n * sent from the server for ListenResponses.\n */\nexport class PersistentListenStream extends PersistentStream<\n ProtoListenRequest,\n ProtoListenResponse,\n WatchStreamListener\n> {\n constructor(\n queue: AsyncQueue,\n connection: Connection,\n authCredentials: CredentialsProvider,\n appCheckCredentials: CredentialsProvider,\n private serializer: JsonProtoSerializer,\n listener: WatchStreamListener\n ) {\n super(\n queue,\n TimerId.ListenStreamConnectionBackoff,\n TimerId.ListenStreamIdle,\n TimerId.HealthCheckTimeout,\n connection,\n authCredentials,\n appCheckCredentials,\n listener\n );\n }\n\n protected startRpc(\n authToken: Token | null,\n appCheckToken: Token | null\n ): Stream {\n return this.connection.openStream(\n 'Listen',\n authToken,\n appCheckToken\n );\n }\n\n protected onFirst(watchChangeProto: ProtoListenResponse): Promise {\n return this.onNext(watchChangeProto);\n }\n\n protected onNext(watchChangeProto: ProtoListenResponse): Promise {\n // A successful response means the stream is healthy\n this.backoff.reset();\n\n const watchChange = fromWatchChange(this.serializer, watchChangeProto);\n const snapshot = versionFromListenResponse(watchChangeProto);\n return this.listener!.onWatchChange(watchChange, snapshot);\n }\n\n /**\n * Registers interest in the results of the given target. If the target\n * includes a resumeToken it will be included in the request. Results that\n * affect the target will be streamed back as WatchChange messages that\n * reference the targetId.\n */\n watch(targetData: TargetData): void {\n const request: ListenRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n request.addTarget = toTarget(this.serializer, targetData);\n\n const labels = toListenRequestLabels(this.serializer, targetData);\n if (labels) {\n request.labels = labels;\n }\n\n this.sendRequest(request);\n }\n\n /**\n * Unregisters interest in the results of the target associated with the\n * given targetId.\n */\n unwatch(targetId: TargetId): void {\n const request: ListenRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n request.removeTarget = targetId;\n this.sendRequest(request);\n }\n}\n\n/** Listener for the PersistentWriteStream */\nexport interface WriteStreamListener extends PersistentStreamListener {\n /**\n * Called by the PersistentWriteStream upon a successful handshake response\n * from the server, which is the receiver's cue to send any pending writes.\n */\n onHandshakeComplete: () => Promise;\n\n /**\n * Called by the PersistentWriteStream upon receiving a StreamingWriteResponse\n * from the server that contains a mutation result.\n */\n onMutationResult: (\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n ) => Promise;\n}\n\n/**\n * A Stream that implements the Write RPC.\n *\n * The Write RPC requires the caller to maintain special streamToken\n * state in between calls, to help the server understand which responses the\n * client has processed by the time the next request is made. Every response\n * will contain a streamToken; this value must be passed to the next\n * request.\n *\n * After calling start() on this stream, the next request must be a handshake,\n * containing whatever streamToken is on hand. Once a response to this\n * request is received, all pending mutations may be submitted. When\n * submitting multiple batches of mutations at the same time, it's\n * okay to use the same streamToken for the calls to writeMutations.\n *\n * TODO(b/33271235): Use proto types\n */\nexport class PersistentWriteStream extends PersistentStream<\n ProtoWriteRequest,\n ProtoWriteResponse,\n WriteStreamListener\n> {\n constructor(\n queue: AsyncQueue,\n connection: Connection,\n authCredentials: CredentialsProvider,\n appCheckCredentials: CredentialsProvider,\n private serializer: JsonProtoSerializer,\n listener: WriteStreamListener\n ) {\n super(\n queue,\n TimerId.WriteStreamConnectionBackoff,\n TimerId.WriteStreamIdle,\n TimerId.HealthCheckTimeout,\n connection,\n authCredentials,\n appCheckCredentials,\n listener\n );\n }\n\n /**\n * The last received stream token from the server, used to acknowledge which\n * responses the client has processed. Stream tokens are opaque checkpoint\n * markers whose only real value is their inclusion in the next request.\n *\n * PersistentWriteStream manages propagating this value from responses to the\n * next request.\n */\n private lastStreamToken: string | Uint8Array | undefined;\n\n /**\n * Tracks whether or not a handshake has been successfully exchanged and\n * the stream is ready to accept mutations.\n */\n get handshakeComplete(): boolean {\n return this.responseCount > 0;\n }\n\n // Override of PersistentStream.start\n start(): void {\n this.lastStreamToken = undefined;\n super.start();\n }\n\n protected tearDown(): void {\n if (this.handshakeComplete) {\n this.writeMutations([]);\n }\n }\n\n protected startRpc(\n authToken: Token | null,\n appCheckToken: Token | null\n ): Stream {\n return this.connection.openStream(\n 'Write',\n authToken,\n appCheckToken\n );\n }\n\n protected onFirst(responseProto: ProtoWriteResponse): Promise {\n // Always capture the last stream token.\n hardAssert(\n !!responseProto.streamToken,\n 'Got a write handshake response without a stream token'\n );\n this.lastStreamToken = responseProto.streamToken;\n\n // The first response is always the handshake response\n hardAssert(\n !responseProto.writeResults || responseProto.writeResults.length === 0,\n 'Got mutation results for handshake'\n );\n return this.listener!.onHandshakeComplete();\n }\n\n protected onNext(responseProto: ProtoWriteResponse): Promise {\n // Always capture the last stream token.\n hardAssert(\n !!responseProto.streamToken,\n 'Got a write response without a stream token'\n );\n this.lastStreamToken = responseProto.streamToken;\n\n // A successful first write response means the stream is healthy,\n // Note, that we could consider a successful handshake healthy, however,\n // the write itself might be causing an error we want to back off from.\n this.backoff.reset();\n\n const results = fromWriteResults(\n responseProto.writeResults,\n responseProto.commitTime\n );\n const commitVersion = fromVersion(responseProto.commitTime!);\n return this.listener!.onMutationResult(commitVersion, results);\n }\n\n /**\n * Sends an initial streamToken to the server, performing the handshake\n * required to make the StreamingWrite RPC work. Subsequent\n * calls should wait until onHandshakeComplete was called.\n */\n writeHandshake(): void {\n debugAssert(this.isOpen(), 'Writing handshake requires an opened stream');\n debugAssert(!this.handshakeComplete, 'Handshake already completed');\n debugAssert(\n !this.lastStreamToken,\n 'Stream token should be empty during handshake'\n );\n // TODO(dimond): Support stream resumption. We intentionally do not set the\n // stream token on the handshake, ignoring any stream token we might have.\n const request: WriteRequest = {};\n request.database = getEncodedDatabaseId(this.serializer);\n this.sendRequest(request);\n }\n\n /** Sends a group of mutations to the Firestore backend to apply. */\n writeMutations(mutations: Mutation[]): void {\n debugAssert(this.isOpen(), 'Writing mutations requires an opened stream');\n debugAssert(\n this.handshakeComplete,\n 'Handshake must be complete before writing mutations'\n );\n debugAssert(\n !!this.lastStreamToken,\n 'Trying to write mutation without a token'\n );\n\n const request: WriteRequest = {\n streamToken: this.lastStreamToken,\n writes: mutations.map(mutation => toMutation(this.serializer, mutation))\n };\n\n this.sendRequest(request);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { User } from '../auth/user';\nimport { Aggregate } from '../core/aggregate';\nimport { DatabaseId } from '../core/database_info';\nimport { queryToAggregateTarget, Query, queryToTarget } from '../core/query';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { ResourcePath } from '../model/path';\nimport {\n ApiClientObjectMap,\n BatchGetDocumentsRequest as ProtoBatchGetDocumentsRequest,\n BatchGetDocumentsResponse as ProtoBatchGetDocumentsResponse,\n RunAggregationQueryRequest as ProtoRunAggregationQueryRequest,\n RunAggregationQueryResponse as ProtoRunAggregationQueryResponse,\n RunQueryRequest as ProtoRunQueryRequest,\n RunQueryResponse as ProtoRunQueryResponse,\n Value\n} from '../protos/firestore_proto_api';\nimport { debugAssert, debugCast, hardAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { Connection } from './connection';\nimport {\n PersistentListenStream,\n PersistentWriteStream,\n WatchStreamListener,\n WriteStreamListener\n} from './persistent_stream';\nimport {\n fromDocument,\n fromBatchGetDocumentsResponse,\n JsonProtoSerializer,\n toMutation,\n toName,\n toQueryTarget,\n toResourcePath,\n toRunAggregationQueryRequest\n} from './serializer';\n\n/**\n * Datastore and its related methods are a wrapper around the external Google\n * Cloud Datastore grpc API, which provides an interface that is more convenient\n * for the rest of the client SDK architecture to consume.\n */\nexport abstract class Datastore {\n abstract terminate(): void;\n abstract serializer: JsonProtoSerializer;\n}\n\n/**\n * An implementation of Datastore that exposes additional state for internal\n * consumption.\n */\nclass DatastoreImpl extends Datastore {\n terminated = false;\n\n constructor(\n readonly authCredentials: CredentialsProvider,\n readonly appCheckCredentials: CredentialsProvider,\n readonly connection: Connection,\n readonly serializer: JsonProtoSerializer\n ) {\n super();\n }\n\n verifyInitialized(): void {\n debugAssert(!!this.connection, 'Datastore.start() not called');\n if (this.terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n }\n\n /** Invokes the provided RPC with auth and AppCheck tokens. */\n invokeRPC(\n rpcName: string,\n databaseId: DatabaseId,\n resourcePath: ResourcePath,\n request: Req\n ): Promise {\n this.verifyInitialized();\n return Promise.all([\n this.authCredentials.getToken(),\n this.appCheckCredentials.getToken()\n ])\n .then(([authToken, appCheckToken]) => {\n return this.connection.invokeRPC(\n rpcName,\n toResourcePath(databaseId, resourcePath),\n request,\n authToken,\n appCheckToken\n );\n })\n .catch((error: FirestoreError) => {\n if (error.name === 'FirebaseError') {\n if (error.code === Code.UNAUTHENTICATED) {\n this.authCredentials.invalidateToken();\n this.appCheckCredentials.invalidateToken();\n }\n throw error;\n } else {\n throw new FirestoreError(Code.UNKNOWN, error.toString());\n }\n });\n }\n\n /** Invokes the provided RPC with streamed results with auth and AppCheck tokens. */\n invokeStreamingRPC(\n rpcName: string,\n databaseId: DatabaseId,\n resourcePath: ResourcePath,\n request: Req,\n expectedResponseCount?: number\n ): Promise {\n this.verifyInitialized();\n return Promise.all([\n this.authCredentials.getToken(),\n this.appCheckCredentials.getToken()\n ])\n .then(([authToken, appCheckToken]) => {\n return this.connection.invokeStreamingRPC(\n rpcName,\n toResourcePath(databaseId, resourcePath),\n request,\n authToken,\n appCheckToken,\n expectedResponseCount\n );\n })\n .catch((error: FirestoreError) => {\n if (error.name === 'FirebaseError') {\n if (error.code === Code.UNAUTHENTICATED) {\n this.authCredentials.invalidateToken();\n this.appCheckCredentials.invalidateToken();\n }\n throw error;\n } else {\n throw new FirestoreError(Code.UNKNOWN, error.toString());\n }\n });\n }\n\n terminate(): void {\n this.terminated = true;\n this.connection.terminate();\n }\n}\n\n// TODO(firestorexp): Make sure there is only one Datastore instance per\n// firestore-exp client.\nexport function newDatastore(\n authCredentials: CredentialsProvider,\n appCheckCredentials: CredentialsProvider,\n connection: Connection,\n serializer: JsonProtoSerializer\n): Datastore {\n return new DatastoreImpl(\n authCredentials,\n appCheckCredentials,\n connection,\n serializer\n );\n}\n\nexport async function invokeCommitRpc(\n datastore: Datastore,\n mutations: Mutation[]\n): Promise {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const request = {\n writes: mutations.map(m => toMutation(datastoreImpl.serializer, m))\n };\n await datastoreImpl.invokeRPC(\n 'Commit',\n datastoreImpl.serializer.databaseId,\n ResourcePath.emptyPath(),\n request\n );\n}\n\nexport async function invokeBatchGetDocumentsRpc(\n datastore: Datastore,\n keys: DocumentKey[]\n): Promise {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const request = {\n documents: keys.map(k => toName(datastoreImpl.serializer, k))\n };\n const response = await datastoreImpl.invokeStreamingRPC<\n ProtoBatchGetDocumentsRequest,\n ProtoBatchGetDocumentsResponse\n >(\n 'BatchGetDocuments',\n datastoreImpl.serializer.databaseId,\n ResourcePath.emptyPath(),\n request,\n keys.length\n );\n\n const docs = new Map();\n response.forEach(proto => {\n const doc = fromBatchGetDocumentsResponse(datastoreImpl.serializer, proto);\n docs.set(doc.key.toString(), doc);\n });\n const result: Document[] = [];\n keys.forEach(key => {\n const doc = docs.get(key.toString());\n hardAssert(!!doc, 'Missing entity in write response for ' + key);\n result.push(doc);\n });\n return result;\n}\n\nexport async function invokeRunQueryRpc(\n datastore: Datastore,\n query: Query\n): Promise {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const { queryTarget, parent } = toQueryTarget(\n datastoreImpl.serializer,\n queryToTarget(query)\n );\n const response = await datastoreImpl.invokeStreamingRPC<\n ProtoRunQueryRequest,\n ProtoRunQueryResponse\n >('RunQuery', datastoreImpl.serializer.databaseId, parent, {\n structuredQuery: queryTarget.structuredQuery\n });\n return (\n response\n // Omit RunQueryResponses that only contain readTimes.\n .filter(proto => !!proto.document)\n .map(proto =>\n fromDocument(datastoreImpl.serializer, proto.document!, undefined)\n )\n );\n}\n\nexport async function invokeRunAggregationQueryRpc(\n datastore: Datastore,\n query: Query,\n aggregates: Aggregate[]\n): Promise> {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n const { request, aliasMap, parent } = toRunAggregationQueryRequest(\n datastoreImpl.serializer,\n queryToAggregateTarget(query),\n aggregates\n );\n\n if (!datastoreImpl.connection.shouldResourcePathBeIncludedInRequest) {\n delete request.parent;\n }\n const response = await datastoreImpl.invokeStreamingRPC<\n ProtoRunAggregationQueryRequest,\n ProtoRunAggregationQueryResponse\n >(\n 'RunAggregationQuery',\n datastoreImpl.serializer.databaseId,\n parent,\n request,\n /*expectedResponseCount=*/ 1\n );\n\n // Omit RunAggregationQueryResponse that only contain readTimes.\n const filteredResult = response.filter(proto => !!proto.result);\n\n hardAssert(\n filteredResult.length === 1,\n 'Aggregation fields are missing from result.'\n );\n debugAssert(\n !isNullOrUndefined(filteredResult[0].result),\n 'aggregationQueryResponse.result'\n );\n debugAssert(\n !isNullOrUndefined(filteredResult[0].result.aggregateFields),\n 'aggregationQueryResponse.result.aggregateFields'\n );\n\n // Remap the short-form aliases that were sent to the server\n // to the client-side aliases. Users will access the results\n // using the client-side alias.\n const unmappedAggregateFields = filteredResult[0].result?.aggregateFields;\n const remappedFields = Object.keys(unmappedAggregateFields).reduce<\n ApiClientObjectMap\n >((accumulator, key) => {\n debugAssert(\n !isNullOrUndefined(aliasMap[key]),\n `'${key}' not present in aliasMap result`\n );\n accumulator[aliasMap[key]] = unmappedAggregateFields[key]!;\n return accumulator;\n }, {});\n\n return remappedFields;\n}\n\nexport function newPersistentWriteStream(\n datastore: Datastore,\n queue: AsyncQueue,\n listener: WriteStreamListener\n): PersistentWriteStream {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n datastoreImpl.verifyInitialized();\n return new PersistentWriteStream(\n queue,\n datastoreImpl.connection,\n datastoreImpl.authCredentials,\n datastoreImpl.appCheckCredentials,\n datastoreImpl.serializer,\n listener\n );\n}\n\nexport function newPersistentWatchStream(\n datastore: Datastore,\n queue: AsyncQueue,\n listener: WatchStreamListener\n): PersistentListenStream {\n const datastoreImpl = debugCast(datastore, DatastoreImpl);\n datastoreImpl.verifyInitialized();\n return new PersistentListenStream(\n queue,\n datastoreImpl.connection,\n datastoreImpl.authCredentials,\n datastoreImpl.appCheckCredentials,\n datastoreImpl.serializer,\n listener\n );\n}\n","/**\n * @license\n * Copyright 2018 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { OnlineState } from '../core/types';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from '../util/async_queue';\nimport { FirestoreError } from '../util/error';\nimport { logError, logDebug } from '../util/log';\n\nconst LOG_TAG = 'OnlineStateTracker';\n\n// To deal with transient failures, we allow multiple stream attempts before\n// giving up and transitioning from OnlineState.Unknown to Offline.\n// TODO(mikelehen): This used to be set to 2 as a mitigation for b/66228394.\n// @jdimond thinks that bug is sufficiently fixed so that we can set this back\n// to 1. If that works okay, we could potentially remove this logic entirely.\nconst MAX_WATCH_STREAM_FAILURES = 1;\n\n// To deal with stream attempts that don't succeed or fail in a timely manner,\n// we have a timeout for OnlineState to reach Online or Offline.\n// If the timeout is reached, we transition to Offline rather than waiting\n// indefinitely.\nconst ONLINE_STATE_TIMEOUT_MS = 10 * 1000;\n\n/**\n * A component used by the RemoteStore to track the OnlineState (that is,\n * whether or not the client as a whole should be considered to be online or\n * offline), implementing the appropriate heuristics.\n *\n * In particular, when the client is trying to connect to the backend, we\n * allow up to MAX_WATCH_STREAM_FAILURES within ONLINE_STATE_TIMEOUT_MS for\n * a connection to succeed. If we have too many failures or the timeout elapses,\n * then we set the OnlineState to Offline, and the client will behave as if\n * it is offline (get()s will return cached data, etc.).\n */\nexport class OnlineStateTracker {\n /** The current OnlineState. */\n private state = OnlineState.Unknown;\n\n /**\n * A count of consecutive failures to open the stream. If it reaches the\n * maximum defined by MAX_WATCH_STREAM_FAILURES, we'll set the OnlineState to\n * Offline.\n */\n private watchStreamFailures = 0;\n\n /**\n * A timer that elapses after ONLINE_STATE_TIMEOUT_MS, at which point we\n * transition from OnlineState.Unknown to OnlineState.Offline without waiting\n * for the stream to actually fail (MAX_WATCH_STREAM_FAILURES times).\n */\n private onlineStateTimer: DelayedOperation | null = null;\n\n /**\n * Whether the client should log a warning message if it fails to connect to\n * the backend (initially true, cleared after a successful stream, or if we've\n * logged the message already).\n */\n private shouldWarnClientIsOffline = true;\n\n constructor(\n private asyncQueue: AsyncQueue,\n private onlineStateHandler: (onlineState: OnlineState) => void\n ) {}\n\n /**\n * Called by RemoteStore when a watch stream is started (including on each\n * backoff attempt).\n *\n * If this is the first attempt, it sets the OnlineState to Unknown and starts\n * the onlineStateTimer.\n */\n handleWatchStreamStart(): void {\n if (this.watchStreamFailures === 0) {\n this.setAndBroadcast(OnlineState.Unknown);\n\n debugAssert(\n this.onlineStateTimer === null,\n `onlineStateTimer shouldn't be started yet`\n );\n this.onlineStateTimer = this.asyncQueue.enqueueAfterDelay(\n TimerId.OnlineStateTimeout,\n ONLINE_STATE_TIMEOUT_MS,\n () => {\n this.onlineStateTimer = null;\n debugAssert(\n this.state === OnlineState.Unknown,\n 'Timer should be canceled if we transitioned to a different state.'\n );\n this.logClientOfflineWarningIfNecessary(\n `Backend didn't respond within ${ONLINE_STATE_TIMEOUT_MS / 1000} ` +\n `seconds.`\n );\n this.setAndBroadcast(OnlineState.Offline);\n\n // NOTE: handleWatchStreamFailure() will continue to increment\n // watchStreamFailures even though we are already marked Offline,\n // but this is non-harmful.\n\n return Promise.resolve();\n }\n );\n }\n }\n\n /**\n * Updates our OnlineState as appropriate after the watch stream reports a\n * failure. The first failure moves us to the 'Unknown' state. We then may\n * allow multiple failures (based on MAX_WATCH_STREAM_FAILURES) before we\n * actually transition to the 'Offline' state.\n */\n handleWatchStreamFailure(error: FirestoreError): void {\n if (this.state === OnlineState.Online) {\n this.setAndBroadcast(OnlineState.Unknown);\n\n // To get to OnlineState.Online, set() must have been called which would\n // have reset our heuristics.\n debugAssert(\n this.watchStreamFailures === 0,\n 'watchStreamFailures must be 0'\n );\n debugAssert(\n this.onlineStateTimer === null,\n 'onlineStateTimer must be null'\n );\n } else {\n this.watchStreamFailures++;\n if (this.watchStreamFailures >= MAX_WATCH_STREAM_FAILURES) {\n this.clearOnlineStateTimer();\n\n this.logClientOfflineWarningIfNecessary(\n `Connection failed ${MAX_WATCH_STREAM_FAILURES} ` +\n `times. Most recent error: ${error.toString()}`\n );\n\n this.setAndBroadcast(OnlineState.Offline);\n }\n }\n }\n\n /**\n * Explicitly sets the OnlineState to the specified state.\n *\n * Note that this resets our timers / failure counters, etc. used by our\n * Offline heuristics, so must not be used in place of\n * handleWatchStreamStart() and handleWatchStreamFailure().\n */\n set(newState: OnlineState): void {\n this.clearOnlineStateTimer();\n this.watchStreamFailures = 0;\n\n if (newState === OnlineState.Online) {\n // We've connected to watch at least once. Don't warn the developer\n // about being offline going forward.\n this.shouldWarnClientIsOffline = false;\n }\n\n this.setAndBroadcast(newState);\n }\n\n private setAndBroadcast(newState: OnlineState): void {\n if (newState !== this.state) {\n this.state = newState;\n this.onlineStateHandler(newState);\n }\n }\n\n private logClientOfflineWarningIfNecessary(details: string): void {\n const message =\n `Could not reach Cloud Firestore backend. ${details}\\n` +\n `This typically indicates that your device does not have a healthy ` +\n `Internet connection at the moment. The client will operate in offline ` +\n `mode until it is able to successfully connect to the backend.`;\n if (this.shouldWarnClientIsOffline) {\n logError(message);\n this.shouldWarnClientIsOffline = false;\n } else {\n logDebug(LOG_TAG, message);\n }\n }\n\n private clearOnlineStateTimer(): void {\n if (this.onlineStateTimer !== null) {\n this.onlineStateTimer.cancel();\n this.onlineStateTimer = null;\n }\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { User } from '../auth/user';\nimport { SnapshotVersion } from '../core/snapshot_version';\nimport { OnlineState, TargetId } from '../core/types';\nimport { LocalStore } from '../local/local_store';\nimport {\n localStoreGetLastRemoteSnapshotVersion,\n localStoreGetNextMutationBatch\n} from '../local/local_store_impl';\nimport { isIndexedDbTransactionError } from '../local/simple_db';\nimport { TargetData } from '../local/target_data';\nimport { MutationResult } from '../model/mutation';\nimport { MutationBatch, MutationBatchResult } from '../model/mutation_batch';\nimport { debugAssert, debugCast } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport { ConnectivityMonitor, NetworkStatus } from './connectivity_monitor';\nimport {\n Datastore,\n newPersistentWatchStream,\n newPersistentWriteStream\n} from './datastore';\nimport { OnlineStateTracker } from './online_state_tracker';\nimport {\n PersistentListenStream,\n PersistentWriteStream\n} from './persistent_stream';\nimport { RemoteSyncer } from './remote_syncer';\nimport { isPermanentWriteError } from './rpc_error';\nimport {\n DocumentWatchChange,\n ExistenceFilterChange,\n WatchChange,\n WatchChangeAggregator,\n WatchTargetChange,\n WatchTargetChangeState\n} from './watch_change';\n\nconst LOG_TAG = 'RemoteStore';\n\n// TODO(b/35853402): Negotiate this with the stream.\nconst MAX_PENDING_WRITES = 10;\n\n/** Reasons for why the RemoteStore may be offline. */\nconst enum OfflineCause {\n /** The user has explicitly disabled the network (via `disableNetwork()`). */\n UserDisabled,\n /** An IndexedDb failure occurred while persisting a stream update. */\n IndexedDbFailed,\n /** The tab is not the primary tab (only relevant with multi-tab). */\n IsSecondary,\n /** We are restarting the streams due to an Auth credential change. */\n CredentialChange,\n /** The connectivity state of the environment has changed. */\n ConnectivityChange,\n /** The RemoteStore has been shut down. */\n Shutdown\n}\n\n/**\n * RemoteStore - An interface to remotely stored data, basically providing a\n * wrapper around the Datastore that is more reliable for the rest of the\n * system.\n *\n * RemoteStore is responsible for maintaining the connection to the server.\n * - maintaining a list of active listens.\n * - reconnecting when the connection is dropped.\n * - resuming all the active listens on reconnect.\n *\n * RemoteStore handles all incoming events from the Datastore.\n * - listening to the watch stream and repackaging the events as RemoteEvents\n * - notifying SyncEngine of any changes to the active listens.\n *\n * RemoteStore takes writes from other components and handles them reliably.\n * - pulling pending mutations from LocalStore and sending them to Datastore.\n * - retrying mutations that failed because of network problems.\n * - acking mutations to the SyncEngine once they are accepted or rejected.\n */\nexport interface RemoteStore {\n /**\n * SyncEngine to notify of watch and write events. This must be set\n * immediately after construction.\n */\n remoteSyncer: RemoteSyncer;\n}\n\nclass RemoteStoreImpl implements RemoteStore {\n remoteSyncer: RemoteSyncer = {};\n\n /**\n * A list of up to MAX_PENDING_WRITES writes that we have fetched from the\n * LocalStore via fillWritePipeline() and have or will send to the write\n * stream.\n *\n * Whenever writePipeline.length > 0 the RemoteStore will attempt to start or\n * restart the write stream. When the stream is established the writes in the\n * pipeline will be sent in order.\n *\n * Writes remain in writePipeline until they are acknowledged by the backend\n * and thus will automatically be re-sent if the stream is interrupted /\n * restarted before they're acknowledged.\n *\n * Write responses from the backend are linked to their originating request\n * purely based on order, and so we can just shift() writes from the front of\n * the writePipeline as we receive responses.\n */\n writePipeline: MutationBatch[] = [];\n\n /**\n * A mapping of watched targets that the client cares about tracking and the\n * user has explicitly called a 'listen' for this target.\n *\n * These targets may or may not have been sent to or acknowledged by the\n * server. On re-establishing the listen stream, these targets should be sent\n * to the server. The targets removed with unlistens are removed eagerly\n * without waiting for confirmation from the listen stream.\n */\n listenTargets = new Map();\n\n connectivityMonitor: ConnectivityMonitor;\n watchStream?: PersistentListenStream;\n writeStream?: PersistentWriteStream;\n watchChangeAggregator?: WatchChangeAggregator;\n\n /**\n * A set of reasons for why the RemoteStore may be offline. If empty, the\n * RemoteStore may start its network connections.\n */\n offlineCauses = new Set();\n\n /**\n * Event handlers that get called when the network is disabled or enabled.\n *\n * PORTING NOTE: These functions are used on the Web client to create the\n * underlying streams (to support tree-shakeable streams). On Android and iOS,\n * the streams are created during construction of RemoteStore.\n */\n onNetworkStatusChange: Array<(enabled: boolean) => Promise> = [];\n\n onlineStateTracker: OnlineStateTracker;\n\n constructor(\n /**\n * The local store, used to fill the write pipeline with outbound mutations.\n */\n readonly localStore: LocalStore,\n /** The client-side proxy for interacting with the backend. */\n readonly datastore: Datastore,\n readonly asyncQueue: AsyncQueue,\n onlineStateHandler: (onlineState: OnlineState) => void,\n connectivityMonitor: ConnectivityMonitor\n ) {\n this.connectivityMonitor = connectivityMonitor;\n this.connectivityMonitor.addCallback((_: NetworkStatus) => {\n asyncQueue.enqueueAndForget(async () => {\n // Porting Note: Unlike iOS, `restartNetwork()` is called even when the\n // network becomes unreachable as we don't have any other way to tear\n // down our streams.\n if (canUseNetwork(this)) {\n logDebug(\n LOG_TAG,\n 'Restarting streams for network reachability change.'\n );\n await restartNetwork(this);\n }\n });\n });\n\n this.onlineStateTracker = new OnlineStateTracker(\n asyncQueue,\n onlineStateHandler\n );\n }\n}\n\nexport function newRemoteStore(\n localStore: LocalStore,\n datastore: Datastore,\n asyncQueue: AsyncQueue,\n onlineStateHandler: (onlineState: OnlineState) => void,\n connectivityMonitor: ConnectivityMonitor\n): RemoteStore {\n return new RemoteStoreImpl(\n localStore,\n datastore,\n asyncQueue,\n onlineStateHandler,\n connectivityMonitor\n );\n}\n\n/** Re-enables the network. Idempotent. */\nexport function remoteStoreEnableNetwork(\n remoteStore: RemoteStore\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.UserDisabled);\n return enableNetworkInternal(remoteStoreImpl);\n}\n\nasync function enableNetworkInternal(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n if (canUseNetwork(remoteStoreImpl)) {\n for (const networkStatusHandler of remoteStoreImpl.onNetworkStatusChange) {\n await networkStatusHandler(/* enabled= */ true);\n }\n }\n}\n\n/**\n * Temporarily disables the network. The network can be re-enabled using\n * enableNetwork().\n */\nexport async function remoteStoreDisableNetwork(\n remoteStore: RemoteStore\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.add(OfflineCause.UserDisabled);\n await disableNetworkInternal(remoteStoreImpl);\n\n // Set the OnlineState to Offline so get()s return from cache, etc.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Offline);\n}\n\nasync function disableNetworkInternal(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n for (const networkStatusHandler of remoteStoreImpl.onNetworkStatusChange) {\n await networkStatusHandler(/* enabled= */ false);\n }\n}\n\nexport async function remoteStoreShutdown(\n remoteStore: RemoteStore\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n logDebug(LOG_TAG, 'RemoteStore shutting down.');\n remoteStoreImpl.offlineCauses.add(OfflineCause.Shutdown);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.connectivityMonitor.shutdown();\n\n // Set the OnlineState to Unknown (rather than Offline) to avoid potentially\n // triggering spurious listener events with cached data, etc.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n}\n\n/**\n * Starts new listen for the given target. Uses resume token if provided. It\n * is a no-op if the target of given `TargetData` is already being listened to.\n */\nexport function remoteStoreListen(\n remoteStore: RemoteStore,\n targetData: TargetData\n): void {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n\n if (remoteStoreImpl.listenTargets.has(targetData.targetId)) {\n return;\n }\n\n // Mark this as something the client is currently listening for.\n remoteStoreImpl.listenTargets.set(targetData.targetId, targetData);\n\n if (shouldStartWatchStream(remoteStoreImpl)) {\n // The listen will be sent in onWatchStreamOpen\n startWatchStream(remoteStoreImpl);\n } else if (ensureWatchStream(remoteStoreImpl).isOpen()) {\n sendWatchRequest(remoteStoreImpl, targetData);\n }\n}\n\n/**\n * Removes the listen from server. It is a no-op if the given target id is\n * not being listened to.\n */\nexport function remoteStoreUnlisten(\n remoteStore: RemoteStore,\n targetId: TargetId\n): void {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n const watchStream = ensureWatchStream(remoteStoreImpl);\n\n debugAssert(\n remoteStoreImpl.listenTargets.has(targetId),\n `unlisten called on target no currently watched: ${targetId}`\n );\n\n remoteStoreImpl.listenTargets.delete(targetId);\n if (watchStream.isOpen()) {\n sendUnwatchRequest(remoteStoreImpl, targetId);\n }\n\n if (remoteStoreImpl.listenTargets.size === 0) {\n if (watchStream.isOpen()) {\n watchStream.markIdle();\n } else if (canUseNetwork(remoteStoreImpl)) {\n // Revert to OnlineState.Unknown if the watch stream is not open and we\n // have no listeners, since without any listens to send we cannot\n // confirm if the stream is healthy and upgrade to OnlineState.Online.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n }\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the ack to process any messages from this target.\n */\nfunction sendWatchRequest(\n remoteStoreImpl: RemoteStoreImpl,\n targetData: TargetData\n): void {\n remoteStoreImpl.watchChangeAggregator!.recordPendingTargetRequest(\n targetData.targetId\n );\n\n if (\n targetData.resumeToken.approximateByteSize() > 0 ||\n targetData.snapshotVersion.compareTo(SnapshotVersion.min()) > 0\n ) {\n const expectedCount = remoteStoreImpl.remoteSyncer.getRemoteKeysForTarget!(\n targetData.targetId\n ).size;\n targetData = targetData.withExpectedCount(expectedCount);\n }\n\n ensureWatchStream(remoteStoreImpl).watch(targetData);\n}\n\n/**\n * We need to increment the expected number of pending responses we're due\n * from watch so we wait for the removal on the server before we process any\n * messages from this target.\n */\nfunction sendUnwatchRequest(\n remoteStoreImpl: RemoteStoreImpl,\n targetId: TargetId\n): void {\n remoteStoreImpl.watchChangeAggregator!.recordPendingTargetRequest(targetId);\n ensureWatchStream(remoteStoreImpl).unwatch(targetId);\n}\n\nfunction startWatchStream(remoteStoreImpl: RemoteStoreImpl): void {\n debugAssert(\n shouldStartWatchStream(remoteStoreImpl),\n 'startWatchStream() called when shouldStartWatchStream() is false.'\n );\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.getRemoteKeysForTarget,\n 'getRemoteKeysForTarget() not set'\n );\n\n remoteStoreImpl.watchChangeAggregator = new WatchChangeAggregator({\n getRemoteKeysForTarget: targetId =>\n remoteStoreImpl.remoteSyncer.getRemoteKeysForTarget!(targetId),\n getTargetDataForTarget: targetId =>\n remoteStoreImpl.listenTargets.get(targetId) || null,\n getDatabaseId: () => remoteStoreImpl.datastore.serializer.databaseId\n });\n ensureWatchStream(remoteStoreImpl).start();\n remoteStoreImpl.onlineStateTracker.handleWatchStreamStart();\n}\n\n/**\n * Returns whether the watch stream should be started because it's necessary\n * and has not yet been started.\n */\nfunction shouldStartWatchStream(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n !ensureWatchStream(remoteStoreImpl).isStarted() &&\n remoteStoreImpl.listenTargets.size > 0\n );\n}\n\nexport function canUseNetwork(remoteStore: RemoteStore): boolean {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n return remoteStoreImpl.offlineCauses.size === 0;\n}\n\nfunction cleanUpWatchStreamState(remoteStoreImpl: RemoteStoreImpl): void {\n remoteStoreImpl.watchChangeAggregator = undefined;\n}\n\nasync function onWatchStreamConnected(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n // Mark the client as online since we got a \"connected\" notification.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Online);\n}\n\nasync function onWatchStreamOpen(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n remoteStoreImpl.listenTargets.forEach((targetData, targetId) => {\n sendWatchRequest(remoteStoreImpl, targetData);\n });\n}\n\nasync function onWatchStreamClose(\n remoteStoreImpl: RemoteStoreImpl,\n error?: FirestoreError\n): Promise {\n if (error === undefined) {\n // Graceful stop (due to stop() or idle timeout). Make sure that's\n // desirable.\n debugAssert(\n !shouldStartWatchStream(remoteStoreImpl),\n 'Watch stream was stopped gracefully while still needed.'\n );\n }\n\n cleanUpWatchStreamState(remoteStoreImpl);\n\n // If we still need the watch stream, retry the connection.\n if (shouldStartWatchStream(remoteStoreImpl)) {\n remoteStoreImpl.onlineStateTracker.handleWatchStreamFailure(error!);\n\n startWatchStream(remoteStoreImpl);\n } else {\n // No need to restart watch stream because there are no active targets.\n // The online state is set to unknown because there is no active attempt\n // at establishing a connection\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n}\n\nasync function onWatchStreamChange(\n remoteStoreImpl: RemoteStoreImpl,\n watchChange: WatchChange,\n snapshotVersion: SnapshotVersion\n): Promise {\n // Mark the client as online since we got a message from the server\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Online);\n\n if (\n watchChange instanceof WatchTargetChange &&\n watchChange.state === WatchTargetChangeState.Removed &&\n watchChange.cause\n ) {\n // There was an error on a target, don't wait for a consistent snapshot\n // to raise events\n try {\n await handleTargetError(remoteStoreImpl, watchChange);\n } catch (e) {\n logDebug(\n LOG_TAG,\n 'Failed to remove targets %s: %s ',\n watchChange.targetIds.join(','),\n e\n );\n await disableNetworkUntilRecovery(remoteStoreImpl, e as FirestoreError);\n }\n return;\n }\n\n if (watchChange instanceof DocumentWatchChange) {\n remoteStoreImpl.watchChangeAggregator!.handleDocumentChange(watchChange);\n } else if (watchChange instanceof ExistenceFilterChange) {\n remoteStoreImpl.watchChangeAggregator!.handleExistenceFilter(watchChange);\n } else {\n debugAssert(\n watchChange instanceof WatchTargetChange,\n 'Expected watchChange to be an instance of WatchTargetChange'\n );\n remoteStoreImpl.watchChangeAggregator!.handleTargetChange(watchChange);\n }\n\n if (!snapshotVersion.isEqual(SnapshotVersion.min())) {\n try {\n const lastRemoteSnapshotVersion =\n await localStoreGetLastRemoteSnapshotVersion(\n remoteStoreImpl.localStore\n );\n if (snapshotVersion.compareTo(lastRemoteSnapshotVersion) >= 0) {\n // We have received a target change with a global snapshot if the snapshot\n // version is not equal to SnapshotVersion.min().\n await raiseWatchSnapshot(remoteStoreImpl, snapshotVersion);\n }\n } catch (e) {\n logDebug(LOG_TAG, 'Failed to raise snapshot:', e);\n await disableNetworkUntilRecovery(remoteStoreImpl, e as FirestoreError);\n }\n }\n}\n\n/**\n * Recovery logic for IndexedDB errors that takes the network offline until\n * `op` succeeds. Retries are scheduled with backoff using\n * `enqueueRetryable()`. If `op()` is not provided, IndexedDB access is\n * validated via a generic operation.\n *\n * The returned Promise is resolved once the network is disabled and before\n * any retry attempt.\n */\nasync function disableNetworkUntilRecovery(\n remoteStoreImpl: RemoteStoreImpl,\n e: FirestoreError,\n op?: () => Promise\n): Promise {\n if (isIndexedDbTransactionError(e)) {\n debugAssert(\n !remoteStoreImpl.offlineCauses.has(OfflineCause.IndexedDbFailed),\n 'Unexpected network event when IndexedDB was marked failed.'\n );\n remoteStoreImpl.offlineCauses.add(OfflineCause.IndexedDbFailed);\n\n // Disable network and raise offline snapshots\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Offline);\n\n if (!op) {\n // Use a simple read operation to determine if IndexedDB recovered.\n // Ideally, we would expose a health check directly on SimpleDb, but\n // RemoteStore only has access to persistence through LocalStore.\n op = () =>\n localStoreGetLastRemoteSnapshotVersion(remoteStoreImpl.localStore);\n }\n\n // Probe IndexedDB periodically and re-enable network\n remoteStoreImpl.asyncQueue.enqueueRetryable(async () => {\n logDebug(LOG_TAG, 'Retrying IndexedDB access');\n await op!();\n remoteStoreImpl.offlineCauses.delete(OfflineCause.IndexedDbFailed);\n await enableNetworkInternal(remoteStoreImpl);\n });\n } else {\n throw e;\n }\n}\n\n/**\n * Executes `op`. If `op` fails, takes the network offline until `op`\n * succeeds. Returns after the first attempt.\n */\nfunction executeWithRecovery(\n remoteStoreImpl: RemoteStoreImpl,\n op: () => Promise\n): Promise {\n return op().catch(e => disableNetworkUntilRecovery(remoteStoreImpl, e, op));\n}\n\n/**\n * Takes a batch of changes from the Datastore, repackages them as a\n * RemoteEvent, and passes that on to the listener, which is typically the\n * SyncEngine.\n */\nfunction raiseWatchSnapshot(\n remoteStoreImpl: RemoteStoreImpl,\n snapshotVersion: SnapshotVersion\n): Promise {\n debugAssert(\n !snapshotVersion.isEqual(SnapshotVersion.min()),\n \"Can't raise event for unknown SnapshotVersion\"\n );\n const remoteEvent =\n remoteStoreImpl.watchChangeAggregator!.createRemoteEvent(snapshotVersion);\n\n // Update in-memory resume tokens. LocalStore will update the\n // persistent view of these when applying the completed RemoteEvent.\n remoteEvent.targetChanges.forEach((change, targetId) => {\n if (change.resumeToken.approximateByteSize() > 0) {\n const targetData = remoteStoreImpl.listenTargets.get(targetId);\n // A watched target might have been removed already.\n if (targetData) {\n remoteStoreImpl.listenTargets.set(\n targetId,\n targetData.withResumeToken(change.resumeToken, snapshotVersion)\n );\n }\n }\n });\n\n // Re-establish listens for the targets that have been invalidated by\n // existence filter mismatches.\n remoteEvent.targetMismatches.forEach((targetId, targetPurpose) => {\n const targetData = remoteStoreImpl.listenTargets.get(targetId);\n if (!targetData) {\n // A watched target might have been removed already.\n return;\n }\n\n // Clear the resume token for the target, since we're in a known mismatch\n // state.\n remoteStoreImpl.listenTargets.set(\n targetId,\n targetData.withResumeToken(\n ByteString.EMPTY_BYTE_STRING,\n targetData.snapshotVersion\n )\n );\n\n // Cause a hard reset by unwatching and rewatching immediately, but\n // deliberately don't send a resume token so that we get a full update.\n sendUnwatchRequest(remoteStoreImpl, targetId);\n\n // Mark the target we send as being on behalf of an existence filter\n // mismatch, but don't actually retain that in listenTargets. This ensures\n // that we flag the first re-listen this way without impacting future\n // listens of this target (that might happen e.g. on reconnect).\n const requestTargetData = new TargetData(\n targetData.target,\n targetId,\n targetPurpose,\n targetData.sequenceNumber\n );\n sendWatchRequest(remoteStoreImpl, requestTargetData);\n });\n\n // Finally raise remote event\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.applyRemoteEvent,\n 'applyRemoteEvent() not set'\n );\n return remoteStoreImpl.remoteSyncer.applyRemoteEvent(remoteEvent);\n}\n\n/** Handles an error on a target */\nasync function handleTargetError(\n remoteStoreImpl: RemoteStoreImpl,\n watchChange: WatchTargetChange\n): Promise {\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.rejectListen,\n 'rejectListen() not set'\n );\n debugAssert(!!watchChange.cause, 'Handling target error without a cause');\n const error = watchChange.cause!;\n for (const targetId of watchChange.targetIds) {\n // A watched target might have been removed already.\n if (remoteStoreImpl.listenTargets.has(targetId)) {\n await remoteStoreImpl.remoteSyncer.rejectListen(targetId, error);\n remoteStoreImpl.listenTargets.delete(targetId);\n remoteStoreImpl.watchChangeAggregator!.removeTarget(targetId);\n }\n }\n}\n\n/**\n * Attempts to fill our write pipeline with writes from the LocalStore.\n *\n * Called internally to bootstrap or refill the write pipeline and by\n * SyncEngine whenever there are new mutations to process.\n *\n * Starts the write stream if necessary.\n */\nexport async function fillWritePipeline(\n remoteStore: RemoteStore\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n const writeStream = ensureWriteStream(remoteStoreImpl);\n\n let lastBatchIdRetrieved =\n remoteStoreImpl.writePipeline.length > 0\n ? remoteStoreImpl.writePipeline[remoteStoreImpl.writePipeline.length - 1]\n .batchId\n : BATCHID_UNKNOWN;\n\n while (canAddToWritePipeline(remoteStoreImpl)) {\n try {\n const batch = await localStoreGetNextMutationBatch(\n remoteStoreImpl.localStore,\n lastBatchIdRetrieved\n );\n\n if (batch === null) {\n if (remoteStoreImpl.writePipeline.length === 0) {\n writeStream.markIdle();\n }\n break;\n } else {\n lastBatchIdRetrieved = batch.batchId;\n addToWritePipeline(remoteStoreImpl, batch);\n }\n } catch (e) {\n await disableNetworkUntilRecovery(remoteStoreImpl, e as FirestoreError);\n }\n }\n\n if (shouldStartWriteStream(remoteStoreImpl)) {\n startWriteStream(remoteStoreImpl);\n }\n}\n\n/**\n * Returns true if we can add to the write pipeline (i.e. the network is\n * enabled and the write pipeline is not full).\n */\nfunction canAddToWritePipeline(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n remoteStoreImpl.writePipeline.length < MAX_PENDING_WRITES\n );\n}\n\n// For testing\nexport function outstandingWrites(remoteStore: RemoteStore): number {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n return remoteStoreImpl.writePipeline.length;\n}\n\n/**\n * Queues additional writes to be sent to the write stream, sending them\n * immediately if the write stream is established.\n */\nfunction addToWritePipeline(\n remoteStoreImpl: RemoteStoreImpl,\n batch: MutationBatch\n): void {\n debugAssert(\n canAddToWritePipeline(remoteStoreImpl),\n 'addToWritePipeline called when pipeline is full'\n );\n remoteStoreImpl.writePipeline.push(batch);\n\n const writeStream = ensureWriteStream(remoteStoreImpl);\n if (writeStream.isOpen() && writeStream.handshakeComplete) {\n writeStream.writeMutations(batch.mutations);\n }\n}\n\nfunction shouldStartWriteStream(remoteStoreImpl: RemoteStoreImpl): boolean {\n return (\n canUseNetwork(remoteStoreImpl) &&\n !ensureWriteStream(remoteStoreImpl).isStarted() &&\n remoteStoreImpl.writePipeline.length > 0\n );\n}\n\nfunction startWriteStream(remoteStoreImpl: RemoteStoreImpl): void {\n debugAssert(\n shouldStartWriteStream(remoteStoreImpl),\n 'startWriteStream() called when shouldStartWriteStream() is false.'\n );\n ensureWriteStream(remoteStoreImpl).start();\n}\n\nasync function onWriteStreamOpen(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n ensureWriteStream(remoteStoreImpl).writeHandshake();\n}\n\nasync function onWriteHandshakeComplete(\n remoteStoreImpl: RemoteStoreImpl\n): Promise {\n const writeStream = ensureWriteStream(remoteStoreImpl);\n // Send the write pipeline now that the stream is established.\n for (const batch of remoteStoreImpl.writePipeline) {\n writeStream.writeMutations(batch.mutations);\n }\n}\n\nasync function onMutationResult(\n remoteStoreImpl: RemoteStoreImpl,\n commitVersion: SnapshotVersion,\n results: MutationResult[]\n): Promise {\n // This is a response to a write containing mutations and should be\n // correlated to the first write in our write pipeline.\n debugAssert(\n remoteStoreImpl.writePipeline.length > 0,\n 'Got result for empty write pipeline'\n );\n const batch = remoteStoreImpl.writePipeline.shift()!;\n const success = MutationBatchResult.from(batch, commitVersion, results);\n\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.applySuccessfulWrite,\n 'applySuccessfulWrite() not set'\n );\n await executeWithRecovery(remoteStoreImpl, () =>\n remoteStoreImpl.remoteSyncer.applySuccessfulWrite!(success)\n );\n\n // It's possible that with the completion of this mutation another\n // slot has freed up.\n await fillWritePipeline(remoteStoreImpl);\n}\n\nasync function onWriteStreamClose(\n remoteStoreImpl: RemoteStoreImpl,\n error?: FirestoreError\n): Promise {\n if (error === undefined) {\n // Graceful stop (due to stop() or idle timeout). Make sure that's\n // desirable.\n debugAssert(\n !shouldStartWriteStream(remoteStoreImpl),\n 'Write stream was stopped gracefully while still needed.'\n );\n }\n\n // If the write stream closed after the write handshake completes, a write\n // operation failed and we fail the pending operation.\n if (error && ensureWriteStream(remoteStoreImpl).handshakeComplete) {\n // This error affects the actual write.\n await handleWriteError(remoteStoreImpl, error!);\n }\n\n // The write stream might have been started by refilling the write\n // pipeline for failed writes\n if (shouldStartWriteStream(remoteStoreImpl)) {\n startWriteStream(remoteStoreImpl);\n }\n}\n\nasync function handleWriteError(\n remoteStoreImpl: RemoteStoreImpl,\n error: FirestoreError\n): Promise {\n // Only handle permanent errors here. If it's transient, just let the retry\n // logic kick in.\n if (isPermanentWriteError(error.code)) {\n // This was a permanent error, the request itself was the problem\n // so it's not going to succeed if we resend it.\n const batch = remoteStoreImpl.writePipeline.shift()!;\n\n // In this case it's also unlikely that the server itself is melting\n // down -- this was just a bad request so inhibit backoff on the next\n // restart.\n ensureWriteStream(remoteStoreImpl).inhibitBackoff();\n\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.rejectFailedWrite,\n 'rejectFailedWrite() not set'\n );\n await executeWithRecovery(remoteStoreImpl, () =>\n remoteStoreImpl.remoteSyncer.rejectFailedWrite!(batch.batchId, error)\n );\n\n // It's possible that with the completion of this mutation\n // another slot has freed up.\n await fillWritePipeline(remoteStoreImpl);\n } else {\n // Transient error, just let the retry logic kick in.\n }\n}\n\nasync function restartNetwork(remoteStore: RemoteStore): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.offlineCauses.add(OfflineCause.ConnectivityChange);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.ConnectivityChange);\n await enableNetworkInternal(remoteStoreImpl);\n}\n\nexport async function remoteStoreHandleCredentialChange(\n remoteStore: RemoteStore,\n user: User\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n remoteStoreImpl.asyncQueue.verifyOperationInProgress();\n debugAssert(\n !!remoteStoreImpl.remoteSyncer.handleCredentialChange,\n 'handleCredentialChange() not set'\n );\n\n logDebug(LOG_TAG, 'RemoteStore received new credentials');\n const usesNetwork = canUseNetwork(remoteStoreImpl);\n\n // Tear down and re-create our network streams. This will ensure we get a\n // fresh auth token for the new user and re-fill the write pipeline with\n // new mutations from the LocalStore (since mutations are per-user).\n remoteStoreImpl.offlineCauses.add(OfflineCause.CredentialChange);\n await disableNetworkInternal(remoteStoreImpl);\n if (usesNetwork) {\n // Don't set the network status to Unknown if we are offline.\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n await remoteStoreImpl.remoteSyncer.handleCredentialChange(user);\n remoteStoreImpl.offlineCauses.delete(OfflineCause.CredentialChange);\n await enableNetworkInternal(remoteStoreImpl);\n}\n\n/**\n * Toggles the network state when the client gains or loses its primary lease.\n */\nexport async function remoteStoreApplyPrimaryState(\n remoteStore: RemoteStore,\n isPrimary: boolean\n): Promise {\n const remoteStoreImpl = debugCast(remoteStore, RemoteStoreImpl);\n if (isPrimary) {\n remoteStoreImpl.offlineCauses.delete(OfflineCause.IsSecondary);\n await enableNetworkInternal(remoteStoreImpl);\n } else if (!isPrimary) {\n remoteStoreImpl.offlineCauses.add(OfflineCause.IsSecondary);\n await disableNetworkInternal(remoteStoreImpl);\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n}\n\n/**\n * If not yet initialized, registers the WatchStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WatchStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */\nfunction ensureWatchStream(\n remoteStoreImpl: RemoteStoreImpl\n): PersistentListenStream {\n if (!remoteStoreImpl.watchStream) {\n // Create stream (but note that it is not started yet).\n remoteStoreImpl.watchStream = newPersistentWatchStream(\n remoteStoreImpl.datastore,\n remoteStoreImpl.asyncQueue,\n {\n onConnected: onWatchStreamConnected.bind(null, remoteStoreImpl),\n onOpen: onWatchStreamOpen.bind(null, remoteStoreImpl),\n onClose: onWatchStreamClose.bind(null, remoteStoreImpl),\n onWatchChange: onWatchStreamChange.bind(null, remoteStoreImpl)\n }\n );\n\n remoteStoreImpl.onNetworkStatusChange.push(async enabled => {\n if (enabled) {\n remoteStoreImpl.watchStream!.inhibitBackoff();\n if (shouldStartWatchStream(remoteStoreImpl)) {\n startWatchStream(remoteStoreImpl);\n } else {\n remoteStoreImpl.onlineStateTracker.set(OnlineState.Unknown);\n }\n } else {\n await remoteStoreImpl.watchStream!.stop();\n cleanUpWatchStreamState(remoteStoreImpl);\n }\n });\n }\n\n return remoteStoreImpl.watchStream;\n}\n\n/**\n * If not yet initialized, registers the WriteStream and its network state\n * callback with `remoteStoreImpl`. Returns the existing stream if one is\n * already available.\n *\n * PORTING NOTE: On iOS and Android, the WriteStream gets registered on startup.\n * This is not done on Web to allow it to be tree-shaken.\n */\nfunction ensureWriteStream(\n remoteStoreImpl: RemoteStoreImpl\n): PersistentWriteStream {\n if (!remoteStoreImpl.writeStream) {\n debugAssert(\n remoteStoreImpl.writePipeline.length === 0,\n 'Should not issue writes before WriteStream is enabled'\n );\n\n // Create stream (but note that it is not started yet).\n remoteStoreImpl.writeStream = newPersistentWriteStream(\n remoteStoreImpl.datastore,\n remoteStoreImpl.asyncQueue,\n {\n onConnected: () => Promise.resolve(),\n onOpen: onWriteStreamOpen.bind(null, remoteStoreImpl),\n onClose: onWriteStreamClose.bind(null, remoteStoreImpl),\n onHandshakeComplete: onWriteHandshakeComplete.bind(\n null,\n remoteStoreImpl\n ),\n onMutationResult: onMutationResult.bind(null, remoteStoreImpl)\n }\n );\n\n remoteStoreImpl.onNetworkStatusChange.push(async enabled => {\n if (enabled) {\n remoteStoreImpl.writeStream!.inhibitBackoff();\n\n // This will start the write stream if necessary.\n await fillWritePipeline(remoteStoreImpl);\n } else {\n await remoteStoreImpl.writeStream!.stop();\n\n if (remoteStoreImpl.writePipeline.length > 0) {\n logDebug(\n LOG_TAG,\n `Stopping write stream with ${remoteStoreImpl.writePipeline.length} pending writes`\n );\n remoteStoreImpl.writePipeline = [];\n }\n }\n });\n }\n\n return remoteStoreImpl.writeStream;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIndexedDbTransactionError } from '../local/simple_db';\n\nimport { Code, FirestoreError } from './error';\nimport { logError } from './log';\nimport { Deferred } from './promise';\n\nconst LOG_TAG = 'AsyncQueue';\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype TimerHandle = any;\n\n/**\n * Wellknown \"timer\" IDs used when scheduling delayed operations on the\n * AsyncQueue. These IDs can then be used from tests to check for the presence\n * of operations or to run them early.\n *\n * The string values are used when encoding these timer IDs in JSON spec tests.\n */\nexport const enum TimerId {\n /** All can be used with runDelayedOperationsEarly() to run all timers. */\n All = 'all',\n\n /**\n * The following 5 timers are used in persistent_stream.ts for the listen and\n * write streams. The \"Idle\" timer is used to close the stream due to\n * inactivity. The \"ConnectionBackoff\" timer is used to restart a stream once\n * the appropriate backoff delay has elapsed. The health check is used to mark\n * a stream healthy if it has not received an error during its initial setup.\n */\n ListenStreamIdle = 'listen_stream_idle',\n ListenStreamConnectionBackoff = 'listen_stream_connection_backoff',\n WriteStreamIdle = 'write_stream_idle',\n WriteStreamConnectionBackoff = 'write_stream_connection_backoff',\n HealthCheckTimeout = 'health_check_timeout',\n\n /**\n * A timer used in online_state_tracker.ts to transition from\n * OnlineState.Unknown to Offline after a set timeout, rather than waiting\n * indefinitely for success or failure.\n */\n OnlineStateTimeout = 'online_state_timeout',\n\n /**\n * A timer used to update the client metadata in IndexedDb, which is used\n * to determine the primary leaseholder.\n */\n ClientMetadataRefresh = 'client_metadata_refresh',\n\n /** A timer used to periodically attempt LRU Garbage collection */\n LruGarbageCollection = 'lru_garbage_collection',\n\n /**\n * A timer used to retry transactions. Since there can be multiple concurrent\n * transactions, multiple of these may be in the queue at a given time.\n */\n TransactionRetry = 'transaction_retry',\n\n /**\n * A timer used to retry operations scheduled via retryable AsyncQueue\n * operations.\n */\n AsyncQueueRetry = 'async_queue_retry',\n\n /**\n * A timer used to periodically attempt index backfill.\n */\n IndexBackfill = 'index_backfill'\n}\n\n/**\n * Represents an operation scheduled to be run in the future on an AsyncQueue.\n *\n * It is created via DelayedOperation.createAndSchedule().\n *\n * Supports cancellation (via cancel()) and early execution (via skipDelay()).\n *\n * Note: We implement `PromiseLike` instead of `Promise`, as the `Promise` type\n * in newer versions of TypeScript defines `finally`, which is not available in\n * IE.\n */\nexport class DelayedOperation implements PromiseLike {\n // handle for use with clearTimeout(), or null if the operation has been\n // executed or canceled already.\n private timerHandle: TimerHandle | null;\n\n private readonly deferred = new Deferred();\n\n private constructor(\n private readonly asyncQueue: AsyncQueue,\n readonly timerId: TimerId,\n readonly targetTimeMs: number,\n private readonly op: () => Promise,\n private readonly removalCallback: (op: DelayedOperation) => void\n ) {\n // It's normal for the deferred promise to be canceled (due to cancellation)\n // and so we attach a dummy catch callback to avoid\n // 'UnhandledPromiseRejectionWarning' log spam.\n this.deferred.promise.catch(err => {});\n }\n\n get promise(): Promise {\n return this.deferred.promise;\n }\n\n /**\n * Creates and returns a DelayedOperation that has been scheduled to be\n * executed on the provided asyncQueue after the provided delayMs.\n *\n * @param asyncQueue - The queue to schedule the operation on.\n * @param id - A Timer ID identifying the type of operation this is.\n * @param delayMs - The delay (ms) before the operation should be scheduled.\n * @param op - The operation to run.\n * @param removalCallback - A callback to be called synchronously once the\n * operation is executed or canceled, notifying the AsyncQueue to remove it\n * from its delayedOperations list.\n * PORTING NOTE: This exists to prevent making removeDelayedOperation() and\n * the DelayedOperation class public.\n */\n static createAndSchedule(\n asyncQueue: AsyncQueue,\n timerId: TimerId,\n delayMs: number,\n op: () => Promise,\n removalCallback: (op: DelayedOperation) => void\n ): DelayedOperation {\n const targetTime = Date.now() + delayMs;\n const delayedOp = new DelayedOperation(\n asyncQueue,\n timerId,\n targetTime,\n op,\n removalCallback\n );\n delayedOp.start(delayMs);\n return delayedOp;\n }\n\n /**\n * Starts the timer. This is called immediately after construction by\n * createAndSchedule().\n */\n private start(delayMs: number): void {\n this.timerHandle = setTimeout(() => this.handleDelayElapsed(), delayMs);\n }\n\n /**\n * Queues the operation to run immediately (if it hasn't already been run or\n * canceled).\n */\n skipDelay(): void {\n return this.handleDelayElapsed();\n }\n\n /**\n * Cancels the operation if it hasn't already been executed or canceled. The\n * promise will be rejected.\n *\n * As long as the operation has not yet been run, calling cancel() provides a\n * guarantee that the operation will not be run.\n */\n cancel(reason?: string): void {\n if (this.timerHandle !== null) {\n this.clearTimeout();\n this.deferred.reject(\n new FirestoreError(\n Code.CANCELLED,\n 'Operation cancelled' + (reason ? ': ' + reason : '')\n )\n );\n }\n }\n\n then = this.deferred.promise.then.bind(this.deferred.promise);\n\n private handleDelayElapsed(): void {\n this.asyncQueue.enqueueAndForget(() => {\n if (this.timerHandle !== null) {\n this.clearTimeout();\n return this.op().then(result => {\n return this.deferred.resolve(result);\n });\n } else {\n return Promise.resolve();\n }\n });\n }\n\n private clearTimeout(): void {\n if (this.timerHandle !== null) {\n this.removalCallback(this);\n clearTimeout(this.timerHandle);\n this.timerHandle = null;\n }\n }\n}\n\nexport interface AsyncQueue {\n // Is this AsyncQueue being shut down? If true, this instance will not enqueue\n // any new operations, Promises from enqueue requests will not resolve.\n readonly isShuttingDown: boolean;\n\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */\n enqueueAndForget(op: () => Promise): void;\n\n /**\n * Regardless if the queue has initialized shutdown, adds a new operation to the\n * queue without waiting for it to complete (i.e. we ignore the Promise result).\n */\n enqueueAndForgetEvenWhileRestricted(\n op: () => Promise\n ): void;\n\n /**\n * Initialize the shutdown of this queue. Once this method is called, the\n * only possible way to request running an operation is through\n * `enqueueEvenWhileRestricted()`.\n *\n * @param purgeExistingTasks Whether already enqueued tasked should be\n * rejected (unless enqueued with `enqueueEvenWhileRestricted()`). Defaults\n * to false.\n */\n enterRestrictedMode(purgeExistingTasks?: boolean): void;\n\n /**\n * Adds a new operation to the queue. Returns a promise that will be resolved\n * when the promise returned by the new operation is (with its value).\n */\n enqueue(op: () => Promise): Promise;\n\n /**\n * Enqueue a retryable operation.\n *\n * A retryable operation is rescheduled with backoff if it fails with a\n * IndexedDbTransactionError (the error type used by SimpleDb). All\n * retryable operations are executed in order and only run if all prior\n * operations were retried successfully.\n */\n enqueueRetryable(op: () => Promise): void;\n\n /**\n * Schedules an operation to be queued on the AsyncQueue once the specified\n * `delayMs` has elapsed. The returned DelayedOperation can be used to cancel\n * or fast-forward the operation prior to its running.\n */\n enqueueAfterDelay(\n timerId: TimerId,\n delayMs: number,\n op: () => Promise\n ): DelayedOperation;\n\n /**\n * Verifies there's an operation currently in-progress on the AsyncQueue.\n * Unfortunately we can't verify that the running code is in the promise chain\n * of that operation, so this isn't a foolproof check, but it should be enough\n * to catch some bugs.\n */\n verifyOperationInProgress(): void;\n}\n\n/**\n * Returns a FirestoreError that can be surfaced to the user if the provided\n * error is an IndexedDbTransactionError. Re-throws the error otherwise.\n */\nexport function wrapInUserErrorIfRecoverable(\n e: Error,\n msg: string\n): FirestoreError {\n logError(LOG_TAG, `${msg}: ${e}`);\n if (isIndexedDbTransactionError(e)) {\n return new FirestoreError(Code.UNAVAILABLE, `${msg}: ${e}`);\n } else {\n throw e;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { SortedMap } from '../util/sorted_map';\n\nimport { documentMap } from './collections';\nimport { Document } from './document';\nimport { DocumentComparator } from './document_comparator';\nimport { DocumentKey } from './document_key';\n\n/**\n * DocumentSet is an immutable (copy-on-write) collection that holds documents\n * in order specified by the provided comparator. We always add a document key\n * comparator on top of what is provided to guarantee document equality based on\n * the key.\n */\n\nexport class DocumentSet {\n /**\n * Returns an empty copy of the existing DocumentSet, using the same\n * comparator.\n */\n static emptySet(oldSet: DocumentSet): DocumentSet {\n return new DocumentSet(oldSet.comparator);\n }\n\n private comparator: DocumentComparator;\n private keyedMap: SortedMap;\n private sortedSet: SortedMap;\n\n /** The default ordering is by key if the comparator is omitted */\n constructor(comp?: DocumentComparator) {\n // We are adding document key comparator to the end as it's the only\n // guaranteed unique property of a document.\n if (comp) {\n this.comparator = (d1: Document, d2: Document) =>\n comp(d1, d2) || DocumentKey.comparator(d1.key, d2.key);\n } else {\n this.comparator = (d1: Document, d2: Document) =>\n DocumentKey.comparator(d1.key, d2.key);\n }\n\n this.keyedMap = documentMap();\n this.sortedSet = new SortedMap(this.comparator);\n }\n\n has(key: DocumentKey): boolean {\n return this.keyedMap.get(key) != null;\n }\n\n get(key: DocumentKey): Document | null {\n return this.keyedMap.get(key);\n }\n\n first(): Document | null {\n return this.sortedSet.minKey();\n }\n\n last(): Document | null {\n return this.sortedSet.maxKey();\n }\n\n isEmpty(): boolean {\n return this.sortedSet.isEmpty();\n }\n\n /**\n * Returns the index of the provided key in the document set, or -1 if the\n * document key is not present in the set;\n */\n indexOf(key: DocumentKey): number {\n const doc = this.keyedMap.get(key);\n return doc ? this.sortedSet.indexOf(doc) : -1;\n }\n\n get size(): number {\n return this.sortedSet.size;\n }\n\n /** Iterates documents in order defined by \"comparator\" */\n forEach(cb: (doc: Document) => void): void {\n this.sortedSet.inorderTraversal((k, v) => {\n cb(k);\n return false;\n });\n }\n\n /** Inserts or updates a document with the same key */\n add(doc: Document): DocumentSet {\n // First remove the element if we have it.\n const set = this.delete(doc.key);\n return set.copy(\n set.keyedMap.insert(doc.key, doc),\n set.sortedSet.insert(doc, null)\n );\n }\n\n /** Deletes a document with a given key */\n delete(key: DocumentKey): DocumentSet {\n const doc = this.get(key);\n if (!doc) {\n return this;\n }\n\n return this.copy(this.keyedMap.remove(key), this.sortedSet.remove(doc));\n }\n\n isEqual(other: DocumentSet | null | undefined): boolean {\n if (!(other instanceof DocumentSet)) {\n return false;\n }\n if (this.size !== other.size) {\n return false;\n }\n\n const thisIt = this.sortedSet.getIterator();\n const otherIt = other.sortedSet.getIterator();\n while (thisIt.hasNext()) {\n const thisDoc = thisIt.getNext().key;\n const otherDoc = otherIt.getNext().key;\n if (!thisDoc.isEqual(otherDoc)) {\n return false;\n }\n }\n return true;\n }\n\n toString(): string {\n const docStrings: string[] = [];\n this.forEach(doc => {\n docStrings.push(doc.toString());\n });\n if (docStrings.length === 0) {\n return 'DocumentSet ()';\n } else {\n return 'DocumentSet (\\n ' + docStrings.join(' \\n') + '\\n)';\n }\n }\n\n private copy(\n keyedMap: SortedMap,\n sortedSet: SortedMap\n ): DocumentSet {\n const newSet = new DocumentSet();\n newSet.comparator = this.comparator;\n newSet.keyedMap = keyedMap;\n newSet.sortedSet = sortedSet;\n return newSet;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKeySet } from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { DocumentSet } from '../model/document_set';\nimport { fail } from '../util/assert';\nimport { SortedMap } from '../util/sorted_map';\n\nimport { Query, queryEquals } from './query';\n\nexport const enum ChangeType {\n Added,\n Removed,\n Modified,\n Metadata\n}\n\nexport interface DocumentViewChange {\n type: ChangeType;\n doc: Document;\n}\n\nexport const enum SyncState {\n Local,\n Synced\n}\n\n/**\n * DocumentChangeSet keeps track of a set of changes to docs in a query, merging\n * duplicate events for the same doc.\n */\nexport class DocumentChangeSet {\n private changeMap = new SortedMap(\n DocumentKey.comparator\n );\n\n track(change: DocumentViewChange): void {\n const key = change.doc.key;\n const oldChange = this.changeMap.get(key);\n if (!oldChange) {\n this.changeMap = this.changeMap.insert(key, change);\n return;\n }\n\n // Merge the new change with the existing change.\n if (\n change.type !== ChangeType.Added &&\n oldChange.type === ChangeType.Metadata\n ) {\n this.changeMap = this.changeMap.insert(key, change);\n } else if (\n change.type === ChangeType.Metadata &&\n oldChange.type !== ChangeType.Removed\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: oldChange.type,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Modified &&\n oldChange.type === ChangeType.Modified\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Modified,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Modified &&\n oldChange.type === ChangeType.Added\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Added,\n doc: change.doc\n });\n } else if (\n change.type === ChangeType.Removed &&\n oldChange.type === ChangeType.Added\n ) {\n this.changeMap = this.changeMap.remove(key);\n } else if (\n change.type === ChangeType.Removed &&\n oldChange.type === ChangeType.Modified\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Removed,\n doc: oldChange.doc\n });\n } else if (\n change.type === ChangeType.Added &&\n oldChange.type === ChangeType.Removed\n ) {\n this.changeMap = this.changeMap.insert(key, {\n type: ChangeType.Modified,\n doc: change.doc\n });\n } else {\n // This includes these cases, which don't make sense:\n // Added->Added\n // Removed->Removed\n // Modified->Added\n // Removed->Modified\n // Metadata->Added\n // Removed->Metadata\n fail(\n 'unsupported combination of changes: ' +\n JSON.stringify(change) +\n ' after ' +\n JSON.stringify(oldChange)\n );\n }\n }\n\n getChanges(): DocumentViewChange[] {\n const changes: DocumentViewChange[] = [];\n this.changeMap.inorderTraversal(\n (key: DocumentKey, change: DocumentViewChange) => {\n changes.push(change);\n }\n );\n return changes;\n }\n}\n\nexport class ViewSnapshot {\n constructor(\n readonly query: Query,\n readonly docs: DocumentSet,\n readonly oldDocs: DocumentSet,\n readonly docChanges: DocumentViewChange[],\n readonly mutatedKeys: DocumentKeySet,\n readonly fromCache: boolean,\n readonly syncStateChanged: boolean,\n readonly excludesMetadataChanges: boolean,\n readonly hasCachedResults: boolean\n ) {}\n\n /** Returns a view snapshot as if all documents in the snapshot were added. */\n static fromInitialDocuments(\n query: Query,\n documents: DocumentSet,\n mutatedKeys: DocumentKeySet,\n fromCache: boolean,\n hasCachedResults: boolean\n ): ViewSnapshot {\n const changes: DocumentViewChange[] = [];\n documents.forEach(doc => {\n changes.push({ type: ChangeType.Added, doc });\n });\n\n return new ViewSnapshot(\n query,\n documents,\n DocumentSet.emptySet(documents),\n changes,\n mutatedKeys,\n fromCache,\n /* syncStateChanged= */ true,\n /* excludesMetadataChanges= */ false,\n hasCachedResults\n );\n }\n\n get hasPendingWrites(): boolean {\n return !this.mutatedKeys.isEmpty();\n }\n\n isEqual(other: ViewSnapshot): boolean {\n if (\n this.fromCache !== other.fromCache ||\n this.hasCachedResults !== other.hasCachedResults ||\n this.syncStateChanged !== other.syncStateChanged ||\n !this.mutatedKeys.isEqual(other.mutatedKeys) ||\n !queryEquals(this.query, other.query) ||\n !this.docs.isEqual(other.docs) ||\n !this.oldDocs.isEqual(other.oldDocs)\n ) {\n return false;\n }\n const changes: DocumentViewChange[] = this.docChanges;\n const otherChanges: DocumentViewChange[] = other.docChanges;\n if (changes.length !== otherChanges.length) {\n return false;\n }\n for (let i = 0; i < changes.length; i++) {\n if (\n changes[i].type !== otherChanges[i].type ||\n !changes[i].doc.isEqual(otherChanges[i].doc)\n ) {\n return false;\n }\n }\n return true;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { debugAssert, debugCast } from '../util/assert';\nimport { wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\nimport { EventHandler } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\n\nimport { canonifyQuery, Query, queryEquals, stringifyQuery } from './query';\nimport { OnlineState } from './types';\nimport { ChangeType, DocumentViewChange, ViewSnapshot } from './view_snapshot';\n\n/**\n * Holds the listeners and the last received ViewSnapshot for a query being\n * tracked by EventManager.\n */\nclass QueryListenersInfo {\n viewSnap: ViewSnapshot | undefined = undefined;\n listeners: QueryListener[] = [];\n\n // Helper methods that checks if the query has listeners that listening to remote store\n hasRemoteListeners(): boolean {\n return this.listeners.some(listener => listener.listensToRemoteStore());\n }\n}\n\n/**\n * Interface for handling events from the EventManager.\n */\nexport interface Observer {\n next: EventHandler;\n error: EventHandler;\n}\n\n/**\n * EventManager is responsible for mapping queries to query event emitters.\n * It handles \"fan-out\". -- Identical queries will re-use the same watch on the\n * backend.\n *\n * PORTING NOTE: On Web, EventManager `onListen` and `onUnlisten` need to be\n * assigned to SyncEngine's `listen()` and `unlisten()` API before usage. This\n * allows users to tree-shake the Watch logic.\n */\nexport interface EventManager {\n onListen?: (\n query: Query,\n enableRemoteListen: boolean\n ) => Promise;\n onUnlisten?: (query: Query, disableRemoteListen: boolean) => Promise;\n onFirstRemoteStoreListen?: (query: Query) => Promise;\n onLastRemoteStoreUnlisten?: (query: Query) => Promise;\n terminate(): void;\n}\n\nexport function newEventManager(): EventManager {\n return new EventManagerImpl();\n}\n\nexport class EventManagerImpl implements EventManager {\n queries: ObjectMap = newQueriesObjectMap();\n\n onlineState: OnlineState = OnlineState.Unknown;\n\n snapshotsInSyncListeners: Set> = new Set();\n\n /** Callback invoked when a Query is first listen to. */\n onListen?: (\n query: Query,\n enableRemoteListen: boolean\n ) => Promise;\n /** Callback invoked once all listeners to a Query are removed. */\n onUnlisten?: (query: Query, disableRemoteListen: boolean) => Promise;\n\n /**\n * Callback invoked when a Query starts listening to the remote store, while\n * already listening to the cache.\n */\n onFirstRemoteStoreListen?: (query: Query) => Promise;\n /**\n * Callback invoked when a Query stops listening to the remote store, while\n * still listening to the cache.\n */\n onLastRemoteStoreUnlisten?: (query: Query) => Promise;\n\n terminate(): void {\n errorAllTargets(\n this,\n new FirestoreError(Code.ABORTED, 'Firestore shutting down')\n );\n }\n}\n\nfunction newQueriesObjectMap(): ObjectMap {\n return new ObjectMap(\n q => canonifyQuery(q),\n queryEquals\n );\n}\n\nfunction validateEventManager(eventManagerImpl: EventManagerImpl): void {\n debugAssert(!!eventManagerImpl.onListen, 'onListen not set');\n debugAssert(\n !!eventManagerImpl.onFirstRemoteStoreListen,\n 'onFirstRemoteStoreListen not set'\n );\n debugAssert(!!eventManagerImpl.onUnlisten, 'onUnlisten not set');\n debugAssert(\n !!eventManagerImpl.onLastRemoteStoreUnlisten,\n 'onLastRemoteStoreUnlisten not set'\n );\n}\n\nconst enum ListenerSetupAction {\n InitializeLocalListenAndRequireWatchConnection,\n InitializeLocalListenOnly,\n RequireWatchConnectionOnly,\n NoActionRequired\n}\n\nconst enum ListenerRemovalAction {\n TerminateLocalListenAndRequireWatchDisconnection,\n TerminateLocalListenOnly,\n RequireWatchDisconnectionOnly,\n NoActionRequired\n}\n\nexport async function eventManagerListen(\n eventManager: EventManager,\n listener: QueryListener\n): Promise {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n validateEventManager(eventManagerImpl);\n\n let listenerAction = ListenerSetupAction.NoActionRequired;\n\n const query = listener.query;\n\n let queryInfo = eventManagerImpl.queries.get(query);\n if (!queryInfo) {\n queryInfo = new QueryListenersInfo();\n listenerAction = listener.listensToRemoteStore()\n ? ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection\n : ListenerSetupAction.InitializeLocalListenOnly;\n } else if (\n !queryInfo.hasRemoteListeners() &&\n listener.listensToRemoteStore()\n ) {\n // Query has been listening to local cache, and tries to add a new listener sourced from watch.\n listenerAction = ListenerSetupAction.RequireWatchConnectionOnly;\n }\n\n try {\n switch (listenerAction) {\n case ListenerSetupAction.InitializeLocalListenAndRequireWatchConnection:\n queryInfo.viewSnap = await eventManagerImpl.onListen!(\n query,\n /** enableRemoteListen= */ true\n );\n break;\n case ListenerSetupAction.InitializeLocalListenOnly:\n queryInfo.viewSnap = await eventManagerImpl.onListen!(\n query,\n /** enableRemoteListen= */ false\n );\n break;\n case ListenerSetupAction.RequireWatchConnectionOnly:\n await eventManagerImpl.onFirstRemoteStoreListen!(query);\n break;\n default:\n break;\n }\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e as Error,\n `Initialization of query '${stringifyQuery(listener.query)}' failed`\n );\n listener.onError(firestoreError);\n return;\n }\n\n eventManagerImpl.queries.set(query, queryInfo);\n queryInfo.listeners.push(listener);\n\n // Run global snapshot listeners if a consistent snapshot has been emitted.\n const raisedEvent = listener.applyOnlineStateChange(\n eventManagerImpl.onlineState\n );\n debugAssert(\n !raisedEvent,\n \"applyOnlineStateChange() shouldn't raise an event for brand-new listeners.\"\n );\n\n if (queryInfo.viewSnap) {\n const raisedEvent = listener.onViewSnapshot(queryInfo.viewSnap);\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n }\n}\n\nexport async function eventManagerUnlisten(\n eventManager: EventManager,\n listener: QueryListener\n): Promise {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n validateEventManager(eventManagerImpl);\n\n const query = listener.query;\n let listenerAction = ListenerRemovalAction.NoActionRequired;\n\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n const i = queryInfo.listeners.indexOf(listener);\n if (i >= 0) {\n queryInfo.listeners.splice(i, 1);\n\n if (queryInfo.listeners.length === 0) {\n listenerAction = listener.listensToRemoteStore()\n ? ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection\n : ListenerRemovalAction.TerminateLocalListenOnly;\n } else if (\n !queryInfo.hasRemoteListeners() &&\n listener.listensToRemoteStore()\n ) {\n // The removed listener is the last one that sourced from watch.\n listenerAction = ListenerRemovalAction.RequireWatchDisconnectionOnly;\n }\n }\n }\n switch (listenerAction) {\n case ListenerRemovalAction.TerminateLocalListenAndRequireWatchDisconnection:\n eventManagerImpl.queries.delete(query);\n return eventManagerImpl.onUnlisten!(\n query,\n /** disableRemoteListen= */ true\n );\n case ListenerRemovalAction.TerminateLocalListenOnly:\n eventManagerImpl.queries.delete(query);\n return eventManagerImpl.onUnlisten!(\n query,\n /** disableRemoteListen= */ false\n );\n case ListenerRemovalAction.RequireWatchDisconnectionOnly:\n return eventManagerImpl.onLastRemoteStoreUnlisten!(query);\n default:\n return;\n }\n}\n\nexport function eventManagerOnWatchChange(\n eventManager: EventManager,\n viewSnaps: ViewSnapshot[]\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n let raisedEvent = false;\n for (const viewSnap of viewSnaps) {\n const query = viewSnap.query;\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n for (const listener of queryInfo.listeners) {\n if (listener.onViewSnapshot(viewSnap)) {\n raisedEvent = true;\n }\n }\n queryInfo.viewSnap = viewSnap;\n }\n }\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n}\n\nexport function eventManagerOnWatchError(\n eventManager: EventManager,\n query: Query,\n error: FirestoreError\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n const queryInfo = eventManagerImpl.queries.get(query);\n if (queryInfo) {\n for (const listener of queryInfo.listeners) {\n listener.onError(error);\n }\n }\n\n // Remove all listeners. NOTE: We don't need to call syncEngine.unlisten()\n // after an error.\n eventManagerImpl.queries.delete(query);\n}\n\nexport function eventManagerOnOnlineStateChange(\n eventManager: EventManager,\n onlineState: OnlineState\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n eventManagerImpl.onlineState = onlineState;\n let raisedEvent = false;\n eventManagerImpl.queries.forEach((_, queryInfo) => {\n for (const listener of queryInfo.listeners) {\n // Run global snapshot listeners if a consistent snapshot has been emitted.\n if (listener.applyOnlineStateChange(onlineState)) {\n raisedEvent = true;\n }\n }\n });\n if (raisedEvent) {\n raiseSnapshotsInSyncEvent(eventManagerImpl);\n }\n}\n\nexport function addSnapshotsInSyncListener(\n eventManager: EventManager,\n observer: Observer\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n\n eventManagerImpl.snapshotsInSyncListeners.add(observer);\n // Immediately fire an initial event, indicating all existing listeners\n // are in-sync.\n observer.next();\n}\n\nexport function removeSnapshotsInSyncListener(\n eventManager: EventManager,\n observer: Observer\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n eventManagerImpl.snapshotsInSyncListeners.delete(observer);\n}\n\nfunction errorAllTargets(\n eventManager: EventManager,\n error: FirestoreError\n): void {\n const eventManagerImpl = debugCast(eventManager, EventManagerImpl);\n const queries = eventManagerImpl.queries;\n\n // Prevent further access by clearing ObjectMap.\n eventManagerImpl.queries = newQueriesObjectMap();\n\n queries.forEach((_, queryInfo) => {\n for (const listener of queryInfo.listeners) {\n listener.onError(error);\n }\n });\n}\n\n// Call all global snapshot listeners that have been set.\nfunction raiseSnapshotsInSyncEvent(eventManagerImpl: EventManagerImpl): void {\n eventManagerImpl.snapshotsInSyncListeners.forEach(observer => {\n observer.next();\n });\n}\n\nexport enum ListenerDataSource {\n /** Listen to both cache and server changes */\n Default = 'default',\n\n /** Listen to changes in cache only */\n Cache = 'cache'\n}\n\nexport interface ListenOptions {\n /** Raise events even when only the metadata changes */\n readonly includeMetadataChanges?: boolean;\n\n /**\n * Wait for a sync with the server when online, but still raise events while\n * offline.\n */\n readonly waitForSyncWhenOnline?: boolean;\n\n /** Set the source events raised from. */\n readonly source?: ListenerDataSource;\n}\n\n/**\n * QueryListener takes a series of internal view snapshots and determines\n * when to raise the event.\n *\n * It uses an Observer to dispatch events.\n */\nexport class QueryListener {\n /**\n * Initial snapshots (e.g. from cache) may not be propagated to the wrapped\n * observer. This flag is set to true once we've actually raised an event.\n */\n private raisedInitialEvent = false;\n\n private options: ListenOptions;\n\n private snap: ViewSnapshot | null = null;\n\n private onlineState = OnlineState.Unknown;\n\n constructor(\n readonly query: Query,\n private queryObserver: Observer,\n options?: ListenOptions\n ) {\n this.options = options || {};\n }\n\n /**\n * Applies the new ViewSnapshot to this listener, raising a user-facing event\n * if applicable (depending on what changed, whether the user has opted into\n * metadata-only changes, etc.). Returns true if a user-facing event was\n * indeed raised.\n */\n onViewSnapshot(snap: ViewSnapshot): boolean {\n debugAssert(\n snap.docChanges.length > 0 || snap.syncStateChanged,\n 'We got a new snapshot with no changes?'\n );\n\n if (!this.options.includeMetadataChanges) {\n // Remove the metadata only changes.\n const docChanges: DocumentViewChange[] = [];\n for (const docChange of snap.docChanges) {\n if (docChange.type !== ChangeType.Metadata) {\n docChanges.push(docChange);\n }\n }\n snap = new ViewSnapshot(\n snap.query,\n snap.docs,\n snap.oldDocs,\n docChanges,\n snap.mutatedKeys,\n snap.fromCache,\n snap.syncStateChanged,\n /* excludesMetadataChanges= */ true,\n snap.hasCachedResults\n );\n }\n let raisedEvent = false;\n if (!this.raisedInitialEvent) {\n if (this.shouldRaiseInitialEvent(snap, this.onlineState)) {\n this.raiseInitialEvent(snap);\n raisedEvent = true;\n }\n } else if (this.shouldRaiseEvent(snap)) {\n this.queryObserver.next(snap);\n raisedEvent = true;\n }\n\n this.snap = snap;\n return raisedEvent;\n }\n\n onError(error: FirestoreError): void {\n this.queryObserver.error(error);\n }\n\n /** Returns whether a snapshot was raised. */\n applyOnlineStateChange(onlineState: OnlineState): boolean {\n this.onlineState = onlineState;\n let raisedEvent = false;\n if (\n this.snap &&\n !this.raisedInitialEvent &&\n this.shouldRaiseInitialEvent(this.snap, onlineState)\n ) {\n this.raiseInitialEvent(this.snap);\n raisedEvent = true;\n }\n return raisedEvent;\n }\n\n private shouldRaiseInitialEvent(\n snap: ViewSnapshot,\n onlineState: OnlineState\n ): boolean {\n debugAssert(\n !this.raisedInitialEvent,\n 'Determining whether to raise first event but already had first event'\n );\n\n // Always raise the first event when we're synced\n if (!snap.fromCache) {\n return true;\n }\n\n // Always raise event if listening to cache\n if (!this.listensToRemoteStore()) {\n return true;\n }\n\n // NOTE: We consider OnlineState.Unknown as online (it should become Offline\n // or Online if we wait long enough).\n const maybeOnline = onlineState !== OnlineState.Offline;\n // Don't raise the event if we're online, aren't synced yet (checked\n // above) and are waiting for a sync.\n if (this.options.waitForSyncWhenOnline && maybeOnline) {\n debugAssert(\n snap.fromCache,\n 'Waiting for sync, but snapshot is not from cache'\n );\n return false;\n }\n\n // Raise data from cache if we have any documents, have cached results before,\n // or we are offline.\n return (\n !snap.docs.isEmpty() ||\n snap.hasCachedResults ||\n onlineState === OnlineState.Offline\n );\n }\n\n private shouldRaiseEvent(snap: ViewSnapshot): boolean {\n // We don't need to handle includeDocumentMetadataChanges here because\n // the Metadata only changes have already been stripped out if needed.\n // At this point the only changes we will see are the ones we should\n // propagate.\n if (snap.docChanges.length > 0) {\n return true;\n }\n\n const hasPendingWritesChanged =\n this.snap && this.snap.hasPendingWrites !== snap.hasPendingWrites;\n if (snap.syncStateChanged || hasPendingWritesChanged) {\n return this.options.includeMetadataChanges === true;\n }\n\n // Generally we should have hit one of the cases above, but it's possible\n // to get here if there were only metadata docChanges and they got\n // stripped out.\n return false;\n }\n\n private raiseInitialEvent(snap: ViewSnapshot): void {\n debugAssert(\n !this.raisedInitialEvent,\n 'Trying to raise initial events for second time'\n );\n snap = ViewSnapshot.fromInitialDocuments(\n snap.query,\n snap.docs,\n snap.mutatedKeys,\n snap.fromCache,\n snap.hasCachedResults\n );\n this.raisedInitialEvent = true;\n this.queryObserver.next(snap);\n }\n\n listensToRemoteStore(): boolean {\n return this.options.source !== ListenerDataSource.Cache;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { QueryResult } from '../local/local_store_impl';\nimport {\n documentKeySet,\n DocumentKeySet,\n DocumentMap\n} from '../model/collections';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { DocumentSet } from '../model/document_set';\nimport { TargetChange } from '../remote/remote_event';\nimport { debugAssert, fail } from '../util/assert';\n\nimport { LimitType, newQueryComparator, Query, queryMatches } from './query';\nimport { OnlineState } from './types';\nimport {\n ChangeType,\n DocumentChangeSet,\n SyncState,\n ViewSnapshot\n} from './view_snapshot';\n\nexport type LimboDocumentChange = AddedLimboDocument | RemovedLimboDocument;\nexport class AddedLimboDocument {\n constructor(public key: DocumentKey) {}\n}\nexport class RemovedLimboDocument {\n constructor(public key: DocumentKey) {}\n}\n\n/** The result of applying a set of doc changes to a view. */\nexport interface ViewDocumentChanges {\n /** The new set of docs that should be in the view. */\n documentSet: DocumentSet;\n /** The diff of these docs with the previous set of docs. */\n changeSet: DocumentChangeSet;\n /**\n * Whether the set of documents passed in was not sufficient to calculate the\n * new state of the view and there needs to be another pass based on the\n * local cache.\n */\n needsRefill: boolean;\n\n mutatedKeys: DocumentKeySet;\n}\n\nexport interface ViewChange {\n snapshot?: ViewSnapshot;\n limboChanges: LimboDocumentChange[];\n}\n\n/**\n * View is responsible for computing the final merged truth of what docs are in\n * a query. It gets notified of local and remote changes to docs, and applies\n * the query filters and limits to determine the most correct possible results.\n */\nexport class View {\n private syncState: SyncState | null = null;\n private hasCachedResults: boolean = false;\n /**\n * A flag whether the view is current with the backend. A view is considered\n * current after it has seen the current flag from the backend and did not\n * lose consistency within the watch stream (e.g. because of an existence\n * filter mismatch).\n */\n private current = false;\n private documentSet: DocumentSet;\n /** Documents in the view but not in the remote target */\n private limboDocuments = documentKeySet();\n /** Document Keys that have local changes */\n private mutatedKeys = documentKeySet();\n /** Query comparator that defines the document order in this view. */\n private docComparator: (d1: Document, d2: Document) => number;\n\n constructor(\n private query: Query,\n /** Documents included in the remote target */\n private _syncedDocuments: DocumentKeySet\n ) {\n this.docComparator = newQueryComparator(query);\n this.documentSet = new DocumentSet(this.docComparator);\n }\n\n /**\n * The set of remote documents that the server has told us belongs to the target associated with\n * this view.\n */\n get syncedDocuments(): DocumentKeySet {\n return this._syncedDocuments;\n }\n\n /**\n * Iterates over a set of doc changes, applies the query limit, and computes\n * what the new results should be, what the changes were, and whether we may\n * need to go back to the local cache for more results. Does not make any\n * changes to the view.\n * @param docChanges - The doc changes to apply to this view.\n * @param previousChanges - If this is being called with a refill, then start\n * with this set of docs and changes instead of the current view.\n * @returns a new set of docs, changes, and refill flag.\n */\n computeDocChanges(\n docChanges: DocumentMap,\n previousChanges?: ViewDocumentChanges\n ): ViewDocumentChanges {\n const changeSet = previousChanges\n ? previousChanges.changeSet\n : new DocumentChangeSet();\n const oldDocumentSet = previousChanges\n ? previousChanges.documentSet\n : this.documentSet;\n let newMutatedKeys = previousChanges\n ? previousChanges.mutatedKeys\n : this.mutatedKeys;\n let newDocumentSet = oldDocumentSet;\n let needsRefill = false;\n\n // Track the last doc in a (full) limit. This is necessary, because some\n // update (a delete, or an update moving a doc past the old limit) might\n // mean there is some other document in the local cache that either should\n // come (1) between the old last limit doc and the new last document, in the\n // case of updates, or (2) after the new last document, in the case of\n // deletes. So we keep this doc at the old limit to compare the updates to.\n //\n // Note that this should never get used in a refill (when previousChanges is\n // set), because there will only be adds -- no deletes or updates.\n const lastDocInLimit =\n this.query.limitType === LimitType.First &&\n oldDocumentSet.size === this.query.limit\n ? oldDocumentSet.last()\n : null;\n const firstDocInLimit =\n this.query.limitType === LimitType.Last &&\n oldDocumentSet.size === this.query.limit\n ? oldDocumentSet.first()\n : null;\n\n docChanges.inorderTraversal((key, entry) => {\n const oldDoc = oldDocumentSet.get(key);\n const newDoc = queryMatches(this.query, entry) ? entry : null;\n\n const oldDocHadPendingMutations = oldDoc\n ? this.mutatedKeys.has(oldDoc.key)\n : false;\n const newDocHasPendingMutations = newDoc\n ? newDoc.hasLocalMutations ||\n // We only consider committed mutations for documents that were\n // mutated during the lifetime of the view.\n (this.mutatedKeys.has(newDoc.key) && newDoc.hasCommittedMutations)\n : false;\n\n let changeApplied = false;\n\n // Calculate change\n if (oldDoc && newDoc) {\n const docsEqual = oldDoc.data.isEqual(newDoc.data);\n if (!docsEqual) {\n if (!this.shouldWaitForSyncedDocument(oldDoc, newDoc)) {\n changeSet.track({\n type: ChangeType.Modified,\n doc: newDoc\n });\n changeApplied = true;\n\n if (\n (lastDocInLimit &&\n this.docComparator(newDoc, lastDocInLimit) > 0) ||\n (firstDocInLimit &&\n this.docComparator(newDoc, firstDocInLimit) < 0)\n ) {\n // This doc moved from inside the limit to outside the limit.\n // That means there may be some other doc in the local cache\n // that should be included instead.\n needsRefill = true;\n }\n }\n } else if (oldDocHadPendingMutations !== newDocHasPendingMutations) {\n changeSet.track({ type: ChangeType.Metadata, doc: newDoc });\n changeApplied = true;\n }\n } else if (!oldDoc && newDoc) {\n changeSet.track({ type: ChangeType.Added, doc: newDoc });\n changeApplied = true;\n } else if (oldDoc && !newDoc) {\n changeSet.track({ type: ChangeType.Removed, doc: oldDoc });\n changeApplied = true;\n\n if (lastDocInLimit || firstDocInLimit) {\n // A doc was removed from a full limit query. We'll need to\n // requery from the local cache to see if we know about some other\n // doc that should be in the results.\n needsRefill = true;\n }\n }\n\n if (changeApplied) {\n if (newDoc) {\n newDocumentSet = newDocumentSet.add(newDoc);\n if (newDocHasPendingMutations) {\n newMutatedKeys = newMutatedKeys.add(key);\n } else {\n newMutatedKeys = newMutatedKeys.delete(key);\n }\n } else {\n newDocumentSet = newDocumentSet.delete(key);\n newMutatedKeys = newMutatedKeys.delete(key);\n }\n }\n });\n\n // Drop documents out to meet limit/limitToLast requirement.\n if (this.query.limit !== null) {\n while (newDocumentSet.size > this.query.limit!) {\n const oldDoc =\n this.query.limitType === LimitType.First\n ? newDocumentSet.last()\n : newDocumentSet.first();\n newDocumentSet = newDocumentSet.delete(oldDoc!.key);\n newMutatedKeys = newMutatedKeys.delete(oldDoc!.key);\n changeSet.track({ type: ChangeType.Removed, doc: oldDoc! });\n }\n }\n\n debugAssert(\n !needsRefill || !previousChanges,\n 'View was refilled using docs that themselves needed refilling.'\n );\n return {\n documentSet: newDocumentSet,\n changeSet,\n needsRefill,\n mutatedKeys: newMutatedKeys\n };\n }\n\n private shouldWaitForSyncedDocument(\n oldDoc: Document,\n newDoc: Document\n ): boolean {\n // We suppress the initial change event for documents that were modified as\n // part of a write acknowledgment (e.g. when the value of a server transform\n // is applied) as Watch will send us the same document again.\n // By suppressing the event, we only raise two user visible events (one with\n // `hasPendingWrites` and the final state of the document) instead of three\n // (one with `hasPendingWrites`, the modified document with\n // `hasPendingWrites` and the final state of the document).\n return (\n oldDoc.hasLocalMutations &&\n newDoc.hasCommittedMutations &&\n !newDoc.hasLocalMutations\n );\n }\n\n /**\n * Updates the view with the given ViewDocumentChanges and optionally updates\n * limbo docs and sync state from the provided target change.\n * @param docChanges - The set of changes to make to the view's docs.\n * @param limboResolutionEnabled - Whether to update limbo documents based on\n * this change.\n * @param targetChange - A target change to apply for computing limbo docs and\n * sync state.\n * @param targetIsPendingReset - Whether the target is pending to reset due to\n * existence filter mismatch. If not explicitly specified, it is treated\n * equivalently to `false`.\n * @returns A new ViewChange with the given docs, changes, and sync state.\n */\n // PORTING NOTE: The iOS/Android clients always compute limbo document changes.\n applyChanges(\n docChanges: ViewDocumentChanges,\n limboResolutionEnabled: boolean,\n targetChange?: TargetChange,\n targetIsPendingReset?: boolean\n ): ViewChange {\n debugAssert(\n !docChanges.needsRefill,\n 'Cannot apply changes that need a refill'\n );\n const oldDocs = this.documentSet;\n this.documentSet = docChanges.documentSet;\n this.mutatedKeys = docChanges.mutatedKeys;\n // Sort changes based on type and query comparator\n const changes = docChanges.changeSet.getChanges();\n changes.sort((c1, c2) => {\n return (\n compareChangeType(c1.type, c2.type) ||\n this.docComparator(c1.doc, c2.doc)\n );\n });\n\n this.applyTargetChange(targetChange);\n\n targetIsPendingReset = targetIsPendingReset ?? false;\n const limboChanges =\n limboResolutionEnabled && !targetIsPendingReset\n ? this.updateLimboDocuments()\n : [];\n\n // We are at synced state if there is no limbo docs are waiting to be resolved, view is current\n // with the backend, and the query is not pending to reset due to existence filter mismatch.\n const synced =\n this.limboDocuments.size === 0 && this.current && !targetIsPendingReset;\n\n const newSyncState = synced ? SyncState.Synced : SyncState.Local;\n const syncStateChanged = newSyncState !== this.syncState;\n this.syncState = newSyncState;\n\n if (changes.length === 0 && !syncStateChanged) {\n // no changes\n return { limboChanges };\n } else {\n const snap: ViewSnapshot = new ViewSnapshot(\n this.query,\n docChanges.documentSet,\n oldDocs,\n changes,\n docChanges.mutatedKeys,\n newSyncState === SyncState.Local,\n syncStateChanged,\n /* excludesMetadataChanges= */ false,\n targetChange\n ? targetChange.resumeToken.approximateByteSize() > 0\n : false\n );\n return {\n snapshot: snap,\n limboChanges\n };\n }\n }\n\n /**\n * Applies an OnlineState change to the view, potentially generating a\n * ViewChange if the view's syncState changes as a result.\n */\n applyOnlineStateChange(onlineState: OnlineState): ViewChange {\n if (this.current && onlineState === OnlineState.Offline) {\n // If we're offline, set `current` to false and then call applyChanges()\n // to refresh our syncState and generate a ViewChange as appropriate. We\n // are guaranteed to get a new TargetChange that sets `current` back to\n // true once the client is back online.\n this.current = false;\n return this.applyChanges(\n {\n documentSet: this.documentSet,\n changeSet: new DocumentChangeSet(),\n mutatedKeys: this.mutatedKeys,\n needsRefill: false\n },\n /* limboResolutionEnabled= */ false\n );\n } else {\n // No effect, just return a no-op ViewChange.\n return { limboChanges: [] };\n }\n }\n\n /**\n * Returns whether the doc for the given key should be in limbo.\n */\n private shouldBeInLimbo(key: DocumentKey): boolean {\n // If the remote end says it's part of this query, it's not in limbo.\n if (this._syncedDocuments.has(key)) {\n return false;\n }\n // The local store doesn't think it's a result, so it shouldn't be in limbo.\n if (!this.documentSet.has(key)) {\n return false;\n }\n // If there are local changes to the doc, they might explain why the server\n // doesn't know that it's part of the query. So don't put it in limbo.\n // TODO(klimt): Ideally, we would only consider changes that might actually\n // affect this specific query.\n if (this.documentSet.get(key)!.hasLocalMutations) {\n return false;\n }\n // Everything else is in limbo.\n return true;\n }\n\n /**\n * Updates syncedDocuments, current, and limbo docs based on the given change.\n * Returns the list of changes to which docs are in limbo.\n */\n private applyTargetChange(targetChange?: TargetChange): void {\n if (targetChange) {\n targetChange.addedDocuments.forEach(\n key => (this._syncedDocuments = this._syncedDocuments.add(key))\n );\n targetChange.modifiedDocuments.forEach(key => {\n debugAssert(\n this._syncedDocuments.has(key),\n `Modified document ${key} not found in view.`\n );\n });\n targetChange.removedDocuments.forEach(\n key => (this._syncedDocuments = this._syncedDocuments.delete(key))\n );\n this.current = targetChange.current;\n }\n }\n\n private updateLimboDocuments(): LimboDocumentChange[] {\n // We can only determine limbo documents when we're in-sync with the server.\n if (!this.current) {\n return [];\n }\n\n // TODO(klimt): Do this incrementally so that it's not quadratic when\n // updating many documents.\n const oldLimboDocuments = this.limboDocuments;\n this.limboDocuments = documentKeySet();\n this.documentSet.forEach(doc => {\n if (this.shouldBeInLimbo(doc.key)) {\n this.limboDocuments = this.limboDocuments.add(doc.key);\n }\n });\n\n // Diff the new limbo docs with the old limbo docs.\n const changes: LimboDocumentChange[] = [];\n oldLimboDocuments.forEach(key => {\n if (!this.limboDocuments.has(key)) {\n changes.push(new RemovedLimboDocument(key));\n }\n });\n this.limboDocuments.forEach(key => {\n if (!oldLimboDocuments.has(key)) {\n changes.push(new AddedLimboDocument(key));\n }\n });\n return changes;\n }\n\n /**\n * Update the in-memory state of the current view with the state read from\n * persistence.\n *\n * We update the query view whenever a client's primary status changes:\n * - When a client transitions from primary to secondary, it can miss\n * LocalStorage updates and its query views may temporarily not be\n * synchronized with the state on disk.\n * - For secondary to primary transitions, the client needs to update the list\n * of `syncedDocuments` since secondary clients update their query views\n * based purely on synthesized RemoteEvents.\n *\n * @param queryResult.documents - The documents that match the query according\n * to the LocalStore.\n * @param queryResult.remoteKeys - The keys of the documents that match the\n * query according to the backend.\n *\n * @returns The ViewChange that resulted from this synchronization.\n */\n // PORTING NOTE: Multi-tab only.\n synchronizeWithPersistedState(queryResult: QueryResult): ViewChange {\n this._syncedDocuments = queryResult.remoteKeys;\n this.limboDocuments = documentKeySet();\n const docChanges = this.computeDocChanges(queryResult.documents);\n return this.applyChanges(docChanges, /* limboResolutionEnabled= */ true);\n }\n\n /**\n * Returns a view snapshot as if this query was just listened to. Contains\n * a document add for every existing document and the `fromCache` and\n * `hasPendingWrites` status of the already established view.\n */\n // PORTING NOTE: Multi-tab only.\n computeInitialSnapshot(): ViewSnapshot {\n return ViewSnapshot.fromInitialDocuments(\n this.query,\n this.documentSet,\n this.mutatedKeys,\n this.syncState === SyncState.Local,\n this.hasCachedResults\n );\n }\n}\n\nfunction compareChangeType(c1: ChangeType, c2: ChangeType): number {\n const order = (change: ChangeType): 0 | 1 | 2 => {\n switch (change) {\n case ChangeType.Added:\n return 1;\n case ChangeType.Modified:\n return 2;\n case ChangeType.Metadata:\n // A metadata change is converted to a modified change at the public\n // api layer. Since we sort by document key and then change type,\n // metadata and modified changes must be sorted equivalently.\n return 2;\n case ChangeType.Removed:\n return 0;\n default:\n return fail('Unknown ChangeType: ' + change);\n }\n };\n\n return order(c1) - order(c2);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { LoadBundleTask } from '../api/bundle';\nimport { User } from '../auth/user';\nimport { ignoreIfPrimaryLeaseLoss, LocalStore } from '../local/local_store';\nimport {\n localStoreAcknowledgeBatch,\n localStoreAllocateTarget,\n localStoreApplyRemoteEventToLocalCache,\n localStoreExecuteQuery,\n localStoreGetActiveClients,\n localStoreGetCachedTarget,\n localStoreGetHighestUnacknowledgedBatchId,\n localStoreGetNewDocumentChanges,\n localStoreHandleUserChange,\n localStoreHasNewerBundle,\n localStoreLookupMutationDocuments,\n localStoreNotifyLocalViewChanges,\n localStoreRejectBatch,\n localStoreReleaseTarget,\n localStoreRemoveCachedMutationBatchMetadata,\n localStoreSaveBundle,\n localStoreWriteLocally\n} from '../local/local_store_impl';\nimport { LocalViewChanges } from '../local/local_view_changes';\nimport { ReferenceSet } from '../local/reference_set';\nimport { ClientId, SharedClientState } from '../local/shared_client_state';\nimport { QueryTargetState } from '../local/shared_client_state_syncer';\nimport { TargetData, TargetPurpose } from '../local/target_data';\nimport {\n DocumentKeySet,\n documentKeySet,\n DocumentMap\n} from '../model/collections';\nimport { MutableDocument } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { Mutation } from '../model/mutation';\nimport { MutationBatchResult } from '../model/mutation_batch';\nimport { ResourcePath } from '../model/path';\nimport { RemoteEvent, TargetChange } from '../remote/remote_event';\nimport {\n canUseNetwork,\n fillWritePipeline,\n RemoteStore,\n remoteStoreApplyPrimaryState,\n remoteStoreListen,\n remoteStoreUnlisten\n} from '../remote/remote_store';\nimport { debugAssert, debugCast, fail, hardAssert } from '../util/assert';\nimport { wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { BundleReader } from '../util/bundle_reader';\nimport { ByteString } from '../util/byte_string';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { primitiveComparator } from '../util/misc';\nimport { ObjectMap } from '../util/obj_map';\nimport { Deferred } from '../util/promise';\nimport { SortedMap } from '../util/sorted_map';\nimport { BATCHID_UNKNOWN } from '../util/types';\n\nimport {\n bundleInitialProgress,\n BundleLoader,\n bundleSuccessProgress\n} from './bundle_impl';\nimport {\n EventManager,\n eventManagerOnOnlineStateChange,\n eventManagerOnWatchChange,\n eventManagerOnWatchError\n} from './event_manager';\nimport { ListenSequence } from './listen_sequence';\nimport {\n canonifyQuery,\n LimitType,\n newQuery,\n newQueryForPath,\n Query,\n queryEquals,\n queryCollectionGroup,\n queryToTarget,\n stringifyQuery\n} from './query';\nimport { SnapshotVersion } from './snapshot_version';\nimport { SyncEngine } from './sync_engine';\nimport { Target } from './target';\nimport { TargetIdGenerator } from './target_id_generator';\nimport {\n BatchId,\n MutationBatchState,\n OnlineState,\n OnlineStateSource,\n TargetId\n} from './types';\nimport {\n AddedLimboDocument,\n LimboDocumentChange,\n RemovedLimboDocument,\n View,\n ViewChange\n} from './view';\nimport { ViewSnapshot } from './view_snapshot';\n\nconst LOG_TAG = 'SyncEngine';\n\n/**\n * QueryView contains all of the data that SyncEngine needs to keep track of for\n * a particular query.\n */\nclass QueryView {\n constructor(\n /**\n * The query itself.\n */\n public query: Query,\n /**\n * The target number created by the client that is used in the watch\n * stream to identify this query.\n */\n public targetId: TargetId,\n /**\n * The view is responsible for computing the final merged truth of what\n * docs are in the query. It gets notified of local and remote changes,\n * and applies the query filters and limits to determine the most correct\n * possible results.\n */\n public view: View\n ) {}\n}\n\n/** Tracks a limbo resolution. */\nclass LimboResolution {\n constructor(public key: DocumentKey) {}\n\n /**\n * Set to true once we've received a document. This is used in\n * getRemoteKeysForTarget() and ultimately used by WatchChangeAggregator to\n * decide whether it needs to manufacture a delete event for the target once\n * the target is CURRENT.\n */\n receivedDocument: boolean = false;\n}\n\n/**\n * A function that updates a QueryView with a set of document changes (and a\n * remote event if applicable).\n */\ntype ApplyDocChangesHandler = (\n queryView: QueryView,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n) => Promise;\n\n/**\n * Callbacks implemented by EventManager to handle notifications from\n * SyncEngine.\n */\ninterface SyncEngineListener {\n /** Handles new view snapshots. */\n onWatchChange?(snapshots: ViewSnapshot[]): void;\n\n /** Handles the failure of a query. */\n onWatchError?(query: Query, error: FirestoreError): void;\n}\n\n/**\n * An implementation of `SyncEngine` coordinating with other parts of SDK.\n *\n * The parts of SyncEngine that act as a callback to RemoteStore need to be\n * registered individually. This is done in `syncEngineWrite()` and\n * `syncEngineListen()` (as well as `applyPrimaryState()`) as these methods\n * serve as entry points to RemoteStore's functionality.\n *\n * Note: some field defined in this class might have public access level, but\n * the class is not exported so they are only accessible from this module.\n * This is useful to implement optional features (like bundles) in free\n * functions, such that they are tree-shakeable.\n */\nclass SyncEngineImpl implements SyncEngine {\n syncEngineListener: SyncEngineListener = {};\n\n /**\n * A callback that updates the QueryView based on the provided change.\n *\n * PORTING NOTE: On other platforms, this logic lives in\n * `emitNewSnapshotsAndNotifyLocalStore()`, but on Web it is extracted to\n * ensure that all view logic only exists in bundles that include views.\n */\n applyDocChanges?: ApplyDocChangesHandler;\n\n queryViewsByQuery = new ObjectMap(\n q => canonifyQuery(q),\n queryEquals\n );\n queriesByTarget = new Map();\n /**\n * The keys of documents that are in limbo for which we haven't yet started a\n * limbo resolution query. The strings in this set are the result of calling\n * `key.path.canonicalString()` where `key` is a `DocumentKey` object.\n *\n * The `Set` type was chosen because it provides efficient lookup and removal\n * of arbitrary elements and it also maintains insertion order, providing the\n * desired queue-like FIFO semantics.\n */\n enqueuedLimboResolutions = new Set();\n /**\n * Keeps track of the target ID for each document that is in limbo with an\n * active target.\n */\n activeLimboTargetsByKey = new SortedMap(\n DocumentKey.comparator\n );\n /**\n * Keeps track of the information about an active limbo resolution for each\n * active target ID that was started for the purpose of limbo resolution.\n */\n activeLimboResolutionsByTarget = new Map();\n limboDocumentRefs = new ReferenceSet();\n /** Stores user completion handlers, indexed by User and BatchId. */\n mutationUserCallbacks = {} as {\n [uidKey: string]: SortedMap>;\n };\n /** Stores user callbacks waiting for all pending writes to be acknowledged. */\n pendingWritesCallbacks = new Map>>();\n limboTargetIdGenerator = TargetIdGenerator.forSyncEngine();\n\n onlineState = OnlineState.Unknown;\n\n // The primary state is set to `true` or `false` immediately after Firestore\n // startup. In the interim, a client should only be considered primary if\n // `isPrimary` is true.\n _isPrimaryClient: undefined | boolean = undefined;\n\n constructor(\n readonly localStore: LocalStore,\n readonly remoteStore: RemoteStore,\n readonly eventManager: EventManager,\n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n readonly sharedClientState: SharedClientState,\n public currentUser: User,\n readonly maxConcurrentLimboResolutions: number\n ) {}\n\n get isPrimaryClient(): boolean {\n return this._isPrimaryClient === true;\n }\n}\n\nexport function newSyncEngine(\n localStore: LocalStore,\n remoteStore: RemoteStore,\n eventManager: EventManager,\n // PORTING NOTE: Manages state synchronization in multi-tab environments.\n sharedClientState: SharedClientState,\n currentUser: User,\n maxConcurrentLimboResolutions: number,\n isPrimary: boolean\n): SyncEngine {\n const syncEngine = new SyncEngineImpl(\n localStore,\n remoteStore,\n eventManager,\n sharedClientState,\n currentUser,\n maxConcurrentLimboResolutions\n );\n if (isPrimary) {\n syncEngine._isPrimaryClient = true;\n }\n return syncEngine;\n}\n\n/**\n * Initiates the new listen, resolves promise when listen enqueued to the\n * server. All the subsequent view snapshots or errors are sent to the\n * subscribed handlers. Returns the initial snapshot.\n */\nexport async function syncEngineListen(\n syncEngine: SyncEngine,\n query: Query,\n shouldListenToRemote: boolean = true\n): Promise {\n const syncEngineImpl = ensureWatchCallbacks(syncEngine);\n\n let viewSnapshot;\n\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n if (queryView) {\n // PORTING NOTE: With Multi-Tab Web, it is possible that a query view\n // already exists when EventManager calls us for the first time. This\n // happens when the primary tab is already listening to this query on\n // behalf of another tab and the user of the primary also starts listening\n // to the query. EventManager will not have an assigned target ID in this\n // case and calls `listen` to obtain this ID.\n syncEngineImpl.sharedClientState.addLocalQueryTarget(queryView.targetId);\n viewSnapshot = queryView.view.computeInitialSnapshot();\n } else {\n viewSnapshot = await allocateTargetAndMaybeListen(\n syncEngineImpl,\n query,\n shouldListenToRemote,\n /** shouldInitializeView= */ true\n );\n debugAssert(!!viewSnapshot, 'viewSnapshot is not initialized');\n }\n\n return viewSnapshot;\n}\n\n/** Query has been listening to the cache, and tries to initiate the remote store listen */\nexport async function triggerRemoteStoreListen(\n syncEngine: SyncEngine,\n query: Query\n): Promise {\n const syncEngineImpl = ensureWatchCallbacks(syncEngine);\n await allocateTargetAndMaybeListen(\n syncEngineImpl,\n query,\n /** shouldListenToRemote= */ true,\n /** shouldInitializeView= */ false\n );\n}\n\nasync function allocateTargetAndMaybeListen(\n syncEngineImpl: SyncEngineImpl,\n query: Query,\n shouldListenToRemote: boolean,\n shouldInitializeView: boolean\n): Promise {\n const targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n queryToTarget(query)\n );\n\n const targetId = targetData.targetId;\n\n // PORTING NOTE: When the query is listening to cache only, we skip sending it over to Watch by\n // not registering it in shared client state, and directly calculate initial snapshots and\n // subsequent updates from cache. Otherwise, register the target ID with local Firestore client\n // as active watch target.\n const status: QueryTargetState =\n syncEngineImpl.sharedClientState.addLocalQueryTarget(\n targetId,\n /* addToActiveTargetIds= */ shouldListenToRemote\n );\n\n let viewSnapshot;\n if (shouldInitializeView) {\n viewSnapshot = await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n query,\n targetId,\n status === 'current',\n targetData.resumeToken\n );\n }\n\n if (syncEngineImpl.isPrimaryClient && shouldListenToRemote) {\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n\n return viewSnapshot;\n}\n\n/**\n * Registers a view for a previously unknown query and computes its initial\n * snapshot.\n */\nasync function initializeViewAndComputeSnapshot(\n syncEngineImpl: SyncEngineImpl,\n query: Query,\n targetId: TargetId,\n current: boolean,\n resumeToken: ByteString\n): Promise {\n // PORTING NOTE: On Web only, we inject the code that registers new Limbo\n // targets based on view changes. This allows us to only depend on Limbo\n // changes when user code includes queries.\n syncEngineImpl.applyDocChanges = (queryView, changes, remoteEvent) =>\n applyDocChanges(syncEngineImpl, queryView, changes, remoteEvent);\n\n const queryResult = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n query,\n /* usePreviousResults= */ true\n );\n const view = new View(query, queryResult.remoteKeys);\n const viewDocChanges = view.computeDocChanges(queryResult.documents);\n const synthesizedTargetChange =\n TargetChange.createSynthesizedTargetChangeForCurrentChange(\n targetId,\n current && syncEngineImpl.onlineState !== OnlineState.Offline,\n resumeToken\n );\n const viewChange = view.applyChanges(\n viewDocChanges,\n /* limboResolutionEnabled= */ syncEngineImpl.isPrimaryClient,\n synthesizedTargetChange\n );\n updateTrackedLimbos(syncEngineImpl, targetId, viewChange.limboChanges);\n\n debugAssert(\n !!viewChange.snapshot,\n 'applyChanges for new view should always return a snapshot'\n );\n\n const data = new QueryView(query, targetId, view);\n\n syncEngineImpl.queryViewsByQuery.set(query, data);\n if (syncEngineImpl.queriesByTarget.has(targetId)) {\n syncEngineImpl.queriesByTarget.get(targetId)!.push(query);\n } else {\n syncEngineImpl.queriesByTarget.set(targetId, [query]);\n }\n\n return viewChange.snapshot;\n}\n\n/** Stops listening to the query. */\nexport async function syncEngineUnlisten(\n syncEngine: SyncEngine,\n query: Query,\n shouldUnlistenToRemote: boolean\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const queryView = syncEngineImpl.queryViewsByQuery.get(query)!;\n debugAssert(\n !!queryView,\n 'Trying to unlisten on query not found:' + stringifyQuery(query)\n );\n\n // Only clean up the query view and target if this is the only query mapped\n // to the target.\n const queries = syncEngineImpl.queriesByTarget.get(queryView.targetId)!;\n if (queries.length > 1) {\n syncEngineImpl.queriesByTarget.set(\n queryView.targetId,\n queries.filter(q => !queryEquals(q, query))\n );\n syncEngineImpl.queryViewsByQuery.delete(query);\n return;\n }\n\n // No other queries are mapped to the target, clean up the query and the target.\n if (syncEngineImpl.isPrimaryClient) {\n // We need to remove the local query target first to allow us to verify\n // whether any other client is still interested in this target.\n syncEngineImpl.sharedClientState.removeLocalQueryTarget(queryView.targetId);\n const targetRemainsActive =\n syncEngineImpl.sharedClientState.isActiveQueryTarget(queryView.targetId);\n\n if (!targetRemainsActive) {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n queryView.targetId,\n /*keepPersistedTargetData=*/ false\n )\n .then(() => {\n syncEngineImpl.sharedClientState.clearQueryState(queryView.targetId);\n if (shouldUnlistenToRemote) {\n remoteStoreUnlisten(syncEngineImpl.remoteStore, queryView.targetId);\n }\n removeAndCleanupTarget(syncEngineImpl, queryView.targetId);\n })\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n } else {\n removeAndCleanupTarget(syncEngineImpl, queryView.targetId);\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n queryView.targetId,\n /*keepPersistedTargetData=*/ true\n );\n }\n}\n\n/** Unlistens to the remote store while still listening to the cache. */\nexport async function triggerRemoteStoreUnlisten(\n syncEngine: SyncEngine,\n query: Query\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const queryView = syncEngineImpl.queryViewsByQuery.get(query)!;\n debugAssert(\n !!queryView,\n 'Trying to unlisten on query not found:' + stringifyQuery(query)\n );\n const queries = syncEngineImpl.queriesByTarget.get(queryView.targetId)!;\n\n if (syncEngineImpl.isPrimaryClient && queries.length === 1) {\n // PORTING NOTE: Unregister the target ID with local Firestore client as\n // watch target.\n syncEngineImpl.sharedClientState.removeLocalQueryTarget(queryView.targetId);\n\n remoteStoreUnlisten(syncEngineImpl.remoteStore, queryView.targetId);\n }\n}\n\n/**\n * Initiates the write of local mutation batch which involves adding the\n * writes to the mutation queue, notifying the remote store about new\n * mutations and raising events for any changes this write caused.\n *\n * The promise returned by this call is resolved when the above steps\n * have completed, *not* when the write was acked by the backend. The\n * userCallback is resolved once the write was acked/rejected by the\n * backend (or failed locally for any other reason).\n */\nexport async function syncEngineWrite(\n syncEngine: SyncEngine,\n batch: Mutation[],\n userCallback: Deferred\n): Promise {\n const syncEngineImpl = syncEngineEnsureWriteCallbacks(syncEngine);\n\n try {\n const result = await localStoreWriteLocally(\n syncEngineImpl.localStore,\n batch\n );\n syncEngineImpl.sharedClientState.addPendingMutation(result.batchId);\n addMutationCallback(syncEngineImpl, result.batchId, userCallback);\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n result.changes\n );\n await fillWritePipeline(syncEngineImpl.remoteStore);\n } catch (e) {\n // If we can't persist the mutation, we reject the user callback and\n // don't send the mutation. The user can then retry the write.\n const error = wrapInUserErrorIfRecoverable(\n e as Error,\n `Failed to persist write`\n );\n userCallback.reject(error);\n }\n}\n\n/**\n * Applies one remote event to the sync engine, notifying any views of the\n * changes, and releasing any pending mutation batches that would become\n * visible because of the snapshot version the remote event contains.\n */\nexport async function syncEngineApplyRemoteEvent(\n syncEngine: SyncEngine,\n remoteEvent: RemoteEvent\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n try {\n const changes = await localStoreApplyRemoteEventToLocalCache(\n syncEngineImpl.localStore,\n remoteEvent\n );\n // Update `receivedDocument` as appropriate for any limbo targets.\n remoteEvent.targetChanges.forEach((targetChange, targetId) => {\n const limboResolution =\n syncEngineImpl.activeLimboResolutionsByTarget.get(targetId);\n if (limboResolution) {\n // Since this is a limbo resolution lookup, it's for a single document\n // and it could be added, modified, or removed, but not a combination.\n hardAssert(\n targetChange.addedDocuments.size +\n targetChange.modifiedDocuments.size +\n targetChange.removedDocuments.size <=\n 1,\n 'Limbo resolution for single document contains multiple changes.'\n );\n if (targetChange.addedDocuments.size > 0) {\n limboResolution.receivedDocument = true;\n } else if (targetChange.modifiedDocuments.size > 0) {\n hardAssert(\n limboResolution.receivedDocument,\n 'Received change for limbo target document without add.'\n );\n } else if (targetChange.removedDocuments.size > 0) {\n hardAssert(\n limboResolution.receivedDocument,\n 'Received remove for limbo target document without add.'\n );\n limboResolution.receivedDocument = false;\n } else {\n // This was probably just a CURRENT targetChange or similar.\n }\n }\n });\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n changes,\n remoteEvent\n );\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error as FirestoreError);\n }\n}\n\n/**\n * Applies an OnlineState change to the sync engine and notifies any views of\n * the change.\n */\nexport function syncEngineApplyOnlineStateChange(\n syncEngine: SyncEngine,\n onlineState: OnlineState,\n source: OnlineStateSource\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n // If we are the secondary client, we explicitly ignore the remote store's\n // online state (the local client may go offline, even though the primary\n // tab remains online) and only apply the primary tab's online state from\n // SharedClientState.\n if (\n (syncEngineImpl.isPrimaryClient &&\n source === OnlineStateSource.RemoteStore) ||\n (!syncEngineImpl.isPrimaryClient &&\n source === OnlineStateSource.SharedClientState)\n ) {\n const newViewSnapshots = [] as ViewSnapshot[];\n syncEngineImpl.queryViewsByQuery.forEach((query, queryView) => {\n const viewChange = queryView.view.applyOnlineStateChange(onlineState);\n debugAssert(\n viewChange.limboChanges.length === 0,\n 'OnlineState should not affect limbo documents.'\n );\n if (viewChange.snapshot) {\n newViewSnapshots.push(viewChange.snapshot);\n }\n });\n\n eventManagerOnOnlineStateChange(syncEngineImpl.eventManager, onlineState);\n\n if (newViewSnapshots.length) {\n debugAssert(\n !!syncEngineImpl.syncEngineListener.onWatchChange,\n 'Active views but EventManager callbacks are not assigned'\n );\n syncEngineImpl.syncEngineListener.onWatchChange(newViewSnapshots);\n }\n\n syncEngineImpl.onlineState = onlineState;\n if (syncEngineImpl.isPrimaryClient) {\n syncEngineImpl.sharedClientState.setOnlineState(onlineState);\n }\n }\n}\n\n/**\n * Rejects the listen for the given targetID. This can be triggered by the\n * backend for any active target.\n *\n * @param syncEngine - The sync engine implementation.\n * @param targetId - The targetID corresponds to one previously initiated by the\n * user as part of TargetData passed to listen() on RemoteStore.\n * @param err - A description of the condition that has forced the rejection.\n * Nearly always this will be an indication that the user is no longer\n * authorized to see the data matching the target.\n */\nexport async function syncEngineRejectListen(\n syncEngine: SyncEngine,\n targetId: TargetId,\n err: FirestoreError\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n // PORTING NOTE: Multi-tab only.\n syncEngineImpl.sharedClientState.updateQueryState(targetId, 'rejected', err);\n\n const limboResolution =\n syncEngineImpl.activeLimboResolutionsByTarget.get(targetId);\n const limboKey = limboResolution && limboResolution.key;\n if (limboKey) {\n // TODO(klimt): We really only should do the following on permission\n // denied errors, but we don't have the cause code here.\n\n // It's a limbo doc. Create a synthetic event saying it was deleted.\n // This is kind of a hack. Ideally, we would have a method in the local\n // store to purge a document. However, it would be tricky to keep all of\n // the local store's invariants with another method.\n let documentUpdates = new SortedMap(\n DocumentKey.comparator\n );\n // TODO(b/217189216): This limbo document should ideally have a read time,\n // so that it is picked up by any read-time based scans. The backend,\n // however, does not send a read time for target removals.\n documentUpdates = documentUpdates.insert(\n limboKey,\n MutableDocument.newNoDocument(limboKey, SnapshotVersion.min())\n );\n const resolvedLimboDocuments = documentKeySet().add(limboKey);\n const event = new RemoteEvent(\n SnapshotVersion.min(),\n /* targetChanges= */ new Map(),\n /* targetMismatches= */ new SortedMap(\n primitiveComparator\n ),\n documentUpdates,\n resolvedLimboDocuments\n );\n\n await syncEngineApplyRemoteEvent(syncEngineImpl, event);\n\n // Since this query failed, we won't want to manually unlisten to it.\n // We only remove it from bookkeeping after we successfully applied the\n // RemoteEvent. If `applyRemoteEvent()` throws, we want to re-listen to\n // this query when the RemoteStore restarts the Watch stream, which should\n // re-trigger the target failure.\n syncEngineImpl.activeLimboTargetsByKey =\n syncEngineImpl.activeLimboTargetsByKey.remove(limboKey);\n syncEngineImpl.activeLimboResolutionsByTarget.delete(targetId);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n } else {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ false\n )\n .then(() => removeAndCleanupTarget(syncEngineImpl, targetId, err))\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n}\n\nexport async function syncEngineApplySuccessfulWrite(\n syncEngine: SyncEngine,\n mutationBatchResult: MutationBatchResult\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const batchId = mutationBatchResult.batch.batchId;\n\n try {\n const changes = await localStoreAcknowledgeBatch(\n syncEngineImpl.localStore,\n mutationBatchResult\n );\n\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught\n // up), so we raise user callbacks first so that they consistently happen\n // before listen events.\n processUserCallback(syncEngineImpl, batchId, /*error=*/ null);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n\n syncEngineImpl.sharedClientState.updateMutationState(\n batchId,\n 'acknowledged'\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes);\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error as FirestoreError);\n }\n}\n\nexport async function syncEngineRejectFailedWrite(\n syncEngine: SyncEngine,\n batchId: BatchId,\n error: FirestoreError\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n try {\n const changes = await localStoreRejectBatch(\n syncEngineImpl.localStore,\n batchId\n );\n\n // The local store may or may not be able to apply the write result and\n // raise events immediately (depending on whether the watcher is caught up),\n // so we raise user callbacks first so that they consistently happen before\n // listen events.\n processUserCallback(syncEngineImpl, batchId, error);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n\n syncEngineImpl.sharedClientState.updateMutationState(\n batchId,\n 'rejected',\n error\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes);\n } catch (error) {\n await ignoreIfPrimaryLeaseLoss(error as FirestoreError);\n }\n}\n\n/**\n * Registers a user callback that resolves when all pending mutations at the moment of calling\n * are acknowledged .\n */\nexport async function syncEngineRegisterPendingWritesCallback(\n syncEngine: SyncEngine,\n callback: Deferred\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n if (!canUseNetwork(syncEngineImpl.remoteStore)) {\n logDebug(\n LOG_TAG,\n 'The network is disabled. The task returned by ' +\n \"'awaitPendingWrites()' will not complete until the network is enabled.\"\n );\n }\n\n try {\n const highestBatchId = await localStoreGetHighestUnacknowledgedBatchId(\n syncEngineImpl.localStore\n );\n if (highestBatchId === BATCHID_UNKNOWN) {\n // Trigger the callback right away if there is no pending writes at the moment.\n callback.resolve();\n return;\n }\n\n const callbacks =\n syncEngineImpl.pendingWritesCallbacks.get(highestBatchId) || [];\n callbacks.push(callback);\n syncEngineImpl.pendingWritesCallbacks.set(highestBatchId, callbacks);\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e as Error,\n 'Initialization of waitForPendingWrites() operation failed'\n );\n callback.reject(firestoreError);\n }\n}\n\n/**\n * Triggers the callbacks that are waiting for this batch id to get acknowledged by server,\n * if there are any.\n */\nfunction triggerPendingWritesCallbacks(\n syncEngineImpl: SyncEngineImpl,\n batchId: BatchId\n): void {\n (syncEngineImpl.pendingWritesCallbacks.get(batchId) || []).forEach(\n callback => {\n callback.resolve();\n }\n );\n\n syncEngineImpl.pendingWritesCallbacks.delete(batchId);\n}\n\n/** Reject all outstanding callbacks waiting for pending writes to complete. */\nfunction rejectOutstandingPendingWritesCallbacks(\n syncEngineImpl: SyncEngineImpl,\n errorMessage: string\n): void {\n syncEngineImpl.pendingWritesCallbacks.forEach(callbacks => {\n callbacks.forEach(callback => {\n callback.reject(new FirestoreError(Code.CANCELLED, errorMessage));\n });\n });\n\n syncEngineImpl.pendingWritesCallbacks.clear();\n}\n\nfunction addMutationCallback(\n syncEngineImpl: SyncEngineImpl,\n batchId: BatchId,\n callback: Deferred\n): void {\n let newCallbacks =\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()];\n if (!newCallbacks) {\n newCallbacks = new SortedMap>(primitiveComparator);\n }\n newCallbacks = newCallbacks.insert(batchId, callback);\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()] =\n newCallbacks;\n}\n\n/**\n * Resolves or rejects the user callback for the given batch and then discards\n * it.\n */\nfunction processUserCallback(\n syncEngine: SyncEngine,\n batchId: BatchId,\n error: FirestoreError | null\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n let newCallbacks =\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()];\n\n // NOTE: Mutations restored from persistence won't have callbacks, so it's\n // okay for there to be no callback for this ID.\n if (newCallbacks) {\n const callback = newCallbacks.get(batchId);\n if (callback) {\n debugAssert(\n batchId === newCallbacks.minKey(),\n 'Mutation callbacks processed out-of-order?'\n );\n if (error) {\n callback.reject(error);\n } else {\n callback.resolve();\n }\n newCallbacks = newCallbacks.remove(batchId);\n }\n syncEngineImpl.mutationUserCallbacks[syncEngineImpl.currentUser.toKey()] =\n newCallbacks;\n }\n}\n\nfunction removeAndCleanupTarget(\n syncEngineImpl: SyncEngineImpl,\n targetId: number,\n error: FirestoreError | null = null\n): void {\n syncEngineImpl.sharedClientState.removeLocalQueryTarget(targetId);\n\n debugAssert(\n syncEngineImpl.queriesByTarget.has(targetId) &&\n syncEngineImpl.queriesByTarget.get(targetId)!.length !== 0,\n `There are no queries mapped to target id ${targetId}`\n );\n\n for (const query of syncEngineImpl.queriesByTarget.get(targetId)!) {\n syncEngineImpl.queryViewsByQuery.delete(query);\n if (error) {\n syncEngineImpl.syncEngineListener.onWatchError!(query, error);\n }\n }\n\n syncEngineImpl.queriesByTarget.delete(targetId);\n\n if (syncEngineImpl.isPrimaryClient) {\n const limboKeys =\n syncEngineImpl.limboDocumentRefs.removeReferencesForId(targetId);\n limboKeys.forEach(limboKey => {\n const isReferenced =\n syncEngineImpl.limboDocumentRefs.containsKey(limboKey);\n if (!isReferenced) {\n // We removed the last reference for this key\n removeLimboTarget(syncEngineImpl, limboKey);\n }\n });\n }\n}\n\nfunction removeLimboTarget(\n syncEngineImpl: SyncEngineImpl,\n key: DocumentKey\n): void {\n syncEngineImpl.enqueuedLimboResolutions.delete(key.path.canonicalString());\n\n // It's possible that the target already got removed because the query failed. In that case,\n // the key won't exist in `limboTargetsByKey`. Only do the cleanup if we still have the target.\n const limboTargetId = syncEngineImpl.activeLimboTargetsByKey.get(key);\n if (limboTargetId === null) {\n // This target already got removed, because the query failed.\n return;\n }\n\n remoteStoreUnlisten(syncEngineImpl.remoteStore, limboTargetId);\n syncEngineImpl.activeLimboTargetsByKey =\n syncEngineImpl.activeLimboTargetsByKey.remove(key);\n syncEngineImpl.activeLimboResolutionsByTarget.delete(limboTargetId);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n}\n\nfunction updateTrackedLimbos(\n syncEngineImpl: SyncEngineImpl,\n targetId: TargetId,\n limboChanges: LimboDocumentChange[]\n): void {\n for (const limboChange of limboChanges) {\n if (limboChange instanceof AddedLimboDocument) {\n syncEngineImpl.limboDocumentRefs.addReference(limboChange.key, targetId);\n trackLimboChange(syncEngineImpl, limboChange);\n } else if (limboChange instanceof RemovedLimboDocument) {\n logDebug(LOG_TAG, 'Document no longer in limbo: ' + limboChange.key);\n syncEngineImpl.limboDocumentRefs.removeReference(\n limboChange.key,\n targetId\n );\n const isReferenced = syncEngineImpl.limboDocumentRefs.containsKey(\n limboChange.key\n );\n if (!isReferenced) {\n // We removed the last reference for this key\n removeLimboTarget(syncEngineImpl, limboChange.key);\n }\n } else {\n fail('Unknown limbo change: ' + JSON.stringify(limboChange));\n }\n }\n}\n\nfunction trackLimboChange(\n syncEngineImpl: SyncEngineImpl,\n limboChange: AddedLimboDocument\n): void {\n const key = limboChange.key;\n const keyString = key.path.canonicalString();\n if (\n !syncEngineImpl.activeLimboTargetsByKey.get(key) &&\n !syncEngineImpl.enqueuedLimboResolutions.has(keyString)\n ) {\n logDebug(LOG_TAG, 'New document in limbo: ' + key);\n syncEngineImpl.enqueuedLimboResolutions.add(keyString);\n pumpEnqueuedLimboResolutions(syncEngineImpl);\n }\n}\n\n/**\n * Starts listens for documents in limbo that are enqueued for resolution,\n * subject to a maximum number of concurrent resolutions.\n *\n * Without bounding the number of concurrent resolutions, the server can fail\n * with \"resource exhausted\" errors which can lead to pathological client\n * behavior as seen in https://github.com/firebase/firebase-js-sdk/issues/2683.\n */\nfunction pumpEnqueuedLimboResolutions(syncEngineImpl: SyncEngineImpl): void {\n while (\n syncEngineImpl.enqueuedLimboResolutions.size > 0 &&\n syncEngineImpl.activeLimboTargetsByKey.size <\n syncEngineImpl.maxConcurrentLimboResolutions\n ) {\n const keyString = syncEngineImpl.enqueuedLimboResolutions\n .values()\n .next().value;\n syncEngineImpl.enqueuedLimboResolutions.delete(keyString);\n const key = new DocumentKey(ResourcePath.fromString(keyString));\n const limboTargetId = syncEngineImpl.limboTargetIdGenerator.next();\n syncEngineImpl.activeLimboResolutionsByTarget.set(\n limboTargetId,\n new LimboResolution(key)\n );\n syncEngineImpl.activeLimboTargetsByKey =\n syncEngineImpl.activeLimboTargetsByKey.insert(key, limboTargetId);\n remoteStoreListen(\n syncEngineImpl.remoteStore,\n new TargetData(\n queryToTarget(newQueryForPath(key.path)),\n limboTargetId,\n TargetPurpose.LimboResolution,\n ListenSequence.INVALID\n )\n );\n }\n}\n\n// Visible for testing\nexport function syncEngineGetActiveLimboDocumentResolutions(\n syncEngine: SyncEngine\n): SortedMap {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return syncEngineImpl.activeLimboTargetsByKey;\n}\n\n// Visible for testing\nexport function syncEngineGetEnqueuedLimboDocumentResolutions(\n syncEngine: SyncEngine\n): Set {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return syncEngineImpl.enqueuedLimboResolutions;\n}\n\nexport async function syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngine: SyncEngine,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const newSnaps: ViewSnapshot[] = [];\n const docChangesInAllViews: LocalViewChanges[] = [];\n const queriesProcessed: Array> = [];\n\n if (syncEngineImpl.queryViewsByQuery.isEmpty()) {\n // Return early since `onWatchChange()` might not have been assigned yet.\n return;\n }\n\n syncEngineImpl.queryViewsByQuery.forEach((_, queryView) => {\n debugAssert(\n !!syncEngineImpl.applyDocChanges,\n 'ApplyDocChangesHandler not set'\n );\n queriesProcessed.push(\n syncEngineImpl\n .applyDocChanges(queryView, changes, remoteEvent)\n .then(viewSnapshot => {\n // If there are changes, or we are handling a global snapshot, notify\n // secondary clients to update query state.\n if (viewSnapshot || remoteEvent) {\n if (syncEngineImpl.isPrimaryClient) {\n // Query state is set to `current` if:\n // - There is a view change and it is up-to-date, or,\n // - There is a global snapshot, the Target is current, and no changes to be resolved\n const isCurrent = viewSnapshot\n ? !viewSnapshot.fromCache\n : remoteEvent?.targetChanges.get(queryView.targetId)?.current;\n\n syncEngineImpl.sharedClientState.updateQueryState(\n queryView.targetId,\n isCurrent ? 'current' : 'not-current'\n );\n }\n }\n\n // Update views if there are actual changes.\n if (!!viewSnapshot) {\n newSnaps.push(viewSnapshot);\n const docChanges = LocalViewChanges.fromSnapshot(\n queryView.targetId,\n viewSnapshot\n );\n docChangesInAllViews.push(docChanges);\n }\n })\n );\n });\n\n await Promise.all(queriesProcessed);\n syncEngineImpl.syncEngineListener.onWatchChange!(newSnaps);\n await localStoreNotifyLocalViewChanges(\n syncEngineImpl.localStore,\n docChangesInAllViews\n );\n}\n\nasync function applyDocChanges(\n syncEngineImpl: SyncEngineImpl,\n queryView: QueryView,\n changes: DocumentMap,\n remoteEvent?: RemoteEvent\n): Promise {\n let viewDocChanges = queryView.view.computeDocChanges(changes);\n if (viewDocChanges.needsRefill) {\n // The query has a limit and some docs were removed, so we need\n // to re-run the query against the local store to make sure we\n // didn't lose any good docs that had been past the limit.\n viewDocChanges = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n queryView.query,\n /* usePreviousResults= */ false\n ).then(({ documents }) => {\n return queryView.view.computeDocChanges(documents, viewDocChanges);\n });\n }\n\n const targetChange =\n remoteEvent && remoteEvent.targetChanges.get(queryView.targetId);\n const targetIsPendingReset =\n remoteEvent && remoteEvent.targetMismatches.get(queryView.targetId) != null;\n const viewChange = queryView.view.applyChanges(\n viewDocChanges,\n /* limboResolutionEnabled= */ syncEngineImpl.isPrimaryClient,\n targetChange,\n targetIsPendingReset\n );\n updateTrackedLimbos(\n syncEngineImpl,\n queryView.targetId,\n viewChange.limboChanges\n );\n return viewChange.snapshot;\n}\n\nexport async function syncEngineHandleCredentialChange(\n syncEngine: SyncEngine,\n user: User\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const userChanged = !syncEngineImpl.currentUser.isEqual(user);\n\n if (userChanged) {\n logDebug(LOG_TAG, 'User change. New user:', user.toKey());\n\n const result = await localStoreHandleUserChange(\n syncEngineImpl.localStore,\n user\n );\n syncEngineImpl.currentUser = user;\n\n // Fails tasks waiting for pending writes requested by previous user.\n rejectOutstandingPendingWritesCallbacks(\n syncEngineImpl,\n \"'waitForPendingWrites' promise is rejected due to a user change.\"\n );\n // TODO(b/114226417): Consider calling this only in the primary tab.\n syncEngineImpl.sharedClientState.handleUserChange(\n user,\n result.removedBatchIds,\n result.addedBatchIds\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n result.affectedDocuments\n );\n }\n}\n\nexport function syncEngineGetRemoteKeysForTarget(\n syncEngine: SyncEngine,\n targetId: TargetId\n): DocumentKeySet {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const limboResolution =\n syncEngineImpl.activeLimboResolutionsByTarget.get(targetId);\n if (limboResolution && limboResolution.receivedDocument) {\n return documentKeySet().add(limboResolution.key);\n } else {\n let keySet = documentKeySet();\n const queries = syncEngineImpl.queriesByTarget.get(targetId);\n if (!queries) {\n return keySet;\n }\n for (const query of queries) {\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n debugAssert(\n !!queryView,\n `No query view found for ${stringifyQuery(query)}`\n );\n keySet = keySet.unionWith(queryView.view.syncedDocuments);\n }\n return keySet;\n }\n}\n\n/**\n * Reconcile the list of synced documents in an existing view with those\n * from persistence.\n */\nasync function synchronizeViewAndComputeSnapshot(\n syncEngine: SyncEngine,\n queryView: QueryView\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const queryResult = await localStoreExecuteQuery(\n syncEngineImpl.localStore,\n queryView.query,\n /* usePreviousResults= */ true\n );\n const viewSnapshot =\n queryView.view.synchronizeWithPersistedState(queryResult);\n if (syncEngineImpl.isPrimaryClient) {\n updateTrackedLimbos(\n syncEngineImpl,\n queryView.targetId,\n viewSnapshot.limboChanges\n );\n }\n return viewSnapshot;\n}\n\n/**\n * Retrieves newly changed documents from remote document cache and raises\n * snapshots if needed.\n */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineSynchronizeWithChangedDocuments(\n syncEngine: SyncEngine,\n collectionGroup: string\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n return localStoreGetNewDocumentChanges(\n syncEngineImpl.localStore,\n collectionGroup\n ).then(changes =>\n syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, changes)\n );\n}\n\n/** Applies a mutation state to an existing batch. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyBatchState(\n syncEngine: SyncEngine,\n batchId: BatchId,\n batchState: MutationBatchState,\n error?: FirestoreError\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const documents = await localStoreLookupMutationDocuments(\n syncEngineImpl.localStore,\n batchId\n );\n\n if (documents === null) {\n // A throttled tab may not have seen the mutation before it was completed\n // and removed from the mutation queue, in which case we won't have cached\n // the affected documents. In this case we can safely ignore the update\n // since that means we didn't apply the mutation locally at all (if we\n // had, we would have cached the affected documents), and so we will just\n // see any resulting document changes via normal remote document updates\n // as applicable.\n logDebug(LOG_TAG, 'Cannot apply mutation batch with id: ' + batchId);\n return;\n }\n\n if (batchState === 'pending') {\n // If we are the primary client, we need to send this write to the\n // backend. Secondary clients will ignore these writes since their remote\n // connection is disabled.\n await fillWritePipeline(syncEngineImpl.remoteStore);\n } else if (batchState === 'acknowledged' || batchState === 'rejected') {\n // NOTE: Both these methods are no-ops for batches that originated from\n // other clients.\n processUserCallback(syncEngineImpl, batchId, error ? error : null);\n triggerPendingWritesCallbacks(syncEngineImpl, batchId);\n localStoreRemoveCachedMutationBatchMetadata(\n syncEngineImpl.localStore,\n batchId\n );\n } else {\n fail(`Unknown batchState: ${batchState}`);\n }\n\n await syncEngineEmitNewSnapsAndNotifyLocalStore(syncEngineImpl, documents);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyPrimaryState(\n syncEngine: SyncEngine,\n isPrimary: boolean\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n ensureWatchCallbacks(syncEngineImpl);\n syncEngineEnsureWriteCallbacks(syncEngineImpl);\n if (isPrimary === true && syncEngineImpl._isPrimaryClient !== true) {\n // Secondary tabs only maintain Views for their local listeners and the\n // Views internal state may not be 100% populated (in particular\n // secondary tabs don't track syncedDocuments, the set of documents the\n // server considers to be in the target). So when a secondary becomes\n // primary, we need to need to make sure that all views for all targets\n // match the state on disk.\n const activeTargets =\n syncEngineImpl.sharedClientState.getAllActiveQueryTargets();\n const activeQueries = await synchronizeQueryViewsAndRaiseSnapshots(\n syncEngineImpl,\n activeTargets.toArray(),\n /*transitionToPrimary=*/ true\n );\n syncEngineImpl._isPrimaryClient = true;\n await remoteStoreApplyPrimaryState(syncEngineImpl.remoteStore, true);\n for (const targetData of activeQueries) {\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n } else if (isPrimary === false && syncEngineImpl._isPrimaryClient !== false) {\n const activeTargets: TargetId[] = [];\n\n let p = Promise.resolve();\n syncEngineImpl.queriesByTarget.forEach((_, targetId) => {\n if (syncEngineImpl.sharedClientState.isLocalQueryTarget(targetId)) {\n activeTargets.push(targetId);\n } else {\n p = p.then(() => {\n removeAndCleanupTarget(syncEngineImpl, targetId);\n return localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /*keepPersistedTargetData=*/ true\n );\n });\n }\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n });\n await p;\n\n await synchronizeQueryViewsAndRaiseSnapshots(\n syncEngineImpl,\n activeTargets,\n /*transitionToPrimary=*/ false\n );\n resetLimboDocuments(syncEngineImpl);\n syncEngineImpl._isPrimaryClient = false;\n await remoteStoreApplyPrimaryState(syncEngineImpl.remoteStore, false);\n }\n}\n\n// PORTING NOTE: Multi-Tab only.\nfunction resetLimboDocuments(syncEngine: SyncEngine): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.activeLimboResolutionsByTarget.forEach((_, targetId) => {\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n });\n syncEngineImpl.limboDocumentRefs.removeAllReferences();\n syncEngineImpl.activeLimboResolutionsByTarget = new Map<\n TargetId,\n LimboResolution\n >();\n syncEngineImpl.activeLimboTargetsByKey = new SortedMap(\n DocumentKey.comparator\n );\n}\n\n/**\n * Reconcile the query views of the provided query targets with the state from\n * persistence. Raises snapshots for any changes that affect the local\n * client and returns the updated state of all target's query data.\n *\n * @param syncEngine - The sync engine implementation\n * @param targets - the list of targets with views that need to be recomputed\n * @param transitionToPrimary - `true` iff the tab transitions from a secondary\n * tab to a primary tab\n */\n// PORTING NOTE: Multi-Tab only.\nasync function synchronizeQueryViewsAndRaiseSnapshots(\n syncEngine: SyncEngine,\n targets: TargetId[],\n transitionToPrimary: boolean\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n const activeQueries: TargetData[] = [];\n const newViewSnapshots: ViewSnapshot[] = [];\n for (const targetId of targets) {\n let targetData: TargetData;\n const queries = syncEngineImpl.queriesByTarget.get(targetId);\n\n if (queries && queries.length !== 0) {\n // For queries that have a local View, we fetch their current state\n // from LocalStore (as the resume token and the snapshot version\n // might have changed) and reconcile their views with the persisted\n // state (the list of syncedDocuments may have gotten out of sync).\n targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n queryToTarget(queries[0])\n );\n\n for (const query of queries) {\n const queryView = syncEngineImpl.queryViewsByQuery.get(query);\n debugAssert(\n !!queryView,\n `No query view found for ${stringifyQuery(query)}`\n );\n\n const viewChange = await synchronizeViewAndComputeSnapshot(\n syncEngineImpl,\n queryView\n );\n if (viewChange.snapshot) {\n newViewSnapshots.push(viewChange.snapshot);\n }\n }\n } else {\n debugAssert(\n transitionToPrimary,\n 'A secondary tab should never have an active view without an active target.'\n );\n // For queries that never executed on this client, we need to\n // allocate the target in LocalStore and initialize a new View.\n const target = await localStoreGetCachedTarget(\n syncEngineImpl.localStore,\n targetId\n );\n debugAssert(!!target, `Target for id ${targetId} not found`);\n targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n target\n );\n await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n synthesizeTargetToQuery(target!),\n targetId,\n /*current=*/ false,\n targetData.resumeToken\n );\n }\n\n activeQueries.push(targetData!);\n }\n\n syncEngineImpl.syncEngineListener.onWatchChange!(newViewSnapshots);\n return activeQueries;\n}\n\n/**\n * Creates a `Query` object from the specified `Target`. There is no way to\n * obtain the original `Query`, so we synthesize a `Query` from the `Target`\n * object.\n *\n * The synthesized result might be different from the original `Query`, but\n * since the synthesized `Query` should return the same results as the\n * original one (only the presentation of results might differ), the potential\n * difference will not cause issues.\n */\n// PORTING NOTE: Multi-Tab only.\nfunction synthesizeTargetToQuery(target: Target): Query {\n return newQuery(\n target.path,\n target.collectionGroup,\n target.orderBy,\n target.filters,\n target.limit,\n LimitType.First,\n target.startAt,\n target.endAt\n );\n}\n\n/** Returns the IDs of the clients that are currently active. */\n// PORTING NOTE: Multi-Tab only.\nexport function syncEngineGetActiveClients(\n syncEngine: SyncEngine\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n return localStoreGetActiveClients(syncEngineImpl.localStore);\n}\n\n/** Applies a query target change from a different tab. */\n// PORTING NOTE: Multi-Tab only.\nexport async function syncEngineApplyTargetState(\n syncEngine: SyncEngine,\n targetId: TargetId,\n state: QueryTargetState,\n error?: FirestoreError\n): Promise {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n if (syncEngineImpl._isPrimaryClient) {\n // If we receive a target state notification via WebStorage, we are\n // either already secondary or another tab has taken the primary lease.\n logDebug(LOG_TAG, 'Ignoring unexpected query state notification.');\n return;\n }\n\n const query = syncEngineImpl.queriesByTarget.get(targetId);\n if (query && query.length > 0) {\n switch (state) {\n case 'current':\n case 'not-current': {\n const changes = await localStoreGetNewDocumentChanges(\n syncEngineImpl.localStore,\n queryCollectionGroup(query[0])\n );\n const synthesizedRemoteEvent =\n RemoteEvent.createSynthesizedRemoteEventForCurrentChange(\n targetId,\n state === 'current',\n ByteString.EMPTY_BYTE_STRING\n );\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngineImpl,\n changes,\n synthesizedRemoteEvent\n );\n break;\n }\n case 'rejected': {\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ true\n );\n removeAndCleanupTarget(syncEngineImpl, targetId, error);\n break;\n }\n default:\n fail('Unexpected target state: ' + state);\n }\n }\n}\n\n/** Adds or removes Watch targets for queries from different tabs. */\nexport async function syncEngineApplyActiveTargetsChange(\n syncEngine: SyncEngine,\n added: TargetId[],\n removed: TargetId[]\n): Promise {\n const syncEngineImpl = ensureWatchCallbacks(syncEngine);\n if (!syncEngineImpl._isPrimaryClient) {\n return;\n }\n\n for (const targetId of added) {\n // A target is already listening to remote store if it is already registered to\n // sharedClientState.\n const targetAlreadyListeningToRemoteStore =\n syncEngineImpl.queriesByTarget.has(targetId) &&\n syncEngineImpl.sharedClientState.isActiveQueryTarget(targetId);\n if (targetAlreadyListeningToRemoteStore) {\n logDebug(LOG_TAG, 'Adding an already active target ' + targetId);\n continue;\n }\n\n const target = await localStoreGetCachedTarget(\n syncEngineImpl.localStore,\n targetId\n );\n debugAssert(!!target, `Query data for active target ${targetId} not found`);\n const targetData = await localStoreAllocateTarget(\n syncEngineImpl.localStore,\n target\n );\n await initializeViewAndComputeSnapshot(\n syncEngineImpl,\n synthesizeTargetToQuery(target),\n targetData.targetId,\n /*current=*/ false,\n targetData.resumeToken\n );\n remoteStoreListen(syncEngineImpl.remoteStore, targetData);\n }\n\n for (const targetId of removed) {\n // Check that the target is still active since the target might have been\n // removed if it has been rejected by the backend.\n if (!syncEngineImpl.queriesByTarget.has(targetId)) {\n continue;\n }\n\n // Release queries that are still active.\n await localStoreReleaseTarget(\n syncEngineImpl.localStore,\n targetId,\n /* keepPersistedTargetData */ false\n )\n .then(() => {\n remoteStoreUnlisten(syncEngineImpl.remoteStore, targetId);\n removeAndCleanupTarget(syncEngineImpl, targetId);\n })\n .catch(ignoreIfPrimaryLeaseLoss);\n }\n}\n\nfunction ensureWatchCallbacks(syncEngine: SyncEngine): SyncEngineImpl {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.applyRemoteEvent =\n syncEngineApplyRemoteEvent.bind(null, syncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.getRemoteKeysForTarget =\n syncEngineGetRemoteKeysForTarget.bind(null, syncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.rejectListen =\n syncEngineRejectListen.bind(null, syncEngineImpl);\n syncEngineImpl.syncEngineListener.onWatchChange =\n eventManagerOnWatchChange.bind(null, syncEngineImpl.eventManager);\n syncEngineImpl.syncEngineListener.onWatchError =\n eventManagerOnWatchError.bind(null, syncEngineImpl.eventManager);\n return syncEngineImpl;\n}\n\nexport function syncEngineEnsureWriteCallbacks(\n syncEngine: SyncEngine\n): SyncEngineImpl {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.applySuccessfulWrite =\n syncEngineApplySuccessfulWrite.bind(null, syncEngineImpl);\n syncEngineImpl.remoteStore.remoteSyncer.rejectFailedWrite =\n syncEngineRejectFailedWrite.bind(null, syncEngineImpl);\n return syncEngineImpl;\n}\n\n/**\n * Loads a Firestore bundle into the SDK. The returned promise resolves when\n * the bundle finished loading.\n *\n * @param syncEngine - SyncEngine to use.\n * @param bundleReader - Bundle to load into the SDK.\n * @param task - LoadBundleTask used to update the loading progress to public API.\n */\nexport function syncEngineLoadBundle(\n syncEngine: SyncEngine,\n bundleReader: BundleReader,\n task: LoadBundleTask\n): void {\n const syncEngineImpl = debugCast(syncEngine, SyncEngineImpl);\n\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n loadBundleImpl(syncEngineImpl, bundleReader, task).then(collectionGroups => {\n syncEngineImpl.sharedClientState.notifyBundleLoaded(collectionGroups);\n });\n}\n\n/** Loads a bundle and returns the list of affected collection groups. */\nasync function loadBundleImpl(\n syncEngine: SyncEngineImpl,\n reader: BundleReader,\n task: LoadBundleTask\n): Promise> {\n try {\n const metadata = await reader.getMetadata();\n const skip = await localStoreHasNewerBundle(\n syncEngine.localStore,\n metadata\n );\n if (skip) {\n await reader.close();\n task._completeWith(bundleSuccessProgress(metadata));\n return Promise.resolve(new Set());\n }\n\n task._updateProgress(bundleInitialProgress(metadata));\n\n const loader = new BundleLoader(\n metadata,\n syncEngine.localStore,\n reader.serializer\n );\n let element = await reader.nextElement();\n while (element) {\n debugAssert(\n !element.payload.metadata,\n 'Unexpected BundleMetadata element.'\n );\n const progress = await loader.addSizedElement(element);\n if (progress) {\n task._updateProgress(progress);\n }\n\n element = await reader.nextElement();\n }\n\n const result = await loader.complete();\n await syncEngineEmitNewSnapsAndNotifyLocalStore(\n syncEngine,\n result.changedDocs,\n /* remoteEvent */ undefined\n );\n\n // Save metadata, so loading the same bundle will skip.\n await localStoreSaveBundle(syncEngine.localStore, metadata);\n task._completeWith(result.progress);\n return Promise.resolve(result.changedCollectionGroups);\n } catch (e) {\n logWarn(LOG_TAG, `Loading bundle failed with ${e}`);\n task._failWith(e as FirestoreError);\n return Promise.resolve(new Set());\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { User } from '../auth/user';\nimport {\n IndexBackfiller,\n IndexBackfillerScheduler\n} from '../local/index_backfiller';\nimport {\n indexedDbStoragePrefix,\n IndexedDbPersistence\n} from '../local/indexeddb_persistence';\nimport { LocalStore } from '../local/local_store';\nimport { newLocalStore } from '../local/local_store_impl';\nimport { LruParams } from '../local/lru_garbage_collector';\nimport { LruScheduler } from '../local/lru_garbage_collector_impl';\nimport {\n MemoryEagerDelegate,\n MemoryLruDelegate,\n MemoryPersistence\n} from '../local/memory_persistence';\nimport { Scheduler, Persistence } from '../local/persistence';\nimport { QueryEngine } from '../local/query_engine';\nimport {\n ClientId,\n MemorySharedClientState,\n SharedClientState,\n WebStorageSharedClientState\n} from '../local/shared_client_state';\nimport { newConnection, newConnectivityMonitor } from '../platform/connection';\nimport { getDocument, getWindow } from '../platform/dom';\nimport { newSerializer } from '../platform/serializer';\nimport { Datastore, newDatastore } from '../remote/datastore';\nimport {\n fillWritePipeline,\n newRemoteStore,\n RemoteStore,\n remoteStoreApplyPrimaryState,\n remoteStoreShutdown\n} from '../remote/remote_store';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { hardAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { DatabaseInfo } from './database_info';\nimport { EventManager, newEventManager } from './event_manager';\nimport { SyncEngine } from './sync_engine';\nimport {\n newSyncEngine,\n syncEngineApplyActiveTargetsChange,\n syncEngineApplyBatchState,\n syncEngineApplyOnlineStateChange,\n syncEngineApplyPrimaryState,\n syncEngineApplyTargetState,\n syncEngineEnsureWriteCallbacks,\n syncEngineGetActiveClients,\n syncEngineHandleCredentialChange,\n syncEngineSynchronizeWithChangedDocuments\n} from './sync_engine_impl';\nimport { OnlineStateSource } from './types';\n\ntype Kind = 'memory' | 'persistent';\n\nexport interface ComponentConfiguration {\n asyncQueue: AsyncQueue;\n databaseInfo: DatabaseInfo;\n authCredentials: CredentialsProvider;\n appCheckCredentials: CredentialsProvider;\n clientId: ClientId;\n initialUser: User;\n maxConcurrentLimboResolutions: number;\n}\n\nexport interface OfflineComponentProviderFactory {\n build(onlineComponents: OnlineComponentProvider): OfflineComponentProvider;\n}\n\n/**\n * Initializes and wires components that are needed to interface with the local\n * cache. Implementations override `initialize()` to provide all components.\n */\nexport interface OfflineComponentProvider {\n readonly kind: Kind;\n persistence: Persistence;\n sharedClientState: SharedClientState;\n localStore: LocalStore;\n gcScheduler: Scheduler | null;\n indexBackfillerScheduler: Scheduler | null;\n synchronizeTabs: boolean;\n\n initialize(cfg: ComponentConfiguration): Promise;\n\n terminate(): Promise;\n}\n\n/**\n * Provides all components needed for Firestore with in-memory persistence.\n * Uses EagerGC garbage collection.\n */\nexport class MemoryOfflineComponentProvider\n implements OfflineComponentProvider\n{\n kind: Kind = 'memory';\n\n static readonly provider: OfflineComponentProviderFactory = {\n build: () => new MemoryOfflineComponentProvider()\n };\n\n persistence!: Persistence;\n sharedClientState!: SharedClientState;\n localStore!: LocalStore;\n gcScheduler!: Scheduler | null;\n indexBackfillerScheduler!: Scheduler | null;\n synchronizeTabs = false;\n\n serializer!: JsonProtoSerializer;\n\n async initialize(cfg: ComponentConfiguration): Promise {\n this.serializer = newSerializer(cfg.databaseInfo.databaseId);\n this.sharedClientState = this.createSharedClientState(cfg);\n this.persistence = this.createPersistence(cfg);\n await this.persistence.start();\n this.localStore = this.createLocalStore(cfg);\n this.gcScheduler = this.createGarbageCollectionScheduler(\n cfg,\n this.localStore\n );\n this.indexBackfillerScheduler = this.createIndexBackfillerScheduler(\n cfg,\n this.localStore\n );\n }\n\n createGarbageCollectionScheduler(\n cfg: ComponentConfiguration,\n localStore: LocalStore\n ): Scheduler | null {\n return null;\n }\n\n createIndexBackfillerScheduler(\n cfg: ComponentConfiguration,\n localStore: LocalStore\n ): Scheduler | null {\n return null;\n }\n\n createLocalStore(cfg: ComponentConfiguration): LocalStore {\n return newLocalStore(\n this.persistence,\n new QueryEngine(),\n cfg.initialUser,\n this.serializer\n );\n }\n\n createPersistence(cfg: ComponentConfiguration): Persistence {\n return new MemoryPersistence(MemoryEagerDelegate.factory, this.serializer);\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n return new MemorySharedClientState();\n }\n\n async terminate(): Promise {\n this.gcScheduler?.stop();\n this.indexBackfillerScheduler?.stop();\n this.sharedClientState.shutdown();\n await this.persistence.shutdown();\n }\n}\n\nexport class LruGcMemoryOfflineComponentProvider extends MemoryOfflineComponentProvider {\n constructor(protected readonly cacheSizeBytes: number | undefined) {\n super();\n }\n\n createGarbageCollectionScheduler(\n cfg: ComponentConfiguration,\n localStore: LocalStore\n ): Scheduler | null {\n hardAssert(\n this.persistence.referenceDelegate instanceof MemoryLruDelegate,\n 'referenceDelegate is expected to be an instance of MemoryLruDelegate.'\n );\n\n const garbageCollector =\n this.persistence.referenceDelegate.garbageCollector;\n return new LruScheduler(garbageCollector, cfg.asyncQueue, localStore);\n }\n\n createPersistence(cfg: ComponentConfiguration): Persistence {\n const lruParams =\n this.cacheSizeBytes !== undefined\n ? LruParams.withCacheSize(this.cacheSizeBytes)\n : LruParams.DEFAULT;\n return new MemoryPersistence(\n p => MemoryLruDelegate.factory(p, lruParams),\n this.serializer\n );\n }\n}\n\n/**\n * Provides all components needed for Firestore with IndexedDB persistence.\n */\nexport class IndexedDbOfflineComponentProvider extends MemoryOfflineComponentProvider {\n kind: Kind = 'persistent';\n persistence!: IndexedDbPersistence;\n sharedClientState!: SharedClientState;\n localStore!: LocalStore;\n gcScheduler!: Scheduler | null;\n indexBackfillerScheduler!: Scheduler | null;\n synchronizeTabs = false;\n\n constructor(\n protected readonly onlineComponentProvider: OnlineComponentProvider,\n protected readonly cacheSizeBytes: number | undefined,\n protected readonly forceOwnership: boolean | undefined\n ) {\n super();\n }\n\n async initialize(cfg: ComponentConfiguration): Promise {\n await super.initialize(cfg);\n\n await this.onlineComponentProvider.initialize(this, cfg);\n\n // Enqueue writes from a previous session\n await syncEngineEnsureWriteCallbacks(\n this.onlineComponentProvider.syncEngine\n );\n await fillWritePipeline(this.onlineComponentProvider.remoteStore);\n\n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.setPrimaryStateListener(() => {\n if (this.gcScheduler && !this.gcScheduler.started) {\n this.gcScheduler.start();\n }\n if (\n this.indexBackfillerScheduler &&\n !this.indexBackfillerScheduler.started\n ) {\n this.indexBackfillerScheduler.start();\n }\n return Promise.resolve();\n });\n }\n\n createLocalStore(cfg: ComponentConfiguration): LocalStore {\n return newLocalStore(\n this.persistence,\n new QueryEngine(),\n cfg.initialUser,\n this.serializer\n );\n }\n\n createGarbageCollectionScheduler(\n cfg: ComponentConfiguration,\n localStore: LocalStore\n ): Scheduler | null {\n const garbageCollector =\n this.persistence.referenceDelegate.garbageCollector;\n return new LruScheduler(garbageCollector, cfg.asyncQueue, localStore);\n }\n\n createIndexBackfillerScheduler(\n cfg: ComponentConfiguration,\n localStore: LocalStore\n ): Scheduler | null {\n const indexBackfiller = new IndexBackfiller(localStore, this.persistence);\n return new IndexBackfillerScheduler(cfg.asyncQueue, indexBackfiller);\n }\n\n createPersistence(cfg: ComponentConfiguration): IndexedDbPersistence {\n const persistenceKey = indexedDbStoragePrefix(\n cfg.databaseInfo.databaseId,\n cfg.databaseInfo.persistenceKey\n );\n const lruParams =\n this.cacheSizeBytes !== undefined\n ? LruParams.withCacheSize(this.cacheSizeBytes)\n : LruParams.DEFAULT;\n\n return new IndexedDbPersistence(\n this.synchronizeTabs,\n persistenceKey,\n cfg.clientId,\n lruParams,\n cfg.asyncQueue,\n getWindow(),\n getDocument(),\n this.serializer,\n this.sharedClientState,\n !!this.forceOwnership\n );\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n return new MemorySharedClientState();\n }\n}\n\n/**\n * Provides all components needed for Firestore with multi-tab IndexedDB\n * persistence.\n *\n * In the legacy client, this provider is used to provide both multi-tab and\n * non-multi-tab persistence since we cannot tell at build time whether\n * `synchronizeTabs` will be enabled.\n */\nexport class MultiTabOfflineComponentProvider extends IndexedDbOfflineComponentProvider {\n synchronizeTabs = true;\n\n constructor(\n protected readonly onlineComponentProvider: OnlineComponentProvider,\n protected readonly cacheSizeBytes: number | undefined\n ) {\n super(onlineComponentProvider, cacheSizeBytes, /* forceOwnership= */ false);\n }\n\n async initialize(cfg: ComponentConfiguration): Promise {\n await super.initialize(cfg);\n\n const syncEngine = this.onlineComponentProvider.syncEngine;\n\n if (this.sharedClientState instanceof WebStorageSharedClientState) {\n this.sharedClientState.syncEngine = {\n applyBatchState: syncEngineApplyBatchState.bind(null, syncEngine),\n applyTargetState: syncEngineApplyTargetState.bind(null, syncEngine),\n applyActiveTargetsChange: syncEngineApplyActiveTargetsChange.bind(\n null,\n syncEngine\n ),\n getActiveClients: syncEngineGetActiveClients.bind(null, syncEngine),\n synchronizeWithChangedDocuments:\n syncEngineSynchronizeWithChangedDocuments.bind(null, syncEngine)\n };\n await this.sharedClientState.start();\n }\n\n // NOTE: This will immediately call the listener, so we make sure to\n // set it after localStore / remoteStore are started.\n await this.persistence.setPrimaryStateListener(async isPrimary => {\n await syncEngineApplyPrimaryState(\n this.onlineComponentProvider.syncEngine,\n isPrimary\n );\n if (this.gcScheduler) {\n if (isPrimary && !this.gcScheduler.started) {\n this.gcScheduler.start();\n } else if (!isPrimary) {\n this.gcScheduler.stop();\n }\n }\n if (this.indexBackfillerScheduler) {\n if (isPrimary && !this.indexBackfillerScheduler.started) {\n this.indexBackfillerScheduler.start();\n } else if (!isPrimary) {\n this.indexBackfillerScheduler.stop();\n }\n }\n });\n }\n\n createSharedClientState(cfg: ComponentConfiguration): SharedClientState {\n const window = getWindow();\n if (!WebStorageSharedClientState.isAvailable(window)) {\n throw new FirestoreError(\n Code.UNIMPLEMENTED,\n 'IndexedDB persistence is only available on platforms that support LocalStorage.'\n );\n }\n const persistenceKey = indexedDbStoragePrefix(\n cfg.databaseInfo.databaseId,\n cfg.databaseInfo.persistenceKey\n );\n return new WebStorageSharedClientState(\n window,\n cfg.asyncQueue,\n persistenceKey,\n cfg.clientId,\n cfg.initialUser\n );\n }\n}\n\nexport interface OnlineComponentProviderFactory {\n build(): OnlineComponentProvider;\n}\n\n/**\n * Initializes and wires the components that are needed to interface with the\n * network.\n */\nexport class OnlineComponentProvider {\n static readonly provider: OnlineComponentProviderFactory = {\n build: () => new OnlineComponentProvider()\n };\n\n protected localStore!: LocalStore;\n protected sharedClientState!: SharedClientState;\n datastore!: Datastore;\n eventManager!: EventManager;\n remoteStore!: RemoteStore;\n syncEngine!: SyncEngine;\n\n async initialize(\n offlineComponentProvider: OfflineComponentProvider,\n cfg: ComponentConfiguration\n ): Promise {\n if (this.localStore) {\n // OnlineComponentProvider may get initialized multiple times if\n // multi-tab persistence is used.\n return;\n }\n\n this.localStore = offlineComponentProvider.localStore;\n this.sharedClientState = offlineComponentProvider.sharedClientState;\n this.datastore = this.createDatastore(cfg);\n this.remoteStore = this.createRemoteStore(cfg);\n this.eventManager = this.createEventManager(cfg);\n this.syncEngine = this.createSyncEngine(\n cfg,\n /* startAsPrimary=*/ !offlineComponentProvider.synchronizeTabs\n );\n\n this.sharedClientState.onlineStateHandler = onlineState =>\n syncEngineApplyOnlineStateChange(\n this.syncEngine,\n onlineState,\n OnlineStateSource.SharedClientState\n );\n\n this.remoteStore.remoteSyncer.handleCredentialChange =\n syncEngineHandleCredentialChange.bind(null, this.syncEngine);\n\n await remoteStoreApplyPrimaryState(\n this.remoteStore,\n this.syncEngine.isPrimaryClient\n );\n }\n\n createEventManager(cfg: ComponentConfiguration): EventManager {\n return newEventManager();\n }\n\n createDatastore(cfg: ComponentConfiguration): Datastore {\n const serializer = newSerializer(cfg.databaseInfo.databaseId);\n const connection = newConnection(cfg.databaseInfo);\n return newDatastore(\n cfg.authCredentials,\n cfg.appCheckCredentials,\n connection,\n serializer\n );\n }\n\n createRemoteStore(cfg: ComponentConfiguration): RemoteStore {\n return newRemoteStore(\n this.localStore,\n this.datastore,\n cfg.asyncQueue,\n onlineState =>\n syncEngineApplyOnlineStateChange(\n this.syncEngine,\n onlineState,\n OnlineStateSource.RemoteStore\n ),\n newConnectivityMonitor()\n );\n }\n\n createSyncEngine(\n cfg: ComponentConfiguration,\n startAsPrimary: boolean\n ): SyncEngine {\n return newSyncEngine(\n this.localStore,\n this.remoteStore,\n this.eventManager,\n this.sharedClientState,\n cfg.initialUser,\n cfg.maxConcurrentLimboResolutions,\n startAsPrimary\n );\n }\n\n async terminate(): Promise {\n await remoteStoreShutdown(this.remoteStore);\n this.datastore?.terminate();\n this.eventManager?.terminate();\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DatabaseInfo } from '../../core/database_info';\nimport { Connection } from '../../remote/connection';\nimport { ConnectivityMonitor } from '../../remote/connectivity_monitor';\nimport { NoopConnectivityMonitor } from '../../remote/connectivity_monitor_noop';\n\nimport { BrowserConnectivityMonitor } from './connectivity_monitor';\nimport { WebChannelConnection } from './webchannel_connection';\n\n/** Initializes the WebChannelConnection for the browser. */\nexport function newConnection(databaseInfo: DatabaseInfo): Connection {\n return new WebChannelConnection(databaseInfo);\n}\n\n/** Return the Platform-specific connectivity monitor. */\nexport function newConnectivityMonitor(): ConnectivityMonitor {\n if (BrowserConnectivityMonitor.isAvailable()) {\n return new BrowserConnectivityMonitor();\n } else {\n return new NoopConnectivityMonitor();\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Observer } from '../core/event_manager';\n\nimport { FirestoreError } from './error';\nimport { logError } from './log';\nimport { EventHandler } from './misc';\n\n/*\n * A wrapper implementation of Observer that will dispatch events\n * asynchronously. To allow immediate silencing, a mute call is added which\n * causes events scheduled to no longer be raised.\n */\nexport class AsyncObserver implements Observer {\n /**\n * When set to true, will not raise future events. Necessary to deal with\n * async detachment of listener.\n */\n private muted = false;\n\n constructor(private observer: Partial>) {}\n\n next(value: T): void {\n if (this.muted) {\n return;\n }\n if (this.observer.next) {\n this.scheduleEvent(this.observer.next, value);\n }\n }\n\n error(error: FirestoreError): void {\n if (this.muted) {\n return;\n }\n if (this.observer.error) {\n this.scheduleEvent(this.observer.error, error);\n } else {\n logError('Uncaught Error in snapshot listener:', error.toString());\n }\n }\n\n mute(): void {\n this.muted = true;\n }\n\n private scheduleEvent(eventHandler: EventHandler, event: E): void {\n setTimeout(() => {\n if (!this.muted) {\n eventHandler(event);\n }\n }, 0);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ParsedSetData, ParsedUpdateData } from '../lite-api/user_data_reader';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport {\n DeleteMutation,\n Mutation,\n Precondition,\n VerifyMutation\n} from '../model/mutation';\nimport {\n Datastore,\n invokeBatchGetDocumentsRpc,\n invokeCommitRpc\n} from '../remote/datastore';\nimport { fail, debugAssert } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { SnapshotVersion } from './snapshot_version';\n\n/**\n * Internal transaction object responsible for accumulating the mutations to\n * perform and the base versions for any documents read.\n */\nexport class Transaction {\n // The version of each document that was read during this transaction.\n private readVersions = new Map();\n private mutations: Mutation[] = [];\n private committed = false;\n\n /**\n * A deferred usage error that occurred previously in this transaction that\n * will cause the transaction to fail once it actually commits.\n */\n private lastTransactionError: FirestoreError | null = null;\n\n /**\n * Set of documents that have been written in the transaction.\n *\n * When there's more than one write to the same key in a transaction, any\n * writes after the first are handled differently.\n */\n private writtenDocs: Set = new Set();\n\n constructor(private datastore: Datastore) {}\n\n async lookup(keys: DocumentKey[]): Promise {\n this.ensureCommitNotCalled();\n\n if (this.mutations.length > 0) {\n this.lastTransactionError = new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Firestore transactions require all reads to be executed before all writes.'\n );\n throw this.lastTransactionError;\n }\n const docs = await invokeBatchGetDocumentsRpc(this.datastore, keys);\n docs.forEach(doc => this.recordVersion(doc));\n return docs;\n }\n\n set(key: DocumentKey, data: ParsedSetData): void {\n this.write(data.toMutation(key, this.precondition(key)));\n this.writtenDocs.add(key.toString());\n }\n\n update(key: DocumentKey, data: ParsedUpdateData): void {\n try {\n this.write(data.toMutation(key, this.preconditionForUpdate(key)));\n } catch (e) {\n this.lastTransactionError = e as FirestoreError | null;\n }\n this.writtenDocs.add(key.toString());\n }\n\n delete(key: DocumentKey): void {\n this.write(new DeleteMutation(key, this.precondition(key)));\n this.writtenDocs.add(key.toString());\n }\n\n async commit(): Promise {\n this.ensureCommitNotCalled();\n\n if (this.lastTransactionError) {\n throw this.lastTransactionError;\n }\n const unwritten = this.readVersions;\n // For each mutation, note that the doc was written.\n this.mutations.forEach(mutation => {\n unwritten.delete(mutation.key.toString());\n });\n // For each document that was read but not written to, we want to perform\n // a `verify` operation.\n unwritten.forEach((_, path) => {\n const key = DocumentKey.fromPath(path);\n this.mutations.push(new VerifyMutation(key, this.precondition(key)));\n });\n await invokeCommitRpc(this.datastore, this.mutations);\n this.committed = true;\n }\n\n private recordVersion(doc: Document): void {\n let docVersion: SnapshotVersion;\n\n if (doc.isFoundDocument()) {\n docVersion = doc.version;\n } else if (doc.isNoDocument()) {\n // Represent a deleted doc using SnapshotVersion.min().\n docVersion = SnapshotVersion.min();\n } else {\n throw fail('Document in a transaction was a ' + doc.constructor.name);\n }\n\n const existingVersion = this.readVersions.get(doc.key.toString());\n if (existingVersion) {\n if (!docVersion.isEqual(existingVersion)) {\n // This transaction will fail no matter what.\n throw new FirestoreError(\n Code.ABORTED,\n 'Document version changed between two reads.'\n );\n }\n } else {\n this.readVersions.set(doc.key.toString(), docVersion);\n }\n }\n\n /**\n * Returns the version of this document when it was read in this transaction,\n * as a precondition, or no precondition if it was not read.\n */\n private precondition(key: DocumentKey): Precondition {\n const version = this.readVersions.get(key.toString());\n if (!this.writtenDocs.has(key.toString()) && version) {\n if (version.isEqual(SnapshotVersion.min())) {\n return Precondition.exists(false);\n } else {\n return Precondition.updateTime(version);\n }\n } else {\n return Precondition.none();\n }\n }\n\n /**\n * Returns the precondition for a document if the operation is an update.\n */\n private preconditionForUpdate(key: DocumentKey): Precondition {\n const version = this.readVersions.get(key.toString());\n // The first time a document is written, we want to take into account the\n // read time and existence\n if (!this.writtenDocs.has(key.toString()) && version) {\n if (version.isEqual(SnapshotVersion.min())) {\n // The document doesn't exist, so fail the transaction.\n\n // This has to be validated locally because you can't send a\n // precondition that a document does not exist without changing the\n // semantics of the backend write to be an insert. This is the reverse\n // of what we want, since we want to assert that the document doesn't\n // exist but then send the update and have it fail. Since we can't\n // express that to the backend, we have to validate locally.\n\n // Note: this can change once we can send separate verify writes in the\n // transaction.\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"Can't update a document that doesn't exist.\"\n );\n }\n // Document exists, base precondition on document update time.\n return Precondition.updateTime(version);\n } else {\n // Document was not read, so we just use the preconditions for a blind\n // update.\n return Precondition.exists(true);\n }\n }\n\n private write(mutation: Mutation): void {\n this.ensureCommitNotCalled();\n this.mutations.push(mutation);\n }\n\n private ensureCommitNotCalled(): void {\n debugAssert(\n !this.committed,\n 'A transaction object cannot be used after its update callback has been invoked.'\n );\n }\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ExponentialBackoff } from '../remote/backoff';\nimport { Datastore } from '../remote/datastore';\nimport { isPermanentError } from '../remote/rpc_error';\nimport { AsyncQueue, TimerId } from '../util/async_queue';\nimport { FirestoreError } from '../util/error';\nimport { Deferred } from '../util/promise';\nimport { isNullOrUndefined } from '../util/types';\n\nimport { Transaction } from './transaction';\nimport { TransactionOptions } from './transaction_options';\n\n/**\n * TransactionRunner encapsulates the logic needed to run and retry transactions\n * with backoff.\n */\nexport class TransactionRunner {\n private attemptsRemaining: number;\n private backoff: ExponentialBackoff;\n\n constructor(\n private readonly asyncQueue: AsyncQueue,\n private readonly datastore: Datastore,\n private readonly options: TransactionOptions,\n private readonly updateFunction: (transaction: Transaction) => Promise,\n private readonly deferred: Deferred\n ) {\n this.attemptsRemaining = options.maxAttempts;\n this.backoff = new ExponentialBackoff(\n this.asyncQueue,\n TimerId.TransactionRetry\n );\n }\n\n /** Runs the transaction and sets the result on deferred. */\n run(): void {\n this.attemptsRemaining -= 1;\n this.runWithBackOff();\n }\n\n private runWithBackOff(): void {\n this.backoff.backoffAndRun(async () => {\n const transaction = new Transaction(this.datastore);\n const userPromise = this.tryRunUpdateFunction(transaction);\n if (userPromise) {\n userPromise\n .then(result => {\n this.asyncQueue.enqueueAndForget(() => {\n return transaction\n .commit()\n .then(() => {\n this.deferred.resolve(result);\n })\n .catch(commitError => {\n this.handleTransactionError(commitError);\n });\n });\n })\n .catch(userPromiseError => {\n this.handleTransactionError(userPromiseError);\n });\n }\n });\n }\n\n private tryRunUpdateFunction(transaction: Transaction): Promise | null {\n try {\n const userPromise = this.updateFunction(transaction);\n if (\n isNullOrUndefined(userPromise) ||\n !userPromise.catch ||\n !userPromise.then\n ) {\n this.deferred.reject(\n Error('Transaction callback must return a Promise')\n );\n return null;\n }\n return userPromise;\n } catch (error) {\n // Do not retry errors thrown by user provided updateFunction.\n this.deferred.reject(error as Error);\n return null;\n }\n }\n\n private handleTransactionError(error: Error): void {\n if (this.attemptsRemaining > 0 && this.isRetryableTransactionError(error)) {\n this.attemptsRemaining -= 1;\n this.asyncQueue.enqueueAndForget(() => {\n this.runWithBackOff();\n return Promise.resolve();\n });\n } else {\n this.deferred.reject(error);\n }\n }\n\n private isRetryableTransactionError(error: Error): boolean {\n if (error.name === 'FirebaseError') {\n // In transactions, the backend will fail outdated reads with FAILED_PRECONDITION and\n // non-matching document versions with ABORTED. These errors should be retried.\n const code = (error as FirestoreError).code;\n return (\n code === 'aborted' ||\n code === 'failed-precondition' ||\n code === 'already-exists' ||\n !isPermanentError(code)\n );\n }\n return false;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { GetOptions } from '@firebase/firestore-types';\n\nimport { LoadBundleTask } from '../api/bundle';\nimport {\n CredentialChangeListener,\n CredentialsProvider\n} from '../api/credentials';\nimport { User } from '../auth/user';\nimport { LocalStore } from '../local/local_store';\nimport {\n localStoreConfigureFieldIndexes,\n localStoreDeleteAllFieldIndexes,\n localStoreExecuteQuery,\n localStoreGetNamedQuery,\n localStoreHandleUserChange,\n localStoreReadDocument,\n localStoreSetIndexAutoCreationEnabled\n} from '../local/local_store_impl';\nimport { Persistence } from '../local/persistence';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldIndex } from '../model/field_index';\nimport { Mutation } from '../model/mutation';\nimport { toByteStreamReader } from '../platform/byte_stream_reader';\nimport { newSerializer } from '../platform/serializer';\nimport { newTextEncoder } from '../platform/text_serializer';\nimport { ApiClientObjectMap, Value } from '../protos/firestore_proto_api';\nimport { Datastore, invokeRunAggregationQueryRpc } from '../remote/datastore';\nimport {\n RemoteStore,\n remoteStoreDisableNetwork,\n remoteStoreEnableNetwork,\n remoteStoreHandleCredentialChange\n} from '../remote/remote_store';\nimport { JsonProtoSerializer } from '../remote/serializer';\nimport { debugAssert } from '../util/assert';\nimport { AsyncObserver } from '../util/async_observer';\nimport { AsyncQueue, wrapInUserErrorIfRecoverable } from '../util/async_queue';\nimport { BundleReader } from '../util/bundle_reader';\nimport { newBundleReader } from '../util/bundle_reader_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug, logWarn } from '../util/log';\nimport { AutoId } from '../util/misc';\nimport { Deferred } from '../util/promise';\n\nimport { Aggregate } from './aggregate';\nimport { NamedQuery } from './bundle';\nimport {\n ComponentConfiguration,\n LruGcMemoryOfflineComponentProvider,\n MemoryOfflineComponentProvider,\n OfflineComponentProvider,\n OnlineComponentProvider\n} from './component_provider';\nimport { DatabaseId, DatabaseInfo } from './database_info';\nimport {\n addSnapshotsInSyncListener,\n EventManager,\n eventManagerListen,\n eventManagerUnlisten,\n ListenOptions,\n Observer,\n QueryListener,\n removeSnapshotsInSyncListener\n} from './event_manager';\nimport { newQueryForPath, Query } from './query';\nimport { SyncEngine } from './sync_engine';\nimport {\n syncEngineListen,\n syncEngineLoadBundle,\n syncEngineRegisterPendingWritesCallback,\n syncEngineUnlisten,\n syncEngineWrite,\n triggerRemoteStoreListen,\n triggerRemoteStoreUnlisten\n} from './sync_engine_impl';\nimport { Transaction } from './transaction';\nimport { TransactionOptions } from './transaction_options';\nimport { TransactionRunner } from './transaction_runner';\nimport { View } from './view';\nimport { ViewSnapshot } from './view_snapshot';\n\nconst LOG_TAG = 'FirestoreClient';\nexport const MAX_CONCURRENT_LIMBO_RESOLUTIONS = 100;\n\n/** DOMException error code constants. */\nconst DOM_EXCEPTION_INVALID_STATE = 11;\nconst DOM_EXCEPTION_ABORTED = 20;\nconst DOM_EXCEPTION_QUOTA_EXCEEDED = 22;\n\n/**\n * FirestoreClient is a top-level class that constructs and owns all of the //\n * pieces of the client SDK architecture. It is responsible for creating the //\n * async queue that is shared by all of the other components in the system. //\n */\nexport class FirestoreClient {\n private user = User.UNAUTHENTICATED;\n private readonly clientId = AutoId.newId();\n private authCredentialListener: CredentialChangeListener = () =>\n Promise.resolve();\n private appCheckCredentialListener: (\n appCheckToken: string,\n user: User\n ) => Promise = () => Promise.resolve();\n _uninitializedComponentsProvider?: {\n _offline: OfflineComponentProvider;\n _online: OnlineComponentProvider;\n };\n\n _offlineComponents?: OfflineComponentProvider;\n _onlineComponents?: OnlineComponentProvider;\n\n constructor(\n private authCredentials: CredentialsProvider,\n private appCheckCredentials: CredentialsProvider,\n /**\n * Asynchronous queue responsible for all of our internal processing. When\n * we get incoming work from the user (via public API) or the network\n * (incoming GRPC messages), we should always schedule onto this queue.\n * This ensures all of our work is properly serialized (e.g. we don't\n * start processing a new operation while the previous one is waiting for\n * an async I/O to complete).\n */\n public asyncQueue: AsyncQueue,\n private databaseInfo: DatabaseInfo,\n componentProvider?: {\n _offline: OfflineComponentProvider;\n _online: OnlineComponentProvider;\n }\n ) {\n this._uninitializedComponentsProvider = componentProvider;\n this.authCredentials.start(asyncQueue, async user => {\n logDebug(LOG_TAG, 'Received user=', user.uid);\n await this.authCredentialListener(user);\n this.user = user;\n });\n this.appCheckCredentials.start(asyncQueue, newAppCheckToken => {\n logDebug(LOG_TAG, 'Received new app check token=', newAppCheckToken);\n return this.appCheckCredentialListener(newAppCheckToken, this.user);\n });\n }\n\n get configuration(): ComponentConfiguration {\n return {\n asyncQueue: this.asyncQueue,\n databaseInfo: this.databaseInfo,\n clientId: this.clientId,\n authCredentials: this.authCredentials,\n appCheckCredentials: this.appCheckCredentials,\n initialUser: this.user,\n maxConcurrentLimboResolutions: MAX_CONCURRENT_LIMBO_RESOLUTIONS\n };\n }\n\n setCredentialChangeListener(listener: (user: User) => Promise): void {\n this.authCredentialListener = listener;\n }\n\n setAppCheckTokenChangeListener(\n listener: (appCheckToken: string, user: User) => Promise\n ): void {\n this.appCheckCredentialListener = listener;\n }\n\n terminate(): Promise {\n this.asyncQueue.enterRestrictedMode();\n const deferred = new Deferred();\n this.asyncQueue.enqueueAndForgetEvenWhileRestricted(async () => {\n try {\n if (this._onlineComponents) {\n await this._onlineComponents.terminate();\n }\n if (this._offlineComponents) {\n await this._offlineComponents.terminate();\n }\n\n // The credentials provider must be terminated after shutting down the\n // RemoteStore as it will prevent the RemoteStore from retrieving auth\n // tokens.\n this.authCredentials.shutdown();\n this.appCheckCredentials.shutdown();\n deferred.resolve();\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e as Error,\n `Failed to shutdown persistence`\n );\n deferred.reject(firestoreError);\n }\n });\n return deferred.promise;\n }\n}\n\nexport async function setOfflineComponentProvider(\n client: FirestoreClient,\n offlineComponentProvider: OfflineComponentProvider\n): Promise {\n client.asyncQueue.verifyOperationInProgress();\n\n logDebug(LOG_TAG, 'Initializing OfflineComponentProvider');\n const configuration = client.configuration;\n await offlineComponentProvider.initialize(configuration);\n\n let currentUser = configuration.initialUser;\n client.setCredentialChangeListener(async user => {\n if (!currentUser.isEqual(user)) {\n await localStoreHandleUserChange(\n offlineComponentProvider.localStore,\n user\n );\n currentUser = user;\n }\n });\n\n // When a user calls clearPersistence() in one client, all other clients\n // need to be terminated to allow the delete to succeed.\n offlineComponentProvider.persistence.setDatabaseDeletedListener(() =>\n client.terminate()\n );\n\n client._offlineComponents = offlineComponentProvider;\n}\n\nexport async function setOnlineComponentProvider(\n client: FirestoreClient,\n onlineComponentProvider: OnlineComponentProvider\n): Promise {\n client.asyncQueue.verifyOperationInProgress();\n\n const offlineComponents = await ensureOfflineComponents(client);\n\n logDebug(LOG_TAG, 'Initializing OnlineComponentProvider');\n await onlineComponentProvider.initialize(\n offlineComponents,\n client.configuration\n );\n // The CredentialChangeListener of the online component provider takes\n // precedence over the offline component provider.\n client.setCredentialChangeListener(user =>\n remoteStoreHandleCredentialChange(onlineComponentProvider.remoteStore, user)\n );\n client.setAppCheckTokenChangeListener((_, user) =>\n remoteStoreHandleCredentialChange(onlineComponentProvider.remoteStore, user)\n );\n client._onlineComponents = onlineComponentProvider;\n}\n\n/**\n * Decides whether the provided error allows us to gracefully disable\n * persistence (as opposed to crashing the client).\n */\nexport function canFallbackFromIndexedDbError(\n error: FirestoreError | DOMException\n): boolean {\n if (error.name === 'FirebaseError') {\n return (\n error.code === Code.FAILED_PRECONDITION ||\n error.code === Code.UNIMPLEMENTED\n );\n } else if (\n typeof DOMException !== 'undefined' &&\n error instanceof DOMException\n ) {\n // There are a few known circumstances where we can open IndexedDb but\n // trying to read/write will fail (e.g. quota exceeded). For\n // well-understood cases, we attempt to detect these and then gracefully\n // fall back to memory persistence.\n // NOTE: Rather than continue to add to this list, we could decide to\n // always fall back, with the risk that we might accidentally hide errors\n // representing actual SDK bugs.\n return (\n // When the browser is out of quota we could get either quota exceeded\n // or an aborted error depending on whether the error happened during\n // schema migration.\n error.code === DOM_EXCEPTION_QUOTA_EXCEEDED ||\n error.code === DOM_EXCEPTION_ABORTED ||\n // Firefox Private Browsing mode disables IndexedDb and returns\n // INVALID_STATE for any usage.\n error.code === DOM_EXCEPTION_INVALID_STATE\n );\n }\n\n return true;\n}\n\nasync function ensureOfflineComponents(\n client: FirestoreClient\n): Promise {\n if (!client._offlineComponents) {\n if (client._uninitializedComponentsProvider) {\n logDebug(LOG_TAG, 'Using user provided OfflineComponentProvider');\n try {\n await setOfflineComponentProvider(\n client,\n client._uninitializedComponentsProvider._offline\n );\n } catch (e) {\n const error = e as FirestoreError | DOMException;\n if (!canFallbackFromIndexedDbError(error)) {\n throw error;\n }\n logWarn(\n 'Error using user provided cache. Falling back to ' +\n 'memory cache: ' +\n error\n );\n await setOfflineComponentProvider(\n client,\n new MemoryOfflineComponentProvider()\n );\n }\n } else {\n logDebug(LOG_TAG, 'Using default OfflineComponentProvider');\n await setOfflineComponentProvider(\n client,\n new LruGcMemoryOfflineComponentProvider(undefined)\n );\n }\n }\n\n return client._offlineComponents!;\n}\n\nasync function ensureOnlineComponents(\n client: FirestoreClient\n): Promise {\n if (!client._onlineComponents) {\n if (client._uninitializedComponentsProvider) {\n logDebug(LOG_TAG, 'Using user provided OnlineComponentProvider');\n await setOnlineComponentProvider(\n client,\n client._uninitializedComponentsProvider._online\n );\n } else {\n logDebug(LOG_TAG, 'Using default OnlineComponentProvider');\n await setOnlineComponentProvider(client, new OnlineComponentProvider());\n }\n }\n\n return client._onlineComponents!;\n}\n\nfunction getPersistence(client: FirestoreClient): Promise {\n return ensureOfflineComponents(client).then(c => c.persistence);\n}\n\nexport function getLocalStore(client: FirestoreClient): Promise {\n return ensureOfflineComponents(client).then(c => c.localStore);\n}\n\nfunction getRemoteStore(client: FirestoreClient): Promise {\n return ensureOnlineComponents(client).then(c => c.remoteStore);\n}\n\nexport function getSyncEngine(client: FirestoreClient): Promise {\n return ensureOnlineComponents(client).then(c => c.syncEngine);\n}\n\nfunction getDatastore(client: FirestoreClient): Promise {\n return ensureOnlineComponents(client).then(c => c.datastore);\n}\n\nexport async function getEventManager(\n client: FirestoreClient\n): Promise {\n const onlineComponentProvider = await ensureOnlineComponents(client);\n const eventManager = onlineComponentProvider.eventManager;\n eventManager.onListen = syncEngineListen.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n eventManager.onUnlisten = syncEngineUnlisten.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n eventManager.onFirstRemoteStoreListen = triggerRemoteStoreListen.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n eventManager.onLastRemoteStoreUnlisten = triggerRemoteStoreUnlisten.bind(\n null,\n onlineComponentProvider.syncEngine\n );\n return eventManager;\n}\n\n/** Enables the network connection and re-enqueues all pending operations. */\nexport function firestoreClientEnableNetwork(\n client: FirestoreClient\n): Promise {\n return client.asyncQueue.enqueue(async () => {\n const persistence = await getPersistence(client);\n const remoteStore = await getRemoteStore(client);\n persistence.setNetworkEnabled(true);\n return remoteStoreEnableNetwork(remoteStore);\n });\n}\n\n/** Disables the network connection. Pending operations will not complete. */\nexport function firestoreClientDisableNetwork(\n client: FirestoreClient\n): Promise {\n return client.asyncQueue.enqueue(async () => {\n const persistence = await getPersistence(client);\n const remoteStore = await getRemoteStore(client);\n persistence.setNetworkEnabled(false);\n return remoteStoreDisableNetwork(remoteStore);\n });\n}\n\n/**\n * Returns a Promise that resolves when all writes that were pending at the time\n * this method was called received server acknowledgement. An acknowledgement\n * can be either acceptance or rejection.\n */\nexport function firestoreClientWaitForPendingWrites(\n client: FirestoreClient\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const syncEngine = await getSyncEngine(client);\n return syncEngineRegisterPendingWritesCallback(syncEngine, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientListen(\n client: FirestoreClient,\n query: Query,\n options: ListenOptions,\n observer: Partial>\n): () => void {\n const wrappedObserver = new AsyncObserver(observer);\n const listener = new QueryListener(query, wrappedObserver, options);\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return eventManagerListen(eventManager, listener);\n });\n return () => {\n wrappedObserver.mute();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return eventManagerUnlisten(eventManager, listener);\n });\n };\n}\n\nexport function firestoreClientGetDocumentFromLocalCache(\n client: FirestoreClient,\n docKey: DocumentKey\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const localStore = await getLocalStore(client);\n return readDocumentFromCache(localStore, docKey, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentViaSnapshotListener(\n client: FirestoreClient,\n key: DocumentKey,\n options: GetOptions = {}\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return readDocumentViaSnapshotListener(\n eventManager,\n client.asyncQueue,\n key,\n options,\n deferred\n );\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentsFromLocalCache(\n client: FirestoreClient,\n query: Query\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const localStore = await getLocalStore(client);\n return executeQueryFromCache(localStore, query, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientGetDocumentsViaSnapshotListener(\n client: FirestoreClient,\n query: Query,\n options: GetOptions = {}\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return executeQueryViaSnapshotListener(\n eventManager,\n client.asyncQueue,\n query,\n options,\n deferred\n );\n });\n return deferred.promise;\n}\n\nexport function firestoreClientRunAggregateQuery(\n client: FirestoreClient,\n query: Query,\n aggregates: Aggregate[]\n): Promise> {\n const deferred = new Deferred>();\n\n client.asyncQueue.enqueueAndForget(async () => {\n // Implement and call executeAggregateQueryViaSnapshotListener, similar\n // to the implementation in firestoreClientGetDocumentsViaSnapshotListener\n // above\n try {\n // TODO(b/277628384): check `canUseNetwork()` and handle multi-tab.\n const datastore = await getDatastore(client);\n deferred.resolve(\n invokeRunAggregationQueryRpc(datastore, query, aggregates)\n );\n } catch (e) {\n deferred.reject(e as Error);\n }\n });\n return deferred.promise;\n}\n\nexport function firestoreClientWrite(\n client: FirestoreClient,\n mutations: Mutation[]\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const syncEngine = await getSyncEngine(client);\n return syncEngineWrite(syncEngine, mutations, deferred);\n });\n return deferred.promise;\n}\n\nexport function firestoreClientAddSnapshotsInSyncListener(\n client: FirestoreClient,\n observer: Partial>\n): () => void {\n const wrappedObserver = new AsyncObserver(observer);\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return addSnapshotsInSyncListener(eventManager, wrappedObserver);\n });\n return () => {\n wrappedObserver.mute();\n client.asyncQueue.enqueueAndForget(async () => {\n const eventManager = await getEventManager(client);\n return removeSnapshotsInSyncListener(eventManager, wrappedObserver);\n });\n };\n}\n\n/**\n * Takes an updateFunction in which a set of reads and writes can be performed\n * atomically. In the updateFunction, the client can read and write values\n * using the supplied transaction object. After the updateFunction, all\n * changes will be committed. If a retryable error occurs (ex: some other\n * client has changed any of the data referenced), then the updateFunction\n * will be called again after a backoff. If the updateFunction still fails\n * after all retries, then the transaction will be rejected.\n *\n * The transaction object passed to the updateFunction contains methods for\n * accessing documents and collections. Unlike other datastore access, data\n * accessed with the transaction will not reflect local changes that have not\n * been committed. For this reason, it is required that all reads are\n * performed before any writes. Transactions must be performed while online.\n */\nexport function firestoreClientTransaction(\n client: FirestoreClient,\n updateFunction: (transaction: Transaction) => Promise,\n options: TransactionOptions\n): Promise {\n const deferred = new Deferred();\n client.asyncQueue.enqueueAndForget(async () => {\n const datastore = await getDatastore(client);\n new TransactionRunner(\n client.asyncQueue,\n datastore,\n options,\n updateFunction,\n deferred\n ).run();\n });\n return deferred.promise;\n}\n\nasync function readDocumentFromCache(\n localStore: LocalStore,\n docKey: DocumentKey,\n result: Deferred\n): Promise {\n try {\n const document = await localStoreReadDocument(localStore, docKey);\n if (document.isFoundDocument()) {\n result.resolve(document);\n } else if (document.isNoDocument()) {\n result.resolve(null);\n } else {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document from cache. (However, this document may ' +\n \"exist on the server. Run again without setting 'source' in \" +\n 'the GetOptions to attempt to retrieve the document from the ' +\n 'server.)'\n )\n );\n }\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e as Error,\n `Failed to get document '${docKey} from cache`\n );\n result.reject(firestoreError);\n }\n}\n\n/**\n * Retrieves a latency-compensated document from the backend via a\n * SnapshotListener.\n */\nfunction readDocumentViaSnapshotListener(\n eventManager: EventManager,\n asyncQueue: AsyncQueue,\n key: DocumentKey,\n options: GetOptions,\n result: Deferred\n): Promise {\n const wrappedObserver = new AsyncObserver({\n next: (snap: ViewSnapshot) => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n wrappedObserver.mute();\n asyncQueue.enqueueAndForget(() =>\n eventManagerUnlisten(eventManager, listener)\n );\n\n const exists = snap.docs.has(key);\n if (!exists && snap.fromCache) {\n // TODO(dimond): If we're online and the document doesn't\n // exist then we resolve with a doc.exists set to false. If\n // we're offline however, we reject the Promise in this\n // case. Two options: 1) Cache the negative response from\n // the server so we can deliver that even when you're\n // offline 2) Actually reject the Promise in the online case\n // if the document doesn't exist.\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document because the client is offline.'\n )\n );\n } else if (\n exists &&\n snap.fromCache &&\n options &&\n options.source === 'server'\n ) {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get document from server. (However, this ' +\n 'document does exist in the local cache. Run again ' +\n 'without setting source to \"server\" to ' +\n 'retrieve the cached document.)'\n )\n );\n } else {\n debugAssert(\n snap.docs.size <= 1,\n 'Expected zero or a single result on a document-only query'\n );\n result.resolve(snap);\n }\n },\n error: e => result.reject(e)\n });\n\n const listener = new QueryListener(\n newQueryForPath(key.path),\n wrappedObserver,\n {\n includeMetadataChanges: true,\n waitForSyncWhenOnline: true\n }\n );\n return eventManagerListen(eventManager, listener);\n}\n\nasync function executeQueryFromCache(\n localStore: LocalStore,\n query: Query,\n result: Deferred\n): Promise {\n try {\n const queryResult = await localStoreExecuteQuery(\n localStore,\n query,\n /* usePreviousResults= */ true\n );\n const view = new View(query, queryResult.remoteKeys);\n const viewDocChanges = view.computeDocChanges(queryResult.documents);\n const viewChange = view.applyChanges(\n viewDocChanges,\n /* limboResolutionEnabled= */ false\n );\n result.resolve(viewChange.snapshot!);\n } catch (e) {\n const firestoreError = wrapInUserErrorIfRecoverable(\n e as Error,\n `Failed to execute query '${query} against cache`\n );\n result.reject(firestoreError);\n }\n}\n\n/**\n * Retrieves a latency-compensated query snapshot from the backend via a\n * SnapshotListener.\n */\nfunction executeQueryViaSnapshotListener(\n eventManager: EventManager,\n asyncQueue: AsyncQueue,\n query: Query,\n options: GetOptions,\n result: Deferred\n): Promise {\n const wrappedObserver = new AsyncObserver({\n next: snapshot => {\n // Mute and remove query first before passing event to user to avoid\n // user actions affecting the now stale query.\n wrappedObserver.mute();\n asyncQueue.enqueueAndForget(() =>\n eventManagerUnlisten(eventManager, listener)\n );\n\n if (snapshot.fromCache && options.source === 'server') {\n result.reject(\n new FirestoreError(\n Code.UNAVAILABLE,\n 'Failed to get documents from server. (However, these ' +\n 'documents may exist in the local cache. Run again ' +\n 'without setting source to \"server\" to ' +\n 'retrieve the cached documents.)'\n )\n );\n } else {\n result.resolve(snapshot);\n }\n },\n error: e => result.reject(e)\n });\n\n const listener = new QueryListener(query, wrappedObserver, {\n includeMetadataChanges: true,\n waitForSyncWhenOnline: true\n });\n return eventManagerListen(eventManager, listener);\n}\n\nexport function firestoreClientLoadBundle(\n client: FirestoreClient,\n databaseId: DatabaseId,\n data: ReadableStream | ArrayBuffer | string,\n resultTask: LoadBundleTask\n): void {\n const reader = createBundleReader(data, newSerializer(databaseId));\n client.asyncQueue.enqueueAndForget(async () => {\n syncEngineLoadBundle(await getSyncEngine(client), reader, resultTask);\n });\n}\n\nexport function firestoreClientGetNamedQuery(\n client: FirestoreClient,\n queryName: string\n): Promise {\n return client.asyncQueue.enqueue(async () =>\n localStoreGetNamedQuery(await getLocalStore(client), queryName)\n );\n}\n\nfunction createBundleReader(\n data: ReadableStream | ArrayBuffer | string,\n serializer: JsonProtoSerializer\n): BundleReader {\n let content: ReadableStream | ArrayBuffer;\n if (typeof data === 'string') {\n content = newTextEncoder().encode(data);\n } else {\n content = data;\n }\n return newBundleReader(toByteStreamReader(content), serializer);\n}\n\nexport function firestoreClientSetIndexConfiguration(\n client: FirestoreClient,\n indexes: FieldIndex[]\n): Promise {\n return client.asyncQueue.enqueue(async () => {\n return localStoreConfigureFieldIndexes(\n await getLocalStore(client),\n indexes\n );\n });\n}\n\nexport function firestoreClientSetPersistentCacheIndexAutoCreationEnabled(\n client: FirestoreClient,\n isEnabled: boolean\n): Promise {\n return client.asyncQueue.enqueue(async () => {\n return localStoreSetIndexAutoCreationEnabled(\n await getLocalStore(client),\n isEnabled\n );\n });\n}\n\nexport function firestoreClientDeleteAllFieldIndexes(\n client: FirestoreClient\n): Promise {\n return client.asyncQueue.enqueue(async () => {\n return localStoreDeleteAllFieldIndexes(await getLocalStore(client));\n });\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Options that configure the SDK’s underlying network transport (WebChannel)\n * when long-polling is used.\n *\n * Note: This interface is \"experimental\" and is subject to change.\n *\n * See `FirestoreSettings.experimentalAutoDetectLongPolling`,\n * `FirestoreSettings.experimentalForceLongPolling`, and\n * `FirestoreSettings.experimentalLongPollingOptions`.\n */\nexport interface ExperimentalLongPollingOptions {\n /**\n * The desired maximum timeout interval, in seconds, to complete a\n * long-polling GET response. Valid values are between 5 and 30, inclusive.\n * Floating point values are allowed and will be rounded to the nearest\n * millisecond.\n *\n * By default, when long-polling is used the \"hanging GET\" request sent by\n * the client times out after 30 seconds. To request a different timeout\n * from the server, set this setting with the desired timeout.\n *\n * Changing the default timeout may be useful, for example, if the buffering\n * proxy that necessitated enabling long-polling in the first place has a\n * shorter timeout for hanging GET requests, in which case setting the\n * long-polling timeout to a shorter value, such as 25 seconds, may fix\n * prematurely-closed hanging GET requests.\n * For example, see https://github.com/firebase/firebase-js-sdk/issues/6987.\n */\n timeoutSeconds?: number;\n}\n\n/**\n * Compares two `ExperimentalLongPollingOptions` objects for equality.\n */\nexport function longPollingOptionsEqual(\n options1: ExperimentalLongPollingOptions,\n options2: ExperimentalLongPollingOptions\n): boolean {\n return options1.timeoutSeconds === options2.timeoutSeconds;\n}\n\n/**\n * Creates and returns a new `ExperimentalLongPollingOptions` with the same\n * option values as the given instance.\n */\nexport function cloneLongPollingOptions(\n options: ExperimentalLongPollingOptions\n): ExperimentalLongPollingOptions {\n const clone: ExperimentalLongPollingOptions = {};\n\n if (options.timeoutSeconds !== undefined) {\n clone.timeoutSeconds = options.timeoutSeconds;\n }\n\n return clone;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { _FirebaseService } from '@firebase/app';\n\nimport { CredentialsProvider } from '../api/credentials';\nimport { cloneLongPollingOptions } from '../api/long_polling_options';\nimport { User } from '../auth/user';\nimport { DatabaseId, DatabaseInfo } from '../core/database_info';\nimport { newConnection } from '../platform/connection';\nimport { newSerializer } from '../platform/serializer';\nimport { Datastore, newDatastore } from '../remote/datastore';\nimport { Code, FirestoreError } from '../util/error';\nimport { logDebug } from '../util/log';\n\nimport { FirestoreSettingsImpl } from './settings';\n\nexport const LOG_TAG = 'ComponentProvider';\n\n// The components module manages the lifetime of dependencies of the Firestore\n// client. Dependencies can be lazily constructed and only one exists per\n// Firestore instance.\n\n/**\n * An interface implemented by FirebaseFirestore that provides compatibility\n * with the usage in this file.\n *\n * This interface mainly exists to remove a cyclic dependency.\n */\nexport interface FirestoreService extends _FirebaseService {\n _authCredentials: CredentialsProvider;\n _appCheckCredentials: CredentialsProvider;\n _persistenceKey: string;\n _databaseId: DatabaseId;\n _terminated: boolean;\n\n _freezeSettings(): FirestoreSettingsImpl;\n}\n/**\n * An instance map that ensures only one Datastore exists per Firestore\n * instance.\n */\nconst datastoreInstances = new Map();\n\n/**\n * Returns an initialized and started Datastore for the given Firestore\n * instance. Callers must invoke removeComponents() when the Firestore\n * instance is terminated.\n */\nexport function getDatastore(firestore: FirestoreService): Datastore {\n if (firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n if (!datastoreInstances.has(firestore)) {\n logDebug(LOG_TAG, 'Initializing Datastore');\n const databaseInfo = makeDatabaseInfo(\n firestore._databaseId,\n firestore.app.options.appId || '',\n firestore._persistenceKey,\n firestore._freezeSettings()\n );\n const connection = newConnection(databaseInfo);\n const serializer = newSerializer(firestore._databaseId);\n const datastore = newDatastore(\n firestore._authCredentials,\n firestore._appCheckCredentials,\n connection,\n serializer\n );\n\n datastoreInstances.set(firestore, datastore);\n }\n return datastoreInstances.get(firestore)!;\n}\n\n/**\n * Removes all components associated with the provided instance. Must be called\n * when the `Firestore` instance is terminated.\n */\nexport function removeComponents(firestore: FirestoreService): void {\n const datastore = datastoreInstances.get(firestore);\n if (datastore) {\n logDebug(LOG_TAG, 'Removing Datastore');\n datastoreInstances.delete(firestore);\n datastore.terminate();\n }\n}\n\nexport function makeDatabaseInfo(\n databaseId: DatabaseId,\n appId: string,\n persistenceKey: string,\n settings: FirestoreSettingsImpl\n): DatabaseInfo {\n return new DatabaseInfo(\n databaseId,\n appId,\n persistenceKey,\n settings.host,\n settings.ssl,\n settings.experimentalForceLongPolling,\n settings.experimentalAutoDetectLongPolling,\n cloneLongPollingOptions(settings.experimentalLongPollingOptions),\n settings.useFetchStreams\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\n\nimport { fail } from './assert';\nimport { Code, FirestoreError } from './error';\n\n/** Types accepted by validateType() and related methods for validation. */\nexport type ValidationType =\n | 'undefined'\n | 'object'\n | 'function'\n | 'boolean'\n | 'number'\n | 'string'\n | 'non-empty string';\n\nexport function validateNonEmptyArgument(\n functionName: string,\n argumentName: string,\n argument?: string\n): asserts argument is string {\n if (!argument) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${functionName}() cannot be called with an empty ${argumentName}.`\n );\n }\n}\n\n/**\n * Validates that two boolean options are not set at the same time.\n * @internal\n */\nexport function validateIsNotUsedTogether(\n optionName1: string,\n argument1: boolean | undefined,\n optionName2: string,\n argument2: boolean | undefined\n): void {\n if (argument1 === true && argument2 === true) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `${optionName1} and ${optionName2} cannot be used together.`\n );\n }\n}\n\n/**\n * Validates that `path` refers to a document (indicated by the fact it contains\n * an even numbers of segments).\n */\nexport function validateDocumentPath(path: ResourcePath): void {\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid document reference. Document references must have an even number of segments, but ${path} has ${path.length}.`\n );\n }\n}\n\n/**\n * Validates that `path` refers to a collection (indicated by the fact it\n * contains an odd numbers of segments).\n */\nexport function validateCollectionPath(path: ResourcePath): void {\n if (DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid collection reference. Collection references must have an odd number of segments, but ${path} has ${path.length}.`\n );\n }\n}\n\n/**\n * Returns true if it's a non-null object without a custom prototype\n * (i.e. excludes Array, Date, etc.).\n */\nexport function isPlainObject(input: unknown): boolean {\n return (\n typeof input === 'object' &&\n input !== null &&\n (Object.getPrototypeOf(input) === Object.prototype ||\n Object.getPrototypeOf(input) === null)\n );\n}\n\n/** Returns a string describing the type / value of the provided input. */\nexport function valueDescription(input: unknown): string {\n if (input === undefined) {\n return 'undefined';\n } else if (input === null) {\n return 'null';\n } else if (typeof input === 'string') {\n if (input.length > 20) {\n input = `${input.substring(0, 20)}...`;\n }\n return JSON.stringify(input);\n } else if (typeof input === 'number' || typeof input === 'boolean') {\n return '' + input;\n } else if (typeof input === 'object') {\n if (input instanceof Array) {\n return 'an array';\n } else {\n const customObjectName = tryGetCustomObjectType(input!);\n if (customObjectName) {\n return `a custom ${customObjectName} object`;\n } else {\n return 'an object';\n }\n }\n } else if (typeof input === 'function') {\n return 'a function';\n } else {\n return fail('Unknown wrong type: ' + typeof input);\n }\n}\n\n/** try to get the constructor name for an object. */\nexport function tryGetCustomObjectType(input: object): string | null {\n if (input.constructor) {\n return input.constructor.name;\n }\n return null;\n}\n\n/**\n * Casts `obj` to `T`, optionally unwrapping Compat types to expose the\n * underlying instance. Throws if `obj` is not an instance of `T`.\n *\n * This cast is used in the Lite and Full SDK to verify instance types for\n * arguments passed to the public API.\n * @internal\n */\nexport function cast(\n obj: object,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n constructor: { new (...args: any[]): T }\n): T | never {\n if ('_delegate' in obj) {\n // Unwrap Compat types\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n obj = (obj as any)._delegate;\n }\n\n if (!(obj instanceof constructor)) {\n if (constructor.name === obj.constructor.name) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Type does not match the expected instance. Did you pass a ' +\n `reference from a different Firestore SDK?`\n );\n } else {\n const description = valueDescription(obj);\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Expected type '${constructor.name}', but it was: ${description}`\n );\n }\n }\n return obj as T;\n}\n\nexport function validatePositiveNumber(functionName: string, n: number): void {\n if (n <= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${functionName}() requires a positive number, but it was: ${n}.`\n );\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirestoreLocalCache } from '../api/cache_config';\nimport { CredentialsSettings } from '../api/credentials';\nimport {\n ExperimentalLongPollingOptions,\n cloneLongPollingOptions,\n longPollingOptionsEqual\n} from '../api/long_polling_options';\nimport {\n LRU_COLLECTION_DISABLED,\n LRU_DEFAULT_CACHE_SIZE_BYTES\n} from '../local/lru_garbage_collector';\nimport { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../local/lru_garbage_collector_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { validateIsNotUsedTogether } from '../util/input_validation';\n\n// settings() defaults:\nexport const DEFAULT_HOST = 'firestore.googleapis.com';\nexport const DEFAULT_SSL = true;\n\n// The minimum long-polling timeout is hardcoded on the server. The value here\n// should be kept in sync with the value used by the server, as the server will\n// silently ignore a value below the minimum and fall back to the default.\n// Googlers see b/266868871 for relevant discussion.\nconst MIN_LONG_POLLING_TIMEOUT_SECONDS = 5;\n\n// No maximum long-polling timeout is configured in the server, and defaults to\n// 30 seconds, which is what Watch appears to use.\n// Googlers see b/266868871 for relevant discussion.\nconst MAX_LONG_POLLING_TIMEOUT_SECONDS = 30;\n\n// Whether long-polling auto-detected is enabled by default.\nconst DEFAULT_AUTO_DETECT_LONG_POLLING = true;\n\n/**\n * Specifies custom configurations for your Cloud Firestore instance.\n * You must set these before invoking any other methods.\n */\nexport interface FirestoreSettings {\n /** The hostname to connect to. */\n host?: string;\n\n /** Whether to use SSL when connecting. */\n ssl?: boolean;\n\n /**\n * Whether to skip nested properties that are set to `undefined` during\n * object serialization. If set to `true`, these properties are skipped\n * and not written to Firestore. If set to `false` or omitted, the SDK\n * throws an exception when it encounters properties of type `undefined`.\n */\n ignoreUndefinedProperties?: boolean;\n}\n\n/**\n * @internal\n * Undocumented, private additional settings not exposed in our public API.\n */\nexport interface PrivateSettings extends FirestoreSettings {\n // Can be a google-auth-library or gapi client.\n credentials?: CredentialsSettings;\n cacheSizeBytes?: number;\n experimentalForceLongPolling?: boolean;\n experimentalAutoDetectLongPolling?: boolean;\n experimentalLongPollingOptions?: ExperimentalLongPollingOptions;\n useFetchStreams?: boolean;\n\n localCache?: FirestoreLocalCache;\n}\n\n/**\n * A concrete type describing all the values that can be applied via a\n * user-supplied `FirestoreSettings` object. This is a separate type so that\n * defaults can be supplied and the value can be checked for equality.\n */\nexport class FirestoreSettingsImpl {\n /** The hostname to connect to. */\n readonly host: string;\n\n /** Whether to use SSL when connecting. */\n readonly ssl: boolean;\n\n readonly cacheSizeBytes: number;\n\n readonly experimentalForceLongPolling: boolean;\n\n readonly experimentalAutoDetectLongPolling: boolean;\n\n readonly experimentalLongPollingOptions: ExperimentalLongPollingOptions;\n\n readonly ignoreUndefinedProperties: boolean;\n\n readonly useFetchStreams: boolean;\n readonly localCache?: FirestoreLocalCache;\n\n // Can be a google-auth-library or gapi client.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n credentials?: any;\n\n constructor(settings: PrivateSettings) {\n if (settings.host === undefined) {\n if (settings.ssl !== undefined) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"Can't provide ssl option if host option is not set\"\n );\n }\n this.host = DEFAULT_HOST;\n this.ssl = DEFAULT_SSL;\n } else {\n this.host = settings.host;\n this.ssl = settings.ssl ?? DEFAULT_SSL;\n }\n\n this.credentials = settings.credentials;\n this.ignoreUndefinedProperties = !!settings.ignoreUndefinedProperties;\n this.localCache = settings.localCache;\n\n if (settings.cacheSizeBytes === undefined) {\n this.cacheSizeBytes = LRU_DEFAULT_CACHE_SIZE_BYTES;\n } else {\n if (\n settings.cacheSizeBytes !== LRU_COLLECTION_DISABLED &&\n settings.cacheSizeBytes < LRU_MINIMUM_CACHE_SIZE_BYTES\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `cacheSizeBytes must be at least ${LRU_MINIMUM_CACHE_SIZE_BYTES}`\n );\n } else {\n this.cacheSizeBytes = settings.cacheSizeBytes;\n }\n }\n\n validateIsNotUsedTogether(\n 'experimentalForceLongPolling',\n settings.experimentalForceLongPolling,\n 'experimentalAutoDetectLongPolling',\n settings.experimentalAutoDetectLongPolling\n );\n\n this.experimentalForceLongPolling = !!settings.experimentalForceLongPolling;\n\n if (this.experimentalForceLongPolling) {\n this.experimentalAutoDetectLongPolling = false;\n } else if (settings.experimentalAutoDetectLongPolling === undefined) {\n this.experimentalAutoDetectLongPolling = DEFAULT_AUTO_DETECT_LONG_POLLING;\n } else {\n // For backwards compatibility, coerce the value to boolean even though\n // the TypeScript compiler has narrowed the type to boolean already.\n // noinspection PointlessBooleanExpressionJS\n this.experimentalAutoDetectLongPolling =\n !!settings.experimentalAutoDetectLongPolling;\n }\n\n this.experimentalLongPollingOptions = cloneLongPollingOptions(\n settings.experimentalLongPollingOptions ?? {}\n );\n validateLongPollingOptions(this.experimentalLongPollingOptions);\n\n this.useFetchStreams = !!settings.useFetchStreams;\n }\n\n isEqual(other: FirestoreSettingsImpl): boolean {\n return (\n this.host === other.host &&\n this.ssl === other.ssl &&\n this.credentials === other.credentials &&\n this.cacheSizeBytes === other.cacheSizeBytes &&\n this.experimentalForceLongPolling ===\n other.experimentalForceLongPolling &&\n this.experimentalAutoDetectLongPolling ===\n other.experimentalAutoDetectLongPolling &&\n longPollingOptionsEqual(\n this.experimentalLongPollingOptions,\n other.experimentalLongPollingOptions\n ) &&\n this.ignoreUndefinedProperties === other.ignoreUndefinedProperties &&\n this.useFetchStreams === other.useFetchStreams\n );\n }\n}\n\nfunction validateLongPollingOptions(\n options: ExperimentalLongPollingOptions\n): void {\n if (options.timeoutSeconds !== undefined) {\n if (isNaN(options.timeoutSeconds)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `invalid long polling timeout: ` +\n `${options.timeoutSeconds} (must not be NaN)`\n );\n }\n if (options.timeoutSeconds < MIN_LONG_POLLING_TIMEOUT_SECONDS) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `invalid long polling timeout: ${options.timeoutSeconds} ` +\n `(minimum allowed value is ${MIN_LONG_POLLING_TIMEOUT_SECONDS})`\n );\n }\n if (options.timeoutSeconds > MAX_LONG_POLLING_TIMEOUT_SECONDS) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `invalid long polling timeout: ${options.timeoutSeconds} ` +\n `(maximum allowed value is ${MAX_LONG_POLLING_TIMEOUT_SECONDS})`\n );\n }\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _getProvider,\n _removeServiceInstance,\n FirebaseApp,\n getApp\n} from '@firebase/app';\nimport {\n createMockUserToken,\n EmulatorMockTokenOptions,\n getDefaultEmulatorHostnameAndPort\n} from '@firebase/util';\n\nimport {\n CredentialsProvider,\n EmulatorAuthCredentialsProvider,\n makeAuthCredentialsProvider,\n OAuthToken\n} from '../api/credentials';\nimport { User } from '../auth/user';\nimport { DatabaseId, DEFAULT_DATABASE_NAME } from '../core/database_info';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\nimport { logWarn } from '../util/log';\n\nimport { FirestoreService, removeComponents } from './components';\nimport {\n DEFAULT_HOST,\n FirestoreSettingsImpl,\n PrivateSettings,\n FirestoreSettings\n} from './settings';\n\nexport { EmulatorMockTokenOptions } from '@firebase/util';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'firestore/lite': Firestore;\n }\n}\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */\nexport class Firestore implements FirestoreService {\n /**\n * Whether it's a Firestore or Firestore Lite instance.\n */\n type: 'firestore-lite' | 'firestore' = 'firestore-lite';\n\n readonly _persistenceKey: string = '(lite)';\n\n private _settings = new FirestoreSettingsImpl({});\n private _settingsFrozen = false;\n\n // A task that is assigned when the terminate() is invoked and resolved when\n // all components have shut down. Otherwise, Firestore is not terminated,\n // which can mean either the FirestoreClient is in the process of starting,\n // or restarting.\n private _terminateTask: Promise | 'notTerminated' = 'notTerminated';\n\n /** @hideconstructor */\n constructor(\n public _authCredentials: CredentialsProvider,\n public _appCheckCredentials: CredentialsProvider,\n readonly _databaseId: DatabaseId,\n readonly _app?: FirebaseApp\n ) {}\n\n /**\n * The {@link @firebase/app#FirebaseApp} associated with this `Firestore` service\n * instance.\n */\n get app(): FirebaseApp {\n if (!this._app) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n \"Firestore was not initialized using the Firebase SDK. 'app' is \" +\n 'not available'\n );\n }\n return this._app;\n }\n\n get _initialized(): boolean {\n return this._settingsFrozen;\n }\n\n get _terminated(): boolean {\n return this._terminateTask !== 'notTerminated';\n }\n\n _setSettings(settings: PrivateSettings): void {\n if (this._settingsFrozen) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore has already been started and its settings can no longer ' +\n 'be changed. You can only modify settings before calling any other ' +\n 'methods on a Firestore object.'\n );\n }\n this._settings = new FirestoreSettingsImpl(settings);\n if (settings.credentials !== undefined) {\n this._authCredentials = makeAuthCredentialsProvider(settings.credentials);\n }\n }\n\n _getSettings(): FirestoreSettingsImpl {\n return this._settings;\n }\n\n _freezeSettings(): FirestoreSettingsImpl {\n this._settingsFrozen = true;\n return this._settings;\n }\n\n _delete(): Promise {\n // The `_terminateTask` must be assigned future that completes when\n // terminate is complete. The existence of this future puts SDK in state\n // that will not accept further API interaction.\n if (this._terminateTask === 'notTerminated') {\n this._terminateTask = this._terminate();\n }\n return this._terminateTask;\n }\n\n async _restart(): Promise {\n // The `_terminateTask` must equal 'notTerminated' after restart to\n // signal that client is in a state that accepts API calls.\n if (this._terminateTask === 'notTerminated') {\n await this._terminate();\n } else {\n this._terminateTask = 'notTerminated';\n }\n }\n\n /** Returns a JSON-serializable representation of this `Firestore` instance. */\n toJSON(): object {\n return {\n app: this._app,\n databaseId: this._databaseId,\n settings: this._settings\n };\n }\n\n /**\n * Terminates all components used by this client. Subclasses can override\n * this method to clean up their own dependencies, but must also call this\n * method.\n *\n * Only ever called once.\n */\n protected _terminate(): Promise {\n removeComponents(this);\n return Promise.resolve();\n }\n}\n\n/**\n * Initializes a new instance of Cloud Firestore with the provided settings.\n * Can only be called before any other functions, including\n * {@link (getFirestore:1)}. If the custom settings are empty, this function is\n * equivalent to calling {@link (getFirestore:1)}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the `Firestore` instance will\n * be associated.\n * @param settings - A settings object to configure the `Firestore` instance.\n * @returns A newly initialized `Firestore` instance.\n */\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: FirestoreSettings\n): Firestore;\n/**\n * Initializes a new instance of Cloud Firestore with the provided settings.\n * Can only be called before any other functions, including\n * {@link (getFirestore:1)}. If the custom settings are empty, this function is\n * equivalent to calling {@link (getFirestore:1)}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the `Firestore` instance will\n * be associated.\n * @param settings - A settings object to configure the `Firestore` instance.\n * @param databaseId - The name of the database.\n * @returns A newly initialized `Firestore` instance.\n * @beta\n */\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: FirestoreSettings,\n databaseId?: string\n): Firestore;\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: FirestoreSettings,\n databaseId?: string\n): Firestore {\n if (!databaseId) {\n databaseId = DEFAULT_DATABASE_NAME;\n }\n const provider = _getProvider(app, 'firestore/lite');\n\n if (provider.isInitialized(databaseId)) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore can only be initialized once per app.'\n );\n }\n\n return provider.initialize({\n options: settings,\n instanceIdentifier: databaseId\n });\n}\n\n/**\n * Returns the existing default {@link Firestore} instance that is associated with the\n * default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @returns The {@link Firestore} instance of the provided app.\n */\nexport function getFirestore(): Firestore;\n/**\n * Returns the existing default {@link Firestore} instance that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}\n * instance is associated with.\n * @returns The {@link Firestore} instance of the provided app.\n */\nexport function getFirestore(app: FirebaseApp): Firestore;\n/**\n * Returns the existing {@link Firestore} instance that is associated with the\n * default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param databaseId - The name of the database.\n * @returns The {@link Firestore} instance of the provided app.\n * @beta\n */\nexport function getFirestore(databaseId: string): Firestore;\n/**\n * Returns the existing {@link Firestore} instance that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}\n * instance is associated with.\n * @param databaseId - The name of the database.\n * @returns The {@link Firestore} instance of the provided app.\n * @beta\n */\nexport function getFirestore(app: FirebaseApp, databaseId: string): Firestore;\nexport function getFirestore(\n appOrDatabaseId?: FirebaseApp | string,\n optionalDatabaseId?: string\n): Firestore {\n const app: FirebaseApp =\n typeof appOrDatabaseId === 'object' ? appOrDatabaseId : getApp();\n const databaseId =\n typeof appOrDatabaseId === 'string'\n ? appOrDatabaseId\n : optionalDatabaseId || '(default)';\n const db = _getProvider(app, 'firestore/lite').getImmediate({\n identifier: databaseId\n }) as Firestore;\n if (!db._initialized) {\n const emulator = getDefaultEmulatorHostnameAndPort('firestore');\n if (emulator) {\n connectFirestoreEmulator(db, ...emulator);\n }\n }\n return db;\n}\n\n/**\n * Modify this instance to communicate with the Cloud Firestore emulator.\n *\n * Note: This must be called before this instance has been used to do any\n * operations.\n *\n * @param firestore - The `Firestore` instance to configure to connect to the\n * emulator.\n * @param host - the emulator host (ex: localhost).\n * @param port - the emulator port (ex: 9000).\n * @param options.mockUserToken - the mock auth token to use for unit testing\n * Security Rules.\n */\nexport function connectFirestoreEmulator(\n firestore: Firestore,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions | string;\n } = {}\n): void {\n firestore = cast(firestore, Firestore);\n const settings = firestore._getSettings();\n const newHostSetting = `${host}:${port}`;\n\n if (settings.host !== DEFAULT_HOST && settings.host !== newHostSetting) {\n logWarn(\n 'Host has been set in both settings() and connectFirestoreEmulator(), emulator host ' +\n 'will be used.'\n );\n }\n\n firestore._setSettings({\n ...settings,\n host: newHostSetting,\n ssl: false\n });\n\n if (options.mockUserToken) {\n let token: string;\n let user: User;\n if (typeof options.mockUserToken === 'string') {\n token = options.mockUserToken;\n user = User.MOCK_USER;\n } else {\n // Let createMockUserToken validate first (catches common mistakes like\n // invalid field \"uid\" and missing field \"sub\" / \"user_id\".)\n token = createMockUserToken(\n options.mockUserToken,\n firestore._app?.options.projectId\n );\n const uid = options.mockUserToken.sub || options.mockUserToken.user_id;\n if (!uid) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n \"mockUserToken must contain 'sub' or 'user_id' field!\"\n );\n }\n user = new User(uid);\n }\n\n firestore._authCredentials = new EmulatorAuthCredentialsProvider(\n new OAuthToken(token, user)\n );\n }\n}\n\n/**\n * Terminates the provided `Firestore` instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` functions\n * may be used. Any other function will throw a `FirestoreError`. Termination\n * does not cancel any pending writes, and any promises that are awaiting a\n * response from the server will not be resolved.\n *\n * To restart after termination, create a new instance of `Firestore` with\n * {@link (getFirestore:1)}.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all of\n * its resources or in combination with {@link clearIndexedDbPersistence} to\n * ensure that all local state is destroyed between test runs.\n *\n * @param firestore - The `Firestore` instance to terminate.\n * @returns A `Promise` that is resolved when the instance has been successfully\n * terminated.\n */\nexport function terminate(firestore: Firestore): Promise {\n firestore = cast(firestore, Firestore);\n _removeServiceInstance(firestore.app, 'firestore/lite');\n return firestore._delete();\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport {\n newQueryForCollectionGroup,\n newQueryForPath,\n Query as InternalQuery,\n queryEquals\n} from '../core/query';\nimport { DocumentKey } from '../model/document_key';\nimport { ResourcePath } from '../model/path';\nimport { Code, FirestoreError } from '../util/error';\nimport {\n cast,\n validateCollectionPath,\n validateDocumentPath,\n validateNonEmptyArgument\n} from '../util/input_validation';\nimport { AutoId } from '../util/misc';\n\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport { FieldValue } from './field_value';\nimport { FirestoreDataConverter } from './snapshot';\nimport { NestedUpdateFields, Primitive } from './types';\n\n/**\n * Document data (for use with {@link @firebase/firestore/lite#(setDoc:1)}) consists of fields mapped to\n * values.\n */\nexport interface DocumentData {\n /** A mapping between a field and its value. */\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n [field: string]: any;\n}\n\n/**\n * Similar to TypeScript's `Partial`, but allows nested fields to be\n * omitted and FieldValues to be passed in as property values.\n */\nexport type PartialWithFieldValue =\n | Partial\n | (T extends Primitive\n ? T\n : T extends {}\n ? { [K in keyof T]?: PartialWithFieldValue | FieldValue }\n : never);\n\n/**\n * Allows FieldValues to be passed in as a property value while maintaining\n * type safety.\n */\nexport type WithFieldValue =\n | T\n | (T extends Primitive\n ? T\n : T extends {}\n ? { [K in keyof T]: WithFieldValue | FieldValue }\n : never);\n\n/**\n * Update data (for use with {@link (updateDoc:1)}) that consists of field paths\n * (e.g. 'foo' or 'foo.baz') mapped to values. Fields that contain dots\n * reference nested fields within the document. FieldValues can be passed in\n * as property values.\n */\nexport type UpdateData = T extends Primitive\n ? T\n : T extends {}\n ? { [K in keyof T]?: UpdateData | FieldValue } & NestedUpdateFields\n : Partial;\n/**\n * An options object that configures the behavior of {@link @firebase/firestore/lite#(setDoc:1)}, {@link\n * @firebase/firestore/lite#(WriteBatch.set:1)} and {@link @firebase/firestore/lite#(Transaction.set:1)} calls. These calls can be\n * configured to perform granular merges instead of overwriting the target\n * documents in their entirety by providing a `SetOptions` with `merge: true`.\n *\n * @param merge - Changes the behavior of a `setDoc()` call to only replace the\n * values specified in its data argument. Fields omitted from the `setDoc()`\n * call remain untouched. If your input sets any field to an empty map, all\n * nested fields are overwritten.\n * @param mergeFields - Changes the behavior of `setDoc()` calls to only replace\n * the specified field paths. Any field path that is not specified is ignored\n * and remains untouched. If your input sets any field to an empty map, all\n * nested fields are overwritten.\n */\nexport type SetOptions =\n | {\n readonly merge?: boolean;\n }\n | {\n readonly mergeFields?: Array;\n };\n\n/**\n * A `Query` refers to a query which you can read or listen to. You can also\n * construct refined `Query` objects by adding filters and ordering.\n */\nexport class Query<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n /** The type of this Firestore reference. */\n readonly type: 'query' | 'collection' = 'query';\n\n /**\n * The `Firestore` instance for the Firestore database (useful for performing\n * transactions, etc.).\n */\n readonly firestore: Firestore;\n\n // This is the lite version of the Query class in the main SDK.\n\n /** @hideconstructor protected */\n constructor(\n firestore: Firestore,\n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n readonly converter: FirestoreDataConverter<\n AppModelType,\n DbModelType\n > | null,\n readonly _query: InternalQuery\n ) {\n this.firestore = firestore;\n }\n\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `Query` that does not use a\n * converter.\n */\n withConverter(converter: null): Query;\n /**\n * Applies a custom data converter to this query, allowing you to use your own\n * custom model objects with Firestore. When you call {@link getDocs} with\n * the returned query, the provided converter will convert between Firestore\n * data of type `NewDbModelType` and your custom type `NewAppModelType`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `Query` that uses the provided converter.\n */\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter\n ): Query;\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter | null\n ): Query {\n return new Query(\n this.firestore,\n converter,\n this._query\n );\n }\n}\n\n/**\n * A `DocumentReference` refers to a document location in a Firestore database\n * and can be used to write, read, or listen to the location. The document at\n * the referenced location may or may not exist.\n */\nexport class DocumentReference<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n /** The type of this Firestore reference. */\n readonly type = 'document';\n\n /**\n * The {@link Firestore} instance the document is in.\n * This is useful for performing transactions, for example.\n */\n readonly firestore: Firestore;\n\n /** @hideconstructor */\n constructor(\n firestore: Firestore,\n /**\n * If provided, the `FirestoreDataConverter` associated with this instance.\n */\n readonly converter: FirestoreDataConverter<\n AppModelType,\n DbModelType\n > | null,\n readonly _key: DocumentKey\n ) {\n this.firestore = firestore;\n }\n\n get _path(): ResourcePath {\n return this._key.path;\n }\n\n /**\n * The document's identifier within its collection.\n */\n get id(): string {\n return this._key.path.lastSegment();\n }\n\n /**\n * A string representing the path of the referenced document (relative\n * to the root of the database).\n */\n get path(): string {\n return this._key.path.canonicalString();\n }\n\n /**\n * The collection this `DocumentReference` belongs to.\n */\n get parent(): CollectionReference {\n return new CollectionReference(\n this.firestore,\n this.converter,\n this._key.path.popLast()\n );\n }\n\n /**\n * Applies a custom data converter to this `DocumentReference`, allowing you\n * to use your own custom model objects with Firestore. When you call {@link\n * @firebase/firestore/lite#(setDoc:1)}, {@link @firebase/firestore/lite#getDoc}, etc. with the returned `DocumentReference`\n * instance, the provided converter will convert between Firestore data of\n * type `NewDbModelType` and your custom type `NewAppModelType`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `DocumentReference` that uses the provided converter.\n */\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter\n ): DocumentReference;\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `DocumentReference` that does not\n * use a converter.\n */\n withConverter(converter: null): DocumentReference;\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter | null\n ): DocumentReference {\n return new DocumentReference(\n this.firestore,\n converter,\n this._key\n );\n }\n}\n\n/**\n * A `CollectionReference` object can be used for adding documents, getting\n * document references, and querying for documents (using {@link (query:1)}).\n */\nexport class CollectionReference<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> extends Query {\n /** The type of this Firestore reference. */\n readonly type = 'collection';\n\n /** @hideconstructor */\n constructor(\n firestore: Firestore,\n converter: FirestoreDataConverter | null,\n readonly _path: ResourcePath\n ) {\n super(firestore, converter, newQueryForPath(_path));\n }\n\n /** The collection's identifier. */\n get id(): string {\n return this._query.path.lastSegment();\n }\n\n /**\n * A string representing the path of the referenced collection (relative\n * to the root of the database).\n */\n get path(): string {\n return this._query.path.canonicalString();\n }\n\n /**\n * A reference to the containing `DocumentReference` if this is a\n * subcollection. If this isn't a subcollection, the reference is null.\n */\n get parent(): DocumentReference | null {\n const parentPath = this._path.popLast();\n if (parentPath.isEmpty()) {\n return null;\n } else {\n return new DocumentReference(\n this.firestore,\n /* converter= */ null,\n new DocumentKey(parentPath)\n );\n }\n }\n\n /**\n * Applies a custom data converter to this `CollectionReference`, allowing you\n * to use your own custom model objects with Firestore. When you call {@link\n * addDoc} with the returned `CollectionReference` instance, the provided\n * converter will convert between Firestore data of type `NewDbModelType` and\n * your custom type `NewAppModelType`.\n *\n * @param converter - Converts objects to and from Firestore.\n * @returns A `CollectionReference` that uses the provided converter.\n */\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter\n ): CollectionReference;\n /**\n * Removes the current converter.\n *\n * @param converter - `null` removes the current converter.\n * @returns A `CollectionReference` that does not\n * use a converter.\n */\n withConverter(\n converter: null\n ): CollectionReference;\n withConverter<\n NewAppModelType,\n NewDbModelType extends DocumentData = DocumentData\n >(\n converter: FirestoreDataConverter | null\n ): CollectionReference {\n return new CollectionReference(\n this.firestore,\n converter,\n this._path\n );\n }\n}\n\n/**\n * Gets a `CollectionReference` instance that refers to the collection at\n * the specified absolute path.\n *\n * @param firestore - A reference to the root `Firestore` instance.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments to apply relative to the first\n * argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n firestore: Firestore,\n path: string,\n ...pathSegments: string[]\n): CollectionReference;\n/**\n * Gets a `CollectionReference` instance that refers to a subcollection of\n * `reference` at the specified relative path.\n *\n * @param reference - A reference to a collection.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments to apply relative to the first\n * argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n reference: CollectionReference,\n path: string,\n ...pathSegments: string[]\n): CollectionReference;\n/**\n * Gets a `CollectionReference` instance that refers to a subcollection of\n * `reference` at the specified relative path.\n *\n * @param reference - A reference to a Firestore document.\n * @param path - A slash-separated path to a collection.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an even number of segments and does not point\n * to a collection.\n * @returns The `CollectionReference` instance.\n */\nexport function collection(\n reference: DocumentReference,\n path: string,\n ...pathSegments: string[]\n): CollectionReference;\nexport function collection(\n parent:\n | Firestore\n | DocumentReference\n | CollectionReference,\n path: string,\n ...pathSegments: string[]\n): CollectionReference {\n parent = getModularInstance(parent);\n\n validateNonEmptyArgument('collection', 'path', path);\n if (parent instanceof Firestore) {\n const absolutePath = ResourcePath.fromString(path, ...pathSegments);\n validateCollectionPath(absolutePath);\n return new CollectionReference(parent, /* converter= */ null, absolutePath);\n } else {\n if (\n !(parent instanceof DocumentReference) &&\n !(parent instanceof CollectionReference)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Expected first argument to collection() to be a CollectionReference, ' +\n 'a DocumentReference or FirebaseFirestore'\n );\n }\n const absolutePath = parent._path.child(\n ResourcePath.fromString(path, ...pathSegments)\n );\n validateCollectionPath(absolutePath);\n return new CollectionReference(\n parent.firestore,\n /* converter= */ null,\n absolutePath\n );\n }\n}\n\n// TODO(firestorelite): Consider using ErrorFactory -\n// https://github.com/firebase/firebase-js-sdk/blob/0131e1f/packages/util/src/errors.ts#L106\n\n/**\n * Creates and returns a new `Query` instance that includes all documents in the\n * database that are contained in a collection or subcollection with the\n * given `collectionId`.\n *\n * @param firestore - A reference to the root `Firestore` instance.\n * @param collectionId - Identifies the collections to query over. Every\n * collection or subcollection with this ID as the last segment of its path\n * will be included. Cannot contain a slash.\n * @returns The created `Query`.\n */\nexport function collectionGroup(\n firestore: Firestore,\n collectionId: string\n): Query {\n firestore = cast(firestore, Firestore);\n\n validateNonEmptyArgument('collectionGroup', 'collection id', collectionId);\n if (collectionId.indexOf('/') >= 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid collection ID '${collectionId}' passed to function ` +\n `collectionGroup(). Collection IDs must not contain '/'.`\n );\n }\n\n return new Query(\n firestore,\n /* converter= */ null,\n newQueryForCollectionGroup(collectionId)\n );\n}\n\n/**\n * Gets a `DocumentReference` instance that refers to the document at the\n * specified absolute path.\n *\n * @param firestore - A reference to the root `Firestore` instance.\n * @param path - A slash-separated path to a document.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc(\n firestore: Firestore,\n path: string,\n ...pathSegments: string[]\n): DocumentReference;\n/**\n * Gets a `DocumentReference` instance that refers to a document within\n * `reference` at the specified relative path. If no path is specified, an\n * automatically-generated unique ID will be used for the returned\n * `DocumentReference`.\n *\n * @param reference - A reference to a collection.\n * @param path - A slash-separated path to a document. Has to be omitted to use\n * auto-generated IDs.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc(\n reference: CollectionReference,\n path?: string,\n ...pathSegments: string[]\n): DocumentReference;\n/**\n * Gets a `DocumentReference` instance that refers to a document within\n * `reference` at the specified relative path.\n *\n * @param reference - A reference to a Firestore document.\n * @param path - A slash-separated path to a document.\n * @param pathSegments - Additional path segments that will be applied relative\n * to the first argument.\n * @throws If the final path has an odd number of segments and does not point to\n * a document.\n * @returns The `DocumentReference` instance.\n */\nexport function doc(\n reference: DocumentReference,\n path: string,\n ...pathSegments: string[]\n): DocumentReference;\nexport function doc(\n parent:\n | Firestore\n | CollectionReference\n | DocumentReference,\n path?: string,\n ...pathSegments: string[]\n): DocumentReference {\n parent = getModularInstance(parent);\n\n // We allow omission of 'pathString' but explicitly prohibit passing in both\n // 'undefined' and 'null'.\n if (arguments.length === 1) {\n path = AutoId.newId();\n }\n validateNonEmptyArgument('doc', 'path', path);\n\n if (parent instanceof Firestore) {\n const absolutePath = ResourcePath.fromString(path, ...pathSegments);\n validateDocumentPath(absolutePath);\n return new DocumentReference(\n parent,\n /* converter= */ null,\n new DocumentKey(absolutePath)\n );\n } else {\n if (\n !(parent instanceof DocumentReference) &&\n !(parent instanceof CollectionReference)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Expected first argument to collection() to be a CollectionReference, ' +\n 'a DocumentReference or FirebaseFirestore'\n );\n }\n const absolutePath = parent._path.child(\n ResourcePath.fromString(path, ...pathSegments)\n );\n validateDocumentPath(absolutePath);\n return new DocumentReference(\n parent.firestore,\n parent instanceof CollectionReference ? parent.converter : null,\n new DocumentKey(absolutePath)\n );\n }\n}\n\n/**\n * Returns true if the provided references are equal.\n *\n * @param left - A reference to compare.\n * @param right - A reference to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */\nexport function refEqual(\n left:\n | DocumentReference\n | CollectionReference,\n right:\n | DocumentReference\n | CollectionReference\n): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (\n (left instanceof DocumentReference ||\n left instanceof CollectionReference) &&\n (right instanceof DocumentReference || right instanceof CollectionReference)\n ) {\n return (\n left.firestore === right.firestore &&\n left.path === right.path &&\n left.converter === right.converter\n );\n }\n return false;\n}\n\n/**\n * Returns true if the provided queries point to the same collection and apply\n * the same constraints.\n *\n * @param left - A `Query` to compare.\n * @param right - A `Query` to compare.\n * @returns true if the references point to the same location in the same\n * Firestore database.\n */\nexport function queryEqual(\n left: Query,\n right: Query\n): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (left instanceof Query && right instanceof Query) {\n return (\n left.firestore === right.firestore &&\n queryEquals(left._query, right._query) &&\n left.converter === right.converter\n );\n }\n return false;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isIndexedDbTransactionError } from '../local/simple_db';\nimport { getDocument } from '../platform/dom';\nimport { ExponentialBackoff } from '../remote/backoff';\n\nimport { debugAssert, fail } from './assert';\nimport { AsyncQueue, DelayedOperation, TimerId } from './async_queue';\nimport { FirestoreError } from './error';\nimport { logDebug, logError } from './log';\nimport { Deferred } from './promise';\n\nconst LOG_TAG = 'AsyncQueue';\n\nexport class AsyncQueueImpl implements AsyncQueue {\n // The last promise in the queue.\n private tail: Promise;\n\n // A list of retryable operations. Retryable operations are run in order and\n // retried with backoff.\n private retryableOps: Array<() => Promise> = [];\n\n // Is this AsyncQueue being shut down? Once it is set to true, it will not\n // be changed again.\n private _isShuttingDown: boolean = false;\n\n // Operations scheduled to be queued in the future. Operations are\n // automatically removed after they are run or canceled.\n private delayedOperations: Array> = [];\n\n // visible for testing\n failure: FirestoreError | null = null;\n\n // Flag set while there's an outstanding AsyncQueue operation, used for\n // assertion sanity-checks.\n private operationInProgress = false;\n\n // Enabled during shutdown on Safari to prevent future access to IndexedDB.\n private skipNonRestrictedTasks = false;\n\n // List of TimerIds to fast-forward delays for.\n private timerIdsToSkip: TimerId[] = [];\n\n // Backoff timer used to schedule retries for retryable operations\n private backoff = new ExponentialBackoff(this, TimerId.AsyncQueueRetry);\n\n // Visibility handler that triggers an immediate retry of all retryable\n // operations. Meant to speed up recovery when we regain file system access\n // after page comes into foreground.\n private visibilityHandler: () => void = () => {\n const document = getDocument();\n if (document) {\n logDebug(\n LOG_TAG,\n 'Visibility state changed to ' + document.visibilityState\n );\n }\n this.backoff.skipBackoff();\n };\n\n constructor(tail: Promise = Promise.resolve()) {\n this.tail = tail;\n const document = getDocument();\n if (document && typeof document.addEventListener === 'function') {\n document.addEventListener('visibilitychange', this.visibilityHandler);\n }\n }\n\n get isShuttingDown(): boolean {\n return this._isShuttingDown;\n }\n\n /**\n * Adds a new operation to the queue without waiting for it to complete (i.e.\n * we ignore the Promise result).\n */\n enqueueAndForget(op: () => Promise): void {\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueue(op);\n }\n\n enqueueAndForgetEvenWhileRestricted(\n op: () => Promise\n ): void {\n this.verifyNotFailed();\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n this.enqueueInternal(op);\n }\n\n enterRestrictedMode(purgeExistingTasks?: boolean): void {\n if (!this._isShuttingDown) {\n this._isShuttingDown = true;\n this.skipNonRestrictedTasks = purgeExistingTasks || false;\n const document = getDocument();\n if (document && typeof document.removeEventListener === 'function') {\n document.removeEventListener(\n 'visibilitychange',\n this.visibilityHandler\n );\n }\n }\n }\n\n enqueue(op: () => Promise): Promise {\n this.verifyNotFailed();\n if (this._isShuttingDown) {\n // Return a Promise which never resolves.\n return new Promise(() => {});\n }\n\n // Create a deferred Promise that we can return to the callee. This\n // allows us to return a \"hanging Promise\" only to the callee and still\n // advance the queue even when the operation is not run.\n const task = new Deferred();\n return this.enqueueInternal(() => {\n if (this._isShuttingDown && this.skipNonRestrictedTasks) {\n // We do not resolve 'task'\n return Promise.resolve();\n }\n\n op().then(task.resolve, task.reject);\n return task.promise;\n }).then(() => task.promise);\n }\n\n enqueueRetryable(op: () => Promise): void {\n this.enqueueAndForget(() => {\n this.retryableOps.push(op);\n return this.retryNextOp();\n });\n }\n\n /**\n * Runs the next operation from the retryable queue. If the operation fails,\n * reschedules with backoff.\n */\n private async retryNextOp(): Promise {\n if (this.retryableOps.length === 0) {\n return;\n }\n\n try {\n await this.retryableOps[0]();\n this.retryableOps.shift();\n this.backoff.reset();\n } catch (e) {\n if (isIndexedDbTransactionError(e as Error)) {\n logDebug(LOG_TAG, 'Operation failed with retryable error: ' + e);\n } else {\n throw e; // Failure will be handled by AsyncQueue\n }\n }\n\n if (this.retryableOps.length > 0) {\n // If there are additional operations, we re-schedule `retryNextOp()`.\n // This is necessary to run retryable operations that failed during\n // their initial attempt since we don't know whether they are already\n // enqueued. If, for example, `op1`, `op2`, `op3` are enqueued and `op1`\n // needs to be re-run, we will run `op1`, `op1`, `op2` using the\n // already enqueued calls to `retryNextOp()`. `op3()` will then run in the\n // call scheduled here.\n // Since `backoffAndRun()` cancels an existing backoff and schedules a\n // new backoff on every call, there is only ever a single additional\n // operation in the queue.\n this.backoff.backoffAndRun(() => this.retryNextOp());\n }\n }\n\n private enqueueInternal(op: () => Promise): Promise {\n const newTail = this.tail.then(() => {\n this.operationInProgress = true;\n return op()\n .catch((error: FirestoreError) => {\n this.failure = error;\n this.operationInProgress = false;\n const message = getMessageOrStack(error);\n logError('INTERNAL UNHANDLED ERROR: ', message);\n\n // Re-throw the error so that this.tail becomes a rejected Promise and\n // all further attempts to chain (via .then) will just short-circuit\n // and return the rejected Promise.\n throw error;\n })\n .then(result => {\n this.operationInProgress = false;\n return result;\n });\n });\n this.tail = newTail;\n return newTail;\n }\n\n enqueueAfterDelay(\n timerId: TimerId,\n delayMs: number,\n op: () => Promise\n ): DelayedOperation {\n this.verifyNotFailed();\n\n debugAssert(\n delayMs >= 0,\n `Attempted to schedule an operation with a negative delay of ${delayMs}`\n );\n\n // Fast-forward delays for timerIds that have been overridden.\n if (this.timerIdsToSkip.indexOf(timerId) > -1) {\n delayMs = 0;\n }\n\n const delayedOp = DelayedOperation.createAndSchedule(\n this,\n timerId,\n delayMs,\n op,\n removedOp =>\n this.removeDelayedOperation(removedOp as DelayedOperation)\n );\n this.delayedOperations.push(delayedOp as DelayedOperation);\n return delayedOp;\n }\n\n private verifyNotFailed(): void {\n if (this.failure) {\n fail('AsyncQueue is already failed: ' + getMessageOrStack(this.failure));\n }\n }\n\n verifyOperationInProgress(): void {\n debugAssert(\n this.operationInProgress,\n 'verifyOpInProgress() called when no op in progress on this queue.'\n );\n }\n\n /**\n * Waits until all currently queued tasks are finished executing. Delayed\n * operations are not run.\n */\n async drain(): Promise {\n // Operations in the queue prior to draining may have enqueued additional\n // operations. Keep draining the queue until the tail is no longer advanced,\n // which indicates that no more new operations were enqueued and that all\n // operations were executed.\n let currentTail: Promise;\n do {\n currentTail = this.tail;\n await currentTail;\n } while (currentTail !== this.tail);\n }\n\n /**\n * For Tests: Determine if a delayed operation with a particular TimerId\n * exists.\n */\n containsDelayedOperation(timerId: TimerId): boolean {\n for (const op of this.delayedOperations) {\n if (op.timerId === timerId) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * For Tests: Runs some or all delayed operations early.\n *\n * @param lastTimerId - Delayed operations up to and including this TimerId\n * will be drained. Pass TimerId.All to run all delayed operations.\n * @returns a Promise that resolves once all operations have been run.\n */\n runAllDelayedOperationsUntil(lastTimerId: TimerId): Promise {\n // Note that draining may generate more delayed ops, so we do that first.\n return this.drain().then(() => {\n // Run ops in the same order they'd run if they ran naturally.\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */\n this.delayedOperations.sort((a, b) => a.targetTimeMs - b.targetTimeMs);\n\n for (const op of this.delayedOperations) {\n op.skipDelay();\n if (lastTimerId !== TimerId.All && op.timerId === lastTimerId) {\n break;\n }\n }\n\n return this.drain();\n });\n }\n\n /**\n * For Tests: Skip all subsequent delays for a timer id.\n */\n skipDelaysForTimerId(timerId: TimerId): void {\n this.timerIdsToSkip.push(timerId);\n }\n\n /** Called once a DelayedOperation is run or canceled. */\n private removeDelayedOperation(op: DelayedOperation): void {\n // NOTE: indexOf / slice are O(n), but delayedOperations is expected to be small.\n const index = this.delayedOperations.indexOf(op);\n debugAssert(index >= 0, 'Delayed operation not found.');\n /* eslint-disable-next-line @typescript-eslint/no-floating-promises */\n this.delayedOperations.splice(index, 1);\n }\n}\n\nexport function newAsyncQueue(): AsyncQueue {\n return new AsyncQueueImpl();\n}\n\n/**\n * Chrome includes Error.message in Error.stack. Other browsers do not.\n * This returns expected output of message + stack when available.\n * @param error - Error or FirestoreError\n */\nfunction getMessageOrStack(error: Error): string {\n let message = error.message || '';\n if (error.stack) {\n if (error.stack.includes(error.message)) {\n message = error.stack;\n } else {\n message = error.message + '\\n' + error.stack;\n }\n }\n return message;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n _getProvider,\n _removeServiceInstance,\n FirebaseApp,\n getApp\n} from '@firebase/app';\nimport { deepEqual, getDefaultEmulatorHostnameAndPort } from '@firebase/util';\n\nimport { User } from '../auth/user';\nimport {\n IndexedDbOfflineComponentProvider,\n MultiTabOfflineComponentProvider,\n OfflineComponentProvider,\n OfflineComponentProviderFactory,\n OnlineComponentProvider,\n OnlineComponentProviderFactory\n} from '../core/component_provider';\nimport { DatabaseId, DEFAULT_DATABASE_NAME } from '../core/database_info';\nimport {\n FirestoreClient,\n firestoreClientDisableNetwork,\n firestoreClientEnableNetwork,\n firestoreClientGetNamedQuery,\n firestoreClientLoadBundle,\n firestoreClientWaitForPendingWrites\n} from '../core/firestore_client';\nimport { makeDatabaseInfo } from '../lite-api/components';\nimport {\n connectFirestoreEmulator,\n Firestore as LiteFirestore\n} from '../lite-api/database';\nimport { Query } from '../lite-api/reference';\nimport {\n indexedDbClearPersistence,\n indexedDbStoragePrefix\n} from '../local/indexeddb_persistence';\nimport { LRU_COLLECTION_DISABLED } from '../local/lru_garbage_collector';\nimport { LRU_MINIMUM_CACHE_SIZE_BYTES } from '../local/lru_garbage_collector_impl';\nimport { debugAssert } from '../util/assert';\nimport { AsyncQueue } from '../util/async_queue';\nimport { AsyncQueueImpl } from '../util/async_queue_impl';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\nimport { logWarn } from '../util/log';\nimport { Deferred } from '../util/promise';\n\nimport { LoadBundleTask } from './bundle';\nimport { CredentialsProvider } from './credentials';\nimport { FirestoreSettings, PersistenceSettings } from './settings';\n\nexport {\n connectFirestoreEmulator,\n EmulatorMockTokenOptions\n} from '../lite-api/database';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'firestore': Firestore;\n }\n}\n\n/**\n * Constant used to indicate the LRU garbage collection should be disabled.\n * Set this value as the `cacheSizeBytes` on the settings passed to the\n * {@link Firestore} instance.\n */\nexport const CACHE_SIZE_UNLIMITED = LRU_COLLECTION_DISABLED;\n\n/**\n * The Cloud Firestore service interface.\n *\n * Do not call this constructor directly. Instead, use {@link (getFirestore:1)}.\n */\nexport class Firestore extends LiteFirestore {\n /**\n * Whether it's a {@link Firestore} or Firestore Lite instance.\n */\n type: 'firestore-lite' | 'firestore' = 'firestore';\n\n _queue: AsyncQueue = new AsyncQueueImpl();\n readonly _persistenceKey: string;\n\n _firestoreClient: FirestoreClient | undefined;\n\n _componentsProvider?: {\n _offline: OfflineComponentProviderFactory;\n _online: OnlineComponentProviderFactory;\n };\n\n /** @hideconstructor */\n constructor(\n authCredentialsProvider: CredentialsProvider,\n appCheckCredentialsProvider: CredentialsProvider,\n databaseId: DatabaseId,\n app?: FirebaseApp\n ) {\n super(\n authCredentialsProvider,\n appCheckCredentialsProvider,\n databaseId,\n app\n );\n this._persistenceKey = app?.name || '[DEFAULT]';\n }\n\n protected async _terminate(): Promise {\n if (this._firestoreClient) {\n const terminate = this._firestoreClient.terminate();\n this._queue = new AsyncQueueImpl(terminate);\n this._firestoreClient = undefined;\n await terminate;\n }\n }\n}\n\n/**\n * Initializes a new instance of {@link Firestore} with the provided settings.\n * Can only be called before any other function, including\n * {@link (getFirestore:1)}. If the custom settings are empty, this function is\n * equivalent to calling {@link (getFirestore:1)}.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} with which the {@link Firestore} instance will\n * be associated.\n * @param settings - A settings object to configure the {@link Firestore} instance.\n * @param databaseId - The name of the database.\n * @returns A newly initialized {@link Firestore} instance.\n */\nexport function initializeFirestore(\n app: FirebaseApp,\n settings: FirestoreSettings,\n databaseId?: string\n): Firestore {\n if (!databaseId) {\n databaseId = DEFAULT_DATABASE_NAME;\n }\n const provider = _getProvider(app, 'firestore');\n\n if (provider.isInitialized(databaseId)) {\n const existingInstance = provider.getImmediate({\n identifier: databaseId\n });\n const initialSettings = provider.getOptions(\n databaseId\n ) as FirestoreSettings;\n if (deepEqual(initialSettings, settings)) {\n return existingInstance;\n } else {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'initializeFirestore() has already been called with ' +\n 'different options. To avoid this error, call initializeFirestore() with the ' +\n 'same options as when it was originally called, or call getFirestore() to return the' +\n ' already initialized instance.'\n );\n }\n }\n\n if (\n settings.cacheSizeBytes !== undefined &&\n settings.localCache !== undefined\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `cache and cacheSizeBytes cannot be specified at the same time as cacheSizeBytes will` +\n `be deprecated. Instead, specify the cache size in the cache object`\n );\n }\n\n if (\n settings.cacheSizeBytes !== undefined &&\n settings.cacheSizeBytes !== CACHE_SIZE_UNLIMITED &&\n settings.cacheSizeBytes < LRU_MINIMUM_CACHE_SIZE_BYTES\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `cacheSizeBytes must be at least ${LRU_MINIMUM_CACHE_SIZE_BYTES}`\n );\n }\n\n return provider.initialize({\n options: settings,\n instanceIdentifier: databaseId\n });\n}\n\n/**\n * Returns the existing default {@link Firestore} instance that is associated with the\n * default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @returns The default {@link Firestore} instance of the default app.\n */\nexport function getFirestore(): Firestore;\n/**\n * Returns the existing default {@link Firestore} instance that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}\n * instance is associated with.\n * @returns The default {@link Firestore} instance of the provided app.\n */\nexport function getFirestore(app: FirebaseApp): Firestore;\n/**\n * Returns the existing named {@link Firestore} instance that is associated with the\n * default {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param databaseId - The name of the database.\n * @returns The named {@link Firestore} instance of the default app.\n * @beta\n */\nexport function getFirestore(databaseId: string): Firestore;\n/**\n * Returns the existing named {@link Firestore} instance that is associated with the\n * provided {@link @firebase/app#FirebaseApp}. If no instance exists, initializes a new\n * instance with default settings.\n *\n * @param app - The {@link @firebase/app#FirebaseApp} instance that the returned {@link Firestore}\n * instance is associated with.\n * @param databaseId - The name of the database.\n * @returns The named {@link Firestore} instance of the provided app.\n * @beta\n */\nexport function getFirestore(app: FirebaseApp, databaseId: string): Firestore;\nexport function getFirestore(\n appOrDatabaseId?: FirebaseApp | string,\n optionalDatabaseId?: string\n): Firestore {\n const app: FirebaseApp =\n typeof appOrDatabaseId === 'object' ? appOrDatabaseId : getApp();\n const databaseId =\n typeof appOrDatabaseId === 'string'\n ? appOrDatabaseId\n : optionalDatabaseId || DEFAULT_DATABASE_NAME;\n const db = _getProvider(app, 'firestore').getImmediate({\n identifier: databaseId\n }) as Firestore;\n if (!db._initialized) {\n const emulator = getDefaultEmulatorHostnameAndPort('firestore');\n if (emulator) {\n connectFirestoreEmulator(db, ...emulator);\n }\n }\n return db;\n}\n\n/**\n * @internal\n */\nexport function ensureFirestoreConfigured(\n firestore: Firestore\n): FirestoreClient {\n if (firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'The client has already been terminated.'\n );\n }\n if (!firestore._firestoreClient) {\n configureFirestore(firestore);\n }\n return firestore._firestoreClient as FirestoreClient;\n}\n\nexport function configureFirestore(firestore: Firestore): void {\n const settings = firestore._freezeSettings();\n debugAssert(!!settings.host, 'FirestoreSettings.host is not set');\n debugAssert(\n !firestore._firestoreClient,\n 'configureFirestore() called multiple times'\n );\n\n const databaseInfo = makeDatabaseInfo(\n firestore._databaseId,\n firestore._app?.options.appId || '',\n firestore._persistenceKey,\n settings\n );\n if (!firestore._componentsProvider) {\n if (\n settings.localCache?._offlineComponentProvider &&\n settings.localCache?._onlineComponentProvider\n ) {\n firestore._componentsProvider = {\n _offline: settings.localCache._offlineComponentProvider,\n _online: settings.localCache._onlineComponentProvider\n };\n }\n }\n firestore._firestoreClient = new FirestoreClient(\n firestore._authCredentials,\n firestore._appCheckCredentials,\n firestore._queue,\n databaseInfo,\n firestore._componentsProvider &&\n buildComponentProvider(firestore._componentsProvider)\n );\n}\n\nfunction buildComponentProvider(componentsProvider: {\n _offline: OfflineComponentProviderFactory;\n _online: OnlineComponentProviderFactory;\n}): {\n _offline: OfflineComponentProvider;\n _online: OnlineComponentProvider;\n} {\n const online = componentsProvider?._online.build();\n return {\n _offline: componentsProvider?._offline.build(online),\n _online: online\n };\n}\n\n/**\n * Attempts to enable persistent storage, if possible.\n *\n * On failure, `enableIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * Note: `enableIndexedDbPersistence()` must be called before any other functions\n * (other than {@link initializeFirestore}, {@link (getFirestore:1)} or\n * {@link clearIndexedDbPersistence}.\n *\n * Persistence cannot be used in a Node.js environment.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @param persistenceSettings - Optional settings object to configure\n * persistence.\n * @returns A `Promise` that represents successfully enabling persistent storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on IndexedDb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */\nexport function enableIndexedDbPersistence(\n firestore: Firestore,\n persistenceSettings?: PersistenceSettings\n): Promise {\n logWarn(\n 'enableIndexedDbPersistence() will be deprecated in the future, ' +\n 'you can use `FirestoreSettings.cache` instead.'\n );\n const settings = firestore._freezeSettings();\n\n setPersistenceProviders(firestore, OnlineComponentProvider.provider, {\n build: (onlineComponents: OnlineComponentProvider) =>\n new IndexedDbOfflineComponentProvider(\n onlineComponents,\n settings.cacheSizeBytes,\n persistenceSettings?.forceOwnership\n )\n });\n return Promise.resolve();\n}\n\n/**\n * Attempts to enable multi-tab persistent storage, if possible. If enabled\n * across all tabs, all operations share access to local persistence, including\n * shared execution of queries and latency-compensated local document updates\n * across all connected instances.\n *\n * On failure, `enableMultiTabIndexedDbPersistence()` will reject the promise or\n * throw an exception. There are several reasons why this can fail, which can be\n * identified by the `code` on the error.\n *\n * * failed-precondition: The app is already open in another browser tab and\n * multi-tab is not enabled.\n * * unimplemented: The browser is incompatible with the offline persistence\n * implementation.\n *\n * Note that even after a failure, the {@link Firestore} instance will remain\n * usable, however offline persistence will be disabled.\n *\n * @param firestore - The {@link Firestore} instance to enable persistence for.\n * @returns A `Promise` that represents successfully enabling persistent\n * storage.\n * @deprecated This function will be removed in a future major release. Instead, set\n * `FirestoreSettings.localCache` to an instance of `PersistentLocalCache` to\n * turn on indexeddb cache. Calling this function when `FirestoreSettings.localCache`\n * is already specified will throw an exception.\n */\nexport async function enableMultiTabIndexedDbPersistence(\n firestore: Firestore\n): Promise {\n logWarn(\n 'enableMultiTabIndexedDbPersistence() will be deprecated in the future, ' +\n 'you can use `FirestoreSettings.cache` instead.'\n );\n const settings = firestore._freezeSettings();\n\n setPersistenceProviders(firestore, OnlineComponentProvider.provider, {\n build: (onlineComponents: OnlineComponentProvider) =>\n new MultiTabOfflineComponentProvider(\n onlineComponents,\n settings.cacheSizeBytes\n )\n });\n}\n\n/**\n * Registers both the `OfflineComponentProvider` and `OnlineComponentProvider`.\n * If the operation fails with a recoverable error (see\n * `canRecoverFromIndexedDbError()` below), the returned Promise is rejected\n * but the client remains usable.\n */\nfunction setPersistenceProviders(\n firestore: Firestore,\n onlineComponentProvider: OnlineComponentProviderFactory,\n offlineComponentProvider: OfflineComponentProviderFactory\n): void {\n firestore = cast(firestore, Firestore);\n if (firestore._firestoreClient || firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Firestore has already been started and persistence can no longer be ' +\n 'enabled. You can only enable persistence before calling any other ' +\n 'methods on a Firestore object.'\n );\n }\n\n if (firestore._componentsProvider || firestore._getSettings().localCache) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'SDK cache is already specified.'\n );\n }\n\n firestore._componentsProvider = {\n _online: onlineComponentProvider,\n _offline: offlineComponentProvider\n };\n\n configureFirestore(firestore);\n}\n\n/**\n * Clears the persistent storage. This includes pending writes and cached\n * documents.\n *\n * Must be called while the {@link Firestore} instance is not started (after the app is\n * terminated or when the app is first initialized). On startup, this function\n * must be called before other functions (other than {@link\n * initializeFirestore} or {@link (getFirestore:1)})). If the {@link Firestore}\n * instance is still running, the promise will be rejected with the error code\n * of `failed-precondition`.\n *\n * Note: `clearIndexedDbPersistence()` is primarily intended to help write\n * reliable tests that use Cloud Firestore. It uses an efficient mechanism for\n * dropping existing data but does not attempt to securely overwrite or\n * otherwise make cached data unrecoverable. For applications that are sensitive\n * to the disclosure of cached data in between user sessions, we strongly\n * recommend not enabling persistence at all.\n *\n * @param firestore - The {@link Firestore} instance to clear persistence for.\n * @returns A `Promise` that is resolved when the persistent storage is\n * cleared. Otherwise, the promise is rejected with an error.\n */\nexport function clearIndexedDbPersistence(firestore: Firestore): Promise {\n if (firestore._initialized && !firestore._terminated) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'Persistence can only be cleared before a Firestore instance is ' +\n 'initialized or after it is terminated.'\n );\n }\n\n const deferred = new Deferred();\n firestore._queue.enqueueAndForgetEvenWhileRestricted(async () => {\n try {\n await indexedDbClearPersistence(\n indexedDbStoragePrefix(firestore._databaseId, firestore._persistenceKey)\n );\n deferred.resolve();\n } catch (e) {\n deferred.reject(e as Error | undefined);\n }\n });\n return deferred.promise;\n}\n\n/**\n * Waits until all currently pending writes for the active user have been\n * acknowledged by the backend.\n *\n * The returned promise resolves immediately if there are no outstanding writes.\n * Otherwise, the promise waits for all previously issued writes (including\n * those written in a previous app session), but it does not wait for writes\n * that were added after the function is called. If you want to wait for\n * additional writes, call `waitForPendingWrites()` again.\n *\n * Any outstanding `waitForPendingWrites()` promises are rejected during user\n * changes.\n *\n * @returns A `Promise` which resolves when all currently pending writes have been\n * acknowledged by the backend.\n */\nexport function waitForPendingWrites(firestore: Firestore): Promise {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientWaitForPendingWrites(client);\n}\n\n/**\n * Re-enables use of the network for this {@link Firestore} instance after a prior\n * call to {@link disableNetwork}.\n *\n * @returns A `Promise` that is resolved once the network has been enabled.\n */\nexport function enableNetwork(firestore: Firestore): Promise {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientEnableNetwork(client);\n}\n\n/**\n * Disables network usage for this instance. It can be re-enabled via {@link\n * enableNetwork}. While the network is disabled, any snapshot listeners,\n * `getDoc()` or `getDocs()` calls will return results from cache, and any write\n * operations will be queued until the network is restored.\n *\n * @returns A `Promise` that is resolved once the network has been disabled.\n */\nexport function disableNetwork(firestore: Firestore): Promise {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientDisableNetwork(client);\n}\n\n/**\n * Terminates the provided {@link Firestore} instance.\n *\n * After calling `terminate()` only the `clearIndexedDbPersistence()` function\n * may be used. Any other function will throw a `FirestoreError`.\n *\n * To restart after termination, create a new instance of FirebaseFirestore with\n * {@link (getFirestore:1)}.\n *\n * Termination does not cancel any pending writes, and any promises that are\n * awaiting a response from the server will not be resolved. If you have\n * persistence enabled, the next time you start this instance, it will resume\n * sending these writes to the server.\n *\n * Note: Under normal circumstances, calling `terminate()` is not required. This\n * function is useful only when you want to force this instance to release all\n * of its resources or in combination with `clearIndexedDbPersistence()` to\n * ensure that all local state is destroyed between test runs.\n *\n * @returns A `Promise` that is resolved when the instance has been successfully\n * terminated.\n */\nexport function terminate(firestore: Firestore): Promise {\n _removeServiceInstance(\n firestore.app,\n 'firestore',\n firestore._databaseId.database\n );\n return firestore._delete();\n}\n\n/**\n * Loads a Firestore bundle into the local cache.\n *\n * @param firestore - The {@link Firestore} instance to load bundles for.\n * @param bundleData - An object representing the bundle to be loaded. Valid\n * objects are `ArrayBuffer`, `ReadableStream` or `string`.\n *\n * @returns A `LoadBundleTask` object, which notifies callers with progress\n * updates, and completion or error events. It can be used as a\n * `Promise`.\n */\nexport function loadBundle(\n firestore: Firestore,\n bundleData: ReadableStream | ArrayBuffer | string\n): LoadBundleTask {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const resultTask = new LoadBundleTask();\n firestoreClientLoadBundle(\n client,\n firestore._databaseId,\n bundleData,\n resultTask\n );\n return resultTask;\n}\n\n/**\n * Reads a Firestore {@link Query} from local cache, identified by the given\n * name.\n *\n * The named queries are packaged into bundles on the server side (along\n * with resulting documents), and loaded to local cache using `loadBundle`. Once\n * in local cache, use this method to extract a {@link Query} by name.\n *\n * @param firestore - The {@link Firestore} instance to read the query from.\n * @param name - The name of the query.\n * @returns A `Promise` that is resolved with the Query or `null`.\n */\nexport function namedQuery(\n firestore: Firestore,\n name: string\n): Promise {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientGetNamedQuery(client, name).then(namedQuery => {\n if (!namedQuery) {\n return null;\n }\n\n return new Query(firestore, null, namedQuery.query);\n });\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ByteString } from '../util/byte_string';\nimport { Code, FirestoreError } from '../util/error';\n\n/**\n * An immutable object representing an array of bytes.\n */\nexport class Bytes {\n _byteString: ByteString;\n\n /** @hideconstructor */\n constructor(byteString: ByteString) {\n this._byteString = byteString;\n }\n\n /**\n * Creates a new `Bytes` object from the given Base64 string, converting it to\n * bytes.\n *\n * @param base64 - The Base64 string used to create the `Bytes` object.\n */\n static fromBase64String(base64: string): Bytes {\n try {\n return new Bytes(ByteString.fromBase64String(base64));\n } catch (e) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Failed to construct data from Base64 string: ' + e\n );\n }\n }\n\n /**\n * Creates a new `Bytes` object from the given Uint8Array.\n *\n * @param array - The Uint8Array used to create the `Bytes` object.\n */\n static fromUint8Array(array: Uint8Array): Bytes {\n return new Bytes(ByteString.fromUint8Array(array));\n }\n\n /**\n * Returns the underlying bytes as a Base64-encoded string.\n *\n * @returns The Base64-encoded string created from the `Bytes` object.\n */\n toBase64(): string {\n return this._byteString.toBase64();\n }\n\n /**\n * Returns the underlying bytes in a new `Uint8Array`.\n *\n * @returns The Uint8Array created from the `Bytes` object.\n */\n toUint8Array(): Uint8Array {\n return this._byteString.toUint8Array();\n }\n\n /**\n * Returns a string representation of the `Bytes` object.\n *\n * @returns A string representation of the `Bytes` object.\n */\n toString(): string {\n return 'Bytes(base64: ' + this.toBase64() + ')';\n }\n\n /**\n * Returns true if this `Bytes` object is equal to the provided one.\n *\n * @param other - The `Bytes` object to compare against.\n * @returns true if this `Bytes` object is equal to the provided one.\n */\n isEqual(other: Bytes): boolean {\n return this._byteString.isEqual(other._byteString);\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DOCUMENT_KEY_NAME,\n FieldPath as InternalFieldPath\n} from '../model/path';\nimport { Code, FirestoreError } from '../util/error';\n\n/**\n * A `FieldPath` refers to a field in a document. The path may consist of a\n * single field name (referring to a top-level field in the document), or a\n * list of field names (referring to a nested field in the document).\n *\n * Create a `FieldPath` by providing field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n */\nexport class FieldPath {\n /** Internal representation of a Firestore field path. */\n readonly _internalPath: InternalFieldPath;\n\n /**\n * Creates a `FieldPath` from the provided field names. If more than one field\n * name is provided, the path will point to a nested field in a document.\n *\n * @param fieldNames - A list of field names.\n */\n constructor(...fieldNames: string[]) {\n for (let i = 0; i < fieldNames.length; ++i) {\n if (fieldNames[i].length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid field name at argument $(i + 1). ` +\n 'Field names must not be empty.'\n );\n }\n }\n\n this._internalPath = new InternalFieldPath(fieldNames);\n }\n\n /**\n * Returns true if this `FieldPath` is equal to the provided one.\n *\n * @param other - The `FieldPath` to compare against.\n * @returns true if this `FieldPath` is equal to the provided one.\n */\n isEqual(other: FieldPath): boolean {\n return this._internalPath.isEqual(other._internalPath);\n }\n}\n\n/**\n * Returns a special sentinel `FieldPath` to refer to the ID of a document.\n * It can be used in queries to sort or filter by the document ID.\n */\nexport function documentId(): FieldPath {\n return new FieldPath(DOCUMENT_KEY_NAME);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { ParseContext } from '../api/parse_context';\nimport { FieldTransform } from '../model/mutation';\n\n/**\n * Sentinel values that can be used when writing document fields with `set()`\n * or `update()`.\n */\nexport abstract class FieldValue {\n /**\n * @param _methodName - The public API endpoint that returns this class.\n * @hideconstructor\n */\n constructor(public _methodName: string) {}\n\n /** Compares `FieldValue`s for equality. */\n abstract isEqual(other: FieldValue): boolean;\n abstract _toFieldTransform(context: ParseContext): FieldTransform | null;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\nimport { primitiveComparator } from '../util/misc';\n\n/**\n * An immutable object representing a geographic location in Firestore. The\n * location is represented as latitude/longitude pair.\n *\n * Latitude values are in the range of [-90, 90].\n * Longitude values are in the range of [-180, 180].\n */\nexport class GeoPoint {\n // Prefix with underscore to signal this is a private variable in JS and\n // prevent it showing up for autocompletion when typing latitude or longitude.\n private _lat: number;\n private _long: number;\n\n /**\n * Creates a new immutable `GeoPoint` object with the provided latitude and\n * longitude values.\n * @param latitude - The latitude as number between -90 and 90.\n * @param longitude - The longitude as number between -180 and 180.\n */\n constructor(latitude: number, longitude: number) {\n if (!isFinite(latitude) || latitude < -90 || latitude > 90) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Latitude must be a number between -90 and 90, but was: ' + latitude\n );\n }\n if (!isFinite(longitude) || longitude < -180 || longitude > 180) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Longitude must be a number between -180 and 180, but was: ' + longitude\n );\n }\n\n this._lat = latitude;\n this._long = longitude;\n }\n\n /**\n * The latitude of this `GeoPoint` instance.\n */\n get latitude(): number {\n return this._lat;\n }\n\n /**\n * The longitude of this `GeoPoint` instance.\n */\n get longitude(): number {\n return this._long;\n }\n\n /**\n * Returns true if this `GeoPoint` is equal to the provided one.\n *\n * @param other - The `GeoPoint` to compare against.\n * @returns true if this `GeoPoint` is equal to the provided one.\n */\n isEqual(other: GeoPoint): boolean {\n return this._lat === other._lat && this._long === other._long;\n }\n\n /** Returns a JSON-serializable representation of this GeoPoint. */\n toJSON(): { latitude: number; longitude: number } {\n return { latitude: this._lat, longitude: this._long };\n }\n\n /**\n * Actually private to JS consumers of our API, so this function is prefixed\n * with an underscore.\n */\n _compareTo(other: GeoPoint): number {\n return (\n primitiveComparator(this._lat, other._lat) ||\n primitiveComparator(this._long, other._long)\n );\n }\n}\n","/**\n * @license\n * Copyright 2024 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { isPrimitiveArrayEqual } from '../util/array';\n\n/**\n * Represents a vector type in Firestore documents.\n * Create an instance with {@link FieldValue.vector}.\n *\n * @class VectorValue\n */\nexport class VectorValue {\n private readonly _values: number[];\n\n /**\n * @private\n * @internal\n */\n constructor(values: number[] | undefined) {\n // Making a copy of the parameter.\n this._values = (values || []).map(n => n);\n }\n\n /**\n * Returns a copy of the raw number array form of the vector.\n */\n toArray(): number[] {\n return this._values.map(n => n);\n }\n\n /**\n * Returns `true` if the two VectorValue has the same raw number arrays, returns `false` otherwise.\n */\n isEqual(other: VectorValue): boolean {\n return isPrimitiveArrayEqual(this._values, other._values);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Returns true iff the array contains the value using strong equality.\n */\nexport function includes(array: T[], value: T): boolean {\n for (let i = 0; i < array.length; i++) {\n if (array[i] === value) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Returns true iff the array contains any value matching the predicate\n */\nexport function some(array: T[], predicate: (t: T) => boolean): boolean {\n for (let i = 0; i < array.length; i++) {\n if (predicate(array[i])) {\n return true;\n }\n }\n return false;\n}\n\n/**\n * Calls predicate function for each item in the array until the predicate\n * returns true, at which point the index of that item is returned. If the\n * predicate does not return true for any item, null is returned.\n */\nexport function findIndex(\n array: A[],\n predicate: (value: A) => boolean\n): number | null {\n for (let i = 0; i < array.length; i++) {\n if (predicate(array[i])) {\n return i;\n }\n }\n return null;\n}\n\n/**\n * Compares two array for equality using comparator. The method computes the\n * intersection and invokes `onAdd` for every element that is in `after` but not\n * `before`. `onRemove` is invoked for every element in `before` but missing\n * from `after`.\n *\n * The method creates a copy of both `before` and `after` and runs in O(n log\n * n), where n is the size of the two lists.\n *\n * @param before - The elements that exist in the original array.\n * @param after - The elements to diff against the original array.\n * @param comparator - The comparator for the elements in before and after.\n * @param onAdd - A function to invoke for every element that is part of `\n * after` but not `before`.\n * @param onRemove - A function to invoke for every element that is part of\n * `before` but not `after`.\n */\nexport function diffArrays(\n before: T[],\n after: T[],\n comparator: (l: T, r: T) => number,\n onAdd: (entry: T) => void,\n onRemove: (entry: T) => void\n): void {\n before = [...before];\n after = [...after];\n before.sort(comparator);\n after.sort(comparator);\n\n const bLen = before.length;\n const aLen = after.length;\n let a = 0;\n let b = 0;\n while (a < aLen && b < bLen) {\n const cmp = comparator(before[b], after[a]);\n if (cmp < 0) {\n // The element was removed if the next element in our ordered\n // walkthrough is only in `before`.\n onRemove(before[b++]);\n } else if (cmp > 0) {\n // The element was added if the next element in our ordered walkthrough\n // is only in `after`.\n onAdd(after[a++]);\n } else {\n a++;\n b++;\n }\n }\n while (a < aLen) {\n onAdd(after[a++]);\n }\n while (b < bLen) {\n onRemove(before[b++]);\n }\n}\n\n/**\n * Verifies equality for an array of objects using the `isEqual` interface.\n *\n * @private\n * @internal\n * @param left Array of objects supporting `isEqual`.\n * @param right Array of objects supporting `isEqual`.\n * @return True if arrays are equal.\n */\nexport function isArrayEqual boolean }>(\n left: T[],\n right: T[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let i = 0; i < left.length; ++i) {\n if (!left[i].isEqual(right[i])) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Verifies equality for an array of primitives.\n *\n * @private\n * @internal\n * @param left Array of primitives.\n * @param right Array of primitives.\n * @return True if arrays are equal.\n */\nexport function isPrimitiveArrayEqual(\n left: T[],\n right: T[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n\n for (let i = 0; i < left.length; ++i) {\n if (left[i] !== right[i]) {\n return false;\n }\n }\n\n return true;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DocumentData,\n FieldPath as PublicFieldPath,\n SetOptions\n} from '@firebase/firestore-types';\nimport { Compat, deepEqual, getModularInstance } from '@firebase/util';\n\nimport { ParseContext } from '../api/parse_context';\nimport { DatabaseId } from '../core/database_info';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldMask } from '../model/field_mask';\nimport {\n FieldTransform,\n Mutation,\n PatchMutation,\n Precondition,\n SetMutation\n} from '../model/mutation';\nimport { ObjectValue } from '../model/object_value';\nimport { FieldPath as InternalFieldPath } from '../model/path';\nimport {\n ArrayRemoveTransformOperation,\n ArrayUnionTransformOperation,\n NumericIncrementTransformOperation,\n ServerTimestampTransform\n} from '../model/transform_operation';\nimport {\n TYPE_KEY,\n VECTOR_MAP_VECTORS_KEY,\n VECTOR_VALUE_SENTINEL\n} from '../model/values';\nimport { newSerializer } from '../platform/serializer';\nimport {\n MapValue as ProtoMapValue,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { toDouble, toNumber } from '../remote/number_serializer';\nimport {\n JsonProtoSerializer,\n toBytes,\n toResourceName,\n toTimestamp\n} from '../remote/serializer';\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\nimport { isPlainObject, valueDescription } from '../util/input_validation';\nimport { Dict, forEach, isEmpty } from '../util/obj';\n\nimport { Bytes } from './bytes';\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport { FieldValue } from './field_value';\nimport { GeoPoint } from './geo_point';\nimport {\n DocumentReference,\n PartialWithFieldValue,\n WithFieldValue\n} from './reference';\nimport { Timestamp } from './timestamp';\nimport { VectorValue } from './vector_value';\n\nconst RESERVED_FIELD_REGEX = /^__.*__$/;\n\n/**\n * An untyped Firestore Data Converter interface that is shared between the\n * lite, firestore-exp and classic SDK.\n */\nexport interface UntypedFirestoreDataConverter<\n AppModelType,\n DbModelType extends DocumentData = DocumentData\n> {\n toFirestore(\n modelObject: WithFieldValue\n ): WithFieldValue;\n toFirestore(\n modelObject: PartialWithFieldValue,\n options: SetOptions\n ): PartialWithFieldValue;\n fromFirestore(snapshot: unknown, options?: unknown): AppModelType;\n}\n\n/** The result of parsing document data (e.g. for a setData call). */\nexport class ParsedSetData {\n constructor(\n readonly data: ObjectValue,\n readonly fieldMask: FieldMask | null,\n readonly fieldTransforms: FieldTransform[]\n ) {}\n\n toMutation(key: DocumentKey, precondition: Precondition): Mutation {\n if (this.fieldMask !== null) {\n return new PatchMutation(\n key,\n this.data,\n this.fieldMask,\n precondition,\n this.fieldTransforms\n );\n } else {\n return new SetMutation(\n key,\n this.data,\n precondition,\n this.fieldTransforms\n );\n }\n }\n}\n\n/** The result of parsing \"update\" data (i.e. for an updateData call). */\nexport class ParsedUpdateData {\n constructor(\n readonly data: ObjectValue,\n // The fieldMask does not include document transforms.\n readonly fieldMask: FieldMask,\n readonly fieldTransforms: FieldTransform[]\n ) {}\n\n toMutation(key: DocumentKey, precondition: Precondition): Mutation {\n return new PatchMutation(\n key,\n this.data,\n this.fieldMask,\n precondition,\n this.fieldTransforms\n );\n }\n}\n\n/*\n * Represents what type of API method provided the data being parsed; useful\n * for determining which error conditions apply during parsing and providing\n * better error messages.\n */\nexport const enum UserDataSource {\n Set,\n Update,\n MergeSet,\n /**\n * Indicates the source is a where clause, cursor bound, arrayUnion()\n * element, etc. Of note, isWrite(source) will return false.\n */\n Argument,\n /**\n * Indicates that the source is an Argument that may directly contain nested\n * arrays (e.g. the operand of an `in` query).\n */\n ArrayArgument\n}\n\nfunction isWrite(dataSource: UserDataSource): boolean {\n switch (dataSource) {\n case UserDataSource.Set: // fall through\n case UserDataSource.MergeSet: // fall through\n case UserDataSource.Update:\n return true;\n case UserDataSource.Argument:\n case UserDataSource.ArrayArgument:\n return false;\n default:\n throw fail(`Unexpected case for UserDataSource: ${dataSource}`);\n }\n}\n\n/** Contains the settings that are mutated as we parse user data. */\ninterface ContextSettings {\n /** Indicates what kind of API method this data came from. */\n readonly dataSource: UserDataSource;\n /** The name of the method the user called to create the ParseContext. */\n readonly methodName: string;\n /** The document the user is attempting to modify, if that applies. */\n readonly targetDoc?: DocumentKey;\n /**\n * A path within the object being parsed. This could be an empty path (in\n * which case the context represents the root of the data being parsed), or a\n * nonempty path (indicating the context represents a nested location within\n * the data).\n */\n readonly path?: InternalFieldPath;\n /**\n * Whether or not this context corresponds to an element of an array.\n * If not set, elements are treated as if they were outside of arrays.\n */\n readonly arrayElement?: boolean;\n /**\n * Whether or not a converter was specified in this context. If true, error\n * messages will reference the converter when invalid data is provided.\n */\n readonly hasConverter?: boolean;\n}\n\n/** A \"context\" object passed around while parsing user data. */\nclass ParseContextImpl implements ParseContext {\n readonly fieldTransforms: FieldTransform[];\n readonly fieldMask: InternalFieldPath[];\n /**\n * Initializes a ParseContext with the given source and path.\n *\n * @param settings - The settings for the parser.\n * @param databaseId - The database ID of the Firestore instance.\n * @param serializer - The serializer to use to generate the Value proto.\n * @param ignoreUndefinedProperties - Whether to ignore undefined properties\n * rather than throw.\n * @param fieldTransforms - A mutable list of field transforms encountered\n * while parsing the data.\n * @param fieldMask - A mutable list of field paths encountered while parsing\n * the data.\n *\n * TODO(b/34871131): We don't support array paths right now, so path can be\n * null to indicate the context represents any location within an array (in\n * which case certain features will not work and errors will be somewhat\n * compromised).\n */\n constructor(\n readonly settings: ContextSettings,\n readonly databaseId: DatabaseId,\n readonly serializer: JsonProtoSerializer,\n readonly ignoreUndefinedProperties: boolean,\n fieldTransforms?: FieldTransform[],\n fieldMask?: InternalFieldPath[]\n ) {\n // Minor hack: If fieldTransforms is undefined, we assume this is an\n // external call and we need to validate the entire path.\n if (fieldTransforms === undefined) {\n this.validatePath();\n }\n this.fieldTransforms = fieldTransforms || [];\n this.fieldMask = fieldMask || [];\n }\n\n get path(): InternalFieldPath | undefined {\n return this.settings.path;\n }\n\n get dataSource(): UserDataSource {\n return this.settings.dataSource;\n }\n\n /** Returns a new context with the specified settings overwritten. */\n contextWith(configuration: Partial): ParseContextImpl {\n return new ParseContextImpl(\n { ...this.settings, ...configuration },\n this.databaseId,\n this.serializer,\n this.ignoreUndefinedProperties,\n this.fieldTransforms,\n this.fieldMask\n );\n }\n\n childContextForField(field: string): ParseContextImpl {\n const childPath = this.path?.child(field);\n const context = this.contextWith({ path: childPath, arrayElement: false });\n context.validatePathSegment(field);\n return context;\n }\n\n childContextForFieldPath(field: InternalFieldPath): ParseContextImpl {\n const childPath = this.path?.child(field);\n const context = this.contextWith({ path: childPath, arrayElement: false });\n context.validatePath();\n return context;\n }\n\n childContextForArray(index: number): ParseContextImpl {\n // TODO(b/34871131): We don't support array paths right now; so make path\n // undefined.\n return this.contextWith({ path: undefined, arrayElement: true });\n }\n\n createError(reason: string): FirestoreError {\n return createError(\n reason,\n this.settings.methodName,\n this.settings.hasConverter || false,\n this.path,\n this.settings.targetDoc\n );\n }\n\n /** Returns 'true' if 'fieldPath' was traversed when creating this context. */\n contains(fieldPath: InternalFieldPath): boolean {\n return (\n this.fieldMask.find(field => fieldPath.isPrefixOf(field)) !== undefined ||\n this.fieldTransforms.find(transform =>\n fieldPath.isPrefixOf(transform.field)\n ) !== undefined\n );\n }\n\n private validatePath(): void {\n // TODO(b/34871131): Remove null check once we have proper paths for fields\n // within arrays.\n if (!this.path) {\n return;\n }\n for (let i = 0; i < this.path.length; i++) {\n this.validatePathSegment(this.path.get(i));\n }\n }\n\n private validatePathSegment(segment: string): void {\n if (segment.length === 0) {\n throw this.createError('Document fields must not be empty');\n }\n if (isWrite(this.dataSource) && RESERVED_FIELD_REGEX.test(segment)) {\n throw this.createError('Document fields cannot begin and end with \"__\"');\n }\n }\n}\n\n/**\n * Helper for parsing raw user input (provided via the API) into internal model\n * classes.\n */\nexport class UserDataReader {\n private readonly serializer: JsonProtoSerializer;\n\n constructor(\n private readonly databaseId: DatabaseId,\n private readonly ignoreUndefinedProperties: boolean,\n serializer?: JsonProtoSerializer\n ) {\n this.serializer = serializer || newSerializer(databaseId);\n }\n\n /** Creates a new top-level parse context. */\n createContext(\n dataSource: UserDataSource,\n methodName: string,\n targetDoc?: DocumentKey,\n hasConverter = false\n ): ParseContextImpl {\n return new ParseContextImpl(\n {\n dataSource,\n methodName,\n targetDoc,\n path: InternalFieldPath.emptyPath(),\n arrayElement: false,\n hasConverter\n },\n this.databaseId,\n this.serializer,\n this.ignoreUndefinedProperties\n );\n }\n}\n\nexport function newUserDataReader(firestore: Firestore): UserDataReader {\n const settings = firestore._freezeSettings();\n const serializer = newSerializer(firestore._databaseId);\n return new UserDataReader(\n firestore._databaseId,\n !!settings.ignoreUndefinedProperties,\n serializer\n );\n}\n\n/** Parse document data from a set() call. */\nexport function parseSetData(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n input: unknown,\n hasConverter: boolean,\n options: SetOptions = {}\n): ParsedSetData {\n const context = userDataReader.createContext(\n options.merge || options.mergeFields\n ? UserDataSource.MergeSet\n : UserDataSource.Set,\n methodName,\n targetDoc,\n hasConverter\n );\n validatePlainObject('Data must be an object, but it was:', context, input);\n const updateData = parseObject(input, context)!;\n\n let fieldMask: FieldMask | null;\n let fieldTransforms: FieldTransform[];\n\n if (options.merge) {\n fieldMask = new FieldMask(context.fieldMask);\n fieldTransforms = context.fieldTransforms;\n } else if (options.mergeFields) {\n const validatedFieldPaths: InternalFieldPath[] = [];\n\n for (const stringOrFieldPath of options.mergeFields) {\n const fieldPath = fieldPathFromArgument(\n methodName,\n stringOrFieldPath,\n targetDoc\n );\n if (!context.contains(fieldPath)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Field '${fieldPath}' is specified in your field mask but missing from your input data.`\n );\n }\n\n if (!fieldMaskContains(validatedFieldPaths, fieldPath)) {\n validatedFieldPaths.push(fieldPath);\n }\n }\n\n fieldMask = new FieldMask(validatedFieldPaths);\n fieldTransforms = context.fieldTransforms.filter(transform =>\n fieldMask!.covers(transform.field)\n );\n } else {\n fieldMask = null;\n fieldTransforms = context.fieldTransforms;\n }\n\n return new ParsedSetData(\n new ObjectValue(updateData),\n fieldMask,\n fieldTransforms\n );\n}\n\nexport class DeleteFieldValueImpl extends FieldValue {\n _toFieldTransform(context: ParseContextImpl): null {\n if (context.dataSource === UserDataSource.MergeSet) {\n // No transform to add for a delete, but we need to add it to our\n // fieldMask so it gets deleted.\n context.fieldMask.push(context.path!);\n } else if (context.dataSource === UserDataSource.Update) {\n debugAssert(\n context.path!.length > 0,\n `${this._methodName}() at the top level should have already ` +\n 'been handled.'\n );\n throw context.createError(\n `${this._methodName}() can only appear at the top level ` +\n 'of your update data'\n );\n } else {\n // We shouldn't encounter delete sentinels for queries or non-merge set() calls.\n throw context.createError(\n `${this._methodName}() cannot be used with set() unless you pass ` +\n '{merge:true}'\n );\n }\n return null;\n }\n\n isEqual(other: FieldValue): boolean {\n return other instanceof DeleteFieldValueImpl;\n }\n}\n\n/**\n * Creates a child context for parsing SerializableFieldValues.\n *\n * This is different than calling `ParseContext.contextWith` because it keeps\n * the fieldTransforms and fieldMask separate.\n *\n * The created context has its `dataSource` set to `UserDataSource.Argument`.\n * Although these values are used with writes, any elements in these FieldValues\n * are not considered writes since they cannot contain any FieldValue sentinels,\n * etc.\n *\n * @param fieldValue - The sentinel FieldValue for which to create a child\n * context.\n * @param context - The parent context.\n * @param arrayElement - Whether or not the FieldValue has an array.\n */\nfunction createSentinelChildContext(\n fieldValue: FieldValue,\n context: ParseContextImpl,\n arrayElement: boolean\n): ParseContextImpl {\n return new ParseContextImpl(\n {\n dataSource: UserDataSource.Argument,\n targetDoc: context.settings.targetDoc,\n methodName: fieldValue._methodName,\n arrayElement\n },\n context.databaseId,\n context.serializer,\n context.ignoreUndefinedProperties\n );\n}\n\nexport class ServerTimestampFieldValueImpl extends FieldValue {\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n return new FieldTransform(context.path!, new ServerTimestampTransform());\n }\n\n isEqual(other: FieldValue): boolean {\n return other instanceof ServerTimestampFieldValueImpl;\n }\n}\n\nexport class ArrayUnionFieldValueImpl extends FieldValue {\n constructor(methodName: string, private readonly _elements: unknown[]) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const parseContext = createSentinelChildContext(\n this,\n context,\n /*array=*/ true\n );\n const parsedElements = this._elements.map(\n element => parseData(element, parseContext)!\n );\n const arrayUnion = new ArrayUnionTransformOperation(parsedElements);\n return new FieldTransform(context.path!, arrayUnion);\n }\n\n isEqual(other: FieldValue): boolean {\n return (\n other instanceof ArrayUnionFieldValueImpl &&\n deepEqual(this._elements, other._elements)\n );\n }\n}\n\nexport class ArrayRemoveFieldValueImpl extends FieldValue {\n constructor(methodName: string, private readonly _elements: unknown[]) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const parseContext = createSentinelChildContext(\n this,\n context,\n /*array=*/ true\n );\n const parsedElements = this._elements.map(\n element => parseData(element, parseContext)!\n );\n const arrayUnion = new ArrayRemoveTransformOperation(parsedElements);\n return new FieldTransform(context.path!, arrayUnion);\n }\n\n isEqual(other: FieldValue): boolean {\n return (\n other instanceof ArrayRemoveFieldValueImpl &&\n deepEqual(this._elements, other._elements)\n );\n }\n}\n\nexport class NumericIncrementFieldValueImpl extends FieldValue {\n constructor(methodName: string, private readonly _operand: number) {\n super(methodName);\n }\n\n _toFieldTransform(context: ParseContextImpl): FieldTransform {\n const numericIncrement = new NumericIncrementTransformOperation(\n context.serializer,\n toNumber(context.serializer, this._operand)\n );\n return new FieldTransform(context.path!, numericIncrement);\n }\n\n isEqual(other: FieldValue): boolean {\n return (\n other instanceof NumericIncrementFieldValueImpl &&\n this._operand === other._operand\n );\n }\n}\n\n/** Parse update data from an update() call. */\nexport function parseUpdateData(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n input: unknown\n): ParsedUpdateData {\n const context = userDataReader.createContext(\n UserDataSource.Update,\n methodName,\n targetDoc\n );\n validatePlainObject('Data must be an object, but it was:', context, input);\n\n const fieldMaskPaths: InternalFieldPath[] = [];\n const updateData = ObjectValue.empty();\n forEach(input as Dict, (key, value) => {\n const path = fieldPathFromDotSeparatedString(methodName, key, targetDoc);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n value = getModularInstance(value);\n\n const childContext = context.childContextForFieldPath(path);\n if (value instanceof DeleteFieldValueImpl) {\n // Add it to the field mask, but don't add anything to updateData.\n fieldMaskPaths.push(path);\n } else {\n const parsedValue = parseData(value, childContext);\n if (parsedValue != null) {\n fieldMaskPaths.push(path);\n updateData.set(path, parsedValue);\n }\n }\n });\n\n const mask = new FieldMask(fieldMaskPaths);\n return new ParsedUpdateData(updateData, mask, context.fieldTransforms);\n}\n\n/** Parse update data from a list of field/value arguments. */\nexport function parseUpdateVarargs(\n userDataReader: UserDataReader,\n methodName: string,\n targetDoc: DocumentKey,\n field: string | PublicFieldPath | Compat,\n value: unknown,\n moreFieldsAndValues: unknown[]\n): ParsedUpdateData {\n const context = userDataReader.createContext(\n UserDataSource.Update,\n methodName,\n targetDoc\n );\n const keys = [fieldPathFromArgument(methodName, field, targetDoc)];\n const values = [value];\n\n if (moreFieldsAndValues.length % 2 !== 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${methodName}() needs to be called with an even number ` +\n 'of arguments that alternate between field names and values.'\n );\n }\n\n for (let i = 0; i < moreFieldsAndValues.length; i += 2) {\n keys.push(\n fieldPathFromArgument(\n methodName,\n moreFieldsAndValues[i] as string | PublicFieldPath\n )\n );\n values.push(moreFieldsAndValues[i + 1]);\n }\n\n const fieldMaskPaths: InternalFieldPath[] = [];\n const updateData = ObjectValue.empty();\n\n // We iterate in reverse order to pick the last value for a field if the\n // user specified the field multiple times.\n for (let i = keys.length - 1; i >= 0; --i) {\n if (!fieldMaskContains(fieldMaskPaths, keys[i])) {\n const path = keys[i];\n let value = values[i];\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n value = getModularInstance(value);\n\n const childContext = context.childContextForFieldPath(path);\n if (value instanceof DeleteFieldValueImpl) {\n // Add it to the field mask, but don't add anything to updateData.\n fieldMaskPaths.push(path);\n } else {\n const parsedValue = parseData(value, childContext);\n if (parsedValue != null) {\n fieldMaskPaths.push(path);\n updateData.set(path, parsedValue);\n }\n }\n }\n }\n\n const mask = new FieldMask(fieldMaskPaths);\n return new ParsedUpdateData(updateData, mask, context.fieldTransforms);\n}\n\n/**\n * Parse a \"query value\" (e.g. value in a where filter or a value in a cursor\n * bound).\n *\n * @param allowArrays - Whether the query value is an array that may directly\n * contain additional arrays (e.g. the operand of an `in` query).\n */\nexport function parseQueryValue(\n userDataReader: UserDataReader,\n methodName: string,\n input: unknown,\n allowArrays = false\n): ProtoValue {\n const context = userDataReader.createContext(\n allowArrays ? UserDataSource.ArrayArgument : UserDataSource.Argument,\n methodName\n );\n const parsed = parseData(input, context);\n debugAssert(parsed != null, 'Parsed data should not be null.');\n debugAssert(\n context.fieldTransforms.length === 0,\n 'Field transforms should have been disallowed.'\n );\n return parsed;\n}\n\n/**\n * Parses user data to Protobuf Values.\n *\n * @param input - Data to be parsed.\n * @param context - A context object representing the current path being parsed,\n * the source of the data being parsed, etc.\n * @returns The parsed value, or null if the value was a FieldValue sentinel\n * that should not be included in the resulting parsed data.\n */\nexport function parseData(\n input: unknown,\n context: ParseContextImpl\n): ProtoValue | null {\n // Unwrap the API type from the Compat SDK. This will return the API type\n // from firestore-exp.\n input = getModularInstance(input);\n\n if (looksLikeJsonObject(input)) {\n validatePlainObject('Unsupported field value:', context, input);\n return parseObject(input, context);\n } else if (input instanceof FieldValue) {\n // FieldValues usually parse into transforms (except deleteField())\n // in which case we do not want to include this field in our parsed data\n // (as doing so will overwrite the field directly prior to the transform\n // trying to transform it). So we don't add this location to\n // context.fieldMask and we return null as our parsing result.\n parseSentinelFieldValue(input, context);\n return null;\n } else if (input === undefined && context.ignoreUndefinedProperties) {\n // If the input is undefined it can never participate in the fieldMask, so\n // don't handle this below. If `ignoreUndefinedProperties` is false,\n // `parseScalarValue` will reject an undefined value.\n return null;\n } else {\n // If context.path is null we are inside an array and we don't support\n // field mask paths more granular than the top-level array.\n if (context.path) {\n context.fieldMask.push(context.path);\n }\n\n if (input instanceof Array) {\n // TODO(b/34871131): Include the path containing the array in the error\n // message.\n // In the case of IN queries, the parsed data is an array (representing\n // the set of values to be included for the IN query) that may directly\n // contain additional arrays (each representing an individual field\n // value), so we disable this validation.\n if (\n context.settings.arrayElement &&\n context.dataSource !== UserDataSource.ArrayArgument\n ) {\n throw context.createError('Nested arrays are not supported');\n }\n return parseArray(input as unknown[], context);\n } else {\n return parseScalarValue(input, context);\n }\n }\n}\n\nfunction parseObject(\n obj: Dict,\n context: ParseContextImpl\n): { mapValue: ProtoMapValue } {\n const fields: Dict = {};\n\n if (isEmpty(obj)) {\n // If we encounter an empty object, we explicitly add it to the update\n // mask to ensure that the server creates a map entry.\n if (context.path && context.path.length > 0) {\n context.fieldMask.push(context.path);\n }\n } else {\n forEach(obj, (key: string, val: unknown) => {\n const parsedValue = parseData(val, context.childContextForField(key));\n if (parsedValue != null) {\n fields[key] = parsedValue;\n }\n });\n }\n\n return { mapValue: { fields } };\n}\n\nfunction parseArray(array: unknown[], context: ParseContextImpl): ProtoValue {\n const values: ProtoValue[] = [];\n let entryIndex = 0;\n for (const entry of array) {\n let parsedEntry = parseData(\n entry,\n context.childContextForArray(entryIndex)\n );\n if (parsedEntry == null) {\n // Just include nulls in the array for fields being replaced with a\n // sentinel.\n parsedEntry = { nullValue: 'NULL_VALUE' };\n }\n values.push(parsedEntry);\n entryIndex++;\n }\n return { arrayValue: { values } };\n}\n\n/**\n * \"Parses\" the provided FieldValueImpl, adding any necessary transforms to\n * context.fieldTransforms.\n */\nfunction parseSentinelFieldValue(\n value: FieldValue,\n context: ParseContextImpl\n): void {\n // Sentinels are only supported with writes, and not within arrays.\n if (!isWrite(context.dataSource)) {\n throw context.createError(\n `${value._methodName}() can only be used with update() and set()`\n );\n }\n if (!context.path) {\n throw context.createError(\n `${value._methodName}() is not currently supported inside arrays`\n );\n }\n\n const fieldTransform = value._toFieldTransform(context);\n if (fieldTransform) {\n context.fieldTransforms.push(fieldTransform);\n }\n}\n\n/**\n * Helper to parse a scalar value (i.e. not an Object, Array, or FieldValue)\n *\n * @returns The parsed value\n */\nfunction parseScalarValue(\n value: unknown,\n context: ParseContextImpl\n): ProtoValue | null {\n value = getModularInstance(value);\n\n if (value === null) {\n return { nullValue: 'NULL_VALUE' };\n } else if (typeof value === 'number') {\n return toNumber(context.serializer, value);\n } else if (typeof value === 'boolean') {\n return { booleanValue: value };\n } else if (typeof value === 'string') {\n return { stringValue: value };\n } else if (value instanceof Date) {\n const timestamp = Timestamp.fromDate(value);\n return {\n timestampValue: toTimestamp(context.serializer, timestamp)\n };\n } else if (value instanceof Timestamp) {\n // Firestore backend truncates precision down to microseconds. To ensure\n // offline mode works the same with regards to truncation, perform the\n // truncation immediately without waiting for the backend to do that.\n const timestamp = new Timestamp(\n value.seconds,\n Math.floor(value.nanoseconds / 1000) * 1000\n );\n return {\n timestampValue: toTimestamp(context.serializer, timestamp)\n };\n } else if (value instanceof GeoPoint) {\n return {\n geoPointValue: {\n latitude: value.latitude,\n longitude: value.longitude\n }\n };\n } else if (value instanceof Bytes) {\n return { bytesValue: toBytes(context.serializer, value._byteString) };\n } else if (value instanceof DocumentReference) {\n const thisDb = context.databaseId;\n const otherDb = value.firestore._databaseId;\n if (!otherDb.isEqual(thisDb)) {\n throw context.createError(\n 'Document reference is for database ' +\n `${otherDb.projectId}/${otherDb.database} but should be ` +\n `for database ${thisDb.projectId}/${thisDb.database}`\n );\n }\n return {\n referenceValue: toResourceName(\n value.firestore._databaseId || context.databaseId,\n value._key.path\n )\n };\n } else if (value instanceof VectorValue) {\n return parseVectorValue(value, context);\n } else {\n throw context.createError(\n `Unsupported field value: ${valueDescription(value)}`\n );\n }\n}\n\n/**\n * Creates a new VectorValue proto value (using the internal format).\n */\nexport function parseVectorValue(\n value: VectorValue,\n context: ParseContextImpl\n): ProtoValue {\n const mapValue: ProtoMapValue = {\n fields: {\n [TYPE_KEY]: {\n stringValue: VECTOR_VALUE_SENTINEL\n },\n [VECTOR_MAP_VECTORS_KEY]: {\n arrayValue: {\n values: value.toArray().map(value => {\n if (typeof value !== 'number') {\n throw context.createError(\n 'VectorValues must only contain numeric values.'\n );\n }\n\n return toDouble(context.serializer, value);\n })\n }\n }\n }\n };\n\n return { mapValue };\n}\n\n/**\n * Checks whether an object looks like a JSON object that should be converted\n * into a struct. Normal class/prototype instances are considered to look like\n * JSON objects since they should be converted to a struct value. Arrays, Dates,\n * GeoPoints, etc. are not considered to look like JSON objects since they map\n * to specific FieldValue types other than ObjectValue.\n */\nfunction looksLikeJsonObject(input: unknown): boolean {\n return (\n typeof input === 'object' &&\n input !== null &&\n !(input instanceof Array) &&\n !(input instanceof Date) &&\n !(input instanceof Timestamp) &&\n !(input instanceof GeoPoint) &&\n !(input instanceof Bytes) &&\n !(input instanceof DocumentReference) &&\n !(input instanceof FieldValue) &&\n !(input instanceof VectorValue)\n );\n}\n\nfunction validatePlainObject(\n message: string,\n context: ParseContextImpl,\n input: unknown\n): asserts input is Dict {\n if (!looksLikeJsonObject(input) || !isPlainObject(input)) {\n const description = valueDescription(input);\n if (description === 'an object') {\n // Massage the error if it was an object.\n throw context.createError(message + ' a custom object');\n } else {\n throw context.createError(message + ' ' + description);\n }\n }\n}\n\n/**\n * Helper that calls fromDotSeparatedString() but wraps any error thrown.\n */\nexport function fieldPathFromArgument(\n methodName: string,\n path: string | PublicFieldPath | Compat,\n targetDoc?: DocumentKey\n): InternalFieldPath {\n // If required, replace the FieldPath Compat class with the firestore-exp\n // FieldPath.\n path = getModularInstance(path);\n\n if (path instanceof FieldPath) {\n return path._internalPath;\n } else if (typeof path === 'string') {\n return fieldPathFromDotSeparatedString(methodName, path);\n } else {\n const message = 'Field path arguments must be of type string or ';\n throw createError(\n message,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n}\n\n/**\n * Matches any characters in a field path string that are reserved.\n */\nconst FIELD_PATH_RESERVED = new RegExp('[~\\\\*/\\\\[\\\\]]');\n\n/**\n * Wraps fromDotSeparatedString with an error message about the method that\n * was thrown.\n * @param methodName - The publicly visible method name\n * @param path - The dot-separated string form of a field path which will be\n * split on dots.\n * @param targetDoc - The document against which the field path will be\n * evaluated.\n */\nexport function fieldPathFromDotSeparatedString(\n methodName: string,\n path: string,\n targetDoc?: DocumentKey\n): InternalFieldPath {\n const found = path.search(FIELD_PATH_RESERVED);\n if (found >= 0) {\n throw createError(\n `Invalid field path (${path}). Paths must not contain ` +\n `'~', '*', '/', '[', or ']'`,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n\n try {\n return new FieldPath(...path.split('.'))._internalPath;\n } catch (e) {\n throw createError(\n `Invalid field path (${path}). Paths must not be empty, ` +\n `begin with '.', end with '.', or contain '..'`,\n methodName,\n /* hasConverter= */ false,\n /* path= */ undefined,\n targetDoc\n );\n }\n}\n\nfunction createError(\n reason: string,\n methodName: string,\n hasConverter: boolean,\n path?: InternalFieldPath,\n targetDoc?: DocumentKey\n): FirestoreError {\n const hasPath = path && !path.isEmpty();\n const hasDocument = targetDoc !== undefined;\n let message = `Function ${methodName}() called with invalid data`;\n if (hasConverter) {\n message += ' (via `toFirestore()`)';\n }\n message += '. ';\n\n let description = '';\n if (hasPath || hasDocument) {\n description += ' (found';\n\n if (hasPath) {\n description += ` in field ${path}`;\n }\n if (hasDocument) {\n description += ` in document ${targetDoc}`;\n }\n description += ')';\n }\n\n return new FirestoreError(\n Code.INVALID_ARGUMENT,\n message + reason + description\n );\n}\n\n/** Checks `haystack` if FieldPath `needle` is present. Runs in O(n). */\nfunction fieldMaskContains(\n haystack: InternalFieldPath[],\n needle: InternalFieldPath\n): boolean {\n return haystack.some(v => v.isEqual(needle));\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Compat, getModularInstance } from '@firebase/util';\n\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath as InternalFieldPath } from '../model/path';\nimport { arrayEquals } from '../util/misc';\n\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport {\n DocumentData,\n DocumentReference,\n PartialWithFieldValue,\n Query,\n queryEqual,\n SetOptions,\n WithFieldValue\n} from './reference';\nimport {\n fieldPathFromDotSeparatedString,\n UntypedFirestoreDataConverter\n} from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n * Converter used by `withConverter()` to transform user objects of type\n * `AppModelType` into Firestore data of type `DbModelType`.\n *\n * Using the converter allows you to specify generic type arguments when\n * storing and retrieving objects from Firestore.\n *\n * In this context, an \"AppModel\" is a class that is used in an application to\n * package together related information and functionality. Such a class could,\n * for example, have properties with complex, nested data types, properties used\n * for memoization, properties of types not supported by Firestore (such as\n * `symbol` and `bigint`), and helper functions that perform compound\n * operations. Such classes are not suitable and/or possible to store into a\n * Firestore database. Instead, instances of such classes need to be converted\n * to \"plain old JavaScript objects\" (POJOs) with exclusively primitive\n * properties, potentially nested inside other POJOs or arrays of POJOs. In this\n * context, this type is referred to as the \"DbModel\" and would be an object\n * suitable for persisting into Firestore. For convenience, applications can\n * implement `FirestoreDataConverter` and register the converter with Firestore\n * objects, such as `DocumentReference` or `Query`, to automatically convert\n * `AppModel` to `DbModel` when storing into Firestore, and convert `DbModel`\n * to `AppModel` when retrieving from Firestore.\n *\n * @example\n *\n * Simple Example\n *\n * ```typescript\n * const numberConverter = {\n * toFirestore(value: WithFieldValue) {\n * return { value };\n * },\n * fromFirestore(snapshot: QueryDocumentSnapshot, options: SnapshotOptions) {\n * return snapshot.data(options).value as number;\n * }\n * };\n *\n * async function simpleDemo(db: Firestore): Promise {\n * const documentRef = doc(db, 'values/value123').withConverter(numberConverter);\n *\n * // converters are used with `setDoc`, `addDoc`, and `getDoc`\n * await setDoc(documentRef, 42);\n * const snapshot1 = await getDoc(documentRef);\n * assertEqual(snapshot1.data(), 42);\n *\n * // converters are not used when writing data with `updateDoc`\n * await updateDoc(documentRef, { value: 999 });\n * const snapshot2 = await getDoc(documentRef);\n * assertEqual(snapshot2.data(), 999);\n * }\n * ```\n *\n * Advanced Example\n *\n * ```typescript\n * // The Post class is a model that is used by our application.\n * // This class may have properties and methods that are specific\n * // to our application execution, which do not need to be persisted\n * // to Firestore.\n * class Post {\n * constructor(\n * readonly title: string,\n * readonly author: string,\n * readonly lastUpdatedMillis: number\n * ) {}\n * toString(): string {\n * return `${this.title} by ${this.author}`;\n * }\n * }\n *\n * // The PostDbModel represents how we want our posts to be stored\n * // in Firestore. This DbModel has different properties (`ttl`,\n * // `aut`, and `lut`) from the Post class we use in our application.\n * interface PostDbModel {\n * ttl: string;\n * aut: { firstName: string; lastName: string };\n * lut: Timestamp;\n * }\n *\n * // The `PostConverter` implements `FirestoreDataConverter` and specifies\n * // how the Firestore SDK can convert `Post` objects to `PostDbModel`\n * // objects and vice versa.\n * class PostConverter implements FirestoreDataConverter {\n * toFirestore(post: WithFieldValue): WithFieldValue {\n * return {\n * ttl: post.title,\n * aut: this._autFromAuthor(post.author),\n * lut: this._lutFromLastUpdatedMillis(post.lastUpdatedMillis)\n * };\n * }\n *\n * fromFirestore(snapshot: QueryDocumentSnapshot, options: SnapshotOptions): Post {\n * const data = snapshot.data(options) as PostDbModel;\n * const author = `${data.aut.firstName} ${data.aut.lastName}`;\n * return new Post(data.ttl, author, data.lut.toMillis());\n * }\n *\n * _autFromAuthor(\n * author: string | FieldValue\n * ): { firstName: string; lastName: string } | FieldValue {\n * if (typeof author !== 'string') {\n * // `author` is a FieldValue, so just return it.\n * return author;\n * }\n * const [firstName, lastName] = author.split(' ');\n * return {firstName, lastName};\n * }\n *\n * _lutFromLastUpdatedMillis(\n * lastUpdatedMillis: number | FieldValue\n * ): Timestamp | FieldValue {\n * if (typeof lastUpdatedMillis !== 'number') {\n * // `lastUpdatedMillis` must be a FieldValue, so just return it.\n * return lastUpdatedMillis;\n * }\n * return Timestamp.fromMillis(lastUpdatedMillis);\n * }\n * }\n *\n * async function advancedDemo(db: Firestore): Promise {\n * // Create a `DocumentReference` with a `FirestoreDataConverter`.\n * const documentRef = doc(db, 'posts/post123').withConverter(new PostConverter());\n *\n * // The `data` argument specified to `setDoc()` is type checked by the\n * // TypeScript compiler to be compatible with `Post`. Since the `data`\n * // argument is typed as `WithFieldValue` rather than just `Post`,\n * // this allows properties of the `data` argument to also be special\n * // Firestore values that perform server-side mutations, such as\n * // `arrayRemove()`, `deleteField()`, and `serverTimestamp()`.\n * await setDoc(documentRef, {\n * title: 'My Life',\n * author: 'Foo Bar',\n * lastUpdatedMillis: serverTimestamp()\n * });\n *\n * // The TypeScript compiler will fail to compile if the `data` argument to\n * // `setDoc()` is _not_ compatible with `WithFieldValue`. This\n * // type checking prevents the caller from specifying objects with incorrect\n * // properties or property values.\n * // @ts-expect-error \"Argument of type { ttl: string; } is not assignable\n * // to parameter of type WithFieldValue\"\n * await setDoc(documentRef, { ttl: 'The Title' });\n *\n * // When retrieving a document with `getDoc()` the `DocumentSnapshot`\n * // object's `data()` method returns a `Post`, rather than a generic object,\n * // which would have been returned if the `DocumentReference` did _not_ have a\n * // `FirestoreDataConverter` attached to it.\n * const snapshot1: DocumentSnapshot = await getDoc(documentRef);\n * const post1: Post = snapshot1.data()!;\n * if (post1) {\n * assertEqual(post1.title, 'My Life');\n * assertEqual(post1.author, 'Foo Bar');\n * }\n *\n * // The `data` argument specified to `updateDoc()` is type checked by the\n * // TypeScript compiler to be compatible with `PostDbModel`. Note that\n * // unlike `setDoc()`, whose `data` argument must be compatible with `Post`,\n * // the `data` argument to `updateDoc()` must be compatible with\n * // `PostDbModel`. Similar to `setDoc()`, since the `data` argument is typed\n * // as `WithFieldValue` rather than just `PostDbModel`, this\n * // allows properties of the `data` argument to also be those special\n * // Firestore values, like `arrayRemove()`, `deleteField()`, and\n * // `serverTimestamp()`.\n * await updateDoc(documentRef, {\n * 'aut.firstName': 'NewFirstName',\n * lut: serverTimestamp()\n * });\n *\n * // The TypeScript compiler will fail to compile if the `data` argument to\n * // `updateDoc()` is _not_ compatible with `WithFieldValue`.\n * // This type checking prevents the caller from specifying objects with\n * // incorrect properties or property values.\n * // @ts-expect-error \"Argument of type { title: string; } is not assignable\n * // to parameter of type WithFieldValue\"\n * await updateDoc(documentRef, { title: 'New Title' });\n * const snapshot2: DocumentSnapshot = await getDoc(documentRef);\n * const post2: Post = snapshot2.data()!;\n * if (post2) {\n * assertEqual(post2.title, 'My Life');\n * assertEqual(post2.author, 'NewFirstName Bar');\n * }\n * }\n * ```\n */\nexport interface FirestoreDataConverter<\n AppModelType,\n DbModelType extends DocumentData = DocumentData\n> {\n /**\n * Called by the Firestore SDK to convert a custom model object of type\n * `AppModelType` into a plain JavaScript object (suitable for writing\n * directly to the Firestore database) of type `DbModelType`. Used with\n * {@link @firebase/firestore/lite#(setDoc:1)},\n * {@link @firebase/firestore/lite#(WriteBatch.set:1)} and\n * {@link @firebase/firestore/lite#(Transaction.set:1)}.\n *\n * The `WithFieldValue` type extends `T` to also allow FieldValues such as\n * {@link (deleteField:1)} to be used as property values.\n */\n toFirestore(\n modelObject: WithFieldValue\n ): WithFieldValue;\n\n /**\n * Called by the Firestore SDK to convert a custom model object of type\n * `AppModelType` into a plain JavaScript object (suitable for writing\n * directly to the Firestore database) of type `DbModelType`. Used with\n * {@link @firebase/firestore/lite#(setDoc:1)},\n * {@link @firebase/firestore/lite#(WriteBatch.set:1)} and\n * {@link @firebase/firestore/lite#(Transaction.set:1)} with `merge:true`\n * or `mergeFields`.\n *\n * The `PartialWithFieldValue` type extends `Partial` to allow\n * FieldValues such as {@link (arrayUnion:1)} to be used as property values.\n * It also supports nested `Partial` by allowing nested fields to be\n * omitted.\n */\n toFirestore(\n modelObject: PartialWithFieldValue,\n options: SetOptions\n ): PartialWithFieldValue;\n\n /**\n * Called by the Firestore SDK to convert Firestore data into an object of\n * type `AppModelType`. You can access your data by calling:\n * `snapshot.data()`.\n *\n *\n * Generally, the data returned from `snapshot.data()` can be cast to\n * `DbModelType`; however, this is not guaranteed because Firestore does not\n * enforce a schema on the database. For example, writes from a previous\n * version of the application or writes from another client that did not use a\n * type converter could have written data with different properties and/or\n * property types. The implementation will need to choose whether to\n * gracefully recover from non-conforming data or throw an error.\n *\n * @param snapshot - A `QueryDocumentSnapshot` containing your data and\n * metadata.\n */\n fromFirestore(\n snapshot: QueryDocumentSnapshot\n ): AppModelType;\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */\nexport class DocumentSnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n // Note: This class is stripped down version of the DocumentSnapshot in\n // the legacy SDK. The changes are:\n // - No support for SnapshotMetadata.\n // - No support for SnapshotOptions.\n\n /** @hideconstructor protected */\n constructor(\n public _firestore: Firestore,\n public _userDataWriter: AbstractUserDataWriter,\n public _key: DocumentKey,\n public _document: Document | null,\n public _converter: UntypedFirestoreDataConverter<\n AppModelType,\n DbModelType\n > | null\n ) {}\n\n /** Property of the `DocumentSnapshot` that provides the document's ID. */\n get id(): string {\n return this._key.path.lastSegment();\n }\n\n /**\n * The `DocumentReference` for the document included in the `DocumentSnapshot`.\n */\n get ref(): DocumentReference {\n return new DocumentReference(\n this._firestore,\n this._converter,\n this._key\n );\n }\n\n /**\n * Signals whether or not the document at the snapshot's location exists.\n *\n * @returns true if the document exists.\n */\n exists(): this is QueryDocumentSnapshot {\n return this._document !== null;\n }\n\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * @returns An `Object` containing all fields in the document or `undefined`\n * if the document doesn't exist.\n */\n data(): AppModelType | undefined {\n if (!this._document) {\n return undefined;\n } else if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const snapshot = new QueryDocumentSnapshot(\n this._firestore,\n this._userDataWriter,\n this._key,\n this._document,\n /* converter= */ null\n );\n return this._converter.fromFirestore(snapshot);\n } else {\n return this._userDataWriter.convertValue(\n this._document.data.value\n ) as AppModelType;\n }\n }\n\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(fieldPath: string | FieldPath): any {\n if (this._document) {\n const value = this._document.data.field(\n fieldPathFromArgument('DocumentSnapshot.get', fieldPath)\n );\n if (value !== null) {\n return this._userDataWriter.convertValue(value);\n }\n }\n return undefined;\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */\nexport class QueryDocumentSnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> extends DocumentSnapshot {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * @override\n * @returns An `Object` containing all fields in the document.\n */\n data(): AppModelType {\n return super.data() as AppModelType;\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */\nexport class QuerySnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n /**\n * The query on which you called {@link getDocs} in order to get this\n * `QuerySnapshot`.\n */\n readonly query: Query;\n\n /** @hideconstructor */\n constructor(\n _query: Query,\n readonly _docs: Array>\n ) {\n this.query = _query;\n }\n\n /** An array of all the documents in the `QuerySnapshot`. */\n get docs(): Array> {\n return [...this._docs];\n }\n\n /** The number of documents in the `QuerySnapshot`. */\n get size(): number {\n return this.docs.length;\n }\n\n /** True if there are no documents in the `QuerySnapshot`. */\n get empty(): boolean {\n return this.docs.length === 0;\n }\n\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */\n forEach(\n callback: (\n result: QueryDocumentSnapshot\n ) => void,\n thisArg?: unknown\n ): void {\n this._docs.forEach(callback, thisArg);\n }\n}\n\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */\nexport function snapshotEqual(\n left:\n | DocumentSnapshot\n | QuerySnapshot,\n right:\n | DocumentSnapshot\n | QuerySnapshot\n): boolean {\n left = getModularInstance(left);\n right = getModularInstance(right);\n\n if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) {\n return (\n left._firestore === right._firestore &&\n left._key.isEqual(right._key) &&\n (left._document === null\n ? right._document === null\n : left._document.isEqual(right._document)) &&\n left._converter === right._converter\n );\n } else if (left instanceof QuerySnapshot && right instanceof QuerySnapshot) {\n return (\n queryEqual(left.query, right.query) &&\n arrayEquals(left.docs, right.docs, snapshotEqual)\n );\n }\n\n return false;\n}\n\n/**\n * Helper that calls `fromDotSeparatedString()` but wraps any error thrown.\n */\nexport function fieldPathFromArgument(\n methodName: string,\n arg: string | FieldPath | Compat\n): InternalFieldPath {\n if (typeof arg === 'string') {\n return fieldPathFromDotSeparatedString(methodName, arg);\n } else if (arg instanceof FieldPath) {\n return arg._internalPath;\n } else {\n return arg._delegate._internalPath;\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport { Bound } from '../core/bound';\nimport { DatabaseId } from '../core/database_info';\nimport {\n CompositeFilter,\n CompositeOperator,\n FieldFilter,\n Filter,\n Operator\n} from '../core/filter';\nimport { Direction, OrderBy } from '../core/order_by';\nimport {\n isCollectionGroupQuery,\n LimitType,\n Query as InternalQuery,\n queryNormalizedOrderBy,\n queryWithAddedFilter,\n queryWithAddedOrderBy,\n queryWithEndAt,\n queryWithLimit,\n queryWithStartAt\n} from '../core/query';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { FieldPath as InternalFieldPath, ResourcePath } from '../model/path';\nimport { isServerTimestamp } from '../model/server_timestamps';\nimport { refValue } from '../model/values';\nimport { Value as ProtoValue } from '../protos/firestore_proto_api';\nimport { Code, FirestoreError } from '../util/error';\nimport {\n validatePositiveNumber,\n valueDescription\n} from '../util/input_validation';\n\nimport { FieldPath } from './field_path';\nimport { DocumentData, DocumentReference, Query } from './reference';\nimport { DocumentSnapshot, fieldPathFromArgument } from './snapshot';\nimport {\n newUserDataReader,\n parseQueryValue,\n UserDataReader\n} from './user_data_reader';\n\nexport function validateHasExplicitOrderByForLimitToLast(\n query: InternalQuery\n): void {\n if (\n query.limitType === LimitType.Last &&\n query.explicitOrderBy.length === 0\n ) {\n throw new FirestoreError(\n Code.UNIMPLEMENTED,\n 'limitToLast() queries require specifying at least one orderBy() clause'\n );\n }\n}\n\n/** Describes the different query constraints available in this SDK. */\nexport type QueryConstraintType =\n | 'where'\n | 'orderBy'\n | 'limit'\n | 'limitToLast'\n | 'startAt'\n | 'startAfter'\n | 'endAt'\n | 'endBefore';\n\n/**\n * An `AppliableConstraint` is an abstraction of a constraint that can be applied\n * to a Firestore query.\n */\nexport abstract class AppliableConstraint {\n /**\n * Takes the provided {@link Query} and returns a copy of the {@link Query} with this\n * {@link AppliableConstraint} applied.\n */\n abstract _apply(\n query: Query\n ): Query;\n}\n\n/**\n * A `QueryConstraint` is used to narrow the set of documents returned by a\n * Firestore query. `QueryConstraint`s are created by invoking {@link where},\n * {@link orderBy}, {@link (startAt:1)}, {@link (startAfter:1)}, {@link\n * (endBefore:1)}, {@link (endAt:1)}, {@link limit}, {@link limitToLast} and\n * can then be passed to {@link (query:1)} to create a new query instance that\n * also contains this `QueryConstraint`.\n */\nexport abstract class QueryConstraint extends AppliableConstraint {\n /** The type of this query constraint */\n abstract readonly type: QueryConstraintType;\n\n /**\n * Takes the provided {@link Query} and returns a copy of the {@link Query} with this\n * {@link AppliableConstraint} applied.\n */\n abstract _apply(\n query: Query\n ): Query;\n}\n\n/**\n * Creates a new immutable instance of {@link Query} that is extended to also\n * include additional query constraints.\n *\n * @param query - The {@link Query} instance to use as a base for the new\n * constraints.\n * @param compositeFilter - The {@link QueryCompositeFilterConstraint} to\n * apply. Create {@link QueryCompositeFilterConstraint} using {@link and} or\n * {@link or}.\n * @param queryConstraints - Additional {@link QueryNonFilterConstraint}s to\n * apply (e.g. {@link orderBy}, {@link limit}).\n * @throws if any of the provided query constraints cannot be combined with the\n * existing or new constraints.\n */\nexport function query(\n query: Query,\n compositeFilter: QueryCompositeFilterConstraint,\n ...queryConstraints: QueryNonFilterConstraint[]\n): Query;\n\n/**\n * Creates a new immutable instance of {@link Query} that is extended to also\n * include additional query constraints.\n *\n * @param query - The {@link Query} instance to use as a base for the new\n * constraints.\n * @param queryConstraints - The list of {@link QueryConstraint}s to apply.\n * @throws if any of the provided query constraints cannot be combined with the\n * existing or new constraints.\n */\nexport function query(\n query: Query,\n ...queryConstraints: QueryConstraint[]\n): Query;\n\nexport function query(\n query: Query,\n queryConstraint: QueryCompositeFilterConstraint | QueryConstraint | undefined,\n ...additionalQueryConstraints: Array<\n QueryConstraint | QueryNonFilterConstraint\n >\n): Query {\n let queryConstraints: AppliableConstraint[] = [];\n\n if (queryConstraint instanceof AppliableConstraint) {\n queryConstraints.push(queryConstraint);\n }\n\n queryConstraints = queryConstraints.concat(additionalQueryConstraints);\n\n validateQueryConstraintArray(queryConstraints);\n\n for (const constraint of queryConstraints) {\n query = constraint._apply(query);\n }\n return query;\n}\n\n/**\n * A `QueryFieldFilterConstraint` is used to narrow the set of documents returned by\n * a Firestore query by filtering on one or more document fields.\n * `QueryFieldFilterConstraint`s are created by invoking {@link where} and can then\n * be passed to {@link (query:1)} to create a new query instance that also contains\n * this `QueryFieldFilterConstraint`.\n */\nexport class QueryFieldFilterConstraint extends QueryConstraint {\n /** The type of this query constraint */\n readonly type = 'where';\n\n /**\n * @internal\n */\n protected constructor(\n private readonly _field: InternalFieldPath,\n private _op: Operator,\n private _value: unknown\n ) {\n super();\n }\n\n static _create(\n _field: InternalFieldPath,\n _op: Operator,\n _value: unknown\n ): QueryFieldFilterConstraint {\n return new QueryFieldFilterConstraint(_field, _op, _value);\n }\n\n _apply(\n query: Query\n ): Query {\n const filter = this._parse(query);\n validateNewFieldFilter(query._query, filter);\n return new Query(\n query.firestore,\n query.converter,\n queryWithAddedFilter(query._query, filter)\n );\n }\n\n _parse(\n query: Query\n ): FieldFilter {\n const reader = newUserDataReader(query.firestore);\n const filter = newQueryFilter(\n query._query,\n 'where',\n reader,\n query.firestore._databaseId,\n this._field,\n this._op,\n this._value\n );\n return filter;\n }\n}\n\n/**\n * Filter conditions in a {@link where} clause are specified using the\n * strings '<', '<=', '==', '!=', '>=', '>', 'array-contains', 'in',\n * 'array-contains-any', and 'not-in'.\n */\nexport type WhereFilterOp =\n | '<'\n | '<='\n | '=='\n | '!='\n | '>='\n | '>'\n | 'array-contains'\n | 'in'\n | 'array-contains-any'\n | 'not-in';\n\n/**\n * Creates a {@link QueryFieldFilterConstraint} that enforces that documents\n * must contain the specified field and that the value should satisfy the\n * relation constraint provided.\n *\n * @param fieldPath - The path to compare\n * @param opStr - The operation string (e.g \"<\", \"<=\", \"==\", \"<\",\n * \"<=\", \"!=\").\n * @param value - The value for comparison\n * @returns The created {@link QueryFieldFilterConstraint}.\n */\nexport function where(\n fieldPath: string | FieldPath,\n opStr: WhereFilterOp,\n value: unknown\n): QueryFieldFilterConstraint {\n const op = opStr as Operator;\n const field = fieldPathFromArgument('where', fieldPath);\n return QueryFieldFilterConstraint._create(field, op, value);\n}\n\n/**\n * A `QueryCompositeFilterConstraint` is used to narrow the set of documents\n * returned by a Firestore query by performing the logical OR or AND of multiple\n * {@link QueryFieldFilterConstraint}s or {@link QueryCompositeFilterConstraint}s.\n * `QueryCompositeFilterConstraint`s are created by invoking {@link or} or\n * {@link and} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains the `QueryCompositeFilterConstraint`.\n */\nexport class QueryCompositeFilterConstraint extends AppliableConstraint {\n /**\n * @internal\n */\n protected constructor(\n /** The type of this query constraint */\n readonly type: 'or' | 'and',\n private readonly _queryConstraints: QueryFilterConstraint[]\n ) {\n super();\n }\n\n static _create(\n type: 'or' | 'and',\n _queryConstraints: QueryFilterConstraint[]\n ): QueryCompositeFilterConstraint {\n return new QueryCompositeFilterConstraint(type, _queryConstraints);\n }\n\n _parse(\n query: Query\n ): Filter {\n const parsedFilters = this._queryConstraints\n .map(queryConstraint => {\n return queryConstraint._parse(query);\n })\n .filter(parsedFilter => parsedFilter.getFilters().length > 0);\n\n if (parsedFilters.length === 1) {\n return parsedFilters[0];\n }\n\n return CompositeFilter.create(parsedFilters, this._getOperator());\n }\n\n _apply(\n query: Query\n ): Query {\n const parsedFilter = this._parse(query);\n if (parsedFilter.getFilters().length === 0) {\n // Return the existing query if not adding any more filters (e.g. an empty\n // composite filter).\n return query;\n }\n validateNewFilter(query._query, parsedFilter);\n\n return new Query(\n query.firestore,\n query.converter,\n queryWithAddedFilter(query._query, parsedFilter)\n );\n }\n\n _getQueryConstraints(): readonly AppliableConstraint[] {\n return this._queryConstraints;\n }\n\n _getOperator(): CompositeOperator {\n return this.type === 'and' ? CompositeOperator.AND : CompositeOperator.OR;\n }\n}\n\n/**\n * `QueryNonFilterConstraint` is a helper union type that represents\n * QueryConstraints which are used to narrow or order the set of documents,\n * but that do not explicitly filter on a document field.\n * `QueryNonFilterConstraint`s are created by invoking {@link orderBy},\n * {@link (startAt:1)}, {@link (startAfter:1)}, {@link (endBefore:1)}, {@link (endAt:1)},\n * {@link limit} or {@link limitToLast} and can then be passed to {@link (query:1)}\n * to create a new query instance that also contains the `QueryConstraint`.\n */\nexport type QueryNonFilterConstraint =\n | QueryOrderByConstraint\n | QueryLimitConstraint\n | QueryStartAtConstraint\n | QueryEndAtConstraint;\n\n/**\n * `QueryFilterConstraint` is a helper union type that represents\n * {@link QueryFieldFilterConstraint} and {@link QueryCompositeFilterConstraint}.\n */\nexport type QueryFilterConstraint =\n | QueryFieldFilterConstraint\n | QueryCompositeFilterConstraint;\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a disjunction of\n * the given filter constraints. A disjunction filter includes a document if it\n * satisfies any of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a disjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */\nexport function or(\n ...queryConstraints: QueryFilterConstraint[]\n): QueryCompositeFilterConstraint {\n // Only support QueryFilterConstraints\n queryConstraints.forEach(queryConstraint =>\n validateQueryFilterConstraint('or', queryConstraint)\n );\n\n return QueryCompositeFilterConstraint._create(\n CompositeOperator.OR,\n queryConstraints as QueryFilterConstraint[]\n );\n}\n\n/**\n * Creates a new {@link QueryCompositeFilterConstraint} that is a conjunction of\n * the given filter constraints. A conjunction filter includes a document if it\n * satisfies all of the given filters.\n *\n * @param queryConstraints - Optional. The list of\n * {@link QueryFilterConstraint}s to perform a conjunction for. These must be\n * created with calls to {@link where}, {@link or}, or {@link and}.\n * @returns The newly created {@link QueryCompositeFilterConstraint}.\n */\nexport function and(\n ...queryConstraints: QueryFilterConstraint[]\n): QueryCompositeFilterConstraint {\n // Only support QueryFilterConstraints\n queryConstraints.forEach(queryConstraint =>\n validateQueryFilterConstraint('and', queryConstraint)\n );\n\n return QueryCompositeFilterConstraint._create(\n CompositeOperator.AND,\n queryConstraints as QueryFilterConstraint[]\n );\n}\n\n/**\n * A `QueryOrderByConstraint` is used to sort the set of documents returned by a\n * Firestore query. `QueryOrderByConstraint`s are created by invoking\n * {@link orderBy} and can then be passed to {@link (query:1)} to create a new query\n * instance that also contains this `QueryOrderByConstraint`.\n *\n * Note: Documents that do not contain the orderBy field will not be present in\n * the query result.\n */\nexport class QueryOrderByConstraint extends QueryConstraint {\n /** The type of this query constraint */\n readonly type = 'orderBy';\n\n /**\n * @internal\n */\n protected constructor(\n private readonly _field: InternalFieldPath,\n private _direction: Direction\n ) {\n super();\n }\n\n static _create(\n _field: InternalFieldPath,\n _direction: Direction\n ): QueryOrderByConstraint {\n return new QueryOrderByConstraint(_field, _direction);\n }\n\n _apply(\n query: Query\n ): Query {\n const orderBy = newQueryOrderBy(query._query, this._field, this._direction);\n return new Query(\n query.firestore,\n query.converter,\n queryWithAddedOrderBy(query._query, orderBy)\n );\n }\n}\n\n/**\n * The direction of a {@link orderBy} clause is specified as 'desc' or 'asc'\n * (descending or ascending).\n */\nexport type OrderByDirection = 'desc' | 'asc';\n\n/**\n * Creates a {@link QueryOrderByConstraint} that sorts the query result by the\n * specified field, optionally in descending order instead of ascending.\n *\n * Note: Documents that do not contain the specified field will not be present\n * in the query result.\n *\n * @param fieldPath - The field to sort by.\n * @param directionStr - Optional direction to sort by ('asc' or 'desc'). If\n * not specified, order will be ascending.\n * @returns The created {@link QueryOrderByConstraint}.\n */\nexport function orderBy(\n fieldPath: string | FieldPath,\n directionStr: OrderByDirection = 'asc'\n): QueryOrderByConstraint {\n const direction = directionStr as Direction;\n const path = fieldPathFromArgument('orderBy', fieldPath);\n return QueryOrderByConstraint._create(path, direction);\n}\n\n/**\n * A `QueryLimitConstraint` is used to limit the number of documents returned by\n * a Firestore query.\n * `QueryLimitConstraint`s are created by invoking {@link limit} or\n * {@link limitToLast} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryLimitConstraint`.\n */\nexport class QueryLimitConstraint extends QueryConstraint {\n /**\n * @internal\n */\n protected constructor(\n /** The type of this query constraint */\n readonly type: 'limit' | 'limitToLast',\n private readonly _limit: number,\n private readonly _limitType: LimitType\n ) {\n super();\n }\n\n static _create(\n type: 'limit' | 'limitToLast',\n _limit: number,\n _limitType: LimitType\n ): QueryLimitConstraint {\n return new QueryLimitConstraint(type, _limit, _limitType);\n }\n\n _apply(\n query: Query\n ): Query {\n return new Query(\n query.firestore,\n query.converter,\n queryWithLimit(query._query, this._limit, this._limitType)\n );\n }\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the first matching\n * documents.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */\nexport function limit(limit: number): QueryLimitConstraint {\n validatePositiveNumber('limit', limit);\n return QueryLimitConstraint._create('limit', limit, LimitType.First);\n}\n\n/**\n * Creates a {@link QueryLimitConstraint} that only returns the last matching\n * documents.\n *\n * You must specify at least one `orderBy` clause for `limitToLast` queries,\n * otherwise an exception will be thrown during execution.\n *\n * @param limit - The maximum number of items to return.\n * @returns The created {@link QueryLimitConstraint}.\n */\nexport function limitToLast(limit: number): QueryLimitConstraint {\n validatePositiveNumber('limitToLast', limit);\n return QueryLimitConstraint._create('limitToLast', limit, LimitType.Last);\n}\n\n/**\n * A `QueryStartAtConstraint` is used to exclude documents from the start of a\n * result set returned by a Firestore query.\n * `QueryStartAtConstraint`s are created by invoking {@link (startAt:1)} or\n * {@link (startAfter:1)} and can then be passed to {@link (query:1)} to create a\n * new query instance that also contains this `QueryStartAtConstraint`.\n */\nexport class QueryStartAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n protected constructor(\n /** The type of this query constraint */\n readonly type: 'startAt' | 'startAfter',\n private readonly _docOrFields: Array>,\n private readonly _inclusive: boolean\n ) {\n super();\n }\n\n static _create(\n type: 'startAt' | 'startAfter',\n _docOrFields: Array>,\n _inclusive: boolean\n ): QueryStartAtConstraint {\n return new QueryStartAtConstraint(type, _docOrFields, _inclusive);\n }\n\n _apply(\n query: Query\n ): Query {\n const bound = newQueryBoundFromDocOrFields(\n query,\n this.type,\n this._docOrFields,\n this._inclusive\n );\n return new Query(\n query.firestore,\n query.converter,\n queryWithStartAt(query._query, bound)\n );\n }\n}\n\n/**\n * Creates a {@link QueryStartAtConstraint} that modifies the result set to\n * start at the provided document (inclusive). The starting position is relative\n * to the order of the query. The document must contain all of the fields\n * provided in the `orderBy` of this query.\n *\n * @param snapshot - The snapshot of the document to start at.\n * @returns A {@link QueryStartAtConstraint} to pass to `query()`.\n */\nexport function startAt(\n snapshot: DocumentSnapshot\n): QueryStartAtConstraint;\n/**\n * Creates a {@link QueryStartAtConstraint} that modifies the result set to\n * start at the provided fields relative to the order of the query. The order of\n * the field values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to start this query at, in order\n * of the query's order by.\n * @returns A {@link QueryStartAtConstraint} to pass to `query()`.\n */\nexport function startAt(...fieldValues: unknown[]): QueryStartAtConstraint;\nexport function startAt(\n ...docOrFields: Array>\n): QueryStartAtConstraint {\n return QueryStartAtConstraint._create(\n 'startAt',\n docOrFields,\n /*inclusive=*/ true\n );\n}\n\n/**\n * Creates a {@link QueryStartAtConstraint} that modifies the result set to\n * start after the provided document (exclusive). The starting position is\n * relative to the order of the query. The document must contain all of the\n * fields provided in the orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to start after.\n * @returns A {@link QueryStartAtConstraint} to pass to `query()`\n */\nexport function startAfter(\n snapshot: DocumentSnapshot\n): QueryStartAtConstraint;\n/**\n * Creates a {@link QueryStartAtConstraint} that modifies the result set to\n * start after the provided fields relative to the order of the query. The order\n * of the field values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to start this query after, in order\n * of the query's order by.\n * @returns A {@link QueryStartAtConstraint} to pass to `query()`\n */\nexport function startAfter(...fieldValues: unknown[]): QueryStartAtConstraint;\nexport function startAfter(\n ...docOrFields: Array>\n): QueryStartAtConstraint {\n return QueryStartAtConstraint._create(\n 'startAfter',\n docOrFields,\n /*inclusive=*/ false\n );\n}\n\n/**\n * A `QueryEndAtConstraint` is used to exclude documents from the end of a\n * result set returned by a Firestore query.\n * `QueryEndAtConstraint`s are created by invoking {@link (endAt:1)} or\n * {@link (endBefore:1)} and can then be passed to {@link (query:1)} to create a new\n * query instance that also contains this `QueryEndAtConstraint`.\n */\nexport class QueryEndAtConstraint extends QueryConstraint {\n /**\n * @internal\n */\n protected constructor(\n /** The type of this query constraint */\n readonly type: 'endBefore' | 'endAt',\n private readonly _docOrFields: Array>,\n private readonly _inclusive: boolean\n ) {\n super();\n }\n\n static _create(\n type: 'endBefore' | 'endAt',\n _docOrFields: Array>,\n _inclusive: boolean\n ): QueryEndAtConstraint {\n return new QueryEndAtConstraint(type, _docOrFields, _inclusive);\n }\n\n _apply(\n query: Query\n ): Query {\n const bound = newQueryBoundFromDocOrFields(\n query,\n this.type,\n this._docOrFields,\n this._inclusive\n );\n return new Query(\n query.firestore,\n query.converter,\n queryWithEndAt(query._query, bound)\n );\n }\n}\n\n/**\n * Creates a {@link QueryEndAtConstraint} that modifies the result set to end\n * before the provided document (exclusive). The end position is relative to the\n * order of the query. The document must contain all of the fields provided in\n * the orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to end before.\n * @returns A {@link QueryEndAtConstraint} to pass to `query()`\n */\nexport function endBefore(\n snapshot: DocumentSnapshot\n): QueryEndAtConstraint;\n/**\n * Creates a {@link QueryEndAtConstraint} that modifies the result set to end\n * before the provided fields relative to the order of the query. The order of\n * the field values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to end this query before, in order\n * of the query's order by.\n * @returns A {@link QueryEndAtConstraint} to pass to `query()`\n */\nexport function endBefore(...fieldValues: unknown[]): QueryEndAtConstraint;\nexport function endBefore(\n ...docOrFields: Array>\n): QueryEndAtConstraint {\n return QueryEndAtConstraint._create(\n 'endBefore',\n docOrFields,\n /*inclusive=*/ false\n );\n}\n\n/**\n * Creates a {@link QueryEndAtConstraint} that modifies the result set to end at\n * the provided document (inclusive). The end position is relative to the order\n * of the query. The document must contain all of the fields provided in the\n * orderBy of the query.\n *\n * @param snapshot - The snapshot of the document to end at.\n * @returns A {@link QueryEndAtConstraint} to pass to `query()`\n */\nexport function endAt(\n snapshot: DocumentSnapshot\n): QueryEndAtConstraint;\n/**\n * Creates a {@link QueryEndAtConstraint} that modifies the result set to end at\n * the provided fields relative to the order of the query. The order of the field\n * values must match the order of the order by clauses of the query.\n *\n * @param fieldValues - The field values to end this query at, in order\n * of the query's order by.\n * @returns A {@link QueryEndAtConstraint} to pass to `query()`\n */\nexport function endAt(...fieldValues: unknown[]): QueryEndAtConstraint;\nexport function endAt(\n ...docOrFields: Array>\n): QueryEndAtConstraint {\n return QueryEndAtConstraint._create(\n 'endAt',\n docOrFields,\n /*inclusive=*/ true\n );\n}\n\n/** Helper function to create a bound from a document or fields */\nfunction newQueryBoundFromDocOrFields<\n AppModelType,\n DbModelType extends DocumentData\n>(\n query: Query,\n methodName: string,\n docOrFields: Array>,\n inclusive: boolean\n): Bound {\n docOrFields[0] = getModularInstance(docOrFields[0]);\n\n if (docOrFields[0] instanceof DocumentSnapshot) {\n return newQueryBoundFromDocument(\n query._query,\n query.firestore._databaseId,\n methodName,\n docOrFields[0]._document,\n inclusive\n );\n } else {\n const reader = newUserDataReader(query.firestore);\n return newQueryBoundFromFields(\n query._query,\n query.firestore._databaseId,\n reader,\n methodName,\n docOrFields,\n inclusive\n );\n }\n}\n\nexport function newQueryFilter(\n query: InternalQuery,\n methodName: string,\n dataReader: UserDataReader,\n databaseId: DatabaseId,\n fieldPath: InternalFieldPath,\n op: Operator,\n value: unknown\n): FieldFilter {\n let fieldValue: ProtoValue;\n if (fieldPath.isKeyField()) {\n if (op === Operator.ARRAY_CONTAINS || op === Operator.ARRAY_CONTAINS_ANY) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid Query. You can't perform '${op}' queries on documentId().`\n );\n } else if (op === Operator.IN || op === Operator.NOT_IN) {\n validateDisjunctiveFilterElements(value, op);\n const referenceList: ProtoValue[] = [];\n for (const arrayValue of value as ProtoValue[]) {\n referenceList.push(parseDocumentIdValue(databaseId, query, arrayValue));\n }\n fieldValue = { arrayValue: { values: referenceList } };\n } else {\n fieldValue = parseDocumentIdValue(databaseId, query, value);\n }\n } else {\n if (\n op === Operator.IN ||\n op === Operator.NOT_IN ||\n op === Operator.ARRAY_CONTAINS_ANY\n ) {\n validateDisjunctiveFilterElements(value, op);\n }\n fieldValue = parseQueryValue(\n dataReader,\n methodName,\n value,\n /* allowArrays= */ op === Operator.IN || op === Operator.NOT_IN\n );\n }\n const filter = FieldFilter.create(fieldPath, op, fieldValue);\n return filter;\n}\n\nexport function newQueryOrderBy(\n query: InternalQuery,\n fieldPath: InternalFieldPath,\n direction: Direction\n): OrderBy {\n if (query.startAt !== null) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You must not call startAt() or startAfter() before ' +\n 'calling orderBy().'\n );\n }\n if (query.endAt !== null) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You must not call endAt() or endBefore() before ' +\n 'calling orderBy().'\n );\n }\n const orderBy = new OrderBy(fieldPath, direction);\n return orderBy;\n}\n\n/**\n * Create a `Bound` from a query and a document.\n *\n * Note that the `Bound` will always include the key of the document\n * and so only the provided document will compare equal to the returned\n * position.\n *\n * Will throw if the document does not contain all fields of the order by\n * of the query or if any of the fields in the order by are an uncommitted\n * server timestamp.\n */\nexport function newQueryBoundFromDocument(\n query: InternalQuery,\n databaseId: DatabaseId,\n methodName: string,\n doc: Document | null,\n inclusive: boolean\n): Bound {\n if (!doc) {\n throw new FirestoreError(\n Code.NOT_FOUND,\n `Can't use a DocumentSnapshot that doesn't exist for ` +\n `${methodName}().`\n );\n }\n\n const components: ProtoValue[] = [];\n\n // Because people expect to continue/end a query at the exact document\n // provided, we need to use the implicit sort order rather than the explicit\n // sort order, because it's guaranteed to contain the document key. That way\n // the position becomes unambiguous and the query continues/ends exactly at\n // the provided document. Without the key (by using the explicit sort\n // orders), multiple documents could match the position, yielding duplicate\n // results.\n for (const orderBy of queryNormalizedOrderBy(query)) {\n if (orderBy.field.isKeyField()) {\n components.push(refValue(databaseId, doc.key));\n } else {\n const value = doc.data.field(orderBy.field);\n if (isServerTimestamp(value)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You are trying to start or end a query using a ' +\n 'document for which the field \"' +\n orderBy.field +\n '\" is an uncommitted server timestamp. (Since the value of ' +\n 'this field is unknown, you cannot start/end a query with it.)'\n );\n } else if (value !== null) {\n components.push(value);\n } else {\n const field = orderBy.field.canonicalString();\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. You are trying to start or end a query using a ` +\n `document for which the field '${field}' (used as the ` +\n `orderBy) does not exist.`\n );\n }\n }\n }\n return new Bound(components, inclusive);\n}\n\n/**\n * Converts a list of field values to a `Bound` for the given query.\n */\nexport function newQueryBoundFromFields(\n query: InternalQuery,\n databaseId: DatabaseId,\n dataReader: UserDataReader,\n methodName: string,\n values: unknown[],\n inclusive: boolean\n): Bound {\n // Use explicit order by's because it has to match the query the user made\n const orderBy = query.explicitOrderBy;\n if (values.length > orderBy.length) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Too many arguments provided to ${methodName}(). ` +\n `The number of arguments must be less than or equal to the ` +\n `number of orderBy() clauses`\n );\n }\n\n const components: ProtoValue[] = [];\n for (let i = 0; i < values.length; i++) {\n const rawValue = values[i];\n const orderByComponent = orderBy[i];\n if (orderByComponent.field.isKeyField()) {\n if (typeof rawValue !== 'string') {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. Expected a string for document ID in ` +\n `${methodName}(), but got a ${typeof rawValue}`\n );\n }\n if (!isCollectionGroupQuery(query) && rawValue.indexOf('/') !== -1) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection and ordering by documentId(), ` +\n `the value passed to ${methodName}() must be a plain document ID, but ` +\n `'${rawValue}' contains a slash.`\n );\n }\n const path = query.path.child(ResourcePath.fromString(rawValue));\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection group and ordering by ` +\n `documentId(), the value passed to ${methodName}() must result in a ` +\n `valid document path, but '${path}' is not because it contains an odd number ` +\n `of segments.`\n );\n }\n const key = new DocumentKey(path);\n components.push(refValue(databaseId, key));\n } else {\n const wrapped = parseQueryValue(dataReader, methodName, rawValue);\n components.push(wrapped);\n }\n }\n\n return new Bound(components, inclusive);\n}\n\n/**\n * Parses the given `documentIdValue` into a `ReferenceValue`, throwing\n * appropriate errors if the value is anything other than a `DocumentReference`\n * or `string`, or if the string is malformed.\n */\nfunction parseDocumentIdValue(\n databaseId: DatabaseId,\n query: InternalQuery,\n documentIdValue: unknown\n): ProtoValue {\n documentIdValue = getModularInstance(documentIdValue);\n\n if (typeof documentIdValue === 'string') {\n if (documentIdValue === '') {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. When querying with documentId(), you ' +\n 'must provide a valid document ID, but it was an empty string.'\n );\n }\n if (!isCollectionGroupQuery(query) && documentIdValue.indexOf('/') !== -1) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection by ` +\n `documentId(), you must provide a plain document ID, but ` +\n `'${documentIdValue}' contains a '/' character.`\n );\n }\n const path = query.path.child(ResourcePath.fromString(documentIdValue));\n if (!DocumentKey.isDocumentKey(path)) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying a collection group by ` +\n `documentId(), the value provided must result in a valid document path, ` +\n `but '${path}' is not because it has an odd number of segments (${path.length}).`\n );\n }\n return refValue(databaseId, new DocumentKey(path));\n } else if (documentIdValue instanceof DocumentReference) {\n return refValue(databaseId, documentIdValue._key);\n } else {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. When querying with documentId(), you must provide a valid ` +\n `string or a DocumentReference, but it was: ` +\n `${valueDescription(documentIdValue)}.`\n );\n }\n}\n\n/**\n * Validates that the value passed into a disjunctive filter satisfies all\n * array requirements.\n */\nfunction validateDisjunctiveFilterElements(\n value: unknown,\n operator: Operator\n): void {\n if (!Array.isArray(value) || value.length === 0) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid Query. A non-empty array is required for ' +\n `'${operator.toString()}' filters.`\n );\n }\n}\n\n/**\n * Given an operator, returns the set of operators that cannot be used with it.\n *\n * This is not a comprehensive check, and this function should be removed in the\n * long term. Validations should occur in the Firestore backend.\n *\n * Operators in a query must adhere to the following set of rules:\n * 1. Only one inequality per query.\n * 2. `NOT_IN` cannot be used with array, disjunctive, or `NOT_EQUAL` operators.\n */\nfunction conflictingOps(op: Operator): Operator[] {\n switch (op) {\n case Operator.NOT_EQUAL:\n return [Operator.NOT_EQUAL, Operator.NOT_IN];\n case Operator.ARRAY_CONTAINS_ANY:\n case Operator.IN:\n return [Operator.NOT_IN];\n case Operator.NOT_IN:\n return [\n Operator.ARRAY_CONTAINS_ANY,\n Operator.IN,\n Operator.NOT_IN,\n Operator.NOT_EQUAL\n ];\n default:\n return [];\n }\n}\n\nfunction validateNewFieldFilter(\n query: InternalQuery,\n fieldFilter: FieldFilter\n): void {\n const conflictingOp = findOpInsideFilters(\n query.filters,\n conflictingOps(fieldFilter.op)\n );\n if (conflictingOp !== null) {\n // Special case when it's a duplicate op to give a slightly clearer error message.\n if (conflictingOp === fieldFilter.op) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Invalid query. You cannot use more than one ' +\n `'${fieldFilter.op.toString()}' filter.`\n );\n } else {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Invalid query. You cannot use '${fieldFilter.op.toString()}' filters ` +\n `with '${conflictingOp.toString()}' filters.`\n );\n }\n }\n}\n\nfunction validateNewFilter(query: InternalQuery, filter: Filter): void {\n let testQuery = query;\n const subFilters = filter.getFlattenedFilters();\n for (const subFilter of subFilters) {\n validateNewFieldFilter(testQuery, subFilter);\n testQuery = queryWithAddedFilter(testQuery, subFilter);\n }\n}\n\n// Checks if any of the provided filter operators are included in the given list of filters and\n// returns the first one that is, or null if none are.\nfunction findOpInsideFilters(\n filters: Filter[],\n operators: Operator[]\n): Operator | null {\n for (const filter of filters) {\n for (const fieldFilter of filter.getFlattenedFilters()) {\n if (operators.indexOf(fieldFilter.op) >= 0) {\n return fieldFilter.op;\n }\n }\n }\n return null;\n}\n\nexport function validateQueryFilterConstraint(\n functionName: string,\n queryConstraint: AppliableConstraint\n): void {\n if (\n !(queryConstraint instanceof QueryFieldFilterConstraint) &&\n !(queryConstraint instanceof QueryCompositeFilterConstraint)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n `Function ${functionName}() requires AppliableConstraints created with a call to 'where(...)', 'or(...)', or 'and(...)'.`\n );\n }\n}\n\nfunction validateQueryConstraintArray(\n queryConstraint: AppliableConstraint[]\n): void {\n const compositeFilterCount = queryConstraint.filter(\n filter => filter instanceof QueryCompositeFilterConstraint\n ).length;\n const fieldFilterCount = queryConstraint.filter(\n filter => filter instanceof QueryFieldFilterConstraint\n ).length;\n\n if (\n compositeFilterCount > 1 ||\n (compositeFilterCount > 0 && fieldFilterCount > 0)\n ) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'InvalidQuery. When using composite filters, you cannot use ' +\n 'more than one filter at the top level. Consider nesting the multiple ' +\n 'filters within an `and(...)` statement. For example: ' +\n 'change `query(query, where(...), or(...))` to ' +\n '`query(query, and(where(...), or(...)))`.'\n );\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { DocumentData } from '@firebase/firestore-types';\n\nimport { DatabaseId } from '../core/database_info';\nimport { DocumentKey } from '../model/document_key';\nimport {\n normalizeByteString,\n normalizeNumber,\n normalizeTimestamp\n} from '../model/normalize';\nimport { ResourcePath } from '../model/path';\nimport {\n getLocalWriteTime,\n getPreviousValue\n} from '../model/server_timestamps';\nimport { TypeOrder } from '../model/type_order';\nimport { VECTOR_MAP_VECTORS_KEY, typeOrder } from '../model/values';\nimport {\n ApiClientObjectMap,\n ArrayValue as ProtoArrayValue,\n LatLng as ProtoLatLng,\n MapValue as ProtoMapValue,\n Timestamp as ProtoTimestamp,\n Value,\n Value as ProtoValue\n} from '../protos/firestore_proto_api';\nimport { isValidResourceName } from '../remote/serializer';\nimport { fail, hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { logError } from '../util/log';\nimport { forEach } from '../util/obj';\n\nimport { GeoPoint } from './geo_point';\nimport { Timestamp } from './timestamp';\nimport { VectorValue } from './vector_value';\n\nexport type ServerTimestampBehavior = 'estimate' | 'previous' | 'none';\n\n/**\n * Converts Firestore's internal types to the JavaScript types that we expose\n * to the user.\n *\n * @internal\n */\nexport abstract class AbstractUserDataWriter {\n convertValue(\n value: ProtoValue,\n serverTimestampBehavior: ServerTimestampBehavior = 'none'\n ): unknown {\n switch (typeOrder(value)) {\n case TypeOrder.NullValue:\n return null;\n case TypeOrder.BooleanValue:\n return value.booleanValue!;\n case TypeOrder.NumberValue:\n return normalizeNumber(value.integerValue || value.doubleValue);\n case TypeOrder.TimestampValue:\n return this.convertTimestamp(value.timestampValue!);\n case TypeOrder.ServerTimestampValue:\n return this.convertServerTimestamp(value, serverTimestampBehavior);\n case TypeOrder.StringValue:\n return value.stringValue!;\n case TypeOrder.BlobValue:\n return this.convertBytes(normalizeByteString(value.bytesValue!));\n case TypeOrder.RefValue:\n return this.convertReference(value.referenceValue!);\n case TypeOrder.GeoPointValue:\n return this.convertGeoPoint(value.geoPointValue!);\n case TypeOrder.ArrayValue:\n return this.convertArray(value.arrayValue!, serverTimestampBehavior);\n case TypeOrder.ObjectValue:\n return this.convertObject(value.mapValue!, serverTimestampBehavior);\n case TypeOrder.VectorValue:\n return this.convertVectorValue(value.mapValue!);\n default:\n throw fail('Invalid value type: ' + JSON.stringify(value));\n }\n }\n\n private convertObject(\n mapValue: ProtoMapValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): DocumentData {\n return this.convertObjectMap(mapValue.fields, serverTimestampBehavior);\n }\n\n /**\n * @internal\n */\n convertObjectMap(\n fields: ApiClientObjectMap | undefined,\n serverTimestampBehavior: ServerTimestampBehavior = 'none'\n ): DocumentData {\n const result: DocumentData = {};\n forEach(fields, (key, value) => {\n result[key] = this.convertValue(value, serverTimestampBehavior);\n });\n return result;\n }\n\n /**\n * @internal\n */\n convertVectorValue(mapValue: ProtoMapValue): VectorValue {\n const values = mapValue.fields?.[\n VECTOR_MAP_VECTORS_KEY\n ].arrayValue?.values?.map(value => {\n return normalizeNumber(value.doubleValue);\n });\n\n return new VectorValue(values);\n }\n\n private convertGeoPoint(value: ProtoLatLng): GeoPoint {\n return new GeoPoint(\n normalizeNumber(value.latitude),\n normalizeNumber(value.longitude)\n );\n }\n\n private convertArray(\n arrayValue: ProtoArrayValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): unknown[] {\n return (arrayValue.values || []).map(value =>\n this.convertValue(value, serverTimestampBehavior)\n );\n }\n\n private convertServerTimestamp(\n value: ProtoValue,\n serverTimestampBehavior: ServerTimestampBehavior\n ): unknown {\n switch (serverTimestampBehavior) {\n case 'previous':\n const previousValue = getPreviousValue(value);\n if (previousValue == null) {\n return null;\n }\n return this.convertValue(previousValue, serverTimestampBehavior);\n case 'estimate':\n return this.convertTimestamp(getLocalWriteTime(value));\n default:\n return null;\n }\n }\n\n private convertTimestamp(value: ProtoTimestamp): Timestamp {\n const normalizedValue = normalizeTimestamp(value);\n return new Timestamp(normalizedValue.seconds, normalizedValue.nanos);\n }\n\n protected convertDocumentKey(\n name: string,\n expectedDatabaseId: DatabaseId\n ): DocumentKey {\n const resourcePath = ResourcePath.fromString(name);\n hardAssert(\n isValidResourceName(resourcePath),\n 'ReferenceValue is not valid ' + name\n );\n const databaseId = new DatabaseId(resourcePath.get(1), resourcePath.get(3));\n const key = new DocumentKey(resourcePath.popFirst(5));\n\n if (!databaseId.isEqual(expectedDatabaseId)) {\n // TODO(b/64130202): Somehow support foreign references.\n logError(\n `Document ${key} contains a document ` +\n `reference within a different database (` +\n `${databaseId.projectId}/${databaseId.database}) which is not ` +\n `supported. It will be treated as a reference in the current ` +\n `database (${expectedDatabaseId.projectId}/${expectedDatabaseId.database}) ` +\n `instead.`\n );\n }\n return key;\n }\n\n protected abstract convertReference(name: string): unknown;\n\n protected abstract convertBytes(bytes: ByteString): unknown;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DocumentData as PublicDocumentData,\n SetOptions as PublicSetOptions\n} from '@firebase/firestore-types';\nimport { getModularInstance } from '@firebase/util';\n\nimport { LimitType } from '../core/query';\nimport { DeleteMutation, Precondition } from '../model/mutation';\nimport {\n invokeBatchGetDocumentsRpc,\n invokeCommitRpc,\n invokeRunQueryRpc\n} from '../remote/datastore';\nimport { hardAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { cast } from '../util/input_validation';\n\nimport { Bytes } from './bytes';\nimport { getDatastore } from './components';\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport { validateHasExplicitOrderByForLimitToLast } from './query';\nimport {\n CollectionReference,\n doc,\n DocumentData,\n DocumentReference,\n PartialWithFieldValue,\n Query,\n SetOptions,\n UpdateData,\n WithFieldValue\n} from './reference';\nimport {\n DocumentSnapshot,\n QueryDocumentSnapshot,\n QuerySnapshot\n} from './snapshot';\nimport {\n newUserDataReader,\n ParsedUpdateData,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UntypedFirestoreDataConverter\n} from './user_data_reader';\nimport { AbstractUserDataWriter } from './user_data_writer';\n\n/**\n * Converts custom model object of type T into `DocumentData` by applying the\n * converter if it exists.\n *\n * This function is used when converting user objects to `DocumentData`\n * because we want to provide the user with a more specific error message if\n * their `set()` or fails due to invalid data originating from a `toFirestore()`\n * call.\n */\nexport function applyFirestoreDataConverter(\n converter: UntypedFirestoreDataConverter | null,\n value: WithFieldValue | PartialWithFieldValue,\n options?: PublicSetOptions\n): PublicDocumentData {\n let convertedValue;\n if (converter) {\n if (options && (options.merge || options.mergeFields)) {\n // Cast to `any` in order to satisfy the union type constraint on\n // toFirestore().\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n convertedValue = (converter as any).toFirestore(value, options);\n } else {\n convertedValue = converter.toFirestore(value as WithFieldValue);\n }\n } else {\n convertedValue = value as PublicDocumentData;\n }\n return convertedValue;\n}\n\nexport class LiteUserDataWriter extends AbstractUserDataWriter {\n constructor(protected firestore: Firestore) {\n super();\n }\n\n protected convertBytes(bytes: ByteString): Bytes {\n return new Bytes(bytes);\n }\n\n protected convertReference(name: string): DocumentReference {\n const key = this.convertDocumentKey(name, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, key);\n }\n}\n\n/**\n * Reads the document referred to by the specified document reference.\n *\n * All documents are directly fetched from the server, even if the document was\n * previously read or modified. Recent modifications are only reflected in the\n * retrieved `DocumentSnapshot` if they have already been applied by the\n * backend. If the client is offline, the read fails. If you like to use\n * caching or see local modifications, please use the full Firestore SDK.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the current\n * document contents.\n */\nexport function getDoc(\n reference: DocumentReference\n): Promise> {\n reference = cast>(\n reference,\n DocumentReference\n );\n const datastore = getDatastore(reference.firestore);\n const userDataWriter = new LiteUserDataWriter(reference.firestore);\n\n return invokeBatchGetDocumentsRpc(datastore, [reference._key]).then(\n result => {\n hardAssert(result.length === 1, 'Expected a single document result');\n const document = result[0];\n return new DocumentSnapshot(\n reference.firestore,\n userDataWriter,\n reference._key,\n document.isFoundDocument() ? document : null,\n reference.converter\n );\n }\n );\n}\n\n/**\n * Executes the query and returns the results as a {@link QuerySnapshot}.\n *\n * All queries are executed directly by the server, even if the query was\n * previously executed. Recent modifications are only reflected in the retrieved\n * results if they have already been applied by the backend. If the client is\n * offline, the operation fails. To see previously cached result and local\n * modifications, use the full Firestore SDK.\n *\n * @param query - The `Query` to execute.\n * @returns A Promise that will be resolved with the results of the query.\n */\nexport function getDocs(\n query: Query\n): Promise> {\n query = cast>(query, Query);\n validateHasExplicitOrderByForLimitToLast(query._query);\n\n const datastore = getDatastore(query.firestore);\n const userDataWriter = new LiteUserDataWriter(query.firestore);\n return invokeRunQueryRpc(datastore, query._query).then(result => {\n const docs = result.map(\n doc =>\n new QueryDocumentSnapshot(\n query.firestore,\n userDataWriter,\n doc.key,\n doc,\n query.converter\n )\n );\n\n if (query._query.limitType === LimitType.Last) {\n // Limit to last queries reverse the orderBy constraint that was\n // specified by the user. As such, we need to reverse the order of the\n // results to return the documents in the expected order.\n docs.reverse();\n }\n\n return new QuerySnapshot(query, docs);\n });\n}\n\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend.\n */\nexport function setDoc(\n reference: DocumentReference,\n data: WithFieldValue\n): Promise;\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created. If you provide `merge`\n * or `mergeFields`, the provided data can be merged into an existing document.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend.\n */\nexport function setDoc(\n reference: DocumentReference,\n data: PartialWithFieldValue,\n options: SetOptions\n): Promise;\nexport function setDoc(\n reference: DocumentReference,\n data: PartialWithFieldValue,\n options?: SetOptions\n): Promise {\n reference = cast>(\n reference,\n DocumentReference\n );\n const convertedValue = applyFirestoreDataConverter(\n reference.converter,\n data,\n options\n );\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'setDoc',\n reference._key,\n convertedValue,\n reference.converter !== null,\n options\n );\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(reference._key, Precondition.none())\n ]);\n}\n\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference`. The update will fail if applied to a document that does\n * not exist.\n *\n * The result of this update will only be reflected in document reads that occur\n * after the returned promise resolves. If the client is offline, the\n * update fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to update.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend.\n */\nexport function updateDoc(\n reference: DocumentReference,\n data: UpdateData\n): Promise;\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference` The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * The result of this update will only be reflected in document reads that occur\n * after the returned promise resolves. If the client is offline, the\n * update fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to update.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend.\n */\nexport function updateDoc(\n reference: DocumentReference,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise;\nexport function updateDoc(\n reference: DocumentReference,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise {\n reference = cast>(\n reference,\n DocumentReference\n );\n const dataReader = newUserDataReader(reference.firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed: ParsedUpdateData;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData\n );\n }\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(reference._key, Precondition.exists(true))\n ]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * The deletion will only be reflected in document reads that occur after the\n * returned promise resolves. If the client is offline, the\n * delete fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the document to delete.\n * @returns A `Promise` resolved once the document has been successfully\n * deleted from the backend.\n */\nexport function deleteDoc(\n reference: DocumentReference\n): Promise {\n reference = cast>(\n reference,\n DocumentReference\n );\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n new DeleteMutation(reference._key, Precondition.none())\n ]);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * The result of this write will only be reflected in document reads that occur\n * after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns A `Promise` resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend.\n */\nexport function addDoc(\n reference: CollectionReference,\n data: WithFieldValue\n): Promise> {\n reference = cast>(\n reference,\n CollectionReference\n );\n const docRef = doc(reference);\n\n const convertedValue = applyFirestoreDataConverter(\n reference.converter,\n data as PartialWithFieldValue\n );\n\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'addDoc',\n docRef._key,\n convertedValue,\n docRef.converter !== null,\n {}\n );\n\n const datastore = getDatastore(reference.firestore);\n return invokeCommitRpc(datastore, [\n parsed.toMutation(docRef._key, Precondition.exists(false))\n ]).then(() => docRef);\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { newQueryComparator } from '../core/query';\nimport { ChangeType, ViewSnapshot } from '../core/view_snapshot';\nimport { FieldPath } from '../lite-api/field_path';\nimport {\n DocumentData,\n PartialWithFieldValue,\n Query,\n queryEqual,\n SetOptions,\n WithFieldValue\n} from '../lite-api/reference';\nimport {\n DocumentSnapshot as LiteDocumentSnapshot,\n fieldPathFromArgument,\n FirestoreDataConverter as LiteFirestoreDataConverter\n} from '../lite-api/snapshot';\nimport { UntypedFirestoreDataConverter } from '../lite-api/user_data_reader';\nimport { AbstractUserDataWriter } from '../lite-api/user_data_writer';\nimport { Document } from '../model/document';\nimport { DocumentKey } from '../model/document_key';\nimport { debugAssert, fail } from '../util/assert';\nimport { Code, FirestoreError } from '../util/error';\n\nimport { Firestore } from './database';\nimport { SnapshotListenOptions } from './reference_impl';\n\n/**\n * Converter used by `withConverter()` to transform user objects of type\n * `AppModelType` into Firestore data of type `DbModelType`.\n *\n * Using the converter allows you to specify generic type arguments when\n * storing and retrieving objects from Firestore.\n *\n * In this context, an \"AppModel\" is a class that is used in an application to\n * package together related information and functionality. Such a class could,\n * for example, have properties with complex, nested data types, properties used\n * for memoization, properties of types not supported by Firestore (such as\n * `symbol` and `bigint`), and helper functions that perform compound\n * operations. Such classes are not suitable and/or possible to store into a\n * Firestore database. Instead, instances of such classes need to be converted\n * to \"plain old JavaScript objects\" (POJOs) with exclusively primitive\n * properties, potentially nested inside other POJOs or arrays of POJOs. In this\n * context, this type is referred to as the \"DbModel\" and would be an object\n * suitable for persisting into Firestore. For convenience, applications can\n * implement `FirestoreDataConverter` and register the converter with Firestore\n * objects, such as `DocumentReference` or `Query`, to automatically convert\n * `AppModel` to `DbModel` when storing into Firestore, and convert `DbModel`\n * to `AppModel` when retrieving from Firestore.\n *\n * @example\n *\n * Simple Example\n *\n * ```typescript\n * const numberConverter = {\n * toFirestore(value: WithFieldValue) {\n * return { value };\n * },\n * fromFirestore(snapshot: QueryDocumentSnapshot, options: SnapshotOptions) {\n * return snapshot.data(options).value as number;\n * }\n * };\n *\n * async function simpleDemo(db: Firestore): Promise {\n * const documentRef = doc(db, 'values/value123').withConverter(numberConverter);\n *\n * // converters are used with `setDoc`, `addDoc`, and `getDoc`\n * await setDoc(documentRef, 42);\n * const snapshot1 = await getDoc(documentRef);\n * assertEqual(snapshot1.data(), 42);\n *\n * // converters are not used when writing data with `updateDoc`\n * await updateDoc(documentRef, { value: 999 });\n * const snapshot2 = await getDoc(documentRef);\n * assertEqual(snapshot2.data(), 999);\n * }\n * ```\n *\n * Advanced Example\n *\n * ```typescript\n * // The Post class is a model that is used by our application.\n * // This class may have properties and methods that are specific\n * // to our application execution, which do not need to be persisted\n * // to Firestore.\n * class Post {\n * constructor(\n * readonly title: string,\n * readonly author: string,\n * readonly lastUpdatedMillis: number\n * ) {}\n * toString(): string {\n * return `${this.title} by ${this.author}`;\n * }\n * }\n *\n * // The PostDbModel represents how we want our posts to be stored\n * // in Firestore. This DbModel has different properties (`ttl`,\n * // `aut`, and `lut`) from the Post class we use in our application.\n * interface PostDbModel {\n * ttl: string;\n * aut: { firstName: string; lastName: string };\n * lut: Timestamp;\n * }\n *\n * // The `PostConverter` implements `FirestoreDataConverter` and specifies\n * // how the Firestore SDK can convert `Post` objects to `PostDbModel`\n * // objects and vice versa.\n * class PostConverter implements FirestoreDataConverter {\n * toFirestore(post: WithFieldValue): WithFieldValue {\n * return {\n * ttl: post.title,\n * aut: this._autFromAuthor(post.author),\n * lut: this._lutFromLastUpdatedMillis(post.lastUpdatedMillis)\n * };\n * }\n *\n * fromFirestore(snapshot: QueryDocumentSnapshot, options: SnapshotOptions): Post {\n * const data = snapshot.data(options) as PostDbModel;\n * const author = `${data.aut.firstName} ${data.aut.lastName}`;\n * return new Post(data.ttl, author, data.lut.toMillis());\n * }\n *\n * _autFromAuthor(\n * author: string | FieldValue\n * ): { firstName: string; lastName: string } | FieldValue {\n * if (typeof author !== 'string') {\n * // `author` is a FieldValue, so just return it.\n * return author;\n * }\n * const [firstName, lastName] = author.split(' ');\n * return {firstName, lastName};\n * }\n *\n * _lutFromLastUpdatedMillis(\n * lastUpdatedMillis: number | FieldValue\n * ): Timestamp | FieldValue {\n * if (typeof lastUpdatedMillis !== 'number') {\n * // `lastUpdatedMillis` must be a FieldValue, so just return it.\n * return lastUpdatedMillis;\n * }\n * return Timestamp.fromMillis(lastUpdatedMillis);\n * }\n * }\n *\n * async function advancedDemo(db: Firestore): Promise {\n * // Create a `DocumentReference` with a `FirestoreDataConverter`.\n * const documentRef = doc(db, 'posts/post123').withConverter(new PostConverter());\n *\n * // The `data` argument specified to `setDoc()` is type checked by the\n * // TypeScript compiler to be compatible with `Post`. Since the `data`\n * // argument is typed as `WithFieldValue` rather than just `Post`,\n * // this allows properties of the `data` argument to also be special\n * // Firestore values that perform server-side mutations, such as\n * // `arrayRemove()`, `deleteField()`, and `serverTimestamp()`.\n * await setDoc(documentRef, {\n * title: 'My Life',\n * author: 'Foo Bar',\n * lastUpdatedMillis: serverTimestamp()\n * });\n *\n * // The TypeScript compiler will fail to compile if the `data` argument to\n * // `setDoc()` is _not_ compatible with `WithFieldValue`. This\n * // type checking prevents the caller from specifying objects with incorrect\n * // properties or property values.\n * // @ts-expect-error \"Argument of type { ttl: string; } is not assignable\n * // to parameter of type WithFieldValue\"\n * await setDoc(documentRef, { ttl: 'The Title' });\n *\n * // When retrieving a document with `getDoc()` the `DocumentSnapshot`\n * // object's `data()` method returns a `Post`, rather than a generic object,\n * // which would have been returned if the `DocumentReference` did _not_ have a\n * // `FirestoreDataConverter` attached to it.\n * const snapshot1: DocumentSnapshot = await getDoc(documentRef);\n * const post1: Post = snapshot1.data()!;\n * if (post1) {\n * assertEqual(post1.title, 'My Life');\n * assertEqual(post1.author, 'Foo Bar');\n * }\n *\n * // The `data` argument specified to `updateDoc()` is type checked by the\n * // TypeScript compiler to be compatible with `PostDbModel`. Note that\n * // unlike `setDoc()`, whose `data` argument must be compatible with `Post`,\n * // the `data` argument to `updateDoc()` must be compatible with\n * // `PostDbModel`. Similar to `setDoc()`, since the `data` argument is typed\n * // as `WithFieldValue` rather than just `PostDbModel`, this\n * // allows properties of the `data` argument to also be those special\n * // Firestore values, like `arrayRemove()`, `deleteField()`, and\n * // `serverTimestamp()`.\n * await updateDoc(documentRef, {\n * 'aut.firstName': 'NewFirstName',\n * lut: serverTimestamp()\n * });\n *\n * // The TypeScript compiler will fail to compile if the `data` argument to\n * // `updateDoc()` is _not_ compatible with `WithFieldValue`.\n * // This type checking prevents the caller from specifying objects with\n * // incorrect properties or property values.\n * // @ts-expect-error \"Argument of type { title: string; } is not assignable\n * // to parameter of type WithFieldValue\"\n * await updateDoc(documentRef, { title: 'New Title' });\n * const snapshot2: DocumentSnapshot = await getDoc(documentRef);\n * const post2: Post = snapshot2.data()!;\n * if (post2) {\n * assertEqual(post2.title, 'My Life');\n * assertEqual(post2.author, 'NewFirstName Bar');\n * }\n * }\n * ```\n */\nexport interface FirestoreDataConverter<\n AppModelType,\n DbModelType extends DocumentData = DocumentData\n> extends LiteFirestoreDataConverter {\n /**\n * Called by the Firestore SDK to convert a custom model object of type\n * `AppModelType` into a plain JavaScript object (suitable for writing\n * directly to the Firestore database) of type `DbModelType`. To use `set()`\n * with `merge` and `mergeFields`, `toFirestore()` must be defined with\n * `PartialWithFieldValue`.\n *\n * The `WithFieldValue` type extends `T` to also allow FieldValues such as\n * {@link (deleteField:1)} to be used as property values.\n */\n toFirestore(\n modelObject: WithFieldValue\n ): WithFieldValue;\n\n /**\n * Called by the Firestore SDK to convert a custom model object of type\n * `AppModelType` into a plain JavaScript object (suitable for writing\n * directly to the Firestore database) of type `DbModelType`. Used with\n * {@link (setDoc:1)}, {@link (WriteBatch.set:1)} and\n * {@link (Transaction.set:1)} with `merge:true` or `mergeFields`.\n *\n * The `PartialWithFieldValue` type extends `Partial` to allow\n * FieldValues such as {@link (arrayUnion:1)} to be used as property values.\n * It also supports nested `Partial` by allowing nested fields to be\n * omitted.\n */\n toFirestore(\n modelObject: PartialWithFieldValue,\n options: SetOptions\n ): PartialWithFieldValue;\n\n /**\n * Called by the Firestore SDK to convert Firestore data into an object of\n * type `AppModelType`. You can access your data by calling:\n * `snapshot.data(options)`.\n *\n * Generally, the data returned from `snapshot.data()` can be cast to\n * `DbModelType`; however, this is not guaranteed because Firestore does not\n * enforce a schema on the database. For example, writes from a previous\n * version of the application or writes from another client that did not use a\n * type converter could have written data with different properties and/or\n * property types. The implementation will need to choose whether to\n * gracefully recover from non-conforming data or throw an error.\n *\n * To override this method, see {@link (FirestoreDataConverter.fromFirestore:1)}.\n *\n * @param snapshot - A `QueryDocumentSnapshot` containing your data and metadata.\n * @param options - The `SnapshotOptions` from the initial call to `data()`.\n */\n fromFirestore(\n snapshot: QueryDocumentSnapshot,\n options?: SnapshotOptions\n ): AppModelType;\n}\n\n/**\n * Options that configure how data is retrieved from a `DocumentSnapshot` (for\n * example the desired behavior for server timestamps that have not yet been set\n * to their final value).\n */\nexport interface SnapshotOptions {\n /**\n * If set, controls the return value for server timestamps that have not yet\n * been set to their final value.\n *\n * By specifying 'estimate', pending server timestamps return an estimate\n * based on the local clock. This estimate will differ from the final value\n * and cause these values to change once the server result becomes available.\n *\n * By specifying 'previous', pending timestamps will be ignored and return\n * their previous value instead.\n *\n * If omitted or set to 'none', `null` will be returned by default until the\n * server value becomes available.\n */\n readonly serverTimestamps?: 'estimate' | 'previous' | 'none';\n}\n\n/**\n * Metadata about a snapshot, describing the state of the snapshot.\n */\nexport class SnapshotMetadata {\n /**\n * True if the snapshot contains the result of local writes (for example\n * `set()` or `update()` calls) that have not yet been committed to the\n * backend. If your listener has opted into metadata updates (via\n * `SnapshotListenOptions`) you will receive another snapshot with\n * `hasPendingWrites` equal to false once the writes have been committed to\n * the backend.\n */\n readonly hasPendingWrites: boolean;\n\n /**\n * True if the snapshot was created from cached data rather than guaranteed\n * up-to-date server data. If your listener has opted into metadata updates\n * (via `SnapshotListenOptions`) you will receive another snapshot with\n * `fromCache` set to false once the client has received up-to-date data from\n * the backend.\n */\n readonly fromCache: boolean;\n\n /** @hideconstructor */\n constructor(hasPendingWrites: boolean, fromCache: boolean) {\n this.hasPendingWrites = hasPendingWrites;\n this.fromCache = fromCache;\n }\n\n /**\n * Returns true if this `SnapshotMetadata` is equal to the provided one.\n *\n * @param other - The `SnapshotMetadata` to compare against.\n * @returns true if this `SnapshotMetadata` is equal to the provided one.\n */\n isEqual(other: SnapshotMetadata): boolean {\n return (\n this.hasPendingWrites === other.hasPendingWrites &&\n this.fromCache === other.fromCache\n );\n }\n}\n\n/**\n * The type of a `DocumentChange` may be 'added', 'removed', or 'modified'.\n */\nexport type DocumentChangeType = 'added' | 'removed' | 'modified';\n\n/**\n * A `DocumentChange` represents a change to the documents matching a query.\n * It contains the document affected and the type of change that occurred.\n */\nexport interface DocumentChange<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n /** The type of change ('added', 'modified', or 'removed'). */\n readonly type: DocumentChangeType;\n\n /** The document affected by this change. */\n readonly doc: QueryDocumentSnapshot;\n\n /**\n * The index of the changed document in the result set immediately prior to\n * this `DocumentChange` (i.e. supposing that all prior `DocumentChange` objects\n * have been applied). Is `-1` for 'added' events.\n */\n readonly oldIndex: number;\n\n /**\n * The index of the changed document in the result set immediately after\n * this `DocumentChange` (i.e. supposing that all prior `DocumentChange`\n * objects and the current `DocumentChange` object have been applied).\n * Is -1 for 'removed' events.\n */\n readonly newIndex: number;\n}\n\n/**\n * A `DocumentSnapshot` contains data read from a document in your Firestore\n * database. The data can be extracted with `.data()` or `.get()` to\n * get a specific field.\n *\n * For a `DocumentSnapshot` that points to a non-existing document, any data\n * access will return 'undefined'. You can use the `exists()` method to\n * explicitly verify a document's existence.\n */\nexport class DocumentSnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> extends LiteDocumentSnapshot {\n private readonly _firestoreImpl: Firestore;\n\n /**\n * Metadata about the `DocumentSnapshot`, including information about its\n * source and local modifications.\n */\n readonly metadata: SnapshotMetadata;\n\n /** @hideconstructor protected */\n constructor(\n readonly _firestore: Firestore,\n userDataWriter: AbstractUserDataWriter,\n key: DocumentKey,\n document: Document | null,\n metadata: SnapshotMetadata,\n converter: UntypedFirestoreDataConverter | null\n ) {\n super(_firestore, userDataWriter, key, document, converter);\n this._firestoreImpl = _firestore;\n this.metadata = metadata;\n }\n\n /**\n * Returns whether or not the data exists. True if the document exists.\n */\n exists(): this is QueryDocumentSnapshot {\n return super.exists();\n }\n\n /**\n * Retrieves all fields in the document as an `Object`. Returns `undefined` if\n * the document doesn't exist.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document or `undefined` if\n * the document doesn't exist.\n */\n data(options: SnapshotOptions = {}): AppModelType | undefined {\n if (!this._document) {\n return undefined;\n } else if (this._converter) {\n // We only want to use the converter and create a new DocumentSnapshot\n // if a converter has been provided.\n const snapshot = new QueryDocumentSnapshot(\n this._firestore,\n this._userDataWriter,\n this._key,\n this._document,\n this.metadata,\n /* converter= */ null\n );\n return this._converter.fromFirestore(snapshot, options);\n } else {\n return this._userDataWriter.convertValue(\n this._document.data.value,\n options.serverTimestamps\n ) as AppModelType;\n }\n }\n\n /**\n * Retrieves the field specified by `fieldPath`. Returns `undefined` if the\n * document or field doesn't exist.\n *\n * By default, a `serverTimestamp()` that has not yet been set to\n * its final value will be returned as `null`. You can override this by\n * passing an options object.\n *\n * @param fieldPath - The path (for example 'foo' or 'foo.bar') to a specific\n * field.\n * @param options - An options object to configure how the field is retrieved\n * from the snapshot (for example the desired behavior for server timestamps\n * that have not yet been set to their final value).\n * @returns The data at the specified field location or undefined if no such\n * field exists in the document.\n */\n // We are using `any` here to avoid an explicit cast by our users.\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n get(fieldPath: string | FieldPath, options: SnapshotOptions = {}): any {\n if (this._document) {\n const value = this._document.data.field(\n fieldPathFromArgument('DocumentSnapshot.get', fieldPath)\n );\n if (value !== null) {\n return this._userDataWriter.convertValue(\n value,\n options.serverTimestamps\n );\n }\n }\n return undefined;\n }\n}\n\n/**\n * A `QueryDocumentSnapshot` contains data read from a document in your\n * Firestore database as part of a query. The document is guaranteed to exist\n * and its data can be extracted with `.data()` or `.get()` to get a\n * specific field.\n *\n * A `QueryDocumentSnapshot` offers the same API surface as a\n * `DocumentSnapshot`. Since query results contain only existing documents, the\n * `exists` property will always be true and `data()` will never return\n * 'undefined'.\n */\nexport class QueryDocumentSnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> extends DocumentSnapshot {\n /**\n * Retrieves all fields in the document as an `Object`.\n *\n * By default, `serverTimestamp()` values that have not yet been\n * set to their final value will be returned as `null`. You can override\n * this by passing an options object.\n *\n * @override\n * @param options - An options object to configure how data is retrieved from\n * the snapshot (for example the desired behavior for server timestamps that\n * have not yet been set to their final value).\n * @returns An `Object` containing all fields in the document.\n */\n data(options: SnapshotOptions = {}): AppModelType {\n return super.data(options) as AppModelType;\n }\n}\n\n/**\n * A `QuerySnapshot` contains zero or more `DocumentSnapshot` objects\n * representing the results of a query. The documents can be accessed as an\n * array via the `docs` property or enumerated using the `forEach` method. The\n * number of documents can be determined via the `empty` and `size`\n * properties.\n */\nexport class QuerySnapshot<\n AppModelType = DocumentData,\n DbModelType extends DocumentData = DocumentData\n> {\n /**\n * Metadata about this snapshot, concerning its source and if it has local\n * modifications.\n */\n readonly metadata: SnapshotMetadata;\n\n /**\n * The query on which you called `get` or `onSnapshot` in order to get this\n * `QuerySnapshot`.\n */\n readonly query: Query;\n\n private _cachedChanges?: Array>;\n private _cachedChangesIncludeMetadataChanges?: boolean;\n\n /** @hideconstructor */\n constructor(\n readonly _firestore: Firestore,\n readonly _userDataWriter: AbstractUserDataWriter,\n query: Query,\n readonly _snapshot: ViewSnapshot\n ) {\n this.metadata = new SnapshotMetadata(\n _snapshot.hasPendingWrites,\n _snapshot.fromCache\n );\n this.query = query;\n }\n\n /** An array of all the documents in the `QuerySnapshot`. */\n get docs(): Array> {\n const result: Array> = [];\n this.forEach(doc => result.push(doc));\n return result;\n }\n\n /** The number of documents in the `QuerySnapshot`. */\n get size(): number {\n return this._snapshot.docs.size;\n }\n\n /** True if there are no documents in the `QuerySnapshot`. */\n get empty(): boolean {\n return this.size === 0;\n }\n\n /**\n * Enumerates all of the documents in the `QuerySnapshot`.\n *\n * @param callback - A callback to be called with a `QueryDocumentSnapshot` for\n * each document in the snapshot.\n * @param thisArg - The `this` binding for the callback.\n */\n forEach(\n callback: (\n result: QueryDocumentSnapshot\n ) => void,\n thisArg?: unknown\n ): void {\n this._snapshot.docs.forEach(doc => {\n callback.call(\n thisArg,\n new QueryDocumentSnapshot(\n this._firestore,\n this._userDataWriter,\n doc.key,\n doc,\n new SnapshotMetadata(\n this._snapshot.mutatedKeys.has(doc.key),\n this._snapshot.fromCache\n ),\n this.query.converter\n )\n );\n });\n }\n\n /**\n * Returns an array of the documents changes since the last snapshot. If this\n * is the first snapshot, all documents will be in the list as 'added'\n * changes.\n *\n * @param options - `SnapshotListenOptions` that control whether metadata-only\n * changes (i.e. only `DocumentSnapshot.metadata` changed) should trigger\n * snapshot events.\n */\n docChanges(\n options: SnapshotListenOptions = {}\n ): Array> {\n const includeMetadataChanges = !!options.includeMetadataChanges;\n\n if (includeMetadataChanges && this._snapshot.excludesMetadataChanges) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'To include metadata changes with your document changes, you must ' +\n 'also pass { includeMetadataChanges:true } to onSnapshot().'\n );\n }\n\n if (\n !this._cachedChanges ||\n this._cachedChangesIncludeMetadataChanges !== includeMetadataChanges\n ) {\n this._cachedChanges = changesFromSnapshot(this, includeMetadataChanges);\n this._cachedChangesIncludeMetadataChanges = includeMetadataChanges;\n }\n\n return this._cachedChanges;\n }\n}\n\n/** Calculates the array of `DocumentChange`s for a given `ViewSnapshot`. */\nexport function changesFromSnapshot<\n AppModelType,\n DbModelType extends DocumentData\n>(\n querySnapshot: QuerySnapshot,\n includeMetadataChanges: boolean\n): Array> {\n if (querySnapshot._snapshot.oldDocs.isEmpty()) {\n // Special case the first snapshot because index calculation is easy and\n // fast\n let lastDoc: Document;\n let index = 0;\n return querySnapshot._snapshot.docChanges.map(change => {\n debugAssert(\n change.type === ChangeType.Added,\n 'Invalid event type for first snapshot'\n );\n debugAssert(\n !lastDoc ||\n newQueryComparator(querySnapshot._snapshot.query)(\n lastDoc,\n change.doc\n ) < 0,\n 'Got added events in wrong order'\n );\n const doc = new QueryDocumentSnapshot(\n querySnapshot._firestore,\n querySnapshot._userDataWriter,\n change.doc.key,\n change.doc,\n new SnapshotMetadata(\n querySnapshot._snapshot.mutatedKeys.has(change.doc.key),\n querySnapshot._snapshot.fromCache\n ),\n querySnapshot.query.converter\n );\n lastDoc = change.doc;\n return {\n type: 'added' as DocumentChangeType,\n doc,\n oldIndex: -1,\n newIndex: index++\n };\n });\n } else {\n // A `DocumentSet` that is updated incrementally as changes are applied to use\n // to lookup the index of a document.\n let indexTracker = querySnapshot._snapshot.oldDocs;\n return querySnapshot._snapshot.docChanges\n .filter(\n change => includeMetadataChanges || change.type !== ChangeType.Metadata\n )\n .map(change => {\n const doc = new QueryDocumentSnapshot(\n querySnapshot._firestore,\n querySnapshot._userDataWriter,\n change.doc.key,\n change.doc,\n new SnapshotMetadata(\n querySnapshot._snapshot.mutatedKeys.has(change.doc.key),\n querySnapshot._snapshot.fromCache\n ),\n querySnapshot.query.converter\n );\n let oldIndex = -1;\n let newIndex = -1;\n if (change.type !== ChangeType.Added) {\n oldIndex = indexTracker.indexOf(change.doc.key);\n debugAssert(oldIndex >= 0, 'Index for document not found');\n indexTracker = indexTracker.delete(change.doc.key);\n }\n if (change.type !== ChangeType.Removed) {\n indexTracker = indexTracker.add(change.doc);\n newIndex = indexTracker.indexOf(change.doc.key);\n }\n return {\n type: resultChangeType(change.type),\n doc,\n oldIndex,\n newIndex\n };\n });\n }\n}\n\nexport function resultChangeType(type: ChangeType): DocumentChangeType {\n switch (type) {\n case ChangeType.Added:\n return 'added';\n case ChangeType.Modified:\n case ChangeType.Metadata:\n return 'modified';\n case ChangeType.Removed:\n return 'removed';\n default:\n return fail('Unknown change type: ' + type);\n }\n}\n\n// TODO(firestoreexp): Add tests for snapshotEqual with different snapshot\n// metadata\n/**\n * Returns true if the provided snapshots are equal.\n *\n * @param left - A snapshot to compare.\n * @param right - A snapshot to compare.\n * @returns true if the snapshots are equal.\n */\nexport function snapshotEqual(\n left:\n | DocumentSnapshot\n | QuerySnapshot,\n right:\n | DocumentSnapshot\n | QuerySnapshot\n): boolean {\n if (left instanceof DocumentSnapshot && right instanceof DocumentSnapshot) {\n return (\n left._firestore === right._firestore &&\n left._key.isEqual(right._key) &&\n (left._document === null\n ? right._document === null\n : left._document.isEqual(right._document)) &&\n left._converter === right._converter\n );\n } else if (left instanceof QuerySnapshot && right instanceof QuerySnapshot) {\n return (\n left._firestore === right._firestore &&\n queryEqual(left.query, right.query) &&\n left.metadata.isEqual(right.metadata) &&\n left._snapshot.isEqual(right._snapshot)\n );\n }\n\n return false;\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport {\n CompleteFn,\n ErrorFn,\n isPartialObserver,\n NextFn,\n PartialObserver\n} from '../api/observer';\nimport { ListenerDataSource } from '../core/event_manager';\nimport {\n firestoreClientAddSnapshotsInSyncListener,\n firestoreClientGetDocumentFromLocalCache,\n firestoreClientGetDocumentsFromLocalCache,\n firestoreClientGetDocumentsViaSnapshotListener,\n firestoreClientGetDocumentViaSnapshotListener,\n firestoreClientListen,\n firestoreClientWrite\n} from '../core/firestore_client';\nimport { newQueryForPath, Query as InternalQuery } from '../core/query';\nimport { ViewSnapshot } from '../core/view_snapshot';\nimport { Bytes } from '../lite-api/bytes';\nimport { FieldPath } from '../lite-api/field_path';\nimport { validateHasExplicitOrderByForLimitToLast } from '../lite-api/query';\nimport {\n CollectionReference,\n doc,\n DocumentData,\n DocumentReference,\n PartialWithFieldValue,\n Query,\n SetOptions,\n UpdateData,\n WithFieldValue\n} from '../lite-api/reference';\nimport { applyFirestoreDataConverter } from '../lite-api/reference_impl';\nimport {\n newUserDataReader,\n ParsedUpdateData,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs\n} from '../lite-api/user_data_reader';\nimport { AbstractUserDataWriter } from '../lite-api/user_data_writer';\nimport { DeleteMutation, Mutation, Precondition } from '../model/mutation';\nimport { debugAssert } from '../util/assert';\nimport { ByteString } from '../util/byte_string';\nimport { FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\n\nimport { ensureFirestoreConfigured, Firestore } from './database';\nimport { DocumentSnapshot, QuerySnapshot, SnapshotMetadata } from './snapshot';\n\n/**\n * An options object that can be passed to {@link (onSnapshot:1)} and {@link\n * QuerySnapshot.docChanges} to control which types of changes to include in the\n * result set.\n */\nexport interface SnapshotListenOptions {\n /**\n * Include a change even if only the metadata of the query or of a document\n * changed. Default is false.\n */\n readonly includeMetadataChanges?: boolean;\n\n /**\n * Set the source the query listens to. Default to \"default\", which\n * listens to both cache and server.\n */\n readonly source?: ListenSource;\n}\n\n/**\n * Describe the source a query listens to.\n *\n * Set to `default` to listen to both cache and server changes. Set to `cache`\n * to listen to changes in cache only.\n */\nexport type ListenSource = 'default' | 'cache';\n\n/**\n * Reads the document referred to by this `DocumentReference`.\n *\n * Note: `getDoc()` attempts to provide up-to-date data when possible by waiting\n * for data from the server, but it may return cached data or fail if you are\n * offline and the server cannot be reached. To specify this behavior, invoke\n * {@link getDocFromCache} or {@link getDocFromServer}.\n *\n * @param reference - The reference of the document to fetch.\n * @returns A Promise resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDoc(\n reference: DocumentReference\n): Promise> {\n reference = cast>(\n reference,\n DocumentReference\n );\n const firestore = cast(reference.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n\n return firestoreClientGetDocumentViaSnapshotListener(\n client,\n reference._key\n ).then(snapshot => convertToDocSnapshot(firestore, reference, snapshot));\n}\n\nexport class ExpUserDataWriter extends AbstractUserDataWriter {\n constructor(protected firestore: Firestore) {\n super();\n }\n\n protected convertBytes(bytes: ByteString): Bytes {\n return new Bytes(bytes);\n }\n\n protected convertReference(name: string): DocumentReference {\n const key = this.convertDocumentKey(name, this.firestore._databaseId);\n return new DocumentReference(this.firestore, /* converter= */ null, key);\n }\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from cache.\n * Returns an error if the document is not currently cached.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDocFromCache(\n reference: DocumentReference\n): Promise> {\n reference = cast>(\n reference,\n DocumentReference\n );\n const firestore = cast(reference.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentFromLocalCache(client, reference._key).then(\n doc =>\n new DocumentSnapshot(\n firestore,\n userDataWriter,\n reference._key,\n doc,\n new SnapshotMetadata(\n doc !== null && doc.hasLocalMutations,\n /* fromCache= */ true\n ),\n reference.converter\n )\n );\n}\n\n/**\n * Reads the document referred to by this `DocumentReference` from the server.\n * Returns an error if the network is not available.\n *\n * @returns A `Promise` resolved with a `DocumentSnapshot` containing the\n * current document contents.\n */\nexport function getDocFromServer<\n AppModelType,\n DbModelType extends DocumentData\n>(\n reference: DocumentReference\n): Promise> {\n reference = cast>(\n reference,\n DocumentReference\n );\n const firestore = cast(reference.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n\n return firestoreClientGetDocumentViaSnapshotListener(client, reference._key, {\n source: 'server'\n }).then(snapshot => convertToDocSnapshot(firestore, reference, snapshot));\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot`.\n *\n * Note: `getDocs()` attempts to provide up-to-date data when possible by\n * waiting for data from the server, but it may return cached data or fail if\n * you are offline and the server cannot be reached. To specify this behavior,\n * invoke {@link getDocsFromCache} or {@link getDocsFromServer}.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */\nexport function getDocs(\n query: Query\n): Promise> {\n query = cast>(query, Query);\n const firestore = cast(query.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n validateHasExplicitOrderByForLimitToLast(query._query);\n return firestoreClientGetDocumentsViaSnapshotListener(\n client,\n query._query\n ).then(\n snapshot =>\n new QuerySnapshot(\n firestore,\n userDataWriter,\n query,\n snapshot\n )\n );\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from cache.\n * Returns an empty result set if no documents matching the query are currently\n * cached.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */\nexport function getDocsFromCache<\n AppModelType,\n DbModelType extends DocumentData\n>(\n query: Query\n): Promise> {\n query = cast>(query, Query);\n const firestore = cast(query.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentsFromLocalCache(client, query._query).then(\n snapshot =>\n new QuerySnapshot(\n firestore,\n userDataWriter,\n query,\n snapshot\n )\n );\n}\n\n/**\n * Executes the query and returns the results as a `QuerySnapshot` from the\n * server. Returns an error if the network is not available.\n *\n * @returns A `Promise` that will be resolved with the results of the query.\n */\nexport function getDocsFromServer<\n AppModelType,\n DbModelType extends DocumentData\n>(\n query: Query\n): Promise> {\n query = cast>(query, Query);\n const firestore = cast(query.firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n return firestoreClientGetDocumentsViaSnapshotListener(client, query._query, {\n source: 'server'\n }).then(\n snapshot => new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n}\n\n/**\n * Writes to the document referred to by this `DocumentReference`. If the\n * document does not yet exist, it will be created.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function setDoc(\n reference: DocumentReference,\n data: WithFieldValue\n): Promise;\n/**\n * Writes to the document referred to by the specified `DocumentReference`. If\n * the document does not yet exist, it will be created. If you provide `merge`\n * or `mergeFields`, the provided data can be merged into an existing document.\n *\n * @param reference - A reference to the document to write.\n * @param data - A map of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @returns A Promise resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function setDoc(\n reference: DocumentReference,\n data: PartialWithFieldValue,\n options: SetOptions\n): Promise;\nexport function setDoc(\n reference: DocumentReference,\n data: PartialWithFieldValue,\n options?: SetOptions\n): Promise {\n reference = cast>(\n reference,\n DocumentReference\n );\n const firestore = cast(reference.firestore, Firestore);\n\n const convertedValue = applyFirestoreDataConverter(\n reference.converter,\n data as WithFieldValue,\n options\n );\n const dataReader = newUserDataReader(firestore);\n const parsed = parseSetData(\n dataReader,\n 'setDoc',\n reference._key,\n convertedValue,\n reference.converter !== null,\n options\n );\n\n const mutation = parsed.toMutation(reference._key, Precondition.none());\n return executeWrite(firestore, [mutation]);\n}\n\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference`. The update will fail if applied to a document that does\n * not exist.\n *\n * @param reference - A reference to the document to update.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function updateDoc(\n reference: DocumentReference,\n data: UpdateData\n): Promise;\n/**\n * Updates fields in the document referred to by the specified\n * `DocumentReference` The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * @param reference - A reference to the document to update.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @returns A `Promise` resolved once the data has been successfully written\n * to the backend (note that it won't resolve while you're offline).\n */\nexport function updateDoc(\n reference: DocumentReference,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise;\nexport function updateDoc(\n reference: DocumentReference,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n): Promise {\n reference = cast>(\n reference,\n DocumentReference\n );\n const firestore = cast(reference.firestore, Firestore);\n\n const dataReader = newUserDataReader(firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed: ParsedUpdateData;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n dataReader,\n 'updateDoc',\n reference._key,\n fieldOrUpdateData\n );\n }\n\n const mutation = parsed.toMutation(reference._key, Precondition.exists(true));\n return executeWrite(firestore, [mutation]);\n}\n\n/**\n * Deletes the document referred to by the specified `DocumentReference`.\n *\n * @param reference - A reference to the document to delete.\n * @returns A Promise resolved once the document has been successfully\n * deleted from the backend (note that it won't resolve while you're offline).\n */\nexport function deleteDoc(\n reference: DocumentReference\n): Promise {\n const firestore = cast(reference.firestore, Firestore);\n const mutations = [new DeleteMutation(reference._key, Precondition.none())];\n return executeWrite(firestore, mutations);\n}\n\n/**\n * Add a new document to specified `CollectionReference` with the given data,\n * assigning it a document ID automatically.\n *\n * @param reference - A reference to the collection to add this document to.\n * @param data - An Object containing the data for the new document.\n * @returns A `Promise` resolved with a `DocumentReference` pointing to the\n * newly created document after it has been written to the backend (Note that it\n * won't resolve while you're offline).\n */\nexport function addDoc(\n reference: CollectionReference,\n data: WithFieldValue\n): Promise> {\n const firestore = cast(reference.firestore, Firestore);\n\n const docRef = doc(reference);\n const convertedValue = applyFirestoreDataConverter(reference.converter, data);\n\n const dataReader = newUserDataReader(reference.firestore);\n const parsed = parseSetData(\n dataReader,\n 'addDoc',\n docRef._key,\n convertedValue,\n reference.converter !== null,\n {}\n );\n\n const mutation = parsed.toMutation(docRef._key, Precondition.exists(false));\n return executeWrite(firestore, [mutation]).then(() => docRef);\n}\n\n/**\n * A function returned by `onSnapshot()` that removes the listener when invoked.\n */\nexport interface Unsubscribe {\n /** Removes the listener when invoked. */\n (): void;\n}\n\n// TODO(firestorexp): Make sure these overloads are tested via the Firestore\n// integration tests\n\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n reference: DocumentReference,\n observer: {\n next?: (snapshot: DocumentSnapshot) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param options - Options controlling the listen behavior.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n reference: DocumentReference,\n options: SnapshotListenOptions,\n observer: {\n next?: (snapshot: DocumentSnapshot) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param onNext - A callback to be called every time a new `DocumentSnapshot`\n * is available.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n reference: DocumentReference,\n onNext: (snapshot: DocumentSnapshot) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `DocumentSnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param reference - A reference to the document to listen to.\n * @param options - Options controlling the listen behavior.\n * @param onNext - A callback to be called every time a new `DocumentSnapshot`\n * is available.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n reference: DocumentReference,\n options: SnapshotListenOptions,\n onNext: (snapshot: DocumentSnapshot) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n query: Query,\n observer: {\n next?: (snapshot: QuerySnapshot) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param options - Options controlling the listen behavior.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n query: Query,\n options: SnapshotListenOptions,\n observer: {\n next?: (snapshot: QuerySnapshot) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param onNext - A callback to be called every time a new `QuerySnapshot`\n * is available.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n query: Query,\n onNext: (snapshot: QuerySnapshot) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\n/**\n * Attaches a listener for `QuerySnapshot` events. You may either pass\n * individual `onNext` and `onError` callbacks or pass a single observer\n * object with `next` and `error` callbacks. The listener can be cancelled by\n * calling the function that is returned when `onSnapshot` is called.\n *\n * NOTE: Although an `onCompletion` callback can be provided, it will\n * never be called because the snapshot stream is never-ending.\n *\n * @param query - The query to listen to.\n * @param options - Options controlling the listen behavior.\n * @param onNext - A callback to be called every time a new `QuerySnapshot`\n * is available.\n * @param onCompletion - Can be provided, but will not be called since streams are\n * never ending.\n * @param onError - A callback to be called if the listen fails or is\n * cancelled. No further callbacks will occur.\n * @returns An unsubscribe function that can be called to cancel\n * the snapshot listener.\n */\nexport function onSnapshot(\n query: Query,\n options: SnapshotListenOptions,\n onNext: (snapshot: QuerySnapshot) => void,\n onError?: (error: FirestoreError) => void,\n onCompletion?: () => void\n): Unsubscribe;\nexport function onSnapshot(\n reference:\n | Query\n | DocumentReference,\n ...args: unknown[]\n): Unsubscribe {\n reference = getModularInstance(reference);\n\n let options: SnapshotListenOptions = {\n includeMetadataChanges: false,\n source: 'default'\n };\n let currArg = 0;\n if (typeof args[currArg] === 'object' && !isPartialObserver(args[currArg])) {\n options = args[currArg] as SnapshotListenOptions;\n currArg++;\n }\n\n const internalOptions = {\n includeMetadataChanges: options.includeMetadataChanges,\n source: options.source as ListenerDataSource\n };\n\n if (isPartialObserver(args[currArg])) {\n const userObserver = args[currArg] as PartialObserver<\n QuerySnapshot\n >;\n args[currArg] = userObserver.next?.bind(userObserver);\n args[currArg + 1] = userObserver.error?.bind(userObserver);\n args[currArg + 2] = userObserver.complete?.bind(userObserver);\n }\n\n let observer: PartialObserver;\n let firestore: Firestore;\n let internalQuery: InternalQuery;\n\n if (reference instanceof DocumentReference) {\n firestore = cast(reference.firestore, Firestore);\n internalQuery = newQueryForPath(reference._key.path);\n\n observer = {\n next: snapshot => {\n if (args[currArg]) {\n (\n args[currArg] as NextFn>\n )(\n convertToDocSnapshot(\n firestore,\n reference as DocumentReference,\n snapshot\n )\n );\n }\n },\n error: args[currArg + 1] as ErrorFn,\n complete: args[currArg + 2] as CompleteFn\n };\n } else {\n const query = cast>(reference, Query);\n firestore = cast(query.firestore, Firestore);\n internalQuery = query._query;\n const userDataWriter = new ExpUserDataWriter(firestore);\n\n observer = {\n next: snapshot => {\n if (args[currArg]) {\n (args[currArg] as NextFn>)(\n new QuerySnapshot(firestore, userDataWriter, query, snapshot)\n );\n }\n },\n error: args[currArg + 1] as ErrorFn,\n complete: args[currArg + 2] as CompleteFn\n };\n\n validateHasExplicitOrderByForLimitToLast(reference._query);\n }\n\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientListen(\n client,\n internalQuery,\n internalOptions,\n observer\n );\n}\n\n// TODO(firestorexp): Make sure these overloads are tested via the Firestore\n// integration tests\n\n/**\n * Attaches a listener for a snapshots-in-sync event. The snapshots-in-sync\n * event indicates that all listeners affected by a given change have fired,\n * even if a single server-generated change affects multiple listeners.\n *\n * NOTE: The snapshots-in-sync event only indicates that listeners are in sync\n * with each other, but does not relate to whether those snapshots are in sync\n * with the server. Use SnapshotMetadata in the individual listeners to\n * determine if a snapshot is from the cache or the server.\n *\n * @param firestore - The instance of Firestore for synchronizing snapshots.\n * @param observer - A single object containing `next` and `error` callbacks.\n * @returns An unsubscribe function that can be called to cancel the snapshot\n * listener.\n */\nexport function onSnapshotsInSync(\n firestore: Firestore,\n observer: {\n next?: (value: void) => void;\n error?: (error: FirestoreError) => void;\n complete?: () => void;\n }\n): Unsubscribe;\n/**\n * Attaches a listener for a snapshots-in-sync event. The snapshots-in-sync\n * event indicates that all listeners affected by a given change have fired,\n * even if a single server-generated change affects multiple listeners.\n *\n * NOTE: The snapshots-in-sync event only indicates that listeners are in sync\n * with each other, but does not relate to whether those snapshots are in sync\n * with the server. Use `SnapshotMetadata` in the individual listeners to\n * determine if a snapshot is from the cache or the server.\n *\n * @param firestore - The `Firestore` instance for synchronizing snapshots.\n * @param onSync - A callback to be called every time all snapshot listeners are\n * in sync with each other.\n * @returns An unsubscribe function that can be called to cancel the snapshot\n * listener.\n */\nexport function onSnapshotsInSync(\n firestore: Firestore,\n onSync: () => void\n): Unsubscribe;\nexport function onSnapshotsInSync(\n firestore: Firestore,\n arg: unknown\n): Unsubscribe {\n firestore = cast(firestore, Firestore);\n const client = ensureFirestoreConfigured(firestore);\n const observer = isPartialObserver(arg)\n ? (arg as PartialObserver)\n : {\n next: arg as () => void\n };\n\n return firestoreClientAddSnapshotsInSyncListener(client, observer);\n}\n\n/**\n * Locally writes `mutations` on the async queue.\n * @internal\n */\nexport function executeWrite(\n firestore: Firestore,\n mutations: Mutation[]\n): Promise {\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientWrite(client, mutations);\n}\n\n/**\n * Converts a {@link ViewSnapshot} that contains the single document specified by `ref`\n * to a {@link DocumentSnapshot}.\n */\nfunction convertToDocSnapshot(\n firestore: Firestore,\n ref: DocumentReference,\n snapshot: ViewSnapshot\n): DocumentSnapshot {\n debugAssert(\n snapshot.docs.size <= 1,\n 'Expected zero or a single result on a document-only query'\n );\n const doc = snapshot.docs.get(ref._key);\n\n const userDataWriter = new ExpUserDataWriter(firestore);\n return new DocumentSnapshot(\n firestore,\n userDataWriter,\n ref._key,\n doc,\n new SnapshotMetadata(snapshot.hasPendingWrites, snapshot.fromCache),\n ref.converter\n );\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Code, FirestoreError } from '../util/error';\n\nexport const DEFAULT_TRANSACTION_OPTIONS: TransactionOptions = {\n maxAttempts: 5\n};\n\n/**\n * Options to customize transaction behavior.\n */\nexport declare interface TransactionOptions {\n /** Maximum number of attempts to commit, after which transaction fails. Default is 5. */\n readonly maxAttempts: number;\n}\n\nexport function validateTransactionOptions(options: TransactionOptions): void {\n if (options.maxAttempts < 1) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Max attempts must be at least 1'\n );\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Compat, getModularInstance } from '@firebase/util';\n\nimport { DeleteMutation, Mutation, Precondition } from '../model/mutation';\nimport { invokeCommitRpc } from '../remote/datastore';\nimport { Code, FirestoreError } from '../util/error';\nimport { cast } from '../util/input_validation';\n\nimport { getDatastore } from './components';\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport {\n DocumentData,\n DocumentReference,\n PartialWithFieldValue,\n SetOptions,\n UpdateData,\n WithFieldValue\n} from './reference';\nimport { applyFirestoreDataConverter } from './reference_impl';\nimport {\n newUserDataReader,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UserDataReader\n} from './user_data_reader';\n\n/**\n * A write batch, used to perform multiple writes as a single atomic unit.\n *\n * A `WriteBatch` object can be acquired by calling {@link writeBatch}. It\n * provides methods for adding writes to the write batch. None of the writes\n * will be committed (or visible locally) until {@link WriteBatch.commit} is\n * called.\n */\nexport class WriteBatch {\n // This is the lite version of the WriteBatch API used in the legacy SDK. The\n // class is a close copy but takes different input types.\n\n private readonly _dataReader: UserDataReader;\n private _mutations = [] as Mutation[];\n private _committed = false;\n\n /** @hideconstructor */\n constructor(\n private readonly _firestore: Firestore,\n private readonly _commitHandler: (m: Mutation[]) => Promise\n ) {\n this._dataReader = newUserDataReader(_firestore);\n }\n\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n set(\n documentRef: DocumentReference,\n data: WithFieldValue\n ): WriteBatch;\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n * If you provide `merge` or `mergeFields`, the provided data can be merged\n * into an existing document.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n set(\n documentRef: DocumentReference,\n data: PartialWithFieldValue,\n options: SetOptions\n ): WriteBatch;\n set(\n documentRef: DocumentReference,\n data: WithFieldValue | PartialWithFieldValue,\n options?: SetOptions\n ): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n\n const convertedValue = applyFirestoreDataConverter(\n ref.converter,\n data,\n options\n );\n const parsed = parseSetData(\n this._dataReader,\n 'WriteBatch.set',\n ref._key,\n convertedValue,\n ref.converter !== null,\n options\n );\n this._mutations.push(parsed.toMutation(ref._key, Precondition.none()));\n return this;\n }\n\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference,\n data: UpdateData\n ): WriteBatch;\n /**\n * Updates fields in the document referred to by this {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be update by providing dot-separated field path strings\n * or by providing `FieldPath` objects.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key value pairs.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n ): WriteBatch;\n update(\n documentRef: DocumentReference,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n ): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n this._dataReader,\n 'WriteBatch.update',\n ref._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n this._dataReader,\n 'WriteBatch.update',\n ref._key,\n fieldOrUpdateData\n );\n }\n\n this._mutations.push(\n parsed.toMutation(ref._key, Precondition.exists(true))\n );\n return this;\n }\n\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `WriteBatch` instance. Used for chaining method calls.\n */\n delete(\n documentRef: DocumentReference\n ): WriteBatch {\n this._verifyNotCommitted();\n const ref = validateReference(documentRef, this._firestore);\n this._mutations = this._mutations.concat(\n new DeleteMutation(ref._key, Precondition.none())\n );\n return this;\n }\n\n /**\n * Commits all of the writes in this write batch as a single atomic unit.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A `Promise` resolved once all of the writes in the batch have been\n * successfully written to the backend as an atomic unit (note that it won't\n * resolve while you're offline).\n */\n commit(): Promise {\n this._verifyNotCommitted();\n this._committed = true;\n if (this._mutations.length > 0) {\n return this._commitHandler(this._mutations);\n }\n\n return Promise.resolve();\n }\n\n private _verifyNotCommitted(): void {\n if (this._committed) {\n throw new FirestoreError(\n Code.FAILED_PRECONDITION,\n 'A write batch can no longer be used after commit() ' +\n 'has been called.'\n );\n }\n }\n}\n\nexport function validateReference<\n AppModelType,\n DbModelType extends DocumentData\n>(\n documentRef:\n | DocumentReference\n | Compat>,\n firestore: Firestore\n): DocumentReference {\n documentRef = getModularInstance(documentRef);\n\n if (documentRef.firestore !== firestore) {\n throw new FirestoreError(\n Code.INVALID_ARGUMENT,\n 'Provided document reference is from a different Firestore instance.'\n );\n } else {\n return documentRef as DocumentReference;\n }\n}\n\n/**\n * Creates a write batch, used for performing multiple writes as a single\n * atomic operation. The maximum number of writes allowed in a single WriteBatch\n * is 500.\n *\n * The result of these writes will only be reflected in document reads that\n * occur after the returned promise resolves. If the client is offline, the\n * write fails. If you would like to see local modifications or buffer writes\n * until the client is online, use the full Firestore SDK.\n *\n * @returns A `WriteBatch` that can be used to atomically execute multiple\n * writes.\n */\nexport function writeBatch(firestore: Firestore): WriteBatch {\n firestore = cast(firestore, Firestore);\n const datastore = getDatastore(firestore);\n return new WriteBatch(firestore, writes =>\n invokeCommitRpc(datastore, writes)\n );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { firestoreClientTransaction } from '../core/firestore_client';\nimport { Transaction as InternalTransaction } from '../core/transaction';\nimport {\n TransactionOptions as TransactionOptionsInternal,\n DEFAULT_TRANSACTION_OPTIONS,\n validateTransactionOptions\n} from '../core/transaction_options';\nimport { DocumentData, DocumentReference } from '../lite-api/reference';\nimport { Transaction as LiteTransaction } from '../lite-api/transaction';\nimport { validateReference } from '../lite-api/write_batch';\nimport { cast } from '../util/input_validation';\n\nimport { ensureFirestoreConfigured, Firestore } from './database';\nimport { ExpUserDataWriter } from './reference_impl';\nimport { DocumentSnapshot, SnapshotMetadata } from './snapshot';\nimport { TransactionOptions } from './transaction_options';\n\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nexport class Transaction extends LiteTransaction {\n // This class implements the same logic as the Transaction API in the Lite SDK\n // but is subclassed in order to return its own DocumentSnapshot types.\n\n /** @hideconstructor */\n constructor(\n protected readonly _firestore: Firestore,\n _transaction: InternalTransaction\n ) {\n super(_firestore, _transaction);\n }\n\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */\n get(\n documentRef: DocumentReference\n ): Promise> {\n const ref = validateReference(documentRef, this._firestore);\n const userDataWriter = new ExpUserDataWriter(this._firestore);\n return super\n .get(documentRef)\n .then(\n liteDocumentSnapshot =>\n new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n ref._key,\n liteDocumentSnapshot._document,\n new SnapshotMetadata(\n /* hasPendingWrites= */ false,\n /* fromCache= */ false\n ),\n ref.converter\n )\n );\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @param options - An options object to configure maximum number of attempts to\n * commit.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */\nexport function runTransaction(\n firestore: Firestore,\n updateFunction: (transaction: Transaction) => Promise,\n options?: TransactionOptions\n): Promise {\n firestore = cast(firestore, Firestore);\n const optionsWithDefaults: TransactionOptionsInternal = {\n ...DEFAULT_TRANSACTION_OPTIONS,\n ...options\n };\n validateTransactionOptions(optionsWithDefaults);\n const client = ensureFirestoreConfigured(firestore);\n return firestoreClientTransaction(\n client,\n internalTransaction =>\n updateFunction(new Transaction(firestore, internalTransaction)),\n optionsWithDefaults\n );\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { getModularInstance } from '@firebase/util';\n\nimport { Transaction as InternalTransaction } from '../core/transaction';\nimport {\n DEFAULT_TRANSACTION_OPTIONS,\n TransactionOptions as TransactionOptionsInternal,\n validateTransactionOptions\n} from '../core/transaction_options';\nimport { TransactionRunner } from '../core/transaction_runner';\nimport { fail } from '../util/assert';\nimport { newAsyncQueue } from '../util/async_queue_impl';\nimport { cast } from '../util/input_validation';\nimport { Deferred } from '../util/promise';\n\nimport { getDatastore } from './components';\nimport { Firestore } from './database';\nimport { FieldPath } from './field_path';\nimport {\n DocumentData,\n DocumentReference,\n PartialWithFieldValue,\n SetOptions,\n UpdateData,\n WithFieldValue\n} from './reference';\nimport {\n applyFirestoreDataConverter,\n LiteUserDataWriter\n} from './reference_impl';\nimport { DocumentSnapshot } from './snapshot';\nimport { TransactionOptions } from './transaction_options';\nimport {\n newUserDataReader,\n parseSetData,\n parseUpdateData,\n parseUpdateVarargs,\n UserDataReader\n} from './user_data_reader';\nimport { validateReference } from './write_batch';\n\n// TODO(mrschmidt) Consider using `BaseTransaction` as the base class in the\n// legacy SDK.\n\n/**\n * A reference to a transaction.\n *\n * The `Transaction` object passed to a transaction's `updateFunction` provides\n * the methods to read and write data within the transaction context. See\n * {@link runTransaction}.\n */\nexport class Transaction {\n // This is the tree-shakeable version of the Transaction class used in the\n // legacy SDK. The class is a close copy but takes different input and output\n // types. The firestore-exp SDK further extends this class to return its API\n // type.\n\n private readonly _dataReader: UserDataReader;\n\n /** @hideconstructor */\n constructor(\n protected readonly _firestore: Firestore,\n private readonly _transaction: InternalTransaction\n ) {\n this._dataReader = newUserDataReader(_firestore);\n }\n\n /**\n * Reads the document referenced by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be read.\n * @returns A `DocumentSnapshot` with the read data.\n */\n get(\n documentRef: DocumentReference\n ): Promise> {\n const ref = validateReference(documentRef, this._firestore);\n const userDataWriter = new LiteUserDataWriter(this._firestore);\n return this._transaction.lookup([ref._key]).then(docs => {\n if (!docs || docs.length !== 1) {\n return fail('Mismatch in docs returned from document lookup.');\n }\n const doc = docs[0];\n if (doc.isFoundDocument()) {\n return new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n doc.key,\n doc,\n ref.converter\n );\n } else if (doc.isNoDocument()) {\n return new DocumentSnapshot(\n this._firestore,\n userDataWriter,\n ref._key,\n null,\n ref.converter\n );\n } else {\n throw fail(\n `BatchGetDocumentsRequest returned unexpected document: ${doc}`\n );\n }\n });\n }\n\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n set(\n documentRef: DocumentReference,\n data: WithFieldValue\n ): this;\n /**\n * Writes to the document referred to by the provided {@link\n * DocumentReference}. If the document does not exist yet, it will be created.\n * If you provide `merge` or `mergeFields`, the provided data can be merged\n * into an existing document.\n *\n * @param documentRef - A reference to the document to be set.\n * @param data - An object of the fields and values for the document.\n * @param options - An object to configure the set behavior.\n * @throws Error - If the provided input is not a valid Firestore document.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n set(\n documentRef: DocumentReference,\n data: PartialWithFieldValue,\n options: SetOptions\n ): this;\n set(\n documentRef: DocumentReference,\n value: PartialWithFieldValue,\n options?: SetOptions\n ): this {\n const ref = validateReference(documentRef, this._firestore);\n const convertedValue = applyFirestoreDataConverter(\n ref.converter,\n value,\n options\n );\n const parsed = parseSetData(\n this._dataReader,\n 'Transaction.set',\n ref._key,\n convertedValue,\n ref.converter !== null,\n options\n );\n this._transaction.set(ref._key, parsed);\n return this;\n }\n\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param data - An object containing the fields and values with which to\n * update the document. Fields can contain dots to reference nested fields\n * within the document.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference,\n data: UpdateData\n ): this;\n /**\n * Updates fields in the document referred to by the provided {@link\n * DocumentReference}. The update will fail if applied to a document that does\n * not exist.\n *\n * Nested fields can be updated by providing dot-separated field path\n * strings or by providing `FieldPath` objects.\n *\n * @param documentRef - A reference to the document to be updated.\n * @param field - The first field to update.\n * @param value - The first value.\n * @param moreFieldsAndValues - Additional key/value pairs.\n * @throws Error - If the provided input is not valid Firestore data.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n update(\n documentRef: DocumentReference,\n field: string | FieldPath,\n value: unknown,\n ...moreFieldsAndValues: unknown[]\n ): this;\n update(\n documentRef: DocumentReference,\n fieldOrUpdateData: string | FieldPath | UpdateData,\n value?: unknown,\n ...moreFieldsAndValues: unknown[]\n ): this {\n const ref = validateReference(documentRef, this._firestore);\n\n // For Compat types, we have to \"extract\" the underlying types before\n // performing validation.\n fieldOrUpdateData = getModularInstance(fieldOrUpdateData);\n\n let parsed;\n if (\n typeof fieldOrUpdateData === 'string' ||\n fieldOrUpdateData instanceof FieldPath\n ) {\n parsed = parseUpdateVarargs(\n this._dataReader,\n 'Transaction.update',\n ref._key,\n fieldOrUpdateData,\n value,\n moreFieldsAndValues\n );\n } else {\n parsed = parseUpdateData(\n this._dataReader,\n 'Transaction.update',\n ref._key,\n fieldOrUpdateData\n );\n }\n\n this._transaction.update(ref._key, parsed);\n return this;\n }\n\n /**\n * Deletes the document referred to by the provided {@link DocumentReference}.\n *\n * @param documentRef - A reference to the document to be deleted.\n * @returns This `Transaction` instance. Used for chaining method calls.\n */\n delete(\n documentRef: DocumentReference\n ): this {\n const ref = validateReference(documentRef, this._firestore);\n this._transaction.delete(ref._key);\n return this;\n }\n}\n\n/**\n * Executes the given `updateFunction` and then attempts to commit the changes\n * applied within the transaction. If any document read within the transaction\n * has changed, Cloud Firestore retries the `updateFunction`. If it fails to\n * commit after 5 attempts, the transaction fails.\n *\n * The maximum number of writes allowed in a single transaction is 500.\n *\n * @param firestore - A reference to the Firestore database to run this\n * transaction against.\n * @param updateFunction - The function to execute within the transaction\n * context.\n * @param options - An options object to configure maximum number of attempts to\n * commit.\n * @returns If the transaction completed successfully or was explicitly aborted\n * (the `updateFunction` returned a failed promise), the promise returned by the\n * `updateFunction `is returned here. Otherwise, if the transaction failed, a\n * rejected promise with the corresponding failure error is returned.\n */\nexport function runTransaction(\n firestore: Firestore,\n updateFunction: (transaction: Transaction) => Promise,\n options?: TransactionOptions\n): Promise {\n firestore = cast(firestore, Firestore);\n const datastore = getDatastore(firestore);\n const optionsWithDefaults: TransactionOptionsInternal = {\n ...DEFAULT_TRANSACTION_OPTIONS,\n ...options\n };\n validateTransactionOptions(optionsWithDefaults);\n const deferred = new Deferred();\n new TransactionRunner(\n newAsyncQueue(),\n datastore,\n optionsWithDefaults,\n internalTransaction =>\n updateFunction(new Transaction(firestore, internalTransaction)),\n deferred\n ).run();\n return deferred.promise;\n}\n","/**\n * @license\n * Copyright 2023 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n firestoreClientDeleteAllFieldIndexes,\n firestoreClientSetPersistentCacheIndexAutoCreationEnabled\n} from '../core/firestore_client';\nimport { cast } from '../util/input_validation';\nimport { logDebug, logWarn } from '../util/log';\n\nimport { ensureFirestoreConfigured, Firestore } from './database';\n\n/**\n * A `PersistentCacheIndexManager` for configuring persistent cache indexes used\n * for local query execution.\n *\n * To use, call `getPersistentCacheIndexManager()` to get an instance.\n */\nexport class PersistentCacheIndexManager {\n /** A type string to uniquely identify instances of this class. */\n readonly type: 'PersistentCacheIndexManager' = 'PersistentCacheIndexManager';\n\n /** @hideconstructor */\n constructor(readonly _firestore: Firestore) {}\n}\n\n/**\n * Returns the PersistentCache Index Manager used by the given `Firestore`\n * object.\n *\n * @return The `PersistentCacheIndexManager` instance, or `null` if local\n * persistent storage is not in use.\n */\nexport function getPersistentCacheIndexManager(\n firestore: Firestore\n): PersistentCacheIndexManager | null {\n firestore = cast(firestore, Firestore);\n\n const cachedInstance = persistentCacheIndexManagerByFirestore.get(firestore);\n if (cachedInstance) {\n return cachedInstance;\n }\n\n const client = ensureFirestoreConfigured(firestore);\n if (client._uninitializedComponentsProvider?._offline.kind !== 'persistent') {\n return null;\n }\n\n const instance = new PersistentCacheIndexManager(firestore);\n persistentCacheIndexManagerByFirestore.set(firestore, instance);\n return instance;\n}\n\n/**\n * Enables the SDK to create persistent cache indexes automatically for local\n * query execution when the SDK believes cache indexes can help improve\n * performance.\n *\n * This feature is disabled by default.\n */\nexport function enablePersistentCacheIndexAutoCreation(\n indexManager: PersistentCacheIndexManager\n): void {\n setPersistentCacheIndexAutoCreationEnabled(indexManager, true);\n}\n\n/**\n * Stops creating persistent cache indexes automatically for local query\n * execution. The indexes which have been created by calling\n * `enablePersistentCacheIndexAutoCreation()` still take effect.\n */\nexport function disablePersistentCacheIndexAutoCreation(\n indexManager: PersistentCacheIndexManager\n): void {\n setPersistentCacheIndexAutoCreationEnabled(indexManager, false);\n}\n\n/**\n * Removes all persistent cache indexes.\n *\n * Please note this function will also deletes indexes generated by\n * `setIndexConfiguration()`, which is deprecated.\n */\nexport function deleteAllPersistentCacheIndexes(\n indexManager: PersistentCacheIndexManager\n): void {\n const client = ensureFirestoreConfigured(indexManager._firestore);\n const promise = firestoreClientDeleteAllFieldIndexes(client);\n\n promise\n .then(_ => logDebug('deleting all persistent cache indexes succeeded'))\n .catch(error =>\n logWarn('deleting all persistent cache indexes failed', error)\n );\n}\n\nfunction setPersistentCacheIndexAutoCreationEnabled(\n indexManager: PersistentCacheIndexManager,\n isEnabled: boolean\n): void {\n const client = ensureFirestoreConfigured(indexManager._firestore);\n const promise = firestoreClientSetPersistentCacheIndexAutoCreationEnabled(\n client,\n isEnabled\n );\n\n promise\n .then(_ =>\n logDebug(\n `setting persistent cache index auto creation ` +\n `isEnabled=${isEnabled} succeeded`\n )\n )\n .catch(error =>\n logWarn(\n `setting persistent cache index auto creation ` +\n `isEnabled=${isEnabled} failed`,\n error\n )\n );\n}\n\n/**\n * Maps `Firestore` instances to their corresponding\n * `PersistentCacheIndexManager` instances.\n *\n * Use a `WeakMap` so that the mapping will be automatically dropped when the\n * `Firestore` instance is garbage collected. This emulates a private member\n * as described in https://goo.gle/454yvug.\n */\nconst persistentCacheIndexManagerByFirestore = new WeakMap<\n Firestore,\n PersistentCacheIndexManager\n>();\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\nimport { Component, ComponentType } from '@firebase/component';\n\nimport { name, version } from '../package.json';\nimport {\n FirebaseAppCheckTokenProvider,\n FirebaseAuthCredentialsProvider\n} from '../src/api/credentials';\nimport { setSDKVersion } from '../src/core/version';\n\nimport { Firestore } from './api/database';\nimport { databaseIdFromApp } from './core/database_info';\n\nexport function registerFirestore(\n variant?: string,\n useFetchStreams = true\n): void {\n setSDKVersion(SDK_VERSION);\n _registerComponent(\n new Component(\n 'firestore',\n (container, { instanceIdentifier: databaseId, options: settings }) => {\n const app = container.getProvider('app').getImmediate()!;\n const firestoreInstance = new Firestore(\n new FirebaseAuthCredentialsProvider(\n container.getProvider('auth-internal')\n ),\n new FirebaseAppCheckTokenProvider(\n container.getProvider('app-check-internal')\n ),\n databaseIdFromApp(app, databaseId),\n app\n );\n settings = { useFetchStreams, ...settings };\n firestoreInstance._setSettings(settings);\n return firestoreInstance;\n },\n 'PUBLIC' as ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n registerVersion(name, version, variant);\n // BUILD_TARGET will be replaced by values like esm2017, cjs2017, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n}\n","/**\n * Cloud Firestore\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Firestore } from './api/database';\nimport { registerFirestore } from './register';\n\nregisterFirestore();\n\nexport * from './api';\n\ndeclare module '@firebase/component' {\n interface NameServiceMapping {\n 'firestore': Firestore;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Constants used in the Firebase Storage library.\n */\n\n/**\n * Domain name for firebase storage.\n */\nexport const DEFAULT_HOST = 'firebasestorage.googleapis.com';\n\n/**\n * The key in Firebase config json for the storage bucket.\n */\nexport const CONFIG_STORAGE_BUCKET_KEY = 'storageBucket';\n\n/**\n * 2 minutes\n *\n * The timeout for all operations except upload.\n */\nexport const DEFAULT_MAX_OPERATION_RETRY_TIME = 2 * 60 * 1000;\n\n/**\n * 10 minutes\n *\n * The timeout for upload.\n */\nexport const DEFAULT_MAX_UPLOAD_RETRY_TIME = 10 * 60 * 1000;\n\n/**\n * 1 second\n */\nexport const DEFAULT_MIN_SLEEP_TIME_MILLIS = 1000;\n\n/**\n * This is the value of Number.MIN_SAFE_INTEGER, which is not well supported\n * enough for us to use it directly.\n */\nexport const MIN_SAFE_INTEGER = -9007199254740991;\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { FirebaseError } from '@firebase/util';\n\nimport { CONFIG_STORAGE_BUCKET_KEY } from './constants';\n\n/**\n * An error returned by the Firebase Storage SDK.\n * @public\n */\nexport class StorageError extends FirebaseError {\n private readonly _baseMessage: string;\n /**\n * Stores custom error data unique to the `StorageError`.\n */\n customData: { serverResponse: string | null } = { serverResponse: null };\n\n /**\n * @param code - A `StorageErrorCode` string to be prefixed with 'storage/' and\n * added to the end of the message.\n * @param message - Error message.\n * @param status_ - Corresponding HTTP Status Code\n */\n constructor(code: StorageErrorCode, message: string, private status_ = 0) {\n super(\n prependCode(code),\n `Firebase Storage: ${message} (${prependCode(code)})`\n );\n this._baseMessage = this.message;\n // Without this, `instanceof StorageError`, in tests for example,\n // returns false.\n Object.setPrototypeOf(this, StorageError.prototype);\n }\n\n get status(): number {\n return this.status_;\n }\n\n set status(status: number) {\n this.status_ = status;\n }\n\n /**\n * Compares a `StorageErrorCode` against this error's code, filtering out the prefix.\n */\n _codeEquals(code: StorageErrorCode): boolean {\n return prependCode(code) === this.code;\n }\n\n /**\n * Optional response message that was added by the server.\n */\n get serverResponse(): null | string {\n return this.customData.serverResponse;\n }\n\n set serverResponse(serverResponse: string | null) {\n this.customData.serverResponse = serverResponse;\n if (this.customData.serverResponse) {\n this.message = `${this._baseMessage}\\n${this.customData.serverResponse}`;\n } else {\n this.message = this._baseMessage;\n }\n }\n}\n\nexport const errors = {};\n\n/**\n * @public\n * Error codes that can be attached to `StorageError` objects.\n */\nexport enum StorageErrorCode {\n // Shared between all platforms\n UNKNOWN = 'unknown',\n OBJECT_NOT_FOUND = 'object-not-found',\n BUCKET_NOT_FOUND = 'bucket-not-found',\n PROJECT_NOT_FOUND = 'project-not-found',\n QUOTA_EXCEEDED = 'quota-exceeded',\n UNAUTHENTICATED = 'unauthenticated',\n UNAUTHORIZED = 'unauthorized',\n UNAUTHORIZED_APP = 'unauthorized-app',\n RETRY_LIMIT_EXCEEDED = 'retry-limit-exceeded',\n INVALID_CHECKSUM = 'invalid-checksum',\n CANCELED = 'canceled',\n // JS specific\n INVALID_EVENT_NAME = 'invalid-event-name',\n INVALID_URL = 'invalid-url',\n INVALID_DEFAULT_BUCKET = 'invalid-default-bucket',\n NO_DEFAULT_BUCKET = 'no-default-bucket',\n CANNOT_SLICE_BLOB = 'cannot-slice-blob',\n SERVER_FILE_WRONG_SIZE = 'server-file-wrong-size',\n NO_DOWNLOAD_URL = 'no-download-url',\n INVALID_ARGUMENT = 'invalid-argument',\n INVALID_ARGUMENT_COUNT = 'invalid-argument-count',\n APP_DELETED = 'app-deleted',\n INVALID_ROOT_OPERATION = 'invalid-root-operation',\n INVALID_FORMAT = 'invalid-format',\n INTERNAL_ERROR = 'internal-error',\n UNSUPPORTED_ENVIRONMENT = 'unsupported-environment'\n}\n\nexport function prependCode(code: StorageErrorCode): string {\n return 'storage/' + code;\n}\n\nexport function unknown(): StorageError {\n const message =\n 'An unknown error occurred, please check the error payload for ' +\n 'server response.';\n return new StorageError(StorageErrorCode.UNKNOWN, message);\n}\n\nexport function objectNotFound(path: string): StorageError {\n return new StorageError(\n StorageErrorCode.OBJECT_NOT_FOUND,\n \"Object '\" + path + \"' does not exist.\"\n );\n}\n\nexport function bucketNotFound(bucket: string): StorageError {\n return new StorageError(\n StorageErrorCode.BUCKET_NOT_FOUND,\n \"Bucket '\" + bucket + \"' does not exist.\"\n );\n}\n\nexport function projectNotFound(project: string): StorageError {\n return new StorageError(\n StorageErrorCode.PROJECT_NOT_FOUND,\n \"Project '\" + project + \"' does not exist.\"\n );\n}\n\nexport function quotaExceeded(bucket: string): StorageError {\n return new StorageError(\n StorageErrorCode.QUOTA_EXCEEDED,\n \"Quota for bucket '\" +\n bucket +\n \"' exceeded, please view quota on \" +\n 'https://firebase.google.com/pricing/.'\n );\n}\n\nexport function unauthenticated(): StorageError {\n const message =\n 'User is not authenticated, please authenticate using Firebase ' +\n 'Authentication and try again.';\n return new StorageError(StorageErrorCode.UNAUTHENTICATED, message);\n}\n\nexport function unauthorizedApp(): StorageError {\n return new StorageError(\n StorageErrorCode.UNAUTHORIZED_APP,\n 'This app does not have permission to access Firebase Storage on this project.'\n );\n}\n\nexport function unauthorized(path: string): StorageError {\n return new StorageError(\n StorageErrorCode.UNAUTHORIZED,\n \"User does not have permission to access '\" + path + \"'.\"\n );\n}\n\nexport function retryLimitExceeded(): StorageError {\n return new StorageError(\n StorageErrorCode.RETRY_LIMIT_EXCEEDED,\n 'Max retry time for operation exceeded, please try again.'\n );\n}\n\nexport function invalidChecksum(\n path: string,\n checksum: string,\n calculated: string\n): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_CHECKSUM,\n \"Uploaded/downloaded object '\" +\n path +\n \"' has checksum '\" +\n checksum +\n \"' which does not match '\" +\n calculated +\n \"'. Please retry the upload/download.\"\n );\n}\n\nexport function canceled(): StorageError {\n return new StorageError(\n StorageErrorCode.CANCELED,\n 'User canceled the upload/download.'\n );\n}\n\nexport function invalidEventName(name: string): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_EVENT_NAME,\n \"Invalid event name '\" + name + \"'.\"\n );\n}\n\nexport function invalidUrl(url: string): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_URL,\n \"Invalid URL '\" + url + \"'.\"\n );\n}\n\nexport function invalidDefaultBucket(bucket: string): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_DEFAULT_BUCKET,\n \"Invalid default bucket '\" + bucket + \"'.\"\n );\n}\n\nexport function noDefaultBucket(): StorageError {\n return new StorageError(\n StorageErrorCode.NO_DEFAULT_BUCKET,\n 'No default bucket ' +\n \"found. Did you set the '\" +\n CONFIG_STORAGE_BUCKET_KEY +\n \"' property when initializing the app?\"\n );\n}\n\nexport function cannotSliceBlob(): StorageError {\n return new StorageError(\n StorageErrorCode.CANNOT_SLICE_BLOB,\n 'Cannot slice blob for upload. Please retry the upload.'\n );\n}\n\nexport function serverFileWrongSize(): StorageError {\n return new StorageError(\n StorageErrorCode.SERVER_FILE_WRONG_SIZE,\n 'Server recorded incorrect upload file size, please retry the upload.'\n );\n}\n\nexport function noDownloadURL(): StorageError {\n return new StorageError(\n StorageErrorCode.NO_DOWNLOAD_URL,\n 'The given file does not have any download URLs.'\n );\n}\n\nexport function missingPolyFill(polyFill: string): StorageError {\n return new StorageError(\n StorageErrorCode.UNSUPPORTED_ENVIRONMENT,\n `${polyFill} is missing. Make sure to install the required polyfills. See https://firebase.google.com/docs/web/environments-js-sdk#polyfills for more information.`\n );\n}\n\n/**\n * @internal\n */\nexport function invalidArgument(message: string): StorageError {\n return new StorageError(StorageErrorCode.INVALID_ARGUMENT, message);\n}\n\nexport function invalidArgumentCount(\n argMin: number,\n argMax: number,\n fnName: string,\n real: number\n): StorageError {\n let countPart;\n let plural;\n if (argMin === argMax) {\n countPart = argMin;\n plural = argMin === 1 ? 'argument' : 'arguments';\n } else {\n countPart = 'between ' + argMin + ' and ' + argMax;\n plural = 'arguments';\n }\n return new StorageError(\n StorageErrorCode.INVALID_ARGUMENT_COUNT,\n 'Invalid argument count in `' +\n fnName +\n '`: Expected ' +\n countPart +\n ' ' +\n plural +\n ', received ' +\n real +\n '.'\n );\n}\n\nexport function appDeleted(): StorageError {\n return new StorageError(\n StorageErrorCode.APP_DELETED,\n 'The Firebase app was deleted.'\n );\n}\n\n/**\n * @param name - The name of the operation that was invalid.\n *\n * @internal\n */\nexport function invalidRootOperation(name: string): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_ROOT_OPERATION,\n \"The operation '\" +\n name +\n \"' cannot be performed on a root reference, create a non-root \" +\n \"reference using child, such as .child('file.png').\"\n );\n}\n\n/**\n * @param format - The format that was not valid.\n * @param message - A message describing the format violation.\n */\nexport function invalidFormat(format: string, message: string): StorageError {\n return new StorageError(\n StorageErrorCode.INVALID_FORMAT,\n \"String does not match format '\" + format + \"': \" + message\n );\n}\n\n/**\n * @param message - A message describing the internal error.\n */\nexport function unsupportedEnvironment(message: string): StorageError {\n throw new StorageError(StorageErrorCode.UNSUPPORTED_ENVIRONMENT, message);\n}\n\n/**\n * @param message - A message describing the internal error.\n */\nexport function internalError(message: string): StorageError {\n throw new StorageError(\n StorageErrorCode.INTERNAL_ERROR,\n 'Internal error: ' + message\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/** Network headers */\nexport type Headers = Record;\n\n/** Response type exposed by the networking APIs. */\nexport type ConnectionType =\n | string\n | ArrayBuffer\n | Blob\n | ReadableStream;\n\n/**\n * A lightweight wrapper around XMLHttpRequest with a\n * goog.net.XhrIo-like interface.\n *\n * You can create a new connection by invoking `newTextConnection()`,\n * `newBytesConnection()` or `newStreamConnection()`.\n */\nexport interface Connection {\n /**\n * Sends a request to the provided URL.\n *\n * This method never rejects its promise. In case of encountering an error,\n * it sets an error code internally which can be accessed by calling\n * getErrorCode() by callers.\n */\n send(\n url: string,\n method: string,\n body?: ArrayBufferView | Blob | string | null,\n headers?: Headers\n ): Promise;\n\n getErrorCode(): ErrorCode;\n\n getStatus(): number;\n\n getResponse(): T;\n\n getErrorText(): string;\n\n /**\n * Abort the request.\n */\n abort(): void;\n\n getResponseHeader(header: string): string | null;\n\n addUploadProgressListener(listener: (p1: ProgressEvent) => void): void;\n\n removeUploadProgressListener(listener: (p1: ProgressEvent) => void): void;\n}\n\n/**\n * Error codes for requests made by the XhrIo wrapper.\n */\nexport enum ErrorCode {\n NO_ERROR = 0,\n NETWORK_ERROR = 1,\n ABORT = 2\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Functionality related to the parsing/composition of bucket/\n * object location.\n */\n\nimport { invalidDefaultBucket, invalidUrl } from './error';\nimport { DEFAULT_HOST } from './constants';\n\n/**\n * Firebase Storage location data.\n *\n * @internal\n */\nexport class Location {\n private path_: string;\n\n constructor(public readonly bucket: string, path: string) {\n this.path_ = path;\n }\n\n get path(): string {\n return this.path_;\n }\n\n get isRoot(): boolean {\n return this.path.length === 0;\n }\n\n fullServerUrl(): string {\n const encode = encodeURIComponent;\n return '/b/' + encode(this.bucket) + '/o/' + encode(this.path);\n }\n\n bucketOnlyServerUrl(): string {\n const encode = encodeURIComponent;\n return '/b/' + encode(this.bucket) + '/o';\n }\n\n static makeFromBucketSpec(bucketString: string, host: string): Location {\n let bucketLocation;\n try {\n bucketLocation = Location.makeFromUrl(bucketString, host);\n } catch (e) {\n // Not valid URL, use as-is. This lets you put bare bucket names in\n // config.\n return new Location(bucketString, '');\n }\n if (bucketLocation.path === '') {\n return bucketLocation;\n } else {\n throw invalidDefaultBucket(bucketString);\n }\n }\n\n static makeFromUrl(url: string, host: string): Location {\n let location: Location | null = null;\n const bucketDomain = '([A-Za-z0-9.\\\\-_]+)';\n\n function gsModify(loc: Location): void {\n if (loc.path.charAt(loc.path.length - 1) === '/') {\n loc.path_ = loc.path_.slice(0, -1);\n }\n }\n const gsPath = '(/(.*))?$';\n const gsRegex = new RegExp('^gs://' + bucketDomain + gsPath, 'i');\n const gsIndices = { bucket: 1, path: 3 };\n\n function httpModify(loc: Location): void {\n loc.path_ = decodeURIComponent(loc.path);\n }\n const version = 'v[A-Za-z0-9_]+';\n const firebaseStorageHost = host.replace(/[.]/g, '\\\\.');\n const firebaseStoragePath = '(/([^?#]*).*)?$';\n const firebaseStorageRegExp = new RegExp(\n `^https?://${firebaseStorageHost}/${version}/b/${bucketDomain}/o${firebaseStoragePath}`,\n 'i'\n );\n const firebaseStorageIndices = { bucket: 1, path: 3 };\n\n const cloudStorageHost =\n host === DEFAULT_HOST\n ? '(?:storage.googleapis.com|storage.cloud.google.com)'\n : host;\n const cloudStoragePath = '([^?#]*)';\n const cloudStorageRegExp = new RegExp(\n `^https?://${cloudStorageHost}/${bucketDomain}/${cloudStoragePath}`,\n 'i'\n );\n const cloudStorageIndices = { bucket: 1, path: 2 };\n\n const groups = [\n { regex: gsRegex, indices: gsIndices, postModify: gsModify },\n {\n regex: firebaseStorageRegExp,\n indices: firebaseStorageIndices,\n postModify: httpModify\n },\n {\n regex: cloudStorageRegExp,\n indices: cloudStorageIndices,\n postModify: httpModify\n }\n ];\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const captures = group.regex.exec(url);\n if (captures) {\n const bucketValue = captures[group.indices.bucket];\n let pathValue = captures[group.indices.path];\n if (!pathValue) {\n pathValue = '';\n }\n location = new Location(bucketValue, pathValue);\n group.postModify(location);\n break;\n }\n }\n if (location == null) {\n throw invalidUrl(url);\n }\n return location;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StorageError } from './error';\nimport { Request } from './request';\n\n/**\n * A request whose promise always fails.\n */\nexport class FailRequest implements Request {\n promise_: Promise;\n\n constructor(error: StorageError) {\n this.promise_ = Promise.reject(error);\n }\n\n /** @inheritDoc */\n getPromise(): Promise {\n return this.promise_;\n }\n\n /** @inheritDoc */\n cancel(_appDelete = false): void {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { invalidArgument } from './error';\n\nexport function isJustDef(p: T | null | undefined): p is T | null {\n return p !== void 0;\n}\n\n// eslint-disable-next-line @typescript-eslint/ban-types\nexport function isFunction(p: unknown): p is Function {\n return typeof p === 'function';\n}\n\nexport function isNonArrayObject(p: unknown): boolean {\n return typeof p === 'object' && !Array.isArray(p);\n}\n\nexport function isString(p: unknown): p is string {\n return typeof p === 'string' || p instanceof String;\n}\n\nexport function isNativeBlob(p: unknown): p is Blob {\n return isNativeBlobDefined() && p instanceof Blob;\n}\n\nexport function isNativeBlobDefined(): boolean {\n return typeof Blob !== 'undefined';\n}\n\nexport function validateNumber(\n argument: string,\n minValue: number,\n maxValue: number,\n value: number\n): void {\n if (value < minValue) {\n throw invalidArgument(\n `Invalid value for '${argument}'. Expected ${minValue} or greater.`\n );\n }\n if (value > maxValue) {\n throw invalidArgument(\n `Invalid value for '${argument}'. Expected ${maxValue} or less.`\n );\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Functions to create and manipulate URLs for the server API.\n */\nimport { UrlParams } from './requestinfo';\n\nexport function makeUrl(\n urlPart: string,\n host: string,\n protocol: string\n): string {\n let origin = host;\n if (protocol == null) {\n origin = `https://${host}`;\n }\n return `${protocol}://${origin}/v0${urlPart}`;\n}\n\nexport function makeQueryString(params: UrlParams): string {\n const encode = encodeURIComponent;\n let queryPart = '?';\n for (const key in params) {\n if (params.hasOwnProperty(key)) {\n const nextPart = encode(key) + '=' + encode(params[key]);\n queryPart = queryPart + nextPart + '&';\n }\n }\n\n // Chop off the extra '&' or '?' on the end\n queryPart = queryPart.slice(0, -1);\n return queryPart;\n}\n","/**\n * @license\n * Copyright 2022 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Checks the status code to see if the action should be retried.\n *\n * @param status Current HTTP status code returned by server.\n * @param additionalRetryCodes additional retry codes to check against\n */\nexport function isRetryStatusCode(\n status: number,\n additionalRetryCodes: number[]\n): boolean {\n // The codes for which to retry came from this page:\n // https://cloud.google.com/storage/docs/exponential-backoff\n const isFiveHundredCode = status >= 500 && status < 600;\n const extraRetryCodes = [\n // Request Timeout: web server didn't receive full request in time.\n 408,\n // Too Many Requests: you're getting rate-limited, basically.\n 429\n ];\n const isExtraRetryCode = extraRetryCodes.indexOf(status) !== -1;\n const isAdditionalRetryCode = additionalRetryCodes.indexOf(status) !== -1;\n return isFiveHundredCode || isExtraRetryCode || isAdditionalRetryCode;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Defines methods used to actually send HTTP requests from\n * abstract representations.\n */\n\nimport { id as backoffId, start, stop } from './backoff';\nimport { appDeleted, canceled, retryLimitExceeded, unknown } from './error';\nimport { ErrorHandler, RequestHandler, RequestInfo } from './requestinfo';\nimport { isJustDef } from './type';\nimport { makeQueryString } from './url';\nimport { Connection, ErrorCode, Headers, ConnectionType } from './connection';\nimport { isRetryStatusCode } from './utils';\n\nexport interface Request {\n getPromise(): Promise;\n\n /**\n * Cancels the request. IMPORTANT: the promise may still be resolved with an\n * appropriate value (if the request is finished before you call this method,\n * but the promise has not yet been resolved), so don't just assume it will be\n * rejected if you call this function.\n * @param appDelete - True if the cancelation came from the app being deleted.\n */\n cancel(appDelete?: boolean): void;\n}\n\n/**\n * Handles network logic for all Storage Requests, including error reporting and\n * retries with backoff.\n *\n * @param I - the type of the backend's network response.\n * @param - O the output type used by the rest of the SDK. The conversion\n * happens in the specified `callback_`.\n */\nclass NetworkRequest implements Request {\n private pendingConnection_: Connection | null = null;\n private backoffId_: backoffId | null = null;\n private resolve_!: (value?: O | PromiseLike) => void;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private reject_!: (reason?: any) => void;\n private canceled_: boolean = false;\n private appDelete_: boolean = false;\n private promise_: Promise;\n\n constructor(\n private url_: string,\n private method_: string,\n private headers_: Headers,\n private body_: string | Blob | Uint8Array | null,\n private successCodes_: number[],\n private additionalRetryCodes_: number[],\n private callback_: RequestHandler,\n private errorCallback_: ErrorHandler | null,\n private timeout_: number,\n private progressCallback_: ((p1: number, p2: number) => void) | null,\n private connectionFactory_: () => Connection,\n private retry = true\n ) {\n this.promise_ = new Promise((resolve, reject) => {\n this.resolve_ = resolve as (value?: O | PromiseLike) => void;\n this.reject_ = reject;\n this.start_();\n });\n }\n\n /**\n * Actually starts the retry loop.\n */\n private start_(): void {\n const doTheRequest: (\n backoffCallback: (success: boolean, ...p2: unknown[]) => void,\n canceled: boolean\n ) => void = (backoffCallback, canceled) => {\n if (canceled) {\n backoffCallback(false, new RequestEndStatus(false, null, true));\n return;\n }\n const connection = this.connectionFactory_();\n this.pendingConnection_ = connection;\n\n const progressListener: (\n progressEvent: ProgressEvent\n ) => void = progressEvent => {\n const loaded = progressEvent.loaded;\n const total = progressEvent.lengthComputable ? progressEvent.total : -1;\n if (this.progressCallback_ !== null) {\n this.progressCallback_(loaded, total);\n }\n };\n if (this.progressCallback_ !== null) {\n connection.addUploadProgressListener(progressListener);\n }\n\n // connection.send() never rejects, so we don't need to have a error handler or use catch on the returned promise.\n // eslint-disable-next-line @typescript-eslint/no-floating-promises\n connection\n .send(this.url_, this.method_, this.body_, this.headers_)\n .then(() => {\n if (this.progressCallback_ !== null) {\n connection.removeUploadProgressListener(progressListener);\n }\n this.pendingConnection_ = null;\n const hitServer = connection.getErrorCode() === ErrorCode.NO_ERROR;\n const status = connection.getStatus();\n if (\n !hitServer ||\n (isRetryStatusCode(status, this.additionalRetryCodes_) &&\n this.retry)\n ) {\n const wasCanceled = connection.getErrorCode() === ErrorCode.ABORT;\n backoffCallback(\n false,\n new RequestEndStatus(false, null, wasCanceled)\n );\n return;\n }\n const successCode = this.successCodes_.indexOf(status) !== -1;\n backoffCallback(true, new RequestEndStatus(successCode, connection));\n });\n };\n\n /**\n * @param requestWentThrough - True if the request eventually went\n * through, false if it hit the retry limit or was canceled.\n */\n const backoffDone: (\n requestWentThrough: boolean,\n status: RequestEndStatus\n ) => void = (requestWentThrough, status) => {\n const resolve = this.resolve_;\n const reject = this.reject_;\n const connection = status.connection as Connection;\n if (status.wasSuccessCode) {\n try {\n const result = this.callback_(connection, connection.getResponse());\n if (isJustDef(result)) {\n resolve(result);\n } else {\n resolve();\n }\n } catch (e) {\n reject(e);\n }\n } else {\n if (connection !== null) {\n const err = unknown();\n err.serverResponse = connection.getErrorText();\n if (this.errorCallback_) {\n reject(this.errorCallback_(connection, err));\n } else {\n reject(err);\n }\n } else {\n if (status.canceled) {\n const err = this.appDelete_ ? appDeleted() : canceled();\n reject(err);\n } else {\n const err = retryLimitExceeded();\n reject(err);\n }\n }\n }\n };\n if (this.canceled_) {\n backoffDone(false, new RequestEndStatus(false, null, true));\n } else {\n this.backoffId_ = start(doTheRequest, backoffDone, this.timeout_);\n }\n }\n\n /** @inheritDoc */\n getPromise(): Promise {\n return this.promise_;\n }\n\n /** @inheritDoc */\n cancel(appDelete?: boolean): void {\n this.canceled_ = true;\n this.appDelete_ = appDelete || false;\n if (this.backoffId_ !== null) {\n stop(this.backoffId_);\n }\n if (this.pendingConnection_ !== null) {\n this.pendingConnection_.abort();\n }\n }\n}\n\n/**\n * A collection of information about the result of a network request.\n * @param opt_canceled - Defaults to false.\n */\nexport class RequestEndStatus {\n /**\n * True if the request was canceled.\n */\n canceled: boolean;\n\n constructor(\n public wasSuccessCode: boolean,\n public connection: Connection | null,\n canceled?: boolean\n ) {\n this.canceled = !!canceled;\n }\n}\n\nexport function addAuthHeader_(\n headers: Headers,\n authToken: string | null\n): void {\n if (authToken !== null && authToken.length > 0) {\n headers['Authorization'] = 'Firebase ' + authToken;\n }\n}\n\nexport function addVersionHeader_(\n headers: Headers,\n firebaseVersion?: string\n): void {\n headers['X-Firebase-Storage-Version'] =\n 'webjs/' + (firebaseVersion ?? 'AppManager');\n}\n\nexport function addGmpidHeader_(headers: Headers, appId: string | null): void {\n if (appId) {\n headers['X-Firebase-GMPID'] = appId;\n }\n}\n\nexport function addAppCheckHeader_(\n headers: Headers,\n appCheckToken: string | null\n): void {\n if (appCheckToken !== null) {\n headers['X-Firebase-AppCheck'] = appCheckToken;\n }\n}\n\nexport function makeRequest(\n requestInfo: RequestInfo,\n appId: string | null,\n authToken: string | null,\n appCheckToken: string | null,\n requestFactory: () => Connection,\n firebaseVersion?: string,\n retry = true\n): Request {\n const queryPart = makeQueryString(requestInfo.urlParams);\n const url = requestInfo.url + queryPart;\n const headers = Object.assign({}, requestInfo.headers);\n addGmpidHeader_(headers, appId);\n addAuthHeader_(headers, authToken);\n addVersionHeader_(headers, firebaseVersion);\n addAppCheckHeader_(headers, appCheckToken);\n return new NetworkRequest(\n url,\n requestInfo.method,\n headers,\n requestInfo.body,\n requestInfo.successCodes,\n requestInfo.additionalRetryCodes,\n requestInfo.handler,\n requestInfo.errorHandler,\n requestInfo.timeout,\n requestInfo.progressCallback,\n requestFactory,\n retry\n );\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Provides a method for running a function with exponential\n * backoff.\n */\ntype id = (p1: boolean) => void;\n\nexport { id };\n\n/**\n * Accepts a callback for an action to perform (`doRequest`),\n * and then a callback for when the backoff has completed (`backoffCompleteCb`).\n * The callback sent to start requires an argument to call (`onRequestComplete`).\n * When `start` calls `doRequest`, it passes a callback for when the request has\n * completed, `onRequestComplete`. Based on this, the backoff continues, with\n * another call to `doRequest` and the above loop continues until the timeout\n * is hit, or a successful response occurs.\n * @description\n * @param doRequest Callback to perform request\n * @param backoffCompleteCb Callback to call when backoff has been completed\n */\nexport function start(\n doRequest: (\n onRequestComplete: (success: boolean) => void,\n canceled: boolean\n ) => void,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n backoffCompleteCb: (...args: any[]) => unknown,\n timeout: number\n): id {\n // TODO(andysoto): make this code cleaner (probably refactor into an actual\n // type instead of a bunch of functions with state shared in the closure)\n let waitSeconds = 1;\n // Would type this as \"number\" but that doesn't work for Node so ¯\\_(ツ)_/¯\n // TODO: find a way to exclude Node type definition for storage because storage only works in browser\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let retryTimeoutId: any = null;\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n let globalTimeoutId: any = null;\n let hitTimeout = false;\n let cancelState = 0;\n\n function canceled(): boolean {\n return cancelState === 2;\n }\n let triggeredCallback = false;\n\n function triggerCallback(...args: any[]): void {\n if (!triggeredCallback) {\n triggeredCallback = true;\n backoffCompleteCb.apply(null, args);\n }\n }\n\n function callWithDelay(millis: number): void {\n retryTimeoutId = setTimeout(() => {\n retryTimeoutId = null;\n doRequest(responseHandler, canceled());\n }, millis);\n }\n\n function clearGlobalTimeout(): void {\n if (globalTimeoutId) {\n clearTimeout(globalTimeoutId);\n }\n }\n\n function responseHandler(success: boolean, ...args: any[]): void {\n if (triggeredCallback) {\n clearGlobalTimeout();\n return;\n }\n if (success) {\n clearGlobalTimeout();\n triggerCallback.call(null, success, ...args);\n return;\n }\n const mustStop = canceled() || hitTimeout;\n if (mustStop) {\n clearGlobalTimeout();\n triggerCallback.call(null, success, ...args);\n return;\n }\n if (waitSeconds < 64) {\n /* TODO(andysoto): don't back off so quickly if we know we're offline. */\n waitSeconds *= 2;\n }\n let waitMillis;\n if (cancelState === 1) {\n cancelState = 2;\n waitMillis = 0;\n } else {\n waitMillis = (waitSeconds + Math.random()) * 1000;\n }\n callWithDelay(waitMillis);\n }\n let stopped = false;\n\n function stop(wasTimeout: boolean): void {\n if (stopped) {\n return;\n }\n stopped = true;\n clearGlobalTimeout();\n if (triggeredCallback) {\n return;\n }\n if (retryTimeoutId !== null) {\n if (!wasTimeout) {\n cancelState = 2;\n }\n clearTimeout(retryTimeoutId);\n callWithDelay(0);\n } else {\n if (!wasTimeout) {\n cancelState = 1;\n }\n }\n }\n callWithDelay(0);\n globalTimeoutId = setTimeout(() => {\n hitTimeout = true;\n stop(true);\n }, timeout);\n return stop;\n}\n\n/**\n * Stops the retry loop from repeating.\n * If the function is currently \"in between\" retries, it is invoked immediately\n * with the second parameter as \"true\". Otherwise, it will be invoked once more\n * after the current invocation finishes iff the current invocation would have\n * triggered another retry.\n */\nexport function stop(id: id): void {\n id(false);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n/**\n * @fileoverview Some methods copied from goog.fs.\n * We don't include goog.fs because it pulls in a bunch of Deferred code that\n * bloats the size of the released binary.\n */\nimport { isNativeBlobDefined } from './type';\nimport { StorageErrorCode, StorageError } from './error';\n\nfunction getBlobBuilder(): typeof IBlobBuilder | undefined {\n if (typeof BlobBuilder !== 'undefined') {\n return BlobBuilder;\n } else if (typeof WebKitBlobBuilder !== 'undefined') {\n return WebKitBlobBuilder;\n } else {\n return undefined;\n }\n}\n\n/**\n * Concatenates one or more values together and converts them to a Blob.\n *\n * @param args The values that will make up the resulting blob.\n * @return The blob.\n */\nexport function getBlob(...args: Array): Blob {\n const BlobBuilder = getBlobBuilder();\n if (BlobBuilder !== undefined) {\n const bb = new BlobBuilder();\n for (let i = 0; i < args.length; i++) {\n bb.append(args[i]);\n }\n return bb.getBlob();\n } else {\n if (isNativeBlobDefined()) {\n return new Blob(args);\n } else {\n throw new StorageError(\n StorageErrorCode.UNSUPPORTED_ENVIRONMENT,\n \"This browser doesn't seem to support creating Blobs\"\n );\n }\n }\n}\n\n/**\n * Slices the blob. The returned blob contains data from the start byte\n * (inclusive) till the end byte (exclusive). Negative indices cannot be used.\n *\n * @param blob The blob to be sliced.\n * @param start Index of the starting byte.\n * @param end Index of the ending byte.\n * @return The blob slice or null if not supported.\n */\nexport function sliceBlob(blob: Blob, start: number, end: number): Blob | null {\n if (blob.webkitSlice) {\n return blob.webkitSlice(start, end);\n } else if (blob.mozSlice) {\n return blob.mozSlice(start, end);\n } else if (blob.slice) {\n return blob.slice(start, end);\n }\n return null;\n}\n","/**\n * @license\n * Copyright 2021 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { missingPolyFill } from '../../implementation/error';\n\n/** Converts a Base64 encoded string to a binary string. */\nexport function decodeBase64(encoded: string): string {\n if (typeof atob === 'undefined') {\n throw missingPolyFill('base-64');\n }\n return atob(encoded);\n}\n\nexport function decodeUint8Array(data: Uint8Array): string {\n return new TextDecoder().decode(data);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { unknown, invalidFormat } from './error';\nimport { decodeBase64 } from '../platform/base64';\n\n/**\n * An enumeration of the possible string formats for upload.\n * @public\n */\nexport type StringFormat = (typeof StringFormat)[keyof typeof StringFormat];\n/**\n * An enumeration of the possible string formats for upload.\n * @public\n */\nexport const StringFormat = {\n /**\n * Indicates the string should be interpreted \"raw\", that is, as normal text.\n * The string will be interpreted as UTF-16, then uploaded as a UTF-8 byte\n * sequence.\n * Example: The string 'Hello! \\\\ud83d\\\\ude0a' becomes the byte sequence\n * 48 65 6c 6c 6f 21 20 f0 9f 98 8a\n */\n RAW: 'raw',\n /**\n * Indicates the string should be interpreted as base64-encoded data.\n * Padding characters (trailing '='s) are optional.\n * Example: The string 'rWmO++E6t7/rlw==' becomes the byte sequence\n * ad 69 8e fb e1 3a b7 bf eb 97\n */\n BASE64: 'base64',\n /**\n * Indicates the string should be interpreted as base64url-encoded data.\n * Padding characters (trailing '='s) are optional.\n * Example: The string 'rWmO--E6t7_rlw==' becomes the byte sequence\n * ad 69 8e fb e1 3a b7 bf eb 97\n */\n BASE64URL: 'base64url',\n /**\n * Indicates the string is a data URL, such as one obtained from\n * canvas.toDataURL().\n * Example: the string 'data:application/octet-stream;base64,aaaa'\n * becomes the byte sequence\n * 69 a6 9a\n * (the content-type \"application/octet-stream\" is also applied, but can\n * be overridden in the metadata object).\n */\n DATA_URL: 'data_url'\n} as const;\n\nexport class StringData {\n contentType: string | null;\n\n constructor(public data: Uint8Array, contentType?: string | null) {\n this.contentType = contentType || null;\n }\n}\n\n/**\n * @internal\n */\nexport function dataFromString(\n format: StringFormat,\n stringData: string\n): StringData {\n switch (format) {\n case StringFormat.RAW:\n return new StringData(utf8Bytes_(stringData));\n case StringFormat.BASE64:\n case StringFormat.BASE64URL:\n return new StringData(base64Bytes_(format, stringData));\n case StringFormat.DATA_URL:\n return new StringData(\n dataURLBytes_(stringData),\n dataURLContentType_(stringData)\n );\n default:\n // do nothing\n }\n\n // assert(false);\n throw unknown();\n}\n\nexport function utf8Bytes_(value: string): Uint8Array {\n const b: number[] = [];\n for (let i = 0; i < value.length; i++) {\n let c = value.charCodeAt(i);\n if (c <= 127) {\n b.push(c);\n } else {\n if (c <= 2047) {\n b.push(192 | (c >> 6), 128 | (c & 63));\n } else {\n if ((c & 64512) === 55296) {\n // The start of a surrogate pair.\n const valid =\n i < value.length - 1 && (value.charCodeAt(i + 1) & 64512) === 56320;\n if (!valid) {\n // The second surrogate wasn't there.\n b.push(239, 191, 189);\n } else {\n const hi = c;\n const lo = value.charCodeAt(++i);\n c = 65536 | ((hi & 1023) << 10) | (lo & 1023);\n b.push(\n 240 | (c >> 18),\n 128 | ((c >> 12) & 63),\n 128 | ((c >> 6) & 63),\n 128 | (c & 63)\n );\n }\n } else {\n if ((c & 64512) === 56320) {\n // Invalid low surrogate.\n b.push(239, 191, 189);\n } else {\n b.push(224 | (c >> 12), 128 | ((c >> 6) & 63), 128 | (c & 63));\n }\n }\n }\n }\n }\n return new Uint8Array(b);\n}\n\nexport function percentEncodedBytes_(value: string): Uint8Array {\n let decoded;\n try {\n decoded = decodeURIComponent(value);\n } catch (e) {\n throw invalidFormat(StringFormat.DATA_URL, 'Malformed data URL.');\n }\n return utf8Bytes_(decoded);\n}\n\nexport function base64Bytes_(format: StringFormat, value: string): Uint8Array {\n switch (format) {\n case StringFormat.BASE64: {\n const hasMinus = value.indexOf('-') !== -1;\n const hasUnder = value.indexOf('_') !== -1;\n if (hasMinus || hasUnder) {\n const invalidChar = hasMinus ? '-' : '_';\n throw invalidFormat(\n format,\n \"Invalid character '\" +\n invalidChar +\n \"' found: is it base64url encoded?\"\n );\n }\n break;\n }\n case StringFormat.BASE64URL: {\n const hasPlus = value.indexOf('+') !== -1;\n const hasSlash = value.indexOf('/') !== -1;\n if (hasPlus || hasSlash) {\n const invalidChar = hasPlus ? '+' : '/';\n throw invalidFormat(\n format,\n \"Invalid character '\" + invalidChar + \"' found: is it base64 encoded?\"\n );\n }\n value = value.replace(/-/g, '+').replace(/_/g, '/');\n break;\n }\n default:\n // do nothing\n }\n let bytes;\n try {\n bytes = decodeBase64(value);\n } catch (e) {\n if ((e as Error).message.includes('polyfill')) {\n throw e;\n }\n throw invalidFormat(format, 'Invalid character found');\n }\n const array = new Uint8Array(bytes.length);\n for (let i = 0; i < bytes.length; i++) {\n array[i] = bytes.charCodeAt(i);\n }\n return array;\n}\n\nclass DataURLParts {\n base64: boolean = false;\n contentType: string | null = null;\n rest: string;\n\n constructor(dataURL: string) {\n const matches = dataURL.match(/^data:([^,]+)?,/);\n if (matches === null) {\n throw invalidFormat(\n StringFormat.DATA_URL,\n \"Must be formatted 'data:[][;base64],\"\n );\n }\n const middle = matches[1] || null;\n if (middle != null) {\n this.base64 = endsWith(middle, ';base64');\n this.contentType = this.base64\n ? middle.substring(0, middle.length - ';base64'.length)\n : middle;\n }\n this.rest = dataURL.substring(dataURL.indexOf(',') + 1);\n }\n}\n\nexport function dataURLBytes_(dataUrl: string): Uint8Array {\n const parts = new DataURLParts(dataUrl);\n if (parts.base64) {\n return base64Bytes_(StringFormat.BASE64, parts.rest);\n } else {\n return percentEncodedBytes_(parts.rest);\n }\n}\n\nexport function dataURLContentType_(dataUrl: string): string | null {\n const parts = new DataURLParts(dataUrl);\n return parts.contentType;\n}\n\nfunction endsWith(s: string, end: string): boolean {\n const longEnough = s.length >= end.length;\n if (!longEnough) {\n return false;\n }\n\n return s.substring(s.length - end.length) === end;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @file Provides a Blob-like wrapper for various binary types (including the\n * native Blob type). This makes it possible to upload types like ArrayBuffers,\n * making uploads possible in environments without the native Blob type.\n */\nimport { sliceBlob, getBlob } from './fs';\nimport { StringFormat, dataFromString } from './string';\nimport { isNativeBlob, isNativeBlobDefined, isString } from './type';\n\n/**\n * @param opt_elideCopy - If true, doesn't copy mutable input data\n * (e.g. Uint8Arrays). Pass true only if you know the objects will not be\n * modified after this blob's construction.\n *\n * @internal\n */\nexport class FbsBlob {\n private data_!: Blob | Uint8Array;\n private size_: number;\n private type_: string;\n\n constructor(data: Blob | Uint8Array | ArrayBuffer, elideCopy?: boolean) {\n let size: number = 0;\n let blobType: string = '';\n if (isNativeBlob(data)) {\n this.data_ = data as Blob;\n size = (data as Blob).size;\n blobType = (data as Blob).type;\n } else if (data instanceof ArrayBuffer) {\n if (elideCopy) {\n this.data_ = new Uint8Array(data);\n } else {\n this.data_ = new Uint8Array(data.byteLength);\n this.data_.set(new Uint8Array(data));\n }\n size = this.data_.length;\n } else if (data instanceof Uint8Array) {\n if (elideCopy) {\n this.data_ = data as Uint8Array;\n } else {\n this.data_ = new Uint8Array(data.length);\n this.data_.set(data as Uint8Array);\n }\n size = data.length;\n }\n this.size_ = size;\n this.type_ = blobType;\n }\n\n size(): number {\n return this.size_;\n }\n\n type(): string {\n return this.type_;\n }\n\n slice(startByte: number, endByte: number): FbsBlob | null {\n if (isNativeBlob(this.data_)) {\n const realBlob = this.data_ as Blob;\n const sliced = sliceBlob(realBlob, startByte, endByte);\n if (sliced === null) {\n return null;\n }\n return new FbsBlob(sliced);\n } else {\n const slice = new Uint8Array(\n (this.data_ as Uint8Array).buffer,\n startByte,\n endByte - startByte\n );\n return new FbsBlob(slice, true);\n }\n }\n\n static getBlob(...args: Array): FbsBlob | null {\n if (isNativeBlobDefined()) {\n const blobby: Array = args.map(\n (val: string | FbsBlob): Blob | Uint8Array | string => {\n if (val instanceof FbsBlob) {\n return val.data_;\n } else {\n return val;\n }\n }\n );\n return new FbsBlob(getBlob.apply(null, blobby));\n } else {\n const uint8Arrays: Uint8Array[] = args.map(\n (val: string | FbsBlob): Uint8Array => {\n if (isString(val)) {\n return dataFromString(StringFormat.RAW, val as string).data;\n } else {\n // Blobs don't exist, so this has to be a Uint8Array.\n return (val as FbsBlob).data_ as Uint8Array;\n }\n }\n );\n let finalLength = 0;\n uint8Arrays.forEach((array: Uint8Array): void => {\n finalLength += array.byteLength;\n });\n const merged = new Uint8Array(finalLength);\n let index = 0;\n uint8Arrays.forEach((array: Uint8Array) => {\n for (let i = 0; i < array.length; i++) {\n merged[index++] = array[i];\n }\n });\n return new FbsBlob(merged, true);\n }\n }\n\n uploadData(): Blob | Uint8Array {\n return this.data_;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { isNonArrayObject } from './type';\n\n/**\n * Returns the Object resulting from parsing the given JSON, or null if the\n * given string does not represent a JSON object.\n */\nexport function jsonObjectOrNull(\n s: string\n): { [name: string]: unknown } | null {\n let obj;\n try {\n obj = JSON.parse(s);\n } catch (e) {\n return null;\n }\n if (isNonArrayObject(obj)) {\n return obj;\n } else {\n return null;\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Contains helper methods for manipulating paths.\n */\n\n/**\n * @return Null if the path is already at the root.\n */\nexport function parent(path: string): string | null {\n if (path.length === 0) {\n return null;\n }\n const index = path.lastIndexOf('/');\n if (index === -1) {\n return '';\n }\n const newPath = path.slice(0, index);\n return newPath;\n}\n\nexport function child(path: string, childPath: string): string {\n const canonicalChildPath = childPath\n .split('/')\n .filter(component => component.length > 0)\n .join('/');\n if (path.length === 0) {\n return canonicalChildPath;\n } else {\n return path + '/' + canonicalChildPath;\n }\n}\n\n/**\n * Returns the last component of a path.\n * '/foo/bar' -> 'bar'\n * '/foo/bar/baz/' -> 'baz/'\n * '/a' -> 'a'\n */\nexport function lastComponent(path: string): string {\n const index = path.lastIndexOf('/', path.length - 2);\n if (index === -1) {\n return path;\n } else {\n return path.slice(index + 1);\n }\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Documentation for the metadata format\n */\nimport { Metadata } from '../metadata';\n\nimport { jsonObjectOrNull } from './json';\nimport { Location } from './location';\nimport { lastComponent } from './path';\nimport { isString } from './type';\nimport { makeUrl, makeQueryString } from './url';\nimport { Reference } from '../reference';\nimport { FirebaseStorageImpl } from '../service';\n\nexport function noXform_(metadata: Metadata, value: T): T {\n return value;\n}\n\nclass Mapping {\n local: string;\n writable: boolean;\n xform: (p1: Metadata, p2?: T) => T | undefined;\n\n constructor(\n public server: string,\n local?: string | null,\n writable?: boolean,\n xform?: ((p1: Metadata, p2?: T) => T | undefined) | null\n ) {\n this.local = local || server;\n this.writable = !!writable;\n this.xform = xform || noXform_;\n }\n}\ntype Mappings = Array | Mapping>;\n\nexport { Mappings };\n\nlet mappings_: Mappings | null = null;\n\nexport function xformPath(fullPath: string | undefined): string | undefined {\n if (!isString(fullPath) || fullPath.length < 2) {\n return fullPath;\n } else {\n return lastComponent(fullPath);\n }\n}\n\nexport function getMappings(): Mappings {\n if (mappings_) {\n return mappings_;\n }\n const mappings: Mappings = [];\n mappings.push(new Mapping('bucket'));\n mappings.push(new Mapping('generation'));\n mappings.push(new Mapping('metageneration'));\n mappings.push(new Mapping('name', 'fullPath', true));\n\n function mappingsXformPath(\n _metadata: Metadata,\n fullPath: string | undefined\n ): string | undefined {\n return xformPath(fullPath);\n }\n const nameMapping = new Mapping('name');\n nameMapping.xform = mappingsXformPath;\n mappings.push(nameMapping);\n\n /**\n * Coerces the second param to a number, if it is defined.\n */\n function xformSize(\n _metadata: Metadata,\n size?: number | string\n ): number | undefined {\n if (size !== undefined) {\n return Number(size);\n } else {\n return size;\n }\n }\n const sizeMapping = new Mapping('size');\n sizeMapping.xform = xformSize;\n mappings.push(sizeMapping);\n mappings.push(new Mapping('timeCreated'));\n mappings.push(new Mapping('updated'));\n mappings.push(new Mapping('md5Hash', null, true));\n mappings.push(new Mapping('cacheControl', null, true));\n mappings.push(new Mapping('contentDisposition', null, true));\n mappings.push(new Mapping('contentEncoding', null, true));\n mappings.push(new Mapping('contentLanguage', null, true));\n mappings.push(new Mapping('contentType', null, true));\n mappings.push(new Mapping('metadata', 'customMetadata', true));\n mappings_ = mappings;\n return mappings_;\n}\n\nexport function addRef(metadata: Metadata, service: FirebaseStorageImpl): void {\n function generateRef(): Reference {\n const bucket: string = metadata['bucket'] as string;\n const path: string = metadata['fullPath'] as string;\n const loc = new Location(bucket, path);\n return service._makeStorageReference(loc);\n }\n Object.defineProperty(metadata, 'ref', { get: generateRef });\n}\n\nexport function fromResource(\n service: FirebaseStorageImpl,\n resource: { [name: string]: unknown },\n mappings: Mappings\n): Metadata {\n const metadata: Metadata = {} as Metadata;\n metadata['type'] = 'file';\n const len = mappings.length;\n for (let i = 0; i < len; i++) {\n const mapping = mappings[i];\n metadata[mapping.local] = (mapping as Mapping).xform(\n metadata,\n resource[mapping.server]\n );\n }\n addRef(metadata, service);\n return metadata;\n}\n\nexport function fromResourceString(\n service: FirebaseStorageImpl,\n resourceString: string,\n mappings: Mappings\n): Metadata | null {\n const obj = jsonObjectOrNull(resourceString);\n if (obj === null) {\n return null;\n }\n const resource = obj as Metadata;\n return fromResource(service, resource, mappings);\n}\n\nexport function downloadUrlFromResourceString(\n metadata: Metadata,\n resourceString: string,\n host: string,\n protocol: string\n): string | null {\n const obj = jsonObjectOrNull(resourceString);\n if (obj === null) {\n return null;\n }\n if (!isString(obj['downloadTokens'])) {\n // This can happen if objects are uploaded through GCS and retrieved\n // through list, so we don't want to throw an Error.\n return null;\n }\n const tokens: string = obj['downloadTokens'] as string;\n if (tokens.length === 0) {\n return null;\n }\n const encode = encodeURIComponent;\n const tokensList = tokens.split(',');\n const urls = tokensList.map((token: string): string => {\n const bucket: string = metadata['bucket'] as string;\n const path: string = metadata['fullPath'] as string;\n const urlPart = '/b/' + encode(bucket) + '/o/' + encode(path);\n const base = makeUrl(urlPart, host, protocol);\n const queryString = makeQueryString({\n alt: 'media',\n token\n });\n return base + queryString;\n });\n return urls[0];\n}\n\nexport function toResourceString(\n metadata: Partial,\n mappings: Mappings\n): string {\n const resource: {\n [prop: string]: unknown;\n } = {};\n const len = mappings.length;\n for (let i = 0; i < len; i++) {\n const mapping = mappings[i];\n if (mapping.writable) {\n resource[mapping.server] = metadata[mapping.local];\n }\n }\n return JSON.stringify(resource);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { StorageError } from './error';\nimport { Headers, Connection, ConnectionType } from './connection';\n\n/**\n * Type for url params stored in RequestInfo.\n */\nexport interface UrlParams {\n [name: string]: string | number;\n}\n\n/**\n * A function that converts a server response to the API type expected by the\n * SDK.\n *\n * @param I - the type of the backend's network response\n * @param O - the output response type used by the rest of the SDK.\n */\nexport type RequestHandler = (\n connection: Connection,\n response: I\n) => O;\n\n/** A function to handle an error. */\nexport type ErrorHandler = (\n connection: Connection,\n response: StorageError\n) => StorageError;\n\n/**\n * Contains a fully specified request.\n *\n * @param I - the type of the backend's network response.\n * @param O - the output response type used by the rest of the SDK.\n */\nexport class RequestInfo {\n urlParams: UrlParams = {};\n headers: Headers = {};\n body: Blob | string | Uint8Array | null = null;\n errorHandler: ErrorHandler | null = null;\n\n /**\n * Called with the current number of bytes uploaded and total size (-1 if not\n * computable) of the request body (i.e. used to report upload progress).\n */\n progressCallback: ((p1: number, p2: number) => void) | null = null;\n successCodes: number[] = [200];\n additionalRetryCodes: number[] = [];\n\n constructor(\n public url: string,\n public method: string,\n /**\n * Returns the value with which to resolve the request's promise. Only called\n * if the request is successful. Throw from this function to reject the\n * returned Request's promise with the thrown error.\n * Note: The XhrIo passed to this function may be reused after this callback\n * returns. Do not keep a reference to it in any way.\n */\n public handler: RequestHandler,\n public timeout: number\n ) {}\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Defines methods for interacting with the network.\n */\n\nimport { Metadata } from '../metadata';\nimport { ListResult } from '../list';\nimport { FbsBlob } from './blob';\nimport {\n StorageError,\n cannotSliceBlob,\n unauthenticated,\n quotaExceeded,\n unauthorized,\n objectNotFound,\n serverFileWrongSize,\n unknown,\n unauthorizedApp\n} from './error';\nimport { Location } from './location';\nimport {\n Mappings,\n fromResourceString,\n downloadUrlFromResourceString,\n toResourceString\n} from './metadata';\nimport { fromResponseString } from './list';\nimport { RequestInfo, UrlParams } from './requestinfo';\nimport { isString } from './type';\nimport { makeUrl } from './url';\nimport { Connection, ConnectionType } from './connection';\nimport { FirebaseStorageImpl } from '../service';\n\n/**\n * Throws the UNKNOWN StorageError if cndn is false.\n */\nexport function handlerCheck(cndn: boolean): void {\n if (!cndn) {\n throw unknown();\n }\n}\n\nexport function metadataHandler(\n service: FirebaseStorageImpl,\n mappings: Mappings\n): (p1: Connection, p2: string) => Metadata {\n function handler(xhr: Connection, text: string): Metadata {\n const metadata = fromResourceString(service, text, mappings);\n handlerCheck(metadata !== null);\n return metadata as Metadata;\n }\n return handler;\n}\n\nexport function listHandler(\n service: FirebaseStorageImpl,\n bucket: string\n): (p1: Connection, p2: string) => ListResult {\n function handler(xhr: Connection, text: string): ListResult {\n const listResult = fromResponseString(service, bucket, text);\n handlerCheck(listResult !== null);\n return listResult as ListResult;\n }\n return handler;\n}\n\nexport function downloadUrlHandler(\n service: FirebaseStorageImpl,\n mappings: Mappings\n): (p1: Connection, p2: string) => string | null {\n function handler(xhr: Connection, text: string): string | null {\n const metadata = fromResourceString(service, text, mappings);\n handlerCheck(metadata !== null);\n return downloadUrlFromResourceString(\n metadata as Metadata,\n text,\n service.host,\n service._protocol\n );\n }\n return handler;\n}\n\nexport function sharedErrorHandler(\n location: Location\n): (p1: Connection, p2: StorageError) => StorageError {\n function errorHandler(\n xhr: Connection,\n err: StorageError\n ): StorageError {\n let newErr: StorageError;\n if (xhr.getStatus() === 401) {\n if (\n // This exact message string is the only consistent part of the\n // server's error response that identifies it as an App Check error.\n xhr.getErrorText().includes('Firebase App Check token is invalid')\n ) {\n newErr = unauthorizedApp();\n } else {\n newErr = unauthenticated();\n }\n } else {\n if (xhr.getStatus() === 402) {\n newErr = quotaExceeded(location.bucket);\n } else {\n if (xhr.getStatus() === 403) {\n newErr = unauthorized(location.path);\n } else {\n newErr = err;\n }\n }\n }\n newErr.status = xhr.getStatus();\n newErr.serverResponse = err.serverResponse;\n return newErr;\n }\n return errorHandler;\n}\n\nexport function objectErrorHandler(\n location: Location\n): (p1: Connection, p2: StorageError) => StorageError {\n const shared = sharedErrorHandler(location);\n\n function errorHandler(\n xhr: Connection,\n err: StorageError\n ): StorageError {\n let newErr = shared(xhr, err);\n if (xhr.getStatus() === 404) {\n newErr = objectNotFound(location.path);\n }\n newErr.serverResponse = err.serverResponse;\n return newErr;\n }\n return errorHandler;\n}\n\nexport function getMetadata(\n service: FirebaseStorageImpl,\n location: Location,\n mappings: Mappings\n): RequestInfo {\n const urlPart = location.fullServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'GET';\n const timeout = service.maxOperationRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n metadataHandler(service, mappings),\n timeout\n );\n requestInfo.errorHandler = objectErrorHandler(location);\n return requestInfo;\n}\n\nexport function list(\n service: FirebaseStorageImpl,\n location: Location,\n delimiter?: string,\n pageToken?: string | null,\n maxResults?: number | null\n): RequestInfo {\n const urlParams: UrlParams = {};\n if (location.isRoot) {\n urlParams['prefix'] = '';\n } else {\n urlParams['prefix'] = location.path + '/';\n }\n if (delimiter && delimiter.length > 0) {\n urlParams['delimiter'] = delimiter;\n }\n if (pageToken) {\n urlParams['pageToken'] = pageToken;\n }\n if (maxResults) {\n urlParams['maxResults'] = maxResults;\n }\n const urlPart = location.bucketOnlyServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'GET';\n const timeout = service.maxOperationRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n listHandler(service, location.bucket),\n timeout\n );\n requestInfo.urlParams = urlParams;\n requestInfo.errorHandler = sharedErrorHandler(location);\n return requestInfo;\n}\n\nexport function getBytes(\n service: FirebaseStorageImpl,\n location: Location,\n maxDownloadSizeBytes?: number\n): RequestInfo {\n const urlPart = location.fullServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol) + '?alt=media';\n const method = 'GET';\n const timeout = service.maxOperationRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n (_: Connection, data: I) => data,\n timeout\n );\n requestInfo.errorHandler = objectErrorHandler(location);\n if (maxDownloadSizeBytes !== undefined) {\n requestInfo.headers['Range'] = `bytes=0-${maxDownloadSizeBytes}`;\n requestInfo.successCodes = [200 /* OK */, 206 /* Partial Content */];\n }\n return requestInfo;\n}\n\nexport function getDownloadUrl(\n service: FirebaseStorageImpl,\n location: Location,\n mappings: Mappings\n): RequestInfo {\n const urlPart = location.fullServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'GET';\n const timeout = service.maxOperationRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n downloadUrlHandler(service, mappings),\n timeout\n );\n requestInfo.errorHandler = objectErrorHandler(location);\n return requestInfo;\n}\n\nexport function updateMetadata(\n service: FirebaseStorageImpl,\n location: Location,\n metadata: Partial,\n mappings: Mappings\n): RequestInfo {\n const urlPart = location.fullServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'PATCH';\n const body = toResourceString(metadata, mappings);\n const headers = { 'Content-Type': 'application/json; charset=utf-8' };\n const timeout = service.maxOperationRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n metadataHandler(service, mappings),\n timeout\n );\n requestInfo.headers = headers;\n requestInfo.body = body;\n requestInfo.errorHandler = objectErrorHandler(location);\n return requestInfo;\n}\n\nexport function deleteObject(\n service: FirebaseStorageImpl,\n location: Location\n): RequestInfo {\n const urlPart = location.fullServerUrl();\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'DELETE';\n const timeout = service.maxOperationRetryTime;\n\n function handler(_xhr: Connection, _text: string): void {}\n const requestInfo = new RequestInfo(url, method, handler, timeout);\n requestInfo.successCodes = [200, 204];\n requestInfo.errorHandler = objectErrorHandler(location);\n return requestInfo;\n}\n\nexport function determineContentType_(\n metadata: Metadata | null,\n blob: FbsBlob | null\n): string {\n return (\n (metadata && metadata['contentType']) ||\n (blob && blob.type()) ||\n 'application/octet-stream'\n );\n}\n\nexport function metadataForUpload_(\n location: Location,\n blob: FbsBlob,\n metadata?: Metadata | null\n): Metadata {\n const metadataClone = Object.assign({}, metadata);\n metadataClone['fullPath'] = location.path;\n metadataClone['size'] = blob.size();\n if (!metadataClone['contentType']) {\n metadataClone['contentType'] = determineContentType_(null, blob);\n }\n return metadataClone;\n}\n\n/**\n * Prepare RequestInfo for uploads as Content-Type: multipart.\n */\nexport function multipartUpload(\n service: FirebaseStorageImpl,\n location: Location,\n mappings: Mappings,\n blob: FbsBlob,\n metadata?: Metadata | null\n): RequestInfo {\n const urlPart = location.bucketOnlyServerUrl();\n const headers: { [prop: string]: string } = {\n 'X-Goog-Upload-Protocol': 'multipart'\n };\n\n function genBoundary(): string {\n let str = '';\n for (let i = 0; i < 2; i++) {\n str = str + Math.random().toString().slice(2);\n }\n return str;\n }\n const boundary = genBoundary();\n headers['Content-Type'] = 'multipart/related; boundary=' + boundary;\n const metadata_ = metadataForUpload_(location, blob, metadata);\n const metadataString = toResourceString(metadata_, mappings);\n const preBlobPart =\n '--' +\n boundary +\n '\\r\\n' +\n 'Content-Type: application/json; charset=utf-8\\r\\n\\r\\n' +\n metadataString +\n '\\r\\n--' +\n boundary +\n '\\r\\n' +\n 'Content-Type: ' +\n metadata_['contentType'] +\n '\\r\\n\\r\\n';\n const postBlobPart = '\\r\\n--' + boundary + '--';\n const body = FbsBlob.getBlob(preBlobPart, blob, postBlobPart);\n if (body === null) {\n throw cannotSliceBlob();\n }\n const urlParams: UrlParams = { name: metadata_['fullPath']! };\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'POST';\n const timeout = service.maxUploadRetryTime;\n const requestInfo = new RequestInfo(\n url,\n method,\n metadataHandler(service, mappings),\n timeout\n );\n requestInfo.urlParams = urlParams;\n requestInfo.headers = headers;\n requestInfo.body = body.uploadData();\n requestInfo.errorHandler = sharedErrorHandler(location);\n return requestInfo;\n}\n\n/**\n * @param current The number of bytes that have been uploaded so far.\n * @param total The total number of bytes in the upload.\n * @param opt_finalized True if the server has finished the upload.\n * @param opt_metadata The upload metadata, should\n * only be passed if opt_finalized is true.\n */\nexport class ResumableUploadStatus {\n finalized: boolean;\n metadata: Metadata | null;\n\n constructor(\n public current: number,\n public total: number,\n finalized?: boolean,\n metadata?: Metadata | null\n ) {\n this.finalized = !!finalized;\n this.metadata = metadata || null;\n }\n}\n\nexport function checkResumeHeader_(\n xhr: Connection,\n allowed?: string[]\n): string {\n let status: string | null = null;\n try {\n status = xhr.getResponseHeader('X-Goog-Upload-Status');\n } catch (e) {\n handlerCheck(false);\n }\n const allowedStatus = allowed || ['active'];\n handlerCheck(!!status && allowedStatus.indexOf(status) !== -1);\n return status as string;\n}\n\nexport function createResumableUpload(\n service: FirebaseStorageImpl,\n location: Location,\n mappings: Mappings,\n blob: FbsBlob,\n metadata?: Metadata | null\n): RequestInfo {\n const urlPart = location.bucketOnlyServerUrl();\n const metadataForUpload = metadataForUpload_(location, blob, metadata);\n const urlParams: UrlParams = { name: metadataForUpload['fullPath']! };\n const url = makeUrl(urlPart, service.host, service._protocol);\n const method = 'POST';\n const headers = {\n 'X-Goog-Upload-Protocol': 'resumable',\n 'X-Goog-Upload-Command': 'start',\n 'X-Goog-Upload-Header-Content-Length': `${blob.size()}`,\n 'X-Goog-Upload-Header-Content-Type': metadataForUpload['contentType']!,\n 'Content-Type': 'application/json; charset=utf-8'\n };\n const body = toResourceString(metadataForUpload, mappings);\n const timeout = service.maxUploadRetryTime;\n\n function handler(xhr: Connection): string {\n checkResumeHeader_(xhr);\n let url;\n try {\n url = xhr.getResponseHeader('X-Goog-Upload-URL');\n } catch (e) {\n handlerCheck(false);\n }\n handlerCheck(isString(url));\n return url as string;\n }\n const requestInfo = new RequestInfo(url, method, handler, timeout);\n requestInfo.urlParams = urlParams;\n requestInfo.headers = headers;\n requestInfo.body = body;\n requestInfo.errorHandler = sharedErrorHandler(location);\n return requestInfo;\n}\n\n/**\n * @param url From a call to fbs.requests.createResumableUpload.\n */\nexport function getResumableUploadStatus(\n service: FirebaseStorageImpl,\n location: Location,\n url: string,\n blob: FbsBlob\n): RequestInfo {\n const headers = { 'X-Goog-Upload-Command': 'query' };\n\n function handler(xhr: Connection): ResumableUploadStatus {\n const status = checkResumeHeader_(xhr, ['active', 'final']);\n let sizeString: string | null = null;\n try {\n sizeString = xhr.getResponseHeader('X-Goog-Upload-Size-Received');\n } catch (e) {\n handlerCheck(false);\n }\n\n if (!sizeString) {\n // null or empty string\n handlerCheck(false);\n }\n\n const size = Number(sizeString);\n handlerCheck(!isNaN(size));\n return new ResumableUploadStatus(size, blob.size(), status === 'final');\n }\n const method = 'POST';\n const timeout = service.maxUploadRetryTime;\n const requestInfo = new RequestInfo(url, method, handler, timeout);\n requestInfo.headers = headers;\n requestInfo.errorHandler = sharedErrorHandler(location);\n return requestInfo;\n}\n\n/**\n * Any uploads via the resumable upload API must transfer a number of bytes\n * that is a multiple of this number.\n */\nexport const RESUMABLE_UPLOAD_CHUNK_SIZE: number = 256 * 1024;\n\n/**\n * @param url From a call to fbs.requests.createResumableUpload.\n * @param chunkSize Number of bytes to upload.\n * @param status The previous status.\n * If not passed or null, we start from the beginning.\n * @throws fbs.Error If the upload is already complete, the passed in status\n * has a final size inconsistent with the blob, or the blob cannot be sliced\n * for upload.\n */\nexport function continueResumableUpload(\n location: Location,\n service: FirebaseStorageImpl,\n url: string,\n blob: FbsBlob,\n chunkSize: number,\n mappings: Mappings,\n status?: ResumableUploadStatus | null,\n progressCallback?: ((p1: number, p2: number) => void) | null\n): RequestInfo {\n // TODO(andysoto): standardize on internal asserts\n // assert(!(opt_status && opt_status.finalized));\n const status_ = new ResumableUploadStatus(0, 0);\n if (status) {\n status_.current = status.current;\n status_.total = status.total;\n } else {\n status_.current = 0;\n status_.total = blob.size();\n }\n if (blob.size() !== status_.total) {\n throw serverFileWrongSize();\n }\n const bytesLeft = status_.total - status_.current;\n let bytesToUpload = bytesLeft;\n if (chunkSize > 0) {\n bytesToUpload = Math.min(bytesToUpload, chunkSize);\n }\n const startByte = status_.current;\n const endByte = startByte + bytesToUpload;\n let uploadCommand = '';\n if (bytesToUpload === 0) {\n uploadCommand = 'finalize';\n } else if (bytesLeft === bytesToUpload) {\n uploadCommand = 'upload, finalize';\n } else {\n uploadCommand = 'upload';\n }\n const headers = {\n 'X-Goog-Upload-Command': uploadCommand,\n 'X-Goog-Upload-Offset': `${status_.current}`\n };\n const body = blob.slice(startByte, endByte);\n if (body === null) {\n throw cannotSliceBlob();\n }\n\n function handler(\n xhr: Connection,\n text: string\n ): ResumableUploadStatus {\n // TODO(andysoto): Verify the MD5 of each uploaded range:\n // the 'x-range-md5' header comes back with status code 308 responses.\n // We'll only be able to bail out though, because you can't re-upload a\n // range that you previously uploaded.\n const uploadStatus = checkResumeHeader_(xhr, ['active', 'final']);\n const newCurrent = status_.current + bytesToUpload;\n const size = blob.size();\n let metadata;\n if (uploadStatus === 'final') {\n metadata = metadataHandler(service, mappings)(xhr, text);\n } else {\n metadata = null;\n }\n return new ResumableUploadStatus(\n newCurrent,\n size,\n uploadStatus === 'final',\n metadata\n );\n }\n const method = 'POST';\n const timeout = service.maxUploadRetryTime;\n const requestInfo = new RequestInfo(url, method, handler, timeout);\n requestInfo.headers = headers;\n requestInfo.body = body.uploadData();\n requestInfo.progressCallback = progressCallback || null;\n requestInfo.errorHandler = sharedErrorHandler(location);\n return requestInfo;\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n Connection,\n ConnectionType,\n ErrorCode,\n Headers\n} from '../../implementation/connection';\nimport { internalError } from '../../implementation/error';\n\n/** An override for the text-based Connection. Used in tests. */\nlet textFactoryOverride: (() => Connection) | null = null;\n\n/**\n * Network layer for browsers. We use this instead of goog.net.XhrIo because\n * goog.net.XhrIo is hyuuuuge and doesn't work in React Native on Android.\n */\nabstract class XhrConnection\n implements Connection\n{\n protected xhr_: XMLHttpRequest;\n private errorCode_: ErrorCode;\n private sendPromise_: Promise;\n protected sent_: boolean = false;\n\n constructor() {\n this.xhr_ = new XMLHttpRequest();\n this.initXhr();\n this.errorCode_ = ErrorCode.NO_ERROR;\n this.sendPromise_ = new Promise(resolve => {\n this.xhr_.addEventListener('abort', () => {\n this.errorCode_ = ErrorCode.ABORT;\n resolve();\n });\n this.xhr_.addEventListener('error', () => {\n this.errorCode_ = ErrorCode.NETWORK_ERROR;\n resolve();\n });\n this.xhr_.addEventListener('load', () => {\n resolve();\n });\n });\n }\n\n abstract initXhr(): void;\n\n send(\n url: string,\n method: string,\n body?: ArrayBufferView | Blob | string,\n headers?: Headers\n ): Promise {\n if (this.sent_) {\n throw internalError('cannot .send() more than once');\n }\n this.sent_ = true;\n this.xhr_.open(method, url, true);\n if (headers !== undefined) {\n for (const key in headers) {\n if (headers.hasOwnProperty(key)) {\n this.xhr_.setRequestHeader(key, headers[key].toString());\n }\n }\n }\n if (body !== undefined) {\n this.xhr_.send(body);\n } else {\n this.xhr_.send();\n }\n return this.sendPromise_;\n }\n\n getErrorCode(): ErrorCode {\n if (!this.sent_) {\n throw internalError('cannot .getErrorCode() before sending');\n }\n return this.errorCode_;\n }\n\n getStatus(): number {\n if (!this.sent_) {\n throw internalError('cannot .getStatus() before sending');\n }\n try {\n return this.xhr_.status;\n } catch (e) {\n return -1;\n }\n }\n\n getResponse(): T {\n if (!this.sent_) {\n throw internalError('cannot .getResponse() before sending');\n }\n return this.xhr_.response;\n }\n\n getErrorText(): string {\n if (!this.sent_) {\n throw internalError('cannot .getErrorText() before sending');\n }\n return this.xhr_.statusText;\n }\n\n /** Aborts the request. */\n abort(): void {\n this.xhr_.abort();\n }\n\n getResponseHeader(header: string): string | null {\n return this.xhr_.getResponseHeader(header);\n }\n\n addUploadProgressListener(listener: (p1: ProgressEvent) => void): void {\n if (this.xhr_.upload != null) {\n this.xhr_.upload.addEventListener('progress', listener);\n }\n }\n\n removeUploadProgressListener(listener: (p1: ProgressEvent) => void): void {\n if (this.xhr_.upload != null) {\n this.xhr_.upload.removeEventListener('progress', listener);\n }\n }\n}\n\nexport class XhrTextConnection extends XhrConnection {\n initXhr(): void {\n this.xhr_.responseType = 'text';\n }\n}\n\nexport function newTextConnection(): Connection {\n return textFactoryOverride ? textFactoryOverride() : new XhrTextConnection();\n}\n\nexport class XhrBytesConnection extends XhrConnection {\n private data_?: ArrayBuffer;\n\n initXhr(): void {\n this.xhr_.responseType = 'arraybuffer';\n }\n}\n\nexport function newBytesConnection(): Connection {\n return new XhrBytesConnection();\n}\n\nexport class XhrBlobConnection extends XhrConnection {\n initXhr(): void {\n this.xhr_.responseType = 'blob';\n }\n}\n\nexport function newBlobConnection(): Connection {\n return new XhrBlobConnection();\n}\n\nexport function newStreamConnection(): Connection {\n throw new Error('Streams are only supported on Node');\n}\n\nexport function injectTestConnection(\n factory: (() => Connection) | null\n): void {\n textFactoryOverride = factory;\n}\n","/**\n * @license\n * Copyright 2019 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * @fileoverview Defines the Firebase StorageReference class.\n */\n\nimport { FbsBlob } from './implementation/blob';\nimport { Location } from './implementation/location';\nimport { getMappings } from './implementation/metadata';\nimport { child, lastComponent, parent } from './implementation/path';\nimport {\n deleteObject as requestsDeleteObject,\n getBytes,\n getDownloadUrl as requestsGetDownloadUrl,\n getMetadata as requestsGetMetadata,\n list as requestsList,\n multipartUpload,\n updateMetadata as requestsUpdateMetadata\n} from './implementation/requests';\nimport { ListOptions, UploadResult } from './public-types';\nimport { dataFromString, StringFormat } from './implementation/string';\nimport { Metadata } from './metadata';\nimport { FirebaseStorageImpl } from './service';\nimport { ListResult } from './list';\nimport { UploadTask } from './task';\nimport { invalidRootOperation, noDownloadURL } from './implementation/error';\nimport { validateNumber } from './implementation/type';\nimport {\n newBlobConnection,\n newBytesConnection,\n newStreamConnection,\n newTextConnection\n} from './platform/connection';\nimport { RequestInfo } from './implementation/requestinfo';\n\n/**\n * Provides methods to interact with a bucket in the Firebase Storage service.\n * @internal\n * @param _location - An fbs.location, or the URL at\n * which to base this object, in one of the following forms:\n * gs:///\n * http[s]://firebasestorage.googleapis.com/\n * /b//o/\n * Any query or fragment strings will be ignored in the http[s]\n * format. If no value is passed, the storage object will use a URL based on\n * the project ID of the base firebase.App instance.\n */\nexport class Reference {\n _location: Location;\n\n constructor(\n private _service: FirebaseStorageImpl,\n location: string | Location\n ) {\n if (location instanceof Location) {\n this._location = location;\n } else {\n this._location = Location.makeFromUrl(location, _service.host);\n }\n }\n\n /**\n * Returns the URL for the bucket and path this object references,\n * in the form gs:///\n * @override\n */\n toString(): string {\n return 'gs://' + this._location.bucket + '/' + this._location.path;\n }\n\n protected _newRef(\n service: FirebaseStorageImpl,\n location: Location\n ): Reference {\n return new Reference(service, location);\n }\n\n /**\n * A reference to the root of this object's bucket.\n */\n get root(): Reference {\n const location = new Location(this._location.bucket, '');\n return this._newRef(this._service, location);\n }\n\n /**\n * The name of the bucket containing this reference's object.\n */\n get bucket(): string {\n return this._location.bucket;\n }\n\n /**\n * The full path of this object.\n */\n get fullPath(): string {\n return this._location.path;\n }\n\n /**\n * The short name of this object, which is the last component of the full path.\n * For example, if fullPath is 'full/path/image.png', name is 'image.png'.\n */\n get name(): string {\n return lastComponent(this._location.path);\n }\n\n /**\n * The `StorageService` instance this `StorageReference` is associated with.\n */\n get storage(): FirebaseStorageImpl {\n return this._service;\n }\n\n /**\n * A `StorageReference` pointing to the parent location of this `StorageReference`, or null if\n * this reference is the root.\n */\n get parent(): Reference | null {\n const newPath = parent(this._location.path);\n if (newPath === null) {\n return null;\n }\n const location = new Location(this._location.bucket, newPath);\n return new Reference(this._service, location);\n }\n\n /**\n * Utility function to throw an error in methods that do not accept a root reference.\n */\n _throwIfRoot(name: string): void {\n if (this._location.path === '') {\n throw invalidRootOperation(name);\n }\n }\n}\n\n/**\n * Download the bytes at the object's location.\n * @returns A Promise containing the downloaded bytes.\n */\nexport function getBytesInternal(\n ref: Reference,\n maxDownloadSizeBytes?: number\n): Promise {\n ref._throwIfRoot('getBytes');\n const requestInfo = getBytes(\n ref.storage,\n ref._location,\n maxDownloadSizeBytes\n );\n return ref.storage\n .makeRequestWithTokens(requestInfo, newBytesConnection)\n .then(bytes =>\n maxDownloadSizeBytes !== undefined\n ? // GCS may not honor the Range header for small files\n (bytes as ArrayBuffer).slice(0, maxDownloadSizeBytes)\n : (bytes as ArrayBuffer)\n );\n}\n\n/**\n * Download the bytes at the object's location.\n * @returns A Promise containing the downloaded blob.\n */\nexport function getBlobInternal(\n ref: Reference,\n maxDownloadSizeBytes?: number\n): Promise {\n ref._throwIfRoot('getBlob');\n const requestInfo = getBytes(\n ref.storage,\n ref._location,\n maxDownloadSizeBytes\n );\n return ref.storage\n .makeRequestWithTokens(requestInfo, newBlobConnection)\n .then(blob =>\n maxDownloadSizeBytes !== undefined\n ? // GCS may not honor the Range header for small files\n (blob as Blob).slice(0, maxDownloadSizeBytes)\n : (blob as Blob)\n );\n}\n\n/** Stream the bytes at the object's location. */\nexport function getStreamInternal(\n ref: Reference,\n maxDownloadSizeBytes?: number\n): ReadableStream {\n ref._throwIfRoot('getStream');\n const requestInfo: RequestInfo = getBytes(\n ref.storage,\n ref._location,\n maxDownloadSizeBytes\n );\n\n // Transforms the stream so that only `maxDownloadSizeBytes` bytes are piped to the result\n const newMaxSizeTransform = (n: number): Transformer => {\n let missingBytes = n;\n return {\n transform(chunk, controller: TransformStreamDefaultController) {\n // GCS may not honor the Range header for small files\n if (chunk.length < missingBytes) {\n controller.enqueue(chunk);\n missingBytes -= chunk.length;\n } else {\n controller.enqueue(chunk.slice(0, missingBytes));\n controller.terminate();\n }\n }\n };\n };\n\n const result =\n maxDownloadSizeBytes !== undefined\n ? new TransformStream(newMaxSizeTransform(maxDownloadSizeBytes))\n : new TransformStream(); // The default transformer forwards all chunks to its readable side\n\n ref.storage\n .makeRequestWithTokens(requestInfo, newStreamConnection)\n .then(readableStream => readableStream.pipeThrough(result))\n .catch(err => result.writable.abort(err));\n\n return result.readable;\n}\n\n/**\n * Uploads data to this object's location.\n * The upload is not resumable.\n *\n * @param ref - StorageReference where data should be uploaded.\n * @param data - The data to upload.\n * @param metadata - Metadata for the newly uploaded data.\n * @returns A Promise containing an UploadResult\n */\nexport function uploadBytes(\n ref: Reference,\n data: Blob | Uint8Array | ArrayBuffer,\n metadata?: Metadata\n): Promise {\n ref._throwIfRoot('uploadBytes');\n const requestInfo = multipartUpload(\n ref.storage,\n ref._location,\n getMappings(),\n new FbsBlob(data, true),\n metadata\n );\n return ref.storage\n .makeRequestWithTokens(requestInfo, newTextConnection)\n .then(finalMetadata => {\n return {\n metadata: finalMetadata,\n ref\n };\n });\n}\n\n/**\n * Uploads data to this object's location.\n * The upload can be paused and resumed, and exposes progress updates.\n * @public\n * @param ref - StorageReference where data should be uploaded.\n * @param data - The data to upload.\n * @param metadata - Metadata for the newly uploaded data.\n * @returns An UploadTask\n */\nexport function uploadBytesResumable(\n ref: Reference,\n data: Blob | Uint8Array | ArrayBuffer,\n metadata?: Metadata\n): UploadTask {\n ref._throwIfRoot('uploadBytesResumable');\n return new UploadTask(ref, new FbsBlob(data), metadata);\n}\n\n/**\n * Uploads a string to this object's location.\n * The upload is not resumable.\n * @public\n * @param ref - StorageReference where string should be uploaded.\n * @param value - The string to upload.\n * @param format - The format of the string to upload.\n * @param metadata - Metadata for the newly uploaded string.\n * @returns A Promise containing an UploadResult\n */\nexport function uploadString(\n ref: Reference,\n value: string,\n format: StringFormat = StringFormat.RAW,\n metadata?: Metadata\n): Promise {\n ref._throwIfRoot('uploadString');\n const data = dataFromString(format, value);\n const metadataClone = { ...metadata } as Metadata;\n if (metadataClone['contentType'] == null && data.contentType != null) {\n metadataClone['contentType'] = data.contentType!;\n }\n return uploadBytes(ref, data.data, metadataClone);\n}\n\n/**\n * List all items (files) and prefixes (folders) under this storage reference.\n *\n * This is a helper method for calling list() repeatedly until there are\n * no more results. The default pagination size is 1000.\n *\n * Note: The results may not be consistent if objects are changed while this\n * operation is running.\n *\n * Warning: listAll may potentially consume too many resources if there are\n * too many results.\n * @public\n * @param ref - StorageReference to get list from.\n *\n * @returns A Promise that resolves with all the items and prefixes under\n * the current storage reference. `prefixes` contains references to\n * sub-directories and `items` contains references to objects in this\n * folder. `nextPageToken` is never returned.\n */\nexport function listAll(ref: Reference): Promise {\n const accumulator: ListResult = {\n prefixes: [],\n items: []\n };\n return listAllHelper(ref, accumulator).then(() => accumulator);\n}\n\n/**\n * Separated from listAll because async functions can't use \"arguments\".\n * @param ref\n * @param accumulator\n * @param pageToken\n */\nasync function listAllHelper(\n ref: Reference,\n accumulator: ListResult,\n pageToken?: string\n): Promise {\n const opt: ListOptions = {\n // maxResults is 1000 by default.\n pageToken\n };\n const nextPage = await list(ref, opt);\n accumulator.prefixes.push(...nextPage.prefixes);\n accumulator.items.push(...nextPage.items);\n if (nextPage.nextPageToken != null) {\n await listAllHelper(ref, accumulator, nextPage.nextPageToken);\n }\n}\n\n/**\n * List items (files) and prefixes (folders) under this storage reference.\n *\n * List API is only available for Firebase Rules Version 2.\n *\n * GCS is a key-blob store. Firebase Storage imposes the semantic of '/'\n * delimited folder structure.\n * Refer to GCS's List API if you want to learn more.\n *\n * To adhere to Firebase Rules's Semantics, Firebase Storage does not\n * support objects whose paths end with \"/\" or contain two consecutive\n * \"/\"s. Firebase Storage List API will filter these unsupported objects.\n * list() may fail if there are too many unsupported objects in the bucket.\n * @public\n *\n * @param ref - StorageReference to get list from.\n * @param options - See ListOptions for details.\n * @returns A Promise that resolves with the items and prefixes.\n * `prefixes` contains references to sub-folders and `items`\n * contains references to objects in this folder. `nextPageToken`\n * can be used to get the rest of the results.\n */\nexport function list(\n ref: Reference,\n options?: ListOptions | null\n): Promise {\n if (options != null) {\n if (typeof options.maxResults === 'number') {\n validateNumber(\n 'options.maxResults',\n /* minValue= */ 1,\n /* maxValue= */ 1000,\n options.maxResults\n );\n }\n }\n const op = options || {};\n const requestInfo = requestsList(\n ref.storage,\n ref._location,\n /*delimiter= */ '/',\n op.pageToken,\n op.maxResults\n );\n return ref.storage.makeRequestWithTokens(requestInfo, newTextConnection);\n}\n\n/**\n * A `Promise` that resolves with the metadata for this object. If this\n * object doesn't exist or metadata cannot be retrieved, the promise is\n * rejected.\n * @public\n * @param ref - StorageReference to get metadata from.\n */\nexport function getMetadata(ref: Reference): Promise {\n ref._throwIfRoot('getMetadata');\n const requestInfo = requestsGetMetadata(\n ref.storage,\n ref._location,\n getMappings()\n );\n return ref.storage.makeRequestWithTokens(requestInfo, newTextConnection);\n}\n\n/**\n * Updates the metadata for this object.\n * @public\n * @param ref - StorageReference to update metadata for.\n * @param metadata - The new metadata for the object.\n * Only values that have been explicitly set will be changed. Explicitly\n * setting a value to null will remove the metadata.\n * @returns A `Promise` that resolves\n * with the new metadata for this object.\n * See `firebaseStorage.Reference.prototype.getMetadata`\n */\nexport function updateMetadata(\n ref: Reference,\n metadata: Partial\n): Promise {\n ref._throwIfRoot('updateMetadata');\n const requestInfo = requestsUpdateMetadata(\n ref.storage,\n ref._location,\n metadata,\n getMappings()\n );\n return ref.storage.makeRequestWithTokens(requestInfo, newTextConnection);\n}\n\n/**\n * Returns the download URL for the given Reference.\n * @public\n * @returns A `Promise` that resolves with the download\n * URL for this object.\n */\nexport function getDownloadURL(ref: Reference): Promise {\n ref._throwIfRoot('getDownloadURL');\n const requestInfo = requestsGetDownloadUrl(\n ref.storage,\n ref._location,\n getMappings()\n );\n return ref.storage\n .makeRequestWithTokens(requestInfo, newTextConnection)\n .then(url => {\n if (url === null) {\n throw noDownloadURL();\n }\n return url;\n });\n}\n\n/**\n * Deletes the object at this location.\n * @public\n * @param ref - StorageReference for object to delete.\n * @returns A `Promise` that resolves if the deletion succeeds.\n */\nexport function deleteObject(ref: Reference): Promise {\n ref._throwIfRoot('deleteObject');\n const requestInfo = requestsDeleteObject(ref.storage, ref._location);\n return ref.storage.makeRequestWithTokens(requestInfo, newTextConnection);\n}\n\n/**\n * Returns reference for object obtained by appending `childPath` to `ref`.\n *\n * @param ref - StorageReference to get child of.\n * @param childPath - Child path from provided ref.\n * @returns A reference to the object obtained by\n * appending childPath, removing any duplicate, beginning, or trailing\n * slashes.\n *\n */\nexport function _getChild(ref: Reference, childPath: string): Reference {\n const newPath = child(ref._location.path, childPath);\n const location = new Location(ref._location.bucket, newPath);\n return new Reference(ref.storage, location);\n}\n","/**\n * @license\n * Copyright 2017 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport { Location } from './implementation/location';\nimport { FailRequest } from './implementation/failrequest';\nimport { Request, makeRequest } from './implementation/request';\nimport { RequestInfo } from './implementation/requestinfo';\nimport { Reference, _getChild } from './reference';\nimport { Provider } from '@firebase/component';\nimport { FirebaseAuthInternalName } from '@firebase/auth-interop-types';\nimport { AppCheckInternalComponentName } from '@firebase/app-check-interop-types';\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport { FirebaseApp, FirebaseOptions } from '@firebase/app';\nimport {\n CONFIG_STORAGE_BUCKET_KEY,\n DEFAULT_HOST,\n DEFAULT_MAX_OPERATION_RETRY_TIME,\n DEFAULT_MAX_UPLOAD_RETRY_TIME\n} from './implementation/constants';\nimport {\n invalidArgument,\n appDeleted,\n noDefaultBucket\n} from './implementation/error';\nimport { validateNumber } from './implementation/type';\nimport { FirebaseStorage } from './public-types';\nimport { createMockUserToken, EmulatorMockTokenOptions } from '@firebase/util';\nimport { Connection, ConnectionType } from './implementation/connection';\n\nexport function isUrl(path?: string): boolean {\n return /^[A-Za-z]+:\\/\\//.test(path as string);\n}\n\n/**\n * Returns a firebaseStorage.Reference for the given url.\n */\nfunction refFromURL(service: FirebaseStorageImpl, url: string): Reference {\n return new Reference(service, url);\n}\n\n/**\n * Returns a firebaseStorage.Reference for the given path in the default\n * bucket.\n */\nfunction refFromPath(\n ref: FirebaseStorageImpl | Reference,\n path?: string\n): Reference {\n if (ref instanceof FirebaseStorageImpl) {\n const service = ref;\n if (service._bucket == null) {\n throw noDefaultBucket();\n }\n const reference = new Reference(service, service._bucket!);\n if (path != null) {\n return refFromPath(reference, path);\n } else {\n return reference;\n }\n } else {\n // ref is a Reference\n if (path !== undefined) {\n return _getChild(ref, path);\n } else {\n return ref;\n }\n }\n}\n\n/**\n * Returns a storage Reference for the given url.\n * @param storage - `Storage` instance.\n * @param url - URL. If empty, returns root reference.\n * @public\n */\nexport function ref(storage: FirebaseStorageImpl, url?: string): Reference;\n/**\n * Returns a storage Reference for the given path in the\n * default bucket.\n * @param storageOrRef - `Storage` service or storage `Reference`.\n * @param pathOrUrlStorage - path. If empty, returns root reference (if Storage\n * instance provided) or returns same reference (if Reference provided).\n * @public\n */\nexport function ref(\n storageOrRef: FirebaseStorageImpl | Reference,\n path?: string\n): Reference;\nexport function ref(\n serviceOrRef: FirebaseStorageImpl | Reference,\n pathOrUrl?: string\n): Reference | null {\n if (pathOrUrl && isUrl(pathOrUrl)) {\n if (serviceOrRef instanceof FirebaseStorageImpl) {\n return refFromURL(serviceOrRef, pathOrUrl);\n } else {\n throw invalidArgument(\n 'To use ref(service, url), the first argument must be a Storage instance.'\n );\n }\n } else {\n return refFromPath(serviceOrRef, pathOrUrl);\n }\n}\n\nfunction extractBucket(\n host: string,\n config?: FirebaseOptions\n): Location | null {\n const bucketString = config?.[CONFIG_STORAGE_BUCKET_KEY];\n if (bucketString == null) {\n return null;\n }\n return Location.makeFromBucketSpec(bucketString, host);\n}\n\nexport function connectStorageEmulator(\n storage: FirebaseStorageImpl,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions | string;\n } = {}\n): void {\n storage.host = `${host}:${port}`;\n storage._protocol = 'http';\n const { mockUserToken } = options;\n if (mockUserToken) {\n storage._overrideAuthToken =\n typeof mockUserToken === 'string'\n ? mockUserToken\n : createMockUserToken(mockUserToken, storage.app.options.projectId);\n }\n}\n\n/**\n * A service that provides Firebase Storage Reference instances.\n * @param opt_url - gs:// url to a custom Storage Bucket\n *\n * @internal\n */\nexport class FirebaseStorageImpl implements FirebaseStorage {\n _bucket: Location | null = null;\n /**\n * This string can be in the formats:\n * - host\n * - host:port\n */\n private _host: string = DEFAULT_HOST;\n _protocol: string = 'https';\n protected readonly _appId: string | null = null;\n private readonly _requests: Set>;\n private _deleted: boolean = false;\n private _maxOperationRetryTime: number;\n private _maxUploadRetryTime: number;\n _overrideAuthToken?: string;\n\n constructor(\n /**\n * FirebaseApp associated with this StorageService instance.\n */\n readonly app: FirebaseApp,\n readonly _authProvider: Provider,\n /**\n * @internal\n */\n readonly _appCheckProvider: Provider,\n /**\n * @internal\n */\n readonly _url?: string,\n readonly _firebaseVersion?: string\n ) {\n this._maxOperationRetryTime = DEFAULT_MAX_OPERATION_RETRY_TIME;\n this._maxUploadRetryTime = DEFAULT_MAX_UPLOAD_RETRY_TIME;\n this._requests = new Set();\n if (_url != null) {\n this._bucket = Location.makeFromBucketSpec(_url, this._host);\n } else {\n this._bucket = extractBucket(this._host, this.app.options);\n }\n }\n\n /**\n * The host string for this service, in the form of `host` or\n * `host:port`.\n */\n get host(): string {\n return this._host;\n }\n\n set host(host: string) {\n this._host = host;\n if (this._url != null) {\n this._bucket = Location.makeFromBucketSpec(this._url, host);\n } else {\n this._bucket = extractBucket(host, this.app.options);\n }\n }\n\n /**\n * The maximum time to retry uploads in milliseconds.\n */\n get maxUploadRetryTime(): number {\n return this._maxUploadRetryTime;\n }\n\n set maxUploadRetryTime(time: number) {\n validateNumber(\n 'time',\n /* minValue=*/ 0,\n /* maxValue= */ Number.POSITIVE_INFINITY,\n time\n );\n this._maxUploadRetryTime = time;\n }\n\n /**\n * The maximum time to retry operations other than uploads or downloads in\n * milliseconds.\n */\n get maxOperationRetryTime(): number {\n return this._maxOperationRetryTime;\n }\n\n set maxOperationRetryTime(time: number) {\n validateNumber(\n 'time',\n /* minValue=*/ 0,\n /* maxValue= */ Number.POSITIVE_INFINITY,\n time\n );\n this._maxOperationRetryTime = time;\n }\n\n async _getAuthToken(): Promise {\n if (this._overrideAuthToken) {\n return this._overrideAuthToken;\n }\n const auth = this._authProvider.getImmediate({ optional: true });\n if (auth) {\n const tokenData = await auth.getToken();\n if (tokenData !== null) {\n return tokenData.accessToken;\n }\n }\n return null;\n }\n\n async _getAppCheckToken(): Promise {\n const appCheck = this._appCheckProvider.getImmediate({ optional: true });\n if (appCheck) {\n const result = await appCheck.getToken();\n // TODO: What do we want to do if there is an error getting the token?\n // Context: appCheck.getToken() will never throw even if an error happened. In the error case, a dummy token will be\n // returned along with an error field describing the error. In general, we shouldn't care about the error condition and just use\n // the token (actual or dummy) to send requests.\n return result.token;\n }\n return null;\n }\n\n /**\n * Stop running requests and prevent more from being created.\n */\n _delete(): Promise {\n if (!this._deleted) {\n this._deleted = true;\n this._requests.forEach(request => request.cancel());\n this._requests.clear();\n }\n return Promise.resolve();\n }\n\n /**\n * Returns a new firebaseStorage.Reference object referencing this StorageService\n * at the given Location.\n */\n _makeStorageReference(loc: Location): Reference {\n return new Reference(this, loc);\n }\n\n /**\n * @param requestInfo - HTTP RequestInfo object\n * @param authToken - Firebase auth token\n */\n _makeRequest(\n requestInfo: RequestInfo,\n requestFactory: () => Connection,\n authToken: string | null,\n appCheckToken: string | null,\n retry = true\n ): Request {\n if (!this._deleted) {\n const request = makeRequest(\n requestInfo,\n this._appId,\n authToken,\n appCheckToken,\n requestFactory,\n this._firebaseVersion,\n retry\n );\n this._requests.add(request);\n // Request removes itself from set when complete.\n request.getPromise().then(\n () => this._requests.delete(request),\n () => this._requests.delete(request)\n );\n return request;\n } else {\n return new FailRequest(appDeleted());\n }\n }\n\n async makeRequestWithTokens(\n requestInfo: RequestInfo,\n requestFactory: () => Connection\n ): Promise {\n const [authToken, appCheckToken] = await Promise.all([\n this._getAuthToken(),\n this._getAppCheckToken()\n ]);\n\n return this._makeRequest(\n requestInfo,\n requestFactory,\n authToken,\n appCheckToken\n ).getPromise();\n }\n}\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\n/**\n * Type constant for Firebase Storage.\n */\nexport const STORAGE_TYPE = 'storage';\n","/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport { _getProvider, FirebaseApp, getApp } from '@firebase/app';\n\nimport {\n ref as refInternal,\n FirebaseStorageImpl,\n connectStorageEmulator as connectEmulatorInternal\n} from './service';\nimport { Provider } from '@firebase/component';\n\nimport {\n StorageReference,\n FirebaseStorage,\n UploadResult,\n ListOptions,\n ListResult,\n UploadTask,\n SettableMetadata,\n UploadMetadata,\n FullMetadata\n} from './public-types';\nimport { Metadata as MetadataInternal } from './metadata';\nimport {\n uploadBytes as uploadBytesInternal,\n uploadBytesResumable as uploadBytesResumableInternal,\n uploadString as uploadStringInternal,\n getMetadata as getMetadataInternal,\n updateMetadata as updateMetadataInternal,\n list as listInternal,\n listAll as listAllInternal,\n getDownloadURL as getDownloadURLInternal,\n deleteObject as deleteObjectInternal,\n Reference,\n _getChild as _getChildInternal,\n getBytesInternal\n} from './reference';\nimport { STORAGE_TYPE } from './constants';\nimport {\n EmulatorMockTokenOptions,\n getModularInstance,\n getDefaultEmulatorHostnameAndPort\n} from '@firebase/util';\nimport { StringFormat } from './implementation/string';\n\nexport { EmulatorMockTokenOptions } from '@firebase/util';\n\nexport { StorageError, StorageErrorCode } from './implementation/error';\n\n/**\n * Public types.\n */\nexport * from './public-types';\n\nexport { Location as _Location } from './implementation/location';\nexport { UploadTask as _UploadTask } from './task';\nexport type { Reference as _Reference } from './reference';\nexport type { FirebaseStorageImpl as _FirebaseStorageImpl } from './service';\nexport { FbsBlob as _FbsBlob } from './implementation/blob';\nexport { dataFromString as _dataFromString } from './implementation/string';\nexport {\n invalidRootOperation as _invalidRootOperation,\n invalidArgument as _invalidArgument\n} from './implementation/error';\nexport {\n TaskEvent as _TaskEvent,\n TaskState as _TaskState\n} from './implementation/taskenums';\nexport { StringFormat };\n\n/**\n * Downloads the data at the object's location. Returns an error if the object\n * is not found.\n *\n * To use this functionality, you have to whitelist your app's origin in your\n * Cloud Storage bucket. See also\n * https://cloud.google.com/storage/docs/configuring-cors\n *\n * @public\n * @param ref - StorageReference where data should be downloaded.\n * @param maxDownloadSizeBytes - If set, the maximum allowed size in bytes to\n * retrieve.\n * @returns A Promise containing the object's bytes\n */\nexport function getBytes(\n ref: StorageReference,\n maxDownloadSizeBytes?: number\n): Promise {\n ref = getModularInstance(ref);\n return getBytesInternal(ref as Reference, maxDownloadSizeBytes);\n}\n\n/**\n * Uploads data to this object's location.\n * The upload is not resumable.\n * @public\n * @param ref - {@link StorageReference} where data should be uploaded.\n * @param data - The data to upload.\n * @param metadata - Metadata for the data to upload.\n * @returns A Promise containing an UploadResult\n */\nexport function uploadBytes(\n ref: StorageReference,\n data: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): Promise {\n ref = getModularInstance(ref);\n return uploadBytesInternal(\n ref as Reference,\n data,\n metadata as MetadataInternal\n );\n}\n\n/**\n * Uploads a string to this object's location.\n * The upload is not resumable.\n * @public\n * @param ref - {@link StorageReference} where string should be uploaded.\n * @param value - The string to upload.\n * @param format - The format of the string to upload.\n * @param metadata - Metadata for the string to upload.\n * @returns A Promise containing an UploadResult\n */\nexport function uploadString(\n ref: StorageReference,\n value: string,\n format?: StringFormat,\n metadata?: UploadMetadata\n): Promise {\n ref = getModularInstance(ref);\n return uploadStringInternal(\n ref as Reference,\n value,\n format,\n metadata as MetadataInternal\n );\n}\n\n/**\n * Uploads data to this object's location.\n * The upload can be paused and resumed, and exposes progress updates.\n * @public\n * @param ref - {@link StorageReference} where data should be uploaded.\n * @param data - The data to upload.\n * @param metadata - Metadata for the data to upload.\n * @returns An UploadTask\n */\nexport function uploadBytesResumable(\n ref: StorageReference,\n data: Blob | Uint8Array | ArrayBuffer,\n metadata?: UploadMetadata\n): UploadTask {\n ref = getModularInstance(ref);\n return uploadBytesResumableInternal(\n ref as Reference,\n data,\n metadata as MetadataInternal\n ) as UploadTask;\n}\n\n/**\n * A `Promise` that resolves with the metadata for this object. If this\n * object doesn't exist or metadata cannot be retrieved, the promise is\n * rejected.\n * @public\n * @param ref - {@link StorageReference} to get metadata from.\n */\nexport function getMetadata(ref: StorageReference): Promise {\n ref = getModularInstance(ref);\n return getMetadataInternal(ref as Reference) as Promise;\n}\n\n/**\n * Updates the metadata for this object.\n * @public\n * @param ref - {@link StorageReference} to update metadata for.\n * @param metadata - The new metadata for the object.\n * Only values that have been explicitly set will be changed. Explicitly\n * setting a value to null will remove the metadata.\n * @returns A `Promise` that resolves with the new metadata for this object.\n */\nexport function updateMetadata(\n ref: StorageReference,\n metadata: SettableMetadata\n): Promise {\n ref = getModularInstance(ref);\n return updateMetadataInternal(\n ref as Reference,\n metadata as Partial\n ) as Promise;\n}\n\n/**\n * List items (files) and prefixes (folders) under this storage reference.\n *\n * List API is only available for Firebase Rules Version 2.\n *\n * GCS is a key-blob store. Firebase Storage imposes the semantic of '/'\n * delimited folder structure.\n * Refer to GCS's List API if you want to learn more.\n *\n * To adhere to Firebase Rules's Semantics, Firebase Storage does not\n * support objects whose paths end with \"/\" or contain two consecutive\n * \"/\"s. Firebase Storage List API will filter these unsupported objects.\n * list() may fail if there are too many unsupported objects in the bucket.\n * @public\n *\n * @param ref - {@link StorageReference} to get list from.\n * @param options - See {@link ListOptions} for details.\n * @returns A `Promise` that resolves with the items and prefixes.\n * `prefixes` contains references to sub-folders and `items`\n * contains references to objects in this folder. `nextPageToken`\n * can be used to get the rest of the results.\n */\nexport function list(\n ref: StorageReference,\n options?: ListOptions\n): Promise {\n ref = getModularInstance(ref);\n return listInternal(ref as Reference, options);\n}\n\n/**\n * List all items (files) and prefixes (folders) under this storage reference.\n *\n * This is a helper method for calling list() repeatedly until there are\n * no more results. The default pagination size is 1000.\n *\n * Note: The results may not be consistent if objects are changed while this\n * operation is running.\n *\n * Warning: `listAll` may potentially consume too many resources if there are\n * too many results.\n * @public\n * @param ref - {@link StorageReference} to get list from.\n *\n * @returns A `Promise` that resolves with all the items and prefixes under\n * the current storage reference. `prefixes` contains references to\n * sub-directories and `items` contains references to objects in this\n * folder. `nextPageToken` is never returned.\n */\nexport function listAll(ref: StorageReference): Promise {\n ref = getModularInstance(ref);\n return listAllInternal(ref as Reference);\n}\n\n/**\n * Returns the download URL for the given {@link StorageReference}.\n * @public\n * @param ref - {@link StorageReference} to get the download URL for.\n * @returns A `Promise` that resolves with the download\n * URL for this object.\n */\nexport function getDownloadURL(ref: StorageReference): Promise {\n ref = getModularInstance(ref);\n return getDownloadURLInternal(ref as Reference);\n}\n\n/**\n * Deletes the object at this location.\n * @public\n * @param ref - {@link StorageReference} for object to delete.\n * @returns A `Promise` that resolves if the deletion succeeds.\n */\nexport function deleteObject(ref: StorageReference): Promise {\n ref = getModularInstance(ref);\n return deleteObjectInternal(ref as Reference);\n}\n\n/**\n * Returns a {@link StorageReference} for the given url.\n * @param storage - {@link FirebaseStorage} instance.\n * @param url - URL. If empty, returns root reference.\n * @public\n */\nexport function ref(storage: FirebaseStorage, url?: string): StorageReference;\n/**\n * Returns a {@link StorageReference} for the given path in the\n * default bucket.\n * @param storageOrRef - {@link FirebaseStorage} or {@link StorageReference}.\n * @param pathOrUrlStorage - path. If empty, returns root reference (if {@link FirebaseStorage}\n * instance provided) or returns same reference (if {@link StorageReference} provided).\n * @public\n */\nexport function ref(\n storageOrRef: FirebaseStorage | StorageReference,\n path?: string\n): StorageReference;\nexport function ref(\n serviceOrRef: FirebaseStorage | StorageReference,\n pathOrUrl?: string\n): StorageReference | null {\n serviceOrRef = getModularInstance(serviceOrRef);\n return refInternal(\n serviceOrRef as FirebaseStorageImpl | Reference,\n pathOrUrl\n );\n}\n\n/**\n * @internal\n */\nexport function _getChild(ref: StorageReference, childPath: string): Reference {\n return _getChildInternal(ref as Reference, childPath);\n}\n\n/**\n * Gets a {@link FirebaseStorage} instance for the given Firebase app.\n * @public\n * @param app - Firebase app to get {@link FirebaseStorage} instance for.\n * @param bucketUrl - The gs:// url to your Firebase Storage Bucket.\n * If not passed, uses the app's default Storage Bucket.\n * @returns A {@link FirebaseStorage} instance.\n */\nexport function getStorage(\n app: FirebaseApp = getApp(),\n bucketUrl?: string\n): FirebaseStorage {\n app = getModularInstance(app);\n const storageProvider: Provider<'storage'> = _getProvider(app, STORAGE_TYPE);\n const storageInstance = storageProvider.getImmediate({\n identifier: bucketUrl\n });\n const emulator = getDefaultEmulatorHostnameAndPort('storage');\n if (emulator) {\n connectStorageEmulator(storageInstance, ...emulator);\n }\n return storageInstance;\n}\n\n/**\n * Modify this {@link FirebaseStorage} instance to communicate with the Cloud Storage emulator.\n *\n * @param storage - The {@link FirebaseStorage} instance\n * @param host - The emulator host (ex: localhost)\n * @param port - The emulator port (ex: 5001)\n * @param options - Emulator options. `options.mockUserToken` is the mock auth\n * token to use for unit testing Security Rules.\n * @public\n */\nexport function connectStorageEmulator(\n storage: FirebaseStorage,\n host: string,\n port: number,\n options: {\n mockUserToken?: EmulatorMockTokenOptions | string;\n } = {}\n): void {\n connectEmulatorInternal(storage as FirebaseStorageImpl, host, port, options);\n}\n","/**\n * Cloud Storage for Firebase\n *\n * @packageDocumentation\n */\n\n/**\n * @license\n * Copyright 2020 Google LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n// eslint-disable-next-line import/no-extraneous-dependencies\nimport {\n _registerComponent,\n registerVersion,\n SDK_VERSION\n} from '@firebase/app';\n\nimport { FirebaseStorageImpl } from '../src/service';\nimport {\n Component,\n ComponentType,\n ComponentContainer,\n InstanceFactoryOptions\n} from '@firebase/component';\n\nimport { name, version } from '../package.json';\n\nimport { FirebaseStorage } from './public-types';\nimport { STORAGE_TYPE } from './constants';\n\nexport * from './api';\nexport * from './api.browser';\n\nfunction factory(\n container: ComponentContainer,\n { instanceIdentifier: url }: InstanceFactoryOptions\n): FirebaseStorage {\n const app = container.getProvider('app').getImmediate();\n const authProvider = container.getProvider('auth-internal');\n const appCheckProvider = container.getProvider('app-check-internal');\n\n return new FirebaseStorageImpl(\n app,\n authProvider,\n appCheckProvider,\n url,\n SDK_VERSION\n );\n}\n\nfunction registerStorage(): void {\n _registerComponent(\n new Component(\n STORAGE_TYPE,\n factory,\n ComponentType.PUBLIC\n ).setMultipleInstances(true)\n );\n //RUNTIME_ENV will be replaced during the compilation to \"node\" for nodejs and an empty string for browser\n registerVersion(name, version, '__RUNTIME_ENV__');\n // BUILD_TARGET will be replaced by values like esm2017, cjs2017, etc during the compilation\n registerVersion(name, version, '__BUILD_TARGET__');\n}\n\nregisterStorage();\n","import { initializeApp } from 'firebase/app';\nimport { getAuth } from 'firebase/auth';\nimport { getDatabase, ref, onValue, set, remove } from 'firebase/database';\nimport { getFirestore, doc, getDoc } from 'firebase/firestore';\nimport { getStorage } from 'firebase/storage';\n\nconst firebaseConfig = {\n apiKey: \"AIzaSyCSbq_y_AuFIbrS8-pjrEyCIUiQpWpb1f4\",\n authDomain: \"jungdari-d22b5.firebaseapp.com\",\n databaseURL: \"https://jungdari-d22b5-default-rtdb.asia-southeast1.firebasedatabase.app\",\n projectId: \"jungdari-d22b5\",\n storageBucket: \"jungdari-d22b5.appspot.com\",\n messagingSenderId: \"380416007645\",\n appId: \"1:380416007645:web:0b1e7f4201bbc4c7b02a34\"\n };\n\n\nconst app = initializeApp(firebaseConfig);\n\nconst auth = getAuth(app);\nconst db = getFirestore(app);\nconst storage = getStorage(app);\nconst database = getDatabase(app);\n\nexport { auth, db, storage, database, ref, onValue, set, remove, doc, getDoc };","import React, { useState } from 'react';\nimport { signInWithEmailAndPassword } from 'firebase/auth';\nimport { auth } from '../firebase';\nimport { useNavigate } from 'react-router-dom';\nimport '../css/Login.css'\n\nfunction Login() {\n const [email, setEmail] = useState('');\n const [password, setPassword] = useState('');\n const navigate = useNavigate();\n\n const handleLogin = async (e) => {\n e.preventDefault();\n try {\n await signInWithEmailAndPassword(auth, email, password);\n navigate('/map');\n } catch (error) {\n alert('로그인 정보가 잘못되었습니다.');\n }\n };\n\n return (\n