{"version":3,"file":"component---src-pages-index-js-178d0f573518c94c53c8.js","mappings":"swBA8mByB,MAAAA,EC/lBeC,IAAA,oBAAAC,kBAAA,YAAAA,iBAERC,UAgBhC,MAAAC,EAwBEC,IAAA,IAAAC,EAGA,MA3BwB,CAExBD,IAAA,IAAAC,EAAAC,EAAA,OAAAC,QAAA,MAGQH,GAAA,OAAAC,EAAAD,EAAMI,SAAA,OAAAF,EAAND,EAAcI,eAAA,EAAdH,EAAwBI,IAAA,EALR,CA2BFN,GAAAA,EApBQ,CAE9BA,GACsCG,QAAA,MAAQH,OAAA,EAAAA,EAAMO,iBAHtB,CAwBFP,GAAAA,EACdO,gBApBY,CAE1BP,GACkCG,QAAA,MAAQH,OAAA,EAAAA,EAAMQ,aAHtB,CAuBFR,GAAAA,EACVQ,YAAA,MAAAR,GAAA,OAAAC,EAEPD,EAAMS,sBAAA,EAANR,EAAuBM,eAAA,EAqI5B,SAAAG,EAgBFV,EACAC,EACAC,EACAS,EACAC,GA4BA,YA5BA,IAAAA,IAAAA,EAAuB,CAAC,GAajBC,EAAA,GAKFX,EAAA,CACHY,QAAAH,EACAI,WAAYf,EACZ,kBAAkB,GAClBgB,MAAAH,EAAA,GACKD,EAAA,CACHK,QAAShB,EAAW,EAAI,eAAAiB,EAa5BlB,EACAC,EACAC,EACAS,EACAC,EACAO,EACAC,EACAC,GAEA,MAAAC,EAAoC,CAAC,EAEjCH,IACFG,EAAaC,gBAAkBJ,EAAA,UAE3BjB,GACFoB,EAAaE,MAAQb,EACrBW,EAAa1B,OAASgB,EACtBU,EAAaC,gBAAkBJ,EAC/BG,EAAaG,SAAA,6BACJvB,GAAA,cAMAA,KALToB,EAAaG,SAAA,WACbH,EAAaI,IAAM,EACnBJ,EAAaK,KAAO,EACpBL,EAAaM,OAAS,EACtBN,EAAaO,MAAQ,IAUrBT,IACFE,EAAaQ,UAAYV,GAGvBC,IACFC,EAAaS,eAAiBV,GAEhC,MAAAW,EAAAnB,EAAA,GACKb,EAAA,CACH,eAAc,EACd,yBAAyB,GACzBgB,MAAAH,EAAA,CACEI,QAAShB,EAAW,EAAI,EACxBgC,WAAA,wBACGX,KAeP,OAJIU,CAAA,CAgF8C,MAAAE,EAAA,aAAAC,EC9UE,SAAAC,GAGpD,IAHmEC,OACnEpC,EADmEuB,MAEnEtB,EAFmEN,OAGnEe,GAAAyB,EAEA,oBAAInC,EAAAD,EAAAA,cAAA,wBAEiBgB,MAAO,CAAEsB,WAAgB3B,EAAST,EAAS,2BAI5DD,EAAAD,EAAAA,cAAA,OAEKgB,MAAO,CAAEuB,SAAUrC,EAAOsC,QAAA,UAC7BxC,EAAAA,cAAA,OACEyC,IAAI,GACJC,KAAK,6BACO,OACZpC,IAAA,mDAAwDK,aAAkBT,mEAC1Ec,MAAO,CACLuB,SAAA,OACAC,QAAA,QACAf,SAAA,mBAAAkB,EAWV,SAAAzC,GAAA,IAAuB0C,SAAEjC,GAAAT,EAAaU,EAAAiC,EAAA3C,EAAAgC,GACpC,OAAAlC,EAAAA,cACGC,EAAAA,SAAA,KACCD,EAAAA,cAACmC,EAAAtB,EAAA,GAAUD,IACVD,EAEmC,OAAAmC,EAAA,8CAAAC,EAAA,oCAAAC,ECtEC,SAAA/C,GAAA,IAAeK,IAC1DJ,EAD0D+C,OAE1DtC,EAF0DG,QAG1DF,EAH0D6B,IAI1DtB,EAAA,GAJ0DJ,WAK1DK,GAAAnB,EACGoB,EAAAwB,EAAA5C,EAAA6C,GAEH,OAAA9C,EAAAA,cAAA,MAAAa,EAAA,GAEQQ,EAAA,CACJ6B,SAAS,QACTpC,QAASF,EACTN,IAAKc,EAAalB,OAAA,EAAM,WACbkB,OAAA,EAAalB,EACxB+C,OAAQ7B,EAAaT,OAAA,EAAS,cAChBS,OAAA,EAAaT,EAC3B8B,IAAKtB,IAAA,EAAAgC,EAKoC,SAAAlD,GAAA,IAAiBI,SAC9DH,EAD8DkD,QAE9DzC,EAAU,GAFoDI,WAG9DH,GAAA,GAAaX,EACVkB,EAAA0B,EAAA5C,EAAA8C,GAEH,MAAA3B,EAAcD,EAAMkC,QAAA,MAASnD,OAAA,EAAAA,EAAUmD,OAAAhC,EAErCrB,EAAAA,cAACgD,EAAAnC,EAAA,GAAUM,EAAWjB,EAAA,CAAUmD,MAAOjC,EAAOL,WAAYH,KAG5D,OAAKD,EAAQ2C,OAAAtD,EAAAA,cAAA,eAMRW,EAAQ4C,KAAIC,IAAA,IAAGC,MAAAxD,EAAOgD,OAAA/C,EAAQwD,KAAA/C,GAAA6C,EAAA,OAC7BxD,EAAAA,cAAA,UACE2D,IAAA,GAAQ1D,KAASU,KAAQT,IACzBwD,KAAM/C,EACN8C,MAAOxD,EACPgD,OAAQrC,EAAaV,OAAA,EAAS,cAChBU,OAAA,EAAaV,EAC3BmD,MAAOjC,GAAA,IAGVC,GAAAA,CAAA,MAAAuC,EAKPZ,EAAMa,UAAY,CAChBvD,IAAK0B,EAAAA,OAAiB8B,WACtBrB,IAAKT,EAAAA,OAAiB8B,WACtBT,MAAOrB,EAAAA,OACPiB,OAAQjB,EAAAA,OACRjB,WAAYiB,EAAAA,MAGdmB,EAAQY,YAAA,UACRZ,EAAQU,UAAY,CAClBpB,IAAKT,EAAAA,OAAiB8B,WACtB/C,WAAYiB,EAAAA,KACZ3B,SAAU2B,EAAAA,MAAgB,CACxB1B,IAAK0B,EAAAA,OAAiB8B,WACtBb,OAAQjB,EAAAA,OACRqB,MAAOrB,EAAAA,SAEToB,QAASpB,EAAAA,QACPA,EAAAA,UAAoB,CAClBA,EAAAA,MAAgB,CACdyB,MAAOzB,EAAAA,OAAiB8B,WACxBJ,KAAM1B,EAAAA,OACNqB,MAAOrB,EAAAA,OACPiB,OAAQjB,EAAAA,OAAiB8B,aAE3B9B,EAAAA,MAAgB,CACdyB,MAAOzB,EAAAA,OACP0B,KAAM1B,EAAAA,OAAiB8B,WACvBT,MAAOrB,EAAAA,OACPiB,OAAQjB,EAAAA,OAAiB8B,iBAAA,MAAAE,EAAA,aAAAC,EC5G/B,SAAAhE,GAAA,IAAqBI,SAAEH,GAAAD,EAAaU,EAAAkC,EAAA5C,EAAA+D,GAClC,OAAI9D,EAAAF,EAAAA,cAECmD,EAAAtC,EAAA,GACKF,EAAA,CACJN,SAAU,CACRC,IAAKJ,GAAA,iBAGPuC,IAAI,MAAAzC,EAAAA,cAAA,MAAAa,EAAA,GAIQF,GAAA,EAItBsD,EAAYF,YAAA,cACZE,EAAYJ,UAAY,CACtBxD,SAAU2B,EAAAA,OACVoB,QAAA,OAAAQ,EAAST,EAAQU,gBAAA,EAARD,EAAmBR,QAC5BX,IAAK,SAAUzC,EAAOC,EAAUC,GAC9B,OAAKF,EAAMC,GAAA,IAAAiE,MAAA,kBAKSjE,qBAA4BC,2BAAA,OChCvC,MAAAiE,EAAoC,SAAmBlE,GAClE,OAAAD,EAAAA,cAAAA,EAAAA,SAAA,KAEIA,EAAAA,cAACmD,EAAAtC,EAAA,GAAYZ,IACbD,EAAAA,cAAA,gBACEA,EAAAA,cAACmD,EAAAtC,EAAA,GAAYZ,EAAA,CAAOc,YAAA,MAAY,EAMxCoD,EAAUJ,YAAA,YACVI,EAAUN,UAAYV,EAAQU,UAAA,MAAAO,EC2G2B,SACvDpE,EACAC,EACAC,GAAA,QAAAmE,EAAAC,UAAAhB,OACG3C,EAAA,IAAA4D,MAAAF,EAAA,EAAAA,EAAA,KAAAG,EAAA,EAAAA,EAAAH,EAAAG,IAAA7D,EAAA6D,EAAA,GAAAF,UAAAE,GAAA,OAEExE,EAAMyC,KAAA,KAAOzC,EAAMyC,IAAAgC,IAAAA,OAMPC,MANOD,IAAA,CAMAzE,EAAOC,EAAUC,GAAAyE,OAAkBhE,IAAA,IAAAuD,MAAA,iCAJtBhE,2JAAA,EAAA0E,EAOd,CACvBC,MAAOJ,IAAAA,OAAiBX,WACxBrB,IAAK2B,GAAAU,EAAA,8FAAAC,EAAA,sBAAAC,ECjHY,IAAAC,IACnB,IAAAC,EAAAC,EAiCA,MAAAC,EAAkD,SAAApF,GAAA,IAA6BqF,GAC7EpF,EAAA,MAD6E4E,MAE7E3E,EAF6Ec,MAG7EM,EAH6EC,gBAI7ES,EAJ6EsD,UAK7Eb,EACAc,MAAOC,EANsEC,YAO7EC,EAP6EC,OAQ7EC,EAR6EC,QAS7EC,GAAA9F,EACG+F,EAAAlD,EAAA7C,EAAA8E,GAEH,MAAMtD,MAAEwE,EAAFpG,OAASqG,EAAT5D,OAAiB6D,GAAWhG,EAAAiG,EAAA,SNOlCnG,EACAC,EACAC,GAIA,MAAAS,EAAoC,CAAC,EAErC,IAAAC,EAAA,uBAmBA,MAde,UAGXV,GACFS,EAAaa,MAAQxB,EACrBW,EAAaf,OAASK,GAAA,gBACbC,IAKTU,EAAA,yDAGK,CACL0E,UAAA1E,EACA,4BAA4B,GAC5BI,MAAOL,EAAA,CMrCyB,CAKdqF,EAAOC,EAAQC,IAHjClF,MAAOoF,EACPd,UAAWe,GAAAF,EACRG,EAAAzD,EAAAsD,EAAApB,GAAAwB,GAEQ3F,EAAAA,EAAAA,UAAA4F,GACIrF,EAAAA,EAAAA,UAAQ,IAAMsF,KAAKC,UAAUxG,EAAME,SAAS,CAACF,EAAME,SAGhEoF,IACFf,EAAYe,GAGd,MAAAmB,EAAA,SLxCA3G,EACAC,EACAC,GAEA,IAAAS,EAAA,GAWA,MAAM,cAVFX,IACFW,EAAA,+CACGT,EAASD,EAAS,iCAInBD,IACFW,EAAA,0BAAkCV,iIAAqIC,aAAkBD,uIAAAU,CAAA,CK4B3L,CAAuBuF,EAAQF,EAAOC,GA+HtC,OA7HA7E,EAAAA,EAAAA,YAAU,KACH8D,IACHA,EAA6B,8BAAyB0B,MACpDC,IAAA,IAAGC,oBAAA9G,EAAqB+G,qBAAA9G,GAAA4G,EAAA,OACtB1B,EAAcnF,EAEP,CACL8G,oBAAA9G,EACA+G,qBAAA9G,EAAA,KAQR,MAAAD,EAAiBuG,EAAKS,QAAQC,cAAA,2BAG9B,GAAIjH,GAAYL,IAkCd,OAjCIK,EAASkH,UAAA,MAEXxB,GAAAA,EAAc,CACZyB,WAAA,IAAW,MAEbvB,GAAAA,EAAS,CACPuB,WAAA,IAIFC,YAAW,KACTpH,EAASqH,gBAAA,2BACR,WAEH3B,GAAAA,EAAc,CACZyB,WAAA,IAGFnH,EAASsH,iBAAA,QAAyB,SAAArH,IAChCD,EAASuH,oBAAA,OAA4BtH,GAAA,MAErC2F,GAAAA,EAAS,CACPuB,WAAA,IAGFC,YAAW,KACTpH,EAASqH,gBAAA,2BACR,YAIPrC,EAAWwC,IAAIhB,GAKjB,GAAIrB,GAAeH,EAAWyC,IAAIjB,GAChC,OAGF,IAAAvG,EAAAU,EAkCA,OAhCAuE,EAA2B0B,MACzBc,IAAwB,IAArBZ,oBAAA9G,EAAqB+G,qBAAAnG,GAAA8G,EACjBnB,EAAKS,UAIVT,EAAKS,QAAQW,UAAY3H,EAAAa,EAAA,CACvB+G,WAAA,EACAC,SAAU7C,EAAWyC,IAAIjB,GACzB3B,MAAA3E,GACG6F,IAGAf,EAAWyC,IAAIjB,KAClBvG,EAAiB6H,uBAAsB,KACjCvB,EAAKS,UACPrG,EAAkBC,EAChB2F,EAAKS,QACLR,EACAxB,EACA1D,EACAoE,EACAE,EACAE,GAAA,SASL,KACD7F,GACF8H,qBAAqB9H,GAEnBU,GACFA,GAAA,IAGH,CAACT,KAGJmB,EAAAA,EAAAA,kBAAgB,KACV2D,EAAWyC,IAAIjB,IAAarB,IAC9BoB,EAAKS,QAAQW,UAAYxC,EAAAtE,EAAA,CACvB+G,UAAW5C,EAAWyC,IAAIjB,GAC1BqB,SAAU7C,EAAWyC,IAAIjB,GACzB3B,MAAA3E,GACG6F,IAAA,MAILL,GAAAA,EAAc,CACZyB,WAAA,IAAW,MAEbvB,GAAAA,EAAS,CACPuB,WAAA,IAAW,GAGd,CAACjH,KAAAS,EAAAA,EAAAA,eAGiBV,EAAAY,EAAA,GAChByF,EAAA,CACHtF,MAAAH,EAAA,GACKuF,EACA9E,EAAA,CACHC,gBAAAS,IAEFsD,UAAA,GAAce,IAAS5B,EAAA,IAAgBA,IAAA,KACvCuD,IAAKzB,EACL0B,wBAAyB,CACvBC,OAAQvB,GAEVwB,0BAAA,IAA0B,EAAAC,GAIkClI,EAAAA,EAAAA,OAC9D,SAAqBF,GACnB,OAAKA,EAAM6E,OASDlE,EAAAA,EAAAA,eAKWyE,EAAqBpF,GAZ9B,QAgBhBoI,EAAYvE,UAAYe,EACxBwD,EAAYrE,YAAA,oBAAAsE,EAAA,mPAAAC,ECxL6C,SACvDtI,EACAC,GAAA,QAAAsI,EAAAjE,UAAAhB,OACGpD,EAAA,IAAAqE,MAAAgE,EAAA,EAAAA,EAAA,KAAAC,EAAA,EAAAA,EAAAD,EAAAC,IAAAtI,EAAAsI,EAAA,GAAAlE,UAAAkE,GAAA,oBAGDxI,EAAMqC,QAAA,UACLpC,GAAA,WAAwBA,IACzBD,EAAMC,GAAAwE,IAAAA,OAMSC,MANTD,IAAA,CAMgBzE,EAAOC,GAAA0E,OAAazE,IAAA,IAAAgE,MAAA,IAHpCjE,MAAaD,EAAMC,iDAAA,EAAAwI,EAMR,IAAAxD,IAAQ,CAAC,QAAD,4BAAAyD,EAEJ,CACvBpI,IAAKmE,IAAAA,OAAiBX,WACtBrB,IAAK2B,EACL5C,MAAO8G,EACP1I,OAAQ0I,EACRjF,MAAOoB,IAAAA,OACPpC,OAASrC,IACP,YAAIA,EAAMqC,SAGNoG,EAAahB,IAAIzH,EAAMqC,QAI3B,OAAO,IAAP6B,MAAA,iBACmBlE,EAAMqC,2HAAA,GAAAsG,GAhF3B1I,ECLgBmI,EDOT,SAAPlI,GAAA,IAA4BI,IAC1BK,EACAiI,YAAahI,EAFaiI,QAG1B1H,GAAAjB,EAmBGkB,EAAAyB,EAAA3C,EAAAmI,GAMH,OAJIlH,GACF2H,QAAQC,KAAK5H,GAGXP,EAAAZ,EAAAA,cACMC,EAAAY,EAAA,CAAYgE,MAAOjE,GAAeQ,KAE5C0H,QAAQC,KAAA,mBAAyBpI,GAEvB,QA6Ce,IAhF3BV,ECHF0I,EAAY5E,YAAA,cACZ4E,EAAY9E,UAAY6E,C,mBClBxB,MA6BMM,EAAYA,CAACC,EAAOC,KACzB,GAAuB,iBAAVD,IAAsB1E,MAAM4E,QAAQF,GAChD,MAAM,IAAIG,UAAU,gDAGrBF,EAAUG,OAAOC,OAAO,CACvBC,YAAY,GACVL,GAYH,GAPCD,EADG1E,MAAM4E,QAAQF,GACTA,EAAM1F,KAAIoD,GAAKA,EAAE6C,SACvBC,QAAO9C,GAAKA,EAAErD,SACdoG,KAAK,KAECT,EAAMO,OAGM,IAAjBP,EAAM3F,OACT,MAAO,GAGR,GAAqB,IAAjB2F,EAAM3F,OACT,OAAO4F,EAAQK,WAAaN,EAAMU,cAAgBV,EAAMW,cAezD,OAZqBX,IAAUA,EAAMW,gBAGpCX,EA3DwBY,KACzB,IAAIC,GAAkB,EAClBC,GAAkB,EAClBC,GAAsB,EAE1B,IAAK,IAAIrJ,EAAI,EAAGA,EAAIkJ,EAAOvG,OAAQ3C,IAAK,CACvC,MAAMsJ,EAAYJ,EAAOlJ,GAErBmJ,GAAmB,WAAWI,KAAKD,IAAcA,EAAUN,gBAAkBM,GAChFJ,EAASA,EAAOM,MAAM,EAAGxJ,GAAK,IAAMkJ,EAAOM,MAAMxJ,GACjDmJ,GAAkB,EAClBE,EAAsBD,EACtBA,GAAkB,EAClBpJ,KACUoJ,GAAmBC,GAAuB,WAAWE,KAAKD,IAAcA,EAAUL,gBAAkBK,GAC9GJ,EAASA,EAAOM,MAAM,EAAGxJ,EAAI,GAAK,IAAMkJ,EAAOM,MAAMxJ,EAAI,GACzDqJ,EAAsBD,EACtBA,GAAkB,EAClBD,GAAkB,IAElBA,EAAkBG,EAAUL,gBAAkBK,GAAaA,EAAUN,gBAAkBM,EACvFD,EAAsBD,EACtBA,EAAkBE,EAAUN,gBAAkBM,GAAaA,EAAUL,gBAAkBK,EAEzF,CAEA,OAAOJ,CAAM,EAiCJO,CAAkBnB,IAG3BA,EAAQA,EACNoB,QAAQ,YAAa,IACrBT,cACAS,QAAQ,mBAAmB,CAACC,EAAGC,IAAOA,EAAGZ,gBACzCU,QAAQ,cAAczE,GAAKA,EAAE+D,gBA5BXhD,EA8BDsC,EA9BMC,EAAQK,WAAa5C,EAAE6D,OAAO,GAAGb,cAAgBhD,EAAEwD,MAAM,GAAKxD,EAAnEA,KA8BK,EAG1B8D,EAAOC,QAAU1B,EAEjByB,EAAOC,QAAPD,QAAyBzB,C,yDC3DzB,IAbuC2B,KACrC,MAAMC,GAAOC,EAAAA,EAAAA,gBAAe,cAS5B,OAAOC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAnI,SAAA,CAAE,uCAAoCoI,EAAAA,EAAAA,IAAWJ,EAAKK,SAASC,eAAeC,cAAc,MAAI,C,oMCWzG,MArB4BC,KAAO,IAADC,EAChC,MAAMC,GACmC,QADnBD,EACpBE,sDAAuCF,EAAI,sDAC3C1G,OAAO,oDAEHiG,GAAOC,EAAAA,EAAAA,gBAAe,cAS5B,OACEC,EAAAA,EAAAA,MAAA,KAAGU,KAAMF,EAAeG,GAAG,gBAAgBC,UAAQ,EAAA9I,SAAA,CAAC,sDACCoI,EAAAA,EAAAA,IAAWJ,EAAKK,SAASC,eAAeC,cAAc,MACvG,E,yDCAR,MAAMQ,EAA8BA,KACrBd,EAAAA,EAAAA,gBAAe,cAkCxBe,EAAWA,KACf,MAkEMC,EAAcF,IAEpB,OACEG,EAAAA,EAAAA,KAAA,OAAKxG,UAAU,eAAemG,GAAG,YAAW7I,UAC1CkJ,EAAAA,EAAAA,KAAA,MAAIxG,UAAU,iBAAgB1C,SAtEpB,CACZ,CACEmJ,OAAQ,uBACRC,aAAc,qBACdC,SAAU,uBACVC,MAAO,CAAC,CAACC,SAAU,qCAAsCC,QAAS,gBAEpE,CACEL,OAAQ,sBACRC,aAAc,8BACdC,SAAU,sBACVC,MAAO,CACL,CAACC,SAAU,+BAAgCC,QAAS,4BACpD,CAACD,SAAU,8BAA+BC,QAAS,mBACnD,CAACD,SAAU,4BAA6BC,QAAS,2BAGrD,CACEL,OAAQ,kCACRC,aAAc,qBACdC,SAAU,0BACVC,MAAO,CACL,CAACC,SAAU,sBAAuBC,QAAS,oBAC3C,CAACD,SAAU,2BAA4BC,QAAS,oBAChD,CAACD,SAAU,mCAAoCC,QAAS,oBACxD,CAACD,SAAU,gCAAiCC,QAAS,qBACrD,CAACD,SAAU,uBAAwBC,QAAS,sBAGhD,CACEL,OAAQ,sBACRC,aAAc,0BACdC,SAAU,sBACVC,MAAO,CACL,CAACC,SAAU,gCAAiCC,QAAS,oCACrD,CAACD,SAAU,+BAAgCC,QAAS,mCACpD,CAACD,SAAU,2BAA4BC,QAAS,uCAChD,CAACD,SAAU,sCAAuCC,QAAS,gCAG/D,CACEL,OAAQ,kBACRC,aAAc,iBACdC,SAAU,kBACVC,MAAO,CACL,CAACC,SAAU,6BAA8BC,QAAS,UAClD,CAACD,SAAU,2BAA4BC,QAAS,cAChD,CAACD,SAAU,mCAAoCC,QAAS,cACxD,CAACD,SAAU,gCAAiCC,QAAS,eACrD,CAACD,SAAU,kBAAmBC,QAAS,aACvC,CAACD,SAAU,uBAAwBC,QAAS,gBAGhD,CACEL,OAAQ,SACRC,aAAc,4BACdC,SAAU,SACVC,MAAO,CACL,CAACC,SAAU,0BAA2BC,QAAS,cAC/C,CAACD,SAAU,oBAAqBC,QAAS,sBACzC,CAACD,SAAU,0BAA2BC,QAAS,oBAC/C,CAACD,SAAU,mCAAoCC,QAAS,cAUjD7I,KAAK8I,IACV,MAAMxH,GAAQyH,EAAAA,EAAAA,GAAST,EAAYU,QAAQC,MAAMC,MAAMC,GAASA,EAAKC,MAAQN,EAAKJ,YAClF,OACEH,EAAAA,EAAAA,KAAA,MAAwBxG,UAAU,gDAA+C1C,UAC/EkI,EAAAA,EAAAA,MAAA,OAAKxF,UAAU,sBAAqB1C,SAAA,EAClCkJ,EAAAA,EAAAA,KAAA,OAAKxG,UAAU,mBAAkB1C,UAC/BkJ,EAAAA,EAAAA,KAAA,MAAIxG,UAAU,oBAAmB1C,SAAEyJ,EAAKN,YAE1CD,EAAAA,EAAAA,KAAA,OAAKxG,UAAU,8CAA6C1C,UAC1DkJ,EAAAA,EAAAA,KAAA,OAAKxG,UAAU,uCAAsC1C,UACnDkJ,EAAAA,EAAAA,KAACc,EAAAA,EAAW,CAAC/H,MAAOA,EAAOpC,IAAK4J,EAAKL,aAAc1G,UAAU,gCAGjEwG,EAAAA,EAAAA,KAAA,MAAIxG,UAAU,iBAAgB1C,SAC3ByJ,EAAKH,MAAM3I,KAAKsJ,IACff,EAAAA,EAAAA,KAAA,MAAuBxG,UAAU,8BAA6B1C,UAC5DkJ,EAAAA,EAAAA,KAACgB,EAAAA,KAAI,CAACC,GAAIF,EAAKT,QAAQxJ,SAAEiK,EAAKV,YADvBU,EAAKT,iBAZbC,EAAKJ,SAkBT,OAIP,EAIJe,EAAmB,CACvBC,OAAOnB,EAAAA,EAAAA,KAAA,OAAK9K,MAAO,CAACwB,QAAS,OAAQ0K,eAAgB,iBAAiBtK,SAAC,yBACvEuK,SACErC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAnI,SAAA,EACEkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,yBAEJkJ,EAAAA,EAAAA,KAAA,KAAAlJ,SAAG,0CACHkI,EAAAA,EAAAA,MAAA,MAAAlI,SAAA,EACEkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,yGAIJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,yEACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,sCACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,gDACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,2EACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,kGAIJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,4DACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,gEACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,gEACJkJ,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,4CAGNkJ,EAAAA,EAAAA,KAAA,KAAAlJ,UACEkJ,EAAAA,EAAAA,KAACV,EAAmB,OAEtBN,EAAAA,EAAAA,MAAA,KAAAlI,SAAA,EACEkJ,EAAAA,EAAAA,KAAA,KACEN,MAAM4B,EAAAA,EAAAA,YAAW,wCACjB3B,GAAG,2BACH4B,OAAO,SACPC,IAAI,sBAAqB1K,SAC1B,gCAEI,IAAI,wDAKf2K,UAAU,EACV9B,GAAI,WACJ+B,aAAc,MAGVC,EAAgCA,KACpC,MAAMC,EAAW/B,IACjB,IAAIgC,EAAW,CACb,CACEC,MAAO,SACPC,WAAY,SACZC,UAAU,EACVC,aAAcC,EAAAA,GACdvE,OAAQwE,EAAAA,EACRC,cAAc,EACdC,gBAAgB,EAChBC,wBAAyBC,EAAAA,EACzBC,8BAA+B,CAC7BC,UAAW,SACXC,sBAAsB,EACtBtF,QAASuF,EAAAA,GACTC,cAAe,gBAGnB,CACEd,MAAO,aACPC,WAAY,cACZc,WAAW,EACXZ,aAAca,EAAAA,EACdC,mBAAqBC,IACZ,CACLC,KAAM,GAAGD,EAAOlE,KAAKoE,cACrBC,MAAOH,EAAOlE,KAAKsE,WACnBnL,YAAa+K,EAAOlE,KAAKsE,aAG7BzF,OAAQ0F,EAAAA,EACRjB,cAAc,EACdC,gBAAgB,EAChBC,wBAAyBgB,EAAAA,GAE3B,CACExB,MAAO,WACPC,WAAY,WACZpE,OAAQ0F,EAAAA,EACRjB,cAAc,EACdC,gBAAgB,EAChBC,wBAAyBgB,EAAAA,GAE3B,CACExB,MAAO,eACPC,WAAY,gBACZpE,OAAQwE,EAAAA,EACRC,cAAc,EACdC,gBAAgB,EAChBC,wBAAyBC,EAAAA,EACzBC,8BAA+B,CAC7BC,UAAW,WACXC,sBAAsB,EACtBtF,QAAS,CACP,sBACA,oBACA,gBACA,0BACA,uBACA,eAEFwF,cAAe,mBAKrB,MAAMW,EAAkB1B,EAASxD,QAIjC,MAAO,CACL8C,OACEnB,EAAAA,EAAAA,KAAA,OAAKL,GAAG,mBAAmBzK,MAAO,CAACwB,QAAS,OAAQ0K,eAAgB,iBAAiBtK,SAAC,uCAIxFuK,SACErC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAnI,SAAA,EACEkI,EAAAA,EAAAA,MAAA,KAAAlI,SAAA,CAAG,qLAEoF,KACrFkJ,EAAAA,EAAAA,KAACgB,EAAAA,KAAI,CAACC,GAAG,SAAQnK,SAAC,yCAA2C,oZAM/DkJ,EAAAA,EAAAA,KAAA,OAAKL,GAAG,uBAAuBnG,UAAU,YAAW1C,UAClDkJ,EAAAA,EAAAA,KAACwD,EAAAA,EAAY,CACX1E,KAAM8C,EAAS6B,KAAKC,aAAaC,uBACjC9B,SAAUA,EAEV+B,cAxBU,uBAyBVC,gBAxBY,cAyBZC,qBAAsBP,GAHjB,uBAQb9B,UAAU,EACV9B,GAAI,mBACJ+B,aAAc,KACf,EAGGqC,EAAgCA,KACpC,MAAMlC,EAAW,CACf,CACEC,MAAO,SACPC,WAAY,cACZiC,KAAM,EACN/B,aAAca,EAAAA,EACdC,mBAAqBC,IACZ,CACLC,KAAM,oBAAoBD,EAAOG,WAIvC,CACErB,MAAO,eACPC,WAAY,YACZiC,KAAM,IAGJpC,EAAW/B,IACjB,MAAO,CACLsB,OAAOnB,EAAAA,EAAAA,KAAA,OAAK9K,MAAO,CAACwB,QAAS,OAAQ0K,eAAgB,iBAAiBtK,SAAC,uCACvEuK,SACErC,EAAAA,EAAAA,MAAAC,EAAAA,SAAA,CAAAnI,SAAA,EACEkI,EAAAA,EAAAA,MAAA,MAAAlI,SAAA,CAAI,kBACc,KAChBkI,EAAAA,EAAAA,MAAA,OAAAlI,SAAA,CAAK,KAEHkJ,EAAAA,EAAAA,KAAA,KAAGN,KAAK,OAAOC,GAAG,WAAU7I,SAAC,MAEzB,WAIRkJ,EAAAA,EAAAA,KAACwD,EAAAA,EAAY,CACX1E,KAAM8C,EAASzC,SAAS8E,iBACxBpC,SAAUA,EAEV+B,cAAe,2CACfC,gBAAiB,+BAFZ,8BAIP7D,EAAAA,EAAAA,KAAA,MAAAlJ,SAAI,aACJkJ,EAAAA,EAAAA,KAAA,MAAIxG,UAAU,gBAAgBmG,GAAG,YAAW7I,UAC1CkJ,EAAAA,EAAAA,KAAA,MAAIL,GAAG,MAAK7I,UACVkJ,EAAAA,EAAAA,KAACnB,EAAAA,EAA8B,WAKvC4C,UAAU,EACV9B,GAAI,mBACJ+B,aAAc,KACf,EA2CUwC,EAAOA,KACXlE,EAAAA,EAAAA,KAACmE,EAAAA,EAAU,IAGpB,MA5CgBC,KAEZpF,EAAAA,EAAAA,MAACqF,EAAAA,EAAM,CAACC,UAAU,uBAAsBxN,SAAA,EACtCkJ,EAAAA,EAAAA,KAAA,KAAGxG,UAAU,YAAW1C,SAAC,8FAGzBkJ,EAAAA,EAAAA,KAAA,KAAAlJ,SAAG,8PAKHkJ,EAAAA,EAAAA,KAAA,KAAAlJ,SAAG,oPAKFgJ,KACDE,EAAAA,EAAAA,KAACuE,EAAAA,GAAS,CACRC,MAAO,CAACtD,EAAkBS,IAAiCoC,KAC3DU,UAAQ,KAEVzE,EAAAA,EAAAA,KAAA,KAAGxG,UAAU,eAAc1C,SAAC,uxBAU5BkI,EAAAA,EAAAA,MAAA,KAAAlI,SAAA,CAAG,0GACuG,KACxGkJ,EAAAA,EAAAA,KAAA,KAAGN,KAAK,kCAAiC5I,SAAC,qCAAoC,+C","sources":["webpack://phmsa-enforcement-data/../src/image-utils.ts","webpack://phmsa-enforcement-data/../src/components/hooks.ts","webpack://phmsa-enforcement-data/../src/components/layout-wrapper.tsx","webpack://phmsa-enforcement-data/../src/components/picture.tsx","webpack://phmsa-enforcement-data/../src/components/placeholder.tsx","webpack://phmsa-enforcement-data/../src/components/main-image.tsx","webpack://phmsa-enforcement-data/../src/components/gatsby-image.server.tsx","webpack://phmsa-enforcement-data/../src/components/gatsby-image.browser.tsx","webpack://phmsa-enforcement-data/../src/components/static-image.server.tsx","webpack://phmsa-enforcement-data/../src/components/static-image.tsx","webpack://phmsa-enforcement-data/./node_modules/gatsby-plugin-image/node_modules/camelcase/index.js","webpack://phmsa-enforcement-data/./src/components/data-currency-footnote-excavation.js","webpack://phmsa-enforcement-data/./src/components/raw-data-download-link.js","webpack://phmsa-enforcement-data/./src/pages/index.js"],"sourcesContent":["import camelCase from \"camelcase\"\nimport type { IGatsbyImageData } from \"./index\"\n\nconst DEFAULT_PIXEL_DENSITIES = [0.25, 0.5, 1, 2]\nexport const DEFAULT_BREAKPOINTS = [750, 1080, 1366, 1920]\nexport const EVERY_BREAKPOINT = [\n 320, 654, 768, 1024, 1366, 1600, 1920, 2048, 2560, 3440, 3840, 4096,\n]\nconst DEFAULT_FLUID_WIDTH = 800\nconst DEFAULT_FIXED_WIDTH = 800\nconst DEFAULT_ASPECT_RATIO = 4 / 3\n\nexport type Fit = \"cover\" | \"fill\" | \"inside\" | \"outside\" | \"contain\"\n\nexport type Layout = \"fixed\" | \"fullWidth\" | \"constrained\"\nexport type ImageFormat = \"jpg\" | \"png\" | \"webp\" | \"avif\" | \"auto\" | \"\"\n\n/**\n * The minimal required reporter, as we don't want to import it from gatsby-cli\n */\nexport interface IReporter {\n warn(message: string): void\n}\n\nexport interface ISharpGatsbyImageArgs {\n layout?: Layout\n formats?: Array<ImageFormat>\n placeholder?: \"tracedSVG\" | \"dominantColor\" | \"blurred\" | \"none\"\n tracedSVGOptions?: Record<string, unknown>\n width?: number\n height?: number\n aspectRatio?: number\n sizes?: string\n quality?: number\n transformOptions?: {\n fit?: Fit\n cropFocus?: number | string\n duotone?: {\n highlight: string\n shadow: string\n opacity?: number\n }\n grayscale?: boolean\n rotate?: number\n trim?: number\n }\n jpgOptions?: Record<string, unknown>\n pngOptions?: Record<string, unknown>\n webpOptions?: Record<string, unknown>\n avifOptions?: Record<string, unknown>\n blurredOptions?: { width?: number; toFormat?: ImageFormat }\n breakpoints?: Array<number>\n outputPixelDensities?: Array<number>\n backgroundColor?: string\n}\n\nexport interface IImageSizeArgs {\n width?: number\n height?: number\n layout?: Layout\n filename: string\n outputPixelDensities?: Array<number>\n breakpoints?: Array<number>\n fit?: Fit\n reporter?: IReporter\n sourceMetadata: { width: number; height: number }\n}\n\nexport interface IImageSizes {\n sizes: Array<number>\n presentationWidth: number\n presentationHeight: number\n aspectRatio: number\n unscaledWidth: number\n}\n\nexport interface IImage {\n src: string\n width: number\n height: number\n format: ImageFormat\n}\n\nexport interface IGatsbyImageHelperArgs {\n pluginName: string\n generateImageSource: (\n filename: string,\n width: number,\n height: number,\n format: ImageFormat,\n fit?: Fit,\n options?: Record<string, unknown>\n ) => IImage\n layout?: Layout\n formats?: Array<ImageFormat>\n filename: string\n placeholderURL?: string\n width?: number\n height?: number\n sizes?: string\n reporter?: IReporter\n sourceMetadata?: { width: number; height: number; format: ImageFormat }\n fit?: Fit\n options?: Record<string, unknown>\n breakpoints?: Array<number>\n backgroundColor?: string\n aspectRatio?: number\n}\n\nconst warn = (message: string): void => console.warn(message)\n\nconst sortNumeric = (a: number, b: number): number => a - b\n\nexport const getSizes = (width: number, layout: Layout): string | undefined => {\n switch (layout) {\n // If screen is wider than the max size, image width is the max size,\n // otherwise it's the width of the screen\n case `constrained`:\n return `(min-width: ${width}px) ${width}px, 100vw`\n\n // Image is always the same width, whatever the size of the screen\n case `fixed`:\n return `${width}px`\n\n // Image is always the width of the screen\n case `fullWidth`:\n return `100vw`\n\n default:\n return undefined\n }\n}\n\nexport const getSrcSet = (images: Array<IImage>): string =>\n images.map(image => `${image.src} ${image.width}w`).join(`,\\n`)\n\nexport function formatFromFilename(filename: string): ImageFormat | undefined {\n const dot = filename.lastIndexOf(`.`)\n if (dot !== -1) {\n const ext = filename.slice(dot + 1)\n if (ext === `jpeg`) {\n return `jpg`\n }\n if (ext.length === 3 || ext.length === 4) {\n return ext as ImageFormat\n }\n }\n return undefined\n}\n\nexport function setDefaultDimensions(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageHelperArgs {\n let {\n layout = `constrained`,\n width,\n height,\n sourceMetadata,\n breakpoints,\n aspectRatio,\n formats = [`auto`, `webp`],\n } = args\n formats = formats.map(format => format.toLowerCase() as ImageFormat)\n layout = camelCase(layout) as Layout\n\n if (width && height) {\n return { ...args, formats, layout, aspectRatio: width / height }\n }\n if (sourceMetadata.width && sourceMetadata.height && !aspectRatio) {\n aspectRatio = sourceMetadata.width / sourceMetadata.height\n }\n\n if (layout === `fullWidth`) {\n width = width || sourceMetadata.width || breakpoints[breakpoints.length - 1]\n height = height || Math.round(width / (aspectRatio || DEFAULT_ASPECT_RATIO))\n } else {\n if (!width) {\n if (height && aspectRatio) {\n width = height * aspectRatio\n } else if (sourceMetadata.width) {\n width = sourceMetadata.width\n } else if (height) {\n width = Math.round(height / DEFAULT_ASPECT_RATIO)\n } else {\n width = DEFAULT_FIXED_WIDTH\n }\n }\n\n if (aspectRatio && !height) {\n height = Math.round(width / aspectRatio)\n } else if (!aspectRatio) {\n aspectRatio = width / height\n }\n }\n return { ...args, width, height, aspectRatio, layout, formats }\n}\n\n/**\n * Use this for getting an image for the blurred placeholder. This ensures the\n * aspect ratio and crop match the main image\n */\nexport function getLowResolutionImageURL(\n args: IGatsbyImageHelperArgs,\n width = 20\n): string {\n args = setDefaultDimensions(args)\n const { generateImageSource, filename, aspectRatio } = args\n return generateImageSource(\n filename,\n width,\n Math.round(width / aspectRatio),\n args.sourceMetadata.format || `jpg`,\n args.fit,\n args.options\n )?.src\n}\n\nexport function generateImageData(\n args: IGatsbyImageHelperArgs\n): IGatsbyImageData {\n args = setDefaultDimensions(args)\n\n let {\n pluginName,\n sourceMetadata,\n generateImageSource,\n layout,\n fit,\n options,\n width,\n height,\n filename,\n reporter = { warn },\n backgroundColor,\n placeholderURL,\n } = args\n\n if (!pluginName) {\n reporter.warn(\n `[gatsby-plugin-image] \"generateImageData\" was not passed a plugin name`\n )\n }\n\n if (typeof generateImageSource !== `function`) {\n throw new Error(`generateImageSource must be a function`)\n }\n\n if (!sourceMetadata || (!sourceMetadata.width && !sourceMetadata.height)) {\n // No metadata means we let the CDN handle max size etc, aspect ratio etc\n sourceMetadata = {\n width,\n height,\n format: sourceMetadata?.format || formatFromFilename(filename) || `auto`,\n }\n } else if (!sourceMetadata.format) {\n sourceMetadata.format = formatFromFilename(filename)\n }\n\n const formats = new Set<ImageFormat>(args.formats)\n\n if (formats.size === 0 || formats.has(`auto`) || formats.has(``)) {\n formats.delete(`auto`)\n formats.delete(``)\n formats.add(sourceMetadata.format)\n }\n\n if (formats.has(`jpg`) && formats.has(`png`)) {\n reporter.warn(\n `[${pluginName}] Specifying both 'jpg' and 'png' formats is not supported. Using 'auto' instead`\n )\n if (sourceMetadata.format === `jpg`) {\n formats.delete(`png`)\n } else {\n formats.delete(`jpg`)\n }\n }\n\n const imageSizes = calculateImageSizes({ ...args, sourceMetadata })\n\n const result: IGatsbyImageData[\"images\"] = {\n sources: [],\n }\n\n let sizes = args.sizes\n if (!sizes) {\n sizes = getSizes(imageSizes.presentationWidth, layout)\n }\n\n formats.forEach(format => {\n const images = imageSizes.sizes\n .map(size => {\n const imageSrc = generateImageSource(\n filename,\n size,\n Math.round(size / imageSizes.aspectRatio),\n format,\n fit,\n options\n )\n if (\n !imageSrc?.width ||\n !imageSrc.height ||\n !imageSrc.src ||\n !imageSrc.format\n ) {\n reporter.warn(\n `[${pluginName}] The resolver for image ${filename} returned an invalid value.`\n )\n return undefined\n }\n return imageSrc\n })\n .filter(Boolean)\n\n if (format === `jpg` || format === `png` || format === `auto`) {\n const unscaled =\n images.find(img => img.width === imageSizes.unscaledWidth) || images[0]\n\n if (unscaled) {\n result.fallback = {\n src: unscaled.src,\n srcSet: getSrcSet(images),\n sizes,\n }\n }\n } else {\n result.sources?.push({\n srcSet: getSrcSet(images),\n sizes,\n type: `image/${format}`,\n })\n }\n })\n\n const imageProps: Partial<IGatsbyImageData> = {\n images: result,\n layout,\n backgroundColor,\n }\n\n if (placeholderURL) {\n imageProps.placeholder = { fallback: placeholderURL }\n }\n\n switch (layout) {\n case `fixed`:\n imageProps.width = imageSizes.presentationWidth\n imageProps.height = imageSizes.presentationHeight\n break\n\n case `fullWidth`:\n imageProps.width = 1\n imageProps.height = 1 / imageSizes.aspectRatio\n break\n\n case `constrained`:\n imageProps.width = args.width || imageSizes.presentationWidth || 1\n imageProps.height = (imageProps.width || 1) / imageSizes.aspectRatio\n }\n\n return imageProps as IGatsbyImageData\n}\n\nconst dedupeAndSortDensities = (values: Array<number>): Array<number> =>\n Array.from(new Set([1, ...values])).sort(sortNumeric)\n\nexport function calculateImageSizes(args: IImageSizeArgs): IImageSizes {\n const {\n width,\n height,\n filename,\n layout = `constrained`,\n sourceMetadata: imgDimensions,\n reporter = { warn },\n breakpoints = DEFAULT_BREAKPOINTS,\n } = args\n\n // check that all dimensions provided are positive\n const userDimensions = { width, height }\n const erroneousUserDimensions = Object.entries(userDimensions).filter(\n ([_, size]) => typeof size === `number` && size < 1\n )\n if (erroneousUserDimensions.length) {\n throw new Error(\n `Specified dimensions for images must be positive numbers (> 0). Problem dimensions you have are ${erroneousUserDimensions\n .map(dim => dim.join(`: `))\n .join(`, `)}`\n )\n }\n\n if (layout === `fixed`) {\n return fixedImageSizes(args)\n } else if (layout === `constrained`) {\n return responsiveImageSizes(args)\n } else if (layout === `fullWidth`) {\n return responsiveImageSizes({ breakpoints, ...args })\n } else {\n reporter.warn(\n `No valid layout was provided for the image at ${filename}. Valid image layouts are fixed, fullWidth, and constrained. Found ${layout}`\n )\n return {\n sizes: [imgDimensions.width],\n presentationWidth: imgDimensions.width,\n presentationHeight: imgDimensions.height,\n aspectRatio: imgDimensions.width / imgDimensions.height,\n unscaledWidth: imgDimensions.width,\n }\n }\n}\nexport function fixedImageSizes({\n filename,\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n reporter = { warn },\n}: IImageSizeArgs): IImageSizes {\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n if (!width) {\n if (!height) {\n width = DEFAULT_FIXED_WIDTH\n } else {\n width = Math.round(height * aspectRatio)\n }\n } else if (!height) {\n height = Math.round(width / aspectRatio)\n }\n\n const originalWidth = width // will use this for presentationWidth, don't want to lose it\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n\n // If the image is smaller than requested, warn the user that it's being processed as such\n // print out this message with the necessary information before we overwrite it for sizing\n if (isTopSizeOverriden) {\n const fixedDimension = imgDimensions.width < width ? `width` : `height`\n reporter.warn(`\nThe requested ${fixedDimension} \"${\n fixedDimension === `width` ? width : height\n }px\" for the image ${filename} was larger than the actual image ${fixedDimension} of ${\n imgDimensions[fixedDimension]\n }px. If possible, replace the current image with a larger one.`)\n\n if (fixedDimension === `width`) {\n width = imgDimensions.width\n height = Math.round(width / aspectRatio)\n } else {\n height = imgDimensions.height\n width = height * aspectRatio\n }\n }\n\n const sizes = densities\n .filter(size => size >= 1) // remove smaller densities because fixed images don't need them\n .map(density => Math.round(density * (width as number)))\n .filter(size => size <= imgDimensions.width)\n\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function responsiveImageSizes({\n sourceMetadata: imgDimensions,\n width,\n height,\n fit = `cover`,\n outputPixelDensities = DEFAULT_PIXEL_DENSITIES,\n breakpoints,\n layout,\n}: IImageSizeArgs): IImageSizes {\n let sizes\n let aspectRatio = imgDimensions.width / imgDimensions.height\n // Sort, dedupe and ensure there's a 1\n const densities = dedupeAndSortDensities(outputPixelDensities)\n\n // If both are provided then we need to check the fit\n if (width && height) {\n const calculated = getDimensionsAndAspectRatio(imgDimensions, {\n width,\n height,\n fit,\n })\n width = calculated.width\n height = calculated.height\n aspectRatio = calculated.aspectRatio\n }\n\n // Case 1: width of height were passed in, make sure it isn't larger than the actual image\n width = width && Math.min(width, imgDimensions.width)\n height = height && Math.min(height, imgDimensions.height)\n\n // Case 2: neither width or height were passed in, use default size\n if (!width && !height) {\n width = Math.min(DEFAULT_FLUID_WIDTH, imgDimensions.width)\n height = width / aspectRatio\n }\n\n // if it still hasn't been found, calculate width from the derived height.\n // TS isn't smart enough to realise the type for height has been narrowed here\n if (!width) {\n width = (height as number) * aspectRatio\n }\n\n const originalWidth = width\n const isTopSizeOverriden =\n imgDimensions.width < width || imgDimensions.height < (height as number)\n if (isTopSizeOverriden) {\n width = imgDimensions.width\n height = imgDimensions.height\n }\n\n width = Math.round(width)\n\n if (breakpoints?.length > 0) {\n sizes = breakpoints.filter(size => size <= imgDimensions.width)\n\n // If a larger breakpoint has been filtered-out, add the actual image width instead\n if (\n sizes.length < breakpoints.length &&\n !sizes.includes(imgDimensions.width)\n ) {\n sizes.push(imgDimensions.width)\n }\n } else {\n sizes = densities.map(density => Math.round(density * (width as number)))\n sizes = sizes.filter(size => size <= imgDimensions.width)\n }\n\n // ensure that the size passed in is included in the final output\n if (layout === `constrained` && !sizes.includes(width)) {\n sizes.push(width)\n }\n sizes = sizes.sort(sortNumeric)\n return {\n sizes,\n aspectRatio,\n presentationWidth: originalWidth,\n presentationHeight: Math.round(originalWidth / aspectRatio),\n unscaledWidth: width,\n }\n}\n\nexport function getDimensionsAndAspectRatio(\n dimensions,\n options\n): { width: number; height: number; aspectRatio: number } {\n // Calculate the eventual width/height of the image.\n const imageAspectRatio = dimensions.width / dimensions.height\n\n let width = options.width\n let height = options.height\n\n switch (options.fit) {\n case `fill`: {\n width = options.width ? options.width : dimensions.width\n height = options.height ? options.height : dimensions.height\n break\n }\n case `inside`: {\n const widthOption = options.width\n ? options.width\n : Number.MAX_SAFE_INTEGER\n const heightOption = options.height\n ? options.height\n : Number.MAX_SAFE_INTEGER\n\n width = Math.min(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.min(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n case `outside`: {\n const widthOption = options.width ? options.width : 0\n const heightOption = options.height ? options.height : 0\n\n width = Math.max(widthOption, Math.round(heightOption * imageAspectRatio))\n height = Math.max(\n heightOption,\n Math.round(widthOption / imageAspectRatio)\n )\n break\n }\n\n default: {\n if (options.width && !options.height) {\n width = options.width\n height = Math.round(options.width / imageAspectRatio)\n }\n\n if (options.height && !options.width) {\n width = Math.round(options.height * imageAspectRatio)\n height = options.height\n }\n }\n }\n\n return {\n width,\n height,\n aspectRatio: width / height,\n }\n}\n","/* global GATSBY___IMAGE */\nimport { generateImageData, EVERY_BREAKPOINT } from \"../image-utils\"\nimport type { CSSProperties, HTMLAttributes, ImgHTMLAttributes } from \"react\"\nimport type { Node } from \"gatsby\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { IGatsbyImageData } from \"./gatsby-image.browser\"\nimport type {\n IGatsbyImageHelperArgs,\n Layout,\n IImage,\n ImageFormat,\n} from \"../image-utils\"\n\n// Native lazy-loading support: https://addyosmani.com/blog/lazy-loading/\nexport const hasNativeLazyLoadSupport = (): boolean =>\n typeof HTMLImageElement !== `undefined` &&\n `loading` in HTMLImageElement.prototype\n\nexport function gatsbyImageIsInstalled(): boolean {\n return typeof GATSBY___IMAGE !== `undefined` && GATSBY___IMAGE\n}\n\nexport type IGatsbyImageDataParent<T = never> = T & {\n gatsbyImageData: IGatsbyImageData\n}\nexport type IGatsbyImageParent<T = never> = T & {\n gatsbyImage: IGatsbyImageData\n}\nexport type FileNode = Partial<Node> & {\n childImageSharp?: IGatsbyImageDataParent<Partial<Node>>\n}\n\nconst isGatsbyImageData = (\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageData | any\n): node is IGatsbyImageData =>\n // 🦆 check for a deep prop to be sure this is a valid gatsbyImageData object\n Boolean(node?.images?.fallback?.src)\n\nconst isGatsbyImageDataParent = <T>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageDataParent<T> | any\n): node is IGatsbyImageDataParent<T> => Boolean(node?.gatsbyImageData)\n\nconst isGatsbyImageParent = <T>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n node: IGatsbyImageParent<T> | any\n): node is IGatsbyImageParent<T> => Boolean(node?.gatsbyImage)\n\nexport type ImageDataLike =\n | FileNode\n | IGatsbyImageDataParent\n | IGatsbyImageParent\n | IGatsbyImageData\n\nexport const getImage = (\n node: ImageDataLike | null\n): IGatsbyImageData | undefined => {\n // This checks both for gatsbyImageData and gatsbyImage\n if (isGatsbyImageData(node)) {\n return node\n }\n // gatsbyImageData GraphQL field\n if (isGatsbyImageDataParent(node)) {\n return node.gatsbyImageData\n }\n // gatsbyImage GraphQL field for Gatsby's Image CDN service\n if (isGatsbyImageParent(node)) {\n return node.gatsbyImage\n }\n return node?.childImageSharp?.gatsbyImageData\n}\n\nexport const getSrc = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.src\n\nexport const getSrcSet = (node: ImageDataLike): string | undefined =>\n getImage(node)?.images?.fallback?.srcSet\n\nexport function getWrapperProps(\n width: number,\n height: number,\n layout: Layout\n): Pick<HTMLAttributes<HTMLElement>, \"className\" | \"style\"> & {\n \"data-gatsby-image-wrapper\": string\n} {\n const wrapperStyle: CSSProperties = {}\n\n let className = `gatsby-image-wrapper`\n\n // If the plugin isn't installed we need to apply the styles inline\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.position = `relative`\n wrapperStyle.overflow = `hidden`\n }\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n } else if (layout === `constrained`) {\n if (!gatsbyImageIsInstalled()) {\n wrapperStyle.display = `inline-block`\n wrapperStyle.verticalAlign = `top`\n }\n className = `gatsby-image-wrapper gatsby-image-wrapper-constrained`\n }\n\n return {\n className,\n \"data-gatsby-image-wrapper\": ``,\n style: wrapperStyle,\n }\n}\n\nexport interface IUrlBuilderArgs<OptionsType> {\n width: number\n height: number\n baseUrl: string\n format: ImageFormat\n options: OptionsType\n}\nexport interface IGetImageDataArgs<OptionsType = Record<string, unknown>> {\n baseUrl: string\n /**\n * For constrained and fixed images, the size of the image element\n */\n width?: number\n height?: number\n /**\n * If available, pass the source image width and height\n */\n sourceWidth?: number\n sourceHeight?: number\n /**\n * If only one dimension is passed, then this will be used to calculate the other.\n */\n aspectRatio?: number\n layout?: Layout\n /**\n * Returns a URL based on the passed arguments. Should be a pure function\n */\n urlBuilder: (args: IUrlBuilderArgs<OptionsType>) => string\n\n /**\n * Should be a data URI\n */\n placeholderURL?: string\n backgroundColor?: string\n /**\n * Used in error messages etc\n */\n pluginName?: string\n\n /**\n * If you do not support auto-format, pass an array of image types here\n */\n formats?: Array<ImageFormat>\n\n breakpoints?: Array<number>\n\n /**\n * Passed to the urlBuilder function\n */\n options?: OptionsType\n}\n\n/**\n * Use this hook to generate gatsby-plugin-image data in the browser.\n */\nexport function getImageData<OptionsType>({\n baseUrl,\n urlBuilder,\n sourceWidth,\n sourceHeight,\n pluginName = `getImageData`,\n formats = [`auto`],\n breakpoints,\n options,\n ...props\n}: IGetImageDataArgs<OptionsType>): IGatsbyImageData {\n if (\n !breakpoints?.length &&\n (props.layout === `fullWidth` || (props.layout as string) === `FULL_WIDTH`)\n ) {\n breakpoints = EVERY_BREAKPOINT\n }\n const generateImageSource = (\n baseUrl: string,\n width: number,\n height?: number,\n format?: ImageFormat\n ): IImage => {\n return {\n width,\n height,\n format,\n src: urlBuilder({ baseUrl, width, height, options, format }),\n }\n }\n\n const sourceMetadata: IGatsbyImageHelperArgs[\"sourceMetadata\"] = {\n width: sourceWidth,\n height: sourceHeight,\n format: `auto`,\n }\n\n const args: IGatsbyImageHelperArgs = {\n ...props,\n pluginName,\n generateImageSource,\n filename: baseUrl,\n formats,\n breakpoints,\n sourceMetadata,\n }\n return generateImageData(args)\n}\n\nexport function getMainProps(\n isLoading: boolean,\n isLoaded: boolean,\n images: IGatsbyImageData[\"images\"],\n loading?: \"eager\" | \"lazy\",\n style: CSSProperties = {}\n): Partial<MainImageProps> {\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n transform: `translateZ(0)`,\n transition: `opacity 250ms linear`,\n width: `100%`,\n willChange: `opacity`,\n ...style,\n }\n }\n\n const result = {\n ...images,\n loading,\n shouldLoad: isLoading,\n \"data-main-image\": ``,\n style: {\n ...style,\n opacity: isLoaded ? 1 : 0,\n },\n }\n\n return result\n}\n\nexport type PlaceholderImageAttrs = ImgHTMLAttributes<HTMLImageElement> &\n Pick<PlaceholderProps, \"sources\" | \"fallback\"> & {\n \"data-placeholder-image\"?: string\n }\n\nexport function getPlaceholderProps(\n placeholder: PlaceholderImageAttrs | undefined,\n isLoaded: boolean,\n layout: Layout,\n width?: number,\n height?: number,\n backgroundColor?: string,\n objectFit?: CSSProperties[\"objectFit\"],\n objectPosition?: CSSProperties[\"objectPosition\"]\n): PlaceholderImageAttrs {\n const wrapperStyle: CSSProperties = {}\n\n if (backgroundColor) {\n wrapperStyle.backgroundColor = backgroundColor\n\n if (layout === `fixed`) {\n wrapperStyle.width = width\n wrapperStyle.height = height\n wrapperStyle.backgroundColor = backgroundColor\n wrapperStyle.position = `relative`\n } else if (layout === `constrained`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n } else if (layout === `fullWidth`) {\n wrapperStyle.position = `absolute`\n wrapperStyle.top = 0\n wrapperStyle.left = 0\n wrapperStyle.bottom = 0\n wrapperStyle.right = 0\n }\n }\n\n if (objectFit) {\n wrapperStyle.objectFit = objectFit\n }\n\n if (objectPosition) {\n wrapperStyle.objectPosition = objectPosition\n }\n const result: PlaceholderImageAttrs = {\n ...placeholder,\n \"aria-hidden\": true,\n \"data-placeholder-image\": ``,\n style: {\n opacity: isLoaded ? 0 : 1,\n transition: `opacity 500ms linear`,\n ...wrapperStyle,\n },\n }\n\n // fallback when it's not configured in gatsby-config.\n if (!gatsbyImageIsInstalled()) {\n result.style = {\n height: `100%`,\n left: 0,\n position: `absolute`,\n top: 0,\n width: `100%`,\n }\n }\n\n return result\n}\n\nexport interface IArtDirectedImage {\n media: string\n image: IGatsbyImageData\n}\n\n/**\n * Generate a Gatsby image data object with multiple, art-directed images that display at different\n * resolutions.\n *\n * @param defaultImage The image displayed when no media query matches.\n * It is also used for all other settings applied to the image, such as width, height and layout.\n * You should pass a className to the component with media queries to adjust the size of the container,\n * as this cannot be adjusted automatically.\n * @param artDirected Array of objects which each contains a `media` string which is a media query\n * such as `(min-width: 320px)`, and the image object to use when that query matches.\n */\nexport function withArtDirection(\n defaultImage: IGatsbyImageData,\n artDirected: Array<IArtDirectedImage>\n): IGatsbyImageData {\n const { images, placeholder, ...props } = defaultImage\n const output: IGatsbyImageData = {\n ...props,\n images: {\n ...images,\n sources: [],\n },\n placeholder: placeholder && {\n ...placeholder,\n sources: [],\n },\n }\n\n artDirected.forEach(({ media, image }) => {\n if (!media) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(\n \"[gatsby-plugin-image] All art-directed images passed to must have a value set for `media`. Skipping.\"\n )\n }\n return\n }\n\n if (\n image.layout !== defaultImage.layout &&\n process.env.NODE_ENV === `development`\n ) {\n console.warn(\n `[gatsby-plugin-image] Mismatched image layout: expected \"${defaultImage.layout}\" but received \"${image.layout}\". All art-directed images use the same layout as the default image`\n )\n }\n\n output.images.sources.push(\n ...image.images.sources.map(source => {\n return { ...source, media }\n }),\n {\n media,\n srcSet: image.images.fallback.srcSet,\n }\n )\n\n if (!output.placeholder) {\n return\n }\n\n output.placeholder.sources.push({\n media,\n srcSet: image.placeholder.fallback,\n })\n })\n output.images.sources.push(...images.sources)\n if (placeholder?.sources) {\n output.placeholder?.sources.push(...placeholder.sources)\n }\n return output\n}\n","import React, { Fragment, FunctionComponent } from \"react\"\nimport terserMacro from \"../../macros/terser.macro\"\nimport { Layout } from \"../image-utils\"\n\nexport interface ILayoutWrapperProps {\n layout: Layout\n width: number\n height: number\n}\n\nconst NativeScriptLoading: FunctionComponent = () => (\n <script\n type=\"module\"\n dangerouslySetInnerHTML={{\n __html: terserMacro`\nconst hasNativeLazyLoadSupport = typeof HTMLImageElement !== \"undefined\" && \"loading\" in HTMLImageElement.prototype;\nif (hasNativeLazyLoadSupport) {\n const gatsbyImages = document.querySelectorAll('img[data-main-image]');\n for (let mainImage of gatsbyImages) {\n if (mainImage.dataset.src) {\n mainImage.setAttribute('src', mainImage.dataset.src)\n mainImage.removeAttribute('data-src')\n }\n if (mainImage.dataset.srcset) {\n mainImage.setAttribute('srcset', mainImage.dataset.srcset)\n mainImage.removeAttribute('data-srcset')\n }\n\n const sources = mainImage.parentNode.querySelectorAll('source[data-srcset]');\n for (let source of sources) {\n source.setAttribute('srcset', source.dataset.srcset)\n source.removeAttribute('data-srcset')\n }\n\n if (mainImage.complete) {\n mainImage.style.opacity = 1;\n\n // also hide the placeholder\n mainImage.parentNode.parentNode.querySelector('[data-placeholder-image]').style.opacity = 0;\n }\n }\n}\n`,\n }}\n />\n)\n\nexport function getSizer(\n layout: Layout,\n width: number,\n height: number\n): string {\n let sizer = ``\n if (layout === `fullWidth`) {\n sizer = `<div aria-hidden=\"true\" style=\"padding-top: ${\n (height / width) * 100\n }%;\"></div>`\n }\n\n if (layout === `constrained`) {\n sizer = `<div style=\"max-width: ${width}px; display: block;\"><img alt=\"\" role=\"presentation\" aria-hidden=\"true\" src=\"data:image/svg+xml;charset=utf-8,%3Csvg height='${height}' width='${width}' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E\" style=\"max-width: 100%; display: block; position: static;\"></div>`\n }\n\n return sizer\n}\n\nconst Sizer: FunctionComponent<ILayoutWrapperProps> = function Sizer({\n layout,\n width,\n height,\n}) {\n if (layout === `fullWidth`) {\n return (\n <div aria-hidden style={{ paddingTop: `${(height / width) * 100}%` }} />\n )\n }\n\n if (layout === `constrained`) {\n return (\n <div style={{ maxWidth: width, display: `block` }}>\n <img\n alt=\"\"\n role=\"presentation\"\n aria-hidden=\"true\"\n src={`data:image/svg+xml;charset=utf-8,%3Csvg height='${height}' width='${width}' xmlns='http://www.w3.org/2000/svg' version='1.1'%3E%3C/svg%3E`}\n style={{\n maxWidth: `100%`,\n display: `block`,\n position: `static`,\n }}\n />\n </div>\n )\n }\n\n return null\n}\n\nexport const LayoutWrapper: FunctionComponent<ILayoutWrapperProps> =\n function LayoutWrapper({ children, ...props }) {\n return (\n <Fragment>\n <Sizer {...props} />\n {children}\n\n {SERVER ? <NativeScriptLoading /> : null}\n </Fragment>\n )\n }\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\n\nexport interface IResponsiveImageProps {\n sizes?: string\n srcSet: string\n}\n\nexport type SourceProps = IResponsiveImageProps &\n (\n | {\n media: string\n type?: string\n }\n | {\n media?: string\n type: string\n }\n )\n\ntype FallbackProps = { src: string } & Partial<IResponsiveImageProps>\n\ntype ImageProps = ImgHTMLAttributes<HTMLImageElement> & {\n src: string\n alt: string\n shouldLoad: boolean\n}\n\nexport type PictureProps = ImgHTMLAttributes<HTMLImageElement> & {\n fallback?: FallbackProps\n sources?: Array<SourceProps>\n alt: string\n shouldLoad?: boolean\n}\n\nconst Image: FunctionComponent<ImageProps> = function Image({\n src,\n srcSet,\n loading,\n alt = ``,\n shouldLoad,\n ...props\n}) {\n return (\n <img\n {...props}\n decoding=\"async\"\n loading={loading}\n src={shouldLoad ? src : undefined}\n data-src={!shouldLoad ? src : undefined}\n srcSet={shouldLoad ? srcSet : undefined}\n data-srcset={!shouldLoad ? srcSet : undefined}\n alt={alt}\n />\n )\n}\n\nexport const Picture: React.FC<PictureProps> = function Picture({\n fallback,\n sources = [],\n shouldLoad = true,\n ...props\n}) {\n const sizes = props.sizes || fallback?.sizes\n const fallbackImage = (\n <Image {...props} {...fallback} sizes={sizes} shouldLoad={shouldLoad} />\n )\n\n if (!sources.length) {\n return fallbackImage\n }\n\n return (\n <picture>\n {sources.map(({ media, srcSet, type }) => (\n <source\n key={`${media}-${type}-${srcSet}`}\n type={type}\n media={media}\n srcSet={shouldLoad ? srcSet : undefined}\n data-srcset={!shouldLoad ? srcSet : undefined}\n sizes={sizes}\n />\n ))}\n {fallbackImage}\n </picture>\n )\n}\n\nImage.propTypes = {\n src: PropTypes.string.isRequired,\n alt: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string,\n shouldLoad: PropTypes.bool,\n}\n\nPicture.displayName = `Picture`\nPicture.propTypes = {\n alt: PropTypes.string.isRequired,\n shouldLoad: PropTypes.bool,\n fallback: PropTypes.exact({\n src: PropTypes.string.isRequired,\n srcSet: PropTypes.string,\n sizes: PropTypes.string,\n }),\n sources: PropTypes.arrayOf(\n PropTypes.oneOfType([\n PropTypes.exact({\n media: PropTypes.string.isRequired,\n type: PropTypes.string,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n PropTypes.exact({\n media: PropTypes.string,\n type: PropTypes.string.isRequired,\n sizes: PropTypes.string,\n srcSet: PropTypes.string.isRequired,\n }),\n ])\n ),\n}\n","import React, { FunctionComponent, ImgHTMLAttributes } from \"react\"\nimport * as PropTypes from \"prop-types\"\nimport { Picture, SourceProps } from \"./picture\"\n\nexport type PlaceholderProps = ImgHTMLAttributes<HTMLImageElement> & {\n fallback?: string\n sources?: Array<SourceProps>\n}\n\nexport const Placeholder: FunctionComponent<PlaceholderProps> =\n function Placeholder({ fallback, ...props }) {\n if (fallback) {\n return (\n <Picture\n {...props}\n fallback={{\n src: fallback,\n }}\n aria-hidden\n alt=\"\"\n />\n )\n } else {\n return <div {...props}></div>\n }\n }\n\nPlaceholder.displayName = `Placeholder`\nPlaceholder.propTypes = {\n fallback: PropTypes.string,\n sources: Picture.propTypes?.sources,\n alt: function (props, propName, componentName): Error | null {\n if (!props[propName]) {\n return null\n }\n\n return new Error(\n `Invalid prop \\`${propName}\\` supplied to \\`${componentName}\\`. Validation failed.`\n )\n },\n}\n","import React from \"react\"\nimport { Picture, PictureProps } from \"./picture\"\n\nexport type MainImageProps = PictureProps\n\nexport const MainImage: React.FC<PictureProps> = function MainImage(props) {\n return (\n <>\n <Picture {...props} />\n <noscript>\n <Picture {...props} shouldLoad={true} />\n </noscript>\n </>\n )\n}\n\nMainImage.displayName = `MainImage`\nMainImage.propTypes = Picture.propTypes\n","import React from \"react\"\nimport { getWrapperProps, getMainProps, getPlaceholderProps } from \"./hooks\"\nimport { Placeholder } from \"./placeholder\"\nimport { MainImage, MainImageProps } from \"./main-image\"\nimport { LayoutWrapper } from \"./layout-wrapper\"\nimport PropTypes from \"prop-types\"\nimport type { FunctionComponent, WeakValidationMap } from \"react\"\nimport type { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\n\nconst removeNewLines = (str: string): string => str.replace(/\\n/g, ``)\n\nexport const GatsbyImage: FunctionComponent<GatsbyImageProps> =\n function GatsbyImage({\n as = `div`,\n className,\n class: preactClass,\n style,\n image,\n loading = `lazy`,\n imgClassName,\n imgStyle,\n backgroundColor,\n objectFit,\n objectPosition,\n ...props\n }) {\n if (!image) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n return null\n }\n\n if (preactClass) {\n className = preactClass\n }\n\n imgStyle = {\n objectFit,\n objectPosition,\n backgroundColor,\n ...imgStyle,\n }\n\n const {\n width,\n height,\n layout,\n images,\n placeholder,\n backgroundColor: placeholderBackgroundColor,\n } = image\n\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n\n const cleanedImages: IGatsbyImageData[\"images\"] = {\n fallback: undefined,\n sources: [],\n }\n if (images.fallback) {\n cleanedImages.fallback = {\n ...images.fallback,\n srcSet: images.fallback.srcSet\n ? removeNewLines(images.fallback.srcSet)\n : undefined,\n }\n }\n\n if (images.sources) {\n cleanedImages.sources = images.sources.map(source => {\n return {\n ...source,\n srcSet: removeNewLines(source.srcSet),\n }\n })\n }\n\n return React.createElement(\n as,\n {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n },\n <LayoutWrapper layout={layout} width={width} height={height}>\n <Placeholder\n {...getPlaceholderProps(\n placeholder,\n false,\n layout,\n width,\n height,\n placeholderBackgroundColor,\n objectFit,\n objectPosition\n )}\n />\n\n <MainImage\n data-gatsby-image-ssr=\"\"\n className={imgClassName}\n {...(props as Omit<\n MainImageProps,\n \"images\" | \"fallback\" | \"onError\" | \"onLoad\"\n >)}\n // When eager is set we want to start the isLoading state on true (we want to load the img without react)\n {...getMainProps(\n loading === `eager`,\n false,\n cleanedImages,\n loading,\n imgStyle\n )}\n />\n </LayoutWrapper>\n )\n }\n\nexport const altValidator: PropTypes.Validator<string> = (\n props: GatsbyImageProps,\n propName,\n componentName,\n ...rest\n): Error | undefined => {\n if (!props.alt && props.alt !== ``) {\n return new Error(\n `The \"alt\" prop is required in ${componentName}. If the image is purely presentational then pass an empty string: e.g. alt=\"\". Learn more: https://a11y-style-guide.com/style-guide/section-media.html`\n )\n }\n\n return PropTypes.string(props, propName, componentName, ...rest)\n}\n\nexport const propTypes = {\n image: PropTypes.object.isRequired,\n alt: altValidator,\n} as WeakValidationMap<GatsbyImageProps>\n","import {\n createElement,\n memo,\n useMemo,\n useEffect,\n useLayoutEffect,\n useRef,\n} from \"react\"\nimport {\n getWrapperProps,\n gatsbyImageIsInstalled,\n hasNativeLazyLoadSupport,\n} from \"./hooks\"\nimport { getSizer } from \"./layout-wrapper\"\nimport { propTypes } from \"./gatsby-image.server\"\nimport type {\n FC,\n ElementType,\n FunctionComponent,\n ImgHTMLAttributes,\n CSSProperties,\n ReactEventHandler,\n} from \"react\"\nimport type { renderImageToString } from \"./lazy-hydrate\"\nimport type { PlaceholderProps } from \"./placeholder\"\nimport type { MainImageProps } from \"./main-image\"\nimport type { Layout } from \"../image-utils\"\n\nconst imageCache = new Set<string>()\nlet renderImageToStringPromise\nlet renderImage: typeof renderImageToString | undefined\n\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport interface GatsbyImageProps\n extends Omit<\n ImgHTMLAttributes<HTMLImageElement>,\n \"placeholder\" | \"onLoad\" | \"src\" | \"srcSet\" | \"width\" | \"height\"\n > {\n alt: string\n as?: ElementType\n className?: string\n class?: string\n imgClassName?: string\n image: IGatsbyImageData\n imgStyle?: CSSProperties\n backgroundColor?: string\n objectFit?: CSSProperties[\"objectFit\"]\n objectPosition?: CSSProperties[\"objectPosition\"]\n onLoad?: (props: { wasCached: boolean }) => void\n onError?: ReactEventHandler<HTMLImageElement>\n onStartLoad?: (props: { wasCached: boolean }) => void\n}\n\nexport interface IGatsbyImageData {\n layout: Layout\n width: number\n height: number\n backgroundColor?: string\n images: Pick<MainImageProps, \"sources\" | \"fallback\">\n placeholder?: Pick<PlaceholderProps, \"sources\" | \"fallback\">\n}\n\nconst GatsbyImageHydrator: FC<GatsbyImageProps> = function GatsbyImageHydrator({\n as = `div`,\n image,\n style,\n backgroundColor,\n className,\n class: preactClass,\n onStartLoad,\n onLoad,\n onError,\n ...props\n}) {\n const { width, height, layout } = image\n const {\n style: wStyle,\n className: wClass,\n ...wrapperProps\n } = getWrapperProps(width, height, layout)\n const root = useRef<HTMLElement>()\n const cacheKey = useMemo(() => JSON.stringify(image.images), [image.images])\n\n // Preact uses class instead of className so we need to check for both\n if (preactClass) {\n className = preactClass\n }\n\n const sizer = getSizer(layout, width, height)\n\n useEffect(() => {\n if (!renderImageToStringPromise) {\n renderImageToStringPromise = import(`./lazy-hydrate`).then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n renderImage = renderImageToString\n\n return {\n renderImageToString,\n swapPlaceholderImage,\n }\n }\n )\n }\n\n // The plugin image component is a bit special where if it's server-side rendered, we add extra script tags to support lazy-loading without\n // In this case we stop hydration but fire the correct events.\n const ssrImage = root.current.querySelector(\n `[data-gatsby-image-ssr]`\n ) as HTMLImageElement\n if (ssrImage && hasNativeLazyLoadSupport()) {\n if (ssrImage.complete) {\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n } else {\n onStartLoad?.({\n wasCached: true,\n })\n\n ssrImage.addEventListener(`load`, function onLoadListener() {\n ssrImage.removeEventListener(`load`, onLoadListener)\n\n onLoad?.({\n wasCached: true,\n })\n // remove ssr key for state updates but add delay to not fight with native code snippt of gatsby-ssr\n setTimeout(() => {\n ssrImage.removeAttribute(`data-gatsby-image-ssr`)\n }, 0)\n })\n }\n\n imageCache.add(cacheKey)\n\n return\n }\n\n if (renderImage && imageCache.has(cacheKey)) {\n return\n }\n\n let animationFrame\n let cleanupCallback\n renderImageToStringPromise.then(\n ({ renderImageToString, swapPlaceholderImage }) => {\n if (!root.current) {\n return\n }\n\n root.current.innerHTML = renderImageToString({\n isLoading: true,\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n if (!imageCache.has(cacheKey)) {\n animationFrame = requestAnimationFrame(() => {\n if (root.current) {\n cleanupCallback = swapPlaceholderImage(\n root.current,\n cacheKey,\n imageCache,\n style,\n onStartLoad,\n onLoad,\n onError\n )\n }\n })\n }\n }\n )\n\n // eslint-disable-next-line consistent-return\n return (): void => {\n if (animationFrame) {\n cancelAnimationFrame(animationFrame)\n }\n if (cleanupCallback) {\n cleanupCallback()\n }\n }\n }, [image])\n\n // useLayoutEffect is ran before React commits to the DOM. This allows us to make sure our HTML is using our cached image version\n useLayoutEffect(() => {\n if (imageCache.has(cacheKey) && renderImage) {\n root.current.innerHTML = renderImage({\n isLoading: imageCache.has(cacheKey),\n isLoaded: imageCache.has(cacheKey),\n image,\n ...props,\n })\n\n // Trigger onStartload and onLoad events\n onStartLoad?.({\n wasCached: true,\n })\n onLoad?.({\n wasCached: true,\n })\n }\n }, [image])\n\n // By keeping all props equal React will keep the component in the DOM\n return createElement(as, {\n ...wrapperProps,\n style: {\n ...wStyle,\n ...style,\n backgroundColor,\n },\n className: `${wClass}${className ? ` ${className}` : ``}`,\n ref: root,\n dangerouslySetInnerHTML: {\n __html: sizer,\n },\n suppressHydrationWarning: true,\n })\n}\n\nexport const GatsbyImage: FunctionComponent<GatsbyImageProps> = memo(\n function GatsbyImage(props) {\n if (!props.image) {\n if (process.env.NODE_ENV === `development`) {\n console.warn(`[gatsby-plugin-image] Missing image prop`)\n }\n\n return null\n }\n\n if (!gatsbyImageIsInstalled() && process.env.NODE_ENV === `development`) {\n console.warn(\n `[gatsby-plugin-image] You're missing out on some cool performance features. Please add \"gatsby-plugin-image\" to your gatsby-config.js`\n )\n }\n\n return createElement(GatsbyImageHydrator, props)\n }\n)\n\nGatsbyImage.propTypes = propTypes\nGatsbyImage.displayName = `GatsbyImage`\n","import React, { FunctionComponent, ReactElement } from \"react\"\nimport {\n altValidator,\n GatsbyImage as GatsbyImageServer,\n} from \"./gatsby-image.server\"\nimport { GatsbyImageProps, IGatsbyImageData } from \"./gatsby-image.browser\"\nimport PropTypes from \"prop-types\"\nimport { ISharpGatsbyImageArgs } from \"../image-utils\"\n\nexport interface IStaticImageProps\n extends Omit<GatsbyImageProps, \"image\">,\n Omit<ISharpGatsbyImageArgs, \"backgroundColor\"> {\n src: string\n}\n\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nexport function _getStaticImage(\n GatsbyImage: FunctionComponent<GatsbyImageProps>\n): React.FC<IStaticImageProps & IPrivateProps> {\n return function StaticImage({\n src,\n __imageData: imageData,\n __error,\n // We extract these because they're not meant to be passed-down to GatsbyImage\n /* eslint-disable @typescript-eslint/no-unused-vars */\n width,\n height,\n aspectRatio,\n tracedSVGOptions,\n placeholder,\n formats,\n quality,\n transformOptions,\n jpgOptions,\n pngOptions,\n webpOptions,\n avifOptions,\n blurredOptions,\n breakpoints,\n outputPixelDensities,\n /* eslint-enable @typescript-eslint/no-unused-vars */\n ...props\n }): ReactElement {\n if (__error) {\n console.warn(__error)\n }\n\n if (imageData) {\n return <GatsbyImage image={imageData} {...props} />\n }\n console.warn(`Image not loaded`, src)\n if (!__error && process.env.NODE_ENV === `development`) {\n console.warn(\n `Please ensure that \"gatsby-plugin-image\" is included in the plugins array in gatsby-config.js, and that your version of gatsby is at least 2.24.78`\n )\n }\n return null\n }\n}\n\nconst StaticImage: React.FC<IStaticImageProps & IPrivateProps> =\n _getStaticImage(GatsbyImageServer)\n\nconst checkDimensionProps: PropTypes.Validator<number> = (\n props: IStaticImageProps & IPrivateProps,\n propName: keyof IStaticImageProps & IPrivateProps,\n ...rest\n) => {\n if (\n props.layout === `fullWidth` &&\n (propName === `width` || propName === `height`) &&\n props[propName]\n ) {\n return new Error(\n `\"${propName}\" ${props[propName]} may not be passed when layout is fullWidth.`\n )\n }\n return PropTypes.number(props, propName, ...rest)\n}\n\nconst validLayouts = new Set([`fixed`, `fullWidth`, `constrained`])\n\nexport const propTypes = {\n src: PropTypes.string.isRequired,\n alt: altValidator,\n width: checkDimensionProps,\n height: checkDimensionProps,\n sizes: PropTypes.string,\n layout: (props: IStaticImageProps & IPrivateProps): Error | undefined => {\n if (props.layout === undefined) {\n return undefined\n }\n if (validLayouts.has(props.layout)) {\n return undefined\n }\n\n return new Error(\n `Invalid value ${props.layout}\" provided for prop \"layout\". Defaulting to \"constrained\". Valid values are \"fixed\", \"fullWidth\" or \"constrained\".`\n )\n },\n}\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","import {\n GatsbyImage as GatsbyImageBrowser,\n IGatsbyImageData,\n} from \"./gatsby-image.browser\"\nimport React from \"react\"\nimport {\n _getStaticImage,\n propTypes,\n IStaticImageProps,\n} from \"./static-image.server\"\n// These values are added by Babel. Do not add them manually\ninterface IPrivateProps {\n __imageData?: IGatsbyImageData\n __error?: string\n}\n\nconst StaticImage: React.FC<IStaticImageProps & IPrivateProps> =\n _getStaticImage(GatsbyImageBrowser)\n\nStaticImage.displayName = `StaticImage`\nStaticImage.propTypes = propTypes\n\nexport { StaticImage }\n","'use strict';\n\nconst preserveCamelCase = string => {\n\tlet isLastCharLower = false;\n\tlet isLastCharUpper = false;\n\tlet isLastLastCharUpper = false;\n\n\tfor (let i = 0; i < string.length; i++) {\n\t\tconst character = string[i];\n\n\t\tif (isLastCharLower && /[a-zA-Z]/.test(character) && character.toUpperCase() === character) {\n\t\t\tstring = string.slice(0, i) + '-' + string.slice(i);\n\t\t\tisLastCharLower = false;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = true;\n\t\t\ti++;\n\t\t} else if (isLastCharUpper && isLastLastCharUpper && /[a-zA-Z]/.test(character) && character.toLowerCase() === character) {\n\t\t\tstring = string.slice(0, i - 1) + '-' + string.slice(i - 1);\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = false;\n\t\t\tisLastCharLower = true;\n\t\t} else {\n\t\t\tisLastCharLower = character.toLowerCase() === character && character.toUpperCase() !== character;\n\t\t\tisLastLastCharUpper = isLastCharUpper;\n\t\t\tisLastCharUpper = character.toUpperCase() === character && character.toLowerCase() !== character;\n\t\t}\n\t}\n\n\treturn string;\n};\n\nconst camelCase = (input, options) => {\n\tif (!(typeof input === 'string' || Array.isArray(input))) {\n\t\tthrow new TypeError('Expected the input to be `string | string[]`');\n\t}\n\n\toptions = Object.assign({\n\t\tpascalCase: false\n\t}, options);\n\n\tconst postProcess = x => options.pascalCase ? x.charAt(0).toUpperCase() + x.slice(1) : x;\n\n\tif (Array.isArray(input)) {\n\t\tinput = input.map(x => x.trim())\n\t\t\t.filter(x => x.length)\n\t\t\t.join('-');\n\t} else {\n\t\tinput = input.trim();\n\t}\n\n\tif (input.length === 0) {\n\t\treturn '';\n\t}\n\n\tif (input.length === 1) {\n\t\treturn options.pascalCase ? input.toUpperCase() : input.toLowerCase();\n\t}\n\n\tconst hasUpperCase = input !== input.toLowerCase();\n\n\tif (hasUpperCase) {\n\t\tinput = preserveCamelCase(input);\n\t}\n\n\tinput = input\n\t\t.replace(/^[_.\\- ]+/, '')\n\t\t.toLowerCase()\n\t\t.replace(/[_.\\- ]+(\\w|$)/g, (_, p1) => p1.toUpperCase())\n\t\t.replace(/\\d+(\\w|$)/g, m => m.toUpperCase());\n\n\treturn postProcess(input);\n};\n\nmodule.exports = camelCase;\n// TODO: Remove this for the next major release\nmodule.exports.default = camelCase;\n","import {useStaticQuery, graphql} from 'gatsby';\nimport {formatDate} from '../utils/date-utils';\n\nconst DataCurrencyFootnoteExcavation = () => {\n const data = useStaticQuery(graphql`\n {\n postgres {\n scDataCurrency(dataset: \"excavation\") {\n currencyDate\n }\n }\n }\n `);\n return <>PHMSA Work Management System as of {formatDate(data.postgres.scDataCurrency.currencyDate)}.</>;\n};\n\nexport default DataCurrencyFootnoteExcavation;\n","import {useStaticQuery, graphql} from 'gatsby';\nimport {formatDate} from '../utils/date-utils';\n\nconst RawDataDownloadLink = () => {\n const raw_data_path = (\n process.env.GATSBY_DOCUMENT_SERVER_PATH ?? 'https://primis.phmsa.dot.gov/enforcement-documents'\n ).concat('/PHMSA%20Pipeline%20Enforcement%20Raw%20Data.txt');\n\n const data = useStaticQuery(graphql`\n {\n postgres {\n scDataCurrency(dataset: \"rawdata\") {\n currencyDate\n }\n }\n }\n `);\n return (\n <a href={raw_data_path} id=\"raw-data-link\" download>\n Enforcement Cases Initiated from 2002 (data as of {formatDate(data.postgres.scDataCurrency.currencyDate)})\n </a>\n );\n};\n\nexport default RawDataDownloadLink;\n","import {Link, withPrefix} from 'gatsby';\r\nimport {useStaticQuery, graphql} from 'gatsby';\r\n\r\nimport Layout from '../components/layout';\r\n\r\nimport {GlobalHead} from '../utils/head-utils';\r\nimport {Accordion} from '@trussworks/react-uswds';\r\nimport CaseListGrid from '../components/Tables/case-list-grid';\r\nimport {getRegionName} from '../utils/abbreviation-utils';\r\nimport {region_arr} from '../utils/text-utils';\r\nimport DataCurrencyFootnoteExcavation from '../components/data-currency-footnote-excavation';\r\nimport RawDataDownloadLink from '../components/raw-data-download-link';\r\n\r\nimport customMatcherFilter from '../utils/custom-filters/custom-matcher-filter';\r\nimport customDropdownFloatingFilter from '../utils/custom-filters/custom-dropdown-floating-filter';\r\nimport {renderLinkedCellData} from '../utils/render-link-utils';\r\nimport customTextFilter from '../utils/custom-filters/custom-text-filter';\r\nimport textFloatingFilter from '../utils/custom-filters/custom-text-floating-filter';\r\nimport {GatsbyImage, getImage} from 'gatsby-plugin-image';\r\n\r\nconst GetEnforcementPageQueryData = () => {\r\n const data = useStaticQuery(graphql`\r\n query ExcavationAndOldActionsQuery {\r\n postgres {\r\n excavation_cases: scCasesList(filter: {typeOfCase: {includes: \"Excavation\"}}, orderBy: OPENED_DT_DESC) {\r\n cpfNum\r\n operatorName\r\n }\r\n }\r\n site {\r\n siteMetadata {\r\n actions_2001_and_older {\r\n id\r\n region\r\n documentType\r\n caseNumber\r\n documentUrl\r\n operator\r\n }\r\n }\r\n }\r\n # filter out svgs because gatsby-plugin-sharp cannot process them\r\n allFile(filter: {extension: {nin: \"svg\"}}) {\r\n nodes {\r\n name\r\n childImageSharp {\r\n gatsbyImageData\r\n }\r\n }\r\n }\r\n }\r\n `);\r\n return data;\r\n};\r\n\r\nconst linkList = () => {\r\n const cards = [\r\n {\r\n header: 'Enforcement Activity',\r\n card_img_alt: 'pipeline landscape',\r\n card_key: 'enforcement-activity',\r\n links: [{linkText: 'Cases Initiated and Closed by Year', linkUrl: '/summaries'}],\r\n },\r\n {\r\n header: 'Enforcement Actions',\r\n card_img_alt: 'person inspecting pipelines',\r\n card_key: 'enforcement-actions',\r\n links: [\r\n {linkText: 'Cases Initiated by Case Type', linkUrl: '/actions/cases-initiated'},\r\n {linkText: 'Orders Issued by Order Type', linkUrl: '/actions/orders'},\r\n {linkText: 'Cases Closed by Case Type', linkUrl: '/actions/cases-closed'},\r\n ],\r\n },\r\n {\r\n header: 'Enforcement Case Status by Year',\r\n card_img_alt: 'pipeline landscape',\r\n card_key: 'enforcement-case-status',\r\n links: [\r\n {linkText: 'Overall Case Status', linkUrl: '/case-status/ALL'},\r\n {linkText: 'Corrective Action Orders', linkUrl: '/case-status/CAO'},\r\n {linkText: 'Notices of Proposed Safety Order', linkUrl: '/case-status/PSO'},\r\n {linkText: 'Notices of Probable Violation', linkUrl: '/case-status/NOPV'},\r\n {linkText: 'Notices of Amendment', linkUrl: '/case-status/NOA'},\r\n ],\r\n },\r\n {\r\n header: 'Civil Penalty Cases',\r\n card_img_alt: 'pipeline warning plaque',\r\n card_key: 'civil-penalty-cases',\r\n links: [\r\n {linkText: 'Civil Penalty Cases Initiated', linkUrl: '/civil-penalties/cases-initiated'},\r\n {linkText: 'Civil Penalty Cases Resolved', linkUrl: '/civil-penalties/cases-resolved'},\r\n {linkText: 'Civil Penalties Resolved', linkUrl: '/civil-penalties/penalties-resolved'},\r\n {linkText: 'Civil Penalty Cases Resolved by DOJ', linkUrl: '/civil-penalties/doj-cases'},\r\n ],\r\n },\r\n {\r\n header: 'Cases Initiated',\r\n card_img_alt: 'person welding',\r\n card_key: 'cases-initiated',\r\n links: [\r\n {linkText: 'Listing of Cases Initiated', linkUrl: '/cases'},\r\n {linkText: 'Corrective Action Orders', linkUrl: '/cases/CAO'},\r\n {linkText: 'Notices of Proposed Safety Order', linkUrl: '/cases/PSO'},\r\n {linkText: 'Notices of Probable Violation', linkUrl: '/cases/NOPV'},\r\n {linkText: 'Warning Letters', linkUrl: '/cases/WL'},\r\n {linkText: 'Notices of Amendment', linkUrl: '/cases/NOA'},\r\n ],\r\n },\r\n {\r\n header: 'Lookup',\r\n card_img_alt: 'person typing on a laptop',\r\n card_key: 'lookup',\r\n links: [\r\n {linkText: 'Enforcement by Operator', linkUrl: '/operators'},\r\n {linkText: 'Cited Regulations', linkUrl: '/cited-regulations'},\r\n {linkText: '30 Day Incident Reports', linkUrl: '/incident-report'},\r\n {linkText: 'Enforcement Case Document Search', linkUrl: '/search'},\r\n ],\r\n },\r\n ];\r\n\r\n const image_names = GetEnforcementPageQueryData();\r\n\r\n return (\r\n <div className=\"margin-top-3\" id=\"nav-cards\">\r\n <ul className=\"usa-card-group\">\r\n {cards.map((card) => {\r\n const image = getImage(image_names.allFile.nodes.find((node) => node.name == card.card_key));\r\n return (\r\n <li key={card.card_key} className=\"usa-card tablet:grid-col-6 desktop:grid-col-4\">\r\n <div className=\"usa-card__container\">\r\n <div className=\"usa-card__header\">\r\n <h2 className=\"usa-card__heading\">{card.header}</h2>\r\n </div>\r\n <div className=\"usa-card__media height-card overflow-hidden\">\r\n <div className=\"usa-card__img height-full width-full\">\r\n <GatsbyImage image={image} alt={card.card_img_alt} className=\"height-full width-full\" />\r\n </div>\r\n </div>\r\n <ul className=\"usa-card__body\">\r\n {card.links.map((link) => (\r\n <li key={link.linkUrl} className=\"usa-list usa-list--unstyled\">\r\n <Link to={link.linkUrl}>{link.linkText}</Link>\r\n </li>\r\n ))}\r\n </ul>\r\n </div>\r\n </li>\r\n );\r\n })}\r\n </ul>\r\n </div>\r\n );\r\n};\r\n\r\nconst rawDataAccordion = {\r\n title: <div style={{display: 'flex', justifyContent: 'space-between'}}>Enforcement Raw Data</div>,\r\n content: (\r\n <>\r\n <h4>How to Access Files</h4>\r\n\r\n <p>To load the data file into MS Excel:</p>\r\n <ol>\r\n <li>\r\n Download “Enforcement Cases Initiated from 2002” under the “Enforcement Cases Initiated from\r\n 2002”.\r\n </li>\r\n <li>Open Excel and click “Open”. This will start the “Open” dialog box.</li>\r\n <li>Change file type to “All Files”.</li>\r\n <li>Select the data TXT file and click “Open”.</li>\r\n <li>Excel will start the Text Import Wizard and display the first dialog.</li>\r\n <li>\r\n Under “Choose the file type that best describes your data:”, select “Delimited”, click\r\n next.\r\n </li>\r\n <li>In the second dialog, select “Tab” under “Delimiters”.</li>\r\n <li>Uncheck “Treat consecutive delimiters as one”, click next.</li>\r\n <li>In the third dialog set “Column data format” to “General”.</li>\r\n <li>Click “Finish”; to import the data.</li>\r\n </ol>\r\n\r\n <p>\r\n <RawDataDownloadLink />\r\n </p>\r\n <p>\r\n <a\r\n href={withPrefix('/Enforcement%20Data%20Dictionary.pdf')}\r\n id=\"raw-data-dictionary-link\"\r\n target=\"_blank\"\r\n rel=\"noopener noreferrer\"\r\n >\r\n Enforcement Data Dictionary\r\n </a>{' '}\r\n (link will open in a new browser tab or window)\r\n </p>\r\n </>\r\n ),\r\n expanded: false,\r\n id: 'raw-data',\r\n headingLevel: 'h2',\r\n};\r\n\r\nconst GetOldActionsAccordionContent = () => {\r\n const acc_data = GetEnforcementPageQueryData();\r\n let col_defs = [\r\n {\r\n field: 'region',\r\n headerName: 'Region',\r\n sortable: true,\r\n cellRenderer: getRegionName,\r\n filter: customMatcherFilter,\r\n suppressMenu: true,\r\n floatingFilter: true,\r\n floatingFilterComponent: customDropdownFloatingFilter,\r\n floatingFilterComponentParams: {\r\n filter_id: 'region',\r\n suppressFilterButton: true,\r\n options: region_arr,\r\n initial_value: 'All Regions',\r\n },\r\n },\r\n {\r\n field: 'caseNumber',\r\n headerName: 'Case Number',\r\n resizable: true,\r\n cellRenderer: renderLinkedCellData,\r\n cellRendererParams: (params) => {\r\n return {\r\n path: `${params.data.documentUrl}`,\r\n value: params.data.caseNumber,\r\n displayName: params.data.caseNumber,\r\n };\r\n },\r\n filter: customTextFilter,\r\n suppressMenu: true,\r\n floatingFilter: true,\r\n floatingFilterComponent: textFloatingFilter,\r\n },\r\n {\r\n field: 'operator',\r\n headerName: 'Operator',\r\n filter: customTextFilter,\r\n suppressMenu: true,\r\n floatingFilter: true,\r\n floatingFilterComponent: textFloatingFilter,\r\n },\r\n {\r\n field: 'documentType',\r\n headerName: 'Document Type',\r\n filter: customMatcherFilter,\r\n suppressMenu: true,\r\n floatingFilter: true,\r\n floatingFilterComponent: customDropdownFloatingFilter,\r\n floatingFilterComponentParams: {\r\n filter_id: 'doc-type',\r\n suppressFilterButton: true,\r\n options: [\r\n 'Amended Final Order',\r\n 'Consent Agreement',\r\n 'Consent Order',\r\n 'Corrective Action Order',\r\n 'Decision on Petition',\r\n 'Final Order',\r\n ],\r\n initial_value: 'All Documents',\r\n },\r\n },\r\n ];\r\n\r\n const csv_column_defs = col_defs.slice();\r\n\r\n let csv_name_root = 'cases-2001-and-older';\r\n let grid_class_name = 'grid-col-12';\r\n return {\r\n title: (\r\n <div id=\"pre-2002-actions\" style={{display: 'flex', justifyContent: 'space-between'}}>\r\n Enforcement Actions (2001 & Older)\r\n </div>\r\n ),\r\n content: (\r\n <>\r\n <p>\r\n These pages include archived documents for older enforcement cases that were pursued within each of\r\n PHMSA’s Office of Pipeline Safety regions. Unlike the records contained on the{' '}\r\n <Link to=\"/cases\">Enforcement Actions (2002 — Present)</Link> page, these documents have not been checked for\r\n accuracy or completeness due to differing recordkeeping practices and procedures that were in place at the\r\n time. Further, these pages do not represent a complete listing of all of the enforcement cases initiated\r\n during this time period. To see the document(s) archived for a particular case, select the case of interest in\r\n the “Case Number” column.\r\n </p>\r\n <div id=\"all_cases_table_desc\" className=\"usa-prose\">\r\n <CaseListGrid\r\n data={acc_data.site.siteMetadata.actions_2001_and_older}\r\n col_defs={col_defs}\r\n key={'case_list_grid'}\r\n csv_name_root={csv_name_root}\r\n grid_class_name={grid_class_name}\r\n csv_only_column_defs={csv_column_defs}\r\n />\r\n </div>\r\n </>\r\n ),\r\n expanded: false,\r\n id: 'pre-2002-actions',\r\n headingLevel: 'h2',\r\n };\r\n};\r\n\r\nconst GetExcavationAccordionContent = () => {\r\n const col_defs = [\r\n {\r\n field: 'cpfNum',\r\n headerName: 'Case Number',\r\n flex: 1,\r\n cellRenderer: renderLinkedCellData,\r\n cellRendererParams: (params) => {\r\n return {\r\n path: `/excavation/case/${params.value}`,\r\n };\r\n },\r\n },\r\n {\r\n field: 'operatorName',\r\n headerName: 'Excavator',\r\n flex: 3,\r\n },\r\n ];\r\n const acc_data = GetEnforcementPageQueryData();\r\n return {\r\n title: <div style={{display: 'flex', justifyContent: 'space-between'}}>Third Party Excavation Enforcement</div>,\r\n content: (\r\n <>\r\n <h3>\r\n Cases Initiated{' '}\r\n <sup>\r\n (\r\n <a href=\"#fn1\" id=\"fn1-link\">\r\n 1\r\n </a>\r\n )\r\n </sup>\r\n </h3>\r\n <CaseListGrid\r\n data={acc_data.postgres.excavation_cases}\r\n col_defs={col_defs}\r\n key={'excavation_case_list_grid'}\r\n csv_name_root={'third-party-excavation-enforcement-cases'}\r\n grid_class_name={'grid-col-12 excavation-grid'}\r\n />\r\n <h3>Sources</h3>\r\n <ol className=\"font-body-2xs\" id=\"footnotes\">\r\n <li id=\"fn1\">\r\n <DataCurrencyFootnoteExcavation />\r\n </li>\r\n </ol>\r\n </>\r\n ),\r\n expanded: false,\r\n id: 'excavation-cases',\r\n headingLevel: 'h2',\r\n };\r\n};\r\n\r\nconst EnfHome = () => {\r\n return (\r\n <Layout pageTitle=\"Enforcement Activity\">\r\n <p className=\"usa-intro\">\r\n PHMSA’s Pipeline Safety Enforcement Program is a key component of our oversight mission.\r\n </p>\r\n <p>\r\n The Pipeline Safety Enforcement Program is designed to monitor and enforce compliance with pipeline safety\r\n regulations and confirm operators are meeting PHMSA expectations for safe, reliable, and environmentally sound\r\n operation of their facilities.\r\n </p>\r\n <p>\r\n On this website PHMSA offers a variety of reports and records detailing its enforcement activity involving\r\n pipeline operators. These reports and records are offered on both nationwide and operator-specific bases and\r\n includes the following:\r\n </p>\r\n {linkList()}\r\n <Accordion\r\n items={[rawDataAccordion, GetOldActionsAccordionContent(), GetExcavationAccordionContent()]}\r\n bordered\r\n />\r\n <p className=\"margin-top-4\">\r\n PHMSA monitors compliance through field inspections of facilities and construction projects; programmatic\r\n inspections of operator management systems, procedures, and processes; incident investigations; and through\r\n direct dialogue with operator management. To facilitate compliance, PHMSA clarifies its regulatory expectations\r\n with published inspection forms and protocols; rule interpretations; guidance manuals and advisory notices;\r\n FAQs; posting of final orders on its website; and public meetings and workshops. Finally, PHMSA has available a\r\n full range of enforcement mechanisms to require that operators take appropriate and timely corrective actions\r\n for violations, and that they take preventive measures to preclude future failures or non-compliant operation of\r\n their pipelines.\r\n </p>\r\n <p>\r\n To find out if a gas transmission pipeline or hazardous liquid trunkline is located near you, visit the{' '}\r\n <a href=\"https://www.npms.phmsa.dot.gov/\">National Pipeline Mapping System</a> and search by your county or zip\r\n code.\r\n </p>\r\n </Layout>\r\n );\r\n};\r\n\r\nexport const Head = () => {\r\n return <GlobalHead />;\r\n};\r\n\r\nexport default EnfHome;\r\n"],"names":["N","height","HTMLImageElement","prototype","W","e","t","a","Boolean","images","fallback","src","gatsbyImageData","gatsbyImage","childImageSharp","j","i","r","u","loading","shouldLoad","style","opacity","O","n","s","o","l","backgroundColor","width","position","top","left","bottom","right","objectFit","objectPosition","d","transition","z","D","_ref5","layout","paddingTop","maxWidth","display","alt","role","A","children","c","q","P","H","srcSet","decoding","G","sources","sizes","length","map","_ref6","media","type","key","V","propTypes","isRequired","displayName","B","F","Error","U","Y","_len","arguments","Array","_key","h","apply","concat","X","image","J","Z","K","Set","Q","ee","te","as","className","class","g","onStartLoad","p","onLoad","m","onError","f","w","y","b","v","E","M","k","S","$","I","JSON","stringify","x","then","_ref7","renderImageToString","swapPlaceholderImage","current","querySelector","complete","wasCached","setTimeout","removeAttribute","addEventListener","removeEventListener","add","has","_ref8","innerHTML","isLoading","isLoaded","requestAnimationFrame","cancelAnimationFrame","ref","dangerouslySetInnerHTML","__html","suppressHydrationWarning","ae","ie","re","_len2","_key2","ne","se","oe","__imageData","__error","console","warn","camelCase","input","options","isArray","TypeError","Object","assign","pascalCase","trim","filter","join","toUpperCase","toLowerCase","string","isLastCharLower","isLastCharUpper","isLastLastCharUpper","character","test","slice","preserveCamelCase","replace","_","p1","charAt","module","exports","DataCurrencyFootnoteExcavation","data","useStaticQuery","_jsxs","_Fragment","formatDate","postgres","scDataCurrency","currencyDate","RawDataDownloadLink","_process$env$GATSBY_D","raw_data_path","process","href","id","download","GetEnforcementPageQueryData","linkList","image_names","_jsx","header","card_img_alt","card_key","links","linkText","linkUrl","card","getImage","allFile","nodes","find","node","name","GatsbyImage","link","Link","to","rawDataAccordion","title","justifyContent","content","withPrefix","target","rel","expanded","headingLevel","GetOldActionsAccordionContent","acc_data","col_defs","field","headerName","sortable","cellRenderer","getRegionName","customMatcherFilter","suppressMenu","floatingFilter","floatingFilterComponent","customDropdownFloatingFilter","floatingFilterComponentParams","filter_id","suppressFilterButton","region_arr","initial_value","resizable","renderLinkedCellData","cellRendererParams","params","path","documentUrl","value","caseNumber","customTextFilter","textFloatingFilter","csv_column_defs","CaseListGrid","site","siteMetadata","actions_2001_and_older","csv_name_root","grid_class_name","csv_only_column_defs","GetExcavationAccordionContent","flex","excavation_cases","Head","GlobalHead","EnfHome","Layout","pageTitle","Accordion","items","bordered"],"sourceRoot":""}