@pnext/three-loader
Version:
Potree loader for ThreeJS, converted and adapted to Typescript.
1 lines • 757 kB
JavaScript
!function(I,g){"object"==typeof exports&&"object"==typeof module?module.exports=g(require("three")):"function"==typeof define&&define.amd?define("potree",["three"],g):"object"==typeof exports?exports.potree=g(require("three")):I.potree=g(I.three)}(self,(__WEBPACK_EXTERNAL_MODULE__604__=>(()=>{"use strict";var __webpack_modules__={414:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("precision highp float;\\nprecision highp int;\\n\\nuniform mat4 projectionMatrix;\\n\\nuniform float screenWidth;\\nuniform float screenHeight;\\n\\nuniform sampler2D map;\\n\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\n\\tfloat dx = 1.0 / screenWidth;\\n\\tfloat dy = 1.0 / screenHeight;\\n\\n\\tvec3 color = vec3(0.0, 0.0, 0.0);\\n\\tcolor += texture2D(map, vUv + vec2(-dx, -dy)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2( 0, -dy)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2(+dx, -dy)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2(-dx, 0)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2( 0, 0)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2(+dx, 0)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2(-dx, dy)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2( 0, dy)).rgb;\\n\\tcolor += texture2D(map, vUv + vec2(+dx, dy)).rgb;\\n \\n\\tcolor = color / 9.0;\\n\\t\\n\\tgl_FragColor = vec4(color, 1.0);\\n\\t\\n\\t\\n}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNDE0LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3BvdHJlZS8uL3NyYy9tYXRlcmlhbHMvc2hhZGVycy9ibHVyLmZyYWc/MjI5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcInByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcbnVuaWZvcm0gbWF0NCBwcm9qZWN0aW9uTWF0cml4O1xcblxcbnVuaWZvcm0gZmxvYXQgc2NyZWVuV2lkdGg7XFxudW5pZm9ybSBmbG9hdCBzY3JlZW5IZWlnaHQ7XFxuXFxudW5pZm9ybSBzYW1wbGVyMkQgbWFwO1xcblxcbnZhcnlpbmcgdmVjMiB2VXY7XFxuXFxudm9pZCBtYWluKCkge1xcblxcblxcdGZsb2F0IGR4ID0gMS4wIC8gc2NyZWVuV2lkdGg7XFxuXFx0ZmxvYXQgZHkgPSAxLjAgLyBzY3JlZW5IZWlnaHQ7XFxuXFxuXFx0dmVjMyBjb2xvciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKG1hcCwgdlV2ICsgdmVjMigtZHgsIC1keSkpLnJnYjtcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQobWFwLCB2VXYgKyB2ZWMyKCAgMCwgLWR5KSkucmdiO1xcblxcdGNvbG9yICs9IHRleHR1cmUyRChtYXAsIHZVdiArIHZlYzIoK2R4LCAtZHkpKS5yZ2I7XFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKG1hcCwgdlV2ICsgdmVjMigtZHgsICAgMCkpLnJnYjtcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQobWFwLCB2VXYgKyB2ZWMyKCAgMCwgICAwKSkucmdiO1xcblxcdGNvbG9yICs9IHRleHR1cmUyRChtYXAsIHZVdiArIHZlYzIoK2R4LCAgIDApKS5yZ2I7XFxuXFx0Y29sb3IgKz0gdGV4dHVyZTJEKG1hcCwgdlV2ICsgdmVjMigtZHgsICBkeSkpLnJnYjtcXG5cXHRjb2xvciArPSB0ZXh0dXJlMkQobWFwLCB2VXYgKyB2ZWMyKCAgMCwgIGR5KSkucmdiO1xcblxcdGNvbG9yICs9IHRleHR1cmUyRChtYXAsIHZVdiArIHZlYzIoK2R4LCAgZHkpKS5yZ2I7XFxuICAgIFxcblxcdGNvbG9yID0gY29sb3IgLyA5LjA7XFxuXFx0XFxuXFx0Z2xfRnJhZ0NvbG9yID0gdmVjNChjb2xvciwgMS4wKTtcXG5cXHRcXG5cXHRcXG59XCI7Il0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///414\n')},575:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('__webpack_require__.r(__webpack_exports__);\n/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("precision highp float;\\nprecision highp int;\\n\\nattribute vec3 position;\\nattribute vec2 uv;\\n\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\n\\nvarying vec2 vUv;\\n\\nvoid main() {\\n vUv = uv;\\n\\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n}");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiNTc1LmpzIiwibWFwcGluZ3MiOiI7Ozs7QUFBQSIsInNvdXJjZXMiOlsid2VicGFjazovL3BvdHJlZS8uL3NyYy9tYXRlcmlhbHMvc2hhZGVycy9ibHVyLnZlcnQ/NWRiYyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgZGVmYXVsdCBcInByZWNpc2lvbiBoaWdocCBmbG9hdDtcXG5wcmVjaXNpb24gaGlnaHAgaW50O1xcblxcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMyIHV2O1xcblxcbnVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XFxuXFxudmFyeWluZyB2ZWMyIHZVdjtcXG5cXG52b2lkIG1haW4oKSB7XFxuICAgIHZVdiA9IHV2O1xcblxcbiAgICBnbF9Qb3NpdGlvbiA9ICAgcHJvamVjdGlvbk1hdHJpeCAqIG1vZGVsVmlld01hdHJpeCAqIHZlYzQocG9zaXRpb24sIDEuMCk7XFxufVwiOyJdLCJuYW1lcyI6W10sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///575\n')},168:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("precision highp float;\\nprecision highp int;\\n\\n#if defined paraboloid_point_shape\\n\\t#extension GL_EXT_frag_depth : enable\\n#endif\\n\\nuniform mat4 viewMatrix;\\nuniform vec3 cameraPosition;\\n\\nuniform mat4 projectionMatrix;\\nuniform float opacity;\\n\\nuniform float blendHardness;\\nuniform float blendDepthSupplement;\\nuniform float fov;\\nuniform float spacing;\\nuniform float pcIndex;\\nuniform float screenWidth;\\nuniform float screenHeight;\\n\\nuniform sampler2D depthMap;\\n\\n#if defined (clip_horizontally) || defined (clip_vertically)\\n\\tuniform vec4 clipExtent;\\n#endif\\n\\n#ifdef use_texture_blending\\n\\tuniform sampler2D backgroundMap;\\n#endif\\n\\n\\n#ifdef use_point_cloud_mixing\\n\\tuniform int pointCloudMixingMode;\\n\\tuniform float pointCloudID;\\n\\tuniform float pointCloudMixAngle;\\n\\tuniform float stripeDistanceX;\\n\\tuniform float stripeDistanceY;\\n\\n\\tuniform float stripeDivisorX;\\n\\tuniform float stripeDivisorY;\\n#endif\\n\\n#ifdef highlight_point\\n\\tuniform vec4 highlightedPointColor;\\n#endif\\n\\nvarying vec3 vColor;\\n\\n#if !defined(color_type_point_index)\\n\\tvarying float vOpacity;\\n#endif\\n\\n#if defined(weighted_splats)\\n\\tvarying float vLinearDepth;\\n#endif\\n\\n#if !defined(paraboloid_point_shape) && defined(use_edl)\\n\\tvarying float vLogDepth;\\n#endif\\n\\n#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0) || defined(paraboloid_point_shape)\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\\n#if defined(weighted_splats) || defined(paraboloid_point_shape)\\n\\tvarying float vRadius;\\n#endif\\n\\n#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0)\\n\\tvarying vec3 vNormal;\\n#endif\\n\\n#ifdef highlight_point\\n\\tvarying float vHighlight;\\n#endif\\n\\nfloat specularStrength = 1.0;\\n\\nvoid main() {\\n\\tvec3 color = vColor;\\n\\tfloat depth = gl_FragCoord.z;\\n\\n\\t#if defined (clip_horizontally) || defined (clip_vertically)\\n\\tvec2 ndc = vec2((gl_FragCoord.x / screenWidth), 1.0 - (gl_FragCoord.y / screenHeight));\\n\\n\\tif(step(clipExtent.x, ndc.x) * step(ndc.x, clipExtent.z) < 1.0)\\n\\t{\\n\\t\\tdiscard;\\n\\t}\\n\\n\\tif(step(clipExtent.y, ndc.y) * step(ndc.y, clipExtent.w) < 1.0)\\n\\t{\\n\\t\\tdiscard;\\n\\t}\\n\\t#endif \\n\\n\\t#if defined(circle_point_shape) || defined(paraboloid_point_shape) || defined (weighted_splats)\\n\\t\\tfloat u = 2.0 * gl_PointCoord.x - 1.0;\\n\\t\\tfloat v = 2.0 * gl_PointCoord.y - 1.0;\\n\\t#endif\\n\\n\\t#if defined(circle_point_shape) || defined (weighted_splats)\\n\\t\\tfloat cc = u*u + v*v;\\n\\t\\tif(cc > 1.0){\\n\\t\\t\\tdiscard;\\n\\t\\t}\\n\\t#endif\\n\\n\\t#if defined weighted_splats\\n\\t\\tvec2 uv = gl_FragCoord.xy / vec2(screenWidth, screenHeight);\\n\\t\\tfloat sDepth = texture2D(depthMap, uv).r;\\n\\t\\tif(vLinearDepth > sDepth + vRadius + blendDepthSupplement){\\n\\t\\t\\tdiscard;\\n\\t\\t}\\n\\t#endif\\n\\n\\t#if defined color_type_point_index\\n\\t\\tgl_FragColor = vec4(color, pcIndex / 255.0);\\n\\t#else\\n\\t\\tgl_FragColor = vec4(color, vOpacity);\\n\\t#endif\\n\\n\\t#ifdef use_point_cloud_mixing\\n\\t\\tbool discardFragment = false;\\n\\n\\t\\tif (pointCloudMixingMode == 1) { // Checkboard\\n\\t\\t\\tfloat vPointCloudID = pointCloudID > 10. ? pointCloudID/10.: pointCloudID;\\n\\t\\t\\tdiscardFragment = mod(gl_FragCoord.x, vPointCloudID) > 0.5 && mod(gl_FragCoord.y, vPointCloudID) > 0.5;\\n\\t\\t}\\n\\t\\telse if (pointCloudMixingMode == 2) { // Stripes\\n\\t\\t\\tfloat angle = pointCloudMixAngle * pointCloudID / 180.;\\n\\t\\t\\tfloat u = cos(angle) * gl_FragCoord.x + sin(angle) * gl_FragCoord.y;\\n\\t\\t\\tfloat v = -sin(angle) * gl_FragCoord.x + cos(angle) * gl_FragCoord.y;\\n\\n\\t\\t\\tdiscardFragment = mod(u, stripeDistanceX) >= stripeDistanceX/stripeDivisorX && mod(v, stripeDistanceY) >= stripeDistanceY/stripeDivisorY;\\n\\t\\t}\\n\\t\\tif (discardFragment) {\\n\\t\\t\\tdiscard;\\n\\t\\t}\\n\\t#endif\\n\\n\\t#ifdef use_texture_blending\\n\\t\\tvec2 vUv = gl_FragCoord.xy / vec2(screenWidth, screenHeight);\\n\\n\\t\\tvec4 tColor = texture2D(backgroundMap, vUv);\\n\\t\\tgl_FragColor = vec4(vOpacity * color, 1.) + vec4((1. - vOpacity) * tColor.rgb, 0.);\\n\\t#endif\\n\\n\\t#if defined(color_type_phong)\\n\\t\\t#if MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0\\n\\t\\t\\tvec3 normal = normalize( vNormal );\\n\\t\\t\\tnormal.z = abs(normal.z);\\n\\n\\t\\t\\tvec3 viewPosition = normalize( vViewPosition );\\n\\t\\t#endif\\n\\n\\t\\t// code taken from three.js phong light fragment shader\\n\\n\\t\\t#if MAX_POINT_LIGHTS > 0\\n\\n\\t\\t\\tvec3 pointDiffuse = vec3( 0.0 );\\n\\t\\t\\tvec3 pointSpecular = vec3( 0.0 );\\n\\n\\t\\t\\tfor ( int i = 0; i < MAX_POINT_LIGHTS; i ++ ) {\\n\\n\\t\\t\\t\\tvec4 lPosition = viewMatrix * vec4( pointLightPosition[ i ], 1.0 );\\n\\t\\t\\t\\tvec3 lVector = lPosition.xyz + vViewPosition.xyz;\\n\\n\\t\\t\\t\\tfloat lDistance = 1.0;\\n\\t\\t\\t\\tif ( pointLightDistance[ i ] > 0.0 )\\n\\t\\t\\t\\t\\tlDistance = 1.0 - min( ( length( lVector ) / pointLightDistance[ i ] ), 1.0 );\\n\\n\\t\\t\\t\\tlVector = normalize( lVector );\\n\\n\\t\\t\\t\\t\\t\\t// diffuse\\n\\n\\t\\t\\t\\tfloat dotProduct = dot( normal, lVector );\\n\\n\\t\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\t\\tfloat pointDiffuseWeightFull = max( dotProduct, 0.0 );\\n\\t\\t\\t\\t\\tfloat pointDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\n\\n\\t\\t\\t\\t\\tvec3 pointDiffuseWeight = mix( vec3( pointDiffuseWeightFull ), vec3( pointDiffuseWeightHalf ), wrapRGB );\\n\\n\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\tfloat pointDiffuseWeight = max( dotProduct, 0.0 );\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\tpointDiffuse += diffuse * pointLightColor[ i ] * pointDiffuseWeight * lDistance;\\n\\n\\t\\t\\t\\t// specular\\n\\n\\t\\t\\t\\tvec3 pointHalfVector = normalize( lVector + viewPosition );\\n\\t\\t\\t\\tfloat pointDotNormalHalf = max( dot( normal, pointHalfVector ), 0.0 );\\n\\t\\t\\t\\tfloat pointSpecularWeight = specularStrength * max( pow( pointDotNormalHalf, shininess ), 0.0 );\\n\\n\\t\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( lVector, pointHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\t\\tpointSpecular += schlick * pointLightColor[ i ] * pointSpecularWeight * pointDiffuseWeight * lDistance * specularNormalization;\\n\\t\\t\\t\\tpointSpecular = vec3(0.0, 0.0, 0.0);\\n\\t\\t\\t}\\n\\n\\t\\t#endif\\n\\n\\t\\t#if MAX_DIR_LIGHTS > 0\\n\\n\\t\\t\\tvec3 dirDiffuse = vec3( 0.0 );\\n\\t\\t\\tvec3 dirSpecular = vec3( 0.0 );\\n\\n\\t\\t\\tfor( int i = 0; i < MAX_DIR_LIGHTS; i ++ ) {\\n\\n\\t\\t\\t\\tvec4 lDirection = viewMatrix * vec4( directionalLightDirection[ i ], 0.0 );\\n\\t\\t\\t\\tvec3 dirVector = normalize( lDirection.xyz );\\n\\n\\t\\t\\t\\t\\t\\t// diffuse\\n\\n\\t\\t\\t\\tfloat dotProduct = dot( normal, dirVector );\\n\\n\\t\\t\\t\\t#ifdef WRAP_AROUND\\n\\n\\t\\t\\t\\t\\tfloat dirDiffuseWeightFull = max( dotProduct, 0.0 );\\n\\t\\t\\t\\t\\tfloat dirDiffuseWeightHalf = max( 0.5 * dotProduct + 0.5, 0.0 );\\n\\n\\t\\t\\t\\t\\tvec3 dirDiffuseWeight = mix( vec3( dirDiffuseWeightFull ), vec3( dirDiffuseWeightHalf ), wrapRGB );\\n\\n\\t\\t\\t\\t#else\\n\\n\\t\\t\\t\\t\\tfloat dirDiffuseWeight = max( dotProduct, 0.0 );\\n\\n\\t\\t\\t\\t#endif\\n\\n\\t\\t\\t\\tdirDiffuse += diffuse * directionalLightColor[ i ] * dirDiffuseWeight;\\n\\n\\t\\t\\t\\t// specular\\n\\n\\t\\t\\t\\tvec3 dirHalfVector = normalize( dirVector + viewPosition );\\n\\t\\t\\t\\tfloat dirDotNormalHalf = max( dot( normal, dirHalfVector ), 0.0 );\\n\\t\\t\\t\\tfloat dirSpecularWeight = specularStrength * max( pow( dirDotNormalHalf, shininess ), 0.0 );\\n\\n\\t\\t\\t\\tfloat specularNormalization = ( shininess + 2.0 ) / 8.0;\\n\\n\\t\\t\\t\\tvec3 schlick = specular + vec3( 1.0 - specular ) * pow( max( 1.0 - dot( dirVector, dirHalfVector ), 0.0 ), 5.0 );\\n\\t\\t\\t\\tdirSpecular += schlick * directionalLightColor[ i ] * dirSpecularWeight * dirDiffuseWeight * specularNormalization;\\n\\t\\t\\t}\\n\\n\\t\\t#endif\\n\\n\\t\\tvec3 totalDiffuse = vec3( 0.0 );\\n\\t\\tvec3 totalSpecular = vec3( 0.0 );\\n\\n\\t\\t#if MAX_POINT_LIGHTS > 0\\n\\n\\t\\t\\ttotalDiffuse += pointDiffuse;\\n\\t\\t\\ttotalSpecular += pointSpecular;\\n\\n\\t\\t#endif\\n\\n\\t\\t#if MAX_DIR_LIGHTS > 0\\n\\n\\t\\t\\ttotalDiffuse += dirDiffuse;\\n\\t\\t\\ttotalSpecular += dirSpecular;\\n\\n\\t\\t#endif\\n\\n\\t\\tgl_FragColor.xyz = gl_FragColor.xyz * ( emissive + totalDiffuse + ambientLightColor * ambient ) + totalSpecular;\\n\\n\\t#endif\\n\\n\\t#if defined weighted_splats\\n\\t //float w = pow(1.0 - (u*u + v*v), blendHardness);\\n\\n\\t\\tfloat wx = 2.0 * length(2.0 * gl_PointCoord - 1.0);\\n\\t\\tfloat w = exp(-wx * wx * 0.5);\\n\\n\\t\\t//float distance = length(2.0 * gl_PointCoord - 1.0);\\n\\t\\t//float w = exp( -(distance * distance) / blendHardness);\\n\\n\\t\\tgl_FragColor.rgb = gl_FragColor.rgb * w;\\n\\t\\tgl_FragColor.a = w;\\n\\t#endif\\n\\n\\t#if defined paraboloid_point_shape\\n\\t\\tfloat wi = 0.0 - ( u*u + v*v);\\n\\t\\tvec4 pos = vec4(vViewPosition, 1.0);\\n\\t\\tpos.z += wi * vRadius;\\n\\t\\tfloat linearDepth = -pos.z;\\n\\t\\tpos = projectionMatrix * pos;\\n\\t\\tpos = pos / pos.w;\\n\\t\\tfloat expDepth = pos.z;\\n\\t\\tdepth = (pos.z + 1.0) / 2.0;\\n\\t\\tgl_FragDepthEXT = depth;\\n\\n\\t\\t#if defined(color_type_depth)\\n\\t\\t\\tgl_FragColor.r = linearDepth;\\n\\t\\t\\tgl_FragColor.g = expDepth;\\n\\t\\t#endif\\n\\n\\t\\t#if defined(use_edl)\\n\\t\\t\\tgl_FragColor.a = log2(linearDepth);\\n\\t\\t#endif\\n\\n\\t#else\\n\\t\\t#if defined(use_edl)\\n\\t\\t\\tgl_FragColor.a = vLogDepth;\\n\\t\\t#endif\\n\\t#endif\\n\\n\\t#ifdef highlight_point\\n\\t\\tif (vHighlight > 0.0) {\\n\\t\\t\\tgl_FragColor = highlightedPointColor;\\n\\t\\t}\\n\\t#endif\\n}\\n");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMTY4LmpzIiwibWFwcGluZ3MiOiI7OztBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcG90cmVlLy4vc3JjL21hdGVyaWFscy9zaGFkZXJzL3BvaW50Y2xvdWQuZnJhZz8wNTA1Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwicHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuI2lmIGRlZmluZWQgcGFyYWJvbG9pZF9wb2ludF9zaGFwZVxcblxcdCNleHRlbnNpb24gR0xfRVhUX2ZyYWdfZGVwdGggOiBlbmFibGVcXG4jZW5kaWZcXG5cXG51bmlmb3JtIG1hdDQgdmlld01hdHJpeDtcXG51bmlmb3JtIHZlYzMgY2FtZXJhUG9zaXRpb247XFxuXFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XFxudW5pZm9ybSBmbG9hdCBvcGFjaXR5O1xcblxcbnVuaWZvcm0gZmxvYXQgYmxlbmRIYXJkbmVzcztcXG51bmlmb3JtIGZsb2F0IGJsZW5kRGVwdGhTdXBwbGVtZW50O1xcbnVuaWZvcm0gZmxvYXQgZm92O1xcbnVuaWZvcm0gZmxvYXQgc3BhY2luZztcXG51bmlmb3JtIGZsb2F0IHBjSW5kZXg7XFxudW5pZm9ybSBmbG9hdCBzY3JlZW5XaWR0aDtcXG51bmlmb3JtIGZsb2F0IHNjcmVlbkhlaWdodDtcXG5cXG51bmlmb3JtIHNhbXBsZXIyRCBkZXB0aE1hcDtcXG5cXG4jaWYgZGVmaW5lZCAoY2xpcF9ob3Jpem9udGFsbHkpIHx8IGRlZmluZWQgKGNsaXBfdmVydGljYWxseSlcXG5cXHR1bmlmb3JtIHZlYzQgY2xpcEV4dGVudDtcXG4jZW5kaWZcXG5cXG4jaWZkZWYgdXNlX3RleHR1cmVfYmxlbmRpbmdcXG5cXHR1bmlmb3JtIHNhbXBsZXIyRCBiYWNrZ3JvdW5kTWFwO1xcbiNlbmRpZlxcblxcblxcbiNpZmRlZiB1c2VfcG9pbnRfY2xvdWRfbWl4aW5nXFxuXFx0dW5pZm9ybSBpbnQgcG9pbnRDbG91ZE1peGluZ01vZGU7XFxuXFx0dW5pZm9ybSBmbG9hdCBwb2ludENsb3VkSUQ7XFxuXFx0dW5pZm9ybSBmbG9hdCBwb2ludENsb3VkTWl4QW5nbGU7XFxuXFx0dW5pZm9ybSBmbG9hdCBzdHJpcGVEaXN0YW5jZVg7XFxuXFx0dW5pZm9ybSBmbG9hdCBzdHJpcGVEaXN0YW5jZVk7XFxuXFxuXFx0dW5pZm9ybSBmbG9hdCBzdHJpcGVEaXZpc29yWDtcXG5cXHR1bmlmb3JtIGZsb2F0IHN0cmlwZURpdmlzb3JZO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBoaWdobGlnaHRfcG9pbnRcXG5cXHR1bmlmb3JtIHZlYzQgaGlnaGxpZ2h0ZWRQb2ludENvbG9yO1xcbiNlbmRpZlxcblxcbnZhcnlpbmcgdmVjMyB2Q29sb3I7XFxuXFxuI2lmICFkZWZpbmVkKGNvbG9yX3R5cGVfcG9pbnRfaW5kZXgpXFxuXFx0dmFyeWluZyBmbG9hdCB2T3BhY2l0eTtcXG4jZW5kaWZcXG5cXG4jaWYgZGVmaW5lZCh3ZWlnaHRlZF9zcGxhdHMpXFxuXFx0dmFyeWluZyBmbG9hdCB2TGluZWFyRGVwdGg7XFxuI2VuZGlmXFxuXFxuI2lmICFkZWZpbmVkKHBhcmFib2xvaWRfcG9pbnRfc2hhcGUpICYmIGRlZmluZWQodXNlX2VkbClcXG5cXHR2YXJ5aW5nIGZsb2F0IHZMb2dEZXB0aDtcXG4jZW5kaWZcXG5cXG4jaWYgZGVmaW5lZChjb2xvcl90eXBlX3Bob25nKSAmJiAoTUFYX1BPSU5UX0xJR0hUUyA+IDAgfHwgTUFYX0RJUl9MSUdIVFMgPiAwKSB8fCBkZWZpbmVkKHBhcmFib2xvaWRfcG9pbnRfc2hhcGUpXFxuXFx0dmFyeWluZyB2ZWMzIHZWaWV3UG9zaXRpb247XFxuI2VuZGlmXFxuXFxuI2lmIGRlZmluZWQod2VpZ2h0ZWRfc3BsYXRzKSB8fCBkZWZpbmVkKHBhcmFib2xvaWRfcG9pbnRfc2hhcGUpXFxuXFx0dmFyeWluZyBmbG9hdCB2UmFkaXVzO1xcbiNlbmRpZlxcblxcbiNpZiBkZWZpbmVkKGNvbG9yX3R5cGVfcGhvbmcpICYmIChNQVhfUE9JTlRfTElHSFRTID4gMCB8fCBNQVhfRElSX0xJR0hUUyA+IDApXFxuXFx0dmFyeWluZyB2ZWMzIHZOb3JtYWw7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIGhpZ2hsaWdodF9wb2ludFxcblxcdHZhcnlpbmcgZmxvYXQgdkhpZ2hsaWdodDtcXG4jZW5kaWZcXG5cXG5mbG9hdCBzcGVjdWxhclN0cmVuZ3RoID0gMS4wO1xcblxcbnZvaWQgbWFpbigpIHtcXG5cXHR2ZWMzIGNvbG9yID0gdkNvbG9yO1xcblxcdGZsb2F0IGRlcHRoID0gZ2xfRnJhZ0Nvb3JkLno7XFxuXFxuXFx0I2lmIGRlZmluZWQgKGNsaXBfaG9yaXpvbnRhbGx5KSB8fCBkZWZpbmVkIChjbGlwX3ZlcnRpY2FsbHkpXFxuXFx0dmVjMiBuZGMgPSB2ZWMyKChnbF9GcmFnQ29vcmQueCAvIHNjcmVlbldpZHRoKSwgMS4wIC0gKGdsX0ZyYWdDb29yZC55IC8gc2NyZWVuSGVpZ2h0KSk7XFxuXFxuXFx0aWYoc3RlcChjbGlwRXh0ZW50LngsIG5kYy54KSAqIHN0ZXAobmRjLngsIGNsaXBFeHRlbnQueikgPCAxLjApXFxuXFx0e1xcblxcdFxcdGRpc2NhcmQ7XFxuXFx0fVxcblxcblxcdGlmKHN0ZXAoY2xpcEV4dGVudC55LCBuZGMueSkgKiBzdGVwKG5kYy55LCBjbGlwRXh0ZW50LncpIDwgMS4wKVxcblxcdHtcXG5cXHRcXHRkaXNjYXJkO1xcblxcdH1cXG5cXHQjZW5kaWYgIFxcblxcblxcdCNpZiBkZWZpbmVkKGNpcmNsZV9wb2ludF9zaGFwZSkgfHwgZGVmaW5lZChwYXJhYm9sb2lkX3BvaW50X3NoYXBlKSB8fCBkZWZpbmVkICh3ZWlnaHRlZF9zcGxhdHMpXFxuXFx0XFx0ZmxvYXQgdSA9IDIuMCAqIGdsX1BvaW50Q29vcmQueCAtIDEuMDtcXG5cXHRcXHRmbG9hdCB2ID0gMi4wICogZ2xfUG9pbnRDb29yZC55IC0gMS4wO1xcblxcdCNlbmRpZlxcblxcblxcdCNpZiBkZWZpbmVkKGNpcmNsZV9wb2ludF9zaGFwZSkgfHwgZGVmaW5lZCAod2VpZ2h0ZWRfc3BsYXRzKVxcblxcdFxcdGZsb2F0IGNjID0gdSp1ICsgdip2O1xcblxcdFxcdGlmKGNjID4gMS4wKXtcXG5cXHRcXHRcXHRkaXNjYXJkO1xcblxcdFxcdH1cXG5cXHQjZW5kaWZcXG5cXG5cXHQjaWYgZGVmaW5lZCB3ZWlnaHRlZF9zcGxhdHNcXG5cXHRcXHR2ZWMyIHV2ID0gZ2xfRnJhZ0Nvb3JkLnh5IC8gdmVjMihzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTtcXG5cXHRcXHRmbG9hdCBzRGVwdGggPSB0ZXh0dXJlMkQoZGVwdGhNYXAsIHV2KS5yO1xcblxcdFxcdGlmKHZMaW5lYXJEZXB0aCA+IHNEZXB0aCArIHZSYWRpdXMgKyBibGVuZERlcHRoU3VwcGxlbWVudCl7XFxuXFx0XFx0XFx0ZGlzY2FyZDtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuXFxuXFx0I2lmIGRlZmluZWQgY29sb3JfdHlwZV9wb2ludF9pbmRleFxcblxcdFxcdGdsX0ZyYWdDb2xvciA9IHZlYzQoY29sb3IsIHBjSW5kZXggLyAyNTUuMCk7XFxuXFx0I2Vsc2VcXG5cXHRcXHRnbF9GcmFnQ29sb3IgPSB2ZWM0KGNvbG9yLCB2T3BhY2l0eSk7XFxuXFx0I2VuZGlmXFxuXFxuXFx0I2lmZGVmIHVzZV9wb2ludF9jbG91ZF9taXhpbmdcXG5cXHRcXHRib29sIGRpc2NhcmRGcmFnbWVudCA9IGZhbHNlO1xcblxcblxcdFxcdGlmIChwb2ludENsb3VkTWl4aW5nTW9kZSA9PSAxKSB7ICAvLyBDaGVja2JvYXJkXFxuXFx0XFx0XFx0ZmxvYXQgdlBvaW50Q2xvdWRJRCA9IHBvaW50Q2xvdWRJRCA+IDEwLiA/IHBvaW50Q2xvdWRJRC8xMC46IHBvaW50Q2xvdWRJRDtcXG5cXHRcXHRcXHRkaXNjYXJkRnJhZ21lbnQgPSBtb2QoZ2xfRnJhZ0Nvb3JkLngsIHZQb2ludENsb3VkSUQpID4gMC41ICYmIG1vZChnbF9GcmFnQ29vcmQueSwgdlBvaW50Q2xvdWRJRCkgPiAwLjU7XFxuXFx0XFx0fVxcblxcdFxcdGVsc2UgaWYgKHBvaW50Q2xvdWRNaXhpbmdNb2RlID09IDIpIHsgIC8vIFN0cmlwZXNcXG5cXHRcXHRcXHRmbG9hdCBhbmdsZSA9IHBvaW50Q2xvdWRNaXhBbmdsZSAqIHBvaW50Q2xvdWRJRCAvIDE4MC47XFxuXFx0XFx0XFx0ZmxvYXQgdSA9IGNvcyhhbmdsZSkgKiBnbF9GcmFnQ29vcmQueCArIHNpbihhbmdsZSkgKiBnbF9GcmFnQ29vcmQueTtcXG5cXHRcXHRcXHRmbG9hdCB2ID0gLXNpbihhbmdsZSkgKiBnbF9GcmFnQ29vcmQueCArIGNvcyhhbmdsZSkgKiBnbF9GcmFnQ29vcmQueTtcXG5cXG5cXHRcXHRcXHRkaXNjYXJkRnJhZ21lbnQgPSBtb2QodSwgc3RyaXBlRGlzdGFuY2VYKSA+PSBzdHJpcGVEaXN0YW5jZVgvc3RyaXBlRGl2aXNvclggJiYgbW9kKHYsIHN0cmlwZURpc3RhbmNlWSkgPj0gc3RyaXBlRGlzdGFuY2VZL3N0cmlwZURpdmlzb3JZO1xcblxcdFxcdH1cXG5cXHRcXHRpZiAoZGlzY2FyZEZyYWdtZW50KSB7XFxuXFx0XFx0XFx0ZGlzY2FyZDtcXG5cXHRcXHR9XFxuXFx0I2VuZGlmXFxuXFxuXFx0I2lmZGVmIHVzZV90ZXh0dXJlX2JsZW5kaW5nXFxuXFx0XFx0dmVjMiB2VXYgPSBnbF9GcmFnQ29vcmQueHkgLyB2ZWMyKHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpO1xcblxcblxcdFxcdHZlYzQgdENvbG9yID0gdGV4dHVyZTJEKGJhY2tncm91bmRNYXAsIHZVdik7XFxuXFx0XFx0Z2xfRnJhZ0NvbG9yID0gdmVjNCh2T3BhY2l0eSAqIGNvbG9yLCAxLikgKyB2ZWM0KCgxLiAtIHZPcGFjaXR5KSAqIHRDb2xvci5yZ2IsIDAuKTtcXG5cXHQjZW5kaWZcXG5cXG5cXHQjaWYgZGVmaW5lZChjb2xvcl90eXBlX3Bob25nKVxcblxcdFxcdCNpZiBNQVhfUE9JTlRfTElHSFRTID4gMCB8fCBNQVhfRElSX0xJR0hUUyA+IDBcXG5cXHRcXHRcXHR2ZWMzIG5vcm1hbCA9IG5vcm1hbGl6ZSggdk5vcm1hbCApO1xcblxcdFxcdFxcdG5vcm1hbC56ID0gYWJzKG5vcm1hbC56KTtcXG5cXG5cXHRcXHRcXHR2ZWMzIHZpZXdQb3NpdGlvbiA9IG5vcm1hbGl6ZSggdlZpZXdQb3NpdGlvbiApO1xcblxcdFxcdCNlbmRpZlxcblxcblxcdFxcdC8vIGNvZGUgdGFrZW4gZnJvbSB0aHJlZS5qcyBwaG9uZyBsaWdodCBmcmFnbWVudCBzaGFkZXJcXG5cXG5cXHRcXHQjaWYgTUFYX1BPSU5UX0xJR0hUUyA+IDBcXG5cXG5cXHRcXHRcXHR2ZWMzIHBvaW50RGlmZnVzZSA9IHZlYzMoIDAuMCApO1xcblxcdFxcdFxcdHZlYzMgcG9pbnRTcGVjdWxhciA9IHZlYzMoIDAuMCApO1xcblxcblxcdFxcdFxcdGZvciAoIGludCBpID0gMDsgaSA8IE1BWF9QT0lOVF9MSUdIVFM7IGkgKysgKSB7XFxuXFxuXFx0XFx0XFx0XFx0dmVjNCBsUG9zaXRpb24gPSB2aWV3TWF0cml4ICogdmVjNCggcG9pbnRMaWdodFBvc2l0aW9uWyBpIF0sIDEuMCApO1xcblxcdFxcdFxcdFxcdHZlYzMgbFZlY3RvciA9IGxQb3NpdGlvbi54eXogKyB2Vmlld1Bvc2l0aW9uLnh5ejtcXG5cXG5cXHRcXHRcXHRcXHRmbG9hdCBsRGlzdGFuY2UgPSAxLjA7XFxuXFx0XFx0XFx0XFx0aWYgKCBwb2ludExpZ2h0RGlzdGFuY2VbIGkgXSA+IDAuMCApXFxuXFx0XFx0XFx0XFx0XFx0bERpc3RhbmNlID0gMS4wIC0gbWluKCAoIGxlbmd0aCggbFZlY3RvciApIC8gcG9pbnRMaWdodERpc3RhbmNlWyBpIF0gKSwgMS4wICk7XFxuXFxuXFx0XFx0XFx0XFx0bFZlY3RvciA9IG5vcm1hbGl6ZSggbFZlY3RvciApO1xcblxcblxcdFxcdFxcdFxcdFxcdFxcdC8vIGRpZmZ1c2VcXG5cXG5cXHRcXHRcXHRcXHRmbG9hdCBkb3RQcm9kdWN0ID0gZG90KCBub3JtYWwsIGxWZWN0b3IgKTtcXG5cXG5cXHRcXHRcXHRcXHQjaWZkZWYgV1JBUF9BUk9VTkRcXG5cXG5cXHRcXHRcXHRcXHRcXHRmbG9hdCBwb2ludERpZmZ1c2VXZWlnaHRGdWxsID0gbWF4KCBkb3RQcm9kdWN0LCAwLjAgKTtcXG5cXHRcXHRcXHRcXHRcXHRmbG9hdCBwb2ludERpZmZ1c2VXZWlnaHRIYWxmID0gbWF4KCAwLjUgKiBkb3RQcm9kdWN0ICsgMC41LCAwLjAgKTtcXG5cXG5cXHRcXHRcXHRcXHRcXHR2ZWMzIHBvaW50RGlmZnVzZVdlaWdodCA9IG1peCggdmVjMyggcG9pbnREaWZmdXNlV2VpZ2h0RnVsbCApLCB2ZWMzKCBwb2ludERpZmZ1c2VXZWlnaHRIYWxmICksIHdyYXBSR0IgKTtcXG5cXG5cXHRcXHRcXHRcXHQjZWxzZVxcblxcblxcdFxcdFxcdFxcdFxcdGZsb2F0IHBvaW50RGlmZnVzZVdlaWdodCA9IG1heCggZG90UHJvZHVjdCwgMC4wICk7XFxuXFxuXFx0XFx0XFx0XFx0I2VuZGlmXFxuXFxuXFx0XFx0XFx0XFx0cG9pbnREaWZmdXNlICs9IGRpZmZ1c2UgKiBwb2ludExpZ2h0Q29sb3JbIGkgXSAqIHBvaW50RGlmZnVzZVdlaWdodCAqIGxEaXN0YW5jZTtcXG5cXG5cXHRcXHRcXHRcXHQvLyBzcGVjdWxhclxcblxcblxcdFxcdFxcdFxcdHZlYzMgcG9pbnRIYWxmVmVjdG9yID0gbm9ybWFsaXplKCBsVmVjdG9yICsgdmlld1Bvc2l0aW9uICk7XFxuXFx0XFx0XFx0XFx0ZmxvYXQgcG9pbnREb3ROb3JtYWxIYWxmID0gbWF4KCBkb3QoIG5vcm1hbCwgcG9pbnRIYWxmVmVjdG9yICksIDAuMCApO1xcblxcdFxcdFxcdFxcdGZsb2F0IHBvaW50U3BlY3VsYXJXZWlnaHQgPSBzcGVjdWxhclN0cmVuZ3RoICogbWF4KCBwb3coIHBvaW50RG90Tm9ybWFsSGFsZiwgc2hpbmluZXNzICksIDAuMCApO1xcblxcblxcdFxcdFxcdFxcdGZsb2F0IHNwZWN1bGFyTm9ybWFsaXphdGlvbiA9ICggc2hpbmluZXNzICsgMi4wICkgLyA4LjA7XFxuXFxuXFx0XFx0XFx0XFx0dmVjMyBzY2hsaWNrID0gc3BlY3VsYXIgKyB2ZWMzKCAxLjAgLSBzcGVjdWxhciApICogcG93KCBtYXgoIDEuMCAtIGRvdCggbFZlY3RvciwgcG9pbnRIYWxmVmVjdG9yICksIDAuMCApLCA1LjAgKTtcXG5cXHRcXHRcXHRcXHRwb2ludFNwZWN1bGFyICs9IHNjaGxpY2sgKiBwb2ludExpZ2h0Q29sb3JbIGkgXSAqIHBvaW50U3BlY3VsYXJXZWlnaHQgKiBwb2ludERpZmZ1c2VXZWlnaHQgKiBsRGlzdGFuY2UgKiBzcGVjdWxhck5vcm1hbGl6YXRpb247XFxuXFx0XFx0XFx0XFx0cG9pbnRTcGVjdWxhciA9IHZlYzMoMC4wLCAwLjAsIDAuMCk7XFxuXFx0XFx0XFx0fVxcblxcblxcdFxcdCNlbmRpZlxcblxcblxcdFxcdCNpZiBNQVhfRElSX0xJR0hUUyA+IDBcXG5cXG5cXHRcXHRcXHR2ZWMzIGRpckRpZmZ1c2UgPSB2ZWMzKCAwLjAgKTtcXG5cXHRcXHRcXHR2ZWMzIGRpclNwZWN1bGFyID0gdmVjMyggMC4wICk7XFxuXFxuXFx0XFx0XFx0Zm9yKCBpbnQgaSA9IDA7IGkgPCBNQVhfRElSX0xJR0hUUzsgaSArKyApIHtcXG5cXG5cXHRcXHRcXHRcXHR2ZWM0IGxEaXJlY3Rpb24gPSB2aWV3TWF0cml4ICogdmVjNCggZGlyZWN0aW9uYWxMaWdodERpcmVjdGlvblsgaSBdLCAwLjAgKTtcXG5cXHRcXHRcXHRcXHR2ZWMzIGRpclZlY3RvciA9IG5vcm1hbGl6ZSggbERpcmVjdGlvbi54eXogKTtcXG5cXG5cXHRcXHRcXHRcXHRcXHRcXHQvLyBkaWZmdXNlXFxuXFxuXFx0XFx0XFx0XFx0ZmxvYXQgZG90UHJvZHVjdCA9IGRvdCggbm9ybWFsLCBkaXJWZWN0b3IgKTtcXG5cXG5cXHRcXHRcXHRcXHQjaWZkZWYgV1JBUF9BUk9VTkRcXG5cXG5cXHRcXHRcXHRcXHRcXHRmbG9hdCBkaXJEaWZmdXNlV2VpZ2h0RnVsbCA9IG1heCggZG90UHJvZHVjdCwgMC4wICk7XFxuXFx0XFx0XFx0XFx0XFx0ZmxvYXQgZGlyRGlmZnVzZVdlaWdodEhhbGYgPSBtYXgoIDAuNSAqIGRvdFByb2R1Y3QgKyAwLjUsIDAuMCApO1xcblxcblxcdFxcdFxcdFxcdFxcdHZlYzMgZGlyRGlmZnVzZVdlaWdodCA9IG1peCggdmVjMyggZGlyRGlmZnVzZVdlaWdodEZ1bGwgKSwgdmVjMyggZGlyRGlmZnVzZVdlaWdodEhhbGYgKSwgd3JhcFJHQiApO1xcblxcblxcdFxcdFxcdFxcdCNlbHNlXFxuXFxuXFx0XFx0XFx0XFx0XFx0ZmxvYXQgZGlyRGlmZnVzZVdlaWdodCA9IG1heCggZG90UHJvZHVjdCwgMC4wICk7XFxuXFxuXFx0XFx0XFx0XFx0I2VuZGlmXFxuXFxuXFx0XFx0XFx0XFx0ZGlyRGlmZnVzZSArPSBkaWZmdXNlICogZGlyZWN0aW9uYWxMaWdodENvbG9yWyBpIF0gKiBkaXJEaWZmdXNlV2VpZ2h0O1xcblxcblxcdFxcdFxcdFxcdC8vIHNwZWN1bGFyXFxuXFxuXFx0XFx0XFx0XFx0dmVjMyBkaXJIYWxmVmVjdG9yID0gbm9ybWFsaXplKCBkaXJWZWN0b3IgKyB2aWV3UG9zaXRpb24gKTtcXG5cXHRcXHRcXHRcXHRmbG9hdCBkaXJEb3ROb3JtYWxIYWxmID0gbWF4KCBkb3QoIG5vcm1hbCwgZGlySGFsZlZlY3RvciApLCAwLjAgKTtcXG5cXHRcXHRcXHRcXHRmbG9hdCBkaXJTcGVjdWxhcldlaWdodCA9IHNwZWN1bGFyU3RyZW5ndGggKiBtYXgoIHBvdyggZGlyRG90Tm9ybWFsSGFsZiwgc2hpbmluZXNzICksIDAuMCApO1xcblxcblxcdFxcdFxcdFxcdGZsb2F0IHNwZWN1bGFyTm9ybWFsaXphdGlvbiA9ICggc2hpbmluZXNzICsgMi4wICkgLyA4LjA7XFxuXFxuXFx0XFx0XFx0XFx0dmVjMyBzY2hsaWNrID0gc3BlY3VsYXIgKyB2ZWMzKCAxLjAgLSBzcGVjdWxhciApICogcG93KCBtYXgoIDEuMCAtIGRvdCggZGlyVmVjdG9yLCBkaXJIYWxmVmVjdG9yICksIDAuMCApLCA1LjAgKTtcXG5cXHRcXHRcXHRcXHRkaXJTcGVjdWxhciArPSBzY2hsaWNrICogZGlyZWN0aW9uYWxMaWdodENvbG9yWyBpIF0gKiBkaXJTcGVjdWxhcldlaWdodCAqIGRpckRpZmZ1c2VXZWlnaHQgKiBzcGVjdWxhck5vcm1hbGl6YXRpb247XFxuXFx0XFx0XFx0fVxcblxcblxcdFxcdCNlbmRpZlxcblxcblxcdFxcdHZlYzMgdG90YWxEaWZmdXNlID0gdmVjMyggMC4wICk7XFxuXFx0XFx0dmVjMyB0b3RhbFNwZWN1bGFyID0gdmVjMyggMC4wICk7XFxuXFxuXFx0XFx0I2lmIE1BWF9QT0lOVF9MSUdIVFMgPiAwXFxuXFxuXFx0XFx0XFx0dG90YWxEaWZmdXNlICs9IHBvaW50RGlmZnVzZTtcXG5cXHRcXHRcXHR0b3RhbFNwZWN1bGFyICs9IHBvaW50U3BlY3VsYXI7XFxuXFxuXFx0XFx0I2VuZGlmXFxuXFxuXFx0XFx0I2lmIE1BWF9ESVJfTElHSFRTID4gMFxcblxcblxcdFxcdFxcdHRvdGFsRGlmZnVzZSArPSBkaXJEaWZmdXNlO1xcblxcdFxcdFxcdHRvdGFsU3BlY3VsYXIgKz0gZGlyU3BlY3VsYXI7XFxuXFxuXFx0XFx0I2VuZGlmXFxuXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yLnh5eiA9IGdsX0ZyYWdDb2xvci54eXogKiAoIGVtaXNzaXZlICsgdG90YWxEaWZmdXNlICsgYW1iaWVudExpZ2h0Q29sb3IgKiBhbWJpZW50ICkgKyB0b3RhbFNwZWN1bGFyO1xcblxcblxcdCNlbmRpZlxcblxcblxcdCNpZiBkZWZpbmVkIHdlaWdodGVkX3NwbGF0c1xcblxcdCAgICAvL2Zsb2F0IHcgPSBwb3coMS4wIC0gKHUqdSArIHYqdiksIGJsZW5kSGFyZG5lc3MpO1xcblxcblxcdFxcdGZsb2F0IHd4ID0gMi4wICogbGVuZ3RoKDIuMCAqIGdsX1BvaW50Q29vcmQgLSAxLjApO1xcblxcdFxcdGZsb2F0IHcgPSBleHAoLXd4ICogd3ggKiAwLjUpO1xcblxcblxcdFxcdC8vZmxvYXQgZGlzdGFuY2UgPSBsZW5ndGgoMi4wICogZ2xfUG9pbnRDb29yZCAtIDEuMCk7XFxuXFx0XFx0Ly9mbG9hdCB3ID0gZXhwKCAtKGRpc3RhbmNlICogZGlzdGFuY2UpIC8gYmxlbmRIYXJkbmVzcyk7XFxuXFxuXFx0XFx0Z2xfRnJhZ0NvbG9yLnJnYiA9IGdsX0ZyYWdDb2xvci5yZ2IgKiB3O1xcblxcdFxcdGdsX0ZyYWdDb2xvci5hID0gdztcXG5cXHQjZW5kaWZcXG5cXG5cXHQjaWYgZGVmaW5lZCBwYXJhYm9sb2lkX3BvaW50X3NoYXBlXFxuXFx0XFx0ZmxvYXQgd2kgPSAwLjAgLSAoIHUqdSArIHYqdik7XFxuXFx0XFx0dmVjNCBwb3MgPSB2ZWM0KHZWaWV3UG9zaXRpb24sIDEuMCk7XFxuXFx0XFx0cG9zLnogKz0gd2kgKiB2UmFkaXVzO1xcblxcdFxcdGZsb2F0IGxpbmVhckRlcHRoID0gLXBvcy56O1xcblxcdFxcdHBvcyA9IHByb2plY3Rpb25NYXRyaXggKiBwb3M7XFxuXFx0XFx0cG9zID0gcG9zIC8gcG9zLnc7XFxuXFx0XFx0ZmxvYXQgZXhwRGVwdGggPSBwb3MuejtcXG5cXHRcXHRkZXB0aCA9IChwb3MueiArIDEuMCkgLyAyLjA7XFxuXFx0XFx0Z2xfRnJhZ0RlcHRoRVhUID0gZGVwdGg7XFxuXFxuXFx0XFx0I2lmIGRlZmluZWQoY29sb3JfdHlwZV9kZXB0aClcXG5cXHRcXHRcXHRnbF9GcmFnQ29sb3IuciA9IGxpbmVhckRlcHRoO1xcblxcdFxcdFxcdGdsX0ZyYWdDb2xvci5nID0gZXhwRGVwdGg7XFxuXFx0XFx0I2VuZGlmXFxuXFxuXFx0XFx0I2lmIGRlZmluZWQodXNlX2VkbClcXG5cXHRcXHRcXHRnbF9GcmFnQ29sb3IuYSA9IGxvZzIobGluZWFyRGVwdGgpO1xcblxcdFxcdCNlbmRpZlxcblxcblxcdCNlbHNlXFxuXFx0XFx0I2lmIGRlZmluZWQodXNlX2VkbClcXG5cXHRcXHRcXHRnbF9GcmFnQ29sb3IuYSA9IHZMb2dEZXB0aDtcXG5cXHRcXHQjZW5kaWZcXG5cXHQjZW5kaWZcXG5cXG5cXHQjaWZkZWYgaGlnaGxpZ2h0X3BvaW50XFxuXFx0XFx0aWYgKHZIaWdobGlnaHQgPiAwLjApIHtcXG5cXHRcXHRcXHRnbF9GcmFnQ29sb3IgPSBoaWdobGlnaHRlZFBvaW50Q29sb3I7XFxuXFx0XFx0fVxcblxcdCNlbmRpZlxcbn1cXG5cIjsiXSwibmFtZXMiOltdLCJzb3VyY2VSb290IjoiIn0=\n//# sourceURL=webpack-internal:///168\n')},245:(__unused_webpack_module,__webpack_exports__,__webpack_require__)=>{eval('/* harmony export */ __webpack_require__.d(__webpack_exports__, {\n/* harmony export */ A: () => (__WEBPACK_DEFAULT_EXPORT__)\n/* harmony export */ });\n/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = ("precision highp float;\\nprecision highp int;\\n\\n#define max_clip_boxes 30\\n\\nattribute vec3 position;\\nattribute vec3 color;\\n\\n#ifdef color_rgba\\n\\tattribute vec4 rgba;\\n#endif\\n\\nattribute vec3 normal;\\nattribute float intensity;\\nattribute float classification;\\nattribute float returnNumber;\\nattribute float numberOfReturns;\\nattribute float pointSourceID;\\nattribute vec4 indices;\\nattribute vec2 uv;\\n\\nuniform mat4 modelMatrix;\\nuniform mat4 modelViewMatrix;\\nuniform mat4 projectionMatrix;\\nuniform mat4 viewMatrix;\\nuniform mat3 normalMatrix;\\n\\nuniform float pcIndex;\\n\\nuniform float screenWidth;\\nuniform float screenHeight;\\nuniform float fov;\\nuniform float spacing;\\n\\n#if defined use_clip_box\\n\\tuniform mat4 clipBoxes[max_clip_boxes];\\n#endif\\n\\nuniform float heightMin;\\nuniform float heightMax;\\nuniform float size; // pixel size factor\\nuniform float minSize; // minimum pixel size\\nuniform float maxSize; // maximum pixel size\\nuniform float octreeSize;\\nuniform vec3 bbSize;\\nuniform vec3 uColor;\\nuniform float opacity;\\nuniform float clipBoxCount;\\nuniform float level;\\nuniform float vnStart;\\nuniform bool isLeafNode;\\n\\nuniform float filterByNormalThreshold;\\nuniform vec2 intensityRange;\\nuniform float opacityAttenuation;\\nuniform float intensityGamma;\\nuniform float intensityContrast;\\nuniform float intensityBrightness;\\nuniform float rgbGamma;\\nuniform float rgbContrast;\\nuniform float rgbBrightness;\\nuniform float transition;\\nuniform float wRGB;\\nuniform float wIntensity;\\nuniform float wElevation;\\nuniform float wClassification;\\nuniform float wReturnNumber;\\nuniform float wSourceID;\\n\\nuniform bool renderDepth;\\n\\nuniform sampler2D visibleNodes;\\nuniform sampler2D gradient;\\nuniform sampler2D classificationLUT;\\nuniform sampler2D depthMap;\\n\\n#ifdef use_texture_blending\\n\\tuniform sampler2D backgroundMap;\\n#endif\\n\\n#ifdef use_point_cloud_mixing\\n\\tuniform int pointCloudMixingMode;\\n\\tuniform float pointCloudID;\\n\\n\\tuniform float pointCloudMixAngle;\\n\\tuniform float stripeDistanceX;\\n\\tuniform float stripeDistanceY;\\n\\n\\tuniform float stripeDivisorX;\\n\\tuniform float stripeDivisorY;\\n#endif\\n\\n#ifdef highlight_point\\n\\tuniform vec3 highlightedPointCoordinate;\\n\\tuniform bool enablePointHighlighting;\\n\\tuniform float highlightedPointScale;\\n#endif\\n\\n#ifdef use_filter_by_normal\\n\\tuniform int normalFilteringMode;\\n#endif\\n\\nvarying vec3 vColor;\\n\\n#if !defined(color_type_point_index)\\n\\tvarying float vOpacity;\\n#endif\\n\\n#if defined(weighted_splats)\\n\\tvarying float vLinearDepth;\\n#endif\\n\\n#if !defined(paraboloid_point_shape) && defined(use_edl)\\n\\tvarying float vLogDepth;\\n#endif\\n\\n#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0) || defined(paraboloid_point_shape)\\n\\tvarying vec3 vViewPosition;\\n#endif\\n\\n#if defined(weighted_splats) || defined(paraboloid_point_shape)\\n\\tvarying float vRadius;\\n#endif\\n\\n#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0)\\n\\tvarying vec3 vNormal;\\n#endif\\n\\n#ifdef highlight_point\\n\\tvarying float vHighlight;\\n#endif\\n\\n// ---------------------\\n// OCTREE\\n// ---------------------\\n\\n#if (defined(adaptive_point_size) || defined(color_type_lod)) && defined(tree_type_octree)\\n\\n/**\\n * Rounds the specified number to the closest integer.\\n */\\nfloat round(float number){\\n\\treturn floor(number + 0.5);\\n}\\n\\n/**\\n * Gets the number of 1-bits up to inclusive index position.\\n *\\n * number is treated as if it were an integer in the range 0-255\\n */\\nint numberOfOnes(int number, int index) {\\n\\tint numOnes = 0;\\n\\tint tmp = 128;\\n\\tfor (int i = 7; i >= 0; i--) {\\n\\n\\t\\tif (number >= tmp) {\\n\\t\\t\\tnumber = number - tmp;\\n\\n\\t\\t\\tif (i <= index) {\\n\\t\\t\\t\\tnumOnes++;\\n\\t\\t\\t}\\n\\t\\t}\\n\\n\\t\\ttmp = tmp / 2;\\n\\t}\\n\\n\\treturn numOnes;\\n}\\n\\n/**\\n * Checks whether the bit at index is 1.0\\n *\\n * number is treated as if it were an integer in the range 0-255\\n */\\nbool isBitSet(int number, int index){\\n\\n\\t// weird multi else if due to lack of proper array, int and bitwise support in WebGL 1.0\\n\\tint powi = 1;\\n\\tif (index == 0) {\\n\\t\\tpowi = 1;\\n\\t} else if (index == 1) {\\n\\t\\tpowi = 2;\\n\\t} else if (index == 2) {\\n\\t\\tpowi = 4;\\n\\t} else if (index == 3) {\\n\\t\\tpowi = 8;\\n\\t} else if (index == 4) {\\n\\t\\tpowi = 16;\\n\\t} else if (index == 5) {\\n\\t\\tpowi = 32;\\n\\t} else if (index == 6) {\\n\\t\\tpowi = 64;\\n\\t} else if (index == 7) {\\n\\t\\tpowi = 128;\\n\\t}\\n\\n\\tint ndp = number / powi;\\n\\n\\treturn mod(float(ndp), 2.0) != 0.0;\\n}\\n\\n/**\\n * Gets the the LOD at the point position.\\n */\\nfloat getLOD() {\\n\\tvec3 offset = vec3(0.0, 0.0, 0.0);\\n\\tint iOffset = int(vnStart);\\n\\tfloat depth = level;\\n\\n\\tfor (float i = 0.0; i <= 30.0; i++) {\\n\\t\\tfloat nodeSizeAtLevel = octreeSize / pow(2.0, i + level + 0.0);\\n\\n\\t\\tvec3 index3d = (position-offset) / nodeSizeAtLevel;\\n\\t\\tindex3d = floor(index3d + 0.5);\\n\\t\\tint index = int(round(4.0 * index3d.x + 2.0 * index3d.y + index3d.z));\\n\\n\\t\\tvec4 value = texture2D(visibleNodes, vec2(float(iOffset) / 2048.0, 0.0));\\n\\t\\tint mask = int(round(value.r * 255.0));\\n\\n\\t\\tif (isBitSet(mask, index)) {\\n\\t\\t\\t// there are more visible child nodes at this position\\n\\t\\t\\tint advanceG = int(round(value.g * 255.0)) * 256;\\n\\t\\t\\tint advanceB = int(round(value.b * 255.0));\\n\\t\\t\\tint advanceChild = numberOfOnes(mask, index - 1);\\n\\t\\t\\tint advance = advanceG + advanceB + advanceChild;\\n\\n\\t\\t\\tiOffset = iOffset + advance;\\n\\n\\t\\t\\tdepth++;\\n\\t\\t} else {\\n\\t\\t\\treturn value.a * 255.0; // no more visible child nodes at this position\\n\\t\\t}\\n\\n\\t\\toffset = offset + (vec3(1.0, 1.0, 1.0) * nodeSizeAtLevel * 0.5) * index3d;\\n\\t}\\n\\n\\treturn depth;\\n}\\n\\nfloat getPointSizeAttenuation() {\\n\\treturn 0.5 * pow(2.0, getLOD());\\n}\\n\\n#endif\\n\\n// ---------------------\\n// KD-TREE\\n// ---------------------\\n\\n#if (defined(adaptive_point_size) || defined(color_type_lod)) && defined(tree_type_kdtree)\\n\\nfloat getLOD() {\\n\\tvec3 offset = vec3(0.0, 0.0, 0.0);\\n\\tfloat intOffset = 0.0;\\n\\tfloat depth = 0.0;\\n\\n\\tvec3 size = bbSize;\\n\\tvec3 pos = position;\\n\\n\\tfor (float i = 0.0; i <= 1000.0; i++) {\\n\\n\\t\\tvec4 value = texture2D(visibleNodes, vec2(intOffset / 2048.0, 0.0));\\n\\n\\t\\tint children = int(value.r * 255.0);\\n\\t\\tfloat next = value.g * 255.0;\\n\\t\\tint split = int(value.b * 255.0);\\n\\n\\t\\tif (next == 0.0) {\\n\\t\\t \\treturn depth;\\n\\t\\t}\\n\\n\\t\\tvec3 splitv = vec3(0.0, 0.0, 0.0);\\n\\t\\tif (split == 1) {\\n\\t\\t\\tsplitv.x = 1.0;\\n\\t\\t} else if (split == 2) {\\n\\t\\t \\tsplitv.y = 1.0;\\n\\t\\t} else if (split == 4) {\\n\\t\\t \\tsplitv.z = 1.0;\\n\\t\\t}\\n\\n\\t\\tintOffset = intOffset + next;\\n\\n\\t\\tfloat factor = length(pos * splitv / size);\\n\\t\\tif (factor < 0.5) {\\n\\t\\t \\t// left\\n\\t\\t\\tif (children == 0 || children == 2) {\\n\\t\\t\\t\\treturn depth;\\n\\t\\t\\t}\\n\\t\\t} else {\\n\\t\\t\\t// right\\n\\t\\t\\tpos = pos - size * splitv * 0.5;\\n\\t\\t\\tif (children == 0 || children == 1) {\\n\\t\\t\\t\\treturn depth;\\n\\t\\t\\t}\\n\\t\\t\\tif (children == 3) {\\n\\t\\t\\t\\tintOffset = intOffset + 1.0;\\n\\t\\t\\t}\\n\\t\\t}\\n\\t\\tsize = size * ((1.0 - (splitv + 1.0) / 2.0) + 0.5);\\n\\n\\t\\tdepth++;\\n\\t}\\n\\n\\n\\treturn depth;\\n}\\n\\nfloat getPointSizeAttenuation() {\\n\\treturn 0.5 * pow(1.3, getLOD());\\n}\\n\\n#endif\\n\\n// formula adapted from: http://www.dfstudios.co.uk/articles/programming/image-programming-algorithms/image-processing-algorithms-part-5-contrast-adjustment/\\nfloat getContrastFactor(float contrast) {\\n\\treturn (1.0158730158730156 * (contrast + 1.0)) / (1.0158730158730156 - contrast);\\n}\\n\\nvec3 getRGB() {\\n\\t\\n\\t#ifdef color_rgba\\n\\t\\tvec3 rgb = rgba.rgb;\\n\\t#else\\t\\n\\t\\tvec3 rgb = color;\\n\\t#endif\\t\\t\\n\\n\\t#if defined(use_rgb_gamma_contrast_brightness)\\n\\t\\trgb = pow(rgb, vec3(rgbGamma));\\n\\t\\trgb = rgb + rgbBrightness;\\n\\t\\trgb = (rgb - 0.5) * getContrastFactor(rgbContrast) + 0.5;\\n\\t\\trgb = clamp(rgb, 0.0, 1.0);\\n\\t\\treturn rgb;\\n\\t#else\\n\\t\\treturn rgb;\\n\\t#endif\\n}\\n\\nfloat getIntensity() {\\n\\tfloat w = (intensity - intensityRange.x) / (intensityRange.y - intensityRange.x);\\n\\tw = pow(w, intensityGamma);\\n\\tw = w + intensityBrightness;\\n\\tw = (w - 0.5) * getContrastFactor(intensityContrast) + 0.5;\\n\\tw = clamp(w, 0.0, 1.0);\\n\\n\\treturn w;\\n}\\n\\nvec3 getElevation() {\\n\\tvec4 world = modelMatrix * vec4( position, 1.0 );\\n\\tfloat w = (world.z - heightMin) / (heightMax-heightMin);\\n\\tvec3 cElevation = texture2D(gradient, vec2(w,1.0-w)).rgb;\\n\\n\\treturn cElevation;\\n}\\n\\nvec4 getClassification() {\\n\\tvec2 uv = vec2(classification / 255.0, 0.5);\\n\\tvec4 classColor = texture2D(classificationLUT, uv);\\n\\n\\treturn classColor;\\n}\\n\\nvec3 getReturnNumber() {\\n\\tif (numberOfReturns == 1.0) {\\n\\t\\treturn vec3(1.0, 1.0, 0.0);\\n\\t} else {\\n\\t\\tif (returnNumber == 1.0) {\\n\\t\\t\\treturn vec3(1.0, 0.0, 0.0);\\n\\t\\t} else if (returnNumber == numberOfReturns) {\\n\\t\\t\\treturn vec3(0.0, 0.0, 1.0);\\n\\t\\t} else {\\n\\t\\t\\treturn vec3(0.0, 1.0, 0.0);\\n\\t\\t}\\n\\t}\\n}\\n\\nvec3 getSourceID() {\\n\\tfloat w = mod(pointSourceID, 10.0) / 10.0;\\n\\treturn texture2D(gradient, vec2(w, 1.0 - w)).rgb;\\n}\\n\\nvec3 getCompositeColor() {\\n\\tvec3 c;\\n\\tfloat w;\\n\\n\\tc += wRGB * getRGB();\\n\\tw += wRGB;\\n\\n\\tc += wIntensity * getIntensity() * vec3(1.0, 1.0, 1.0);\\n\\tw += wIntensity;\\n\\n\\tc += wElevation * getElevation();\\n\\tw += wElevation;\\n\\n\\tc += wReturnNumber * getReturnNumber();\\n\\tw += wReturnNumber;\\n\\n\\tc += wSourceID * getSourceID();\\n\\tw += wSourceID;\\n\\n\\tvec4 cl = wClassification * getClassification();\\n\\tc += cl.a * cl.rgb;\\n\\tw += wClassification * cl.a;\\n\\n\\tc = c / w;\\n\\n\\tif (w == 0.0) {\\n\\t\\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\\n\\t}\\n\\n\\treturn c;\\n}\\n\\nvoid main() {\\n\\tvec4 mvPosition = modelViewMatrix * vec4(position, 1.0);\\n\\n\\tgl_Position = projectionMatrix * mvPosition;\\n\\n\\t#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0) || defined(paraboloid_point_shape)\\n\\t\\tvViewPosition = mvPosition.xyz;\\n\\t#endif\\n\\n\\t#if defined weighted_splats\\n\\t\\tvLinearDepth = gl_Position.w;\\n\\t#endif\\n\\n\\t#if defined(color_type_phong) && (MAX_POINT_LIGHTS > 0 || MAX_DIR_LIGHTS > 0)\\n\\t\\tvNormal = normalize(normalMatrix * normal);\\n\\t#endif\\n\\n\\t#if !defined(paraboloid_point_shape) && defined(use_edl)\\n\\t\\tvLogDepth = log2(-mvPosition.z);\\n\\t#endif\\n\\n\\t// ---------------------\\n\\t// POINT SIZE\\n\\t// ---------------------\\n\\n\\tfloat pointSize = 1.0;\\n\\tfloat slope = tan(fov / 2.0);\\n\\tfloat projFactor = -0.5 * screenHeight / (slope * mvPosition.z);\\n\\n\\t#if defined fixed_point_size\\n\\t\\tpointSize = size;\\n\\t#elif defined attenuated_point_size\\n\\t\\tpointSize = size * spacing * projFactor;\\n\\t#elif defined adaptive_point_size\\n\\t\\tfloat worldSpaceSize = 2.0 * size * spacing / getPointSizeAttenuation();\\n\\t\\tpointSize = worldSpaceSize * projFactor;\\n\\t#endif\\n\\n\\tpointSize = max(minSize, pointSize);\\n\\tpointSize = min(maxSize, pointSize);\\n\\n\\t#if defined(weighted_splats) || defined(paraboloid_point_shape)\\n\\t\\tvRadius = pointSize / projFactor;\\n\\t#endif\\n\\n\\tgl_PointSize = pointSize;\\n\\n\\t// ---------------------\\n\\t// HIGHLIGHTING\\n\\t// ---------------------\\n\\n\\t#ifdef highlight_point\\n\\t\\tvec4 mPosition = modelMatrix * vec4(position, 1.0);\\n\\t\\tif (enablePointHighlighting && abs(mPosition.x - highlightedPointCoordinate.x) < 0.0001 &&\\n\\t\\t\\tabs(mPosition.y - highlightedPointCoordinate.y) < 0.0001 &&\\n\\t\\t\\tabs(mPosition.z - highlightedPointCoordinate.z) < 0.0001) {\\n\\t\\t\\tvHighlight = 1.0;\\n\\t\\t\\tgl_PointSize = pointSize * highlightedPointScale;\\n\\t\\t} else {\\n\\t\\t\\tvHighlight = 0.0;\\n\\t\\t}\\n\\t#endif\\n\\n\\t// ---------------------\\n\\t// OPACITY\\n\\t// ---------------------\\n\\n\\t#ifndef color_type_point_index\\n\\t\\t#ifdef attenuated_opacity\\n\\t\\t\\tvOpacity = opacity * exp(-length(-mvPosition.xyz) / opacityAttenuation);\\n\\t\\t#else\\n\\t\\t\\tvOpacity = opacity;\\n\\t\\t#endif\\n\\t#endif\\n\\n\\t// ---------------------\\n\\t// FILTERING\\n\\t// ---------------------\\n\\n\\t#ifdef use_filter_by_normal\\n\\t\\tbool discardPoint = false;\\n\\t\\t// Absolute normal filtering\\n\\t\\tif (normalFilteringMode == 1) {\\n\\t\\t\\tdiscardPoint = (abs((modelViewMatrix * vec4(normal, 0.0)).z) > filterByNormalThreshold);\\n\\t\\t}\\n\\t\\t// less than equal to\\n\\t\\telse if (normalFilteringMode == 2) {\\n\\t\\t\\tdiscardPoint = (modelViewMatrix * vec4(normal, 0.0)).z <= filterByNormalThreshold;\\n\\t\\t\\t}\\n\\t\\t// greater than\\n\\t\\telse if(normalFilteringMode == 3) {\\n\\t\\t\\tdiscardPoint = (modelViewMatrix * vec4(normal, 0.0)).z > filterByNormalThreshold;\\n\\t\\t\\t}\\n\\n\\t\\tif (discardPoint)\\n\\t\\t{\\n\\t\\t\\tgl_Position = vec4(0.0, 0.0, 2.0, 1.0);\\n\\t\\t}\\n\\t#endif\\n\\n\\t// ---------------------\\n\\t// POINT COLOR\\n\\t// ---------------------\\n\\n\\t#ifdef color_type_rgb\\n\\t\\tvColor = getRGB();\\n\\t#elif defined color_type_height\\n\\t\\tvColor = getElevation();\\n\\t#elif defined color_type_rgb_height\\n\\t\\tvec3 cHeight = getElevation();\\n\\t\\tvColor = (1.0 - transition) * getRGB() + transition * cHeight;\\n\\t#elif defined color_type_depth\\n\\t\\tfloat linearDepth = -mvPosition.z ;\\n\\t\\tfloat expDepth = (gl_Position.z / gl_Position.w) * 0.5 + 0.5;\\n\\t\\tvColor = vec3(linearDepth, expDepth, 0.0);\\n\\t#elif defined color_type_intensity\\n\\t\\tfloat w = getIntensity();\\n\\t\\tvColor = vec3(w, w, w);\\n\\t#elif defined color_type_intensity_gradient\\n\\t\\tfloat w = getIntensity();\\n\\t\\tvColor = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\\n\\t#elif defined color_type_color\\n\\t\\tvColor = uColor;\\n\\t#elif defined color_type_lod\\n\\tfloat w = getLOD() / 10.0;\\n\\tvColor = texture2D(gradient, vec2(w, 1.0 - w)).rgb;\\n\\t#elif defined color_type_point_index\\n\\t\\tvColor = indices.rgb;\\n\\t#elif defined color_type_classification\\n\\t vec4 cl = getClassification();\\n\\t\\tvColor = cl.rgb;\\n\\t#elif defined color_type_return_number\\n\\t\\tvColor = getReturnNumber();\\n\\t#elif defined color_type_source\\n\\t\\tvColor = getSourceID();\\n\\t#elif defined color_type_normal\\n\\t\\tvColor = (modelMatrix * vec4(normal, 0.0)).xyz;\\n\\t#elif defined color_type_phong\\n\\t\\tvColor = color;\\n\\t#elif defined color_type_composite\\n\\t\\tvColor = getCompositeColor();\\n\\t#endif\\n\\n\\t#if !defined color_type_composite && defined color_type_classification\\n\\t\\tif (cl.a == 0.0) {\\n\\t\\t\\tgl_Position = vec4(100.0, 100.0, 100.0, 0.0);\\n\\t\\t\\treturn;\\n\\t\\t}\\n\\t#endif\\n\\n\\t// ---------------------\\n\\t// CLIPPING\\n\\t// ---------------------\\n\\n\\t#if defined use_clip_box\\n\\t\\tbool insideAny = false;\\n\\t\\tfor (int i = 0; i < max_clip_boxes; i++) {\\n\\t\\t\\tif (i == int(clipBoxCount)) {\\n\\t\\t\\t\\tbreak;\\n\\t\\t\\t}\\n\\n\\t\\t\\tvec4 clipPosition = clipBoxes[i] * modelMatrix * vec4(position, 1.0);\\n\\t\\t\\tbool inside = -0.5 <= clipPosition.x && clipPosition.x <= 0.5;\\n\\t\\t\\tinside = inside && -0.5 <= clipPosition.y && clipPosition.y <= 0.5;\\n\\t\\t\\tinside = inside && -0.5 <= clipPosition.z && clipPosition.z <= 0.5;\\n\\t\\t\\tinsideAny = insideAny || inside;\\n\\t\\t}\\n\\n\\t\\tif (!insideAny) {\\n\\t\\t\\t#if defined clip_outside\\n\\t\\t\\t\\tgl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);\\n\\t\\t\\t#elif defined clip_highlight_inside && !defined(color_type_depth)\\n\\t\\t\\t\\tfloat c = (vColor.r + vColor.g + vColor.b) / 6.0;\\n\\t\\t\\t#endif\\n\\t\\t} else {\\n\\t\\t\\t#if defined clip_highlight_inside\\n\\t\\t\\t\\tvColor.r += 0.5;\\n\\t\\t\\t#elif defined clip_inside\\n\\t\\t\\t\\tgl_Position = vec4(1000.0, 1000.0, 1000.0, 1.0);\\n\\t\\t\\t#endif\\n\\t\\t}\\n\\t#endif\\n\\n\\n\\t// ---------------------\\n\\t// For Depth purposes\\n\\t// ---------------------\\n\\n\\tif(renderDepth) {\\n\\t\\tvColor = vec3(1. - gl_Position.z / gl_Position.w);\\n\\t}\\n\\n}\\n");//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiMjQ1LmpzIiwibWFwcGluZ3MiOiI7OztBQUFBIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vcG90cmVlLy4vc3JjL21hdGVyaWFscy9zaGFkZXJzL3BvaW50Y2xvdWQudmVydD9lZmM4Il0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IFwicHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbnByZWNpc2lvbiBoaWdocCBpbnQ7XFxuXFxuI2RlZmluZSBtYXhfY2xpcF9ib3hlcyAzMFxcblxcbmF0dHJpYnV0ZSB2ZWMzIHBvc2l0aW9uO1xcbmF0dHJpYnV0ZSB2ZWMzIGNvbG9yO1xcblxcbiNpZmRlZiBjb2xvcl9yZ2JhXFxuXFx0YXR0cmlidXRlIHZlYzQgcmdiYTtcXG4jZW5kaWZcXG5cXG5hdHRyaWJ1dGUgdmVjMyBub3JtYWw7XFxuYXR0cmlidXRlIGZsb2F0IGludGVuc2l0eTtcXG5hdHRyaWJ1dGUgZmxvYXQgY2xhc3NpZmljYXRpb247XFxuYXR0cmlidXRlIGZsb2F0IHJldHVybk51bWJlcjtcXG5hdHRyaWJ1dGUgZmxvYXQgbnVtYmVyT2ZSZXR1cm5zO1xcbmF0dHJpYnV0ZSBmbG9hdCBwb2ludFNvdXJjZUlEO1xcbmF0dHJpYnV0ZSB2ZWM0IGluZGljZXM7XFxuYXR0cmlidXRlIHZlYzIgdXY7XFxuXFxudW5pZm9ybSBtYXQ0IG1vZGVsTWF0cml4O1xcbnVuaWZvcm0gbWF0NCBtb2RlbFZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHByb2plY3Rpb25NYXRyaXg7XFxudW5pZm9ybSBtYXQ0IHZpZXdNYXRyaXg7XFxudW5pZm9ybSBtYXQzIG5vcm1hbE1hdHJpeDtcXG5cXG51bmlmb3JtIGZsb2F0IHBjSW5kZXg7XFxuXFxudW5pZm9ybSBmbG9hdCBzY3JlZW5XaWR0aDtcXG51bmlmb3JtIGZsb2F0IHNjcmVlbkhlaWdodDtcXG51bmlmb3JtIGZsb2F0IGZvdjtcXG51bmlmb3JtIGZsb2F0IHNwYWNpbmc7XFxuXFxuI2lmIGRlZmluZWQgdXNlX2NsaXBfYm94XFxuXFx0dW5pZm9ybSBtYXQ0IGNsaXBCb3hlc1ttYXhfY2xpcF9ib3hlc107XFxuI2VuZGlmXFxuXFxudW5pZm9ybSBmbG9hdCBoZWlnaHRNaW47XFxudW5pZm9ybSBmbG9hdCBoZWlnaHRNYXg7XFxudW5pZm9ybSBmbG9hdCBzaXplOyAvLyBwaXhlbCBzaXplIGZhY3RvclxcbnVuaWZvcm0gZmxvYXQgbWluU2l6ZTsgLy8gbWluaW11bSBwaXhlbCBzaXplXFxudW5pZm9ybSBmbG9hdCBtYXhTaXplOyAvLyBtYXhpbXVtIHBpeGVsIHNpemVcXG51bmlmb3JtIGZsb2F0IG9jdHJlZVNpemU7XFxudW5pZm9ybSB2ZWMzIGJiU2l6ZTtcXG51bmlmb3JtIHZlYzMgdUNvbG9yO1xcbnVuaWZvcm0gZmxvYXQgb3BhY2l0eTtcXG51bmlmb3JtIGZsb2F0IGNsaXBCb3hDb3VudDtcXG51bmlmb3JtIGZsb2F0IGxldmVsO1xcbnVuaWZvcm0gZmxvYXQgdm5TdGFydDtcXG51bmlmb3JtIGJvb2wgaXNMZWFmTm9kZTtcXG5cXG51bmlmb3JtIGZsb2F0IGZpbHRlckJ5Tm9ybWFsVGhyZXNob2xkO1xcbnVuaWZvcm0gdmVjMiBpbnRlbnNpdHlSYW5nZTtcXG51bmlmb3JtIGZsb2F0IG9wYWNpdHlBdHRlbnVhdGlvbjtcXG51bmlmb3JtIGZsb2F0IGludGVuc2l0eUdhbW1hO1xcbnVuaWZvcm0gZmxvYXQgaW50ZW5zaXR5Q29udHJhc3Q7XFxudW5pZm9ybSBmbG9hdCBpbnRlbnNpdHlCcmlnaHRuZXNzO1xcbnVuaWZvcm0gZmxvYXQgcmdiR2FtbWE7XFxudW5pZm9ybSBmbG9hdCByZ2JDb250cmFzdDtcXG51bmlmb3JtIGZsb2F0IHJnYkJyaWdodG5lc3M7XFxudW5pZm9ybSBmbG9hdCB0cmFuc2l0aW9uO1xcbnVuaWZvcm0gZmxvYXQgd1JHQjtcXG51bmlmb3JtIGZsb2F0IHdJbnRlbnNpdHk7XFxudW5pZm9ybSBmbG9hdCB3RWxldmF0aW9uO1xcbnVuaWZvcm0gZmxvYXQgd0NsYXNzaWZpY2F0aW9uO1xcbnVuaWZvcm0gZmxvYXQgd1JldHVybk51bWJlcjtcXG51bmlmb3JtIGZsb2F0IHdTb3VyY2VJRDtcXG5cXG51bmlmb3JtIGJvb2wgcmVuZGVyRGVwdGg7XFxuXFxudW5pZm9ybSBzYW1wbGVyMkQgdmlzaWJsZU5vZGVzO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGdyYWRpZW50O1xcbnVuaWZvcm0gc2FtcGxlcjJEIGNsYXNzaWZpY2F0aW9uTFVUO1xcbnVuaWZvcm0gc2FtcGxlcjJEIGRlcHRoTWFwO1xcblxcbiNpZmRlZiB1c2VfdGV4dHVyZV9ibGVuZGluZ1xcblxcdHVuaWZvcm0gc2FtcGxlcjJEIGJhY2tncm91bmRNYXA7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIHVzZV9wb2ludF9jbG91ZF9taXhpbmdcXG5cXHR1bmlmb3JtIGludCBwb2ludENsb3VkTWl4aW5nTW9kZTtcXG5cXHR1bmlmb3JtIGZsb2F0IHBvaW50Q2xvdWRJRDtcXG5cXG5cXHR1bmlmb3JtIGZsb2F0IHBvaW50Q2xvdWRNaXhBbmdsZTtcXG5cXHR1bmlmb3JtIGZsb2F0IHN0cmlwZURpc3RhbmNlWDtcXG5cXHR1bmlmb3JtIGZsb2F0IHN0cmlwZURpc3RhbmNlWTtcXG5cXG5cXHR1bmlmb3JtIGZsb2F0IHN0cmlwZURpdmlzb3JYO1xcblxcdHVuaWZvcm0gZmxvYXQgc3RyaXBlRGl2aXNvclk7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIGhpZ2hsaWdodF9wb2ludFxcblxcdHVuaWZvcm0gdmVjMyBoaWdobGlnaHRlZFBvaW50Q29vcmRpbmF0ZTtcXG5cXHR1bmlmb3JtIGJvb2wgZW5hYmxlUG9pbnRIaWdobGlnaHRpbmc7XFxuXFx0dW5pZm9ybSBmbG9hdCBoaWdobGlnaHRlZFBvaW50U2NhbGU7XFxuI2VuZGlmXFxuXFxuI2lmZGVmIHVzZV9maWx0ZXJfYnlfbm9ybWFsXFxuXFx0dW5pZm9ybSBpbnQgbm9ybWFsRmlsdGVyaW5nTW9kZTtcXG4jZW5kaWZcXG5cXG52YXJ5aW5nIHZlYzMgdkNvbG9yO1xcblxcbiNpZiAhZGVmaW5lZChjb2xvcl90eXBlX3BvaW50X2luZGV4KVxcblxcdHZhcnlpbmcgZmxvYXQgdk9wYWNpdHk7XFxuI2VuZGlmXFxuXFxuI2lmIGRlZmluZWQod2VpZ2h0ZWRfc3BsYXRzKVxcblxcdHZhcnlpbmcgZmxvYXQgdkxpbmVhckRlcHRoO1xcbiNlbmRpZlxcblxcbiNpZiAhZGVmaW5lZChwYXJhYm9sb2lkX3BvaW50X3NoYXBlKSAmJiBkZWZpbmVkKHVzZV9lZGwpXFxuXFx0dmFyeWluZyBmbG9hdCB2TG9nRGVwdGg7XFxuI2VuZGlmXFxuXFxuI2lmIGRlZmluZWQoY29sb3JfdHlwZV9waG9uZykgJiYgKE1BWF9QT0lOVF9MSUdIVFMgPiAwIHx8IE1BWF9ESVJfTElHSFRTID4gMCkgfHwgZGVmaW5lZChwYXJhYm9sb2lkX3BvaW50X3NoYXBlKVxcblxcdHZhcnlpbmcgdmVjMyB2Vmlld1Bvc2l0aW9uO1xcbiNlbmRpZlxcblxcbiNpZiBkZWZpbmVkKHdlaWdodGVkX3NwbGF0cykgfHwgZGVmaW5lZChwYXJhYm9sb2lkX3BvaW50X3NoYXBlKVxcblxcdHZhcnlpbmcgZmxvYXQgdlJhZGl1cztcXG4jZW5kaWZcXG5cXG4jaWYgZGVmaW5lZChjb2xvcl90eXBlX3Bob25nKSAmJiAoTUFYX1BPSU5UX0xJR0hUUyA+IDAgfHwgTUFYX0RJUl9MSUdIVFMgPiAwKVxcblxcdHZhcnlpbmcgdmVjMyB2Tm9ybWFsO1xcbiNlbmRpZlxcblxcbiNpZmRlZiBoaWdobGlnaHRfcG9pbnRcXG5cXHR2YXJ5aW5nIGZsb2F0IHZIaWdobGlnaHQ7XFxuI2VuZGlmXFxuXFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuLy8gT0NUUkVFXFxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tXFxuXFxuI2lmIChkZWZpbmVkKGFkYXB0aXZlX3BvaW50X3NpemUpIHx8IGRl