3d-viewer/stl_viewer/stl_viewer.min.js
2022-11-02 22:25:09 +03:00

2 lines
37 KiB
JavaScript

//=========== Stl Viewer v1.13, by Omri Rips, Viewstl.com, July 2021 ; admin@viewstl.com ===========
var stl_viewer_script_path="";function StlViewer(e,t){e||console.log("error: no parent element");var o=this;this.error=null,this.options=t,this.parent_element=e,this.get_opt=function(e,t){return o.options?!1!==o.options[e]&&(o.options[e]?o.options[e]:t):t},this.canvas_width="100%",this.canvas_height="100%",this.bg_color="transparent",this.models_to_add=[],this.models=new Array,this.models_count=0,this.models_ref=new Array,this.allow_drag_and_drop=o.get_opt("allow_drag_and_drop",!0),this.model_loaded_callback=null,this.all_loaded_callback=null,this.load_error_callback=null,this.loading_progress_callback=null,this.max_model_id=0,this.load_status=new Array,this.load_session=0,this.loaded_models_arr=new Array,this.status=0,this.onmousedown_callback=null,this.zoom=-1,this.camerax=0,this.cameray=0,this.cameraz=0,this.camera_state=null,this.auto_rotate=!1,this.mouse_zoom=!0,this.load_three_files=o.get_opt("load_three_files",stl_viewer_script_path),this.ready="undefined"!=typeof THREE,this.ready_callback=null,this.jszip_path=null,this.jszip_utils_path=null,this.auto_resize=!0,this.on_model_drop=null,this.center_models=!0,this.controls_type=0,this.zoom=-1,this.pre_loaded_ab_files=null,this.pre_loaded_vsj=null,this.zip_load_count=-1,this.send_no_model_click_event=!1,this.grid=null,this.killsign=!1,this.default_face_color="#909090",this.set_on_model_mousedown=function(e){o.onmousedown_callback=e,o.onmousedown_callback&&(o.parent_element.addEventListener("mousedown",o.onmousedown),o.parent_element.addEventListener("dblclick",o.onmousedown),o.parent_element.addEventListener("touchstart",o.onmousedown))},this.set_drag_and_drop=function(e){e?(o.parent_element.addEventListener("dragover",o.handleDragOver),o.parent_element.addEventListener("drop",o.handleFileDrop)):(o.parent_element.removeEventListener("dragover",o.handleDragOver),o.parent_element.removeEventListener("drop",o.handleFileDrop))},this.set_options=function(){o.canvas_width=o.get_opt("width",o.canvas_width),o.canvas_height=o.get_opt("height",o.canvas_height),o.bg_color=o.get_opt("bg_color",o.bg_color),o.models_to_add=o.get_opt("models",o.models_to_add),o.model_loaded_callback=o.get_opt("model_loaded_callback",o.model_loaded_callback),o.all_loaded_callback=o.get_opt("all_loaded_callback",o.all_loaded_callback),o.load_error_callback=o.get_opt("load_error_callback",o.load_error_callback),o.loading_progress_callback=o.get_opt("loading_progress_callback",o.loading_progress_callback),o.onmousedown_callback=o.get_opt("on_model_mousedown",o.onmousedown_callback),o.onmousedown_callback||(o.onmousedown_callback=o.get_opt("on_model_mouseclick",null)),o.send_no_model_click_event=o.get_opt("send_no_model_click_event",o.send_no_model_click_event),o.zoom=o.get_opt("zoom",o.zoom),o.camerax=o.get_opt("camerax",o.camerax),o.cameray=o.get_opt("cameray",o.cameray),o.auto_rotate=o.get_opt("auto_rotate",o.auto_rotate),o.mouse_zoom=o.get_opt("mouse_zoom",o.mouse_zoom),o.ready_callback=o.get_opt("ready_callback",null),o.jszip_path=o.get_opt("jszip_path",null),o.jszip_utils_path=o.get_opt("jszip_utils_path",null),o.auto_resize=o.get_opt("auto_resize",o.auto_resize),o.on_model_drop=o.get_opt("on_model_drop",o.on_model_drop),o.center_models=o.get_opt("center_models",o.center_models),o.controls_type=o.get_opt("controls",o.controls_type),o.grid=o.get_opt("grid",!!o.grid),o.zoom>=0?o.cameraz=o.zoom:o.cameraz=o.get_opt("cameraz",o.cameraz),o.camera_state=o.get_opt("camera_state",o.camera_state),o.allow_drag_and_drop&&o.set_drag_and_drop(!0)},o.is_ie=!!window.MSStream,this.MSG2WORKER_DATA=0,this.MSG2WORKER_LOAD=1,this.MSG2WORKER_ERROR=2,this.MSGFROMWORKER_STL_LOADED=3,this.MSGFROMWORKER_LOAD_IN_PROGRESS=4,this.load_model=function(e){return o.max_model_id=Math.max(o.max_model_id,e.id),e.filename||e.local_file?o.load_from_stl_file(e,!1):e.mesh?o.add_from_existing_mesh(e):void o.models_count--},this.add_from_existing_mesh=function(e){o.set_model_custom_props(e),e.mesh.model_id=e.id,o.set_geo_minmax(e),o.recalc_dims(e),e.color="#"+e.mesh.material.color.getHexString(),o.scene.add(e.mesh),o.model_loaded(e.id),o.check_loading_status(e,0,0),e.mesh.geometry.boundingBox||e.mesh.geometry.computeBoundingBox(),o.model_loaded_callback&&o.model_loaded_callback(e.id)},this.load_from_stl_file=function(e){var t=new Worker(("string"==typeof o.load_three_files?o.load_three_files:"")+"load_stl.min.js");t.onmessage=function(a){switch(a.data.msg_type){case o.MSGFROMWORKER_STL_LOADED:e.colors=a.data.colors;var i=o.vf_to_geo(a.data.vertices,a.data.faces,!!a.data.colors&&a.data.colors,e.color);if(i){var n=new THREE.MeshLambertMaterial({color:9474192,wireframe:!1,vertexColors:e.color?THREE.NoColors:THREE.FaceColors});o.is_ie||(n.side=THREE.DoubleSide),e.display||(e.display="flat"),o.set_material_display(e.display,n,i),e.mesh=new THREE.Mesh(i,n),o.set_model_custom_props(e),o.set_geo_minmax(e),e.mesh.model_id=e.id,o.recalc_dims(e),o.scene.add(e.mesh),o.model_loaded(e.id),o.model_loaded_callback&&o.model_loaded_callback(e.id)}else console.log("Error VF data ");t.terminate(),t=void 0,o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&delete o.pre_loaded_ab_files[e.filename];break;case o.MSGFROMWORKER_LOAD_IN_PROGRESS:o.check_loading_status(e,a.data.loaded,a.data.total);break;case o.MSG2WORKER_ERROR:o.models_count--,o.model_error("ERROR: "+a.data.data,o.load_error_callback),o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&delete o.pre_loaded_ab_files[e.filename]}},e.bytes_loaded=0,e.bytes_total=0;var a=null;o.pre_loaded_ab_files&&e.filename&&o.pre_loaded_ab_files[e.filename]&&(a=o.pre_loaded_ab_files[e.filename]),t.postMessage({msg_type:o.MSG2WORKER_DATA,data:e,load_from_blob_or_ab:a,get_progress:null!=o.loading_progress_callback,jszip_path:o.jszip_path}),t.postMessage({msg_type:o.MSG2WORKER_LOAD})},this.model_loaded=function(e){o.loaded_models_arr[e]=1,Object.keys(o.loaded_models_arr).length>=o.models_count&&(o.camera_state?o.camera_state=null:o.set_zoom(),o.set_light(),o.set_grid(!!o.grid),o.load_session++,o.all_loaded_callback&&o.all_loaded_callback())},this.set_grid=function(e,t,a){if(o.grid&&o.scene.remove(o.grid),o.grid=null,e){if(t||(t=2.5*Math.max(Math.abs(o.maxx),Math.abs(o.minx))),t<=0){var i=isNaN(window.innerHeight)?window.clientHeight:window.innerHeight,n=isNaN(window.innerWidth)?window.clientWidth:window.innerWidth;t=.8*Math.min(i,n)}a||(a=10),o.grid=new THREE.GridHelper(t,a),o.scene.add(o.grid)}},this.remove_model=function(e){if(void 0===o.models_ref[e])return o.model_error("remove_model - id not found: "+e);var t=o.models[o.models_ref[e]];t&&(o.set_or_update_geo_edges(t,!1),delete o.models[o.models_ref[e]],delete o.models_ref[e],delete o.loaded_models_arr[e],o.max_model_id=-1,Object.keys(o.models_ref).forEach(function(e){o.max_model_id=Math.max(o.models[o.models_ref[e]].id,o.max_model_id)}),o.models_count=Object.keys(o.models).length,o.scene.remove(t.mesh))},this.zoom_done=!1,this.set_zoom=function(e,t){if(e&&(o.zoom=e),o.zoom_done&&!t)return;o.zoom_done=!0;var a=o.zoom;o.zoom<0&&(a=o.calc_z_for_auto_zoom()),o.camera.position.set(o.camera.position.x,o.camera.position.y,a);const i=o.minz,n=i<0?-i+a:a-i;o.camera.far=Math.max(3e3*n,o.camera.far),o.camera.updateProjectionMatrix()},this.calc_z_for_auto_zoom=function(e){e=e||1.01;const t=new THREE.Box3(new THREE.Vector3(o.minx,o.miny,o.minz),new THREE.Vector3(o.maxx,o.maxy,o.maxz));var a=new THREE.Vector3;t.getSize(a);const i=o.camera.fov*(Math.PI/180),n=2*Math.atan(Math.tan(i/2)*o.camera.aspect);let l=a.z/2+Math.abs(a.x/2/Math.tan(n/2)),s=a.z/2+Math.abs(a.y/2/Math.tan(i/2)),r=Math.max(l,s);return r*=e},this.get_camera_state=function(){if(!o.camera)return null;var e=new THREE.Vector3,t=new THREE.Vector3,a=new THREE.Vector3(0,0,0);return e.copy(o.camera.position),t.copy(o.camera.up),o.controls&&a.copy(o.controls.target),{position:e,up:t,target:a}},this.set_camera_state=function(e){if(!o.camera)return null;if(!e)return o.model_error("set_camera_state - no state vector");if(void 0!==e.position){if(void 0===e.position.x)return o.model_error("set_camera_state - invalid position x");if(void 0===e.position.y)return o.model_error("set_camera_state - invalid position y");if(void 0===e.position.z)return o.model_error("set_camera_state - invalid position z");o.camera.position.set(e.position.x,e.position.y,e.position.z)}if(void 0!==e.up){if(void 0===e.up.x)return o.model_error("set_camera_state invalid up x");if(void 0===e.up.y)return o.model_error("set_camera_state invalid up y");if(void 0===e.up.z)return o.model_error("set_camera_state invalid up z");o.camera.up.set(e.up.x,e.up.y,e.up.z)}if(o.controls&&void 0!==e.target){if(void 0===e.target.x)return o.model_error("set_camera_state - invalid target x");if(void 0===e.target.y)return o.model_error("set_camera_state - invalid target y");if(void 0===e.target.z)return o.model_error("set_camera_state - invalid target z");o.controls.target.set(e.target.x,e.target.y,e.target.z)}},this.set_center_models=function(e){o.center_models=e},this.set_light=function(){o.directionalLight.position.x=2*o.maxy,o.directionalLight.position.y=2*o.miny,o.directionalLight.position.z=2*o.maxz,o.pointLight.position.x=(o.miny+o.maxy)/2,o.pointLight.position.y=(o.miny+o.maxy)/2,o.pointLight.position.z=2*o.maxz},this.stop_auto_zoom=function(){o.zoom=o.camera.position.z,o.zoom_done=!0},this.set_camera=function(e,t,a){t&&(o.zoom=t),o.camera.position.set(o.is_empty(e)?o.camera.position.x:e,o.is_empty(t)?o.camera.position.y:t,o.is_empty(a)?o.camera.position.z:a)},this.set_auto_zoom=function(){o.set_zoom(-1)},this.check_loading_status=function(e,t,a){e&&(o.load_status[e.id]={loaded:t,total:a,load_session:o.load_session}),o.loading_progress_callback&&Object.keys(o.load_status).length==o.models_count&&o.loading_progress_callback(o.load_status,o.load_session)},this.set_edges=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_edges - id not found: "+e);var a=o.models[o.models_ref[e]];a&&o.set_or_update_geo_edges(a,t)},this.set_or_update_geo_edges=function(e,t,a){if(t&&!a||(e.edges&&o.scene.remove(e.edges),e.edges=null,t)){var i=!1;if(a=a||!1,!e.edges||a){var n=e.mesh.geometry;e.edges=new THREE.LineSegments(new THREE.EdgesGeometry(n),o.edges_material),i=!0}(e.x||e.y||e.z)&&e.edges.position.set(e.x?e.x:0,e.y?e.y:0,e.z?e.z:0),e.edges.rotation.setFromRotationMatrix(e.mesh.matrix),i&&o.scene.add(e.edges)}},this.set_model_custom_props=function(e){e.units=e.units?e.units:"mm",o.set_model_units(e.id,e.units,!0),e.x=e.x?e.x:0,e.y=e.y?e.y:0,e.z=e.z?e.z:0,e.mesh.position.set(e.x,e.y,e.z),e.color?o.update_mesh_color(e.mesh,e.color,!1):e.colors&&o.update_mesh_color(e.mesh,"#FFFFFF",!0),e.rotationx=e.rotationx?e.rotationx:0,e.rotationy=e.rotationy?e.rotationy:0,e.rotationz=e.rotationz?e.rotationz:0,(e.rotationx||e.rotationy||e.rotationz)&&o.set_rotation(e.id,e.rotationx,e.rotationy,e.rotationz);var t=void 0!==e.scale?e.scale:1,a=void 0!==e.scalex?e.scalex:t,i=void 0!==e.scaley?e.scaley:t,n=void 0!==e.scalez?e.scalez:t;e.scalex=a,e.scaley=i,e.scalez=n,1==a&&1==i&&1==n||o.scale_geo(e,a,i,n),e.view_edges&&o.set_or_update_geo_edges(e,!0),void 0!==e.opacity&&this.set_material_opacity(e.mesh.material,e.opacity),e.animation&&(o.animation[e.id]=1)},this.set_scale=function(e,t,a,i,n){if(void 0===o.models_ref[e])return o.model_error("set_scale - id not found: "+e);var l=o.models[o.models_ref[e]];if(l&&l.mesh&&l.mesh.geometry){var s=Math.max(l.scalex,.01),r=Math.max(l.scaley,.01),d=Math.max(l.scalez,.01);t&&(l.scalex=Math.max(t,.01)),l.scaley=Math.max(a||t,.01),l.scalez=Math.max(i||t,.01),o.scale_geo(l,l.scalex/s,l.scaley/r,l.scalez/d),l.edges&&o.set_or_update_geo_edges(l,!0,!0),n&&(l.scalex=s,l.scaley=r,l.scalez=d)}},this.scale_geo=function(e,t,o,a){e.mesh.geometry.scale(t,o,a)},this.recalc_dims=function(e){var t=e.mesh.geometry;o.maxx=o.maxx?Math.max(o.maxx,t.maxx+e.x):t.maxx+e.x,o.maxy=o.maxy?Math.max(o.maxy,t.maxy+e.y):t.maxy+e.y,o.maxz=o.maxz?Math.max(o.maxz,t.maxz+e.z):t.maxz+e.z,o.minx=o.maxx?Math.min(o.minx,t.minx+e.x):t.minx+e.x,o.miny=o.maxy?Math.min(o.miny,t.miny+e.y):t.miny+e.y,o.minz=o.maxz?Math.min(o.minz,t.minz+e.z):t.minz+e.z},this.update_mesh_color=function(e,t,o){null!=e&&("transparent"!=t?(e.traverse(function(e){e.visible=!0}),e.material.vertexColors=o?THREE.FaceColors:THREE.NoColors,o&&!t&&(t="#FFFFFF"),t&&e.material.color.set(parseInt(t.substr(1),16)),e.material.needsUpdate=!0):e.traverse(function(e){e.visible=!1}))},this.set_color=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_color - id not found: "+e);var a=o.models[o.models_ref[e]];a&&a.mesh&&(t.length<6||("#"!=t.charAt(0)&&(t="#"+t),a.color=t,o.update_mesh_color(a.mesh,t,!t&&a.colors)))},this.error_in_model=function(e){if(!e.id&&0!=e.id&&-1!=e.id)return o.model_error("missing id");if(!Number.isInteger(e.id))return o.model_error("invalid id");if(e.id<-1)return o.model_error("id must be positive");if(!e.filename&&!e.mesh&&!e.local_file){if(!e.name)return o.model_error("missing filename or mesh");e.filename=e.name}return o.models_ref[e.id]?o.model_error("such model ID already exists: "+e.id):null},this.model_error=function(e,t){return console.log(e),o.status=-1,o.error=e,t&&t(e),e},this.set_bg_color=function(e){"transparent"==e?this.renderer.setClearColor(0,0):this.renderer.setClearColor(e,1),o.bg_color=e},this.set_display=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_display - id not found: "+e);var a=o.models[o.models_ref[e]];a&&(o.set_material_display(t,a.mesh.material,a.mesh.geometry),a.display=t,a.mesh&&(a.mesh.normalsNeedUpdate=!0))},this.set_opacity=function(e,t){if(void 0===o.models_ref[e])return o.model_error("set_display - id not found: "+e);var a=o.models[o.models_ref[e]];a&&(a.opacity=t,this.set_material_opacity(a.mesh.material,t))},this.set_material_opacity=function(e,t){e&&(t<1?(e.opacity=t,e.transparent=!0):(e.opacity=1,e.transparent=!1))},this.onmousedown=function(e){e.stopPropagation(),e.preventDefault();var t=e.which;switch(e.type){case"touchstart":t=20;var a=e.touches[0]||e.changedTouches[0];o.mouse.x=(a.pageX-o.parent_element.offsetLeft)/o.parent_element.clientWidth*2-1,o.mouse.y=-(a.pageY-o.parent_element.offsetTop)/o.parent_element.clientHeight*2+1;break;case"dblclick":t=11;default:o.mouse.x=(e.clientX-o.parent_element.offsetLeft)/o.parent_element.clientWidth*2-1,o.mouse.y=-(e.clientY-o.parent_element.offsetTop)/o.parent_element.clientHeight*2+1}o.raycaster.setFromCamera(o.mouse,o.camera);var i=o.raycaster.intersectObjects(o.scene.children);if(i.length>0){if(void 0===i[0].object.model_id)return;o.onmousedown_callback&&o.onmousedown_callback(i[0].object.model_id,e,i[0].distance,t)}else o.send_no_model_click_event&&o.onmousedown_callback(null,e,0,t)},this.is_empty=function(e){return!e&&0!==e},this.set_model_units=function(e,t,a){if(void 0===o.models_ref[e])return o.model_error("set_model_units - id not found: "+e);var i=o.models[o.models_ref[e]];if(i&&i.mesh){var n=1;switch(t){case"mm":a&&"inch"==i.units&&(n=1/25.4),i.units="mm";break;case"inch":a&&"mm"==i.units&&(n=25.4),i.units="inch";break;default:return o.model_error("set_model_units - invalid unit "+t)}1!=n&&o.set_scale(i.id,i.scalex*n,i.scaley*n,i.scalez*n,!0)}},this.set_position=function(e,t,a,i){if(void 0===o.models_ref[e])return o.model_error("set_position - id not found: "+e);var n=o.models[o.models_ref[e]];n&&n.mesh&&(n.x=o.is_empty(t)?n.x:t,n.y=o.is_empty(a)?n.y:a,n.z=o.is_empty(i)?n.z:i,n.mesh.position.set(n.x,n.y,n.z),n.edges&&o.set_or_update_geo_edges(n,!0,!0))},this.set_material_display=function(e,t,o){switch(e.toLowerCase()){case"wireframe":t.wireframe=!0;break;case"smooth":t.wireframe=!1,t.flatShading=!1,o&&(o.mergeVertices(),o.computeVertexNormals());break;case"flat":t.wireframe=!1,t.flatShading=!0,o&&o.computeFlatVertexNormals()}},this.set_rotation=function(e,t,a,i,n){if(void 0===o.models_ref[e])return o.model_error("rotate - id not found: "+e);var l=o.models[o.models_ref[e]];if(l){var s=n?1:0;void 0!==t&&(l.rotationx=t+l.mesh.rotation.x*s,l.mesh.rotation.x=l.rotationx),void 0!==a&&(l.rotationy=a+l.mesh.rotation.y*s,l.mesh.rotation.y=l.rotationy),void 0!==i&&(l.rotationz=i+l.mesh.rotation.z*s,l.mesh.rotation.z=l.rotationz),l.mesh.updateMatrixWorld(),l.edges&&o.set_or_update_geo_edges(l,!0)}},this.rotate=function(e,t,a,i){o.set_rotation(e,t,a,i,!0)},this.basename=function(e){return e.split(/[\\\/]/).pop()},this.get_model_filename=function(e,t,a,i){var n=null;return e.orig_url&&!i?n=decodeURIComponent(e.orig_url):e.orig_filename?n=e.orig_filename:e.temp_filename?n=e.temp_filename:e.local_file?e.local_file.name&&(n=e.local_file.name):e.filename&&(e.filename instanceof File&&(n=File.name),n=e.filename),!n&&t?"model_"+e.id+".stl":n?(a&&(n=o.basename(n)),n):null},this.add_model=function(e,t){if(Array.isArray(e))return o.add_models(e);if(!o.ready)return o.models_to_add.push(e),o.model_error("THREE JS files are not ready");var a=o.get_model_filename(e);if(a)switch(a.split(".").pop()){case"vsj":return o.load_vsj(e.local_file?e.local_file:a);case"vsb":return o.load_vsb(e.local_file?e.local_file:a)}void 0===e.id&&(e.id=-1);var i=o.error_in_model(e);if(i)return i;-1==e.id&&(e.id=++o.max_model_id),o.models.push(e);var n=o.models.indexOf(e);return t||void 0===o.models_ref[e.id]&&o.models_count++,o.models_ref[e.id]=n,o.load_model(e),o.status},this.add_models=function(e){if(!Array.isArray(e))return o.add_model(e);o.status=0;var t=Object.keys(e);return t.forEach(function(a){var i=o.get_model_filename(e[t[a]]);if(i)switch(i.split(".").pop()){case"vsj":case"vsb":break;default:void 0===o.models_ref[e[a].id]&&o.models_count++}else void 0===o.models_ref[e[a].id]&&o.models_count++}),t.forEach(function(t){o.add_model(e[t],!0)}),o.status},this.calc_volume_and_area=function(e,t){var o,a,i,n,l,s,r,d,_,c,m,u,f,h,p=e.faces.length,g=0,v=0;for(c=0;c<p;c++)o=e.vertices[e.faces[c].a].x*t,n=e.vertices[e.faces[c].a].y*t,r=e.vertices[e.faces[c].a].z*t,a=e.vertices[e.faces[c].b].x*t,l=e.vertices[e.faces[c].b].y*t,d=e.vertices[e.faces[c].b].z*t,g+=-(i=e.vertices[e.faces[c].c].x*t)*l*r+a*(s=e.vertices[e.faces[c].c].y*t)*r+i*n*d-o*s*d-a*n*(_=e.vertices[e.faces[c].c].z*t)+o*l*_,h=((m=e.vertices[e.faces[c].a].distanceTo(e.vertices[e.faces[c].b])*t)+(u=e.vertices[e.faces[c].b].distanceTo(e.vertices[e.faces[c].c])*t)+(f=e.vertices[e.faces[c].c].distanceTo(e.vertices[e.faces[c].a])*t))/2,v+=Math.sqrt(h*(h-m)*(h-u)*(h-f));return[Math.abs(g/6),v,e.faces.length]},this.get_model_info=function(e){if(void 0===o.models_ref[e])return o.model_error("get_model_info - id not found: "+e);var t=o.models[o.models_ref[e]];if(!t)return null;if(!t.mesh)return null;if(!t.mesh.geometry)return null;var a=t.mesh.geometry?o.calc_volume_and_area(t.mesh.geometry,"inch"==t.units?1/25.4:1):[0,0,0];return{name:t.filename?t.filename:t.local_file?t.local_file.name:"",orig_filename:t.orig_filename?t.orig_filename:null,position:{x:t.x,y:t.y,z:t.z},dims:{x:t.mesh.geometry.maxx-t.mesh.geometry.minx,y:t.mesh.geometry.maxy-t.mesh.geometry.miny,z:t.mesh.geometry.maxz-t.mesh.geometry.minz},rotation:{x:t.mesh.rotation.x,y:t.mesh.rotation.y,z:t.mesh.rotation.z},display:t.display?t.display:null,color:t.color?t.color:null,scale:{x:t.scalex,y:t.scaley,z:t.scalez},volume:a[0],area:a[1],triangles:a[2],units:t.units,opacity:void 0!==t.opacity?t.opacity:1}},this.get_vsb=function(){var e=[];return Object.keys(o.models_ref).forEach(function(t){e.push({id:t,bin:o.get_stl_bin(t)})}),{vsj:o.get_vsj(!0,!0,!0),files:e}},this.get_vsj=function(e,t,a){o.camera.position;var i={canvas_height:o.canvas_height,bg_color:o.bg_color,camera_state:o.get_camera_state(),auto_rotate:o.auto_rotate,mouse_zoom:o.mouse_zoom,auto_resize:o.auto_resize,center_models:o.center_models};return o.grid&&(i.grid=1),i.models=[],Object.keys(o.models_ref).forEach(function(e){var n=o.models[o.models_ref[e]],l={id:a?-1:n.id};if(a)l.filename=n.id+".stl";else{var s=o.get_model_filename(n,!0,t);s&&(l.filename=s),n.local_file&&(l.local_file=n.local_file)}n.x&&(l.x=n.x),n.y&&(l.y=n.y),n.z&&(l.z=n.z),n.display&&(l.display=n.display),n.colors&&"#ffffff"==n.color||n.color&&(l.color=n.color),n.units&&(l.units=n.units),n.rotationx&&(l.rotationx=n.rotationx),n.rotationy&&(l.rotationy=n.rotationy),n.rotationz&&(l.rotationz=n.rotationz),void 0===n.scale||a||1!=n.scale&&(l.scale=n.scale),1==n.scalex||a||(l.scalex=n.scalex),1==n.scaley||a||(l.scaley=n.scaley),1==n.scalez||a||(l.scalez=n.scalez),void 0!==n.opacity&&1!=n.opacity&&(l.opacity=n.opacity),n.view_edges&&(l.view_edges=n.view_edges),n.animation&&(l.animation=JSON.parse(JSON.stringify(n.animation)),delete l.animation.start_time,delete l.animation.last_time),i.models[o.models_ref[e]]=l}),e?i:o.json_without_nulls(i)},this.download_vsj=function(e){var t=new Blob([o.get_vsj()],{type:"application/json"}),a=document.createElement("a");a.href=window.URL.createObjectURL(t);var i=e||"1",n=i.toLowerCase().indexOf(".vsj");n>=0&&(i=i.substring(0,n)),i.length<1&&(i="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(t,i+".vsj"):(a.download=i+".vsj",a.click(),URL.revokeObjectURL(a.href))},this.load_vsj=function(e){if(!e)return o.pre_loaded_vsj?(stl_viewer.init_by_json(o.pre_loaded_vsj),o.pre_loaded_vsj=null,!0):o.model_error("load_vsj - invalid filename"+e,o.load_error_callback);if(e instanceof File)return o.read_bin_file(e,o.init_by_json,null,!0);var t=new XMLHttpRequest;t.onreadystatechange=function(e){4==t.readyState&&200==t.status&&o.init_by_json(t.response.trim())},t.open("GET",e,!0),t.send(null)},this.padend=function(e,t,o){return t>>=0,o=String(void 0!==o?o:" "),e.length>t?String(e):((t-=e.length)>o.length&&(o+=o.repeat(t/o.length)),String(e)+o.slice(0,t))},this.get_normal=function(e,t,o){var a=t.x-e.x,i=t.y-e.y,n=t.z-e.z,l=o.x-e.x,s=o.y-e.y,r=o.z-e.z,d={x:0,y:0,z:0};d.x=i*r-n*s,d.y=n*l-a*r,d.z=a*s-i*l;var _=Math.sqrt(d.x*d.x+d.y*d.y+d.z*d.z);return 0!=_&&(d.x/=_,d.y/=_,d.z/=_),d},this.get_stl_bin=function(e){if(void 0===o.models_ref[e])return o.model_error("get_stl_bin - id not found: "+e);var t=o.models[o.models_ref[e]];if(t&&t.mesh){var a=t.mesh.geometry;if(a){for(var i=new ArrayBuffer(84+50*a.faces.length),n=new DataView(i),l=(new TextEncoder,o.padend("Binary"+(t.colors?" colored":"")+" STL by viewstl.com",80," ")),s=0;s<80;s++)n.setUint8(s,l.charCodeAt(s),!0);n.setUint32(80,a.faces.length,!0);var r=84;return Object.keys(a.faces).forEach(function(e){var i=a.faces[e],l=a.vertices[i.a],s=a.vertices[i.b],d=a.vertices[i.c],_=o.get_normal(l,s,d);n.setFloat32(r,_.x,!0),r+=4,n.setFloat32(r,_.y,!0),r+=4,n.setFloat32(r,_.z,!0),r+=4,n.setFloat32(r,l.x,!0),r+=4,n.setFloat32(r,l.y,!0),r+=4,n.setFloat32(r,l.z,!0),r+=4,n.setFloat32(r,s.x,!0),r+=4,n.setFloat32(r,s.y,!0),r+=4,n.setFloat32(r,s.z,!0),r+=4,n.setFloat32(r,d.x,!0),r+=4,n.setFloat32(r,d.y,!0),r+=4,n.setFloat32(r,d.z,!0),r+=4,t.colors?n.setUint16(r,Math.ceil(31*i.color.r)|Math.ceil(31*i.color.g)<<5|Math.ceil(31*i.color.b)<<10,!0):n.setUint16(r,0,!0),r+=2}),i}}},this.basename=function(e){return e.substr(e.lastIndexOf("/")+1)},this.json_without_nulls=function(e){return JSON.stringify(e).split(",null").join("").split("null,").join("")},this.get_vsb_blob=function(){var e=null;try{e=new JSZip}catch(e){return console.log("download_vsb - JSZip is missing ",e.message),!1}var t=o.get_vsb();return e.file("json_data.vsj",o.json_without_nulls(t.vsj)),Object.keys(t.files).forEach(function(a){var i=o.get_model_filename(t.vsj.models[o.models_ref[t.files[a].id]],!0,!0);e.file(i,t.files[a].bin)}),e.generateAsync({type:"blob"})},this.download_vsb=function(e){o.get_vsb_blob(e).then(function(t){var o=new Blob([t],{type:"application/zip"}),a=document.createElement("a");a.href=window.URL.createObjectURL(o);var i=e||"1",n=i.toLowerCase().indexOf(".vsb");n>=0&&(i=i.substring(0,n)),i.length<1&&(i="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(o,i+".vsb"):(a.download=i+".vsb",a.click(),URL.revokeObjectURL(a.href))})},this.load_vsb=function(e){if(o.pre_loaded_ab_files=[],o.pre_loaded_vsj=null,e instanceof File)return o.read_bin_file(e,o.load_vsb_from_blob);JSZipUtils.getBinaryContent(decodeURIComponent(e),function(e,t){if(e)return o.model_error("load_vsb "+e,o.load_error_callback);o.load_vsb_from_blob(t)})},this.read_bin_file=function(e,t,o,a){var i=new FileReader;i.onerror=function(e){return console.log("reading file error",e),null},i.onload=function(e){return t(e.target.result)},o&&(i.onprogress=function(e){o({loaded:e.loaded,total:e.total,load_session:-1},-1)}),a?i.readAsText(e):i.readAsArrayBuffer(e)},this.load_vsb_from_blob=function(e){var t=null;try{t=new JSZip}catch(e){return console.log("load vsb - JSZip is missing ",e.message),!1}t.loadAsync(e).then(function(){o.zip_load_count=Object.keys(t.files).length,t.forEach(function(e,a){"json_data.vsj"==a.name?t.files[a.name].async("string").then(function(e){o.pre_loaded_vsj=e,o.zip_load_count--,0==o.zip_load_count&&o.load_vsj(null)}):t.files[a.name].async("blob").then(function(e){o.pre_loaded_ab_files[a.name]=e,o.zip_load_count--,0==o.zip_load_count&&o.load_vsj(null)})})})},this.download_model=function(e,t){if(void 0===o.models_ref[e])return o.model_error("download_model - id not found: "+e);var a=o.models[o.models_ref[e]];if(a&&a.mesh){var i=new Blob([o.get_stl_bin(e)],{type:"application/sla"}),n=document.createElement("a");n.href=window.URL.createObjectURL(i);var l=o.get_model_filename(a,!0,!0,!0),s=l.toLowerCase().indexOf(".stl");s>=0&&(l=l.substring(0,s)),l.length<1&&(l="1"),window.navigator.msSaveOrOpenBlob?window.navigator.msSaveBlob(i,l+".stl"):(n.download=l+".stl",n.click(),URL.revokeObjectURL(n.href))}},this.get_model_mesh=function(e){if(void 0===o.models_ref[e])return o.model_error("get_model_mesh - id not found: "+e);var t=o.models[o.models_ref[e]];if(t&&t.mesh){var a=t.mesh.clone();return a.geometry=t.mesh.geometry.clone(),a.material=t.mesh.material.clone(),a}},this.set_auto_rotate=function(e){o.controls.autoRotate=e},this.set_mouse_zoom=function(e){o.controls.noZoom=!e},this.WORLD_X_VECTOR=null,this.WORLD_Y_VECTOR=null,this.WORLD_Z_VECTOR=null,this.maxx=null,this.maxy=null,this.maxz=null,this.minx=null,this.miny=null,this.minz=null,this.edges_material=null,this.raycaster=null,this.mouse=null,this.scene=null,this.is_webgl=null,this.renderer=null,this.camera=null,this.ambientLight=null,this.directionalLight=null,this.pointLight=null,this.controls=null,this.do_resize=function(){if(o.parent_element){var e=o.parent_element.getBoundingClientRect(),t=e.width,a=e.height;o.camera.aspect=t/a,o.camera.updateProjectionMatrix(),o.renderer.setSize(t,a)}},this.animation=new Array,this.animate=function(){o.killsign||(Object.keys(o.animation).forEach(function(e){void 0!==o.models_ref[e]&&o.do_model_animation(o.models[o.models_ref[e]])}),requestAnimationFrame(o.animate),o.renderer&&o.renderer.render(o.scene,o.camera),o.controls&&o.controls.update())},this.do_model_animation=function(e){if(e.animation){var t=Date.now();if(e.animation.start_time||(e.animation.start_time=t),e.animation.delta){var a=(t-e.animation.start_time)/e.animation.delta.msec,i=e.animation.last_time?(t-e.animation.last_time)/e.animation.delta.msec:a;if(o.animation_next_delta(e,e.animation.delta,i),a>=1){if(!e.animation.delta.loop)return void o.remove_model_animation(e,!0);e.animation.delta.start_time=null}}if(e.animation.exact){i=(t-(e.animation.last_time?e.animation.last_time:e.animation.start_time))/e.animation.exact.msec;if(o.animation_next_exact(e,e.animation.exact,i),t>=e.animation.start_time+e.animation.exact.msec)return void o.remove_model_animation(e,!1,!0)}e.animation.last_time=t}},this.animation_next_delta=function(e,t,a){var i=!1,n=!1,l=!1;Object.keys(t).forEach(function(s){switch(s){case"x":case"y":case"z":i||(i=!0,o.set_position(e.id,e.x+(void 0!==t.x?t.x*a:0),e.y+(void 0!==t.y?t.y*a:0),e.z+(void 0!==t.z?t.z*a:0)));break;case"rotationx":case"rotationy":case"rotationz":n||(n=!0,o.rotate(e.id,void 0!==t.rotationx?t.rotationx*a:0,void 0!==t.rotationy?t.rotationy*a:0,void 0!==t.rotationz?t.rotationz*a:0));break;case"scale":case"scalex":case"scaley":case"scalez":l||(l=!0,t.scalex=t.scalex?t.scalex:t.scale?t.scale:null,t.scaley=t.scaley?t.scaley:t.scale?t.scale:null,t.scalez=t.scalez?t.scalez:t.scale?t.scale:null,o.set_scale(e.id,e.scalex+(void 0!==t.scalex?t.scalex*a:0),e.scaley+(void 0!==t.scaley?t.scaley*a:0),e.scalez+(void 0!==t.scalez?t.scalez*a:0)))}})},this.animation_next_exact=function(e,t,a){var i=!1,n=!1,l=!1;Object.keys(t).forEach(function(s){switch(s){case"x":case"y":case"z":i||(i=!0,void 0===t.xtotal&&(t.xtotal=t.x-e.x),void 0===t.ytotal&&(t.ytotal=t.y-e.y),void 0===t.ztotal&&(t.ztotal=t.z-e.z),o.set_position(e.id,e.x+(void 0!==t.x?t.xtotal*a:0),e.y+(void 0!==t.y?t.ytotal*a:0),e.z+(void 0!==t.z?t.ztotal*a:0)));break;case"rotationx":case"rotationy":case"rotationz":if(!n){n=!0;var r=e.mesh.getWorldRotation();void 0===t.rotxtotal&&(t.rotxtotal=t.rotationx-r.x),void 0===t.rotytotal&&(t.rotytotal=t.rotationy-r.y),void 0===t.rotztotal&&(t.rotztotal=t.rotationz-r.z),o.rotate(e.id,void 0!==t.rotationx?t.rotxtotal*a:0,void 0!==t.rotationy?t.rotytotal*a:0,void 0!==t.rotationz?t.rotztotal*a:0)}break;case"scale":case"scalex":case"scaley":case"scalez":l||(l=!0,t.scalex=t.scalex?t.scalex:t.scale?t.scale:null,t.scaley=t.scaley?t.scaley:t.scale?t.scale:null,t.scalez=t.scalez?t.scalez:t.scale?t.scale:null,void 0===t.scalextotal&&(t.scalextotal=t.scalex-e.scalex),void 0===t.scaleytotal&&(t.scaleytotal=t.scaley-e.scaley),void 0===t.scaleztotal&&(t.scaleztotal=t.scalez-e.scalez),o.set_scale(e.id,e.scalex+(void 0!==t.scalex?t.scalextotal*a:0),e.scaley+(void 0!==t.scaley?t.scaleytotal*a:0),e.scalez+(void 0!==t.scalez?t.scaleztotal*a:0)))}})},this.remove_model_animation=function(e,t,a){t&&(e.animation.delta=null),a&&(e.animation.exact=null),e.animation.delta||e.animation.exact||(e.animation=null,delete o.animation[e.id])},this.animate_model=function(e,t){if(void 0===o.models_ref[e])return o.model_error("animate-model - id not found: "+e);var a=o.models[o.models_ref[e]];if(a){if(!t)return o.remove_model_animation(a,!0,!0);a.animation=JSON.parse(JSON.stringify(t)),a.animation.delta&&(a.animation.delta.msec||(a.animation.delta.msec=300)),a.animation.exact&&(a.animation.exact.msec||(a.animation.exact.msec=300)),o.animation[e]=1}},this.init_done=!1,this.init=function(){if(!o.init_done){switch(o.WORLD_X_VECTOR=new THREE.Vector3(1,0,0),o.WORLD_Y_VECTOR=new THREE.Vector3(0,1,0),o.WORLD_Z_VECTOR=new THREE.Vector3(0,0,1),o.edges_material=new THREE.LineBasicMaterial({color:0}),o.raycaster=new THREE.Raycaster,o.mouse=new THREE.Vector2,o.scene=new THREE.Scene,o.is_webgl=webgl_Detector.webgl,o.renderer=o.is_webgl?new THREE.WebGLRenderer({preserveDrawingBuffer:!0,alpha:!0}):new THREE.CanvasRenderer({alpha:!0}),o.camera=new THREE.PerspectiveCamera(45,1,.1,1e5),o.parent_element.appendChild(o.renderer.domElement),o.scene.add(o.camera),o.ambientLight=new THREE.AmbientLight(2105376),o.camera.add(o.ambientLight),o.directionalLight=new THREE.DirectionalLight(16777215,.75),o.directionalLight.position.x=1,o.directionalLight.position.y=1,o.directionalLight.position.z=2,o.directionalLight.position.normalize(),o.camera.add(o.directionalLight),o.pointLight=new THREE.PointLight(16777215,.3),o.pointLight.position.x=0,o.pointLight.position.y=-25,o.pointLight.position.z=10,o.camera.add(o.pointLight),o.controls_type){case 1:o.controls=new THREE.TrackballControls(o.camera,o.renderer.domElement);break;default:o.controls=new THREE.OrbitControls(o.camera,o.renderer.domElement),o.controls.autoRotate=o.auto_rotate}o.set_on_model_mousedown(o.onmousedown_callback)}o.set_bg_color(o.bg_color),!1===o.mouse_zoom&&o.set_mouse_zoom(o.mouse_zoom),o.camera_state?o.set_camera_state(o.camera_state):o.camera.position.set(o.camerax,o.cameray,o.cameraz),o.do_resize(),o.models_to_add&&o.add_models(o.models_to_add),o.set_auto_resize(o.auto_resize),o.animate(),o.init_done=!0},this.set_auto_resize=function(e){o.do_resize&&(window.removeEventListener("resize",o.do_resize),e&&window.addEventListener("resize",o.do_resize))},this.vf_to_geo=function(e,t,a,n){if(!e)return null;if(!t)return null;var l=[],s=[],r=e.length;for(i=0;i<r;i++)l.push(new THREE.Vector3(e[i][0],e[i][1],e[i][2]));r=t.length;if(a)for(i=0;i<r;i++){var d=new THREE.Face3(t[i][0],t[i][1],t[i][2]);void 0===t[i][3]?(n||(n=o.default_face_color),d.color.setRGB(parseInt(o.default_face_color.substr(1,2),16)/255,parseInt(o.default_face_color.substr(3,2),16)/255,parseInt(o.default_face_color.substr(5,2),16)/255)):d.color.setRGB(t[i][3],t[i][4],t[i][5]),s.push(d)}else for(i=0;i<r;i++)s.push(new THREE.Face3(t[i][0],t[i][1],t[i][2]));var _=new THREE.Geometry;return _.vertices=l,_.faces=s,_.computeBoundingBox(),_.computeFaceNormals(),_.computeVertexNormals(),o.center_models&&_.center(_),_},this.set_geo_minmax=function(e){var t=e.mesh.geometry;if(t.boundingBox)t.minx=t.boundingBox.min.x,t.miny=t.boundingBox.min.y,t.minz=t.boundingBox.min.z,t.maxx=t.boundingBox.max.x,t.maxy=t.boundingBox.max.y,t.maxz=t.boundingBox.max.z;else{for(var o=t.vertices,a=o[0].x,i=o[0].y,n=o[0].z,l=o[0].x,s=o[0].y,r=o[0].z,d=o.length;d--;)o[d].x<a&&(a=o[d].x),o[d].y<i&&(i=o[d].y),o[d].z<n&&(n=o[d].z),o[d].x>l&&(l=o[d].x),o[d].y>s&&(s=o[d].y),o[d].z>r&&(r=o[d].z);t.minx=a+e.x,t.miny=i+e.y,t.minz=n+e.z,t.maxx=l+e.x,t.maxy=s+e.y,t.maxz=r+e.z}},this.handleDragOver=function(e){e.stopPropagation(),e.preventDefault(),e.dataTransfer.dropEffect="copy"},this.handleFileDrop=function(e){e.stopPropagation(),e.preventDefault(),e.dataTransfer.files.length>0?o.load_local_files(e.dataTransfer.files):"string"==typeof e.dataTransfer.getData("Text")&&(o.add_model({id:-1,filename:e.dataTransfer.getData("Text")}),o.on_model_drop&&o.on_model_drop(e.dataTransfer.getData("Text")))},this.load_local_files=function(e){if(e.length>0){for(var t=new Array,a=e.length,i=0;i<a;i++){switch(e[i].name.split(".").pop()){case"vsj":o.load_vsj(e[i]);break;case"vsb":o.load_vsb(e[i]);break;default:t.push({id:-1,local_file:e[i]})}o.on_model_drop&&o.on_model_drop(e[i].name)}o.add_models(t)}},this.clean=function(){if(o.models=null,o.models=[],o.models_count=0,o.models_ref=null,o.models_ref=[],o.max_model_id=0,o.load_status=null,o.load_status=[],o.load_session=0,o.loaded_models_arr=null,o.loaded_models_arr=[],o.animation=null,o.animation=[],o.models_to_add=null,o.models_to_add=[],o.options.models=null,o.scene){var e=o.scene;for(i=e.children.length;i--;)"Mesh"===e.children[i].type&&(e.children[i].geometry.dispose(),e.children[i].material.dispose(),e.remove(e.children[i]));Object.keys(o.models_ref).forEach(function(e){o.set_or_update_geo_edges(o.models[o.models_ref[e]],!1)}),o.renderer.renderLists.dispose()}},this.reset_parent_element=function(e){o.parent_element=e,o.allow_drag_and_drop&&o.set_drag_and_drop(!0),o.set_on_model_mousedown(o.onmousedown_callback),o.parent_element.appendChild(o.renderer.domElement)},this.scripts_loader=null,this.external_files_loaded=function(){o.ready=!0,o.init(),o.ready_callback&&o.ready_callback()},this.load_three=function(e){"string"!=typeof o.load_three_files&&(o.load_three_files=""),o.scripts_loader=new ScriptsLoader;var t=[e+"three.min.js",e+"webgl_detector.js",e+"Projector.js",e+"CanvasRenderer.js",e+(0==o.controls_type?"OrbitControls.js":"TrackballControls.js")];o.jszip_path&&t.push(o.jszip_path),o.jszip_utils_path&&t.push(o.jszip_utils_path),o.scripts_loader.load_scripts(t,o.external_files_loaded)},this.init_by_json=function(e){var t=null;try{t=JSON.parse(e)}catch(t){return console.log("json error ",e),!1}o.options=t,o.set_options(),o.ready&&o.init()},this.dispose=function(){o.clean(),o.killsign=!0,o.renderer&&o.renderer.render(o.scene,o.camera),o.controls&&o.controls.update(),o.animate=null,o.animation=null,o.error=null,o.options=null,o.parent_element=null,o.models_to_add=null,o.models=null,o.models_ref=null,o.model_loaded_callback=null,o.all_loaded_callback=null,o.load_error_callback=null,o.loading_progress_callback=null,o.load_status=null,o.loaded_models_arr=null,o.onmousedown_callback=null,o.camera_state=null,o.ready_callback=null,o.on_model_drop=null,o.pre_loaded_ab_files=null,o.pre_loaded_vsj=null,o.grid=null,o.WORLD_X_VECTOR=null,o.WORLD_Y_VECTOR=null,o.WORLD_Z_VECTOR=null,o.edges_material=null,o.raycaster=null,o.mouse=null,o.renderer=null,o.scene=null,o.camera=null,o.ambientLight=null,o.directionalLight=null,o.pointLight=null,o.controls=null},o.set_options(),o.ready?(o.init(),o.ready_callback&&o.ready_callback()):!1!==o.load_three_files?o.load_three(o.load_three_files):o.model_error("No THREE files were loaded")}function ScriptsLoader(){var e=this;this.all_loaded_callback=null,this.scripts_to_load=new Array,this.loading_scripts=new Array,this.loaded_scripts=new Array,this.scripts_are_loaded=function(t){var o=Object.keys(t);for(i=o.length;i--;)if(!e.loaded_scripts[e.get_full_name(t[i])])return!1;return!0},this.get_short_name=function(e){return e?e.substring(e.lastIndexOf("/")+1):""},this.load_scripts=function(t,o){o&&(e.all_loaded_callback=o),Object.keys(t).forEach(function(o){var a=e.get_short_name(t[o]);-1==e.scripts_to_load.indexOf(a)&&(e.loading_scripts[a]||e.loaded_scripts[a]||e.scripts_to_load.push(t[o]))}),e.load_files()},this.load_files=function(){if(0!=e.scripts_to_load.length)for(;e.scripts_to_load.length;){var t=e.scripts_to_load.shift();if(!e.loading_scripts[t]){e.loading_scripts[t]=1;var o=document.createElement("script");return o.onload=function(){var t=e.get_short_name(o.src);e.loaded_scripts[t]=1,e.loading_scripts[t]=0,e.load_files()},o.src=t,void document.head.appendChild(o)}}else e.all_loaded_callback&&e.all_loaded_callback()}}Number.isInteger=Number.isInteger||function(e){return"number"==typeof e&&isFinite(e)&&Math.floor(e)===e},init=function(){if(!window.MSStream){var e=document.currentScript.attributes.src.value,t=e.lastIndexOf("/");stl_viewer_script_path=t>0?e.substring(0,t+1):""}}();