{"version":3,"sources":["jsdelivr-header.js","/npm/babel-plugin-i18next-extract@1.1.0/index.js"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACNA,aAEA,OAAO,eAAe,QAAS,aAAc,CAAE,OAAO,IAEtD,IAAI,SAAW,QAAQ,QACnB,WAAa,QAAQ,gBACrB,GAAK,QAAQ,MACb,UAAY,QAAQ,aACpB,UAAY,QAAQ,yBACpB,QAAU,QAAQ,WAEtB,SAAS,yBAAyB,GAChC,IAAI,EAAI,OAAO,OAAO,MAatB,OAZI,GACF,OAAO,KAAK,GAAG,SAAQ,SAAU,GAC/B,GAAU,YAAN,EAAiB,CACnB,IAAI,EAAI,OAAO,yBAAyB,EAAG,GAC3C,OAAO,eAAe,EAAG,EAAG,EAAE,IAAM,EAAI,CACtC,YAAY,EACZ,IAAK,WAAc,OAAO,EAAE,EAAI,GAEpC,CACF,IAEF,EAAE,QAAU,EACL,OAAO,OAAO,EACvB,CAEA,IAAI,oBAAmC,yBAAyB,UAC5D,sBAAqC,yBAAyB,YAC9D,mBAAkC,yBAAyB,SAc/D,MAAM,oBAAsB,mBACtB,uBAAyB,CAC7B,QAAS,CACP,KAAM,+BACN,UAAW,oCACX,cAAe,0BACf,aAAc,0BAEhB,UAAW,CACT,KAAM,+BACN,UAAW,oCACX,cAAe,gCACf,aAAc,gCAEhB,QAAS,CACP,KAAM,oCACN,UAAW,yCACX,cAAe,qCACf,aAAc,qCAEhB,OAAQ,CACN,KAAM,mCACN,UAAW,wCACX,cAAe,oCACf,aAAc,qCASlB,SAAU,oCAAoC,GAC5C,IAAK,MAAM,KAAQ,EAAQ,MAAM,MAAM,SAAU,CAC/C,MAAM,EAAe,EAAK,OACpB,EAAU,EAAa,MAAM,OAAO,GACpC,EAAQ,EAAa,MAAM,WAAW,IAAM,GAClD,IAAK,MAAO,EAAiB,KAAwB,OAAO,QAAQ,wBAClE,IAAK,MAAO,EAAkB,KAAuB,OAAO,QAAQ,GAC9D,IAAY,SACR,CACJ,KAAM,EACN,MAAO,EACP,QACA,WAKV,CACF,CAOA,SAAS,6BAA6B,GACpC,MAAM,EAAS,QACf,IAAK,MAAM,KAAe,EACxB,GAAK,EAAY,QAAQ,MACC,SAAtB,EAAY,OACd,EAAO,KAAK,CACV,UAAW,EAAY,QAAQ,IAAI,MAAM,KACzC,SAAU,EAAY,QAAQ,IAAI,MAAM,QACrC,IAGmB,cAAtB,EAAY,OACd,EAAO,KAAK,CACV,UAAW,EAAY,QAAQ,IAAI,IAAI,KAAO,EAC9C,SAAU,EAAY,QAAQ,IAAI,IAAI,KAAO,KAC1C,IAGmB,kBAAtB,EAAY,OACd,EAAO,KAAK,CACV,UAAW,EAAY,QAAQ,IAAI,MAAM,KACzC,SAAU,OACP,IAGmB,iBAAtB,EAAY,OACd,IAAK,MAAM,KAAO,EACZ,EAAI,OAAS,EAAY,MAAsB,kBAAd,EAAI,OAA6B,EAAI,WAAa,MACrF,EAAI,SAAW,EAAY,QAAQ,IAAI,MAAM,MAKrD,OAAO,CACT,CAMA,SAAS,kBAAkB,GACzB,MAAM,EAAmB,QACzB,IAAK,MAAM,KAAW,EACpB,EAAiB,QAAQ,oCAAoC,IAE/D,OAAO,6BAA6B,EACtC,CAQA,SAAS,sBAAsB,EAAM,EAAiB,GACpD,IAAK,EAAK,KAAK,IAAK,OAAO,KAC3B,MAAM,EAAW,EAAK,KAAK,IAAI,MAAM,KACrC,IAAK,MAAM,KAAe,EACxB,GAAI,EAAY,OAAS,GAAmB,EAAY,WAAa,GAAY,GAAY,EAAY,SACvG,OAAO,EAGX,OAAO,IACT,CAEA,SAAS,kBAAkB,GACzB,OAAI,EAAK,WAAW,KACX,SAAS,QAAQ,GAEnB,CACT,CACA,SAAS,SAAS,EAAG,GACnB,YAAa,IAAN,EAAkB,EAAa,CACxC,CAOA,SAAS,YAAY,GACnB,MAAM,EAAiB,CAAC,MAClB,EAAwB,SAAS,EAAK,sBAAuB,IAC7D,EAA4B,SAAS,EAAK,0BAA2B,IAC3E,MAAO,CACL,QAAS,SAAS,EAAK,QAAS,GAChC,UAAW,SAAS,EAAK,UAAW,eACpC,gBAAiB,SAAS,EAAK,gBAAiB,KAChD,iBAAkB,SAAS,EAAK,iBAAkB,KAClD,aAAc,SAAS,EAAK,aAAc,KAC1C,YAAa,SAAS,EAAK,YAAa,KAExC,2BAA4B,SAAS,EAAK,2BAA4B,CAAC,KAAM,SAAU,IAAK,MAC5F,kBAAmB,SAAS,EAAK,kBAAmB,MACpD,qBAAsB,SAAS,EAAK,qBAAsB,CAAC,UAAW,SACtE,eAAgB,SAAS,EAAK,eAAgB,CAAC,MAC/C,gBAAiB,SAAS,EAAK,gBAAiB,CAAC,GAAI,OAAQ,WAC7D,WAAuC,mBAApB,EAAK,WAA4B,EAAK,WAAa,SAAS,EAAK,WAAY,kDAChG,aAAc,SAAS,EAAK,aAAc,IAC1C,uBAAwB,SAAS,EAAK,uBAAwB,GAC9D,qCAAsC,SAAS,EAAK,sCAAsC,GAC1F,kBAAmB,SAAS,EAAK,mBAAmB,GACpD,gCAAiC,SAAS,EAAK,iCAAiC,GAChF,eAAgB,SAAS,EAAK,gBAAgB,GAC9C,UAAW,SAAS,EAAK,UAAW,GACpC,wBACA,4BACA,SAAU,SAAS,EAAK,SAAU,CAAC,yBACnC,MAAO,CACL,8BAA+B,EAAsB,KAAI,EAAE,EAAc,KAAgB,CAAC,kBAAkB,GAAe,KAC3H,oBAAqB,EAA0B,KAAI,EAAE,EAAc,KAAgB,CAAC,kBAAkB,GAAe,MAG3H,CAEA,MAAM,YAAc,+BAKpB,MAAM,oBAAoB,OAS1B,MAAM,sBAAsB,aAmB5B,SAAS,oBAAoB,GAC3B,MAAsB,iBAAR,GAA4B,OAAR,IAAiB,MAAM,QAAQ,EACnE,CAUA,SAAS,gBAAgB,EAAa,EAAS,EAAU,GACvD,GAAuB,IAAnB,EAAQ,OACV,MAAO,IACF,EACH,CAAC,GAAW,GAGhB,MAAM,EAAiB,EAAQ,GAC/B,IAAI,EAAU,EAAY,GAC1B,QAAgB,IAAZ,EACF,EAAU,CAAC,OACN,IAAK,oBAAoB,GAC9B,MAAM,IAAI,cAEZ,MAAO,IACF,EACH,CAAC,GAAiB,gBAAgB,EAAS,EAAQ,MAAM,GAAI,EAAU,GAE3E,CACA,MAAM,SAAW,CACf,KAAM,KACG,CACL,kBAAmB,GACnB,iBAAkB,KAClB,QAAS,CAAC,IAGd,MAAO,EACL,cAEA,MAAM,EAAyB,EAAQ,MAAM,UACvC,EAAwB,EAAQ,MAAM,UAC5C,MAAO,CACL,kBAA8C,OAA3B,EAAkC,GAAK,EAAuB,GACjF,iBAA4C,OAA1B,EAAiC,GAAK,EAAsB,GAC9E,QAAS,KAAK,MAAM,GACrB,EAEH,UAAW,EACT,SACA,UAEO,EAAK,kBAAoB,UAAU,EAAK,QAAS,CACtD,MAAO,EAAO,YACX,EAAK,iBAEZ,OAAQ,EACN,OACA,UACA,eAEA,IAAI,EAAU,EAAK,QACnB,IAAK,MAAM,KAAK,EAAS,CACvB,MAAM,EAAM,EAAQ,GACpB,QAAY,IAAR,EACF,OACK,IAAK,oBAAoB,GAC9B,MAAM,IAAI,cAEZ,EAAU,CACZ,CACA,OAAO,EAAQ,EAAS,EAE1B,OAAQ,IACN,MAAM,IACJ,EAAG,KACH,EAAI,MACJ,GACE,EACJ,MAAO,IACF,EACH,QAAS,gBAAgB,EAAK,QAAS,EAAI,QAAS,EAAI,SAAU,GACnE,GAiBL,SAAS,sBACP,MAAO,CACL,yBAA0B,CAAC,EAC3B,wBAAyB,CAAC,EAE9B,CAKA,SAAS,oBAET,EAAU,EAAQ,GAChB,IAAI,EACJ,IACE,EAAU,GAAG,aAAa,EAAU,CAClC,SAAU,QAEd,CAAE,MAAO,GACP,GAAY,OAAR,GAA8B,iBAAP,GAAgC,WAAb,EAAI,KAAmB,OAAO,EAAS,KAAK,CACxF,WAEF,MAAM,CACR,CACA,OAAO,EAAS,MAAM,CACpB,SACA,WAEJ,CAKA,SAAS,gBAAgB,EAAK,EAAQ,GAGpC,IAAI,EAAe,EAAO,aAC1B,MAAM,GAAwD,IAA7B,EAAO,mBAA8B,MAAM,QAAQ,EAAO,oBAAsB,EAAO,kBAAkB,SAAS,GAC7I,EAAkC,EAAO,iCAC3C,IAA6B,GAAoC,EAAI,eACvE,EAAe,EAAI,UAErB,MAAM,GAAkE,IAAlC,EAAO,wBAAmC,MAAM,QAAQ,EAAO,yBAA2B,EAAO,uBAAuB,SAAS,GACjK,EAAuC,EAAO,qCAIpD,OAHI,GAAoE,OAAnC,EAAI,cAAc,eAA0B,GAAyC,EAAI,eAC5H,EAAe,EAAI,cAAc,cAE5B,CACT,CAUA,SAAS,sBAAsB,EAAM,EAAQ,EAAQ,GACnD,MAAM,EAAkB,CAAC,EACnB,EAAa,SACnB,IAAK,MAAM,KAAO,EAAM,CAEtB,MAAM,EAAwC,mBAAtB,EAAO,WAA4B,EAAO,WAAW,EAAQ,EAAI,IAAM,EAAO,WAAW,QAAQ,aAAc,GAAQ,QAAQ,SAAU,EAAI,IACrK,EAAgB,GAAY,IAAK,EAAgB,IAAa,GAAK,EACrE,CACA,IAAK,MAAO,EAAU,KAAoB,OAAO,QAAQ,GAAkB,CACzE,IAAI,EACJ,EAAM,yBAAyB,GAAY,UAAiF,QAAtE,EAAwB,EAAM,yBAAyB,UAAiD,IAA1B,EAAmC,EAAwB,CAAC,EAAG,oBAAoB,EAAY,EAAQ,GAAW,CAEpP,WAAY,CAAC,EAAM,IAAW,IAEhC,MAAM,EAA0B,EAAM,yBAAyB,GAC/D,IAAI,EAAkB,EAAM,wBAAwB,KAAc,EAAO,eAAiB,EAAW,KAAK,CACxG,WACG,GACL,IAAK,MAAM,KAAK,EAAiB,CAC/B,MAAM,EAAgB,EAAW,OAAO,CACtC,SACA,KAAM,EACN,QAAS,EAAE,QACX,SAAU,EAAE,WAEd,EAAkB,EAAW,OAAO,CAClC,SACA,KAAM,EACN,IAAK,EACL,WAAyB,IAAlB,EAA8B,gBAAgB,EAAG,EAAQ,GAAU,GAE9E,CACA,EAAM,wBAAwB,GAAY,EAG1C,MAAM,EAAgB,SAAS,QAAQ,GACvC,GAAG,UAAU,EAAe,CAC1B,WAAW,IAEb,GAAG,cAAc,EAAU,EAAW,UAAU,CAC9C,SACA,KAAM,IACJ,CACF,SAAU,QAEd,CACF,CAKA,MAAM,wBAAwB,MAC5B,WAAA,CAAY,EAAS,GACnB,MAAM,GACN,KAAK,SAAW,CAClB,EAUF,SAAS,eAAe,GAEtB,OADI,MAAM,QAAQ,KAAM,EAAM,EAAI,SACnB,IAAR,EAAoB,KAAO,CACpC,CAQA,SAAS,oCAAoC,EAAM,GACjD,MAAM,EAAgB,sBAAsB,EAAM,YAAa,GACzD,EAAqB,sBAAsB,EAAM,UAAW,GAC5D,EAAoB,sBAAsB,EAAM,SAAU,GAC1D,EAAM,CAAC,EAIb,GAHsB,OAAlB,IACF,EAAI,GAAK,EAAc,OAEE,OAAvB,EACF,GAAI,CAAC,GAAI,UAAU,SAAS,EAAmB,OAC7C,EAAI,UAAW,OACV,GAAiC,YAA7B,EAAmB,MAC5B,EAAI,UAAW,OAEf,IACE,MAAM,EAAM,KAAK,MAAM,EAAmB,OACtC,MAAM,QAAQ,GAAM,EAAI,SAAW,EAAS,EAAI,SAAW,CAAC,EAAmB,MACrF,CAAE,MACA,EAAI,SAAW,CAAC,EAAmB,MACrC,CAUJ,OAP0B,OAAtB,IAC8B,YAA5B,EAAkB,MACpB,EAAI,UAAW,EAEf,EAAI,UAAW,GAGZ,CACT,CAMA,SAAS,iBAAiB,EAAU,EAAc,GAChD,GAAI,EAAS,iBAAiB,EAAc,GAAa,OAAO,EAChE,GAAI,EAAS,sBAAwB,EAAS,wBAAyB,CACrE,MAAM,EAAM,EAAS,IAAI,UACnB,EAAO,EAAS,IAAI,YAC1B,QAAI,MAAM,QAAQ,IAAQ,MAAM,QAAQ,KAAU,EAAK,iBAAmB,EAAK,qBACxE,EAAI,iBAAiB,EAAc,MAAQ,EAAK,KAAK,OAAS,EACvE,CACA,OAAO,CACT,CAQA,SAAS,0BAA0B,EAAU,EAAa,GACxD,IAAK,EAAS,qBAAsB,OAAO,EAC3C,MAAM,EAAM,EAAS,IAAI,UACzB,IAAK,EAAI,eAAgB,OAAO,EAChC,MAAM,EAAO,EAAS,IAAI,YAC1B,QAAI,MAAM,QAAQ,KAAU,EAAK,kBAC1B,EAAY,SAAS,EAAI,KAAK,OAAS,EAAK,KAAK,OAAS,EACnE,CAQA,SAAS,oBAET,GAGE,IAAK,IAAS,EAAK,KACjB,OAAO,KAET,MAAM,EAAa,EAAK,WACxB,OAAI,EAAW,UACN,EAAW,MAEb,IACT,CAQA,SAAU,wBAAwB,GAChC,MAAM,EAAa,EAAK,IAAI,cAC5B,IAAK,MAAM,KAAQ,EAAY,CAC7B,MAAM,EAAU,EAAK,IAAI,OACzB,GAAI,MAAM,QAAQ,GAAU,SAC5B,IAAI,EAAgB,KACpB,GAAI,EAAQ,YACV,EAAgB,oBAAoB,OAC/B,KAAI,EAAQ,eAGjB,SAFA,EAAgB,EAAQ,KAAK,IAG/B,MACM,CAAC,EAAe,EACxB,CACF,CAQA,SAAS,0BAA0B,EAAM,GACvC,IAAK,MAAO,EAAe,KAAS,wBAAwB,GAC1D,GAAI,IAAkB,EAAK,OAAO,EAEpC,OAAO,IACT,CASA,SAAS,uBAAuB,EAAM,GACpC,MACM,EADiB,EAAK,IAAI,kBACE,IAAI,cACtC,IAAK,MAAM,KAAa,EAAY,CAClC,IAAK,EAAU,iBAAkB,SACjC,MAAM,EAAgB,EAAU,IAAI,QACpC,GAAK,EAAc,mBACf,IAAS,EAAc,KAAK,KAAM,OAAO,CAC/C,CACA,OAAO,IACT,CAgBA,SAAS,kBAAkB,GACzB,MAAM,EAAW,EAAS,MAAM,SAAS,EAAS,KAAK,MACvD,IAAK,EAAU,OAAO,KACtB,MAAM,EAAyB,IAAK,EAAS,KAAK,uBAAyB,CAAC,EAAS,KAAK,IAAI,SAAW,MAAQ,EAAS,mBAAmB,QAAO,GAAK,EAAE,2BAA0B,KAAI,GAAK,EAAE,IAAI,YACpM,GAAsC,IAAlC,EAAuB,OAAc,OAAO,KAChD,MAAM,EAAmB,EAAuB,EAAuB,OAAS,GAChF,OAAI,MAAM,QAAQ,GAA0B,KACvC,EAAiB,eACf,EADsC,IAE/C,CAWA,SAAS,qBAAqB,EAAmB,EAAM,GACrD,OAAO,EAAkB,MAAK,EAAE,EAAc,MAC5C,GAAI,SAAS,WAAW,GAAe,CACrC,IAAI,EAA2B,SAAS,SAAS,SAAS,QAAQ,EAAK,MAAM,UAAW,GAMxF,GALK,EAAyB,WAAW,OACvC,EAA2B,IAAM,SAAS,IAAM,GAI9C,iBAAiB,EAAM,EAA0B,GACnD,OAAO,CAEX,CACA,OAAO,iBAAiB,EAAM,EAAc,EAAW,GAE3D,CAoBA,SAAS,uBAAuB,EAAM,GACpC,MAAM,EAAa,EAAK,IAAI,cACtB,EAAkB,MAAM,QAAQ,GAAc,EAAa,CAAC,GAClE,IAAK,MAAM,KAAY,EACrB,GAAI,EAAS,mBAAoB,CAC/B,MAAM,EAAM,EAAS,KAAK,IACpB,EAAQ,EAAS,KAAK,MAC5B,GAAiB,eAAb,EAAI,MAAwC,eAAf,EAAM,MAAyB,EAAe,SAAS,EAAI,MAC1F,OAAO,EAAM,IAEjB,CAEF,OAAO,EAAe,MAAK,GAAQ,EAAK,MAAM,SAAS,IACzD,CAOA,SAAS,iBAAiB,GAExB,OAAO,iBADgB,EAAK,IAAI,kBACO,IAAI,QAAS,gBAAiB,QACvE,CAQA,SAAS,2BAA2B,EAAM,GACxC,MAAM,EAAM,CACV,UAAU,EACV,UAAU,EACV,UAAW,KACX,GAAI,KACJ,aAAc,MAEV,EAAY,uBAAuB,EAAM,SAC/C,EAAI,SAAyB,OAAd,EACf,MAAM,EAAe,uBAAuB,EAAM,YAClD,GAAI,EAAc,CAChB,MAAM,EAAQ,EAAa,IAAI,SAC/B,GAAI,EAAM,2BAA4B,CACpC,MAAM,EAAa,EAAM,IAAI,cACzB,EAAW,uBACb,EAAI,SAAgE,OAArD,0BAA0B,EAAY,WAEzD,CACF,CACA,MAAM,EAAS,uBAAuB,EAAM,MAC5C,GAAI,EAAQ,CACV,IAAI,EAAQ,EAAO,IAAI,SACnB,EAAM,6BAA4B,EAAQ,EAAM,IAAI,eACxD,EAAI,GAAK,eAAe,oBAAoB,GAC9C,CACA,MAAM,EAAe,uBAAuB,EAAM,YAClD,GAAI,EAAc,CAChB,IAAI,EAAQ,EAAa,IAAI,SACzB,EAAM,6BAA4B,EAAQ,EAAM,IAAI,eACxD,EAAI,aAAe,oBAAoB,EACzC,CACA,MAAO,IACF,KACA,oCAAoC,EAAM,GAEjD,CAUA,SAAS,qCAAqC,GAC5C,MAAM,EAAQ,IAAI,gBAAiK,sJAAe,uBAAuB,QAAQ,iBAAsB,uBAAuB,QAAQ,iBAAkB,GAClS,EAAe,uBAAuB,EAAM,WAClD,IAAK,EAAc,OAAO,KAC1B,MAAM,EAAoB,EAAa,IAAI,SACrC,EAAgB,oBAAoB,EAAkB,2BAA6B,EAAkB,IAAI,cAAgB,GAC/H,GAA6B,iBAAlB,EACT,MAAM,EAER,OAAO,CACT,CAWA,SAAS,YAAY,GACnB,MAAM,EAAW,EAAK,IAAI,YAAY,QAAO,IAI3C,GAAI,EAAK,2BAA4B,CAEnC,OADmB,EAAK,IAAI,cACT,sBACrB,CACA,OAAO,CAAI,IAEb,GAAwB,IAApB,EAAS,OAAc,OAAO,EAClC,GAAI,EAAI,EAAS,OAAQ,OAAO,EAChC,MAAM,EAAQ,EAAS,GACvB,GAAI,EAAM,2BAA4B,CACpC,IAAI,EAAa,EAAM,IAAI,cAC3B,GAAI,EAAW,eAAgB,CAC7B,MAAM,EAAqB,kBAAkB,GAC7C,GAA2B,OAAvB,EAIF,OAAO,EAET,EAAa,CACf,CAKA,MAAkD,iBAApC,oBAAoB,EACpC,CACA,OAAO,CACT,CAUA,SAAS,oBAAoB,EAAM,EAAO,GACxC,MAAM,EAAiB,EAAK,IAAI,kBAC1B,EAAiB,EAAK,IAAI,kBAChC,IAAI,EAAgB,GAAG,IAEvB,MAAM,EAAU,EAAe,IAAI,QACnC,OAAgD,IAA5C,EAAe,IAAI,cAAc,QAAgB,EAAQ,mBAAqB,EAAO,2BAA2B,SAAS,EAAQ,KAAK,QAAU,YAAY,KAE9J,EAAgB,EAAQ,KAAK,KACD,OAAxB,EAAe,MAEV,IAAI,MAKR,IAAI,KAAiB,mCAAmC,EAAM,OAAY,IACnF,CASA,SAAS,mCAAmC,EAAM,GAChD,MAAM,EAAgC,IAAI,gBAAwO,gNAAO,uBAAuB,QAAQ,iBAAsB,uBAAuB,QAAQ,iBAAkB,GAC/X,IAAI,EAAW,EAAK,IAAI,YACpB,EAAS,GAIb,EAAW,EAAS,QAAO,KAChB,EAAM,aAA2C,KAA5B,EAAM,KAAK,MAAM,QAAiB,EAAM,KAAK,MAAM,SAAS,SAI5F,EAAW,EAAS,QAAO,IACzB,IAAK,EAAE,2BAA4B,OAAO,EAE1C,OADa,EAAE,IAAI,cACN,sBAAsB,IAIrC,IAAK,IAAK,EAAG,KAAU,EAAS,UAAW,CACzC,GAAI,EAAM,2BAA4B,CAEpC,MAAM,EAAa,EAAM,IAAI,cACvB,EAAa,oBAAoB,GACvC,GAAmB,OAAf,GAA6C,iBAAf,EAAyB,CAEzD,GAAU,EAAW,WACrB,QACF,CACA,GAAI,EAAW,qBAAsB,CAEnC,MAAM,EAAK,wBAAwB,GAC7B,EAAO,EAAG,OAAO,MACvB,IAAK,IAAS,EAAG,OAAO,KAGtB,MAAM,EAER,GAAU,KAAK,EAAK,OACpB,QACF,CACA,GAAI,EAAW,eAAgB,CAG7B,MAAM,EAAwB,kBAAkB,GAC1C,EAAa,oBAAoB,GACvC,GAAmB,OAAf,EAAqB,CAEvB,GAAU,EACV,QACF,CAAO,GAA8B,OAA1B,IAAkC,EAAsB,eAIjE,MAAM,EAFN,EAAQ,CAIZ,CACF,CACI,EAAM,YAER,GAEA,EAAM,KAAK,MAEV,QAAQ,oBAAqB,IAE7B,QAAQ,oBAAqB,IAE7B,QAAQ,mBAAoB,KAG3B,EAAM,iBAER,GAAU,oBAAoB,EAAO,EAAG,GAG5C,CACA,OAAO,CACT,CAYA,SAAS,sBAAsB,EAAM,EAAQ,EAAe,GAAI,GAAY,GAC1E,GAAI,sBAAsB,EAAM,UAAW,GAAe,MAAO,GACjE,IAAK,IAAc,iBAAiB,GAAO,MAAO,GAClD,MAAM,EAA6B,qCAAqC,GAClE,EAA4B,mCAAmC,EAAM,GACrE,EAAgB,2BAA2B,EAAM,GAIvD,OAHmC,OAA/B,EAAc,eAChB,EAAc,aAAe,GAExB,CAAC,CACN,IAAK,GAA8B,EACnC,gBACA,YAAa,CAAC,EAAK,MACnB,cAAe,sBAAsB,MAEzC,CASA,SAAS,4BAA4B,EAAM,EAAQ,EAAe,IAChE,OAAI,sBAAsB,EAAM,UAAW,GAAsB,GAC5D,qBAAqB,EAAO,MAAM,8BAA+B,EAAM,EAAK,IAAI,kBAAkB,IAAI,SACpG,sBAAsB,EAAM,EAAQ,GAAc,GADmE,EAE9H,CAUA,SAAS,cAAc,EAAM,GAC3B,MAAM,EAAS,EAAK,IAAI,UACxB,QAAK,EAAO,gBACL,EAAO,eAAe,SAAS,EAAO,KAAK,KACpD,CASA,SAAS,kBAAkB,GACzB,MAAM,EAAM,CACV,UAAU,EACV,UAAU,EACV,GAAI,KACJ,UAAW,KACX,aAAc,MAEhB,IAAK,EAAM,OAAO,EAGlB,MAAM,EAAiB,oBAAoB,GAC3C,GAA8B,iBAAnB,EACT,EAAI,aAAe,OACd,GAAI,EAAK,qBAAsB,CAEpC,EAAI,SAA0D,OAA/C,0BAA0B,EAAM,WAC/C,EAAI,SAAwD,OAA7C,0BAA0B,EAAM,SAC/C,MAAM,EAAS,0BAA0B,EAAM,MAC/C,GAAe,OAAX,GAAmB,EAAO,mBAAoB,CAChD,MACM,EAAe,oBADD,EAAO,IAAI,UAE/B,EAAI,GAAK,eAAe,EAC1B,CACA,MAAM,EAAmB,0BAA0B,EAAM,gBACzD,GAAyB,OAArB,GAA6B,EAAiB,mBAAoB,CACpE,MAAM,EAAwB,EAAiB,IAAI,SACnD,EAAI,aAAe,oBAAoB,EACzC,CACA,MAAM,EAAgB,0BAA0B,EAAM,aACtD,GAAsB,OAAlB,GAA0B,EAAc,mBAAoB,CAC9D,MAAM,EAAqB,EAAc,IAAI,SAC7C,EAAI,UAAY,oBAAoB,EACtC,CACF,CACA,OAAO,CACT,CASA,SAAS,aAAa,EAAM,GAC1B,MAAM,EAAO,EAAK,IAAI,aAChB,EAAgB,oBAAoB,EAAK,IACzC,EAAU,IACX,kBAAkB,EAAK,OACvB,oCAAoC,EAAM,IAEzC,EAAS,GACT,EAAO,MAAM,QAAQ,GAAiB,EAAgB,CAAC,GAC7D,IAAK,MAAM,KAAO,EAAM,CACtB,GAAmB,iBAAR,EACT,MAAM,IAAI,gBAA4I,qHAAG,uBAAuB,QAAQ,iBAAsB,uBAAuB,QAAQ,iBAAkB,GAEjQ,EAAO,KAAK,CACV,MACA,cAAe,EACf,YAAa,CAAC,EAAK,MACnB,cAAe,iBAAiB,MAEpC,CACA,OAAO,CACT,CAYA,SAAS,iBAAiB,EAAM,EAAQ,EAAe,GAAI,GAAY,GACrE,OAAI,sBAAsB,EAAM,UAAW,GAAsB,GAC5D,GAAc,cAAc,EAAM,GAChC,aAAa,EAAM,GAD6B,EAEzD,CAQA,SAAS,qBAAqB,GAE5B,OAAO,iBADQ,EAAK,IAAI,UACQ,gBAAiB,iBACnD,CASA,SAAS,0BAA0B,EAAM,EAAQ,EAAe,GAAI,GAAY,GAC9E,IAAK,IAAc,qBAAqB,GAAO,MAAO,GACtD,IAAI,EACJ,MAAM,EAAgB,sBAAsB,EAAM,YAAa,GAC/D,GAAI,EAEF,EAAK,EAAc,UACd,CAEL,MAAM,EAAoB,EAAK,IAAI,aAAa,GAChD,EAAK,eAAe,oBAAoB,GAC1C,CACA,MAAM,EAAa,EAAK,WACxB,IAAK,EAAW,uBAAwB,MAAO,GAC/C,MAAM,EAAK,EAAW,IAAI,MACpB,EAAe,uBAAuB,EAAI,EAAO,gBACvD,IAAK,EAAc,MAAO,GAC1B,MAAM,EAAW,EAAG,MAAM,SAAS,GACnC,IAAK,EAAU,MAAO,GACtB,IAAI,EAAY,KAChB,MACM,EAAU,eAAe,oBADP,EAAK,IAAI,aAAa,KAE1C,IACF,EAAY,EAAQ,WAAa,GAEnC,IAAI,EAAO,QACX,IAAK,MAAM,KAAa,EAAS,eAAgB,CAC/C,IAAI,EACmD,QAAlD,EAAwB,EAAU,kBAAkD,IAA1B,GAAoC,EAAsB,oBAAsB,EAAU,WAAW,IAAI,YAAc,IACpL,EAAO,IAAI,KAAS,iBAAiB,EAAU,WAAY,EAAQ,GAAc,GAAM,KAAI,IAAK,IAE3F,EACH,cAAe,IACV,EAAE,cACL,UAAW,EAAE,cAAc,WAAa,EACxC,GAAI,EAAE,cAAc,IAAM,QAIlC,CACA,OAAO,EAAK,KAAI,IAAK,IAChB,EACH,YAAa,CAAC,EAAK,QAAS,EAAE,aAC9B,cAAe,0BAA0B,QAE7C,CASA,SAAS,gCAAgC,EAAM,EAAQ,EAAe,IACpE,OAAI,sBAAsB,EAAM,UAAW,GAAsB,GAC5D,qBAAqB,EAAO,MAAM,oBAAqB,EAAM,EAAK,IAAI,WAGpE,0BAA0B,EAAM,EAAQ,GAAc,GAFpD,EAGX,CAUA,SAAS,oBAAoB,EAAM,GAEjC,OAAO,0BADQ,EAAK,IAAI,UACiB,EAAO,qBAAsB,YACxE,CASA,SAAS,yBAAyB,EAAM,EAAQ,EAAe,IAC7D,IAAK,oBAAoB,EAAM,GAAS,MAAO,GAC/C,IAAI,EACJ,MAAM,EAAgB,sBAAsB,EAAM,YAAa,GAC/D,GAAI,EAEF,EAAK,EAAc,UACd,CAEL,MAAM,EAAoB,EAAK,IAAI,aAAa,GAChD,EAAK,eAAe,oBAAoB,GAC1C,CACA,MAAM,EAAa,EAAK,WACxB,IAAK,EAAW,uBAAwB,MAAO,GAC/C,MAAM,EAAK,EAAW,IAAI,MAC1B,IAAK,EAAG,eAAgB,MAAO,GAC/B,MAAM,EAAW,EAAG,MAAM,SAAS,EAAG,KAAK,MAC3C,IAAK,EAAU,MAAO,GACtB,MACM,EAAY,eAAe,oBADP,EAAK,IAAI,aAAa,KAEhD,IAAI,EAAO,QACX,IAAK,MAAM,KAAa,EAAS,eAAgB,CAC/C,IAAI,EACmD,QAAlD,EAAwB,EAAU,kBAAkD,IAA1B,GAAoC,EAAsB,oBAAsB,EAAU,WAAW,IAAI,YAAc,IACpL,EAAO,IAAI,KAAS,iBAAiB,EAAU,WAAY,EAAQ,GAAc,GAAM,KAAI,IAAK,IAE3F,EACH,cAAe,IACV,EAAE,cACL,UAAW,EAAE,cAAc,WAAa,EACxC,GAAI,EAAE,cAAc,IAAM,QAIlC,CACA,OAAO,EAAK,KAAI,IAAK,IAChB,EACH,YAAa,CAAC,EAAK,QAAS,EAAE,aAC9B,cAAe,yBAAyB,QAE5C,CASA,SAAS,eAAe,EAAM,GAE5B,OAAO,0BADQ,EAAK,IAAI,UACiB,EAAO,qBAAsB,IACxE,CAYA,SAAS,uBAAuB,EAAM,EAAQ,EAAe,IAC3D,OAAI,sBAAsB,EAAM,UAAW,GAAsB,GAC5D,eAAe,EAAM,GACnB,iBAAiB,EAAM,EAAQ,GAAc,GAAM,KAAI,IAAK,IAC9D,EACH,YAAa,CAAC,EAAK,QAAS,EAAE,aAC9B,cAAe,uBAAuB,SAJE,EAM5C,CAOA,SAAS,wBAAwB,GAE/B,OAAO,iBADgB,EAAK,IAAI,kBACO,IAAI,QAAS,gBAAiB,cACvE,CAUA,SAAS,6BAA6B,EAAM,EAAQ,EAAe,IACjE,IAAK,wBAAwB,GAAO,MAAO,GAC3C,IAAI,EACJ,MAAM,EAAgB,sBAAsB,EAAM,YAAa,GAC/D,GAAI,EAEF,EAAK,EAAc,UACd,CAEL,MAAM,EAAS,uBAAuB,EAAM,MAC5C,GAAI,EAAQ,CACV,IAAI,EAAQ,EAAO,IAAI,SACnB,EAAM,6BAA4B,EAAQ,EAAM,IAAI,eACxD,EAAK,eAAe,oBAAoB,GAC1C,CACF,CAGA,MAAM,EAAsB,EAAK,IAAI,YAAY,QAAO,GAAK,EAAE,6BAA4B,GAC3F,IAAK,IAAwB,EAAoB,2BAA4B,MAAO,GACpF,MAAM,EAAa,EAAoB,IAAI,cAC3C,IAAK,EAAW,4BAA6B,MAAO,GACpD,MAAM,EAAS,EAAW,IAAI,UAAU,GACxC,IAAK,EAAQ,MAAO,GACpB,MAAM,EAAW,EAAO,MAAM,SAAY,EAC1C,IAAK,EAAU,MAAO,GACtB,IAAI,EAAO,QACX,IAAK,MAAM,KAAa,EAAS,eAAgB,CAC/C,IAAI,EACmD,QAAlD,EAAwB,EAAU,kBAAkD,IAA1B,GAAoC,EAAsB,oBAAsB,EAAU,WAAW,IAAI,YAAc,IACpL,EAAO,IAAI,KAAS,iBAAiB,EAAU,WAAY,EAAQ,GAAc,GAAM,KAAI,IAAK,IAE3F,EACH,cAAe,IACV,EAAE,cACL,GAAI,EAAE,cAAc,IAAM,QAIlC,CACA,OAAO,EAAK,KAAI,IAAK,IAChB,EACH,YAAa,CAAC,EAAK,QAAS,EAAE,aAC9B,cAAe,6BAA6B,QAEhD,CAQA,SAAS,mCAAmC,GAC1C,OAAO,EAAK,oBAAsB,iBAAiB,EAAK,IAAI,UAAW,gBAAiB,kBAC1F,CASA,SAAS,8CAA8C,GACrD,MAAM,EAAW,EAAK,YAAW,IAC/B,IAAK,EAAW,mBAAoB,OAAO,EAE3C,OAAO,mCADQ,EAAW,IAAI,UACmB,IAEnD,GAAiB,OAAb,EACF,OAAO,KAET,MAAM,EAAS,EAAS,IAAI,UAC5B,OAAI,MAAM,QAAQ,KAAY,EAAO,mBAA2B,KACzD,CACT,CAYA,SAAS,8CAA8C,GACrD,MAAM,EAAuB,CAAC,UAAW,OAAQ,aACjD,IAAI,EAAc,EAAK,WACnB,EAA0B,KAC9B,KAAwC,QAAhC,EAAe,SAA0C,IAAjB,GAA2B,EAAa,oBAAoB,CAC1G,IAAI,EACJ,GAAgC,OAA5B,EAAkC,CAEpC,EADa,EAAY,IAAI,aACE,KAAK,qCAAuC,IAC7E,CACA,IAAI,EAAS,EAAY,IAAI,UAC7B,GAAI,EAAO,qBAAsB,CAG/B,MAAM,EAAS,EAAO,IAAI,YACrB,MAAM,QAAQ,KACjB,EAAS,EAEb,CACA,GAAI,EAAO,gBAAkB,EAAqB,SAAS,EAAO,KAAK,MACrE,OAAO,EAET,EAAc,CAChB,CACA,OAAO,IACT,CAQA,SAAS,qCAAqC,GAC5C,IAAI,EAAqB,KACzB,MAAM,EAAQ,EAAK,IAAI,MACvB,IAAK,MAAM,QAAQ,IAAU,EAAM,eAEjC,EAAqB,OAChB,GAAI,EAAK,WAAW,uBAAwB,CAIjD,MAAM,EAAW,EAAK,WAAW,IAAI,OAChC,MAAM,QAAQ,IAAa,EAAS,iBACvC,EAAqB,EAEzB,CACA,IAAK,EAAoB,OAAO,KAChC,MAAM,EAAW,EAAK,WAAW,MAAM,SAAS,EAAmB,KAAK,MAKxE,IAAK,EAAU,OAAO,KAGtB,IAAK,MAAM,KAAW,EAAS,eAAgB,CAC7C,MAAM,EAAS,8CAA8C,IAAY,8CAA8C,GACvH,GAAe,OAAX,EACF,OAAO,CAEX,CACA,OAAO,IACT,CASA,SAAS,uCAAuC,GAC9C,MAAM,EAAQ,EAAK,IAAI,cACvB,IAAK,MAAM,KAAQ,EACjB,GAAI,EAAK,mBAAoB,CAC3B,MAAM,EAAM,EAAK,IAAI,OACrB,IAAK,MAAM,QAAQ,IAAQ,EAAI,gBAAoC,MAAlB,EAAI,KAAK,KACxD,OAAO,CAEX,CAEF,OAAO,IACT,CAQA,SAAS,SAAS,GAChB,IAAI,EACJ,QAAmD,QAAxC,EAAmB,EAAK,kBAA6C,IAArB,IAA+B,EAAiB,oBAAsB,IAAS,EAAK,WAAW,IAAI,UAChK,CAWA,SAAS,sCAAsC,GAC7C,IAAI,EACJ,MAAM,EAAc,QACd,EAAsD,QAA9C,EAAsB,EAAQ,kBAAgD,IAAxB,OAAiC,EAAS,EAAoB,IAAI,QACtI,QAAa,IAAT,GAAsB,MAAM,QAAQ,GAAO,MAAO,GACtD,MAAM,EAAQ,EAAK,MACnB,GAAI,EAAQ,kBAAmB,CAI7B,MAAM,EAAsB,uCAAuC,GACnE,GAA4B,OAAxB,EAA8B,MAAO,GACzC,MAAM,EAAW,EAAM,SAAS,EAAoB,KAAK,MACzD,EAAY,QAAQ,EAAS,eAC/B,MAAO,GAAI,EAAQ,eAAgB,CAIjC,MAAM,EAAa,EAAM,SAAS,EAAQ,KAAK,MAAM,eACrD,IAAK,MAAM,KAAa,EAAY,CAClC,IAAI,EACJ,GAAuD,QAAlD,EAAwB,EAAU,kBAAkD,IAA1B,GAAoC,EAAsB,qBAAsB,CAC7I,MAAM,EAAO,EAAU,WAAW,IAAI,aACjC,MAAM,QAAQ,IAAS,EAAK,gBAAqC,MAAnB,EAAK,KAAK,MAC3D,EAAY,KAAK,EAAU,WAE/B,CACF,CACF,CAIA,MAAM,EAAS,QACf,IAAK,MAAM,KAAS,EACd,SAAS,IACX,EAAO,KAAK,EAAM,YAGtB,OAAO,CACT,CAMA,SAAS,mCAAmC,GAC1C,MAAM,EAAS,QACT,EAAc,CAClB,cAAA,CAAe,GACb,IAAK,EAAK,WAAW,qBAAsB,OAC3C,MAAM,EAAe,EAAK,WAAW,IAAI,YACzC,IAAI,MAAM,QAAQ,IAAkB,EAAa,gBAClB,UAA3B,EAAa,KAAK,KAItB,GAAI,EAAK,WAAW,WAAW,qBAAsB,CAGnD,MAAM,EAAc,EAAK,WAAW,WAAW,IAAI,YACnD,GAAI,MAAM,QAAQ,KAAiB,EAAY,eAAgB,OAC/D,GAA8B,MAA1B,EAAY,KAAK,KAAc,OAInC,MAAM,EAAc,EAAK,WAAW,WACpC,GAAI,SAAS,GAEX,EAAO,KAAK,EAAY,iBACnB,GAAI,EAAY,WAAW,uBAAwB,CAGxD,MAAM,EAAK,EAAY,WAAW,IAAI,MACtC,IAAK,EAAG,eAAgB,OACxB,IAAK,MAAM,KAAa,EAAG,MAAM,SAAS,EAAG,KAAK,MAAM,eAClD,SAAS,IACX,EAAO,KAAK,EAAU,WAG5B,CACF,MAAO,GAAI,EAAK,WAAW,WAAW,uBAAwB,CAG5D,MAAM,EAAK,EAAK,WAAW,WAAW,IAAI,MAC1C,EAAO,QAAQ,sCAAsC,GACvD,CACF,GAGF,OADA,EAAK,SAAS,GACP,CACT,CAMA,SAAS,sCAAsC,GAC7C,MAAM,EAAa,EAAK,IAAI,UAAU,GACtC,YAAmB,IAAf,EAAiC,GAC9B,sCAAsC,EAC/C,CAYA,SAAS,0BAA0B,EAAM,EAAQ,EAAe,IAE9D,MAAM,EAAgC,qCAAqC,GAC3E,GAAsC,OAAlC,EAAwC,MAAO,GACnD,IAAI,EAQA,EANF,EADE,EAAK,qBACE,mCAAmC,GAEnC,sCAAsC,GAKjD,MAAM,EAAgB,sBAAsB,EAA+B,YAAa,GACxF,GAAI,EAEF,EAAK,EAAc,UACd,CAEL,MAAM,EAAoB,EAA8B,IAAI,aAAa,GACzE,EAAK,eAAe,oBAAoB,GAC1C,CACA,IAAI,EAAO,QACX,IAAK,MAAM,KAAS,EAClB,EAAO,IAAI,KAAS,iBAAiB,EAAO,EAAQ,GAAc,GAAM,KAAI,IAAK,IAE5E,EACH,cAAe,IACV,EAAE,cACL,GAAI,EAAE,cAAc,IAAM,QAIhC,OAAO,EAAK,KAAI,IAAK,IAChB,EACH,YAAa,CAAC,EAAK,QAAS,EAAE,aAC9B,cAAe,0BAA0B,QAE7C,CAKA,MAAM,sBAAwB,CAAC,4BAA4B,KAAM,sBAAsB,KAAM,gCAAgC,KAAM,0BAA0B,KAAM,yBAAyB,KAAM,6BAA6B,KAAM,0BAA0B,KAAM,uBAAuB,KAAM,iBAAiB,MACnT,IAAI,WAAa,CACf,wDACA,4CACA,oDACA,gEACA,kDACA,0DACA,oDACA,8CACA,mCAgBF,SAAS,kBAAkB,EAAK,GAC9B,IAAI,EAAW,EAAI,IACnB,MAAM,EAAY,EAAI,cAAc,UACpC,GAAI,EAAW,CAGb,EAAW,GAAG,IADO,EAAO,cAAgB,MACH,GAC3C,CACA,IAAI,EAAK,EAAI,cAAc,IAAM,EAAO,UACxC,GAAI,EAAO,YAAa,CACtB,MAAM,EAAiB,EAAS,QAAQ,EAAO,cACvB,IAApB,IACF,EAAK,EAAS,MAAM,EAAG,GACvB,EAAW,EAAS,MAAM,EAAiB,GAE/C,CACA,IAAI,EAAU,QACd,GAAI,EAAO,aAAc,CACvB,MAAM,EAAW,EAAS,MAAM,EAAO,cACvC,EAAU,IAAI,KAAY,EAAS,MAAM,EAAG,EAAS,OAAS,IAC9D,EAAW,EAAS,EAAS,OAAS,EACxC,CACA,MAAO,IACF,EACH,WACA,UACA,KACA,cAAc,EAElB,CAuBA,SAAS,mBAAmB,EAAc,EAAQ,GAChD,MAAM,EAAiB,kBAAkB,EAAc,IACjD,cACJ,EACA,SAAU,GACR,EACJ,IAAI,EAAO,CAAC,GACZ,IAA+B,IAA3B,EAAc,SAAoB,CAKpC,GADiB,MAAM,QAAQ,EAAc,UAAY,EAAc,SAAW,EAAO,iBACzE,KAAI,GACR,KAAN,EAAiB,EACd,IACF,EACH,SAAU,EAAM,EAAO,iBAAmB,EAC1C,cAAc,IAGpB,CACA,GAAI,EAAc,SAAU,CAC1B,MAAM,EAAO,mBAAmB,eAAe,CAC7C,gBAAiB,EAAO,gBACxB,kBAAmB,EAAO,wBAAqB,IAGjD,EAAK,OACL,MAAM,EAAqB,IAAI,MAAM,mBAAmB,OACxD,IAAI,EAQJ,MAAM,EAAa,EAAK,SAAS,eAAe,QAAQ,EAGxD,CACE,SAAS,IAEX,UAAmB,IAAf,GAA8B,aAAsB,KAAK,aAC3D,MAAM,EACD,CACL,MAAM,EAAqB,EAAW,kBAQtC,IAAK,EAAO,WAAW,EAAmB,QACxC,MAAM,EAER,EAAmB,EAAmB,gBACxC,CACA,MAAM,EAAiB,EAAiB,KAAI,GAAsB,IAAf,EAAI,OAAe,GAAK,EAAO,gBAAkB,IACpG,EAAO,EAAK,QAAO,CAAC,EAAa,IAAM,IAAI,KAAgB,EAAe,KAAI,IAAU,IACnF,EACH,SAAU,EAAE,SAAW,EAGvB,aAAc,EAAE,eAAiB,CAAC,GAAI,EAAO,gBAAkB,OAAO,SAAS,SAC3E,QACR,CACA,OAAO,CACT,CAYA,SAAS,iBAAiB,EAAM,EAAO,GACrC,MAAM,EAAW,EAAM,MAAQ,EAAM,KAAK,KAAK,UAAY,MACrD,EAAe,EAAM,eACrB,EAAU,IACd,MAAM,EAAc,EAAa,cAC3B,EAAU,QAChB,IAAK,MAAM,KAAmB,EAAmB,CAC/C,MAAM,EAAsB,EAAY,WAAU,GAAgB,EAAa,YAAY,MAAK,GAAiB,EAAgB,YAAY,SAAS,OACtJ,IAA6B,IAAzB,EAA4B,CAC9B,MAAM,EAAiB,EAAY,GAC7B,GAA0B,sBAAsB,WAAU,GAAK,IAAM,EAAe,gBAE1F,IADwB,sBAAsB,WAAU,GAAK,IAAM,EAAgB,iBAC7D,EAGpB,SAIF,EAAY,OAAO,EAAqB,EAC1C,CACA,EAAQ,KAAK,EACf,CACA,EAAY,QAAQ,EAAQ,EAE9B,IACE,OAAO,EAAS,EAClB,CAAE,MAAO,GACP,KAAM,aAAe,iBACnB,MAAM,EAER,MAAM,EAAa,EAAI,SAAS,KAAK,KAAO,EAAI,SAAS,KAAK,IAAI,MAAM,MAAQ,MAChF,QAAQ,KAAK,GAAG,oCAAoC,aAAyB,MAAe,EAAI,UAClG,CACF,CACA,MAAM,QAAU,CACd,cAAA,CAAe,EAAM,GACnB,MAAM,EAAe,KAAK,eAC1B,iBAAiB,EAAM,GAAO,IAC5B,EAAQ,WAAW,gCAAgC,EAAM,EAAa,OAAQ,EAAa,eAC3F,EAAQ,WAAW,0BAA0B,EAAM,EAAa,OAAQ,EAAa,eACrF,EAAQ,WAAW,yBAAyB,EAAM,EAAa,OAAQ,EAAa,eACpF,EAAQ,WAAW,uBAAuB,EAAM,EAAa,OAAQ,EAAa,eAClF,EAAQ,WAAW,iBAAiB,EAAM,EAAa,OAAQ,EAAa,cAAc,GAE9F,EACA,UAAA,CAAW,EAAM,GACf,MAAM,EAAe,KAAK,eAC1B,iBAAiB,EAAM,GAAO,IAC5B,EAAQ,WAAW,6BAA6B,EAAM,EAAa,OAAQ,EAAa,eACxF,EAAQ,WAAW,4BAA4B,EAAM,EAAa,OAAQ,EAAa,eACvF,EAAQ,WAAW,sBAAsB,EAAM,EAAa,OAAQ,EAAa,cAAc,GAEnG,EACA,gBAAA,CAAiB,EAAM,GACrB,MAAM,EAAe,KAAK,eAC1B,iBAAiB,EAAM,GAAO,IAC5B,EAAQ,0BAA0B,EAAM,EAAa,OAAQ,EAAa,cAAc,GAE5F,EACA,QAAA,CAAS,EAAM,GACb,MAAM,EAAe,KAAK,eAC1B,iBAAiB,EAAM,GAAO,IAC5B,EAAQ,0BAA0B,EAAM,EAAa,OAAQ,EAAa,cAAc,GAE5F,GAMI,eAAiB,sBACvB,SAAS,OAAQ,GAEf,OADA,EAAI,cAAc,GACX,CACL,GAAA,GACE,KAAK,eAAiB,CACpB,OAAQ,YAAY,KAAK,MACzB,cAAe,GACf,aAAc,GAElB,EACA,IAAA,GACE,MAAM,EAAe,KAAK,eAC1B,GAA0C,IAAtC,EAAa,cAAc,OAC/B,IAAK,MAAM,KAAU,EAAa,OAAO,QAAS,CAEhD,sBADoB,EAAa,cAAc,QAAO,CAAC,EAAa,IAAM,IAAI,KAAgB,mBAAmB,EAAG,EAAQ,EAAa,UAAU,SAChH,EAAQ,EAAa,OAAQ,eAClE,CACF,EACA,QAAS,CACP,OAAA,CAAQ,EAAM,GACZ,MACM,EAAO,EAAM,KAAK,KAGxB,GAAI,EAAK,MAAQ,EAAK,SAAU,CAC9B,MAAM,EAAe,oBAAoB,SAAS,EAAK,KAAM,EAAK,UAClE,GAAI,KAAK,eAAe,OAAO,SAAS,MAAK,GAAW,OAAO,GAAS,KAAiB,EANhE,MAAM,oBAAoB,KAAK,KAAK,oBAAoB,MAAM,QAOrF,MAEJ,CAIA,MAAM,EAAiB,MAAM,QAAQ,EAAK,WAAa,EAAK,UAAY,CAAC,EAAK,WAC9E,IAAK,MAAM,KAAiB,EACtB,sBAAsB,OAAO,KAC/B,KAAK,eAAe,aAAe,IAAI,KAAK,eAAe,gBAAiB,kBAAkB,EAAc,UAAY,MAG5H,EAAK,SAAS,QAAS,EACzB,GAGN,CAEA,QAAQ,QAAU","file":"/npm/babel-plugin-i18next-extract@1.1.0/index.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/babel-plugin-i18next-extract@1.1.0/index.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","'use strict';\n\nObject.defineProperty(exports, '__esModule', { value: true });\n\nvar nodePath = require('path');\nvar BabelTypes = require('@babel/types');\nvar fs = require('fs');\nvar deepmerge = require('deepmerge');\nvar stringify = require('json-stable-stringify');\nvar i18next = require('i18next');\n\nfunction _interopNamespaceDefault(e) {\n  var n = Object.create(null);\n  if (e) {\n    Object.keys(e).forEach(function (k) {\n      if (k !== 'default') {\n        var d = Object.getOwnPropertyDescriptor(e, k);\n        Object.defineProperty(n, k, d.get ? d : {\n          enumerable: true,\n          get: function () { return e[k]; }\n        });\n      }\n    });\n  }\n  n.default = e;\n  return Object.freeze(n);\n}\n\nvar nodePath__namespace = /*#__PURE__*/_interopNamespaceDefault(nodePath);\nvar BabelTypes__namespace = /*#__PURE__*/_interopNamespaceDefault(BabelTypes);\nvar i18next__namespace = /*#__PURE__*/_interopNamespaceDefault(i18next);\n\n/**\n * Comment Hint without line location information.\n */\n\n/**\n * Line intervals\n */\n\n/**\n * Comment Hint with line intervals information.\n */\n\nconst COMMENT_HINT_PREFIX = \"i18next-extract-\";\nconst COMMENT_HINTS_KEYWORDS = {\n  DISABLE: {\n    LINE: COMMENT_HINT_PREFIX + \"disable-line\",\n    NEXT_LINE: COMMENT_HINT_PREFIX + \"disable-next-line\",\n    SECTION_START: COMMENT_HINT_PREFIX + \"disable\",\n    SECTION_STOP: COMMENT_HINT_PREFIX + \"enable\"\n  },\n  NAMESPACE: {\n    LINE: COMMENT_HINT_PREFIX + \"mark-ns-line\",\n    NEXT_LINE: COMMENT_HINT_PREFIX + \"mark-ns-next-line\",\n    SECTION_START: COMMENT_HINT_PREFIX + \"mark-ns-start\",\n    SECTION_STOP: COMMENT_HINT_PREFIX + \"mark-ns-stop\"\n  },\n  CONTEXT: {\n    LINE: COMMENT_HINT_PREFIX + \"mark-context-line\",\n    NEXT_LINE: COMMENT_HINT_PREFIX + \"mark-context-next-line\",\n    SECTION_START: COMMENT_HINT_PREFIX + \"mark-context-start\",\n    SECTION_STOP: COMMENT_HINT_PREFIX + \"mark-context-stop\"\n  },\n  PLURAL: {\n    LINE: COMMENT_HINT_PREFIX + \"mark-plural-line\",\n    NEXT_LINE: COMMENT_HINT_PREFIX + \"mark-plural-next-line\",\n    SECTION_START: COMMENT_HINT_PREFIX + \"mark-plural-start\",\n    SECTION_STOP: COMMENT_HINT_PREFIX + \"mark-plural-stop\"\n  }\n};\n\n/**\n * Given a Babel Comment, extract BaseCommentHints.\n * @param comment babel comment\n * @yields Comment hint without line interval information.\n */\nfunction* extractCommentHintsFromBabelComment(comment) {\n  for (const line of comment.value.split(/\\r?\\n/)) {\n    const trimmedValue = line.trim();\n    const keyword = trimmedValue.split(/\\s+/)[0];\n    const value = trimmedValue.split(/\\s+(.+)/)[1] || \"\";\n    for (const [commentHintType, commentHintKeywords] of Object.entries(COMMENT_HINTS_KEYWORDS)) {\n      for (const [commentHintScope, commentHintKeyword] of Object.entries(commentHintKeywords)) {\n        if (keyword === commentHintKeyword) {\n          yield {\n            type: commentHintType,\n            scope: commentHintScope,\n            value,\n            comment\n          };\n        }\n      }\n    }\n  }\n}\n\n/**\n * Given an array of comment hints, compute their intervals.\n * @param commentHints comment hints without line intervals information.\n * @returns Comment hints with line interval information.\n */\nfunction computeCommentHintsIntervals(commentHints) {\n  const result = Array();\n  for (const commentHint of commentHints) {\n    if (!commentHint.comment.loc) continue;\n    if (commentHint.scope === \"LINE\") {\n      result.push({\n        startLine: commentHint.comment.loc.start.line,\n        stopLine: commentHint.comment.loc.start.line,\n        ...commentHint\n      });\n    }\n    if (commentHint.scope === \"NEXT_LINE\") {\n      result.push({\n        startLine: commentHint.comment.loc.end.line + 1,\n        stopLine: commentHint.comment.loc.end.line + 1,\n        ...commentHint\n      });\n    }\n    if (commentHint.scope === \"SECTION_START\") {\n      result.push({\n        startLine: commentHint.comment.loc.start.line,\n        stopLine: Infinity,\n        ...commentHint\n      });\n    }\n    if (commentHint.scope === \"SECTION_STOP\") {\n      for (const res of result) {\n        if (res.type === commentHint.type && res.scope === \"SECTION_START\" && res.stopLine === Infinity) {\n          res.stopLine = commentHint.comment.loc.start.line;\n        }\n      }\n    }\n  }\n  return result;\n}\n\n/**\n * Given Babel comments, extract the comment hints.\n * @param comments Babel comments (ordered by line)\n */\nfunction parseCommentHints(comments) {\n  const baseCommentHints = Array();\n  for (const comment of comments) {\n    baseCommentHints.push(...extractCommentHintsFromBabelComment(comment));\n  }\n  return computeCommentHintsIntervals(baseCommentHints);\n}\n\n/**\n * Find comment hint of a given type that applies to a Babel node path.\n * @param path babel node path\n * @param commentHintType Type of comment hint to look for.\n * @param commentHints All the comment hints, as returned by parseCommentHints function.\n */\nfunction getCommentHintForPath(path, commentHintType, commentHints) {\n  if (!path.node.loc) return null;\n  const nodeLine = path.node.loc.start.line;\n  for (const commentHint of commentHints) {\n    if (commentHint.type === commentHintType && commentHint.startLine <= nodeLine && nodeLine <= commentHint.stopLine) {\n      return commentHint;\n    }\n  }\n  return null;\n}\n\nfunction resolveIfRelative(path) {\n  if (path.startsWith(\".\")) {\n    return nodePath.resolve(path);\n  }\n  return path;\n}\nfunction coalesce(v, defaultVal) {\n  return v === undefined ? defaultVal : v;\n}\n\n/**\n * Given Babel options, return an initialized Config object.\n *\n * @param opts plugin options given by Babel\n */\nfunction parseConfig(opts) {\n  const defaultLocales = [\"en\"];\n  const customTransComponents = coalesce(opts.customTransComponents, []);\n  const customUseTranslationHooks = coalesce(opts.customUseTranslationHooks, []);\n  return {\n    locales: coalesce(opts.locales, defaultLocales),\n    defaultNS: coalesce(opts.defaultNS, \"translation\"),\n    pluralSeparator: coalesce(opts.pluralSeparator, \"_\"),\n    contextSeparator: coalesce(opts.contextSeparator, \"_\"),\n    keySeparator: coalesce(opts.keySeparator, \".\"),\n    nsSeparator: coalesce(opts.nsSeparator, \":\"),\n    // From react-i18next: https://github.com/i18next/react-i18next/blob/90f0e44ac2710ae422f1e8b0270de95fedc6429c/react-i18next.js#L334\n    transKeepBasicHtmlNodesFor: coalesce(opts.transKeepBasicHtmlNodesFor, [\"br\", \"strong\", \"i\", \"p\"]),\n    compatibilityJSON: coalesce(opts.compatibilityJSON, null),\n    i18nextInstanceNames: coalesce(opts.i18nextInstanceNames, [\"i18next\", \"i18n\"]),\n    tFunctionNames: coalesce(opts.tFunctionNames, [\"t\"]),\n    defaultContexts: coalesce(opts.defaultContexts, [\"\", \"male\", \"female\"]),\n    outputPath: typeof opts.outputPath === \"function\" ? opts.outputPath : coalesce(opts.outputPath, \"./extractedTranslations/{{locale}}/{{ns}}.json\"),\n    defaultValue: coalesce(opts.defaultValue, \"\"),\n    useI18nextDefaultValue: coalesce(opts.useI18nextDefaultValue, defaultLocales),\n    useI18nextDefaultValueForDerivedKeys: coalesce(opts.useI18nextDefaultValueForDerivedKeys, false),\n    keyAsDefaultValue: coalesce(opts.keyAsDefaultValue, false),\n    keyAsDefaultValueForDerivedKeys: coalesce(opts.keyAsDefaultValueForDerivedKeys, true),\n    discardOldKeys: coalesce(opts.discardOldKeys, false),\n    jsonSpace: coalesce(opts.jsonSpace, 2),\n    customTransComponents,\n    customUseTranslationHooks,\n    excludes: coalesce(opts.excludes, [\"^(../)*node_modules/\"]),\n    cache: {\n      absoluteCustomTransComponents: customTransComponents.map(([sourceModule, importName]) => [resolveIfRelative(sourceModule), importName]),\n      absoluteCustomHooks: customUseTranslationHooks.map(([sourceModule, importName]) => [resolveIfRelative(sourceModule), importName])\n    }\n  };\n}\n\nconst PLUGIN_NAME = \"babel-plugin-i18next-extract\";\n\n/**\n * Generic class thrown by exporters in case of error.\n */\nclass ExportError extends Error {}\n\n/**\n * Thrown by exporters when an existing value in a translation\n * file is incompatible with the value we're trying to set.\n *\n * For instance, if the translation file contains a deep key named `foo.bar`\n * but we extracted a (not deep) `foo` key, this error may be thrown.\n */\nclass ConflictError extends ExportError {}\n\n/**\n * Interface implented by exporters.\n */\n\n/**\n * JSONv* values can be any valid value for JSON file.\n *\n * See i18next's \"returnObjects\" option.\n */\n\n/**\n * Content of a JSONv* file.\n */\n\n/**\n * Check whether a JsonVxValue is a plain object.\n */\nfunction jsonVxValueIsObject(val) {\n  return typeof val === \"object\" && val !== null && !Array.isArray(val);\n}\n\n/**\n * Add a key recursively to a JSONv4 file.\n *\n * @param fileContent JSONv* file content\n * @param keyPath keyPath of the key to add\n * @param cleanKey key without path\n * @param value Value to set for the key.\n */\nfunction recursiveAddKey(fileContent, keyPath, cleanKey, value) {\n  if (keyPath.length === 0) {\n    return {\n      ...fileContent,\n      [cleanKey]: value\n    };\n  }\n  const currentKeyPath = keyPath[0];\n  let current = fileContent[currentKeyPath];\n  if (current === undefined) {\n    current = {};\n  } else if (!jsonVxValueIsObject(current)) {\n    throw new ConflictError();\n  }\n  return {\n    ...fileContent,\n    [currentKeyPath]: recursiveAddKey(current, keyPath.slice(1), cleanKey, value)\n  };\n}\nconst exporter = {\n  init: () => {\n    return {\n      whitespacesBefore: \"\",\n      whitespacesAfter: \"\\n\",\n      content: {}\n    };\n  },\n  parse: ({\n    content\n  }) => {\n    const whitespacesBeforeMatch = content.match(/^(\\s*)/);\n    const whitespacesAfterMatch = content.match(/(\\s*)$/);\n    return {\n      whitespacesBefore: whitespacesBeforeMatch === null ? \"\" : whitespacesBeforeMatch[0],\n      whitespacesAfter: whitespacesAfterMatch === null ? \"\" : whitespacesAfterMatch[0],\n      content: JSON.parse(content)\n    };\n  },\n  stringify: ({\n    config,\n    file\n  }) => {\n    return file.whitespacesBefore + stringify(file.content, {\n      space: config.jsonSpace\n    }) + file.whitespacesAfter;\n  },\n  getKey: ({\n    file,\n    keyPath,\n    cleanKey\n  }) => {\n    let current = file.content;\n    for (const p of keyPath) {\n      const val = current[p];\n      if (val === undefined) {\n        return undefined;\n      } else if (!jsonVxValueIsObject(val)) {\n        throw new ConflictError();\n      }\n      current = val;\n    }\n    return current[cleanKey];\n  },\n  addKey: params => {\n    const {\n      key,\n      file,\n      value\n    } = params;\n    return {\n      ...file,\n      content: recursiveAddKey(file.content, key.keyPath, key.cleanKey, value)\n    };\n  }\n};\n\n/**\n * An instance of exporter cache.\n *\n * See createExporterCache for details.\n */\n\n/**\n * This creates a new empty cache for the exporter.\n *\n * The cache is required by the exporter and is used to merge the translations\n * from the original translation file. It will be  mutated by the exporter\n * and the same instance must be given untouched across export calls.\n */\nfunction createExporterCache() {\n  return {\n    originalTranslationFiles: {},\n    currentTranslationFiles: {}\n  };\n}\n\n/**\n * Load a translation file.\n */\nfunction loadTranslationFile(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexporter, config, filePath) {\n  let content;\n  try {\n    content = fs.readFileSync(filePath, {\n      encoding: \"utf8\"\n    });\n  } catch (err) {\n    if (err !== null && typeof err == \"object\" && err.code === \"ENOENT\") return exporter.init({\n      config\n    });\n    throw err;\n  }\n  return exporter.parse({\n    config,\n    content\n  });\n}\n\n/**\n * Get the default value for a key.\n */\nfunction getDefaultValue(key, locale, config\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n) {\n  let defaultValue = config.defaultValue;\n  const keyAsDefaultValueEnabled = config.keyAsDefaultValue === true || Array.isArray(config.keyAsDefaultValue) && config.keyAsDefaultValue.includes(locale);\n  const keyAsDefaultValueForDerivedKeys = config.keyAsDefaultValueForDerivedKeys;\n  if (keyAsDefaultValueEnabled && (keyAsDefaultValueForDerivedKeys || !key.isDerivedKey)) {\n    defaultValue = key.cleanKey;\n  }\n  const useI18nextDefaultValueEnabled = config.useI18nextDefaultValue === true || Array.isArray(config.useI18nextDefaultValue) && config.useI18nextDefaultValue.includes(locale);\n  const useI18nextDefaultValueForDerivedKeys = config.useI18nextDefaultValueForDerivedKeys;\n  if (useI18nextDefaultValueEnabled && key.parsedOptions.defaultValue !== null && (useI18nextDefaultValueForDerivedKeys || !key.isDerivedKey)) {\n    defaultValue = key.parsedOptions.defaultValue;\n  }\n  return defaultValue;\n}\n\n/**\n * Exports all given translation keys as JSON.\n *\n * @param keys: translation keys to export\n * @param locale: the locale to export\n * @param config: plugin configuration\n * @param cache: cache instance to use (see createExporterCache)\n */\nfunction exportTranslationKeys(keys, locale, config, cache) {\n  const keysPerFilepath = {};\n  const exporter$1 = exporter;\n  for (const key of keys) {\n    // Figure out in which path each key should go.\n    const filePath = typeof config.outputPath === \"function\" ? config.outputPath(locale, key.ns) : config.outputPath.replace(\"{{locale}}\", locale).replace(\"{{ns}}\", key.ns);\n    keysPerFilepath[filePath] = [...(keysPerFilepath[filePath] || []), key];\n  }\n  for (const [filePath, keysForFilepath] of Object.entries(keysPerFilepath)) {\n    var _cache$originalTransl;\n    cache.originalTranslationFiles[filePath] = deepmerge((_cache$originalTransl = cache.originalTranslationFiles[filePath]) !== null && _cache$originalTransl !== void 0 ? _cache$originalTransl : {}, loadTranslationFile(exporter$1, config, filePath), {\n      // Overwrites the existing array values completely rather than concatenating them\n      arrayMerge: (dest, source) => source\n    });\n    const originalTranslationFile = cache.originalTranslationFiles[filePath];\n    let translationFile = cache.currentTranslationFiles[filePath] || (config.discardOldKeys ? exporter$1.init({\n      config\n    }) : originalTranslationFile);\n    for (const k of keysForFilepath) {\n      const previousValue = exporter$1.getKey({\n        config,\n        file: originalTranslationFile,\n        keyPath: k.keyPath,\n        cleanKey: k.cleanKey\n      });\n      translationFile = exporter$1.addKey({\n        config,\n        file: translationFile,\n        key: k,\n        value: previousValue === undefined ? getDefaultValue(k, locale, config) : previousValue\n      });\n    }\n    cache.currentTranslationFiles[filePath] = translationFile;\n\n    // Finally do the export\n    const directoryPath = nodePath.dirname(filePath);\n    fs.mkdirSync(directoryPath, {\n      recursive: true\n    });\n    fs.writeFileSync(filePath, exporter$1.stringify({\n      config,\n      file: translationFile\n    }), {\n      encoding: \"utf8\"\n    });\n  }\n}\n\n/**\n * Error thrown in case extraction of a node failed.\n */\nclass ExtractionError extends Error {\n  constructor(message, node) {\n    super(message);\n    this.nodePath = node;\n  }\n}\n\n/**\n * Given a value, if the value is an array, return the first\n * item of the array. Otherwise, return the value.\n *\n * This is mainly useful to parse namespaces which can be strings\n * as well as array of strings.\n */\nfunction getFirstOrNull(val) {\n  if (Array.isArray(val)) val = val[0];\n  return val === undefined ? null : val;\n}\n\n/**\n * Given comment hints and a path, infer every I18NextOption we can from the comment hints.\n * @param path path on which the comment hints should apply\n * @param commentHints parsed comment hints\n * @returns every parsed option that could be infered.\n */\nfunction parseI18NextOptionsFromCommentHints(path, commentHints) {\n  const nsCommentHint = getCommentHintForPath(path, \"NAMESPACE\", commentHints);\n  const contextCommentHint = getCommentHintForPath(path, \"CONTEXT\", commentHints);\n  const pluralCommentHint = getCommentHintForPath(path, \"PLURAL\", commentHints);\n  const res = {};\n  if (nsCommentHint !== null) {\n    res.ns = nsCommentHint.value;\n  }\n  if (contextCommentHint !== null) {\n    if ([\"\", \"enable\"].includes(contextCommentHint.value)) {\n      res.contexts = true;\n    } else if (contextCommentHint.value === \"disable\") {\n      res.contexts = false;\n    } else {\n      try {\n        const val = JSON.parse(contextCommentHint.value);\n        if (Array.isArray(val)) res.contexts = val;else res.contexts = [contextCommentHint.value];\n      } catch {\n        res.contexts = [contextCommentHint.value];\n      }\n    }\n  }\n  if (pluralCommentHint !== null) {\n    if (pluralCommentHint.value === \"disable\") {\n      res.hasCount = false;\n    } else {\n      res.hasCount = true;\n    }\n  }\n  return res;\n}\n\n/**\n * Improved version of BabelCore `referencesImport` function that also tries to detect wildcard\n * imports.\n */\nfunction referencesImport(nodePath, moduleSource, importName) {\n  if (nodePath.referencesImport(moduleSource, importName)) return true;\n  if (nodePath.isMemberExpression() || nodePath.isJSXMemberExpression()) {\n    const obj = nodePath.get(\"object\");\n    const prop = nodePath.get(\"property\");\n    if (Array.isArray(obj) || Array.isArray(prop) || !prop.isIdentifier() && !prop.isJSXIdentifier()) return false;\n    return obj.referencesImport(moduleSource, \"*\") && prop.node.name === importName;\n  }\n  return false;\n}\n\n/**\n * Whether a class-instance function call expression matches a known method\n * @param nodePath: node path to evaluate\n * @param parentNames: list for any class-instance names to match\n * @param childName specific function from parent module to match\n */\nfunction referencesChildIdentifier(nodePath, parentNames, childName) {\n  if (!nodePath.isMemberExpression()) return false;\n  const obj = nodePath.get(\"object\");\n  if (!obj.isIdentifier()) return false;\n  const prop = nodePath.get(\"property\");\n  if (Array.isArray(prop) || !prop.isIdentifier()) return false;\n  return parentNames.includes(obj.node.name) && prop.node.name === childName;\n}\n\n/**\n * Evaluates a node path if it can be evaluated with confidence.\n *\n * @param path: node path to evaluate\n * @returns null if the node path couldn't be evaluated\n */\nfunction evaluateIfConfident(\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\npath\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\n) {\n  if (!path || !path.node) {\n    return null;\n  }\n  const evaluation = path.evaluate();\n  if (evaluation.confident) {\n    return evaluation.value;\n  }\n  return null;\n}\n\n/**\n * Generator that iterates on all keys in an object expression.\n * @param path the node path of the object expression\n * @param key the key to find in the object expression.\n * @yields [evaluated key, node path of the object expression property]\n */\nfunction* iterateObjectExpression(path) {\n  const properties = path.get(\"properties\");\n  for (const prop of properties) {\n    const keyPath = prop.get(\"key\");\n    if (Array.isArray(keyPath)) continue;\n    let keyEvaluation = null;\n    if (keyPath.isLiteral()) {\n      keyEvaluation = evaluateIfConfident(keyPath);\n    } else if (keyPath.isIdentifier()) {\n      keyEvaluation = keyPath.node.name;\n    } else {\n      continue;\n    }\n    yield [keyEvaluation, prop];\n  }\n}\n\n/**\n * Try to find a key in an object expression.\n * @param path the node path of the object expression\n * @param key the key to find in the object expression.\n * @returns the corresponding node or null if it wasn't found\n */\nfunction findKeyInObjectExpression(path, key) {\n  for (const [keyEvaluation, prop] of iterateObjectExpression(path)) {\n    if (keyEvaluation === key) return prop;\n  }\n  return null;\n}\n\n/**\n * Find a JSX attribute given its name.\n * @param path path of the jsx attribute\n * @param name name of the attribute to look for\n * @return The JSX attribute corresponding to the given name, or null if no\n *   attribute with this name could be found.\n */\nfunction findJSXAttributeByName(path, name) {\n  const openingElement = path.get(\"openingElement\");\n  const attributes = openingElement.get(\"attributes\");\n  for (const attribute of attributes) {\n    if (!attribute.isJSXAttribute()) continue;\n    const attributeName = attribute.get(\"name\");\n    if (!attributeName.isJSXIdentifier()) continue;\n    if (name === attributeName.node.name) return attribute;\n  }\n  return null;\n}\n\n/**\n * Attempt to find the latest assigned value for a given identifier.\n *\n * For instance, given the following code:\n *   const foo = 'bar';\n *   console.log(foo);\n *\n * resolveIdentifier(fooNodePath) should return the 'bar' literal.\n *\n * Obviously, this will only work in quite simple cases.\n *\n * @param nodePath: node path to resolve\n * @return the resolved expression or null if it could not be resolved.\n */\nfunction resolveIdentifier(nodePath) {\n  const bindings = nodePath.scope.bindings[nodePath.node.name];\n  if (!bindings) return null;\n  const declarationExpressions = [...(bindings.path.isVariableDeclarator() ? [bindings.path.get(\"init\")] : []), ...bindings.constantViolations.filter(p => p.isAssignmentExpression()).map(p => p.get(\"right\"))];\n  if (declarationExpressions.length === 0) return null;\n  const latestDeclarator = declarationExpressions[declarationExpressions.length - 1];\n  if (Array.isArray(latestDeclarator)) return null;\n  if (!latestDeclarator.isExpression()) return null;\n  return latestDeclarator;\n}\n\n/**\n * Check whether a given node is a custom import.\n *\n * @param absoluteNodePaths: list of possible custom nodes, with their source\n *   modules and import names.\n * @param path: node path to check\n * @param name: node name to check\n * @returns true if the given node is a match.\n */\nfunction isCustomImportedNode(absoluteNodePaths, path, name) {\n  return absoluteNodePaths.some(([sourceModule, importName]) => {\n    if (nodePath.isAbsolute(sourceModule)) {\n      let relativeSourceModulePath = nodePath.relative(nodePath.dirname(path.state.filename), sourceModule);\n      if (!relativeSourceModulePath.startsWith(\".\")) {\n        relativeSourceModulePath = \".\" + nodePath.sep + relativeSourceModulePath;\n      }\n\n      // Absolute path to the source module, let's try a relative path first.\n      if (referencesImport(name, relativeSourceModulePath, importName)) {\n        return true;\n      }\n    }\n    return referencesImport(name, sourceModule, importName);\n  });\n}\n\n/**\n * Find the aliased t function name (after being destructured).\n * If the destructure `t` function is not aliased, will return the identifier name as it is.\n *\n * For instance, given the following code:\n *   const { t: tCommon } = useTranslation('common');\n *   return <p>{tCommon('key1')}<p>\n *\n *   // or with pluginOptions.tFunctionNames = [\"myT\"]\n *   const { myT: tCommon } = useTranslation('common');\n *   return <p>{tCommon('key1')}<p>\n *\n * getAliasedTBindingName(nodePath) should return 'tCommon' instead of t or myT\n *\n * @param nodePath: node path to resolve\n * @param tFunctionNames: possible names for the (unaliased) t function\n * @return the resolved t binding name, returning the alias if needed\n */\nfunction getAliasedTBindingName(path, tFunctionNames) {\n  const properties = path.get(\"properties\");\n  const propertiesArray = Array.isArray(properties) ? properties : [properties];\n  for (const property of propertiesArray) {\n    if (property.isObjectProperty()) {\n      const key = property.node.key;\n      const value = property.node.value;\n      if (key.type === \"Identifier\" && value.type === \"Identifier\" && tFunctionNames.includes(key.name)) {\n        return value.name;\n      }\n    }\n  }\n  return tFunctionNames.find(name => path.scope.bindings[name]);\n}\n\n/**\n * Check whether a given JSXElement is a Trans component.\n * @param path: node path to check\n * @returns true if the given element is indeed a `Trans` component.\n */\nfunction isTransComponent(path) {\n  const openingElement = path.get(\"openingElement\");\n  return referencesImport(openingElement.get(\"name\"), \"react-i18next\", \"Trans\");\n}\n\n/**\n * Given a Trans component, extract its options.\n * @param path The node path of the JSX Element of the trans component\n * @param commentHints Parsed comment hints.\n * @returns The parsed i18next options\n */\nfunction parseTransComponentOptions(path, commentHints) {\n  const res = {\n    contexts: false,\n    hasCount: false,\n    keyPrefix: null,\n    ns: null,\n    defaultValue: null\n  };\n  const countAttr = findJSXAttributeByName(path, \"count\");\n  res.hasCount = countAttr !== null;\n  const tOptionsAttr = findJSXAttributeByName(path, \"tOptions\");\n  if (tOptionsAttr) {\n    const value = tOptionsAttr.get(\"value\");\n    if (value.isJSXExpressionContainer()) {\n      const expression = value.get(\"expression\");\n      if (expression.isObjectExpression()) {\n        res.contexts = findKeyInObjectExpression(expression, \"context\") !== null;\n      }\n    }\n  }\n  const nsAttr = findJSXAttributeByName(path, \"ns\");\n  if (nsAttr) {\n    let value = nsAttr.get(\"value\");\n    if (value.isJSXExpressionContainer()) value = value.get(\"expression\");\n    res.ns = getFirstOrNull(evaluateIfConfident(value));\n  }\n  const defaultsAttr = findJSXAttributeByName(path, \"defaults\");\n  if (defaultsAttr) {\n    let value = defaultsAttr.get(\"value\");\n    if (value.isJSXExpressionContainer()) value = value.get(\"expression\");\n    res.defaultValue = evaluateIfConfident(value);\n  }\n  return {\n    ...res,\n    ...parseI18NextOptionsFromCommentHints(path, commentHints)\n  };\n}\n\n/**\n * Given the node path of a Trans component, try to extract its key from its\n *   attributes.\n * @param path node path of the Trans component.\n * @returns the component key if it was found.\n * @throws ExtractionError if the i18nKey attribute was present but not\n *   evaluable.\n */\nfunction parseTransComponentKeyFromAttributes(path) {\n  const error = new ExtractionError(`Couldn't evaluate i18next key in Trans component. You should either ` + `make the i18nKey attribute evaluable or skip the line using a skip ` + `comment (/* ${COMMENT_HINTS_KEYWORDS.DISABLE.LINE} */ or /* ` + `${COMMENT_HINTS_KEYWORDS.DISABLE.NEXT_LINE} */).`, path);\n  const keyAttribute = findJSXAttributeByName(path, \"i18nKey\");\n  if (!keyAttribute) return null;\n  const keyAttributeValue = keyAttribute.get(\"value\");\n  const keyEvaluation = evaluateIfConfident(keyAttributeValue.isJSXExpressionContainer() ? keyAttributeValue.get(\"expression\") : keyAttributeValue);\n  if (typeof keyEvaluation !== \"string\") {\n    throw error;\n  }\n  return keyEvaluation;\n}\n\n/**\n * Check if a JSX element has nested children or if it's a simple text node.\n *\n * Tries to mimic hasChildren function from React i18next:\n * see https://github.com/i18next/react-i18next/blob/8b6caf105/src/Trans.js#L6\n *\n * @param path node path of the JSX element to check\n * @returns whether the node has nested children\n */\nfunction hasChildren(path) {\n  const children = path.get(\"children\").filter(path => {\n    // Filter out empty JSX expression containers\n    // (they do not count, even if they contain comments)\n\n    if (path.isJSXExpressionContainer()) {\n      const expression = path.get(\"expression\");\n      return !expression.isJSXEmptyExpression();\n    }\n    return true;\n  });\n  if (children.length === 0) return false;\n  if (1 < children.length) return true;\n  const child = children[0];\n  if (child.isJSXExpressionContainer()) {\n    let expression = child.get(\"expression\");\n    if (expression.isIdentifier()) {\n      const resolvedExpression = resolveIdentifier(expression);\n      if (resolvedExpression === null) {\n        // We weren't able to resolve the identifier. We consider this as\n        // an absence of children, but it isn't very relevant anyways\n        // because the extraction is very likely to fail later on.\n        return false;\n      }\n      expression = resolvedExpression;\n    }\n\n    // If the expression is a string, we have an interpolation like {\"foo\"}\n    // The only other valid interpolation would be {{myVar}} but apparently,\n    // it is considered as a nested child.\n    return typeof evaluateIfConfident(expression) !== \"string\";\n  }\n  return false;\n}\n\n/**\n * Format the key of a JSX element.\n *\n * @param path node path of the JSX element to format.\n * @param index the current index of the node being parsed.\n * @param config plugin configuration.\n * @returns key corresponding to the JSX element.\n */\nfunction formatJSXElementKey(path, index, config) {\n  const openingElement = path.get(\"openingElement\");\n  const closingElement = path.get(\"closingElement\");\n  let resultTagName = `${index}`; // Tag name we will use in the exported file\n\n  const tagName = openingElement.get(\"name\");\n  if (openingElement.get(\"attributes\").length === 0 && tagName.isJSXIdentifier() && config.transKeepBasicHtmlNodesFor.includes(tagName.node.name) && !hasChildren(path)) {\n    // The tag name should not be transformed to an index\n    resultTagName = tagName.node.name;\n    if (closingElement.node === null) {\n      // opening tag without closing tag (e.g. <br />)\n      return `<${resultTagName}/>`;\n    }\n  }\n\n  // it's nested. let's recurse.\n  return `<${resultTagName}>${parseTransComponentKeyFromChildren(path, config)}</${resultTagName}>`;\n}\n\n/**\n * Given the node path of a Trans component, try to extract its key from its\n *   children.\n * @param path node path of the Trans component.\n * @returns the component key if it was found.\n * @throws ExtractionError if the extraction did not succeed.\n */\nfunction parseTransComponentKeyFromChildren(path, config) {\n  const transComponentExtractionError = new ExtractionError(`Couldn't evaluate i18next key in Trans component. You should either ` + `set the i18nKey attribute to an evaluable value, or make the Trans ` + `component content evaluable or skip the line using a skip comment ` + `(/* ${COMMENT_HINTS_KEYWORDS.DISABLE.LINE} */ or /* ` + `${COMMENT_HINTS_KEYWORDS.DISABLE.NEXT_LINE} */).`, path);\n  let children = path.get(\"children\");\n  let result = \"\";\n\n  // Filter out JSXText nodes that only consist of whitespaces with one or\n  // more linefeeds. Such node do not count for the indices.\n  children = children.filter(child => {\n    return !(child.isJSXText() && child.node.value.trim() === \"\" && child.node.value.includes(\"\\n\"));\n  });\n\n  // Filter out empty containers. They do not affect indices.\n  children = children.filter(p => {\n    if (!p.isJSXExpressionContainer()) return true;\n    const expr = p.get(\"expression\");\n    return !expr.isJSXEmptyExpression();\n  });\n\n  // We can then iterate on the children.\n  for (let [i, child] of children.entries()) {\n    if (child.isJSXExpressionContainer()) {\n      // We have an expression container: {…}\n      const expression = child.get(\"expression\");\n      const evaluation = evaluateIfConfident(expression);\n      if (evaluation !== null && typeof evaluation === \"string\") {\n        // We have an evaluable JSX expression like {'hello'}\n        result += evaluation.toString();\n        continue;\n      }\n      if (expression.isObjectExpression()) {\n        // We have an expression like {{name}} or {{name: userName}}\n        const it = iterateObjectExpression(expression);\n        const key0 = it.next().value;\n        if (!key0 || !it.next().done) {\n          // Probably got empty object expression like {{}}\n          // or {{foo,bar}}\n          throw transComponentExtractionError;\n        }\n        result += `{{${key0[0]}}}`;\n        continue;\n      }\n      if (expression.isIdentifier()) {\n        // We have an identifier like {myPartialComponent}\n        // We try to find the latest declaration and substitute the identifier.\n        const declarationExpression = resolveIdentifier(expression);\n        const evaluation = evaluateIfConfident(declarationExpression);\n        if (evaluation !== null) {\n          // It could be evaluated, it's probably something like 'hello'\n          result += evaluation;\n          continue;\n        } else if (declarationExpression !== null && declarationExpression.isJSXElement()) {\n          // It's a JSX element. Let's act as if it was inline and move along.\n          child = declarationExpression;\n        } else {\n          throw transComponentExtractionError;\n        }\n      }\n    }\n    if (child.isJSXText()) {\n      // Simple JSX text.\n      result +=\n      // Let's sanitize the value a bit.\n      child.node.value\n      // Strip line returns at start\n      .replace(/^\\s*(\\r?\\n)+\\s*/gm, \"\")\n      // Strip line returns at end\n      .replace(/\\s*(\\r?\\n)+\\s*$/gm, \"\")\n      // Replace other line returns with one space\n      .replace(/\\s*(\\r?\\n)+\\s*/gm, \" \");\n      continue;\n    }\n    if (child.isJSXElement()) {\n      // got a JSX element.\n      result += formatJSXElementKey(child, i, config);\n      continue;\n    }\n  }\n  return result;\n}\n\n/**\n * Parse `Trans` component to extract all its translation keys and i18next\n * options.\n *\n * @param path: node path of Trans JSX element.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n * @param skipCheck: set to true if you know that the JSXElement\n *   already is a Trans component.\n */\nfunction extractTransComponent(path, config, commentHints = [], skipCheck = false) {\n  if (getCommentHintForPath(path, \"DISABLE\", commentHints)) return [];\n  if (!skipCheck && !isTransComponent(path)) return [];\n  const keyEvaluationFromAttribute = parseTransComponentKeyFromAttributes(path);\n  const keyEvaluationFromChildren = parseTransComponentKeyFromChildren(path, config);\n  const parsedOptions = parseTransComponentOptions(path, commentHints);\n  if (parsedOptions.defaultValue === null) {\n    parsedOptions.defaultValue = keyEvaluationFromChildren;\n  }\n  return [{\n    key: keyEvaluationFromAttribute || keyEvaluationFromChildren,\n    parsedOptions,\n    sourceNodes: [path.node],\n    extractorName: extractTransComponent.name\n  }];\n}\n\n/**\n * Extract custom Trans components.\n *\n * @param path: node path of potential custom Trans JSX element.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n */\nfunction extractCustomTransComponent(path, config, commentHints = []) {\n  if (getCommentHintForPath(path, \"DISABLE\", commentHints)) return [];\n  if (!isCustomImportedNode(config.cache.absoluteCustomTransComponents, path, path.get(\"openingElement\").get(\"name\"))) return [];\n  return extractTransComponent(path, config, commentHints, true);\n}\n\n/**\n * Check whether a given CallExpression path is a global call to the `t`\n * function.\n *\n * @param path: node path to check\n * @param config: plugin configuration\n * @returns true if the given call expression is indeed a call to i18next.t.\n */\nfunction isSimpleTCall(path, config) {\n  const callee = path.get(\"callee\");\n  if (!callee.isIdentifier()) return false;\n  return config.tFunctionNames.includes(callee.node.name);\n}\n\n/**\n * Parse options of a `t(…)` call.\n * @param path: NodePath representing the second argument of the `t()` call\n *   (i.e. the i18next options)\n * @returns an object indicating whether the parsed options have context\n *   and/or count.\n */\nfunction parseTCallOptions(path) {\n  const res = {\n    contexts: false,\n    hasCount: false,\n    ns: null,\n    keyPrefix: null,\n    defaultValue: null\n  };\n  if (!path) return res;\n\n  // Try brutal evaluation of defaultValue first.\n  const optsEvaluation = evaluateIfConfident(path);\n  if (typeof optsEvaluation === \"string\") {\n    res.defaultValue = optsEvaluation;\n  } else if (path.isObjectExpression()) {\n    // It didn't work. Let's try to parse as object expression.\n    res.contexts = findKeyInObjectExpression(path, \"context\") !== null;\n    res.hasCount = findKeyInObjectExpression(path, \"count\") !== null;\n    const nsNode = findKeyInObjectExpression(path, \"ns\");\n    if (nsNode !== null && nsNode.isObjectProperty()) {\n      const nsValueNode = nsNode.get(\"value\");\n      const nsEvaluation = evaluateIfConfident(nsValueNode);\n      res.ns = getFirstOrNull(nsEvaluation);\n    }\n    const defaultValueNode = findKeyInObjectExpression(path, \"defaultValue\");\n    if (defaultValueNode !== null && defaultValueNode.isObjectProperty()) {\n      const defaultValueNodeValue = defaultValueNode.get(\"value\");\n      res.defaultValue = evaluateIfConfident(defaultValueNodeValue);\n    }\n    const keyPrefixNode = findKeyInObjectExpression(path, \"keyPrefix\");\n    if (keyPrefixNode !== null && keyPrefixNode.isObjectProperty()) {\n      const keyPrefixNodeValue = keyPrefixNode.get(\"value\");\n      res.keyPrefix = evaluateIfConfident(keyPrefixNodeValue);\n    }\n  }\n  return res;\n}\n\n/**\n * Given a call to the `t()` function, find the key and the options.\n *\n * @param path NodePath of the `t()` call.\n * @param commentHints parsed comment hints\n * @throws ExtractionError when the extraction failed for the `t` call.\n */\nfunction extractTCall(path, commentHints) {\n  const args = path.get(\"arguments\");\n  const keyEvaluation = evaluateIfConfident(args[0]);\n  const options = {\n    ...parseTCallOptions(args[1]),\n    ...parseI18NextOptionsFromCommentHints(path, commentHints)\n  };\n  const result = [];\n  const keys = Array.isArray(keyEvaluation) ? keyEvaluation : [keyEvaluation];\n  for (const key of keys) {\n    if (typeof key !== \"string\") {\n      throw new ExtractionError(`Couldn't evaluate i18next key. You should either make the key ` + `evaluable or skip the line using a skip comment (/* ` + `${COMMENT_HINTS_KEYWORDS.DISABLE.LINE} */ or /* ` + `${COMMENT_HINTS_KEYWORDS.DISABLE.NEXT_LINE} */).`, path);\n    }\n    result.push({\n      key,\n      parsedOptions: options,\n      sourceNodes: [path.node],\n      extractorName: extractTFunction.name\n    });\n  }\n  return result;\n}\n\n/**\n * Parse a call expression (likely a call to a `t` function) to find its\n * translation keys and i18next options.\n *\n * @param path: node path of the t function call.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n * @param skipCheck: set to true if you know that the call expression arguments\n *   already is a `t` function.\n */\nfunction extractTFunction(path, config, commentHints = [], skipCheck = false) {\n  if (getCommentHintForPath(path, \"DISABLE\", commentHints)) return [];\n  if (!skipCheck && !isSimpleTCall(path, config)) return [];\n  return extractTCall(path, commentHints);\n}\n\n/**\n * Check whether a given CallExpression path is a call to `useTranslation` hook.\n * @param path: node path to check\n * @returns true if the given call expression is indeed a call to\n *   `useTranslation`\n */\nfunction isUseTranslationHook(path) {\n  const callee = path.get(\"callee\");\n  return referencesImport(callee, \"react-i18next\", \"useTranslation\");\n}\n\n/**\n * Parse `useTranslation()` hook to extract all its translation keys and\n * options.\n * @param path: useTranslation call node path.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n */\nfunction extractUseTranslationHook(path, config, commentHints = [], skipCheck = false) {\n  if (!skipCheck && !isUseTranslationHook(path)) return [];\n  let ns;\n  const nsCommentHint = getCommentHintForPath(path, \"NAMESPACE\", commentHints);\n  if (nsCommentHint) {\n    // We got a comment hint, take its value as namespace.\n    ns = nsCommentHint.value;\n  } else {\n    // Otherwise, try to get namespace from arguments.\n    const namespaceArgument = path.get(\"arguments\")[0];\n    ns = getFirstOrNull(evaluateIfConfident(namespaceArgument));\n  }\n  const parentPath = path.parentPath;\n  if (!parentPath.isVariableDeclarator()) return [];\n  const id = parentPath.get(\"id\");\n  const tBindingName = getAliasedTBindingName(id, config.tFunctionNames);\n  if (!tBindingName) return [];\n  const tBinding = id.scope.bindings[tBindingName];\n  if (!tBinding) return [];\n  let keyPrefix = null;\n  const optionsArgument = path.get(\"arguments\")[1];\n  const options = getFirstOrNull(evaluateIfConfident(optionsArgument));\n  if (options) {\n    keyPrefix = options.keyPrefix || keyPrefix;\n  }\n  let keys = Array();\n  for (const reference of tBinding.referencePaths) {\n    var _reference$parentPath;\n    if ((_reference$parentPath = reference.parentPath) !== null && _reference$parentPath !== void 0 && _reference$parentPath.isCallExpression() && reference.parentPath.get(\"callee\") === reference) {\n      keys = [...keys, ...extractTFunction(reference.parentPath, config, commentHints, true).map(k => ({\n        // Add namespace if it was not explicitely set in t() call.\n        ...k,\n        parsedOptions: {\n          ...k.parsedOptions,\n          keyPrefix: k.parsedOptions.keyPrefix || keyPrefix,\n          ns: k.parsedOptions.ns || ns\n        }\n      }))];\n    }\n  }\n  return keys.map(k => ({\n    ...k,\n    sourceNodes: [path.node, ...k.sourceNodes],\n    extractorName: extractUseTranslationHook.name\n  }));\n}\n\n/**\n * Extract custom useTranslation hooks.\n *\n * @param path: node path of potential custom useTranslation hook calls.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n */\nfunction extractCustomUseTranslationHook(path, config, commentHints = []) {\n  if (getCommentHintForPath(path, \"DISABLE\", commentHints)) return [];\n  if (!isCustomImportedNode(config.cache.absoluteCustomHooks, path, path.get(\"callee\"))) {\n    return [];\n  }\n  return extractUseTranslationHook(path, config, commentHints, true);\n}\n\n/**\n * Check whether a given CallExpression path is a call to `getFixedT()`\n *    function.\n * @param path: node path to check\n * @param config: plugin configuration\n * @returns true if the given call expression is indeed a call to\n *   `getFixedT`\n */\nfunction isGetFixedTFunction(path, config) {\n  const callee = path.get(\"callee\");\n  return referencesChildIdentifier(callee, config.i18nextInstanceNames, \"getFixedT\");\n}\n\n/**\n * Parse `getFixedT()` getter to extract all its translation keys and\n * options (see https://www.i18next.com/overview/api#getfixedt)\n * @param path: useTranslation call node path.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n */\nfunction extractGetFixedTFunction(path, config, commentHints = []) {\n  if (!isGetFixedTFunction(path, config)) return [];\n  let ns;\n  const nsCommentHint = getCommentHintForPath(path, \"NAMESPACE\", commentHints);\n  if (nsCommentHint) {\n    // We got a comment hint, take its value as namespace.\n    ns = nsCommentHint.value;\n  } else {\n    // Otherwise, try to get namespace from arguments.\n    const namespaceArgument = path.get(\"arguments\")[1];\n    ns = getFirstOrNull(evaluateIfConfident(namespaceArgument));\n  }\n  const parentPath = path.parentPath;\n  if (!parentPath.isVariableDeclarator()) return [];\n  const id = parentPath.get(\"id\");\n  if (!id.isIdentifier()) return [];\n  const tBinding = id.scope.bindings[id.node.name];\n  if (!tBinding) return [];\n  const keyPrefixArgument = path.get(\"arguments\")[2];\n  const keyPrefix = getFirstOrNull(evaluateIfConfident(keyPrefixArgument));\n  let keys = Array();\n  for (const reference of tBinding.referencePaths) {\n    var _reference$parentPath;\n    if ((_reference$parentPath = reference.parentPath) !== null && _reference$parentPath !== void 0 && _reference$parentPath.isCallExpression() && reference.parentPath.get(\"callee\") === reference) {\n      keys = [...keys, ...extractTFunction(reference.parentPath, config, commentHints, true).map(k => ({\n        // Add namespace if it was not explicitely set in t() call.\n        ...k,\n        parsedOptions: {\n          ...k.parsedOptions,\n          keyPrefix: k.parsedOptions.keyPrefix || keyPrefix,\n          ns: k.parsedOptions.ns || ns\n        }\n      }))];\n    }\n  }\n  return keys.map(k => ({\n    ...k,\n    sourceNodes: [path.node, ...k.sourceNodes],\n    extractorName: extractGetFixedTFunction.name\n  }));\n}\n\n/**\n * Check whether a given CallExpression path is a global call to `i18next.t`\n * function.\n * @param path: node path to check\n * @param config: plugin configuration\n * @returns true if the given call expression is indeed a call to i18next.t.\n */\nfunction isI18nextTCall(path, config) {\n  const callee = path.get(\"callee\");\n  return referencesChildIdentifier(callee, config.i18nextInstanceNames, \"t\");\n}\n\n/**\n * Parse a call expression (likely `i18next.t`) to find its translation keys\n * and i18next options.\n *\n * @param path: node path of the t function call.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n * @param skipCheck: set to true if you know that the call expression arguments\n *   already is a `t` function.\n */\nfunction extractI18nextInstance(path, config, commentHints = []) {\n  if (getCommentHintForPath(path, \"DISABLE\", commentHints)) return [];\n  if (!isI18nextTCall(path, config)) return [];\n  return extractTFunction(path, config, commentHints, true).map(k => ({\n    ...k,\n    sourceNodes: [path.node, ...k.sourceNodes],\n    extractorName: extractI18nextInstance.name\n  }));\n}\n\n/**\n * Check whether a given JSXElement is a Translation render prop.\n * @param path: node path to check\n * @returns true if the given element is indeed a `Translation` render prop.\n */\nfunction isTranslationRenderProp(path) {\n  const openingElement = path.get(\"openingElement\");\n  return referencesImport(openingElement.get(\"name\"), \"react-i18next\", \"Translation\");\n}\n\n/**\n * Parse `Translation` render prop to extract all its translation keys and\n * options.\n *\n * @param path: node path of Translation JSX element.\n * @param config: plugin configuration\n * @param commentHints: parsed comment hints\n */\nfunction extractTranslationRenderProp(path, config, commentHints = []) {\n  if (!isTranslationRenderProp(path)) return [];\n  let ns;\n  const nsCommentHint = getCommentHintForPath(path, \"NAMESPACE\", commentHints);\n  if (nsCommentHint) {\n    // We got a comment hint, take its value as namespace.\n    ns = nsCommentHint.value;\n  } else {\n    // Try to parse ns property\n    const nsAttr = findJSXAttributeByName(path, \"ns\");\n    if (nsAttr) {\n      let value = nsAttr.get(\"value\");\n      if (value.isJSXExpressionContainer()) value = value.get(\"expression\");\n      ns = getFirstOrNull(evaluateIfConfident(value));\n    }\n  }\n\n  // We expect at least \"<Translation>{(t) => …}</Translation>\n  const expressionContainer = path.get(\"children\").filter(p => p.isJSXExpressionContainer())[0];\n  if (!expressionContainer || !expressionContainer.isJSXExpressionContainer()) return [];\n  const expression = expressionContainer.get(\"expression\");\n  if (!expression.isArrowFunctionExpression()) return [];\n  const tParam = expression.get(\"params\")[0];\n  if (!tParam) return [];\n  const tBinding = tParam.scope.bindings[\"t\"];\n  if (!tBinding) return [];\n  let keys = Array();\n  for (const reference of tBinding.referencePaths) {\n    var _reference$parentPath;\n    if ((_reference$parentPath = reference.parentPath) !== null && _reference$parentPath !== void 0 && _reference$parentPath.isCallExpression() && reference.parentPath.get(\"callee\") === reference) {\n      keys = [...keys, ...extractTFunction(reference.parentPath, config, commentHints, true).map(k => ({\n        // Add namespace if it was not explicitely set in t() call.\n        ...k,\n        parsedOptions: {\n          ...k.parsedOptions,\n          ns: k.parsedOptions.ns || ns\n        }\n      }))];\n    }\n  }\n  return keys.map(k => ({\n    ...k,\n    sourceNodes: [path.node, ...k.sourceNodes],\n    extractorName: extractTranslationRenderProp.name\n  }));\n}\n\n/**\n * Check whether a given node is a withTranslation call expression.\n *\n * @param path Node path to check\n * @returns true if the given node is an HOC call expression.\n */\nfunction isWithTranslationHOCCallExpression(path) {\n  return path.isCallExpression() && referencesImport(path.get(\"callee\"), \"react-i18next\", \"withTranslation\");\n}\n\n/**\n * If the given node is wrapped in a withTranslation call expression,\n * then return the call expression.\n *\n * @param path node path that is suspected to be part of a withTranslation call expression.\n * @returns withTranslation call expression if found, else null\n */\nfunction findWithTranslationHOCCallExpressionInParents(path) {\n  const callExpr = path.findParent(parentPath => {\n    if (!parentPath.isCallExpression()) return false;\n    const callee = parentPath.get(\"callee\");\n    return isWithTranslationHOCCallExpression(callee);\n  });\n  if (callExpr === null) {\n    return null;\n  }\n  const callee = callExpr.get(\"callee\");\n  if (Array.isArray(callee) || !callee.isCallExpression()) return null;\n  return callee;\n}\n\n/**\n * Just like findWithTranslationHOCCallExpressionInParents, finds a withTranslation call\n * expression, but expects the callExpression to be curried in a \"compose\" function.\n *\n * e.g. compose(connect(), withTranslation())(MyComponent)\n *\n * @param path node path that is suspected to be part of a composed withTranslation call\n *   expression.\n * @returns withTranslation call expression if found, else null\n */\nfunction findWithTranslationHOCCallExpressionInCompose(path) {\n  const composeFunctionNames = [\"compose\", \"flow\", \"flowRight\"];\n  let currentPath = path.parentPath;\n  let withTranslationCallExpr = null;\n  while ((_currentPath = currentPath) !== null && _currentPath !== void 0 && _currentPath.isCallExpression()) {\n    var _currentPath;\n    if (withTranslationCallExpr === null) {\n      const args = currentPath.get(\"arguments\");\n      withTranslationCallExpr = args.find(isWithTranslationHOCCallExpression) || null;\n    }\n    let callee = currentPath.get(\"callee\");\n    if (callee.isMemberExpression()) {\n      // If we have a member expression, we take the right operand\n      // e.g. _.compose\n      const result = callee.get(\"property\");\n      if (!Array.isArray(result)) {\n        callee = result;\n      }\n    }\n    if (callee.isIdentifier() && composeFunctionNames.includes(callee.node.name)) {\n      return withTranslationCallExpr;\n    }\n    currentPath = callee;\n  }\n  return null;\n}\n\n/**\n * Find whether a given function or class is wrapped with \"withTranslation\" HOC\n * somewhere.\n * @param path Function or class declaration node path.\n * @returns \"withTranslation()()\" call expression if found. Else null.\n */\nfunction findWithTranslationHOCCallExpression(path) {\n  let functionIdentifier = null;\n  const ownId = path.get(\"id\");\n  if (!Array.isArray(ownId) && ownId.isIdentifier()) {\n    // Normal function declaration, like: \"function MyComponent(…)\"\n    functionIdentifier = ownId;\n  } else if (path.parentPath.isVariableDeclarator()) {\n    // Maybe a variable declaration, like:\n    //   const MyComponent = (…) => …\n    //   or const MyComponent = function(…) …\n    const parentId = path.parentPath.get(\"id\");\n    if (!Array.isArray(parentId) && parentId.isIdentifier()) {\n      functionIdentifier = parentId;\n    }\n  }\n  if (!functionIdentifier) return null;\n  const bindings = path.parentPath.scope.bindings[functionIdentifier.node.name];\n\n  // Likely an anonymous function not in a normal scope.\n  // e.g. \"['foo', function myFunction() { return 'foo'; }]\"\n  // Let's just ignore such case.\n  if (!bindings) return null;\n\n  // Try to find a withTranslation() call in parent scope\n  for (const refPath of bindings.referencePaths) {\n    const callee = findWithTranslationHOCCallExpressionInParents(refPath) || findWithTranslationHOCCallExpressionInCompose(refPath);\n    if (callee !== null) {\n      return callee;\n    }\n  }\n  return null;\n}\n\n/**\n * Try to find \"t\" in an object spread. Useful when looking for the \"t\" key\n * in a spread object. e.g. const {t} = props;\n *\n * @param path object pattern\n * @returns t identifier or null of it was not found in the object pattern.\n */\nfunction findTFunctionIdentifierInObjectPattern(path) {\n  const props = path.get(\"properties\");\n  for (const prop of props) {\n    if (prop.isObjectProperty()) {\n      const key = prop.get(\"key\");\n      if (!Array.isArray(key) && key.isIdentifier() && key.node.name === \"t\") {\n        return key;\n      }\n    }\n  }\n  return null;\n}\n\n/**\n * Check whether a node path is the callee of a call expression.\n *\n * @param path the node to check.\n * @returns true if the path is the callee of a call expression.\n */\nfunction isCallee(path) {\n  var _path$parentPath;\n  return !!((_path$parentPath = path.parentPath) !== null && _path$parentPath !== void 0 && _path$parentPath.isCallExpression() && path === path.parentPath.get(\"callee\"));\n}\n\n/**\n * Find T function calls from a props assignment. Prop assignment can occur\n * in function parameters (i.e. \"function Component(props)\" or\n * \"function Component({t})\") or in a variable declarator (i.e.\n * \"const props = …\" or \"const {t} = props\").\n *\n * @param propsId identifier for the prop assignment. e.g. \"props\" or \"{t}\"\n * @returns Call expressions to t function.\n */\nfunction findTFunctionCallsFromPropsAssignment(propsId) {\n  var _propsId$parentPath;\n  const tReferences = Array();\n  const body = (_propsId$parentPath = propsId.parentPath) === null || _propsId$parentPath === void 0 ? void 0 : _propsId$parentPath.get(\"body\");\n  if (body === undefined || Array.isArray(body)) return [];\n  const scope = body.scope;\n  if (propsId.isObjectPattern()) {\n    // got \"function MyComponent({t, other, props})\"\n    // or \"const {t, other, props} = this.props\"\n    // we want to find references to \"t\"\n    const tFunctionIdentifier = findTFunctionIdentifierInObjectPattern(propsId);\n    if (tFunctionIdentifier === null) return [];\n    const tBinding = scope.bindings[tFunctionIdentifier.node.name];\n    tReferences.push(...tBinding.referencePaths);\n  } else if (propsId.isIdentifier()) {\n    // got \"function MyComponent(props)\"\n    // or \"const props = this.props\"\n    // we want to find references to props.t\n    const references = scope.bindings[propsId.node.name].referencePaths;\n    for (const reference of references) {\n      var _reference$parentPath;\n      if ((_reference$parentPath = reference.parentPath) !== null && _reference$parentPath !== void 0 && _reference$parentPath.isMemberExpression()) {\n        const prop = reference.parentPath.get(\"property\");\n        if (!Array.isArray(prop) && prop.isIdentifier() && prop.node.name === \"t\") {\n          tReferences.push(reference.parentPath);\n        }\n      }\n    }\n  }\n\n  // We have candidates. Let's see if t references are actual calls to the t\n  // function\n  const tCalls = Array();\n  for (const tCall of tReferences) {\n    if (isCallee(tCall)) {\n      tCalls.push(tCall.parentPath);\n    }\n  }\n  return tCalls;\n}\n\n/**\n * Find all t function calls in a class component.\n * @param path node path to the class component.\n */\nfunction findTFunctionCallsInClassComponent(path) {\n  const result = Array();\n  const thisVisitor = {\n    ThisExpression(path) {\n      if (!path.parentPath.isMemberExpression()) return;\n      const propProperty = path.parentPath.get(\"property\");\n      if (Array.isArray(propProperty) || !propProperty.isIdentifier()) return;\n      if (propProperty.node.name !== \"props\") return;\n\n      // Ok, this is interesting, we have something with \"this.props\"\n\n      if (path.parentPath.parentPath.isMemberExpression()) {\n        // We have something in the form \"this.props.xxxx\".\n\n        const tIdentifier = path.parentPath.parentPath.get(\"property\");\n        if (Array.isArray(tIdentifier) || !tIdentifier.isIdentifier()) return;\n        if (tIdentifier.node.name !== \"t\") return;\n\n        // We have something in the form \"this.props.t\". Let's see if it's an\n        // actual function call or an assignment.\n        const tExpression = path.parentPath.parentPath;\n        if (isCallee(tExpression)) {\n          // Simple case. Direct call to \"this.props.t()\"\n          result.push(tExpression.parentPath);\n        } else if (tExpression.parentPath.isVariableDeclarator()) {\n          // Hard case. const t = this.props.t;\n          // Let's loop through all references to t.\n          const id = tExpression.parentPath.get(\"id\");\n          if (!id.isIdentifier()) return;\n          for (const reference of id.scope.bindings[id.node.name].referencePaths) {\n            if (isCallee(reference)) {\n              result.push(reference.parentPath);\n            }\n          }\n        }\n      } else if (path.parentPath.parentPath.isVariableDeclarator()) {\n        // We have something in the form \"const props = this.props\"\n        // Or \"const {t} = this.props\"\n        const id = path.parentPath.parentPath.get(\"id\");\n        result.push(...findTFunctionCallsFromPropsAssignment(id));\n      }\n    }\n  };\n  path.traverse(thisVisitor);\n  return result;\n}\n\n/**\n * Find t function calls in a function component.\n * @param path node path to the function component.\n */\nfunction findTFunctionCallsInFunctionComponent(path) {\n  const propsParam = path.get(\"params\")[0];\n  if (propsParam === undefined) return [];\n  return findTFunctionCallsFromPropsAssignment(propsParam);\n}\n\n/**\n * Parse function or class declaration (likely components) to find whether\n * they are wrapped with \"withTranslation()\" HOC, and if so, extract all the\n * translations that come from the \"t\" function injected in the component\n * properties.\n *\n * @param path node path to the component\n * @param config plugin configuration\n * @param commentHints parsed comment hints\n */\nfunction extractWithTranslationHOC(path, config, commentHints = []) {\n  // Detect if this component is wrapped with withTranslation() somewhere\n  const withTranslationCallExpression = findWithTranslationHOCCallExpression(path);\n  if (withTranslationCallExpression === null) return [];\n  let tCalls;\n  if (path.isClassDeclaration()) {\n    tCalls = findTFunctionCallsInClassComponent(path);\n  } else {\n    tCalls = findTFunctionCallsInFunctionComponent(path);\n  }\n\n  // Extract namespace\n  let ns;\n  const nsCommentHint = getCommentHintForPath(withTranslationCallExpression, \"NAMESPACE\", commentHints);\n  if (nsCommentHint) {\n    // We got a comment hint, take its value as namespace.\n    ns = nsCommentHint.value;\n  } else {\n    // Otherwise, try to get namespace from arguments.\n    const namespaceArgument = withTranslationCallExpression.get(\"arguments\")[0];\n    ns = getFirstOrNull(evaluateIfConfident(namespaceArgument));\n  }\n  let keys = Array();\n  for (const tCall of tCalls) {\n    keys = [...keys, ...extractTFunction(tCall, config, commentHints, true).map(k => ({\n      // Add namespace if it was not explicitely set in t() call.\n      ...k,\n      parsedOptions: {\n        ...k.parsedOptions,\n        ns: k.parsedOptions.ns || ns\n      }\n    }))];\n  }\n  return keys.map(k => ({\n    ...k,\n    sourceNodes: [path.node, ...k.sourceNodes],\n    extractorName: extractWithTranslationHOC.name\n  }));\n}\n\n/**\n * All extractors sorted by priority.\n */\nconst EXTRACTORS_PRIORITIES = [extractCustomTransComponent.name, extractTransComponent.name, extractCustomUseTranslationHook.name, extractUseTranslationHook.name, extractGetFixedTFunction.name, extractTranslationRenderProp.name, extractWithTranslationHOC.name, extractI18nextInstance.name, extractTFunction.name];\nvar Extractors = {\n  extractCustomTransComponent,\n  extractTransComponent,\n  extractUseTranslationHook,\n  extractCustomUseTranslationHook,\n  extractGetFixedTFunction,\n  extractTranslationRenderProp,\n  extractWithTranslationHOC,\n  extractI18nextInstance,\n  extractTFunction\n};\n\n/**\n * Key as extracted by an extractor.\n */\n\n/**\n * Extracted key with enriched information.\n */\n\n/**\n * Parse namespace and key path from an extracted key.\n * @param key: key to parse\n * @param config: plugin configuration\n */\nfunction parseExtractedKey(key, config) {\n  let cleanKey = key.key;\n  const keyPrefix = key.parsedOptions.keyPrefix;\n  if (keyPrefix) {\n    // Imitate behavior of i18next and just connect prefix with key before any other action\n    const keySeparator = config.keySeparator || \".\";\n    cleanKey = `${keyPrefix}${keySeparator}${cleanKey}`;\n  }\n  let ns = key.parsedOptions.ns || config.defaultNS;\n  if (config.nsSeparator) {\n    const nsSeparatorPos = cleanKey.indexOf(config.nsSeparator);\n    if (nsSeparatorPos !== -1) {\n      ns = cleanKey.slice(0, nsSeparatorPos);\n      cleanKey = cleanKey.slice(nsSeparatorPos + 1);\n    }\n  }\n  let keyPath = Array();\n  if (config.keySeparator) {\n    const fullPath = cleanKey.split(config.keySeparator);\n    keyPath = [...keyPath, ...fullPath.slice(0, fullPath.length - 1)];\n    cleanKey = fullPath[fullPath.length - 1];\n  }\n  return {\n    ...key,\n    cleanKey,\n    keyPath,\n    ns,\n    isDerivedKey: false\n  };\n}\n\n/**\n * Compute all derived keys for a local from a key and parsed i18next options.\n *\n * e.g.\n *   ({'foo', {contexts: false, hasCount: true}}, 'en')\n *     => ['foo_one', 'foo_many']\n *   ({'bar', {contexts: ['male', 'female'], hasCount: true}}, 'en')\n *     => ['foo_male_one', 'foo_male_many', 'foo_female_one', 'foo_female_many']\n *\n * FIXME: some of the work of this function should be delegated to the exporter.\n * This function should just put derivation metadata (each plural for the current\n * locale and each context) into an attribute of the key. The exporter should then\n * produce the actual value of the key using the metadata from the TranslationKey.\n * This would remove the need to specify JSONvX-specific code into this\n * function, but it will be easier to do when we drop support for JSONv3.\n *\n * @param extractedKey key that was extracted with an extractor.\n * @param locale locale code\n * @returns All derived keys that could be found from TranslationKey for\n *   locale.\n */\nfunction computeDerivedKeys(extractedKey, locale, config) {\n  const translationKey = parseExtractedKey(extractedKey, config);\n  const {\n    parsedOptions,\n    cleanKey: key\n  } = translationKey;\n  let keys = [translationKey];\n  if (parsedOptions.contexts !== false) {\n    // Add all context suffixes\n    // For instance, if key is \"foo\", may want\n    // [\"foo\", \"foo_male\", \"foo_female\"] depending on defaultContexts value.\n    const contexts = Array.isArray(parsedOptions.contexts) ? parsedOptions.contexts : config.defaultContexts;\n    keys = contexts.map(v => {\n      if (v === \"\") return translationKey;\n      return {\n        ...translationKey,\n        cleanKey: key + config.contextSeparator + v,\n        isDerivedKey: true\n      };\n    });\n  }\n  if (parsedOptions.hasCount) {\n    const i18n = i18next__namespace.createInstance({\n      pluralSeparator: config.pluralSeparator,\n      compatibilityJSON: config.compatibilityJSON || undefined\n    });\n    // We need to init the i18n instance to have all the services initialized.\n    i18n.init();\n    const unknownLocaleError = new Error(`Unknown locale '${locale}'.`);\n    let pluralCategories;\n\n    // See https://www.i18next.com/translation-function/plurals#how-to-find-the-correct-plural-suffix\n\n    // - i18next v21+ w/ JSONv4+: Intl.PluralRules is *always* returned even\n    //   if the locale is unknown.\n    // - JSONv3- (independently of i18next version): some custom untyped object\n    //   is returned, or undefined if the local is unknown.\n    const pluralRule = i18n.services.pluralResolver.getRule(locale,\n    // TODO: a comment hint should allow to override cardinality/ordinality.\n    // It defaults to cardinal, but this is not correct.\n    {\n      ordinal: false\n    });\n    if (pluralRule === undefined || !(pluralRule instanceof Intl.PluralRules)) {\n      throw unknownLocaleError;\n    } else {\n      const pluralRulesOptions = pluralRule.resolvedOptions();\n      // Node only returns the language part of the BCP 47 tag when resolving\n      // plural rules. We still need to check if the locale was properly\n      // resolved, but runtimes silently fallback to the user's locale when\n      // specifying a locale they don't know. Also, there doesn't seem to be a\n      // way to tell if a given locale is supported by the runtime or not. So\n      // as a workaround, we ensure that at least the language part of the\n      // resolved locale is consistent with the locale we want.\n      if (!locale.startsWith(pluralRulesOptions.locale)) {\n        throw unknownLocaleError;\n      }\n      pluralCategories = pluralRulesOptions.pluralCategories;\n    }\n    const pluralSuffixes = pluralCategories.map(cat => cat.length === 0 ? \"\" : config.pluralSeparator + cat);\n    keys = keys.reduce((accumulator, k) => [...accumulator, ...pluralSuffixes.map(suffix => ({\n      ...k,\n      cleanKey: k.cleanKey + suffix,\n      // Let's not consider singular a derived key. This is useful if one\n      // want to use default values for singular.\n      isDerivedKey: k.isDerivedKey || ![\"\", config.pluralSeparator + \"one\"].includes(suffix)\n    }))], Array());\n  }\n  return keys;\n}\n\n/**\n * Handle the extraction.\n *\n * In case of ExtractionError occurring in the callback, a useful error\n * message will display and extraction will continue.\n *\n * @param path Current node path.\n * @param state Current visitor state.\n * @param callback Function to call that may throw ExtractionError.\n */\nfunction handleExtraction(path, state, callback) {\n  const filename = state.file && state.file.opts.filename || \"???\";\n  const extractState = state.I18NextExtract;\n  const collect = newKeysCandidates => {\n    const currentKeys = extractState.extractedKeys;\n    const newKeys = Array();\n    for (const newKeyCandidate of newKeysCandidates) {\n      const conflictingKeyIndex = currentKeys.findIndex(extractedKey => extractedKey.sourceNodes.some(extractedNode => newKeyCandidate.sourceNodes.includes(extractedNode)));\n      if (conflictingKeyIndex !== -1) {\n        const conflictingKey = currentKeys[conflictingKeyIndex];\n        const conflictingKeyPriority = -EXTRACTORS_PRIORITIES.findIndex(v => v === conflictingKey.extractorName);\n        const newKeyPriority = -EXTRACTORS_PRIORITIES.findIndex(v => v === newKeyCandidate.extractorName);\n        if (newKeyPriority <= conflictingKeyPriority) {\n          // Existing key priority is higher than the extracted key priority.\n          // Skip.\n          continue;\n        }\n\n        // Remove the conflicting key from the extracted keys\n        currentKeys.splice(conflictingKeyIndex, 1);\n      }\n      newKeys.push(newKeyCandidate);\n    }\n    currentKeys.push(...newKeys);\n  };\n  try {\n    return callback(collect);\n  } catch (err) {\n    if (!(err instanceof ExtractionError)) {\n      throw err;\n    }\n    const lineNumber = err.nodePath.node.loc && err.nodePath.node.loc.start.line || \"???\";\n    console.warn(`${PLUGIN_NAME}: Extraction error in ${filename} at line ` + `${lineNumber}. ${err.message}`);\n  }\n}\nconst Visitor = {\n  CallExpression(path, state) {\n    const extractState = this.I18NextExtract;\n    handleExtraction(path, state, collect => {\n      collect(Extractors.extractCustomUseTranslationHook(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractUseTranslationHook(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractGetFixedTFunction(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractI18nextInstance(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractTFunction(path, extractState.config, extractState.commentHints));\n    });\n  },\n  JSXElement(path, state) {\n    const extractState = this.I18NextExtract;\n    handleExtraction(path, state, collect => {\n      collect(Extractors.extractTranslationRenderProp(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractCustomTransComponent(path, extractState.config, extractState.commentHints));\n      collect(Extractors.extractTransComponent(path, extractState.config, extractState.commentHints));\n    });\n  },\n  ClassDeclaration(path, state) {\n    const extractState = this.I18NextExtract;\n    handleExtraction(path, state, collect => {\n      collect(extractWithTranslationHOC(path, extractState.config, extractState.commentHints));\n    });\n  },\n  Function(path, state) {\n    const extractState = this.I18NextExtract;\n    handleExtraction(path, state, collect => {\n      collect(extractWithTranslationHOC(path, extractState.config, extractState.commentHints));\n    });\n  }\n};\n\n// This is a cache for the exporter to keep track of the translation files.\n// It must remain global and persist across transpiled files.\n// Maybe it could be split per package.json at some point.\nconst _exporterCache = createExporterCache();\nfunction plugin (api) {\n  api.assertVersion(7);\n  return {\n    pre() {\n      this.I18NextExtract = {\n        config: parseConfig(this.opts),\n        extractedKeys: [],\n        commentHints: []\n      };\n    },\n    post() {\n      const extractState = this.I18NextExtract;\n      if (extractState.extractedKeys.length === 0) return;\n      for (const locale of extractState.config.locales) {\n        const derivedKeys = extractState.extractedKeys.reduce((accumulator, k) => [...accumulator, ...computeDerivedKeys(k, locale, extractState.config)], Array());\n        exportTranslationKeys(derivedKeys, locale, extractState.config, _exporterCache);\n      }\n    },\n    visitor: {\n      Program(path, state) {\n        const toPosixPath = p => p.split(nodePath__namespace.sep).join(nodePath__namespace.posix.sep);\n        const opts = state.file.opts;\n\n        // Check if the current file is excluded.\n        if (opts.root && opts.filename) {\n          const relativePath = nodePath__namespace.relative(opts.root, opts.filename);\n          if (this.I18NextExtract.config.excludes.some(exclude => RegExp(exclude).test(toPosixPath(relativePath)))) {\n            return;\n          }\n        }\n\n        // FIXME can't put this in Visitor because `path.traverse()` on a\n        // Program node doesn't call the visitor for Program node.\n        const containerNodes = Array.isArray(path.container) ? path.container : [path.container];\n        for (const containerNode of containerNodes) {\n          if (BabelTypes__namespace.isFile(containerNode)) {\n            this.I18NextExtract.commentHints = [...this.I18NextExtract.commentHints, ...parseCommentHints(containerNode.comments || [])];\n          }\n        }\n        path.traverse(Visitor, state);\n      }\n    }\n  };\n}\n\nexports.default = plugin;\n"]}