{"version":3,"sources":["images/home1.svg","images/kcl-logo.svg","Components/AnimationHome.js","Components/LeafletMap.js","services/Http.js","services/PostcodeService.js","Components/PollutantLegend.js","services/PollutionLocationService.js","Components/InfoOverlays.js","pages/Homepage.js","App.js","serviceWorker.js","index.js"],"names":["module","exports","__webpack_require__","p","animateSVG","anime","timeline","direction","loop","add","targets","strokeDashoffset","setDashoffset","easing","duration","fill","delay","el","i","translateX","value","border","backgroundColor","Home","props","react_default","a","createElement","className","Transition_default","in","appear","onEntered","timeout","id","style","position","right","paddingTop","width","height","viewBox","stroke","strokeWidth","strokeDasharray","d","color","fontSize","left","top","zIndex","label","dimensions","a4landscape","a4portrait","full","iconHome","L","Icon","iconUrl","require","iconRetinaUrl","iconAnchor","popupAnchor","shadowUrl","shadowSize","shadowAnchor","iconSize","Point","url","gisMaps","NO2","dynamicMapLayer","opacity","layers","useCors","PM10","PM25","CARTO_BlackWhite","tileLayer","attribution","LeafletMap","_this","Object","classCallCheck","this","possibleConstructorReturn","getPrototypeOf","call","state","map","undefined","orientation","latitude","longitude","pollutant","showBasemap","loading","toggleBasemap","bind","assertThisInitialized","handleMarkerDrag","_this2","refs","leafletElement","orientationChanged","setState","removeLayer","addTo","setTimeout","invalidateSize","panToLocation","show","on","e","_e$latlng","latlng","lat","lng","updateLatLng","setView","LatLng","target","_latlng","_this$state","mapSize","Loader","active","Map","onZoomend","onZoomEvent","center","zoom","ref","borderBottom","paddingBottom","Marker","draggable","icon","onDragEnd","React","Component","httpFetch","axios","get","validatePostcode","postcode","Promise","resolve","reject","protocol","window","location","concat","then","response","catch","error","legendMap","colour","MapTextLegend","slice","reverse","item","tinycolor","setAlpha","key","lineHeight","toRgbString","verticalAlign","fontWeight","buildURL","baseURL","long","all","getMapExtent","latFloat","parseFloat","longFloat","POLLUTANT_ENUM","passObjective","passWHOObjective","EULimitValuesTable","results","pollutionValues","no2_values","_","filter","layerName","pm10_values","pm25_values","no2Passes","attributes","pm10Passes","pm25Passes","no2WHOOPasses","pm10WHOOPasses","pm25WHOOPasses","Table","textAlign","basic","collapsing","compact","celled","Body","Row","Cell","Math","round","LocationNotes","InfoOverlays_PassingLabel","InfoOverlays_ExceedingLabel","LocationWHONotes","PassingLabel","ExceedingLabel","options","text","displayOptions","printWidth","printHeight","displayWidth","displayHeight","pollutants","PosterLabel","_ref","reportingMode","marginTop","whiteSpace","Homepage","handleChange","_ref2","updateCaption","handleOrientationChange","_ref3","handlePostcodeChange","_ref4","postcodeValid","length","res","data","result","updatePreview","console","log","handleFooterChange","_ref5","footerText","showLegend","showEULimits","takeScreenshot","toggleLegend","toggleEULimits","updatePollutionValues","orientationSettings","domtoimage","toPng","document","getElementById","quality","blob","saveAs","getPostcodeForLocation","postcodes","find","toUpperCase","firstPostcode","adminDistrict","admin_district","_this3","gisURL","fetchAllFromMapServer","_zoom","_this4","event","_this5","preventDefault","_this6","_this$state2","keyPosition","bottom","AnimationHome","Grid","doubling","Column","computer","mobile","tablet","Segment","Divider","horizontal","Form","Input","iconPosition","onChange","control","placeholder","Field","Select","Group","inline","Radio","checked","Header","as","Checkbox","onClick","Button","minWidth","alt","src","kclLogo","background","padding","paddingLeft","paddingRight","PollutantLegend_MapTextLegend","Components_LeafletMap","Homepage_PosterLabel","objectSpread","InfoOverlays_EULimitValuesTable","href","InfoOverlays_LocationNotes","InfoOverlays_LocationWHONotes","App","pages_Homepage","Boolean","hostname","match","ReactDOM","render","src_App","navigator","serviceWorker","ready","registration","unregister"],"mappings":"6EAAAA,EAAAC,QAAiBC,EAAAC,EAAuB,uDCAxCH,EAAAC,QAAiBC,EAAAC,EAAuB,kcCIlCC,UAAa,WACAC,IAAMC,SAAS,CAC1BC,UAAW,YACXC,MAAM,IAGLC,IAAI,CACDC,QAAS,2BACTC,iBAAkB,CAACN,IAAMO,cAAe,GACxCC,OAAQ,gBACRC,SAAU,KACVC,KAAM,UACNC,MAAO,SAAUC,EAAIC,GACjB,OAAW,IAAJA,KAGdT,IAAI,CACDC,QAAS,mCACTS,WAAY,CACRC,MAAO,QACPN,SAAU,KAEdD,OAAQ,gBACRQ,OAAQ,oBACRL,MAAO,SAAUC,EAAIC,GACjB,OAAiB,KAATA,EAAI,MAGnBT,IAAI,CACDC,QAAS,0BACTG,OAAQ,gBACRC,SAAU,IACVQ,gBAAiB,YAEpBb,IAAI,CACDC,QAAS,6BACTG,OAAQ,gBACRC,SAAU,IACVQ,gBAAiB,YAEpBb,IAAI,CACDC,QAAS,2BACTG,OAAQ,gBACRC,SAAU,IACVQ,gBAAiB,cAwCdC,EAzBF,SAAAC,GAAK,OACdC,EAAAC,EAAAC,cAAA,OAAKC,UAAU,mBACXH,EAAAC,EAAAC,cAACE,EAAAH,EAAD,CAAYI,IAAI,EAAMC,QAAM,EAACC,UAAW5B,EAAY6B,QAAS,KACzDR,EAAAC,EAAAC,cAAA,WACIF,EAAAC,EAAAC,cAAA,OAAKO,GAAG,cAAcC,MAAO,CAACC,SAAU,WAAYC,MAAO,OAAQC,WAAY,SAC3Eb,EAAAC,EAAAC,cAAA,OAAKY,MAAM,QAAQC,OAAO,OAAOC,QAAQ,cACrChB,EAAAC,EAAAC,cAAA,KAAGO,GAAG,SAASQ,OAAO,QAAQC,YAAY,IAAKf,UAAU,SACrDH,EAAAC,EAAAC,cAAA,QAAMQ,MAAO,CAACxB,iBAAkB,aAAciC,gBAAgB,MACxDC,EAAE,+0JAERpB,EAAAC,EAAAC,cAAA,QAAMQ,MAAO,CAACxB,iBAAkB,SAAUiC,gBAAgB,MACpDC,EAAE,uyCACRpB,EAAAC,EAAAC,cAAA,QAAMQ,MAAO,CAACxB,iBAAkB,SAAUiC,gBAAgB,MAAMC,EAAE,guBAK9EpB,EAAAC,EAAAC,cAAA,QAAMC,UAAU,YAAYO,MAAO,CAACW,MAAO,QAASC,SAAU,OAAQC,KAAM,OAAQC,IAAK,OAAQb,SAAU,WAAYc,OAAQ,UAA/H,IAA2I1B,EAAM2B,MAAjJ,4DCzEVC,EAAa,CACfC,YAAa,CAACb,OAAQ,IAAKD,MAAO,KAClCe,WAAY,CAACd,OAAQ,IAAKD,MAAO,KACjCgB,KAAM,CAACf,OAAQ,IAAKD,MAAO,SAGzBiB,EAAW,IAAIC,IAAEC,KAAK,CACxBC,QAASC,EAAQ,KACjBC,cAAeD,EAAQ,KACvBE,WAAY,KACZC,YAAa,KACbC,UAAW,KACXC,WAAY,KACZC,aAAc,KACdC,SAAU,IAAIV,IAAEW,MAAM,GAAI,MAGxBC,EAAM,sEAuBNC,EAAU,CACZC,IAtBeC,YAAgB,CAC/BH,IAAKA,EACLI,QAAS,IACTC,OAAQ,CAAC,GACTC,SAAS,IAmBTC,KAhBgBJ,YAAgB,CAChCH,IAAKA,EACLI,QAAS,IACTC,OAAQ,CAAC,GACTC,SAAS,IAaTE,KAVgBL,YAAgB,CAChCH,IAAKA,EACLI,QAAS,IACTC,OAAQ,CAAC,GACTC,SAAS,KASPG,EAAoBrB,IAAEsB,UAAU,iEAAkE,CACpGC,YAAa,8DAwGFC,cAnGX,SAAAA,EAAYzD,GAAO,IAAA0D,EAAA,OAAAC,OAAAC,EAAA,EAAAD,CAAAE,KAAAJ,IACfC,EAAAC,OAAAG,EAAA,EAAAH,CAAAE,KAAAF,OAAAI,EAAA,EAAAJ,CAAAF,GAAAO,KAAAH,KAAM7D,KACDiE,MAAQ,CACTC,SAAKC,EACLC,YAAa,cACbC,SAAUrE,EAAMqE,SAChBC,UAAWtE,EAAMsE,UACjBC,UAAWvE,EAAMuE,UACjBC,YAAaxE,EAAMwE,YACnBC,QAASzE,EAAMyE,SAEnBf,EAAKgB,cAAgBhB,EAAKgB,cAAcC,KAAnBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACrBA,EAAKmB,iBAAmBnB,EAAKmB,iBAAiBF,KAAtBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KAZTA,yFAeO1D,GAAO,IAAA8E,EAAAjB,KACvBK,EAAML,KAAKkB,KAAKb,IAAIc,eACpBC,EAAqBpB,KAAKI,MAAMG,cAAgBpE,EAAMoE,YAC5DP,KAAKqB,SAAS,CACVd,YAAapE,EAAMoE,YACnBC,SAAUrE,EAAMqE,SAChBC,UAAWtE,EAAMsE,UACjBE,YAAaxE,EAAMwE,YACnBC,QAASzE,EAAMyE,SAChB,YACKzE,EAAMuE,YAAcO,EAAKb,MAAMM,WAAaU,KAC5Cf,EAAIiB,YAAYrC,EAAQgC,EAAKb,MAAMM,YACnCO,EAAKI,SAAS,CAACX,UAAWvE,EAAMuE,WAAY,WACxCzB,EAAQgC,EAAKb,MAAMM,WAAWa,MAAMlB,GACpCmB,WAAW,WACPnB,EAAIoB,kBACL,QAGXR,EAAKS,cAAcvF,EAAMqE,SAAUrE,EAAMsE,mDAKnCkB,GACV,IAAMtB,EAAML,KAAKkB,KAAKb,IAAIc,eACtBQ,EAGAlC,EAAiB8B,MAAMlB,GAFvBA,EAAIiB,YAAY7B,+CAOpB,IAAMY,EAAML,KAAKkB,KAAKb,IAAIc,eAC1BlC,EAAQe,KAAKI,MAAMM,WAAWa,MAAMlB,GACpCZ,EAAiB8B,MAAMlB,GAEvBA,EAAIuB,GAAG,QAAS,SAAUC,GAAG,IAAAC,EACND,EAAEE,OAAdC,EADkBF,EAClBE,IAAKC,EADaH,EACbG,IACZjC,KAAK7D,MAAM+F,aAAaF,EAAKC,IAC/BnB,KAAKd,6CAGGgC,EAAKC,GACLjC,KAAKkB,KAAKb,IAAIc,eACpBgB,QAAQ,IAAI/D,IAAEgE,OAAOJ,EAAKC,6CAGjBJ,GACb,IAAME,EAASF,EAAEQ,OAAOC,QACxBtC,KAAK7D,MAAM+F,aAAaH,EAAOC,IAAID,EAAOE,sCAGrC,IAAAM,EAC+CvC,KAAKI,MAAlDG,EADFgC,EACEhC,YAAaC,EADf+B,EACe/B,SAAUC,EADzB8B,EACyB9B,UAAWG,EADpC2B,EACoC3B,QACnC7D,EAAW,CAACyD,EAAUC,GACtB+B,EAAUzE,EAAWwC,GAC3B,OACInE,EAAAC,EAAAC,cAAA,OAAKC,UAAW,aAAcO,MAAO,CAACK,OAAQqF,EAAQrF,OAAQD,MAAOsF,EAAQtF,QACzEd,EAAAC,EAAAC,cAAA,OAAKO,GAAG,gBAEJT,EAAAC,EAAAC,cAACmG,EAAA,EAAD,CAAQC,OAAQ9B,IAChBxE,EAAAC,EAAAC,cAACqG,EAAA,EAAD,CAAKC,UAAW5C,KAAK7D,MAAM0G,YAAaC,OAAQ/F,EAAUgG,KAAM/C,KAAK7D,MAAM4G,KAAMC,IAAI,MAAMnG,GAAG,MACzFC,MAAO,CACHK,OAASqF,EAAQrF,OAAS,GAC1BD,MAAO,OACP+F,aAAc,uBACdC,cAAe,QAEpB9G,EAAAC,EAAAC,cAAC6G,EAAA,EAAD,CACIC,WAAW,EACXrG,SAAUA,EACVsG,KAAMlF,EACNmF,UAAWtD,KAAKgB,6BA3FnBuC,IAAMC,6BCvDlBC,EAAY,SAACzE,GACtB,OAAO0E,IAAMC,IAAI3E,IC+BR4E,EAAmB,SAACC,GAC7B,OAAO,IAAIC,QAAQ,SAAUC,EAASC,GAClC,IAAIC,EAAW,QACkB,WAA7BC,OAAOC,SAASF,WAChBA,EAAW,UAEfR,EAAS,GAAAW,OAAIH,EAAJ,iCAAAG,OAA4CP,EAA5C,cACJQ,KAAK,SAAUC,GACZP,EAAQO,KAEXC,MAAM,SAAUC,GACbR,EAAOQ,gFCoBjBC,EAAY,CACdvF,IA/DoB,CACpB,CAACnD,MAAO,MAAO2I,OAAQ,UACvB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,MAAO2I,OAAQ,WAgDvBlF,KAbqB,CACrB,CAACzD,MAAO,MAAO2I,OAAQ,UACvB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,MAAO2I,OAAQ,WAOvBnF,KAjCqB,CACrB,CAACxD,MAAO,MAAO2I,OAAQ,UACvB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,KAAM2I,OAAQ,UACtB,CAAC3I,MAAO,MAAO2I,OAAQ,YA0BdC,GAAgB,SAACxI,GAAD,OACzBC,EAAAC,EAAAC,cAAA,WAAMmI,EAAUtI,EAAMuE,WAAWkE,MAAM,GAAGC,UAAUxE,IAAI,SAACyE,EAAMjJ,GACvD,IAAI4B,EAAQsH,IAAS,IAAAX,OAAKU,EAAKJ,SAE/B,OADAjH,EAAMuH,SAAS,IAEX5I,EAAAC,EAAAC,cAAA,OAAK2I,IAAKpJ,EAAGiB,MAAO,CAACK,OAAQ,GAAID,MAAO,GAAIgI,WAAY,MAAOjJ,gBAAe,GAAAmI,OAAK3G,EAAM0H,iBACrF/I,EAAAC,EAAAC,cAAA,OAAKC,UAAU,cAAcO,MAAO,CAACY,SAAU,MAAO0H,cAAe,WAAYC,WAAY,QAASP,EAAK/I,YC1C/H,SAASuJ,GAASC,EAASvD,EAAKwD,EAAMC,GAmBlC,OAFgBF,EAhBE,cAaD,aAFKC,EAAO,IAAMxD,GAEc,2CATpCyD,EAAM,MAAQ,KAS8E,kCAHlFC,GAAa1D,EAAKwD,GAI4B,4BAbxD,+BA4CjB,SAASE,GAAa1D,EAAKwD,GAEvB,IAAIG,EAAWC,WAAW5D,GACtB6D,EAAYD,WAAWJ,GAO3B,OAAQK,IALe,QAKgB,KAAOF,EAHzB,GAGsD,KAAOE,IAJ1D,WAI0F,KAAOF,IAFlG,uDC3FrBG,GAA4B,WAA5BA,GAAmD,YAAnDA,GAA2E,YAwC3EC,GAAgB,SAACrF,EAAW3E,GAC9B,OAAQ2E,GACJ,KAAKoF,GAGL,KAAKA,GACD,OAAO/J,EAAQ,GAEnB,KAAK+J,GACD,OAAO/J,EAAQ,KAKrBiK,GAAmB,SAACtF,EAAW3E,GACjC,OAAQ2E,GACJ,KAAKoF,GACD,OAAO/J,EAAQ,GAEnB,KAAK+J,GACD,OAAO/J,EAAQ,GAEnB,KAAK+J,GACD,OAAO/J,EAAQ,KAyBdkK,GAAqB,SAAC9J,GAE/B,IAAM+J,EAAU/J,EAAMgK,gBAAgBD,QAChCE,EAAaC,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA0B,GACrEU,EAAcH,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GACvEW,EAAcJ,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GAEvEY,EAAYX,GAAcD,GAAyBM,EAAWO,WAAW,gBACzEC,EAAab,GAAcD,GAA0BU,EAAYG,WAAW,gBAC5EE,EAAad,GAAcD,GAA0BW,EAAYE,WAAW,gBAE5EG,EAAgBd,GAAiBF,GAAyBM,EAAWO,WAAW,gBAChFI,EAAiBf,GAAiBF,GAA0BU,EAAYG,WAAW,gBACnFK,EAAiBhB,GAAiBF,GAA0BW,EAAYE,WAAW,gBACzF,OACIvK,EAAAC,EAAAC,cAAC2K,GAAA,EAAD,CAAOpK,GAAG,UAAUN,UAAU,eAAeO,MAAO,CAACI,MAAO,QAASQ,SAAU,MAAOwJ,UAAW,UAAWC,MAAM,OAAOC,YAAU,EAACC,SAAO,EAACC,QAAM,GAC9IlL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMM,KAAP,KACInL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMO,IAAP,KACIpL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,MAEArL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAYrL,EAAAC,EAAAC,cAAA,uBACZF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAYrL,EAAAC,EAAAC,cAAA,sBACZF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAYrL,EAAAC,EAAAC,cAAA,wBAGhBF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMO,IAAP,KAEIpL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAarL,EAAAC,EAAAC,cAAA,iBACbF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAaC,KAAKC,MAAMvB,EAAWO,WAAW,gBAA9C,eAEAvK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWmK,EAAY,WAAa,YAAhD,kBACAtK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWuK,EAAgB,WAAa,YAApD,mBAGJ1K,EAAAC,EAAAC,cAAC2K,GAAA,EAAMO,IAAP,KAEIpL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAYrL,EAAAC,EAAAC,cAAA,kBACZF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAaC,KAAKC,MAAMnB,EAAYG,WAAW,gBAA/C,eAEAvK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWqK,EAAa,WAAa,YAAjD,kBACAxK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWwK,EAAiB,WAAa,YAArD,mBAGJ3K,EAAAC,EAAAC,cAAC2K,GAAA,EAAMO,IAAP,KAEIpL,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAYrL,EAAAC,EAAAC,cAAA,mBACZF,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,KAAaC,KAAKC,MAAMlB,EAAYE,WAAW,gBAA/C,eAEAvK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWsK,EAAa,WAAa,YAAjD,kBACAzK,EAAAC,EAAAC,cAAC2K,GAAA,EAAMQ,KAAP,CAAYlL,UAAWyK,EAAiB,WAAa,YAArD,sBAQPY,GAAgB,SAACzL,GAC1B,IAAM+J,EAAU/J,EAAMgK,gBAAgBD,QAChCE,EAAaC,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA0B,GACrEU,EAAcH,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GACvEW,EAAcJ,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GAEvEY,EAAYX,GAAcD,GAAyBM,EAAWO,WAAW,gBACzEC,EAAab,GAAcD,GAA0BU,EAAYG,WAAW,gBAC5EE,EAAad,GAAcD,GAA0BW,EAAYE,WAAW,gBAClF,OAAOvK,EAAAC,EAAAC,cAAA,WACHF,EAAAC,EAAAC,cAAA,UACIF,EAAAC,EAAAC,cAAA,oBACWF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMvB,EAAWO,WAAW,iBADhD,gBAC4ED,EAAYtK,EAAAC,EAAAC,cAACuL,GAAD,MACpFzL,EAAAC,EAAAC,cAACwL,GAAD,MAFJ,oBAEuC1L,EAAAC,EAAAC,cAAA,gBAFvC,gBAIAF,EAAAC,EAAAC,cAAA,qBACYF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMnB,EAAYG,WAAW,iBADlD,gBAC8EC,EAAaxK,EAAAC,EAAAC,cAACuL,GAAD,MACvFzL,EAAAC,EAAAC,cAACwL,GAAD,MAFJ,oBAEuC1L,EAAAC,EAAAC,cAAA,eAFvC,gBAIAF,EAAAC,EAAAC,cAAA,sBACaF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMlB,EAAYE,WAAW,iBADnD,gBAC+EE,EAC3EzK,EAAAC,EAAAC,cAACuL,GAAD,MAAkBzL,EAAAC,EAAAC,cAACwL,GAAD,MAFtB,oBAEyD1L,EAAAC,EAAAC,cAAA,gBAFzD,mBAQCyL,GAAmB,SAAC5L,GAC7B,IAAM+J,EAAU/J,EAAMgK,gBAAgBD,QAChCE,EAAaC,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA0B,GACrEU,EAAcH,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GACvEW,EAAcJ,KAAEC,OAAOJ,EAAS,CAACK,UAAWT,KAA2B,GAEvEY,EAAYV,GAAiBF,GAAyBM,EAAWO,WAAW,gBAC5EC,EAAaZ,GAAiBF,GAA0BU,EAAYG,WAAW,gBAC/EE,EAAab,GAAiBF,GAA0BW,EAAYE,WAAW,gBACrF,OAAOvK,EAAAC,EAAAC,cAAA,WACHF,EAAAC,EAAAC,cAAA,UACIF,EAAAC,EAAAC,cAAA,oBACWF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMvB,EAAWO,WAAW,iBADhD,gBAC4ED,EAAYtK,EAAAC,EAAAC,cAACuL,GAAD,MACpFzL,EAAAC,EAAAC,cAACwL,GAAD,MAFJ,qBAEwC1L,EAAAC,EAAAC,cAAA,gBAFxC,gBAIAF,EAAAC,EAAAC,cAAA,qBACYF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMnB,EAAYG,WAAW,iBADlD,gBAC8EC,EAAaxK,EAAAC,EAAAC,cAACuL,GAAD,MACvFzL,EAAAC,EAAAC,cAACwL,GAAD,MAFJ,qBAEwC1L,EAAAC,EAAAC,cAAA,eAFxC,gBAIAF,EAAAC,EAAAC,cAAA,sBACaF,EAAAC,EAAAC,cAAA,SAAIoL,KAAKC,MAAMlB,EAAYE,WAAW,iBADnD,gBAC+EE,EAC3EzK,EAAAC,EAAAC,cAACuL,GAAD,MAAkBzL,EAAAC,EAAAC,cAACwL,GAAD,MAFtB,qBAE0D1L,EAAAC,EAAAC,cAAA,gBAF1D,mBAON0L,GAAe,kBAAO5L,EAAAC,EAAAC,cAAA,QAAMQ,MAAO,CAACW,MAAO,UAArB,IAAgCrB,EAAAC,EAAAC,cAAA,sBACtD2L,GAAiB,kBAAQ7L,EAAAC,EAAAC,cAAA,QAAMQ,MAAO,CAACW,MAAO,QAArB,IAA8BrB,EAAAC,EAAAC,cAAA,wBC/KvD4L,GAAU,CACZ,CAACjD,IAAK,IAAKkD,KAAM,YAAapM,MAAO,eACrC,CAACkJ,IAAK,IAAKkD,KAAM,WAAYpM,MAAO,eAGlCqM,GAAiB,CACnBpK,YAAe,CAACqK,WAAY,KAAMC,YAAa,IAAKC,aAAc,IAAKC,cAAe,KACtFvK,WAAc,CAACoK,WAAY,IAAKC,YAAa,KAAMC,aAAc,IAAKC,cAAe,MAGnFC,GAAa,CACfvJ,IAAK,mBACLK,KAAM,oBACNC,KAAM,sBAGJkJ,GAAc,SAAAC,GAAA,IAAER,EAAFQ,EAAER,KAAFQ,EAAQC,cAAR,OAChBxM,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CACRC,SAAU,WACV8L,WAAY,GACZhL,OAAQ,OACRX,MAAO,OACPS,KAAM,SAENvB,EAAAC,EAAAC,cAAA,MAAIQ,MAAO,CAACC,SAAU,WAAY+L,WAAY,UAAWvM,UAAU,eAAe4L,KAgX3EY,eA9VX,SAAAA,EAAY5M,GAAO,IAAA0D,EAAA,OAAAC,OAAAC,EAAA,EAAAD,CAAAE,KAAA+I,IACflJ,EAAAC,OAAAG,EAAA,EAAAH,CAAAE,KAAAF,OAAAI,EAAA,EAAAJ,CAAAiJ,GAAA5I,KAAAH,KAAM7D,KAyCV6M,aAAe,SAACnH,EAADoH,GAAgB,IAAXlN,EAAWkN,EAAXlN,MAChB8D,EAAKwB,SAAS,CAACX,UAAW3E,GAAQ,WAC9B8D,EAAKqJ,mBA5CMrJ,EA+CnBsJ,wBAA0B,SAACtH,EAADuH,GAAgB,IAAXrN,EAAWqN,EAAXrN,MAC3B8D,EAAKwB,SAAS,CAACd,YAAaxE,KAhDb8D,EAmDnBwJ,qBAAuB,SAACxH,EAADyH,GAAgB,IAAXvN,EAAWuN,EAAXvN,MACxB8D,EAAKwB,SAAS,CAACwC,SAAU9H,EAAOwN,eAAe,GAAQ,WAC/CxN,EAAMyN,QAAU,GAChB5F,EAAiB7H,GAAOsI,KAAK,SAACoF,GACtBA,EAAIC,KAAKC,SACT9J,EAAKwB,SAAS,CAACkI,eAAe,IAC9B1J,EAAK+J,mBAGRrF,MAAM,SAAUC,GACbqF,QAAQC,IAAI,gBA7DbjK,EAoEnBkK,mBAAqB,SAAClI,EAADmI,GAAgB,IAAXjO,EAAWiO,EAAXjO,MACtB8D,EAAKwB,SAAS,CAAC4I,WAAYlO,KAnE3B8D,EAAKO,MAAQ,CACTM,UAAW,MACXH,YAAa,cACbC,SAAU,UACVC,WAAY,QACZwJ,WAAY,GACZlH,KAAM,GACNmH,YAAY,EACZC,cAAc,EACdxJ,aAAa,EACbkD,SAAU,WACV0F,eAAe,EACfpD,qBAAiB7F,EACjBM,SAAS,GAEbf,EAAK+J,cAAgB/J,EAAK+J,cAAc9I,KAAnBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACrBA,EAAKgD,YAAchD,EAAKgD,YAAY/B,KAAjBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACnBA,EAAKuK,eAAiBvK,EAAKuK,eAAetJ,KAApBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACtBA,EAAK+J,gBACL/J,EAAKqJ,cAAgBrJ,EAAKqJ,cAAcpI,KAAnBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACrBA,EAAKwK,aAAexK,EAAKwK,aAAavJ,KAAlBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACpBA,EAAKyK,eAAiBzK,EAAKyK,eAAexJ,KAApBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KAEtBA,EAAKgB,cAAgBhB,EAAKgB,cAAcC,KAAnBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACrBA,EAAKqC,aAAerC,EAAKqC,aAAapB,KAAlBhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KACpBA,EAAK0K,sBAAwB1K,EAAK0K,sBAAsBzJ,KAA3BhB,OAAAiB,EAAA,EAAAjB,QAAAiB,EAAA,EAAAjB,CAAAD,KA3BdA,8EA+BJ2K,GACXC,IAAWC,MAAMC,SAASC,eAAe,cAAe,CACpDC,QAAS,EACT3N,MAAOsN,EAAoBnC,WAC3BlL,OAAQqN,EAAoBlC,cAE3BjE,KAAK,SAAUyG,GACZC,iBAAOD,EAAM,kDAkCZ9I,EAAKC,GAAK,IAAAhB,EAAAjB,KACnBA,KAAKuK,sBAAsBvI,EAAKC,GAChCjC,KAAKqB,SAAS,CAACb,SAAUwB,EAAKvB,UAAWwB,GAAM,YJ9HjB,SAACD,EAAKC,GACxC,OAAO,IAAI6B,QAAQ,SAAUC,EAASC,GAClC,IAAIC,EAAW,QACkB,WAA7BC,OAAOC,SAASF,WAChBA,EAAW,UAEfR,EAAS,GAAAW,OAAIH,EAAJ,qCAAAG,OAAgDnC,EAAhD,SAAAmC,OAA2DpC,IAC/DqC,KAAK,SAAUC,GACZP,EAAQO,KAEXC,MAAM,SAAUC,GACbR,EAAOQ,QIoHXwG,CAAuBhJ,EAAKC,GAAKoC,KAAK,SAACC,GACnC,IAAM2G,EAAY3G,EAASoF,KAAKC,OAGhC,IADyBtD,KAAE6E,KAAKD,EAAW,CAACpH,SAAY5C,EAAKb,MAAMyD,SAASsH,iBACnDF,EAAW,CAChC,IAAMG,EAAgBH,EAAU,GAEhChK,EAAKI,SAAS,CACVwC,SAAUuH,EAAcvH,SACxBwH,cAAeD,EAAcE,gBAC9B,WACCrK,EAAKiI,qEAOHlH,EAAKC,GAAK,IAAAsJ,EAAAvL,MFpJC,SAAChB,EAAKgD,EAAKC,GAC5C,OAAO,IAAI6B,QAAQ,SAAUC,EAASC,GAClC,IAAIwH,EAASlG,GAAStG,EAAKgD,EAAKC,GAAK,GACrCwB,EAAU+H,GACLnH,KAAK,SAAUC,GACZP,EAAQO,KAEXC,MAAM,SAAUC,GACbR,EAAOQ,QE6IfiH,CAAsB,sEAAuEzJ,EAAKC,GAAKoC,KAAK,SAACoF,GACzG8B,EAAKlK,SAAS,CAAC8E,gBAAiBsD,EAAIC,KAAM9I,SAAS,0CAK/CiB,GACR7B,KAAKqB,SAAS,CAAC0B,KAAMlB,EAAEQ,OAAOqJ,gDAGlB,IJ5KmB7H,EI4KnB8H,EAAA3L,MJ5KmB6D,EI6KR7D,KAAKI,MAAMyD,SJ5K/B,IAAIC,QAAQ,SAAUC,EAASC,GAClC,IAAIC,EAAW,QACkB,WAA7BC,OAAOC,SAASF,WAChBA,EAAW,UAEfR,EAAUQ,EAAW,gCAAkCJ,GAClDQ,KAAK,SAAUC,GACZP,EAAQO,KAEXC,MAAM,SAAUC,GACbR,EAAOQ,QIkK6BH,KAAK,SAACoF,GAC9C,IAAME,EAASF,EAAIC,KAAKC,OACxBgC,EAAKtK,SAAS,CACVb,SAAUmJ,EAAOnJ,SACjBC,UAAWkJ,EAAOlJ,UAClBoD,SAAU8F,EAAO9F,SACjBwH,cAAe1B,EAAO2B,eACtB1K,SAAS,GACV,WACC+K,EAAKpB,sBAAsBZ,EAAOnJ,SAAUmJ,EAAOlJ,WACnDkL,EAAKzC,4DAKD,IAAA3G,EAC6CvC,KAAKI,MAAvDM,EADK6B,EACL7B,UAAWmD,EADNtB,EACMsB,SAAUwH,EADhB9I,EACgB8I,cAAenB,EAD/B3H,EAC+B2H,WAC3ClK,KAAKqB,SAAS,CACV4I,WAAYxB,GAAW/H,IAAcwJ,EAAa,iBAAa,IAAM,MAAQmB,EAAgB,KAAOxH,yCAI/F+H,GAAO,IAAAC,EAAA7L,KAChB4L,EAAME,iBACN9L,KAAKqB,SAAS,CAAC6I,YAAalK,KAAKI,MAAM8J,YAAa,WAChD2B,EAAK3C,yDAIE0C,GACXA,EAAME,iBACN9L,KAAKqB,SAAS,CAAC8I,cAAenK,KAAKI,MAAM+J,qDAG/ByB,GACVA,EAAME,iBACN9L,KAAKqB,SAAS,CAACV,aAAcX,KAAKI,MAAMO,+CAGnC,IAAAoL,EAAA/L,KAAAgM,EACwIhM,KAAKI,MAA7IM,EADAsL,EACAtL,UAAWH,EADXyL,EACWzL,YAAaC,EADxBwL,EACwBxL,SAAUC,EADlCuL,EACkCvL,UAAWwJ,EAD7C+B,EAC6C/B,WAAYpG,EADzDmI,EACyDnI,SAAU0F,EADnEyC,EACmEzC,cAAeW,EADlF8B,EACkF9B,WAAY/D,EAD9F6F,EAC8F7F,gBAAiBgE,EAD/G6B,EAC+G7B,aAAcvJ,EAD7HoL,EAC6HpL,QAC5H4J,EAAsBpC,GAAe7H,GAIrC0L,EAA8B,eAAf1L,EAFE,CAAC2L,OAAQ,OAAQlP,MAAO,QACzB,CAACY,IAAK,OAAQD,KAAM,QAE1C,OACIvB,EAAAC,EAAAC,cAAA,WACIF,EAAAC,EAAAC,cAAC6P,EAAD,CAAerO,MAAO,iCAEtB1B,EAAAC,EAAAC,cAAC8P,EAAA,EAAD,CAAMC,UAAQ,EAACnF,UAAU,SAASpK,MAAO,CAACG,WAAY,SAClDb,EAAAC,EAAAC,cAAC8P,EAAA,EAAK5E,IAAN,KACIpL,EAAAC,EAAAC,cAAC8P,EAAA,EAAKE,OAAN,CAAaC,SAAU,EAAGC,OAAQ,GAAIC,OAAQ,GAC1CrQ,EAAAC,EAAAC,cAACoQ,EAAA,EAAD,KACItQ,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GAAnB,gBAGAxQ,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CAACoK,UAAW,OAAQxJ,SAAU,SAA1C,wKAGItB,EAAAC,EAAAC,cAAA,WAHJ,gHAIkCF,EAAAC,EAAAC,cAAA,WAJlC,IAIwCF,EAAAC,EAAAC,cAAA,6FAJxC,KAQAF,EAAAC,EAAAC,cAACmG,EAAA,EAAD,CAAQC,OAAQ9B,IAEhBxE,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GAAnB,sBAGAxQ,EAAAC,EAAAC,cAACuQ,EAAA,EAAD,CAAMtQ,UAAU,WACZH,EAAAC,EAAAC,cAACuQ,EAAA,EAAKC,MAAN,CAAYzJ,KAAK,QAAQ0J,aAAa,OAAOvI,OAAQ+E,EACzCyD,SAAUhN,KAAKqJ,qBACf4D,QAASH,IAAOhP,MAAM,WAAW/B,MAAO8H,EACxCqJ,YAAY,aAExB9Q,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CAAYH,SAAUhN,KAAKmJ,wBAAyB8D,QAASG,IACjDtP,MAAM,cAAc/B,MAAOwE,EAAa2H,QAASA,GACjDgF,YAAY,gBACxB9Q,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CAAYpR,MAAOkO,EAAY+C,SAAUhN,KAAK+J,mBAAoBkD,QAASH,IAC/DhP,MAAM,eAAeoP,YAAY,YAE7C9Q,EAAAC,EAAAC,cAAA,OAAKC,UAAU,SAAQH,EAAAC,EAAAC,cAAA,2BAEvBF,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CACIF,QAASM,IACTzP,MAAM,yBACN/B,MAAM,MACNyR,QAAuB,QAAd9M,EACTsM,SAAUhN,KAAKgJ,gBAGvB5M,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CACIF,QAASM,IACTzP,MAAM,oBACN/B,MAAM,OACNyR,QAAuB,SAAd9M,EACTsM,SAAUhN,KAAKgJ,gBAGvB5M,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CACIF,QAASM,IACTzP,MAAM,qBACN/B,MAAM,OACNyR,QAAuB,SAAd9M,EACTsM,SAAUhN,KAAKgJ,gBAGvB5M,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GACfxQ,EAAAC,EAAAC,cAACmR,EAAA,EAAD,CAAQC,GAAG,MAAX,aAIJtR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CACIF,QAASU,IACT7P,MAAM,cACNkP,SAAUhN,KAAKqK,aACfmD,QAAStD,KAIjB9N,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CACIF,QAASU,IACT7P,MAAM,yBACNkP,SAAUhN,KAAKsK,eACfkD,QAASrD,EACT5N,UAAU,oBAK1BH,EAAAC,EAAAC,cAACuQ,EAAA,EAAKQ,MAAN,CAAYC,QAAM,GACdlR,EAAAC,EAAAC,cAACuQ,EAAA,EAAKM,MAAN,CAAY1P,MAAM,OAAOmQ,QAAS,WAC9B7B,EAAK3B,eAAeI,IACrByC,QAASY,KAFZ,YAMRzR,EAAAC,EAAAC,cAAC8P,EAAA,EAAKE,OAAN,CAAaC,SAAU,GAAIC,OAAQ,GAAIC,OAAQ,IAC3CrQ,EAAAC,EAAAC,cAACoQ,EAAA,EAAD,CAAS5P,MAAO,CAACgR,SAAUtD,EAAoBjC,aAAe,KAC1DnM,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GAAnB,WAGAxQ,EAAAC,EAAAC,cAAA,OAAKC,UAAU,eAAeO,MAAO,CACjCI,MAAOsN,EAAoBjC,aAC3BpL,OAAQqN,EAAoBhC,gBAG5BpM,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CAACC,SAAU,YAAaF,GAAG,cACnCT,EAAAC,EAAAC,cAAA,OAAKyR,IAAI,WAAWC,IAAKC,IAASnR,MAAO,CACrCC,SAAU,WACVI,OAAQ,OACRS,IAAK,OACLZ,MAAO,OACPa,OAAQ,QACRqQ,WAAY,QACZC,QAAS,SAEZjE,EAAa9N,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CACtBC,SAAU,WACVY,KAAM,OACNuO,OAAQ,OACRrO,OAAQ,QACRqQ,WAAY,QACZE,YAAa,MACbnR,WAAY,MACZiG,cAAe,MACfmL,aAAc,MACdrS,OAAQ,sBAGRI,EAAAC,EAAAC,cAACgS,GAAD,CAAe5N,UAAWA,KACrB,GACTtE,EAAAC,EAAAC,cAACiS,EAAD,CAAYxL,KAAM/C,KAAKI,MAAM2C,KAAMxC,YAAaA,EAAaC,SAAUA,EAC3DC,UAAWA,EAAWC,UAAWA,EACjCwB,aAAclC,KAAKkC,aACnBtB,QAASA,EACTiC,YAAa7C,KAAK6C,cAC9BzG,EAAAC,EAAAC,cAACkS,GAAD,CAAa1R,MAAO,CAACgM,WAAY,UAAWX,KAAM8B,IAEjD9D,GAAmBgE,EAAe/N,EAAAC,EAAAC,cAAA,OAAKQ,MAAKgD,OAAA2O,EAAA,EAAA3O,CAAA,GACtCmM,EADsC,CAEzClP,SAAU,WACVc,OAAQ,QACRqQ,WAAY,QACZE,YAAa,MACbnR,WAAY,MACZiG,cAAe,MACfmL,aAAc,MACdrS,OAAQ,uBAGRI,EAAAC,EAAAC,cAACoS,GAAD,CAAoBnO,YAAaA,EAAa4F,gBAAiBA,KACzD,KAKlB/J,EAAAC,EAAAC,cAAA,WACAF,EAAAC,EAAAC,cAAA,SAAOQ,MAAO,CAACoK,UAAW,SACvB9K,EAAAC,EAAAC,cAAA,wNAI+BF,EAAAC,EAAAC,cAAA,KAAGqS,KAAK,sBAAR,0BAGlCvS,EAAAC,EAAAC,cAAA,WACAF,EAAAC,EAAAC,cAAC8P,EAAA,EAAD,KACIhQ,EAAAC,EAAAC,cAAC8P,EAAA,EAAKE,OAAN,CAAaE,OAAQ,GAAIC,OAAQ,EAAGF,SAAU,GAC1CnQ,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GAAnB,+BAGCzG,EAAkB/J,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CAACoK,UAAW,OAAQxJ,SAAU,SACzDtB,EAAAC,EAAAC,cAACsS,GAAD,CAAe/K,SAAUA,EAAUsC,gBAAiBA,KAA2B,GACnF/J,EAAAC,EAAAC,cAAA,qDAA4CF,EAAAC,EAAAC,cAAA,KAC5CqS,KAAK,iFACLtM,OAAO,UAFqC,uHAA5C,MAKJjG,EAAAC,EAAAC,cAAC8P,EAAA,EAAKE,OAAN,CAAaE,OAAQ,GAAIC,OAAQ,EAAGF,SAAU,GAC1CnQ,EAAAC,EAAAC,cAACqQ,EAAA,EAAD,CAASC,YAAU,GAAnB,gCAGCzG,EAAkB/J,EAAAC,EAAAC,cAAA,OAAKQ,MAAO,CAACoK,UAAW,OAAQxJ,SAAU,SACzDtB,EAAAC,EAAAC,cAACuS,GAAD,CAAkBhL,SAAUA,EAAUsC,gBAAiBA,KAA2B,GACtF/J,EAAAC,EAAAC,cAAA,qDAA4CF,EAAAC,EAAAC,cAAA,KAC5CqS,KAAK,4FACLtM,OAAO,UAFqC,0EAA5C,mBAlVjBmB,aCvDRsL,oLARP,OACI1S,EAAAC,EAAAC,cAAA,WACIF,EAAAC,EAAAC,cAACyS,GAAD,cALEvL,aCUEwL,QACW,cAA7B9K,OAAOC,SAAS8K,UAEe,UAA7B/K,OAAOC,SAAS8K,UAEhB/K,OAAOC,SAAS8K,SAASC,MACvB,2DCZNC,IAASC,OAAOhT,EAAAC,EAAAC,cAAC+S,GAAD,MAAS1E,SAASC,eAAe,SD2H3C,kBAAmB0E,WACrBA,UAAUC,cAAcC,MAAMnL,KAAK,SAAAoL,GACjCA,EAAaC","file":"static/js/main.280b0c6e.chunk.js","sourcesContent":["module.exports = __webpack_public_path__ + \"static/media/home1.a9b36690.svg\";","module.exports = __webpack_public_path__ + \"static/media/kcl-logo.5bb1569e.svg\";","import React from 'react';\r\nimport Transition from 'react-transition-group/Transition'\r\nimport anime from 'animejs';\r\nimport '../styles/home.css';\r\nconst animateSVG = () => {\r\n var timeline = anime.timeline({\r\n direction: 'alternate',\r\n loop: false,\r\n });\r\n timeline\r\n .add({\r\n targets: '#lineDrawing .lines path',\r\n strokeDashoffset: [anime.setDashoffset, 0],\r\n easing: 'easeInOutSine',\r\n duration: 1500,\r\n fill: '#ffffff',\r\n delay: function (el, i) {\r\n return i * 150\r\n }\r\n })\r\n .add({\r\n targets: '.pollution-indexes .index-circle',\r\n translateX: {\r\n value: '+=100',\r\n duration: 200\r\n },\r\n easing: 'easeInOutSine',\r\n border: '4px solid #F2F2F0',\r\n delay: function (el, i) {\r\n return (i + 1) * 250\r\n }\r\n })\r\n .add({\r\n targets: '.pollution-indexes .low',\r\n easing: 'easeInOutSine',\r\n duration: 200,\r\n backgroundColor: '#288500'\r\n })\r\n .add({\r\n targets: '.pollution-indexes .medium',\r\n easing: 'easeInOutSine',\r\n duration: 200,\r\n backgroundColor: '#ffa80e'\r\n })\r\n .add({\r\n targets: '.pollution-indexes .high',\r\n easing: 'easeInOutSine',\r\n duration: 200,\r\n backgroundColor: '#ff090a'\r\n })\r\n /*\r\n .add({\r\n targets: '.home-background',\r\n easing: 'easeInOutSine',\r\n duration: 2500,\r\n translateY: {\r\n value: '-1000'\r\n },\r\n })\r\n */\r\n\r\n};\r\n\r\nconst Home = props => (\r\n
\r\n \r\n
\r\n
\r\n \r\n \r\n \r\n\r\n \r\n \r\n\r\n \r\n \r\n
\r\n {props.label} \r\n\r\n
\r\n\r\n
\r\n
\r\n);\r\n\r\nexport default Home","import React from \"react\";\r\nimport {Map, Marker} from 'react-leaflet';\r\nimport {dynamicMapLayer} from 'esri-leaflet';\r\nimport {Loader} from 'semantic-ui-react'\r\nimport '../styles/map.css';\r\nimport L from 'leaflet';\r\n\r\nconst dimensions = {\r\n a4landscape: {height: 413, width: 582},\r\n a4portrait: {height: 582, width: 413},\r\n full: {height: 500, width: '100%'},\r\n};\r\n\r\nconst iconHome = new L.Icon({\r\n iconUrl: require('./../images/home1.svg'),\r\n iconRetinaUrl: require('./../images/home1.svg'),\r\n iconAnchor: null,\r\n popupAnchor: null,\r\n shadowUrl: null,\r\n shadowSize: null,\r\n shadowAnchor: null,\r\n iconSize: new L.Point(30, 40)\r\n});\r\n\r\nconst url = \"//webgis.erg.ic.ac.uk/arcgis/rest/services/Annual_London/MapServer\";\r\n\r\nconst NO2_Annual = dynamicMapLayer({\r\n url: url,\r\n opacity: 0.15,\r\n layers: [4],\r\n useCors: false\r\n});\r\n\r\nconst PM10_Annual = dynamicMapLayer({\r\n url: url,\r\n opacity: 0.15,\r\n layers: [6],\r\n useCors: false\r\n});\r\n\r\nconst PM25_Annual = dynamicMapLayer({\r\n url: url,\r\n opacity: 0.15,\r\n layers: [7],\r\n useCors: false\r\n});\r\n\r\nconst gisMaps = {\r\n NO2: NO2_Annual,\r\n PM10: PM10_Annual,\r\n PM25: PM25_Annual\r\n};\r\n\r\nconst CARTO_BlackWhite = L.tileLayer('https://{s}.basemaps.cartocdn.com/light_all/{z}/{x}/{y}{r}.png', {\r\n attribution: '© CARTO',\r\n});\r\n\r\nclass LeafletMap extends React.Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n map: undefined,\r\n orientation: 'a4landscape',\r\n latitude: props.latitude,\r\n longitude: props.longitude,\r\n pollutant: props.pollutant,\r\n showBasemap: props.showBasemap,\r\n loading: props.loading\r\n };\r\n this.toggleBasemap = this.toggleBasemap.bind(this);\r\n this.handleMarkerDrag = this.handleMarkerDrag.bind(this);\r\n }\r\n\r\n componentWillReceiveProps(props) {\r\n const map = this.refs.map.leafletElement;\r\n const orientationChanged = this.state.orientation !== props.orientation;\r\n this.setState({\r\n orientation: props.orientation,\r\n latitude: props.latitude,\r\n longitude: props.longitude,\r\n showBasemap: props.showBasemap,\r\n loading: props.loading\r\n }, () => {\r\n if (props.pollutant !== this.state.pollutant || orientationChanged) {\r\n map.removeLayer(gisMaps[this.state.pollutant]);\r\n this.setState({pollutant: props.pollutant}, () => {\r\n gisMaps[this.state.pollutant].addTo(map);\r\n setTimeout(function () {\r\n map.invalidateSize()\r\n }, 400);\r\n })\r\n }\r\n this.panToLocation(props.latitude, props.longitude);\r\n });\r\n\r\n }\r\n\r\n toggleBasemap(show){\r\n const map = this.refs.map.leafletElement;\r\n if(!show){\r\n map.removeLayer(CARTO_BlackWhite);\r\n }else{\r\n CARTO_BlackWhite.addTo(map);\r\n }\r\n }\r\n\r\n componentDidMount() {\r\n const map = this.refs.map.leafletElement;\r\n gisMaps[this.state.pollutant].addTo(map);\r\n CARTO_BlackWhite.addTo(map)\r\n\r\n map.on('click', function (e) {\r\n const {lat, lng} = e.latlng;\r\n this.props.updateLatLng(lat, lng);\r\n }.bind(this));\r\n }\r\n\r\n panToLocation(lat, lng) {\r\n let map = this.refs.map.leafletElement;\r\n map.setView(new L.LatLng(lat, lng));\r\n }\r\n\r\n handleMarkerDrag(e) {\r\n const latlng = e.target._latlng;\r\n this.props.updateLatLng(latlng.lat,latlng.lng);\r\n }\r\n\r\n render() {\r\n const {orientation, latitude, longitude, loading} = this.state;\r\n const position = [latitude, longitude];\r\n const mapSize = dimensions[orientation];\r\n return (\r\n
\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default LeafletMap;\r\n","import axios from \"axios\";\n\nexport const httpFetch = (url) => {\n return axios.get(url);\n};\n\nexport const httpFetchWithHeader = (url) => {\n return axios(url, {headers: { \"Content-Type\": \"application/xml\" }});\n};","import {httpFetch} from \"./Http\";\r\n\r\nexport const getLocationForPostcode = (postcode) => {\r\n return new Promise(function (resolve, reject) {\r\n let protocol = 'http:';\r\n if (window.location.protocol === 'https:') {\r\n protocol = 'https:';\r\n }\r\n httpFetch(protocol + '//api.postcodes.io/postcodes/' + postcode)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};\r\n\r\nexport const getPostcodeForLocation = (lat, lng) => {\r\n return new Promise(function (resolve, reject) {\r\n let protocol = 'http:';\r\n if (window.location.protocol === 'https:') {\r\n protocol = 'https:';\r\n }\r\n httpFetch(`${protocol}//api.postcodes.io/postcodes?lon=${lng}&lat=${lat}`)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};\r\n\r\nexport const validatePostcode = (postcode) => {\r\n return new Promise(function (resolve, reject) {\r\n let protocol = 'http:';\r\n if (window.location.protocol === 'https:') {\r\n protocol = 'https:';\r\n }\r\n httpFetch(`${protocol}//api.postcodes.io/postcodes/${postcode}/validate`)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};","import React from \"react\";\r\nimport tinycolor from \"tinycolor2\";\r\n\r\nconst no2LegendValues = [\r\n {value: '-16', colour: '002451'},\r\n {value: '16', colour: '00129d'},\r\n {value: '19', colour: '0024d3'},\r\n {value: '22', colour: '074bf5'},\r\n {value: '25', colour: '0795e9'},\r\n {value: '28', colour: '19cfd2'},\r\n {value: '31', colour: '67df86'},\r\n {value: '34', colour: 'a4ec51'},\r\n {value: '37', colour: 'a4ec51'},\r\n {value: '40', colour: 'ffff00'},\r\n {value: '43', colour: 'ffff80'},\r\n {value: '46', colour: 'ffd600'},\r\n {value: '49', colour: 'ffac5b'},\r\n {value: '52', colour: 'ff0000'},\r\n {value: '55', colour: '800040'},\r\n {value: '58+', colour: '400040'}/*,\r\n {value: '61', colour: 'ff7d00'},\r\n {value: '64', colour: 'ff6400'},\r\n {value: '67', colour: 'ff5000'},\r\n {value: '70', colour: 'ff3c00'},\r\n {value: '73', colour: 'ff2800'},\r\n {value: '76', colour: 'ff1400'},\r\n {value: '79', colour: 'ff0000'},\r\n {value: '82', colour: 'e60000'},\r\n {value: '85', colour: 'd20000'},\r\n {value: '88', colour: 'be0000'},\r\n {value: '91', colour: 'aa0000'},\r\n {value: '94', colour: '820000'},\r\n {value: '97+', colour: '500000'}*/\r\n];\r\n\r\nconst pm10LegendValues = [\r\n {value: '-16', colour: '002451'},\r\n {value: '16', colour: '00129d'},\r\n {value: '19', colour: '0024d3'},\r\n {value: '22', colour: '074bf5'},\r\n {value: '25', colour: '0795e9'},\r\n {value: '28', colour: '19cfd2'},\r\n {value: '31', colour: '82fdcf'},\r\n {value: '34', colour: '67df86'},\r\n {value: '37', colour: 'a4ec51'},\r\n {value: '40', colour: 'ffff80'},\r\n {value: '43', colour: 'ffd600'},\r\n {value: '46', colour: 'ffac5b'},\r\n {value: '49', colour: 'f97c00'},\r\n {value: '52', colour: 'ff0000'},\r\n {value: '55', colour: '800040'},\r\n {value: '58+', colour: '400040'}\r\n];\r\n\r\nconst pm25LegendValues = [\r\n {value: '-12', colour: '52b5d9'},\r\n {value: '14', colour: '82fdcf'},\r\n {value: '16', colour: '67df86'},\r\n {value: '18', colour: 'a4ec51'},\r\n {value: '20', colour: 'ffff80'},\r\n {value: '22', colour: 'ffd600'},\r\n {value: '22+', colour: 'f97c00'}\r\n];\r\n\r\n\r\nconst legendMap = {\r\n NO2: no2LegendValues,\r\n PM25: pm25LegendValues,\r\n PM10: pm10LegendValues\r\n}\r\n\r\nexport const MapColourLegend = (props) => (\r\n
{legendMap[props.pollutant].map((item, i) =>\r\n
)}\r\n
\r\n);\r\n\r\nexport const MapTextLegend = (props) => (\r\n
{legendMap[props.pollutant].slice(0).reverse().map((item, i) => {\r\n var color = tinycolor(`#${item.colour}`);\r\n color.setAlpha(0.2);\r\n return (\r\n
\r\n
{item.value}\r\n
\r\n
\r\n )\r\n }\r\n )}\r\n
\r\n);","import {httpFetch} from \"./Http\";\r\n\r\nexport const fetchValuesFromGIS = (url, lat, lng) => {\r\n return new Promise(function (resolve, reject) {\r\n let gisURL = buildURL(url, lat, lng);\r\n httpFetch(gisURL)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};\r\n\r\nexport const fetchAllFromMapServer = (url, lat, lng) => {\r\n return new Promise(function (resolve, reject) {\r\n let gisURL = buildURL(url, lat, lng, true);\r\n httpFetch(gisURL)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};\r\n\r\nexport const fetchAllFromMapServerWithToken = (url, lat, lng, token) => {\r\n return new Promise(function (resolve, reject) {\r\n let gisURL = buildURLWithToken(url, lat, lng, true, token);\r\n httpFetch(gisURL)\r\n .then(function (response) {\r\n resolve(response);\r\n })\r\n .catch(function (error) {\r\n reject(error);\r\n });\r\n })\r\n};\r\n\r\nfunction buildURL(baseURL, lat, long, all) {\r\n var identifyURL = \"/identify?\";\r\n var endURL = \"&returnGeometry=false&f=json\";\r\n\r\n var geometryType = \"esriGeometryPoint\";\r\n var layers = all ? \"all\" : \"0\";\r\n var sr = \"4326\";\r\n var tolerance = \"1\";\r\n\r\n var imageDisplay = \"750,500,96\";\r\n\r\n var dynamicMapExtent = getMapExtent(lat, long);\r\n var geometryDynamic = long + \",\" + lat;\r\n\r\n var parameters = \"geometry=\" + geometryDynamic + \"&geometryType=\" + geometryType + \"&layers=\" + layers + \"&sr=\" + sr\r\n + \"&tolerance=\" + tolerance + \"&mapExtent=\" + dynamicMapExtent + \"&imageDisplay=\" + imageDisplay;\r\n\r\n var returnURL = baseURL + identifyURL + parameters + endURL;\r\n\r\n return returnURL;\r\n}\r\n\r\nfunction buildURLWithToken(baseURL, lat, long, all, gisToken) {\r\n var identifyURL = \"/identify?\";\r\n var endURL = \"&returnGeometry=false&f=json\";\r\n\r\n var geometryType = \"esriGeometryPoint\";\r\n var layers = all ? \"all\" : \"0\";\r\n ;\r\n var sr = \"4326\";\r\n var tolerance = \"1\";\r\n\r\n var imageDisplay = \"750,500,96\";\r\n\r\n var dynamicMapExtent = getMapExtent(lat, long);\r\n var geometryDynamic = long + \",\" + lat;\r\n var referrer = \"localhost\";\r\n var parameters = \"geometry=\" + geometryDynamic + \"&geometryType=\" + geometryType + \"&layers=\" + layers + \"&sr=\" + sr\r\n + \"&tolerance=\" + tolerance + \"&mapExtent=\" + dynamicMapExtent + \"&imageDisplay=\" + imageDisplay + \"&token=\" + gisToken + \"&referrer=\" + referrer;\r\n\r\n var returnURL = baseURL + identifyURL + parameters + endURL;\r\n\r\n return returnURL;\r\n}\r\n\r\n\r\nfunction getMapExtent(lat, long) {\r\n //generate extent box\r\n var latFloat = parseFloat(lat);\r\n var longFloat = parseFloat(long);\r\n\r\n var LONG_DIFF_FIRST = -0.007736;\r\n var LONG_DIFF_SECOND = -0.00962876;\r\n var LAT_DIFF_FIRST = 0;\r\n var LAT_DIFF_SECOND = -0.003339;\r\n\r\n return (longFloat - LONG_DIFF_FIRST) + \",\" + (latFloat + LAT_DIFF_FIRST) + \",\" + (longFloat - LONG_DIFF_SECOND) + \",\" + (latFloat - LAT_DIFF_SECOND);\r\n}","import React from 'react'\r\nimport {Label, Icon, Table} from 'semantic-ui-react'\r\nimport _ from 'lodash'\r\n\r\nconst POLLUTANT_ENUM = {NO2_2016: \"NO2_2016\", PM10_2016: \"PM10_2016\", PM25_2016: \"PM25_2016\"};\r\n\r\nexport const PollutionBadges = (props) => {\r\n const results = props.pollutionValues.results;\r\n const orientation = props.orientation;\r\n const no2_values = _.filter(results, {layerName: POLLUTANT_ENUM.NO2_2016})[0];\r\n const pm10_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM10_2016})[0];\r\n const pm25_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM25_2016})[0];\r\n\r\n const no2Passes = passObjective(POLLUTANT_ENUM.NO2_2016, no2_values.attributes['Pixel Value']);\r\n const pm10Passes = passObjective(POLLUTANT_ENUM.PM10_2016, pm10_values.attributes['Pixel Value']);\r\n const pm25Passes = passObjective(POLLUTANT_ENUM.PM25_2016, pm25_values.attributes['Pixel Value']);\r\n\r\n const landscapeStyle = {bottom: '4px', right: '9px'};\r\n const portraitStyle = {top: '14px', left: '15px'};\r\n\r\n const badgePosition = (orientation == 'a4landscape' ? landscapeStyle : portraitStyle);\r\n return
\r\n \r\n \r\n
\r\n}\r\n\r\nconst passObjective = (pollutant, value) => {\r\n switch (pollutant) {\r\n case POLLUTANT_ENUM.NO2_2016 : {\r\n return value < 40;\r\n }\r\n case POLLUTANT_ENUM.PM10_2016 : {\r\n return value < 40;\r\n }\r\n case POLLUTANT_ENUM.PM25_2016 : {\r\n return value < 25;\r\n }\r\n }\r\n};\r\n\r\nconst passWHOObjective = (pollutant, value) => {\r\n switch (pollutant) {\r\n case POLLUTANT_ENUM.NO2_2016 : {\r\n return value < 40;\r\n }\r\n case POLLUTANT_ENUM.PM10_2016 : {\r\n return value < 20;\r\n }\r\n case POLLUTANT_ENUM.PM25_2016 : {\r\n return value < 10;\r\n }\r\n }\r\n};\r\n\r\nexport const PollutionLabels = () => {\r\n return
\r\n \r\n \r\n
\r\n}\r\n\r\nexport const EULimitValuesTable = (props) => {\r\n\r\n const results = props.pollutionValues.results\r\n const no2_values = _.filter(results, {layerName: POLLUTANT_ENUM.NO2_2016})[0];\r\n const pm10_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM10_2016})[0];\r\n const pm25_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM25_2016})[0];\r\n\r\n const no2Passes = passObjective(POLLUTANT_ENUM.NO2_2016, no2_values.attributes['Pixel Value']);\r\n const pm10Passes = passObjective(POLLUTANT_ENUM.PM10_2016, pm10_values.attributes['Pixel Value']);\r\n const pm25Passes = passObjective(POLLUTANT_ENUM.PM25_2016, pm25_values.attributes['Pixel Value']);\r\n\r\n const no2WHOOPasses = passWHOObjective(POLLUTANT_ENUM.NO2_2016, no2_values.attributes['Pixel Value']);\r\n const pm10WHOOPasses = passWHOObjective(POLLUTANT_ENUM.PM10_2016, pm10_values.attributes['Pixel Value']);\r\n const pm25WHOOPasses = passWHOObjective(POLLUTANT_ENUM.PM25_2016, pm25_values.attributes['Pixel Value']);\r\n return (\r\n \r\n \r\n \r\n \r\n\r\n Estimated\r\n EU Limit\r\n WHO Limit\r\n\r\n \r\n \r\n\r\n NO2\r\n {Math.round(no2_values.attributes['Pixel Value'])}\r\n µg/m³\r\n 40 µg/m³\r\n 40 µg/m³\r\n\r\n \r\n \r\n\r\n PM10\r\n {Math.round(pm10_values.attributes['Pixel Value'])}\r\n µg/m³\r\n 40 µg/m³\r\n 20 µg/m³\r\n\r\n \r\n \r\n\r\n PM2.5\r\n {Math.round(pm25_values.attributes['Pixel Value'])}\r\n µg/m³\r\n 25 µg/m³\r\n 10 µg/m³\r\n\r\n \r\n \r\n
\r\n )\r\n};\r\n\r\nexport const LocationNotes = (props) => {\r\n const results = props.pollutionValues.results;\r\n const no2_values = _.filter(results, {layerName: POLLUTANT_ENUM.NO2_2016})[0];\r\n const pm10_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM10_2016})[0];\r\n const pm25_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM25_2016})[0];\r\n\r\n const no2Passes = passObjective(POLLUTANT_ENUM.NO2_2016, no2_values.attributes['Pixel Value']);\r\n const pm10Passes = passObjective(POLLUTANT_ENUM.PM10_2016, pm10_values.attributes['Pixel Value']);\r\n const pm25Passes = passObjective(POLLUTANT_ENUM.PM25_2016, pm25_values.attributes['Pixel Value']);\r\n return
\r\n \r\n
\r\n};\r\n\r\nexport const LocationWHONotes = (props) => {\r\n const results = props.pollutionValues.results;\r\n const no2_values = _.filter(results, {layerName: POLLUTANT_ENUM.NO2_2016})[0];\r\n const pm10_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM10_2016})[0];\r\n const pm25_values = _.filter(results, {layerName: POLLUTANT_ENUM.PM25_2016})[0];\r\n\r\n const no2Passes = passWHOObjective(POLLUTANT_ENUM.NO2_2016, no2_values.attributes['Pixel Value']);\r\n const pm10Passes = passWHOObjective(POLLUTANT_ENUM.PM10_2016, pm10_values.attributes['Pixel Value']);\r\n const pm25Passes = passWHOObjective(POLLUTANT_ENUM.PM25_2016, pm25_values.attributes['Pixel Value']);\r\n return
\r\n \r\n
\r\n};\r\nconst PassingLabel = () => ( passing);\r\nconst ExceedingLabel = () => ( exceeding);","import React, {Component} from 'react'\r\nimport {\r\n Button,\r\n Container,\r\n Divider,\r\n Grid,\r\n Header,\r\n Form,\r\n Radio,\r\n Segment,\r\n Input,\r\n Select,\r\n Checkbox,\r\n Loader\r\n} from 'semantic-ui-react'\r\nimport AnimationHome from './../Components/AnimationHome';\r\nimport LeafletMap from './../Components/LeafletMap';\r\nimport {getLocationForPostcode, validatePostcode, getPostcodeForLocation} from './../services/PostcodeService';\r\nimport '../styles/font-styles.css';\r\nimport kclLogo from './../images/kcl-logo.svg';\r\nimport domtoimage from 'retina-dom-to-image';\r\nimport {saveAs} from 'file-saver';\r\nimport {MapTextLegend} from '../../src/Components/PollutantLegend';\r\nimport {fetchAllFromMapServer} from '../../src/services/PollutionLocationService';\r\nimport {LocationWHONotes, LocationNotes, EULimitValuesTable} from './../Components/InfoOverlays';\r\n\r\nimport _ from 'lodash';\r\n\r\nconst options = [\r\n {key: 'l', text: 'Landscape', value: 'a4landscape'},\r\n {key: 'p', text: 'Portrait', value: 'a4portrait'},\r\n];\r\n\r\nconst displayOptions = {\r\n 'a4landscape': {printWidth: 1165, printHeight: 826, displayWidth: 582, displayHeight: 413},\r\n 'a4portrait': {printWidth: 826, printHeight: 1165, displayWidth: 413, displayHeight: 582}\r\n};\r\n\r\nconst pollutants = {\r\n NO2: 'Nitrogen Dioxide',\r\n PM10: 'PM10 Particulates',\r\n PM25: 'PM2.5 Particulates'\r\n};\r\n\r\nconst PosterLabel = ({text, reportingMode}) => (\r\n
\r\n
{text}
\r\n
\r\n);\r\n\r\nconst Footer = () => (\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n )\r\n\r\nclass Homepage extends Component {\r\n\r\n constructor(props) {\r\n super(props);\r\n this.state = {\r\n pollutant: 'NO2',\r\n orientation: 'a4landscape',\r\n latitude: 51.511873,\r\n longitude: -0.115959,\r\n footerText: '',\r\n zoom: 15,\r\n showLegend: false,\r\n showEULimits: false,\r\n showBasemap: true,\r\n postcode: 'WC2R 2LS',\r\n postcodeValid: true,\r\n pollutionValues: undefined,\r\n loading: false\r\n };\r\n this.updatePreview = this.updatePreview.bind(this);\r\n this.onZoomEvent = this.onZoomEvent.bind(this);\r\n this.takeScreenshot = this.takeScreenshot.bind(this);\r\n this.updatePreview();\r\n this.updateCaption = this.updateCaption.bind(this);\r\n this.toggleLegend = this.toggleLegend.bind(this);\r\n this.toggleEULimits = this.toggleEULimits.bind(this);\r\n\r\n this.toggleBasemap = this.toggleBasemap.bind(this);\r\n this.updateLatLng = this.updateLatLng.bind(this);\r\n this.updatePollutionValues = this.updatePollutionValues.bind(this);\r\n\r\n }\r\n\r\n takeScreenshot(orientationSettings) {\r\n domtoimage.toPng(document.getElementById('map-poster'), {\r\n quality: 1,\r\n width: orientationSettings.printWidth,\r\n height: orientationSettings.printHeight\r\n })\r\n .then(function (blob) {\r\n saveAs(blob, 'map.png');\r\n });\r\n }\r\n\r\n handleChange = (e, {value}) => {\r\n this.setState({pollutant: value}, () => {\r\n this.updateCaption();\r\n })\r\n };\r\n handleOrientationChange = (e, {value}) => {\r\n this.setState({orientation: value})\r\n };\r\n\r\n handlePostcodeChange = (e, {value}) => {\r\n this.setState({postcode: value, postcodeValid: false}, () => {\r\n if (value.length >= 5) {\r\n validatePostcode(value).then((res) => {\r\n if (res.data.result) {\r\n this.setState({postcodeValid: true});\r\n this.updatePreview();\r\n }\r\n })\r\n .catch(function (error) {\r\n console.log(\"invalid\")\r\n });\r\n }\r\n });\r\n\r\n };\r\n\r\n handleFooterChange = (e, {value}) => {\r\n this.setState({footerText: value})\r\n };\r\n\r\n updateLatLng(lat, lng) {\r\n this.updatePollutionValues(lat, lng);\r\n this.setState({latitude: lat, longitude: lng}, () => {\r\n getPostcodeForLocation(lat, lng).then((response) => {\r\n const postcodes = response.data.result;\r\n //check if existing postcode is within result array\r\n const existingPostcode = _.find(postcodes, {'postcode': this.state.postcode.toUpperCase()});\r\n if (!existingPostcode && postcodes) {\r\n const firstPostcode = postcodes[0];\r\n //update postcode and local authority\r\n this.setState({\r\n postcode: firstPostcode.postcode,\r\n adminDistrict: firstPostcode.admin_district\r\n }, () => {\r\n this.updateCaption();\r\n })\r\n }\r\n });\r\n });\r\n }\r\n\r\n updatePollutionValues(lat, lng) {\r\n fetchAllFromMapServer(\"//webgis.erg.ic.ac.uk/arcgis/rest/services/Annual_London/MapServer\", lat, lng).then((res) => {\r\n this.setState({pollutionValues: res.data, loading: false});\r\n })\r\n }\r\n\r\n\r\n onZoomEvent(e) {\r\n this.setState({zoom: e.target._zoom});\r\n }\r\n\r\n updatePreview() {\r\n getLocationForPostcode(this.state.postcode).then((res) => {\r\n const result = res.data.result;\r\n this.setState({\r\n latitude: result.latitude,\r\n longitude: result.longitude,\r\n postcode: result.postcode,\r\n adminDistrict: result.admin_district,\r\n loading: true\r\n }, () => {\r\n this.updatePollutionValues(result.latitude, result.longitude);\r\n this.updateCaption();\r\n })\r\n });\r\n }\r\n\r\n updateCaption() {\r\n const {pollutant, postcode, adminDistrict, showLegend} = this.state;\r\n this.setState({\r\n footerText: pollutants[pollutant] + (showLegend ? ' (µg/m³)' : '') + ' - ' + adminDistrict + ', ' + postcode\r\n })\r\n }\r\n\r\n toggleLegend(event) {\r\n event.preventDefault();\r\n this.setState({showLegend: !this.state.showLegend}, () => {\r\n this.updateCaption();\r\n })\r\n }\r\n\r\n toggleEULimits(event) {\r\n event.preventDefault();\r\n this.setState({showEULimits: !this.state.showEULimits})\r\n }\r\n\r\n toggleBasemap(event) {\r\n event.preventDefault();\r\n this.setState({showBasemap: !this.state.showBasemap});\r\n }\r\n\r\n render() {\r\n let {pollutant, orientation, latitude, longitude, footerText, postcode, postcodeValid, showLegend, pollutionValues, showEULimits, loading} = this.state;\r\n const orientationSettings = displayOptions[orientation];\r\n\r\n const landscapeStyle = {bottom: '40px', right: '17px'};\r\n const portraitStyle = {top: '14px', left: '15px'};\r\n const keyPosition = (orientation == 'a4landscape' ? landscapeStyle : portraitStyle);\r\n return (\r\n
\r\n \r\n\r\n \r\n \r\n \r\n \r\n \r\n Introduction\r\n \r\n
\r\n This map shows the annual mean pollution for NO2, PM10 and PM2.5 across London, the\r\n data is based on most recent year for which an accurate model is available, 2016.\r\n
You may explore the air pollution in London by clicking on an area of the map\r\n or entering a postcode below.
The 'Export' button will download a high\r\n quality PNG image of the previewed map.\r\n\r\n
\r\n \r\n\r\n \r\n Customise your map\r\n \r\n
\r\n \r\n\r\n \r\n \r\n\r\n
\r\n\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n Optional\r\n
\r\n
\r\n \r\n \r\n \r\n \r\n \r\n \r\n \r\n
\r\n \r\n {\r\n this.takeScreenshot(orientationSettings)\r\n }} control={Button}>Export\r\n\r\n \r\n
\r\n \r\n \r\n \r\n Preview\r\n \r\n
\r\n\r\n
\r\n \"kcl-logo\"\r\n {showLegend ?
\r\n \r\n
: ''}\r\n \r\n \r\n\r\n {pollutionValues && showEULimits ?
\r\n \r\n
: ''}\r\n\r\n
\r\n
\r\n\r\n
\r\n \r\n

This map was used with permission from The Greater London Authority and Transport\r\n for\r\n London, who fund, develop and maintain the London Atmospheric Emissions Inventory.\r\n For\r\n more information please visit data.london.gov.uk \r\n

\r\n
\r\n
\r\n \r\n \r\n \r\n EU Annual Mean Limit Values\r\n \r\n {pollutionValues ?
\r\n
: ''}\r\n

For more information please refer to the 'National air quality objectives and European Directive limit and target\r\n values for the protection of human health'.

\r\n
\r\n \r\n \r\n WHO Annual Mean Limit Values\r\n \r\n {pollutionValues ?
\r\n
: ''}\r\n

For more information please refer to the 'World Health Organization - Ambient (outdoor) air quality and health'.

\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n
\r\n );\r\n }\r\n}\r\n\r\nexport default Homepage;\r\n","import React, {Component} from 'react';\nimport HomepageLayout from './pages/Homepage';\nclass App extends Component {\n\n render() {\n return (\n
\n \n
\n );\n }\n}\n\nexport default App;\n","// This optional code is used to register a service worker.\n// register() is not called by default.\n\n// This lets the app load faster on subsequent visits in production, and gives\n// it offline capabilities. However, it also means that developers (and users)\n// will only see deployed updates on subsequent visits to a page, after all the\n// existing tabs open on the page have been closed, since previously cached\n// resources are updated in the background.\n\n// To learn more about the benefits of this model and instructions on how to\n// opt-in, read http://bit.ly/CRA-PWA\n\nconst isLocalhost = Boolean(\n window.location.hostname === 'localhost' ||\n // [::1] is the IPv6 localhost address.\n window.location.hostname === '[::1]' ||\n // 127.0.0.1/8 is considered localhost for IPv4.\n window.location.hostname.match(\n /^127(?:\\.(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)){3}$/\n )\n);\n\nexport function register(config) {\n if (process.env.NODE_ENV === 'production' && 'serviceWorker' in navigator) {\n // The URL constructor is available in all browsers that support SW.\n const publicUrl = new URL(process.env.PUBLIC_URL, window.location.href);\n if (publicUrl.origin !== window.location.origin) {\n // Our service worker won't work if PUBLIC_URL is on a different origin\n // from what our page is served on. This might happen if a CDN is used to\n // serve assets; see https://github.com/facebook/create-react-app/issues/2374\n return;\n }\n\n window.addEventListener('load', () => {\n const swUrl = `${process.env.PUBLIC_URL}/service-worker.js`;\n\n if (isLocalhost) {\n // This is running on localhost. Let's check if a service worker still exists or not.\n checkValidServiceWorker(swUrl, config);\n\n // Add some additional logging to localhost, pointing developers to the\n // service worker/PWA documentation.\n navigator.serviceWorker.ready.then(() => {\n console.log(\n 'This web app is being served cache-first by a service ' +\n 'worker. To learn more, visit http://bit.ly/CRA-PWA'\n );\n });\n } else {\n // Is not localhost. Just register service worker\n registerValidSW(swUrl, config);\n }\n });\n }\n}\n\nfunction registerValidSW(swUrl, config) {\n navigator.serviceWorker\n .register(swUrl)\n .then(registration => {\n registration.onupdatefound = () => {\n const installingWorker = registration.installing;\n if (installingWorker == null) {\n return;\n }\n installingWorker.onstatechange = () => {\n if (installingWorker.state === 'installed') {\n if (navigator.serviceWorker.controller) {\n // At this point, the updated precached content has been fetched,\n // but the previous service worker will still serve the older\n // content until all client tabs are closed.\n console.log(\n 'New content is available and will be used when all ' +\n 'tabs for this page are closed. See http://bit.ly/CRA-PWA.'\n );\n\n // Execute callback\n if (config && config.onUpdate) {\n config.onUpdate(registration);\n }\n } else {\n // At this point, everything has been precached.\n // It's the perfect time to display a\n // \"Content is cached for offline use.\" message.\n console.log('Content is cached for offline use.');\n\n // Execute callback\n if (config && config.onSuccess) {\n config.onSuccess(registration);\n }\n }\n }\n };\n };\n })\n .catch(error => {\n console.error('Error during service worker registration:', error);\n });\n}\n\nfunction checkValidServiceWorker(swUrl, config) {\n // Check if the service worker can be found. If it can't reload the page.\n fetch(swUrl)\n .then(response => {\n // Ensure service worker exists, and that we really are getting a JS file.\n const contentType = response.headers.get('content-type');\n if (\n response.status === 404 ||\n (contentType != null && contentType.indexOf('javascript') === -1)\n ) {\n // No service worker found. Probably a different app. Reload the page.\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister().then(() => {\n window.location.reload();\n });\n });\n } else {\n // Service worker found. Proceed as normal.\n registerValidSW(swUrl, config);\n }\n })\n .catch(() => {\n console.log(\n 'No internet connection found. App is running in offline mode.'\n );\n });\n}\n\nexport function unregister() {\n if ('serviceWorker' in navigator) {\n navigator.serviceWorker.ready.then(registration => {\n registration.unregister();\n });\n }\n}\n","import React from 'react';\nimport ReactDOM from 'react-dom';\nimport './index.css';\nimport App from './App';\nimport * as serviceWorker from './serviceWorker';\n\nReactDOM.render(, document.getElementById('root'));\n\n// If you want your app to work offline and load faster, you can change\n// unregister() to register() below. Note this comes with some pitfalls.\n// Learn more about service workers: http://bit.ly/CRA-PWA\nserviceWorker.unregister();\n"],"sourceRoot":""}