L.Control.Button=L.Control.extend({options:{position:"topleft"},initialize:function(options){L.Util.setOptions(this,options)},onAdd:function(map){let container=L.DomUtil.create("div",this.options.cl+(this.options.nobar?"":" leaflet-bar")+" leaflet-control");container.title=this.options.title;L.DomUtil.create("a","",container);L.DomEvent.on(container,"dblclick",L.DomEvent.stopPropagation).on(container,"dblclick",L.DomEvent.preventDefault).on(container,"click",L.DomEvent.stopPropagation).on(container,"click",L.DomEvent.preventDefault).on(container,"click",this.options.click);return container}});window.onerror=function(message,url,lineno,colno,error){d3.text("/cityplan/error-log.php?message="+encodeURIComponent(message)+"&url="+encodeURIComponent(url)+"&stack="+encodeURIComponent(error?error.stack:""))};function hideGovAlertAd(){if(!hideGovAlertAdHidden){hideGovAlertAdHidden=true;d3.select("#subscribe-mail").transition().delay(3e3).style("right","-55px").on("end",()=>d3.select("#subscribe-mail").style("display","none"))}}let hideGovAlertAdHidden=false;d3.select("#subscribe-mail a").on("click",hideGovAlertAd);let infoInView=false;if(isIPhone()){showInfo(d3.select("#ht_iphonedeath").node().innerHTML);d3.select("#progress-counter").remove();d3.select("body").style("background","#ab3f3f");throw new Error("iPhone error detected")}const bgMonthTran=function(d,f){let df=f(d);return df.replace(".01.","ян. ").replace(".02.","февр. ").replace(".03.","март ").replace(".04.","апр. ").replace(".05.","май ").replace(".06.","юни ").replace(".07.","юли ").replace(".08.","авг. ").replace(".09.","септ. ").replace(".10.","окт. ").replace(".11.","ноем. ").replace(".12.","дек. ")};const hourinms=3600*1e3;const dayinms=24*hourinms;const dateFormatMY=d=>bgMonthTran(d,d3.timeFormat(".%m.%Y"));const dateFormat=d3.timeFormat("%Y-%m-%d");const dateFormatSh=d3.timeFormat("%y%m%d");const dateParse=d3.timeParse("%Y-%m-%d");const dateParseSh=d3.timeParse("%y%m%d%H");const dateParseH=t=>{if(t.indexOf(" ")>0)t=t.substr(0,t.indexOf(" "));return dateParse(t).getTime()};const datetimeLFormat=d3.timeFormat("%Y%m%d%H");const dateL=datetimeLFormat(new Date);const dateBase=240725;let historyReplayMode=true,currentHistory=false,historyid=0;let filterInView=false;let viewer=false,buildingStructures=false;let quadrants=false,xstep,ystep,toggleEntitiesActive;const cOrientation={heading:.564914,pitch:-.666377,roll:0};const cPosition={x:4314189.259370745,y:1858654.8332667248,z:4302964.204503857};const sceneEdgeCoords2=new Cesium.Cartesian2,sceneEdgeCoords3=new Cesium.Cartesian3,sceneEdgeCoordsC=new Cesium.Cartographic;const initialFocus=getInitalFocusUrl();let sumbytes=10,progress=0,loadingdone=false;moveProgessbar(2);showIntroInfo();setTimeout(()=>moveProgessbar(sumbytes),7e3);d3.json("/cityplan/data/buildings.sofia.geojson?"+dateL).then(data=>{moveProgessbar(2);data=data.features.filter(b=>b.properties.baselevel&&b.properties.height);initQuadrants(data);initHeightStructures(data);initTimeSlider(data);data=false});function listenTileLoad(){viewer.scene.primitives.get(0).allTilesLoaded.removeEventListener(listenTileLoad);moveProgessbar(2)}function moveProgessbar(move){progress+=move;if(progress>sumbytes)progress=sumbytes;let current=Math.ceil(100*progress/sumbytes);d3.select("body").transition().duration(progress>=sumbytes?200:1e3).on("start",()=>{d3.select("#progress-counter h1").text(current+"%")}).on("end",()=>{if(progress>=sumbytes&&!loadingdone){loadingdone=true;d3.select("#progress-counter").remove();processLoad()}}).style("background","linear-gradient(to right, lightgray "+current+"%, white 0%)")}const map=L.map("map",{center:[42.684,23.327],zoom:13,minZoom:11,maxZoom:19,maxBounds:[[43.4,26.2],[41.5,22]],maxBoundsViscosity:1,bounceAtZoomLimits:false,touchZoom:true,scrollWheelZoom:!isIFrame(),zoomSnap:.3});map.addControl(new L.Control.Button({title:"Филтри",cl:"leaflet-control-filter",click:toggleFilter}));map.addControl(new L.Control.Button({title:"Търси по кратко описание",cl:"leaflet-control-search leaflet-control-disabled",click:()=>{}}));map.addControl(new L.Control.Button({title:"Покажи карта с документи от градоустройството",cl:"leaflet-control-map2d",click:switchToDocsMap}));map.addControl(new L.Control.Button({title:"Документи",cl:"leaflet-control-info",click:toggleInfo}));map.addControl(new L.Control.Button({title:"Намери близки до мен документи",cl:"leaflet-control-locate leaflet-control-disabled",click:()=>{}}));d3.select(".leaflet-map-pane").style("display","none");viewer=new Cesium.Viewer("cesiumContainer",{imageryProvider:false,baseLayerPicker:false,homeButton:false,navigationHelpButton:false,scene3DOnly:true,sceneModePicker:false,fullscreenButton:false,geocoder:false,globe:false,timeline:false,animation:false,requestRenderMode:false,infoBox:false,selectionIndicator:false,skyAtmosphere:new Cesium.SkyAtmosphere,showRenderLoopErrors:false,contextOptions:{webgl:{powerPreference:isIPhone()?"default":"high-performance"}}});const tilesetOptions=isMobile()?{cacheBytes:30*1024*1024,maximumCacheOverflowBytes:300*1024*1024,maximumScreenSpaceError:50,enableCollision:true,showCreditsOnScreen:true}:{cacheBytes:1536*1024*1024,maximumCacheOverflowBytes:1024*1024*1024,maximumScreenSpaceError:16,enableCollision:true,showCreditsOnScreen:true};const resource=new Cesium.Resource({url:"https://tile.googleapis.com/v1/3dtiles/root.json",queryParameters:{key:google3dTilesKey},credits:[Cesium.GoogleMaps.getDefaultCredit()]});Cesium.Cesium3DTileset.fromUrl(resource,tilesetOptions).then(tileset=>{moveProgessbar(2);tileset.allTilesLoaded.addEventListener(listenTileLoad);viewer.scene.primitives.add(tileset)});Cesium.GeoJsonDataSource.clampToGround=true;viewer.camera.percentageChanged=.1;viewer.camera.setView(initialFocus.location);map.zoomControl._zoomInButton.onclick=a=>viewer.camera.zoomIn(1e3);map.zoomControl._zoomOutButton.onclick=a=>viewer.camera.zoomOut(1e3);function toggleFilter(){d3.select("#filterbox").transition().duration(300).on("start",()=>{filterInView=!filterInView;setHistory("togglefilter")}).style("top",filterInView?"-600px":null)}function toggleInfo(){d3.select("#infobox").transition().duration(300).on("start",()=>infoInView=!infoInView).style("bottom",infoInView?null:"-2px")}function switchToDocsMap(){window.location="https://govalert.eu/cityplan"}function showIntroInfo(){showInfo(d3.select(isMobile()?"#ht_3dhelpmobile":"#ht_3dhelp").node().innerHTML);setTimeout(hideInfo,1e4)}function showInfo(content){if(infoInView){d3.select("#infobox > div.infocontainer").transition().duration(150).style("opacity",0).on("end",()=>d3.select("#infobox > div.infocontainer").html(content)).transition().duration(150).style("opacity",1)}else{d3.select("#infobox > div.infocontainer").html(content);d3.select("#infobox").transition().duration(300).on("start",()=>infoInView=true).style("bottom","-2px")}}function hideInfo(){d3.select("#infobox").transition().duration(300).on("start",()=>infoInView=false).style("bottom",null);clickedPoint=false}function processLoad(){d3.selectAll("body>div").style("visibility",null);d3.select("#filter3dmap").style("display","block");d3.selectAll("input[id^='cat']").on("change",updateFilters);d3.select("#togglecat").on("click",toggleFilters);d3.select(".closable-filter").on("click",toggleFilter);d3.select(".closable-info").on("click",hideInfo);viewer.trackedEntityChanged.addEventListener(()=>viewer.trackedEntity=false);let handler=new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);handler.setInputAction(hideInfo,Cesium.ScreenSpaceEventType.LEFT_CLICK);initDisplay()}function initDisplay(){if(!areQuadrantsReady())setTimeout(initDisplay,100);else{initFirstFilter();initToggleEntities();initHistoryProcessing();updateFiltersHints()}}function initQuadrants(buildingData){let coords=buildingData.map(f=>f.geometry.coordinates[0]).flat();let xmin=d3.min(coords,c=>c[0]);let xmax=d3.max(coords,c=>c[0]);let ymin=d3.min(coords,c=>c[1]);let ymax=d3.max(coords,c=>c[1]);let step=10;xstep=(xmax-xmin)/step,ystep=(ymax-ymin)/step;coords=null;quadrants=d3.groups(buildingData,f=>Math.floor((f.geometry.coordinates[0][0][0]-xmin)/xstep)*10+Math.floor((f.geometry.coordinates[0][0][1]-ymin)/ystep));let quadrantsDone=quadrants.length;quadrants.forEach(g=>{Cesium.GeoJsonDataSource.load({type:"FeatureCollection",features:g[1]},{fill:Cesium.Color.fromCssColorString("#ab3f3f"),strokeWidth:0,stroke:Cesium.Color.RED.withAlpha(.1)}).then(dataSource=>{dataSource.entities.values.forEach(e=>{e.polygon.height=e.properties.baselevel+20;e.polygon.extrudedHeight=e.polygon.height+e.properties.height+25;e.polygon.arcType=Cesium.ArcType.GEODESIC});g[1]=dataSource;if(--quadrantsDone<=0)moveProgessbar(2)});g[0]=[Math.floor(g[0]/10)*xstep+xmin,g[0]%10*ystep+ymin];g[2]=false})}function displayQuadrants(){if(quadrants)quadrants.forEach(q=>viewer.dataSources.add(q[1]))}function areQuadrantsReady(){return quadrants&&quadrants.filter(q=>Array.isArray(q[1])).length==0}function initHeightStructures(buildingData){let buildingGroupNames=d3.selectAll("input[id^='cat']").nodes().map(n=>parseInt(n.getAttribute("height")));buildingStructures=d3.rollups(buildingData,l=>{let mheight=d3.max(l,e=>e.properties.height);let mcr=d3.max(l,e=>e.properties.cr);let mcat=buildingGroupNames.filter(g=>g<=mheight).length;return{height:mheight,cr:mcr,cat:mcat}},e=>"st"in e.properties&&e.properties.st>=0?-e.properties.st:e.properties.id)}function initToggleEntities(){toggleEntitiesActive=true;hideGovAlertAdHidden=true;toggleEntities();hideGovAlertAdHidden=false;viewer.camera.changed.addEventListener(()=>toggleEntitiesActive=true);setInterval(toggleEntities,1e3)}function toggleEntities(){if(quadrants&&toggleEntitiesActive){try{let clientWidth=viewer.scene.canvas.clientWidth-1,clientHeight=viewer.scene.canvas.clientHeight-1;if(!clientWidth||!clientHeight||clientWidth<100||clientHeight<100)return;let view=[getSceneEdge(1,1),getSceneEdge(clientWidth,1),getSceneEdge(1,clientHeight),getSceneEdge(clientWidth,clientHeight)];if(view.includes(false))return;let w=Cesium.Math.toDegrees(d3.min(view,c=>c[0])),e=Cesium.Math.toDegrees(d3.max(view,c=>c[0])),s=Cesium.Math.toDegrees(d3.min(view,c=>c[1])),n=Cesium.Math.toDegrees(d3.max(view,c=>c[1]));quadrants.forEach(q=>{q[1].show=q[0][0]>w-xstep&&q[0][0]s-ystep&&q[0][1]n.checked?i:null);let idFilter=buildingStructures.filter(e=>e[1].cr>=timeFilter[0]&&e[1].cr<=timeFilter[1]);let labels=[0];catNodes.forEach((n,i)=>labels.push(idFilter.filter(e=>e[1].cat==i).length));idFilter=idFilter.filter(e=>catFilter.includes(e[1].cat)).map(e=>e[0]);labels[0]=idFilter.length;quadrants.forEach(q=>q[1].entities.values.forEach(e=>e.show=idFilter.includes("st"in e.properties?-e.properties.st.getValue():e.properties.id.getValue())));viewer.scene.requestRender();correctFilters(catFilter);updateFiltersHints(labels);if(arg||this&&this.id){setHistory()}}}function updateFiltersHints(labels){if(!labels){if(buildingStructures){labels=[buildingStructures.length];d3.selectAll("label span[id^='cat']").nodes().forEach((n,i)=>labels.push(buildingStructures.filter(e=>e[1].cat==i).length))}else return}d3.select("#catallc").text("("+labels[0]+")");d3.selectAll("label span[id^='cat']").nodes().forEach((n,i)=>n.textContent="("+labels[i+1]+")")}function toggleFilters(){let checked=d3.select("#togglecat").node().checked;d3.select("label[for='togglecat']").html((checked?"Скрий":"Покажи")+" всички");if(checked)sliderTime.value(sliderTime.default());d3.selectAll("input[id^='cat']").nodes().forEach(i=>i.checked=checked);updateFilters("force")}function correctFilters(catFilter){let isDefault=sliderTime.isBase()&&!catFilter.includes(null);if(d3.select("#togglecat").node().checked!=isDefault){d3.select("#togglecat").node().checked=isDefault;d3.select("label[for='togglecat']").html((isDefault?"Скрий":"Покажи")+" всички")}}function initFirstFilter(){if(initialFocus.filterInView){d3.select("#filterbox").transition().duration(300).style("top",null)}let hasCatFilter=initialFocus.filter&&initialFocus.filter.length>0;if(hasCatFilter){d3.selectAll("input[id^='cat']").nodes().forEach((n,i)=>n.checked=initialFocus.filter.length>i&&initialFocus.filter[i]==1)}if(initialFocus.filterTime||hasCatFilter)updateFilters()}function initTimeSlider(buildingData){let ends=d3.extent(buildingData,f=>f.properties.cr);let mind=decodeTimeBase(ends[0]);let maxd=decodeTimeBase(ends[1]);let valued=[mind,maxd];if(initialFocus.filterTime){valued=[decodeTimeBase(initialFocus.filterTime[0]),decodeTimeBase(initialFocus.filterTime[1])]}sliderTime=d3.sliderBottom().min(mind).max(maxd).default([mind,maxd]).value(valued).step(1e3*60*60*24).width(340).tickFormat(dateFormatMY).tickValues(d3.timeMonth.range(mind,maxd,1)).fill("#2196f3").displayValue(false).on("onchange",val=>d3.select("#value-time").text(dateFormat(val[0])+" и "+dateFormat(val[1]))).on("end",updateFilters);sliderTime.defaultBase=ends;sliderTime.valueBase=()=>sliderTime.value().map(encodeTimeBase);sliderTime.isBase=()=>{let v=sliderTime.valueBase();return v[0]==sliderTime.defaultBase[0]&&v[1]==sliderTime.defaultBase[1]};let gTime=d3.select("#slider-time").append("svg").attr("width",380).attr("height",45).attr("viewBox","0 0 380 45").append("g").attr("transform","translate(20,10)").call(sliderTime);sliderTime.on("onchange")(sliderTime.value())}function decodeTimeBase(t){return dateParseSh(dateBase+t+"12")}function encodeTimeBase(t){return dateFormatSh(t)*1-dateBase}function initHistoryProcessing(){viewer.camera.changed.addEventListener(setHistory,viewer.camera.changed);window.onpopstate=processHistroy;historyReplayMode=false}function setHistory(e){try{let isMapMove=this&&this==viewer.camera.changed;if(!historyReplayMode){let params=getLocationParams();let location=params&¶ms.length>0?params[0]:false,filtersPrint=params&¶ms.length>1?"/"+params[1]:"",draftHistory=!currentHistory?{}:{filter:currentHistory.filter,filtersShow:currentHistory.filtersShow,filterTime:currentHistory.filterTime,destination:currentHistory.destination,orientation:currentHistory.orientation};if(isMapMove||!currentHistory||location==false){let c=viewer.camera;location=fixedLengthNumber(c.position.x,6)+fixedLengthNumber(c.position.y,6)+fixedLengthNumber(c.position.z,6)+fixedLengthNumber(c.heading*100,3)+fixedLengthNumber(-c.pitch*100,3);draftHistory.destination=c.position.clone();draftHistory.orientation={heading:c.heading,pitch:c.pitch,roll:6.28}}if(!isMapMove||!currentHistory||e=="togglefilter"){let filterAr=d3.selectAll("input[id^='cat']").nodes().map(n=>n.checked?1:0);let filterTime=sliderTime.valueBase();let filterTimeIsDefault=sliderTime.isBase();if(filterAr.indexOf(0)>=0||filterInView||!filterTimeIsDefault){filtersPrint="/"+("00"+parseInt((filterInView?"1":"0")+filterAr.join(""),2)).substr(-3);if(!filterTimeIsDefault)filtersPrint+=","+filterTime[0]+","+filterTime[1]}else{filtersPrint=""}draftHistory.filter=filterAr;draftHistory.filtersShow=filterInView;draftHistory.filterTime=filterTimeIsDefault?null:filterTime}if(JSON.stringify(currentHistory)!=JSON.stringify(draftHistory)){currentHistory=draftHistory;let context="/cityplan/buildings/!"+location+filtersPrint,currentTime=(new Date).getTime(),oldTime=window.history&&window.history.state&&window.history.state.timest?window.history.state.timest:false;let oldState=!oldTime||currentTime-oldTime>3e3;let state={id:historyid++,params:draftHistory,timest:oldState||!oldTime?currentTime:oldTime};if(isMapMove&&!oldState)window.history.replaceState(state,"",context);else window.history.pushState(state,"",context)}}else if(e&&!isMapMove){historyReplayMode=false}}catch(error){console.error(error)}}function processHistroy(e){if(e.state){historyReplayMode=true;let params=e.state.params&&!Array.isArray(e.state.params)?e.state.params:{filter:[],filtersShow:false,filterTime:null,destination:cPosition,orientation:cOrientation};if("filtersShow"in params){filterInView=params.filtersShow;d3.select("#filterbox").transition().duration(300).style("top",params.filtersShow?null:"-600px")}let filterChanged=params.filter&&JSON.stringify(params.filter)!=JSON.stringify(currentHistory.filter);let timebase=sliderTime.valueBase();let filterTimeSet=params.filterTime&¶ms.filterTime.length==2;let filterTimeChanged=filterTimeSet&&(timebase[0]!=params.filterTime[0]||timebase[1]!=params.filterTime[1])||!filterTimeSet&&!sliderTime.isBase();if(filterChanged){d3.selectAll("input[id^='cat']").nodes().forEach((n,i)=>n.checked=!params.filter||params.filter.length<=i||params.filter[i])}if(filterTimeChanged){sliderTime.value(!filterTimeSet?sliderTime.default():[decodeTimeBase(params.filterTime[0]),decodeTimeBase(params.filterTime[1])])}if(filterChanged||filterTimeChanged)updateFilters();if(JSON.stringify(params.destination)!=JSON.stringify(currentHistory.destination)||JSON.stringify(params.orientation)!=JSON.stringify(currentHistory.orientation)){params.duration=1;params.complete=()=>historyReplayMode=false;viewer.camera.flyTo(params)}else{historyReplayMode=false}}}function getInitalFocusUrl(){let params=getLocationParams();let result={location:{destination:cPosition,orientation:cOrientation},filter:[],filterInView:false,filterTime:null};if(params&¶ms.length>0&¶ms[0].length>0&&!isNaN(+params[0])){result.location={destination:{x:+params[0].substr(0,6)+4e6,y:+params[0].substr(6,6)+1e6,z:+params[0].substr(12,6)+4e6},orientation:{heading:+params[0].substr(18,3)/100,pitch:-params[0].substr(21,3)/100,roll:6.28}};if(params.length>1){let filterparts=params[1].split(",");if(filterparts.length>0){let heightFilters=parseInt(filterparts[0]).toString(2).split("").map(i=>+i);result.filterInView=heightFilters.shift()==1;result.filter=heightFilters}if(filterparts.length>=3){result.filterTime=[parseInt(filterparts[1]),parseInt(filterparts[2])]}}}currentHistory={filter:result.filter,filtersShow:result.filterInView,filterTime:result.filterTime,destination:result.location.destination,orientation:result.location.orientation};window.history.replaceState(currentHistory,"",document.location.pathname);return result}function getLocationParams(){let code=document.location.pathname;return code.indexOf("!")>0?code.substr(code.indexOf("!",1)+1).split("/").filter(a=>a):false}function fixedLengthNumber(n,l){let number=(Math.round(n)+Math.pow(10,l)).toString();return number.substr(number.length-l)}function isIFrame(){try{return window.self!==window.top||window.frameElement!=null}catch(e){return true}}function isIPhone(){let agent=navigator.platform||navigator.userAgent||navigator.vendor||window.opera;return agent&&agent.toLowerCase().includes("iphone")}function isMobile(){let check=false;(function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4)))check=true})(navigator.userAgent||navigator.vendor||window.opera);return check}