diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000000..2536d66bf13a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,12 @@ +# http://editorconfig.org +root = true + +[*] +indent_style = space +indent_size = 4 +charset = utf-8 +trim_trailing_whitespace = true +insert_final_newline = true + +[*.md] +trim_trailing_whitespace = false diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 72abef0a7321..000000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - \ No newline at end of file diff --git a/Apps/CesiumViewer/CesiumViewer.js b/Apps/CesiumViewer/CesiumViewer.js index 1429527716b6..aa2aed7aa51c 100644 --- a/Apps/CesiumViewer/CesiumViewer.js +++ b/Apps/CesiumViewer/CesiumViewer.js @@ -5,7 +5,6 @@ define([ 'Cesium/Core/Color', 'Cesium/Core/defined', 'Cesium/Core/formatError', - 'Cesium/Core/getFilenameFromUri', 'Cesium/Core/Math', 'Cesium/Core/Rectangle', 'Cesium/Core/objectToQuery', @@ -29,7 +28,6 @@ define([ Color, defined, formatError, - getFilenameFromUri, CesiumMath, Rectangle, objectToQuery, diff --git a/Apps/Sandcastle/CesiumSandcastle.js b/Apps/Sandcastle/CesiumSandcastle.js index 585947073935..92fdba14ffdd 100644 --- a/Apps/Sandcastle/CesiumSandcastle.js +++ b/Apps/Sandcastle/CesiumSandcastle.js @@ -1,5 +1,6 @@ /*global require,Blob,JSHINT*/ /*global gallery_demos*/// defined by gallery/gallery-index.js, created by build +/*global hello_world_index*/// defined in gallery/gallery-index.js, created by build /*global sandcastleJsHintOptions*/// defined by jsHintOptions.js, created by build require({ baseUrl : '../../Source', @@ -138,6 +139,7 @@ require({ var subtabs = {}; var docError = false; var galleryError = false; + var notFound = false; var galleryTooltipTimer; var activeGalleryTooltipDemo; var demoTileHeightRule = findCssStyle('.demoTileThumbnail'); @@ -305,7 +307,7 @@ require({ var selectedTabName = registry.byId('innerPanel').selectedChildWidget.title; var suffix = selectedTabName + 'Demos'; if (selectedTabName === 'All') { - suffix = ''; + suffix = 'all'; } else if (selectedTabName === 'Search Results') { suffix = 'searchDemo'; } @@ -693,6 +695,7 @@ require({ } function loadFromGallery(demo) { + notFound = false; document.getElementById('saveAsFile').download = demo.name + '.html'; registry.byId('description').set('value', decodeHTML(demo.description).replace(/\\n/g, '\n')); registry.byId('label').set('value', decodeHTML(demo.label).replace(/\\n/g, '\n')); @@ -803,6 +806,9 @@ require({ if (galleryError) { appendConsole('consoleError', 'Error loading gallery, please run the build script.', true); } + if (notFound) { + appendConsole('consoleLog', 'Unable to load demo named ' + queryObject.src.replace('.html', '') + '\n', true); + } } } else if (Cesium.defined(e.data.log)) { // Console log messages from the iframe display in Sandcastle. @@ -1054,8 +1060,15 @@ require({ url : 'gallery/' + name + '.html', handleAs : 'text', error : function(error) { - appendConsole('consoleError', error, true); - galleryError = true; + if (error.status === 404) { + loadFromGallery(gallery_demos[hello_world_index]) + .then(function() { + notFound = true; + }); + } else { + galleryError = true; + appendConsole('consoleError', error, true); + } } }); } diff --git a/Apps/Sandcastle/gallery/3D Models Coloring.html b/Apps/Sandcastle/gallery/3D Models Coloring.html new file mode 100644 index 000000000000..979c9a6f955a --- /dev/null +++ b/Apps/Sandcastle/gallery/3D Models Coloring.html @@ -0,0 +1,242 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Model Color
Mode
Color
Alpha + + +
Mix + + +
Model Silhouette
Color
Alpha + + +
Size + + +
+
+ + + diff --git a/Apps/Sandcastle/gallery/3D Models Coloring.jpg b/Apps/Sandcastle/gallery/3D Models Coloring.jpg new file mode 100644 index 000000000000..dff69552e5ca Binary files /dev/null and b/Apps/Sandcastle/gallery/3D Models Coloring.jpg differ diff --git a/Apps/Sandcastle/gallery/3D Models.html b/Apps/Sandcastle/gallery/3D Models.html index 30caabdb7188..faa2af95ed0a 100644 --- a/Apps/Sandcastle/gallery/3D Models.html +++ b/Apps/Sandcastle/gallery/3D Models.html @@ -94,4 +94,4 @@ } - + \ No newline at end of file diff --git a/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html new file mode 100644 index 000000000000..592c3f1f3615 --- /dev/null +++ b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.html @@ -0,0 +1,301 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+ + + diff --git a/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.jpg b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.jpg new file mode 100644 index 000000000000..22d9d9be59b9 Binary files /dev/null and b/Apps/Sandcastle/gallery/3D Tiles Batch Table Hierarchy.jpg differ diff --git a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html index 0d0474e8c3eb..094c3bd30667 100644 --- a/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html +++ b/Apps/Sandcastle/gallery/3D Tiles Point Cloud Styling.html @@ -109,23 +109,63 @@ color : "color() * abs(${temperature} - 0.5)" }); -addStyle('Cos', { - color : "color() * abs(cos(${temperature} + TILES3D_TILESET_TIME))" +addStyle('Trigonometric Functions', { + color : "color() * radians(cos(${temperature})) + color() * sin(${temperature}) + color() * tan(${temperature})" + +}); + +addStyle('Arc Trigonometric Functions', { + color : "color() * acos(degrees(${temperature})) + color() * asin(${temperature}) + color() * atan(${temperature}) + color() * atan2(${POSITION}[0],${temperature})", + pointSize : "5" }); addStyle('Sqrt', { color : "color() * sqrt(${temperature})", - pointSize : "10" + pointSize : "5" +}); + +addStyle('Sign', { + color : "rgb(sign(${POSITION}[0]) * 255, sign(${POSITION}[1]) * 255, sign(${POSITION}[2]) * 255)", + pointSize : "5" +}); + +addStyle('Rounding Functions', { + color : "rgb(floor(${POSITION}[0]) * 255, ceil(${POSITION}[1]) * 255, round(${POSITION}[2]) * 255)", + pointSize : "5" +}); + +addStyle('Exp and Log Functions', { + color : "rgb(log(${POSITION}[0]) * 255, log2(${POSITION}[1]) * 255 + exp2(${POSITION}[1]) * 255, exp(${POSITION}[2]) * 255)", + pointSize : "5" +}); + +addStyle('Fractional Part', { + color : "rgb(fract(${POSITION}[0]) * 255, fract(${POSITION}[1]) * 255, fract(${POSITION}[2]) * 255)", + pointSize : "5" +}); + +addStyle('Pow', { + color : "color() * pow(${temperature}, 3)", + pointSize : "5" +}); + +addStyle('Min and Max', { + color : "rgb(min(${POSITION}.x, 0.75) * 255, max(${POSITION}.z, 0.25) * 255, 255)", + pointSize : "5" +}); + +addStyle('Clamp and Mix', { + color : "color() * clamp(${temperature}, 0.1, 0.2)", + pointSize : "mix(${temperature}, 2.0, 0.5) * 0.2" }); addStyle('Secondary Color', { color : { - expression : "[${secondaryColor}[0], ${secondaryColor}[1], ${secondaryColor}[2], 1.0]", conditions : [ - ["${id} < 250", "${expression}"], - ["${id} < 500", "${expression} * ${expression}"], - ["${id} < 750", "${expression} / 5.0"], - ["${id} < 1000", "rgb(0, 0, Number(${expression}[0] < 0.5) * 255)"] + ["${id} < 250", "vec4(${secondaryColor}, 1.0)"], + ["${id} < 500", "vec4(${secondaryColor} * ${secondaryColor}, 1.0)"], + ["${id} < 750", "vec4(${secondaryColor} / 5.0, 1.0)"], + ["${id} < 1000", "rgb(0, 0, Number(${secondaryColor}.x < 0.5) * 255)"] ] } }); @@ -138,8 +178,9 @@ show : "${POSITION}[0] > 0.5 || ${POSITION}[1] > 0.5 || ${POSITION}[2] > 0.5" }); +// POSITION contains 0 as its last component, so add 1.0 to make the point cloud opaque addStyle('Color based on position', { - color : "rgb(${POSITION}[0] * 255, ${POSITION}[1] * 255, ${POSITION}[2] * 255)" + color : "vec4(${POSITION}, 1.0)" }); addStyle('Style point size', { diff --git a/Apps/Sandcastle/gallery/3D Tiles.html b/Apps/Sandcastle/gallery/3D Tiles.html index ddb66f984bd3..6cf573bc71f7 100644 --- a/Apps/Sandcastle/gallery/3D Tiles.html +++ b/Apps/Sandcastle/gallery/3D Tiles.html @@ -136,7 +136,8 @@ "outlineColor" : "rgb(255, 0, 0)", "outlineWidth" : "10", "labelStyle" : "2", - "font" : "'50px cursive'" + "font" : "'50px cursive'", + "backgroundEnabled" : "true" }); addStyleUI(); @@ -149,6 +150,10 @@ //console.log('Loading: requests: ' + numberOfPendingRequests + ', processing: ' + numberProcessing); }); + tileset.allTilesLoaded.addEventListener(function() { + //console.log('All tiles are loaded'); + }); + tileset.tileUnload.addEventListener(function(tile) { //console.log('Tile unloaded.') }); @@ -406,6 +411,10 @@ tileset.debugColorizeTiles = !tileset.debugColorizeTiles; }); +Sandcastle.addToolbarButton('Wireframe on/off', function() { + tileset.debugWireframe = !tileset.debugWireframe; +}); + Sandcastle.addToolbarButton('BV on/off', function() { tileset.debugShowBoundingVolume = !tileset.debugShowBoundingVolume; }); diff --git a/Apps/Sandcastle/gallery/CZML Billboard and Label.html b/Apps/Sandcastle/gallery/CZML Billboard and Label.html index dc6e1521d663..37889f6d28ca 100644 --- a/Apps/Sandcastle/gallery/CZML Billboard and Label.html +++ b/Apps/Sandcastle/gallery/CZML Billboard and Label.html @@ -42,19 +42,19 @@ }, "label" : { "fillColor" : { - "rgba" : [0, 255, 255, 255] + "rgba" : [255, 255, 255, 255] }, - "font" : "11pt Lucida Console", + "font" : "12pt Lucida Console", "horizontalOrigin" : "LEFT", - "outlineColor" : { - "rgba":[0, 0, 0, 255] - }, - "outlineWidth" : 2, "pixelOffset" : { - "cartesian2" : [12, 0] + "cartesian2" : [8, 0] }, - "style" : "FILL_AND_OUTLINE", - "text" : "AGI" + "style" : "FILL", + "text" : "AGI", + "showBackground" : true, + "backgroundColor" : { + "rgba" : [112, 89, 57, 200] + } }, "position" : { "cartesian":[ @@ -65,7 +65,7 @@ var viewer = new Cesium.Viewer('cesiumContainer'); viewer.dataSources.add(Cesium.CzmlDataSource.load(czml)); - //Sandcastle_End +//Sandcastle_End Sandcastle.finishedLoading(); } if (typeof Cesium !== "undefined") { diff --git a/Apps/Sandcastle/gallery/CZML.html b/Apps/Sandcastle/gallery/CZML.html index 0cafcad8932f..5a02e79f2bbb 100644 --- a/Apps/Sandcastle/gallery/CZML.html +++ b/Apps/Sandcastle/gallery/CZML.html @@ -42,8 +42,7 @@ viewer.scene.camera.setView({ destination: Cesium.Cartesian3.fromDegrees(-116.52, 35.02, 95000), orientation: { - heading: 6, - picth: -Cesium.Math.PI_OVER_TWO + heading: 6 } }); }); diff --git a/Apps/Sandcastle/gallery/Custom Geocoder.html b/Apps/Sandcastle/gallery/Custom Geocoder.html new file mode 100644 index 000000000000..b1f388c92db4 --- /dev/null +++ b/Apps/Sandcastle/gallery/Custom Geocoder.html @@ -0,0 +1,90 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+ + + \ No newline at end of file diff --git a/Apps/Sandcastle/gallery/Ground Clamping.html b/Apps/Sandcastle/gallery/Ground Clamping.html index d4081e1d8b1f..81c1d41a123b 100644 --- a/Apps/Sandcastle/gallery/Ground Clamping.html +++ b/Apps/Sandcastle/gallery/Ground Clamping.html @@ -10,10 +10,10 @@ @@ -29,8 +29,8 @@
diff --git a/Apps/Sandcastle/gallery/Labels.html b/Apps/Sandcastle/gallery/Labels.html index 0cbe6839a575..2c4b4b4b7f96 100644 --- a/Apps/Sandcastle/gallery/Labels.html +++ b/Apps/Sandcastle/gallery/Labels.html @@ -64,6 +64,7 @@ }); entity.label.scale = 2.0; + entity.label.showBackground = true; } function offsetByDistance() { @@ -80,6 +81,7 @@ label : { text : 'Label on top of scaling billboard', font : '20px sans-serif', + showBackground : true, horizontalOrigin : Cesium.HorizontalOrigin.CENTER, pixelOffset : new Cesium.Cartesian2(0.0, -image.height), pixelOffsetScaleByDistance : new Cesium.NearFarScalar(1.5e2, 3.0, 1.5e7, 0.5) diff --git a/Apps/Sandcastle/gallery/Materials.html b/Apps/Sandcastle/gallery/Materials.html index 4837b977d00f..ef0f13c94f12 100644 --- a/Apps/Sandcastle/gallery/Materials.html +++ b/Apps/Sandcastle/gallery/Materials.html @@ -202,6 +202,29 @@ }); } +function applyCompressedTextureMaterial(primitive, scene) { + Sandcastle.declare(applyCompressedTextureMaterial); // For highlighting in Sandcastle. + + var compressedImageUrl; + var context = scene.context; + if (context.s3tc) { + compressedImageUrl = '../images/LogoDXT1.ktx'; + } else if (context.etc1) { + compressedImageUrl = '../images/LogoETC1.ktx'; + } else if (context.pvrtc) { + compressedImageUrl = '../images/LogoPVR.ktx'; + } + + primitive.appearance.material = new Cesium.Material({ + fabric : { + type : 'Image', + uniforms : { + image : compressedImageUrl + } + } + }); +} + function applyNormalMapMaterial(primitive, scene) { Sandcastle.declare(applyNormalMapMaterial); // For highlighting in Sandcastle. primitive.appearance.material = new Cesium.Material({ @@ -310,6 +333,13 @@ applyImageMaterial(rectangle, scene); Sandcastle.highlight(applyImageMaterial); } + }, { + text : 'Compressed Image', + onselect : function() { + toggleRectangleVisibility(); + applyCompressedTextureMaterial(rectangle, scene); + Sandcastle.highlight(applyCompressedTextureMaterial); + } }]); Sandcastle.addToolbarMenu([{ diff --git a/Apps/Sandcastle/gallery/Offline.html b/Apps/Sandcastle/gallery/Offline.html new file mode 100644 index 000000000000..36d02c454644 --- /dev/null +++ b/Apps/Sandcastle/gallery/Offline.html @@ -0,0 +1,52 @@ + + + + + + + + + Cesium Demo + + + + + + +
+

Loading...

+
+ + + diff --git a/Apps/Sandcastle/gallery/Offline.jpg b/Apps/Sandcastle/gallery/Offline.jpg new file mode 100644 index 000000000000..7ab0c0b70bc2 Binary files /dev/null and b/Apps/Sandcastle/gallery/Offline.jpg differ diff --git a/Apps/Sandcastle/gallery/Picking.html b/Apps/Sandcastle/gallery/Picking.html index 22c7c73ff95a..6ae7162463fe 100644 --- a/Apps/Sandcastle/gallery/Picking.html +++ b/Apps/Sandcastle/gallery/Picking.html @@ -38,7 +38,12 @@ Sandcastle.addDefaultToolbarButton('Show Cartographic Position on Mouse Over', function() { var entity = viewer.entities.add({ label : { - show : false + show : false, + showBackground : true, + font : '14px monospace', + horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + verticalOrigin : Cesium.VerticalOrigin.TOP, + pixelOffset : new Cesium.Cartesian2(15, 0) } }); @@ -53,7 +58,9 @@ entity.position = cartesian; entity.label.show = true; - entity.label.text = '(' + longitudeString + ', ' + latitudeString + ')'; + entity.label.text = + 'Lon: ' + (' ' + longitudeString).slice(-7) + '\u00B0' + + '\nLat: ' + (' ' + latitudeString).slice(-7) + '\u00B0'; } else { entity.label.show = false; } @@ -159,7 +166,11 @@ var labelEntity = viewer.entities.add({ label : { show : false, - horizontalOrigin : Cesium.HorizontalOrigin.LEFT + showBackground : true, + font : '14px monospace', + horizontalOrigin : Cesium.HorizontalOrigin.LEFT, + verticalOrigin : Cesium.VerticalOrigin.TOP, + pixelOffset : new Cesium.Cartesian2(15, 0) } }); @@ -181,8 +192,11 @@ labelEntity.position = cartesian; labelEntity.label.show = true; - labelEntity.label.text = '(' + longitudeString + ', ' + latitudeString + ', ' + heightString + ')'; - + labelEntity.label.text = + 'Lon: ' + (' ' + longitudeString).slice(-7) + '\u00B0' + + '\nLat: ' + (' ' + latitudeString).slice(-7) + '\u00B0' + + '\nAlt: ' + (' ' + heightString).slice(-7) + 'm'; + var camera = scene.camera; labelEntity.label.eyeOffset = new Cesium.Cartesian3(0.0, 0.0, camera.frustum.near * 1.5 - Cesium.Cartesian3.distance(cartesian, camera.position)); @@ -201,7 +215,7 @@ handler = handler && handler.destroy(); }; //Sandcastle_End -Sandcastle.finishedLoading(); + Sandcastle.finishedLoading(); } if (typeof Cesium !== "undefined") { startup(Cesium); diff --git a/Apps/Sandcastle/gallery/Rectangle.html b/Apps/Sandcastle/gallery/Rectangle.html index 02f20c1c8229..7861a1cc0262 100644 --- a/Apps/Sandcastle/gallery/Rectangle.html +++ b/Apps/Sandcastle/gallery/Rectangle.html @@ -42,7 +42,7 @@ var greenRectangle = viewer.entities.add({ name : 'Green translucent, rotated, and extruded rectangle at height with outline', rectangle : { - coordinates : Cesium.Rectangle.fromDegrees(-100.0, 30.0, -90.0, 40.0), + coordinates : Cesium.Rectangle.fromDegrees(-110.0, 30.0, -100.0, 40.0), material : Cesium.Color.GREEN.withAlpha(0.5), rotation : Cesium.Math.toRadians(45), extrudedHeight : 300000.0, @@ -52,6 +52,22 @@ } }); +var rotation = Cesium.Math.toRadians(30); + +function getRotationValue() { + rotation += 0.005; + return rotation; +} +viewer.entities.add({ + name: 'Rotating rectangle with rotating texture coordinate', + rectangle: { + coordinates: Cesium.Rectangle.fromDegrees(-92.0, 30.0, -76.0, 40.0), + material: '../images/Cesium_Logo_Color.jpg', + rotation: new Cesium.CallbackProperty(getRotationValue, false), + stRotation: new Cesium.CallbackProperty(getRotationValue, false) + } +}); + viewer.zoomTo(viewer.entities); //Sandcastle_End Sandcastle.finishedLoading(); diff --git a/Apps/Sandcastle/gallery/Rectangle.jpg b/Apps/Sandcastle/gallery/Rectangle.jpg index 3aa5238d6ea8..eac9a0ba48f4 100644 Binary files a/Apps/Sandcastle/gallery/Rectangle.jpg and b/Apps/Sandcastle/gallery/Rectangle.jpg differ diff --git a/Apps/Sandcastle/gallery/Terrain.html b/Apps/Sandcastle/gallery/Terrain.html index f09c8ca71855..09eedd03e1c4 100644 --- a/Apps/Sandcastle/gallery/Terrain.html +++ b/Apps/Sandcastle/gallery/Terrain.html @@ -33,6 +33,9 @@ //Sandcastle_Begin var viewer = new Cesium.Viewer('cesiumContainer'); +// set lighting to true +viewer.scene.globe.enableLighting = true; + var cesiumTerrainProviderMeshes = new Cesium.CesiumTerrainProvider({ url : 'https://assets.agi.com/stk-terrain/world', requestWaterMask : true, @@ -93,10 +96,7 @@ Sandcastle.addDefaultToolbarMenu([{ text : 'Mount Everest', onselect : function() { - var target = new Cesium.Cartesian3(300770.50872389384, 5634912.131394585, 2978152.2865545116); - var offset = new Cesium.Cartesian3(6344.974098678562, -793.3419798081741, 2499.9508860763162); - viewer.camera.lookAt(target, offset); - viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); + lookAtMtEverest(); } }, { text : 'Half Dome', @@ -118,6 +118,13 @@ var terrainSamplePositions; +function lookAtMtEverest() { + var target = new Cesium.Cartesian3(300770.50872389384, 5634912.131394585, 2978152.2865545116); + var offset = new Cesium.Cartesian3(6344.974098678562, -793.3419798081741, 2499.9508860763162); + viewer.camera.lookAt(target, offset); + viewer.camera.lookAtTransform(Cesium.Matrix4.IDENTITY); +} + function sampleTerrainSuccess() { var ellipsoid = Cesium.Ellipsoid.WGS84; @@ -141,21 +148,27 @@ }, label : { text : position.height.toFixed(1), + font : '10pt monospace', horizontalOrigin : Cesium.HorizontalOrigin.CENTER, - scale : 0.3, pixelOffset : new Cesium.Cartesian2(0, -14), - fillColor : Cesium.Color.RED, - outlineColor : Cesium.Color.WHITE + fillColor : Cesium.Color.BLACK, + outlineColor : Cesium.Color.BLACK, + showBackground : true, + backgroundColor : new Cesium.Color(0.9, 0.9, 0.9, 0.7), + backgroundPadding : new Cesium.Cartesian2(4, 3) } }); } viewer.entities.resumeEvents(); } -Sandcastle.addToggleButton('Lighting', viewer.scene.globe.enableLighting, function(checked) { +Sandcastle.addToggleButton('Enable Lighting', viewer.scene.globe.enableLighting, function(checked) { viewer.scene.globe.enableLighting = checked; }); +Sandcastle.addToggleButton('Enable fog', viewer.scene.fog.enabled, function(checked) { + viewer.scene.fog.enabled = checked; +}); Sandcastle.addToolbarButton('Sample Everest Terrain', function() { var gridWidth = 41; @@ -175,12 +188,9 @@ } Cesium.when(Cesium.sampleTerrain(viewer.terrainProvider, 9, terrainSamplePositions), sampleTerrainSuccess); -}, 'sampleButtons'); - -Sandcastle.addToggleButton('Enable fog', viewer.scene.fog.enabled, function(checked) { - viewer.scene.fog.enabled = checked; -}); + lookAtMtEverest(); +}, 'sampleButtons'); //Sandcastle_End Sandcastle.finishedLoading(); diff --git a/Apps/Sandcastle/gallery/development/3D Models.html b/Apps/Sandcastle/gallery/development/3D Models.html index 0504f5af2a7b..ffc969e4dc54 100644 --- a/Apps/Sandcastle/gallery/development/3D Models.html +++ b/Apps/Sandcastle/gallery/development/3D Models.html @@ -19,16 +19,107 @@

Loading...

-
+
+ + + + + + + + + + + + + + + + + +
Mode
Color
Alpha + + +
Mix + + +
+
- - - - - -
-

Loading...

-
- - - diff --git a/Apps/Sandcastle/images/LogoDXT1.ktx b/Apps/Sandcastle/images/LogoDXT1.ktx new file mode 100644 index 000000000000..73598d1c8d30 Binary files /dev/null and b/Apps/Sandcastle/images/LogoDXT1.ktx differ diff --git a/Apps/Sandcastle/images/LogoETC1.ktx b/Apps/Sandcastle/images/LogoETC1.ktx new file mode 100644 index 000000000000..9d8b88d7f541 Binary files /dev/null and b/Apps/Sandcastle/images/LogoETC1.ktx differ diff --git a/Apps/Sandcastle/images/LogoPVR.ktx b/Apps/Sandcastle/images/LogoPVR.ktx new file mode 100644 index 000000000000..fd3461c7bbbb Binary files /dev/null and b/Apps/Sandcastle/images/LogoPVR.ktx differ diff --git a/CHANGES.md b/CHANGES.md index 92c6182d9822..83f310133f26 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -3,6 +3,12 @@ Change Log ### TODO +* Added compressed texture support. + * glTF models and imagery layers can now reference [KTX](https://www.khronos.org/opengles/sdk/tools/KTX/) textures and textures compressed with [crunch](https://github.com/BinomialLLC/crunch). + * Added `loadKTX` to load KTX textures. + * Added `loadCRN` to load crunch compressed textures. + * Added new `PixelFormat` and `WebGLConstants` enums from WebGL extensions `WEBGL_compressed_s3tc`, `WEBGL_compressed_texture_pvrtc`, and `WEBGL_compressed_texture_etc1`. [#4758](https://github.com/AnalyticalGraphicsInc/cesium/pull/4758) + * Added `CompressedTextureBuffer`. * Added support for [3D Tiles](https://github.com/AnalyticalGraphicsInc/3d-tiles/blob/master/README.md) for streaming massive heterogeneous 3D geospatial datasets. The new Cesium APIs are: * `Cesium3DTileset` * `Cesium3DTileStyle`, `StyleExpression`, `Expression`, and `ConditionsExpression` @@ -10,12 +16,59 @@ Change Log * `Cesium3DTileContent` * `Cesium3DTileFeature` -### 1.28 - 2016-12-01 +### 1.30 - 2017-02-01 + * Deprecated - * + * The properties `url` and `key` will be removed from `GeocoderViewModel` in 1.31. These properties will be available on geocoder services that support them, like `BingMapsGeocoderService`. * Breaking changes - * -* Added support for saving html and css in Github Gists. [#4125](https://github.com/AnalyticalGraphicsInc/cesium/issues/4125) + * Removed separate `heading`, `pitch`, `roll` parameters from `Transform.headingPitchRollToFixedFrame` and `Transform.headingPitchRollQuaternion`. Pass a `headingPitchRoll` object instead. [#4843](https://github.com/AnalyticalGraphicsInc/cesium/pull/4843) +* Added support for custom geocoder services and autocomplete [#4723](https://github.com/AnalyticalGraphicsInc/cesium/pull/4723). + * Added [Custom Geocoder Sandcastle example](http://localhost:8080/Apps/Sandcastle/index.html?src=Custom%20Geocoder.html) +* Added `GeocoderService`, an interface for geocoders. +* Added `BingMapsGeocoderService` implementing the `GeocoderService` interface. +* Added `CartographicGeocoderService` implementing the `GeocoderService` interface. +* Updated the morph so the default view in Columbus View is now angled. [#3878](https://github.com/AnalyticalGraphicsInc/cesium/issues/3878) +* Fixed bug where `GroundPrimitives` where rendering incorrectly or disappearing at different zoom levels. [#4161](https://github.com/AnalyticalGraphicsInc/cesium/issues/4161) [#4326](https://github.com/AnalyticalGraphicsInc/cesium/issues/4326) +* Fixed sky atmosphere from causing incorrect picking and hanging drill picking. [#4783](https://github.com/AnalyticalGraphicsInc/cesium/issues/4783) and [#4784](https://github.com/AnalyticalGraphicsInc/cesium/issues/4784) +* Fixed a bug that could cause a "readyImagery is not actually ready" exception when quickly zooming past the maximum available imagery level of an imagery layer near the poles. +* Fixed a bug that caused all models to use the same highlight color. [#4798] (https://github.com/AnalyticalGraphicsInc/cesium/pull/4798) +* Fixed KML for when color is an empty string [#4826](https://github.com/AnalyticalGraphicsInc/cesium/pull/4826) +* Added support for WMS version 1.3 by using CRS vice SRS query string parameter to request projection. SRS is still used for older versions. + +### 1.29 - 2017-01-02 + +* Improved 3D Models + * Added the ability to blend a `Model` with a color/translucency. Added `color`, `colorBlendMode`, and `colorBlendAmount` properties to `Model`, `ModelGraphics`, and CZML. Also added `ColorBlendMode` enum. [#4547](https://github.com/AnalyticalGraphicsInc/cesium/pull/4547) + * Added the ability to render a `Model` with a silhouette. Added `silhouetteColor` and `silhouetteSize` properties to `Model`, `ModelGraphics`, and CZML. [#4314](https://github.com/AnalyticalGraphicsInc/cesium/pull/4314) +* Improved Labels + * Added new `Label` properties `showBackground`, `backgroundColor`, and `backgroundPadding` to the primitive, Entity, and CZML layers. + * Added support for newlines (`\n`) in Cesium `Label`s and CZML. [#2402] + * Added new enum `VerticalOrigin.BASELINE`. Previously, `VerticalOrigin.BOTTOM` would sometimes align to the baseline depending on the contents of a label. +(https://github.com/AnalyticalGraphicsInc/cesium/issues/2402) +* Fixed translucency in Firefox 50. [#4762](https://github.com/AnalyticalGraphicsInc/cesium/pull/4762) +* Fixed texture rotation for `RectangleGeometry`. [#2737](https://github.com/AnalyticalGraphicsInc/cesium/issues/2737) +* Fixed issue where billboards on terrain had an incorrect offset. [#4598](https://github.com/AnalyticalGraphicsInc/cesium/issues/4598) +* Fixed issue where `globe.getHeight` incorrectly returned `undefined`. [#3411](https://github.com/AnalyticalGraphicsInc/cesium/issues/3411) +* Fixed a bug that caused `GroundPrimitive` to render incorrectly on systems without the `WEBGL_depth_texture` extension. [#4747](https://github.com/AnalyticalGraphicsInc/cesium/pull/4747) +* Fixed default Mapbox token and added a watermark to notify users that they need to sign up for their own token. +* Fixed glTF models with skinning that used `bindShapeMatrix`. [#4722](https://github.com/AnalyticalGraphicsInc/cesium/issues/4722) +* Fixed a bug that could cause a "readyImagery is not actually ready" exception with some configurations of imagery layers. +* Fixed `Rectangle.union` to correctly account for rectangles that cross the IDL. [#4732](https://github.com/AnalyticalGraphicsInc/cesium/pull/4732) +* Fixed tooltips for gallery thumbnails in Sandcastle [#4702].(https://github.com/AnalyticalGraphicsInc/cesium/pull/4702) +* DataSourceClock.getValue now preserves the provided `result` properties when its properties are `undefined`. [#4029](https://github.com/AnalyticalGraphicsInc/cesium/issues/4029) +* Added `divideComponents` function to `Cartesian2`, `Cartesian3`, and `Cartesian4`. [#4750](https://github.com/AnalyticalGraphicsInc/cesium/pull/4750) +* Added `WebGLConstants` enum. Previously, this was part of the private Renderer API. [#4731](https://github.com/AnalyticalGraphicsInc/cesium/pull/4731) + +### 1.28 - 2016-12-01 + +* Improved terrain/imagery load ordering, especially when the terrain is already fully loaded and a new imagery layer is loaded. This results in a 25% reduction in load times in many cases. [#4616](https://github.com/AnalyticalGraphicsInc/cesium/pull/4616) +* Improved `Billboard`, `Label`, and `PointPrimitive` visual quality. [#4675](https://github.com/AnalyticalGraphicsInc/cesium/pull/4675) + * Corrected odd-width and odd-height billboard sizes from being incorrectly rounded up. + * Changed depth testing from `LESS` to `LEQUAL`, allowing label glyphs of equal depths to overlap. + * Label glyph positions have been adjusted and corrected. + * `TextureAtlas.borderWidthInPixels` has always been applied to the upper and right edges of each internal texture, but is now also applied to the bottom and left edges of the entire TextureAtlas, guaranteeing borders on all sides regardless of position within the atlas. +* Fall back to packing floats into an unsigned byte texture when floating point textures are unsupported. [#4563](https://github.com/AnalyticalGraphicsInc/cesium/issues/4563) +* Added support for saving html and css in GitHub Gists. [#4125](https://github.com/AnalyticalGraphicsInc/cesium/issues/4125) * Fixed `Cartographic.fromCartesian` when the cartesian is not on the ellipsoid surface. [#4611](https://github.com/AnalyticalGraphicsInc/cesium/issues/4611) ### 1.27 - 2016-11-01 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md index 4ce0ddeb4ae7..51d119ca3fd4 100644 --- a/CONTRIBUTORS.md +++ b/CONTRIBUTORS.md @@ -35,6 +35,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Josh Becker](https://github.com/JoshuaStorm) * [Kangning Li](https://github.com/likangning93) * [Erik Andersson](https://github.com/erikmaarten) + * [Austin Eng](https://github.com/austinEng) + * [Shehzan Mohammed](https://github.com/shehzan10) * [NICTA](http://www.nicta.com.au/) * [Chris Cooper](https://github.com/chris-cooper) * [Kevin Ring](https://github.com/kring) @@ -68,6 +70,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Camptocamp SA](https://www.camptocamp.com/) * [Frédéric Junod](https://github.com/fredj) * [Guillaume Beraudo](https://github.com/gberaudo) +* [Safe Software](https://www.safe.com) + * [Joel Depooter](https://github.com/JDepooter) ## [Individual CLA](http://www.agi.com/licenses/individual-cla-agi-v1.0.txt) * [Victor Berchet](https://github.com/vicb) @@ -114,3 +118,8 @@ See [CONTRIBUTING.md](CONTRIBUTING.md) for details on how to contribute to Cesiu * [Leesa Fini](https://github.com/leesafini) * [Victor Malaret](https://github.com/malaretv) * [David Friedman](https://github.com/duvifn) +* [Abhishek Potnis](https://github.com/abhishekvp) +* [Brad Hover](https://github.com/tekhaus) +* [Hüseyin Ateş](https://github.com/ateshuseyin) +* [Zsolt Simon](https://github.com/szsolt) +* [Chris Grant](https://github.com/cwgrant) diff --git a/Documentation/Contributors/CodingGuide/README.md b/Documentation/Contributors/CodingGuide/README.md index 8dbbb8e2fa81..55d1c80318d5 100644 --- a/Documentation/Contributors/CodingGuide/README.md +++ b/Documentation/Contributors/CodingGuide/README.md @@ -383,26 +383,40 @@ Some common sensible defaults are ### Throwing Exceptions -* Throw Cesium's `DeveloperError` when the user has a coding error. The most common errors are missing parameters and out-of-range parameters. For example: +Use the functions of Cesium's [Check](https://github.com/AnalyticalGraphicsInc/cesium/blob/master/Source/Core/Check.js) class to throw a `DeveloperError` when the user has a coding error. The most common errors are parameters that are missing, have the wrong type or are out of rangers of the wrong type or are out of range. + +* For example, to check that a parameter is defined and is an object: ```javascript Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); }; ``` + +* For more complicated parameter checks, manually check the parameter and then throw a `DeveloperError`. Example: +```javascript +Cartesian3.unpackArray = function(array, result) { + //>>includeStart('debug', pragmas.debug); + Check.defined(array, 'array'); + Check.numeric.minimum(array.length, 3); + if (array.length % 3 !== 0) { + throw new DeveloperError('array length must be a multiple of 3.'); + } + //>>includeEnd('debug'); + + // ... +}; +``` + * To check for `DeveloperError`, surround code in `includeStart`/`includeEnd` comments, as shown above, so developer error checks can be optimized out of release builds. Do not include required side effects inside `includeStart`/`includeEnd`, e.g., ```javascript Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); var c = cartesian; - if (!defined(c)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); // Works in debug. Fails in release since c is optimized out! diff --git a/Documentation/Images/Billboard.setHorizontalOrigin.png b/Documentation/Images/Billboard.setHorizontalOrigin.png index 01ac63db3ccc..77ce870e0a60 100644 Binary files a/Documentation/Images/Billboard.setHorizontalOrigin.png and b/Documentation/Images/Billboard.setHorizontalOrigin.png differ diff --git a/Documentation/Images/Billboard.setVerticalOrigin.png b/Documentation/Images/Billboard.setVerticalOrigin.png index a08e5f8854fc..2b49bc06e0f6 100644 Binary files a/Documentation/Images/Billboard.setVerticalOrigin.png and b/Documentation/Images/Billboard.setVerticalOrigin.png differ diff --git a/LICENSE.md b/LICENSE.md index ab3010cfbf16..7d75dc8f826a 100644 --- a/LICENSE.md +++ b/LICENSE.md @@ -313,6 +313,85 @@ OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +### crunch + +https://github.com/BinomialLLC/crunch + +>crunch/crnlib uses the ZLIB license: +>http://opensource.org/licenses/Zlib +> +>Copyright (c) 2010-2016 Richard Geldreich, Jr. and Binomial LLC +> +>This software is provided 'as-is', without any express or implied +warranty. In no event will the authors be held liable for any damages +arising from the use of this software. +> +>Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it +freely, subject to the following restrictions: +> +>1. The origin of this software must not be misrepresented; you must not +claim that you wrote the original software. If you use this software +in a product, an acknowledgment in the product documentation would be +appreciated but is not required. +> +>2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. +> +>3. This notice may not be removed or altered from any source distribution. + +### crunch_lib.cpp + +https://github.com/Apress/html5-game-dev-insights/blob/master/jones_ch21/crunch_webgl/crunch_js/crunch_lib.cpp + +>Copyright (c) 2013, Evan Parker, Brandon Jones. All rights reserved. +> +>Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: +> +> * Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +> * Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. +> +>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ + +### texture-tester + +https://github.com/toji/texture-tester + +>Copyright (c) 2014, Brandon Jones. All rights reserved. +> +>Redistribution and use in source and binary forms, with or without modification, +>are permitted provided that the following conditions are met: +> +>* Redistributions of source code must retain the above copyright notice, this +list of conditions and the following disclaimer. +>* Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. +> +>THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR +ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + Tests ===== diff --git a/README.md b/README.md index 657f4e2b003f..d75994100c97 100644 --- a/README.md +++ b/README.md @@ -46,6 +46,11 @@ We appreciate attribution by including the Cesium logo and link in your app. ### Demos ###

+  +  +  +  +        @@ -54,7 +59,7 @@ We appreciate attribution by including the Cesium logo and link in your app.       -  +        diff --git a/Source/Core/AttributeCompression.js b/Source/Core/AttributeCompression.js index d5e6973d29cf..0d943901ceec 100644 --- a/Source/Core/AttributeCompression.js +++ b/Source/Core/AttributeCompression.js @@ -2,14 +2,12 @@ define([ './Cartesian2', './Cartesian3', - './defaultValue', './defined', './DeveloperError', './Math' ], function( Cartesian2, Cartesian3, - defaultValue, defined, DeveloperError, CesiumMath) { diff --git a/Source/Core/BingMapsGeocoderService.js b/Source/Core/BingMapsGeocoderService.js new file mode 100644 index 000000000000..7f9c4fc4ced8 --- /dev/null +++ b/Source/Core/BingMapsGeocoderService.js @@ -0,0 +1,106 @@ +/*global define*/ +define([ + './BingMapsApi', + './defaultValue', + './defined', + './defineProperties', + './DeveloperError', + './loadJsonp', + './Rectangle' +], function( + BingMapsApi, + defaultValue, + defined, + defineProperties, + DeveloperError, + loadJsonp, + Rectangle) { + 'use strict'; + + var url = 'https://dev.virtualearth.net/REST/v1/Locations'; + + /** + * Provides geocoding through Bing Maps. + * @alias BingMapsGeocoderService + * @constructor + * + * @param {Object} options Object with the following properties: + * @param {String} [options.key] A key to use with the Bing Maps geocoding service + */ + function BingMapsGeocoderService(options) { + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + this._url = 'https://dev.virtualearth.net/REST/v1/Locations'; + this._key = BingMapsApi.getKey(options.key); + } + + defineProperties(BingMapsGeocoderService.prototype, { + /** + * The URL endpoint for the Bing geocoder service + * @type {String} + * @memberof {BingMapsGeocoderService.prototype} + * @readonly + */ + url : { + get : function () { + return this._url; + } + }, + + /** + * The key for the Bing geocoder service + * @type {String} + * @memberof {BingMapsGeocoderService.prototype} + * @readonly + */ + key : { + get : function () { + return this._key; + } + } + }); + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @returns {Promise} + */ + BingMapsGeocoderService.prototype.geocode = function(query) { + //>>includeStart('debug', pragmas.debug); + if (!defined(query)) { + throw new DeveloperError('query must be defined'); + } + //>>includeEnd('debug'); + + var key = this.key; + var promise = loadJsonp(url, { + parameters : { + query : query, + key : key + }, + callbackParameterName : 'jsonp' + }); + + return promise.then(function(result) { + if (result.resourceSets.length === 0) { + return []; + } + + var results = result.resourceSets[0].resources; + + return results.map(function (resource) { + var bbox = resource.bbox; + var south = bbox[0]; + var west = bbox[1]; + var north = bbox[2]; + var east = bbox[3]; + return { + displayName: resource.name, + destination: Rectangle.fromDegrees(west, south, east, north) + }; + }); + }); + }; + + return BingMapsGeocoderService; +}); diff --git a/Source/Core/BoundingRectangle.js b/Source/Core/BoundingRectangle.js index 029a75298f67..241fa4958f41 100644 --- a/Source/Core/BoundingRectangle.js +++ b/Source/Core/BoundingRectangle.js @@ -2,18 +2,18 @@ define([ './Cartesian2', './Cartographic', + './Check', './defaultValue', './defined', - './DeveloperError', './GeographicProjection', './Intersect', './Rectangle' ], function( Cartesian2, Cartographic, + Check, defaultValue, defined, - DeveloperError, GeographicProjection, Intersect, Rectangle) { @@ -79,12 +79,8 @@ define([ */ BoundingRectangle.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -107,9 +103,7 @@ define([ */ BoundingRectangle.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -242,12 +236,8 @@ define([ */ BoundingRectangle.union = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); if (!defined(result)) { @@ -276,12 +266,8 @@ define([ */ BoundingRectangle.expand = function(rectangle, point, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } - if (!defined(point)) { - throw new DeveloperError('point is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(point, 'point'); //>>includeEnd('debug'); result = BoundingRectangle.clone(rectangle, result); @@ -315,12 +301,8 @@ define([ */ BoundingRectangle.intersect = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); var leftX = left.x; diff --git a/Source/Core/BoundingSphere.js b/Source/Core/BoundingSphere.js index 32bbaf2b78f4..404d8787ae8e 100644 --- a/Source/Core/BoundingSphere.js +++ b/Source/Core/BoundingSphere.js @@ -2,30 +2,28 @@ define([ './Cartesian3', './Cartographic', + './Check', './defaultValue', './defined', - './DeveloperError', './Ellipsoid', './GeographicProjection', './Intersect', './Interval', './Matrix3', './Matrix4', - './Plane', './Rectangle' ], function( Cartesian3, Cartographic, + Check, defaultValue, defined, - DeveloperError, Ellipsoid, GeographicProjection, Intersect, Interval, Matrix3, Matrix4, - Plane, Rectangle) { 'use strict'; @@ -350,9 +348,7 @@ define([ stride = defaultValue(stride, 3); //>>includeStart('debug', pragmas.debug); - if (stride < 3) { - throw new DeveloperError('stride must be 3 or greater.'); - } + Check.numeric.minimum(stride, 3); //>>includeEnd('debug'); var currentPos = fromPointsCurrentPos; @@ -658,9 +654,8 @@ define([ */ BoundingSphere.fromCornerPoints = function(corner, oppositeCorner, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(corner) || !defined(oppositeCorner)) { - throw new DeveloperError('corner and oppositeCorner are required.'); - } + Check.typeOf.object(corner, 'corner'); + Check.typeOf.object(oppositeCorner, 'oppositeCorner'); //>>includeEnd('debug'); if (!defined(result)) { @@ -686,9 +681,7 @@ define([ */ BoundingSphere.fromEllipsoid = function(ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(ellipsoid)) { - throw new DeveloperError('ellipsoid is required.'); - } + Check.typeOf.object(ellipsoid, 'ellipsoid'); //>>includeEnd('debug'); if (!defined(result)) { @@ -816,13 +809,8 @@ define([ */ BoundingSphere.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -846,9 +834,7 @@ define([ */ BoundingSphere.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -877,13 +863,8 @@ define([ */ BoundingSphere.union = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); if (!defined(result)) { @@ -934,13 +915,8 @@ define([ */ BoundingSphere.expand = function(sphere, point, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(point)) { - throw new DeveloperError('point is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(point, 'point'); //>>includeEnd('debug'); result = BoundingSphere.clone(sphere, result); @@ -965,13 +941,8 @@ define([ */ BoundingSphere.intersectPlane = function(sphere, plane) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(plane)) { - throw new DeveloperError('plane is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(plane, 'plane'); //>>includeEnd('debug'); var center = sphere.center; @@ -999,13 +970,8 @@ define([ */ BoundingSphere.transform = function(sphere, transform, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(transform)) { - throw new DeveloperError('transform is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(transform, 'transform'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1035,12 +1001,8 @@ define([ */ BoundingSphere.distanceSquaredTo = function(sphere, cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); var diff = Cartesian3.subtract(sphere.center, cartesian, distanceSquaredToScratch); @@ -1064,13 +1026,8 @@ define([ */ BoundingSphere.transformWithoutScale = function(sphere, transform, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(transform)) { - throw new DeveloperError('transform is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(transform, 'transform'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1099,17 +1056,9 @@ define([ */ BoundingSphere.computePlaneDistances = function(sphere, position, direction, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - - if (!defined(position)) { - throw new DeveloperError('position is required.'); - } - - if (!defined(direction)) { - throw new DeveloperError('direction is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(position, 'position'); + Check.typeOf.object(direction, 'direction'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1146,9 +1095,7 @@ define([ */ BoundingSphere.projectTo2D = function(sphere, projection, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } + Check.typeOf.object(sphere, 'sphere'); //>>includeEnd('debug'); projection = defaultValue(projection, projectTo2DProjection); @@ -1245,12 +1192,8 @@ define([ */ BoundingSphere.isOccluded = function(sphere, occluder) { //>>includeStart('debug', pragmas.debug); - if (!defined(sphere)) { - throw new DeveloperError('sphere is required.'); - } - if (!defined(occluder)) { - throw new DeveloperError('occluder is required.'); - } + Check.typeOf.object(sphere, 'sphere'); + Check.typeOf.object(occluder, 'occluder'); //>>includeEnd('debug'); return !occluder.isBoundingSphereVisible(sphere); }; diff --git a/Source/Core/Cartesian2.js b/Source/Core/Cartesian2.js index 0b4927d01d54..d44ed87c4a0f 100644 --- a/Source/Core/Cartesian2.js +++ b/Source/Core/Cartesian2.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -118,12 +120,8 @@ define([ */ Cartesian2.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -144,9 +142,7 @@ define([ */ Cartesian2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -168,9 +164,7 @@ define([ */ Cartesian2.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -195,9 +189,7 @@ define([ */ Cartesian2.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -242,9 +234,7 @@ define([ */ Cartesian2.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y); @@ -258,9 +248,7 @@ define([ */ Cartesian2.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y); @@ -276,15 +264,9 @@ define([ */ Cartesian2.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); @@ -304,15 +286,9 @@ define([ */ Cartesian2.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -328,9 +304,7 @@ define([ */ Cartesian2.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y; @@ -402,12 +376,8 @@ define([ */ Cartesian2.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian2.magnitude(cartesian); @@ -433,12 +403,8 @@ define([ */ Cartesian2.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y; @@ -454,15 +420,9 @@ define([ */ Cartesian2.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -470,6 +430,26 @@ define([ return result; }; + /** + * Computes the componentwise quotient of two Cartesians. + * + * @param {Cartesian2} left The first Cartesian. + * @param {Cartesian2} right The second Cartesian. + * @param {Cartesian2} result The object onto which to store the result. + * @returns {Cartesian2} The modified result parameter. + */ + Cartesian2.divideComponents = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); + //>>includeEnd('debug'); + + result.x = left.x / right.x; + result.y = left.y / right.y; + return result; + }; + /** * Computes the componentwise sum of two Cartesians. * @@ -480,15 +460,9 @@ define([ */ Cartesian2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -506,15 +480,9 @@ define([ */ Cartesian2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -532,15 +500,9 @@ define([ */ Cartesian2.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -558,15 +520,9 @@ define([ */ Cartesian2.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -583,12 +539,8 @@ define([ */ Cartesian2.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -605,12 +557,8 @@ define([ */ Cartesian2.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -630,18 +578,10 @@ define([ */ Cartesian2.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian2.multiplyByScalar(end, t, lerpScratch); @@ -660,12 +600,8 @@ define([ */ Cartesian2.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian2.normalize(left, angleBetweenScratch); @@ -683,12 +619,8 @@ define([ */ Cartesian2.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian2.normalize(cartesian, mostOrthogonalAxisScratch); diff --git a/Source/Core/Cartesian3.js b/Source/Core/Cartesian3.js index a2e1f2f268f7..e350dcdd3192 100644 --- a/Source/Core/Cartesian3.js +++ b/Source/Core/Cartesian3.js @@ -1,11 +1,13 @@ /*global define*/ define([ - './defaultValue', - './defined', - './DeveloperError', - './freezeObject', - './Math' + './Check', + './defaultValue', + './defined', + './DeveloperError', + './freezeObject', + './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -58,9 +60,7 @@ define([ */ Cartesian3.fromSpherical = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(spherical)) { - throw new DeveloperError('spherical is required'); - } + Check.typeOf.object(spherical, 'spherical'); //>>includeEnd('debug'); if (!defined(result)) { @@ -146,13 +146,8 @@ define([ */ Cartesian3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -174,9 +169,7 @@ define([ */ Cartesian3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -199,9 +192,7 @@ define([ */ Cartesian3.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -226,12 +217,8 @@ define([ */ Cartesian3.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } - if (array.length < 3) { - throw new DeveloperError('array length cannot be less than 3.'); - } + Check.defined(array, 'array'); + Check.numeric.minimum(array.length, 3); if (array.length % 3 !== 0) { throw new DeveloperError('array length must be a multiple of 3.'); } @@ -279,9 +266,7 @@ define([ */ Cartesian3.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z); @@ -295,9 +280,7 @@ define([ */ Cartesian3.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z); @@ -313,15 +296,9 @@ define([ */ Cartesian3.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -341,15 +318,9 @@ define([ */ Cartesian3.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -366,9 +337,7 @@ define([ */ Cartesian3.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z; @@ -399,9 +368,8 @@ define([ */ Cartesian3.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -422,9 +390,8 @@ define([ */ Cartesian3.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.subtract(left, right, distanceScratch); @@ -440,12 +407,8 @@ define([ */ Cartesian3.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian3.magnitude(cartesian); @@ -472,12 +435,8 @@ define([ */ Cartesian3.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z; @@ -493,15 +452,9 @@ define([ */ Cartesian3.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -511,14 +464,14 @@ define([ }; /** - * Computes the componentwise sum of two Cartesians. + * Computes the componentwise quotient of two Cartesians. * * @param {Cartesian3} left The first Cartesian. * @param {Cartesian3} right The second Cartesian. * @param {Cartesian3} result The object onto which to store the result. * @returns {Cartesian3} The modified result parameter. */ - Cartesian3.add = function(left, right, result) { + Cartesian3.divideComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); if (!defined(left)) { throw new DeveloperError('left is required'); @@ -531,6 +484,27 @@ define([ } //>>includeEnd('debug'); + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + return result; + }; + + /** + * Computes the componentwise sum of two Cartesians. + * + * @param {Cartesian3} left The first Cartesian. + * @param {Cartesian3} right The second Cartesian. + * @param {Cartesian3} result The object onto which to store the result. + * @returns {Cartesian3} The modified result parameter. + */ + Cartesian3.add = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); + //>>includeEnd('debug'); + result.x = left.x + right.x; result.y = left.y + right.y; result.z = left.z + right.z; @@ -547,15 +521,9 @@ define([ */ Cartesian3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -574,15 +542,9 @@ define([ */ Cartesian3.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -601,15 +563,9 @@ define([ */ Cartesian3.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -627,12 +583,8 @@ define([ */ Cartesian3.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -650,12 +602,8 @@ define([ */ Cartesian3.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -676,18 +624,10 @@ define([ */ Cartesian3.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian3.multiplyByScalar(end, t, lerpScratch); @@ -706,12 +646,8 @@ define([ */ Cartesian3.angleBetween = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian3.normalize(left, angleBetweenScratch); @@ -731,12 +667,8 @@ define([ */ Cartesian3.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian3.normalize(cartesian, mostOrthogonalAxisScratch); @@ -815,15 +747,9 @@ define([ */ Cartesian3.cross = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -858,12 +784,8 @@ define([ */ Cartesian3.fromDegrees = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(longitude)) { - throw new DeveloperError('longitude is required'); - } - if (!defined(latitude)) { - throw new DeveloperError('latitude is required'); - } + Check.typeOf.number(longitude, 'longitude'); + Check.typeOf.number(latitude, 'latitude'); //>>includeEnd('debug'); longitude = CesiumMath.toRadians(longitude); @@ -890,12 +812,8 @@ define([ */ Cartesian3.fromRadians = function(longitude, latitude, height, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(longitude)) { - throw new DeveloperError('longitude is required'); - } - if (!defined(latitude)) { - throw new DeveloperError('latitude is required'); - } + Check.typeOf.number(longitude, 'longitude'); + Check.typeOf.number(latitude, 'latitude'); //>>includeEnd('debug'); height = defaultValue(height, 0.0); @@ -931,14 +849,9 @@ define([ */ Cartesian3.fromDegreesArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 2) { - throw new DeveloperError('coordinates length cannot be less than 2.'); - } - if (coordinates.length % 2 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 2.'); + Check.defined(coordinates, 'coordinates'); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } //>>includeEnd('debug'); @@ -972,14 +885,9 @@ define([ */ Cartesian3.fromRadiansArray = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 2) { - throw new DeveloperError('coordinates length cannot be less than 2.'); - } - if (coordinates.length % 2 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 2.'); + Check.defined(coordinates, 'coordinates'); + if (coordinates.length < 2 || coordinates.length % 2 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 2 and at least 2'); } //>>includeEnd('debug'); @@ -1013,14 +921,9 @@ define([ */ Cartesian3.fromDegreesArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 3) { - throw new DeveloperError('coordinates length cannot be less than 3.'); - } - if (coordinates.length % 3 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 3.'); + Check.defined(coordinates, 'coordinates'); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); } //>>includeEnd('debug'); @@ -1055,14 +958,9 @@ define([ */ Cartesian3.fromRadiansArrayHeights = function(coordinates, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(coordinates)) { - throw new DeveloperError('coordinates is required.'); - } - if (coordinates.length < 3) { - throw new DeveloperError('coordinates length cannot be less than 3.'); - } - if (coordinates.length % 3 !== 0) { - throw new DeveloperError('coordinates length must be a multiple of 3.'); + Check.defined(coordinates, 'coordinates'); + if (coordinates.length < 3 || coordinates.length % 3 !== 0) { + throw new DeveloperError('the number of coordinates must be a multiple of 3 and at least 3'); } //>>includeEnd('debug'); diff --git a/Source/Core/Cartesian4.js b/Source/Core/Cartesian4.js index f9ca0bddc60d..a9c8cf13ed32 100644 --- a/Source/Core/Cartesian4.js +++ b/Source/Core/Cartesian4.js @@ -1,11 +1,13 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError', './freezeObject', './Math' ], function( + Check, defaultValue, defined, DeveloperError, @@ -89,9 +91,7 @@ define([ */ Cartesian4.fromColor = function(color, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(color)) { - throw new DeveloperError('color is required'); - } + Check.typeOf.object(color, 'color'); //>>includeEnd('debug'); if (!defined(result)) { return new Cartesian4(color.red, color.green, color.blue, color.alpha); @@ -145,12 +145,8 @@ define([ */ Cartesian4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -173,9 +169,7 @@ define([ */ Cartesian4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -199,9 +193,7 @@ define([ */ Cartesian4.packArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -226,9 +218,7 @@ define([ */ Cartesian4.unpackArray = function(array, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); var length = array.length; @@ -273,9 +263,7 @@ define([ */ Cartesian4.maximumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.max(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -289,9 +277,7 @@ define([ */ Cartesian4.minimumComponent = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return Math.min(cartesian.x, cartesian.y, cartesian.z, cartesian.w); @@ -307,15 +293,9 @@ define([ */ Cartesian4.minimumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.min(first.x, second.x); @@ -336,15 +316,9 @@ define([ */ Cartesian4.maximumByComponent = function(first, second, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(first)) { - throw new DeveloperError('first is required.'); - } - if (!defined(second)) { - throw new DeveloperError('second is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(first, 'first'); + Check.typeOf.object(second, 'second'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.max(first.x, second.x); @@ -363,9 +337,7 @@ define([ */ Cartesian4.magnitudeSquared = function(cartesian) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); //>>includeEnd('debug'); return cartesian.x * cartesian.x + cartesian.y * cartesian.y + cartesian.z * cartesian.z + cartesian.w * cartesian.w; @@ -398,9 +370,8 @@ define([ */ Cartesian4.distance = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -423,9 +394,8 @@ define([ */ Cartesian4.distanceSquared = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left) || !defined(right)) { - throw new DeveloperError('left and right are required.'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); Cartesian4.subtract(left, right, distanceScratch); @@ -441,12 +411,8 @@ define([ */ Cartesian4.normalize = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitude = Cartesian4.magnitude(cartesian); @@ -474,12 +440,8 @@ define([ */ Cartesian4.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -495,15 +457,9 @@ define([ */ Cartesian4.multiplyComponents = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x * right.x; @@ -513,6 +469,28 @@ define([ return result; }; + /** + * Computes the componentwise quotient of two Cartesians. + * + * @param {Cartesian4} left The first Cartesian. + * @param {Cartesian4} right The second Cartesian. + * @param {Cartesian4} result The object onto which to store the result. + * @returns {Cartesian4} The modified result parameter. + */ + Cartesian4.divideComponents = function(left, right, result) { + //>>includeStart('debug', pragmas.debug); + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); + //>>includeEnd('debug'); + + result.x = left.x / right.x; + result.y = left.y / right.y; + result.z = left.z / right.z; + result.w = left.w / right.w; + return result; + }; + /** * Computes the componentwise sum of two Cartesians. * @@ -523,15 +501,9 @@ define([ */ Cartesian4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -551,15 +523,9 @@ define([ */ Cartesian4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -579,15 +545,9 @@ define([ */ Cartesian4.multiplyByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x * scalar; @@ -607,15 +567,9 @@ define([ */ Cartesian4.divideByScalar = function(cartesian, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = cartesian.x / scalar; @@ -634,12 +588,8 @@ define([ */ Cartesian4.negate = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -cartesian.x; @@ -658,12 +608,8 @@ define([ */ Cartesian4.abs = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Math.abs(cartesian.x); @@ -685,18 +631,10 @@ define([ */ Cartesian4.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); Cartesian4.multiplyByScalar(end, t, lerpScratch); @@ -714,12 +652,8 @@ define([ */ Cartesian4.mostOrthogonalAxis = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required.'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var f = Cartesian4.normalize(cartesian, mostOrthogonalAxisScratch); diff --git a/Source/Core/CartographicGeocoderService.js b/Source/Core/CartographicGeocoderService.js new file mode 100644 index 000000000000..e7475fcdcca1 --- /dev/null +++ b/Source/Core/CartographicGeocoderService.js @@ -0,0 +1,59 @@ +/*global define*/ +define([ + './Cartesian3', + './defaultValue', + './defineProperties', + './defined', + './DeveloperError', + '../ThirdParty/when' +], function( + Cartesian3, + defaultValue, + defineProperties, + defined, + DeveloperError, + when) { + 'use strict'; + + /** + * Geocodes queries containing longitude and latitude coordinates and an optional height. + * Query format: `longitude latitude (height)` with longitude/latitude in degrees and height in meters. + * + * @alias CartographicGeocoderService + * @constructor + */ + function CartographicGeocoderService() { + } + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @returns {Promise} + */ + CartographicGeocoderService.prototype.geocode = function(query) { + //>>includeStart('debug', pragmas.debug); + if (!defined(query)) { + throw new DeveloperError('query must be defined'); + } + //>>includeEnd('debug'); + + var splitQuery = query.match(/[^\s,\n]+/g); + if ((splitQuery.length === 2) || (splitQuery.length === 3)) { + var longitude = +splitQuery[0]; + var latitude = +splitQuery[1]; + var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; + + if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { + var result = { + displayName: query, + destination: Cartesian3.fromDegrees(longitude, latitude, height) + }; + return when.resolve([result]); + } + } + return when.resolve([]); + }; + + return CartographicGeocoderService; +}); diff --git a/Source/Core/CesiumTerrainProvider.js b/Source/Core/CesiumTerrainProvider.js index 63057a29d382..695a38e20a79 100644 --- a/Source/Core/CesiumTerrainProvider.js +++ b/Source/Core/CesiumTerrainProvider.js @@ -17,13 +17,11 @@ define([ './loadArrayBuffer', './loadJson', './Math', - './Matrix3', './OrientedBoundingBox', './QuantizedMeshTerrainData', './Request', './RequestScheduler', './RequestType', - './RuntimeError', './TerrainProvider', './TileProviderError' ], function( @@ -44,13 +42,11 @@ define([ loadArrayBuffer, loadJson, CesiumMath, - Matrix3, OrientedBoundingBox, QuantizedMeshTerrainData, Request, RequestScheduler, RequestType, - RuntimeError, TerrainProvider, TileProviderError) { 'use strict'; diff --git a/Source/Core/Check.js b/Source/Core/Check.js new file mode 100644 index 000000000000..f3ce7708f2b7 --- /dev/null +++ b/Source/Core/Check.js @@ -0,0 +1,146 @@ +/*global define*/ +define([ + './defined', + './DeveloperError' + ], function( + defined, + DeveloperError) { + 'use strict'; + + /** + * Contains functions for checking that supplied arguments are of a specified type + * or meet specified conditions + * @private + */ + var Check = {}; + + /** + * Contains type checking functions, all using the typeof operator + */ + Check.typeOf = {}; + + /** + * Contains functions for checking numeric conditions such as minimum and maximum values + */ + Check.numeric = {}; + + function getUndefinedErrorMessage(name) { + return name + ' was required but undefined.'; + } + + function getFailedTypeErrorMessage(actual, expected, name) { + return 'Expected ' + name + ' to be typeof ' + expected + ', got ' + actual; + } + + /** + * Throws if test is not defined + * + * @param {*} test The value that is to be checked + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be defined + */ + Check.defined = function (test, name) { + if (!defined(test)) { + throw new DeveloperError(getUndefinedErrorMessage(name)); + } + }; + + /** + * Throws if test is greater than maximum + * + * @param {Number} test The value to test + * @param {Number} maximum The maximum allowed value + * @exception {DeveloperError} test must not be greater than maximum + * @exception {DeveloperError} Both test and maximum must be typeof 'number' + */ + Check.numeric.maximum = function (test, maximum) { + Check.typeOf.number(test); + Check.typeOf.number(maximum); + if (test > maximum) { + throw new DeveloperError('Expected ' + test + ' to be at most ' + maximum); + } + }; + + /** + * Throws if test is less than minimum + * + * @param {Number} test The value to test + * @param {Number} minimum The minimum allowed value + * @exception {DeveloperError} test must not be less than mininum + * @exception {DeveloperError} Both test and maximum must be typeof 'number' + */ + Check.numeric.minimum = function (test, minimum) { + Check.typeOf.number(test); + Check.typeOf.number(minimum); + if (test < minimum) { + throw new DeveloperError('Expected ' + test + ' to be at least ' + minimum); + } + }; + + /** + * Throws if test is not typeof 'function' + * + * @param {*} test The value to test + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be typeof 'function' + */ + Check.typeOf.func = function (test, name) { + if (typeof test !== 'function') { + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'function', name)); + } + }; + + /** + * Throws if test is not typeof 'string' + * + * @param {*} test The value to test + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be typeof 'string' + */ + Check.typeOf.string = function (test, name) { + if (typeof test !== 'string') { + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'string', name)); + } + }; + + /** + * Throws if test is not typeof 'number' + * + * @param {*} test The value to test + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be typeof 'number' + */ + Check.typeOf.number = function (test, name) { + if (typeof test !== 'number') { + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'number', name)); + } + }; + + /** + * Throws if test is not typeof 'object' + * + * @param {*} test The value to test + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be typeof 'object' + */ + Check.typeOf.object = function (test, name) { + if (typeof test !== 'object') { + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'object', name)); + } + }; + + /** + * Throws if test is not typeof 'boolean' + * + * @param {*} test The value to test + * @param {String} name The name of the variable being tested + * @exception {DeveloperError} test must be typeof 'boolean' + */ + Check.typeOf.bool = function (test, name) { + if (typeof test !== 'boolean') { + throw new DeveloperError(getFailedTypeErrorMessage(typeof test, 'boolean', name)); + } + }; + + return Check; +}); diff --git a/Source/Core/CircleGeometry.js b/Source/Core/CircleGeometry.js index bd225683229b..1d938bb2d64e 100644 --- a/Source/Core/CircleGeometry.js +++ b/Source/Core/CircleGeometry.js @@ -7,7 +7,6 @@ define([ './DeveloperError', './EllipseGeometry', './Ellipsoid', - './Math', './VertexFormat' ], function( Cartesian3, @@ -17,7 +16,6 @@ define([ DeveloperError, EllipseGeometry, Ellipsoid, - CesiumMath, VertexFormat) { 'use strict'; @@ -70,7 +68,8 @@ define([ extrudedHeight : options.extrudedHeight, granularity : options.granularity, vertexFormat : options.vertexFormat, - stRotation : options.stRotation + stRotation : options.stRotation, + shadowVolume: options.shadowVolume }; this._ellipseGeometry = new EllipseGeometry(ellipseGeometryOptions); this._workerName = 'createCircleGeometry'; @@ -115,7 +114,8 @@ define([ vertexFormat : new VertexFormat(), stRotation : undefined, semiMajorAxis : undefined, - semiMinorAxis : undefined + semiMinorAxis : undefined, + shadowVolume: undefined }; /** @@ -135,6 +135,7 @@ define([ scratchOptions.granularity = ellipseGeometry._granularity; scratchOptions.vertexFormat = VertexFormat.clone(ellipseGeometry._vertexFormat, scratchOptions.vertexFormat); scratchOptions.stRotation = ellipseGeometry._stRotation; + scratchOptions.shadowVolume = ellipseGeometry._shadowVolume; if (!defined(result)) { scratchOptions.radius = ellipseGeometry._semiMajorAxis; @@ -175,7 +176,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/ComponentDatatype.js b/Source/Core/ComponentDatatype.js index 3d45239ca815..bb1e7d533528 100644 --- a/Source/Core/ComponentDatatype.js +++ b/Source/Core/ComponentDatatype.js @@ -1,18 +1,18 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', './defaultValue', './defined', './DeveloperError', './FeatureDetection', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, defaultValue, defined, DeveloperError, FeatureDetection, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; // Bail out if the browser doesn't support typed arrays, to prevent the setup function diff --git a/Source/Core/CompressedTextureBuffer.js b/Source/Core/CompressedTextureBuffer.js new file mode 100644 index 000000000000..2bee0c470813 --- /dev/null +++ b/Source/Core/CompressedTextureBuffer.js @@ -0,0 +1,93 @@ +/*global define*/ +define([ + './defined', + './defineProperties' + ], function( + defined, + defineProperties + ) { + 'use strict'; + + /** + * Describes a compressed texture and contains a compressed texture buffer. + * + * @param {PixelFormat} internalFormat The pixel format of the compressed texture. + * @param {Number} width The width of the texture. + * @param {Number} height The height of the texture. + * @param {Uint8Array} buffer The compressed texture buffer. + */ + function CompressedTextureBuffer(internalFormat, width, height, buffer) { + this._format = internalFormat; + this._width = width; + this._height = height; + this._buffer = buffer; + } + + defineProperties(CompressedTextureBuffer.prototype, { + /** + * The format of the compressed texture. + * @type PixelFormat + * @readonly + */ + internalFormat : { + get : function() { + return this._format; + } + }, + /** + * The width of the texture. + * @type Number + * @readonly + */ + width : { + get : function() { + return this._width; + } + }, + /** + * The height of the texture. + * @type Number + * @readonly + */ + height : { + get : function() { + return this._height; + } + }, + /** + * The compressed texture buffer. + * @type Uint8Array + * @readonly + */ + bufferView : { + get : function() { + return this._buffer; + } + } + }); + + /** + * Creates a shallow clone of a compressed texture buffer. + * + * @param {CompressedTextureBuffer} object The compressed texture buffer to be cloned. + * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer. + */ + CompressedTextureBuffer.clone = function(object) { + if (!defined(object)) { + return undefined; + } + + return new CompressedTextureBuffer(object._format, object._width, object._height, object._buffer); + }; + + /** + * Creates a shallow clone of this compressed texture buffer. + * + * @return {CompressedTextureBuffer} A shallow clone of the compressed texture buffer. + */ + CompressedTextureBuffer.prototype.clone = function() { + return CompressedTextureBuffer.clone(this); + }; + + return CompressedTextureBuffer; +}); \ No newline at end of file diff --git a/Source/Core/CorridorGeometry.js b/Source/Core/CorridorGeometry.js index 4fd13ea735a9..49992368288d 100644 --- a/Source/Core/CorridorGeometry.js +++ b/Source/Core/CorridorGeometry.js @@ -561,8 +561,8 @@ define([ function computePositionsExtruded(params, vertexFormat) { var topVertexFormat = new VertexFormat({ - position : vertexFormat.positon, - normal : (vertexFormat.normal || vertexFormat.binormal), + position : vertexFormat.position, + normal : (vertexFormat.normal || vertexFormat.binormal || params.shadowVolume), tangent : vertexFormat.tangent, binormal : (vertexFormat.normal || vertexFormat.binormal), st : vertexFormat.st @@ -590,28 +590,49 @@ define([ newPositions.set(wallPositions, length * 2); attributes.position.values = newPositions; - length /= 3; + attributes = extrudedAttributes(attributes, vertexFormat); + var size = length / 3; + if (params.shadowVolume) { + var topNormals = attributes.normal.values; + length = topNormals.length; + + var extrudeNormals = new Float32Array(length * 6); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; + } + //only get normals for bottom layer that's going to be pushed down + extrudeNormals.set(topNormals, length); //bottom face + extrudeNormals = addWallPositions(topNormals, length*4, extrudeNormals); //bottom wall + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + if (!vertexFormat.normal) { + attributes.normal = undefined; + } + } + var i; var iLength = indices.length; - var twoLength = length + length; - var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoLength * 3); + var twoSize = size + size; + var newIndices = IndexDatatype.createTypedArray(newPositions.length / 3, iLength * 2 + twoSize * 3); newIndices.set(indices); var index = iLength; for (i = 0; i < iLength; i += 3) { // bottom indices var v0 = indices[i]; var v1 = indices[i + 1]; var v2 = indices[i + 2]; - newIndices[index++] = v2 + length; - newIndices[index++] = v1 + length; - newIndices[index++] = v0 + length; + newIndices[index++] = v2 + size; + newIndices[index++] = v1 + size; + newIndices[index++] = v0 + size; } - attributes = extrudedAttributes(attributes, vertexFormat); var UL, LL, UR, LR; - for (i = 0; i < twoLength; i += 2) { //wall indices - UL = i + twoLength; - LL = UL + twoLength; + for (i = 0; i < twoSize; i += 2) { //wall indices + UL = i + twoSize; + LL = UL + twoSize; UR = UL + 1; LR = LL + 1; newIndices[index++] = UL; @@ -793,6 +814,7 @@ define([ this._extrudedHeight = defaultValue(options.extrudedHeight, this._height); this._cornerType = defaultValue(options.cornerType, CornerType.ROUNDED); this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createCorridorGeometry'; this._rectangle = computeRectangle(positions, this._ellipsoid, width, this._cornerType); @@ -800,7 +822,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 5; + this.packedLength = 1 + positions.length * Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 6; } /** @@ -845,7 +867,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._cornerType; - array[startingIndex] = value._granularity; + array[startingIndex++] = value._granularity; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -861,7 +884,8 @@ define([ height : undefined, extrudedHeight : undefined, cornerType : undefined, - granularity : undefined + granularity : undefined, + shadowVolume: undefined }; /** @@ -901,7 +925,8 @@ define([ var height = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; var cornerType = array[startingIndex++]; - var granularity = array[startingIndex]; + var granularity = array[startingIndex++]; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.positions = positions; @@ -910,6 +935,7 @@ define([ scratchOptions.extrudedHeight = extrudedHeight; scratchOptions.cornerType = cornerType; scratchOptions.granularity = granularity; + scratchOptions.shadowVolume = shadowVolume; return new CorridorGeometry(scratchOptions); } @@ -922,6 +948,7 @@ define([ result._cornerType = cornerType; result._granularity = granularity; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; return result; }; @@ -962,6 +989,7 @@ define([ height = h; params.height = height; params.extrudedHeight = extrudedHeight; + params.shadowVolume = corridorGeometry._shadowVolume; attr = computePositionsExtruded(params, vertexFormat); } else { var computedPositions = CorridorGeometryLibrary.computePositions(params); @@ -1000,7 +1028,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/CorridorGeometryLibrary.js b/Source/Core/CorridorGeometryLibrary.js index 5631968ee32b..7ffd2953ded6 100644 --- a/Source/Core/CorridorGeometryLibrary.js +++ b/Source/Core/CorridorGeometryLibrary.js @@ -3,7 +3,6 @@ define([ './Cartesian3', './CornerType', './defined', - './isArray', './Math', './Matrix3', './PolylinePipeline', @@ -13,7 +12,6 @@ define([ Cartesian3, CornerType, defined, - isArray, CesiumMath, Matrix3, PolylinePipeline, diff --git a/Source/Core/Credit.js b/Source/Core/Credit.js index cd949480e8cd..820e20d7fb3b 100644 --- a/Source/Core/Credit.js +++ b/Source/Core/Credit.js @@ -147,7 +147,7 @@ define([ /** * Returns true if the credits are equal * - * @param {Credit} credits The credit to compare to. + * @param {Credit} credit The credit to compare to. * @returns {Boolean} true if left and right are equal, false otherwise. */ Credit.prototype.equals = function(credit) { diff --git a/Source/Core/DistanceDisplayCondition.js b/Source/Core/DistanceDisplayCondition.js index 87ae8d9b8204..6c0a1df9e36c 100644 --- a/Source/Core/DistanceDisplayCondition.js +++ b/Source/Core/DistanceDisplayCondition.js @@ -1,11 +1,9 @@ /*global define*/ define([ - './Cartesian3', './defaultValue', './defined', './defineProperties' ], function( - Cartesian3, defaultValue, defined, defineProperties) { diff --git a/Source/Core/DoublyLinkedList.js b/Source/Core/DoublyLinkedList.js index f49c7743fc9b..66d04e020a74 100644 --- a/Source/Core/DoublyLinkedList.js +++ b/Source/Core/DoublyLinkedList.js @@ -1,8 +1,8 @@ /*global define*/ define([ - '../Core/defined', - '../Core/defineProperties', - '../Core/DeveloperError' + '../Core/defined', + '../Core/defineProperties', + '../Core/DeveloperError' ], function( defined, defineProperties, diff --git a/Source/Core/EllipseGeometry.js b/Source/Core/EllipseGeometry.js index 59193cf043d3..3faca9185f5d 100644 --- a/Source/Core/EllipseGeometry.js +++ b/Source/Core/EllipseGeometry.js @@ -81,12 +81,15 @@ define([ var ellipsoid = options.ellipsoid; var stRotation = options.stRotation; var size = (extrude) ? positions.length / 3 * 2 : positions.length / 3; + var shadowVolume = options.shadowVolume; var textureCoordinates = (vertexFormat.st) ? new Float32Array(size * 2) : undefined; var normals = (vertexFormat.normal) ? new Float32Array(size * 3) : undefined; var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -136,44 +139,52 @@ define([ textureCoordinates[textureCoordIndex++] = texCoordScratch.y; } - normal = ellipsoid.geodeticSurfaceNormal(position, normal); + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { - if (vertexFormat.tangent || vertexFormat.binormal) { - tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); - Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + if (shadowVolume) { + extrudeNormals[i + bottomOffset] = -normal.x; + extrudeNormals[i1 + bottomOffset] = -normal.y; + extrudeNormals[i2 + bottomOffset] = -normal.z; } - if (vertexFormat.normal) { - normals[i] = normal.x; - normals[i1] = normal.y; - normals[i2] = normal.z; - if (extrude) { - normals[i + bottomOffset] = -normal.x; - normals[i1 + bottomOffset] = -normal.y; - normals[i2 + bottomOffset] = -normal.z; + + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.tangent || vertexFormat.binormal) { + tangent = Cartesian3.normalize(Cartesian3.cross(Cartesian3.UNIT_Z, normal, tangent), tangent); + Matrix3.multiplyByVector(textureMatrix, tangent, tangent); + } + if (vertexFormat.normal) { + normals[i] = normal.x; + normals[i1] = normal.y; + normals[i2] = normal.z; + if (extrude) { + normals[i + bottomOffset] = -normal.x; + normals[i1 + bottomOffset] = -normal.y; + normals[i2 + bottomOffset] = -normal.z; + } } - } - if (vertexFormat.tangent) { - tangents[i] = tangent.x; - tangents[i1] = tangent.y; - tangents[i2] = tangent.z; - if (extrude) { - tangents[i + bottomOffset] = -tangent.x; - tangents[i1 + bottomOffset] = -tangent.y; - tangents[i2 + bottomOffset] = -tangent.z; + if (vertexFormat.tangent) { + tangents[i] = tangent.x; + tangents[i1] = tangent.y; + tangents[i2] = tangent.z; + if (extrude) { + tangents[i + bottomOffset] = -tangent.x; + tangents[i1 + bottomOffset] = -tangent.y; + tangents[i2 + bottomOffset] = -tangent.z; + } } - } - if (vertexFormat.binormal) { - binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); - binormals[i] = binormal.x; - binormals[i1] = binormal.y; - binormals[i2] = binormal.z; - if (extrude) { - binormals[i + bottomOffset] = binormal.x; - binormals[i1 + bottomOffset] = binormal.y; - binormals[i2 + bottomOffset] = binormal.z; + if (vertexFormat.binormal) { + binormal = Cartesian3.normalize(Cartesian3.cross(normal, tangent, binormal), binormal); + binormals[i] = binormal.x; + binormals[i1] = binormal.y; + binormals[i2] = binormal.z; + if (extrude) { + binormals[i + bottomOffset] = binormal.x; + binormals[i1 + bottomOffset] = binormal.y; + binormals[i2 + bottomOffset] = binormal.z; + } } } } @@ -229,6 +240,15 @@ define([ values : binormals }); } + + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + return attributes; } @@ -371,6 +391,9 @@ define([ var tangents = (vertexFormat.tangent) ? new Float32Array(size * 3) : undefined; var binormals = (vertexFormat.binormal) ? new Float32Array(size * 3) : undefined; + var shadowVolume = options.shadowVolume; + var extrudeNormals = (shadowVolume) ? new Float32Array(size * 3) : undefined; + var textureCoordIndex = 0; // Raise positions to a height above the ellipsoid and compute the @@ -421,6 +444,13 @@ define([ position = ellipsoid.scaleToGeodeticSurface(position, position); extrudedPosition = Cartesian3.clone(position, scratchCartesian2); normal = ellipsoid.geodeticSurfaceNormal(position, normal); + + if (shadowVolume) { + extrudeNormals[i + length] = -normal.x; + extrudeNormals[i1 + length] = -normal.y; + extrudeNormals[i2 + length] = -normal.z; + } + var scaledNormal = Cartesian3.multiplyByScalar(normal, height, scratchCartesian4); position = Cartesian3.add(position, scaledNormal, position); scaledNormal = Cartesian3.multiplyByScalar(normal, extrudedHeight, scaledNormal); @@ -527,6 +557,15 @@ define([ values : binormals }); } + + if (shadowVolume) { + attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + return attributes; } @@ -724,6 +763,7 @@ define([ this._vertexFormat = VertexFormat.clone(vertexFormat); this._extrudedHeight = defaultValue(extrudedHeight, height); this._extrude = extrude; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createEllipseGeometry'; this._rectangle = computeRectangle(this._center, this._ellipsoid, semiMajorAxis, semiMinorAxis, this._rotation); @@ -733,7 +773,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + EllipseGeometry.packedLength = Cartesian3.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -775,7 +815,8 @@ define([ array[startingIndex++] = value._height; array[startingIndex++] = value._granularity; array[startingIndex++] = value._extrudedHeight; - array[startingIndex] = value._extrude ? 1.0 : 0.0; + array[startingIndex++] = value._extrude ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -794,7 +835,8 @@ define([ stRotation : undefined, height : undefined, granularity : undefined, - extrudedHeight : undefined + extrudedHeight : undefined, + shadowVolume: undefined }; /** @@ -833,7 +875,8 @@ define([ var height = array[startingIndex++]; var granularity = array[startingIndex++]; var extrudedHeight = array[startingIndex++]; - var extrude = array[startingIndex] === 1.0; + var extrude = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.height = height; @@ -843,6 +886,7 @@ define([ scratchOptions.rotation = rotation; scratchOptions.semiMajorAxis = semiMajorAxis; scratchOptions.semiMinorAxis = semiMinorAxis; + scratchOptions.shadowVolume = shadowVolume; return new EllipseGeometry(scratchOptions); } @@ -857,6 +901,7 @@ define([ result._granularity = granularity; result._extrudedHeight = extrudedHeight; result._extrude = extrude; + result._shadowVolume = shadowVolume; result._rectangle = Rectangle.clone(rectangle); return result; @@ -890,6 +935,7 @@ define([ if (ellipseGeometry._extrude) { options.extrudedHeight = Math.min(ellipseGeometry._extrudedHeight, ellipseGeometry._height); options.height = Math.max(ellipseGeometry._extrudedHeight, ellipseGeometry._height); + options.shadowVolume = ellipseGeometry._shadowVolume; geometry = computeExtrudedEllipse(options); } else { geometry = computeEllipse(options); @@ -923,7 +969,8 @@ define([ granularity : granularity, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/Ellipsoid.js b/Source/Core/Ellipsoid.js index 5428122a9ef0..6f3eba4bcfcb 100644 --- a/Source/Core/Ellipsoid.js +++ b/Source/Core/Ellipsoid.js @@ -55,6 +55,10 @@ define([ ellipsoid._maximumRadius = Math.max(x, y, z); ellipsoid._centerToleranceSquared = CesiumMath.EPSILON1; + + if (ellipsoid._radiiSquared.z !== 0) { + ellipsoid._sqauredXOverSquaredZ = ellipsoid._radiiSquared.x / ellipsoid._radiiSquared.z; + } } /** @@ -86,6 +90,7 @@ define([ this._minimumRadius = undefined; this._maximumRadius = undefined; this._centerToleranceSquared = undefined; + this._sqauredXOverSquaredZ = undefined; initialize(this, x, y, z); } @@ -203,7 +208,9 @@ define([ /** * Computes an Ellipsoid from a Cartesian specifying the radii in x, y, and z directions. * - * @param {Cartesian3} [radii=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Cartesian3} [cartesian=Cartesian3.ZERO] The ellipsoid's radius in the x, y, and z directions. + * @param {Ellipsoid} [result] The object onto which to store the result, or undefined if a new + * instance should be created. * @returns {Ellipsoid} A new Ellipsoid instance. * * @exception {DeveloperError} All radii components must be greater than or equal to zero. @@ -608,5 +615,53 @@ define([ return this._radii.toString(); }; + /** + * Computes a point which is the intersection of the surface normal with the z-axis. + * + * @param {Cartesian3} position the position. must be on the surface of the ellipsoid. + * @param {Number} [buffer = 0.0] A buffer to subtract from the ellipsoid size when checking if the point is inside the ellipsoid. + * In earth case, with common earth datums, there is no need for this buffer since the intersection point is always (relatively) very close to the center. + * In WGS84 datum, intersection point is at max z = +-42841.31151331382 (0.673% of z-axis). + * Intersection point could be outside the ellipsoid if the ratio of MajorAxis / AxisOfRotation is bigger than the square root of 2 + * @param {Cartesian} [result] The cartesian to which to copy the result, or undefined to create and + * return a new instance. + * @returns {Cartesian | undefined} the intersection point if it's inside the ellipsoid, undefined otherwise + * + * @exception {DeveloperError} position is required. + * @exception {DeveloperError} Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y). + * @exception {DeveloperError} Ellipsoid.radii.z must be greater than 0. + */ + Ellipsoid.prototype.getSurfaceNormalIntersectionWithZAxis = function(position, buffer, result) { + //>>includeStart('debug', pragmas.debug); + if (!defined(position)) { + throw new DeveloperError('position is required.'); + } + if (!CesiumMath.equalsEpsilon(this._radii.x, this._radii.y, CesiumMath.EPSILON15)) { + throw new DeveloperError('Ellipsoid must be an ellipsoid of revolution (radii.x == radii.y)'); + } + if (this._radii.z === 0) { + throw new DeveloperError('Ellipsoid.radii.z must be greater than 0'); + } + //>>includeEnd('debug'); + + buffer = defaultValue(buffer, 0.0); + + var sqauredXOverSquaredZ = this._sqauredXOverSquaredZ; + + if (!defined(result)) { + result = new Cartesian3(); + } + + result.x = 0.0; + result.y = 0.0; + result.z = position.z * (1 - sqauredXOverSquaredZ); + + if (Math.abs(result.z) >= this._radii.z - buffer) { + return undefined; + } + + return result; + }; + return Ellipsoid; }); diff --git a/Source/Core/EllipsoidGeodesic.js b/Source/Core/EllipsoidGeodesic.js index 8db8aa6ed9b5..4a84a85b7d04 100644 --- a/Source/Core/EllipsoidGeodesic.js +++ b/Source/Core/EllipsoidGeodesic.js @@ -337,6 +337,7 @@ define([ * Provides the location of a point at the indicated portion along the geodesic. * * @param {Number} fraction The portion of the distance between the initial and final points. + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. */ EllipsoidGeodesic.prototype.interpolateUsingFraction = function(fraction, result) { @@ -347,6 +348,7 @@ define([ * Provides the location of a point at the indicated distance along the geodesic. * * @param {Number} distance The distance from the inital point to the point of interest along the geodesic + * @param {Cartographic} result The object in which to store the result. * @returns {Cartographic} The location of the point along the geodesic. * * @exception {DeveloperError} start and end must be set before calling function interpolateUsingSurfaceDistance diff --git a/Source/Core/EllipsoidTangentPlane.js b/Source/Core/EllipsoidTangentPlane.js index 1533ca94f703..c2c178566c18 100644 --- a/Source/Core/EllipsoidTangentPlane.js +++ b/Source/Core/EllipsoidTangentPlane.js @@ -10,7 +10,6 @@ define([ './DeveloperError', './Ellipsoid', './IntersectionTests', - './Matrix3', './Matrix4', './Plane', './Ray', @@ -26,7 +25,6 @@ define([ DeveloperError, Ellipsoid, IntersectionTests, - Matrix3, Matrix4, Plane, Ray, diff --git a/Source/Core/GeocoderService.js b/Source/Core/GeocoderService.js new file mode 100644 index 000000000000..c15982213a0f --- /dev/null +++ b/Source/Core/GeocoderService.js @@ -0,0 +1,36 @@ +/*global define*/ +define([ + './defineProperties', + './DeveloperError' + ], function( + defineProperties, + DeveloperError) { + 'use strict'; + + /** + * @typedef {Object} GeocoderResult + * @property {String} displayName The display name for a location + * @property {Rectangle|Cartesian3} destination The bounding box for a location + */ + + /** + * Provides geocoding through an external service. This type describes an interface and + * is not intended to be used. + * @alias GeocoderService + * @constructor + * + * @see BingMapsGeocoderService + */ + function GeocoderService() { + } + + /** + * @function + * + * @param {String} query The query to be sent to the geocoder service + * @returns {Promise} + */ + GeocoderService.prototype.geocode = DeveloperError.throwInstantiationError; + + return GeocoderService; +}); diff --git a/Source/Core/GeometryPipeline.js b/Source/Core/GeometryPipeline.js index 6252e4d763ed..23bbeb25a91a 100644 --- a/Source/Core/GeometryPipeline.js +++ b/Source/Core/GeometryPipeline.js @@ -15,7 +15,6 @@ define([ './GeographicProjection', './Geometry', './GeometryAttribute', - './GeometryInstance', './GeometryType', './IndexDatatype', './Intersect', @@ -42,7 +41,6 @@ define([ GeographicProjection, Geometry, GeometryAttribute, - GeometryInstance, GeometryType, IndexDatatype, Intersect, @@ -284,6 +282,9 @@ define([ 'binormal', 'tangent', + // For shadow volumes + 'extrudeDirection', + // From compressing texture coordinates and normals 'compressedAttributes' ]; @@ -1345,7 +1346,7 @@ define([ var toEncode1 = new Cartesian3(); var toEncode2 = new Cartesian3(); var toEncode3 = new Cartesian3(); - + var encodeResult2 = new Cartesian2(); /** * Compresses and packs geometry normal attribute values to save memory. * @@ -1362,53 +1363,89 @@ define([ } //>>includeEnd('debug'); + var extrudeAttribute = geometry.attributes.extrudeDirection; + var i; + var numVertices; + if (defined(extrudeAttribute)) { + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var extrudeDirections = extrudeAttribute.values; + numVertices = extrudeDirections.length / 3.0; + var compressedDirections = new Float32Array(numVertices * 2); + + var i2 = 0; + for (i = 0; i < numVertices; ++i) { + Cartesian3.fromArray(extrudeDirections, i * 3.0, toEncode1); + if (Cartesian3.equals(toEncode1, Cartesian3.ZERO)) { + i2 += 2; + continue; + } + encodeResult2 = AttributeCompression.octEncodeInRange(toEncode1, 65535, encodeResult2); + compressedDirections[i2++] = encodeResult2.x; + compressedDirections[i2++] = encodeResult2.y; + } + + geometry.attributes.compressedAttributes = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 2, + values : compressedDirections + }); + delete geometry.attributes.extrudeDirection; + return geometry; + } + var normalAttribute = geometry.attributes.normal; var stAttribute = geometry.attributes.st; - if (!defined(normalAttribute) && !defined(stAttribute)) { + + var hasNormal = defined(normalAttribute); + var hasSt = defined(stAttribute); + if (!hasNormal && !hasSt) { return geometry; } var tangentAttribute = geometry.attributes.tangent; var binormalAttribute = geometry.attributes.binormal; + var hasTangent = defined(tangentAttribute); + var hasBinormal = defined(binormalAttribute); + var normals; var st; var tangents; var binormals; - if (defined(normalAttribute)) { + if (hasNormal) { normals = normalAttribute.values; } - if (defined(stAttribute)) { + if (hasSt) { st = stAttribute.values; } - if (defined(tangentAttribute)) { + if (hasTangent) { tangents = tangentAttribute.values; } - if (binormalAttribute) { + if (hasBinormal) { binormals = binormalAttribute.values; } - var length = defined(normals) ? normals.length : st.length; - var numComponents = defined(normals) ? 3.0 : 2.0; - var numVertices = length / numComponents; + var length = hasNormal ? normals.length : st.length; + var numComponents = hasNormal ? 3.0 : 2.0; + numVertices = length / numComponents; var compressedLength = numVertices; - var numCompressedComponents = defined(st) && defined(normals) ? 2.0 : 1.0; - numCompressedComponents += defined(tangents) || defined(binormals) ? 1.0 : 0.0; + var numCompressedComponents = hasSt && hasNormal ? 2.0 : 1.0; + numCompressedComponents += hasTangent || hasBinormal ? 1.0 : 0.0; compressedLength *= numCompressedComponents; var compressedAttributes = new Float32Array(compressedLength); var normalIndex = 0; - for (var i = 0; i < numVertices; ++i) { - if (defined(st)) { + for (i = 0; i < numVertices; ++i) { + if (hasSt) { Cartesian2.fromArray(st, i * 2.0, scratchCartesian2); compressedAttributes[normalIndex++] = AttributeCompression.compressTextureCoordinates(scratchCartesian2); } var index = i * 3.0; - if (defined(normals) && defined(tangents) && defined(binormals)) { + if (hasNormal && defined(tangents) && defined(binormals)) { Cartesian3.fromArray(normals, index, toEncode1); Cartesian3.fromArray(tangents, index, toEncode2); Cartesian3.fromArray(binormals, index, toEncode3); @@ -1417,17 +1454,17 @@ define([ compressedAttributes[normalIndex++] = scratchCartesian2.x; compressedAttributes[normalIndex++] = scratchCartesian2.y; } else { - if (defined(normals)) { + if (hasNormal) { Cartesian3.fromArray(normals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(tangents)) { + if (hasTangent) { Cartesian3.fromArray(tangents, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } - if (defined(binormals)) { + if (hasBinormal) { Cartesian3.fromArray(binormals, index, toEncode1); compressedAttributes[normalIndex++] = AttributeCompression.octEncodeFloat(toEncode1); } @@ -1440,16 +1477,16 @@ define([ values : compressedAttributes }); - if (defined(normals)) { + if (hasNormal) { delete geometry.attributes.normal; } - if (defined(st)) { + if (hasSt) { delete geometry.attributes.st; } - if (defined(tangents)) { + if (hasTangent) { delete geometry.attributes.tangent; } - if (defined(binormals)) { + if (hasBinormal) { delete geometry.attributes.binormal; } @@ -1879,8 +1916,8 @@ define([ var s1Scratch = new Cartesian2(); var s2Scratch = new Cartesian2(); - function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex) { - if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords)) { + function computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex) { + if (!defined(normals) && !defined(binormals) && !defined(tangents) && !defined(texCoords) && !defined(extrudeDirections)) { return; } @@ -1905,6 +1942,29 @@ define([ Cartesian3.pack(normal, currentAttributes.normal.values, insertedIndex * 3); } + if (defined(extrudeDirections)) { + var d0 = Cartesian3.fromArray(extrudeDirections, i0 * 3, p0Scratch); + var d1 = Cartesian3.fromArray(extrudeDirections, i1 * 3, p1Scratch); + var d2 = Cartesian3.fromArray(extrudeDirections, i2 * 3, p2Scratch); + + Cartesian3.multiplyByScalar(d0, coords.x, d0); + Cartesian3.multiplyByScalar(d1, coords.y, d1); + Cartesian3.multiplyByScalar(d2, coords.z, d2); + + var direction; + if (!Cartesian3.equals(d0, Cartesian3.ZERO) || !Cartesian3.equals(d1, Cartesian3.ZERO) || !Cartesian3.equals(d2, Cartesian3.ZERO)) { + direction = Cartesian3.add(d0, d1, d0); + Cartesian3.add(direction, d2, direction); + Cartesian3.normalize(direction, direction); + } else { + direction = p0Scratch; + direction.x = 0; + direction.y = 0; + direction.z = 0; + } + Cartesian3.pack(direction, currentAttributes.extrudeDirection.values, insertedIndex * 3); + } + if (defined(binormals)) { var b0 = Cartesian3.fromArray(binormals, i0 * 3, p0Scratch); var b1 = Cartesian3.fromArray(binormals, i1 * 3, p1Scratch); @@ -1984,6 +2044,7 @@ define([ var binormals = (defined(attributes.binormal)) ? attributes.binormal.values : undefined; var tangents = (defined(attributes.tangent)) ? attributes.tangent.values : undefined; var texCoords = (defined(attributes.st)) ? attributes.st.values : undefined; + var extrudeDirections = (defined(attributes.extrudeDirection)) ? attributes.extrudeDirection.values : undefined; var indices = geometry.indices; var eastGeometry = copyGeometryForSplit(geometry); @@ -2037,7 +2098,7 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, resultIndex < 3 ? i + resultIndex : -1, point); - computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, point, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } else { if (defined(result)) { @@ -2057,13 +2118,13 @@ define([ } insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i, p0); - computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p0, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 1, p1); - computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p1, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); insertedIndex = insertSplitPoint(currentAttributes, currentIndices, currentIndexMap, indices, i + 2, p2); - computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, currentAttributes, insertedIndex); + computeTriangleAttributes(i0, i1, i2, p2, positions, normals, binormals, tangents, texCoords, extrudeDirections, currentAttributes, insertedIndex); } } diff --git a/Source/Core/HeadingPitchRoll.js b/Source/Core/HeadingPitchRoll.js index 32229a9880f7..6428fc73a83b 100644 --- a/Source/Core/HeadingPitchRoll.js +++ b/Source/Core/HeadingPitchRoll.js @@ -1,14 +1,14 @@ /*global define*/ define([ - './defaultValue', - './defined', - './DeveloperError', - './Math' -], function( - defaultValue, - defined, - DeveloperError, - CesiumMath) { + './defaultValue', + './defined', + './DeveloperError', + './Math' + ], function( + defaultValue, + defined, + DeveloperError, + CesiumMath) { "use strict"; /** diff --git a/Source/Core/HeightmapTessellator.js b/Source/Core/HeightmapTessellator.js index 9454338ff0da..fa222bf44dde 100644 --- a/Source/Core/HeightmapTessellator.js +++ b/Source/Core/HeightmapTessellator.js @@ -16,7 +16,7 @@ define([ './Rectangle', './TerrainEncoding', './Transforms', - './WebMercatorProjection', + './WebMercatorProjection' ], function( AxisAlignedBoundingBox, BoundingSphere, diff --git a/Source/Core/IndexDatatype.js b/Source/Core/IndexDatatype.js index 7ffad3c9bc46..2922700c3556 100644 --- a/Source/Core/IndexDatatype.js +++ b/Source/Core/IndexDatatype.js @@ -1,16 +1,16 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', './defined', './DeveloperError', './freezeObject', - './Math' + './Math', + './WebGLConstants' ], function( - WebGLConstants, defined, DeveloperError, freezeObject, - CesiumMath) { + CesiumMath, + WebGLConstants) { 'use strict'; /** @@ -96,7 +96,7 @@ define([ * or Uint32Array depending on the number of vertices. * * @param {Number} numberOfVertices Number of vertices that the indices will reference. - * @param {Any} indicesLengthOrArray Passed through to the typed array constructor. + * @param {*} indicesLengthOrArray Passed through to the typed array constructor. * @returns {Uint16Array|Uint32Array} A Uint16Array or Uint32Array constructed with indicesLengthOrArray. * * @example diff --git a/Source/Core/IntersectionTests.js b/Source/Core/IntersectionTests.js index 3657b9b48ee5..3bde8428fed3 100644 --- a/Source/Core/IntersectionTests.js +++ b/Source/Core/IntersectionTests.js @@ -5,6 +5,7 @@ define([ './defaultValue', './defined', './DeveloperError', + './Interval', './Math', './Matrix3', './QuadraticRealPolynomial', @@ -16,6 +17,7 @@ define([ defaultValue, defined, DeveloperError, + Interval, CesiumMath, Matrix3, QuadraticRealPolynomial, @@ -80,6 +82,10 @@ define([ /** * Computes the intersection of a ray and a triangle as a parametric distance along the input ray. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * * @memberof IntersectionTests * * @param {Ray} ray The ray. @@ -170,6 +176,10 @@ define([ /** * Computes the intersection of a ray and a triangle as a Cartesian3 coordinate. + * + * Implements {@link https://cadxfem.org/inf/Fast%20MinimumStorage%20RayTriangle%20Intersection.pdf| + * Fast Minimum Storage Ray/Triangle Intersection} by Tomas Moller and Ben Trumbore. + * * @memberof IntersectionTests * * @param {Ray} ray The ray. @@ -285,7 +295,7 @@ define([ function raySphere(ray, sphere, result) { if (!defined(result)) { - result = {}; + result = new Interval(); } var origin = ray.origin; @@ -316,8 +326,8 @@ define([ * * @param {Ray} ray The ray. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.raySphere = function(ray, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -347,8 +357,8 @@ define([ * @param {Cartesian3} p0 An end point of the line segment. * @param {Cartesian3} p1 The other end point of the line segment. * @param {BoundingSphere} sphere The sphere. - * @param {Object} [result] The result onto which to store the result. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the line segment or undefined if there are no intersections. + * @param {Interval} [result] The result onto which to store the result. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.lineSegmentSphere = function(p0, p1, sphere, result) { //>>includeStart('debug', pragmas.debug); @@ -388,7 +398,7 @@ define([ * * @param {Ray} ray The ray. * @param {Ellipsoid} ellipsoid The ellipsoid. - * @returns {Object} An object with the first (start) and the second (stop) intersection scalars for points along the ray or undefined if there are no intersections. + * @returns {Interval} The interval containing scalar points along the ray or undefined if there are no intersections. */ IntersectionTests.rayEllipsoid = function(ray, ellipsoid) { //>>includeStart('debug', pragmas.debug); @@ -432,10 +442,7 @@ define([ var root0 = temp / w2; var root1 = difference / temp; if (root0 < root1) { - return { - start : root0, - stop : root1 - }; + return new Interval(root0, root1); } return { @@ -445,10 +452,7 @@ define([ } else { // qw2 == product. Repeated roots (2 intersections). var root = Math.sqrt(difference / w2); - return { - start : root, - stop : root - }; + return new Interval(root, root); } } else if (q2 < 1.0) { // Inside ellipsoid (2 intersections). @@ -458,19 +462,13 @@ define([ discriminant = qw * qw - product; temp = -qw + Math.sqrt(discriminant); // Positively valued. - return { - start : 0.0, - stop : temp / w2 - }; + return new Interval(0.0, temp / w2); } else { // q2 == 1.0. On ellipsoid. if (qw < 0.0) { // Looking inward. w2 = Cartesian3.magnitudeSquared(w); - return { - start : 0.0, - stop : -qw / w2 - }; + return new Interval(0.0, -qw / w2); } // qw >= 0.0. Looking outward or tangent. diff --git a/Source/Core/MapboxApi.js b/Source/Core/MapboxApi.js index d1c7f30f3260..43dadf66c51e 100644 --- a/Source/Core/MapboxApi.js +++ b/Source/Core/MapboxApi.js @@ -1,8 +1,10 @@ /*global define*/ define([ - './defined' - ], function( - defined) { + './defined', + './Credit' +], function( + defined, + Credit) { 'use strict'; var MapboxApi = { @@ -21,7 +23,10 @@ define([ */ MapboxApi.defaultAccessToken = undefined; - var printedMpaboxWarning = false; + var printedMapboxWarning = false; + var errorCredit; + var errorString = 'This application is using Cesium\'s default Mapbox access token. Please create a new access token for the application as soon as possible and prior to deployment by visiting https://www.mapbox.com/account/apps/, and provide your token to Cesium by setting the Cesium.MapboxApi.defaultAccessToken property before constructing the CesiumWidget or any other object that uses the Mapbox API.'; + MapboxApi.getAccessToken = function(providedToken) { if (defined(providedToken)) { @@ -29,15 +34,27 @@ define([ } if (!defined(MapboxApi.defaultAccessToken)) { - if (!printedMpaboxWarning) { - console.log('This application is using Cesium\'s default Mapbox access token. Please create a new access token for the application as soon as possible and prior to deployment by visiting https://www.mapbox.com/account/apps/, and provide your token to Cesium by setting the Cesium.MapboxApi.defaultAccessToken property before constructing the CesiumWidget or any other object that uses the Mapbox API.'); - printedMpaboxWarning = true; + if (!printedMapboxWarning) { + console.log(errorString); + printedMapboxWarning = true; } - return 'pk.eyJ1IjoiYW5hbHl0aWNhbGdyYXBoaWNzIiwiYSI6IjA2YzBjOTM3YzFlYzljYmQ5NDAxZWI1Y2ZjNzZlM2E1In0.vDZL2SPFEpi_f7ziAIP_yw'; + return 'pk.eyJ1IjoiYW5hbHl0aWNhbGdyYXBoaWNzIiwiYSI6ImNpd204Zm4wejAwNzYyeW5uNjYyZmFwdWEifQ.7i-VIZZWX8pd1bTfxIVj9g'; } return MapboxApi.defaultAccessToken; }; + MapboxApi.getErrorCredit = function(providedToken) { + if (defined(providedToken) || defined(MapboxApi.defaultAccessToken)) { + return undefined; + } + + if (!defined(errorCredit)) { + errorCredit = new Credit(errorString); + } + + return errorCredit; + }; + return MapboxApi; }); diff --git a/Source/Core/Math.js b/Source/Core/Math.js index 7c9952c522b5..b3bd96701bd4 100644 --- a/Source/Core/Math.js +++ b/Source/Core/Math.js @@ -486,7 +486,7 @@ define([ throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - + return CesiumMath.clamp(angle, -1*CesiumMath.PI_OVER_TWO, CesiumMath.PI_OVER_TWO); }; @@ -496,13 +496,13 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [-CesiumMath.PI, CesiumMath.PI]. */ - CesiumMath.negativePiToPi = function(x) { + CesiumMath.negativePiToPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - return CesiumMath.zeroToTwoPi(x + CesiumMath.PI) - CesiumMath.PI; + return CesiumMath.zeroToTwoPi(angle + CesiumMath.PI) - CesiumMath.PI; }; /** @@ -511,14 +511,14 @@ define([ * @param {Number} angle in radians * @returns {Number} The angle in the range [0, CesiumMath.TWO_PI]. */ - CesiumMath.zeroToTwoPi = function(x) { + CesiumMath.zeroToTwoPi = function(angle) { //>>includeStart('debug', pragmas.debug); - if (!defined(x)) { - throw new DeveloperError('x is required.'); + if (!defined(angle)) { + throw new DeveloperError('angle is required.'); } //>>includeEnd('debug'); - var mod = CesiumMath.mod(x, CesiumMath.TWO_PI); - if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(x) > CesiumMath.EPSILON14) { + var mod = CesiumMath.mod(angle, CesiumMath.TWO_PI); + if (Math.abs(mod) < CesiumMath.EPSILON14 && Math.abs(angle) > CesiumMath.EPSILON14) { return CesiumMath.TWO_PI; } return mod; @@ -592,7 +592,7 @@ define([ * @example * //Compute 7!, which is equal to 5040 * var computedFactorial = Cesium.Math.factorial(7); - * + * * @see {@link http://en.wikipedia.org/wiki/Factorial|Factorial on Wikipedia} */ CesiumMath.factorial = function(n) { diff --git a/Source/Core/Matrix2.js b/Source/Core/Matrix2.js index ead1b25b2aa8..ad6bcaa18abc 100644 --- a/Source/Core/Matrix2.js +++ b/Source/Core/Matrix2.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian2', + './Check', './defaultValue', './defined', './defineProperties', @@ -8,6 +9,7 @@ define([ './freezeObject' ], function( Cartesian2, + Check, defaultValue, defined, defineProperties, @@ -57,13 +59,8 @@ define([ */ Matrix2.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -86,9 +83,7 @@ define([ */ Matrix2.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -111,18 +106,18 @@ define([ * @param {Matrix2} [result] The object onto which to store the result. * @returns {Matrix2} The modified result parameter or a new Matrix2 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix2.clone = function(values, result) { - if (!defined(values)) { + Matrix2.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix2(values[0], values[2], - values[1], values[3]); + return new Matrix2(matrix[0], matrix[2], + matrix[1], matrix[3]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; return result; }; @@ -148,9 +143,7 @@ define([ */ Matrix2.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -175,9 +168,7 @@ define([ */ Matrix2.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix2.clone(values, result); @@ -193,9 +184,7 @@ define([ */ Matrix2.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -224,9 +213,7 @@ define([ */ Matrix2.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -257,9 +244,7 @@ define([ */ Matrix2.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -290,9 +275,7 @@ define([ */ Matrix2.fromRotation = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -320,9 +303,7 @@ define([ */ Matrix2.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -353,12 +334,13 @@ define([ */ Matrix2.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 1) { - throw new DeveloperError('row must be 0 or 1.'); - } - if (typeof column !== 'number' || column < 0 || column > 1) { - throw new DeveloperError('column must be 0 or 1.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 1); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 1); //>>includeEnd('debug'); return column * 2 + row; @@ -376,15 +358,13 @@ define([ */ Matrix2.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 2; @@ -409,18 +389,14 @@ define([ */ Matrix2.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -442,15 +418,13 @@ define([ */ Matrix2.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -474,18 +448,14 @@ define([ */ Matrix2.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 1) { - throw new DeveloperError('index must be 0 or 1.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 1); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix2.clone(matrix, result); @@ -505,12 +475,8 @@ define([ */ Matrix2.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian2.magnitude(Cartesian2.fromElements(matrix[0], matrix[1], scratchColumn)); @@ -542,15 +508,9 @@ define([ */ Matrix2.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[2] * right[1]; @@ -575,15 +535,9 @@ define([ */ Matrix2.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -603,15 +557,9 @@ define([ */ Matrix2.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -631,15 +579,9 @@ define([ */ Matrix2.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[0] * cartesian.x + matrix[2] * cartesian.y; @@ -660,15 +602,9 @@ define([ */ Matrix2.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -696,15 +632,9 @@ define([ */ Matrix2.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -723,12 +653,8 @@ define([ */ Matrix2.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -747,12 +673,8 @@ define([ */ Matrix2.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -776,12 +698,8 @@ define([ */ Matrix2.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -832,9 +750,7 @@ define([ */ Matrix2.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Matrix3.js b/Source/Core/Matrix3.js index e896df174256..0b63e2eb9a7a 100644 --- a/Source/Core/Matrix3.js +++ b/Source/Core/Matrix3.js @@ -1,21 +1,21 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './defineProperties', './DeveloperError', './freezeObject', - './HeadingPitchRoll', './Math' ], function( Cartesian3, + Check, defaultValue, defined, defineProperties, DeveloperError, freezeObject, - HeadingPitchRoll, CesiumMath) { 'use strict'; @@ -74,13 +74,8 @@ define([ */ Matrix3.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -108,9 +103,7 @@ define([ */ Matrix3.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -138,24 +131,24 @@ define([ * @param {Matrix3} [result] The object onto which to store the result. * @returns {Matrix3} The modified result parameter or a new Matrix3 instance if one was not provided. (Returns undefined if matrix is undefined) */ - Matrix3.clone = function(values, result) { - if (!defined(values)) { + Matrix3.clone = function(matrix, result) { + if (!defined(matrix)) { return undefined; } if (!defined(result)) { - return new Matrix3(values[0], values[3], values[6], - values[1], values[4], values[7], - values[2], values[5], values[8]); + return new Matrix3(matrix[0], matrix[3], matrix[6], + matrix[1], matrix[4], matrix[7], + matrix[2], matrix[5], matrix[8]); } - result[0] = values[0]; - result[1] = values[1]; - result[2] = values[2]; - result[3] = values[3]; - result[4] = values[4]; - result[5] = values[5]; - result[6] = values[6]; - result[7] = values[7]; - result[8] = values[8]; + result[0] = matrix[0]; + result[1] = matrix[1]; + result[2] = matrix[2]; + result[3] = matrix[3]; + result[4] = matrix[4]; + result[5] = matrix[5]; + result[6] = matrix[6]; + result[7] = matrix[7]; + result[8] = matrix[8]; return result; }; @@ -182,9 +175,7 @@ define([ */ Matrix3.fromArray = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -214,9 +205,7 @@ define([ */ Matrix3.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values parameter is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix3.clone(values, result); @@ -232,9 +221,7 @@ define([ */ Matrix3.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -263,9 +250,7 @@ define([ */ Matrix3.fromQuaternion = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); var x2 = quaternion.x * quaternion.x; @@ -317,10 +302,9 @@ define([ */ Matrix3.fromHeadingPitchRoll = function(headingPitchRoll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(headingPitchRoll)) { - throw new DeveloperError('headingPitchRoll is required'); - } + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); //>>includeEnd('debug'); + var cosTheta = Math.cos(-headingPitchRoll.pitch); var cosPsi = Math.cos(-headingPitchRoll.heading); var cosPhi = Math.cos(headingPitchRoll.roll); @@ -373,9 +357,7 @@ define([ */ Matrix3.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -413,9 +395,7 @@ define([ */ Matrix3.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -440,7 +420,7 @@ define([ /** * Computes a Matrix3 instance representing the cross product equivalent matrix of a Cartesian3 vector. * - * @param {Cartesian3} the vector on the left hand side of the cross product operation. + * @param {Cartesian3} vector the vector on the left hand side of the cross product operation. * @param {Matrix3} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Matrix3} The modified result parameter, or a new Matrix3 instance if one was not provided. * @@ -453,9 +433,7 @@ define([ */ Matrix3.fromCrossProduct = function(vector, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(vector)) { - throw new DeveloperError('vector is required.'); - } + Check.typeOf.object(vector, 'vector'); //>>includeEnd('debug'); if (!defined(result)) { @@ -492,9 +470,7 @@ define([ */ Matrix3.fromRotationX = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -535,9 +511,7 @@ define([ */ Matrix3.fromRotationY = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -578,9 +552,7 @@ define([ */ Matrix3.fromRotationZ = function(angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(angle)) { - throw new DeveloperError('angle is required.'); - } + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var cosAngle = Math.cos(angle); @@ -616,9 +588,7 @@ define([ */ Matrix3.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -654,12 +624,12 @@ define([ */ Matrix3.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 2) { - throw new DeveloperError('row must be 0, 1, or 2.'); - } - if (typeof column !== 'number' || column < 0 || column > 2) { - throw new DeveloperError('column must be 0, 1, or 2.'); - } + Check.typeOf.number(column, 'column'); + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 2); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 2); //>>includeEnd('debug'); return column * 3 + row; @@ -677,16 +647,11 @@ define([ */ Matrix3.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 3; @@ -713,18 +678,12 @@ define([ */ Matrix3.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -747,15 +706,11 @@ define([ */ Matrix3.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -781,18 +736,12 @@ define([ */ Matrix3.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 2) { - throw new DeveloperError('index must be 0, 1, or 2.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 2); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix3.clone(matrix, result); @@ -813,12 +762,8 @@ define([ */ Matrix3.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -851,15 +796,9 @@ define([ */ Matrix3.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = left[0] * right[0] + left[3] * right[1] + left[6] * right[2]; @@ -896,15 +835,9 @@ define([ */ Matrix3.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -929,15 +862,9 @@ define([ */ Matrix3.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -962,15 +889,9 @@ define([ */ Matrix3.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -997,15 +918,9 @@ define([ */ Matrix3.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -1038,15 +953,9 @@ define([ */ Matrix3.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scale.x; @@ -1070,12 +979,8 @@ define([ */ Matrix3.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -1099,12 +1004,8 @@ define([ */ Matrix3.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = matrix[0]; @@ -1246,9 +1147,7 @@ define([ */ Matrix3.computeEigenDecomposition = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); // This routine was created based upon Matrix Computations, 3rd ed., by Golub and Van Loan, @@ -1294,12 +1193,8 @@ define([ */ Matrix3.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -1323,9 +1218,7 @@ define([ */ Matrix3.determinant = function(matrix) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1352,12 +1245,8 @@ define([ */ Matrix3.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var m11 = matrix[0]; @@ -1427,9 +1316,7 @@ define([ */ Matrix3.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Matrix4.js b/Source/Core/Matrix4.js index 53ed1241f682..0ea3319be262 100644 --- a/Source/Core/Matrix4.js +++ b/Source/Core/Matrix4.js @@ -2,6 +2,7 @@ define([ './Cartesian3', './Cartesian4', + './Check', './defaultValue', './defined', './defineProperties', @@ -13,6 +14,7 @@ define([ ], function( Cartesian3, Cartesian4, + Check, defaultValue, defined, defineProperties, @@ -104,13 +106,8 @@ define([ */ Matrix4.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -145,9 +142,7 @@ define([ */ Matrix4.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -245,9 +240,7 @@ define([ */ Matrix4.fromColumnMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); return Matrix4.clone(values, result); @@ -263,9 +256,7 @@ define([ */ Matrix4.fromRowMajorArray = function(values, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(values)) { - throw new DeveloperError('values is required.'); - } + Check.defined(values, 'values'); //>>includeEnd('debug'); if (!defined(result)) { @@ -304,9 +295,7 @@ define([ */ Matrix4.fromRotationTranslation = function(rotation, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } + Check.typeOf.object(rotation, 'rotation'); //>>includeEnd('debug'); translation = defaultValue(translation, Cartesian3.ZERO); @@ -356,15 +345,9 @@ define([ */ Matrix4.fromTranslationQuaternionRotationScale = function(translation, rotation, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required.'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -427,9 +410,7 @@ define([ */ Matrix4.fromTranslationRotationScale = function(translationRotationScale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translationRotationScale)) { - throw new DeveloperError('translationRotationScale is required.'); - } + Check.typeOf.object(translationRotationScale, 'translationRotationScale'); //>>includeEnd('debug'); return Matrix4.fromTranslationQuaternionRotationScale(translationRotationScale.translation, translationRotationScale.rotation, translationRotationScale.scale, result); @@ -446,9 +427,7 @@ define([ */ Matrix4.fromTranslation = function(translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(translation)) { - throw new DeveloperError('translation is required.'); - } + Check.typeOf.object(translation, 'translation'); //>>includeEnd('debug'); return Matrix4.fromRotationTranslation(Matrix3.IDENTITY, translation, result); @@ -471,9 +450,7 @@ define([ */ Matrix4.fromScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(scale)) { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.object(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -520,9 +497,7 @@ define([ */ Matrix4.fromUniformScale = function(scale, result) { //>>includeStart('debug', pragmas.debug); - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required.'); - } + Check.typeOf.number(scale, 'scale'); //>>includeEnd('debug'); if (!defined(result)) { @@ -564,9 +539,7 @@ define([ */ Matrix4.fromCamera = function(camera, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(camera)) { - throw new DeveloperError('camera is required.'); - } + Check.typeOf.object(camera, 'camera'); //>>includeEnd('debug'); var position = camera.position; @@ -574,15 +547,9 @@ define([ var up = camera.up; //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('camera.position is required.'); - } - if (!defined(direction)) { - throw new DeveloperError('camera.direction is required.'); - } - if (!defined(up)) { - throw new DeveloperError('camera.up is required.'); - } + Check.typeOf.object(position, 'camera.position'); + Check.typeOf.object(direction, 'camera.direction'); + Check.typeOf.object(up, 'camera.up'); //>>includeEnd('debug'); Cartesian3.normalize(direction, fromCameraF); @@ -675,9 +642,7 @@ define([ if (far <= 0.0) { throw new DeveloperError('far must be greater than zero.'); } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var bottom = Math.tan(fovY * 0.5); @@ -720,27 +685,13 @@ define([ */ Matrix4.computeOrthographicOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var a = 1.0 / (right - left); @@ -787,27 +738,13 @@ define([ */ Matrix4.computePerspectiveOffCenter = function(left, right, bottom, top, near, far, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(far)) { - throw new DeveloperError('far is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.number(far, 'far'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -850,24 +787,12 @@ define([ */ Matrix4.computeInfinitePerspectiveOffCenter = function(left, right, bottom, top, near, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required.'); - } - if (!defined(right)) { - throw new DeveloperError('right is required.'); - } - if (!defined(bottom)) { - throw new DeveloperError('bottom is required.'); - } - if (!defined(top)) { - throw new DeveloperError('top is required.'); - } - if (!defined(near)) { - throw new DeveloperError('near is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(left, 'left'); + Check.typeOf.number(right, 'right'); + Check.typeOf.number(bottom, 'bottom'); + Check.typeOf.number(top, 'top'); + Check.typeOf.number(near, 'near'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var column0Row0 = 2.0 * near / (right - left); @@ -917,9 +842,7 @@ define([ */ Matrix4.computeViewportTransformation = function(viewport, nearDepthRange, farDepthRange, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); viewport = defaultValue(viewport, defaultValue.EMPTY_OBJECT); @@ -973,21 +896,11 @@ define([ */ Matrix4.computeView = function(position, direction, up, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(position)) { - throw new DeveloperError('position is required'); - } - if (!defined(direction)) { - throw new DeveloperError('direction is required'); - } - if (!defined(up)) { - throw new DeveloperError('up is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(position, 'position'); + Check.typeOf.object(direction, 'direction'); + Check.typeOf.object(up, 'up'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = right.x; @@ -1030,9 +943,7 @@ define([ */ Matrix4.toArray = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); if (!defined(result)) { @@ -1078,12 +989,13 @@ define([ */ Matrix4.getElementIndex = function(column, row) { //>>includeStart('debug', pragmas.debug); - if (typeof row !== 'number' || row < 0 || row > 3) { - throw new DeveloperError('row must be 0, 1, 2, or 3.'); - } - if (typeof column !== 'number' || column < 0 || column > 3) { - throw new DeveloperError('column must be 0, 1, 2, or 3.'); - } + Check.typeOf.number(row, 'row'); + Check.numeric.minimum(row, 0); + Check.numeric.maximum(row, 3); + + Check.typeOf.number(column, 'column'); + Check.numeric.minimum(column, 0); + Check.numeric.maximum(column, 3); //>>includeEnd('debug'); return column * 4 + row; @@ -1118,16 +1030,13 @@ define([ */ Matrix4.getColumn = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var startIndex = index * 4; @@ -1171,18 +1080,14 @@ define([ */ Matrix4.setColumn = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1205,15 +1110,9 @@ define([ */ Matrix4.setTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -1268,16 +1167,13 @@ define([ */ Matrix4.getRow = function(matrix, index, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = matrix[index]; @@ -1320,18 +1216,14 @@ define([ */ Matrix4.setRow = function(matrix, index, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (typeof index !== 'number' || index < 0 || index > 3) { - throw new DeveloperError('index must be 0, 1, 2, or 3.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + + Check.typeOf.number(index, 'index'); + Check.numeric.minimum(index, 0); + Check.numeric.maximum(index, 3); + + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result = Matrix4.clone(matrix, result); @@ -1353,12 +1245,8 @@ define([ */ Matrix4.getScale = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = Cartesian3.magnitude(Cartesian3.fromElements(matrix[0], matrix[1], matrix[2], scratchColumn)); @@ -1392,15 +1280,9 @@ define([ */ Matrix4.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1486,15 +1368,9 @@ define([ */ Matrix4.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] + right[0]; @@ -1526,15 +1402,9 @@ define([ */ Matrix4.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = left[0] - right[0]; @@ -1577,15 +1447,9 @@ define([ */ Matrix4.multiplyTransformation = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = left[0]; @@ -1665,15 +1529,9 @@ define([ */ Matrix4.multiplyByMatrix3 = function(matrix, rotation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(rotation)) { - throw new DeveloperError('rotation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(rotation, 'rotation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var left0 = matrix[0]; @@ -1743,15 +1601,9 @@ define([ */ Matrix4.multiplyByTranslation = function(matrix, translation, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(translation)) { - throw new DeveloperError('translation is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(translation, 'translation'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = translation.x; @@ -1805,15 +1657,9 @@ define([ */ Matrix4.multiplyByUniformScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scale !== 'number') { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); uniformScaleScratch.x = scale; @@ -1844,15 +1690,9 @@ define([ */ Matrix4.multiplyByScale = function(matrix, scale, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(scale)) { - throw new DeveloperError('scale is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(scale, 'scale'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var scaleX = scale.x; @@ -1893,15 +1733,9 @@ define([ */ Matrix4.multiplyByVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1939,15 +1773,9 @@ define([ */ Matrix4.multiplyByPointAsVector = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -1979,16 +1807,9 @@ define([ */ Matrix4.multiplyByPoint = function(matrix, cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var vX = cartesian.x; @@ -2030,15 +1851,9 @@ define([ */ Matrix4.multiplyByScalar = function(matrix, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar must be a number'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0] * scalar; @@ -2084,12 +1899,8 @@ define([ */ Matrix4.negate = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = -matrix[0]; @@ -2135,12 +1946,8 @@ define([ */ Matrix4.transpose = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var matrix1 = matrix[1]; @@ -2178,12 +1985,8 @@ define([ */ Matrix4.abs = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = Math.abs(matrix[0]); @@ -2299,9 +2102,7 @@ define([ */ Matrix4.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon must be a number'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || @@ -2334,12 +2135,8 @@ define([ */ Matrix4.getTranslation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = matrix[12]; @@ -2372,12 +2169,8 @@ define([ */ Matrix4.getRotation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result[0] = matrix[0]; @@ -2411,12 +2204,8 @@ define([ */ Matrix4.inverse = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); // Special case for a zero scale matrix that can occur, for example, @@ -2556,12 +2345,8 @@ define([ */ Matrix4.inverseTransformation = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(matrix, 'matrix'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); //This function is an optimized version of the below 4 lines. diff --git a/Source/Core/OrientedBoundingBox.js b/Source/Core/OrientedBoundingBox.js index 15c6b332ee08..53e0f48e28ee 100644 --- a/Source/Core/OrientedBoundingBox.js +++ b/Source/Core/OrientedBoundingBox.js @@ -199,6 +199,7 @@ define([ /** * Computes an OrientedBoundingBox given extents in the east-north-up space of the tangent plane. * + * @param {Plane} tangentPlane The tangent place corresponding to east-north-up. * @param {Number} minimumX Minimum X extent in tangent plane space. * @param {Number} maximumX Maximum X extent in tangent plane space. * @param {Number} minimumY Minimum Y extent in tangent plane space. diff --git a/Source/Core/PixelFormat.js b/Source/Core/PixelFormat.js index 327643e61c96..ee8f9c48c12d 100644 --- a/Source/Core/PixelFormat.js +++ b/Source/Core/PixelFormat.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** @@ -69,6 +69,78 @@ define([ */ LUMINANCE_ALPHA : WebGLConstants.LUMINANCE_ALPHA, + /** + * A pixel format containing red, green, and blue channels that is DXT1 compressed. + * + * @type {Number} + * @constant + */ + RGB_DXT1 : WebGLConstants.COMPRESSED_RGB_S3TC_DXT1_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT1 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT1 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT1_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT3 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT3 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT3_EXT, + + /** + * A pixel format containing red, green, blue, and alpha channels that is DXT5 compressed. + * + * @type {Number} + * @constant + */ + RGBA_DXT5 : WebGLConstants.COMPRESSED_RGBA_S3TC_DXT5_EXT, + + /** + * A pixel format containing red, green, and blue channels that is PVR 4bpp compressed. + * + * @type {Number} + * @constant + */ + RGB_PVRTC_4BPPV1 : WebGLConstants.COMPRESSED_RGB_PVRTC_4BPPV1_IMG, + + /** + * A pixel format containing red, green, and blue channels that is PVR 2bpp compressed. + * + * @type {Number} + * @constant + */ + RGB_PVRTC_2BPPV1 : WebGLConstants.COMPRESSED_RGB_PVRTC_2BPPV1_IMG, + + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 4bpp compressed. + * + * @type {Number} + * @constant + */ + RGBA_PVRTC_4BPPV1 : WebGLConstants.COMPRESSED_RGBA_PVRTC_4BPPV1_IMG, + + /** + * A pixel format containing red, green, blue, and alpha channels that is PVR 2bpp compressed. + * + * @type {Number} + * @constant + */ + RGBA_PVRTC_2BPPV1 : WebGLConstants.COMPRESSED_RGBA_PVRTC_2BPPV1_IMG, + + /** + * A pixel format containing red, green, and blue channels that is ETC1 compressed. + * + * @type {Number} + * @constant + */ + RGB_ETC1 : WebGLConstants.COMPRESSED_RGB_ETC1_WEBGL, + /** * @private */ @@ -79,7 +151,16 @@ define([ pixelFormat === PixelFormat.RGB || pixelFormat === PixelFormat.RGBA || pixelFormat === PixelFormat.LUMINANCE || - pixelFormat === PixelFormat.LUMINANCE_ALPHA; + pixelFormat === PixelFormat.LUMINANCE_ALPHA || + pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5 || + pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGB_ETC1; }, /** @@ -99,6 +180,75 @@ define([ isDepthFormat : function(pixelFormat) { return pixelFormat === PixelFormat.DEPTH_COMPONENT || pixelFormat === PixelFormat.DEPTH_STENCIL; + }, + + /** + * @private + */ + isCompressedFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5 || + pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGB_ETC1; + }, + + /** + * @private + */ + isDXTFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT1 || + pixelFormat === PixelFormat.RGBA_DXT3 || + pixelFormat === PixelFormat.RGBA_DXT5; + }, + + /** + * @private + */ + isPVRTCFormat : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGB_PVRTC_2BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_4BPPV1 || + pixelFormat === PixelFormat.RGBA_PVRTC_2BPPV1; + }, + + /** + * @private + */ + isETC1Format : function(pixelFormat) { + return pixelFormat === PixelFormat.RGB_ETC1; + }, + + /** + * @private + */ + compressedTextureSize : function(pixelFormat, width, height) { + switch (pixelFormat) { + case PixelFormat.RGB_DXT1: + case PixelFormat.RGBA_DXT1: + case PixelFormat.RGB_ETC1: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 8; + + case PixelFormat.RGBA_DXT3: + case PixelFormat.RGBA_DXT5: + return Math.floor((width + 3) / 4) * Math.floor((height + 3) / 4) * 16; + + case PixelFormat.RGB_PVRTC_4BPPV1: + case PixelFormat.RGBA_PVRTC_4BPPV1: + return Math.floor((Math.max(width, 8) * Math.max(height, 8) * 4 + 7) / 8); + + case PixelFormat.RGB_PVRTC_2BPPV1: + case PixelFormat.RGBA_PVRTC_2BPPV1: + return Math.floor((Math.max(width, 16) * Math.max(height, 8) * 2 + 7) / 8); + + default: + return 0; + } } }; diff --git a/Source/Core/PolygonGeometry.js b/Source/Core/PolygonGeometry.js index 0b2d7dbca180..44c569bde91d 100644 --- a/Source/Core/PolygonGeometry.js +++ b/Source/Core/PolygonGeometry.js @@ -14,7 +14,6 @@ define([ './EllipsoidTangentPlane', './Geometry', './GeometryAttribute', - './GeometryAttributes', './GeometryInstance', './GeometryPipeline', './IndexDatatype', @@ -41,7 +40,6 @@ define([ EllipsoidTangentPlane, Geometry, GeometryAttribute, - GeometryAttributes, GeometryInstance, GeometryPipeline, IndexDatatype, @@ -125,7 +123,8 @@ define([ function computeAttributes(options) { var vertexFormat = options.vertexFormat; var geometry = options.geometry; - if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + var shadowVolume = options.shadowVolume; + if (vertexFormat.st || vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { // PERFORMANCE_IDEA: Compute before subdivision, then just interpolate during subdivision. // PERFORMANCE_IDEA: Compute with createGeometryFromPositions() for fast path when there's no holes. var boundingRectangle = options.boundingRectangle; @@ -155,6 +154,7 @@ define([ } var tangents = vertexFormat.tangent ? new Float32Array(length) : undefined; var binormals = vertexFormat.binormal ? new Float32Array(length) : undefined; + var extrudeNormals = shadowVolume ? new Float32Array(length) : undefined; var textureCoordIndex = 0; var attrIndex = 0; @@ -200,7 +200,7 @@ define([ textureCoordIndex += 2; } - if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal) { + if (vertexFormat.normal || vertexFormat.tangent || vertexFormat.binormal || shadowVolume) { var attrIndex1 = attrIndex + 1; var attrIndex2 = attrIndex + 2; @@ -268,6 +268,15 @@ define([ } } + if (shadowVolume) { + if (wall) { + normal = ellipsoid.geodeticSurfaceNormal(position, normal); + } + extrudeNormals[attrIndex + bottomOffset] = -normal.x; + extrudeNormals[attrIndex1 + bottomOffset] = -normal.y; + extrudeNormals[attrIndex2 + bottomOffset] = -normal.z; + } + if (vertexFormat.tangent) { if (options.wall) { tangents[attrIndex + bottomOffset] = tangent.x; @@ -345,6 +354,14 @@ define([ values : binormals }); } + + if (shadowVolume) { + geometry.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } } return geometry; } @@ -367,13 +384,13 @@ define([ if (closeTop && closeBottom) { var topBottomPositions = edgePoints.concat(edgePoints); + numPositions = topBottomPositions.length / 3; newIndices = IndexDatatype.createTypedArray(numPositions, indices.length * 2); newIndices.set(indices); var ilength = indices.length; - var length = numPositions / 2; for (i = 0; i < ilength; i += 3) { @@ -581,6 +598,7 @@ define([ this._closeBottom = defaultValue(options.closeBottom, true); this._polygonHierarchy = polygonHierarchy; this._perPositionHeight = perPositionHeight; + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createPolygonGeometry'; var positions = polygonHierarchy.positions; @@ -594,7 +612,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; + this.packedLength = PolygonGeometryLibrary.computeHierarchyPackedLength(polygonHierarchy) + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 10; } /** @@ -695,6 +713,7 @@ define([ array[startingIndex++] = value._perPositionHeight ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._shadowVolume ? 1.0 : 0.0; array[startingIndex] = value.packedLength; return array; @@ -746,6 +765,7 @@ define([ var perPositionHeight = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex++] === 1.0; var packedLength = array[startingIndex]; if (!defined(result)) { @@ -764,6 +784,7 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rectangle = Rectangle.clone(rectangle); + result._shadowVolume = shadowVolume; result.packedLength = packedLength; return result; }; @@ -826,6 +847,7 @@ define([ if (extrude) { options.top = closeTop; options.bottom = closeBottom; + options.shadowVolume = polygonGeometry._shadowVolume; for (i = 0; i < polygons.length; i++) { geometry = createGeometryFromPositionsExtruded(ellipsoid, polygons[i], granularity, hierarchy[i], perPositionHeight, closeTop, closeBottom, vertexFormat); @@ -906,7 +928,8 @@ define([ perPositionHeight : false, extrudedHeight : minHeight, height : maxHeight, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/PolygonGeometryLibrary.js b/Source/Core/PolygonGeometryLibrary.js index 1a08ae5e9955..f36e24764715 100644 --- a/Source/Core/PolygonGeometryLibrary.js +++ b/Source/Core/PolygonGeometryLibrary.js @@ -1,13 +1,11 @@ /*global define*/ define([ './arrayRemoveDuplicates', - './Cartesian2', './Cartesian3', './ComponentDatatype', './defaultValue', './defined', './Ellipsoid', - './EllipsoidTangentPlane', './Geometry', './GeometryAttribute', './GeometryAttributes', @@ -20,13 +18,11 @@ define([ './WindingOrder' ], function( arrayRemoveDuplicates, - Cartesian2, Cartesian3, ComponentDatatype, defaultValue, defined, Ellipsoid, - EllipsoidTangentPlane, Geometry, GeometryAttribute, GeometryAttributes, diff --git a/Source/Core/PolygonPipeline.js b/Source/Core/PolygonPipeline.js index 3f3bb509e9dc..6ed1a3e0a33b 100644 --- a/Source/Core/PolygonPipeline.js +++ b/Source/Core/PolygonPipeline.js @@ -8,13 +8,10 @@ define([ './defined', './DeveloperError', './Ellipsoid', - './EllipsoidTangentPlane', './Geometry', './GeometryAttribute', './Math', - './pointInsideTriangle', './PrimitiveType', - './Queue', './WindingOrder' ], function( earcut, @@ -25,13 +22,10 @@ define([ defined, DeveloperError, Ellipsoid, - EllipsoidTangentPlane, Geometry, GeometryAttribute, CesiumMath, - pointInsideTriangle, PrimitiveType, - Queue, WindingOrder) { 'use strict'; diff --git a/Source/Core/PolylinePipeline.js b/Source/Core/PolylinePipeline.js index 99422e918513..51f642a88fd8 100644 --- a/Source/Core/PolylinePipeline.js +++ b/Source/Core/PolylinePipeline.js @@ -202,10 +202,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of numbers to represent the positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Number[]} A new array of positions of type {Number} that have been subdivided and raised to the surface of the ellipsoid. * * @example @@ -289,10 +289,10 @@ define([ /** * Subdivides polyline and raises all points to the specified height. Returns an array of new {Cartesian3} positions. - * @param {Cartesian3[]} positions The array of type {Cartesian3} representing positions. - * @param {Number|Number[]} [height=0.0] A number or array of numbers representing the heights of each position. - * @param {Number} [granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. - * @param {Ellipsoid} [ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. + * @param {Cartesian3[]} options.positions The array of type {Cartesian3} representing positions. + * @param {Number|Number[]} [options.height=0.0] A number or array of numbers representing the heights of each position. + * @param {Number} [options.granularity = CesiumMath.RADIANS_PER_DEGREE] The distance, in radians, between each latitude and longitude. Determines the number of positions in the buffer. + * @param {Ellipsoid} [options.ellipsoid=Ellipsoid.WGS84] The ellipsoid on which the positions lie. * @returns {Cartesian3[]} A new array of cartesian3 positions that have been subdivided and raised to the surface of the ellipsoid. * * @example diff --git a/Source/Core/PolylineVolumeGeometry.js b/Source/Core/PolylineVolumeGeometry.js index 4cf9b5cf04f9..4f65fbd941a6 100644 --- a/Source/Core/PolylineVolumeGeometry.js +++ b/Source/Core/PolylineVolumeGeometry.js @@ -9,7 +9,6 @@ define([ './CornerType', './defaultValue', './defined', - './oneTimeWarning', './DeveloperError', './Ellipsoid', './Geometry', @@ -18,6 +17,7 @@ define([ './GeometryPipeline', './IndexDatatype', './Math', + './oneTimeWarning', './PolygonPipeline', './PolylineVolumeGeometryLibrary', './PrimitiveType', @@ -33,7 +33,6 @@ define([ CornerType, defaultValue, defined, - oneTimeWarning, DeveloperError, Ellipsoid, Geometry, @@ -42,6 +41,7 @@ define([ GeometryPipeline, IndexDatatype, CesiumMath, + oneTimeWarning, PolygonPipeline, PolylineVolumeGeometryLibrary, PrimitiveType, diff --git a/Source/Core/PrimitiveType.js b/Source/Core/PrimitiveType.js index b32704562f3a..30d3174aa460 100644 --- a/Source/Core/PrimitiveType.js +++ b/Source/Core/PrimitiveType.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Core/Quaternion.js b/Source/Core/Quaternion.js index bef64c819ff8..ea095baf1e23 100644 --- a/Source/Core/Quaternion.js +++ b/Source/Core/Quaternion.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -10,6 +11,7 @@ define([ './Matrix3' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -73,12 +75,8 @@ define([ */ Quaternion.fromAxisAngle = function(axis, angle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(axis)) { - throw new DeveloperError('axis is required.'); - } - if (typeof angle !== 'number') { - throw new DeveloperError('angle is required and must be a number.'); - } + Check.typeOf.object(axis, 'axis'); + Check.typeOf.number(angle, 'angle'); //>>includeEnd('debug'); var halfAngle = angle / 2.0; @@ -112,9 +110,7 @@ define([ */ Quaternion.fromRotationMatrix = function(matrix, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(matrix)) { - throw new DeveloperError('matrix is required.'); - } + Check.typeOf.object(matrix, 'matrix'); //>>includeEnd('debug'); var root; @@ -190,15 +186,9 @@ define([ */ Quaternion.fromHeadingPitchRoll = function(heading, pitch, roll, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(heading)) { - throw new DeveloperError('heading is required.'); - } - if (!defined(pitch)) { - throw new DeveloperError('pitch is required.'); - } - if (!defined(roll)) { - throw new DeveloperError('roll is required.'); - } + Check.typeOf.number(heading, 'heading'); + Check.typeOf.number(pitch, 'pitch'); + Check.typeOf.number(roll, 'roll'); //>>includeEnd('debug'); var rollQuaternion = Quaternion.fromAxisAngle(Cartesian3.UNIT_X, roll, scratchHPRQuaternion); @@ -231,13 +221,8 @@ define([ */ Quaternion.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -260,9 +245,7 @@ define([ */ Quaternion.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -318,7 +301,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Quaternion} [result] The object into which to store the result. * @returns {Quaternion} The modified result parameter or a new Quaternion instance if one was not provided. @@ -373,12 +356,8 @@ define([ */ Quaternion.conjugate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -396,9 +375,7 @@ define([ */ Quaternion.magnitudeSquared = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); return quaternion.x * quaternion.x + quaternion.y * quaternion.y + quaternion.z * quaternion.z + quaternion.w * quaternion.w; @@ -423,9 +400,7 @@ define([ */ Quaternion.normalize = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var inverseMagnitude = 1.0 / Quaternion.magnitude(quaternion); @@ -450,9 +425,7 @@ define([ */ Quaternion.inverse = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var magnitudeSquared = Quaternion.magnitudeSquared(quaternion); @@ -470,15 +443,9 @@ define([ */ Quaternion.add = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x + right.x; @@ -498,15 +465,9 @@ define([ */ Quaternion.subtract = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = left.x - right.x; @@ -525,12 +486,8 @@ define([ */ Quaternion.negate = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = -quaternion.x; @@ -549,12 +506,8 @@ define([ */ Quaternion.dot = function(left, right) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); //>>includeEnd('debug'); return left.x * right.x + left.y * right.y + left.z * right.z + left.w * right.w; @@ -570,15 +523,9 @@ define([ */ Quaternion.multiply = function(left, right, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(left)) { - throw new DeveloperError('left is required'); - } - if (!defined(right)) { - throw new DeveloperError('right is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(left, 'left'); + Check.typeOf.object(right, 'right'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var leftX = left.x; @@ -613,15 +560,9 @@ define([ */ Quaternion.multiplyByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x * scalar; @@ -641,15 +582,9 @@ define([ */ Quaternion.divideByScalar = function(quaternion, scalar, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (typeof scalar !== 'number') { - throw new DeveloperError('scalar is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.number(scalar, 'scalar'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); result.x = quaternion.x / scalar; @@ -668,12 +603,8 @@ define([ */ Quaternion.computeAxis = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var w = quaternion.w; @@ -698,9 +629,7 @@ define([ */ Quaternion.computeAngle = function(quaternion) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); //>>includeEnd('debug'); if (Math.abs(quaternion.w - 1.0) < CesiumMath.EPSILON6) { @@ -721,18 +650,10 @@ define([ */ Quaternion.lerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); lerpScratch = Quaternion.multiplyByScalar(end, t, lerpScratch); @@ -756,18 +677,10 @@ define([ */ Quaternion.slerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var dot = Quaternion.dot(start, end); @@ -802,12 +715,8 @@ define([ */ Quaternion.log = function(quaternion, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(quaternion)) { - throw new DeveloperError('quaternion is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(quaternion, 'quaternion'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = CesiumMath.acosClamped(quaternion.w); @@ -829,12 +738,8 @@ define([ */ Quaternion.exp = function(cartesian, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian)) { - throw new DeveloperError('cartesian is required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(cartesian, 'cartesian'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var theta = Cartesian3.magnitude(cartesian); @@ -871,12 +776,10 @@ define([ */ Quaternion.computeInnerQuadrangle = function(q0, q1, q2, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(q2)) { - throw new DeveloperError('q0, q1, and q2 are required.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(q2, 'q2'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var qInv = Quaternion.conjugate(q1, squadScratchQuaternion0); @@ -920,15 +823,12 @@ define([ */ Quaternion.squad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.slerp(q0, q1, t, squadScratchQuaternion0); @@ -967,18 +867,10 @@ define([ */ Quaternion.fastSlerp = function(start, end, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(start)) { - throw new DeveloperError('start is required.'); - } - if (!defined(end)) { - throw new DeveloperError('end is required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(start, 'start'); + Check.typeOf.object(end, 'end'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var x = Quaternion.dot(start, end); @@ -1029,15 +921,12 @@ define([ */ Quaternion.fastSquad = function(q0, q1, s0, s1, t, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(q0) || !defined(q1) || !defined(s0) || !defined(s1)) { - throw new DeveloperError('q0, q1, s0, and s1 are required.'); - } - if (typeof t !== 'number') { - throw new DeveloperError('t is required and must be a number.'); - } - if (!defined(result)) { - throw new DeveloperError('result is required'); - } + Check.typeOf.object(q0, 'q0'); + Check.typeOf.object(q1, 'q1'); + Check.typeOf.object(s0, 's0'); + Check.typeOf.object(s1, 's1'); + Check.typeOf.number(t, 't'); + Check.typeOf.object(result, 'result'); //>>includeEnd('debug'); var slerp0 = Quaternion.fastSlerp(q0, q1, t, squadScratchQuaternion0); @@ -1075,9 +964,7 @@ define([ */ Quaternion.equalsEpsilon = function(left, right, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return (left === right) || diff --git a/Source/Core/Queue.js b/Source/Core/Queue.js index ffc238620ea2..a6e3caa3dc0c 100644 --- a/Source/Core/Queue.js +++ b/Source/Core/Queue.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../Core/defineProperties' + './defineProperties' ], function( defineProperties) { 'use strict'; diff --git a/Source/Core/Rectangle.js b/Source/Core/Rectangle.js index a441997229fe..bc6a5df3e041 100644 --- a/Source/Core/Rectangle.js +++ b/Source/Core/Rectangle.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartographic', + './Check', './defaultValue', './defined', './defineProperties', @@ -10,6 +11,7 @@ define([ './Math' ], function( Cartographic, + Check, defaultValue, defined, defineProperties, @@ -107,13 +109,8 @@ define([ */ Rectangle.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } - - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.typeOf.object(value, 'value'); + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -136,9 +133,7 @@ define([ */ Rectangle.unpack = function(array, startingIndex, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(array)) { - throw new DeveloperError('array is required'); - } + Check.defined(array, 'array'); //>>includeEnd('debug'); startingIndex = defaultValue(startingIndex, 0); @@ -161,9 +156,7 @@ define([ */ Rectangle.computeWidth = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; var west = rectangle.west; @@ -180,9 +173,7 @@ define([ */ Rectangle.computeHeight = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); return rectangle.north - rectangle.south; }; @@ -227,9 +218,7 @@ define([ */ Rectangle.fromCartographicArray = function(cartographics, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartographics)) { - throw new DeveloperError('cartographics is required.'); - } + Check.defined(cartographics, 'cartographics'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -284,9 +273,7 @@ define([ */ Rectangle.fromCartesianArray = function(cartesians, ellipsoid, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesians)) { - throw new DeveloperError('cartesians is required.'); - } + Check.defined(cartesians, 'cartesians'); //>>includeEnd('debug'); var west = Number.MAX_VALUE; @@ -404,9 +391,7 @@ define([ */ Rectangle.prototype.equalsEpsilon = function(other, epsilon) { //>>includeStart('debug', pragmas.debug); - if (typeof epsilon !== 'number') { - throw new DeveloperError('epsilon is required and must be a number.'); - } + Check.typeOf.number(epsilon, 'epsilon'); //>>includeEnd('debug'); return defined(other) && @@ -428,45 +413,27 @@ define([ */ Rectangle.validate = function(rectangle) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); var north = rectangle.north; - if (typeof north !== 'number') { - throw new DeveloperError('north is required to be a number.'); - } - - if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('north must be in the interval [-Pi/2, Pi/2].'); - } + Check.typeOf.number(north, 'north'); + Check.numeric.minimum(north, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(north, CesiumMath.PI_OVER_TWO); var south = rectangle.south; - if (typeof south !== 'number') { - throw new DeveloperError('south is required to be a number.'); - } - - if (south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { - throw new DeveloperError('south must be in the interval [-Pi/2, Pi/2].'); - } + Check.typeOf.number(south, 'south'); + Check.numeric.minimum(south, -CesiumMath.PI_OVER_TWO); + Check.numeric.maximum(south, CesiumMath.PI_OVER_TWO); var west = rectangle.west; - if (typeof west !== 'number') { - throw new DeveloperError('west is required to be a number.'); - } - - if (west < -Math.PI || west > Math.PI) { - throw new DeveloperError('west must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(west, 'west'); + Check.numeric.minimum(west, -Math.PI); + Check.numeric.maximum(west, Math.PI); var east = rectangle.east; - if (typeof east !== 'number') { - throw new DeveloperError('east is required to be a number.'); - } - - if (east < -Math.PI || east > Math.PI) { - throw new DeveloperError('east must be in the interval [-Pi, Pi].'); - } + Check.typeOf.number(east, 'east'); + Check.numeric.minimum(east, -Math.PI); + Check.numeric.maximum(east, Math.PI); //>>includeEnd('debug'); }; @@ -479,9 +446,7 @@ define([ */ Rectangle.southwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -502,9 +467,7 @@ define([ */ Rectangle.northwest = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -525,9 +488,7 @@ define([ */ Rectangle.northeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -548,9 +509,7 @@ define([ */ Rectangle.southeast = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); if (!defined(result)) { @@ -571,9 +530,7 @@ define([ */ Rectangle.center = function(rectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); var east = rectangle.east; @@ -610,12 +567,8 @@ define([ */ Rectangle.intersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var rectangleEast = rectangle.east; @@ -673,12 +626,8 @@ define([ */ Rectangle.simpleIntersection = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); var west = Math.max(rectangle.west, otherRectangle.west); @@ -711,21 +660,38 @@ define([ */ Rectangle.union = function(rectangle, otherRectangle, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(otherRectangle)) { - throw new DeveloperError('otherRectangle is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(otherRectangle, 'otherRectangle'); //>>includeEnd('debug'); if (!defined(result)) { result = new Rectangle(); } - result.west = Math.min(rectangle.west, otherRectangle.west); + var rectangleEast = rectangle.east; + var rectangleWest = rectangle.west; + + var otherRectangleEast = otherRectangle.east; + var otherRectangleWest = otherRectangle.west; + + if (rectangleEast < rectangleWest && otherRectangleEast > 0.0) { + rectangleEast += CesiumMath.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleEast > 0.0) { + otherRectangleEast += CesiumMath.TWO_PI; + } + + if (rectangleEast < rectangleWest && otherRectangleWest < 0.0) { + otherRectangleWest += CesiumMath.TWO_PI; + } else if (otherRectangleEast < otherRectangleWest && rectangleWest < 0.0) { + rectangleWest += CesiumMath.TWO_PI; + } + + var west = CesiumMath.convertLongitudeRange(Math.min(rectangleWest, otherRectangleWest)); + var east = CesiumMath.convertLongitudeRange(Math.max(rectangleEast, otherRectangleEast)); + + result.west = west; result.south = Math.min(rectangle.south, otherRectangle.south); - result.east = Math.max(rectangle.east, otherRectangle.east); + result.east = east; result.north = Math.max(rectangle.north, otherRectangle.north); return result; @@ -741,12 +707,8 @@ define([ */ Rectangle.expand = function(rectangle, cartographic, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required.'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); if (!defined(result)) { @@ -770,12 +732,8 @@ define([ */ Rectangle.contains = function(rectangle, cartographic) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } - if (!defined(cartographic)) { - throw new DeveloperError('cartographic is required.'); - } + Check.typeOf.object(rectangle, 'rectangle'); + Check.typeOf.object(cartographic, 'cartographic'); //>>includeEnd('debug'); var longitude = cartographic.longitude; @@ -810,9 +768,7 @@ define([ */ Rectangle.subsample = function(rectangle, ellipsoid, surfaceHeight, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(rectangle)) { - throw new DeveloperError('rectangle is required'); - } + Check.typeOf.object(rectangle, 'rectangle'); //>>includeEnd('debug'); ellipsoid = defaultValue(ellipsoid, Ellipsoid.WGS84); diff --git a/Source/Core/RectangleGeometry.js b/Source/Core/RectangleGeometry.js index f69cd251fe5c..4ee7ff3bb69d 100644 --- a/Source/Core/RectangleGeometry.js +++ b/Source/Core/RectangleGeometry.js @@ -330,7 +330,9 @@ define([ return wallTextures; } + var scratchVertexFormat = new VertexFormat(); function constructExtrudedRectangle(options) { + var shadowVolume = options.shadowVolume; var vertexFormat = options.vertexFormat; var surfaceHeight = options.surfaceHeight; var extrudedHeight = options.extrudedHeight; @@ -342,10 +344,15 @@ define([ var ellipsoid = options.ellipsoid; var i; + if (shadowVolume) { + options.vertexFormat = VertexFormat.clone(vertexFormat, scratchVertexFormat); + options.vertexFormat.normal = true; + } var topBottomGeo = constructRectangle(options); if (CesiumMath.equalsEpsilon(minHeight, maxHeight, CesiumMath.EPSILON10)) { return topBottomGeo; } + var topPositions = PolygonPipeline.scaleToGeodeticHeight(topBottomGeo.attributes.position.values, maxHeight, ellipsoid, false); topPositions = new Float64Array(topPositions); var length = topPositions.length; @@ -361,8 +368,9 @@ define([ var binormals = (vertexFormat.binormal) ? new Float32Array(newLength) : undefined; var textures = (vertexFormat.st) ? new Float32Array(newLength/3*2) : undefined; var topSt; + var topNormals; if (vertexFormat.normal) { - var topNormals = topBottomGeo.attributes.normal.values; + topNormals = topBottomGeo.attributes.normal.values; normals.set(topNormals); for (i = 0; i < length; i ++) { topNormals[i] = -topNormals[i]; @@ -370,6 +378,23 @@ define([ normals.set(topNormals, length); topBottomGeo.attributes.normal.values = normals; } + if (shadowVolume) { + topNormals = topBottomGeo.attributes.normal.values; + if (!vertexFormat.normal) { + topBottomGeo.attributes.normal = undefined; + } + var extrudeNormals = new Float32Array(newLength); + for (i = 0; i < length; i ++) { + topNormals[i] = -topNormals[i]; + } + extrudeNormals.set(topNormals, length); //only get normals for bottom layer that's going to be pushed down + topBottomGeo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : extrudeNormals + }); + } + if (vertexFormat.tangent) { var topTangents = topBottomGeo.attributes.tangent.values; tangents.set(topTangents); @@ -408,45 +433,76 @@ define([ var wallCount = (perimeterPositions + 4) * 2; var wallPositions = new Float64Array(wallCount * 3); + var wallExtrudeNormals = shadowVolume ? new Float32Array(wallCount * 3) : undefined; var wallTextures = (vertexFormat.st) ? new Float32Array(wallCount * 2) : undefined; var posIndex = 0; var stIndex = 0; + var extrudeNormalIndex = 0; var area = width * height; + var threeI; for (i = 0; i < area; i+=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-width; i < area; i++) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = area-1; i > 0; i-=width) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } for (i = width-1; i >= 0; i--) { - wallPositions = addWallPositions(wallPositions, posIndex, i*3, topPositions, bottomPositions); + threeI = i * 3; + wallPositions = addWallPositions(wallPositions, posIndex, threeI, topPositions, bottomPositions); posIndex += 6; if (vertexFormat.st) { wallTextures = addWallTextureCoordinates(wallTextures, stIndex, i*2, topSt); stIndex += 4; } + if (shadowVolume) { + extrudeNormalIndex += 3; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 1]; + wallExtrudeNormals[extrudeNormalIndex++] = topNormals[threeI + 2]; + } } var geo = calculateAttributesWall(wallPositions, vertexFormat, ellipsoid); @@ -458,6 +514,13 @@ define([ values : wallTextures }); } + if (shadowVolume) { + geo.attributes.extrudeDirection = new GeometryAttribute({ + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3, + values : wallExtrudeNormals + }); + } var wallIndices = IndexDatatype.createTypedArray(wallCount, perimeterPositions * 6); @@ -582,16 +645,6 @@ define([ options = defaultValue(options, defaultValue.EMPTY_OBJECT); var rectangle = options.rectangle; - var granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); - var ellipsoid = defaultValue(options.ellipsoid, Ellipsoid.WGS84); - var surfaceHeight = defaultValue(options.height, 0.0); - var rotation = defaultValue(options.rotation, 0.0); - var stRotation = defaultValue(options.stRotation, 0.0); - var vertexFormat = defaultValue(options.vertexFormat, VertexFormat.DEFAULT); - var extrudedHeight = options.extrudedHeight; - var extrude = defined(extrudedHeight); - var closeTop = defaultValue(options.closeTop, true); - var closeBottom = defaultValue(options.closeBottom, true); //>>includeStart('debug', pragmas.debug); if (!defined(rectangle)) { @@ -603,17 +656,19 @@ define([ } //>>includeEnd('debug'); + var rotation = defaultValue(options.rotation, 0.0); this._rectangle = rectangle; - this._granularity = granularity; - this._ellipsoid = Ellipsoid.clone(ellipsoid); - this._surfaceHeight = surfaceHeight; + this._granularity = defaultValue(options.granularity, CesiumMath.RADIANS_PER_DEGREE); + this._ellipsoid = Ellipsoid.clone(defaultValue(options.ellipsoid, Ellipsoid.WGS84)); + this._surfaceHeight = defaultValue(options.height, 0.0); this._rotation = rotation; - this._stRotation = stRotation; - this._vertexFormat = VertexFormat.clone(vertexFormat); - this._extrudedHeight = defaultValue(extrudedHeight, 0.0); - this._extrude = extrude; - this._closeTop = closeTop; - this._closeBottom = closeBottom; + this._stRotation = defaultValue(options.stRotation, 0.0); + this._vertexFormat = VertexFormat.clone(defaultValue(options.vertexFormat, VertexFormat.DEFAULT)); + this._extrudedHeight = defaultValue(options.extrudedHeight, 0.0); + this._extrude = defined(options.extrudedHeight); + this._closeTop = defaultValue(options.closeTop, true); + this._closeBottom = defaultValue(options.closeBottom, true); + this._shadowVolume = defaultValue(options.shadowVolume, false); this._workerName = 'createRectangleGeometry'; this._rotatedRectangle = computeRectangle(this._rectangle, this._ellipsoid, rotation); } @@ -622,7 +677,7 @@ define([ * The number of elements used to pack the object into an array. * @type {Number} */ - RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 8; + RectangleGeometry.packedLength = Rectangle.packedLength + Ellipsoid.packedLength + VertexFormat.packedLength + Rectangle.packedLength + 9; /** * Stores the provided instance into the provided array. @@ -665,7 +720,8 @@ define([ array[startingIndex++] = value._extrudedHeight; array[startingIndex++] = value._extrude ? 1.0 : 0.0; array[startingIndex++] = value._closeTop ? 1.0 : 0.0; - array[startingIndex] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex++] = value._closeBottom ? 1.0 : 0.0; + array[startingIndex] = value._shadowVolume ? 1.0 : 0.0; return array; }; @@ -673,7 +729,6 @@ define([ var scratchRectangle = new Rectangle(); var scratchRotatedRectangle = new Rectangle(); var scratchEllipsoid = Ellipsoid.clone(Ellipsoid.UNIT_SPHERE); - var scratchVertexFormat = new VertexFormat(); var scratchOptions = { rectangle : scratchRectangle, ellipsoid : scratchEllipsoid, @@ -684,7 +739,8 @@ define([ stRotation : undefined, extrudedHeight : undefined, closeTop : undefined, - closeBottom : undefined + closeBottom : undefined, + shadowVolume: undefined }; /** @@ -723,7 +779,8 @@ define([ var extrudedHeight = array[startingIndex++]; var extrude = array[startingIndex++] === 1.0; var closeTop = array[startingIndex++] === 1.0; - var closeBottom = array[startingIndex] === 1.0; + var closeBottom = array[startingIndex++] === 1.0; + var shadowVolume = array[startingIndex] === 1.0; if (!defined(result)) { scratchOptions.granularity = granularity; @@ -733,6 +790,7 @@ define([ scratchOptions.extrudedHeight = extrude ? extrudedHeight : undefined; scratchOptions.closeTop = closeTop; scratchOptions.closeBottom = closeBottom; + scratchOptions.shadowVolume = shadowVolume; return new RectangleGeometry(scratchOptions); } @@ -748,13 +806,14 @@ define([ result._closeTop = closeTop; result._closeBottom = closeBottom; result._rotatedRectangle = rotatedRectangle; + result._shadowVolume = shadowVolume; return result; }; - var textureMatrixScratch = new Matrix2(); var tangentRotationMatrixScratch = new Matrix3(); var nwScratch = new Cartographic(); + var stNwScratch = new Cartographic(); var quaternionScratch = new Quaternion(); var centerScratch = new Cartographic(); /** @@ -776,30 +835,27 @@ define([ var surfaceHeight = rectangleGeometry._surfaceHeight; var extrude = rectangleGeometry._extrude; var extrudedHeight = rectangleGeometry._extrudedHeight; + var rotation = rectangleGeometry._rotation; var stRotation = rectangleGeometry._stRotation; var vertexFormat = rectangleGeometry._vertexFormat; - var options = RectangleGeometryLibrary.computeOptions(rectangleGeometry, rectangle, nwScratch); + var options = RectangleGeometryLibrary.computeOptions(rectangleGeometry, rectangle, nwScratch, stNwScratch); - var textureMatrix = textureMatrixScratch; var tangentRotationMatrix = tangentRotationMatrixScratch; - if (defined(stRotation)) { - // negate angle for a counter-clockwise rotation - Matrix2.fromRotation(-stRotation, textureMatrix); + if (stRotation !== 0 || rotation !== 0) { var center = Rectangle.center(rectangle, centerScratch); - var axis = ellipsoid.cartographicToCartesian(center, v1Scratch); - Cartesian3.normalize(axis, axis); + var axis = ellipsoid.geodeticSurfaceNormalCartographic(center, v1Scratch); Quaternion.fromAxisAngle(axis, -stRotation, quaternionScratch); Matrix3.fromQuaternion(quaternionScratch, tangentRotationMatrix); } else { - Matrix2.clone(Matrix2.IDENTITY, textureMatrix); Matrix3.clone(Matrix3.IDENTITY, tangentRotationMatrix); } - options.lonScalar = 1.0 / rectangle.width; - options.latScalar = 1.0 / rectangle.height; + options.lonScalar = 1.0 / rectangleGeometry._rectangle.width; + options.latScalar = 1.0 / rectangleGeometry._rectangle.height; options.vertexFormat = vertexFormat; - options.textureMatrix = textureMatrix; + options.rotation = rotation; + options.stRotation = stRotation; options.tangentRotationMatrix = tangentRotationMatrix; options.size = options.width * options.height; @@ -807,6 +863,7 @@ define([ var boundingSphere; rectangle = rectangleGeometry._rectangle; if (extrude) { + options.shadowVolume = rectangleGeometry._shadowVolume; geometry = constructExtrudedRectangle(options); var topBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, surfaceHeight, topBoundingSphere); var bottomBS = BoundingSphere.fromRectangle3D(rectangle, ellipsoid, extrudedHeight, bottomBoundingSphere); @@ -822,7 +879,7 @@ define([ } return new Geometry({ - attributes : new GeometryAttributes(geometry.attributes), + attributes : geometry.attributes, indices : geometry.indices, primitiveType : geometry.primitiveType, boundingSphere : boundingSphere @@ -850,7 +907,8 @@ define([ height : minHeight, closeTop : true, closeBottom : true, - vertexFormat : VertexFormat.POSITION_ONLY + vertexFormat : VertexFormat.POSITION_ONLY, + shadowVolume: true }); }; diff --git a/Source/Core/RectangleGeometryLibrary.js b/Source/Core/RectangleGeometryLibrary.js index e1c30e46a9ac..6f7ef2cb8e51 100644 --- a/Source/Core/RectangleGeometryLibrary.js +++ b/Source/Core/RectangleGeometryLibrary.js @@ -1,22 +1,22 @@ /*global define*/ define([ - './Cartesian3', - './Cartographic', - './defined', - './DeveloperError', - './GeographicProjection', - './Math', - './Matrix2', - './Rectangle' - ], function( - Cartesian3, - Cartographic, - defined, - DeveloperError, - GeographicProjection, - CesiumMath, - Matrix2, - Rectangle) { + './Cartesian3', + './Cartographic', + './defined', + './DeveloperError', + './GeographicProjection', + './Math', + './Matrix2', + './Rectangle' +], function( + Cartesian3, + Cartographic, + defined, + DeveloperError, + GeographicProjection, + CesiumMath, + Matrix2, + Rectangle) { 'use strict'; var cos = Math.cos; @@ -55,10 +55,17 @@ define([ position.z = kZ / gamma; if (defined(options.vertexFormat) && options.vertexFormat.st) { - st.x = (stLongitude - rectangle.west) * options.lonScalar; - st.y = (stLatitude - rectangle.south) * options.latScalar; - - Matrix2.multiplyByVector(options.textureMatrix, st, st); + var stNwCorner = options.stNwCorner; + if (defined(stNwCorner)) { + stLatitude = stNwCorner.latitude - options.stGranYCos * row + col * options.stGranXSin; + stLongitude = stNwCorner.longitude + row * options.stGranYSin + col * options.stGranXCos; + + st.x = (stLongitude - options.stWest) * options.lonScalar; + st.y = (stLatitude - options.stSouth) * options.latScalar; + } else { + st.x = (stLongitude - rectangle.west) * options.lonScalar; + st.y = (stLatitude - rectangle.south) * options.latScalar; + } } }; @@ -67,14 +74,65 @@ define([ var centerScratch = new Cartographic(); var centerCartesian = new Cartesian3(); var proj = new GeographicProjection(); + + function getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height) { + var cosRotation = Math.cos(rotation); + var granYCos = granularityY * cosRotation; + var granXCos = granularityX * cosRotation; + + var sinRotation = Math.sin(rotation); + var granYSin = granularityY * sinRotation; + var granXSin = granularityX * sinRotation; + + nwCartesian = proj.project(nwCorner, nwCartesian); + + nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); + var rotationMatrix = Matrix2.fromRotation(rotation, rotationMatrixScratch); + nwCartesian = Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian); + nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); + nwCorner = proj.unproject(nwCartesian, nwCorner); + + width -= 1; + height -= 1; + + var latitude = nwCorner.latitude; + var latitude0 = latitude + width * granXSin; + var latitude1 = latitude - granYCos * height; + var latitude2 = latitude - granYCos * height + width * granXSin; + + var north = Math.max(latitude, latitude0, latitude1, latitude2); + var south = Math.min(latitude, latitude0, latitude1, latitude2); + + var longitude = nwCorner.longitude; + var longitude0 = longitude + width * granXCos; + var longitude1 = longitude + height * granYSin; + var longitude2 = longitude + height * granYSin + width * granXCos; + + var east = Math.max(longitude, longitude0, longitude1, longitude2); + var west = Math.min(longitude, longitude0, longitude1, longitude2); + + return { + north: north, + south: south, + east: east, + west: west, + granYCos : granYCos, + granYSin : granYSin, + granXCos : granXCos, + granXSin : granXSin, + nwCorner : nwCorner + }; + } + /** * @private */ - RectangleGeometryLibrary.computeOptions = function(geometry, rectangle, nwCorner) { + RectangleGeometryLibrary.computeOptions = function(geometry, rectangle, nwCorner, stNwCorner) { var granularity = geometry._granularity; var ellipsoid = geometry._ellipsoid; var surfaceHeight = geometry._surfaceHeight; var rotation = geometry._rotation; + var stRotation = geometry._stRotation; var extrudedHeight = geometry._extrudedHeight; var east = rectangle.east; var west = rectangle.west; @@ -103,76 +161,73 @@ define([ nwCorner = Rectangle.northwest(rectangle, nwCorner); var center = Rectangle.center(rectangle, centerScratch); - - var granYCos = granularityY; - var granXCos = granularityX; - var granYSin = 0.0; - var granXSin = 0.0; - - if (defined(rotation) && rotation !== 0) { - var cosRotation = Math.cos(rotation); - granYCos *= cosRotation; - granXCos *= cosRotation; - - var sinRotation = Math.sin(rotation); - granYSin = granularityY * sinRotation; - granXSin = granularityX * sinRotation; - + if (rotation !== 0 || stRotation !== 0) { if (center.longitude < nwCorner.longitude) { center.longitude += CesiumMath.TWO_PI; } - - nwCartesian = proj.project(nwCorner, nwCartesian); centerCartesian = proj.project(center, centerCartesian); + } - nwCartesian = Cartesian3.subtract(nwCartesian, centerCartesian, nwCartesian); - var rotationMatrix = Matrix2.fromRotation(rotation, rotationMatrixScratch); - nwCartesian = Matrix2.multiplyByVector(rotationMatrix, nwCartesian, nwCartesian); - nwCartesian = Cartesian3.add(nwCartesian, centerCartesian, nwCartesian); - nwCorner = proj.unproject(nwCartesian, nwCorner); - - var latitude = nwCorner.latitude; - var latitude0 = latitude + (width - 1) * granXSin; - var latitude1 = latitude - granYCos * (height - 1); - var latitude2 = latitude - granYCos * (height - 1) + (width - 1) * granXSin; - - north = Math.max(latitude, latitude0, latitude1, latitude2); - south = Math.min(latitude, latitude0, latitude1, latitude2); + var granYCos = granularityY; + var granXCos = granularityX; + var granYSin = 0.0; + var granXSin = 0.0; - var longitude = nwCorner.longitude; - var longitude0 = longitude + (width - 1) * granXCos; - var longitude1 = longitude + (height - 1) * granYSin; - var longitude2 = longitude + (height - 1) * granYSin + (width - 1) * granXCos; + var options = { + granYCos : granYCos, + granYSin : granYSin, + granXCos : granXCos, + granXSin : granXSin, + ellipsoid : ellipsoid, + surfaceHeight : surfaceHeight, + extrudedHeight : extrudedHeight, + nwCorner : nwCorner, + rectangle : rectangle, + width: width, + height: height + }; - east = Math.max(longitude, longitude0, longitude1, longitude2); - west = Math.min(longitude, longitude0, longitude1, longitude2); + if (rotation !== 0) { + var rotationOptions = getRotationOptions(nwCorner, rotation, granularityX, granularityY, center, width, height); + north = rotationOptions.north; + south = rotationOptions.south; + east = rotationOptions.east; + west = rotationOptions.west; //>>includeStart('debug', pragmas.debug); if (north < -CesiumMath.PI_OVER_TWO || north > CesiumMath.PI_OVER_TWO || - south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { + south < -CesiumMath.PI_OVER_TWO || south > CesiumMath.PI_OVER_TWO) { throw new DeveloperError('Rotated rectangle is invalid. It crosses over either the north or south pole.'); } //>>includeEnd('debug') + options.granYCos = rotationOptions.granYCos; + options.granYSin = rotationOptions.granYSin; + options.granXCos = rotationOptions.granXCos; + options.granXSin = rotationOptions.granXSin; + rectangle.north = north; rectangle.south = south; rectangle.east = east; rectangle.west = west; } - return { - granYCos : granYCos, - granYSin : granYSin, - granXCos : granXCos, - granXSin : granXSin, - ellipsoid : ellipsoid, - width : width, - height : height, - surfaceHeight : surfaceHeight, - extrudedHeight : extrudedHeight, - nwCorner: nwCorner, - rectangle: rectangle - }; + if (stRotation !== 0) { + rotation = rotation - stRotation; + stNwCorner = Rectangle.northwest(rectangle, stNwCorner); + + var stRotationOptions = getRotationOptions(stNwCorner, rotation, granularityX, granularityY, center, width, height); + + options.stGranYCos = stRotationOptions.granYCos; + options.stGranXCos = stRotationOptions.granXCos; + options.stGranYSin = stRotationOptions.granYSin; + options.stGranXSin = stRotationOptions.granXSin; + options.stNwCorner = stNwCorner; + options.stWest = stRotationOptions.west; + options.stSouth = stRotationOptions.south; + } + + return options; }; return RectangleGeometryLibrary; diff --git a/Source/Core/RequestScheduler.js b/Source/Core/RequestScheduler.js index 349043feb98c..5079517959ec 100644 --- a/Source/Core/RequestScheduler.js +++ b/Source/Core/RequestScheduler.js @@ -218,7 +218,6 @@ define([ * Checks if there are available slots to make a request, considering the total * number of available slots across all servers. * - * @param {String} [url] The url to check. * @returns {Boolean} Returns true if there are available slots, otherwise false. */ RequestScheduler.hasAvailableRequests = function() { diff --git a/Source/Core/Simon1994PlanetaryPositions.js b/Source/Core/Simon1994PlanetaryPositions.js index 84cc17a037c3..1a824012333e 100644 --- a/Source/Core/Simon1994PlanetaryPositions.js +++ b/Source/Core/Simon1994PlanetaryPositions.js @@ -509,9 +509,9 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated sun position */ - Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeSunPositionInEarthInertialFrame= function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } if (!defined(result)) { @@ -519,11 +519,11 @@ define([ } //first forward transformation - translation = computeSimonEarthMoonBarycenter(date, translation); + translation = computeSimonEarthMoonBarycenter(julianDate, translation); result = Cartesian3.negate(translation, result); //second forward transformation - computeSimonEarth(date, translation); + computeSimonEarth(julianDate, translation); Cartesian3.subtract(result, translation, result); Matrix3.multiplyByVector(axesTransformation, result, result); @@ -538,12 +538,12 @@ define([ * @param {Cartesian3} [result] The object onto which to store the result. * @returns {Cartesian3} Calculated moon position */ - Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(date, result){ - if (!defined(date)) { - date = JulianDate.now(); + Simon1994PlanetaryPositions.computeMoonPositionInEarthInertialFrame = function(julianDate, result){ + if (!defined(julianDate)) { + julianDate = JulianDate.now(); } - result = computeSimonMoon(date, result); + result = computeSimonMoon(julianDate, result); Matrix3.multiplyByVector(axesTransformation, result, result); return result; diff --git a/Source/Core/SphereGeometry.js b/Source/Core/SphereGeometry.js index 4e8ac00ca349..a05f58a854a4 100644 --- a/Source/Core/SphereGeometry.js +++ b/Source/Core/SphereGeometry.js @@ -1,6 +1,7 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', @@ -8,6 +9,7 @@ define([ './VertexFormat' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -70,9 +72,7 @@ define([ */ SphereGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidGeometry.pack(value._ellipsoidGeometry, array, startingIndex); diff --git a/Source/Core/SphereOutlineGeometry.js b/Source/Core/SphereOutlineGeometry.js index 1d1a627d19fa..e74f9961e727 100644 --- a/Source/Core/SphereOutlineGeometry.js +++ b/Source/Core/SphereOutlineGeometry.js @@ -1,12 +1,14 @@ /*global define*/ define([ './Cartesian3', + './Check', './defaultValue', './defined', './DeveloperError', './EllipsoidOutlineGeometry' ], function( Cartesian3, + Check, defaultValue, defined, DeveloperError, @@ -68,9 +70,7 @@ define([ */ SphereOutlineGeometry.pack = function(value, array, startingIndex) { //>>includeStart('debug', pragmas.debug); - if (!defined(value)) { - throw new DeveloperError('value is required'); - } + Check.typeOf.object(value, 'value'); //>>includeEnd('debug'); return EllipsoidOutlineGeometry.pack(value._ellipsoidGeometry, array, startingIndex); diff --git a/Source/Core/Spherical.js b/Source/Core/Spherical.js index 0222c247a6cb..b87c7c9466e7 100644 --- a/Source/Core/Spherical.js +++ b/Source/Core/Spherical.js @@ -1,9 +1,11 @@ /*global define*/ define([ + './Check', './defaultValue', './defined', './DeveloperError' ], function( + Check, defaultValue, defined, DeveloperError) { @@ -29,14 +31,12 @@ define([ * Converts the provided Cartesian3 into Spherical coordinates. * * @param {Cartesian3} cartesian3 The Cartesian3 to be converted to Spherical. - * @param {Spherical} [spherical] The object in which the result will be stored, if undefined a new instance will be created. + * @param {Spherical} [result] The object in which the result will be stored, if undefined a new instance will be created. * @returns {Spherical} The modified result parameter, or a new instance if one was not provided. */ Spherical.fromCartesian3 = function(cartesian3, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(cartesian3)) { - throw new DeveloperError('cartesian3 is required'); - } + Check.typeOf.object(cartesian3, 'cartesian3'); //>>includeEnd('debug'); var x = cartesian3.x; @@ -85,9 +85,7 @@ define([ */ Spherical.normalize = function(spherical, result) { //>>includeStart('debug', pragmas.debug); - if (!defined(spherical)) { - throw new DeveloperError('spherical is required'); - } + Check.typeOf.object(spherical, 'spherical'); //>>includeEnd('debug'); if (!defined(result)) { diff --git a/Source/Core/TaskProcessor.js b/Source/Core/TaskProcessor.js index 2beefbcac620..0a7edeb4220c 100644 --- a/Source/Core/TaskProcessor.js +++ b/Source/Core/TaskProcessor.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../ThirdParty/Uri', '../ThirdParty/when', './buildModuleUrl', './defaultValue', @@ -12,7 +11,6 @@ define([ './RuntimeError', 'require' ], function( - Uri, when, buildModuleUrl, defaultValue, diff --git a/Source/Core/TerrainEncoding.js b/Source/Core/TerrainEncoding.js index 9241995d44e0..9b91b0f1c9e9 100644 --- a/Source/Core/TerrainEncoding.js +++ b/Source/Core/TerrainEncoding.js @@ -7,7 +7,6 @@ define([ './defaultValue', './defined', './Math', - './Matrix3', './Matrix4', './TerrainQuantization' ], function( @@ -18,7 +17,6 @@ define([ defaultValue, defined, CesiumMath, - Matrix3, Matrix4, TerrainQuantization) { 'use strict'; diff --git a/Source/Core/TerrainMesh.js b/Source/Core/TerrainMesh.js index d49c8c11c1a9..4c25c7990ecf 100644 --- a/Source/Core/TerrainMesh.js +++ b/Source/Core/TerrainMesh.js @@ -1,6 +1,6 @@ /*global define*/ define([ - '../Core/defaultValue' + './defaultValue' ], function( defaultValue) { 'use strict'; @@ -27,6 +27,7 @@ define([ * @param {Number} [vertexStride=6] The number of components in each vertex. * @param {OrientedBoundingBox} [orientedBoundingBox] A bounding box that completely contains the tile. * @param {TerrainEncoding} encoding Information used to decode the mesh. + * @param {Number} exaggeration The amount that this mesh was exaggerated. * * @private */ diff --git a/Source/Core/TimeIntervalCollection.js b/Source/Core/TimeIntervalCollection.js index bc1c79ebbd38..0dd6e21784aa 100644 --- a/Source/Core/TimeIntervalCollection.js +++ b/Source/Core/TimeIntervalCollection.js @@ -217,8 +217,8 @@ define([ * @param {JulianDate} julianDate The date to check. * @returns {Boolean} true if the collection contains the specified date, false otherwise. */ - TimeIntervalCollection.prototype.contains = function(date) { - return this.indexOf(date) >= 0; + TimeIntervalCollection.prototype.contains = function(julianDate) { + return this.indexOf(julianDate) >= 0; }; var indexOfScratch = new TimeInterval(); diff --git a/Source/Core/Transforms.js b/Source/Core/Transforms.js index b02cd3eb6af2..b9ebfef6f1ff 100644 --- a/Source/Core/Transforms.js +++ b/Source/Core/Transforms.js @@ -5,9 +5,9 @@ define([ './Cartesian3', './Cartesian4', './Cartographic', + './Check', './defaultValue', './defined', - './deprecationWarning', './DeveloperError', './EarthOrientationParameters', './EarthOrientationParametersSample', @@ -27,9 +27,9 @@ define([ Cartesian3, Cartesian4, Cartographic, + Check, defaultValue, defined, - deprecationWarning, DeveloperError, EarthOrientationParameters, EarthOrientationParametersSample, @@ -473,19 +473,12 @@ define([ * var hpr = new Cesium.HeadingPitchRoll(heading, pitch, roll); * var transform = Cesium.Transforms.headingPitchRollToFixedFrame(center, hpr); */ - Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var heading; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignments to encourage JIT optimization. - ellipsoid = pitch; - result = roll; - heading = headingPitchRoll.heading; - pitch = headingPitchRoll.pitch; - roll = headingPitchRoll.roll; - } else { - deprecationWarning('headingPitchRollToFixedFrame', 'headingPitchRollToFixedFrame with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - heading = headingPitchRoll; - } + Transforms.headingPitchRollToFixedFrame = function(origin, headingPitchRoll, ellipsoid, result) { + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var heading = headingPitchRoll.heading; + var pitch = headingPitchRoll.pitch; + var roll = headingPitchRoll.roll; + // checks for required parameters happen in the called functions var hprQuaternion = Quaternion.fromHeadingPitchRoll(heading, pitch, roll, scratchHPRQuaternion); var hprMatrix = Matrix4.fromTranslationQuaternionRotationScale(Cartesian3.ZERO, hprQuaternion, scratchScale, scratchHPRMatrix4); @@ -493,7 +486,6 @@ define([ return Matrix4.multiply(result, hprMatrix, result); }; - var scratchHPR = new HeadingPitchRoll(); var scratchENUMatrix4 = new Matrix4(); var scratchHPRMatrix3 = new Matrix3(); @@ -518,22 +510,10 @@ define([ * var hpr = new HeadingPitchRoll(heading, pitch, roll); * var quaternion = Cesium.Transforms.headingPitchRollQuaternion(center, hpr); */ - Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, pitch, roll, ellipsoid, result) { - var hpr; - if (typeof headingPitchRoll === 'object') { - // Shift arguments using assignment to encourage JIT optimization. - hpr = headingPitchRoll; - ellipsoid = pitch; - result = roll; - } else { - deprecationWarning('headingPitchRollQuaternion', 'headingPitchRollQuaternion with separate heading, pitch, and roll arguments was deprecated in 1.27. It will be removed in 1.30. Use a HeadingPitchRoll object.'); - scratchHPR.heading = headingPitchRoll; - scratchHPR.pitch = pitch; - scratchHPR.roll = roll; - hpr = scratchHPR; - } + Transforms.headingPitchRollQuaternion = function(origin, headingPitchRoll, ellipsoid, result) { // checks for required parameters happen in the called functions - var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, ellipsoid, scratchENUMatrix4); + Check.typeOf.object(headingPitchRoll, 'headingPitchRoll'); + var transform = Transforms.headingPitchRollToFixedFrame(origin, headingPitchRoll, ellipsoid, scratchENUMatrix4); var rotation = Matrix4.getRotation(transform, scratchHPRMatrix3); return Quaternion.fromRotationMatrix(rotation, result); }; diff --git a/Source/Core/TranslationRotationScale.js b/Source/Core/TranslationRotationScale.js index bfbaff72d63a..dea95c42570e 100644 --- a/Source/Core/TranslationRotationScale.js +++ b/Source/Core/TranslationRotationScale.js @@ -3,13 +3,11 @@ define([ './Cartesian3', './defaultValue', './defined', - './Matrix4', './Quaternion' ], function( Cartesian3, defaultValue, defined, - Matrix4, Quaternion) { 'use strict'; diff --git a/Source/Core/TrustedServers.js b/Source/Core/TrustedServers.js index cc538ad2241c..027903d86a2b 100644 --- a/Source/Core/TrustedServers.js +++ b/Source/Core/TrustedServers.js @@ -1,14 +1,12 @@ /*global define*/ define([ - './defined', - './defineProperties', - './DeveloperError', - '../ThirdParty/Uri' -], function( - defined, - defineProperties, - DeveloperError, - Uri) { + '../ThirdParty/Uri', + './defined', + './DeveloperError' + ], function( + Uri, + defined, + DeveloperError) { 'use strict'; /** diff --git a/Source/Core/VertexFormat.js b/Source/Core/VertexFormat.js index a1709d6c3206..50a8a0c835b2 100644 --- a/Source/Core/VertexFormat.js +++ b/Source/Core/VertexFormat.js @@ -285,7 +285,7 @@ define([ /** * Duplicates a VertexFormat instance. * - * @param {VertexFormat} cartesian The vertex format to duplicate. + * @param {VertexFormat} vertexFormat The vertex format to duplicate. * @param {VertexFormat} [result] The object onto which to store the result. * @returns {VertexFormat} The modified result parameter or a new VertexFormat instance if one was not provided. (Returns undefined if vertexFormat is undefined) */ diff --git a/Source/Core/VideoSynchronizer.js b/Source/Core/VideoSynchronizer.js index 764753983f14..0f16ff61dbc6 100644 --- a/Source/Core/VideoSynchronizer.js +++ b/Source/Core/VideoSynchronizer.js @@ -4,8 +4,6 @@ define([ './defined', './defineProperties', './destroyObject', - './DeveloperError', - './Event', './Iso8601', './JulianDate' ], function( @@ -13,8 +11,6 @@ define([ defined, defineProperties, destroyObject, - DeveloperError, - Event, Iso8601, JulianDate) { 'use strict'; diff --git a/Source/Renderer/WebGLConstants.js b/Source/Core/WebGLConstants.js similarity index 94% rename from Source/Renderer/WebGLConstants.js rename to Source/Core/WebGLConstants.js index 0ed4c4540891..73bcff7bae74 100644 --- a/Source/Renderer/WebGLConstants.js +++ b/Source/Core/WebGLConstants.js @@ -1,17 +1,20 @@ /*global define*/ define([ - '../Core/freezeObject' + './freezeObject' ], function( freezeObject) { 'use strict'; /** - * WebGL constants. + * Enum containing WebGL Constant values by name. + * for use without an active WebGL context, or in cases where certain constants are unavailable using the WebGL context + * (For example, in [Safari 9]{@link https://github.com/AnalyticalGraphicsInc/cesium/issues/2989}). * - * This file provides a workaround for Safari 9 where WebGL constants can't be accessed - * through WebGLRenderingContext. See https://github.com/AnalyticalGraphicsInc/cesium/issues/2989 + * These match the constants from the [WebGL 1.0]{@link https://www.khronos.org/registry/webgl/specs/latest/1.0/} + * and [WebGL 2.0]{@link https://www.khronos.org/registry/webgl/specs/latest/2.0/} + * specifications. * - * @private + * @exports WebGLConstants */ var WebGLConstants = { DEPTH_BUFFER_BIT : 0x00000100, @@ -312,6 +315,21 @@ define([ UNPACK_COLORSPACE_CONVERSION_WEBGL : 0x9243, BROWSER_DEFAULT_WEBGL : 0x9244, + // WEBGL_compressed_texture_s3tc + COMPRESSED_RGB_S3TC_DXT1_EXT : 0x83F0, + COMPRESSED_RGBA_S3TC_DXT1_EXT : 0x83F1, + COMPRESSED_RGBA_S3TC_DXT3_EXT : 0x83F2, + COMPRESSED_RGBA_S3TC_DXT5_EXT : 0x83F3, + + // WEBGL_compressed_texture_pvrtc + COMPRESSED_RGB_PVRTC_4BPPV1_IMG : 0x8C00, + COMPRESSED_RGB_PVRTC_2BPPV1_IMG : 0x8C01, + COMPRESSED_RGBA_PVRTC_4BPPV1_IMG : 0x8C02, + COMPRESSED_RGBA_PVRTC_2BPPV1_IMG : 0x8C03, + + // WEBGL_compressed_texture_etc1 + COMPRESSED_RGB_ETC1_WEBGL : 0x8D64, + // Desktop OpenGL DOUBLE : 0x140A, diff --git a/Source/Core/WindingOrder.js b/Source/Core/WindingOrder.js index b64d6463d357..06999e6a24c2 100644 --- a/Source/Core/WindingOrder.js +++ b/Source/Core/WindingOrder.js @@ -1,10 +1,10 @@ /*global define*/ define([ - '../Renderer/WebGLConstants', - './freezeObject' + './freezeObject', + './WebGLConstants' ], function( - WebGLConstants, - freezeObject) { + freezeObject, + WebGLConstants) { 'use strict'; /** diff --git a/Source/Core/arrayFill.js b/Source/Core/arrayFill.js index 9d2f292c9a30..5670cc554a80 100644 --- a/Source/Core/arrayFill.js +++ b/Source/Core/arrayFill.js @@ -1,12 +1,12 @@ /*global define*/ define([ - './DeveloperError', './defaultValue', - './defined' + './defined', + './DeveloperError' ], function( - DeveloperError, defaultValue, - defined) { + defined, + DeveloperError) { 'use strict'; /** diff --git a/Source/Core/getImagePixels.js b/Source/Core/getImagePixels.js index f728c81cb164..e65f025eec84 100644 --- a/Source/Core/getImagePixels.js +++ b/Source/Core/getImagePixels.js @@ -14,6 +14,8 @@ define([ * @exports getImagePixels * * @param {Image} image The image to extract pixels from. + * @param {Number} width The width of the image. If not defined, then image.width is assigned. + * @param {Number} height The height of the image. If not defined, then image.height is assigned. * @returns {CanvasPixelArray} The pixels of the image. */ function getImagePixels(image, width, height) { diff --git a/Source/Core/getMagic.js b/Source/Core/getMagic.js index 1bb172764248..ca6905108e40 100644 --- a/Source/Core/getMagic.js +++ b/Source/Core/getMagic.js @@ -1,7 +1,7 @@ /*global define*/ define([ - '../Core/defaultValue', - '../Core/getStringFromTypedArray' + './defaultValue', + './getStringFromTypedArray' ], function( defaultValue, getStringFromTypedArray) { diff --git a/Source/Core/loadCRN.js b/Source/Core/loadCRN.js new file mode 100644 index 000000000000..f50ebefbfb38 --- /dev/null +++ b/Source/Core/loadCRN.js @@ -0,0 +1,84 @@ +/*global define*/ +define([ + './CompressedTextureBuffer', + './defined', + './DeveloperError', + './loadArrayBuffer', + './TaskProcessor', + '../ThirdParty/when' +], function( + CompressedTextureBuffer, + defined, + DeveloperError, + loadArrayBuffer, + TaskProcessor, + when) { + 'use strict'; + + var transcodeTaskProcessor = new TaskProcessor('transcodeCRNToDXT', Number.POSITIVE_INFINITY); + + /** + * Asynchronously loads and parses the given URL to a CRN file or parses the raw binary data of a CRN file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + * + * @exports loadCRN + * + * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. + * @param {Object} [headers] HTTP headers to send with the requests. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * + * @exception {RuntimeError} Unsupported compressed format. + * + * @example + * // load a single URL asynchronously + * Cesium.loadCRN('some/url').then(function(textureData) { + * var width = textureData.width; + * var height = textureData.height; + * var format = textureData.internalFormat; + * var arrayBufferView = textureData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * @see {@link https://github.com/BinomialLLC/crunch|crunch DXTc texture compression and transcoding library} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} + */ + function loadCRN(urlOrBuffer, headers) { + //>>includeStart('debug', pragmas.debug); + if (!defined(urlOrBuffer)) { + throw new DeveloperError('urlOrBuffer is required.'); + } + //>>includeEnd('debug'); + + var loadPromise; + if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { + loadPromise = when.resolve(urlOrBuffer); + } else { + loadPromise = loadArrayBuffer(urlOrBuffer, headers); + } + + return loadPromise.then(function(data) { + var transferrableObjects = []; + if (data instanceof ArrayBuffer) { + transferrableObjects.push(data); + } else if (data.byteOffset === 0 && data.byteLength === data.buffer.byteLength) { + transferrableObjects.push(data.buffer); + } else { + // data is a view of an array buffer. need to copy so it is transferrable to web worker + data = data.slice(0, data.length); + transferrableObjects.push(data.buffer); + } + + return transcodeTaskProcessor.scheduleTask(data, transferrableObjects); + }).then(function(compressedTextureBuffer) { + return CompressedTextureBuffer.clone(compressedTextureBuffer); + }); + } + + return loadCRN; +}); \ No newline at end of file diff --git a/Source/Core/loadImage.js b/Source/Core/loadImage.js index 861e29343feb..ba299a24c860 100644 --- a/Source/Core/loadImage.js +++ b/Source/Core/loadImage.js @@ -1,18 +1,18 @@ /*global define*/ define([ '../ThirdParty/when', - './TrustedServers', './defaultValue', './defined', './DeveloperError', - './isCrossOriginUrl' + './isCrossOriginUrl', + './TrustedServers' ], function( when, - TrustedServers, defaultValue, defined, DeveloperError, - isCrossOriginUrl) { + isCrossOriginUrl, + TrustedServers) { 'use strict'; var dataUriRegex = /^data:/; diff --git a/Source/Core/loadKTX.js b/Source/Core/loadKTX.js new file mode 100644 index 000000000000..997f669b9dd9 --- /dev/null +++ b/Source/Core/loadKTX.js @@ -0,0 +1,220 @@ +/*global define*/ +define([ + '../ThirdParty/when', + './CompressedTextureBuffer', + './defined', + './DeveloperError', + './loadArrayBuffer', + './PixelFormat', + './RuntimeError' + ], function( + when, + CompressedTextureBuffer, + defined, + DeveloperError, + loadArrayBuffer, + PixelFormat, + RuntimeError) { + 'use strict'; + + /** + * Asynchronously loads and parses the given URL to a KTX file or parses the raw binary data of a KTX file. + * Returns a promise that will resolve to an object containing the image buffer, width, height and format once loaded, + * or reject if the URL failed to load or failed to parse the data. The data is loaded + * using XMLHttpRequest, which means that in order to make requests to another origin, + * the server must have Cross-Origin Resource Sharing (CORS) headers enabled. + *

+ * The following are part of the KTX format specification but are not supported: + *

+ *

+ * + * @exports loadKTX + * + * @param {String|Promise.|ArrayBuffer} urlOrBuffer The URL of the binary data, a promise for the URL, or an ArrayBuffer. + * @param {Object} [headers] HTTP headers to send with the requests. + * @returns {Promise.} A promise that will resolve to the requested data when loaded. + * + * @exception {RuntimeError} Invalid KTX file. + * @exception {RuntimeError} File is the wrong endianness. + * @exception {RuntimeError} glInternalFormat is not a valid format. + * @exception {RuntimeError} glType must be zero when the texture is compressed. + * @exception {RuntimeError} The type size for compressed textures must be 1. + * @exception {RuntimeError} glFormat must be zero when the texture is compressed. + * @exception {RuntimeError} Generating mipmaps for a compressed texture is unsupported. + * @exception {RuntimeError} The base internal format must be the same as the format for uncompressed textures. + * @exception {RuntimeError} 3D textures are not supported. + * @exception {RuntimeError} Texture arrays are not supported. + * @exception {RuntimeError} Cubemaps are not supported. + * + * @example + * // load a single URL asynchronously + * Cesium.loadKTX('some/url').then(function(ktxData) { + * var width = ktxData.width; + * var height = ktxData.height; + * var format = ktxData.internalFormat; + * var arrayBufferView = ktxData.bufferView; + * // use the data to create a texture + * }).otherwise(function(error) { + * // an error occurred + * }); + * + * @see {@link https://www.khronos.org/opengles/sdk/tools/KTX/file_format_spec/|KTX file format} + * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} + * @see {@link http://wiki.commonjs.org/wiki/Promises/A|CommonJS Promises/A} + */ + function loadKTX(urlOrBuffer, headers) { + //>>includeStart('debug', pragmas.debug); + if (!defined(urlOrBuffer)) { + throw new DeveloperError('urlOrBuffer is required.'); + } + //>>includeEnd('debug'); + + var loadPromise; + if (urlOrBuffer instanceof ArrayBuffer || ArrayBuffer.isView(urlOrBuffer)) { + loadPromise = when.resolve(urlOrBuffer); + } else { + loadPromise = loadArrayBuffer(urlOrBuffer, headers); + } + + return loadPromise.then(function(data) { + return parseKTX(data); + }); + } + + var fileIdentifier = [0xAB, 0x4B, 0x54, 0x58, 0x20, 0x31, 0x31, 0xBB, 0x0D, 0x0A, 0x1A, 0x0A]; + var endiannessTest = 0x04030201; + + var sizeOfUint32 = 4; + + function parseKTX(data) { + var byteBuffer = new Uint8Array(data); + + var isKTX = true; + for (var i = 0; i < fileIdentifier.length; ++i) { + if (fileIdentifier[i] !== byteBuffer[i]) { + isKTX = false; + break; + } + } + + if (!isKTX) { + throw new RuntimeError('Invalid KTX file.'); + } + + var view; + var byteOffset; + + if (defined(data.buffer)) { + view = new DataView(data.buffer); + byteOffset = data.byteOffset; + } else { + view = new DataView(data); + byteOffset = 0; + } + + byteOffset += 12; // skip identifier + + var endianness = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + if (endianness !== endiannessTest) { + throw new RuntimeError('File is the wrong endianness.'); + } + + var glType = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glTypeSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glInternalFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var glBaseInternalFormat = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelWidth = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelHeight = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var pixelDepth = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfArrayElements = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfFaces = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var numberOfMipmapLevels = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + var bytesOfKeyValueByteSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + + // skip metadata + byteOffset += bytesOfKeyValueByteSize; + + var imageSize = view.getUint32(byteOffset, true); + byteOffset += sizeOfUint32; + + var texture; + if (defined(data.buffer)) { + texture = new Uint8Array(data.buffer, byteOffset, imageSize); + } else { + texture = new Uint8Array(data, byteOffset, imageSize); + } + + // Some tools use a sized internal format. + // See table 2: https://www.opengl.org/sdk/docs/man/html/glTexImage2D.xhtml + if (glInternalFormat === 0x8051) { // GL_RGB8 + glInternalFormat = PixelFormat.RGB; + } else if (glInternalFormat === 0x8058) { // GL_RGBA8 + glInternalFormat = PixelFormat.RGBA; + } + + if (!PixelFormat.validate(glInternalFormat)) { + throw new RuntimeError('glInternalFormat is not a valid format.'); + } + + if (PixelFormat.isCompressedFormat(glInternalFormat)) { + if (glType !== 0) { + throw new RuntimeError('glType must be zero when the texture is compressed.'); + } + if (glTypeSize !== 1) { + throw new RuntimeError('The type size for compressed textures must be 1.'); + } + if (glFormat !== 0) { + throw new RuntimeError('glFormat must be zero when the texture is compressed.'); + } + if (numberOfMipmapLevels === 0) { + throw new RuntimeError('Generating mipmaps for a compressed texture is unsupported.'); + } + } else { + if (glBaseInternalFormat !== glFormat) { + throw new RuntimeError('The base internal format must be the same as the format for uncompressed textures.'); + } + } + + if (pixelDepth !== 0) { + throw new RuntimeError('3D textures are unsupported.'); + } + + if (numberOfArrayElements !== 0) { + throw new RuntimeError('Texture arrays are unsupported.'); + } + if (numberOfFaces !== 1) { + throw new RuntimeError('Cubemaps are unsupported.'); + } + + // Only use the level 0 mipmap + if (PixelFormat.isCompressedFormat(glInternalFormat) && numberOfMipmapLevels > 1) { + var levelSize = PixelFormat.compressedTextureSize(glInternalFormat, pixelWidth, pixelHeight); + texture = texture.slice(0, levelSize); + } + + return new CompressedTextureBuffer(glInternalFormat, pixelWidth, pixelHeight, texture); + } + + return loadKTX; +}); diff --git a/Source/Core/loadWithXhr.js b/Source/Core/loadWithXhr.js index 01066b2341ec..a44debf511db 100644 --- a/Source/Core/loadWithXhr.js +++ b/Source/Core/loadWithXhr.js @@ -1,20 +1,20 @@ /*global define*/ define([ '../ThirdParty/when', - './TrustedServers', './defaultValue', './defined', './DeveloperError', './RequestErrorEvent', - './RuntimeError' + './RuntimeError', + './TrustedServers' ], function( when, - TrustedServers, defaultValue, defined, DeveloperError, RequestErrorEvent, - RuntimeError) { + RuntimeError, + TrustedServers) { 'use strict'; /** diff --git a/Source/Core/writeTextToCanvas.js b/Source/Core/writeTextToCanvas.js index f032aad58d95..c54ee0feaf90 100644 --- a/Source/Core/writeTextToCanvas.js +++ b/Source/Core/writeTextToCanvas.js @@ -87,16 +87,28 @@ define([ document.body.appendChild(canvas); var dimensions = measureText(context2D, text, stroke, fill); - dimensions.computedWidth = Math.max(dimensions.width, dimensions.bounds.maxx - dimensions.bounds.minx); canvas.dimensions = dimensions; document.body.removeChild(canvas); canvas.style.visibility = ''; - var baseline = dimensions.height - dimensions.ascent + padding; - canvas.width = dimensions.computedWidth + doublePadding; - canvas.height = dimensions.height + doublePadding; - var y = canvas.height - baseline; + //Some characters, such as the letter j, have a non-zero starting position. + //This value is used for kerning later, but we need to take it into account + //now in order to draw the text completely on the canvas + var x = -dimensions.bounds.minx; + + //Expand the width to include the starting position. + var width = Math.ceil(dimensions.width) + x + doublePadding; + + //While the height of the letter is correct, we need to adjust + //where we start drawing it so that letters like j and y properly dip + //below the line. + var height = dimensions.height + doublePadding; + var baseline = height - dimensions.ascent + doublePadding; + var y = height - baseline + doublePadding; + + canvas.width = width; + canvas.height = height; // Properties must be explicitly set again after changing width and height context2D.font = font; @@ -113,13 +125,13 @@ define([ if (stroke) { var strokeColor = defaultValue(options.strokeColor, Color.BLACK); context2D.strokeStyle = strokeColor.toCssColorString(); - context2D.strokeText(text, padding, y); + context2D.strokeText(text, x + padding, y); } if (fill) { var fillColor = defaultValue(options.fillColor, Color.WHITE); context2D.fillStyle = fillColor.toCssColorString(); - context2D.fillText(text, padding, y); + context2D.fillText(text, x + padding, y); } return canvas; diff --git a/Source/DataSources/BillboardVisualizer.js b/Source/DataSources/BillboardVisualizer.js index fdd03d1c4f08..b1595fd5dca5 100644 --- a/Source/DataSources/BillboardVisualizer.js +++ b/Source/DataSources/BillboardVisualizer.js @@ -5,7 +5,6 @@ define([ '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Color', - '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', @@ -15,7 +14,6 @@ define([ '../Scene/HorizontalOrigin', '../Scene/VerticalOrigin', './BoundingSphereState', - './EntityCluster', './Property' ], function( AssociativeArray, @@ -23,7 +21,6 @@ define([ Cartesian2, Cartesian3, Color, - defaultValue, defined, destroyObject, DeveloperError, @@ -33,7 +30,6 @@ define([ HorizontalOrigin, VerticalOrigin, BoundingSphereState, - EntityCluster, Property) { 'use strict'; diff --git a/Source/DataSources/ColorMaterialProperty.js b/Source/DataSources/ColorMaterialProperty.js index 2f3103a90687..dd034ef0ad6f 100644 --- a/Source/DataSources/ColorMaterialProperty.js +++ b/Source/DataSources/ColorMaterialProperty.js @@ -4,7 +4,6 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/Event', - './ConstantProperty', './createPropertyDescriptor', './Property' ], function( @@ -12,7 +11,6 @@ define([ defined, defineProperties, Event, - ConstantProperty, createPropertyDescriptor, Property) { 'use strict'; diff --git a/Source/DataSources/ConstantProperty.js b/Source/DataSources/ConstantProperty.js index 905a46007dde..39dd1257fbd0 100644 --- a/Source/DataSources/ConstantProperty.js +++ b/Source/DataSources/ConstantProperty.js @@ -1,15 +1,11 @@ /*global define*/ define([ - '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', - '../Core/DeveloperError', '../Core/Event' ], function( - defaultValue, defined, defineProperties, - DeveloperError, Event) { 'use strict'; diff --git a/Source/DataSources/CorridorGeometryUpdater.js b/Source/DataSources/CorridorGeometryUpdater.js index 79bf46bca8a7..839d47b534e0 100644 --- a/Source/DataSources/CorridorGeometryUpdater.js +++ b/Source/DataSources/CorridorGeometryUpdater.js @@ -243,7 +243,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof CorridorGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -552,6 +552,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/CylinderGeometryUpdater.js b/Source/DataSources/CylinderGeometryUpdater.js index 6556de373db0..669606b4c4bb 100644 --- a/Source/DataSources/CylinderGeometryUpdater.js +++ b/Source/DataSources/CylinderGeometryUpdater.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../Core/Cartesian3', '../Core/Color', '../Core/ColorGeometryInstanceAttribute', '../Core/CylinderGeometry', @@ -26,7 +25,6 @@ define([ './MaterialProperty', './Property' ], function( - Cartesian3, Color, ColorGeometryInstanceAttribute, CylinderGeometry, diff --git a/Source/DataSources/CzmlDataSource.js b/Source/DataSources/CzmlDataSource.js index 9c1d78f024ef..e2d4cca84f41 100644 --- a/Source/DataSources/CzmlDataSource.js +++ b/Source/DataSources/CzmlDataSource.js @@ -35,6 +35,7 @@ define([ '../Core/Spherical', '../Core/TimeInterval', '../Core/TimeIntervalCollection', + '../Scene/ColorBlendMode', '../Scene/HeightReference', '../Scene/HorizontalOrigin', '../Scene/LabelStyle', @@ -120,6 +121,7 @@ define([ Spherical, TimeInterval, TimeIntervalCollection, + ColorBlendMode, HeightReference, HorizontalOrigin, LabelStyle, @@ -432,6 +434,8 @@ define([ return unwrapCartesianInterval(czmlInterval); case Color: return unwrapColorInterval(czmlInterval); + case ColorBlendMode: + return ColorBlendMode[defaultValue(czmlInterval.colorBlendMode, czmlInterval)]; case CornerType: return CornerType[defaultValue(czmlInterval.cornerType, czmlInterval)]; case HeightReference: @@ -1376,6 +1380,9 @@ define([ processPacketData(String, label, 'font', labelData.font, interval, sourceUri, entityCollection); processPacketData(LabelStyle, label, 'style', labelData.style, interval, sourceUri, entityCollection); processPacketData(Number, label, 'scale', labelData.scale, interval, sourceUri, entityCollection); + processPacketData(Boolean, label, 'showBackground', labelData.showBackground, interval, sourceUri, entityCollection); + processPacketData(Color, label, 'backgroundColor', labelData.backgroundColor, interval, sourceUri, entityCollection); + processPacketData(Cartesian2, label, 'backgroundPadding', labelData.backgroundPadding, interval, sourceUri, entityCollection); processPacketData(Cartesian2, label, 'pixelOffset', labelData.pixelOffset, interval, sourceUri, entityCollection); processPacketData(Cartesian3, label, 'eyeOffset', labelData.eyeOffset, interval, sourceUri, entityCollection); processPacketData(HorizontalOrigin, label, 'horizontalOrigin', labelData.horizontalOrigin, interval, sourceUri, entityCollection); @@ -1415,6 +1422,11 @@ define([ processPacketData(Boolean, model, 'runAnimations', modelData.runAnimations, interval, sourceUri, entityCollection); processPacketData(ShadowMode, model, 'shadows', modelData.shadows, interval, sourceUri, entityCollection); processPacketData(HeightReference, model, 'heightReference', modelData.heightReference, interval, sourceUri, entityCollection); + processPacketData(Color, model, 'silhouetteColor', modelData.silhouetteColor, interval, sourceUri, entityCollection); + processPacketData(Number, model, 'silhouetteSize', modelData.silhouetteSize, interval, sourceUri, entityCollection); + processPacketData(Color, model, 'color', modelData.color, interval, sourceUri, entityCollection); + processPacketData(ColorBlendMode, model, 'colorBlendMode', modelData.colorBlendMode, interval, sourceUri, entityCollection); + processPacketData(Number, model, 'colorBlendAmount', modelData.colorBlendAmount, interval, sourceUri, entityCollection); var nodeTransformationsData = modelData.nodeTransformations; if (defined(nodeTransformationsData)) { @@ -1842,7 +1854,7 @@ define([ /** * Creates a Promise to a new instance loaded with the provided CZML data. * - * @param {String|Object} data A url or CZML object to be processed. + * @param {String|Object} czml A url or CZML object to be processed. * @param {Object} [options] An object with the following properties: * @param {String} [options.sourceUri] Overrides the url to use for resolving relative links. * @returns {Promise.} A promise that resolves to the new instance once the data is processed. diff --git a/Source/DataSources/DataSourceClock.js b/Source/DataSources/DataSourceClock.js index 454d8fe7b050..70f8b2871322 100644 --- a/Source/DataSources/DataSourceClock.js +++ b/Source/DataSources/DataSourceClock.js @@ -165,12 +165,12 @@ define([ if (!defined(result)) { result = new Clock(); } - result.startTime = this.startTime; - result.stopTime = this.stopTime; - result.currentTime = this.currentTime; - result.clockRange = this.clockRange; - result.multiplier = this.multiplier; - result.clockStep = this.clockStep; + result.startTime = defaultValue(this.startTime, result.startTime); + result.stopTime = defaultValue(this.stopTime, result.stopTime); + result.currentTime = defaultValue(this.currentTime, result.currentTime); + result.clockRange = defaultValue(this.clockRange, result.clockRange); + result.multiplier = defaultValue(this.multiplier, result.multiplier); + result.clockStep = defaultValue(this.clockStep, result.clockStep); return result; }; diff --git a/Source/DataSources/DataSourceCollection.js b/Source/DataSources/DataSourceCollection.js index 374b8a0dbe62..ca2e44f2e0a7 100644 --- a/Source/DataSources/DataSourceCollection.js +++ b/Source/DataSources/DataSourceCollection.js @@ -166,6 +166,7 @@ define([ * Gets a data source by index from the collection. * * @param {Number} index the index to retrieve. + * @returns {DataSource} The data source at the specified index. */ DataSourceCollection.prototype.get = function(index) { //>>includeStart('debug', pragmas.debug); diff --git a/Source/DataSources/DataSourceDisplay.js b/Source/DataSources/DataSourceDisplay.js index edc756aa425b..3ca8cef027f0 100644 --- a/Source/DataSources/DataSourceDisplay.js +++ b/Source/DataSources/DataSourceDisplay.js @@ -16,7 +16,6 @@ define([ './CylinderGeometryUpdater', './EllipseGeometryUpdater', './EllipsoidGeometryUpdater', - './EntityCluster', './GeometryVisualizer', './LabelVisualizer', './ModelVisualizer', @@ -44,7 +43,6 @@ define([ CylinderGeometryUpdater, EllipseGeometryUpdater, EllipsoidGeometryUpdater, - EntityCluster, GeometryVisualizer, LabelVisualizer, ModelVisualizer, diff --git a/Source/DataSources/EllipseGeometryUpdater.js b/Source/DataSources/EllipseGeometryUpdater.js index 59176bb1004a..e47c1a4af98c 100644 --- a/Source/DataSources/EllipseGeometryUpdater.js +++ b/Source/DataSources/EllipseGeometryUpdater.js @@ -246,7 +246,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof EllipseGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -566,6 +566,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitives collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. diff --git a/Source/DataSources/EntityCluster.js b/Source/DataSources/EntityCluster.js index e652c41c257a..fc13807bf1a1 100644 --- a/Source/DataSources/EntityCluster.js +++ b/Source/DataSources/EntityCluster.js @@ -1,56 +1,38 @@ /*global define*/ define([ - '../Core/BoundingRectangle', - '../Core/Cartesian2', - '../Core/Cartesian3', - '../Core/Color', - '../Core/defaultValue', - '../Core/defined', - '../Core/defineProperties', - '../Core/destroyObject', - '../Core/EllipsoidalOccluder', - '../Core/Event', - '../Core/Matrix4', - '../Scene/Billboard', - '../Scene/BillboardCollection', - '../Scene/HeightReference', - '../Scene/HorizontalOrigin', - '../Scene/Label', - '../Scene/LabelCollection', - '../Scene/LabelStyle', - '../Scene/PointPrimitive', - '../Scene/PointPrimitiveCollection', - '../Scene/SceneTransforms', - '../Scene/VerticalOrigin', - '../ThirdParty/kdbush', - './Entity', - './Property' -], function( - BoundingRectangle, - Cartesian2, - Cartesian3, - Color, - defaultValue, - defined, - defineProperties, - destroyObject, - EllipsoidalOccluder, - Event, - Matrix4, - Billboard, - BillboardCollection, - HeightReference, - HorizontalOrigin, - Label, - LabelCollection, - LabelStyle, - PointPrimitive, - PointPrimitiveCollection, - SceneTransforms, - VerticalOrigin, - kdbush, - Entity, - Property) { + '../Core/BoundingRectangle', + '../Core/Cartesian2', + '../Core/Cartesian3', + '../Core/defaultValue', + '../Core/defined', + '../Core/defineProperties', + '../Core/EllipsoidalOccluder', + '../Core/Event', + '../Core/Matrix4', + '../Scene/Billboard', + '../Scene/BillboardCollection', + '../Scene/Label', + '../Scene/LabelCollection', + '../Scene/PointPrimitive', + '../Scene/PointPrimitiveCollection', + '../ThirdParty/kdbush' + ], function( + BoundingRectangle, + Cartesian2, + Cartesian3, + defaultValue, + defined, + defineProperties, + EllipsoidalOccluder, + Event, + Matrix4, + Billboard, + BillboardCollection, + Label, + LabelCollection, + PointPrimitive, + PointPrimitiveCollection, + kdbush) { 'use strict'; /** @@ -166,7 +148,7 @@ define([ cluster.label.show = true; cluster.label.text = numPoints.toLocaleString(); cluster.billboard.position = cluster.label.position = cluster.point.position = position; - + entityCluster._clusterEvent.raiseEvent(ids, cluster); } @@ -226,7 +208,7 @@ define([ var pointCollection = entityCluster._pointCollection; if ((!defined(labelCollection) && !defined(billboardCollection) && !defined(pointCollection)) || - (!entityCluster._clusterBillboards && !entityCluster._clusterLabels && !entityCluster._clusterPoints)) { + (!entityCluster._clusterBillboards && !entityCluster._clusterLabels && !entityCluster._clusterPoints)) { return; } @@ -274,10 +256,10 @@ define([ getScreenSpacePositions(labelCollection, points, scene, occluder, entityCluster); } if (entityCluster._clusterBillboards) { - getScreenSpacePositions(billboardCollection, points, scene, occluder, entityCluster); + getScreenSpacePositions(billboardCollection, points, scene, occluder, entityCluster); } if (entityCluster._clusterPoints) { - getScreenSpacePositions(pointCollection, points, scene, occluder, entityCluster); + getScreenSpacePositions(pointCollection, points, scene, occluder, entityCluster); } var i; @@ -489,48 +471,48 @@ define([ return this._clusterEvent; } }, - /** + /** * Gets or sets whether clustering billboard entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterBillboards : { - get : function() { - return this._clusterBillboards; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterBillboards; - this._clusterBillboards = value; - } - }, - /** + clusterBillboards : { + get : function() { + return this._clusterBillboards; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterBillboards; + this._clusterBillboards = value; + } + }, + /** * Gets or sets whether clustering labels entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterLabels : { - get : function() { - return this._clusterLabels; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterLabels; - this._clusterLabels = value; - } - }, - /** + clusterLabels : { + get : function() { + return this._clusterLabels; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterLabels; + this._clusterLabels = value; + } + }, + /** * Gets or sets whether clustering point entities is enabled. * @memberof EntityCluster.prototype * @type {Boolean} */ - clusterPoints : { - get : function() { - return this._clusterPoints; - }, - set : function(value) { - this._clusterDirty = this._clusterDirty || value !== this._clusterPoints; - this._clusterPoints = value; - } - } + clusterPoints : { + get : function() { + return this._clusterPoints; + }, + set : function(value) { + this._clusterDirty = this._clusterDirty || value !== this._clusterPoints; + this._clusterPoints = value; + } + } }); function createGetEntity(collectionProperty, CollectionConstructor, unusedIndicesProperty, entityIndexProperty) { diff --git a/Source/DataSources/EntityView.js b/Source/DataSources/EntityView.js index f8f07f593871..b8857df00372 100644 --- a/Source/DataSources/EntityView.js +++ b/Source/DataSources/EntityView.js @@ -1,8 +1,6 @@ /*global define*/ define([ - '../Core/BoundingSphere', '../Core/Cartesian3', - '../Core/Cartesian4', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', @@ -16,9 +14,7 @@ define([ '../Core/Transforms', '../Scene/SceneMode' ], function( - BoundingSphere, Cartesian3, - Cartesian4, defaultValue, defined, defineProperties, @@ -262,7 +258,7 @@ define([ * Should be called each animation frame to update the camera * to the latest settings. * @param {JulianDate} time The current animation time. - * @param {BoundingSphere} current bounding sphere of the object. + * @param {BoundingSphere} boundingSphere bounding sphere of the object. * */ EntityView.prototype.update = function(time, boundingSphere) { diff --git a/Source/DataSources/KmlDataSource.js b/Source/DataSources/KmlDataSource.js index 1746b3ee427f..bd7636d8abb1 100644 --- a/Source/DataSources/KmlDataSource.js +++ b/Source/DataSources/KmlDataSource.js @@ -42,7 +42,6 @@ define([ '../ThirdParty/zip', './BillboardGraphics', './CompositePositionProperty', - './ConstantPositionProperty', './CorridorGraphics', './DataSource', './DataSourceClock', @@ -103,7 +102,6 @@ define([ zip, BillboardGraphics, CompositePositionProperty, - ConstantPositionProperty, CorridorGraphics, DataSource, DataSourceClock, @@ -491,7 +489,7 @@ define([ var colorOptions = {}; function parseColorString(value, isRandom) { - if (!defined(value)) { + if (!defined(value) || /^\s*$/gm.test(value)) { return undefined; } diff --git a/Source/DataSources/LabelGraphics.js b/Source/DataSources/LabelGraphics.js index f16fcb5977a9..3377176256cf 100644 --- a/Source/DataSources/LabelGraphics.js +++ b/Source/DataSources/LabelGraphics.js @@ -28,13 +28,16 @@ define([ * @constructor * * @param {Object} [options] Object with the following properties: - * @param {Property} [options.text] A Property specifying the text. + * @param {Property} [options.text] A Property specifying the text. Explicit newlines '\n' are supported. * @param {Property} [options.font='10px sans-serif'] A Property specifying the CSS font. * @param {Property} [options.style=LabelStyle.FILL] A Property specifying the {@link LabelStyle}. * @param {Property} [options.fillColor=Color.WHITE] A Property specifying the fill {@link Color}. * @param {Property} [options.outlineColor=Color.BLACK] A Property specifying the outline {@link Color}. * @param {Property} [options.outlineWidth=1.0] A numeric Property specifying the outline width. * @param {Property} [options.show=true] A boolean Property specifying the visibility of the label. + * @param {Property} [options.showBackground=false] A boolean Property specifying the visibility of the background behind the label. + * @param {Property} [options.backgroundColor=new Color(0.165, 0.165, 0.165, 0.8)] A Property specifying the background {@link Color}. + * @param {Property} [options.backgroundPadding=new Cartesian2(7, 5)] A {@link Cartesian2} Property specifying the horizontal and vertical background padding in pixels. * @param {Property} [options.scale=1.0] A numeric Property specifying the scale to apply to the text. * @param {Property} [options.horizontalOrigin=HorizontalOrigin.CENTER] A Property specifying the {@link HorizontalOrigin}. * @param {Property} [options.verticalOrigin=VerticalOrigin.CENTER] A Property specifying the {@link VerticalOrigin}. @@ -74,6 +77,12 @@ define([ this._scaleSubscription = undefined; this._show = undefined; this._showSubscription = undefined; + this._showBackground = undefined; + this._showBackgroundSubscription = undefined; + this._backgroundColor = undefined; + this._backgroundColorSubscription = undefined; + this._backgroundPadding = undefined; + this._backgroundPaddingSubscription = undefined; this._translucencyByDistance = undefined; this._translucencyByDistanceSubscription = undefined; this._pixelOffsetScaleByDistance = undefined; @@ -101,6 +110,7 @@ define([ /** * Gets or sets the string Property specifying the text of the label. + * Explicit newlines '\n' are supported. * @memberof LabelGraphics.prototype * @type {Property} */ @@ -232,6 +242,31 @@ define([ */ show : createPropertyDescriptor('show'), + /** + * Gets or sets the boolean Property specifying the visibility of the background behind the label. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default false + */ + showBackground : createPropertyDescriptor('showBackground'), + + /** + * Gets or sets the Property specifying the background {@link Color}. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default new Color(0.165, 0.165, 0.165, 0.8) + */ + backgroundColor : createPropertyDescriptor('backgroundColor'), + + /** + * Gets or sets the {@link Cartesian2} Property specifying the label's horizontal and vertical + * background padding in pixels. + * @memberof LabelGraphics.prototype + * @type {Property} + * @default new Cartesian2(7, 5) + */ + backgroundPadding : createPropertyDescriptor('backgroundPadding'), + /** * Gets or sets {@link NearFarScalar} Property specifying the translucency of the label based on the distance from the camera. * A label's translucency will interpolate between the {@link NearFarScalar#nearValue} and @@ -279,6 +314,9 @@ define([ result.fillColor = this.fillColor; result.outlineColor = this.outlineColor; result.outlineWidth = this.outlineWidth; + result.showBackground = this.showBackground; + result.backgroundColor = this.backgroundColor; + result.backgroundPadding = this.backgroundPadding; result.scale = this.scale; result.horizontalOrigin = this.horizontalOrigin; result.verticalOrigin = this.verticalOrigin; @@ -311,6 +349,9 @@ define([ this.fillColor = defaultValue(this.fillColor, source.fillColor); this.outlineColor = defaultValue(this.outlineColor, source.outlineColor); this.outlineWidth = defaultValue(this.outlineWidth, source.outlineWidth); + this.showBackground = defaultValue(this.showBackground, source.showBackground); + this.backgroundColor = defaultValue(this.backgroundColor, source.backgroundColor); + this.backgroundPadding = defaultValue(this.backgroundPadding, source.backgroundPadding); this.scale = defaultValue(this.scale, source.scale); this.horizontalOrigin = defaultValue(this.horizontalOrigin, source.horizontalOrigin); this.verticalOrigin = defaultValue(this.verticalOrigin, source.verticalOrigin); diff --git a/Source/DataSources/LabelVisualizer.js b/Source/DataSources/LabelVisualizer.js index 0042865047ca..019e8527fc77 100644 --- a/Source/DataSources/LabelVisualizer.js +++ b/Source/DataSources/LabelVisualizer.js @@ -15,7 +15,6 @@ define([ '../Scene/LabelStyle', '../Scene/VerticalOrigin', './BoundingSphereState', - './EntityCluster', './Property' ], function( AssociativeArray, @@ -33,7 +32,6 @@ define([ LabelStyle, VerticalOrigin, BoundingSphereState, - EntityCluster, Property) { 'use strict'; @@ -43,6 +41,9 @@ define([ var defaultFillColor = Color.WHITE; var defaultOutlineColor = Color.BLACK; var defaultOutlineWidth = 1.0; + var defaultShowBackground = false; + var defaultBackgroundColor = new Color(0.165, 0.165, 0.165, 0.8); + var defaultBackgroundPadding = new Cartesian2(7, 5); var defaultPixelOffset = Cartesian2.ZERO; var defaultEyeOffset = Cartesian3.ZERO; var defaultHeightReference = HeightReference.NONE; @@ -52,6 +53,8 @@ define([ var position = new Cartesian3(); var fillColor = new Color(); var outlineColor = new Color(); + var backgroundColor = new Color(); + var backgroundPadding = new Cartesian2(); var eyeOffset = new Cartesian3(); var pixelOffset = new Cartesian2(); var translucencyByDistance = new NearFarScalar(); @@ -148,6 +151,9 @@ define([ label.fillColor = Property.getValueOrDefault(labelGraphics._fillColor, time, defaultFillColor, fillColor); label.outlineColor = Property.getValueOrDefault(labelGraphics._outlineColor, time, defaultOutlineColor, outlineColor); label.outlineWidth = Property.getValueOrDefault(labelGraphics._outlineWidth, time, defaultOutlineWidth); + label.showBackground = Property.getValueOrDefault(labelGraphics._showBackground, time, defaultShowBackground); + label.backgroundColor = Property.getValueOrDefault(labelGraphics._backgroundColor, time, defaultBackgroundColor, backgroundColor); + label.backgroundPadding = Property.getValueOrDefault(labelGraphics._backgroundPadding, time, defaultBackgroundPadding, backgroundPadding); label.pixelOffset = Property.getValueOrDefault(labelGraphics._pixelOffset, time, defaultPixelOffset, pixelOffset); label.eyeOffset = Property.getValueOrDefault(labelGraphics._eyeOffset, time, defaultEyeOffset, eyeOffset); label.heightReference = Property.getValueOrDefault(labelGraphics._heightReference, time, defaultHeightReference); diff --git a/Source/DataSources/ModelGraphics.js b/Source/DataSources/ModelGraphics.js index 81d48182b0cb..766d60064855 100644 --- a/Source/DataSources/ModelGraphics.js +++ b/Source/DataSources/ModelGraphics.js @@ -50,6 +50,11 @@ define([ * @param {Property} [options.shadows=ShadowMode.ENABLED] An enum Property specifying whether the model casts or receives shadows from each light source. * @param {Property} [options.heightReference=HeightReference.NONE] A Property specifying what the height is relative to. * @param {Property} [options.distanceDisplayCondition] A Property specifying at what distance from the camera that this model will be displayed. + * @param {Property} [options.silhouetteColor=Color.RED] A Property specifying the {@link Color} of the silhouette. + * @param {Property} [options.silhouetteSize=0.0] A numeric Property specifying the size of the silhouette in pixels. + * @param {Property} [options.color=Color.WHITE] A Property specifying the {@link Color} that blends with the model's rendered color. + * @param {Property} [options.colorBlendMode=ColorBlendMode.HIGHLIGHT] An enum Property specifying how the color blends with the model. + * @param {Property} [options.colorBlendAmount=0.5] A numeric Property specifying the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. * * @see {@link http://cesiumjs.org/2014/03/03/Cesium-3D-Models-Tutorial/|3D Models Tutorial} * @demo {@link http://cesiumjs.org/Cesium/Apps/Sandcastle/index.html?src=3D%20Models.html|Cesium Sandcastle 3D Models Demo} @@ -77,6 +82,16 @@ define([ this._heightReferenceSubscription = undefined; this._distanceDisplayCondition = undefined; this._distanceDisplayConditionSubscription = undefined; + this._silhouetteColor = undefined; + this._silhouetteColorSubscription = undefined; + this._silhouetteSize = undefined; + this._silhouetteSizeSubscription = undefined; + this._color = undefined; + this._colorSubscription = undefined; + this._colorBlendMode = undefined; + this._colorBlendModeSubscription = undefined; + this._colorBlendAmount = undefined; + this._colorBlendAmountSubscription = undefined; this._definitionChanged = new Event(); this.merge(defaultValue(options, defaultValue.EMPTY_OBJECT)); @@ -186,7 +201,49 @@ define([ * @memberof ModelGraphics.prototype * @type {Property} */ - distanceDisplayCondition : createPropertyDescriptor('distanceDisplayCondition') + distanceDisplayCondition : createPropertyDescriptor('distanceDisplayCondition'), + + /** + * Gets or sets the Property specifying the {@link Color} of the silhouette. + * @memberof ModelGraphics.prototype + * @type {Property} + * @default Color.RED + */ + silhouetteColor: createPropertyDescriptor('silhouetteColor'), + + /** + * Gets or sets the numeric Property specifying the size of the silhouette in pixels. + * @memberof ModelGraphics.prototype + * @type {Property} + * @default 0.0 + */ + silhouetteSize : createPropertyDescriptor('silhouetteSize'), + + /** + * Gets or sets the Property specifying the {@link Color} that blends with the model's rendered color. + * @memberof ModelGraphics.prototype + * @type {Property} + * @default Color.WHITE + */ + color : createPropertyDescriptor('color'), + + /** + * Gets or sets the enum Property specifying how the color blends with the model. + * @memberof ModelGraphics.prototype + * @type {Property} + * @default ColorBlendMode.HIGHLIGHT + */ + colorBlendMode : createPropertyDescriptor('colorBlendMode'), + + /** + * A numeric Property specifying the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + * @memberof ModelGraphics.prototype + * @type {Property} + * @default 0.5 + */ + colorBlendAmount : createPropertyDescriptor('colorBlendAmount') }); /** @@ -210,6 +267,11 @@ define([ result.nodeTransformations = this.nodeTransformations; result.heightReference = this._heightReference; result.distanceDisplayCondition = this.distanceDisplayCondition; + result.silhouetteColor = this.silhouetteColor; + result.silhouetteSize = this.silhouetteSize; + result.color = this.color; + result.colorBlendMode = this.colorBlendMode; + result.colorBlendAmount = this.colorBlendAmount; return result; }; @@ -237,6 +299,11 @@ define([ this.runAnimations = defaultValue(this.runAnimations, source.runAnimations); this.heightReference = defaultValue(this.heightReference, source.heightReference); this.distanceDisplayCondition = defaultValue(this.distanceDisplayCondition, source.distanceDisplayCondition); + this.silhouetteColor = defaultValue(this.silhouetteColor, source.silhouetteColor); + this.silhouetteSize = defaultValue(this.silhouetteSize, source.silhouetteSize); + this.color = defaultValue(this.color, source.color); + this.colorBlendMode = defaultValue(this.colorBlendMode, source.colorBlendMode); + this.colorBlendAmount = defaultValue(this.colorBlendAmount, source.colorBlendAmount); var sourceNodeTransformations = source.nodeTransformations; if (defined(sourceNodeTransformations)) { diff --git a/Source/DataSources/ModelVisualizer.js b/Source/DataSources/ModelVisualizer.js index 110aafe889f8..a066931b4456 100644 --- a/Source/DataSources/ModelVisualizer.js +++ b/Source/DataSources/ModelVisualizer.js @@ -2,10 +2,12 @@ define([ '../Core/AssociativeArray', '../Core/BoundingSphere', + '../Core/Color', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', '../Core/Matrix4', + '../Scene/ColorBlendMode', '../Scene/HeightReference', '../Scene/Model', '../Scene/ModelAnimationLoop', @@ -15,10 +17,12 @@ define([ ], function( AssociativeArray, BoundingSphere, + Color, defined, destroyObject, DeveloperError, Matrix4, + ColorBlendMode, HeightReference, Model, ModelAnimationLoop, @@ -32,6 +36,11 @@ define([ var defaultIncrementallyLoadTextures = true; var defaultShadows = ShadowMode.ENABLED; var defaultHeightReference = HeightReference.NONE; + var defaultSilhouetteColor = Color.RED; + var defaultSilhouetteSize = 0.0; + var defaultColor = Color.WHITE; + var defaultColorBlendMode = ColorBlendMode.HIGHLIGHT; + var defaultColorBlendAmount = 0.5; var modelMatrixScratch = new Matrix4(); var nodeMatrixScratch = new Matrix4(); @@ -139,6 +148,11 @@ define([ model.shadows = Property.getValueOrDefault(modelGraphics._shadows, time, defaultShadows); model.heightReference = Property.getValueOrDefault(modelGraphics._heightReference, time, defaultHeightReference); model.distanceDisplayCondition = Property.getValueOrUndefined(modelGraphics._distanceDisplayCondition, time); + model.silhouetteColor = Property.getValueOrDefault(modelGraphics._silhouetteColor, time, defaultSilhouetteColor, model._silhouetteColor); + model.silhouetteSize = Property.getValueOrDefault(modelGraphics._silhouetteSize, time, defaultSilhouetteSize); + model.color = Property.getValueOrDefault(modelGraphics._color, time, defaultColor, model._color); + model.colorBlendMode = Property.getValueOrDefault(modelGraphics._colorBlendMode, time, defaultColorBlendMode); + model.colorBlendAmount = Property.getValueOrDefault(modelGraphics._colorBlendAmount, time, defaultColorBlendAmount); if (model.ready) { var runAnimations = Property.getValueOrDefault(modelGraphics._runAnimations, time, true); diff --git a/Source/DataSources/PointVisualizer.js b/Source/DataSources/PointVisualizer.js index 72cd7a7e3a90..f287439389dc 100644 --- a/Source/DataSources/PointVisualizer.js +++ b/Source/DataSources/PointVisualizer.js @@ -3,7 +3,6 @@ define([ '../Core/AssociativeArray', '../Core/Cartesian3', '../Core/Color', - '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', @@ -11,13 +10,11 @@ define([ '../Core/NearFarScalar', '../Scene/HeightReference', './BoundingSphereState', - './EntityCluster', './Property' ], function( AssociativeArray, Cartesian3, Color, - defaultValue, defined, destroyObject, DeveloperError, @@ -25,7 +22,6 @@ define([ NearFarScalar, HeightReference, BoundingSphereState, - EntityCluster, Property) { 'use strict'; diff --git a/Source/DataSources/PolygonGeometryUpdater.js b/Source/DataSources/PolygonGeometryUpdater.js index cd98be03885f..3aac6923c32e 100644 --- a/Source/DataSources/PolygonGeometryUpdater.js +++ b/Source/DataSources/PolygonGeometryUpdater.js @@ -248,7 +248,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof PolygonGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -582,6 +582,7 @@ define([ * Creates the dynamic updater to be used when GeometryUpdater#isDynamic is true. * * @param {PrimitiveCollection} primitives The primitive collection to use. + * @param {PrimitiveCollection} groundPrimitives The ground primitive collection to use. * @returns {DynamicGeometryUpdater} The dynamic updater used to update the geometry each frame. * * @exception {DeveloperError} This instance does not represent dynamic geometry. @@ -663,7 +664,7 @@ define([ options.closeBottom = closeBottomValue; var shadows = this._geometryUpdater.shadowsProperty.getValue(time); - + if (Property.getValueOrDefault(polygon.fill, time, true)) { var fillMaterialProperty = geometryUpdater.fillMaterialProperty; var material = MaterialProperty.getValue(time, fillMaterialProperty, this._material); diff --git a/Source/DataSources/PolylineArrowMaterialProperty.js b/Source/DataSources/PolylineArrowMaterialProperty.js index 53c31faae493..5dba53c76041 100644 --- a/Source/DataSources/PolylineArrowMaterialProperty.js +++ b/Source/DataSources/PolylineArrowMaterialProperty.js @@ -4,7 +4,6 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/Event', - './ConstantProperty', './createPropertyDescriptor', './Property' ], function( @@ -12,7 +11,6 @@ define([ defined, defineProperties, Event, - ConstantProperty, createPropertyDescriptor, Property) { 'use strict'; diff --git a/Source/DataSources/PolylineGeometryUpdater.js b/Source/DataSources/PolylineGeometryUpdater.js index f0b600e34dc2..f4714c250878 100644 --- a/Source/DataSources/PolylineGeometryUpdater.js +++ b/Source/DataSources/PolylineGeometryUpdater.js @@ -10,7 +10,6 @@ define([ '../Core/DeveloperError', '../Core/DistanceDisplayCondition', '../Core/DistanceDisplayConditionGeometryInstanceAttribute', - '../Core/Ellipsoid', '../Core/Event', '../Core/GeometryInstance', '../Core/Iso8601', @@ -37,7 +36,6 @@ define([ DeveloperError, DistanceDisplayCondition, DistanceDisplayConditionGeometryInstanceAttribute, - Ellipsoid, Event, GeometryInstance, Iso8601, diff --git a/Source/DataSources/PolylineVolumeGeometryUpdater.js b/Source/DataSources/PolylineVolumeGeometryUpdater.js index 0bff5eeba316..0de042792313 100644 --- a/Source/DataSources/PolylineVolumeGeometryUpdater.js +++ b/Source/DataSources/PolylineVolumeGeometryUpdater.js @@ -234,7 +234,7 @@ define([ * Gets the property specifying whether the geometry * casts or receives shadows from each light source. * @memberof PolylineVolumeGeometryUpdater.prototype - * + * * @type {Property} * @readonly */ @@ -359,7 +359,7 @@ define([ } else { attributes = { show : show, - distanceDisplayCondition : distanceDisplayConditionAttribute, + distanceDisplayCondition : distanceDisplayConditionAttribute }; } diff --git a/Source/DataSources/Property.js b/Source/DataSources/Property.js index 5183f79d46b8..3f201ddcda0a 100644 --- a/Source/DataSources/Property.js +++ b/Source/DataSources/Property.js @@ -3,14 +3,12 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', - '../Core/DeveloperError', - '../Core/Iso8601' + '../Core/DeveloperError' ], function( defaultValue, defined, defineProperties, - DeveloperError, - Iso8601) { + DeveloperError) { 'use strict'; /** diff --git a/Source/DataSources/PropertyBag.js b/Source/DataSources/PropertyBag.js index 21b2930fa7e4..0dc855e147b6 100644 --- a/Source/DataSources/PropertyBag.js +++ b/Source/DataSources/PropertyBag.js @@ -102,7 +102,7 @@ define([ * Adds a property to this object. * * @param {String} propertyName The name of the property to add. - * @param {Any} [value] The value of the new property, if provided. + * @param {*} [value] The value of the new property, if provided. * @param {Function} [createPropertyCallback] A function that will be called when the value of this new property is set to a value that is not a Property. * * @exception {DeveloperError} "propertyName" is already a registered property. diff --git a/Source/DataSources/Rotation.js b/Source/DataSources/Rotation.js index 467690f24ddb..3f1480576cc1 100755 --- a/Source/DataSources/Rotation.js +++ b/Source/DataSources/Rotation.js @@ -124,7 +124,7 @@ define([ * * @param {Number[]} array The array previously packed for interpolation. * @param {Number[]} sourceArray The original packed array. - * @param {Number} [startingIndex=0] The startingIndex used to convert the array. + * @param {Number} [firstIndex=0] The firstIndex used to convert the array. * @param {Number} [lastIndex=packedArray.length] The lastIndex used to convert the array. * @param {Rotation} [result] The object into which to store the result. * @returns {Rotation} The modified result parameter or a new Rotation instance if one was not provided. diff --git a/Source/DataSources/SampledPositionProperty.js b/Source/DataSources/SampledPositionProperty.js index 1d9062ec7b44..d524d26d60a1 100644 --- a/Source/DataSources/SampledPositionProperty.js +++ b/Source/DataSources/SampledPositionProperty.js @@ -274,8 +274,8 @@ define([ * @param {Number[]} packedSamples The array of packed samples. * @param {JulianDate} [epoch] If any of the dates in packedSamples are numbers, they are considered an offset from this epoch, in seconds. */ - SampledPositionProperty.prototype.addSamplesPackedArray = function(data, epoch) { - this._property.addSamplesPackedArray(data, epoch); + SampledPositionProperty.prototype.addSamplesPackedArray = function(packedSamples, epoch) { + this._property.addSamplesPackedArray(packedSamples, epoch); }; /** diff --git a/Source/DataSources/StaticGroundGeometryColorBatch.js b/Source/DataSources/StaticGroundGeometryColorBatch.js index aa19dc270bba..bc0bda478422 100644 --- a/Source/DataSources/StaticGroundGeometryColorBatch.js +++ b/Source/DataSources/StaticGroundGeometryColorBatch.js @@ -2,7 +2,6 @@ define([ '../Core/AssociativeArray', '../Core/Color', - '../Core/ColorGeometryInstanceAttribute', '../Core/defined', '../Core/DistanceDisplayCondition', '../Core/DistanceDisplayConditionGeometryInstanceAttribute', @@ -13,7 +12,6 @@ define([ ], function( AssociativeArray, Color, - ColorGeometryInstanceAttribute, defined, DistanceDisplayCondition, DistanceDisplayConditionGeometryInstanceAttribute, diff --git a/Source/DataSources/VelocityOrientationProperty.js b/Source/DataSources/VelocityOrientationProperty.js index 08022a1b6277..5a23864f1b61 100644 --- a/Source/DataSources/VelocityOrientationProperty.js +++ b/Source/DataSources/VelocityOrientationProperty.js @@ -6,7 +6,6 @@ define([ '../Core/defineProperties', '../Core/Ellipsoid', '../Core/Event', - '../Core/JulianDate', '../Core/Matrix3', '../Core/Quaternion', '../Core/Transforms', @@ -19,7 +18,6 @@ define([ defineProperties, Ellipsoid, Event, - JulianDate, Matrix3, Quaternion, Transforms, diff --git a/Source/DataSources/WallGeometryUpdater.js b/Source/DataSources/WallGeometryUpdater.js index f42c9d84282e..c0b9c0c8c560 100644 --- a/Source/DataSources/WallGeometryUpdater.js +++ b/Source/DataSources/WallGeometryUpdater.js @@ -361,7 +361,7 @@ define([ } else { attributes = { show : show, - distanceDisplayCondition : distanceDisplayConditionAttribute, + distanceDisplayCondition : distanceDisplayConditionAttribute }; } diff --git a/Source/Renderer/AutomaticUniforms.js b/Source/Renderer/AutomaticUniforms.js index 59ee77626ce3..6f71025bf1cb 100644 --- a/Source/Renderer/AutomaticUniforms.js +++ b/Source/Renderer/AutomaticUniforms.js @@ -2,7 +2,7 @@ define([ '../Core/Cartesian3', '../Core/Matrix4', - './WebGLConstants' + '../Core/WebGLConstants' ], function( Cartesian3, Matrix4, @@ -75,7 +75,7 @@ define([ * // Scale the window coordinate components to [0, 1] by dividing * // by the viewport's width and height. * vec2 v = gl_FragCoord.xy / czm_viewport.zw; - * + * * @see Context#getViewport */ czm_viewport : new AutomaticUniform({ @@ -108,7 +108,7 @@ define([ * * // Example * gl_Position = czm_viewportOrthographic * vec4(windowPosition, 0.0, 1.0); - * + * * @see UniformState#viewportOrthographic * @see czm_viewport * @see czm_viewportTransformation @@ -150,7 +150,7 @@ define([ * vec4 q = czm_modelViewProjection * positionMC; // model to clip coordinates * q.xyz /= q.w; // clip to normalized device coordinates (ndc) * q.xyz = (czm_viewportTransformation * vec4(q.xyz, 1.0)).xyz; // ndc to window coordinates - * + * * @see UniformState#viewportTransformation * @see czm_viewport * @see czm_viewportOrthographic @@ -204,7 +204,7 @@ define([ * * // Example * vec4 worldPosition = czm_model * modelPosition; - * + * * @see UniformState#model * @see czm_inverseModel * @see czm_modelView @@ -232,7 +232,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModel * worldPosition; - * + * * @see UniformState#inverseModel * @see czm_model * @see czm_inverseModelView @@ -259,7 +259,7 @@ define([ * * // Example * vec4 eyePosition = czm_view * worldPosition; - * + * * @see UniformState#view * @see czm_viewRotation * @see czm_modelView @@ -292,7 +292,7 @@ define([ * * // Example * vec4 eyePosition3D = czm_view3D * worldPosition3D; - * + * * @see UniformState#view3D * @see czm_view */ @@ -318,7 +318,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation * worldVector; - * + * * @see UniformState#viewRotation * @see czm_view * @see czm_inverseView @@ -349,7 +349,7 @@ define([ * * // Example * vec3 eyeVector = czm_viewRotation3D * worldVector; - * + * * @see UniformState#viewRotation3D * @see czm_viewRotation */ @@ -375,7 +375,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView * eyePosition; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_inverseNormal @@ -405,7 +405,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseView3D * eyePosition; - * + * * @see UniformState#inverseView3D * @see czm_inverseView */ @@ -431,7 +431,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation * eyeVector; - * + * * @see UniformState#inverseView * @see czm_view * @see czm_viewRotation @@ -462,7 +462,7 @@ define([ * * // Example * vec4 worldVector = czm_inverseViewRotation3D * eyeVector; - * + * * @see UniformState#inverseView3D * @see czm_inverseViewRotation */ @@ -489,7 +489,7 @@ define([ * * // Example * gl_Position = czm_projection * eyePosition; - * + * * @see UniformState#projection * @see czm_viewProjection * @see czm_modelViewProjection @@ -518,7 +518,7 @@ define([ * * // Example * vec4 eyePosition = czm_inverseProjection * clipPosition; - * + * * @see UniformState#inverseProjection * @see czm_projection */ @@ -558,7 +558,7 @@ define([ * * // Example * gl_Position = czm_infiniteProjection * eyePosition; - * + * * @see UniformState#infiniteProjection * @see czm_projection * @see czm_modelViewInfiniteProjection @@ -591,7 +591,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelView * @see czm_model * @see czm_view @@ -629,7 +629,7 @@ define([ * * // The above is equivalent to, but more efficient than: * vec4 eyePosition = czm_view3D * czm_model * modelPosition; - * + * * @see UniformState#modelView3D * @see czm_modelView */ @@ -689,7 +689,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_modelView */ @@ -718,7 +718,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelView3D * eyePosition; - * + * * @see UniformState#inverseModelView * @see czm_inverseModelView * @see czm_modelView3D @@ -749,7 +749,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#viewProjection * @see czm_view * @see czm_projection @@ -779,7 +779,7 @@ define([ * * // Example * vec4 worldPosition = czm_inverseViewProjection * clipPosition; - * + * * @see UniformState#inverseViewProjection * @see czm_viewProjection */ @@ -809,7 +809,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_projection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewProjection * @see czm_model * @see czm_view @@ -842,7 +842,7 @@ define([ * * // Example * vec4 modelPosition = czm_inverseModelViewProjection * clipPosition; - * + * * @see UniformState#modelViewProjection * @see czm_modelViewProjection */ @@ -909,7 +909,7 @@ define([ * * // The above is equivalent to, but more efficient than: * gl_Position = czm_infiniteProjection * czm_view * czm_model * modelPosition; - * + * * @see UniformState#modelViewInfiniteProjection * @see czm_model * @see czm_view @@ -941,7 +941,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal * normal; - * + * * @see UniformState#normal * @see czm_inverseNormal * @see czm_modelView @@ -975,7 +975,7 @@ define([ * * // Example * vec3 eyeNormal = czm_normal3D * normal; - * + * * @see UniformState#normal3D * @see czm_normal */ @@ -1002,7 +1002,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal * normalEC; - * + * * @see UniformState#inverseNormal * @see czm_normal * @see czm_modelView @@ -1035,7 +1035,7 @@ define([ * * // Example * vec3 normalMC = czm_inverseNormal3D * normalEC; - * + * * @see UniformState#inverseNormal3D * @see czm_inverseNormal */ @@ -1079,7 +1079,7 @@ define([ * * // Example * float frustumLength = czm_entireFrustum.y - czm_entireFrustum.x; - * + * * @see UniformState#entireFrustum * @see czm_currentFrustum */ @@ -1106,7 +1106,7 @@ define([ * * // Example * float frustumLength = czm_currentFrustum.y - czm_currentFrustum.x; - * + * * @see UniformState#currentFrustum * @see czm_entireFrustum */ @@ -1143,7 +1143,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionWC; - * + * * @see UniformState#sunPositionWC * @see czm_sunPositionColumbusView * @see czm_sunDirectionWC @@ -1166,7 +1166,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunPositionColumbusView; - * + * * @see UniformState#sunPositionColumbusView * @see czm_sunPositionWC */ @@ -1192,7 +1192,7 @@ define([ * * // Example * float diffuse = max(dot(czm_sunDirectionEC, normalEC), 0.0); - * + * * @see UniformState#sunDirectionEC * @see czm_moonDirectionEC * @see czm_sunDirectionWC @@ -1216,7 +1216,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_sunDirectionWC; - * + * * @see UniformState#sunDirectionWC * @see czm_sunPositionWC * @see czm_sunDirectionEC @@ -1243,7 +1243,7 @@ define([ * * // Example * float diffuse = max(dot(czm_moonDirectionEC, normalEC), 0.0); - * + * * @see UniformState#moonDirectionEC * @see czm_sunDirectionEC */ @@ -1267,7 +1267,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCHigh; - * + * * @see czm_encodedCameraPositionMCLow * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1292,7 +1292,7 @@ define([ * @example * // GLSL declaration * uniform vec3 czm_encodedCameraPositionMCLow; - * + * * @see czm_encodedCameraPositionMCHigh * @see czm_modelViewRelativeToEye * @see czm_modelViewProjectionRelativeToEye @@ -1381,7 +1381,7 @@ define([ * { * eyeHeightSq = czm_eyeHeight2D.y; * } - * + * * @see czm_sceneMode2D * @see czm_sceneModeColumbusView * @see czm_sceneMode3D @@ -1433,7 +1433,7 @@ define([ * * // Example * vec3 pseudoFixed = czm_temeToPseudoFixed * teme; - * + * * @see UniformState#temeToPseudoFixedMatrix * @see Transforms.computeTemeToPseudoFixedMatrix */ @@ -1476,6 +1476,20 @@ define([ getValue : function(uniformState) { return uniformState.fogDensity; } + }), + + /** + * An automatic GLSL uniform scalar representing the geometric tolerance per meter + * + * @alias czm_geometricToleranceOverMeter + * @glslUniform + */ + czm_geometricToleranceOverMeter : new AutomaticUniform({ + size: 1, + datatype: WebGLConstants.FLOAT, + getValue: function(uniformState) { + return uniformState.geometricToleranceOverMeter; + } }) }; diff --git a/Source/Renderer/Buffer.js b/Source/Renderer/Buffer.js index 3c67f1e9db12..edb489e7d313 100644 --- a/Source/Renderer/Buffer.js +++ b/Source/Renderer/Buffer.js @@ -6,8 +6,8 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/IndexDatatype', - './BufferUsage', - './WebGLConstants' + '../Core/WebGLConstants', + './BufferUsage' ], function( defaultValue, defined, @@ -15,8 +15,8 @@ define([ destroyObject, DeveloperError, IndexDatatype, - BufferUsage, - WebGLConstants) { + WebGLConstants, + BufferUsage) { 'use strict'; /** @@ -112,7 +112,7 @@ define([ * typedArray : new Float32Array([0, 0, 0]), * usage : BufferUsage.STATIC_DRAW * }); - * + * * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer} * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with ARRAY_BUFFER * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with ARRAY_BUFFER @@ -145,7 +145,7 @@ define([ * @param {ArrayBufferView} [options.typedArray] A typed array containing the data to copy to the buffer. * @param {Number} [options.sizeInBytes] A Number defining the size of the buffer in bytes. Required if options.typedArray is not given. * @param {BufferUsage} options.usage Specifies the expected usage pattern of the buffer. On some GL implementations, this can significantly affect performance. See {@link BufferUsage}. - * @param {IndexDatatype} indexDatatype The datatype of indices in the buffer. + * @param {IndexDatatype} options.indexDatatype The datatype of indices in the buffer. * @returns {IndexBuffer} The index buffer, ready to be attached to a vertex array. * * @exception {DeveloperError} Must specify either or , but not both. @@ -173,7 +173,7 @@ define([ * usage : BufferUsage.STATIC_DRAW, * indexDatatype : IndexDatatype.UNSIGNED_SHORT * }); - * + * * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glGenBuffer.xml|glGenBuffer} * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindBuffer.xml|glBindBuffer} with ELEMENT_ARRAY_BUFFER * @see {@link https://www.khronos.org/opengles/sdk/docs/man/xhtml/glBufferData.xml|glBufferData} with ELEMENT_ARRAY_BUFFER diff --git a/Source/Renderer/BufferUsage.js b/Source/Renderer/BufferUsage.js index ef07eba0c4db..c46034a91992 100644 --- a/Source/Renderer/BufferUsage.js +++ b/Source/Renderer/BufferUsage.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/ComputeCommand.js b/Source/Renderer/ComputeCommand.js index 0c7f29085be8..1eb7f2a24888 100644 --- a/Source/Renderer/ComputeCommand.js +++ b/Source/Renderer/ComputeCommand.js @@ -1,11 +1,9 @@ /*global define*/ define([ '../Core/defaultValue', - '../Core/PrimitiveType', - '../Scene/Pass' + './Pass' ], function( defaultValue, - PrimitiveType, Pass) { 'use strict'; @@ -110,7 +108,7 @@ define([ /** * Executes the compute command. * - * @param {Context} context The context that processes the compute command. + * @param {Context} computeEngine The context that processes the compute command. */ ComputeCommand.prototype.execute = function(computeEngine) { computeEngine.execute(this); diff --git a/Source/Renderer/ComputeEngine.js b/Source/Renderer/ComputeEngine.js index 0a04d4a176a3..13235334a893 100644 --- a/Source/Renderer/ComputeEngine.js +++ b/Source/Renderer/ComputeEngine.js @@ -2,17 +2,11 @@ define([ '../Core/BoundingRectangle', '../Core/Color', - '../Core/ComponentDatatype', - '../Core/defaultValue', '../Core/defined', - '../Core/defineProperties', '../Core/destroyObject', '../Core/DeveloperError', - '../Core/Geometry', - '../Core/GeometryAttribute', '../Core/PrimitiveType', '../Shaders/ViewportQuadVS', - './BufferUsage', './ClearCommand', './DrawCommand', './Framebuffer', @@ -21,17 +15,11 @@ define([ ], function( BoundingRectangle, Color, - ComponentDatatype, - defaultValue, defined, - defineProperties, destroyObject, DeveloperError, - Geometry, - GeometryAttribute, PrimitiveType, ViewportQuadVS, - BufferUsage, ClearCommand, DrawCommand, Framebuffer, diff --git a/Source/Renderer/Context.js b/Source/Renderer/Context.js index 760b0d718346..d60df36489a2 100644 --- a/Source/Renderer/Context.js +++ b/Source/Renderer/Context.js @@ -9,13 +9,12 @@ define([ '../Core/defineProperties', '../Core/destroyObject', '../Core/DeveloperError', - '../Core/FeatureDetection', '../Core/Geometry', '../Core/GeometryAttribute', - '../Core/Math', '../Core/Matrix4', '../Core/PrimitiveType', '../Core/RuntimeError', + '../Core/WebGLConstants', '../Shaders/ViewportQuadVS', './BufferUsage', './ClearCommand', @@ -24,15 +23,12 @@ define([ './DrawCommand', './PassState', './PickFramebuffer', - './PixelDatatype', - './RenderbufferFormat', './RenderState', './ShaderCache', './ShaderProgram', './Texture', './UniformState', - './VertexArray', - './WebGLConstants' + './VertexArray' ], function( clone, Color, @@ -43,13 +39,12 @@ define([ defineProperties, destroyObject, DeveloperError, - FeatureDetection, Geometry, GeometryAttribute, - CesiumMath, Matrix4, PrimitiveType, RuntimeError, + WebGLConstants, ViewportQuadVS, BufferUsage, ClearCommand, @@ -58,15 +53,12 @@ define([ DrawCommand, PassState, PickFramebuffer, - PixelDatatype, - RenderbufferFormat, RenderState, ShaderCache, ShaderProgram, Texture, UniformState, - VertexArray, - WebGLConstants) { + VertexArray) { 'use strict'; /*global WebGLRenderingContext*/ /*global WebGL2RenderingContext*/ @@ -201,6 +193,7 @@ define([ // Override select WebGL defaults webglOptions.alpha = defaultValue(webglOptions.alpha, false); // WebGL default is true + webglOptions.stencil = defaultValue(webglOptions.stencil, true); // WebGL default is false var defaultToWebgl2 = false; var webgl2Supported = (typeof WebGL2RenderingContext !== 'undefined'); @@ -280,6 +273,10 @@ define([ this._fragDepth = !!getExtension(gl, ['EXT_frag_depth']); this._debugShaders = getExtension(gl, ['WEBGL_debug_shaders']); + this._s3tc = !!getExtension(gl, ['WEBGL_compressed_s3tc', 'MOZ_WEBGL_compressed_texture_s3tc', 'WEBKIT_WEBGL_compressed_texture_s3tc']); + this._pvrtc = !!getExtension(gl, ['WEBGL_compressed_texture_pvrtc', 'WEBKIT_WEBGL_compressed_texture_pvrtc']); + this._etc1 = !!getExtension(gl, ['WEBGL_compressed_texture_etc1']); + var textureFilterAnisotropic = options.allowTextureFilterAnisotropic ? getExtension(gl, ['EXT_texture_filter_anisotropic', 'WEBKIT_EXT_texture_filter_anisotropic']) : undefined; this._textureFilterAnisotropic = textureFilterAnisotropic; ContextLimits._maximumTextureFilterAnisotropy = defined(textureFilterAnisotropic) ? gl.getParameter(textureFilterAnisotropic.MAX_TEXTURE_MAX_ANISOTROPY_EXT) : 1.0; @@ -515,6 +512,18 @@ define([ } }, + /** + * true if the WebGL context supports stencil buffers. + * Stencil buffers are not supported by all systems. + * @memberof Context.prototype + * @type {Boolean} + */ + stencilBuffer : { + get : function() { + return this._stencilBits >= 8; + } + }, + /** * true if the WebGL context supports antialiasing. By default * antialiasing is requested, but it is not supported by all systems. @@ -588,6 +597,45 @@ define([ } }, + /** + * true if WEBGL_texture_compression_s3tc is supported. This extension provides + * access to DXT compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_s3tc/} + */ + s3tc : { + get : function() { + return this._s3tc; + } + }, + + /** + * true if WEBGL_texture_compression_pvrtc is supported. This extension provides + * access to PVR compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_pvrtc/} + */ + pvrtc : { + get : function() { + return this._pvrtc; + } + }, + + /** + * true if WEBGL_texture_compression_etc1 is supported. This extension provides + * access to ETC1 compressed textures. + * @memberof Context.prototype + * @type {Boolean} + * @see {@link https://www.khronos.org/registry/webgl/extensions/WEBGL_compressed_texture_etc1/} + */ + etc1 : { + get : function() { + return this._etc1; + } + }, + /** * true if the OES_vertex_array_object extension is supported. This * extension can improve performance by reducing the overhead of switching vertex arrays. @@ -1108,7 +1156,7 @@ define([ * * @example * var object = context.getObjectByPickColor(pickColor); - * + * * @see Context#createPickId */ Context.prototype.getObjectByPickColor = function(pickColor) { @@ -1159,7 +1207,7 @@ define([ * primitive : this, * id : this.id * }); - * + * * @see Context#getObjectByPickColor */ Context.prototype.createPickId = function(object) { diff --git a/Source/Renderer/CubeMap.js b/Source/Renderer/CubeMap.js index 3f033e3391d8..4947d22d9e72 100644 --- a/Source/Renderer/CubeMap.js +++ b/Source/Renderer/CubeMap.js @@ -13,8 +13,7 @@ define([ './PixelDatatype', './Sampler', './TextureMagnificationFilter', - './TextureMinificationFilter', - './TextureWrap' + './TextureMinificationFilter' ], function( defaultValue, defined, @@ -29,8 +28,7 @@ define([ PixelDatatype, Sampler, TextureMagnificationFilter, - TextureMinificationFilter, - TextureWrap) { + TextureMinificationFilter) { 'use strict'; function CubeMap(options) { diff --git a/Source/Renderer/DrawCommand.js b/Source/Renderer/DrawCommand.js index 682f175a3983..e6d23b398b6f 100644 --- a/Source/Renderer/DrawCommand.js +++ b/Source/Renderer/DrawCommand.js @@ -39,7 +39,7 @@ define([ this._debugOverlappingFrustums = 0; this._castShadows = defaultValue(options.castShadows, false); this._receiveShadows = defaultValue(options.receiveShadows, false); - + this.dirty = true; this.lastDirtyTime = 0; @@ -59,6 +59,7 @@ define([ * minimize the number of frustums needed. *

* + * @memberof DrawCommand.prototype * @type {Object} * @default undefined * @@ -80,6 +81,7 @@ define([ * The oriented bounding box of the geometry in world space. If this is defined, it is used instead of * {@link DrawCommand#boundingVolume} for plane intersection testing. * + * @memberof DrawCommand.prototype * @type {OrientedBoundingBox} * @default undefined * @@ -101,6 +103,7 @@ define([ * When true, the renderer frustum and horizon culls the command based on its {@link DrawCommand#boundingVolume}. * If the command was already culled, set this to false for a performance improvement. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default true */ @@ -122,6 +125,7 @@ define([ * When undefined, the geometry is assumed to be defined in world space. *

* + * @memberof DrawCommand.prototype * @type {Matrix4} * @default undefined */ @@ -140,6 +144,7 @@ define([ /** * The type of geometry in the vertex array. * + * @memberof DrawCommand.prototype * @type {PrimitiveType} * @default PrimitiveType.TRIANGLES */ @@ -158,6 +163,7 @@ define([ /** * The vertex array. * + * @memberof DrawCommand.prototype * @type {VertexArray} * @default undefined */ @@ -176,6 +182,7 @@ define([ /** * The number of vertices to draw in the vertex array. * + * @memberof DrawCommand.prototype * @type {Number} * @default undefined */ @@ -194,6 +201,7 @@ define([ /** * The offset to start drawing in the vertex array. * + * @memberof DrawCommand.prototype * @type {Number} * @default 0 */ @@ -212,6 +220,7 @@ define([ /** * The number of instances to draw. * + * @memberof DrawCommand.prototype * @type {Number} * @default 0 */ @@ -230,6 +239,7 @@ define([ /** * The shader program to apply. * + * @memberof DrawCommand.prototype * @type {ShaderProgram} * @default undefined */ @@ -248,6 +258,7 @@ define([ /** * Whether this command should cast shadows when shadowing is enabled. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -266,6 +277,7 @@ define([ /** * Whether this command should receive shadows when shadowing is enabled. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -285,6 +297,7 @@ define([ * An object with functions whose names match the uniforms in the shader program * and return values to set those uniforms. * + * @memberof DrawCommand.prototype * @type {Object} * @default undefined */ @@ -303,6 +316,7 @@ define([ /** * The render state. * + * @memberof DrawCommand.prototype * @type {RenderState} * @default undefined */ @@ -321,6 +335,7 @@ define([ /** * The framebuffer to draw to. * + * @memberof DrawCommand.prototype * @type {Framebuffer} * @default undefined */ @@ -339,6 +354,7 @@ define([ /** * The pass when to render. * + * @memberof DrawCommand.prototype * @type {Pass} * @default undefined */ @@ -358,6 +374,7 @@ define([ * Specifies if this command is only to be executed in the frustum closest * to the eye containing the bounding volume. Defaults to false. * + * @memberof DrawCommand.prototype * @type {Boolean} * @default false */ @@ -379,6 +396,7 @@ define([ * reference to the command, and can be used to selectively execute commands * with {@link Scene#debugCommandFilter}. * + * @memberof DrawCommand.prototype * @type {Object} * @default undefined * @@ -402,6 +420,7 @@ define([ * Draws the {@link DrawCommand#boundingVolume} for this command, assuming it is a sphere, when the command executes. *

* + * @memberof DrawCommand.prototype * @type {Boolean} * @default false * @@ -467,7 +486,7 @@ define([ result._debugOverlappingFrustums = command._debugOverlappingFrustums; result._castShadows = command._castShadows; result._receiveShadows = command._receiveShadows; - + result.dirty = true; result.lastDirtyTime = 0; diff --git a/Source/Renderer/MipmapHint.js b/Source/Renderer/MipmapHint.js index 684525aa0b54..44a633894841 100644 --- a/Source/Renderer/MipmapHint.js +++ b/Source/Renderer/MipmapHint.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/Pass.js b/Source/Renderer/Pass.js similarity index 100% rename from Source/Scene/Pass.js rename to Source/Renderer/Pass.js diff --git a/Source/Renderer/PassState.js b/Source/Renderer/PassState.js index 62d8c25c50d3..4a0e5515143a 100644 --- a/Source/Renderer/PassState.js +++ b/Source/Renderer/PassState.js @@ -1,8 +1,5 @@ /*global define*/ -define([ - '../Core/BoundingRectangle' - ], function( - BoundingRectangle) { +define([], function() { 'use strict'; /** diff --git a/Source/Renderer/PixelDatatype.js b/Source/Renderer/PixelDatatype.js index 02cf54badf07..96358380f8c9 100644 --- a/Source/Renderer/PixelDatatype.js +++ b/Source/Renderer/PixelDatatype.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/RenderState.js b/Source/Renderer/RenderState.js index 523b8711e247..93c074526257 100644 --- a/Source/Renderer/RenderState.js +++ b/Source/Renderer/RenderState.js @@ -5,20 +5,18 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/DeveloperError', - '../Core/RuntimeError', + '../Core/WebGLConstants', '../Core/WindingOrder', - './ContextLimits', - './WebGLConstants' + './ContextLimits' ], function( BoundingRectangle, Color, defaultValue, defined, DeveloperError, - RuntimeError, + WebGLConstants, WindingOrder, - ContextLimits, - WebGLConstants) { + ContextLimits) { 'use strict'; function validateBlendEquation(blendEquation) { @@ -395,7 +393,7 @@ define([ * * @see DrawCommand * @see ClearCommand - * + * * @private */ RenderState.fromCache = function(renderState) { @@ -591,7 +589,7 @@ define([ // Section 6.8 of the WebGL spec requires the reference and masks to be the same for // front- and back-face tests. This call prevents invalid operation errors when calling // stencilFuncSeparate on Firefox. Perhaps they should delay validation to avoid requiring this. - gl.stencilFunc(stencilTest.frontFunction, stencilTest.reference, stencilTest.mask); + gl.stencilFunc(frontFunction, reference, mask); gl.stencilFuncSeparate(gl.BACK, backFunction, reference, mask); gl.stencilFuncSeparate(gl.FRONT, frontFunction, reference, mask); diff --git a/Source/Renderer/RenderbufferFormat.js b/Source/Renderer/RenderbufferFormat.js index 337089c2607c..ce99580b7f02 100644 --- a/Source/Renderer/RenderbufferFormat.js +++ b/Source/Renderer/RenderbufferFormat.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/Texture.js b/Source/Renderer/Texture.js index aa13b97ef5b6..242c91bfba4d 100644 --- a/Source/Renderer/Texture.js +++ b/Source/Renderer/Texture.js @@ -8,14 +8,13 @@ define([ '../Core/DeveloperError', '../Core/Math', '../Core/PixelFormat', + '../Core/WebGLConstants', './ContextLimits', './MipmapHint', './PixelDatatype', './Sampler', './TextureMagnificationFilter', - './TextureMinificationFilter', - './TextureWrap', - './WebGLConstants' + './TextureMinificationFilter' ], function( Cartesian2, defaultValue, @@ -25,16 +24,15 @@ define([ DeveloperError, CesiumMath, PixelFormat, + WebGLConstants, ContextLimits, MipmapHint, PixelDatatype, Sampler, TextureMagnificationFilter, - TextureMinificationFilter, - TextureWrap, - WebGLConstants) { + TextureMinificationFilter) { 'use strict'; - + function Texture(options) { options = defaultValue(options, defaultValue.EMPTY_OBJECT); @@ -62,6 +60,8 @@ define([ var pixelDatatype = defaultValue(options.pixelDatatype, PixelDatatype.UNSIGNED_BYTE); var internalFormat = pixelFormat; + var isCompressed = PixelFormat.isCompressedFormat(internalFormat); + if (context.webgl2) { if (pixelFormat === PixelFormat.DEPTH_STENCIL) { internalFormat = WebGLConstants.DEPTH24_STENCIL8; @@ -99,7 +99,7 @@ define([ throw new DeveloperError('Invalid options.pixelFormat.'); } - if (!PixelDatatype.validate(pixelDatatype)) { + if (!isCompressed && !PixelDatatype.validate(pixelDatatype)) { throw new DeveloperError('Invalid options.pixelDatatype.'); } @@ -125,6 +125,24 @@ define([ throw new DeveloperError('When options.pixelFormat is DEPTH_COMPONENT or DEPTH_STENCIL, this WebGL implementation must support WEBGL_depth_texture. Check context.depthTexture.'); } } + + if (isCompressed) { + if (!defined(source) || !defined(source.arrayBufferView)) { + throw new DeveloperError('When options.pixelFormat is compressed, options.source.arrayBufferView must be defined.'); + } + + if (PixelFormat.isDXTFormat(internalFormat) && !context.s3tc) { + throw new DeveloperError('When options.pixelFormat is S3TC compressed, this WebGL implementation must support the WEBGL_texture_compression_s3tc extension. Check context.s3tc.'); + } else if (PixelFormat.isPVRTCFormat(internalFormat) && !context.pvrtc) { + throw new DeveloperError('When options.pixelFormat is PVRTC compressed, this WebGL implementation must support the WEBGL_texture_compression_pvrtc extension. Check context.pvrtc.'); + } else if (PixelFormat.isETC1Format(internalFormat) && !context.etc1) { + throw new DeveloperError('When options.pixelFormat is ETC1 compressed, this WebGL implementation must support the WEBGL_texture_compression_etc1 extension. Check context.etc1.'); + } + + if (PixelFormat.compressedTextureSize(internalFormat, width, height) !== source.arrayBufferView.byteLength) { + throw new DeveloperError('The byte length of the array buffer is invalid for the compressed texture with the given width and height.'); + } + } //>>includeEnd('debug'); // Use premultiplied alpha for opaque textures should perform better on Chrome: @@ -146,7 +164,11 @@ define([ if (defined(source.arrayBufferView)) { // Source: typed array - gl.texImage2D(textureTarget, 0, internalFormat, width, height, 0, pixelFormat, pixelDatatype, source.arrayBufferView); + if (isCompressed) { + gl.compressedTexImage2D(textureTarget, 0, internalFormat, width, height, 0, source.arrayBufferView); + } else { + gl.texImage2D(textureTarget, 0, internalFormat, width, height, 0, pixelFormat, pixelDatatype, source.arrayBufferView); + } } else if (defined(source.framebuffer)) { // Source: framebuffer if (source.framebuffer !== context.defaultFramebuffer) { @@ -199,7 +221,7 @@ define([ * @returns {Texture} A texture with contents from the framebuffer. * * @exception {DeveloperError} Invalid pixelFormat. - * @exception {DeveloperError} pixelFormat cannot be DEPTH_COMPONENT or DEPTH_STENCIL. + * @exception {DeveloperError} pixelFormat cannot be DEPTH_COMPONENT, DEPTH_STENCIL or a compressed format. * @exception {DeveloperError} framebufferXOffset must be greater than or equal to zero. * @exception {DeveloperError} framebufferYOffset must be greater than or equal to zero. * @exception {DeveloperError} framebufferXOffset + width must be less than or equal to canvas.clientWidth. @@ -211,9 +233,9 @@ define([ * var t = Texture.fromFramebuffer({ * context : context * }); - * + * * @see Sampler - * + * * @private */ Texture.fromFramebuffer = function(options) { @@ -239,27 +261,21 @@ define([ if (!defined(options.context)) { throw new DeveloperError('context is required.'); } - if (!PixelFormat.validate(pixelFormat)) { throw new DeveloperError('Invalid pixelFormat.'); } - - if (PixelFormat.isDepthFormat(pixelFormat)) { - throw new DeveloperError('pixelFormat cannot be DEPTH_COMPONENT or DEPTH_STENCIL.'); + if (PixelFormat.isDepthFormat(pixelFormat) || PixelFormat.isCompressedFormat(pixelFormat)) { + throw new DeveloperError('pixelFormat cannot be DEPTH_COMPONENT, DEPTH_STENCIL or a compressed format.'); } - if (framebufferXOffset < 0) { throw new DeveloperError('framebufferXOffset must be greater than or equal to zero.'); } - if (framebufferYOffset < 0) { throw new DeveloperError('framebufferYOffset must be greater than or equal to zero.'); } - if (framebufferXOffset + width > gl.drawingBufferWidth) { throw new DeveloperError('framebufferXOffset + width must be less than or equal to drawingBufferWidth'); } - if (framebufferYOffset + height > gl.drawingBufferHeight) { throw new DeveloperError('framebufferYOffset + height must be less than or equal to drawingBufferHeight.'); } @@ -381,6 +397,7 @@ define([ * @param {Number} [yOffset=0] The offset in the y direction within the texture to copy into. * * @exception {DeveloperError} Cannot call copyFrom when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL. + * @exception {DeveloperError} Cannot call copyFrom with a compressed texture pixel format. * @exception {DeveloperError} xOffset must be greater than or equal to zero. * @exception {DeveloperError} yOffset must be greater than or equal to zero. * @exception {DeveloperError} xOffset + source.width must be less than or equal to width. @@ -405,6 +422,9 @@ define([ if (PixelFormat.isDepthFormat(this._pixelFormat)) { throw new DeveloperError('Cannot call copyFrom when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call copyFrom with a compressed texture pixel format.'); + } if (xOffset < 0) { throw new DeveloperError('xOffset must be greater than or equal to zero.'); } @@ -447,6 +467,7 @@ define([ * * @exception {DeveloperError} Cannot call copyFromFramebuffer when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL. * @exception {DeveloperError} Cannot call copyFromFramebuffer when the texture pixel data type is FLOAT. + * @exception {DeveloperError} Cannot call copyFrom with a compressed texture pixel format. * @exception {DeveloperError} This texture was destroyed, i.e., destroy() was called. * @exception {DeveloperError} xOffset must be greater than or equal to zero. * @exception {DeveloperError} yOffset must be greater than or equal to zero. @@ -470,6 +491,9 @@ define([ if (this._pixelDatatype === PixelDatatype.FLOAT) { throw new DeveloperError('Cannot call copyFromFramebuffer when the texture pixel data type is FLOAT.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call copyFrom with a compressed texture pixel format.'); + } if (xOffset < 0) { throw new DeveloperError('xOffset must be greater than or equal to zero.'); } @@ -515,6 +539,9 @@ define([ if (PixelFormat.isDepthFormat(this._pixelFormat)) { throw new DeveloperError('Cannot call generateMipmap when the texture pixel format is DEPTH_COMPONENT or DEPTH_STENCIL.'); } + if (PixelFormat.isCompressedFormat(this._pixelFormat)) { + throw new DeveloperError('Cannot call generateMipmap with a compressed pixel format.'); + } if (this._width > 1 && !CesiumMath.isPowerOfTwo(this._width)) { throw new DeveloperError('width must be a power of two to call generateMipmap().'); } diff --git a/Source/Renderer/TextureMagnificationFilter.js b/Source/Renderer/TextureMagnificationFilter.js index a80d73f53bed..777ce3d93506 100644 --- a/Source/Renderer/TextureMagnificationFilter.js +++ b/Source/Renderer/TextureMagnificationFilter.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/TextureMinificationFilter.js b/Source/Renderer/TextureMinificationFilter.js index 1f8cc2ffae65..465816365200 100644 --- a/Source/Renderer/TextureMinificationFilter.js +++ b/Source/Renderer/TextureMinificationFilter.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/TextureWrap.js b/Source/Renderer/TextureWrap.js index a7c08bf83f27..295b45e453e8 100644 --- a/Source/Renderer/TextureWrap.js +++ b/Source/Renderer/TextureWrap.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - './WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Renderer/UniformState.js b/Source/Renderer/UniformState.js index 49ddc5cd50dd..e0f77ea724d3 100644 --- a/Source/Renderer/UniformState.js +++ b/Source/Renderer/UniformState.js @@ -149,6 +149,9 @@ define([ this._resolutionScale = 1.0; this._fogDensity = undefined; + + this._pixelSizePerMeter = undefined; + this._geometricToleranceOverMeter = undefined; } defineProperties(UniformState.prototype, { @@ -767,6 +770,17 @@ define([ } }, + /** + * A scalar that represents the geometric tolerance per meter + * @memberof UniformStat.prototype + * @type {Number} + */ + geometricToleranceOverMeter: { + get: function() { + return this._geometricToleranceOverMeter; + } + }, + /** * @memberof UniformState.prototype * @type {Pass} @@ -935,6 +949,17 @@ define([ this._frameState = frameState; this._temeToPseudoFixed = Transforms.computeTemeToPseudoFixedMatrix(frameState.time, this._temeToPseudoFixed); + + var fov = camera.frustum.fov; + var viewport = this._viewport; + var pixelSizePerMeter; + if (viewport.height > viewport.width) { + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.height; + } else { + pixelSizePerMeter = Math.tan(0.5 * fov) * 2.0 / viewport.width; + } + + this._geometricToleranceOverMeter = pixelSizePerMeter * frameState.maximumScreenSpaceError; }; function cleanViewport(uniformState) { diff --git a/Source/Renderer/createUniformArray.js b/Source/Renderer/createUniformArray.js index 843aeb77060b..0a55769997ab 100644 --- a/Source/Renderer/createUniformArray.js +++ b/Source/Renderer/createUniformArray.js @@ -5,7 +5,6 @@ define([ '../Core/Cartesian4', '../Core/Color', '../Core/defined', - '../Core/defineProperties', '../Core/DeveloperError', '../Core/Matrix2', '../Core/Matrix3', @@ -17,7 +16,6 @@ define([ Cartesian4, Color, defined, - defineProperties, DeveloperError, Matrix2, Matrix3, diff --git a/Source/Scene/ArcGisMapServerImageryProvider.js b/Source/Scene/ArcGisMapServerImageryProvider.js index e1dad05e3f3b..07582d61c50a 100644 --- a/Source/Scene/ArcGisMapServerImageryProvider.js +++ b/Source/Scene/ArcGisMapServerImageryProvider.js @@ -9,7 +9,6 @@ define([ '../Core/defineProperties', '../Core/DeveloperError', '../Core/Event', - '../Core/GeographicProjection', '../Core/GeographicTilingScheme', '../Core/loadJson', '../Core/loadJsonp', @@ -34,7 +33,6 @@ define([ defineProperties, DeveloperError, Event, - GeographicProjection, GeographicTilingScheme, loadJson, loadJsonp, @@ -109,7 +107,7 @@ define([ * var esri = new Cesium.ArcGisMapServerImageryProvider({ * url : 'https://services.arcgisonline.com/ArcGIS/rest/services/World_Imagery/MapServer' * }); - * + * * @see {@link http://resources.esri.com/help/9.3/arcgisserver/apis/rest/|ArcGIS Server REST API} * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ @@ -550,6 +548,8 @@ define([ /** * Gets the comma-separated list of layer IDs to show. + * @memberof ArcGisMapServerImageryProvider.prototype + * * @type {String} */ layers : { diff --git a/Source/Scene/BatchTable.js b/Source/Scene/BatchTable.js index db4f835a36f8..1ba2b365af69 100644 --- a/Source/Scene/BatchTable.js +++ b/Source/Scene/BatchTable.js @@ -9,6 +9,7 @@ define([ '../Core/defineProperties', '../Core/destroyObject', '../Core/DeveloperError', + '../Core/Math', '../Core/PixelFormat', '../Core/RuntimeError', '../Renderer/ContextLimits', @@ -27,6 +28,7 @@ define([ defineProperties, destroyObject, DeveloperError, + CesiumMath, PixelFormat, RuntimeError, ContextLimits, @@ -44,6 +46,7 @@ define([ * @constructor * @private * + * @param {Context} context The context in which the batch table is created. * @param {Object[]} attributes An array of objects describing a per instance attribute. Each object contains a datatype, components per attributes, whether it is normalized and a function name * to retrieve the value in the vertex shader. * @param {Number} numberOfInstances The number of instances in a batch table. @@ -60,7 +63,7 @@ define([ * componentsPerAttribute : 4, * normalize : true * }]; - * var batchTable = new BatchTable(attributes, 5); + * var batchTable = new BatchTable(context, attributes, 5); * * // when creating the draw commands, update the uniform map and the vertex shader * vertexShaderSource = batchTable.getVertexShaderCallback()(vertexShaderSource); @@ -83,8 +86,11 @@ define([ * // ... * } */ - function BatchTable(attributes, numberOfInstances) { + function BatchTable(context, attributes, numberOfInstances) { //>>includeStart('debug', pragmas.debug); + if (!defined(context)) { + throw new DeveloperError('context is required'); + } if (!defined(attributes)) { throw new DeveloperError('attributes is required'); } @@ -96,13 +102,27 @@ define([ this._attributes = attributes; this._numberOfInstances = numberOfInstances; + if (attributes.length === 0) { + return; + } + + // PERFORMANCE_IDEA: We may be able to arrange the attributes so they can be packing into fewer texels. + // Right now, an attribute with one component uses an entire texel when 4 single component attributes can + // be packed into a texel. + // + // Packing floats into unsigned byte textures makes the problem worse. A single component float attribute + // will be packed into a single texel leaving 3 texels unused. 4 texels are reserved for each float attribute + // regardless of how many components it has. var pixelDatatype = getDatatype(attributes); + var textureFloatSupported = context.floatingPointTexture; + var packFloats = pixelDatatype === PixelDatatype.FLOAT && !textureFloatSupported; + var offsets = createOffsets(attributes, packFloats); - var numberOfAttributes = attributes.length; - var maxNumberOfInstancesPerRow = Math.floor(ContextLimits.maximumTextureSize / numberOfAttributes); + var stride = getStride(offsets, attributes, packFloats); + var maxNumberOfInstancesPerRow = Math.floor(ContextLimits.maximumTextureSize / stride); var instancesPerWidth = Math.min(numberOfInstances, maxNumberOfInstancesPerRow); - var width = numberOfAttributes * instancesPerWidth; + var width = stride * instancesPerWidth; var height = Math.ceil(numberOfInstances / instancesPerWidth); var stepX = 1.0 / width; @@ -112,11 +132,14 @@ define([ this._textureDimensions = new Cartesian2(width, height); this._textureStep = new Cartesian4(stepX, centerX, stepY, centerY); - this._pixelDatatype = pixelDatatype; + this._pixelDatatype = !packFloats ? pixelDatatype : PixelDatatype.UNSIGNED_BYTE; + this._packFloats = packFloats; + this._offsets = offsets; + this._stride = stride; this._texture = undefined; - var batchLength = width * height * 4; - this._batchValues = pixelDatatype === PixelDatatype.FLOAT ? new Float32Array(batchLength) : new Uint8Array(batchLength); + var batchLength = 4 * width * height; + this._batchValues = pixelDatatype === PixelDatatype.FLOAT && !packFloats ? new Float32Array(batchLength) : new Uint8Array(batchLength); this._batchValuesDirty = false; } @@ -169,6 +192,134 @@ define([ return Number; } + function createOffsets(attributes, packFloats) { + var offsets = new Array(attributes.length); + + var currentOffset = 0; + var attributesLength = attributes.length; + for (var i = 0; i < attributesLength; ++i) { + var attribute = attributes[i]; + var componentDatatype = attribute.componentDatatype; + + offsets[i] = currentOffset; + + if (componentDatatype !== ComponentDatatype.UNSIGNED_BYTE && packFloats) { + currentOffset += 4; + } else { + ++currentOffset; + } + } + + return offsets; + } + + function getStride(offsets, attributes, packFloats) { + var length = offsets.length; + var lastOffset = offsets[length - 1]; + var lastAttribute = attributes[length - 1]; + var componentDatatype = lastAttribute.componentDatatype; + + if (componentDatatype !== ComponentDatatype.UNSIGNED_BYTE && packFloats) { + return lastOffset + 4; + } + return lastOffset + 1; + } + + var scratchPackedFloatCartesian4 = new Cartesian4(); + + var SHIFT_LEFT_8 = 256.0; + var SHIFT_LEFT_16 = 65536.0; + var SHIFT_LEFT_24 = 16777216.0; + + var SHIFT_RIGHT_8 = 1.0 / SHIFT_LEFT_8; + var SHIFT_RIGHT_16 = 1.0 / SHIFT_LEFT_16; + var SHIFT_RIGHT_24 = 1.0 / SHIFT_LEFT_24; + + var BIAS = 38.0; + + function unpackFloat(value) { + var temp = value.w / 2.0; + var exponent = Math.floor(temp); + var sign = (temp - exponent) * 2.0; + exponent = exponent - BIAS; + + sign = sign * 2.0 - 1.0; + sign = -sign; + + if (exponent >= BIAS) { + return sign < 0.0 ? Number.NEGATIVE_INFINITY : Number.POSITIVE_INFINITY; + } + + var unpacked = sign * value.x * SHIFT_RIGHT_8; + unpacked += sign * value.y * SHIFT_RIGHT_16; + unpacked += sign * value.z * SHIFT_RIGHT_24; + + return unpacked * Math.pow(10.0, exponent); + } + + function getPackedFloat(array, index, result) { + var packed = Cartesian4.unpack(array, index, scratchPackedFloatCartesian4); + var x = unpackFloat(packed); + + packed = Cartesian4.unpack(array, index + 4, scratchPackedFloatCartesian4); + var y = unpackFloat(packed); + + packed = Cartesian4.unpack(array, index + 8, scratchPackedFloatCartesian4); + var z = unpackFloat(packed); + + packed = Cartesian4.unpack(array, index + 12, scratchPackedFloatCartesian4); + var w = unpackFloat(packed); + + return Cartesian4.fromElements(x, y, z, w, result); + } + + var scratchFloatArray = new Float32Array(1); + + function packFloat(value, result) { + scratchFloatArray[0] = value; + value = scratchFloatArray[0]; + + if (value === 0.0) { + return Cartesian4.clone(Cartesian4.ZERO, result); + } + + var sign = value < 0.0 ? 1.0 : 0.0; + var exponent; + + if (!isFinite(value)) { + value = 0.1; + exponent = BIAS; + } else { + value = Math.abs(value); + exponent = Math.floor(CesiumMath.logBase(value, 10)) + 1.0; + value = value / Math.pow(10.0, exponent); + } + + var temp = value * SHIFT_LEFT_8; + result.x = Math.floor(temp); + temp = (temp - result.x) * SHIFT_LEFT_8; + result.y = Math.floor(temp); + temp = (temp - result.y) * SHIFT_LEFT_8; + result.z = Math.floor(temp); + result.w = (exponent + BIAS) * 2.0 + sign; + + return result; + } + + function setPackedAttribute(value, array, index) { + var packed = packFloat(value.x, scratchPackedFloatCartesian4); + Cartesian4.pack(packed, array, index); + + packed = packFloat(value.y, packed); + Cartesian4.pack(packed, array, index + 4); + + packed = packFloat(value.z, packed); + Cartesian4.pack(packed, array, index + 8); + + packed = packFloat(value.w, packed); + Cartesian4.pack(packed, array, index + 12); + } + var scratchGetAttributeCartesian4 = new Cartesian4(); /** @@ -193,8 +344,17 @@ define([ //>>includeEnd('debug'); var attributes = this._attributes; - var index = 4 * attributes.length * instanceIndex + 4 * attributeIndex; - var value = Cartesian4.unpack(this._batchValues, index, scratchGetAttributeCartesian4); + var offset = this._offsets[attributeIndex]; + var stride = this._stride; + + var index = 4 * stride * instanceIndex + 4 * offset; + var value; + + if (this._packFloats && attributes[attributeIndex].componentDatatype !== PixelDatatype.UNSIGNED_BYTE) { + value = getPackedFloat(this._batchValues, index, scratchGetAttributeCartesian4); + } else { + value = Cartesian4.unpack(this._batchValues, index, scratchGetAttributeCartesian4); + } var attributeType = getAttributeType(attributes, attributeIndex); if (defined(attributeType.fromCartesian4)) { @@ -247,8 +407,15 @@ define([ attributeValue.z = defined(value.z) ? value.z : 0.0; attributeValue.w = defined(value.w) ? value.w : 0.0; - var index = 4 * attributes.length * instanceIndex + 4 * attributeIndex; - Cartesian4.pack(attributeValue, this._batchValues, index); + var offset = this._offsets[attributeIndex]; + var stride = this._stride; + var index = 4 * stride * instanceIndex + 4 * offset; + + if (this._packFloats && attributes[attributeIndex].componentDatatype !== PixelDatatype.UNSIGNED_BYTE) { + setPackedAttribute(attributeValue, this._batchValues, index); + } else { + Cartesian4.pack(attributeValue, this._batchValues, index); + } this._batchValuesDirty = true; }; @@ -284,20 +451,14 @@ define([ * @exception {RuntimeError} The floating point texture extension is required but not supported. */ BatchTable.prototype.update = function(frameState) { - var context = frameState.context; - if (this._pixelDatatype === PixelDatatype.FLOAT && !context.floatingPointTexture) { - // We could probably pack the floats to RGBA unsigned bytes but that would add a lot CPU and memory overhead. - throw new RuntimeError('The floating point texture extension is required but not supported.'); - } - - if (defined(this._texture) && !this._batchValuesDirty) { + if ((defined(this._texture) && !this._batchValuesDirty) || this._attributes.length === 0) { return; } this._batchValuesDirty = false; if (!defined(this._texture)) { - createTexture(this, context); + createTexture(this, frameState.context); } updateTexture(this); }; @@ -310,6 +471,10 @@ define([ BatchTable.prototype.getUniformMapCallback = function() { var that = this; return function(uniformMap) { + if (that._attributes.length === 0) { + return uniformMap; + } + var batchUniformMap = { batchTexture : function() { return that._texture; @@ -321,13 +486,12 @@ define([ return that._textureStep; } }; - return combine(uniformMap, batchUniformMap); }; }; function getGlslComputeSt(batchTable) { - var numberOfAttributes = batchTable._attributes.length; + var stride = batchTable._stride; // GLSL batchId is zero-based: [0, numberOfInstances - 1] if (batchTable._textureDimensions.y === 1) { @@ -336,7 +500,7 @@ define([ '{ \n' + ' float stepX = batchTextureStep.x; \n' + ' float centerX = batchTextureStep.y; \n' + - ' float numberOfAttributes = float('+ numberOfAttributes + '); \n' + + ' float numberOfAttributes = float('+ stride + '); \n' + ' return vec2(centerX + (batchId * numberOfAttributes * stepX), 0.5); \n' + '} \n'; } @@ -349,13 +513,34 @@ define([ ' float centerX = batchTextureStep.y; \n' + ' float stepY = batchTextureStep.z; \n' + ' float centerY = batchTextureStep.w; \n' + - ' float numberOfAttributes = float('+ numberOfAttributes + '); \n' + + ' float numberOfAttributes = float('+ stride + '); \n' + ' float xId = mod(batchId * numberOfAttributes, batchTextureDimensions.x); \n' + ' float yId = floor(batchId * numberOfAttributes / batchTextureDimensions.x); \n' + ' return vec2(centerX + (xId * stepX), 1.0 - (centerY + (yId * stepY))); \n' + '} \n'; } + function getGlslUnpackFloat(batchTable) { + if (!batchTable._packFloats) { + return ''; + } + + return 'float unpackFloat(vec4 value) \n' + + '{ \n' + + ' value *= 255.0; \n' + + ' float temp = value.w / 2.0; \n' + + ' float exponent = floor(temp); \n' + + ' float sign = (temp - exponent) * 2.0; \n' + + ' exponent = exponent - float(' + BIAS + '); \n' + + ' sign = sign * 2.0 - 1.0; \n' + + ' sign = -sign; \n' + + ' float unpacked = sign * value.x * float(' + SHIFT_RIGHT_8 + '); \n' + + ' unpacked += sign * value.y * float(' + SHIFT_RIGHT_16 + '); \n' + + ' unpacked += sign * value.z * float(' + SHIFT_RIGHT_24 + '); \n' + + ' return unpacked * pow(10.0, exponent); \n' + + '} \n'; + } + function getComponentType(componentsPerAttribute) { if (componentsPerAttribute === 1) { return 'float'; @@ -382,15 +567,28 @@ define([ var functionReturnType = getComponentType(componentsPerAttribute); var functionReturnValue = getComponentSwizzle(componentsPerAttribute); + var offset = batchTable._offsets[attributeIndex]; + var glslFunction = functionReturnType + ' ' + functionName + '(float batchId) \n' + '{ \n' + ' vec2 st = computeSt(batchId); \n' + - ' st.x += batchTextureStep.x * float(' + attributeIndex + '); \n' + - ' vec4 textureValue = texture2D(batchTexture, st); \n' + - ' ' + functionReturnType + ' value = textureValue' + functionReturnValue + '; \n'; + ' st.x += batchTextureStep.x * float(' + offset + '); \n'; - if (batchTable._pixelDatatype === PixelDatatype.UNSIGNED_BYTE && !attribute.normalize) { + if (batchTable._packFloats && attribute.componentDatatype !== PixelDatatype.UNSIGNED_BYTE) { + glslFunction += 'vec4 textureValue; \n' + + 'textureValue.x = unpackFloat(texture2D(batchTexture, st)); \n' + + 'textureValue.y = unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x, 0.0))); \n' + + 'textureValue.z = unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x * 2.0, 0.0))); \n' + + 'textureValue.w = unpackFloat(texture2D(batchTexture, st + vec2(batchTextureStep.x * 3.0, 0.0))); \n'; + + } else { + glslFunction += ' vec4 textureValue = texture2D(batchTexture, st); \n'; + } + + glslFunction += ' ' + functionReturnType + ' value = textureValue' + functionReturnValue + '; \n'; + + if (batchTable._pixelDatatype === PixelDatatype.UNSIGNED_BYTE && attribute.componentDatatype === ComponentDatatype.UNSIGNED_BYTE && !attribute.normalize) { glslFunction += 'value *= 255.0; \n'; } else if (batchTable._pixelDatatype === PixelDatatype.FLOAT && attribute.componentDatatype === ComponentDatatype.UNSIGNED_BYTE && attribute.normalize) { glslFunction += 'value /= 255.0; \n'; @@ -408,10 +606,17 @@ define([ * @returns {BatchTable~updateVertexShaderSourceCallback} A callback for updating a vertex shader source. */ BatchTable.prototype.getVertexShaderCallback = function() { + var attributes = this._attributes; + if (attributes.length === 0) { + return function(source) { + return source; + }; + } + var batchTableShader = 'uniform sampler2D batchTexture; \n'; batchTableShader += getGlslComputeSt(this) + '\n'; + batchTableShader += getGlslUnpackFloat(this) + '\n'; - var attributes = this._attributes; var length = attributes.length; for (var i = 0; i < length; ++i) { batchTableShader += getGlslAttributeFunction(this, i); diff --git a/Source/Scene/Batched3DModel3DTileContent.js b/Source/Scene/Batched3DModel3DTileContent.js index 16b62638bee7..1fd6ce2dddc2 100644 --- a/Source/Scene/Batched3DModel3DTileContent.js +++ b/Source/Scene/Batched3DModel3DTileContent.js @@ -15,9 +15,9 @@ define([ '../Core/RequestScheduler', '../Core/RequestType', '../ThirdParty/when', - './Cesium3DTileFeature', './Cesium3DTileBatchTable', './Cesium3DTileContentState', + './Cesium3DTileFeature', './getAttributeOrUniformBySemantic', './Model' ], function( @@ -36,9 +36,9 @@ define([ RequestScheduler, RequestType, when, - Cesium3DTileFeature, Cesium3DTileBatchTable, Cesium3DTileContentState, + Cesium3DTileFeature, getAttributeOrUniformBySemantic, Model) { 'use strict'; @@ -72,6 +72,9 @@ define([ this._features = undefined; } + // This can be overridden for testing purposes + Batched3DModel3DTileContent._deprecationWarning = deprecationWarning; + defineProperties(Batched3DModel3DTileContent.prototype, { /** * Part of the {@link Cesium3DTileContent} interface. @@ -122,11 +125,11 @@ define([ } } - /** + /** * Part of the {@link Cesium3DTileContent} interface. */ - Batched3DModel3DTileContent.prototype.hasProperty = function(name) { - return this.batchTable.hasProperty(name); + Batched3DModel3DTileContent.prototype.hasProperty = function(batchId, name) { + return this.batchTable.hasProperty(batchId, name); }; /** @@ -178,11 +181,22 @@ define([ return true; }; + function getBatchIdAttributeName(gltf) { + var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, '_BATCHID'); + if (!defined(batchIdAttributeName)) { + batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + if (defined(batchIdAttributeName)) { + Batched3DModel3DTileContent._deprecationWarning('b3dm-legacy-batchid', 'The glTF in this b3dm uses the semantic `BATCHID`. Application-specific semantics should be prefixed with an underscore: `_BATCHID`.'); + } + } + return batchIdAttributeName; + } + function getVertexShaderCallback(content) { return function(vs) { var batchTable = content.batchTable; var gltf = content._model.gltf; - var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + var batchIdAttributeName = getBatchIdAttributeName(gltf); var callback = batchTable.getVertexShaderCallback(true, batchIdAttributeName); return defined(callback) ? callback(vs) : vs; }; @@ -192,7 +206,7 @@ define([ return function(vs) { var batchTable = content.batchTable; var gltf = content._model.gltf; - var batchIdAttributeName = getAttributeOrUniformBySemantic(gltf, 'BATCHID'); + var batchIdAttributeName = getBatchIdAttributeName(gltf); var callback = batchTable.getPickVertexShaderCallback(batchIdAttributeName); return defined(callback) ? callback(vs) : vs; }; @@ -296,13 +310,15 @@ define([ basePath : getBaseUri(this._url), modelMatrix : this._tile.computedTransform, shadows: this._tileset.shadows, + debugWireframe: this._tileset.debugWireframe, incrementallyLoadTextures : false, vertexShaderLoaded : getVertexShaderCallback(this), fragmentShaderLoaded : getFragmentShaderCallback(this), uniformMapLoaded : batchTable.getUniformMapCallback(), pickVertexShaderLoaded : getPickVertexShaderCallback(this), pickFragmentShaderLoaded : batchTable.getPickFragmentShaderCallback(), - pickUniformMapLoaded : batchTable.getPickUniformMapCallback() + pickUniformMapLoaded : batchTable.getPickUniformMapCallback(), + addBatchIdToGeneratedShaders : (batchLength > 0) // If the batch table has values in it, generated shaders will need a batchId attribute }); this._model = model; @@ -350,6 +366,7 @@ define([ this.batchTable.update(tileset, frameState); this._model.modelMatrix = this._tile.computedTransform; this._model.shadows = this._tileset.shadows; + this._model.debugWireframe = this._tileset.debugWireframe; this._model.update(frameState); frameState.addCommand = oldAddCommand; diff --git a/Source/Scene/Billboard.js b/Source/Scene/Billboard.js index 814aa5fcbd3d..b51d5d8dc59c 100644 --- a/Source/Scene/Billboard.js +++ b/Source/Scene/Billboard.js @@ -194,6 +194,7 @@ define([ * of removing it and re-adding it to the collection. * @memberof Billboard.prototype * @type {Boolean} + * @default true */ show : { get : function() { @@ -468,10 +469,10 @@ define([ /** * Gets or sets the horizontal origin of this billboard, which determines if the billboard is - * to the left, center, or right of its position. + * to the left, center, or right of its anchor position. *

*
- *
+ *
*
* @memberof Billboard.prototype * @type {HorizontalOrigin} @@ -500,10 +501,10 @@ define([ /** * Gets or sets the vertical origin of this billboard, which determines if the billboard is - * to the above, below, or at the center of its position. + * to the above, below, or at the center of its anchor position. *

*
- *
+ *
*
* @memberof Billboard.prototype * @type {VerticalOrigin} @@ -1132,9 +1133,7 @@ define([ return SceneTransforms.computeActualWgs84Position(frameState, tempCartesian3); }; - var scratchCartesian2 = new Cartesian2(); var scratchCartesian3 = new Cartesian3(); - var scratchComputePixelOffset = new Cartesian2(); // This function is basically a stripped-down JavaScript version of BillboardCollectionVS.glsl Billboard._computeScreenSpacePosition = function(modelMatrix, position, eyeOffset, pixelOffset, scene, result) { @@ -1148,10 +1147,7 @@ define([ } // Apply pixel offset - pixelOffset = Cartesian2.clone(pixelOffset, scratchComputePixelOffset); - var po = Cartesian2.multiplyByScalar(pixelOffset, scene.context.uniformState.resolutionScale, scratchCartesian2); - positionWC.x += po.x; - positionWC.y += po.y; + Cartesian2.add(positionWC, pixelOffset, positionWC); return positionWC; }; @@ -1227,7 +1223,7 @@ define([ } var y = screenSpacePosition.y; - if (billboard.verticalOrigin === VerticalOrigin.TOP) { + if (billboard.verticalOrigin === VerticalOrigin.BOTTOM || billboard.verticalOrigin === VerticalOrigin.BASELINE) { y -= height; } else if (billboard.verticalOrigin === VerticalOrigin.CENTER) { y -= height * 0.5; diff --git a/Source/Scene/BillboardCollection.js b/Source/Scene/BillboardCollection.js index d7a0bdb0b821..648efd647480 100644 --- a/Source/Scene/BillboardCollection.js +++ b/Source/Scene/BillboardCollection.js @@ -15,9 +15,11 @@ define([ '../Core/IndexDatatype', '../Core/Math', '../Core/Matrix4', + '../Core/WebGLConstants', '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -28,7 +30,6 @@ define([ './BlendingState', './HeightReference', './HorizontalOrigin', - './Pass', './SceneMode', './TextureAtlas', './VerticalOrigin' @@ -48,9 +49,11 @@ define([ IndexDatatype, CesiumMath, Matrix4, + WebGLConstants, Buffer, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -61,7 +64,6 @@ define([ BlendingState, HeightReference, HorizontalOrigin, - Pass, SceneMode, TextureAtlas, VerticalOrigin) { @@ -408,12 +410,23 @@ define([ * position : Cesium.Cartesian3.ZERO, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, + * heightReference : Cesium.HeightReference.NONE, * horizontalOrigin : Cesium.HorizontalOrigin.CENTER, * verticalOrigin : Cesium.VerticalOrigin.CENTER, * scale : 1.0, * image : 'url/to/image', + * imageSubRegion : undefined, * color : Cesium.Color.WHITE, - * id : undefined + * id : undefined, + * rotation : 0.0, + * alignedAxis : Cesium.Cartesian3.ZERO, + * width : undefined, + * height : undefined, + * scaleByDistance : undefined, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * sizeInMeters : false, + * distanceDisplayCondition : undefined * }); * * @example @@ -824,6 +837,11 @@ define([ show = false; } + // Raw billboards don't distinguish between BASELINE and BOTTOM, only LabelCollection does that. + if (verticalOrigin === VerticalOrigin.BASELINE) { + verticalOrigin = VerticalOrigin.BOTTOM; + } + billboardCollection._allHorizontalCenter = billboardCollection._allHorizontalCenter && horizontalOrigin === HorizontalOrigin.CENTER; billboardCollection._allVerticalCenter = billboardCollection._allVerticalCenter && verticalOrigin === VerticalOrigin.CENTER; @@ -928,7 +946,7 @@ define([ } var textureWidth = billboardCollection._textureAtlas.texture.width; - var imageWidth = Math.ceil(defaultValue(billboard.width, textureWidth * width) * 0.5); + var imageWidth = Math.round(defaultValue(billboard.width, textureWidth * width)); billboardCollection._maxSize = Math.max(billboardCollection._maxSize, imageWidth); var compressed0 = CesiumMath.clamp(imageWidth, 0.0, LEFT_SHIFT16); @@ -983,7 +1001,7 @@ define([ } var dimensions = billboardCollection._textureAtlas.texture.dimensions; - var imageHeight = Math.ceil(defaultValue(billboard.height, dimensions.y * height) * 0.5); + var imageHeight = Math.round(defaultValue(billboard.height, dimensions.y * height)); billboardCollection._maxSize = Math.max(billboardCollection._maxSize, imageHeight); var red = Color.floatToByte(color.red); @@ -1461,7 +1479,8 @@ define([ if (!defined(this._rs)) { this._rs = RenderState.fromCache({ depthTest : { - enabled : true + enabled : true, + func : WebGLConstants.LEQUAL // Allows label glyphs and billboards to overlap. }, blending : BlendingState.ALPHA_BLEND }); diff --git a/Source/Scene/BingMapsImageryProvider.js b/Source/Scene/BingMapsImageryProvider.js index 90368068d2b6..726b209a2104 100644 --- a/Source/Scene/BingMapsImageryProvider.js +++ b/Source/Scene/BingMapsImageryProvider.js @@ -557,7 +557,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - BingMapsImageryProvider.prototype.pickFeatures = function() { + BingMapsImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/BlendEquation.js b/Source/Scene/BlendEquation.js index 1d71d9857cde..1f16c2fd86a0 100644 --- a/Source/Scene/BlendEquation.js +++ b/Source/Scene/BlendEquation.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/BlendFunction.js b/Source/Scene/BlendFunction.js index 9276ca8b22ca..2da26a81bd02 100644 --- a/Source/Scene/BlendFunction.js +++ b/Source/Scene/BlendFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/Camera.js b/Source/Scene/Camera.js index 88a4ca9b40fe..ba4be4d7546c 100644 --- a/Source/Scene/Camera.js +++ b/Source/Scene/Camera.js @@ -935,7 +935,7 @@ define([ } var globe = this._scene.globe; - var globeFinishedUpdating = !defined(globe) || (globe._surface.tileProvider.ready && !defined(globe._surface._tileLoadQueue.head) && globe._surface._debug.tilesWaitingForChildren === 0); + var globeFinishedUpdating = !defined(globe) || (globe._surface.tileProvider.ready && globe._surface._tileLoadQueueHigh.length === 0 && globe._surface._tileLoadQueueMedium.length === 0 && globe._surface._tileLoadQueueLow.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0); if (this._suspendTerrainAdjustment) { this._suspendTerrainAdjustment = !globeFinishedUpdating; } diff --git a/Source/Scene/CameraEventAggregator.js b/Source/Scene/CameraEventAggregator.js index 05154071f1fc..78e6e7206451 100644 --- a/Source/Scene/CameraEventAggregator.js +++ b/Source/Scene/CameraEventAggregator.js @@ -252,7 +252,7 @@ define([ * @alias CameraEventAggregator * @constructor * - * @param {Canvas} [element=document] The element to handle events for. + * @param {Canvas} [canvas=document] The element to handle events for. * * @see ScreenSpaceEventHandler */ diff --git a/Source/Scene/Cesium3DTile.js b/Source/Scene/Cesium3DTile.js index e64c408a257c..fbfa74444225 100644 --- a/Source/Scene/Cesium3DTile.js +++ b/Source/Scene/Cesium3DTile.js @@ -29,8 +29,8 @@ define([ './Primitive', './TileBoundingRegion', './TileBoundingSphere', - './Tileset3DTileContent', - './TileOrientedBoundingBox' + './TileOrientedBoundingBox', + './Tileset3DTileContent' ], function( BoxOutlineGeometry, Cartesian3, @@ -61,8 +61,8 @@ define([ Primitive, TileBoundingRegion, TileBoundingSphere, - Tileset3DTileContent, - TileOrientedBoundingBox) { + TileOrientedBoundingBox, + Tileset3DTileContent) { 'use strict'; /** diff --git a/Source/Scene/Cesium3DTileBatchTable.js b/Source/Scene/Cesium3DTileBatchTable.js index 2080059f7c42..481d7140e591 100644 --- a/Source/Scene/Cesium3DTileBatchTable.js +++ b/Source/Scene/Cesium3DTileBatchTable.js @@ -15,18 +15,18 @@ define([ '../Core/PixelFormat', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/PixelDatatype', + '../Renderer/RenderState', '../Renderer/Sampler', '../Renderer/ShaderSource', - '../Renderer/RenderState', '../Renderer/Texture', '../Renderer/TextureMagnificationFilter', '../Renderer/TextureMinificationFilter', './BlendingState', './Cesium3DTileColorBlendMode', './CullFace', - './getBinaryAccessor', - './Pass' + './getBinaryAccessor' ], function( arrayFill, Cartesian2, @@ -43,18 +43,18 @@ define([ PixelFormat, ContextLimits, DrawCommand, + Pass, PixelDatatype, + RenderState, Sampler, ShaderSource, - RenderState, Texture, TextureMagnificationFilter, TextureMinificationFilter, BlendingState, Cesium3DTileColorBlendMode, CullFace, - getBinaryAccessor, - Pass) { + getBinaryAccessor) { 'use strict'; /** @@ -78,7 +78,22 @@ define([ * @private */ this.batchTableBinary = batchTableBinary; - this._batchTableBinaryProperties = Cesium3DTileBatchTable.getBinaryProperties(featuresLength, batchTableJson, batchTableBinary); + + var batchTableHierarchy; + var batchTableBinaryProperties; + if (defined(batchTableJson)) { + // Extract the hierarchy and remove it from the batch table json + batchTableHierarchy = batchTableJson.HIERARCHY; + if (defined(batchTableHierarchy)) { + delete batchTableJson.HIERARCHY; + batchTableHierarchy = initializeHierarchy(batchTableHierarchy, batchTableBinary); + } + // Get the binary properties + batchTableBinaryProperties = Cesium3DTileBatchTable.getBinaryProperties(featuresLength, batchTableJson, batchTableBinary); + } + + this._batchTableHierarchy = batchTableHierarchy; + this._batchTableBinaryProperties = batchTableBinaryProperties; // PERFORMANCE_IDEA: These parallel arrays probably generate cache misses in get/set color/show // and use A LOT of memory. How can we use less memory? @@ -116,6 +131,122 @@ define([ this._textureStep = textureStep; } + function initializeHierarchy(json, binary) { + var i; + var classId; + var binaryAccessor; + + var instancesLength = json.instancesLength; + var classes = json.classes; + var classIds = json.classIds; + var parentCounts = json.parentCounts; + var parentIds = json.parentIds; + var parentIdsLength = instancesLength; + + if (defined(classIds.byteOffset)) { + classIds.componentType = defaultValue(classIds.componentType, 'UNSIGNED_SHORT'); + classIds.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(classIds); + classIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + classIds.byteOffset, instancesLength); + } + + var parentIndexes; + if (defined(parentCounts)) { + if (defined(parentCounts.byteOffset)) { + parentCounts.componentType = defaultValue(parentCounts.componentType, 'UNSIGNED_SHORT'); + parentCounts.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(parentCounts); + parentCounts = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentCounts.byteOffset, instancesLength); + } + parentIndexes = new Uint16Array(instancesLength); + parentIdsLength = 0; + for (i = 0; i < instancesLength; ++i) { + parentIndexes[i] = parentIdsLength; + parentIdsLength += parentCounts[i]; + } + } + + if (defined(parentIds.byteOffset)) { + parentIds.componentType = defaultValue(parentIds.componentType, 'UNSIGNED_SHORT'); + parentIds.type = 'SCALAR'; + binaryAccessor = getBinaryAccessor(parentIds); + parentIds = binaryAccessor.createArrayBufferView(binary.buffer, binary.byteOffset + parentIds.byteOffset, parentIdsLength); + } + + var classesLength = classes.length; + for (i = 0; i < classesLength; ++i) { + var classInstancesLength = classes[i].length; + var properties = classes[i].instances; + var binaryProperties = Cesium3DTileBatchTable.getBinaryProperties(classInstancesLength, properties, binary); + classes[i].instances = combine(binaryProperties, properties); + } + + var classCounts = arrayFill(new Array(classesLength), 0); + var classIndexes = new Uint16Array(instancesLength); + for (i = 0; i < instancesLength; ++i) { + classId = classIds[i]; + classIndexes[i] = classCounts[classId]; + ++classCounts[classId]; + } + + var hierarchy = { + classes : classes, + classIds : classIds, + classIndexes : classIndexes, + parentCounts : parentCounts, + parentIndexes : parentIndexes, + parentIds : parentIds + }; + + //>>includeStart('debug', pragmas.debug); + validateHierarchy(hierarchy); + //>>includeEnd('debug'); + + return hierarchy; + } + + //>>includeStart('debug', pragmas.debug); + var scratchValidateStack = []; + function validateHierarchy(hierarchy) { + var stack = scratchValidateStack; + stack.length = 0; + + var classIds = hierarchy.classIds; + var instancesLength = classIds.length; + + for (var i = 0; i < instancesLength; ++i) { + validateInstance(hierarchy, i, stack); + } + } + + function validateInstance(hierarchy, instanceIndex, stack) { + var parentCounts = hierarchy.parentCounts; + var parentIds = hierarchy.parentIds; + var parentIndexes = hierarchy.parentIndexes; + var classIds = hierarchy.classIds; + var instancesLength = classIds.length; + + if (instanceIndex >= instancesLength) { + throw new DeveloperError('Parent index ' + instanceIndex + ' exceeds the total number of instances: ' + instancesLength); + } + if (stack.indexOf(instanceIndex) > -1) { + throw new DeveloperError('Circular dependency detected in the batch table hierarchy.'); + } + + stack.push(instanceIndex); + var parentCount = defined(parentCounts) ? parentCounts[instanceIndex] : 1; + var parentIndex = defined(parentCounts) ? parentIndexes[instanceIndex] : instanceIndex; + for (var i = 0; i < parentCount; ++i) { + var parentId = parentIds[parentIndex + i]; + // Stop the traversal when the instance has no parent (its parentId equals itself), else continue the traversal. + if (parentId !== instanceIndex) { + validateInstance(hierarchy, parentId, stack); + } + } + stack.pop(instanceIndex); + } + //>>includeEnd('debug'); + Cesium3DTileBatchTable.getBinaryProperties = function(featuresLength, json, binary) { var binaryProperties; if (defined(json)) { @@ -341,32 +472,262 @@ define([ result); }; - Cesium3DTileBatchTable.prototype.hasProperty = function(name) { + function getBinaryProperty(binaryProperty, index) { + var typedArray = binaryProperty.typedArray; + var componentCount = binaryProperty.componentCount; + if (componentCount === 1) { + return typedArray[index]; + } + return binaryProperty.type.unpack(typedArray, index * componentCount); + } + + function setBinaryProperty(binaryProperty, index, value) { + var typedArray = binaryProperty.typedArray; + var componentCount = binaryProperty.componentCount; + if (componentCount === 1) { + typedArray[index] = value; + } else { + binaryProperty.type.pack(value, typedArray, index * componentCount); + } + } + + // The size of this array equals the maximum instance count among all loaded tiles, which has the potential to be large. + var scratchVisited = []; + var scratchStack = []; + var marker = 0; + function traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback) { + var classIds = hierarchy.classIds; + var parentCounts = hierarchy.parentCounts; + var parentIds = hierarchy.parentIds; + var parentIndexes = hierarchy.parentIndexes; + var instancesLength = classIds.length; + + // Ignore instances that have already been visited. This occurs in diamond inheritance situations. + // Use a marker value to indicate that an instance has been visited, which increments with each run. + // This is more efficient than clearing the visited array every time. + var visited = scratchVisited; + visited.length = Math.max(visited.length, instancesLength); + var visitedMarker = ++marker; + + var stack = scratchStack; + stack.length = 0; + stack.push(instanceIndex); + + while (stack.length > 0) { + instanceIndex = stack.pop(); + if (visited[instanceIndex] === visitedMarker) { + // This instance has already been visited, stop traversal + continue; + } + visited[instanceIndex] = visitedMarker; + var result = endConditionCallback(hierarchy, instanceIndex); + if (defined(result)) { + // The end condition was met, stop the traversal and return the result + return result; + } + var parentCount = parentCounts[instanceIndex]; + var parentIndex = parentIndexes[instanceIndex]; + for (var i = 0; i < parentCount; ++i) { + var parentId = parentIds[parentIndex + i]; + // Stop the traversal when the instance has no parent (its parentId equals itself) + // else add the parent to the stack to continue the traversal. + if (parentId !== instanceIndex) { + stack.push(parentId); + } + } + } + } + + function traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback) { + while (true) { + var result = endConditionCallback(hierarchy, instanceIndex); + if (defined(result)) { + // The end condition was met, stop the traversal and return the result + return result; + } + var parentId = hierarchy.parentIds[instanceIndex]; + if (parentId === instanceIndex) { + // Stop the traversal when the instance has no parent (its parentId equals itself) + break; + } + instanceIndex = parentId; + } + } + + function traverseHierarchy(hierarchy, instanceIndex, endConditionCallback) { + // Traverse over the hierarchy and process each instance with the endConditionCallback. + // When the endConditionCallback returns a value, the traversal stops and that value is returned. + var parentCounts = hierarchy.parentCounts; + if (defined(parentCounts)) { + return traverseHierarchyMultipleParents(hierarchy, instanceIndex, endConditionCallback); + } + return traverseHierarchySingleParent(hierarchy, instanceIndex, endConditionCallback); + } + + function hasPropertyInHierarchy(batchTable, batchId, name) { + var hierarchy = batchTable._batchTableHierarchy; + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instances = hierarchy.classes[classId].instances; + if (defined(instances[name])) { + return true; + } + }); + return defined(result); + } + + function getPropertyNamesInHierarchy(batchTable, batchId, names) { + var hierarchy = batchTable._batchTableHierarchy; + traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instances = hierarchy.classes[classId].instances; + for (var name in instances) { + if (instances.hasOwnProperty(name)) { + names[name] = true; + } + } + }); + } + + function getHierarchyProperty(batchTable, batchId, name) { + var hierarchy = batchTable._batchTableHierarchy; + return traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + var indexInClass = hierarchy.classIndexes[instanceIndex]; + var propertyValues = instanceClass.instances[name]; + if (defined(propertyValues)) { + if (defined(propertyValues.typedArray)) { + return getBinaryProperty(propertyValues, indexInClass); + } + return clone(propertyValues[indexInClass], true); + } + }); + } + + function setHierarchyProperty(batchTable, batchId, name, value) { + var hierarchy = batchTable._batchTableHierarchy; + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + var indexInClass = hierarchy.classIndexes[instanceIndex]; + var propertyValues = instanceClass.instances[name]; + if (defined(propertyValues)) { + //>>includeStart('debug', pragmas.debug); + if (instanceIndex !== batchId) { + throw new DeveloperError('Inherited property "' + name + '" is read-only.'); + } + //>>includeEnd('debug'); + if (defined(propertyValues.typedArray)) { + setBinaryProperty(propertyValues, indexInClass, value); + } else { + propertyValues[indexInClass] = clone(value, true); + } + return true; + } + }); + return defined(result); + } + + Cesium3DTileBatchTable.prototype.isClass = function(batchId, className) { + var featuresLength = this.featuresLength; + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); + } + if (!defined(className)) { + throw new DeveloperError('className is required.'); + } + //>>includeEnd('debug'); + + // PERFORMANCE_IDEA : cache results in the ancestor classes to speed up this check if this area becomes a hotspot + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return false; + } + + // PERFORMANCE_IDEA : treat class names as integers for faster comparisons + var result = traverseHierarchy(hierarchy, batchId, function(hierarchy, instanceIndex) { + var classId = hierarchy.classIds[instanceIndex]; + var instanceClass = hierarchy.classes[classId]; + if (instanceClass.name === className) { + return true; + } + }); + return defined(result); + }; + + Cesium3DTileBatchTable.prototype.isExactClass = function(batchId, className) { + //>>includeStart('debug', pragmas.debug); + if (!defined(className)) { + throw new DeveloperError('className is required.'); + } + //>>includeEnd('debug'); + + return (this.getExactClassName(batchId) === className); + }; + + Cesium3DTileBatchTable.prototype.getExactClassName = function(batchId) { + var featuresLength = this.featuresLength; + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); + } + //>>includeEnd('debug'); + + var hierarchy = this._batchTableHierarchy; + if (!defined(hierarchy)) { + return undefined; + } + var classId = hierarchy.classIds[batchId]; + var instanceClass = hierarchy.classes[classId]; + return instanceClass.name; + }; + + Cesium3DTileBatchTable.prototype.hasProperty = function(batchId, name) { + var featuresLength = this.featuresLength; //>>includeStart('debug', pragmas.debug); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); + } if (!defined(name)) { throw new DeveloperError('name is required.'); } //>>includeEnd('debug'); var json = this.batchTableJson; - return defined(json) && defined(json[name]); + return (defined(json) && defined(json[name])) || (defined(this._batchTableHierarchy) && hasPropertyInHierarchy(this, batchId, name)); }; - Cesium3DTileBatchTable.prototype.getPropertyNames = function() { - var names = []; + Cesium3DTileBatchTable.prototype.getPropertyNames = function(batchId) { + var featuresLength = this.featuresLength; + //>>includeStart('debug', pragmas.debug); + if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { + throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); + } + //>>includeEnd('debug'); + var json = this.batchTableJson; if (!defined(json)) { - return names; + return []; + } + + if (!defined(this._batchTableHierarchy)) { + return Object.keys(json); } + // Has a batch table hierarchy. Build a hash map of property names to avoid duplicates. + // Different classes in the hierarchy may have identical property names. + var names = {}; for (var name in json) { if (json.hasOwnProperty(name)) { - names.push(name); + names[name] = true; } } + getPropertyNamesInHierarchy(this, batchId, names); - return names; + return Object.keys(names); }; Cesium3DTileBatchTable.prototype.getProperty = function(batchId, name) { @@ -375,7 +736,6 @@ define([ if (!defined(batchId) || (batchId < 0) || (batchId > featuresLength)) { throw new DeveloperError('batchId is required and between zero and featuresLength - 1 (' + featuresLength - + ').'); } - if (!defined(name)) { throw new DeveloperError('name is required.'); } @@ -388,21 +748,23 @@ define([ if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { - var typedArray = binaryProperty.typedArray; - var componentCount = binaryProperty.componentCount; - if (componentCount === 1) { - return typedArray[batchId]; - } else { - return binaryProperty.type.unpack(typedArray, batchId * componentCount); - } + return getBinaryProperty(binaryProperty, batchId); } } var propertyValues = this.batchTableJson[name]; - if (!defined(propertyValues)) { - return undefined; + if (defined(propertyValues)) { + return clone(propertyValues[batchId], true); } - return clone(propertyValues[batchId], true); + + if (defined(this._batchTableHierarchy)) { + var hierarchyProperty = getHierarchyProperty(this, batchId, name); + if (defined(hierarchyProperty)) { + return hierarchyProperty; + } + } + + return undefined; }; Cesium3DTileBatchTable.prototype.setProperty = function(batchId, name, value) { @@ -420,13 +782,13 @@ define([ if (defined(this._batchTableBinaryProperties)) { var binaryProperty = this._batchTableBinaryProperties[name]; if (defined(binaryProperty)) { - var typedArray = binaryProperty.typedArray; - var componentCount = binaryProperty.componentCount; - if (componentCount === 1) { - typedArray[batchId] = value; - } else { - binaryProperty.type.pack(value, typedArray, batchId * componentCount); - } + setBinaryProperty(binaryProperty, batchId, value); + return; + } + } + + if (defined(this._batchTableHierarchy)) { + if (setHierarchyProperty(this, batchId, name, value)) { return; } } @@ -473,9 +835,6 @@ define([ '} \n'; } - /** - * @private - */ Cesium3DTileBatchTable.prototype.getVertexShaderCallback = function(handleTranslucent, batchIdAttributeName) { if (this.featuresLength === 0) { return; @@ -564,7 +923,6 @@ define([ source = ShaderSource.replaceMain(source, 'tile_main'); source = source.replace(declaration, ''); // Remove uniform declaration for now so the replace below don't affect it - source = source.replace('void tile_main()', 'void tile_main(vec4 tile_diffuse)'); // If the tile color is white, use the source color. This implies the feature has not been styled. // Highlight: tile_colorBlend is 0.0 and the source color is used @@ -593,16 +951,19 @@ define([ source = source.replace(regex, replaceDiffuse); setColor = ' vec4 source = ' + sourceDiffuse + '; \n' + - ' vec4 diffuse = tile_diffuse_final(source, tile_featureColor); \n' + - ' tile_main(diffuse); \n'; + ' tile_diffuse = tile_diffuse_final(source, tile_featureColor); \n' + + ' tile_main(); \n'; } else if (type === 'sampler2D') { regex = new RegExp('texture2D\\(' + diffuseUniformName + '.*?\\)', 'g'); source = source.replace(regex, 'tile_diffuse_final($&, tile_diffuse)'); - setColor = ' tile_main(tile_featureColor); \n'; + setColor = + ' tile_diffuse = tile_featureColor; \n' + + ' tile_main(); \n'; } source = 'uniform float tile_colorBlend; \n' + + 'vec4 tile_diffuse = vec4(1.0); \n' + finalDiffuseFunction + declaration + '\n' + source + '\n' + @@ -831,12 +1192,13 @@ define([ OPAQUE_AND_TRANSLUCENT : 2 }; - function updateDerivedCommandsShadows(derivedCommands, command) { + function updateDerivedCommands(derivedCommands, command) { for (var name in derivedCommands) { if (derivedCommands.hasOwnProperty(name)) { var derivedCommand = derivedCommands[name]; derivedCommand.castShadows = command.castShadows; derivedCommand.receiveShadows = command.receiveShadows; + derivedCommand.primitiveType = command.primitiveType; } } } @@ -858,7 +1220,7 @@ define([ derivedCommands.front = deriveTranslucentCommand(command, CullFace.BACK); } - updateDerivedCommandsShadows(derivedCommands, command); + updateDerivedCommands(derivedCommands, command); // If the command was originally opaque: // * If the styling applied to the tile is all opaque, use the original command diff --git a/Source/Scene/Cesium3DTileColorBlendMode.js b/Source/Scene/Cesium3DTileColorBlendMode.js index 1b6ead125f35..a3fd3a306d3a 100644 --- a/Source/Scene/Cesium3DTileColorBlendMode.js +++ b/Source/Scene/Cesium3DTileColorBlendMode.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject' -], function( + ], function( freezeObject) { 'use strict'; diff --git a/Source/Scene/Cesium3DTileContent.js b/Source/Scene/Cesium3DTileContent.js index 1f8e82413628..e63d77075858 100644 --- a/Source/Scene/Cesium3DTileContent.js +++ b/Source/Scene/Cesium3DTileContent.js @@ -128,10 +128,11 @@ define([ * Determines if the tile's batch table has a property. If it does, each feature in * the tile will have the property. * + * @param {Number} batchId The batchId for the feature. * @param {String} name The case-sensitive name of the property. * @returns {Boolean} true if the property exists; otherwise, false. */ - Cesium3DTileContent.prototype.hasProperty = function(name) { + Cesium3DTileContent.prototype.hasProperty = function(batchId, name) { DeveloperError.throwInstantiationError(); }; diff --git a/Source/Scene/Cesium3DTileFeature.js b/Source/Scene/Cesium3DTileFeature.js index e678649807f8..20e3abf4430d 100644 --- a/Source/Scene/Cesium3DTileFeature.js +++ b/Source/Scene/Cesium3DTileFeature.js @@ -186,9 +186,104 @@ define([ label.style = value; } } + }, + + backgroundColor : { + get : function() { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + return label.backgroundColor; + } + return undefined; + }, + set : function(value) { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + label.backgroundColor = value; + } + } + }, + + backgroundXPadding : { + get : function() { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + return label.backgroundPadding.x; + } + return undefined; + }, + set : function(value) { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + label.backgroundPadding.x = value; + } + } + }, + + backgroundYPadding : { + get : function() { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + return label.backgroundPadding.y; + } + return undefined; + }, + set : function(value) { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + label.backgroundPadding.y = value; + } + } + }, + + backgroundEnabled : { + get : function() { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + return label.showBackground; + } + return undefined; + }, + set : function(value) { + if (defined(this._labelCollection)) { + var label = this._labelCollection.get(this._batchId); + label.showBackground = value; + } + } } }); + /** + * Returns whether the feature contains this property. This includes properties from this feature's + * class and inherited classes, in addition to the standard batch table properties. + *

+ * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color} are not equivalent to + * 'show' and 'color' properties; the former are runtime-specific properties + * that are not part of the feature's properties in the stored 3D Tileset. + *

+ * + * @param {String} name The case-sensitive name of the property. + * @returns {Boolean} Whether the feature contains this property. + */ + Cesium3DTileFeature.prototype.hasProperty = function(name) { + return this._batchTable.hasProperty(this._batchId, name); + }; + + /** + * Returns an array of property names for the feature. This includes properties from this feature's + * class and inherited classes, in addition to the standard batch table properties. + *

+ * {@link Cesium3DTileFeature#show} and {@link Cesium3DTileFeature#color} are not equivalent to + * 'show' and 'color' properties; the former are runtime-specific properties + * that are not part of the feature's properties in the stored 3D Tileset. + *

+ * + * @returns {String[]} The names of the feature's properties. + */ + Cesium3DTileFeature.prototype.getPropertyNames = function() { + return this._batchTable.getPropertyNames(this._batchId); + }; + /** * Returns the value of the feature's property with the given name. *

@@ -198,7 +293,7 @@ define([ *

* * @param {String} name The case-sensitive name of the property. - * @returns {Any} The value of the property or undefined if the property does not exist. + * @returns {*} The value of the property or undefined if the property does not exist. * * @example * // Display all the properties for a feature in the console log. @@ -229,7 +324,7 @@ define([ *

* * @param {String} name The case-sensitive name of the property. - * @param {Any} value The value of the property that will be copied. + * @param {*} value The value of the property that will be copied. * * @example * var height = feature.getProperty('Height'); // e.g., the height of a building @@ -254,5 +349,50 @@ define([ this._content.featurePropertiesDirty = true; }; + /** + * Returns whether the feature's class name equals className. Unlike {@link Cesium3DTileFeature#isClass} + * this function only checks the feature's exact class and not inherited classes. + *

+ * This function returns false if no batch table hierarchy is present. + *

+ * + * @param {String} className The name to check against. + * @returns {Boolean} Whether the feature's class name equals className + * + * @private + */ + Cesium3DTileFeature.prototype.isExactClass = function(className) { + return this._batchTable.isExactClass(this._batchId, className); + }; + + /** + * Returns whether the feature's class or any inherited classes are named className. + *

+ * This function returns false if no batch table hierarchy is present. + *

+ * + * @param {String} className The name to check against. + * @returns {Boolean} Whether the feature's class or inherited classes are named className + * + * @private + */ + Cesium3DTileFeature.prototype.isClass = function(className) { + return this._batchTable.isClass(this._batchId, className); + }; + + /** + * Returns the feature's class name. + *

+ * This function returns undefined if no batch table hierarchy is present. + *

+ * + * @returns {String} The feature's class name. + * + * @private + */ + Cesium3DTileFeature.prototype.getExactClassName = function() { + return this._batchTable.getExactClassName(this._batchId); + }; + return Cesium3DTileFeature; -}); \ No newline at end of file +}); diff --git a/Source/Scene/Cesium3DTileStyle.js b/Source/Scene/Cesium3DTileStyle.js index 296ad99f43dd..61bc5195cf8a 100644 --- a/Source/Scene/Cesium3DTileStyle.js +++ b/Source/Scene/Cesium3DTileStyle.js @@ -1,17 +1,17 @@ /*global define*/ define([ '../Core/clone', - '../Core/defaultValue', - '../Core/defined', - '../Core/defineProperties', - '../Core/DeveloperError', - '../Core/isArray', - '../Core/loadJson', - '../Core/RequestScheduler', - '../ThirdParty/when', - './ConditionsExpression', - './Expression', - './LabelStyle' + '../Core/defaultValue', + '../Core/defined', + '../Core/defineProperties', + '../Core/DeveloperError', + '../Core/isArray', + '../Core/loadJson', + '../Core/RequestScheduler', + '../ThirdParty/when', + './ConditionsExpression', + './Expression', + './LabelStyle' ], function( clone, defaultValue, @@ -33,6 +33,10 @@ define([ var DEFAULT_JSON_NUMBER_EXPRESSION = 1.0; var DEFAULT_LABEL_STYLE_EXPRESSION = LabelStyle.FILL; var DEFAULT_FONT_EXPRESSION = '"30px sans-serif"'; + var DEFAULT_BACKGROUND_COLOR_EXPRESSION = 'rgba(42, 42, 42, 0.8)'; + var DEFAULT_BACKGROUND_X_PADDING_EXPRESSION = 7.0; + var DEFAULT_BACKGROUND_Y_PADDING_EXPRESSION = 5.0; + var DEFAULT_BACKGROUND_ENABLED = false; /** * Evaluates an expression defined using the @@ -71,6 +75,10 @@ define([ this._outlineWidth = undefined; this._labelStyle = undefined; this._font = undefined; + this._backgroundColor = undefined; + this._backgroundXPadding = undefined; + this._backgroundYPadding = undefined; + this._backgroundEnabled = undefined; this._meta = undefined; this._colorShaderFunction = undefined; @@ -120,6 +128,10 @@ define([ var outlineWidthExpression = defaultValue(styleJson.outlineWidth, DEFAULT_JSON_NUMBER_EXPRESSION); var labelStyleExpression = defaultValue(styleJson.labelStyle, DEFAULT_LABEL_STYLE_EXPRESSION); var fontExpression = defaultValue(styleJson.font, DEFAULT_FONT_EXPRESSION); + var backgroundColorExpression = defaultValue(styleJson.backgroundColor, DEFAULT_BACKGROUND_COLOR_EXPRESSION); + var backgroundXPaddingExpression = defaultValue(styleJson.backgroundXPadding, DEFAULT_BACKGROUND_X_PADDING_EXPRESSION); + var backgroundYPaddingExpression = defaultValue(styleJson.backgroundYPadding, DEFAULT_BACKGROUND_Y_PADDING_EXPRESSION); + var backgroundEnabledExpression = defaultValue(styleJson.backgroundEnabled, DEFAULT_BACKGROUND_ENABLED); var color; if (typeof(colorExpression) === 'string') { @@ -155,7 +167,7 @@ define([ var outlineColor; if (typeof(outlineColorExpression) === 'string') { outlineColor = new Expression(outlineColorExpression); - } else if (defined(outlineColorExpression)) { + } else if (defined(outlineColorExpression.conditions)) { outlineColor = new ConditionsExpression(outlineColorExpression); } @@ -166,7 +178,7 @@ define([ outlineWidth = new Expression(String(outlineWidthExpression)); } else if (typeof(outlineWidthExpression) === 'string') { outlineWidth = new Expression(outlineWidthExpression); - } else if (defined(outlineWidthExpression)) { + } else if (defined(outlineWidthExpression.conditions)) { outlineWidth = new ConditionsExpression(outlineWidthExpression); } @@ -177,7 +189,7 @@ define([ labelStyle = new Expression(String(labelStyleExpression)); } else if (typeof(labelStyleExpression) === 'string') { labelStyle = new Expression(labelStyleExpression); - } else if (defined(labelStyleExpression)) { + } else if (defined(labelStyleExpression.conditions)) { labelStyle = new ConditionsExpression(labelStyleExpression); } @@ -186,12 +198,54 @@ define([ var font; if (typeof(fontExpression) === 'string') { font = new Expression(fontExpression); - } else if (defined(fontExpression)) { + } else if (defined(fontExpression.conditions)) { font = new ConditionsExpression(fontExpression); } that._font = font; + var backgroundColor; + if (typeof(backgroundColorExpression) === 'string') { + backgroundColor = new Expression(backgroundColorExpression); + } else if (defined(backgroundColorExpression.conditions)) { + backgroundColor = new ConditionsExpression(backgroundColorExpression); + } + + that._backgroundColor = backgroundColor; + + var backgroundXPadding; + if (typeof(backgroundXPaddingExpression) === 'number') { + backgroundXPadding = new Expression(String(backgroundXPaddingExpression)); + } else if (typeof(backgroundXPaddingExpression) === 'string') { + backgroundXPadding = new Expression(backgroundXPaddingExpression); + } else if (defined(backgroundXPaddingExpression.conditions)) { + backgroundXPadding = new ConditionsExpression(backgroundXPaddingExpression); + } + + that._backgroundXPadding = backgroundXPadding; + + var backgroundYPadding; + if (typeof(backgroundYPaddingExpression) === 'number') { + backgroundYPadding = new Expression(String(backgroundYPaddingExpression)); + } else if (typeof(backgroundYPaddingExpression) === 'string') { + backgroundYPadding = new Expression(backgroundYPaddingExpression); + } else if (defined(backgroundYPaddingExpression.conditions)) { + backgroundYPadding = new ConditionsExpression(backgroundYPaddingExpression); + } + + that._backgroundYPadding = backgroundYPadding; + + var backgroundEnabled; + if (typeof(backgroundEnabledExpression) === 'boolean') { + backgroundEnabled = new Expression(String(backgroundEnabledExpression)); + } else if (typeof(backgroundEnabledExpression) === 'string') { + backgroundEnabled = new Expression(backgroundEnabledExpression); + } else if (defined(backgroundEnabledExpression.conditions)) { + backgroundEnabled = new ConditionsExpression(backgroundEnabledExpression); + } + + that._backgroundEnabled = backgroundEnabled; + var meta = {}; if (defined(styleJson.meta)) { var metaJson = defaultValue(styleJson.meta, defaultValue.EMPTY_OBJECT); @@ -304,6 +358,7 @@ define([ return this._show; }, set : function(value) { + this._showShaderFunctionReady = false; this._show = value; } }, @@ -348,6 +403,7 @@ define([ return this._color; }, set : function(value) { + this._colorShaderFunctionReady = false; this._color = value; } }, @@ -392,6 +448,7 @@ define([ return this._pointSize; }, set : function(value) { + this._pointSizeShaderFunctionReady = false; this._pointSize = value; } }, @@ -456,6 +513,66 @@ define([ } }, + backgroundColor : { + get : function() { + //>>includeStart('debug', pragmas.debug); + if (!this._ready) { + throw new DeveloperError('The style is not loaded. Use Cesium3DTileStyle.readyPromise or wait for Cesium3DTileStyle.ready to be true.'); + } + //>>includeEnd('debug'); + + return this._backgroundColor; + }, + set : function(value) { + this._backgroundColor = value; + } + }, + + backgroundXPadding : { + get : function() { + //>>includeStart('debug', pragmas.debug); + if (!this._ready) { + throw new DeveloperError('The style is not loaded. Use Cesium3DTileStyle.readyPromise or wait for Cesium3DTileStyle.ready to be true.'); + } + //>>includeEnd('debug'); + + return this._backgroundXPadding; + }, + set : function(value) { + this._backgroundXPadding = value; + } + }, + + backgroundYPadding : { + get : function() { + //>>includeStart('debug', pragmas.debug); + if (!this._ready) { + throw new DeveloperError('The style is not loaded. Use Cesium3DTileStyle.readyPromise or wait for Cesium3DTileStyle.ready to be true.'); + } + //>>includeEnd('debug'); + + return this._backgroundYPadding; + }, + set : function(value) { + this._backgroundYPadding = value; + } + }, + + backgroundEnabled : { + get : function() { + //>>includeStart('debug', pragmas.debug); + if (!this._ready) { + throw new DeveloperError('The style is not loaded. Use Cesium3DTileStyle.readyPromise or wait for Cesium3DTileStyle.ready to be true.'); + } + //>>includeEnd('debug'); + + return this._backgroundEnabled; + }, + set : function(value) { + this._backgroundEnabled = value; + } + }, + /** * Gets or sets the object containing application-specific expression that can be explicitly * evaluated, e.g., for display in a UI. diff --git a/Source/Scene/Cesium3DTileStyleEngine.js b/Source/Scene/Cesium3DTileStyleEngine.js index 465258508b5a..d8f1585d8ee4 100644 --- a/Source/Scene/Cesium3DTileStyleEngine.js +++ b/Source/Scene/Cesium3DTileStyleEngine.js @@ -1,9 +1,9 @@ /*global define*/ define([ - '../Core/Color', - '../Core/defined', - '../Core/defineProperties', - './LabelStyle' + '../Core/Color', + '../Core/defined', + '../Core/defineProperties', + './LabelStyle' ], function( Color, defined, @@ -105,7 +105,6 @@ define([ if (!content.applyStyleWithShader(frameState, style)) { applyStyleWithBatchTable(frameState, content, stats, style); } - } function applyStyleWithBatchTable(frameState, content, stats, style) { @@ -124,10 +123,14 @@ define([ var feature = content.getFeature(i); feature.color = style.color.evaluateColor(frameState, feature, scratchColor); feature.show = style.show.evaluate(frameState, feature); - feature.outlineColor = style.outlineColor.evaluate(frameState, feature); + feature.outlineColor = style.outlineColor.evaluateColor(frameState, feature); feature.outlineWidth = style.outlineWidth.evaluate(frameState, feature); feature.labelStyle = style.labelStyle.evaluate(frameState, feature); feature.font = style.font.evaluate(frameState, feature); + feature.backgroundColor = style.backgroundColor.evaluateColor(frameState, feature); + feature.backgroundXPadding = style.backgroundXPadding.evaluate(frameState, feature); + feature.backgroundYPadding = style.backgroundYPadding.evaluate(frameState, feature); + feature.backgroundEnabled = style.backgroundEnabled.evaluate(frameState, feature); } } @@ -141,6 +144,10 @@ define([ feature.outlineWidth = 1.0; feature.labelStyle = LabelStyle.FILL; feature.font = '30px sans-serif'; + feature.backgroundColor = 'rgba(42, 42, 42, 0.8)'; + feature.backgroundXPadding = 7.0; + feature.backgroundYPadding = 5.0; + feature.backgroundEnabled = false; } } diff --git a/Source/Scene/Cesium3DTileset.js b/Source/Scene/Cesium3DTileset.js index 47495dbd471b..503efee7eaf2 100644 --- a/Source/Scene/Cesium3DTileset.js +++ b/Source/Scene/Cesium3DTileset.js @@ -94,6 +94,7 @@ define([ * @param {Boolean} [options.debugShowPickStatistics=false] For debugging only. Determines if rendering statistics for picking are output to the console. * @param {Boolean} [options.debugFreezeFrame=false] For debugging only. Determines if only the tiles from last frame should be used for rendering. * @param {Boolean} [options.debugColorizeTiles=false] For debugging only. When true, assigns a random color to each tile. + * @param {Boolean} [options.debugWireframe=false] For debugging only. When true, render's each tile's content as a wireframe. * @param {Boolean} [options.debugShowBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile. * @param {Boolean} [options.debugShowContentBoundingVolume=false] For debugging only. When true, renders the bounding volume for each tile's content. * @param {Boolean} [options.debugShowViewerRequestVolume=false] For debugging only. When true, renders the viewer request volume for each tile. @@ -285,6 +286,7 @@ define([ visited : 0, numberOfCommands : 0, // Loading stats + numberOfAttemptedRequests : 0, numberOfPendingRequests : 0, numberProcessing : 0, numberContentReady : 0, // Number of tiles with content loaded, does not include empty tiles @@ -297,6 +299,8 @@ define([ lastPick : new Cesium3DTilesetStatistics() }; + this._tilesLoaded = false; + /** * This property is for debugging only; it is not optimized for production use. *

@@ -325,6 +329,17 @@ define([ */ this.debugColorizeTiles = defaultValue(options.debugColorizeTiles, false); + /** + * This property is for debugging only; it is not optimized for production use. + *

+ * When true, renders each tile's content as a wireframe + *

+ * + * @type {Boolean} + * @default false + */ + this.debugWireframe = defaultValue(options.debugWireframe, false); + /** * This property is for debugging only; it is not optimized for production use. *

@@ -387,6 +402,25 @@ define([ */ this.loadProgress = new Event(); + /** + * The event fired to indicate that all tiles that meet the screen space error this frame are loaded. The tileset + * is completely loaded for this view. + *

+ * This event is fired at the end of the frame after the scene is rendered. + *

+ * + * @type {Event} + * @default new Event() + * + * @example + * city.allTilesLoaded.addEventListener(function() { + * console.log('All tiles are loaded'); + * }); + * + * @see Cesium3DTileset#tilesLoaded + */ + this.allTilesLoaded = new Event(); + /** * The event fired to indicate that a tile's content was unloaded from the cache. *

@@ -438,7 +472,6 @@ define([ this._readyPromise = when.defer(); var that = this; - this.loadTileset(tilesetUrl).then(function(data) { var tilesetJson = data.tilesetJson; that._asset = tilesetJson.asset; @@ -452,15 +485,16 @@ define([ } function Cesium3DTilesetStatistics() { - this.selected = -1; - this.visited = -1; - this.numberOfCommands = -1; - this.numberOfPendingRequests = -1; - this.numberProcessing = -1; - this.numberContentReady = -1; - this.numberTotal = -1; - this.numberOfTilesStyled = -1; - this.numberOfFeaturesStyled = -1; + this.selected = 0; + this.visited = 0; + this.numberOfCommands = 0; + this.numberOfAttemptedRequests = 0; + this.numberOfPendingRequests = 0; + this.numberProcessing = 0; + this.numberContentReady = 0; + this.numberTotal = 0; + this.numberOfTilesStyled = 0; + this.numberOfFeaturesStyled = 0; } defineProperties(Cesium3DTileset.prototype, { @@ -571,6 +605,25 @@ define([ } }, + /** + * When true, all tiles that meet the screen space error this frame are loaded. The tileset is + * completely loaded for this view. + * + * @memberof Cesium3DTileset.prototype + * + * @type {Boolean} + * @readonly + * + * @default false + * + * @see Cesium3DTileset#allTilesLoaded + */ + tilesLoaded : { + get : function() { + return this._tilesLoaded; + } + }, + /** * The url to a tileset.json file or to a directory containing a tileset.json file. * @@ -1071,13 +1124,16 @@ define([ tile.requestContent(); + var stats = tileset._statistics; + if (!tile.contentUnloaded) { - var stats = tileset._statistics; ++stats.numberOfPendingRequests; var removeFunction = removeFromProcessingQueue(tileset, tile); tile.content.contentReadyToProcessPromise.then(addToProcessingQueue(tileset, tile)).otherwise(removeFunction); tile.content.readyPromise.then(removeFunction).otherwise(removeFunction); + } else { + ++stats.numberOfAttemptedRequests; } } @@ -1493,6 +1549,7 @@ define([ var stats = tileset._statistics; stats.visited = 0; stats.numberOfCommands = 0; + stats.numberOfAttemptedRequests = 0; stats.numberOfTilesStyled = 0; stats.numberOfFeaturesStyled = 0; } @@ -1509,6 +1566,7 @@ define([ (last.visited !== stats.visited || last.numberOfCommands !== stats.numberOfCommands || last.selected !== tileset._selectedTiles.length || + last.numberOfAttemptedRequests !== stats.numberOfAttemptedRequests || last.numberOfPendingRequests !== stats.numberOfPendingRequests || last.numberProcessing !== stats.numberProcessing || last.numberContentReady !== stats.numberContentReady || @@ -1538,6 +1596,7 @@ define([ // --- Cache/loading stats ' | Requests: ' + stats.numberOfPendingRequests + + ', Attempted: ' + stats.numberOfAttemptedRequests + ', Processing: ' + stats.numberProcessing + ', Content Ready: ' + stats.numberContentReady + // Total number of tiles includes tiles without content, so "Ready" may never reach @@ -1555,6 +1614,7 @@ define([ last.visited = stats.visited; last.numberOfCommands = stats.numberOfCommands; last.selected = tileset._selectedTiles.length; + last.numberOfAttemptedRequests = stats.numberOfAttemptedRequests; last.numberOfPendingRequests = stats.numberOfPendingRequests; last.numberProcessing = stats.numberProcessing; last.numberContentReady = stats.numberContentReady; @@ -1637,11 +1697,21 @@ define([ var lastNumberOfPendingRequest = stats.lastColor.numberOfPendingRequests; var lastNumberProcessing = stats.lastColor.numberProcessing; - if ((numberOfPendingRequests !== lastNumberOfPendingRequest) || (numberProcessing !== lastNumberProcessing)) { + var progressChanged = (numberOfPendingRequests !== lastNumberOfPendingRequest) || (numberProcessing !== lastNumberProcessing); + + if (progressChanged) { frameState.afterRender.push(function() { tileset.loadProgress.raiseEvent(numberOfPendingRequests, numberProcessing); }); } + + tileset._tilesLoaded = (stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0) && (stats.numberOfAttemptedRequests === 0); + + if (progressChanged && tileset._tilesLoaded) { + frameState.afterRender.push(function() { + tileset.allTilesLoaded.raiseEvent(); + }); + } } /////////////////////////////////////////////////////////////////////////// @@ -1681,7 +1751,7 @@ define([ */ Cesium3DTileset.prototype.update = function(frameState) { // TODO: Support 2D and CV - if (!this.show || !defined(this._root) || (frameState.mode !== SceneMode.SCENE3D)) { + if (!this.show || !this.ready || (frameState.mode !== SceneMode.SCENE3D)) { return; } diff --git a/Source/Scene/ColorBlendMode.js b/Source/Scene/ColorBlendMode.js new file mode 100644 index 000000000000..c020c1dd1248 --- /dev/null +++ b/Source/Scene/ColorBlendMode.js @@ -0,0 +1,42 @@ +/*global define*/ +define([ + '../Core/freezeObject', + '../Core/Math' +], function( + freezeObject, + CesiumMath) { + 'use strict'; + + /** + * Defines different modes for blending between a target color and a primitive's source color. + * + * HIGHLIGHT multiplies the source color by the target color + * REPLACE replaces the source color with the target color + * MIX blends the source color and target color together + * + * @exports ColorBlendMode + * + * @see Model.colorBlendMode + */ + var ColorBlendMode = { + HIGHLIGHT : 0, + REPLACE : 1, + MIX : 2 + }; + + /** + * @private + */ + ColorBlendMode.getColorBlend = function(colorBlendMode, colorBlendAmount) { + if (colorBlendMode === ColorBlendMode.HIGHLIGHT) { + return 0.0; + } else if (colorBlendMode === ColorBlendMode.REPLACE) { + return 1.0; + } else if (colorBlendMode === ColorBlendMode.MIX) { + // The value 0.0 is reserved for highlight, so clamp to just above 0.0. + return CesiumMath.clamp(colorBlendAmount, CesiumMath.EPSILON4, 1.0); + } + }; + + return freezeObject(ColorBlendMode); +}); \ No newline at end of file diff --git a/Source/Scene/Composite3DTileContent.js b/Source/Scene/Composite3DTileContent.js index b0a3c14de0c7..6dd61495b387 100644 --- a/Source/Scene/Composite3DTileContent.js +++ b/Source/Scene/Composite3DTileContent.js @@ -2,8 +2,8 @@ define([ '../Core/defaultValue', '../Core/defined', - '../Core/destroyObject', '../Core/defineProperties', + '../Core/destroyObject', '../Core/DeveloperError', '../Core/getMagic', '../Core/loadArrayBuffer', @@ -15,8 +15,8 @@ define([ ], function( defaultValue, defined, - destroyObject, defineProperties, + destroyObject, DeveloperError, getMagic, loadArrayBuffer, @@ -122,7 +122,7 @@ define([ * Part of the {@link Cesium3DTileContent} interface. Composite3DTileContent * always returns false. Instead call hasProperty for a tile in the composite. */ - Composite3DTileContent.prototype.hasProperty = function(name) { + Composite3DTileContent.prototype.hasProperty = function(batchId, name) { return false; }; diff --git a/Source/Scene/ConditionsExpression.js b/Source/Scene/ConditionsExpression.js index cde71fa6fc66..f25e2a95835f 100644 --- a/Source/Scene/ConditionsExpression.js +++ b/Source/Scene/ConditionsExpression.js @@ -1,18 +1,18 @@ /*global define*/ define([ - './Expression', - '../Core/clone', - '../Core/Color', - '../Core/defaultValue', - '../Core/defined', - '../Core/defineProperties' + '../Core/clone', + '../Core/Color', + '../Core/defaultValue', + '../Core/defined', + '../Core/defineProperties', + './Expression' ], function( - Expression, clone, Color, defaultValue, defined, - defineProperties) { + defineProperties, + Expression) { 'use strict'; var expressionPlaceholder = /\$\{expression}/g; diff --git a/Source/Scene/CreditDisplay.js b/Source/Scene/CreditDisplay.js index 270a447e7d95..395512488550 100644 --- a/Source/Scene/CreditDisplay.js +++ b/Source/Scene/CreditDisplay.js @@ -270,8 +270,6 @@ define([ /** * Resets the credit display to a beginning of frame state, clearing out current credits. - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.beginFrame = function() { this._currentFrameCredits.imageCredits.length = 0; @@ -280,8 +278,6 @@ define([ /** * Sets the credit display to the end of frame state, displaying current credits in the credit container - * - * @param {Credit} credit The credit to display */ CreditDisplay.prototype.endFrame = function() { var textCredits = this._defaultTextCredits.concat(this._currentFrameCredits.textCredits); diff --git a/Source/Scene/CullFace.js b/Source/Scene/CullFace.js index 4026796e3238..25cf2ff2f1df 100644 --- a/Source/Scene/CullFace.js +++ b/Source/Scene/CullFace.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/DebugCameraPrimitive.js b/Source/Scene/DebugCameraPrimitive.js index 12df3e1ddb1b..ffcf283e6cf1 100644 --- a/Source/Scene/DebugCameraPrimitive.js +++ b/Source/Scene/DebugCameraPrimitive.js @@ -10,7 +10,6 @@ define([ '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', - '../Core/Geometry', '../Core/GeometryAttribute', '../Core/GeometryAttributes', '../Core/GeometryInstance', @@ -29,7 +28,6 @@ define([ defined, destroyObject, DeveloperError, - Geometry, GeometryAttribute, GeometryAttributes, GeometryInstance, diff --git a/Source/Scene/DepthFunction.js b/Source/Scene/DepthFunction.js index 2813f8b3b598..a8568c4b24cc 100644 --- a/Source/Scene/DepthFunction.js +++ b/Source/Scene/DepthFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/DepthPlane.js b/Source/Scene/DepthPlane.js index 71f81e70d14f..78e5808e05b1 100644 --- a/Source/Scene/DepthPlane.js +++ b/Source/Scene/DepthPlane.js @@ -10,13 +10,13 @@ define([ '../Core/PrimitiveType', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/VertexArray', '../Shaders/DepthPlaneFS', '../Shaders/DepthPlaneVS', './DepthFunction', - './Pass', './SceneMode' ], function( BoundingSphere, @@ -29,13 +29,13 @@ define([ PrimitiveType, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, VertexArray, DepthPlaneFS, DepthPlaneVS, DepthFunction, - Pass, SceneMode) { 'use strict'; diff --git a/Source/Scene/DeviceOrientationCameraController.js b/Source/Scene/DeviceOrientationCameraController.js index 189c125f42b9..0b026cdc0a38 100644 --- a/Source/Scene/DeviceOrientationCameraController.js +++ b/Source/Scene/DeviceOrientationCameraController.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', @@ -8,7 +7,6 @@ define([ '../Core/Matrix3', '../Core/Quaternion' ], function( - defaultValue, defined, destroyObject, DeveloperError, diff --git a/Source/Scene/EllipsoidPrimitive.js b/Source/Scene/EllipsoidPrimitive.js index 732d41f74d33..2bdab578c846 100644 --- a/Source/Scene/EllipsoidPrimitive.js +++ b/Source/Scene/EllipsoidPrimitive.js @@ -12,6 +12,7 @@ define([ '../Core/VertexFormat', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -21,7 +22,6 @@ define([ './BlendingState', './CullFace', './Material', - './Pass', './SceneMode' ], function( BoundingSphere, @@ -36,6 +36,7 @@ define([ VertexFormat, BufferUsage, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -45,7 +46,6 @@ define([ BlendingState, CullFace, Material, - Pass, SceneMode) { 'use strict'; diff --git a/Source/Scene/Empty3DTileContent.js b/Source/Scene/Empty3DTileContent.js index 421b524db86f..65b45ade6d1b 100644 --- a/Source/Scene/Empty3DTileContent.js +++ b/Source/Scene/Empty3DTileContent.js @@ -83,7 +83,7 @@ define([ * Part of the {@link Cesium3DTileContent} interface. Empty3DTileContent * always returns false since a tile of this type does not have any features. */ - Empty3DTileContent.prototype.hasProperty = function(name) { + Empty3DTileContent.prototype.hasProperty = function(batchId, name) { return false; }; diff --git a/Source/Scene/Expression.js b/Source/Scene/Expression.js index d1027e6a0f0a..e1f85dd0001d 100644 --- a/Source/Scene/Expression.js +++ b/Source/Scene/Expression.js @@ -1,18 +1,26 @@ /*global define*/ define([ - '../Core/Color', - '../Core/defined', - '../Core/defineProperties', - '../Core/DeveloperError', - '../Core/isArray', - '../ThirdParty/jsep', - './ExpressionNodeType' + '../Core/Cartesian2', + '../Core/Cartesian3', + '../Core/Cartesian4', + '../Core/Color', + '../Core/defined', + '../Core/defineProperties', + '../Core/DeveloperError', + '../Core/isArray', + '../Core/Math', + '../ThirdParty/jsep', + './ExpressionNodeType' ], function( + Cartesian2, + Cartesian3, + Cartesian4, Color, defined, defineProperties, DeveloperError, isArray, + CesiumMath, jsep, ExpressionNodeType) { "use strict"; @@ -28,21 +36,94 @@ define([ var scratchColor = new Color(); var ScratchStorage = { - scratchColorIndex : 0, - scratchColors : [new Color()], + scratchArrayIndex : 0, + scratchArrayArray : [[]], + scratchCartesian2Index : 0, + scratchCartesian3Index : 0, + scratchCartesian4Index : 0, + scratchCartesian2Array : [new Cartesian2()], + scratchCartesian3Array : [new Cartesian3()], + scratchCartesian4Array : [new Cartesian4()], reset : function() { - this.scratchColorIndex = 0; + this.scratchArrayIndex = 0; + this.scratchCartesian2Index = 0; + this.scratchCartesian3Index = 0; + this.scratchCartesian4Index = 0; }, - getColor : function() { - if (this.scratchColorIndex >= this.scratchColors.length) { - this.scratchColors.push(new Color()); + getArray : function() { + if (this.scratchArrayIndex >= this.scratchArrayArray.length) { + this.scratchArrayArray.push([]); } - var scratchColor = this.scratchColors[this.scratchColorIndex]; - ++this.scratchColorIndex; - return scratchColor; + var scratchArray = this.scratchArrayArray[this.scratchArrayIndex++]; + scratchArray.length = 0; + return scratchArray; + }, + getCartesian2 : function() { + if (this.scratchCartesian2Index >= this.scratchCartesian2Array.length) { + this.scratchCartesian2Array.push(new Cartesian2()); + } + return this.scratchCartesian2Array[this.scratchCartesian2Index++]; + }, + getCartesian3 : function() { + if (this.scratchCartesian3Index >= this.scratchCartesian3Array.length) { + this.scratchCartesian3Array.push(new Cartesian3()); + } + return this.scratchCartesian3Array[this.scratchCartesian3Index++]; + }, + getCartesian4 : function() { + if (this.scratchCartesian4Index >= this.scratchCartesian4Array.length) { + this.scratchCartesian4Array.push(new Cartesian4()); + } + return this.scratchCartesian4Array[this.scratchCartesian4Index++]; } }; + var binaryFunctions = { + atan2 : Math.atan2, + pow : Math.pow, + min : Math.min, + max : Math.max + }; + + var unaryFunctions = { + abs : Math.abs, + sqrt : Math.sqrt, + cos : Math.cos, + sin : Math.sin, + tan : Math.tan, + acos : Math.acos, + asin : Math.asin, + atan : Math.atan, + radians : CesiumMath.toRadians, + degrees : CesiumMath.toDegrees, + sign : CesiumMath.sign, + floor : Math.floor, + ceil : Math.ceil, + round : Math.round, + exp : Math.exp, + exp2 : exp2, + log : Math.log, + log2 : log2, + fract : fract + }; + + var ternaryFunctions = { + clamp : CesiumMath.clamp, + mix : CesiumMath.lerp + }; + + function fract(number) { + return number - Math.floor(number); + } + + function exp2(exponent) { + return Math.pow(2.0,exponent); + } + + function log2(number) { + return CesiumMath.logBase(number, 2.0); + } + /** * Evaluates an expression defined using the * {@link https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/Styling|3D Tiles Styling language}. @@ -115,17 +196,18 @@ define([ * {@link https://github.com/AnalyticalGraphicsInc/3d-tiles/tree/master/Styling|3D Tiles Styling language} * is of type Boolean, Number, or String, the corresponding JavaScript * primitive type will be returned. If the result is a RegExp, a Javascript RegExp - * object will be returned. If the result is a Color, a {@link Color} object will be returned. + * object will be returned. If the result is a Cartesian2, Cartesian3, or Cartesian4, + * a {@link Cartesian2}, {@link Cartesian3}, or {@link Cartesian4} object will be returned. * * @param {FrameState} frameState The frame state. * @param {Cesium3DTileFeature} feature The feature who's properties may be used as variables in the expression. - * @returns {Boolean|Number|String|Color|RegExp} The result of evaluating the expression. + * @returns {Boolean|Number|String|Cartesian2|Cartesian3|Cartesian4|RegExp} The result of evaluating the expression. */ Expression.prototype.evaluate = function(frameState, feature) { ScratchStorage.reset(); var result = this._runtimeAst.evaluate(frameState, feature); - if (result instanceof Color) { - return Color.clone(result); + if ((result instanceof Cartesian2) || (result instanceof Cartesian3) || (result instanceof Cartesian4)) { + return result.clone(); } return result; }; @@ -141,7 +223,7 @@ define([ Expression.prototype.evaluateColor = function(frameState, feature, result) { ScratchStorage.reset(); var color = this._runtimeAst.evaluate(frameState, feature); - return Color.clone(color, result); + return Color.fromCartesian4(color, result); }; /** @@ -259,8 +341,9 @@ define([ function parseCall(expression, ast) { var args = ast.arguments; + var argsLength = args.length; var call; - var val; + var val, left, right; // Member function calls if (ast.callee.type === 'MemberExpression') { @@ -273,15 +356,15 @@ define([ throw new DeveloperError('Error: ' + call + ' is not a function.'); } //>>includeEnd('debug'); - if (args.length === 0) { + if (argsLength === 0) { if (call === 'test') { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, false); } else { return new Node(ExpressionNodeType.LITERAL_NULL, null); } } - var left = createRuntimeAst(expression, object); - var right = createRuntimeAst(expression, args[0]); + left = createRuntimeAst(expression, object); + right = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.FUNCTION_CALL, call, left, right); } else if (call === 'toString') { val = createRuntimeAst(expression, object); @@ -296,7 +379,7 @@ define([ // Non-member function calls call = ast.callee.name; if (call === 'color') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_COLOR, call); } val = createRuntimeAst(expression, args[0]); @@ -307,7 +390,7 @@ define([ return new Node(ExpressionNodeType.LITERAL_COLOR, call, [val]); } else if (call === 'rgb' || call === 'hsl') { //>>includeStart('debug', pragmas.debug); - if (args.length < 3) { + if (argsLength < 3) { throw new DeveloperError('Error: ' + call + ' requires three arguments.'); } //>>includeEnd('debug'); @@ -319,7 +402,7 @@ define([ return new Node(ExpressionNodeType.LITERAL_COLOR, call, val); } else if (call === 'rgba' || call === 'hsla') { //>>includeStart('debug', pragmas.debug); - if (args.length < 4) { + if (argsLength < 4) { throw new DeveloperError('Error: ' + call + ' requires four arguments.'); } //>>includeEnd('debug'); @@ -330,8 +413,15 @@ define([ createRuntimeAst(expression, args[3]) ]; return new Node(ExpressionNodeType.LITERAL_COLOR, call, val); + } else if (call === 'vec2' || call === 'vec3' || call === 'vec4') { + // Check for invalid constructors at evaluation time + val = new Array(argsLength); + for (var i = 0; i < argsLength; ++i) { + val[i] = createRuntimeAst(expression, args[i]); + } + return new Node(ExpressionNodeType.LITERAL_VECTOR, call, val); } else if (call === 'isNaN' || call === 'isFinite') { - if (args.length === 0) { + if (argsLength === 0) { if (call === 'isNaN') { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, true); } else { @@ -340,44 +430,62 @@ define([ } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'abs') { + } else if (call === 'isExactClass' || call === 'isClass') { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { + if (argsLength < 1 || argsLength > 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); } //>>includeEnd('debug'); val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'cos') { + } else if (call === 'getExactClassName') { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { - throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); + if (argsLength > 0) { + throw new DeveloperError('Error: ' + call + ' does not take any argument.'); } //>>includeEnd('debug'); - val = createRuntimeAst(expression, args[0]); - return new Node(ExpressionNodeType.UNARY, call, val); - } else if (call === 'sqrt') { + return new Node(ExpressionNodeType.UNARY, call); + } else if (defined(unaryFunctions[call])) { //>>includeStart('debug', pragmas.debug); - if (args.length < 1 || args.length > 1) { + if (argsLength !== 1) { throw new DeveloperError('Error: ' + call + ' requires exactly one argument.'); } //>>includeEnd('debug'); val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); + } else if (defined(binaryFunctions[call])) { + //>>includeStart('debug', pragmas.debug); + if (argsLength !== 2) { + throw new DeveloperError('Error: ' + call + ' requires exactly two arguments.'); + } + //>>includeEnd('debug'); + left = createRuntimeAst(expression, args[0]); + right = createRuntimeAst(expression, args[1]); + return new Node(ExpressionNodeType.BINARY, call, left, right); + } else if (defined(ternaryFunctions[call])) { + //>>includeStart('debug', pragmas.debug); + if (argsLength !== 3) { + throw new DeveloperError('Error: ' + call + ' requires exactly three arguments.'); + } + //>>includeEnd('debug'); + left = createRuntimeAst(expression, args[0]); + right = createRuntimeAst(expression, args[1]); + var test = createRuntimeAst(expression, args[2]); + return new Node(ExpressionNodeType.TERNARY, call, left, right, test); } else if (call === 'Boolean') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_BOOLEAN, false); } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'Number') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_NUMBER, 0); } val = createRuntimeAst(expression, args[0]); return new Node(ExpressionNodeType.UNARY, call, val); } else if (call === 'String') { - if (args.length === 0) { + if (argsLength === 0) { return new Node(ExpressionNodeType.LITERAL_STRING, ''); } val = createRuntimeAst(expression, args[0]); @@ -454,12 +562,14 @@ define([ } function parseMemberExpression(expression, ast) { + var val; var obj = createRuntimeAst(expression, ast.object); if (ast.computed) { - var val = createRuntimeAst(expression, ast.property); + val = createRuntimeAst(expression, ast.property); return new Node(ExpressionNodeType.MEMBER, 'brackets', obj, val); } else { - return new Node(ExpressionNodeType.MEMBER, 'dot', obj, ast.property.name); + val = new Node(ExpressionNodeType.LITERAL_STRING, ast.property.name); + return new Node(ExpressionNodeType.MEMBER, 'dot', obj, val); } } @@ -552,6 +662,32 @@ define([ } else if (node._value === 'toString') { node.evaluate = node._evaluateToString; } + } else if (node._type === ExpressionNodeType.UNARY) { + if (node._value === '!') { + node.evaluate = node._evaluateNot; + } else if (node._value === '-') { + node.evaluate = node._evaluateNegative; + } else if (node._value === '+') { + node.evaluate = node._evaluatePositive; + } else if (node._value === 'isNaN') { + node.evaluate = node._evaluateNaN; + } else if (node._value === 'isFinite') { + node.evaluate = node._evaluateIsFinite; + } else if (node._value === 'isExactClass') { + node.evaluate = node._evaluateIsExactClass; + } else if (node._value === 'isClass') { + node.evaluate = node._evaluateIsClass; + } else if (node._value === 'getExactClassName') { + node.evaluate = node._evaluategetExactClassName; + } else if (node._value === 'Boolean') { + node.evaluate = node._evaluateBooleanConversion; + } else if (node._value === 'Number') { + node.evaluate = node._evaluateNumberConversion; + } else if (node._value === 'String') { + node.evaluate = node._evaluateStringConversion; + } else if (defined(unaryFunctions[node._value])) { + node.evaluate = getEvaluateUnaryFunction(node._value); + } } else if (node._type === ExpressionNodeType.BINARY) { if (node._value === '+') { node.evaluate = node._evaluatePlus; @@ -587,31 +723,11 @@ define([ node.evaluate = node._evaluateRegExpMatch; } else if (node._value === '!~') { node.evaluate = node._evaluateRegExpNotMatch; + } else if (defined(binaryFunctions[node._value])) { + node.evaluate = getEvaluateBinaryFunction(node._value); } - } else if (node._type === ExpressionNodeType.UNARY) { - if (node._value === '!') { - node.evaluate = node._evaluateNot; - } else if (node._value === '-') { - node.evaluate = node._evaluateNegative; - } else if (node._value === '+') { - node.evaluate = node._evaluatePositive; - } else if (node._value === 'isNaN') { - node.evaluate = node._evaluateNaN; - } else if (node._value === 'isFinite') { - node.evaluate = node._evaluateIsFinite; - } else if (node._value === 'abs') { - node.evaluate = node._evaluateAbsoluteValue; - } else if (node._value === 'cos') { - node.evaluate = node._evaluateCosine; - } else if (node._value === 'sqrt') { - node.evaluate = node._evaluateSquareRoot; - } else if (node._value === 'Boolean') { - node.evaluate = node._evaluateBooleanConversion; - } else if (node._value === 'Number') { - node.evaluate = node._evaluateNumberConversion; - } else if (node._value === 'String') { - node.evaluate = node._evaluateStringConversion; - } + } else if (node._type === ExpressionNodeType.TERNARY) { + node.evaluate = getEvaluateTernaryFunction(node._value); } else if (node._type === ExpressionNodeType.MEMBER) { if (node._value === 'brackets') { node.evaluate = node._evaluateMemberBrackets; @@ -626,6 +742,8 @@ define([ node.evaluate = node._evaluateVariableString; } else if (node._type === ExpressionNodeType.LITERAL_COLOR) { node.evaluate = node._evaluateLiteralColor; + } else if (node._type === ExpressionNodeType.LITERAL_VECTOR) { + node.evaluate = node._evaluateLiteralVector; } else if (node._type === ExpressionNodeType.LITERAL_STRING) { node.evaluate = node._evaluateLiteralString; } else if (node._type === ExpressionNodeType.REGEX) { @@ -643,51 +761,141 @@ define([ return feature._content._tileset.timeSinceLoad; } + function getEvaluateUnaryFunction(call) { + var evaluate = unaryFunctions[call]; + return function(feature) { + var left = this._left.evaluate(feature); + if (typeof(left) === 'number') { + return evaluate(left); + } else if (left instanceof Cartesian2) { + return Cartesian2.fromElements(evaluate(left.x), evaluate(left.y), ScratchStorage.getCartesian2()); + } else if (left instanceof Cartesian3) { + return Cartesian3.fromElements(evaluate(left.x), evaluate(left.y), evaluate(left.z), ScratchStorage.getCartesian3()); + } else if (left instanceof Cartesian4) { + return Cartesian4.fromElements(evaluate(left.x), evaluate(left.y), evaluate(left.z), evaluate(left.w), ScratchStorage.getCartesian4()); + } + return evaluate(left); + }; + } + + function getEvaluateBinaryFunction(call) { + var evaluate = binaryFunctions[call]; + return function(feature) { + return evaluate(this._left.evaluate(feature), this._right.evaluate(feature)); + }; + } + + function getEvaluateTernaryFunction(call) { + var evaluate = ternaryFunctions[call]; + return function(feature) { + return evaluate(this._left.evaluate(feature), this._right.evaluate(feature), this._test.evaluate(feature)); + }; + } + Node.prototype._evaluateLiteral = function(frameState, feature) { return this._value; }; Node.prototype._evaluateLiteralColor = function(frameState, feature) { - var result = ScratchStorage.getColor(); + var color = scratchColor; var args = this._left; if (this._value === 'color') { if (!defined(args)) { - return Color.fromBytes(255, 255, 255, 255, result); + Color.fromBytes(255, 255, 255, 255, color); } else if (args.length > 1) { - Color.fromCssColorString(args[0].evaluate(frameState, feature, result), result); - result.alpha = args[1].evaluate(frameState, feature, result); + Color.fromCssColorString(args[0].evaluate(frameState, feature), color); + color.alpha = args[1].evaluate(frameState, feature); } else { - Color.fromCssColorString(args[0].evaluate(frameState, feature, result), result); + Color.fromCssColorString(args[0].evaluate(frameState, feature), color); } } else if (this._value === 'rgb') { Color.fromBytes( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), - 255, result); + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + 255, color); } else if (this._value === 'rgba') { // convert between css alpha (0 to 1) and cesium alpha (0 to 255) - var a = args[3].evaluate(frameState, feature, result) * 255; + var a = args[3].evaluate(frameState, feature) * 255; Color.fromBytes( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), - a, result); + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + a, color); } else if (this._value === 'hsl') { Color.fromHsl( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), - 1.0, result); + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + 1.0, color); } else if (this._value === 'hsla') { Color.fromHsl( - args[0].evaluate(frameState, feature, result), - args[1].evaluate(frameState, feature, result), - args[2].evaluate(frameState, feature, result), - args[3].evaluate(frameState, feature, result), - result); + args[0].evaluate(frameState, feature), + args[1].evaluate(frameState, feature), + args[2].evaluate(frameState, feature), + args[3].evaluate(frameState, feature), + color); + } + return Cartesian4.fromColor(color, ScratchStorage.getCartesian4()); + }; + + Node.prototype._evaluateLiteralVector = function(frameState, feature) { + // Gather the components that make up the vector, which includes components from interior vectors. + // For example vec3(1, 2, 3) or vec3(vec2(1, 2), 3) are both valid. + // + // If the number of components does not equal the vector's size, then a DeveloperError is thrown - with two exceptions: + // 1. A vector may be constructed from a larger vector and drop the extra components. + // 2. A vector may be constructed from a single component - vec3(1) will become vec3(1, 1, 1). + // + // Examples of invalid constructors include: + // vec4(1, 2) // not enough components + // vec3(vec2(1, 2)) // not enough components + // vec3(1, 2, 3, 4) // too many components + // vec2(vec4(1), 1) // too many components + + var components = ScratchStorage.getArray(); + var args = this._left; + var argsLength = args.length; + for (var i = 0; i < argsLength; ++i) { + var value = args[i].evaluate(frameState, feature); + if (typeof(value) === 'number') { + components.push(value); + } else if (value instanceof Cartesian2) { + components.push(value.x, value.y); + } else if (value instanceof Cartesian3) { + components.push(value.x, value.y, value.z); + } else if (value instanceof Cartesian4) { + components.push(value.x, value.y, value.z, value.w); + } + } + + var componentsLength = components.length; + var call = this._value; + var vectorLength = parseInt(call.charAt(3)); + + //>>includeStart('debug', pragmas.debug); + if (componentsLength === 0) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. No valid arguments.'); + } else if ((componentsLength < vectorLength) && (componentsLength > 1)) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. Not enough arguments.'); + } else if ((componentsLength > vectorLength) && (argsLength > 1)) { + throw new DeveloperError('Error: Invalid ' + call + ' constructor. Too many arguments.'); + } + //>>includeEnd('debug'); + + if (componentsLength === 1) { + // Add the same component 3 more times + var component = components[0]; + components.push(component, component, component); + } + + if (call === 'vec2') { + return Cartesian2.fromArray(components, 0, ScratchStorage.getCartesian2()); + } else if (call === 'vec3') { + return Cartesian3.fromArray(components, 0, ScratchStorage.getCartesian3()); + } else if (call === 'vec4') { + return Cartesian4.fromArray(components, 0, ScratchStorage.getCartesian4()); } - return result; }; Node.prototype._evaluateLiteralString = function(frameState, feature) { @@ -721,25 +929,54 @@ define([ // PERFORMANCE_IDEA: Determine if parent property needs to be computed before runtime Node.prototype._evaluateMemberDot = function(frameState, feature) { - if(checkFeature(this._left)) { - return feature.getProperty(this._right); + if (checkFeature(this._left)) { + return feature.getProperty(this._right.evaluate(frameState, feature)); } var property = this._left.evaluate(frameState, feature); if (!defined(property)) { return undefined; } - return property[this._right]; + + var member = this._right.evaluate(frameState, feature); + if ((property instanceof Cartesian2) || (property instanceof Cartesian3) || (property instanceof Cartesian4)) { + // Vector components may be accessed with .r, .g, .b, .a and implicitly with .x, .y, .z, .w + if (member === 'r') { + return property.x; + } else if (member === 'g') { + return property.y; + } else if (member === 'b') { + return property.z; + } else if (member === 'a') { + return property.w; + } + } + return property[member]; }; Node.prototype._evaluateMemberBrackets = function(frameState, feature) { - if(checkFeature(this._left)) { + if (checkFeature(this._left)) { return feature.getProperty(this._right.evaluate(frameState, feature)); } var property = this._left.evaluate(frameState, feature); if (!defined(property)) { return undefined; } - return property[this._right.evaluate(frameState, feature)]; + + var member = this._right.evaluate(frameState, feature); + if ((property instanceof Cartesian2) || (property instanceof Cartesian3) || (property instanceof Cartesian4)) { + // Vector components may be accessed with [0][1][2][3], ['r']['g']['b']['a'] and implicitly with ['x']['y']['z']['w'] + // For Cartesian2 and Cartesian3 out-of-range components will just return undefined + if (member === 0 || member === 'r') { + return property.x; + } else if (member === 1 || member === 'g') { + return property.y; + } else if (member === 2 || member === 'b') { + return property.z; + } else if (member === 3 || member === 'a') { + return property.w; + } + } + return property[member]; }; Node.prototype._evaluateArray = function(frameState, feature) { @@ -758,11 +995,23 @@ define([ }; Node.prototype._evaluateNegative = function(frameState, feature) { - return -(this._left.evaluate(frameState, feature)); + var left = this._left.evaluate(frameState, feature); + if (left instanceof Cartesian2) { + return Cartesian2.negate(left, ScratchStorage.getCartesian2()); + } else if (left instanceof Cartesian3) { + return Cartesian3.negate(left, ScratchStorage.getCartesian3()); + } else if (left instanceof Cartesian4) { + return Cartesian4.negate(left, ScratchStorage.getCartesian4()); + } + return -left; }; Node.prototype._evaluatePositive = function(frameState, feature) { - return +(this._left.evaluate(frameState, feature)); + var left = this._left.evaluate(frameState, feature); + if ((left instanceof Cartesian2) || (left instanceof Cartesian3) || (left instanceof Cartesian4)) { + return left; + } + return +left; }; Node.prototype._evaluateLessThan = function(frameState, feature) { @@ -836,8 +1085,12 @@ define([ Node.prototype._evaluatePlus = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.add(left, right, ScratchStorage.getColor()); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.add(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.add(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.add(left, right, ScratchStorage.getCartesian4()); } return left + right; }; @@ -845,8 +1098,12 @@ define([ Node.prototype._evaluateMinus = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.subtract(left, right, ScratchStorage.getColor()); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.subtract(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.subtract(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.subtract(left, right, ScratchStorage.getCartesian4()); } return left - right; }; @@ -854,12 +1111,24 @@ define([ Node.prototype._evaluateTimes = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.multiply(left, right, ScratchStorage.getColor()); - } else if ((right instanceof Color) && (typeof(left) === 'number')) { - return Color.multiplyByScalar(right, left, ScratchStorage.getColor()); - } else if ((left instanceof Color) && (typeof(right) === 'number')) { - return Color.multiplyByScalar(left, right, ScratchStorage.getColor()); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.multiplyComponents(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian2) && (typeof(left) === 'number')) { + return Cartesian2.multiplyByScalar(right, left, ScratchStorage.getCartesian2()); + } else if ((left instanceof Cartesian2) && (typeof(right) === 'number')) { + return Cartesian2.multiplyByScalar(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.multiplyComponents(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian3) && (typeof(left) === 'number')) { + return Cartesian3.multiplyByScalar(right, left, ScratchStorage.getCartesian3()); + } else if ((left instanceof Cartesian3) && (typeof(right) === 'number')) { + return Cartesian3.multiplyByScalar(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.multiplyComponents(left, right, ScratchStorage.getCartesian4()); + } else if ((right instanceof Cartesian4) && (typeof(left) === 'number')) { + return Cartesian4.multiplyByScalar(right, left, ScratchStorage.getCartesian4()); + } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { + return Cartesian4.multiplyByScalar(left, right, ScratchStorage.getCartesian4()); } return left * right; }; @@ -867,10 +1136,18 @@ define([ Node.prototype._evaluateDivide = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.divide(left, right, ScratchStorage.getColor()); - } else if ((left instanceof Color) && (typeof(right) === 'number')) { - return Color.divideByScalar(left, right, ScratchStorage.getColor()); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.divideComponents(left, right, ScratchStorage.getCartesian2()); + } else if ((left instanceof Cartesian2) && (typeof(right) === 'number')) { + return Cartesian2.divideByScalar(left, right, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.divideComponents(left, right, ScratchStorage.getCartesian3()); + } else if ((left instanceof Cartesian3) && (typeof(right) === 'number')) { + return Cartesian3.divideByScalar(left, right, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.divideComponents(left, right, ScratchStorage.getCartesian4()); + } else if ((left instanceof Cartesian4) && (typeof(right) === 'number')) { + return Cartesian4.divideByScalar(left, right, ScratchStorage.getCartesian4()); } return left / right; }; @@ -878,8 +1155,12 @@ define([ Node.prototype._evaluateMod = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.mod(left, right, ScratchStorage.getColor()); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2)) { + return Cartesian2.fromElements(left.x % right.x, left.y % right.y, ScratchStorage.getCartesian2()); + } else if ((right instanceof Cartesian3) && (left instanceof Cartesian3)) { + return Cartesian3.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, ScratchStorage.getCartesian3()); + } else if ((right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return Cartesian4.fromElements(left.x % right.x, left.y % right.y, left.z % right.z, left.w % right.w, ScratchStorage.getCartesian4()); } return left % right; }; @@ -887,8 +1168,10 @@ define([ Node.prototype._evaluateEqualsStrict = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.equals(left, right); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return left.equals(right); } return left === right; }; @@ -896,8 +1179,10 @@ define([ Node.prototype._evaluateEquals = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return Color.equals(left, right); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return left.equals(right); } // Specifically want to do an abstract equality comparison (==) instead of a strict equality comparison (===) @@ -908,8 +1193,10 @@ define([ Node.prototype._evaluateNotEqualsStrict = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return !Color.equals(left, right); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !left.equals(right); } return left !== right; }; @@ -917,8 +1204,10 @@ define([ Node.prototype._evaluateNotEquals = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); var right = this._right.evaluate(frameState, feature); - if ((right instanceof Color) && (left instanceof Color)) { - return !Color.equals(left, right); + if ((right instanceof Cartesian2) && (left instanceof Cartesian2) || + (right instanceof Cartesian3) && (left instanceof Cartesian3) || + (right instanceof Cartesian4) && (left instanceof Cartesian4)) { + return !left.equals(right); } // Specifically want to do an abstract inequality comparison (!=) instead of a strict inequality comparison (!==) // so that cases like "5 != '5'" return false. Tell jsHint to ignore this line. @@ -940,16 +1229,16 @@ define([ return isFinite(this._left.evaluate(frameState, feature)); }; - Node.prototype._evaluateAbsoluteValue = function(frameState, feature) { - return Math.abs(this._left.evaluate(frameState, feature)); + Node.prototype._evaluateIsExactClass = function(frameState, feature) { + return feature.isExactClass(this._left.evaluate(frameState, feature)); }; - Node.prototype._evaluateCosine = function(frameState, feature) { - return Math.cos(this._left.evaluate(frameState, feature)); + Node.prototype._evaluateIsClass = function(frameState, feature) { + return feature.isClass(this._left.evaluate(frameState, feature)); }; - Node.prototype._evaluateSquareRoot = function(frameState, feature) { - return Math.sqrt(this._left.evaluate(frameState, feature)); + Node.prototype._evaluategetExactClassName = function(frameState, feature) { + return feature.getExactClassName(); }; Node.prototype._evaluateBooleanConversion = function(frameState, feature) { @@ -1021,7 +1310,7 @@ define([ Node.prototype._evaluateToString = function(frameState, feature) { var left = this._left.evaluate(frameState, feature); - if ((left instanceof RegExp) || (left instanceof Color)) { + if ((left instanceof RegExp) || (left instanceof Cartesian2) || (left instanceof Cartesian3) || (left instanceof Cartesian4)) { return String(left); } //>>includeStart('debug', pragmas.debug); @@ -1090,11 +1379,11 @@ define([ return 'vec4(' + r + ', ' + g + ', ' + b + ', ' + a + ')'; } - function getExpressionArray(array, attributePrefix, shaderState) { + function getExpressionArray(array, attributePrefix, shaderState, parent) { var length = array.length; var expressions = new Array(length); for (var i = 0; i < length; ++i) { - var shader = array[i].getShaderExpression(attributePrefix, shaderState); + var shader = array[i].getShaderExpression(attributePrefix, shaderState, parent); if (!defined(shader)) { // If any of the expressions are not valid, the array is not valid return undefined; @@ -1104,7 +1393,7 @@ define([ return expressions; } - Node.prototype.getShaderExpression = function(attributePrefix, shaderState) { + Node.prototype.getShaderExpression = function(attributePrefix, shaderState, parent) { var color; var left; var right; @@ -1113,21 +1402,12 @@ define([ var type = this._type; var value = this._value; - // Right may be a string if it's a member variable: e.g. "${property.name}" - if (typeof(this._right) === 'string') { - //>>includeStart('debug', pragmas.debug); - throw new DeveloperError('Error generating style shader: string members are not supported.'); - //>>includeEnd('debug'); - // Return undefined when not in debug. Tell jsHint to ignore this line. - return; // jshint ignore:line - } - if (defined(this._left)) { if (isArray(this._left)) { - // Left can be an array if the type is LITERAL_COLOR - left = getExpressionArray(this._left, attributePrefix, shaderState); + // Left can be an array if the type is LITERAL_COLOR or LITERAL_VECTOR + left = getExpressionArray(this._left, attributePrefix, shaderState, this); } else { - left = this._left.getShaderExpression(attributePrefix, shaderState); + left = this._left.getShaderExpression(attributePrefix, shaderState, this); } if (!defined(left)) { // If the left side is not valid shader code, then the expression is not valid @@ -1136,7 +1416,7 @@ define([ } if (defined(this._right)) { - right = this._right.getShaderExpression(attributePrefix, shaderState); + right = this._right.getShaderExpression(attributePrefix, shaderState, this); if (!defined(right)) { // If the right side is not valid shader code, then the expression is not valid return undefined; @@ -1144,7 +1424,7 @@ define([ } if (defined(this._test)) { - test = this._test.getShaderExpression(attributePrefix, shaderState); + test = this._test.getShaderExpression(attributePrefix, shaderState, this); if (!defined(test)) { // If the test is not valid shader code, then the expression is not valid return undefined; @@ -1153,7 +1433,7 @@ define([ if (isArray(this._value)) { // For ARRAY type - value = getExpressionArray(this._value, attributePrefix, shaderState); + value = getExpressionArray(this._value, attributePrefix, shaderState, this); if (!defined(value)) { // If the values are not valid shader code, then the expression is not valid return undefined; @@ -1169,18 +1449,19 @@ define([ return 'bool(' + left + ')'; } else if (value === 'Number') { return 'float(' + left + ')'; - } else if (value === 'abs') { - return 'abs(' + left + ')'; - } else if (value === 'cos') { - return 'cos(' + left + ')'; - } else if (value === 'sqrt') { - return 'sqrt(' + left + ')'; - } - //>>includeStart('debug', pragmas.debug); - else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String')) { + } else if (value === 'round') { + return 'floor(' + left + ' + 0.5)'; + } else if (defined(unaryFunctions[value])) { + return value + '(' + left + ')'; + } else if ((value === 'isNaN') || (value === 'isFinite') || (value === 'String') || (value === 'isExactClass') || (value === 'isClass') || (value === 'getExactClassName')) { + //>>includeStart('debug', pragmas.debug); throw new DeveloperError('Error generating style shader: "' + value + '" is not supported.'); + //>>includeEnd('debug'); + // Return undefined when not in debug. Tell jsHint to ignore this line. + return undefined; // jshint ignore:line + } else if (defined(unaryFunctions[value])) { + return value + '(' + left + ')'; } - //>>includeEnd('debug'); return value + left; case ExpressionNodeType.BINARY: // Supported types: ||, &&, ===, ==, !==, !=, <, >, <=, >=, +, -, *, /, % @@ -1190,12 +1471,31 @@ define([ return '(' + left + ' == ' + right + ')'; } else if (value === '!==') { return '(' + left + ' != ' + right + ')'; + } else if (value === 'atan2') { + return 'atan(' + left + ', ' + right + ')'; + } else if (defined(binaryFunctions[value])) { + return value + '(' + left + ', ' + right + ')'; } return '(' + left + ' ' + value + ' ' + right + ')'; + case ExpressionNodeType.TERNARY: + if (defined(ternaryFunctions[value])) { + return value + '(' + left + ', ' + right + ', ' + test + ')'; + } + break; case ExpressionNodeType.CONDITIONAL: return '(' + test + ' ? ' + left + ' : ' + right + ')'; case ExpressionNodeType.MEMBER: - // This is intended for accessing the components of vec2, vec3, and vec4 properties. String members aren't supported. + // This is intended for accessing the components of vector properties. String members aren't supported. + // Check for 0.0 rather than 0 because all numbers are previously converted to decimals. + if (right === 'r' || right === 'x' || right === '0.0') { + return left + '[0]'; + } else if (right === 'g' || right === 'y' || right === '1.0') { + return left + '[1]'; + } else if (right === 'b' || right === 'z' || right === '2.0') { + return left + '[2]'; + } else if (right === 'a' || right === 'w' || right === '3.0') { + return left + '[3]'; + } return left + '[int(' + right + ')]'; case ExpressionNodeType.FUNCTION_CALL: //>>includeStart('debug', pragmas.debug); @@ -1232,7 +1532,13 @@ define([ case ExpressionNodeType.LITERAL_NUMBER: return numberToString(value); case ExpressionNodeType.LITERAL_STRING: - // The only supported strings are css color strings + if (defined(parent) && (parent._type === ExpressionNodeType.MEMBER)) { + if (value === 'r' || value === 'g' || value === 'b' || value === 'a' || + value === 'x' || value === 'y' || value === 'z' || value === 'w') { + return value; + } + } + // Check for css color strings color = Color.fromCssColorString(value, scratchColor); if (defined(color)) { return colorToVec3(color); @@ -1294,6 +1600,17 @@ define([ } } break; + case ExpressionNodeType.LITERAL_VECTOR: + var length = left.length; + var vectorExpression = value + '('; + for (var i = 0; i < length; ++i) { + vectorExpression += left[i]; + if (i < (length - 1)) { + vectorExpression += ', '; + } + } + vectorExpression += ')'; + return vectorExpression; case ExpressionNodeType.LITERAL_REGEX: //>>includeStart('debug', pragmas.debug); throw new DeveloperError('Error generating style shader: Regular expressions are not supported.'); diff --git a/Source/Scene/ExpressionNodeType.js b/Source/Scene/ExpressionNodeType.js index 34a6e448c029..f7d9a85fa1ca 100644 --- a/Source/Scene/ExpressionNodeType.js +++ b/Source/Scene/ExpressionNodeType.js @@ -12,20 +12,22 @@ define([ VARIABLE : 0, UNARY : 1, BINARY : 2, - CONDITIONAL : 3, - MEMBER : 4, - FUNCTION_CALL : 5, - ARRAY : 6, - REGEX: 7, - VARIABLE_IN_STRING : 8, - LITERAL_NULL : 9, - LITERAL_BOOLEAN : 10, - LITERAL_NUMBER : 11, - LITERAL_STRING : 12, - LITERAL_COLOR : 13, - LITERAL_REGEX : 14, - LITERAL_UNDEFINED : 15, - LITERAL_GLOBAL : 16 + TERNARY : 3, + CONDITIONAL : 4, + MEMBER : 5, + FUNCTION_CALL : 6, + ARRAY : 7, + REGEX: 8, + VARIABLE_IN_STRING : 9, + LITERAL_NULL : 10, + LITERAL_BOOLEAN : 11, + LITERAL_NUMBER : 12, + LITERAL_STRING : 13, + LITERAL_COLOR : 14, + LITERAL_VECTOR : 15, + LITERAL_REGEX : 16, + LITERAL_UNDEFINED : 17, + LITERAL_GLOBAL : 18 }; return freezeObject(ExpressionNodeType); diff --git a/Source/Scene/FXAA.js b/Source/Scene/FXAA.js index 57bf02b8f9cd..783bb7485c49 100644 --- a/Source/Scene/FXAA.js +++ b/Source/Scene/FXAA.js @@ -36,8 +36,8 @@ define([ */ function FXAA(context) { this._texture = undefined; - this._depthTexture = undefined; - this._depthRenderbuffer = undefined; + this._depthStencilTexture = undefined; + this._depthStencilRenderbuffer = undefined; this._fbo = undefined; this._command = undefined; @@ -55,13 +55,13 @@ define([ function destroyResources(fxaa) { fxaa._fbo = fxaa._fbo && fxaa._fbo.destroy(); fxaa._texture = fxaa._texture && fxaa._texture.destroy(); - fxaa._depthTexture = fxaa._depthTexture && fxaa._depthTexture.destroy(); - fxaa._depthRenderbuffer = fxaa._depthRenderbuffer && fxaa._depthRenderbuffer.destroy(); + fxaa._depthStencilTexture = fxaa._depthStencilTexture && fxaa._depthStencilTexture.destroy(); + fxaa._depthStencilRenderbuffer = fxaa._depthStencilRenderbuffer && fxaa._depthStencilRenderbuffer.destroy(); fxaa._fbo = undefined; fxaa._texture = undefined; - fxaa._depthTexture = undefined; - fxaa._depthRenderbuffer = undefined; + fxaa._depthStencilTexture = undefined; + fxaa._depthStencilRenderbuffer = undefined; if (defined(fxaa._command)) { fxaa._command.shaderProgram = fxaa._command.shaderProgram && fxaa._command.shaderProgram.destroy(); @@ -77,8 +77,8 @@ define([ var textureChanged = !defined(fxaaTexture) || fxaaTexture.width !== width || fxaaTexture.height !== height; if (textureChanged) { this._texture = this._texture && this._texture.destroy(); - this._depthTexture = this._depthTexture && this._depthTexture.destroy(); - this._depthRenderbuffer = this._depthRenderbuffer && this._depthRenderbuffer.destroy(); + this._depthStencilTexture = this._depthStencilTexture && this._depthStencilTexture.destroy(); + this._depthStencilRenderbuffer = this._depthStencilRenderbuffer && this._depthStencilRenderbuffer.destroy(); this._texture = new Texture({ context : context, @@ -89,19 +89,19 @@ define([ }); if (context.depthTexture) { - this._depthTexture = new Texture({ + this._depthStencilTexture = new Texture({ context : context, width : width, height : height, - pixelFormat : PixelFormat.DEPTH_COMPONENT, - pixelDatatype : PixelDatatype.UNSIGNED_SHORT + pixelFormat : PixelFormat.DEPTH_STENCIL, + pixelDatatype : PixelDatatype.UNSIGNED_INT_24_8 }); } else { - this._depthRenderbuffer = new Renderbuffer({ + this._depthStencilRenderbuffer = new Renderbuffer({ context : context, width : width, height : height, - format : RenderbufferFormat.DEPTH_COMPONENT16 + format : RenderbufferFormat.DEPTH_STENCIL }); } } @@ -112,8 +112,8 @@ define([ this._fbo = new Framebuffer({ context : context, colorTextures : [this._texture], - depthTexture : this._depthTexture, - depthRenderbuffer : this._depthRenderbuffer, + depthStencilTexture : this._depthStencilTexture, + depthStencilRenderbuffer : this._depthStencilRenderbuffer, destroyAttachments : false }); } diff --git a/Source/Scene/FrameState.js b/Source/Scene/FrameState.js index 94b47ab960ff..03a043a8d367 100644 --- a/Source/Scene/FrameState.js +++ b/Source/Scene/FrameState.js @@ -110,6 +110,15 @@ define([ */ this.occluder = undefined; + /** + * The maximum screen-space error used to drive level-of-detail refinement. Higher + * values will provide better performance but lower visual quality. + * + * @type {Number} + * @default 2 + */ + this.maximumScreenSpaceError = undefined; + this.passes = { /** * true if the primitive should update for a render pass, false otherwise. diff --git a/Source/Scene/FrustumCommands.js b/Source/Scene/FrustumCommands.js index 2d33d09d338a..fe5828910791 100644 --- a/Source/Scene/FrustumCommands.js +++ b/Source/Scene/FrustumCommands.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/defaultValue', - './Pass' + '../Renderer/Pass' ], function( defaultValue, Pass) { diff --git a/Source/Scene/GetFeatureInfoFormat.js b/Source/Scene/GetFeatureInfoFormat.js index 8c370b3ae868..c5fac1744df5 100644 --- a/Source/Scene/GetFeatureInfoFormat.js +++ b/Source/Scene/GetFeatureInfoFormat.js @@ -1,14 +1,12 @@ /*global define*/ define([ '../Core/Cartographic', - '../Core/defaultValue', '../Core/defined', '../Core/DeveloperError', '../Core/RuntimeError', './ImageryLayerFeatureInfo' ], function( Cartographic, - defaultValue, defined, DeveloperError, RuntimeError, diff --git a/Source/Scene/Globe.js b/Source/Scene/Globe.js index e84b483997b0..bb92954ec673 100644 --- a/Source/Scene/Globe.js +++ b/Source/Scene/Globe.js @@ -12,9 +12,9 @@ define([ '../Core/Ellipsoid', '../Core/EllipsoidTerrainProvider', '../Core/Event', - '../Core/GeographicProjection', '../Core/IntersectionTests', '../Core/loadImage', + '../Core/Math', '../Core/Ray', '../Core/Rectangle', '../Renderer/ShaderSource', @@ -42,9 +42,9 @@ define([ Ellipsoid, EllipsoidTerrainProvider, Event, - GeographicProjection, IntersectionTests, loadImage, + CesiumMath, Ray, Rectangle, ShaderSource, @@ -373,6 +373,10 @@ define([ var scratchGetHeightCartographic = new Cartographic(); var scratchGetHeightRay = new Ray(); + function tileIfContainsCartographic(tile, cartographic) { + return Rectangle.contains(tile.rectangle, cartographic) ? tile : undefined; + } + /** * Get the height of the surface at a given cartographic. * @@ -407,15 +411,10 @@ define([ } while (tile.renderable) { - var children = tile.children; - length = children.length; - - for (i = 0; i < length; ++i) { - tile = children[i]; - if (Rectangle.contains(tile.rectangle, cartographic)) { - break; - } - } + tile = tileIfContainsCartographic(tile.southwestChild, cartographic) || + tileIfContainsCartographic(tile.southeastChild, cartographic) || + tileIfContainsCartographic(tile.northwestChild, cartographic) || + tile.northeastChild; } while (defined(tile) && (!defined(tile.data) || !defined(tile.data.pickTerrain))) { @@ -427,10 +426,27 @@ define([ } var ellipsoid = this._surface._tileProvider.tilingScheme.ellipsoid; - var cartesian = ellipsoid.cartographicToCartesian(cartographic, scratchGetHeightCartesian); + + //cartesian has to be on the ellipsoid surface for `ellipsoid.geodeticSurfaceNormal` + var cartesian = Cartesian3.fromRadians(cartographic.longitude, cartographic.latitude, 0.0, ellipsoid, scratchGetHeightCartesian); var ray = scratchGetHeightRay; - Cartesian3.normalize(cartesian, ray.direction); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesian, ray.direction); + + // Try to find the intersection point between the surface normal and z-axis. + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian, 11500.0, ray.origin); + + // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid + if (!defined(rayOrigin)) { + // intersection point is outside the ellipsoid, try other value + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); + + // multiply by the *positive* value of the magnitude + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchGetHeightIntersection); + Cartesian3.subtract(cartesian, vectorToMinimumPoint, ray.origin); + } var intersection = tile.data.pick(ray, undefined, undefined, false, scratchGetHeightIntersection); if (!defined(intersection)) { diff --git a/Source/Scene/GlobeDepth.js b/Source/Scene/GlobeDepth.js index e2a28db927aa..20fa390c0bdf 100644 --- a/Source/Scene/GlobeDepth.js +++ b/Source/Scene/GlobeDepth.js @@ -3,7 +3,6 @@ define([ '../Core/BoundingRectangle', '../Core/Color', '../Core/defined', - '../Core/defineProperties', '../Core/destroyObject', '../Core/PixelFormat', '../Renderer/ClearCommand', @@ -16,7 +15,6 @@ define([ BoundingRectangle, Color, defined, - defineProperties, destroyObject, PixelFormat, ClearCommand, diff --git a/Source/Scene/GlobeSurfaceTile.js b/Source/Scene/GlobeSurfaceTile.js index f0c12d66e6a9..7ef884756b3d 100644 --- a/Source/Scene/GlobeSurfaceTile.js +++ b/Source/Scene/GlobeSurfaceTile.js @@ -3,13 +3,11 @@ define([ '../Core/BoundingSphere', '../Core/Cartesian3', '../Core/Cartesian4', - '../Core/Cartographic', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', '../Core/IntersectionTests', '../Core/PixelFormat', - '../Core/Rectangle', '../Renderer/PixelDatatype', '../Renderer/Sampler', '../Renderer/Texture', @@ -26,13 +24,11 @@ define([ BoundingSphere, Cartesian3, Cartesian4, - Cartographic, defaultValue, defined, defineProperties, IntersectionTests, PixelFormat, - Rectangle, PixelDatatype, Sampler, Texture, @@ -473,8 +469,6 @@ define([ } function propagateNewUpsampledDataToChildren(tile) { - var surfaceTile = tile.data; - // Now that there's new data for this tile: // - child tiles that were previously upsampled need to be re-upsampled based on the new data. @@ -482,32 +476,34 @@ define([ // of its ancestors receives new (better) data and we want to re-upsample from the // new data. - if (defined(tile._children)) { - for (var childIndex = 0; childIndex < 4; ++childIndex) { - var childTile = tile._children[childIndex]; - if (childTile.state !== QuadtreeTileLoadState.START) { - var childSurfaceTile = childTile.data; - if (defined(childSurfaceTile.terrainData) && !childSurfaceTile.terrainData.wasCreatedByUpsampling()) { - // Data for the child tile has already been loaded. - continue; - } + propagateNewUpsampledDataToChild(tile, tile._southwestChild); + propagateNewUpsampledDataToChild(tile, tile._southeastChild); + propagateNewUpsampledDataToChild(tile, tile._northwestChild); + propagateNewUpsampledDataToChild(tile, tile._northeastChild); + } - // Restart the upsampling process, no matter its current state. - // We create a new instance rather than just restarting the existing one - // because there could be an asynchronous operation pending on the existing one. - if (defined(childSurfaceTile.upsampledTerrain)) { - childSurfaceTile.upsampledTerrain.freeResources(); - } - childSurfaceTile.upsampledTerrain = new TileTerrain({ - data : surfaceTile.terrainData, - x : tile.x, - y : tile.y, - level : tile.level - }); - - childTile.state = QuadtreeTileLoadState.LOADING; - } + function propagateNewUpsampledDataToChild(tile, childTile) { + if (defined(childTile) && childTile.state !== QuadtreeTileLoadState.START) { + var childSurfaceTile = childTile.data; + if (defined(childSurfaceTile.terrainData) && !childSurfaceTile.terrainData.wasCreatedByUpsampling()) { + // Data for the child tile has already been loaded. + return; + } + + // Restart the upsampling process, no matter its current state. + // We create a new instance rather than just restarting the existing one + // because there could be an asynchronous operation pending on the existing one. + if (defined(childSurfaceTile.upsampledTerrain)) { + childSurfaceTile.upsampledTerrain.freeResources(); } + childSurfaceTile.upsampledTerrain = new TileTerrain({ + data : tile.data.terrainData, + x : tile.x, + y : tile.y, + level : tile.level + }); + + childTile.state = QuadtreeTileLoadState.LOADING; } } @@ -518,40 +514,42 @@ define([ // - child tiles that were previously upsampled need to be re-upsampled based on the new data. // - child tiles that were previously deemed unavailable may now be available. - if (defined(tile.children)) { - for (var childIndex = 0; childIndex < 4; ++childIndex) { - var childTile = tile.children[childIndex]; - if (childTile.state !== QuadtreeTileLoadState.START) { - var childSurfaceTile = childTile.data; - if (defined(childSurfaceTile.terrainData) && !childSurfaceTile.terrainData.wasCreatedByUpsampling()) { - // Data for the child tile has already been loaded. - continue; - } + propagateNewLoadedDataToChildTile(tile, surfaceTile, tile.southwestChild); + propagateNewLoadedDataToChildTile(tile, surfaceTile, tile.southeastChild); + propagateNewLoadedDataToChildTile(tile, surfaceTile, tile.northwestChild); + propagateNewLoadedDataToChildTile(tile, surfaceTile, tile.northeastChild); + } - // Restart the upsampling process, no matter its current state. - // We create a new instance rather than just restarting the existing one - // because there could be an asynchronous operation pending on the existing one. - if (defined(childSurfaceTile.upsampledTerrain)) { - childSurfaceTile.upsampledTerrain.freeResources(); - } - childSurfaceTile.upsampledTerrain = new TileTerrain({ - data : surfaceTile.terrainData, - x : tile.x, - y : tile.y, - level : tile.level - }); - - if (surfaceTile.terrainData.isChildAvailable(tile.x, tile.y, childTile.x, childTile.y)) { - // Data is available for the child now. It might have been before, too. - if (!defined(childSurfaceTile.loadedTerrain)) { - // No load process is in progress, so start one. - childSurfaceTile.loadedTerrain = new TileTerrain(); - } - } + function propagateNewLoadedDataToChildTile(tile, surfaceTile, childTile) { + if (childTile.state !== QuadtreeTileLoadState.START) { + var childSurfaceTile = childTile.data; + if (defined(childSurfaceTile.terrainData) && !childSurfaceTile.terrainData.wasCreatedByUpsampling()) { + // Data for the child tile has already been loaded. + return; + } - childTile.state = QuadtreeTileLoadState.LOADING; + // Restart the upsampling process, no matter its current state. + // We create a new instance rather than just restarting the existing one + // because there could be an asynchronous operation pending on the existing one. + if (defined(childSurfaceTile.upsampledTerrain)) { + childSurfaceTile.upsampledTerrain.freeResources(); + } + childSurfaceTile.upsampledTerrain = new TileTerrain({ + data : surfaceTile.terrainData, + x : tile.x, + y : tile.y, + level : tile.level + }); + + if (surfaceTile.terrainData.isChildAvailable(tile.x, tile.y, childTile.x, childTile.y)) { + // Data is available for the child now. It might have been before, too. + if (!defined(childSurfaceTile.loadedTerrain)) { + // No load process is in progress, so start one. + childSurfaceTile.loadedTerrain = new TileTerrain(); } } + + childTile.state = QuadtreeTileLoadState.LOADING; } } diff --git a/Source/Scene/GlobeSurfaceTileProvider.js b/Source/Scene/GlobeSurfaceTileProvider.js index 02ffba4cb125..89fdd4b69349 100644 --- a/Source/Scene/GlobeSurfaceTileProvider.js +++ b/Source/Scene/GlobeSurfaceTileProvider.js @@ -13,7 +13,6 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/Event', - '../Core/FeatureDetection', '../Core/GeometryInstance', '../Core/GeometryPipeline', '../Core/IndexDatatype', @@ -31,17 +30,15 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/VertexArray', '../Scene/BlendingState', '../Scene/DepthFunction', - '../Scene/Pass', '../Scene/PerInstanceColorAppearance', '../Scene/Primitive', - '../ThirdParty/when', './GlobeSurfaceTile', './ImageryLayer', - './ImageryState', './QuadtreeTileLoadState', './SceneMode', './ShadowMode' @@ -59,7 +56,6 @@ define([ destroyObject, DeveloperError, Event, - FeatureDetection, GeometryInstance, GeometryPipeline, IndexDatatype, @@ -77,17 +73,15 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, VertexArray, BlendingState, DepthFunction, - Pass, PerInstanceColorAppearance, Primitive, - when, GlobeSurfaceTile, ImageryLayer, - ImageryState, QuadtreeTileLoadState, SceneMode, ShadowMode) { diff --git a/Source/Scene/GoogleEarthImageryProvider.js b/Source/Scene/GoogleEarthImageryProvider.js index c85499489183..40dfc0ea0836 100644 --- a/Source/Scene/GoogleEarthImageryProvider.js +++ b/Source/Scene/GoogleEarthImageryProvider.js @@ -97,7 +97,7 @@ define([ * url : 'https://earth.localdomain', * channel : 1008 * }); - * + * * @see {@link http://www.w3.org/TR/cors/|Cross-Origin Resource Sharing} */ function GoogleEarthImageryProvider(options) { @@ -571,7 +571,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GoogleEarthImageryProvider.prototype.pickFeatures = function() { + GoogleEarthImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/GridImageryProvider.js b/Source/Scene/GridImageryProvider.js index 9741cc731896..a761703b9c49 100644 --- a/Source/Scene/GridImageryProvider.js +++ b/Source/Scene/GridImageryProvider.js @@ -37,7 +37,7 @@ define([ * @param {Color} [options.color=Color(1.0, 1.0, 1.0, 0.4)] The color to draw grid lines. * @param {Color} [options.glowColor=Color(0.0, 1.0, 0.0, 0.05)] The color to draw glow for grid lines. * @param {Number} [options.glowWidth=6] The width of lines used for rendering the line glow effect. - * @param {Color} [backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. + * @param {Color} [options.backgroundColor=Color(0.0, 0.5, 0.0, 0.2)] Background fill color. * @param {Number} [options.tileWidth=256] The width of the tile for level-of-detail selection purposes. * @param {Number} [options.tileHeight=256] The height of the tile for level-of-detail selection purposes. * @param {Number} [options.canvasSize=256] The size of the canvas used for rendering. @@ -345,7 +345,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - GridImageryProvider.prototype.pickFeatures = function() { + GridImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/GroundPrimitive.js b/Source/Scene/GroundPrimitive.js index 3704f14a5c6a..eadf4b5cfe50 100644 --- a/Source/Scene/GroundPrimitive.js +++ b/Source/Scene/GroundPrimitive.js @@ -1,11 +1,11 @@ /*global define*/ define([ - '../Core/AssociativeArray', '../Core/BoundingSphere', '../Core/buildModuleUrl', '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartographic', + '../Core/clone', '../Core/Color', '../Core/ColorGeometryInstanceAttribute', '../Core/defaultValue', @@ -18,12 +18,10 @@ define([ '../Core/isArray', '../Core/loadJson', '../Core/Math', - '../Core/Matrix3', - '../Core/Matrix4', '../Core/OrientedBoundingBox', - '../Core/PolygonGeometry', '../Core/Rectangle', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -32,19 +30,18 @@ define([ '../ThirdParty/when', './BlendingState', './DepthFunction', - './Pass', './PerInstanceColorAppearance', './Primitive', './SceneMode', './StencilFunction', './StencilOperation' ], function( - AssociativeArray, BoundingSphere, buildModuleUrl, Cartesian2, Cartesian3, Cartographic, + clone, Color, ColorGeometryInstanceAttribute, defaultValue, @@ -57,12 +54,10 @@ define([ isArray, loadJson, CesiumMath, - Matrix3, - Matrix4, OrientedBoundingBox, - PolygonGeometry, Rectangle, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -71,7 +66,6 @@ define([ when, BlendingState, DepthFunction, - Pass, PerInstanceColorAppearance, Primitive, SceneMode, @@ -204,9 +198,7 @@ define([ /** * This property is for debugging only; it is not for production use nor is it optimized. *

- * Draws the shadow volume for each geometry in the primitive. Must be true on - * creation for the volumes to be created before the geometry is released or releaseGeometryInstances - * must be false + * Draws the shadow volume for each geometry in the primitive. *

* * @type {Boolean} @@ -214,6 +206,7 @@ define([ * @default false */ this.debugShowShadowVolume = defaultValue(options.debugShowShadowVolume, false); + this._debugShowShadowVolume = false; this._sp = undefined; this._spPick = undefined; @@ -223,7 +216,11 @@ define([ this._rsColorPass = undefined; this._rsPickPass = undefined; - this._uniformMap = {}; + this._uniformMap = { + u_globeMinimumAltitude: function() { + return 55000.0; + } + }; this._boundingVolumes = []; this._boundingVolumes2D = []; @@ -232,7 +229,6 @@ define([ this._readyPromise = when.defer(); this._primitive = undefined; - this._debugPrimitive = undefined; this._maxHeight = undefined; this._minHeight = undefined; @@ -404,7 +400,7 @@ define([ * @returns {Boolean} true if GroundPrimitives are supported; otherwise, returns false */ GroundPrimitive.isSupported = function(scene) { - return scene.context.fragmentDepth; + return scene.context.fragmentDepth && scene.context.stencilBuffer; }; GroundPrimitive._defaultMaxTerrainHeight = 9000.0; @@ -427,91 +423,98 @@ define([ }; } - var stencilPreloadRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.DECREMENT_WRAP, - zPass : StencilOperation.DECREMENT_WRAP + function getStencilPreloadRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.INCREMENT_WRAP, - zPass : StencilOperation.INCREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.DECREMENT_WRAP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.INCREMENT_WRAP, + zPass : StencilOperation.INCREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false - }; + depthTest : { + enabled : false + }, + depthMask : false + }; + } - var stencilDepthRenderState = { - colorMask : { - red : false, - green : false, - blue : false, - alpha : false - }, - stencilTest : { - enabled : true, - frontFunction : StencilFunction.ALWAYS, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.INCREMENT_WRAP + function getStencilDepthRenderState(enableStencil) { + return { + colorMask : { + red : false, + green : false, + blue : false, + alpha : false }, - backFunction : StencilFunction.ALWAYS, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.ALWAYS, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.INCREMENT_WRAP + }, + backFunction : StencilFunction.ALWAYS, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : true, - func : DepthFunction.LESS_OR_EQUAL - }, - depthMask : false - }; + depthTest : { + enabled : true, + func : DepthFunction.LESS_OR_EQUAL + }, + depthMask : false + }; + } - var colorRenderState = { - stencilTest : { - enabled : true, - frontFunction : StencilFunction.NOT_EQUAL, - frontOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + + function getColorRenderState(enableStencil) { + return { + stencilTest : { + enabled : enableStencil, + frontFunction : StencilFunction.NOT_EQUAL, + frontOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + backFunction : StencilFunction.NOT_EQUAL, + backOperation : { + fail : StencilOperation.KEEP, + zFail : StencilOperation.KEEP, + zPass : StencilOperation.DECREMENT_WRAP + }, + reference : 0, + mask : ~0 }, - backFunction : StencilFunction.NOT_EQUAL, - backOperation : { - fail : StencilOperation.KEEP, - zFail : StencilOperation.KEEP, - zPass : StencilOperation.DECREMENT_WRAP + depthTest : { + enabled : false }, - reference : 0, - mask : ~0 - }, - depthTest : { - enabled : false - }, - depthMask : false, - blending : BlendingState.ALPHA_BLEND - }; + depthMask : false, + blending : BlendingState.ALPHA_BLEND + }; + } var pickRenderState = { stencilTest : { @@ -696,66 +699,96 @@ define([ return BoundingSphere.union(result, scratchBoundingSphere, result); } - function createBoundingVolume(primitive, frameState, geometry) { + function createBoundingVolume(groundPrimitive, frameState, geometry) { var ellipsoid = frameState.mapProjection.ellipsoid; var rectangle = getRectangle(frameState, geometry); // Use an oriented bounding box by default, but switch to a bounding sphere if bounding box creation would fail. if (rectangle.width < CesiumMath.PI) { - var obb = OrientedBoundingBox.fromRectangle(rectangle, primitive._maxHeight, primitive._minHeight, ellipsoid); - primitive._boundingVolumes.push(obb); + var obb = OrientedBoundingBox.fromRectangle(rectangle, groundPrimitive._maxHeight, groundPrimitive._minHeight, ellipsoid); + groundPrimitive._boundingVolumes.push(obb); } else { var highPositions = geometry.attributes.position3DHigh.values; var lowPositions = geometry.attributes.position3DLow.values; - primitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); + groundPrimitive._boundingVolumes.push(BoundingSphere.fromEncodedCartesianVertices(highPositions, lowPositions)); } if (!frameState.scene3DOnly) { var projection = frameState.mapProjection; - var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, primitive._maxHeight, primitive._minHeight); + var boundingVolume = BoundingSphere.fromRectangleWithHeights2D(rectangle, projection, groundPrimitive._maxHeight, groundPrimitive._minHeight); Cartesian3.fromElements(boundingVolume.center.z, boundingVolume.center.x, boundingVolume.center.y, boundingVolume.center); - primitive._boundingVolumes2D.push(boundingVolume); + groundPrimitive._boundingVolumes2D.push(boundingVolume); } } - function createRenderStates(primitive, context, appearance, twoPasses) { - if (defined(primitive._rsStencilPreloadPass)) { + function createRenderStates(groundPrimitive, context, appearance, twoPasses) { + if (defined(groundPrimitive._rsStencilPreloadPass)) { return; } + var stencilEnabled = !groundPrimitive.debugShowShadowVolume; + + groundPrimitive._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(stencilEnabled)); + groundPrimitive._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(stencilEnabled)); + groundPrimitive._rsColorPass = RenderState.fromCache(getColorRenderState(stencilEnabled)); + groundPrimitive._rsPickPass = RenderState.fromCache(pickRenderState); + } + + function modifyForEncodedNormals(primitive, vertexShaderSource) { + if (!primitive.compressVertices) { + return vertexShaderSource; + } + + if (vertexShaderSource.search(/attribute\s+vec3\s+extrudeDirection;/g) !== -1) { + var attributeName = 'compressedAttributes'; + + //only shadow volumes use extrudeDirection, and shadow volumes use vertexFormat: POSITION_ONLY so we don't need to check other attributes + var attributeDecl = 'attribute vec2 ' + attributeName + ';'; + + var globalDecl = 'vec3 extrudeDirection;\n'; + var decode = ' extrudeDirection = czm_octDecode(' + attributeName + ', 65535.0);\n'; - primitive._rsStencilPreloadPass = RenderState.fromCache(stencilPreloadRenderState); - primitive._rsStencilDepthPass = RenderState.fromCache(stencilDepthRenderState); - primitive._rsColorPass = RenderState.fromCache(colorRenderState); - primitive._rsPickPass = RenderState.fromCache(pickRenderState); + var modifiedVS = vertexShaderSource; + modifiedVS = modifiedVS.replace(/attribute\s+vec3\s+extrudeDirection;/g, ''); + modifiedVS = ShaderSource.replaceMain(modifiedVS, 'czm_non_compressed_main'); + var compressedMain = + 'void main() \n' + + '{ \n' + + decode + + ' czm_non_compressed_main(); \n' + + '}'; + + return [attributeDecl, globalDecl, modifiedVS, compressedMain].join('\n'); + } } - function createShaderProgram(primitive, frameState, appearance) { - if (defined(primitive._sp)) { + function createShaderProgram(groundPrimitive, frameState, appearance) { + if (defined(groundPrimitive._sp)) { return; } var context = frameState.context; - + var primitive = groundPrimitive._primitive; var vs = ShadowVolumeVS; - vs = primitive._primitive._batchTable.getVertexShaderCallback()(vs); - vs = Primitive._appendShowToShader(primitive._primitive, vs); - vs = Primitive._appendDistanceDisplayConditionToShader(primitive._primitive, vs); - vs = Primitive._modifyShaderPosition(primitive, vs, frameState.scene3DOnly); - vs = Primitive._updateColorAttribute(primitive._primitive, vs); + vs = groundPrimitive._primitive._batchTable.getVertexShaderCallback()(vs); + vs = Primitive._appendShowToShader(primitive, vs); + vs = Primitive._appendDistanceDisplayConditionToShader(primitive, vs); + vs = Primitive._modifyShaderPosition(groundPrimitive, vs, frameState.scene3DOnly); + vs = Primitive._updateColorAttribute(primitive, vs); + vs = modifyForEncodedNormals(primitive, vs); var fs = ShadowVolumeFS; - var attributeLocations = primitive._primitive._attributeLocations; + var attributeLocations = groundPrimitive._primitive._attributeLocations; - primitive._sp = ShaderProgram.replaceCache({ + groundPrimitive._sp = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._sp, + shaderProgram : groundPrimitive._sp, vertexShaderSource : vs, fragmentShaderSource : fs, attributeLocations : attributeLocations }); - if (primitive._primitive.allowPicking) { + if (groundPrimitive._primitive.allowPicking) { var vsPick = ShaderSource.createPickVertexShaderSource(vs); vsPick = Primitive._updatePickColorAttribute(vsPick); @@ -763,15 +796,15 @@ define([ sources : [fs], pickColorQualifier : 'varying' }); - primitive._spPick = ShaderProgram.replaceCache({ + groundPrimitive._spPick = ShaderProgram.replaceCache({ context : context, - shaderProgram : primitive._spPick, + shaderProgram : groundPrimitive._spPick, vertexShaderSource : vsPick, fragmentShaderSource : pickFS, attributeLocations : attributeLocations }); } else { - primitive._spPick = ShaderProgram.fromCache({ + groundPrimitive._spPick = ShaderProgram.fromCache({ context : context, vertexShaderSource : vs, fragmentShaderSource : fs, @@ -1015,8 +1048,10 @@ define([ return; } + var that = this; + var primitiveOptions = this._primitiveOptions; + if (!defined(this._primitive)) { - var primitiveOptions = this._primitiveOptions; var ellipsoid = frameState.mapProjection.ellipsoid; var instance; @@ -1090,7 +1125,6 @@ define([ primitiveOptions.geometryInstances = groundInstances; - var that = this; primitiveOptions._createBoundingVolumeFunction = function(frameState, geometry) { createBoundingVolume(that, frameState, geometry); }; @@ -1124,52 +1158,20 @@ define([ }); } - this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; - this._primitive.update(frameState); - - if (this.debugShowShadowVolume && !defined(this._debugPrimitive) && defined(this.geometryInstances)) { - var debugInstances = isArray(this.geometryInstances) ? this.geometryInstances : [this.geometryInstances]; - var debugLength = debugInstances.length; - var debugVolumeInstances = new Array(debugLength); - - for (var j = 0 ; j < debugLength; ++j) { - var debugInstance = debugInstances[j]; - var debugGeometry = debugInstance.geometry; - var debugInstanceType = debugGeometry.constructor; - if (defined(debugInstanceType) && defined(debugInstanceType.createShadowVolume)) { - var debugColorArray = debugInstance.attributes.color.value; - var debugColor = Color.fromBytes(debugColorArray[0], debugColorArray[1], debugColorArray[2], debugColorArray[3]); - Color.subtract(new Color(1.0, 1.0, 1.0, 0.0), debugColor, debugColor); - debugVolumeInstances[j] = new GeometryInstance({ - geometry : debugInstanceType.createShadowVolume(debugGeometry, getComputeMinimumHeightFunction(this), getComputeMaximumHeightFunction(this)), - attributes : { - color : ColorGeometryInstanceAttribute.fromColor(debugColor) - }, - id : debugInstance.id, - pickPrimitive : this - }); - } - } - - this._debugPrimitive = new Primitive({ - geometryInstances : debugVolumeInstances, - releaseGeometryInstances : true, - allowPicking : false, - asynchronous : false, - appearance : new PerInstanceColorAppearance({ - flat : true - }) - }); + if (this.debugShowShadowVolume && !this._debugShowShadowVolume && this._ready) { + this._debugShowShadowVolume = true; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(false)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(false)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(false)); + } else if (!this.debugShowShadowVolume && this._debugShowShadowVolume) { + this._debugShowShadowVolume = false; + this._rsStencilPreloadPass = RenderState.fromCache(getStencilPreloadRenderState(true)); + this._rsStencilDepthPass = RenderState.fromCache(getStencilDepthRenderState(true)); + this._rsColorPass = RenderState.fromCache(getColorRenderState(true)); } - if (defined(this._debugPrimitive)) { - if (this.debugShowShadowVolume) { - this._debugPrimitive.update(frameState); - } else { - this._debugPrimitive.destroy(); - this._debugPrimitive = undefined; - } - } + this._primitive.debugShowBoundingVolume = this.debugShowBoundingVolume; + this._primitive.update(frameState); }; /** @@ -1241,7 +1243,6 @@ define([ */ GroundPrimitive.prototype.destroy = function() { this._primitive = this._primitive && this._primitive.destroy(); - this._debugPrimitive = this._debugPrimitive && this._debugPrimitive.destroy(); this._sp = this._sp && this._sp.destroy(); this._spPick = this._spPick && this._spPick.destroy(); return destroyObject(this); diff --git a/Source/Scene/HorizontalOrigin.js b/Source/Scene/HorizontalOrigin.js index 17199472a51d..87f5d981370e 100644 --- a/Source/Scene/HorizontalOrigin.js +++ b/Source/Scene/HorizontalOrigin.js @@ -6,13 +6,19 @@ define([ 'use strict'; /** - * The horizontal location of an origin relative to an object, e.g., a {@link Billboard}. - * For example, the horizontal origin is used to display a billboard to the left or right (in - * screen space) of the actual position. + * The horizontal location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the horizontal origin to LEFT + * or RIGHT will display a billboard to the left or right (in screen space) + * of the anchor position. + *

+ *
+ *
+ *
* * @exports HorizontalOrigin * * @see Billboard#horizontalOrigin + * @see Label#horizontalOrigin */ var HorizontalOrigin = { /** diff --git a/Source/Scene/Imagery.js b/Source/Scene/Imagery.js index 061c000542b1..cf7520ff64f0 100644 --- a/Source/Scene/Imagery.js +++ b/Source/Scene/Imagery.js @@ -72,7 +72,7 @@ define([ this.texture.destroy(); } - if (defined(this.textureWebMercator)) { + if (defined(this.textureWebMercator) && this.texture !== this.textureWebMercator) { this.textureWebMercator.destroy(); } diff --git a/Source/Scene/ImageryLayer.js b/Source/Scene/ImageryLayer.js index 295d34d50de5..b116eeb23405 100644 --- a/Source/Scene/ImageryLayer.js +++ b/Source/Scene/ImageryLayer.js @@ -1,10 +1,7 @@ /*global define*/ define([ - '../Core/BoundingRectangle', '../Core/Cartesian2', '../Core/Cartesian4', - '../Core/Color', - '../Core/ComponentDatatype', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', @@ -14,7 +11,6 @@ define([ '../Core/IndexDatatype', '../Core/Math', '../Core/PixelFormat', - '../Core/PrimitiveType', '../Core/Rectangle', '../Core/TerrainProvider', '../Core/TileProviderError', @@ -22,13 +18,9 @@ define([ '../Core/WebMercatorTilingScheme', '../Renderer/Buffer', '../Renderer/BufferUsage', - '../Renderer/ClearCommand', '../Renderer/ComputeCommand', '../Renderer/ContextLimits', - '../Renderer/DrawCommand', - '../Renderer/Framebuffer', '../Renderer/MipmapHint', - '../Renderer/RenderState', '../Renderer/Sampler', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -44,11 +36,8 @@ define([ './ImageryState', './TileImagery' ], function( - BoundingRectangle, Cartesian2, Cartesian4, - Color, - ComponentDatatype, defaultValue, defined, defineProperties, @@ -58,7 +47,6 @@ define([ IndexDatatype, CesiumMath, PixelFormat, - PrimitiveType, Rectangle, TerrainProvider, TileProviderError, @@ -66,13 +54,9 @@ define([ WebMercatorTilingScheme, Buffer, BufferUsage, - ClearCommand, ComputeCommand, ContextLimits, - DrawCommand, - Framebuffer, MipmapHint, - RenderState, Sampler, ShaderProgram, ShaderSource, @@ -592,7 +576,7 @@ define([ if (!defined(clippedImageryRectangle)) { continue; } - + minV = Math.max(0.0, (clippedImageryRectangle.south - terrainRectangle.south) / terrainRectangle.height); // If this is the southern-most imagery tile mapped to this terrain tile, @@ -653,6 +637,7 @@ define([ * @private * * @param {Imagery} imagery The imagery to request. + * @param {Number} [distance] The distance of the tile from the camera. */ ImageryLayer.prototype._requestImagery = function(imagery, distance) { var imageryProvider = this._imageryProvider; @@ -716,6 +701,7 @@ define([ */ ImageryLayer.prototype._createTexture = function(context, imagery) { var imageryProvider = this._imageryProvider; + var image = imagery.image; // If this imagery provider has a discard policy, use it to check if this // image should be discarded. @@ -730,7 +716,7 @@ define([ } // Mark discarded imagery tiles invalid. Parent imagery will be used instead. - if (discardPolicy.shouldDiscardImage(imagery.image)) { + if (discardPolicy.shouldDiscardImage(image)) { imagery.state = ImageryState.INVALID; return; } @@ -738,11 +724,24 @@ define([ } // Imagery does not need to be discarded, so upload it to WebGL. - var texture = new Texture({ - context : context, - source : imagery.image, - pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB - }); + var texture; + if (defined(image.internalFormat)) { + texture = new Texture({ + context : context, + pixelFormat : image.internalFormat, + width : image.width, + height : image.height, + source : { + arrayBufferView : image.bufferView + } + }); + } else { + texture = new Texture({ + context : context, + source : image, + pixelFormat : imageryProvider.hasAlphaChannel ? PixelFormat.RGBA : PixelFormat.RGB + }); + } if (imageryProvider.tilingScheme instanceof WebMercatorTilingScheme) { imagery.textureWebMercator = texture; @@ -755,7 +754,7 @@ define([ function finalizeReprojectTexture(imageryLayer, context, imagery, texture) { // Use mipmaps if this texture has power-of-two dimensions. - if (CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) { + if (!PixelFormat.isCompressedFormat(texture.pixelFormat) && CesiumMath.isPowerOfTwo(texture.width) && CesiumMath.isPowerOfTwo(texture.height)) { var mipmapSampler = context.cache.imageryLayer_mipmapSampler; if (!defined(mipmapSampler)) { var maximumSupportedAnisotropy = ContextLimits.maximumTextureFilterAnisotropy; @@ -827,6 +826,9 @@ define([ }); this._reprojectComputeCommands.push(computeCommand); } else { + if (needGeographicProjection) { + imagery.texture = texture; + } finalizeReprojectTexture(this, context, imagery, texture); } }; @@ -1072,6 +1074,7 @@ define([ /** * Gets the level with the specified world coordinate spacing between texels, or less. * + * @param {ImageryLayer} layer The imagery layer to use. * @param {Number} texelSpacing The texel spacing for which to find a corresponding level. * @param {Number} latitudeClosestToEquator The latitude closest to the equator that we're concerned with. * @returns {Number} The level with the specified texel spacing or less. diff --git a/Source/Scene/ImageryProvider.js b/Source/Scene/ImageryProvider.js index dc4e163ae447..086059b85a97 100644 --- a/Source/Scene/ImageryProvider.js +++ b/Source/Scene/ImageryProvider.js @@ -3,8 +3,10 @@ define([ '../Core/defined', '../Core/defineProperties', '../Core/DeveloperError', + '../Core/loadCRN', '../Core/loadImage', '../Core/loadImageViaBlob', + '../Core/loadKTX', '../Core/Request', '../Core/RequestScheduler', '../Core/RequestType' @@ -12,8 +14,10 @@ define([ defined, defineProperties, DeveloperError, + loadCRN, loadImage, loadImageViaBlob, + loadKTX, Request, RequestScheduler, RequestType) { @@ -299,6 +303,9 @@ define([ */ ImageryProvider.prototype.pickFeatures = DeveloperError.throwInstantiationError; + var ktxRegex = /\.ktx$/i; + var crnRegex = /\.crn$/i; + /** * Determines whether data for a tile is available to be loaded. * @@ -316,7 +323,7 @@ define([ * too many requests pending, this function will instead return undefined, indicating * that the request should be retried later. * - * @param {ImageryProvider} imageryProvider The imagery provider + * @param {ImageryProvider} imageryProvider The imagery provider for the URL * @param {String} url The URL of the image. * @param {Number} [distance] The distance of the tile from the camera, used to prioritize requests. * @returns {Promise.|undefined} A promise for the image that will resolve when the image is available, or @@ -325,7 +332,16 @@ define([ * Image or a Canvas DOM object. */ ImageryProvider.loadImage = function(imageryProvider, url, distance) { - var requestFunction = defined(imageryProvider.tileDiscardPolicy) ? loadImageViaBlob : loadImage; + var requestFunction; + if (ktxRegex.test(url)) { + requestFunction = loadKTX; + } else if (crnRegex.test(url)) { + requestFunction = loadCRN; + } else if (defined(imageryProvider.tileDiscardPolicy)) { + requestFunction = loadImageViaBlob; + } else { + requestFunction = loadImage; + } return RequestScheduler.schedule(new Request({ url : url, diff --git a/Source/Scene/Instanced3DModel3DTileContent.js b/Source/Scene/Instanced3DModel3DTileContent.js index aa4a8e4048ec..572a5e5a632c 100644 --- a/Source/Scene/Instanced3DModel3DTileContent.js +++ b/Source/Scene/Instanced3DModel3DTileContent.js @@ -16,9 +16,9 @@ define([ '../Core/getStringFromTypedArray', '../Core/joinUrls', '../Core/loadArrayBuffer', + '../Core/Math', '../Core/Matrix3', '../Core/Matrix4', - '../Core/Math', '../Core/Quaternion', '../Core/Request', '../Core/RequestScheduler', @@ -27,9 +27,9 @@ define([ '../Core/TranslationRotationScale', '../ThirdParty/Uri', '../ThirdParty/when', - './Cesium3DTileFeature', './Cesium3DTileBatchTable', './Cesium3DTileContentState', + './Cesium3DTileFeature', './Cesium3DTileFeatureTable', './ModelInstanceCollection' ], function( @@ -49,9 +49,9 @@ define([ getStringFromTypedArray, joinUrls, loadArrayBuffer, + CesiumMath, Matrix3, Matrix4, - CesiumMath, Quaternion, Request, RequestScheduler, @@ -60,9 +60,9 @@ define([ TranslationRotationScale, Uri, when, - Cesium3DTileFeature, Cesium3DTileBatchTable, Cesium3DTileContentState, + Cesium3DTileFeature, Cesium3DTileFeatureTable, ModelInstanceCollection) { 'use strict'; @@ -148,8 +148,8 @@ define([ /** * Part of the {@link Cesium3DTileContent} interface. */ - Instanced3DModel3DTileContent.prototype.hasProperty = function(name) { - return this.batchTable.hasProperty(name); + Instanced3DModel3DTileContent.prototype.hasProperty = function(batchId, name) { + return this.batchTable.hasProperty(batchId, name); }; /** @@ -492,6 +492,7 @@ define([ this.batchTable.update(tileset, frameState); this._modelInstanceCollection.transform = this._tile.computedTransform; this._modelInstanceCollection.shadows = this._tileset.shadows; + this._modelInstanceCollection.debugWireframe = this._tileset.debugWireframe; this._modelInstanceCollection.update(frameState); frameState.addCommand = oldAddCommand; diff --git a/Source/Scene/Label.js b/Source/Scene/Label.js index 4eaf305735eb..67502ac5d74c 100644 --- a/Source/Scene/Label.js +++ b/Source/Scene/Label.js @@ -86,8 +86,11 @@ define([ this._fillColor = Color.clone(defaultValue(options.fillColor, Color.WHITE)); this._outlineColor = Color.clone(defaultValue(options.outlineColor, Color.BLACK)); this._outlineWidth = defaultValue(options.outlineWidth, 1.0); + this._showBackground = defaultValue(options.showBackground, false); + this._backgroundColor = defaultValue(options.backgroundColor, new Color(0.165, 0.165, 0.165, 0.8)); + this._backgroundPadding = defaultValue(options.backgroundPadding, new Cartesian2(7, 5)); this._style = defaultValue(options.style, LabelStyle.FILL); - this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BOTTOM); + this._verticalOrigin = defaultValue(options.verticalOrigin, VerticalOrigin.BASELINE); this._horizontalOrigin = defaultValue(options.horizontalOrigin, HorizontalOrigin.LEFT); this._pixelOffset = Cartesian2.clone(defaultValue(options.pixelOffset, Cartesian2.ZERO)); this._eyeOffset = Cartesian3.clone(defaultValue(options.eyeOffset, Cartesian3.ZERO)); @@ -101,6 +104,7 @@ define([ this._labelCollection = labelCollection; this._glyphs = []; + this._backgroundBillboard = undefined; this._rebindAllGlyphs = true; this._repositionAllGlyphs = true; @@ -120,6 +124,7 @@ define([ * of removing it and re-adding it to the collection. * @memberof Label.prototype * @type {Boolean} + * @default true */ show : { get : function() { @@ -142,6 +147,10 @@ define([ billboard.show = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.show = value; + } } } }, @@ -173,6 +182,10 @@ define([ billboard.position = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.position = value; + } if (this._heightReference !== HeightReference.NONE) { this._updateClamping(); @@ -185,6 +198,7 @@ define([ * Gets or sets the height reference of this billboard. * @memberof Label.prototype * @type {HeightReference} + * @default HeightReference.NONE */ heightReference : { get : function() { @@ -207,6 +221,10 @@ define([ billboard.heightReference = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.heightReference = value; + } repositionAllGlyphs(this); @@ -242,6 +260,7 @@ define([ * Gets or sets the font used to draw this label. Fonts are specified using the same syntax as the CSS 'font' property. * @memberof Label.prototype * @type {String} + * @default '30px sans-serif' * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#text-styles|HTML canvas 2D context text styles} */ font : { @@ -266,6 +285,7 @@ define([ * Gets or sets the fill color of this label. * @memberof Label.prototype * @type {Color} + * @default Color.WHITE * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ fillColor : { @@ -291,6 +311,7 @@ define([ * Gets or sets the outline color of this label. * @memberof Label.prototype * @type {Color} + * @default Color.BLACK * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ outlineColor : { @@ -316,6 +337,7 @@ define([ * Gets or sets the outline width of this label. * @memberof Label.prototype * @type {Number} + * @default 1.0 * @see {@link http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#fill-and-stroke-styles|HTML canvas 2D context fill and stroke styles} */ outlineWidth : { @@ -336,10 +358,90 @@ define([ } }, + /** + * Determines if a background behind this label will be shown. + * @memberof Label.prototype + * @default false + * @type {Boolean} + */ + showBackground : { + get : function() { + return this._showBackground; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + if (this._showBackground !== value) { + this._showBackground = value; + rebindAllGlyphs(this); + } + } + }, + + /** + * Gets or sets the background color of this label. + * @memberof Label.prototype + * @type {Color} + * @default new Color(0.165, 0.165, 0.165, 0.8) + */ + backgroundColor : { + get : function() { + return this._backgroundColor; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + var backgroundColor = this._backgroundColor; + if (!Color.equals(backgroundColor, value)) { + Color.clone(value, backgroundColor); + + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.color = backgroundColor; + } + } + } + }, + + /** + * Gets or sets the background padding, in pixels, of this label. The x value + * controls horizontal padding, and the y value controls vertical padding. + * @memberof Label.prototype + * @type {Cartesian2} + * @default new Cartesian2(7, 5) + */ + backgroundPadding : { + get : function() { + return this._backgroundPadding; + }, + set : function(value) { + //>>includeStart('debug', pragmas.debug); + if (!defined(value)) { + throw new DeveloperError('value is required.'); + } + //>>includeEnd('debug'); + + var backgroundPadding = this._backgroundPadding; + if (!Cartesian2.equals(backgroundPadding, value)) { + Cartesian2.clone(value, backgroundPadding); + repositionAllGlyphs(this); + } + } + }, + /** * Gets or sets the style of this label. * @memberof Label.prototype * @type {LabelStyle} + * @default LabelStyle.FILL */ style : { get : function() { @@ -374,6 +476,7 @@ define([ * * @memberof Label.prototype * @type {Cartesian2} + * @default Cartesian2.ZERO */ pixelOffset : { get : function() { @@ -397,6 +500,10 @@ define([ glyph.billboard.pixelOffset = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.pixelOffset = value; + } } } }, @@ -445,6 +552,10 @@ define([ glyph.billboard.translucencyByDistance = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.translucencyByDistance = value; + } } } }, @@ -494,6 +605,10 @@ define([ glyph.billboard.pixelOffsetScaleByDistance = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.pixelOffsetScaleByDistance = value; + } } } }, @@ -519,6 +634,7 @@ define([ * * @memberof Label.prototype * @type {Cartesian3} + * @default Cartesian3.ZERO */ eyeOffset : { get : function() { @@ -542,19 +658,24 @@ define([ glyph.billboard.eyeOffset = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.eyeOffset = value; + } } } }, /** * Gets or sets the horizontal origin of this label, which determines if the label is drawn - * to the left, center, or right of its position. + * to the left, center, or right of its anchor position. *

*
- *
+ *
*
* @memberof Label.prototype * @type {HorizontalOrigin} + * @default HorizontalOrigin.LEFT * @example * // Use a top, right origin * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; @@ -580,13 +701,14 @@ define([ /** * Gets or sets the vertical origin of this label, which determines if the label is - * to the above, below, or at the center of its position. + * to the above, below, or at the center of its anchor position. *

*
- *
+ *
*
* @memberof Label.prototype * @type {VerticalOrigin} + * @default VerticalOrigin.BASELINE * @example * // Use a top, right origin * l.horizontalOrigin = Cesium.HorizontalOrigin.RIGHT; @@ -613,6 +735,10 @@ define([ glyph.billboard.verticalOrigin = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.verticalOrigin = value; + } repositionAllGlyphs(this); } @@ -635,6 +761,7 @@ define([ * * @memberof Label.prototype * @type {Number} + * @default 1.0 */ scale : { get : function() { @@ -657,6 +784,10 @@ define([ glyph.billboard.scale = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.scale = value; + } repositionAllGlyphs(this); } @@ -689,6 +820,10 @@ define([ glyph.billboard.distanceDisplayCondition = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.distanceDisplayCondition = value; + } } } }, @@ -713,6 +848,10 @@ define([ glyph.billboard.id = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.id = value; + } } } }, @@ -731,19 +870,23 @@ define([ this._actualClampedPosition = Cartesian3.clone(value, this._actualClampedPosition); var glyphs = this._glyphs; + value = defaultValue(value, this._position); for (var i = 0, len = glyphs.length; i < len; i++) { var glyph = glyphs[i]; if (defined(glyph.billboard)) { // Set all the private values here, because we already clamped to ground // so we don't want to do it again for every glyph - glyph.billboard._clampedPosition = value; - - value = defaultValue(value, this._position); Cartesian3.clone(value, glyph.billboard._position); Cartesian3.clone(value, glyph.billboard._actualPosition); } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard._clampedPosition = value; + Cartesian3.clone(value, backgroundBillboard._position); + Cartesian3.clone(value, backgroundBillboard._actualPosition); + } } }, @@ -751,6 +894,7 @@ define([ * Determines whether or not this label will be shown or hidden because it was clustered. * @memberof Label.prototype * @type {Boolean} + * @default true * @private */ clusterShow : { @@ -765,11 +909,13 @@ define([ for (var i = 0, len = glyphs.length; i < len; i++) { var glyph = glyphs[i]; if (defined(glyph.billboard)) { - // Set all the private values here, because we already clamped to ground - // so we don't want to do it again for every glyph glyph.billboard.clusterShow = value; } } + var backgroundBillboard = this._backgroundBillboard; + if (defined(backgroundBillboard)) { + backgroundBillboard.clusterShow = value; + } } } } @@ -825,38 +971,58 @@ define([ * @private */ Label.getScreenSpaceBoundingBox = function(label, screenSpacePosition, result) { + var x = 0; + var y = 0; var width = 0; var height = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; + var scale = label.scale; + var resolutionScale = label._labelCollection._resolutionScale; + + var backgroundBillboard = label._backgroundBillboard; + if (defined(backgroundBillboard)) { + x = screenSpacePosition.x + (backgroundBillboard._translate.x / resolutionScale); + y = screenSpacePosition.y - (backgroundBillboard._translate.y / resolutionScale); + width = backgroundBillboard.width * scale; + height = backgroundBillboard.height * scale; + + if (label.verticalOrigin === VerticalOrigin.BOTTOM || label.verticalOrigin === VerticalOrigin.BASELINE) { + y -= height; + } else if (label.verticalOrigin === VerticalOrigin.CENTER) { + y -= height * 0.5; } + } else { + x = Number.POSITIVE_INFINITY; + y = Number.POSITIVE_INFINITY; + var maxX = 0; + var maxY = 0; + var glyphs = label._glyphs; + var length = glyphs.length; + for (var i = 0; i < length; ++i) { + var glyph = glyphs[i]; + var billboard = glyph.billboard; + if (!defined(billboard)) { + continue; + } - width += billboard.width; - height = Math.max(height, billboard.height); - } + var glyphX = screenSpacePosition.x + (billboard._translate.x / resolutionScale); + var glyphY = screenSpacePosition.y - (billboard._translate.y / resolutionScale); + var glyphWidth = billboard.width * scale; + var glyphHeight = billboard.height * scale; - var scale = label.scale; - width *= scale; - height *= scale; - - var x = screenSpacePosition.x; - if (label.horizontalOrigin === HorizontalOrigin.RIGHT) { - x -= width; - } else if (label.horizontalOrigin === HorizontalOrigin.CENTER) { - x -= width * 0.5; - } + if (label.verticalOrigin === VerticalOrigin.BOTTOM || label.verticalOrigin === VerticalOrigin.BASELINE) { + glyphY -= glyphHeight; + } else if (label.verticalOrigin === VerticalOrigin.CENTER) { + glyphY -= glyphHeight * 0.5; + } + + x = Math.min(x, glyphX); + y = Math.min(y, glyphY); + maxX = Math.max(maxX, glyphX + glyphWidth); + maxY = Math.max(maxY, glyphY + glyphHeight); + } - var y = screenSpacePosition.y; - if (label.verticalOrigin === VerticalOrigin.TOP) { - y -= height; - } else if (label.verticalOrigin === VerticalOrigin.CENTER) { - y -= height * 0.5; + width = maxX - x; + height = maxY - y; } if (!defined(result)) { @@ -883,6 +1049,8 @@ define([ defined(other) && this._show === other._show && this._scale === other._scale && + this._outlineWidth === other._outlineWidth && + this._showBackground === other._showBackground && this._style === other._style && this._verticalOrigin === other._verticalOrigin && this._horizontalOrigin === other._horizontalOrigin && @@ -892,6 +1060,8 @@ define([ Cartesian3.equals(this._position, other._position) && Color.equals(this._fillColor, other._fillColor) && Color.equals(this._outlineColor, other._outlineColor) && + Color.equals(this._backgroundColor, other._backgroundColor) && + Cartesian2.equals(this._backgroundPadding, other._backgroundPadding) && Cartesian2.equals(this._pixelOffset, other._pixelOffset) && Cartesian3.equals(this._eyeOffset, other._eyeOffset) && NearFarScalar.equals(this._translucencyByDistance, other._translucencyByDistance) && diff --git a/Source/Scene/LabelCollection.js b/Source/Scene/LabelCollection.js index 10897596683e..54b4b20adbb8 100644 --- a/Source/Scene/LabelCollection.js +++ b/Source/Scene/LabelCollection.js @@ -1,6 +1,8 @@ /*global define*/ define([ + '../Core/BoundingRectangle', '../Core/Cartesian2', + '../Core/Color', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', @@ -9,14 +11,15 @@ define([ '../Core/Matrix4', '../Core/writeTextToCanvas', './BillboardCollection', - './HeightReference', './HorizontalOrigin', './Label', './LabelStyle', './TextureAtlas', './VerticalOrigin' ], function( + BoundingRectangle, Cartesian2, + Color, defaultValue, defined, defineProperties, @@ -25,7 +28,6 @@ define([ Matrix4, writeTextToCanvas, BillboardCollection, - HeightReference, HorizontalOrigin, Label, LabelStyle, @@ -53,6 +55,27 @@ define([ this.dimensions = dimensions; } + // Traditionally, leading is %20 of the font size. + var defaultLineSpacingPercent = 1.2; + + var whitePixelCanvasId = 'ID_WHITE_PIXEL'; + var whitePixelSize = new Cartesian2(4, 4); + var whitePixelBoundingRegion = new BoundingRectangle(1, 1, 1, 1); + + function addWhitePixelCanvas(textureAtlas, labelCollection) { + var canvas = document.createElement('canvas'); + canvas.width = whitePixelSize.x; + canvas.height = whitePixelSize.y; + + var context2D = canvas.getContext('2d'); + context2D.fillStyle = '#fff'; + context2D.fillRect(0, 0, canvas.width, canvas.height); + + textureAtlas.addImage(whitePixelCanvasId, canvas).then(function(index) { + labelCollection._whitePixelIndex = index; + }); + } + // reusable object for calling writeTextToCanvas var writeTextToCanvasParameters = {}; function createGlyphCanvas(character, font, fillColor, outlineColor, outlineWidth, style, verticalOrigin) { @@ -61,13 +84,13 @@ define([ writeTextToCanvasParameters.strokeColor = outlineColor; writeTextToCanvasParameters.strokeWidth = outlineWidth; - if (verticalOrigin === VerticalOrigin.BOTTOM) { - writeTextToCanvasParameters.textBaseline = 'bottom'; + if (verticalOrigin === VerticalOrigin.CENTER) { + writeTextToCanvasParameters.textBaseline = 'middle'; } else if (verticalOrigin === VerticalOrigin.TOP) { writeTextToCanvasParameters.textBaseline = 'top'; } else { - // VerticalOrigin.CENTER - writeTextToCanvasParameters.textBaseline = 'middle'; + // VerticalOrigin.BOTTOM and VerticalOrigin.BASELINE + writeTextToCanvasParameters.textBaseline = 'bottom'; } writeTextToCanvasParameters.fill = style === LabelStyle.FILL || style === LabelStyle.FILL_AND_OUTLINE; @@ -115,6 +138,40 @@ define([ // presize glyphs to match the new text length glyphs.length = textLength; + var showBackground = label._showBackground && (text.split('\n').join('').length > 0); + var backgroundBillboard = label._backgroundBillboard; + var backgroundBillboardCollection = labelCollection._backgroundBillboardCollection; + if (!showBackground) { + if (defined(backgroundBillboard)) { + backgroundBillboardCollection.remove(backgroundBillboard); + label._backgroundBillboard = backgroundBillboard = undefined; + } + } else { + if (!defined(backgroundBillboard)) { + backgroundBillboard = backgroundBillboardCollection.add({ + collection : labelCollection, + image : whitePixelCanvasId, + imageSubRegion : whitePixelBoundingRegion + }); + label._backgroundBillboard = backgroundBillboard; + } + + backgroundBillboard.color = label._backgroundColor; + backgroundBillboard.show = label._show; + backgroundBillboard.position = label._position; + backgroundBillboard.eyeOffset = label._eyeOffset; + backgroundBillboard.pixelOffset = label._pixelOffset; + backgroundBillboard.horizontalOrigin = HorizontalOrigin.LEFT; + backgroundBillboard.verticalOrigin = label._verticalOrigin; + backgroundBillboard.heightReference = label._heightReference; + backgroundBillboard.scale = label._scale; + backgroundBillboard.pickPrimitive = label; + backgroundBillboard.id = label._id; + backgroundBillboard.translucencyByDistance = label._translucencyByDistance; + backgroundBillboard.pixelOffsetScaleByDistance = label._pixelOffsetScaleByDistance; + backgroundBillboard.distanceDisplayCondition = label._distanceDisplayCondition; + } + var glyphTextureCache = labelCollection._glyphTextureCache; // walk the text looking for new characters (creating new glyphs for each) @@ -179,9 +236,10 @@ define([ // if we have a texture, configure the existing billboard, or obtain one if (glyphTextureInfo.index !== -1) { var billboard = glyph.billboard; + var spareBillboards = labelCollection._spareBillboards; if (!defined(billboard)) { - if (labelCollection._spareBillboards.length > 0) { - billboard = labelCollection._spareBillboards.pop(); + if (spareBillboards.length > 0) { + billboard = spareBillboards.pop(); } else { billboard = labelCollection._billboardCollection.add({ collection : labelCollection @@ -213,65 +271,148 @@ define([ label._repositionAllGlyphs = true; } - // reusable Cartesian2 instance + function calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding) { + if (horizontalOrigin === HorizontalOrigin.CENTER) { + return -lineWidth / 2; + } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { + return -(lineWidth + backgroundPadding.x); + } + return backgroundPadding.x; + } + + // reusable Cartesian2 instances var glyphPixelOffset = new Cartesian2(); + var scratchBackgroundPadding = new Cartesian2(); function repositionAllGlyphs(label, resolutionScale) { var glyphs = label._glyphs; + var text = label._text; var glyph; var dimensions; - var totalWidth = 0; - var maxHeight = 0; - + var lastLineWidth = 0; + var maxLineWidth = 0; + var lineWidths = []; + var maxGlyphDescent = Number.NEGATIVE_INFINITY; + var maxGlyphY = 0; + var numberOfLines = 1; var glyphIndex = 0; var glyphLength = glyphs.length; + + var backgroundBillboard = label._backgroundBillboard; + var backgroundPadding = scratchBackgroundPadding; + Cartesian2.clone( + (defined(backgroundBillboard) ? label._backgroundPadding : Cartesian2.ZERO), + backgroundPadding); + for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { - glyph = glyphs[glyphIndex]; - dimensions = glyph.dimensions; - totalWidth += dimensions.computedWidth; - maxHeight = Math.max(maxHeight, dimensions.height); + if (text.charAt(glyphIndex) === '\n') { + lineWidths.push(lastLineWidth); + ++numberOfLines; + lastLineWidth = 0; + } else { + glyph = glyphs[glyphIndex]; + dimensions = glyph.dimensions; + maxGlyphY = Math.max(maxGlyphY, dimensions.height - dimensions.descent); + maxGlyphDescent = Math.max(maxGlyphDescent, dimensions.descent); + + //Computing the line width must also account for the kerning that occurs between letters. + lastLineWidth += dimensions.width - dimensions.bounds.minx; + if (glyphIndex < glyphLength - 1) { + lastLineWidth += glyphs[glyphIndex + 1].dimensions.bounds.minx; + } + maxLineWidth = Math.max(maxLineWidth, lastLineWidth); + } } + lineWidths.push(lastLineWidth); + var maxLineHeight = maxGlyphY + maxGlyphDescent; var scale = label._scale; var horizontalOrigin = label._horizontalOrigin; - var widthOffset = 0; - if (horizontalOrigin === HorizontalOrigin.CENTER) { - widthOffset -= totalWidth / 2 * scale; - } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { - widthOffset -= totalWidth * scale; - } + var verticalOrigin = label._verticalOrigin; + var lineIndex = 0; + var lineWidth = lineWidths[lineIndex]; + var widthOffset = calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding); + var lineSpacing = defaultLineSpacingPercent * maxLineHeight; + var otherLinesHeight = lineSpacing * (numberOfLines - 1); - glyphPixelOffset.x = widthOffset * resolutionScale; + glyphPixelOffset.x = widthOffset * scale * resolutionScale; glyphPixelOffset.y = 0; - var verticalOrigin = label._verticalOrigin; + var lineOffsetY = 0; for (glyphIndex = 0; glyphIndex < glyphLength; ++glyphIndex) { - glyph = glyphs[glyphIndex]; - dimensions = glyph.dimensions; + if (text.charAt(glyphIndex) === '\n') { + ++lineIndex; + lineOffsetY += lineSpacing; + lineWidth = lineWidths[lineIndex]; + widthOffset = calculateWidthOffset(lineWidth, horizontalOrigin, backgroundPadding); + glyphPixelOffset.x = widthOffset * scale * resolutionScale; + } else { + glyph = glyphs[glyphIndex]; + dimensions = glyph.dimensions; + + if (verticalOrigin === VerticalOrigin.TOP) { + glyphPixelOffset.y = dimensions.height - maxGlyphY - backgroundPadding.y; + } else if (verticalOrigin === VerticalOrigin.CENTER) { + glyphPixelOffset.y = (otherLinesHeight + dimensions.height - maxGlyphY) / 2; + } else if (verticalOrigin === VerticalOrigin.BASELINE) { + glyphPixelOffset.y = otherLinesHeight; + } else { + // VerticalOrigin.BOTTOM + glyphPixelOffset.y = otherLinesHeight + maxGlyphDescent + backgroundPadding.y; + } + glyphPixelOffset.y = (glyphPixelOffset.y - dimensions.descent - lineOffsetY) * scale * resolutionScale; - if (verticalOrigin === VerticalOrigin.BOTTOM || dimensions.height === maxHeight) { - glyphPixelOffset.y = -dimensions.descent * scale; - } else if (verticalOrigin === VerticalOrigin.TOP) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) * scale - dimensions.descent * scale; - } else if (verticalOrigin === VerticalOrigin.CENTER) { - glyphPixelOffset.y = -(maxHeight - dimensions.height) / 2 * scale - dimensions.descent * scale; + if (defined(glyph.billboard)) { + glyph.billboard._setTranslate(glyphPixelOffset); + } + + //Compute the next x offset taking into acocunt the kerning performed + //on both the current letter as well as the next letter to be drawn + //as well as any applied scale. + if (glyphIndex < glyphLength - 1) { + var nextGlyph = glyphs[glyphIndex + 1]; + glyphPixelOffset.x += ((dimensions.width - dimensions.bounds.minx) + nextGlyph.dimensions.bounds.minx) * scale * resolutionScale; + } } + } - glyphPixelOffset.y *= resolutionScale; + if (defined(backgroundBillboard) && (text.split('\n').join('').length > 0)) { + if (horizontalOrigin === HorizontalOrigin.CENTER) { + widthOffset = -maxLineWidth / 2 - backgroundPadding.x; + } else if (horizontalOrigin === HorizontalOrigin.RIGHT) { + widthOffset = -(maxLineWidth + backgroundPadding.x * 2); + } else { + widthOffset = 0; + } + glyphPixelOffset.x = widthOffset * scale * resolutionScale; - if (defined(glyph.billboard)) { - glyph.billboard._setTranslate(glyphPixelOffset); + if (verticalOrigin === VerticalOrigin.TOP) { + glyphPixelOffset.y = maxLineHeight - maxGlyphY - maxGlyphDescent; + } else if (verticalOrigin === VerticalOrigin.CENTER) { + glyphPixelOffset.y = (maxLineHeight - maxGlyphY) / 2 - maxGlyphDescent; + } else if (verticalOrigin === VerticalOrigin.BASELINE) { + glyphPixelOffset.y = -backgroundPadding.y - maxGlyphDescent; + } else { + // VerticalOrigin.BOTTOM + glyphPixelOffset.y = 0; } + glyphPixelOffset.y = glyphPixelOffset.y * scale * resolutionScale; - glyphPixelOffset.x += dimensions.computedWidth * scale * resolutionScale; + backgroundBillboard.width = maxLineWidth + (backgroundPadding.x * 2); + backgroundBillboard.height = maxLineHeight + otherLinesHeight + (backgroundPadding.y * 2); + backgroundBillboard._setTranslate(glyphPixelOffset); } } function destroyLabel(labelCollection, label) { var glyphs = label._glyphs; - for ( var i = 0, len = glyphs.length; i < len; ++i) { + for (var i = 0, len = glyphs.length; i < len; ++i) { unbindGlyph(labelCollection, glyphs[i]); } + if (defined(label._backgroundBillboard)) { + labelCollection._backgroundBillboardCollection.remove(label._backgroundBillboard); + label._backgroundBillboard = undefined; + } label._labelCollection = undefined; if (defined(label._removeCallbackFunc)) { @@ -332,6 +473,13 @@ define([ this._batchTable = options.batchTable; this._textureAtlas = undefined; + this._backgroundTextureAtlas = undefined; + this._whitePixelIndex = undefined; + + this._backgroundBillboardCollection = new BillboardCollection({ + scene : this._scene + }); + this._backgroundBillboardCollection.destroyTextureAtlas = false; this._billboardCollection = new BillboardCollection({ scene : this._scene, @@ -429,12 +577,20 @@ define([ * font : '30px sans-serif', * fillColor : Cesium.Color.WHITE, * outlineColor : Cesium.Color.BLACK, + * outlineWidth : 1.0, + * showBackground : false, + * backgroundColor : new Cesium.Color(0.165, 0.165, 0.165, 0.8), + * backgroundPadding : new Cesium.Cartesian2(7, 5), * style : Cesium.LabelStyle.FILL, * pixelOffset : Cesium.Cartesian2.ZERO, * eyeOffset : Cesium.Cartesian3.ZERO, * horizontalOrigin : Cesium.HorizontalOrigin.LEFT, - * verticalOrigin : Cesium.VerticalOrigin.BOTTOM, - * scale : 1.0 + * verticalOrigin : Cesium.VerticalOrigin.BASELINE, + * scale : 1.0, + * translucencyByDistance : undefined, + * pixelOffsetScaleByDistance : undefined, + * heightReference : HeightReference.NONE, + * distanceDisplayCondition : undefined * }); * * @example @@ -514,7 +670,7 @@ define([ LabelCollection.prototype.removeAll = function() { var labels = this._labels; - for ( var i = 0, len = labels.length; i < len; ++i) { + for (var i = 0, len = labels.length; i < len; ++i) { destroyLabel(this, labels[i]); } @@ -576,9 +732,12 @@ define([ */ LabelCollection.prototype.update = function(frameState) { var billboardCollection = this._billboardCollection; + var backgroundBillboardCollection = this._backgroundBillboardCollection; billboardCollection.modelMatrix = this.modelMatrix; billboardCollection.debugShowBoundingVolume = this.debugShowBoundingVolume; + backgroundBillboardCollection.modelMatrix = this.modelMatrix; + backgroundBillboardCollection.debugShowBoundingVolume = this.debugShowBoundingVolume; var context = frameState.context; @@ -589,6 +748,15 @@ define([ billboardCollection.textureAtlas = this._textureAtlas; } + if (!defined(this._backgroundTextureAtlas)) { + this._backgroundTextureAtlas = new TextureAtlas({ + context : context, + initialSize : whitePixelSize + }); + backgroundBillboardCollection.textureAtlas = this._backgroundTextureAtlas; + addWhitePixelCanvas(this._backgroundTextureAtlas, this); + } + var uniformState = context.uniformState; var resolutionScale = uniformState.resolutionScale; var resolutionChanged = this._resolutionScale !== resolutionScale; @@ -625,6 +793,7 @@ define([ } this._labelsToUpdate.length = 0; + backgroundBillboardCollection.update(frameState); billboardCollection.update(frameState); }; @@ -664,6 +833,8 @@ define([ this.removeAll(); this._billboardCollection = this._billboardCollection.destroy(); this._textureAtlas = this._textureAtlas && this._textureAtlas.destroy(); + this._backgroundBillboardCollection = this._backgroundBillboardCollection.destroy(); + this._backgroundTextureAtlas = this._backgroundTextureAtlas && this._backgroundTextureAtlas.destroy(); return destroyObject(this); }; diff --git a/Source/Scene/MapboxImageryProvider.js b/Source/Scene/MapboxImageryProvider.js index cf705e74c718..8e01455b6e4c 100644 --- a/Source/Scene/MapboxImageryProvider.js +++ b/Source/Scene/MapboxImageryProvider.js @@ -65,6 +65,7 @@ define([ this._url = url; this._mapId = mapId; this._accessToken = MapboxApi.getAccessToken(options.accessToken); + this._accessTokenErrorCredit = MapboxApi.getErrorCredit(options.key); var format = defaultValue(options.format, 'png'); if (!/\./.test(format)) { format = '.' + format; @@ -302,7 +303,11 @@ define([ * @exception {DeveloperError} getTileCredits must not be called before the imagery provider is ready. */ MapboxImageryProvider.prototype.getTileCredits = function(x, y, level) { - return defaultCredit2; + var credits = defaultCredit2.slice(); + if (defined(this._accessTokenErrorCredit)) { + credits.push(this._accessTokenErrorCredit); + } + return credits; }; /** diff --git a/Source/Scene/Material.js b/Source/Scene/Material.js index 1d488b034809..c48952fa276f 100644 --- a/Source/Scene/Material.js +++ b/Source/Scene/Material.js @@ -11,7 +11,9 @@ define([ '../Core/destroyObject', '../Core/DeveloperError', '../Core/isArray', + '../Core/loadCRN', '../Core/loadImage', + '../Core/loadKTX', '../Core/Matrix2', '../Core/Matrix3', '../Core/Matrix4', @@ -42,7 +44,9 @@ define([ destroyObject, DeveloperError, isArray, + loadCRN, loadImage, + loadKTX, Matrix2, Matrix3, Matrix4, @@ -413,10 +417,23 @@ define([ uniformId = loadedImage.id; var image = loadedImage.image; - var texture = new Texture({ - context : context, - source : image - }); + var texture; + if (defined(image.internalFormat)) { + texture = new Texture({ + context : context, + pixelFormat : image.internalFormat, + width : image.width, + height : image.height, + source : { + arrayBufferView : image.bufferView + } + }); + } else { + texture = new Texture({ + context : context, + source : image + }); + } this._textures[uniformId] = texture; @@ -663,6 +680,9 @@ define([ 'mat4' : Matrix4 }; + var ktxRegex = /\.ktx$/i; + var crnRegex = /\.crn$/i; + function createTexture2DUpdateFunction(uniformId) { var oldUniformValue; return function(material, context) { @@ -741,7 +761,15 @@ define([ if (uniformValue !== material._texturePaths[uniformId]) { if (typeof uniformValue === 'string') { - when(loadImage(uniformValue), function(image) { + var promise; + if (ktxRegex.test(uniformValue)) { + promise = loadKTX(uniformValue); + } else if (crnRegex.test(uniformValue)) { + promise = loadCRN(uniformValue); + } else { + promise = loadImage(uniformValue); + } + when(promise, function(image) { material._loadedImages.push({ id : uniformId, image : image @@ -1353,7 +1381,7 @@ define([ }, translucent : function(material) { var uniforms = material.uniforms; - return (uniforms.fadeInColor.alpha < 1.0) || (uniforms.fadeOutColor.alpha < 0.0); + return (uniforms.fadeInColor.alpha < 1.0) || (uniforms.fadeOutColor.alpha < 1.0); } }); diff --git a/Source/Scene/Model.js b/Source/Scene/Model.js index 99f5dc1fdd77..0205d33c27a7 100644 --- a/Source/Scene/Model.js +++ b/Source/Scene/Model.js @@ -6,8 +6,8 @@ define([ '../Core/Cartesian4', '../Core/Cartographic', '../Core/clone', + '../Core/Color', '../Core/combine', - '../Core/ComponentDatatype', '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', @@ -22,13 +22,16 @@ define([ '../Core/IndexDatatype', '../Core/joinUrls', '../Core/loadArrayBuffer', + '../Core/loadCRN', '../Core/loadImage', '../Core/loadImageFromTypedArray', + '../Core/loadKTX', '../Core/loadText', '../Core/Math', '../Core/Matrix2', '../Core/Matrix3', '../Core/Matrix4', + '../Core/PixelFormat', '../Core/PrimitiveType', '../Core/Quaternion', '../Core/Queue', @@ -36,9 +39,11 @@ define([ '../Core/RequestScheduler', '../Core/RuntimeError', '../Core/Transforms', + '../Core/WebGLConstants', '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/Sampler', '../Renderer/ShaderProgram', @@ -47,10 +52,12 @@ define([ '../Renderer/TextureMinificationFilter', '../Renderer/TextureWrap', '../Renderer/VertexArray', - '../Renderer/WebGLConstants', '../ThirdParty/gltfDefaults', '../ThirdParty/Uri', '../ThirdParty/when', + './BlendingState', + './ColorBlendMode', + './getAttributeOrUniformBySemantic', './getBinaryAccessor', './HeightReference', './JobType', @@ -60,7 +67,6 @@ define([ './modelMaterialsCommon', './ModelMesh', './ModelNode', - './Pass', './SceneMode', './ShadowMode' ], function( @@ -70,8 +76,8 @@ define([ Cartesian4, Cartographic, clone, + Color, combine, - ComponentDatatype, defaultValue, defined, defineProperties, @@ -86,13 +92,16 @@ define([ IndexDatatype, joinUrls, loadArrayBuffer, + loadCRN, loadImage, loadImageFromTypedArray, + loadKTX, loadText, CesiumMath, Matrix2, Matrix3, Matrix4, + PixelFormat, PrimitiveType, Quaternion, Queue, @@ -100,9 +109,11 @@ define([ RequestScheduler, RuntimeError, Transforms, + WebGLConstants, Buffer, BufferUsage, DrawCommand, + Pass, RenderState, Sampler, ShaderProgram, @@ -111,10 +122,12 @@ define([ TextureMinificationFilter, TextureWrap, VertexArray, - WebGLConstants, gltfDefaults, Uri, when, + BlendingState, + ColorBlendMode, + getAttributeOrUniformBySemantic, getBinaryAccessor, HeightReference, JobType, @@ -124,7 +137,6 @@ define([ modelMaterialsCommon, ModelMesh, ModelNode, - Pass, SceneMode, ShadowMode) { 'use strict'; @@ -233,7 +245,9 @@ define([ // Note that this is a global cache, compared to renderer resources, which // are cached per context. function CachedGltf(options) { - this._gltf = modelMaterialsCommon(gltfDefaults(options.gltf)); + this._gltf = modelMaterialsCommon(gltfDefaults(options.gltf), { + addBatchIdToGeneratedShaders : options.addBatchIdToGeneratedShaders + }); this._bgltf = options.bgltf; this.ready = options.ready; this.modelsToLoad = []; @@ -332,7 +346,13 @@ define([ * @param {Boolean} [options.debugWireframe=false] For debugging only. Draws the model in wireframe. * @param {HeightReference} [options.heightReference] Determines how the model is drawn relative to terrain. * @param {Scene} [options.scene] Must be passed in for models that use the height reference property. - * @param {DistanceDisplayCondition} [options.istanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. + * @param {Boolean} [options.addBatchIdToGeneratedShaders=false] Determines if shaders generated for materials using the KHR_materials_common extension should include a batchId attribute. For models contained in b3dm tiles. + * @param {DistanceDisplayCondition} [options.distanceDisplayCondition] The condition specifying at what distance from the camera that this model will be displayed. + * @param {Color} [options.color=Color.WHITE] A color that blends with the model's rendered color. + * @param {ColorBlendMode} [options.colorBlendMode=ColorBlendMode.HIGHLIGHT] Defines how the color blends with the model. + * @param {Number} [options.colorBlendAmount=0.5] Value used to determine the color strength when the colorBlendMode is MIX. A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with any value in-between resulting in a mix of the two. + * @param {Color} [options.silhouetteColor=Color.RED] The silhouette color. If more than 256 models have silhouettes enabled, there is a small chance that overlapping models will have minor artifacts. + * @param {Number} [options.silhouetteSize=0.0] The size of the silhouette in pixels. * * @exception {DeveloperError} bgltf is not a valid Binary glTF file. * @exception {DeveloperError} Only glTF Binary version 1 is supported. @@ -376,13 +396,15 @@ define([ cachedGltf = new CachedGltf({ gltf : result.glTF, bgltf : gltf, - ready : true + ready : true, + addBatchIdToGeneratedShaders : options.addBatchIdToGeneratedShaders }); } else { // Normal glTF (JSON) cachedGltf = new CachedGltf({ gltf : options.gltf, - ready : true + ready : true, + addBatchIdToGeneratedShaders : options.addBatchIdToGeneratedShaders }); } @@ -408,6 +430,27 @@ define([ */ this.show = defaultValue(options.show, true); + /** + * The silhouette color. + * + * @type {Color} + * + * @default Color.RED + */ + this.silhouetteColor = defaultValue(options.silhouetteColor, Color.RED); + this._silhouetteColor = new Color(); + this._silhouetteColorPreviousAlpha = 1.0; + this._normalAttributeName = undefined; + + /** + * The size of the silhouette in pixels. + * + * @type {Number} + * + * @default 0.0 + */ + this.silhouetteSize = defaultValue(options.silhouetteSize, 0.0); + /** * The 4x4 transformation matrix that transforms the model from model to world coordinates. * When this is the identity matrix, the model is drawn in world coordinates, i.e., Earth's WGS84 coordinates. @@ -526,6 +569,37 @@ define([ this.shadows = defaultValue(options.shadows, ShadowMode.ENABLED); this._shadows = this.shadows; + /** + * A color that blends with the model's rendered color. + * + * @type {Color} + * + * @default Color.WHITE + */ + this.color = defaultValue(options.color, Color.WHITE); + this._color = new Color(); + this._colorPreviousAlpha = 1.0; + + /** + * Defines how the color blends with the model. + * + * @type {ColorBlendMode} + * + * @default ColorBlendMode.HIGHLIGHT + */ + this.colorBlendMode = defaultValue(options.colorBlendMode, ColorBlendMode.HIGHLIGHT); + + /** + * Value used to determine the color strength when the colorBlendMode is MIX. + * A value of 0.0 results in the model's rendered color while a value of 1.0 results in a solid color, with + * any value in-between resulting in a mix of the two. + * + * @type {Number} + * + * @default 0.5 + */ + this.colorBlendAmount = defaultValue(options.colorBlendAmount, 0.5); + /** * This property is for debugging only; it is not for production use nor is it optimized. *

@@ -606,6 +680,7 @@ define([ vertexArrays : {}, programs : {}, pickPrograms : {}, + silhouettePrograms: {}, textures : {}, samplers : {}, renderStates : {} @@ -899,6 +974,20 @@ define([ var sizeOfUint32 = Uint32Array.BYTES_PER_ELEMENT; + function silhouetteSupported(context) { + return context.stencilBuffer; + } + + /** + * Determines if silhouettes are supported. + * + * @param {Scene} scene The scene. + * @returns {Boolean} true if silhouettes are supported; otherwise, returns false + */ + Model.silhouetteSupported = function(scene) { + return silhouetteSupported(scene.context); + }; + /** * This function differs from the normal subarray function * because it takes offset and length, rather than begin and end. @@ -1356,11 +1445,17 @@ define([ loadResources.texturesToCreate.enqueue({ id : id, image : image, - bufferView : undefined + bufferView : image.bufferView, + width : image.width, + height : image.height, + internalFormat : image.internalFormat }); }; } + var ktxRegex = /(^data:image\/ktx)|(\.ktx$)/i; + var crnRegex = /(^data:image\/crn)|(\.crn$)/i; + function parseTextures(model) { var images = model.gltf.images; var textures = model.gltf.textures; @@ -1380,7 +1475,14 @@ define([ } else { ++model._loadResources.pendingTextureLoads; var imagePath = joinUrls(model._baseUri, gltfImage.uri); - loadImage(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + + if (ktxRegex.test(imagePath)) { + loadKTX(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } else if (crnRegex.test(imagePath)) { + loadCRN(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } else { + loadImage(imagePath).then(imageLoad(model, id)).otherwise(getFailedLoadFunction(model, 'image', imagePath)); + } } } } @@ -1760,7 +1862,7 @@ define([ if (getProgramForPrimitive(model, primitive) === programName) { for (var attributeSemantic in primitive.attributes) { if (primitive.attributes.hasOwnProperty(attributeSemantic)) { - var decodeUniformVarName = 'czm_u_dec_' + attributeSemantic.toLowerCase(); + var decodeUniformVarName = 'gltf_u_dec_' + attributeSemantic.toLowerCase(); var decodeUniformVarNameScale = decodeUniformVarName + '_scale'; var decodeUniformVarNameTranslate = decodeUniformVarName + '_translate'; if (!defined(quantizedUniforms[decodeUniformVarName]) && !defined(quantizedUniforms[decodeUniformVarNameScale])) { @@ -1769,8 +1871,8 @@ define([ if (defined(quantizedAttributes)) { var attributeVarName = getAttributeVariableName(model, primitive, attributeSemantic); var decodeMatrix = quantizedAttributes.decodeMatrix; - var newMain = 'czm_decoded_' + attributeSemantic; - var decodedAttributeVarName = attributeVarName.replace('a_', 'czm_a_dec_'); + var newMain = 'gltf_decoded_' + attributeSemantic; + var decodedAttributeVarName = attributeVarName.replace('a_', 'gltf_a_dec_'); var size = Math.floor(Math.sqrt(decodeMatrix.length)); // replace usages of the original attribute with the decoded version, but not the declaration @@ -1822,6 +1924,44 @@ define([ return shader; } + function hasPremultipliedAlpha(model) { + var gltf = model.gltf; + return defined(gltf.asset) ? defaultValue(gltf.asset.premultipliedAlpha, false) : false; + } + + function modifyShaderForColor(shader, premultipliedAlpha) { + shader = ShaderSource.replaceMain(shader, 'gltf_blend_main'); + shader += + 'uniform vec4 gltf_color; \n' + + 'uniform float gltf_colorBlend; \n' + + 'void main() \n' + + '{ \n' + + ' gltf_blend_main(); \n'; + + // Un-premultiply the alpha so that blending is correct. + + // Avoid divide-by-zero. The code below is equivalent to: + // if (gl_FragColor.a > 0.0) + // { + // gl_FragColor.rgb /= gl_FragColor.a; + // } + + if (premultipliedAlpha) { + shader += + ' float alpha = 1.0 - ceil(gl_FragColor.a) + gl_FragColor.a; \n' + + ' gl_FragColor.rgb /= alpha; \n'; + } + + shader += + ' gl_FragColor.rgb = mix(gl_FragColor.rgb, gltf_color.rgb, gltf_colorBlend); \n' + + ' float highlight = ceil(gltf_colorBlend); \n' + + ' gl_FragColor.rgb *= mix(gltf_color.rgb, vec3(1.0), highlight); \n' + + ' gl_FragColor.a *= gltf_color.a; \n' + + '} \n'; + + return shader; + } + function modifyShader(shader, programName, callback) { if (defined(callback)) { shader = callback(shader, programName); @@ -1871,8 +2011,11 @@ define([ vs = modifyShaderForQuantizedAttributes(vs, id, model, context); } + var premultipliedAlpha = hasPremultipliedAlpha(model); + var blendFS = modifyShaderForColor(fs, premultipliedAlpha); + var drawVS = modifyShader(vs, id, model._vertexShaderLoaded); - var drawFS = modifyShader(fs, id, model._fragmentShaderLoaded); + var drawFS = modifyShader(blendFS, id, model._fragmentShaderLoaded); model._rendererResources.programs[id] = ShaderProgram.fromCache({ context : context, @@ -1958,12 +2101,20 @@ define([ var gltf = model.gltf; var bufferView = gltf.bufferViews[gltfTexture.bufferView]; - var onload = getOnImageCreatedFromTypedArray(loadResources, gltfTexture); var onerror = getFailedLoadFunction(model, 'image', 'id: ' + gltfTexture.id + ', bufferView: ' + gltfTexture.bufferView); - loadImageFromTypedArray(loadResources.getBuffer(bufferView), gltfTexture.mimeType). - then(onload).otherwise(onerror); - ++loadResources.pendingBufferViewToImage; + if (gltfTexture.mimeType === 'image/ktx') { + loadKTX(loadResources.getBuffer(bufferView)).then(imageLoad(model, gltfTexture.id)).otherwise(onerror); + ++model._loadResources.pendingTextureLoads; + } else if (gltfTexture.mimeType === 'image/crn') { + loadCRN(loadResources.getBuffer(bufferView)).then(imageLoad(model, gltfTexture.id)).otherwise(onerror); + ++model._loadResources.pendingTextureLoads; + } else { + var onload = getOnImageCreatedFromTypedArray(loadResources, gltfTexture); + loadImageFromTypedArray(loadResources.getBuffer(bufferView), gltfTexture.mimeType) + .then(onload).otherwise(onerror); + ++loadResources.pendingBufferViewToImage; + } } } @@ -2017,46 +2168,62 @@ define([ var rendererSamplers = model._rendererResources.samplers; var sampler = rendererSamplers[texture.sampler]; + var internalFormat = gltfTexture.internalFormat; + var mipmap = - (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_NEAREST) || - (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_LINEAR) || - (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_NEAREST) || - (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR); + (!(defined(internalFormat) && PixelFormat.isCompressedFormat(internalFormat))) && + ((sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_NEAREST) || + (sampler.minificationFilter === TextureMinificationFilter.NEAREST_MIPMAP_LINEAR) || + (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_NEAREST) || + (sampler.minificationFilter === TextureMinificationFilter.LINEAR_MIPMAP_LINEAR)); var requiresNpot = mipmap || (sampler.wrapS === TextureWrap.REPEAT) || (sampler.wrapS === TextureWrap.MIRRORED_REPEAT) || (sampler.wrapT === TextureWrap.REPEAT) || (sampler.wrapT === TextureWrap.MIRRORED_REPEAT); - var source = gltfTexture.image; - var npot = !CesiumMath.isPowerOfTwo(source.width) || !CesiumMath.isPowerOfTwo(source.height); - - if (requiresNpot && npot) { - // WebGL requires power-of-two texture dimensions for mipmapping and REPEAT/MIRRORED_REPEAT wrap modes. - var canvas = document.createElement('canvas'); - canvas.width = CesiumMath.nextPowerOfTwo(source.width); - canvas.height = CesiumMath.nextPowerOfTwo(source.height); - var canvasContext = canvas.getContext('2d'); - canvasContext.drawImage(source, 0, 0, source.width, source.height, 0, 0, canvas.width, canvas.height); - source = canvas; - } - var tx; + var source = gltfTexture.image; - if (texture.target === WebGLConstants.TEXTURE_2D) { + if (defined(internalFormat) && texture.target === WebGLConstants.TEXTURE_2D) { tx = new Texture({ context : context, - source : source, - pixelFormat : texture.internalFormat, - pixelDatatype : texture.type, - sampler : sampler, - flipY : false + source : { + arrayBufferView : gltfTexture.bufferView + }, + width : gltfTexture.width, + height : gltfTexture.height, + pixelFormat : internalFormat, + sampler : sampler }); - } - // GLTF_SPEC: Support TEXTURE_CUBE_MAP. https://github.com/KhronosGroup/glTF/issues/40 + } else if (defined(source)) { + var npot = !CesiumMath.isPowerOfTwo(source.width) || !CesiumMath.isPowerOfTwo(source.height); + + if (requiresNpot && npot) { + // WebGL requires power-of-two texture dimensions for mipmapping and REPEAT/MIRRORED_REPEAT wrap modes. + var canvas = document.createElement('canvas'); + canvas.width = CesiumMath.nextPowerOfTwo(source.width); + canvas.height = CesiumMath.nextPowerOfTwo(source.height); + var canvasContext = canvas.getContext('2d'); + canvasContext.drawImage(source, 0, 0, source.width, source.height, 0, 0, canvas.width, canvas.height); + source = canvas; + } + + if (texture.target === WebGLConstants.TEXTURE_2D) { + tx = new Texture({ + context : context, + source : source, + pixelFormat : texture.internalFormat, + pixelDatatype : texture.type, + sampler : sampler, + flipY : false + }); + } + // GLTF_SPEC: Support TEXTURE_CUBE_MAP. https://github.com/KhronosGroup/glTF/issues/40 - if (mipmap) { - tx.generateMipmap(); + if (mipmap) { + tx.generateMipmap(); + } } model._rendererResources.textures[gltfTexture.id] = tx; @@ -2438,6 +2605,16 @@ define([ var polygonOffset = defaultValue(statesFunctions.polygonOffset, [0.0, 0.0]); var scissor = defaultValue(statesFunctions.scissor, [0.0, 0.0, 0.0, 0.0]); + // Change the render state to use traditional alpha blending instead of premultiplied alpha blending + if (booleanStates[WebGLConstants.BLEND] && hasPremultipliedAlpha(model)) { + if ((blendFuncSeparate[0] === WebGLConstants.ONE) && (blendFuncSeparate[1] === WebGLConstants.ONE_MINUS_SRC_ALPHA)) { + blendFuncSeparate[0] = WebGLConstants.SRC_ALPHA; + blendFuncSeparate[1] = WebGLConstants.ONE_MINUS_SRC_ALPHA; + blendFuncSeparate[2] = WebGLConstants.SRC_ALPHA; + blendFuncSeparate[3] = WebGLConstants.ONE_MINUS_SRC_ALPHA; + } + } + rendererRenderStates[id] = RenderState.fromCache({ frontFace : defined(statesFunctions.frontFace) ? statesFunctions.frontFace[0] : WebGLConstants.CCW, cull : { @@ -2928,7 +3105,7 @@ define([ var quantizedAttributes = extensions.WEB3D_quantized_attributes; if (defined(quantizedAttributes)) { var decodeMatrix = quantizedAttributes.decodeMatrix; - var uniformVariable = 'czm_u_dec_' + attribute.toLowerCase(); + var uniformVariable = 'gltf_u_dec_' + attribute.toLowerCase(); switch (a.type) { case 'SCALAR': @@ -2995,6 +3172,30 @@ define([ }; } + function createSilhouetteColorFunction(model) { + return function() { + return model.silhouetteColor; + }; + } + + function createSilhouetteSizeFunction(model) { + return function() { + return model.silhouetteSize; + }; + } + + function createColorFunction(model) { + return function() { + return model.color; + }; + } + + function createColorBlendFunction(model) { + return function() { + return ColorBlendMode.getColorBlend(model.colorBlendMode, model.colorBlendAmount); + }; + } + function createCommand(model, gltfNode, runtimeNode, context, scene3DOnly) { var nodeCommands = model._nodeCommands; var pickIds = model._pickIds; @@ -3063,6 +3264,11 @@ define([ uniformMap = combine(uniformMap, jointUniformMap); } + uniformMap = combine(uniformMap, { + gltf_color : createColorFunction(model), + gltf_colorBlend : createColorBlendFunction(model) + }); + // Allow callback to modify the uniformMap if (defined(model._uniformMapLoaded)) { uniformMap = model._uniformMapLoaded(uniformMap, programId, runtimeNode); @@ -3087,7 +3293,7 @@ define([ var castShadows = ShadowMode.castShadows(model._shadows); var receiveShadows = ShadowMode.receiveShadows(model._shadows); - + var command = new DrawCommand({ boundingVolume : new BoundingSphere(), // updated in update() cull : model.cull, @@ -3149,13 +3355,13 @@ define([ var pickCommand2D; if (!scene3DOnly) { command2D = DrawCommand.shallowClone(command); - command2D.boundingVolume = new BoundingSphere(); - command2D.modelMatrix = new Matrix4(); + command2D.boundingVolume = new BoundingSphere(); // updated in update() + command2D.modelMatrix = new Matrix4(); // updated in update() if (allowPicking) { pickCommand2D = DrawCommand.shallowClone(pickCommand); - pickCommand2D.boundingVolume = new BoundingSphere(); - pickCommand2D.modelMatrix = new Matrix4(); + pickCommand2D.boundingVolume = new BoundingSphere(); // updated in update() + pickCommand2D.modelMatrix = new Matrix4(); // updated in update() } } @@ -3165,7 +3371,15 @@ define([ command : command, pickCommand : pickCommand, command2D : command2D, - pickCommand2D : pickCommand2D + pickCommand2D : pickCommand2D, + // Generated on demand when silhouette size is greater than 0.0 and silhouette alpha is greater than 0.0 + silhouetteModelCommand : undefined, + silhouetteModelCommand2D : undefined, + silhouetteColorCommand : undefined, + silhouetteColorCommand2D : undefined, + // Generated on demand when color alpha is less than 1.0 + translucentCommand : undefined, + translucentCommand2D : undefined }; runtimeNode.commands.push(nodeCommand); nodeCommands.push(nodeCommand); @@ -3262,6 +3476,7 @@ define([ resources.vertexArrays = cachedResources.vertexArrays; resources.programs = cachedResources.programs; resources.pickPrograms = cachedResources.pickPrograms; + resources.silhouettePrograms = cachedResources.silhouettePrograms; resources.textures = cachedResources.textures; resources.samplers = cachedResources.samplers; resources.renderStates = cachedResources.renderStates; @@ -3542,6 +3757,265 @@ define([ } } + function getTranslucentRenderState(renderState) { + var rs = clone(renderState, true); + rs.cull.enabled = false; + rs.depthTest.enabled = true; + rs.depthMask = false; + rs.blending = BlendingState.ALPHA_BLEND; + + return RenderState.fromCache(rs); + } + + function deriveTranslucentCommand(command) { + var translucentCommand = DrawCommand.shallowClone(command); + translucentCommand.pass = Pass.TRANSLUCENT; + translucentCommand.renderState = getTranslucentRenderState(command.renderState); + return translucentCommand; + } + + function updateColor(model, frameState) { + // Generate translucent commands when the blend color has an alpha in the range (0.0, 1.0) exclusive + var scene3DOnly = frameState.scene3DOnly; + var alpha = model.color.alpha; + if ((alpha > 0.0) && (alpha < 1.0)) { + var nodeCommands = model._nodeCommands; + var length = nodeCommands.length; + if (!defined(nodeCommands[0].translucentCommand)) { + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + nodeCommand.translucentCommand = deriveTranslucentCommand(command); + if (!scene3DOnly) { + var command2D = nodeCommand.command2D; + nodeCommand.translucentCommand2D = deriveTranslucentCommand(command2D); + } + } + } + } + } + + function getProgramId(model, program) { + var programs = model._rendererResources.programs; + for (var id in programs) { + if (programs.hasOwnProperty(id)) { + if (programs[id] === program) { + return id; + } + } + } + } + + function createSilhouetteProgram(model, program, frameState) { + var vs = program.vertexShaderSource.sources[0]; + var attributeLocations = program._attributeLocations; + var normalAttributeName = model._normalAttributeName; + + // Modified from http://forum.unity3d.com/threads/toon-outline-but-with-diffuse-surface.24668/ + vs = ShaderSource.replaceMain(vs, 'gltf_silhouette_main'); + vs += + 'uniform float gltf_silhouetteSize; \n' + + 'void main() \n' + + '{ \n' + + ' gltf_silhouette_main(); \n' + + ' vec3 n = normalize(czm_normal3D * ' + normalAttributeName + '); \n' + + ' n.x *= czm_projection[0][0]; \n' + + ' n.y *= czm_projection[1][1]; \n' + + ' vec4 clip = gl_Position; \n' + + ' clip.xy += n.xy * clip.w * gltf_silhouetteSize / czm_viewport.z; \n' + + ' gl_Position = clip; \n' + + '}'; + + var fs = + 'uniform vec4 gltf_silhouetteColor; \n' + + 'void main() \n' + + '{ \n' + + ' gl_FragColor = gltf_silhouetteColor; \n' + + '}'; + + return ShaderProgram.fromCache({ + context : frameState.context, + vertexShaderSource : vs, + fragmentShaderSource : fs, + attributeLocations : attributeLocations + }); + } + + function hasSilhouette(model, frameState) { + return silhouetteSupported(frameState.context) && (model.silhouetteSize > 0.0) && (model.silhouetteColor.alpha > 0.0) && defined(model._normalAttributeName); + } + + function hasTranslucentCommands(model) { + var nodeCommands = model._nodeCommands; + var length = nodeCommands.length; + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + if (command.pass === Pass.TRANSLUCENT) { + return true; + } + } + return false; + } + + function isTranslucent(model) { + return (model.color.alpha > 0.0) && (model.color.alpha < 1.0); + } + + function isInvisible(model) { + return (model.color.alpha === 0.0); + } + + function alphaDirty(currAlpha, prevAlpha) { + // Returns whether the alpha state has changed between invisible, translucent, or opaque + return (Math.floor(currAlpha) !== Math.floor(prevAlpha)) || (Math.ceil(currAlpha) !== Math.ceil(prevAlpha)); + } + + var silhouettesLength = 0; + + function createSilhouetteCommands(model, frameState) { + // Wrap around after exceeding the 8-bit stencil limit. + // The reference is unique to each model until this point. + var stencilReference = (++silhouettesLength) % 255; + + // If the model is translucent the silhouette needs to be in the translucent pass. + // Otherwise the silhouette would be rendered before the model. + var silhouetteTranslucent = hasTranslucentCommands(model) || isTranslucent(model) || (model.silhouetteColor.alpha < 1.0); + var silhouettePrograms = model._rendererResources.silhouettePrograms; + var scene3DOnly = frameState.scene3DOnly; + var nodeCommands = model._nodeCommands; + var length = nodeCommands.length; + for (var i = 0; i < length; ++i) { + var nodeCommand = nodeCommands[i]; + var command = nodeCommand.command; + + // Create model command + var modelCommand = isTranslucent(model) ? nodeCommand.translucentCommand : command; + var silhouetteModelCommand = DrawCommand.shallowClone(modelCommand); + var renderState = clone(modelCommand.renderState); + + // Write the reference value into the stencil buffer. + renderState.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.ALWAYS, + backFunction : WebGLConstants.ALWAYS, + reference : stencilReference, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.REPLACE + } + }; + + if (isInvisible(model)) { + // When the model is invisible disable color and depth writes but still write into the stencil buffer + renderState.colorMask = { + red : false, + green : false, + blue : false, + alpha : false + }; + renderState.depthMask = false; + } + renderState = RenderState.fromCache(renderState); + silhouetteModelCommand.renderState = renderState; + nodeCommand.silhouetteModelCommand = silhouetteModelCommand; + + // Create color command + var silhouetteColorCommand = DrawCommand.shallowClone(command); + renderState = clone(command.renderState, true); + renderState.depthTest.enabled = true; + renderState.cull.enabled = false; + if (silhouetteTranslucent) { + silhouetteColorCommand.pass = Pass.TRANSLUCENT; + renderState.depthMask = false; + renderState.blending = BlendingState.ALPHA_BLEND; + } + + // Only render silhouette if the value in the stencil buffer equals the reference + renderState.stencilTest = { + enabled : true, + frontFunction : WebGLConstants.NOTEQUAL, + backFunction : WebGLConstants.NOTEQUAL, + reference : stencilReference, + mask : ~0, + frontOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.KEEP + }, + backOperation : { + fail : WebGLConstants.KEEP, + zFail : WebGLConstants.KEEP, + zPass : WebGLConstants.KEEP + } + }; + renderState = RenderState.fromCache(renderState); + + // If the silhouette program has already been cached use it + var program = command.shaderProgram; + var id = getProgramId(model, program); + var silhouetteProgram = silhouettePrograms[id]; + if (!defined(silhouetteProgram)) { + silhouetteProgram = createSilhouetteProgram(model, program, frameState); + silhouettePrograms[id] = silhouetteProgram; + } + + var silhouetteUniformMap = combine(command.uniformMap, { + gltf_silhouetteColor : createSilhouetteColorFunction(model), + gltf_silhouetteSize : createSilhouetteSizeFunction(model) + }); + + silhouetteColorCommand.renderState = renderState; + silhouetteColorCommand.shaderProgram = silhouetteProgram; + silhouetteColorCommand.uniformMap = silhouetteUniformMap; + silhouetteColorCommand.castShadows = false; + silhouetteColorCommand.receiveShadows = false; + nodeCommand.silhouetteColorCommand = silhouetteColorCommand; + + if (!scene3DOnly) { + var command2D = nodeCommand.command2D; + var silhouetteModelCommand2D = DrawCommand.shallowClone(silhouetteModelCommand); + silhouetteModelCommand2D.boundingVolume = command2D.boundingVolume; + silhouetteModelCommand2D.modelMatrix = command2D.modelMatrix; + nodeCommand.silhouetteModelCommand2D = silhouetteModelCommand2D; + + var silhouetteColorCommand2D = DrawCommand.shallowClone(silhouetteColorCommand); + silhouetteModelCommand2D.boundingVolume = command2D.boundingVolume; + silhouetteModelCommand2D.modelMatrix = command2D.modelMatrix; + nodeCommand.silhouetteColorCommand2D = silhouetteColorCommand2D; + } + } + } + + function updateSilhouette(model, frameState) { + // Generate silhouette commands when the silhouette size is greater than 0.0 and the alpha is greater than 0.0 + // There are two silhouette commands: + // 1. silhouetteModelCommand : render model normally while enabling stencil mask + // 2. silhouetteColorCommand : render enlarged model with a solid color while enabling stencil tests + if (!hasSilhouette(model, frameState)) { + return; + } + + var nodeCommands = model._nodeCommands; + var dirty = alphaDirty(model.color.alpha, model._colorPreviousAlpha) || + alphaDirty(model.silhouetteColor.alpha, model._silhouetteColorPreviousAlpha) || + !defined(nodeCommands[0].silhouetteModelCommand); + + model._colorPreviousAlpha = model.color.alpha; + model._silhouetteColorPreviousAlpha = model.silhouetteColor.alpha; + + if (dirty) { + createSilhouetteCommands(model, frameState); + } + } + var scratchBoundingSphere = new BoundingSphere(); function scaleInPixels(positionWC, radius, frameState) { @@ -3621,6 +4095,7 @@ define([ this.vertexArrays = undefined; this.programs = undefined; this.pickPrograms = undefined; + this.silhouettePrograms = undefined; this.textures = undefined; this.samplers = undefined; this.renderStates = undefined; @@ -3644,6 +4119,7 @@ define([ destroy(resources.vertexArrays); destroy(resources.programs); destroy(resources.pickPrograms); + destroy(resources.silhouettePrograms); destroy(resources.textures); } @@ -3860,11 +4336,15 @@ define([ cachedResources.vertexArrays = resources.vertexArrays; cachedResources.programs = resources.programs; cachedResources.pickPrograms = resources.pickPrograms; + cachedResources.silhouettePrograms = resources.silhouettePrograms; cachedResources.textures = resources.textures; cachedResources.samplers = resources.samplers; cachedResources.renderStates = resources.renderStates; cachedResources.ready = true; + // The normal attribute name is required for silhouettes, so get it before the gltf JSON is released + this._normalAttributeName = getAttributeOrUniformBySemantic(this.gltf, 'NORMAL'); + // Vertex arrays are unique to this model, do not store in cache. if (defined(this._precreatedAttributes)) { cachedResources.vertexArrays = {}; @@ -3876,8 +4356,11 @@ define([ } } + var silhouette = hasSilhouette(this, frameState); + var translucent = isTranslucent(this); + var invisible = isInvisible(this); var displayConditionPassed = defined(this.distanceDisplayCondition) ? distanceDisplayConditionVisible(this, frameState) : true; - var show = this.show && displayConditionPassed && (this.scale !== 0.0); + var show = this.show && displayConditionPassed && (this.scale !== 0.0) && (!invisible || silhouette); if ((show && this._state === ModelState.LOADED) || justLoaded) { var animated = this.activeAnimations.update(frameState) || this._cesiumAnimationsDirty; @@ -3936,6 +4419,8 @@ define([ updateWireframe(this); updateShowBoundingVolume(this); updateShadows(this); + updateColor(this, frameState); + updateSilhouette(this, frameState); } if (justLoaded) { @@ -3966,13 +4451,30 @@ define([ for (i = 0; i < length; ++i) { nc = nodeCommands[i]; if (nc.show) { - var command = nc.command; + var command = translucent ? nc.translucentCommand : nc.command; + command = silhouette ? nc.silhouetteModelCommand : command; frameState.addCommand(command); - - boundingVolume = command.boundingVolume; + boundingVolume = nc.command.boundingVolume; if (frameState.mode === SceneMode.SCENE2D && (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { - frameState.addCommand(nc.command2D); + var command2D = translucent ? nc.translucentCommand2D : nc.command2D; + command2D = silhouette ? nc.silhouetteModelCommand2D : command2D; + frameState.addCommand(command2D); + } + } + } + + if (silhouette) { + // Render second silhouette pass + for (i = 0; i < length; ++i) { + nc = nodeCommands[i]; + if (nc.show) { + frameState.addCommand(nc.silhouetteColorCommand); + boundingVolume = nc.command.boundingVolume; + if (frameState.mode === SceneMode.SCENE2D && + (boundingVolume.center.y + boundingVolume.radius > idl2D || boundingVolume.center.y - boundingVolume.radius < idl2D)) { + frameState.addCommand(nc.silhouetteColorCommand2D); + } } } } diff --git a/Source/Scene/ModelAnimationCache.js b/Source/Scene/ModelAnimationCache.js index d19ce82e4a52..d3848c381b67 100644 --- a/Source/Scene/ModelAnimationCache.js +++ b/Source/Scene/ModelAnimationCache.js @@ -7,7 +7,7 @@ define([ '../Core/Matrix4', '../Core/Quaternion', '../Core/QuaternionSpline', - '../Renderer/WebGLConstants', + '../Core/WebGLConstants', './getBinaryAccessor' ], function( Cartesian3, diff --git a/Source/Scene/ModelInstanceCollection.js b/Source/Scene/ModelInstanceCollection.js index d837acd854f3..7e0530e65e31 100644 --- a/Source/Scene/ModelInstanceCollection.js +++ b/Source/Scene/ModelInstanceCollection.js @@ -195,8 +195,9 @@ define([ var instancedUniformsByProgram = {}; collection._instancedUniformsByProgram = instancedUniformsByProgram; - var modelSemantics = ['MODEL', 'MODELVIEW', 'MODELVIEWPROJECTION', 'MODELINVERSE', 'MODELVIEWINVERSE', 'MODELVIEWPROJECTIONINVERSE', 'MODELINVERSETRANSPOSE', 'MODELVIEWINVERSETRANSPOSE']; - var supportedSemantics = ['MODELVIEW', 'MODELVIEWPROJECTION', 'MODELVIEWINVERSETRANSPOSE']; + // When using CESIUM_RTC_MODELVIEW the CESIUM_RTC center is ignored. Instances are always rendered relative-to-center. + var modelSemantics = ['MODEL', 'MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELINVERSE', 'MODELVIEWINVERSE', 'MODELVIEWPROJECTIONINVERSE', 'MODELINVERSETRANSPOSE', 'MODELVIEWINVERSETRANSPOSE']; + var supportedSemantics = ['MODELVIEW', 'CESIUM_RTC_MODELVIEW', 'MODELVIEWPROJECTION', 'MODELVIEWINVERSETRANSPOSE']; var gltf = collection._model.gltf; var techniques = gltf.techniques; @@ -253,7 +254,7 @@ define([ if (instancedUniforms.hasOwnProperty(uniform)) { var semantic = instancedUniforms[uniform]; var varName; - if (semantic === 'MODELVIEW') { + if (semantic === 'MODELVIEW' || semantic === 'CESIUM_RTC_MODELVIEW') { varName = 'czm_instanced_modelView'; } else if (semantic === 'MODELVIEWPROJECTION') { varName = 'czm_instanced_modelViewProjection'; diff --git a/Source/Scene/ModelNode.js b/Source/Scene/ModelNode.js index bf377a3b26c5..0f2503564c80 100644 --- a/Source/Scene/ModelNode.js +++ b/Source/Scene/ModelNode.js @@ -1,10 +1,8 @@ /*global define*/ define([ - '../Core/defaultValue', '../Core/defineProperties', '../Core/Matrix4' ], function( - defaultValue, defineProperties, Matrix4) { 'use strict'; diff --git a/Source/Scene/OIT.js b/Source/Scene/OIT.js index c2f39b15fcbe..eba923512306 100644 --- a/Source/Scene/OIT.js +++ b/Source/Scene/OIT.js @@ -5,6 +5,7 @@ define([ '../Core/defined', '../Core/destroyObject', '../Core/PixelFormat', + '../Core/WebGLConstants', '../Renderer/ClearCommand', '../Renderer/DrawCommand', '../Renderer/Framebuffer', @@ -13,7 +14,6 @@ define([ '../Renderer/ShaderProgram', '../Renderer/ShaderSource', '../Renderer/Texture', - '../Renderer/WebGLConstants', '../Shaders/AdjustTranslucentFS', '../Shaders/CompositeOITFS', './BlendEquation', @@ -24,6 +24,7 @@ define([ defined, destroyObject, PixelFormat, + WebGLConstants, ClearCommand, DrawCommand, Framebuffer, @@ -32,7 +33,6 @@ define([ ShaderProgram, ShaderSource, Texture, - WebGLConstants, AdjustTranslucentFS, CompositeOITFS, BlendEquation, @@ -113,19 +113,29 @@ define([ function updateTextures(oit, context, width, height) { destroyTextures(oit); + // Use zeroed arraybuffer instead of null to initialize texture + // to workaround Firefox 50. https://github.com/AnalyticalGraphicsInc/cesium/pull/4762 + var source = new Float32Array(width * height * 4); + oit._accumulationTexture = new Texture({ context : context, - width : width, - height : height, pixelFormat : PixelFormat.RGBA, - pixelDatatype : PixelDatatype.FLOAT + pixelDatatype : PixelDatatype.FLOAT, + source : { + arrayBufferView : source, + width : width, + height : height + } }); oit._revealageTexture = new Texture({ context : context, - width : width, - height : height, pixelFormat : PixelFormat.RGBA, - pixelDatatype : PixelDatatype.FLOAT + pixelDatatype : PixelDatatype.FLOAT, + source : { + arrayBufferView : source, + width : width, + height : height + } }); } diff --git a/Source/Scene/OrthographicFrustum.js b/Source/Scene/OrthographicFrustum.js index 4bf7cc0264dc..9c709b191809 100644 --- a/Source/Scene/OrthographicFrustum.js +++ b/Source/Scene/OrthographicFrustum.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartesian4', '../Core/defined', @@ -9,7 +8,6 @@ define([ '../Core/Matrix4', './CullingVolume' ], function( - Cartesian2, Cartesian3, Cartesian4, defined, diff --git a/Source/Scene/PerformanceDisplay.js b/Source/Scene/PerformanceDisplay.js index c27a6c4e48c6..d624d002b561 100644 --- a/Source/Scene/PerformanceDisplay.js +++ b/Source/Scene/PerformanceDisplay.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../Core/Color', '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', @@ -8,7 +7,6 @@ define([ '../Core/getTimestamp', '../Widgets/getElement' ], function( - Color, defaultValue, defined, destroyObject, diff --git a/Source/Scene/PerspectiveOffCenterFrustum.js b/Source/Scene/PerspectiveOffCenterFrustum.js index 32b2001c8555..fdb5322fe548 100644 --- a/Source/Scene/PerspectiveOffCenterFrustum.js +++ b/Source/Scene/PerspectiveOffCenterFrustum.js @@ -1,19 +1,15 @@ /*global define*/ define([ - '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartesian4', - '../Core/defaultValue', '../Core/defined', '../Core/defineProperties', '../Core/DeveloperError', '../Core/Matrix4', './CullingVolume' ], function( - Cartesian2, Cartesian3, Cartesian4, - defaultValue, defined, defineProperties, DeveloperError, diff --git a/Source/Scene/PickDepth.js b/Source/Scene/PickDepth.js index 38598d1d0fba..5e1f85e3e510 100644 --- a/Source/Scene/PickDepth.js +++ b/Source/Scene/PickDepth.js @@ -1,24 +1,20 @@ /*global define*/ define([ '../Core/defined', - '../Core/defineProperties', '../Core/destroyObject', '../Core/PixelFormat', '../Renderer/Framebuffer', '../Renderer/PixelDatatype', '../Renderer/RenderState', - '../Renderer/Texture', - '../Shaders/PostProcessFilters/PassThrough' + '../Renderer/Texture' ], function( defined, - defineProperties, destroyObject, PixelFormat, Framebuffer, PixelDatatype, RenderState, - Texture, - PassThrough) { + Texture) { 'use strict'; /** diff --git a/Source/Scene/PointAppearance.js b/Source/Scene/PointAppearance.js index a8e88aac6e2d..ee481d512c1c 100644 --- a/Source/Scene/PointAppearance.js +++ b/Source/Scene/PointAppearance.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../Core/clone', '../Core/Color', '../Core/combine', '../Core/defaultValue', @@ -11,7 +10,6 @@ define([ '../Shaders/Appearances/PointAppearanceVS', './Appearance' ], function( - clone, Color, combine, defaultValue, diff --git a/Source/Scene/PointCloud3DTileContent.js b/Source/Scene/PointCloud3DTileContent.js index 7bd080766cda..e00cea225aec 100644 --- a/Source/Scene/PointCloud3DTileContent.js +++ b/Source/Scene/PointCloud3DTileContent.js @@ -6,8 +6,8 @@ define([ '../Core/ComponentDatatype', '../Core/defaultValue', '../Core/defined', - '../Core/destroyObject', '../Core/defineProperties', + '../Core/destroyObject', '../Core/DeveloperError', '../Core/getMagic', '../Core/getStringFromTypedArray', @@ -19,22 +19,22 @@ define([ '../Core/Request', '../Core/RequestScheduler', '../Core/RequestType', + '../Core/WebGLConstants', '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', - '../Renderer/ShaderSource', '../Renderer/ShaderProgram', + '../Renderer/ShaderSource', '../Renderer/VertexArray', - '../Renderer/WebGLConstants', '../ThirdParty/when', './BlendingState', './Cesium3DTileBatchTable', './Cesium3DTileColorBlendMode', './Cesium3DTileContentState', './Cesium3DTileFeature', - './Cesium3DTileFeatureTable', - './Pass' + './Cesium3DTileFeatureTable' ], function( Cartesian3, Color, @@ -42,8 +42,8 @@ define([ ComponentDatatype, defaultValue, defined, - destroyObject, defineProperties, + destroyObject, DeveloperError, getMagic, getStringFromTypedArray, @@ -55,22 +55,22 @@ define([ Request, RequestScheduler, RequestType, + WebGLConstants, Buffer, BufferUsage, DrawCommand, + Pass, RenderState, - ShaderSource, ShaderProgram, + ShaderSource, VertexArray, - WebGLConstants, when, BlendingState, Cesium3DTileBatchTable, Cesium3DTileColorBlendMode, Cesium3DTileContentState, Cesium3DTileFeature, - Cesium3DTileFeatureTable, - Pass) { + Cesium3DTileFeatureTable) { 'use strict'; /** @@ -189,9 +189,9 @@ define([ /** * Part of the {@link Cesium3DTileContent} interface. */ - PointCloud3DTileContent.prototype.hasProperty = function(name) { + PointCloud3DTileContent.prototype.hasProperty = function(batchId, name) { if (defined(this.batchTable)) { - return this.batchTable.hasProperty(name); + return this.batchTable.hasProperty(batchId, name); } return false; }; @@ -908,12 +908,7 @@ define([ attributeLocations.a_batchId = batchIdLocation; } - var vs = 'attribute vec3 a_position; \n' + - 'varying vec4 v_color; \n' + - 'uniform float u_pointSize; \n' + - 'uniform vec4 u_constantColor; \n' + - 'uniform vec4 u_highlightColor; \n' + - 'uniform float u_tilesetTime; \n'; + var attributeDeclarations = ''; var length = styleableProperties.length; for (i = 0; i < length; ++i) { @@ -934,10 +929,19 @@ define([ attributeType = 'vec' + componentCount; } - vs += 'attribute ' + attributeType + ' ' + attributeName + '; \n'; + attributeDeclarations += 'attribute ' + attributeType + ' ' + attributeName + '; \n'; attributeLocations[attributeName] = attribute.location; } + var vs = 'attribute vec3 a_position; \n' + + 'varying vec4 v_color; \n' + + 'uniform float u_pointSize; \n' + + 'uniform vec4 u_constantColor; \n' + + 'uniform vec4 u_highlightColor; \n' + + 'uniform float u_tilesetTime; \n'; + + vs += attributeDeclarations; + if (usesColors) { if (isTranslucent) { vs += 'attribute vec4 a_color; \n'; diff --git a/Source/Scene/PointPrimitiveCollection.js b/Source/Scene/PointPrimitiveCollection.js index 1d4a241b7dc4..52f0b5f42a80 100644 --- a/Source/Scene/PointPrimitiveCollection.js +++ b/Source/Scene/PointPrimitiveCollection.js @@ -1,8 +1,6 @@ /*global define*/ define([ '../Core/BoundingSphere', - '../Core/Cartesian2', - '../Core/Cartesian3', '../Core/Color', '../Core/ComponentDatatype', '../Core/defaultValue', @@ -14,9 +12,11 @@ define([ '../Core/Math', '../Core/Matrix4', '../Core/PrimitiveType', + '../Core/WebGLConstants', '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -24,13 +24,10 @@ define([ '../Shaders/PointPrimitiveCollectionFS', '../Shaders/PointPrimitiveCollectionVS', './BlendingState', - './Pass', './PointPrimitive', './SceneMode' ], function( BoundingSphere, - Cartesian2, - Cartesian3, Color, ComponentDatatype, defaultValue, @@ -42,9 +39,11 @@ define([ CesiumMath, Matrix4, PrimitiveType, + WebGLConstants, BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -52,7 +51,6 @@ define([ PointPrimitiveCollectionFS, PointPrimitiveCollectionVS, BlendingState, - Pass, PointPrimitive, SceneMode) { 'use strict'; @@ -852,7 +850,8 @@ define([ if (!defined(this._rs)) { this._rs = RenderState.fromCache({ depthTest : { - enabled : true + enabled : true, + func : WebGLConstants.LEQUAL }, blending : BlendingState.ALPHA_BLEND }); diff --git a/Source/Scene/Polyline.js b/Source/Scene/Polyline.js index e88365516fdf..f73352d37eca 100644 --- a/Source/Scene/Polyline.js +++ b/Source/Scene/Polyline.js @@ -41,6 +41,7 @@ define([ * @param {Cartesian3[]} [options.positions] The positions. * @param {Object} [options.id] The user-defined object to be returned when this polyline is picked. * @param {DistanceDisplayCondition} [options.distanceDisplayCondition] The condition specifying at what distance from the camera that this polyline will be displayed. + * @param {PolylineCollection} polylineCollection The renderable polyline collection. * * @see PolylineCollection * diff --git a/Source/Scene/PolylineCollection.js b/Source/Scene/PolylineCollection.js index eb0b35c292d3..4d491863be01 100644 --- a/Source/Scene/PolylineCollection.js +++ b/Source/Scene/PolylineCollection.js @@ -23,6 +23,7 @@ define([ '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -33,7 +34,6 @@ define([ './BatchTable', './BlendingState', './Material', - './Pass', './Polyline', './SceneMode' ], function( @@ -60,6 +60,7 @@ define([ BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -70,7 +71,6 @@ define([ BatchTable, BlendingState, Material, - Pass, Polyline, SceneMode) { 'use strict'; @@ -391,25 +391,21 @@ define([ componentDatatype : ComponentDatatype.UNSIGNED_BYTE, componentsPerAttribute : 4, normalize : true + }, { + functionName : 'batchTable_getCenterHigh', + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 3 + }, { + functionName : 'batchTable_getCenterLowAndRadius', + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 4 + }, { + functionName : 'batchTable_getDistanceDisplayCondition', + componentDatatype : ComponentDatatype.FLOAT, + componentsPerAttribute : 2 }]; - if (defined(context.floatingPointTexture)) { - attributes.push({ - functionName : 'batchTable_getCenterHigh', - componentDatatype : ComponentDatatype.FLOAT, - componentsPerAttribute : 3 - }, { - functionName : 'batchTable_getCenterLowAndRadius', - componentDatatype : ComponentDatatype.FLOAT, - componentsPerAttribute : 4 - }, { - functionName : 'batchTable_getDistanceDisplayCondition', - componentDatatype : ComponentDatatype.FLOAT, - componentsPerAttribute : 2 - }); - } - - collection._batchTable = new BatchTable(attributes, collection._polylines.length); + collection._batchTable = new BatchTable(context, attributes, collection._polylines.length); } var scratchUpdatePolylineEncodedCartesian = new EncodedCartesian3(); @@ -1150,11 +1146,7 @@ define([ return; } - var defines = []; - if (context.floatingPointTexture) { - defines.push('DISTANCE_DISPLAY_CONDITION'); - } - + var defines = ['DISTANCE_DISPLAY_CONDITION']; var vsSource = batchTable.getVertexShaderCallback()(PolylineVS); var vs = new ShaderSource({ defines : defines, diff --git a/Source/Scene/Primitive.js b/Source/Scene/Primitive.js index ad03055caeec..23b812e41b38 100644 --- a/Source/Scene/Primitive.js +++ b/Source/Scene/Primitive.js @@ -19,17 +19,15 @@ define([ '../Core/Geometry', '../Core/GeometryAttribute', '../Core/GeometryAttributes', - '../Core/GeometryInstance', - '../Core/GeometryInstanceAttribute', '../Core/isArray', '../Core/Matrix4', '../Core/RuntimeError', '../Core/subdivideArray', '../Core/TaskProcessor', - '../Renderer/Buffer', '../Renderer/BufferUsage', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -37,7 +35,6 @@ define([ '../ThirdParty/when', './BatchTable', './CullFace', - './Pass', './PrimitivePipeline', './PrimitiveState', './SceneMode', @@ -62,17 +59,15 @@ define([ Geometry, GeometryAttribute, GeometryAttributes, - GeometryInstance, - GeometryInstanceAttribute, isArray, Matrix4, RuntimeError, subdivideArray, TaskProcessor, - Buffer, BufferUsage, ContextLimits, DrawCommand, + Pass, RenderState, ShaderProgram, ShaderSource, @@ -80,7 +75,6 @@ define([ when, BatchTable, CullFace, - Pass, PrimitivePipeline, PrimitiveState, SceneMode, @@ -614,7 +608,7 @@ define([ } var attributesLength = attributes.length; - var batchTable = new BatchTable(attributes, numberOfInstances); + var batchTable = new BatchTable(context, attributes, numberOfInstances); for (i = 0; i < numberOfInstances; ++i) { var instance = instances[i]; diff --git a/Source/Scene/PrimitivePipeline.js b/Source/Scene/PrimitivePipeline.js index aa50aab5f3db..dfffa094a7f5 100644 --- a/Source/Scene/PrimitivePipeline.js +++ b/Source/Scene/PrimitivePipeline.js @@ -1,9 +1,7 @@ /*global define*/ define([ '../Core/BoundingSphere', - '../Core/Color', '../Core/ComponentDatatype', - '../Core/defaultValue', '../Core/defined', '../Core/DeveloperError', '../Core/Ellipsoid', @@ -18,9 +16,7 @@ define([ '../Core/WebMercatorProjection' ], function( BoundingSphere, - Color, ComponentDatatype, - defaultValue, defined, DeveloperError, Ellipsoid, diff --git a/Source/Scene/QuadtreePrimitive.js b/Source/Scene/QuadtreePrimitive.js index 1d99013f15bb..9743bb3d7754 100644 --- a/Source/Scene/QuadtreePrimitive.js +++ b/Source/Scene/QuadtreePrimitive.js @@ -98,8 +98,9 @@ define([ var ellipsoid = tilingScheme.ellipsoid; this._tilesToRender = []; - this._tileTraversalQueue = new Queue(); - this._tileLoadQueue = []; + this._tileLoadQueueHigh = []; // high priority tiles are preventing refinement + this._tileLoadQueueMedium = []; // medium priority tiles are being rendered + this._tileLoadQueueLow = []; // low priority tiles were refined past or are non-visible parts of quads. this._tileReplacementQueue = new TileReplacementQueue(); this._levelZeroTiles = undefined; this._levelZeroTilesReady = false; @@ -242,7 +243,7 @@ define([ QuadtreePrimitive.prototype.updateHeight = function(cartographic, callback) { var primitive = this; var object = { - position : undefined, + positionOnEllipsoidSurface : undefined, positionCartographic : cartographic, level : -1, callback : callback @@ -287,7 +288,9 @@ define([ debug.tilesRendered = 0; debug.tilesWaitingForChildren = 0; - this._tileLoadQueue.length = 0; + this._tileLoadQueueHigh.length = 0; + this._tileLoadQueueMedium.length = 0; + this._tileLoadQueueLow.length = 0; this._tileReplacementQueue.markStartOfRenderFrame(); }; @@ -389,6 +392,20 @@ define([ this._tileProvider = this._tileProvider && this._tileProvider.destroy(); }; + var comparisonPoint; + var centerScratch = new Cartographic(); + function compareDistanceToPoint(a, b) { + var center = Rectangle.center(a.rectangle, centerScratch); + var alon = center.longitude - comparisonPoint.longitude; + var alat = center.latitude - comparisonPoint.latitude; + + center = Rectangle.center(b.rectangle, centerScratch); + var blon = center.longitude - comparisonPoint.longitude; + var blat = center.latitude - comparisonPoint.latitude; + + return (alon * alon + alat * alat) - (blon * blon + blat * blat); + } + function selectTilesForRendering(primitive, frameState) { var debug = primitive._debug; if (debug.suspendLodUpdate) { @@ -402,9 +419,6 @@ define([ var tilesToRender = primitive._tilesToRender; tilesToRender.length = 0; - var traversalQueue = primitive._tileTraversalQueue; - traversalQueue.clear(); - // We can't render anything before the level zero tiles exist. if (!defined(primitive._levelZeroTiles)) { if (primitive._tileProvider.ready) { @@ -431,6 +445,12 @@ define([ var tile; var levelZeroTiles = primitive._levelZeroTiles; + // Sort the level zero tiles by the distance from the center to the camera. + // The level zero tiles aren't necessarily a nice neat quad, so we can use the + // quadtree ordering we use elsewhere in the tree + comparisonPoint = frameState.camera.positionCartographic; + levelZeroTiles.sort(compareDistanceToPoint); + var customDataAdded = primitive._addHeightCallbacks; var customDataRemoved = primitive._removeHeightCallbacks; var frameNumber = frameState.frameNumber; @@ -445,75 +465,216 @@ define([ customDataRemoved.length = 0; } - // Enqueue the root tiles that are renderable and visible. + if (defined(primitive.sseCorrector)) { + primitive.sseCorrector.newFrameState(frameState); + } + + // Our goal with load ordering is to first load all of the tiles we need to + // render the current scene at full detail. Loading any other tiles is just + // a form of prefetching, and we need not do it at all (other concerns aside). This + // simple and obvious statement gets more complicated when we realize that, because + // we don't have bounding volumes for the entire terrain tile pyramid, we don't + // precisely know which tiles we need to render the scene at full detail, until we do + // some loading. + // + // So our load priority is (from high to low): + // 1. Tiles that we _would_ render, except that they're not sufficiently loaded yet. + // Ideally this would only include tiles that we've already determined to be visible, + // but since we don't have reliable visibility information until a tile is loaded, + // and because we (currently) must have all children in a quad renderable before we + // can refine, this pretty much means tiles we'd like to refine to, regardless of + // visibility. (high) + // 2. Tiles that we're rendering. (medium) + // 3. All other tiles. (low) + // + // Within each priority group, tiles should be loaded in approximate near-to-far order, + // but currently they're just loaded in our traversal order which makes no guarantees + // about depth ordering. + + // Traverse in depth-first, near-to-far order. for (i = 0, len = levelZeroTiles.length; i < len; ++i) { tile = levelZeroTiles[i]; primitive._tileReplacementQueue.markTileRendered(tile); - if (tile.needsLoading) { - queueTileLoad(primitive, tile); - } - if (tile.renderable && tileProvider.computeTileVisibility(tile, frameState, occluders) !== Visibility.NONE) { - traversalQueue.enqueue(tile); + if (!tile.renderable) { + if (tile.needsLoading) { + primitive._tileLoadQueueHigh.push(tile); + } + ++debug.tilesWaitingForChildren; + } else if (tileProvider.computeTileVisibility(tile, frameState, occluders) !== Visibility.NONE) { + visitTile(primitive, frameState, tile); } else { - ++debug.tilesCulled; - if (!tile.renderable) { - ++debug.tilesWaitingForChildren; + if (tile.needsLoading) { + primitive._tileLoadQueueLow.push(tile); } + ++debug.tilesCulled; } } - // Compute camera height once - if (defined(primitive.sseCorrector)) { - primitive.sseCorrector.newFrameState(frameState); - } + raiseTileLoadProgressEvent(primitive); + } - // Traverse the tiles in breadth-first order. - // This ordering allows us to load bigger, lower-detail tiles before smaller, higher-detail ones. - // This maximizes the average detail across the scene and results in fewer sharp transitions - // between very different LODs. - while (defined((tile = traversalQueue.dequeue()))) { - ++debug.tilesVisited; + function visitTile(primitive, frameState, tile) { + var debug = primitive._debug; - primitive._tileReplacementQueue.markTileRendered(tile); - tile._updateCustomData(frameNumber); + ++debug.tilesVisited; - if (tile.level > debug.maxDepth) { - debug.maxDepth = tile.level; - } + primitive._tileReplacementQueue.markTileRendered(tile); + tile._updateCustomData(frameState.frameNumber); - // There are a few different algorithms we could use here. - // This one doesn't load children unless we refine to them. - // We may want to revisit this in the future. + if (tile.level > debug.maxDepth) { + debug.maxDepth = tile.level; + } + + if (screenSpaceError(primitive, frameState, tile) < primitive.maximumScreenSpaceError) { + // This tile meets SSE requirements, so render it. + if (tile.needsLoading) { + // Rendered tile meeting SSE loads with medium priority. + primitive._tileLoadQueueMedium.push(tile); + } + addTileToRenderList(primitive, tile); + return; + } - if (screenSpaceError(primitive, frameState, tile) < primitive.maximumScreenSpaceError) { - // This tile meets SSE requirements, so render it. + var southwestChild = tile.southwestChild; + var southeastChild = tile.southeastChild; + var northwestChild = tile.northwestChild; + var northeastChild = tile.northeastChild; + var allAreRenderable = southwestChild.renderable && southeastChild.renderable && + northwestChild.renderable && northeastChild.renderable; + var allAreUpsampled = southwestChild.upsampledFromParent && southeastChild.upsampledFromParent && + northwestChild.upsampledFromParent && northeastChild.upsampledFromParent; + + if (allAreRenderable) { + if (allAreUpsampled) { + // No point in rendering the children because they're all upsampled. Render this tile instead. addTileToRenderList(primitive, tile); - } else if (queueChildrenLoadAndDetermineIfChildrenAreAllRenderable(primitive, tile)) { + + // Load the children even though we're (currently) not going to render them. + // A tile that is "upsampled only" right now might change its tune once it does more loading. + // A tile that is upsampled now and forever should also be done loading, so no harm done. + queueChildLoadNearToFar(primitive, frameState.camera.positionCartographic, southwestChild, southeastChild, northwestChild, northeastChild); + + if (tile.needsLoading) { + // Rendered tile that's not waiting on children loads with medium priority. + primitive._tileLoadQueueMedium.push(tile); + } + } else { // SSE is not good enough and children are loaded, so refine. - var children = tile.children; - // PERFORMANCE_IDEA: traverse children front-to-back so we can avoid sorting by distance later. - for (i = 0, len = children.length; i < len; ++i) { - if (tileProvider.computeTileVisibility(children[i], frameState, occluders) !== Visibility.NONE) { - traversalQueue.enqueue(children[i]); - } else { - ++debug.tilesCulled; - } + // No need to add the children to the load queue because they'll be added (if necessary) when they're visited. + visitVisibleChildrenNearToFar(primitive, southwestChild, southeastChild, northwestChild, northeastChild, frameState); + + if (tile.needsLoading) { + // Tile is not rendered, so load it with low priority. + primitive._tileLoadQueueLow.push(tile); } + } + } else { + // We'd like to refine but can't because not all of our children are renderable. Load the refinement blockers with high priority and + // render this tile in the meantime. + queueChildLoadNearToFar(primitive, frameState.camera.positionCartographic, southwestChild, southeastChild, northwestChild, northeastChild); + addTileToRenderList(primitive, tile); + + if (tile.needsLoading) { + // We will refine this tile when it's possible, so load this tile only with low priority. + primitive._tileLoadQueueLow.push(tile); + } + } + } + + function queueChildLoadNearToFar(primitive, cameraPosition, southwest, southeast, northwest, northeast) { + if (cameraPosition.longitude < southwest.east) { + if (cameraPosition.latitude < southwest.north) { + // Camera in southwest quadrant + queueChildTileLoad(primitive, southwest); + queueChildTileLoad(primitive, southeast); + queueChildTileLoad(primitive, northwest); + queueChildTileLoad(primitive, northeast); } else { - // SSE is not good enough but not all children are loaded, so render this tile anyway. - addTileToRenderList(primitive, tile); + // Camera in northwest quadrant + queueChildTileLoad(primitive, northwest); + queueChildTileLoad(primitive, southwest); + queueChildTileLoad(primitive, northeast); + queueChildTileLoad(primitive, southeast); + } + } else { + if (cameraPosition.latitude < southwest.north) { + // Camera southeast quadrant + queueChildTileLoad(primitive, southeast); + queueChildTileLoad(primitive, southwest); + queueChildTileLoad(primitive, northeast); + queueChildTileLoad(primitive, northwest); + } else { + // Camera in northeast quadrant + queueChildTileLoad(primitive, northeast); + queueChildTileLoad(primitive, northwest); + queueChildTileLoad(primitive, southeast); + queueChildTileLoad(primitive, southwest); } } + } - raiseTileLoadProgressEvent(primitive); + function queueChildTileLoad(primitive, childTile) { + primitive._tileReplacementQueue.markTileRendered(childTile); + if (childTile.needsLoading) { + if (childTile.renderable) { + primitive._tileLoadQueueLow.push(childTile); + } else { + // A tile blocking refine loads with high priority + primitive._tileLoadQueueHigh.push(childTile); + } + } } + function visitVisibleChildrenNearToFar(primitive, southwest, southeast, northwest, northeast, frameState) { + var cameraPosition = frameState.camera.positionCartographic; + var tileProvider = primitive._tileProvider; + var occluders = primitive._occluders; + + if (cameraPosition.longitude < southwest.rectangle.east) { + if (cameraPosition.latitude < southwest.rectangle.north) { + // Camera in southwest quadrant + visitIfVisible(primitive, southwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, southeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, northwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, northeast, tileProvider, frameState, occluders); + } else { + // Camera in northwest quadrant + visitIfVisible(primitive, northwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, southwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, northeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, southeast, tileProvider, frameState, occluders); + } + } else { + if (cameraPosition.latitude < southwest.rectangle.north) { + // Camera southeast quadrant + visitIfVisible(primitive, southeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, southwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, northeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, northwest, tileProvider, frameState, occluders); + } else { + // Camera in northeast quadrant + visitIfVisible(primitive, northeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, northwest, tileProvider, frameState, occluders); + visitIfVisible(primitive, southeast, tileProvider, frameState, occluders); + visitIfVisible(primitive, southwest, tileProvider, frameState, occluders); + } + } + } + + function visitIfVisible(primitive, tile, tileProvider, frameState, occluders) { + if (tileProvider.computeTileVisibility(tile, frameState, occluders) !== Visibility.NONE) { + visitTile(primitive, frameState, tile); + } else { + ++primitive._debug.tilesCulled; + primitive._tileReplacementQueue.markTileRendered(tile); + } + } /** * Checks if the load queue length has changed since the last time we raised a queue change event - if so, raises * a new one. */ function raiseTileLoadProgressEvent(primitive) { - var currentLoadQueueLength = primitive._tileLoadQueue.length; + var currentLoadQueueLength = primitive._tileLoadQueueHigh.length + primitive._tileLoadQueueMedium.length + primitive._tileLoadQueueLow.length; if (currentLoadQueueLength !== primitive._lastTileLoadQueueLength) { primitive._tileLoadProgressEvent.raiseEvent(currentLoadQueueLength); @@ -562,41 +723,13 @@ define([ ++primitive._debug.tilesRendered; } - function queueChildrenLoadAndDetermineIfChildrenAreAllRenderable(primitive, tile) { - var allRenderable = true; - var allUpsampledOnly = true; - - var children = tile.children; - for (var i = 0, len = children.length; i < len; ++i) { - var child = children[i]; - - primitive._tileReplacementQueue.markTileRendered(child); - - allUpsampledOnly = allUpsampledOnly && child.upsampledFromParent; - allRenderable = allRenderable && child.renderable; - - if (child.needsLoading) { - queueTileLoad(primitive, child); - } - } - - if (!allRenderable) { - ++primitive._debug.tilesWaitingForChildren; - } - - // If all children are upsampled from this tile, we just render this tile instead of its children. - return allRenderable && !allUpsampledOnly; - } - - function queueTileLoad(primitive, tile) { - primitive._tileLoadQueue.push(tile); - } - function processTileLoadQueue(primitive, frameState) { - var tileLoadQueue = primitive._tileLoadQueue; + var tileLoadQueueHigh = primitive._tileLoadQueueHigh; + var tileLoadQueueMedium = primitive._tileLoadQueueMedium; + var tileLoadQueueLow = primitive._tileLoadQueueLow; var tileProvider = primitive._tileProvider; - if (tileLoadQueue.length === 0) { + if (tileLoadQueueHigh.length === 0 && tileLoadQueueMedium.length === 0 && tileLoadQueueLow.length === 0) { return; } @@ -604,17 +737,18 @@ define([ // we're allowed to keep. primitive._tileReplacementQueue.trimTiles(primitive.tileCacheSize); - var startTime = getTimestamp(); - var timeSlice = primitive._loadQueueTimeSlice; - var endTime = startTime + timeSlice; + var endTime = getTimestamp() + primitive._loadQueueTimeSlice; + + processSinglePriorityLoadQueue(primitive, frameState, tileProvider, endTime, tileLoadQueueHigh); + processSinglePriorityLoadQueue(primitive, frameState, tileProvider, endTime, tileLoadQueueMedium); + processSinglePriorityLoadQueue(primitive, frameState, tileProvider, endTime, tileLoadQueueLow); + } - for (var i = tileLoadQueue.length - 1; i >= 0; --i) { - var tile = tileLoadQueue[i]; + function processSinglePriorityLoadQueue(primitive, frameState, tileProvider, endTime, loadQueue) { + for (var i = 0, len = loadQueue.length; i < len && getTimestamp() < endTime; ++i) { + var tile = loadQueue[i]; primitive._tileReplacementQueue.markTileRendered(tile); tileProvider.loadTile(frameState, tile); - if (getTimestamp() >= endTime) { - break; - } } } @@ -644,13 +778,30 @@ define([ var data = customData[i]; if (tile.level > data.level) { - if (!defined(data.position)) { - data.position = ellipsoid.cartographicToCartesian(data.positionCartographic); + if (!defined(data.positionOnEllipsoidSurface)) { + // cartesian has to be on the ellipsoid surface for `ellipsoid.geodeticSurfaceNormal` + data.positionOnEllipsoidSurface = Cartesian3.fromRadians(data.positionCartographic.longitude, data.positionCartographic.latitude, 0.0, ellipsoid); } if (mode === SceneMode.SCENE3D) { - Cartesian3.clone(Cartesian3.ZERO, scratchRay.origin); - Cartesian3.normalize(data.position, scratchRay.direction); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(data.positionOnEllipsoidSurface, scratchRay.direction); + + // compute origin point + + // Try to find the intersection point between the surface normal and z-axis. + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var rayOrigin = ellipsoid.getSurfaceNormalIntersectionWithZAxis(data.positionOnEllipsoidSurface, 11500.0, scratchRay.origin); + + // Theoretically, not with Earth datums, the intersection point can be outside the ellipsoid + if (!defined(rayOrigin)) { + // intersection point is outside the ellipsoid, try other value + // minimum height (-11500.0) for the terrain set, need to get this information from the terrain provider + var magnitude = Math.min(defaultValue(tile.data.minimumHeight, 0.0),-11500.0); + + // multiply by the *positive* value of the magnitude + var vectorToMinimumPoint = Cartesian3.multiplyByScalar(surfaceNormal, Math.abs(magnitude) + 1, scratchPosition); + Cartesian3.subtract(data.positionOnEllipsoidSurface, vectorToMinimumPoint, scratchRay.origin); + } } else { Cartographic.clone(data.positionCartographic, scratchCartographic); @@ -705,17 +856,11 @@ define([ } } - function tileDistanceSortFunction(a, b) { - return a._distance - b._distance; - } - function createRenderCommandsForSelectedTiles(primitive, frameState) { var tileProvider = primitive._tileProvider; var tilesToRender = primitive._tilesToRender; var tilesToUpdateHeights = primitive._tileToUpdateHeights; - tilesToRender.sort(tileDistanceSortFunction); - for (var i = 0, len = tilesToRender.length; i < len; ++i) { var tile = tilesToRender[i]; tileProvider.showTileThisFrame(tile, frameState); diff --git a/Source/Scene/QuadtreeTile.js b/Source/Scene/QuadtreeTile.js index c818bbddf909..34dbd2ced0fc 100644 --- a/Source/Scene/QuadtreeTile.js +++ b/Source/Scene/QuadtreeTile.js @@ -54,7 +54,11 @@ define([ this._level = options.level; this._parent = options.parent; this._rectangle = this._tilingScheme.tileXYToRectangle(this._x, this._y, this._level); - this._children = undefined; + + this._southwestChild = undefined; + this._southeastChild = undefined; + this._northwestChild = undefined; + this._northeastChild = undefined; // QuadtreeTileReplacementQueue gets/sets these private properties. this._replacementPrevious = undefined; @@ -308,39 +312,87 @@ define([ */ children : { get : function() { - if (!defined(this._children)) { - var tilingScheme = this.tilingScheme; - var level = this.level + 1; - var x = this.x * 2; - var y = this.y * 2; - this._children = [new QuadtreeTile({ - tilingScheme : tilingScheme, - x : x, - y : y, - level : level, - parent : this - }), new QuadtreeTile({ - tilingScheme : tilingScheme, - x : x + 1, - y : y, - level : level, + return [this.northwestChild, this.northeastChild, this.southwestChild, this.southeastChild]; + } + }, + + /** + * Gets the southwest child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + southwestChild : { + get : function() { + if (!defined(this._southwestChild)) { + this._southwestChild = new QuadtreeTile({ + tilingScheme : this.tilingScheme, + x : this.x * 2, + y : this.y * 2 + 1, + level : this.level + 1, parent : this - }), new QuadtreeTile({ - tilingScheme : tilingScheme, - x : x, - y : y + 1, - level : level, + }); + } + return this._southwestChild; + } + }, + + /** + * Gets the southeast child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + southeastChild : { + get : function() { + if (!defined(this._southeastChild)) { + this._southeastChild = new QuadtreeTile({ + tilingScheme : this.tilingScheme, + x : this.x * 2 + 1, + y : this.y * 2 + 1, + level : this.level + 1, parent : this - }), new QuadtreeTile({ - tilingScheme : tilingScheme, - x : x + 1, - y : y + 1, - level : level, + }); + } + return this._southeastChild; + } + }, + + /** + * Gets the northwest child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + northwestChild : { + get : function() { + if (!defined(this._northwestChild)) { + this._northwestChild = new QuadtreeTile({ + tilingScheme : this.tilingScheme, + x : this.x * 2, + y : this.y * 2, + level : this.level + 1, parent : this - })]; + }); } + return this._northwestChild; + } + }, - return this._children; + /** + * Gets the northeast child tile. + * @memberof QuadtreeTile.prototype + * @type {QuadtreeTile} + */ + northeastChild : { + get : function() { + if (!defined(this._northeastChild)) { + this._northeastChild = new QuadtreeTile({ + tilingScheme : this.tilingScheme, + x : this.x * 2 + 1, + y : this.y * 2, + level : this.level + 1, + parent : this + }); + } + return this._northeastChild; } }, @@ -411,13 +463,21 @@ define([ this.data.freeResources(); } - if (defined(this._children)) { - for (var i = 0, len = this._children.length; i < len; ++i) { - this._children[i].freeResources(); - } - this._children = undefined; - } + freeTile(this._southwestChild); + this._southwestChild = undefined; + freeTile(this._southeastChild); + this._southeastChild = undefined; + freeTile(this._northwestChild); + this._northwestChild = undefined; + freeTile(this._northeastChild); + this._northeastChild = undefined; }; + function freeTile(tile) { + if (defined(tile)) { + tile.freeResources(); + } + } + return QuadtreeTile; }); diff --git a/Source/Scene/Scene.js b/Source/Scene/Scene.js index 4814351ee967..6487b9af7815 100644 --- a/Source/Scene/Scene.js +++ b/Source/Scene/Scene.js @@ -36,6 +36,7 @@ define([ '../Renderer/Context', '../Renderer/ContextLimits', '../Renderer/DrawCommand', + '../Renderer/Pass', '../Renderer/PassState', '../Renderer/ShaderProgram', '../Renderer/ShaderSource', @@ -53,7 +54,6 @@ define([ './MapMode2D', './OIT', './OrthographicFrustum', - './Pass', './PerformanceDisplay', './PerInstanceColorAppearance', './PerspectiveFrustum', @@ -105,6 +105,7 @@ define([ Context, ContextLimits, DrawCommand, + Pass, PassState, ShaderProgram, ShaderSource, @@ -122,7 +123,6 @@ define([ MapMode2D, OIT, OrthographicFrustum, - Pass, PerformanceDisplay, PerInstanceColorAppearance, PerspectiveFrustum, @@ -290,6 +290,9 @@ define([ depth : 1.0, owner : this }); + this._stencilClearCommand = new ClearCommand({ + stencil : 0 + }); this._pickDepths = []; this._debugGlobeDepths = []; @@ -1178,6 +1181,11 @@ define([ frameState.cullingVolume = camera.frustum.computeCullingVolume(camera.positionWC, camera.directionWC, camera.upWC); frameState.occluder = getOccluder(scene); frameState.terrainExaggeration = scene._terrainExaggeration; + if (defined(scene.globe)) { + frameState.maximumScreenSpaceError = scene.globe.maximumScreenSpaceError; + } else { + frameState.maximumScreenSpaceError = 2; + } clearPasses(frameState.passes); } @@ -1625,7 +1633,7 @@ define([ var scratchPerspectiveOffCenterFrustum = new PerspectiveOffCenterFrustum(); var scratchOrthographicFrustum = new OrthographicFrustum(); - function executeCommands(scene, passState) { + function executeCommands(scene, passState, picking) { var camera = scene._camera; var context = scene.context; var us = context.uniformState; @@ -1649,37 +1657,40 @@ define([ us.updateFrustum(frustum); us.updatePass(Pass.ENVIRONMENT); + var useWebVR = scene._useWebVR && scene.mode !== SceneMode.SCENE2D; var environmentState = scene._environmentState; - var skyBoxCommand = environmentState.skyBoxCommand; - if (defined(skyBoxCommand)) { - executeCommand(skyBoxCommand, scene, context, passState); - } - if (environmentState.isSkyAtmosphereVisible) { - executeCommand(environmentState.skyAtmosphereCommand, scene, context, passState); - } + // Do not render environment primitives during a pick pass since they do not generate picking commands. + if (!picking) { + var skyBoxCommand = environmentState.skyBoxCommand; + if (defined(skyBoxCommand)) { + executeCommand(skyBoxCommand, scene, context, passState); + } - var useWebVR = scene._useWebVR && scene.mode !== SceneMode.SCENE2D; + if (environmentState.isSkyAtmosphereVisible) { + executeCommand(environmentState.skyAtmosphereCommand, scene, context, passState); + } - if (environmentState.isSunVisible) { - environmentState.sunDrawCommand.execute(context, passState); - if (scene.sunBloom && !useWebVR) { - var framebuffer; - if (environmentState.useGlobeDepthFramebuffer) { - framebuffer = scene._globeDepth.framebuffer; - } else if (environmentState.useFXAA) { - framebuffer = scene._fxaa.getColorFramebuffer(); - } else { - framebuffer = environmentState.originalFramebuffer; + if (environmentState.isSunVisible) { + environmentState.sunDrawCommand.execute(context, passState); + if (scene.sunBloom && !useWebVR) { + var framebuffer; + if (environmentState.useGlobeDepthFramebuffer) { + framebuffer = scene._globeDepth.framebuffer; + } else if (environmentState.useFXAA) { + framebuffer = scene._fxaa.getColorFramebuffer(); + } else { + framebuffer = environmentState.originalFramebuffer; + } + scene._sunPostProcess.execute(context, framebuffer); + passState.framebuffer = framebuffer; } - scene._sunPostProcess.execute(context, framebuffer); - passState.framebuffer = framebuffer; } - } - // Moon can be seen through the atmosphere, since the sun is rendered after the atmosphere. - if (environmentState.isMoonVisible) { - environmentState.moonCommand.execute(context, passState); + // Moon can be seen through the atmosphere, since the sun is rendered after the atmosphere. + if (environmentState.isMoonVisible) { + environmentState.moonCommand.execute(context, passState); + } } // Determine how translucent surfaces will be handled. @@ -1759,6 +1770,11 @@ define([ executeCommand(commands[j], scene, context, passState); } + // Clear the stencil after the ground pass + if (length > 0 && context.stencilBuffer) { + scene._stencilClearCommand.execute(context, passState); + } + if (clearGlobeDepth) { clearDepth.execute(context, passState); if (useDepthPlane) { @@ -1950,14 +1966,14 @@ define([ Cartesian3.add(savedCamera.position, eyeTranslation, camera.position); camera.frustum.xOffset = offset; - executeCommands(scene, passState); + executeCommands(scene, passState, picking); viewport.x = passState.viewport.width; Cartesian3.subtract(savedCamera.position, eyeTranslation, camera.position); camera.frustum.xOffset = -offset; - executeCommands(scene, passState); + executeCommands(scene, passState, picking); Camera.clone(savedCamera, camera); } else { @@ -2108,7 +2124,7 @@ define([ executeShadowMapCastCommands(scene); } - executeCommands(scene, passState); + executeCommands(scene, passState, picking); } function updateEnvironment(scene) { @@ -2337,7 +2353,7 @@ define([ if (defined(this._deviceOrientationCameraController)) { this._deviceOrientationCameraController.update(); } - + this._camera.update(this._mode); this._camera._updateCameraChanged(); }; diff --git a/Source/Scene/SceneTransitioner.js b/Source/Scene/SceneTransitioner.js index f625f2f0e368..76c0989a6786 100644 --- a/Source/Scene/SceneTransitioner.js +++ b/Source/Scene/SceneTransitioner.js @@ -2,12 +2,10 @@ define([ '../Core/Cartesian3', '../Core/Cartographic', - '../Core/defaultValue', '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', '../Core/EasingFunction', - '../Core/Ellipsoid', '../Core/Math', '../Core/Matrix4', '../Core/Ray', @@ -21,12 +19,10 @@ define([ ], function( Cartesian3, Cartographic, - defaultValue, defined, destroyObject, DeveloperError, EasingFunction, - Ellipsoid, CesiumMath, Matrix4, Ray, @@ -130,11 +126,12 @@ define([ if (duration > 0.0) { position.x = 0.0; - position.y = 0.0; - position.z = 5.0 * ellipsoid.maximumRadius; + position.y = -1.0; + position.z = 1.0; + position = Cartesian3.multiplyByScalar(Cartesian3.normalize(position, position), 5.0 * ellipsoid.maximumRadius, position); - Cartesian3.negate(Cartesian3.UNIT_Z, direction); - Cartesian3.clone(Cartesian3.UNIT_Y, up); + Cartesian3.negate(Cartesian3.normalize(position, direction), direction); + Cartesian3.cross(Cartesian3.UNIT_X, direction, up); } else { var camera = scene.camera; if (this._previousMode === SceneMode.SCENE2D) { @@ -698,48 +695,42 @@ define([ var scene = transitioner._scene; var camera = scene.camera; - var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); - var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); - var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); - var endPos = Cartesian3.clone(cameraCV.position, scratch3DToCVEndPos); var endDir = Cartesian3.clone(cameraCV.direction, scratch3DToCVEndDir); var endUp = Cartesian3.clone(cameraCV.up, scratch3DToCVEndUp); - var startRight = camera.frustum.right; - var endRight = endPos.z * 0.5; - - function update(value) { - columbusViewMorph(startPos, endPos, value.time, camera.position); - columbusViewMorph(startDir, endDir, value.time, camera.direction); - columbusViewMorph(startUp, endUp, value.time, camera.up); - Cartesian3.cross(camera.direction, camera.up, camera.right); - Cartesian3.normalize(camera.right, camera.right); - - var frustum = camera.frustum; - frustum.right = CesiumMath.lerp(startRight, endRight, value.time); - frustum.left = -frustum.right; - frustum.top = frustum.right * (scene.drawingBufferHeight / scene.drawingBufferWidth); - frustum.bottom = -frustum.top; - - camera.position.z = 2.0 * scene.mapProjection.ellipsoid.maximumRadius; - } - var tween = scene.tweens.add({ - duration : duration, - easingFunction : EasingFunction.QUARTIC_OUT, - startObject : { - time : 0.0 - }, - stopObject : { - time : 1.0 - }, - update : update, - complete : function() { - scene._mode = SceneMode.MORPHING; - morphOrthographicToPerspective(transitioner, duration, cameraCV, complete); + scene._mode = SceneMode.MORPHING; + morphOrthographicToPerspective(transitioner, 0.0, cameraCV, function() { + camera.frustum = cameraCV.frustum.clone(); + + var startPos = Cartesian3.clone(camera.position, scratch3DToCVStartPos); + var startDir = Cartesian3.clone(camera.direction, scratch3DToCVStartDir); + var startUp = Cartesian3.clone(camera.up, scratch3DToCVStartUp); + startPos.z = endPos.z; + + function update(value) { + columbusViewMorph(startPos, endPos, value.time, camera.position); + columbusViewMorph(startDir, endDir, value.time, camera.direction); + columbusViewMorph(startUp, endUp, value.time, camera.up); + Cartesian3.cross(camera.direction, camera.up, camera.right); + Cartesian3.normalize(camera.right, camera.right); } + var tween = scene.tweens.add({ + duration : duration, + easingFunction : EasingFunction.QUARTIC_OUT, + startObject : { + time : 0.0 + }, + stopObject : { + time : 1.0 + }, + update : update, + complete : function() { + complete(transitioner); + } + }); + transitioner._currentTweens.push(tween); }); - transitioner._currentTweens.push(tween); } var scratch3DToCVStartPos = new Cartesian3(); diff --git a/Source/Scene/ScreenSpaceCameraController.js b/Source/Scene/ScreenSpaceCameraController.js index 8a52c42dd7df..7f0652571b0a 100644 --- a/Source/Scene/ScreenSpaceCameraController.js +++ b/Source/Scene/ScreenSpaceCameraController.js @@ -153,9 +153,9 @@ define([ */ this.bounceAnimationTime = 3.0; /** - * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 20.0. + * The minimum magnitude, in meters, of the camera position when zooming. Defaults to 1.0. * @type {Number} - * @default 20.0 + * @default 1.0 */ this.minimumZoomDistance = 1.0; /** diff --git a/Source/Scene/ShadowMap.js b/Source/Scene/ShadowMap.js index 85fa22cbcf09..cce66085ebdb 100644 --- a/Source/Scene/ShadowMap.js +++ b/Source/Scene/ShadowMap.js @@ -22,14 +22,15 @@ define([ '../Core/Math', '../Core/Matrix4', '../Core/PixelFormat', - '../Core/PrimitiveType', '../Core/Quaternion', '../Core/SphereOutlineGeometry', + '../Core/WebGLConstants', '../Renderer/ClearCommand', '../Renderer/ContextLimits', '../Renderer/CubeMap', '../Renderer/DrawCommand', '../Renderer/Framebuffer', + '../Renderer/Pass', '../Renderer/PassState', '../Renderer/PixelDatatype', '../Renderer/Renderbuffer', @@ -37,18 +38,15 @@ define([ '../Renderer/RenderState', '../Renderer/Sampler', '../Renderer/ShaderProgram', - '../Renderer/ShaderSource', '../Renderer/Texture', '../Renderer/TextureMagnificationFilter', '../Renderer/TextureMinificationFilter', '../Renderer/TextureWrap', - '../Renderer/WebGLConstants', './Camera', './CullFace', './CullingVolume', './DebugCameraPrimitive', './OrthographicFrustum', - './Pass', './PerInstanceColorAppearance', './PerspectiveFrustum', './Primitive', @@ -76,14 +74,15 @@ define([ CesiumMath, Matrix4, PixelFormat, - PrimitiveType, Quaternion, SphereOutlineGeometry, + WebGLConstants, ClearCommand, ContextLimits, CubeMap, DrawCommand, Framebuffer, + Pass, PassState, PixelDatatype, Renderbuffer, @@ -91,18 +90,15 @@ define([ RenderState, Sampler, ShaderProgram, - ShaderSource, Texture, TextureMagnificationFilter, TextureMinificationFilter, TextureWrap, - WebGLConstants, Camera, CullFace, CullingVolume, DebugCameraPrimitive, OrthographicFrustum, - Pass, PerInstanceColorAppearance, PerspectiveFrustum, Primitive, diff --git a/Source/Scene/ShadowMapShader.js b/Source/Scene/ShadowMapShader.js index 5214d86a8f3e..555b61b8e0ad 100644 --- a/Source/Scene/ShadowMapShader.js +++ b/Source/Scene/ShadowMapShader.js @@ -1,10 +1,8 @@ /*global define*/ define([ - '../Core/defaultValue', '../Core/defined', '../Renderer/ShaderSource' ], function( - defaultValue, defined, ShaderSource) { 'use strict'; diff --git a/Source/Scene/SingleTileImageryProvider.js b/Source/Scene/SingleTileImageryProvider.js index 258c5a7c526b..4d59f9fbd8e7 100644 --- a/Source/Scene/SingleTileImageryProvider.js +++ b/Source/Scene/SingleTileImageryProvider.js @@ -402,7 +402,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - SingleTileImageryProvider.prototype.pickFeatures = function() { + SingleTileImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/StencilFunction.js b/Source/Scene/StencilFunction.js index 244135f4de7f..0d8e8014e4df 100644 --- a/Source/Scene/StencilFunction.js +++ b/Source/Scene/StencilFunction.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/StencilOperation.js b/Source/Scene/StencilOperation.js index a457136f2934..97b82b4f2b3d 100644 --- a/Source/Scene/StencilOperation.js +++ b/Source/Scene/StencilOperation.js @@ -1,7 +1,7 @@ /*global define*/ define([ '../Core/freezeObject', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( freezeObject, WebGLConstants) { diff --git a/Source/Scene/Sun.js b/Source/Scene/Sun.js index f1dfe1e0d18b..78d22a8b40b1 100644 --- a/Source/Scene/Sun.js +++ b/Source/Scene/Sun.js @@ -1,11 +1,9 @@ /*global define*/ define([ - '../Core/BoundingRectangle', '../Core/BoundingSphere', '../Core/Cartesian2', '../Core/Cartesian3', '../Core/Cartesian4', - '../Core/Color', '../Core/ComponentDatatype', '../Core/defined', '../Core/defineProperties', @@ -17,10 +15,8 @@ define([ '../Core/PrimitiveType', '../Renderer/Buffer', '../Renderer/BufferUsage', - '../Renderer/ClearCommand', '../Renderer/ComputeCommand', '../Renderer/DrawCommand', - '../Renderer/Framebuffer', '../Renderer/RenderState', '../Renderer/ShaderProgram', '../Renderer/Texture', @@ -32,12 +28,10 @@ define([ './SceneMode', './SceneTransforms' ], function( - BoundingRectangle, BoundingSphere, Cartesian2, Cartesian3, Cartesian4, - Color, ComponentDatatype, defined, defineProperties, @@ -49,10 +43,8 @@ define([ PrimitiveType, Buffer, BufferUsage, - ClearCommand, ComputeCommand, DrawCommand, - Framebuffer, RenderState, ShaderProgram, Texture, diff --git a/Source/Scene/TextureAtlas.js b/Source/Scene/TextureAtlas.js index adf579f2c555..e774a3317520 100644 --- a/Source/Scene/TextureAtlas.js +++ b/Source/Scene/TextureAtlas.js @@ -12,7 +12,6 @@ define([ '../Core/PixelFormat', '../Core/RuntimeError', '../Renderer/Framebuffer', - '../Renderer/RenderState', '../Renderer/Texture', '../ThirdParty/when' ], function( @@ -28,7 +27,6 @@ define([ PixelFormat, RuntimeError, Framebuffer, - RenderState, Texture, when) { 'use strict'; @@ -171,18 +169,19 @@ define([ var context = textureAtlas._context; var numImages = textureAtlas.numberOfImages; var scalingFactor = 2.0; + var borderWidthInPixels = textureAtlas._borderWidthInPixels; if (numImages > 0) { var oldAtlasWidth = textureAtlas._texture.width; var oldAtlasHeight = textureAtlas._texture.height; - var atlasWidth = scalingFactor * (oldAtlasWidth + image.width + textureAtlas._borderWidthInPixels); - var atlasHeight = scalingFactor * (oldAtlasHeight + image.height + textureAtlas._borderWidthInPixels); + var atlasWidth = scalingFactor * (oldAtlasWidth + image.width + borderWidthInPixels); + var atlasHeight = scalingFactor * (oldAtlasHeight + image.height + borderWidthInPixels); var widthRatio = oldAtlasWidth / atlasWidth; var heightRatio = oldAtlasHeight / atlasHeight; // Create new node structure, putting the old root node in the bottom left. - var nodeBottomRight = new TextureAtlasNode(new Cartesian2(oldAtlasWidth + textureAtlas._borderWidthInPixels, 0.0), new Cartesian2(atlasWidth, oldAtlasHeight)); + var nodeBottomRight = new TextureAtlasNode(new Cartesian2(oldAtlasWidth + borderWidthInPixels, borderWidthInPixels), new Cartesian2(atlasWidth, oldAtlasHeight)); var nodeBottomHalf = new TextureAtlasNode(new Cartesian2(), new Cartesian2(atlasWidth, oldAtlasHeight), textureAtlas._root, nodeBottomRight); - var nodeTopHalf = new TextureAtlasNode(new Cartesian2(0.0, oldAtlasHeight + textureAtlas._borderWidthInPixels), new Cartesian2(atlasWidth, atlasHeight)); + var nodeTopHalf = new TextureAtlasNode(new Cartesian2(borderWidthInPixels, oldAtlasHeight + borderWidthInPixels), new Cartesian2(atlasWidth, atlasHeight)); var nodeMain = new TextureAtlasNode(new Cartesian2(), new Cartesian2(atlasWidth, atlasHeight), nodeBottomHalf, nodeTopHalf); // Resize texture coordinates. @@ -219,8 +218,8 @@ define([ textureAtlas._root = nodeMain; } else { // First image exceeds initialSize - var initialWidth = scalingFactor * (image.width + textureAtlas._borderWidthInPixels); - var initialHeight = scalingFactor * (image.height + textureAtlas._borderWidthInPixels); + var initialWidth = scalingFactor * (image.width + 2 * borderWidthInPixels); + var initialHeight = scalingFactor * (image.height + 2 * borderWidthInPixels); if(initialWidth < textureAtlas._initialSize.x) { initialWidth = textureAtlas._initialSize.x; } @@ -234,7 +233,8 @@ define([ height : initialHeight, pixelFormat : textureAtlas._pixelFormat }); - textureAtlas._root = new TextureAtlasNode(new Cartesian2(), new Cartesian2(initialWidth, initialHeight)); + textureAtlas._root = new TextureAtlasNode(new Cartesian2(borderWidthInPixels, borderWidthInPixels), + new Cartesian2(initialWidth, initialHeight)); } } @@ -457,7 +457,7 @@ define([ * * @example * atlas = atlas && atlas.destroy(); - * + * * @see TextureAtlas#isDestroyed */ TextureAtlas.prototype.destroy = function() { diff --git a/Source/Scene/TileCoordinatesImageryProvider.js b/Source/Scene/TileCoordinatesImageryProvider.js index 71290b1db166..f55e31100cb2 100644 --- a/Source/Scene/TileCoordinatesImageryProvider.js +++ b/Source/Scene/TileCoordinatesImageryProvider.js @@ -283,7 +283,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - TileCoordinatesImageryProvider.prototype.pickFeatures = function() { + TileCoordinatesImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/TileImagery.js b/Source/Scene/TileImagery.js index b956dab67bf6..31ffc8816881 100644 --- a/Source/Scene/TileImagery.js +++ b/Source/Scene/TileImagery.js @@ -69,7 +69,7 @@ define([ // Find some ancestor imagery we can use while this imagery is still loading. var ancestor = loadingImagery.parent; var closestAncestorThatNeedsLoading; - while (defined(ancestor) && ancestor.state !== ImageryState.READY) { + while (defined(ancestor) && (ancestor.state !== ImageryState.READY || (!this.useWebMercatorT && !defined(ancestor.texture)))) { if (ancestor.state !== ImageryState.FAILED && ancestor.state !== ImageryState.INVALID) { // ancestor is still loading closestAncestorThatNeedsLoading = closestAncestorThatNeedsLoading || ancestor; diff --git a/Source/Scene/TileOrientedBoundingBox.js b/Source/Scene/TileOrientedBoundingBox.js index 1f5db032b50a..cf1e05efcfe5 100644 --- a/Source/Scene/TileOrientedBoundingBox.js +++ b/Source/Scene/TileOrientedBoundingBox.js @@ -121,9 +121,9 @@ define([ //>>includeEnd('debug'); var geometry = new BoxOutlineGeometry({ - // Make a cube of unit size -- all sides of length 1.0 - minimum: new Cartesian3(-0.5, -0.5, -0.5), - maximum: new Cartesian3(0.5, 0.5, 0.5) + // Make a 2x2x2 cube + minimum: new Cartesian3(-1.0, -1.0, -1.0), + maximum: new Cartesian3(1.0, 1.0, 1.0) }); var modelMatrix = Matrix4.fromRotationTranslation(this.boundingVolume.halfAxes, this.boundingVolume.center); var instance = new GeometryInstance({ diff --git a/Source/Scene/TileTerrain.js b/Source/Scene/TileTerrain.js index 3e13094a5d14..2a2945f91c16 100644 --- a/Source/Scene/TileTerrain.js +++ b/Source/Scene/TileTerrain.js @@ -2,7 +2,6 @@ define([ '../Core/BoundingSphere', '../Core/Cartesian3', - '../Core/ComponentDatatype', '../Core/defined', '../Core/DeveloperError', '../Core/IndexDatatype', @@ -18,7 +17,6 @@ define([ ], function( BoundingSphere, Cartesian3, - ComponentDatatype, defined, DeveloperError, IndexDatatype, diff --git a/Source/Scene/Tileset3DTileContent.js b/Source/Scene/Tileset3DTileContent.js index 9fd0d5c09296..49a7daba114a 100644 --- a/Source/Scene/Tileset3DTileContent.js +++ b/Source/Scene/Tileset3DTileContent.js @@ -81,7 +81,7 @@ define([ * Part of the {@link Cesium3DTileContent} interface. Tileset3DTileContent * always returns false since a tile of this type does not have any features. */ - Tileset3DTileContent.prototype.hasProperty = function(name) { + Tileset3DTileContent.prototype.hasProperty = function(batchId, name) { return false; }; diff --git a/Source/Scene/UrlTemplateImageryProvider.js b/Source/Scene/UrlTemplateImageryProvider.js index c31f22253a60..d1ecb9394bf3 100644 --- a/Source/Scene/UrlTemplateImageryProvider.js +++ b/Source/Scene/UrlTemplateImageryProvider.js @@ -10,7 +10,6 @@ define([ '../Core/defineProperties', '../Core/DeveloperError', '../Core/Event', - '../Core/freezeObject', '../Core/GeographicTilingScheme', '../Core/isArray', '../Core/loadJson', @@ -20,7 +19,6 @@ define([ '../Core/Math', '../Core/Rectangle', '../Core/RequestScheduler', - '../Core/TileProviderError', '../Core/WebMercatorTilingScheme', '../ThirdParty/when', './ImageryProvider' @@ -35,7 +33,6 @@ define([ defineProperties, DeveloperError, Event, - freezeObject, GeographicTilingScheme, isArray, loadJson, @@ -45,7 +42,6 @@ define([ CesiumMath, Rectangle, RequestScheduler, - TileProviderError, WebMercatorTilingScheme, when, ImageryProvider) { @@ -292,6 +288,7 @@ define([ *

  • {latitudeProjected}: The latitude of the picked position in the projected coordinates of the tiling scheme.
  • *
  • {format}: The format in which to get feature information, as specified in the {@link GetFeatureInfoFormat}.
  • * + * @memberof UrlTemplateImageryProvider.prototype * @type {String} * @readonly */ diff --git a/Source/Scene/VerticalOrigin.js b/Source/Scene/VerticalOrigin.js index b72103652dc6..1e109364d60f 100644 --- a/Source/Scene/VerticalOrigin.js +++ b/Source/Scene/VerticalOrigin.js @@ -6,17 +6,23 @@ define([ 'use strict'; /** - * The vertical location of an origin relative to an object, e.g., a {@link Billboard}. - * For example, the vertical origin is used to display a billboard above or below (in - * screen space) of the actual position. + * The vertical location of an origin relative to an object, e.g., a {@link Billboard} + * or {@link Label}. For example, setting the vertical origin to TOP + * or BOTTOM will display a billboard above or below (in screen space) + * the anchor position. + *

    + *
    + *
    + *
    * * @exports VerticalOrigin * * @see Billboard#verticalOrigin + * @see Label#verticalOrigin */ var VerticalOrigin = { /** - * The origin is at the vertical center of the object. + * The origin is at the vertical center between BASELINE and TOP. * * @type {Number} * @constant @@ -31,6 +37,14 @@ define([ */ BOTTOM : 1, + /** + * If the object contains text, the origin is at the baseline of the text, else the origin is at the bottom of the object. + * + * @type {Number} + * @constant + */ + BASELINE : 2, + /** * The origin is at the top of the object. * diff --git a/Source/Scene/ViewportQuad.js b/Source/Scene/ViewportQuad.js index 5d26694eb94b..b8dbeb2269f9 100644 --- a/Source/Scene/ViewportQuad.js +++ b/Source/Scene/ViewportQuad.js @@ -5,24 +5,24 @@ define([ '../Core/defined', '../Core/destroyObject', '../Core/DeveloperError', + '../Renderer/Pass', '../Renderer/RenderState', '../Renderer/ShaderSource', '../Shaders/ViewportQuadFS', './BlendingState', - './Material', - './Pass' + './Material' ], function( BoundingRectangle, Color, defined, destroyObject, DeveloperError, + Pass, RenderState, ShaderSource, ViewportQuadFS, BlendingState, - Material, - Pass) { + Material) { 'use strict'; /** diff --git a/Source/Scene/WebMapServiceImageryProvider.js b/Source/Scene/WebMapServiceImageryProvider.js index 6be65924d7bc..dea8e4682651 100644 --- a/Source/Scene/WebMapServiceImageryProvider.js +++ b/Source/Scene/WebMapServiceImageryProvider.js @@ -132,7 +132,19 @@ define([ } setParameter('layers', options.layers); - setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + + // Use SRS or CRS based on the WMS version. + if (parseFloat(parameters.version) >= 1.3) { + // Use CRS with 1.3.0 and going forward. + // For GeographicTilingScheme, use CRS:84 vice EPSG:4326 to specify lon, lat (x, y) ordering for + // bbox requests. + setParameter('crs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'CRS:84'); + } + else { + // SRS for WMS 1.1.0 or 1.1.1. + setParameter('srs', options.tilingScheme instanceof WebMercatorTilingScheme ? 'EPSG:3857' : 'EPSG:4326'); + } + setParameter('bbox', '{westProjected},{southProjected},{eastProjected},{northProjected}'); setParameter('width', '{width}'); setParameter('height', '{height}'); @@ -387,6 +399,7 @@ define([ * {@link WebMapServiceImageryProvider#pickFeatures} will immediately return undefined (indicating no pickable * features) without communicating with the server. Set this property to false if you know your data * source does not support picking features or if you don't want this provider's features to be pickable. + * @memberof WebMapServiceImageryProvider.prototype * @type {Boolean} * @default true */ diff --git a/Source/Scene/WebMapTileServiceImageryProvider.js b/Source/Scene/WebMapTileServiceImageryProvider.js index e27c0b6d5d30..8f32fa8126b7 100644 --- a/Source/Scene/WebMapTileServiceImageryProvider.js +++ b/Source/Scene/WebMapTileServiceImageryProvider.js @@ -92,7 +92,7 @@ define([ * credit : new Cesium.Credit('U. S. Geological Survey') * }); * viewer.imageryLayers.addImageryProvider(shadedRelief2); - * + * * @see ArcGisMapServerImageryProvider * @see BingMapsImageryProvider * @see GoogleEarthImageryProvider @@ -466,7 +466,7 @@ define([ * instances. The array may be empty if no features are found at the given location. * It may also be undefined if picking is not supported. */ - WebMapTileServiceImageryProvider.prototype.pickFeatures = function() { + WebMapTileServiceImageryProvider.prototype.pickFeatures = function(x, y, level, longitude, latitude) { return undefined; }; diff --git a/Source/Scene/createTileMapServiceImageryProvider.js b/Source/Scene/createTileMapServiceImageryProvider.js index 87f93461a71f..bc71467d1d25 100644 --- a/Source/Scene/createTileMapServiceImageryProvider.js +++ b/Source/Scene/createTileMapServiceImageryProvider.js @@ -2,12 +2,9 @@ define([ '../Core/Cartesian2', '../Core/Cartographic', - '../Core/Credit', '../Core/defaultValue', '../Core/defined', - '../Core/defineProperties', '../Core/DeveloperError', - '../Core/Event', '../Core/GeographicTilingScheme', '../Core/joinUrls', '../Core/loadXML', @@ -20,12 +17,9 @@ define([ ], function( Cartesian2, Cartographic, - Credit, defaultValue, defined, - defineProperties, DeveloperError, - Event, GeographicTilingScheme, joinUrls, loadXML, diff --git a/Source/Scene/modelMaterialsCommon.js b/Source/Scene/modelMaterialsCommon.js index 984807fee4bb..b151f9baccd3 100644 --- a/Source/Scene/modelMaterialsCommon.js +++ b/Source/Scene/modelMaterialsCommon.js @@ -2,7 +2,7 @@ define([ '../Core/defaultValue', '../Core/defined', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( defaultValue, defined, @@ -167,7 +167,7 @@ define([ var vertexShaderCount = 0; var fragmentShaderCount = 0; var programCount = 0; - function generateTechnique(gltf, khrMaterialsCommon, lightParameters) { + function generateTechnique(gltf, khrMaterialsCommon, lightParameters, options) { var techniques = gltf.techniques; var shaders = gltf.shaders; var programs = gltf.programs; @@ -195,7 +195,7 @@ define([ var techniqueParameters = { // Add matrices modelViewMatrix: { - semantic: 'MODELVIEW', + semantic: options.useCesiumRTCMatrixInShaders ? 'CESIUM_RTC_MODELVIEW' : 'MODELVIEW', type: WebGLConstants.FLOAT_MAT4 }, projectionMatrix: { @@ -350,6 +350,15 @@ define([ vertexShader += 'attribute vec4 a_weight;\n'; } + if (options.addBatchIdToGeneratedShaders) { + techniqueAttributes.a_batchId = 'batchId'; + techniqueParameters.batchId = { + semantic: '_BATCHID', + type: WebGLConstants.FLOAT + }; + vertexShader += 'attribute float a_batchId;\n'; + } + var hasSpecular = hasNormals && ((lightingModel === 'BLINN') || (lightingModel === 'PHONG')) && defined(techniqueParameters.specular) && defined(techniqueParameters.shininess); @@ -627,7 +636,7 @@ define([ } else { value = paramValue; } - + switch (paramName) { case 'ambient': return (value instanceof String || typeof value === 'string') ? WebGLConstants.SAMPLER_2D : WebGLConstants.FLOAT_VEC4; @@ -641,13 +650,13 @@ define([ return WebGLConstants.FLOAT; case 'transparency': return WebGLConstants.FLOAT; - + // these two are usually not used directly within shaders, // they are just added here for completeness case 'transparent': - return WebGLConstants.BOOL; + return WebGLConstants.BOOL; case 'doubleSided': - return WebGLConstants.BOOL; + return WebGLConstants.BOOL; } } @@ -683,11 +692,13 @@ define([ * * @private */ - function modelMaterialsCommon(gltf) { + function modelMaterialsCommon(gltf, options) { if (!defined(gltf)) { return undefined; } + options = defaultValue(options, defaultValue.EMPTY_OBJECT); + var hasExtension = false; var extensionsUsed = gltf.extensionsUsed; if (defined(extensionsUsed)) { @@ -714,6 +725,9 @@ define([ var lightParameters = generateLightParameters(gltf); + var hasCesiumRTCExtension = defined(gltf.extensions) && defined(gltf.extensions.CESIUM_RTC); + var addBatchIdToGeneratedShaders = defaultValue(options.addBatchIdToGeneratedShaders, false); + var techniques = {}; var materials = gltf.materials; for (var name in materials) { @@ -724,7 +738,10 @@ define([ var techniqueKey = getTechniqueKey(khrMaterialsCommon); var technique = techniques[techniqueKey]; if (!defined(technique)) { - technique = generateTechnique(gltf, khrMaterialsCommon, lightParameters); + technique = generateTechnique(gltf, khrMaterialsCommon, lightParameters, { + addBatchIdToGeneratedShaders : addBatchIdToGeneratedShaders, + useCesiumRTCMatrixInShaders : hasCesiumRTCExtension + }); techniques[techniqueKey] = technique; } diff --git a/Source/Shaders/BillboardCollectionVS.glsl b/Source/Shaders/BillboardCollectionVS.glsl index 3961f5b1c448..9bea70b87595 100644 --- a/Source/Shaders/BillboardCollectionVS.glsl +++ b/Source/Shaders/BillboardCollectionVS.glsl @@ -39,7 +39,9 @@ const float SHIFT_RIGHT1 = 1.0 / 2.0; vec4 computePositionWindowCoordinates(vec4 positionEC, vec2 imageSize, float scale, vec2 direction, vec2 origin, vec2 translate, vec2 pixelOffset, vec3 alignedAxis, bool validAlignedAxis, float rotation, bool sizeInMeters) { - vec2 halfSize = imageSize * scale * czm_resolutionScale; + // Note the halfSize cannot be computed in JavaScript because it is sent via + // compressed vertex attributes that coerce it to an integer. + vec2 halfSize = imageSize * scale * czm_resolutionScale * 0.5; halfSize *= ((direction * 2.0) - 1.0); vec2 originTranslate = origin * abs(halfSize); diff --git a/Source/Shaders/Builtin/Functions/octDecode.glsl b/Source/Shaders/Builtin/Functions/octDecode.glsl index 4fe85a220bb6..ce4df362da12 100644 --- a/Source/Shaders/Builtin/Functions/octDecode.glsl +++ b/Source/Shaders/Builtin/Functions/octDecode.glsl @@ -1,3 +1,29 @@ + /** + * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. + * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", + * Cigolle et al 2014: http://jcgt.org/published/0003/02/01/ + * + * @name czm_octDecode + * @param {vec2} encoded The oct-encoded, unit-length vector + * @param {float} range The maximum value of the SNORM range. The encoded vector is stored in log2(rangeMax+1) bits. + * @returns {vec3} The decoded and normalized vector + */ + vec3 czm_octDecode(vec2 encoded, float range) + { + if (encoded.x == 0.0 && encoded.y == 0.0) { + return vec3(0.0, 0.0, 0.0); + } + + encoded = encoded / range * 2.0 - 1.0; + vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); + if (v.z < 0.0) + { + v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); + } + + return normalize(v); + } + /** * Decodes a unit-length vector in 'oct' encoding to a normalized 3-component Cartesian vector. * The 'oct' encoding is described in "A Survey of Efficient Representations of Independent Unit Vectors", @@ -9,14 +35,7 @@ */ vec3 czm_octDecode(vec2 encoded) { - encoded = encoded / 255.0 * 2.0 - 1.0; - vec3 v = vec3(encoded.x, encoded.y, 1.0 - abs(encoded.x) - abs(encoded.y)); - if (v.z < 0.0) - { - v.xy = (1.0 - abs(v.yx)) * czm_signNotZero(v.xy); - } - - return normalize(v); + return czm_octDecode(encoded, 255.0); } /** diff --git a/Source/Shaders/ShadowVolumeVS.glsl b/Source/Shaders/ShadowVolumeVS.glsl index a97b96c1752b..888eca6500dd 100644 --- a/Source/Shaders/ShadowVolumeVS.glsl +++ b/Source/Shaders/ShadowVolumeVS.glsl @@ -1,8 +1,11 @@ attribute vec3 position3DHigh; attribute vec3 position3DLow; +attribute vec3 extrudeDirection; attribute vec4 color; attribute float batchId; +uniform float u_globeMinimumAltitude; + // emulated noperspective varying float v_WindowZ; varying vec4 v_color; @@ -17,7 +20,11 @@ vec4 depthClampFarPlane(vec4 vertexInClipCoordinates) void main() { v_color = color; - + vec4 position = czm_computePosition(); + float delta = min(u_globeMinimumAltitude, czm_geometricToleranceOverMeter * length(position.xyz)); + + //extrudeDirection is zero for the top layer + position = position + vec4(extrudeDirection * delta, 0.0); gl_Position = depthClampFarPlane(czm_modelViewProjectionRelativeToEye * position); } diff --git a/Source/ThirdParty/crunch.js b/Source/ThirdParty/crunch.js new file mode 100644 index 000000000000..9bc5362a1ce9 --- /dev/null +++ b/Source/ThirdParty/crunch.js @@ -0,0 +1,57 @@ +/** + * @licence + * + * crunch/crnlib v1.04 - Advanced DXTn texture compression library + * Copyright (C) 2010-2016 Richard Geldreich, Jr. and Binomial LLC http://binomial.info + */ + +/** + * @license + * + * crunch_lib.cpp + * + * Copyright (c) 2013, Evan Parker, Brandon Jones. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +// The C++ code was compiled to Javascript with Emcripten. +// For instructions, see: +// https://github.com/AnalyticalGraphicsInc/crunch + +/*global define*/ +define([], function() { + + var Module;if(!Module)Module=(typeof Module!=="undefined"?Module:null)||{};var moduleOverrides={};for(var key in Module){if(Module.hasOwnProperty(key)){moduleOverrides[key]=Module[key]}}var ENVIRONMENT_IS_WEB=typeof window==="object";var ENVIRONMENT_IS_WORKER=typeof importScripts==="function";var ENVIRONMENT_IS_NODE=typeof process==="object"&&typeof require==="function"&&!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_WORKER;var ENVIRONMENT_IS_SHELL=!ENVIRONMENT_IS_WEB&&!ENVIRONMENT_IS_NODE&&!ENVIRONMENT_IS_WORKER;if(ENVIRONMENT_IS_NODE){if(!Module["print"])Module["print"]=function print(x){process["stdout"].write(x+"\n")};if(!Module["printErr"])Module["printErr"]=function printErr(x){process["stderr"].write(x+"\n")};var nodeFS=require("fs");var nodePath=require("path");Module["read"]=function read(filename,binary){filename=nodePath["normalize"](filename);var ret=nodeFS["readFileSync"](filename);if(!ret&&filename!=nodePath["resolve"](filename)){filename=path.join(__dirname,"..","src",filename);ret=nodeFS["readFileSync"](filename)}if(ret&&!binary)ret=ret.toString();return ret};Module["readBinary"]=function readBinary(filename){var ret=Module["read"](filename,true);if(!ret.buffer){ret=new Uint8Array(ret)}assert(ret.buffer);return ret};Module["load"]=function load(f){globalEval(read(f))};if(!Module["thisProgram"]){if(process["argv"].length>1){Module["thisProgram"]=process["argv"][1].replace(/\\/g,"/")}else{Module["thisProgram"]="unknown-program"}}Module["arguments"]=process["argv"].slice(2);if(typeof module!=="undefined"){module["exports"]=Module}process["on"]("uncaughtException",(function(ex){if(!(ex instanceof ExitStatus)){throw ex}}));Module["inspect"]=(function(){return"[Emscripten Module object]"})}else if(ENVIRONMENT_IS_SHELL){if(!Module["print"])Module["print"]=print;if(typeof printErr!="undefined")Module["printErr"]=printErr;if(typeof read!="undefined"){Module["read"]=read}else{Module["read"]=function read(){throw"no read() available (jsc?)"}}Module["readBinary"]=function readBinary(f){if(typeof readbuffer==="function"){return new Uint8Array(readbuffer(f))}var data=read(f,"binary");assert(typeof data==="object");return data};if(typeof scriptArgs!="undefined"){Module["arguments"]=scriptArgs}else if(typeof arguments!="undefined"){Module["arguments"]=arguments}}else if(ENVIRONMENT_IS_WEB||ENVIRONMENT_IS_WORKER){Module["read"]=function read(url){var xhr=new XMLHttpRequest;xhr.open("GET",url,false);xhr.send(null);return xhr.responseText};if(typeof arguments!="undefined"){Module["arguments"]=arguments}if(typeof console!=="undefined"){if(!Module["print"])Module["print"]=function print(x){console.log(x)};if(!Module["printErr"])Module["printErr"]=function printErr(x){console.log(x)}}else{var TRY_USE_DUMP=false;if(!Module["print"])Module["print"]=TRY_USE_DUMP&&typeof dump!=="undefined"?(function(x){dump(x)}):(function(x){})}if(ENVIRONMENT_IS_WORKER){Module["load"]=importScripts}if(typeof Module["setWindowTitle"]==="undefined"){Module["setWindowTitle"]=(function(title){document.title=title})}}else{throw"Unknown runtime environment. Where are we?"}function globalEval(x){eval.call(null,x)}if(!Module["load"]&&Module["read"]){Module["load"]=function load(f){globalEval(Module["read"](f))}}if(!Module["print"]){Module["print"]=(function(){})}if(!Module["printErr"]){Module["printErr"]=Module["print"]}if(!Module["arguments"]){Module["arguments"]=[]}if(!Module["thisProgram"]){Module["thisProgram"]="./this.program"}Module.print=Module["print"];Module.printErr=Module["printErr"];Module["preRun"]=[];Module["postRun"]=[];for(var key in moduleOverrides){if(moduleOverrides.hasOwnProperty(key)){Module[key]=moduleOverrides[key]}}var Runtime={setTempRet0:(function(value){tempRet0=value}),getTempRet0:(function(){return tempRet0}),stackSave:(function(){return STACKTOP}),stackRestore:(function(stackTop){STACKTOP=stackTop}),getNativeTypeSize:(function(type){switch(type){case"i1":case"i8":return 1;case"i16":return 2;case"i32":return 4;case"i64":return 8;case"float":return 4;case"double":return 8;default:{if(type[type.length-1]==="*"){return Runtime.QUANTUM_SIZE}else if(type[0]==="i"){var bits=parseInt(type.substr(1));assert(bits%8===0);return bits/8}else{return 0}}}}),getNativeFieldSize:(function(type){return Math.max(Runtime.getNativeTypeSize(type),Runtime.QUANTUM_SIZE)}),STACK_ALIGN:16,prepVararg:(function(ptr,type){if(type==="double"||type==="i64"){if(ptr&7){assert((ptr&7)===4);ptr+=4}}else{assert((ptr&3)===0)}return ptr}),getAlignSize:(function(type,size,vararg){if(!vararg&&(type=="i64"||type=="double"))return 8;if(!type)return Math.min(size,8);return Math.min(size||(type?Runtime.getNativeFieldSize(type):0),Runtime.QUANTUM_SIZE)}),dynCall:(function(sig,ptr,args){if(args&&args.length){if(!args.splice)args=Array.prototype.slice.call(args);args.splice(0,0,ptr);return Module["dynCall_"+sig].apply(null,args)}else{return Module["dynCall_"+sig].call(null,ptr)}}),functionPointers:[],addFunction:(function(func){for(var i=0;i=TOTAL_MEMORY){var success=enlargeMemory();if(!success){DYNAMICTOP=ret;return 0}}return ret}),alignMemory:(function(size,quantum){var ret=size=Math.ceil(size/(quantum?quantum:16))*(quantum?quantum:16);return ret}),makeBigInt:(function(low,high,unsigned){var ret=unsigned?+(low>>>0)+ +(high>>>0)*+4294967296:+(low>>>0)+ +(high|0)*+4294967296;return ret}),GLOBAL_BASE:8,QUANTUM_SIZE:4,__dummy__:0};Module["Runtime"]=Runtime;var __THREW__=0;var ABORT=false;var EXITSTATUS=0;var undef=0;var tempValue,tempInt,tempBigInt,tempInt2,tempBigInt2,tempPair,tempBigIntI,tempBigIntR,tempBigIntS,tempBigIntP,tempBigIntD,tempDouble,tempFloat;var tempI64,tempI64b;var tempRet0,tempRet1,tempRet2,tempRet3,tempRet4,tempRet5,tempRet6,tempRet7,tempRet8,tempRet9;function assert(condition,text){if(!condition){abort("Assertion failed: "+text)}}var globalScope=this;function getCFunc(ident){var func=Module["_"+ident];if(!func){try{func=eval("_"+ident)}catch(e){}}assert(func,"Cannot call unknown function "+ident+" (perhaps LLVM optimizations or closure removed it?)");return func}var cwrap,ccall;((function(){var JSfuncs={"stackSave":(function(){Runtime.stackSave()}),"stackRestore":(function(){Runtime.stackRestore()}),"arrayToC":(function(arr){var ret=Runtime.stackAlloc(arr.length);writeArrayToMemory(arr,ret);return ret}),"stringToC":(function(str){var ret=0;if(str!==null&&str!==undefined&&str!==0){ret=Runtime.stackAlloc((str.length<<2)+1);writeStringToMemory(str,ret)}return ret})};var toC={"string":JSfuncs["stringToC"],"array":JSfuncs["arrayToC"]};ccall=function ccallFunc(ident,returnType,argTypes,args,opts){var func=getCFunc(ident);var cArgs=[];var stack=0;if(args){for(var i=0;i>0]=value;break;case"i8":HEAP8[ptr>>0]=value;break;case"i16":HEAP16[ptr>>1]=value;break;case"i32":HEAP32[ptr>>2]=value;break;case"i64":tempI64=[value>>>0,(tempDouble=value,+Math_abs(tempDouble)>=+1?tempDouble>+0?(Math_min(+Math_floor(tempDouble/+4294967296),+4294967295)|0)>>>0:~~+Math_ceil((tempDouble- +(~~tempDouble>>>0))/+4294967296)>>>0:0)],HEAP32[ptr>>2]=tempI64[0],HEAP32[ptr+4>>2]=tempI64[1];break;case"float":HEAPF32[ptr>>2]=value;break;case"double":HEAPF64[ptr>>3]=value;break;default:abort("invalid type for setValue: "+type)}}Module["setValue"]=setValue;function getValue(ptr,type,noSafe){type=type||"i8";if(type.charAt(type.length-1)==="*")type="i32";switch(type){case"i1":return HEAP8[ptr>>0];case"i8":return HEAP8[ptr>>0];case"i16":return HEAP16[ptr>>1];case"i32":return HEAP32[ptr>>2];case"i64":return HEAP32[ptr>>2];case"float":return HEAPF32[ptr>>2];case"double":return HEAPF64[ptr>>3];default:abort("invalid type for setValue: "+type)}return null}Module["getValue"]=getValue;var ALLOC_NORMAL=0;var ALLOC_STACK=1;var ALLOC_STATIC=2;var ALLOC_DYNAMIC=3;var ALLOC_NONE=4;Module["ALLOC_NORMAL"]=ALLOC_NORMAL;Module["ALLOC_STACK"]=ALLOC_STACK;Module["ALLOC_STATIC"]=ALLOC_STATIC;Module["ALLOC_DYNAMIC"]=ALLOC_DYNAMIC;Module["ALLOC_NONE"]=ALLOC_NONE;function allocate(slab,types,allocator,ptr){var zeroinit,size;if(typeof slab==="number"){zeroinit=true;size=slab}else{zeroinit=false;size=slab.length}var singleType=typeof types==="string"?types:null;var ret;if(allocator==ALLOC_NONE){ret=ptr}else{ret=[_malloc,Runtime.stackAlloc,Runtime.staticAlloc,Runtime.dynamicAlloc][allocator===undefined?ALLOC_STATIC:allocator](Math.max(size,singleType?1:types.length))}if(zeroinit){var ptr=ret,stop;assert((ret&3)==0);stop=ret+(size&~3);for(;ptr>2]=0}stop=ret+size;while(ptr>0]=0}return ret}if(singleType==="i8"){if(slab.subarray||slab.slice){HEAPU8.set(slab,ret)}else{HEAPU8.set(new Uint8Array(slab),ret)}return ret}var i=0,type,typeSize,previousType;while(i>0];hasUtf|=t;if(t==0&&!length)break;i++;if(length&&i==length)break}if(!length)length=i;var ret="";if(hasUtf<128){var MAX_CHUNK=1024;var curr;while(length>0){curr=String.fromCharCode.apply(String,HEAPU8.subarray(ptr,ptr+Math.min(length,MAX_CHUNK)));ret=ret?ret+curr:curr;ptr+=MAX_CHUNK;length-=MAX_CHUNK}return ret}return Module["UTF8ToString"](ptr)}Module["Pointer_stringify"]=Pointer_stringify;function AsciiToString(ptr){var str="";while(1){var ch=HEAP8[ptr++>>0];if(!ch)return str;str+=String.fromCharCode(ch)}}Module["AsciiToString"]=AsciiToString;function stringToAscii(str,outPtr){return writeAsciiToMemory(str,outPtr,false)}Module["stringToAscii"]=stringToAscii;function UTF8ArrayToString(u8Array,idx){var u0,u1,u2,u3,u4,u5;var str="";while(1){u0=u8Array[idx++];if(!u0)return str;if(!(u0&128)){str+=String.fromCharCode(u0);continue}u1=u8Array[idx++]&63;if((u0&224)==192){str+=String.fromCharCode((u0&31)<<6|u1);continue}u2=u8Array[idx++]&63;if((u0&240)==224){u0=(u0&15)<<12|u1<<6|u2}else{u3=u8Array[idx++]&63;if((u0&248)==240){u0=(u0&7)<<18|u1<<12|u2<<6|u3}else{u4=u8Array[idx++]&63;if((u0&252)==248){u0=(u0&3)<<24|u1<<18|u2<<12|u3<<6|u4}else{u5=u8Array[idx++]&63;u0=(u0&1)<<30|u1<<24|u2<<18|u3<<12|u4<<6|u5}}}if(u0<65536){str+=String.fromCharCode(u0)}else{var ch=u0-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}}}Module["UTF8ArrayToString"]=UTF8ArrayToString;function UTF8ToString(ptr){return UTF8ArrayToString(HEAPU8,ptr)}Module["UTF8ToString"]=UTF8ToString;function stringToUTF8Array(str,outU8Array,outIdx,maxBytesToWrite){if(!(maxBytesToWrite>0))return 0;var startIdx=outIdx;var endIdx=outIdx+maxBytesToWrite-1;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){if(outIdx>=endIdx)break;outU8Array[outIdx++]=u}else if(u<=2047){if(outIdx+1>=endIdx)break;outU8Array[outIdx++]=192|u>>6;outU8Array[outIdx++]=128|u&63}else if(u<=65535){if(outIdx+2>=endIdx)break;outU8Array[outIdx++]=224|u>>12;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=2097151){if(outIdx+3>=endIdx)break;outU8Array[outIdx++]=240|u>>18;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else if(u<=67108863){if(outIdx+4>=endIdx)break;outU8Array[outIdx++]=248|u>>24;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}else{if(outIdx+5>=endIdx)break;outU8Array[outIdx++]=252|u>>30;outU8Array[outIdx++]=128|u>>24&63;outU8Array[outIdx++]=128|u>>18&63;outU8Array[outIdx++]=128|u>>12&63;outU8Array[outIdx++]=128|u>>6&63;outU8Array[outIdx++]=128|u&63}}outU8Array[outIdx]=0;return outIdx-startIdx}Module["stringToUTF8Array"]=stringToUTF8Array;function stringToUTF8(str,outPtr,maxBytesToWrite){return stringToUTF8Array(str,HEAPU8,outPtr,maxBytesToWrite)}Module["stringToUTF8"]=stringToUTF8;function lengthBytesUTF8(str){var len=0;for(var i=0;i=55296&&u<=57343)u=65536+((u&1023)<<10)|str.charCodeAt(++i)&1023;if(u<=127){++len}else if(u<=2047){len+=2}else if(u<=65535){len+=3}else if(u<=2097151){len+=4}else if(u<=67108863){len+=5}else{len+=6}}return len}Module["lengthBytesUTF8"]=lengthBytesUTF8;function UTF16ToString(ptr){var i=0;var str="";while(1){var codeUnit=HEAP16[ptr+i*2>>1];if(codeUnit==0)return str;++i;str+=String.fromCharCode(codeUnit)}}Module["UTF16ToString"]=UTF16ToString;function stringToUTF16(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<2)return 0;maxBytesToWrite-=2;var startPtr=outPtr;var numCharsToWrite=maxBytesToWrite>1]=codeUnit;outPtr+=2}HEAP16[outPtr>>1]=0;return outPtr-startPtr}Module["stringToUTF16"]=stringToUTF16;function lengthBytesUTF16(str){return str.length*2}Module["lengthBytesUTF16"]=lengthBytesUTF16;function UTF32ToString(ptr){var i=0;var str="";while(1){var utf32=HEAP32[ptr+i*4>>2];if(utf32==0)return str;++i;if(utf32>=65536){var ch=utf32-65536;str+=String.fromCharCode(55296|ch>>10,56320|ch&1023)}else{str+=String.fromCharCode(utf32)}}}Module["UTF32ToString"]=UTF32ToString;function stringToUTF32(str,outPtr,maxBytesToWrite){if(maxBytesToWrite===undefined){maxBytesToWrite=2147483647}if(maxBytesToWrite<4)return 0;var startPtr=outPtr;var endPtr=startPtr+maxBytesToWrite-4;for(var i=0;i=55296&&codeUnit<=57343){var trailSurrogate=str.charCodeAt(++i);codeUnit=65536+((codeUnit&1023)<<10)|trailSurrogate&1023}HEAP32[outPtr>>2]=codeUnit;outPtr+=4;if(outPtr+4>endPtr)break}HEAP32[outPtr>>2]=0;return outPtr-startPtr}Module["stringToUTF32"]=stringToUTF32;function lengthBytesUTF32(str){var len=0;for(var i=0;i=55296&&codeUnit<=57343)++i;len+=4}return len}Module["lengthBytesUTF32"]=lengthBytesUTF32;function demangle(func){var hasLibcxxabi=!!Module["___cxa_demangle"];if(hasLibcxxabi){try{var buf=_malloc(func.length);writeStringToMemory(func.substr(1),buf);var status=_malloc(4);var ret=Module["___cxa_demangle"](buf,0,0,status);if(getValue(status,"i32")===0&&ret){return Pointer_stringify(ret)}}catch(e){}finally{if(buf)_free(buf);if(status)_free(status);if(ret)_free(ret)}}var i=3;var basicTypes={"v":"void","b":"bool","c":"char","s":"short","i":"int","l":"long","f":"float","d":"double","w":"wchar_t","a":"signed char","h":"unsigned char","t":"unsigned short","j":"unsigned int","m":"unsigned long","x":"long long","y":"unsigned long long","z":"..."};var subs=[];var first=true;function dump(x){if(x)Module.print(x);Module.print(func);var pre="";for(var a=0;a"}else{ret=name}paramLoop:while(i0){var c=func[i++];if(c in basicTypes){list.push(basicTypes[c])}else{switch(c){case"P":list.push(parse(true,1,true)[0]+"*");break;case"R":list.push(parse(true,1,true)[0]+"&");break;case"L":{i++;var end=func.indexOf("E",i);var size=end-i;list.push(func.substr(i,size));i+=size+2;break};case"A":{var size=parseInt(func.substr(i));i+=size.toString().length;if(func[i]!=="_")throw"?";i++;list.push(parse(true,1,true)[0]+" ["+size+"]");break};case"E":break paramLoop;default:ret+="?"+c;break paramLoop}}}if(!allowVoid&&list.length===1&&list[0]==="void")list=[];if(rawList){if(ret){list.push(ret+"?")}return list}else{return ret+flushList()}}var parsed=func;try{if(func=="Object._main"||func=="_main"){return"main()"}if(typeof func==="number")func=Pointer_stringify(func);if(func[0]!=="_")return func;if(func[1]!=="_")return func;if(func[2]!=="Z")return func;switch(func[3]){case"n":return"operator new()";case"d":return"operator delete()"}parsed=parse()}catch(e){parsed+="?"}if(parsed.indexOf("?")>=0&&!hasLibcxxabi){Runtime.warnOnce("warning: a problem occurred in builtin C++ name demangling; build with -s DEMANGLE_SUPPORT=1 to link in libcxxabi demangling")}return parsed}function demangleAll(text){return text.replace(/__Z[\w\d_]+/g,(function(x){var y=demangle(x);return x===y?x:x+" ["+y+"]"}))}function jsStackTrace(){var err=new Error;if(!err.stack){try{throw new Error(0)}catch(e){err=e}if(!err.stack){return"(no stack trace available)"}}return err.stack.toString()}function stackTrace(){return demangleAll(jsStackTrace())}Module["stackTrace"]=stackTrace;var PAGE_SIZE=4096;function alignMemoryPage(x){if(x%4096>0){x+=4096-x%4096}return x}var HEAP;var HEAP8,HEAPU8,HEAP16,HEAPU16,HEAP32,HEAPU32,HEAPF32,HEAPF64;var STATIC_BASE=0,STATICTOP=0,staticSealed=false;var STACK_BASE=0,STACKTOP=0,STACK_MAX=0;var DYNAMIC_BASE=0,DYNAMICTOP=0;function enlargeMemory(){var OLD_TOTAL_MEMORY=TOTAL_MEMORY;var LIMIT=Math.pow(2,31);if(DYNAMICTOP>=LIMIT)return false;while(TOTAL_MEMORY<=DYNAMICTOP){if(TOTAL_MEMORY=LIMIT)return false;try{if(ArrayBuffer.transfer){buffer=ArrayBuffer.transfer(buffer,TOTAL_MEMORY)}else{var oldHEAP8=HEAP8;buffer=new ArrayBuffer(TOTAL_MEMORY)}}catch(e){return false}var success=_emscripten_replace_memory(buffer);if(!success)return false;Module["buffer"]=buffer;Module["HEAP8"]=HEAP8=new Int8Array(buffer);Module["HEAP16"]=HEAP16=new Int16Array(buffer);Module["HEAP32"]=HEAP32=new Int32Array(buffer);Module["HEAPU8"]=HEAPU8=new Uint8Array(buffer);Module["HEAPU16"]=HEAPU16=new Uint16Array(buffer);Module["HEAPU32"]=HEAPU32=new Uint32Array(buffer);Module["HEAPF32"]=HEAPF32=new Float32Array(buffer);Module["HEAPF64"]=HEAPF64=new Float64Array(buffer);if(!ArrayBuffer.transfer){HEAP8.set(oldHEAP8)}return true}var byteLength;try{byteLength=Function.prototype.call.bind(Object.getOwnPropertyDescriptor(ArrayBuffer.prototype,"byteLength").get);byteLength(new ArrayBuffer(4))}catch(e){byteLength=(function(buffer){return buffer.byteLength})}var TOTAL_STACK=Module["TOTAL_STACK"]||5242880;var TOTAL_MEMORY=Module["TOTAL_MEMORY"]||16777216;var totalMemory=64*1024;while(totalMemory0){var callback=callbacks.shift();if(typeof callback=="function"){callback();continue}var func=callback.func;if(typeof func==="number"){if(callback.arg===undefined){Runtime.dynCall("v",func)}else{Runtime.dynCall("vi",func,[callback.arg])}}else{func(callback.arg===undefined?null:callback.arg)}}}var __ATPRERUN__=[];var __ATINIT__=[];var __ATMAIN__=[];var __ATEXIT__=[];var __ATPOSTRUN__=[];var runtimeInitialized=false;var runtimeExited=false;function preRun(){if(Module["preRun"]){if(typeof Module["preRun"]=="function")Module["preRun"]=[Module["preRun"]];while(Module["preRun"].length){addOnPreRun(Module["preRun"].shift())}}callRuntimeCallbacks(__ATPRERUN__)}function ensureInitRuntime(){if(runtimeInitialized)return;runtimeInitialized=true;callRuntimeCallbacks(__ATINIT__)}function preMain(){callRuntimeCallbacks(__ATMAIN__)}function exitRuntime(){callRuntimeCallbacks(__ATEXIT__);runtimeExited=true}function postRun(){if(Module["postRun"]){if(typeof Module["postRun"]=="function")Module["postRun"]=[Module["postRun"]];while(Module["postRun"].length){addOnPostRun(Module["postRun"].shift())}}callRuntimeCallbacks(__ATPOSTRUN__)}function addOnPreRun(cb){__ATPRERUN__.unshift(cb)}Module["addOnPreRun"]=addOnPreRun;function addOnInit(cb){__ATINIT__.unshift(cb)}Module["addOnInit"]=addOnInit;function addOnPreMain(cb){__ATMAIN__.unshift(cb)}Module["addOnPreMain"]=addOnPreMain;function addOnExit(cb){__ATEXIT__.unshift(cb)}Module["addOnExit"]=addOnExit;function addOnPostRun(cb){__ATPOSTRUN__.unshift(cb)}Module["addOnPostRun"]=addOnPostRun;function intArrayFromString(stringy,dontAddNull,length){var len=length>0?length:lengthBytesUTF8(stringy)+1;var u8array=new Array(len);var numBytesWritten=stringToUTF8Array(stringy,u8array,0,u8array.length);if(dontAddNull)u8array.length=numBytesWritten;return u8array}Module["intArrayFromString"]=intArrayFromString;function intArrayToString(array){var ret=[];for(var i=0;i255){chr&=255}ret.push(String.fromCharCode(chr))}return ret.join("")}Module["intArrayToString"]=intArrayToString;function writeStringToMemory(string,buffer,dontAddNull){var array=intArrayFromString(string,dontAddNull);var i=0;while(i>0]=chr;i=i+1}}Module["writeStringToMemory"]=writeStringToMemory;function writeArrayToMemory(array,buffer){for(var i=0;i>0]=array[i]}}Module["writeArrayToMemory"]=writeArrayToMemory;function writeAsciiToMemory(str,buffer,dontAddNull){for(var i=0;i>0]=str.charCodeAt(i)}if(!dontAddNull)HEAP8[buffer>>0]=0}Module["writeAsciiToMemory"]=writeAsciiToMemory;function unSign(value,bits,ignore){if(value>=0){return value}return bits<=32?2*Math.abs(1<=half&&(bits<=32||value>half)){value=-2*half+value}return value}if(!Math["imul"]||Math["imul"](4294967295,5)!==-5)Math["imul"]=function imul(a,b){var ah=a>>>16;var al=a&65535;var bh=b>>>16;var bl=b&65535;return al*bl+(ah*bl+al*bh<<16)|0};Math.imul=Math["imul"];if(!Math["clz32"])Math["clz32"]=(function(x){x=x>>>0;for(var i=0;i<32;i++){if(x&1<<31-i)return i}return 32});Math.clz32=Math["clz32"];var Math_abs=Math.abs;var Math_cos=Math.cos;var Math_sin=Math.sin;var Math_tan=Math.tan;var Math_acos=Math.acos;var Math_asin=Math.asin;var Math_atan=Math.atan;var Math_atan2=Math.atan2;var Math_exp=Math.exp;var Math_log=Math.log;var Math_sqrt=Math.sqrt;var Math_ceil=Math.ceil;var Math_floor=Math.floor;var Math_pow=Math.pow;var Math_imul=Math.imul;var Math_fround=Math.fround;var Math_min=Math.min;var Math_clz32=Math.clz32;var runDependencies=0;var runDependencyWatcher=null;var dependenciesFulfilled=null;function getUniqueRunDependency(id){return id}function addRunDependency(id){runDependencies++;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}}Module["addRunDependency"]=addRunDependency;function removeRunDependency(id){runDependencies--;if(Module["monitorRunDependencies"]){Module["monitorRunDependencies"](runDependencies)}if(runDependencies==0){if(runDependencyWatcher!==null){clearInterval(runDependencyWatcher);runDependencyWatcher=null}if(dependenciesFulfilled){var callback=dependenciesFulfilled;dependenciesFulfilled=null;callback()}}}Module["removeRunDependency"]=removeRunDependency;Module["preloadedImages"]={};Module["preloadedAudios"]={};var memoryInitializer=null;var ASM_CONSTS=[];STATIC_BASE=8;STATICTOP=STATIC_BASE+5888;__ATINIT__.push();allocate([116,0,0,0,86,7,0,0,116,0,0,0,99,7,0,0,156,0,0,0,112,7,0,0,16,0,0,0,0,0,0,0,156,0,0,0,145,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,215,7,0,0,24,0,0,0,0,0,0,0,156,0,0,0,179,7,0,0,56,0,0,0,0,0,0,0,156,0,0,0,249,7,0,0,40,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,40,0,0,0,1,0,0,0,2,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,88,0,0,0,1,0,0,0,5,0,0,0,3,0,0,0,4,0,0,0,1,0,0,0,2,0,0,0,2,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,108,1,0,0,220,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,0,0,0,4,0,0,0,227,20,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,0,0,0,4,0,0,0,219,16,0,0,0,4,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,37,115,40,37,117,41,58,32,65,115,115,101,114,116,105,111,110,32,102,97,105,108,117,114,101,58,32,34,37,115,34,10,0,109,95,115,105,122,101,32,60,61,32,109,95,99,97,112,97,99,105,116,121,0,46,47,105,110,99,92,99,114,110,95,100,101,99,111,109,112,46,104,0,109,105,110,95,110,101,119,95,99,97,112,97,99,105,116,121,32,60,32,40,48,120,55,70,70,70,48,48,48,48,85,32,47,32,101,108,101,109,101,110,116,95,115,105,122,101,41,0,110,101,119,95,99,97,112,97,99,105,116,121,32,38,38,32,40,110,101,119,95,99,97,112,97,99,105,116,121,32,62,32,109,95,99,97,112,97,99,105,116,121,41,0,110,117,109,95,99,111,100,101,115,91,99,93,0,115,111,114,116,101,100,95,112,111,115,32,60,32,116,111,116,97,108,95,117,115,101,100,95,115,121,109,115,0,112,67,111,100,101,115,105,122,101,115,91,115,121,109,95,105,110,100,101,120,93,32,61,61,32,99,111,100,101,115,105,122,101,0,116,32,60,32,40,49,85,32,60,60,32,116,97,98,108,101,95,98,105,116,115,41,0,109,95,108,111,111,107,117,112,91,116,93,32,61,61,32,99,85,73,78,84,51,50,95,77,65,88,0,99,114,110,100,95,109,97,108,108,111,99,58,32,115,105,122,101,32,116,111,111,32,98,105,103,0,99,114,110,100,95,109,97,108,108,111,99,58,32,111,117,116,32,111,102,32,109,101,109,111,114,121,0,40,40,117,105,110,116,51,50,41,112,95,110,101,119,32,38,32,40,67,82,78,68,95,77,73,78,95,65,76,76,79,67,95,65,76,73,71,78,77,69,78,84,32,45,32,49,41,41,32,61,61,32,48,0,99,114,110,100,95,114,101,97,108,108,111,99,58,32,98,97,100,32,112,116,114,0,99,114,110,100,95,102,114,101,101,58,32,98,97,100,32,112,116,114,0,102,97,108,115,101,0,40,116,111,116,97,108,95,115,121,109,115,32,62,61,32,49,41,32,38,38,32,40,116,111,116,97,108,95,115,121,109,115,32,60,61,32,112,114,101,102,105,120,95,99,111,100,105,110,103,58,58,99,77,97,120,83,117,112,112,111,114,116,101,100,83,121,109,115,41,0,17,18,19,20,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15,16,48,0,110,117,109,95,98,105,116,115,32,60,61,32,51,50,85,0,109,95,98,105,116,95,99,111,117,110,116,32,60,61,32,99,66,105,116,66,117,102,83,105,122,101,0,116,32,33,61,32,99,85,73,78,84,51,50,95,77,65,88,0,109,111,100,101,108,46,109,95,99,111,100,101,95,115,105,122,101,115,91,115,121,109,93,32,61,61,32,108,101,110,0,0,2,3,1,0,2,3,4,5,6,7,1,40,108,101,110,32,62,61,32,49,41,32,38,38,32,40,108,101,110,32,60,61,32,99,77,97,120,69,120,112,101,99,116,101,100,67,111,100,101,83,105,122,101,41,0,105,32,60,32,109,95,115,105,122,101,0,110,101,120,116,95,108,101,118,101,108,95,111,102,115,32,62,32,99,117,114,95,108,101,118,101,108,95,111,102,115,0,1,2,2,3,3,3,3,4,0,0,0,0,0,0,1,1,0,1,0,1,0,0,1,2,1,2,0,0,0,1,0,2,1,0,2,0,0,1,2,3,110,117,109,32,38,38,32,40,110,117,109,32,61,61,32,126,110,117,109,95,99,104,101,99,107,41,0,83,116,57,101,120,99,101,112,116,105,111,110,0,83,116,57,116,121,112,101,95,105,110,102,111,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,54,95,95,115,104,105,109,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,57,95,95,112,111,105,110,116,101,114,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,49,55,95,95,112,98,97,115,101,95,116,121,112,101,95,105,110,102,111,69,0,78,49,48,95,95,99,120,120,97,98,105,118,49,50,48,95,95,115,105,95,99,108,97,115,115,95,116,121,112,101,95,105,110,102,111,69,0,112,116,104,114,101,97,100,95,111,110,99,101,32,102,97,105,108,117,114,101,32,105,110,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,95,102,97,115,116,40,41,0,116,101,114,109,105,110,97,116,101,95,104,97,110,100,108,101,114,32,117,110,101,120,112,101,99,116,101,100,108,121,32,114,101,116,117,114,110,101,100,0,99,97,110,110,111,116,32,99,114,101,97,116,101,32,112,116,104,114,101,97,100,32,107,101,121,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,99,97,110,110,111,116,32,122,101,114,111,32,111,117,116,32,116,104,114,101,97,100,32,118,97,108,117,101,32,102,111,114,32,95,95,99,120,97,95,103,101,116,95,103,108,111,98,97,108,115,40,41,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,58,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,101,120,99,101,112,116,105,111,110,32,111,102,32,116,121,112,101,32,37,115,0,116,101,114,109,105,110,97,116,105,110,103,32,119,105,116,104,32,37,115,32,102,111,114,101,105,103,110,32,101,120,99,101,112,116,105,111,110,0,116,101,114,109,105,110,97,116,105,110,103,0,117,110,99,97,117,103,104,116,0,84,33,34,25,13,1,2,3,17,75,28,12,16,4,11,29,18,30,39,104,110,111,112,113,98,32,5,6,15,19,20,21,26,8,22,7,40,36,23,24,9,10,14,27,31,37,35,131,130,125,38,42,43,60,61,62,63,67,71,74,77,88,89,90,91,92,93,94,95,96,97,99,100,101,102,103,105,106,107,108,114,115,116,121,122,123,124,0,73,108,108,101,103,97,108,32,98,121,116,101,32,115,101,113,117,101,110,99,101,0,68,111,109,97,105,110,32,101,114,114,111,114,0,82,101,115,117,108,116,32,110,111,116,32,114,101,112,114,101,115,101,110,116,97,98,108,101,0,78,111,116,32,97,32,116,116,121,0,80,101,114,109,105,115,115,105,111,110,32,100,101,110,105,101,100,0,79,112,101,114,97,116,105,111,110,32,110,111,116,32,112,101,114,109,105,116,116,101,100,0,78,111,32,115,117,99,104,32,102,105,108,101,32,111,114,32,100,105,114,101,99,116,111,114,121,0,78,111,32,115,117,99,104,32,112,114,111,99,101,115,115,0,70,105,108,101,32,101,120,105,115,116,115,0,86,97,108,117,101,32,116,111,111,32,108,97,114,103,101,32,102,111,114,32,100,97,116,97,32,116,121,112,101,0,78,111,32,115,112,97,99,101,32,108,101,102,116,32,111,110,32,100,101,118,105,99,101,0,79,117,116,32,111,102,32,109,101,109,111,114,121,0,82,101,115,111,117,114,99,101,32,98,117,115,121,0,73,110,116,101,114,114,117,112,116,101,100,32,115,121,115,116,101,109,32,99,97,108,108,0,82,101,115,111,117,114,99,101,32,116,101,109,112,111,114,97,114,105,108,121,32,117,110,97,118,97,105,108,97,98,108,101,0,73,110,118,97,108,105,100,32,115,101,101,107,0,67,114,111,115,115,45,100,101,118,105,99,101,32,108,105,110,107,0,82,101,97,100,45,111,110,108,121,32,102,105,108,101,32,115,121,115,116,101,109,0,68,105,114,101,99,116,111,114,121,32,110,111,116,32,101,109,112,116,121,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,112,101,101,114,0,79,112,101,114,97,116,105,111,110,32,116,105,109,101,100,32,111,117,116,0,67,111,110,110,101,99,116,105,111,110,32,114,101,102,117,115,101,100,0,72,111,115,116,32,105,115,32,100,111,119,110,0,72,111,115,116,32,105,115,32,117,110,114,101,97,99,104,97,98,108,101,0,65,100,100,114,101,115,115,32,105,110,32,117,115,101,0,66,114,111,107,101,110,32,112,105,112,101,0,73,47,79,32,101,114,114,111,114,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,32,111,114,32,97,100,100,114,101,115,115,0,66,108,111,99,107,32,100,101,118,105,99,101,32,114,101,113,117,105,114,101,100,0,78,111,32,115,117,99,104,32,100,101,118,105,99,101,0,78,111,116,32,97,32,100,105,114,101,99,116,111,114,121,0,73,115,32,97,32,100,105,114,101,99,116,111,114,121,0,84,101,120,116,32,102,105,108,101,32,98,117,115,121,0,69,120,101,99,32,102,111,114,109,97,116,32,101,114,114,111,114,0,73,110,118,97,108,105,100,32,97,114,103,117,109,101,110,116,0,65,114,103,117,109,101,110,116,32,108,105,115,116,32,116,111,111,32,108,111,110,103,0,83,121,109,98,111,108,105,99,32,108,105,110,107,32,108,111,111,112,0,70,105,108,101,110,97,109,101,32,116,111,111,32,108,111,110,103,0,84,111,111,32,109,97,110,121,32,111,112,101,110,32,102,105,108,101,115,32,105,110,32,115,121,115,116,101,109,0,78,111,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,115,32,97,118,97,105,108,97,98,108,101,0,66,97,100,32,102,105,108,101,32,100,101,115,99,114,105,112,116,111,114,0,78,111,32,99,104,105,108,100,32,112,114,111,99,101,115,115,0,66,97,100,32,97,100,100,114,101,115,115,0,70,105,108,101,32,116,111,111,32,108,97,114,103,101,0,84,111,111,32,109,97,110,121,32,108,105,110,107,115,0,78,111,32,108,111,99,107,115,32,97,118,97,105,108,97,98,108,101,0,82,101,115,111,117,114,99,101,32,100,101,97,100,108,111,99,107,32,119,111,117,108,100,32,111,99,99,117,114,0,83,116,97,116,101,32,110,111,116,32,114,101,99,111,118,101,114,97,98,108,101,0,80,114,101,118,105,111,117,115,32,111,119,110,101,114,32,100,105,101,100,0,79,112,101,114,97,116,105,111,110,32,99,97,110,99,101,108,101,100,0,70,117,110,99,116,105,111,110,32,110,111,116,32,105,109,112,108,101,109,101,110,116,101,100,0,78,111,32,109,101,115,115,97,103,101,32,111,102,32,100,101,115,105,114,101,100,32,116,121,112,101,0,73,100,101,110,116,105,102,105,101,114,32,114,101,109,111,118,101,100,0,68,101,118,105,99,101,32,110,111,116,32,97,32,115,116,114,101,97,109,0,78,111,32,100,97,116,97,32,97,118,97,105,108,97,98,108,101,0,68,101,118,105,99,101,32,116,105,109,101,111,117,116,0,79,117,116,32,111,102,32,115,116,114,101,97,109,115,32,114,101,115,111,117,114,99,101,115,0,76,105,110,107,32,104,97,115,32,98,101,101,110,32,115,101,118,101,114,101,100,0,80,114,111,116,111,99,111,108,32,101,114,114,111,114,0,66,97,100,32,109,101,115,115,97,103,101,0,70,105,108,101,32,100,101,115,99,114,105,112,116,111,114,32,105,110,32,98,97,100,32,115,116,97,116,101,0,78,111,116,32,97,32,115,111,99,107,101,116,0,68,101,115,116,105,110,97,116,105,111,110,32,97,100,100,114,101,115,115,32,114,101,113,117,105,114,101,100,0,77,101,115,115,97,103,101,32,116,111,111,32,108,97,114,103,101,0,80,114,111,116,111,99,111,108,32,119,114,111,110,103,32,116,121,112,101,32,102,111,114,32,115,111,99,107,101,116,0,80,114,111,116,111,99,111,108,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,80,114,111,116,111,99,111,108,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,83,111,99,107,101,116,32,116,121,112,101,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,78,111,116,32,115,117,112,112,111,114,116,101,100,0,80,114,111,116,111,99,111,108,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,0,65,100,100,114,101,115,115,32,102,97,109,105,108,121,32,110,111,116,32,115,117,112,112,111,114,116,101,100,32,98,121,32,112,114,111,116,111,99,111,108,0,65,100,100,114,101,115,115,32,110,111,116,32,97,118,97,105,108,97,98,108,101,0,78,101,116,119,111,114,107,32,105,115,32,100,111,119,110,0,78,101,116,119,111,114,107,32,117,110,114,101,97,99,104,97,98,108,101,0,67,111,110,110,101,99,116,105,111,110,32,114,101,115,101,116,32,98,121,32,110,101,116,119,111,114,107,0,67,111,110,110,101,99,116,105,111,110,32,97,98,111,114,116,101,100,0,78,111,32,98,117,102,102,101,114,32,115,112,97,99,101,32,97,118,97,105,108,97,98,108,101,0,83,111,99,107,101,116,32,105,115,32,99,111,110,110,101,99,116,101,100,0,83,111,99,107,101,116,32,110,111,116,32,99,111,110,110,101,99,116,101,100,0,67,97,110,110,111,116,32,115,101,110,100,32,97,102,116,101,114,32,115,111,99,107,101,116,32,115,104,117,116,100,111,119,110,0,79,112,101,114,97,116,105,111,110,32,97,108,114,101,97,100,121,32,105,110,32,112,114,111,103,114,101,115,115,0,79,112,101,114,97,116,105,111,110,32,105,110,32,112,114,111,103,114,101,115,115,0,83,116,97,108,101,32,102,105,108,101,32,104,97,110,100,108,101,0,82,101,109,111,116,101,32,73,47,79,32,101,114,114,111,114,0,81,117,111,116,97,32,101,120,99,101,101,100,101,100,0,78,111,32,109,101,100,105,117,109,32,102,111,117,110,100,0,87,114,111,110,103,32,109,101,100,105,117,109,32,116,121,112,101,0,78,111,32,101,114,114,111,114,32,105,110,102,111,114,109,97,116,105,111,110,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,17,0,10,0,17,17,17,0,0,0,0,5,0,0,0,0,0,0,9,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,15,10,17,17,17,3,10,7,0,1,19,9,11,11,0,0,9,6,11,0,0,11,0,6,17,0,0,0,17,17,17,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,17,0,10,10,17,17,17,0,10,0,0,2,0,9,11,0,0,0,9,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,14,0,0,0,0,0,0,0,0,0,0,0,13,0,0,0,4,13,0,0,0,0,9,14,0,0,0,0,0,14,0,0,14,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,16,0,0,0,0,0,0,0,0,0,0,0,15,0,0,0,0,15,0,0,0,0,9,16,0,0,0,0,0,16,0,0,16,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,0,0,0,18,18,18,0,0,0,0,0,0,9,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,0,0,0,0,0,0,0,0,0,0,0,10,0,0,0,0,10,0,0,0,0,9,11,0,0,0,0,0,11,0,0,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,0,0,0,0,0,0,0,12,0,0,0,0,12,0,0,0,0,9,12,0,0,0,0,0,12,0,0,12,0,0,48,49,50,51,52,53,54,55,56,57,65,66,67,68,69,70,45,43,32,32,32,48,88,48,120,0,40,110,117,108,108,41,0,45,48,88,43,48,88,32,48,88,45,48,120,43,48,120,32,48,120,0,105,110,102,0,73,78,70,0,110,97,110,0,78,65,78,0,46,0],"i8",ALLOC_NONE,Runtime.GLOBAL_BASE);var tempDoublePtr=Runtime.alignMemory(allocate(12,"i8",ALLOC_STATIC),8);assert(tempDoublePtr%8==0);function copyTempFloat(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3]}function copyTempDouble(ptr){HEAP8[tempDoublePtr]=HEAP8[ptr];HEAP8[tempDoublePtr+1]=HEAP8[ptr+1];HEAP8[tempDoublePtr+2]=HEAP8[ptr+2];HEAP8[tempDoublePtr+3]=HEAP8[ptr+3];HEAP8[tempDoublePtr+4]=HEAP8[ptr+4];HEAP8[tempDoublePtr+5]=HEAP8[ptr+5];HEAP8[tempDoublePtr+6]=HEAP8[ptr+6];HEAP8[tempDoublePtr+7]=HEAP8[ptr+7]}var _BDtoIHigh=true;Module["_i64Subtract"]=_i64Subtract;Module["_i64Add"]=_i64Add;function _pthread_cleanup_push(routine,arg){__ATEXIT__.push((function(){Runtime.dynCall("vi",routine,[arg])}));_pthread_cleanup_push.level=__ATEXIT__.length}Module["_memset"]=_memset;var _BDtoILow=true;Module["_bitshift64Lshr"]=_bitshift64Lshr;Module["_bitshift64Shl"]=_bitshift64Shl;function _pthread_cleanup_pop(){assert(_pthread_cleanup_push.level==__ATEXIT__.length,"cannot pop if something else added meanwhile!");__ATEXIT__.pop();_pthread_cleanup_push.level=__ATEXIT__.length}function _abort(){Module["abort"]()}function __ZSt18uncaught_exceptionv(){return!!__ZSt18uncaught_exceptionv.uncaught_exception}var EXCEPTIONS={last:0,caught:[],infos:{},deAdjust:(function(adjusted){if(!adjusted||EXCEPTIONS.infos[adjusted])return adjusted;for(var ptr in EXCEPTIONS.infos){var info=EXCEPTIONS.infos[ptr];if(info.adjusted===adjusted){return ptr}}return adjusted}),addRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount++}),decRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];assert(info.refcount>0);info.refcount--;if(info.refcount===0){if(info.destructor){Runtime.dynCall("vi",info.destructor,[ptr])}delete EXCEPTIONS.infos[ptr];___cxa_free_exception(ptr)}}),clearRef:(function(ptr){if(!ptr)return;var info=EXCEPTIONS.infos[ptr];info.refcount=0})};function ___cxa_begin_catch(ptr){__ZSt18uncaught_exceptionv.uncaught_exception--;EXCEPTIONS.caught.push(ptr);EXCEPTIONS.addRef(EXCEPTIONS.deAdjust(ptr));return ptr}function _pthread_once(ptr,func){if(!_pthread_once.seen)_pthread_once.seen={};if(ptr in _pthread_once.seen)return;Runtime.dynCall("v",func);_pthread_once.seen[ptr]=1}function _emscripten_memcpy_big(dest,src,num){HEAPU8.set(HEAPU8.subarray(src,src+num),dest);return dest}Module["_memcpy"]=_memcpy;var SYSCALLS={varargs:0,get:(function(varargs){SYSCALLS.varargs+=4;var ret=HEAP32[SYSCALLS.varargs-4>>2];return ret}),getStr:(function(){var ret=Pointer_stringify(SYSCALLS.get());return ret}),get64:(function(){var low=SYSCALLS.get(),high=SYSCALLS.get();if(low>=0)assert(high===0);else assert(high===-1);return low}),getZero:(function(){assert(SYSCALLS.get()===0)})};function ___syscall6(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD();FS.close(stream);return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}var PTHREAD_SPECIFIC={};function _pthread_getspecific(key){return PTHREAD_SPECIFIC[key]||0}function ___setErrNo(value){if(Module["___errno_location"])HEAP32[Module["___errno_location"]()>>2]=value;return value}var ERRNO_CODES={EPERM:1,ENOENT:2,ESRCH:3,EINTR:4,EIO:5,ENXIO:6,E2BIG:7,ENOEXEC:8,EBADF:9,ECHILD:10,EAGAIN:11,EWOULDBLOCK:11,ENOMEM:12,EACCES:13,EFAULT:14,ENOTBLK:15,EBUSY:16,EEXIST:17,EXDEV:18,ENODEV:19,ENOTDIR:20,EISDIR:21,EINVAL:22,ENFILE:23,EMFILE:24,ENOTTY:25,ETXTBSY:26,EFBIG:27,ENOSPC:28,ESPIPE:29,EROFS:30,EMLINK:31,EPIPE:32,EDOM:33,ERANGE:34,ENOMSG:42,EIDRM:43,ECHRNG:44,EL2NSYNC:45,EL3HLT:46,EL3RST:47,ELNRNG:48,EUNATCH:49,ENOCSI:50,EL2HLT:51,EDEADLK:35,ENOLCK:37,EBADE:52,EBADR:53,EXFULL:54,ENOANO:55,EBADRQC:56,EBADSLT:57,EDEADLOCK:35,EBFONT:59,ENOSTR:60,ENODATA:61,ETIME:62,ENOSR:63,ENONET:64,ENOPKG:65,EREMOTE:66,ENOLINK:67,EADV:68,ESRMNT:69,ECOMM:70,EPROTO:71,EMULTIHOP:72,EDOTDOT:73,EBADMSG:74,ENOTUNIQ:76,EBADFD:77,EREMCHG:78,ELIBACC:79,ELIBBAD:80,ELIBSCN:81,ELIBMAX:82,ELIBEXEC:83,ENOSYS:38,ENOTEMPTY:39,ENAMETOOLONG:36,ELOOP:40,EOPNOTSUPP:95,EPFNOSUPPORT:96,ECONNRESET:104,ENOBUFS:105,EAFNOSUPPORT:97,EPROTOTYPE:91,ENOTSOCK:88,ENOPROTOOPT:92,ESHUTDOWN:108,ECONNREFUSED:111,EADDRINUSE:98,ECONNABORTED:103,ENETUNREACH:101,ENETDOWN:100,ETIMEDOUT:110,EHOSTDOWN:112,EHOSTUNREACH:113,EINPROGRESS:115,EALREADY:114,EDESTADDRREQ:89,EMSGSIZE:90,EPROTONOSUPPORT:93,ESOCKTNOSUPPORT:94,EADDRNOTAVAIL:99,ENETRESET:102,EISCONN:106,ENOTCONN:107,ETOOMANYREFS:109,EUSERS:87,EDQUOT:122,ESTALE:116,ENOTSUP:95,ENOMEDIUM:123,EILSEQ:84,EOVERFLOW:75,ECANCELED:125,ENOTRECOVERABLE:131,EOWNERDEAD:130,ESTRPIPE:86};function _sysconf(name){switch(name){case 30:return PAGE_SIZE;case 85:return totalMemory/PAGE_SIZE;case 132:case 133:case 12:case 137:case 138:case 15:case 235:case 16:case 17:case 18:case 19:case 20:case 149:case 13:case 10:case 236:case 153:case 9:case 21:case 22:case 159:case 154:case 14:case 77:case 78:case 139:case 80:case 81:case 82:case 68:case 67:case 164:case 11:case 29:case 47:case 48:case 95:case 52:case 51:case 46:return 200809;case 79:return 0;case 27:case 246:case 127:case 128:case 23:case 24:case 160:case 161:case 181:case 182:case 242:case 183:case 184:case 243:case 244:case 245:case 165:case 178:case 179:case 49:case 50:case 168:case 169:case 175:case 170:case 171:case 172:case 97:case 76:case 32:case 173:case 35:return-1;case 176:case 177:case 7:case 155:case 8:case 157:case 125:case 126:case 92:case 93:case 129:case 130:case 131:case 94:case 91:return 1;case 74:case 60:case 69:case 70:case 4:return 1024;case 31:case 42:case 72:return 32;case 87:case 26:case 33:return 2147483647;case 34:case 1:return 47839;case 38:case 36:return 99;case 43:case 37:return 2048;case 0:return 2097152;case 3:return 65536;case 28:return 32768;case 44:return 32767;case 75:return 16384;case 39:return 1e3;case 89:return 700;case 71:return 256;case 40:return 255;case 2:return 100;case 180:return 64;case 25:return 20;case 5:return 16;case 6:return 6;case 73:return 4;case 84:{if(typeof navigator==="object")return navigator["hardwareConcurrency"]||1;return 1}}___setErrNo(ERRNO_CODES.EINVAL);return-1}function _sbrk(bytes){var self=_sbrk;if(!self.called){DYNAMICTOP=alignMemoryPage(DYNAMICTOP);self.called=true;assert(Runtime.dynamicAlloc);self.alloc=Runtime.dynamicAlloc;Runtime.dynamicAlloc=(function(){abort("cannot dynamically allocate, sbrk now has control")})}var ret=DYNAMICTOP;if(bytes!=0){var success=self.alloc(bytes);if(!success)return-1>>>0}return ret}var PTHREAD_SPECIFIC_NEXT_KEY=1;function _pthread_key_create(key,destructor){if(key==0){return ERRNO_CODES.EINVAL}HEAP32[key>>2]=PTHREAD_SPECIFIC_NEXT_KEY;PTHREAD_SPECIFIC[PTHREAD_SPECIFIC_NEXT_KEY]=0;PTHREAD_SPECIFIC_NEXT_KEY++;return 0}var _BItoD=true;var PATH=undefined;function _emscripten_set_main_loop_timing(mode,value){Browser.mainLoop.timingMode=mode;Browser.mainLoop.timingValue=value;if(!Browser.mainLoop.func){return 1}if(mode==0){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setTimeout(){setTimeout(Browser.mainLoop.runner,value)};Browser.mainLoop.method="timeout"}else if(mode==1){Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_rAF(){Browser.requestAnimationFrame(Browser.mainLoop.runner)};Browser.mainLoop.method="rAF"}else if(mode==2){if(!window["setImmediate"]){var setImmediates=[];var emscriptenMainLoopMessageId="__emcc";function Browser_setImmediate_messageHandler(event){if(event.source===window&&event.data===emscriptenMainLoopMessageId){event.stopPropagation();setImmediates.shift()()}}window.addEventListener("message",Browser_setImmediate_messageHandler,true);window["setImmediate"]=function Browser_emulated_setImmediate(func){setImmediates.push(func);window.postMessage(emscriptenMainLoopMessageId,"*")}}Browser.mainLoop.scheduler=function Browser_mainLoop_scheduler_setImmediate(){window["setImmediate"](Browser.mainLoop.runner)};Browser.mainLoop.method="immediate"}return 0}function _emscripten_set_main_loop(func,fps,simulateInfiniteLoop,arg,noSetTiming){Module["noExitRuntime"]=true;assert(!Browser.mainLoop.func,"emscripten_set_main_loop: there can only be one main loop function at once: call emscripten_cancel_main_loop to cancel the previous one before setting a new one with different parameters.");Browser.mainLoop.func=func;Browser.mainLoop.arg=arg;var thisMainLoopId=Browser.mainLoop.currentlyRunningMainloop;Browser.mainLoop.runner=function Browser_mainLoop_runner(){if(ABORT)return;if(Browser.mainLoop.queue.length>0){var start=Date.now();var blocker=Browser.mainLoop.queue.shift();blocker.func(blocker.arg);if(Browser.mainLoop.remainingBlockers){var remaining=Browser.mainLoop.remainingBlockers;var next=remaining%1==0?remaining-1:Math.floor(remaining);if(blocker.counted){Browser.mainLoop.remainingBlockers=next}else{next=next+.5;Browser.mainLoop.remainingBlockers=(8*remaining+next)/9}}console.log('main loop blocker "'+blocker.name+'" took '+(Date.now()-start)+" ms");Browser.mainLoop.updateStatus();setTimeout(Browser.mainLoop.runner,0);return}if(thisMainLoopId1&&Browser.mainLoop.currentFrameNumber%Browser.mainLoop.timingValue!=0){Browser.mainLoop.scheduler();return}if(Browser.mainLoop.method==="timeout"&&Module.ctx){Module.printErr("Looks like you are rendering without using requestAnimationFrame for the main loop. You should use 0 for the frame rate in emscripten_set_main_loop in order to use requestAnimationFrame, as that can greatly improve your frame rates!");Browser.mainLoop.method=""}Browser.mainLoop.runIter((function(){if(typeof arg!=="undefined"){Runtime.dynCall("vi",func,[arg])}else{Runtime.dynCall("v",func)}}));if(thisMainLoopId0)_emscripten_set_main_loop_timing(0,1e3/fps);else _emscripten_set_main_loop_timing(1,1);Browser.mainLoop.scheduler()}if(simulateInfiniteLoop){throw"SimulateInfiniteLoop"}}var Browser={mainLoop:{scheduler:null,method:"",currentlyRunningMainloop:0,func:null,arg:0,timingMode:0,timingValue:0,currentFrameNumber:0,queue:[],pause:(function(){Browser.mainLoop.scheduler=null;Browser.mainLoop.currentlyRunningMainloop++}),resume:(function(){Browser.mainLoop.currentlyRunningMainloop++;var timingMode=Browser.mainLoop.timingMode;var timingValue=Browser.mainLoop.timingValue;var func=Browser.mainLoop.func;Browser.mainLoop.func=null;_emscripten_set_main_loop(func,0,false,Browser.mainLoop.arg,true);_emscripten_set_main_loop_timing(timingMode,timingValue);Browser.mainLoop.scheduler()}),updateStatus:(function(){if(Module["setStatus"]){var message=Module["statusMessage"]||"Please wait...";var remaining=Browser.mainLoop.remainingBlockers;var expected=Browser.mainLoop.expectedBlockers;if(remaining){if(remaining=6){var curr=leftchar>>leftbits-6&63;leftbits-=6;ret+=BASE[curr]}}if(leftbits==2){ret+=BASE[(leftchar&3)<<4];ret+=PAD+PAD}else if(leftbits==4){ret+=BASE[(leftchar&15)<<2];ret+=PAD}return ret}audio.src="data:audio/x-"+name.substr(-3)+";base64,"+encode64(byteArray);finish(audio)};audio.src=url;Browser.safeSetTimeout((function(){finish(audio)}),1e4)}else{return fail()}};Module["preloadPlugins"].push(audioPlugin);var canvas=Module["canvas"];function pointerLockChange(){Browser.pointerLock=document["pointerLockElement"]===canvas||document["mozPointerLockElement"]===canvas||document["webkitPointerLockElement"]===canvas||document["msPointerLockElement"]===canvas}if(canvas){canvas.requestPointerLock=canvas["requestPointerLock"]||canvas["mozRequestPointerLock"]||canvas["webkitRequestPointerLock"]||canvas["msRequestPointerLock"]||(function(){});canvas.exitPointerLock=document["exitPointerLock"]||document["mozExitPointerLock"]||document["webkitExitPointerLock"]||document["msExitPointerLock"]||(function(){});canvas.exitPointerLock=canvas.exitPointerLock.bind(document);document.addEventListener("pointerlockchange",pointerLockChange,false);document.addEventListener("mozpointerlockchange",pointerLockChange,false);document.addEventListener("webkitpointerlockchange",pointerLockChange,false);document.addEventListener("mspointerlockchange",pointerLockChange,false);if(Module["elementPointerLock"]){canvas.addEventListener("click",(function(ev){if(!Browser.pointerLock&&canvas.requestPointerLock){canvas.requestPointerLock();ev.preventDefault()}}),false)}}}),createContext:(function(canvas,useWebGL,setInModule,webGLContextAttributes){if(useWebGL&&Module.ctx&&canvas==Module.canvas)return Module.ctx;var ctx;var contextHandle;if(useWebGL){var contextAttributes={antialias:false,alpha:false};if(webGLContextAttributes){for(var attribute in webGLContextAttributes){contextAttributes[attribute]=webGLContextAttributes[attribute]}}contextHandle=GL.createContext(canvas,contextAttributes);if(contextHandle){ctx=GL.getContext(contextHandle).GLctx}canvas.style.backgroundColor="black"}else{ctx=canvas.getContext("2d")}if(!ctx)return null;if(setInModule){if(!useWebGL)assert(typeof GLctx==="undefined","cannot set in module if GLctx is used, but we are a non-GL context that would replace it");Module.ctx=ctx;if(useWebGL)GL.makeContextCurrent(contextHandle);Module.useWebGL=useWebGL;Browser.moduleContextCreatedCallbacks.forEach((function(callback){callback()}));Browser.init()}return ctx}),destroyContext:(function(canvas,useWebGL,setInModule){}),fullScreenHandlersInstalled:false,lockPointer:undefined,resizeCanvas:undefined,requestFullScreen:(function(lockPointer,resizeCanvas,vrDevice){Browser.lockPointer=lockPointer;Browser.resizeCanvas=resizeCanvas;Browser.vrDevice=vrDevice;if(typeof Browser.lockPointer==="undefined")Browser.lockPointer=true;if(typeof Browser.resizeCanvas==="undefined")Browser.resizeCanvas=false;if(typeof Browser.vrDevice==="undefined")Browser.vrDevice=null;var canvas=Module["canvas"];function fullScreenChange(){Browser.isFullScreen=false;var canvasContainer=canvas.parentNode;if((document["webkitFullScreenElement"]||document["webkitFullscreenElement"]||document["mozFullScreenElement"]||document["mozFullscreenElement"]||document["fullScreenElement"]||document["fullscreenElement"]||document["msFullScreenElement"]||document["msFullscreenElement"]||document["webkitCurrentFullScreenElement"])===canvasContainer){canvas.cancelFullScreen=document["cancelFullScreen"]||document["mozCancelFullScreen"]||document["webkitCancelFullScreen"]||document["msExitFullscreen"]||document["exitFullscreen"]||(function(){});canvas.cancelFullScreen=canvas.cancelFullScreen.bind(document);if(Browser.lockPointer)canvas.requestPointerLock();Browser.isFullScreen=true;if(Browser.resizeCanvas)Browser.setFullScreenCanvasSize()}else{canvasContainer.parentNode.insertBefore(canvas,canvasContainer);canvasContainer.parentNode.removeChild(canvasContainer);if(Browser.resizeCanvas)Browser.setWindowedCanvasSize()}if(Module["onFullScreen"])Module["onFullScreen"](Browser.isFullScreen);Browser.updateCanvasDimensions(canvas)}if(!Browser.fullScreenHandlersInstalled){Browser.fullScreenHandlersInstalled=true;document.addEventListener("fullscreenchange",fullScreenChange,false);document.addEventListener("mozfullscreenchange",fullScreenChange,false);document.addEventListener("webkitfullscreenchange",fullScreenChange,false);document.addEventListener("MSFullscreenChange",fullScreenChange,false)}var canvasContainer=document.createElement("div");canvas.parentNode.insertBefore(canvasContainer,canvas);canvasContainer.appendChild(canvas);canvasContainer.requestFullScreen=canvasContainer["requestFullScreen"]||canvasContainer["mozRequestFullScreen"]||canvasContainer["msRequestFullscreen"]||(canvasContainer["webkitRequestFullScreen"]?(function(){canvasContainer["webkitRequestFullScreen"](Element["ALLOW_KEYBOARD_INPUT"])}):null);if(vrDevice){canvasContainer.requestFullScreen({vrDisplay:vrDevice})}else{canvasContainer.requestFullScreen()}}),nextRAF:0,fakeRequestAnimationFrame:(function(func){var now=Date.now();if(Browser.nextRAF===0){Browser.nextRAF=now+1e3/60}else{while(now+2>=Browser.nextRAF){Browser.nextRAF+=1e3/60}}var delay=Math.max(Browser.nextRAF-now,0);setTimeout(func,delay)}),requestAnimationFrame:function requestAnimationFrame(func){if(typeof window==="undefined"){Browser.fakeRequestAnimationFrame(func)}else{if(!window.requestAnimationFrame){window.requestAnimationFrame=window["requestAnimationFrame"]||window["mozRequestAnimationFrame"]||window["webkitRequestAnimationFrame"]||window["msRequestAnimationFrame"]||window["oRequestAnimationFrame"]||Browser.fakeRequestAnimationFrame}window.requestAnimationFrame(func)}},safeCallback:(function(func){return(function(){if(!ABORT)return func.apply(null,arguments)})}),allowAsyncCallbacks:true,queuedAsyncCallbacks:[],pauseAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=false}),resumeAsyncCallbacks:(function(){Browser.allowAsyncCallbacks=true;if(Browser.queuedAsyncCallbacks.length>0){var callbacks=Browser.queuedAsyncCallbacks;Browser.queuedAsyncCallbacks=[];callbacks.forEach((function(func){func()}))}}),safeRequestAnimationFrame:(function(func){return Browser.requestAnimationFrame((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}))}),safeSetTimeout:(function(func,timeout){Module["noExitRuntime"]=true;return setTimeout((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}else{Browser.queuedAsyncCallbacks.push(func)}}),timeout)}),safeSetInterval:(function(func,timeout){Module["noExitRuntime"]=true;return setInterval((function(){if(ABORT)return;if(Browser.allowAsyncCallbacks){func()}}),timeout)}),getMimetype:(function(name){return{"jpg":"image/jpeg","jpeg":"image/jpeg","png":"image/png","bmp":"image/bmp","ogg":"audio/ogg","wav":"audio/wav","mp3":"audio/mpeg"}[name.substr(name.lastIndexOf(".")+1)]}),getUserMedia:(function(func){if(!window.getUserMedia){window.getUserMedia=navigator["getUserMedia"]||navigator["mozGetUserMedia"]}window.getUserMedia(func)}),getMovementX:(function(event){return event["movementX"]||event["mozMovementX"]||event["webkitMovementX"]||0}),getMovementY:(function(event){return event["movementY"]||event["mozMovementY"]||event["webkitMovementY"]||0}),getMouseWheelDelta:(function(event){var delta=0;switch(event.type){case"DOMMouseScroll":delta=event.detail;break;case"mousewheel":delta=event.wheelDelta;break;case"wheel":delta=event["deltaY"];break;default:throw"unrecognized mouse wheel event: "+event.type}return delta}),mouseX:0,mouseY:0,mouseMovementX:0,mouseMovementY:0,touches:{},lastTouches:{},calculateMouseEvent:(function(event){if(Browser.pointerLock){if(event.type!="mousemove"&&"mozMovementX"in event){Browser.mouseMovementX=Browser.mouseMovementY=0}else{Browser.mouseMovementX=Browser.getMovementX(event);Browser.mouseMovementY=Browser.getMovementY(event)}if(typeof SDL!="undefined"){Browser.mouseX=SDL.mouseX+Browser.mouseMovementX;Browser.mouseY=SDL.mouseY+Browser.mouseMovementY}else{Browser.mouseX+=Browser.mouseMovementX;Browser.mouseY+=Browser.mouseMovementY}}else{var rect=Module["canvas"].getBoundingClientRect();var cw=Module["canvas"].width;var ch=Module["canvas"].height;var scrollX=typeof window.scrollX!=="undefined"?window.scrollX:window.pageXOffset;var scrollY=typeof window.scrollY!=="undefined"?window.scrollY:window.pageYOffset;if(event.type==="touchstart"||event.type==="touchend"||event.type==="touchmove"){var touch=event.touch;if(touch===undefined){return}var adjustedX=touch.pageX-(scrollX+rect.left);var adjustedY=touch.pageY-(scrollY+rect.top);adjustedX=adjustedX*(cw/rect.width);adjustedY=adjustedY*(ch/rect.height);var coords={x:adjustedX,y:adjustedY};if(event.type==="touchstart"){Browser.lastTouches[touch.identifier]=coords;Browser.touches[touch.identifier]=coords}else if(event.type==="touchend"||event.type==="touchmove"){var last=Browser.touches[touch.identifier];if(!last)last=coords;Browser.lastTouches[touch.identifier]=last;Browser.touches[touch.identifier]=coords}return}var x=event.pageX-(scrollX+rect.left);var y=event.pageY-(scrollY+rect.top);x=x*(cw/rect.width);y=y*(ch/rect.height);Browser.mouseMovementX=x-Browser.mouseX;Browser.mouseMovementY=y-Browser.mouseY;Browser.mouseX=x;Browser.mouseY=y}}),xhrLoad:(function(url,onload,onerror){var xhr=new XMLHttpRequest;xhr.open("GET",url,true);xhr.responseType="arraybuffer";xhr.onload=function xhr_onload(){if(xhr.status==200||xhr.status==0&&xhr.response){onload(xhr.response)}else{onerror()}};xhr.onerror=onerror;xhr.send(null)}),asyncLoad:(function(url,onload,onerror,noRunDep){Browser.xhrLoad(url,(function(arrayBuffer){assert(arrayBuffer,'Loading data file "'+url+'" failed (no arrayBuffer).');onload(new Uint8Array(arrayBuffer));if(!noRunDep)removeRunDependency("al "+url)}),(function(event){if(onerror){onerror()}else{throw'Loading data file "'+url+'" failed.'}}));if(!noRunDep)addRunDependency("al "+url)}),resizeListeners:[],updateResizeListeners:(function(){var canvas=Module["canvas"];Browser.resizeListeners.forEach((function(listener){listener(canvas.width,canvas.height)}))}),setCanvasSize:(function(width,height,noUpdates){var canvas=Module["canvas"];Browser.updateCanvasDimensions(canvas,width,height);if(!noUpdates)Browser.updateResizeListeners()}),windowedWidth:0,windowedHeight:0,setFullScreenCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags|8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),setWindowedCanvasSize:(function(){if(typeof SDL!="undefined"){var flags=HEAPU32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2];flags=flags&~8388608;HEAP32[SDL.screen+Runtime.QUANTUM_SIZE*0>>2]=flags}Browser.updateResizeListeners()}),updateCanvasDimensions:(function(canvas,wNative,hNative){if(wNative&&hNative){canvas.widthNative=wNative;canvas.heightNative=hNative}else{wNative=canvas.widthNative;hNative=canvas.heightNative}var w=wNative;var h=hNative;if(Module["forcedAspectRatio"]&&Module["forcedAspectRatio"]>0){if(w/h>2]=ret}return ret}function _pthread_self(){return 0}function ___syscall140(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.getStreamFromFD(),offset_high=SYSCALLS.get(),offset_low=SYSCALLS.get(),result=SYSCALLS.get(),whence=SYSCALLS.get();var offset=offset_low;assert(offset_high===0);FS.llseek(stream,offset,whence);HEAP32[result>>2]=stream.position;if(stream.getdents&&offset===0&&whence===0)stream.getdents=null;return 0}catch(e){if(typeof FS==="undefined"||!(e instanceof FS.ErrnoError))abort(e);return-e.errno}}function ___syscall146(which,varargs){SYSCALLS.varargs=varargs;try{var stream=SYSCALLS.get(),iov=SYSCALLS.get(),iovcnt=SYSCALLS.get();var ret=0;if(!___syscall146.buffer)___syscall146.buffer=[];var buffer=___syscall146.buffer;for(var i=0;i>2];var len=HEAP32[iov+(i*8+4)>>2];for(var j=0;j2147483648)return false;i=new a(newBuffer);j=new b(newBuffer);k=new c(newBuffer);l=new d(newBuffer);m=new e(newBuffer);n=new f(newBuffer);o=new g(newBuffer);p=new h(newBuffer);buffer=newBuffer;return true} +// EMSCRIPTEN_START_FUNCS + function Za(a){a=a|0;var b=0;b=r;r=r+a|0;r=r+15&-16;return b|0}function _a(){return r|0}function $a(a){a=a|0;r=a}function ab(a,b){a=a|0;b=b|0;r=a;s=b}function bb(a,b){a=a|0;b=b|0;if(!w){w=a;x=b}}function cb(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0]}function db(a){a=a|0;i[t>>0]=i[a>>0];i[t+1>>0]=i[a+1>>0];i[t+2>>0]=i[a+2>>0];i[t+3>>0]=i[a+3>>0];i[t+4>>0]=i[a+4>>0];i[t+5>>0]=i[a+5>>0];i[t+6>>0]=i[a+6>>0];i[t+7>>0]=i[a+7>>0]}function eb(a){a=a|0;L=a}function fb(){return L|0}function gb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0;o=r;r=r+576|0;l=o+48|0;h=o+32|0;g=o+16|0;f=o;j=o+64|0;m=o+60|0;i=a+4|0;n=a+8|0;if((k[i>>2]|0)>>>0>(k[n>>2]|0)>>>0){k[f>>2]=1138;k[f+4>>2]=2119;k[f+8>>2]=1117;yc(j,1084,f)|0;xc(j)|0}if((2147418112/(d>>>0)|0)>>>0<=b>>>0){k[g>>2]=1138;k[g+4>>2]=2120;k[g+8>>2]=1157;yc(j,1084,g)|0;xc(j)|0}g=k[n>>2]|0;if(g>>>0>=b>>>0){n=1;r=o;return n|0}do if(c){if(b){f=b+-1|0;if(!(f&b)){f=11;break}else b=f}else b=-1;b=b>>>16|b;b=b>>>8|b;b=b>>>4|b;b=b>>>2|b;b=(b>>>1|b)+1|0;f=10}else f=10;while(0);if((f|0)==10)if(!b){b=0;f=12}else f=11;if((f|0)==11)if(b>>>0<=g>>>0)f=12;if((f|0)==12){k[h>>2]=1138;k[h+4>>2]=2129;k[h+8>>2]=1205;yc(j,1084,h)|0;xc(j)|0}c=ha(b,d)|0;do if(!e){f=hb(k[a>>2]|0,c,m,1)|0;if(!f){n=0;r=o;return n|0}else{k[a>>2]=f;break}}else{g=ib(c,m)|0;if(!g){n=0;r=o;return n|0}Va[e&0](g,k[a>>2]|0,k[i>>2]|0);f=k[a>>2]|0;do if(f)if(!(f&7)){kb(f,0,0,1,0)|0;break}else{k[l>>2]=1138;k[l+4>>2]=2502;k[l+8>>2]=1504;yc(j,1084,l)|0;xc(j)|0;break}while(0);k[a>>2]=g}while(0);f=k[m>>2]|0;if(f>>>0>c>>>0)b=(f>>>0)/(d>>>0)|0;k[n>>2]=b;n=1;r=o;return n|0}function hb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+560|0;i=j+32|0;f=j+16|0;e=j;h=j+48|0;g=j+44|0;if(a&7){k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1482;yc(h,1084,e)|0;xc(h)|0;i=0;r=j;return i|0}if(b>>>0>2147418112){k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1375;yc(h,1084,f)|0;xc(h)|0;i=0;r=j;return i|0}k[g>>2]=b;d=kb(a,b,g,d,0)|0;if(c)k[c>>2]=k[g>>2];if(!(d&7)){i=d;r=j;return i|0}k[i>>2]=1138;k[i+4>>2]=2554;k[i+8>>2]=1428;yc(h,1084,i)|0;xc(h)|0;i=d;r=j;return i|0}function ib(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+560|0;h=i+32|0;g=i+16|0;c=i;f=i+48|0;e=i+44|0;d=a+3&-4;d=(d|0)!=0?d:4;if(d>>>0>2147418112){k[c>>2]=1138;k[c+4>>2]=2502;k[c+8>>2]=1375;yc(f,1084,c)|0;xc(f)|0;h=0;r=i;return h|0}k[e>>2]=d;c=kb(0,d,e,1,0)|0;a=k[e>>2]|0;if(b)k[b>>2]=a;if((c|0)==0|a>>>0>>0){k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1401;yc(f,1084,g)|0;xc(f)|0;h=0;r=i;return h|0}if(!(c&7)){h=c;r=i;return h|0}k[h>>2]=1138;k[h+4>>2]=2529;k[h+8>>2]=1428;yc(f,1084,h)|0;xc(f)|0;h=c;r=i;return h|0}function jb(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0;L=r;r=r+880|0;I=L+144|0;H=L+128|0;G=L+112|0;F=L+96|0;C=L+80|0;w=L+64|0;u=L+48|0;v=L+32|0;q=L+16|0;p=L;E=L+360|0;J=L+296|0;K=L+224|0;t=L+156|0;if((b|0)==0|d>>>0>11){a=0;r=L;return a|0}k[a>>2]=b;e=K;f=e+68|0;do{k[e>>2]=0;e=e+4|0}while((e|0)<(f|0));f=0;do{e=i[c+f>>0]|0;if(e<<24>>24){D=K+((e&255)<<2)|0;k[D>>2]=(k[D>>2]|0)+1}f=f+1|0}while((f|0)!=(b|0));f=0;o=1;g=0;h=-1;n=0;while(1){e=k[K+(o<<2)>>2]|0;if(!e)k[a+28+(o+-1<<2)>>2]=0;else{D=o+-1|0;k[J+(D<<2)>>2]=f;f=e+f|0;B=16-o|0;k[a+28+(D<<2)>>2]=(f+-1<>2]=n;k[t+(o<<2)>>2]=n;g=g>>>0>o>>>0?g:o;h=h>>>0>>0?h:o;n=e+n|0}o=o+1|0;if((o|0)==17){D=g;break}else f=f<<1}k[a+4>>2]=n;f=a+172|0;do if(n>>>0>(k[f>>2]|0)>>>0){k[f>>2]=n;if(n){e=n+-1|0;if(e&n)s=14}else{e=-1;s=14}if((s|0)==14){B=e>>>16|e;B=B>>>8|B;B=B>>>4|B;B=B>>>2|B;B=(B>>>1|B)+1|0;k[f>>2]=B>>>0>b>>>0?b:B}g=a+176|0;e=k[g>>2]|0;do if(e){B=k[e+-4>>2]|0;e=e+-8|0;if(!((B|0)!=0?(B|0)==(~k[e>>2]|0):0)){k[p>>2]=1138;k[p+4>>2]=647;k[p+8>>2]=1851;yc(E,1084,p)|0;xc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[q>>2]=1138;k[q+4>>2]=2502;k[q+8>>2]=1504;yc(E,1084,q)|0;xc(E)|0;break}}while(0);f=k[f>>2]|0;f=(f|0)!=0?f:1;e=ib((f<<1)+8|0,0)|0;if(!e){k[g>>2]=0;e=0;break}else{k[e+4>>2]=f;k[e>>2]=~f;k[g>>2]=e+8;s=25;break}}else s=25;while(0);a:do if((s|0)==25){B=a+24|0;i[B>>0]=h;i[a+25>>0]=D;f=a+176|0;g=0;do{A=i[c+g>>0]|0;e=A&255;if(A<<24>>24){if(!(k[K+(e<<2)>>2]|0)){k[v>>2]=1138;k[v+4>>2]=2272;k[v+8>>2]=1249;yc(E,1084,v)|0;xc(E)|0}A=t+(e<<2)|0;e=k[A>>2]|0;k[A>>2]=e+1;if(e>>>0>=n>>>0){k[u>>2]=1138;k[u+4>>2]=2276;k[u+8>>2]=1262;yc(E,1084,u)|0;xc(E)|0}j[(k[f>>2]|0)+(e<<1)>>1]=g}g=g+1|0}while((g|0)!=(b|0));e=i[B>>0]|0;z=(e&255)>>>0>>0?d:0;A=a+8|0;k[A>>2]=z;y=(z|0)!=0;if(y){x=1<>>0>(k[e>>2]|0)>>>0){k[e>>2]=x;g=a+168|0;e=k[g>>2]|0;do if(e){v=k[e+-4>>2]|0;e=e+-8|0;if(!((v|0)!=0?(v|0)==(~k[e>>2]|0):0)){k[w>>2]=1138;k[w+4>>2]=647;k[w+8>>2]=1851;yc(E,1084,w)|0;xc(E)|0}if(!(e&7)){kb(e,0,0,1,0)|0;break}else{k[C>>2]=1138;k[C+4>>2]=2502;k[C+8>>2]=1504;yc(E,1084,C)|0;xc(E)|0;break}}while(0);e=x<<2;f=ib(e+8|0,0)|0;if(!f){k[g>>2]=0;e=0;break a}else{C=f+8|0;k[f+4>>2]=x;k[f>>2]=~x;k[g>>2]=C;f=C;break}}else{f=a+168|0;e=x<<2;g=f;f=k[f>>2]|0}while(0);$c(f|0,-1,e|0)|0;t=a+176|0;w=1;do{if(k[K+(w<<2)>>2]|0){u=z-w|0;v=1<>2]|0;if(f>>>0>=16){k[F>>2]=1138;k[F+4>>2]=1956;k[F+8>>2]=1725;yc(E,1084,F)|0;xc(E)|0}e=k[a+28+(f<<2)>>2]|0;if(!e)b=-1;else b=(e+-1|0)>>>(16-w|0);if(h>>>0<=b>>>0){q=(k[a+96+(f<<2)>>2]|0)-h|0;s=w<<16;do{e=m[(k[t>>2]|0)+(q+h<<1)>>1]|0;if((l[c+e>>0]|0|0)!=(w|0)){k[G>>2]=1138;k[G+4>>2]=2318;k[G+8>>2]=1291;yc(E,1084,G)|0;xc(E)|0}p=h<>>0>=x>>>0){k[H>>2]=1138;k[H+4>>2]=2324;k[H+8>>2]=1325;yc(E,1084,H)|0;xc(E)|0}e=k[g>>2]|0;if((k[e+(n<<2)>>2]|0)!=-1){k[I>>2]=1138;k[I+4>>2]=2326;k[I+8>>2]=1348;yc(E,1084,I)|0;xc(E)|0;e=k[g>>2]|0}k[e+(n<<2)>>2]=f;o=o+1|0}while(o>>>0>>0);h=h+1|0}while(h>>>0<=b>>>0)}}w=w+1|0}while(z>>>0>=w>>>0);e=i[B>>0]|0}f=a+96|0;k[f>>2]=(k[f>>2]|0)-(k[J>>2]|0);f=a+100|0;k[f>>2]=(k[f>>2]|0)-(k[J+4>>2]|0);f=a+104|0;k[f>>2]=(k[f>>2]|0)-(k[J+8>>2]|0);f=a+108|0;k[f>>2]=(k[f>>2]|0)-(k[J+12>>2]|0);f=a+112|0;k[f>>2]=(k[f>>2]|0)-(k[J+16>>2]|0);f=a+116|0;k[f>>2]=(k[f>>2]|0)-(k[J+20>>2]|0);f=a+120|0;k[f>>2]=(k[f>>2]|0)-(k[J+24>>2]|0);f=a+124|0;k[f>>2]=(k[f>>2]|0)-(k[J+28>>2]|0);f=a+128|0;k[f>>2]=(k[f>>2]|0)-(k[J+32>>2]|0);f=a+132|0;k[f>>2]=(k[f>>2]|0)-(k[J+36>>2]|0);f=a+136|0;k[f>>2]=(k[f>>2]|0)-(k[J+40>>2]|0);f=a+140|0;k[f>>2]=(k[f>>2]|0)-(k[J+44>>2]|0);f=a+144|0;k[f>>2]=(k[f>>2]|0)-(k[J+48>>2]|0);f=a+148|0;k[f>>2]=(k[f>>2]|0)-(k[J+52>>2]|0);f=a+152|0;k[f>>2]=(k[f>>2]|0)-(k[J+56>>2]|0);f=a+156|0;k[f>>2]=(k[f>>2]|0)-(k[J+60>>2]|0);f=a+16|0;k[f>>2]=0;g=a+20|0;k[g>>2]=e&255;b:do if(y){while(1){if(!d)break b;e=d+-1|0;if(!(k[K+(d<<2)>>2]|0))d=e;else break}k[f>>2]=k[a+28+(e<<2)>>2];e=z+1|0;k[g>>2]=e;if(e>>>0<=D>>>0){while(1){if(k[K+(e<<2)>>2]|0)break;e=e+1|0;if(e>>>0>D>>>0)break b}k[g>>2]=e}}while(0);k[a+92>>2]=-1;k[a+160>>2]=1048575;k[a+12>>2]=32-(k[A>>2]|0);e=1}while(0);a=e;r=L;return a|0}function kb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;do if(!a){d=Sc(b)|0;if(c){if(!d)a=0;else a=Vc(d)|0;k[c>>2]=a}}else{if(!b){Tc(a);if(!c){d=0;break}k[c>>2]=0;d=0;break}if(d){d=Uc(a,b)|0;a=(d|0)==0?a:d}else d=0;if(c){b=Vc(a)|0;k[c>>2]=b}}while(0);return d|0}function lb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(!((a|0)!=0&b>>>0>73&(c|0)!=0)){c=0;return c|0}if((k[c>>2]|0)!=40|b>>>0<74){c=0;return c|0}if(((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)!=18552){c=0;return c|0}if(((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0<74){c=0;return c|0}if(((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0>b>>>0){c=0;return c|0}k[c+4>>2]=(l[a+12>>0]|0)<<8|(l[a+13>>0]|0);k[c+8>>2]=(l[a+14>>0]|0)<<8|(l[a+15>>0]|0);k[c+12>>2]=l[a+16>>0];k[c+16>>2]=l[a+17>>0];b=a+18|0;d=c+32|0;k[d>>2]=l[b>>0];k[d+4>>2]=0;b=i[b>>0]|0;k[c+20>>2]=b<<24>>24==0|b<<24>>24==9?8:16;k[c+24>>2]=(l[a+26>>0]|0)<<16|(l[a+25>>0]|0)<<24|(l[a+27>>0]|0)<<8|(l[a+28>>0]|0);k[c+28>>2]=(l[a+30>>0]|0)<<16|(l[a+29>>0]|0)<<24|(l[a+31>>0]|0)<<8|(l[a+32>>0]|0);c=1;return c|0}function mb(a){a=a|0;Oa(a|0)|0;Sb()}function nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0;f=r;r=r+528|0;e=f;d=f+16|0;b=k[a+20>>2]|0;if(b)ob(b);b=a+4|0;c=k[b>>2]|0;if(!c){e=a+16|0;i[e>>0]=0;r=f;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(d,1084,e)|0;xc(d)|0}k[b>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;e=a+16|0;i[e>>0]=0;r=f;return}function ob(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;i=r;r=r+592|0;g=i+64|0;f=i+48|0;h=i+32|0;d=i+16|0;c=i;e=i+80|0;if(!a){r=i;return}b=k[a+168>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[c>>2]=1138;k[c+4>>2]=647;k[c+8>>2]=1851;yc(e,1084,c)|0;xc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;yc(e,1084,d)|0;xc(e)|0;break}}while(0);b=k[a+176>>2]|0;do if(b){j=k[b+-4>>2]|0;b=b+-8|0;if(!((j|0)!=0?(j|0)==(~k[b>>2]|0):0)){k[h>>2]=1138;k[h+4>>2]=647;k[h+8>>2]=1851;yc(e,1084,h)|0;xc(e)|0}if(!(b&7)){kb(b,0,0,1,0)|0;break}else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;yc(e,1084,f)|0;xc(e)|0;break}}while(0);if(!(a&7)){kb(a,0,0,1,0)|0;r=i;return}else{k[g>>2]=1138;k[g+4>>2]=2502;k[g+8>>2]=1504;yc(e,1084,g)|0;xc(e)|0;r=i;return}}function pb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0;i=r;r=r+544|0;g=i+16|0;b=i;f=i+32|0;e=a+8|0;c=k[e>>2]|0;if((c+-1|0)>>>0>=8192){k[b>>2]=1138;k[b+4>>2]=3002;k[b+8>>2]=1529;yc(f,1084,b)|0;xc(f)|0}k[a>>2]=c;d=a+20|0;b=k[d>>2]|0;if(!b){b=ib(180,0)|0;if(!b)b=0;else{h=b+164|0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0}k[d>>2]=b;h=k[a>>2]|0}else h=c;if(!(k[e>>2]|0)){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;g=k[a>>2]|0}else g=h;f=k[a+4>>2]|0;if(g>>>0>16){d=g;c=0}else{a=0;a=jb(b,h,f,a)|0;r=i;return a|0}while(1){e=c+1|0;if(d>>>0>3){d=d>>>1;c=e}else{d=e;break}}a=c+2+((d|0)!=32&1<>>0>>0&1)|0;a=a>>>0<11?a&255:11;a=jb(b,h,f,a)|0;r=i;return a|0}function qb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0;E=r;r=r+720|0;z=E+160|0;y=E+144|0;x=E+128|0;w=E+112|0;v=E+96|0;u=E+80|0;t=E+64|0;s=E+48|0;n=E+32|0;h=E+16|0;e=E;C=E+200|0;D=E+176|0;A=rb(a,14)|0;if(!A){k[b>>2]=0;c=b+4|0;d=k[c>>2]|0;if(d){if(!(d&7))kb(d,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(C,1084,e)|0;xc(C)|0}k[c>>2]=0;k[b+8>>2]=0;k[b+12>>2]=0}i[b+16>>0]=0;c=b+20|0;d=k[c>>2]|0;if(!d){b=1;r=E;return b|0}ob(d);k[c>>2]=0;b=1;r=E;return b|0}p=b+4|0;q=b+8|0;c=k[q>>2]|0;if((c|0)!=(A|0)){if(c>>>0<=A>>>0){do if((k[b+12>>2]|0)>>>0>>0){if(gb(p,A,(c+1|0)==(A|0),1,0)|0){c=k[q>>2]|0;break}i[b+16>>0]=1;b=0;r=E;return b|0}while(0);$c((k[p>>2]|0)+c|0,0,A-c|0)|0}k[q>>2]=A}$c(k[p>>2]|0,0,A|0)|0;o=a+20|0;c=k[o>>2]|0;if((c|0)<5){f=a+4|0;g=a+8|0;e=a+16|0;do{d=k[f>>2]|0;if((d|0)==(k[g>>2]|0))d=0;else{k[f>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;yc(C,1084,h)|0;xc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[e>>2];k[e>>2]=d}while((c|0)<5)}else{d=a+16|0;e=d;d=k[d>>2]|0}m=d>>>27;k[e>>2]=d<<5;k[o>>2]=c+-5;if((m+-1|0)>>>0>20){b=0;r=E;return b|0}k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;c=D+4|0;d=D+8|0;a:do if(gb(c,21,0,1,0)|0){h=k[d>>2]|0;j=k[c>>2]|0;$c(j+h|0,0,21-h|0)|0;k[d>>2]=21;if(m){e=a+4|0;f=a+8|0;g=a+16|0;h=0;do{c=k[o>>2]|0;if((c|0)<3)do{d=k[e>>2]|0;if((d|0)==(k[f>>2]|0))d=0;else{k[e>>2]=d+1;d=l[d>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[n>>2]=1138;k[n+4>>2]=3204;k[n+8>>2]=1638;yc(C,1084,n)|0;xc(C)|0;c=k[o>>2]|0}d=d<<32-c|k[g>>2];k[g>>2]=d}while((c|0)<3);else d=k[g>>2]|0;k[g>>2]=d<<3;k[o>>2]=c+-3;i[j+(l[1599+h>>0]|0)>>0]=d>>>29;h=h+1|0}while((h|0)!=(m|0))}if(pb(D)|0){m=a+4|0;h=a+8|0;j=a+16|0;d=0;b:while(1){g=A-d|0;c=sb(a,D)|0;c:do if(c>>>0<17){if((k[q>>2]|0)>>>0<=d>>>0){k[s>>2]=1138;k[s+4>>2]=906;k[s+8>>2]=1769;yc(C,1084,s)|0;xc(C)|0}i[(k[p>>2]|0)+d>>0]=c;c=d+1|0}else switch(c|0){case 17:{c=k[o>>2]|0;if((c|0)<3)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[t>>2]=1138;k[t+4>>2]=3204;k[t+8>>2]=1638;yc(C,1084,t)|0;xc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<3);else e=k[j>>2]|0;k[j>>2]=e<<3;k[o>>2]=c+-3;c=(e>>>29)+3|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}case 18:{c=k[o>>2]|0;if((c|0)<7)do{e=k[m>>2]|0;if((e|0)==(k[h>>2]|0))e=0;else{k[m>>2]=e+1;e=l[e>>0]|0}c=c+8|0;k[o>>2]=c;if((c|0)>=33){k[u>>2]=1138;k[u+4>>2]=3204;k[u+8>>2]=1638;yc(C,1084,u)|0;xc(C)|0;c=k[o>>2]|0}e=e<<32-c|k[j>>2];k[j>>2]=e}while((c|0)<7);else e=k[j>>2]|0;k[j>>2]=e<<7;k[o>>2]=c+-7;c=(e>>>25)+11|0;if(c>>>0>g>>>0){c=0;break a}c=c+d|0;break c}default:{if((c+-19|0)>>>0>=2){B=90;break b}f=k[o>>2]|0;if((c|0)==19){if((f|0)<2){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[v>>2]=1138;k[v+4>>2]=3204;k[v+8>>2]=1638;yc(C,1084,v)|0;xc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<2)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<2;k[o>>2]=c+-2;f=(e>>>30)+3|0}else{if((f|0)<6){e=f;while(1){c=k[m>>2]|0;if((c|0)==(k[h>>2]|0))f=0;else{k[m>>2]=c+1;f=l[c>>0]|0}c=e+8|0;k[o>>2]=c;if((c|0)>=33){k[w>>2]=1138;k[w+4>>2]=3204;k[w+8>>2]=1638;yc(C,1084,w)|0;xc(C)|0;c=k[o>>2]|0}e=f<<32-c|k[j>>2];k[j>>2]=e;if((c|0)<6)e=c;else break}}else{e=k[j>>2]|0;c=f}k[j>>2]=e<<6;k[o>>2]=c+-6;f=(e>>>26)+7|0}if((d|0)==0|f>>>0>g>>>0){c=0;break a}c=d+-1|0;if((k[q>>2]|0)>>>0<=c>>>0){k[x>>2]=1138;k[x+4>>2]=906;k[x+8>>2]=1769;yc(C,1084,x)|0;xc(C)|0}e=i[(k[p>>2]|0)+c>>0]|0;if(!(e<<24>>24)){c=0;break a}c=f+d|0;if(d>>>0>=c>>>0){c=d;break c}do{if((k[q>>2]|0)>>>0<=d>>>0){k[y>>2]=1138;k[y+4>>2]=906;k[y+8>>2]=1769;yc(C,1084,y)|0;xc(C)|0}i[(k[p>>2]|0)+d>>0]=e;d=d+1|0}while((d|0)!=(c|0))}}while(0);if(A>>>0>c>>>0)d=c;else break}if((B|0)==90){k[z>>2]=1138;k[z+4>>2]=3145;k[z+8>>2]=1620;yc(C,1084,z)|0;xc(C)|0;c=0;break}if((A|0)==(c|0))c=pb(b)|0;else c=0}else c=0}else{i[D+16>>0]=1;c=0}while(0);nb(D);b=c;r=E;return b|0}function rb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+528|0;g=j;f=j+16|0;if(!b){i=0;r=j;return i|0}if(b>>>0<=16){i=tb(a,b)|0;r=j;return i|0}h=tb(a,b+-16|0)|0;i=a+20|0;b=k[i>>2]|0;if((b|0)<16){d=a+4|0;e=a+8|0;c=a+16|0;do{a=k[d>>2]|0;if((a|0)==(k[e>>2]|0))a=0;else{k[d>>2]=a+1;a=l[a>>0]|0}b=b+8|0;k[i>>2]=b;if((b|0)>=33){k[g>>2]=1138;k[g+4>>2]=3204;k[g+8>>2]=1638;yc(f,1084,g)|0;xc(f)|0;b=k[i>>2]|0}a=a<<32-b|k[c>>2];k[c>>2]=a}while((b|0)<16)}else{a=a+16|0;c=a;a=k[a>>2]|0}k[c>>2]=a<<16;k[i>>2]=b+-16;i=a>>>16|h<<16;r=j;return i|0}function sb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,n=0,o=0,p=0,q=0,s=0,t=0;t=r;r=r+576|0;o=t+48|0;n=t+32|0;j=t+16|0;i=t;q=t+64|0;p=k[b+20>>2]|0;s=a+20|0;h=k[s>>2]|0;do if((h|0)<24){g=a+4|0;d=k[g>>2]|0;e=k[a+8>>2]|0;c=d>>>0>>0;if((h|0)>=16){if(c){k[g>>2]=d+1;c=l[d>>0]|0}else c=0;k[s>>2]=h+8;g=a+16|0;f=c<<24-h|k[g>>2];k[g>>2]=f;break}if(c){f=(l[d>>0]|0)<<8;c=d+1|0}else{f=0;c=d}if(c>>>0>>0){d=l[c>>0]|0;c=c+1|0}else d=0;k[g>>2]=c;k[s>>2]=h+16;g=a+16|0;f=(d|f)<<16-h|k[g>>2];k[g>>2]=f}else{f=a+16|0;g=f;f=k[f>>2]|0}while(0);e=(f>>>16)+1|0;do if(e>>>0<=(k[p+16>>2]|0)>>>0){d=k[(k[p+168>>2]|0)+(f>>>(32-(k[p+8>>2]|0)|0)<<2)>>2]|0;if((d|0)==-1){k[i>>2]=1138;k[i+4>>2]=3249;k[i+8>>2]=1665;yc(q,1084,i)|0;xc(q)|0}c=d&65535;d=d>>>16;if((k[b+8>>2]|0)>>>0<=c>>>0){k[j>>2]=1138;k[j+4>>2]=905;k[j+8>>2]=1769;yc(q,1084,j)|0;xc(q)|0}if((l[(k[b+4>>2]|0)+c>>0]|0|0)!=(d|0)){k[n>>2]=1138;k[n+4>>2]=3253;k[n+8>>2]=1682;yc(q,1084,n)|0;xc(q)|0}}else{d=k[p+20>>2]|0;while(1){c=d+-1|0;if(e>>>0>(k[p+28+(c<<2)>>2]|0)>>>0)d=d+1|0;else break}c=(f>>>(32-d|0))+(k[p+96+(c<<2)>>2]|0)|0;if(c>>>0<(k[b>>2]|0)>>>0){c=m[(k[p+176>>2]|0)+(c<<1)>>1]|0;break}k[o>>2]=1138;k[o+4>>2]=3271;k[o+8>>2]=1620;yc(q,1084,o)|0;xc(q)|0;s=0;r=t;return s|0}while(0);k[g>>2]=k[g>>2]<>2]=(k[s>>2]|0)-d;s=c;r=t;return s|0}function tb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0;j=r;r=r+544|0;h=j+16|0;c=j;g=j+32|0;if(b>>>0>=33){k[c>>2]=1138;k[c+4>>2]=3195;k[c+8>>2]=1622;yc(g,1084,c)|0;xc(g)|0}i=a+20|0;c=k[i>>2]|0;if((c|0)>=(b|0)){e=a+16|0;f=e;e=k[e>>2]|0;g=c;h=32-b|0;h=e>>>h;e=e<>2]=e;b=g-b|0;k[i>>2]=b;r=j;return h|0}e=a+4|0;f=a+8|0;d=a+16|0;do{a=k[e>>2]|0;if((a|0)==(k[f>>2]|0))a=0;else{k[e>>2]=a+1;a=l[a>>0]|0}c=c+8|0;k[i>>2]=c;if((c|0)>=33){k[h>>2]=1138;k[h+4>>2]=3204;k[h+8>>2]=1638;yc(g,1084,h)|0;xc(g)|0;c=k[i>>2]|0}a=a<<32-c|k[d>>2];k[d>>2]=a}while((c|0)<(b|0));h=32-b|0;h=a>>>h;g=a<>2]=g;b=c-b|0;k[i>>2]=b;r=j;return h|0}function ub(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0;q=r;r=r+528|0;o=q;n=q+16|0;if((a|0)==0|b>>>0<62){p=0;r=q;return p|0}m=ib(300,0)|0;if(!m){p=0;r=q;return p|0}k[m>>2]=519686845;c=m+4|0;k[c>>2]=0;d=m+8|0;k[d>>2]=0;j=m+88|0;e=m+136|0;f=m+160|0;g=j;h=g+44|0;do{k[g>>2]=0;g=g+4|0}while((g|0)<(h|0));i[j+44>>0]=0;s=m+184|0;g=m+208|0;h=m+232|0;t=m+252|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+268|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;t=m+284|0;k[t>>2]=0;k[t+4>>2]=0;k[t+8>>2]=0;i[t+12>>0]=0;k[e>>2]=0;k[e+4>>2]=0;k[e+8>>2]=0;k[e+12>>2]=0;k[e+16>>2]=0;i[e+20>>0]=0;k[f>>2]=0;k[f+4>>2]=0;k[f+8>>2]=0;k[f+12>>2]=0;k[f+16>>2]=0;i[f+20>>0]=0;k[s>>2]=0;k[s+4>>2]=0;k[s+8>>2]=0;k[s+12>>2]=0;k[s+16>>2]=0;i[s+20>>0]=0;k[g>>2]=0;k[g+4>>2]=0;k[g+8>>2]=0;k[g+12>>2]=0;k[g+16>>2]=0;i[g+20>>0]=0;k[h>>2]=0;k[h+4>>2]=0;k[h+8>>2]=0;k[h+12>>2]=0;i[h+16>>0]=0;do if(((b>>>0>=74?((l[a>>0]|0)<<8|(l[a+1>>0]|0)|0)==18552:0)?((l[a+2>>0]|0)<<8|(l[a+3>>0]|0))>>>0>=74:0)?((l[a+7>>0]|0)<<16|(l[a+6>>0]|0)<<24|(l[a+8>>0]|0)<<8|(l[a+9>>0]|0))>>>0<=b>>>0:0){k[j>>2]=a;k[c>>2]=a;k[d>>2]=b;if(Eb(m)|0){c=k[j>>2]|0;if((l[c+39>>0]|0)<<8|(l[c+40>>0]|0)){if(!(Fb(m)|0))break;if(!(Gb(m)|0))break;c=k[j>>2]|0}if(!((l[c+55>>0]|0)<<8|(l[c+56>>0]|0))){t=m;r=q;return t|0}if(Hb(m)|0?Ib(m)|0:0){t=m;r=q;return t|0}}}else p=7;while(0);if((p|0)==7)k[j>>2]=0;Nb(m);if(!(m&7)){kb(m,0,0,1,0)|0;t=0;r=q;return t|0}else{k[o>>2]=1138;k[o+4>>2]=2502;k[o+8>>2]=1504;yc(n,1084,o)|0;xc(n)|0;t=0;r=q;return t|0}return 0}function vb(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,m=0;m=r;r=r+528|0;j=m;i=m+16|0;f=k[a+88>>2]|0;h=(l[f+70+(e<<2)+1>>0]|0)<<16|(l[f+70+(e<<2)>>0]|0)<<24|(l[f+70+(e<<2)+2>>0]|0)<<8|(l[f+70+(e<<2)+3>>0]|0);g=e+1|0;if(g>>>0<(l[f+16>>0]|0)>>>0)f=(l[f+70+(g<<2)+1>>0]|0)<<16|(l[f+70+(g<<2)>>0]|0)<<24|(l[f+70+(g<<2)+2>>0]|0)<<8|(l[f+70+(g<<2)+3>>0]|0);else f=k[a+8>>2]|0;if(f>>>0>h>>>0){i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}k[j>>2]=1138;k[j+4>>2]=3690;k[j+8>>2]=1780;yc(i,1084,j)|0;xc(i)|0;i=a+4|0;i=k[i>>2]|0;i=i+h|0;j=f-h|0;j=wb(a,i,j,b,c,d,e)|0;r=m;return j|0}function wb(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;var h=0,j=0,m=0,n=0;n=k[a+88>>2]|0;j=((l[n+12>>0]|0)<<8|(l[n+13>>0]|0))>>>g;m=((l[n+14>>0]|0)<<8|(l[n+15>>0]|0))>>>g;j=j>>>0>1?(j+3|0)>>>2:1;m=m>>>0>1?(m+3|0)>>>2:1;n=n+18|0;g=i[n>>0]|0;g=ha(g<<24>>24==0|g<<24>>24==9?8:16,j)|0;if(f)if((f&3|0)==0&g>>>0<=f>>>0)g=f;else{a=0;return a|0}if((ha(g,m)|0)>>>0>e>>>0){a=0;return a|0}f=(j+1|0)>>>1;h=(m+1|0)>>>1;if(!c){a=0;return a|0}k[a+92>>2]=b;k[a+96>>2]=b;k[a+104>>2]=c;k[a+100>>2]=b+c;k[a+108>>2]=0;k[a+112>>2]=0;switch(l[n>>0]|0|0){case 0:{Jb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 4:case 6:case 5:case 3:case 2:{Kb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 9:{Lb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}case 8:case 7:{Mb(a,d,e,g,j,m,f,h)|0;a=1;return a|0}default:{a=0;return a|0}}return 0}function xb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+4>>2]|0}function yb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+8>>2]|0}function zb(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+12>>2]|0}function Ab(a,b){a=a|0;b=b|0;var c=0,d=0;d=r;r=r+48|0;c=d;k[c>>2]=40;lb(a,b,c)|0;r=d;return k[c+32>>2]|0}function Bb(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;e=r;r=r+576|0;d=e+40|0;c=e+56|0;f=e;k[f>>2]=40;lb(a,b,f)|0;b=f+32|0;a=k[b+4>>2]|0;do switch(k[b>>2]|0){case 0:{if(!a){f=8;r=e;return f|0}else a=14;break}case 1:{if(!a)a=13;else a=14;break}case 2:{if(!a)a=13;else a=14;break}case 3:{if(!a)a=13;else a=14;break}case 4:{if(!a)a=13;else a=14;break}case 5:{if(!a)a=13;else a=14;break}case 6:{if(!a)a=13;else a=14;break}case 7:{if(!a)a=13;else a=14;break}case 8:{if(!a)a=13;else a=14;break}case 9:{if(!a){f=8;r=e;return f|0}else a=14;break}case 10:{if(!a){f=8;r=e;return f|0}else a=14;break}default:a=14}while(0);if((a|0)==13){f=16;r=e;return f|0}else if((a|0)==14){k[d>>2]=1138;k[d+4>>2]=2668;k[d+8>>2]=1523;yc(c,1084,d)|0;xc(c)|0;f=0;r=e;return f|0}return 0}function Cb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0;h=r;r=r+576|0;f=h+40|0;e=h+56|0;i=h;k[i>>2]=40;lb(a,b,i)|0;d=(((k[i+4>>2]|0)>>>c)+3|0)>>>2;b=(((k[i+8>>2]|0)>>>c)+3|0)>>>2;c=i+32|0;a=k[c+4>>2]|0;do switch(k[c>>2]|0){case 0:{if(!a)a=8;else g=14;break}case 1:{if(!a)g=13;else g=14;break}case 2:{if(!a)g=13;else g=14;break}case 3:{if(!a)g=13;else g=14;break}case 4:{if(!a)g=13;else g=14;break}case 5:{if(!a)g=13;else g=14;break}case 6:{if(!a)g=13;else g=14;break}case 7:{if(!a)g=13;else g=14;break}case 8:{if(!a)g=13;else g=14;break}case 9:{if(!a)a=8;else g=14;break}case 10:{if(!a)a=8;else g=14;break}default:g=14}while(0);if((g|0)==13)a=16;else if((g|0)==14){k[f>>2]=1138;k[f+4>>2]=2668;k[f+8>>2]=1523;yc(e,1084,f)|0;xc(e)|0;a=0}i=ha(ha(b,d)|0,a)|0;r=h;return i|0}function Db(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;var g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+592|0;p=q+56|0;g=q+40|0;n=q+72|0;m=q;o=q+68|0;k[m>>2]=40;lb(a,b,m)|0;h=(k[m+4>>2]|0)>>>e;i=(k[m+8>>2]|0)>>>e;m=m+32|0;d=k[m+4>>2]|0;do switch(k[m>>2]|0){case 0:{if(!d)m=8;else j=14;break}case 1:{if(!d)j=13;else j=14;break}case 2:{if(!d)j=13;else j=14;break}case 3:{if(!d)j=13;else j=14;break}case 4:{if(!d)j=13;else j=14;break}case 5:{if(!d)j=13;else j=14;break}case 6:{if(!d)j=13;else j=14;break}case 7:{if(!d)j=13;else j=14;break}case 8:{if(!d)j=13;else j=14;break}case 9:{if(!d)m=8;else j=14;break}case 10:{if(!d)m=8;else j=14;break}default:j=14}while(0);if((j|0)==13)m=16;else if((j|0)==14){k[g>>2]=1138;k[g+4>>2]=2668;k[g+8>>2]=1523;yc(n,1084,g)|0;xc(n)|0;m=0}k[o>>2]=c;l=ub(a,b)|0;b=f+e|0;if(b>>>0>e>>>0){j=(l|0)==0;a=c;while(1){d=ha((h+3|0)>>>2,m)|0;g=ha(d,(i+3|0)>>>2)|0;if(!(e>>>0>15|(j|g>>>0<8))?(k[l>>2]|0)==519686845:0)vb(l,o,g,d,e)|0;a=a+g|0;k[o>>2]=a;e=e+1|0;if((e|0)==(b|0))break;else{i=i>>>1;h=h>>>1}}}if(!l){r=q;return}if((k[l>>2]|0)!=519686845){r=q;return}Nb(l);if(!(l&7)){kb(l,0,0,1,0)|0;r=q;return}else{k[p>>2]=1138;k[p+4>>2]=2502;k[p+8>>2]=1504;yc(n,1084,p)|0;xc(n)|0;r=q;return}}function Eb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0;g=a+92|0;d=k[a+4>>2]|0;f=a+88|0;e=k[f>>2]|0;b=(l[e+68>>0]|0)<<8|(l[e+67>>0]|0)<<16|(l[e+69>>0]|0);c=d+b|0;e=(l[e+65>>0]|0)<<8|(l[e+66>>0]|0);if(!e){a=0;return a|0}k[g>>2]=c;k[a+96>>2]=c;k[a+104>>2]=e;k[a+100>>2]=d+(e+b);k[a+108>>2]=0;k[a+112>>2]=0;if(!(qb(g,a+116|0)|0)){a=0;return a|0}b=k[f>>2]|0;do if(!((l[b+39>>0]|0)<<8|(l[b+40>>0]|0))){if(!((l[b+55>>0]|0)<<8|(l[b+56>>0]|0))){a=0;return a|0}}else{if(!(qb(g,a+140|0)|0)){a=0;return a|0}if(qb(g,a+188|0)|0){b=k[f>>2]|0;break}else{a=0;return a|0}}while(0);if((l[b+55>>0]|0)<<8|(l[b+56>>0]|0)){if(!(qb(g,a+164|0)|0)){a=0;return a|0}if(!(qb(g,a+212|0)|0)){a=0;return a|0}}a=1;return a|0}function Fb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+576|0;h=q;g=q+64|0;p=q+16|0;d=a+88|0;b=k[d>>2]|0;o=(l[b+39>>0]|0)<<8|(l[b+40>>0]|0);m=a+236|0;f=a+240|0;c=k[f>>2]|0;if((c|0)!=(o|0)){if(c>>>0<=o>>>0){do if((k[a+244>>2]|0)>>>0>>0){if(gb(m,o,(c+1|0)==(o|0),4,0)|0){b=k[f>>2]|0;break}i[a+248>>0]=1;p=0;r=q;return p|0}else b=c;while(0);$c((k[m>>2]|0)+(b<<2)|0,0,o-b<<2|0)|0;b=k[d>>2]|0}k[f>>2]=o}j=a+92|0;c=k[a+4>>2]|0;d=(l[b+34>>0]|0)<<8|(l[b+33>>0]|0)<<16|(l[b+35>>0]|0);e=c+d|0;b=(l[b+37>>0]|0)<<8|(l[b+36>>0]|0)<<16|(l[b+38>>0]|0);if(!b){p=0;r=q;return p|0}k[j>>2]=e;k[a+96>>2]=e;k[a+104>>2]=b;k[a+100>>2]=c+(b+d);k[a+108>>2]=0;k[a+112>>2]=0;k[p+20>>2]=0;k[p>>2]=0;k[p+4>>2]=0;k[p+8>>2]=0;k[p+12>>2]=0;i[p+16>>0]=0;a=p+24|0;k[p+44>>2]=0;k[a>>2]=0;k[a+4>>2]=0;k[a+8>>2]=0;k[a+12>>2]=0;i[a+16>>0]=0;if(qb(j,p)|0?(n=p+24|0,qb(j,n)|0):0){if(!(k[f>>2]|0)){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;yc(g,1084,h)|0;xc(g)|0}if(!o)b=1;else{d=0;e=0;f=0;b=0;g=0;a=0;h=0;c=k[m>>2]|0;while(1){d=(sb(j,p)|0)+d&31;e=(sb(j,n)|0)+e&63;f=(sb(j,p)|0)+f&31;b=(sb(j,p)|0)+b|0;g=(sb(j,n)|0)+g&63;a=(sb(j,p)|0)+a&31;k[c>>2]=e<<5|d<<11|f|b<<27|g<<21|a<<16;h=h+1|0;if((h|0)==(o|0)){b=1;break}else{b=b&31;c=c+4|0}}}}else b=0;nb(p+24|0);nb(p);p=b;r=q;return p|0}function Gb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0;D=r;r=r+1008|0;g=D;f=D+496|0;C=D+472|0;A=D+276|0;B=D+80|0;z=D+16|0;e=k[a+88>>2]|0;y=(l[e+47>>0]|0)<<8|(l[e+48>>0]|0);x=a+92|0;b=k[a+4>>2]|0;c=(l[e+42>>0]|0)<<8|(l[e+41>>0]|0)<<16|(l[e+43>>0]|0);d=b+c|0;e=(l[e+45>>0]|0)<<8|(l[e+44>>0]|0)<<16|(l[e+46>>0]|0);if(!e){C=0;r=D;return C|0}k[x>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[C+20>>2]=0;k[C>>2]=0;k[C+4>>2]=0;k[C+8>>2]=0;k[C+12>>2]=0;i[C+16>>0]=0;if(qb(x,C)|0){c=0;d=-3;e=-3;while(1){k[A+(c<<2)>>2]=d;k[B+(c<<2)>>2]=e;b=(d|0)>2;c=c+1|0;if((c|0)==49)break;else{d=b?-3:d+1|0;e=(b&1)+e|0}}b=z;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));w=a+252|0;c=a+256|0;b=k[c>>2]|0;a:do if((b|0)==(y|0))h=13;else{if(b>>>0<=y>>>0){do if((k[a+260>>2]|0)>>>0>>0)if(gb(w,y,(b+1|0)==(y|0),4,0)|0){b=k[c>>2]|0;break}else{i[a+264>>0]=1;b=0;break a}while(0);$c((k[w>>2]|0)+(b<<2)|0,0,y-b<<2|0)|0}k[c>>2]=y;h=13}while(0);do if((h|0)==13){if(!y){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;b=1;break}d=z+4|0;e=z+8|0;a=z+12|0;f=z+16|0;g=z+20|0;h=z+24|0;j=z+28|0;m=z+32|0;n=z+36|0;o=z+40|0;p=z+44|0;q=z+48|0;s=z+52|0;t=z+56|0;u=z+60|0;v=0;c=k[w>>2]|0;while(1){b=0;do{E=sb(x,C)|0;w=b<<1;F=z+(w<<2)|0;k[F>>2]=(k[F>>2]|0)+(k[A+(E<<2)>>2]|0)&3;w=z+((w|1)<<2)|0;k[w>>2]=(k[w>>2]|0)+(k[B+(E<<2)>>2]|0)&3;b=b+1|0}while((b|0)!=8);k[c>>2]=(l[1713+(k[d>>2]|0)>>0]|0)<<2|(l[1713+(k[z>>2]|0)>>0]|0)|(l[1713+(k[e>>2]|0)>>0]|0)<<4|(l[1713+(k[a>>2]|0)>>0]|0)<<6|(l[1713+(k[f>>2]|0)>>0]|0)<<8|(l[1713+(k[g>>2]|0)>>0]|0)<<10|(l[1713+(k[h>>2]|0)>>0]|0)<<12|(l[1713+(k[j>>2]|0)>>0]|0)<<14|(l[1713+(k[m>>2]|0)>>0]|0)<<16|(l[1713+(k[n>>2]|0)>>0]|0)<<18|(l[1713+(k[o>>2]|0)>>0]|0)<<20|(l[1713+(k[p>>2]|0)>>0]|0)<<22|(l[1713+(k[q>>2]|0)>>0]|0)<<24|(l[1713+(k[s>>2]|0)>>0]|0)<<26|(l[1713+(k[t>>2]|0)>>0]|0)<<28|(l[1713+(k[u>>2]|0)>>0]|0)<<30;v=v+1|0;if((v|0)==(y|0)){b=1;break}else c=c+4|0}}while(0)}else b=0;nb(C);F=b;r=D;return F|0}function Hb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0;p=r;r=r+560|0;h=p;g=p+40|0;o=p+16|0;e=k[a+88>>2]|0;n=(l[e+55>>0]|0)<<8|(l[e+56>>0]|0);m=a+92|0;b=k[a+4>>2]|0;c=(l[e+50>>0]|0)<<8|(l[e+49>>0]|0)<<16|(l[e+51>>0]|0);d=b+c|0;e=(l[e+53>>0]|0)<<8|(l[e+52>>0]|0)<<16|(l[e+54>>0]|0);if(!e){o=0;r=p;return o|0}k[m>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[o+20>>2]=0;k[o>>2]=0;k[o+4>>2]=0;k[o+8>>2]=0;k[o+12>>2]=0;i[o+16>>0]=0;a:do if(qb(m,o)|0){f=a+268|0;c=a+272|0;b=k[c>>2]|0;if((b|0)!=(n|0)){if(b>>>0<=n>>>0){do if((k[a+276>>2]|0)>>>0>>0)if(gb(f,n,(b+1|0)==(n|0),2,0)|0){b=k[c>>2]|0;break}else{i[a+280>>0]=1;b=0;break a}while(0);$c((k[f>>2]|0)+(b<<1)|0,0,n-b<<1|0)|0}k[c>>2]=n}if(!n){k[h>>2]=1138;k[h+4>>2]=906;k[h+8>>2]=1769;yc(g,1084,h)|0;xc(g)|0;b=1;break}c=0;d=0;e=0;b=k[f>>2]|0;while(1){h=sb(m,o)|0;c=h+c&255;d=(sb(m,o)|0)+d&255;j[b>>1]=d<<8|c;e=e+1|0;if((e|0)==(n|0)){b=1;break}else b=b+2|0}}else b=0;while(0);nb(o);o=b;r=p;return o|0}function Ib(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0;E=r;r=r+2416|0;g=E;f=E+1904|0;D=E+1880|0;B=E+980|0;C=E+80|0;A=E+16|0;e=k[a+88>>2]|0;z=(l[e+63>>0]|0)<<8|(l[e+64>>0]|0);y=a+92|0;b=k[a+4>>2]|0;c=(l[e+58>>0]|0)<<8|(l[e+57>>0]|0)<<16|(l[e+59>>0]|0);d=b+c|0;e=(l[e+61>>0]|0)<<8|(l[e+60>>0]|0)<<16|(l[e+62>>0]|0);if(!e){D=0;r=E;return D|0}k[y>>2]=d;k[a+96>>2]=d;k[a+104>>2]=e;k[a+100>>2]=b+(e+c);k[a+108>>2]=0;k[a+112>>2]=0;k[D+20>>2]=0;k[D>>2]=0;k[D+4>>2]=0;k[D+8>>2]=0;k[D+12>>2]=0;i[D+16>>0]=0;if(qb(y,D)|0){c=0;d=-7;e=-7;while(1){k[B+(c<<2)>>2]=d;k[C+(c<<2)>>2]=e;b=(d|0)>6;c=c+1|0;if((c|0)==225)break;else{d=b?-7:d+1|0;e=(b&1)+e|0}}b=A;c=b+64|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(c|0));x=a+284|0;c=z*3|0;d=a+288|0;b=k[d>>2]|0;a:do if((b|0)==(c|0))h=13;else{if(b>>>0<=c>>>0){do if((k[a+292>>2]|0)>>>0>>0)if(gb(x,c,(b+1|0)==(c|0),2,0)|0){b=k[d>>2]|0;break}else{i[a+296>>0]=1;b=0;break a}while(0);$c((k[x>>2]|0)+(b<<1)|0,0,c-b<<1|0)|0}k[d>>2]=c;h=13}while(0);do if((h|0)==13){if(!z){k[g>>2]=1138;k[g+4>>2]=906;k[g+8>>2]=1769;yc(f,1084,g)|0;xc(f)|0;b=1;break}d=A+4|0;e=A+8|0;a=A+12|0;f=A+16|0;g=A+20|0;h=A+24|0;m=A+28|0;n=A+32|0;o=A+36|0;p=A+40|0;q=A+44|0;s=A+48|0;t=A+52|0;u=A+56|0;v=A+60|0;w=0;c=k[x>>2]|0;while(1){b=0;do{F=sb(y,D)|0;x=b<<1;G=A+(x<<2)|0;k[G>>2]=(k[G>>2]|0)+(k[B+(F<<2)>>2]|0)&7;x=A+((x|1)<<2)|0;k[x>>2]=(k[x>>2]|0)+(k[C+(F<<2)>>2]|0)&7;b=b+1|0}while((b|0)!=8);F=l[1717+(k[g>>2]|0)>>0]|0;j[c>>1]=(l[1717+(k[d>>2]|0)>>0]|0)<<3|(l[1717+(k[A>>2]|0)>>0]|0)|(l[1717+(k[e>>2]|0)>>0]|0)<<6|(l[1717+(k[a>>2]|0)>>0]|0)<<9|(l[1717+(k[f>>2]|0)>>0]|0)<<12|F<<15;G=l[1717+(k[p>>2]|0)>>0]|0;j[c+2>>1]=(l[1717+(k[h>>2]|0)>>0]|0)<<2|F>>>1|(l[1717+(k[m>>2]|0)>>0]|0)<<5|(l[1717+(k[n>>2]|0)>>0]|0)<<8|(l[1717+(k[o>>2]|0)>>0]|0)<<11|G<<14;j[c+4>>1]=(l[1717+(k[q>>2]|0)>>0]|0)<<1|G>>>2|(l[1717+(k[s>>2]|0)>>0]|0)<<4|(l[1717+(k[t>>2]|0)>>0]|0)<<7|(l[1717+(k[u>>2]|0)>>0]|0)<<10|(l[1717+(k[v>>2]|0)>>0]|0)<<13;w=w+1|0;if((w|0)==(z|0)){b=1;break}else c=c+6|0}}while(0)}else b=0;nb(D);G=b;r=E;return G|0}function Jb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,m=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ia=0,ja=0;ga=r;r=r+656|0;ea=ga+112|0;ca=ga+96|0;ba=ga+80|0;aa=ga+64|0;$=ga+48|0;fa=ga+32|0;da=ga+16|0;_=ga;Y=ga+144|0;Z=ga+128|0;R=a+240|0;S=k[R>>2]|0;V=a+256|0;W=k[V>>2]|0;c=i[(k[a+88>>2]|0)+17>>0]|0;X=d>>>2;if(!(c<<24>>24)){r=ga;return 1}T=(h|0)==0;U=h+-1|0;K=(f&1|0)!=0;L=d<<1;M=a+92|0;N=a+116|0;O=a+140|0;P=a+236|0;Q=g+-1|0;J=(e&1|0)!=0;I=a+188|0;D=a+252|0;E=X+1|0;F=X+2|0;G=X+3|0;H=Q<<4;B=c&255;c=0;f=0;e=1;C=0;do{if(!T){z=k[b+(C<<2)>>2]|0;A=0;while(1){w=A&1;j=(w|0)==0;v=(w<<5^32)+-16|0;w=(w<<1^2)+-1|0;y=j?g:-1;m=j?0:Q;a=(A|0)==(U|0);x=K&a;if((m|0)!=(y|0)){u=K&a^1;t=j?z:z+H|0;while(1){if((e|0)==1)e=sb(M,N)|0|512;s=e&7;e=e>>>3;j=l[1811+s>>0]|0;a=0;do{p=(sb(M,O)|0)+f|0;q=p-S|0;f=q>>31;f=f&p|q&~f;if((k[R>>2]|0)>>>0<=f>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;yc(Y,1084,_)|0;xc(Y)|0}k[Z+(a<<2)>>2]=k[(k[P>>2]|0)+(f<<2)>>2];a=a+1|0}while(a>>>0>>0);q=J&(m|0)==(Q|0);if(x|q){p=0;do{n=ha(p,d)|0;a=t+n|0;j=(p|0)==0|u;o=p<<1;ja=(sb(M,I)|0)+c|0;ia=ja-W|0;c=ia>>31;c=c&ja|ia&~c;do if(q){if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ca>>2]=1138;k[ca+4>>2]=906;k[ca+8>>2]=1769;yc(Y,1084,ca)|0;xc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c}else{if(!j){ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;break}k[a>>2]=k[Z+((l[1819+(s<<2)+o>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ba>>2]=1138;k[ba+4>>2]=906;k[ba+8>>2]=1769;yc(Y,1084,ba)|0;xc(Y)|0}k[t+(n+4)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;k[t+(n+8)>>2]=k[Z+((l[(o|1)+(1819+(s<<2))>>0]|0)<<2)>>2];if((k[V>>2]|0)>>>0<=c>>>0){k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;yc(Y,1084,ea)|0;xc(Y)|0}k[t+(n+12)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}while(0);p=p+1|0}while((p|0)!=2)}else{k[t>>2]=k[Z+((l[1819+(s<<2)>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;yc(Y,1084,da)|0;xc(Y)|0}k[t+4>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+8>>2]=k[Z+((l[1819+(s<<2)+1>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;yc(Y,1084,fa)|0;xc(Y)|0}k[t+12>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(X<<2)>>2]=k[Z+((l[1819+(s<<2)+2>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[$>>2]=1138;k[$+4>>2]=906;k[$+8>>2]=1769;yc(Y,1084,$)|0;xc(Y)|0}k[t+(E<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2];k[t+(F<<2)>>2]=k[Z+((l[1819+(s<<2)+3>>0]|0)<<2)>>2];ia=(sb(M,I)|0)+c|0;ja=ia-W|0;c=ja>>31;c=c&ia|ja&~c;if((k[V>>2]|0)>>>0<=c>>>0){k[aa>>2]=1138;k[aa+4>>2]=906;k[aa+8>>2]=1769;yc(Y,1084,aa)|0;xc(Y)|0}k[t+(G<<2)>>2]=k[(k[D>>2]|0)+(c<<2)>>2]}m=m+w|0;if((m|0)==(y|0))break;else t=t+v|0}}A=A+1|0;if((A|0)==(h|0))break;else z=z+L|0}}C=C+1|0}while((C|0)!=(B|0));r=ga;return 1}function Kb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0,ia=0,ja=0,ka=0,la=0,ma=0,na=0;ma=r;r=r+608|0;ja=ma+48|0;la=ma+32|0;ka=ma+16|0;ia=ma;ga=ma+96|0;ha=ma+80|0;fa=ma+64|0;S=a+240|0;T=k[S>>2]|0;W=a+256|0;ca=k[W>>2]|0;da=a+272|0;ea=k[da>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ma;return 1}V=(h|0)==0;X=h+-1|0;Y=d<<1;Z=a+92|0;_=a+116|0;$=g+-1|0;aa=a+212|0;ba=a+188|0;R=(e&1|0)==0;Q=(f&1|0)==0;K=a+288|0;L=a+284|0;M=a+252|0;N=a+140|0;O=a+236|0;P=a+164|0;I=a+268|0;J=$<<5;G=c&255;c=0;e=0;f=0;a=0;j=1;H=0;do{if(!V){E=k[b+(H<<2)>>2]|0;F=0;while(1){C=F&1;n=(C|0)==0;B=(C<<6^64)+-32|0;C=(C<<1^2)+-1|0;D=n?g:-1;o=n?0:$;if((o|0)!=(D|0)){A=Q|(F|0)!=(X|0);z=n?E:E+J|0;while(1){if((j|0)==1)j=sb(Z,_)|0|512;y=j&7;j=j>>>3;p=l[1811+y>>0]|0;n=0;do{w=(sb(Z,P)|0)+e|0;x=w-ea|0;e=x>>31;e=e&w|x&~e;if((k[da>>2]|0)>>>0<=e>>>0){k[ia>>2]=1138;k[ia+4>>2]=906;k[ia+8>>2]=1769;yc(ga,1084,ia)|0;xc(ga)|0}k[fa+(n<<2)>>2]=m[(k[I>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{w=(sb(Z,N)|0)+a|0;x=w-T|0;a=x>>31;a=a&w|x&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[ka>>2]=1138;k[ka+4>>2]=906;k[ka+8>>2]=1769;yc(ga,1084,ka)|0;xc(ga)|0}k[ha+(n<<2)>>2]=k[(k[O>>2]|0)+(a<<2)>>2];n=n+1|0}while(n>>>0

    >>0);x=R|(o|0)!=($|0);v=0;w=z;while(1){u=A|(v|0)==0;t=v<<1;q=0;s=w;while(1){p=(sb(Z,aa)|0)+c|0;n=p-U|0;c=n>>31;c=c&p|n&~c;n=(sb(Z,ba)|0)+f|0;p=n-ca|0;f=p>>31;f=f&n|p&~f;if((x|(q|0)==0)&u){n=l[q+t+(1819+(y<<2))>>0]|0;p=c*3|0;if((k[K>>2]|0)>>>0<=p>>>0){k[la>>2]=1138;k[la+4>>2]=906;k[la+8>>2]=1769;yc(ga,1084,la)|0;xc(ga)|0}na=k[L>>2]|0;k[s>>2]=(m[na+(p<<1)>>1]|0)<<16|k[fa+(n<<2)>>2];k[s+4>>2]=(m[na+(p+2<<1)>>1]|0)<<16|(m[na+(p+1<<1)>>1]|0);k[s+8>>2]=k[ha+(n<<2)>>2];if((k[W>>2]|0)>>>0<=f>>>0){k[ja>>2]=1138;k[ja+4>>2]=906;k[ja+8>>2]=1769;yc(ga,1084,ja)|0;xc(ga)|0}k[s+12>>2]=k[(k[M>>2]|0)+(f<<2)>>2]}q=q+1|0;if((q|0)==2)break;else s=s+16|0}v=v+1|0;if((v|0)==2)break;else w=w+d|0}o=o+C|0;if((o|0)==(D|0))break;else z=z+B|0}}F=F+1|0;if((F|0)==(h|0))break;else E=E+Y|0}}H=H+1|0}while((H|0)!=(G|0));r=ma;return 1}function Lb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0;$=r;r=r+576|0;_=$+32|0;Z=$+16|0;Y=$;X=$+64|0;W=$+48|0;M=a+272|0;N=k[M>>2]|0;c=k[a+88>>2]|0;O=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=$;return 1}P=(h|0)==0;Q=h+-1|0;R=d<<1;S=a+92|0;T=a+116|0;U=g+-1|0;V=a+212|0;L=(f&1|0)==0;I=a+288|0;J=a+284|0;K=a+164|0;G=a+268|0;H=U<<4;F=c&255;E=(e&1|0)!=0;c=0;f=0;a=1;D=0;do{if(!P){B=k[b+(D<<2)>>2]|0;C=0;while(1){z=C&1;e=(z|0)==0;y=(z<<5^32)+-16|0;z=(z<<1^2)+-1|0;A=e?g:-1;j=e?0:U;if((j|0)!=(A|0)){x=L|(C|0)!=(Q|0);w=e?B:B+H|0;while(1){if((a|0)==1)a=sb(S,T)|0|512;v=a&7;a=a>>>3;n=l[1811+v>>0]|0;e=0;do{t=(sb(S,K)|0)+f|0;u=t-N|0;f=u>>31;f=f&t|u&~f;if((k[M>>2]|0)>>>0<=f>>>0){k[Y>>2]=1138;k[Y+4>>2]=906;k[Y+8>>2]=1769;yc(X,1084,Y)|0;xc(X)|0}k[W+(e<<2)>>2]=m[(k[G>>2]|0)+(f<<1)>>1];e=e+1|0}while(e>>>0>>0);u=(j|0)==(U|0)&E;s=0;t=w;while(1){q=x|(s|0)==0;p=s<<1;e=(sb(S,V)|0)+c|0;o=e-O|0;n=o>>31;n=n&e|o&~n;if(q){c=l[1819+(v<<2)+p>>0]|0;e=n*3|0;if((k[I>>2]|0)>>>0<=e>>>0){k[Z>>2]=1138;k[Z+4>>2]=906;k[Z+8>>2]=1769;yc(X,1084,Z)|0;xc(X)|0}o=k[J>>2]|0;k[t>>2]=(m[o+(e<<1)>>1]|0)<<16|k[W+(c<<2)>>2];k[t+4>>2]=(m[o+(e+2<<1)>>1]|0)<<16|(m[o+(e+1<<1)>>1]|0)}o=t+8|0;e=(sb(S,V)|0)+n|0;n=e-O|0;c=n>>31;c=c&e|n&~c;if(!(u|q^1)){e=l[(p|1)+(1819+(v<<2))>>0]|0;n=c*3|0;if((k[I>>2]|0)>>>0<=n>>>0){k[_>>2]=1138;k[_+4>>2]=906;k[_+8>>2]=1769;yc(X,1084,_)|0;xc(X)|0}q=k[J>>2]|0;k[o>>2]=(m[q+(n<<1)>>1]|0)<<16|k[W+(e<<2)>>2];k[t+12>>2]=(m[q+(n+2<<1)>>1]|0)<<16|(m[q+(n+1<<1)>>1]|0)}s=s+1|0;if((s|0)==2)break;else t=t+d|0}j=j+z|0;if((j|0)==(A|0))break;else w=w+y|0}}C=C+1|0;if((C|0)==(h|0))break;else B=B+R|0}}D=D+1|0}while((D|0)!=(F|0));r=$;return 1}function Mb(a,b,c,d,e,f,g,h){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;h=h|0;var j=0,n=0,o=0,p=0,q=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0,ha=0;ha=r;r=r+608|0;ea=ha+48|0;ga=ha+32|0;fa=ha+16|0;da=ha;ca=ha+96|0;aa=ha+80|0;ba=ha+64|0;S=a+272|0;T=k[S>>2]|0;c=k[a+88>>2]|0;U=(l[c+63>>0]|0)<<8|(l[c+64>>0]|0);c=i[c+17>>0]|0;if(!(c<<24>>24)){r=ha;return 1}V=(h|0)==0;W=h+-1|0;X=d<<1;Y=a+92|0;Z=a+116|0;_=g+-1|0;$=a+212|0;R=(e&1|0)==0;Q=(f&1|0)==0;N=a+288|0;O=a+284|0;P=a+164|0;L=a+268|0;M=_<<5;J=c&255;c=0;e=0;f=0;a=0;j=1;K=0;do{if(!V){H=k[b+(K<<2)>>2]|0;I=0;while(1){F=I&1;n=(F|0)==0;E=(F<<6^64)+-32|0;F=(F<<1^2)+-1|0;G=n?g:-1;o=n?0:_;if((o|0)!=(G|0)){D=Q|(I|0)!=(W|0);C=n?H:H+M|0;while(1){if((j|0)==1)j=sb(Y,Z)|0|512;B=j&7;j=j>>>3;p=l[1811+B>>0]|0;n=0;do{z=(sb(Y,P)|0)+a|0;A=z-T|0;a=A>>31;a=a&z|A&~a;if((k[S>>2]|0)>>>0<=a>>>0){k[da>>2]=1138;k[da+4>>2]=906;k[da+8>>2]=1769;yc(ca,1084,da)|0;xc(ca)|0}k[aa+(n<<2)>>2]=m[(k[L>>2]|0)+(a<<1)>>1];n=n+1|0}while(n>>>0

    >>0);n=0;do{z=(sb(Y,P)|0)+e|0;A=z-T|0;e=A>>31;e=e&z|A&~e;if((k[S>>2]|0)>>>0<=e>>>0){k[fa>>2]=1138;k[fa+4>>2]=906;k[fa+8>>2]=1769;yc(ca,1084,fa)|0;xc(ca)|0}k[ba+(n<<2)>>2]=m[(k[L>>2]|0)+(e<<1)>>1];n=n+1|0}while(n>>>0

    >>0);A=R|(o|0)!=(_|0);y=0;z=C;while(1){x=D|(y|0)==0;w=y<<1;u=0;v=z;while(1){t=(sb(Y,$)|0)+f|0;s=t-U|0;f=s>>31;f=f&t|s&~f;s=(sb(Y,$)|0)+c|0;t=s-U|0;c=t>>31;c=c&s|t&~c;if((A|(u|0)==0)&x){s=l[u+w+(1819+(B<<2))>>0]|0;t=f*3|0;n=k[N>>2]|0;if(n>>>0<=t>>>0){k[ga>>2]=1138;k[ga+4>>2]=906;k[ga+8>>2]=1769;yc(ca,1084,ga)|0;xc(ca)|0;n=k[N>>2]|0}p=k[O>>2]|0;q=c*3|0;if(n>>>0>q>>>0)n=p;else{k[ea>>2]=1138;k[ea+4>>2]=906;k[ea+8>>2]=1769;yc(ca,1084,ea)|0;xc(ca)|0;n=k[O>>2]|0}k[v>>2]=(m[p+(t<<1)>>1]|0)<<16|k[aa+(s<<2)>>2];k[v+4>>2]=(m[p+(t+2<<1)>>1]|0)<<16|(m[p+(t+1<<1)>>1]|0);k[v+8>>2]=(m[n+(q<<1)>>1]|0)<<16|k[ba+(s<<2)>>2];k[v+12>>2]=(m[n+(q+2<<1)>>1]|0)<<16|(m[n+(q+1<<1)>>1]|0)}u=u+1|0;if((u|0)==2)break;else v=v+16|0}y=y+1|0;if((y|0)==2)break;else z=z+d|0}o=o+F|0;if((o|0)==(G|0))break;else C=C+E|0}}I=I+1|0;if((I|0)==(h|0))break;else H=H+X|0}}K=K+1|0}while((K|0)!=(J|0));r=ha;return 1}function Nb(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+576|0;h=j+48|0;f=j+32|0;e=j+16|0;d=j;g=j+64|0;k[a>>2]=0;b=a+284|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[d>>2]=1138;k[d+4>>2]=2502;k[d+8>>2]=1504;yc(g,1084,d)|0;xc(g)|0}k[b>>2]=0;k[a+288>>2]=0;k[a+292>>2]=0}i[a+296>>0]=0;c=a+268|0;b=k[c>>2]|0;if(b){if(!(b&7))kb(b,0,0,1,0)|0;else{k[e>>2]=1138;k[e+4>>2]=2502;k[e+8>>2]=1504;yc(g,1084,e)|0;xc(g)|0}k[c>>2]=0;k[a+272>>2]=0;k[a+276>>2]=0}i[a+280>>0]=0;b=a+252|0;c=k[b>>2]|0;if(c){if(!(c&7))kb(c,0,0,1,0)|0;else{k[f>>2]=1138;k[f+4>>2]=2502;k[f+8>>2]=1504;yc(g,1084,f)|0;xc(g)|0}k[b>>2]=0;k[a+256>>2]=0;k[a+260>>2]=0}i[a+264>>0]=0;b=a+236|0;c=k[b>>2]|0;if(!c){h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}if(!(c&7))kb(c,0,0,1,0)|0;else{k[h>>2]=1138;k[h+4>>2]=2502;k[h+8>>2]=1504;yc(g,1084,h)|0;xc(g)|0}k[b>>2]=0;k[a+240>>2]=0;k[a+244>>2]=0;h=a+248|0;i[h>>0]=0;h=a+212|0;nb(h);h=a+188|0;nb(h);h=a+164|0;nb(h);h=a+140|0;nb(h);h=a+116|0;nb(h);r=j;return}function Ob(a,b){a=a|0;b=b|0;var c=0;c=r;r=r+16|0;k[c>>2]=b;b=k[60]|0;zc(b,a,c)|0;tc(10,b)|0;Aa()}function Pb(){var a=0,b=0;a=r;r=r+16|0;if(!(Ka(192,2)|0)){b=va(k[47]|0)|0;r=a;return b|0}else Ob(2078,a);return 0}function Qb(a){a=a|0;Tc(a);return}function Rb(a){a=a|0;var b=0;b=r;r=r+16|0;Wa[a&3]();Ob(2127,b)}function Sb(){var a=0,b=0;a=Pb()|0;if(((a|0)!=0?(b=k[a>>2]|0,(b|0)!=0):0)?(a=b+48|0,(k[a>>2]&-256|0)==1126902528?(k[a+4>>2]|0)==1129074247:0):0)Rb(k[b+12>>2]|0);b=k[26]|0;k[26]=b+0;Rb(b)}function Tb(a){a=a|0;return}function Ub(a){a=a|0;return}function Vb(a){a=a|0;return}function Wb(a){a=a|0;return}function Xb(a){a=a|0;Qb(a);return}function Yb(a){a=a|0;Qb(a);return}function Zb(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;g=r;r=r+64|0;f=g;if((a|0)!=(b|0))if((b|0)!=0?(e=bc(b,24,40,0)|0,(e|0)!=0):0){b=f;d=b+56|0;do{k[b>>2]=0;b=b+4|0}while((b|0)<(d|0));k[f>>2]=e;k[f+8>>2]=a;k[f+12>>2]=-1;k[f+48>>2]=1;Ya[k[(k[e>>2]|0)+28>>2]&3](e,f,k[c>>2]|0,1);if((k[f+24>>2]|0)==1){k[c>>2]=k[f+16>>2];b=1}else b=0}else b=0;else b=1;r=g;return b|0}function _b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0;a=b+16|0;e=k[a>>2]|0;do if(e){if((e|0)!=(c|0)){d=b+36|0;k[d>>2]=(k[d>>2]|0)+1;k[b+24>>2]=2;i[b+54>>0]=1;break}a=b+24|0;if((k[a>>2]|0)==2)k[a>>2]=d}else{k[a>>2]=c;k[b+24>>2]=d;k[b+36>>2]=1}while(0);return}function $b(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))_b(0,b,c,d);return}function ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;if((a|0)==(k[b+8>>2]|0))_b(0,b,c,d);else{a=k[a+8>>2]|0;Ya[k[(k[a>>2]|0)+28>>2]&3](a,b,c,d)}return}function bc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,l=0,m=0,n=0,o=0,p=0,q=0;q=r;r=r+64|0;p=q;o=k[a>>2]|0;n=a+(k[o+-8>>2]|0)|0;o=k[o+-4>>2]|0;k[p>>2]=c;k[p+4>>2]=a;k[p+8>>2]=b;k[p+12>>2]=d;d=p+16|0;a=p+20|0;b=p+24|0;e=p+28|0;f=p+32|0;g=p+40|0;h=(o|0)==(c|0);l=d;m=l+36|0;do{k[l>>2]=0;l=l+4|0}while((l|0)<(m|0));j[d+36>>1]=0;i[d+38>>0]=0;a:do if(h){k[p+48>>2]=1;Xa[k[(k[c>>2]|0)+20>>2]&3](c,p,n,n,1,0);d=(k[b>>2]|0)==1?n:0}else{Sa[k[(k[o>>2]|0)+24>>2]&3](o,p,n,1,0);switch(k[p+36>>2]|0){case 0:{d=(k[g>>2]|0)==1&(k[e>>2]|0)==1&(k[f>>2]|0)==1?k[a>>2]|0:0;break a}case 1:break;default:{d=0;break a}}if((k[b>>2]|0)!=1?!((k[g>>2]|0)==0&(k[e>>2]|0)==1&(k[f>>2]|0)==1):0){d=0;break}d=k[d>>2]|0}while(0);r=q;return d|0}function cc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;i[b+53>>0]=1;do if((k[b+4>>2]|0)==(d|0)){i[b+52>>0]=1;d=b+16|0;a=k[d>>2]|0;if(!a){k[d>>2]=c;k[b+24>>2]=e;k[b+36>>2]=1;if(!((e|0)==1?(k[b+48>>2]|0)==1:0))break;i[b+54>>0]=1;break}if((a|0)!=(c|0)){e=b+36|0;k[e>>2]=(k[e>>2]|0)+1;i[b+54>>0]=1;break}a=b+24|0;d=k[a>>2]|0;if((d|0)==2){k[a>>2]=e;d=e}if((d|0)==1?(k[b+48>>2]|0)==1:0)i[b+54>>0]=1}while(0);return}function dc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,j=0;a:do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(f=b+28|0,(k[f>>2]|0)!=1):0)k[f>>2]=d}else{if((a|0)!=(k[b>>2]|0)){h=k[a+8>>2]|0;Sa[k[(k[h>>2]|0)+24>>2]&3](h,b,c,d,e);break}if((k[b+16>>2]|0)!=(c|0)?(g=b+20|0,(k[g>>2]|0)!=(c|0)):0){k[b+32>>2]=d;d=b+44|0;if((k[d>>2]|0)==4)break;f=b+52|0;i[f>>0]=0;j=b+53|0;i[j>>0]=0;a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,c,1,e);if(i[j>>0]|0){if(!(i[f>>0]|0)){f=1;h=13}}else{f=0;h=13}do if((h|0)==13){k[g>>2]=c;j=b+40|0;k[j>>2]=(k[j>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0){i[b+54>>0]=1;if(f)break}else h=16;if((h|0)==16?f:0)break;k[d>>2]=4;break a}while(0);k[d>>2]=3;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function ec(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0;do if((a|0)==(k[b+8>>2]|0)){if((k[b+4>>2]|0)==(c|0)?(g=b+28|0,(k[g>>2]|0)!=1):0)k[g>>2]=d}else if((a|0)==(k[b>>2]|0)){if((k[b+16>>2]|0)!=(c|0)?(f=b+20|0,(k[f>>2]|0)!=(c|0)):0){k[b+32>>2]=d;k[f>>2]=c;e=b+40|0;k[e>>2]=(k[e>>2]|0)+1;if((k[b+36>>2]|0)==1?(k[b+24>>2]|0)==2:0)i[b+54>>0]=1;k[b+44>>2]=4;break}if((d|0)==1)k[b+32>>2]=1}while(0);return}function fc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))cc(0,b,c,d,e);else{a=k[a+8>>2]|0;Xa[k[(k[a>>2]|0)+20>>2]&3](a,b,c,d,e,f)}return}function gc(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;if((a|0)==(k[b+8>>2]|0))cc(0,b,c,d,e);return}function hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+16|0;d=e;k[d>>2]=k[c>>2];a=Ra[k[(k[a>>2]|0)+16>>2]&7](a,b,d)|0;if(a)k[c>>2]=k[d>>2];r=e;return a&1|0}function ic(a){a=a|0;if(!a)a=0;else a=(bc(a,24,72,0)|0)!=0;return a&1|0}function jc(){var a=0,b=0,c=0,d=0,e=0,f=0,g=0,h=0;e=r;r=r+48|0;g=e+32|0;c=e+24|0;h=e+16|0;f=e;e=e+36|0;a=Pb()|0;if((a|0)!=0?(d=k[a>>2]|0,(d|0)!=0):0){a=d+48|0;b=k[a>>2]|0;a=k[a+4>>2]|0;if(!((b&-256|0)==1126902528&(a|0)==1129074247)){k[c>>2]=2406;Ob(2356,c)}if((b|0)==1126902529&(a|0)==1129074247)a=k[d+44>>2]|0;else a=d+80|0;k[e>>2]=a;d=k[d>>2]|0;a=k[d+4>>2]|0;if(Ra[k[(k[8>>2]|0)+16>>2]&7](8,d,e)|0){h=k[e>>2]|0;h=Ua[k[(k[h>>2]|0)+8>>2]&1](h)|0;k[f>>2]=2406;k[f+4>>2]=a;k[f+8>>2]=h;Ob(2270,f)}else{k[h>>2]=2406;k[h+4>>2]=a;Ob(2315,h)}}Ob(2394,g)}function kc(){var a=0;a=r;r=r+16|0;if(!(Fa(188,6)|0)){r=a;return}else Ob(2167,a)}function lc(a){a=a|0;var b=0;b=r;r=r+16|0;Tc(a);if(!(wa(k[47]|0,0)|0)){r=b;return}else Ob(2217,b)}function mc(a){a=a|0;var b=0,c=0;b=0;while(1){if((l[2415+b>>0]|0)==(a|0)){c=2;break}b=b+1|0;if((b|0)==87){b=87;a=2503;c=5;break}}if((c|0)==2)if(!b)a=2503;else{a=2503;c=5}if((c|0)==5)while(1){c=a;while(1){a=c+1|0;if(!(i[c>>0]|0))break;else c=a}b=b+-1|0;if(!b)break;else c=5}return a|0}function nc(){var a=0;if(!0)a=248;else{a=(za()|0)+60|0;a=k[a>>2]|0}return a|0}function oc(a){a=a|0;var b=0;if(a>>>0>4294963200){b=nc()|0;k[b>>2]=0-a;a=-1}return a|0}function pc(a,b){a=+a;b=b|0;var c=0,d=0,e=0;p[t>>3]=a;c=k[t>>2]|0;d=k[t+4>>2]|0;e=ad(c|0,d|0,52)|0;e=e&2047;switch(e|0){case 0:{if(a!=0.0){a=+pc(a*18446744073709552.0e3,b);c=(k[b>>2]|0)+-64|0}else c=0;k[b>>2]=c;break}case 2047:break;default:{k[b>>2]=e+-1022;k[t>>2]=c;k[t+4>>2]=d&-2146435073|1071644672;a=+p[t>>3]}}return +a}function qc(a,b){a=+a;b=b|0;return +(+pc(a,b))}function rc(a,b,c){a=a|0;b=b|0;c=c|0;do if(a){if(b>>>0<128){i[a>>0]=b;a=1;break}if(b>>>0<2048){i[a>>0]=b>>>6|192;i[a+1>>0]=b&63|128;a=2;break}if(b>>>0<55296|(b&-8192|0)==57344){i[a>>0]=b>>>12|224;i[a+1>>0]=b>>>6&63|128;i[a+2>>0]=b&63|128;a=3;break}if((b+-65536|0)>>>0<1048576){i[a>>0]=b>>>18|240;i[a+1>>0]=b>>>12&63|128;i[a+2>>0]=b>>>6&63|128;i[a+3>>0]=b&63|128;a=4;break}else{a=nc()|0;k[a>>2]=84;a=-1;break}}else a=1;while(0);return a|0}function sc(a,b){a=a|0;b=b|0;if(!a)a=0;else a=rc(a,b,0)|0;return a|0}function tc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0;if((k[b+76>>2]|0)>=0?(Cc(b)|0)!=0:0){if((i[b+75>>0]|0)!=(a|0)?(d=b+20|0,e=k[d>>2]|0,e>>>0<(k[b+16>>2]|0)>>>0):0){k[d>>2]=e+1;i[e>>0]=a;c=a&255}else c=Ec(b,a)|0;Dc(b)}else g=3;do if((g|0)==3){if((i[b+75>>0]|0)!=(a|0)?(f=b+20|0,c=k[f>>2]|0,c>>>0<(k[b+16>>2]|0)>>>0):0){k[f>>2]=c+1;i[c>>0]=a;c=a&255;break}c=Ec(b,a)|0}while(0);return c|0}function uc(a,b){a=a|0;b=b|0;return (wc(a,Lc(a)|0,1,b)|0)+-1|0}function vc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=c+16|0;e=k[d>>2]|0;if(!e)if(!(Jc(c)|0)){e=k[d>>2]|0;f=4}else d=0;else f=4;a:do if((f|0)==4){g=c+20|0;f=k[g>>2]|0;if((e-f|0)>>>0>>0){d=Ra[k[c+36>>2]&7](c,a,b)|0;break}b:do if((i[c+75>>0]|0)>-1){d=b;while(1){if(!d){e=f;d=0;break b}e=d+-1|0;if((i[a+e>>0]|0)==10)break;else d=e}if((Ra[k[c+36>>2]&7](c,a,d)|0)>>>0>>0)break a;b=b-d|0;a=a+d|0;e=k[g>>2]|0}else{e=f;d=0}while(0);cd(e|0,a|0,b|0)|0;k[g>>2]=(k[g>>2]|0)+b;d=d+b|0}while(0);return d|0}function wc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=ha(c,b)|0;if((k[d+76>>2]|0)>-1){f=(Cc(d)|0)==0;a=vc(a,e,d)|0;if(!f)Dc(d)}else a=vc(a,e,d)|0;if((a|0)!=(e|0))c=(a>>>0)/(b>>>0)|0;return c|0}function xc(a){a=a|0;var b=0,c=0,d=0,e=0;d=k[61]|0;if((k[d+76>>2]|0)>-1)e=Cc(d)|0;else e=0;do if((uc(a,d)|0)<0)b=1;else{if((i[d+75>>0]|0)!=10?(b=d+20|0,c=k[b>>2]|0,c>>>0<(k[d+16>>2]|0)>>>0):0){k[b>>2]=c+1;i[c>>0]=10;b=0;break}b=(Ec(d,10)|0)<0}while(0);if(e)Dc(d);return b<<31>>31|0}function yc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=r;r=r+16|0;e=d;k[e>>2]=c;c=Bc(a,b,e)|0;r=d;return c|0}function zc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,s=0;s=r;r=r+224|0;n=s+120|0;q=s+80|0;p=s;o=s+136|0;d=q;e=d+40|0;do{k[d>>2]=0;d=d+4|0}while((d|0)<(e|0));k[n>>2]=k[c>>2];if((Mc(0,b,n,p,q)|0)<0)c=-1;else{if((k[a+76>>2]|0)>-1)l=Cc(a)|0;else l=0;c=k[a>>2]|0;m=c&32;if((i[a+74>>0]|0)<1)k[a>>2]=c&-33;c=a+48|0;if(!(k[c>>2]|0)){e=a+44|0;f=k[e>>2]|0;k[e>>2]=o;g=a+28|0;k[g>>2]=o;h=a+20|0;k[h>>2]=o;k[c>>2]=80;j=a+16|0;k[j>>2]=o+80;d=Mc(a,b,n,p,q)|0;if(f){Ra[k[a+36>>2]&7](a,0,0)|0;d=(k[h>>2]|0)==0?-1:d;k[e>>2]=f;k[c>>2]=0;k[j>>2]=0;k[g>>2]=0;k[h>>2]=0}}else d=Mc(a,b,n,p,q)|0;c=k[a>>2]|0;k[a>>2]=c|m;if(l)Dc(a);c=(c&32|0)==0?d:-1}r=s;return c|0}function Ac(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,j=0,l=0,m=0;m=r;r=r+128|0;e=m+112|0;l=m;f=l;g=252;h=f+112|0;do{k[f>>2]=k[g>>2];f=f+4|0;g=g+4|0}while((f|0)<(h|0));if((b+-1|0)>>>0>2147483646)if(!b){b=1;j=4}else{b=nc()|0;k[b>>2]=75;b=-1}else{e=a;j=4}if((j|0)==4){j=-2-e|0;j=b>>>0>j>>>0?j:b;k[l+48>>2]=j;a=l+20|0;k[a>>2]=e;k[l+44>>2]=e;b=e+j|0;e=l+16|0;k[e>>2]=b;k[l+28>>2]=b;b=zc(l,c,d)|0;if(j){c=k[a>>2]|0;i[c+(((c|0)==(k[e>>2]|0))<<31>>31)>>0]=0}}r=m;return b|0}function Bc(a,b,c){a=a|0;b=b|0;c=c|0;return Ac(a,2147483647,b,c)|0}function Cc(a){a=a|0;return 0}function Dc(a){a=a|0;return}function Ec(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,j=0;j=r;r=r+16|0;h=j;g=b&255;i[h>>0]=g;d=a+16|0;e=k[d>>2]|0;if(!e)if(!(Jc(a)|0)){e=k[d>>2]|0;f=4}else c=-1;else f=4;do if((f|0)==4){d=a+20|0;f=k[d>>2]|0;if(f>>>0>>0?(c=b&255,(c|0)!=(i[a+75>>0]|0)):0){k[d>>2]=f+1;i[f>>0]=g;break}if((Ra[k[a+36>>2]&7](a,h,1)|0)==1)c=l[h>>0]|0;else c=-1}while(0);r=j;return c|0}function Fc(a){a=a|0;var b=0,c=0;b=r;r=r+16|0;c=b;k[c>>2]=k[a+60>>2];a=oc(Ca(6,c|0)|0)|0;r=b;return a|0}function Gc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0;e=r;r=r+32|0;f=e;d=e+20|0;k[f>>2]=k[a+60>>2];k[f+4>>2]=0;k[f+8>>2]=b;k[f+12>>2]=d;k[f+16>>2]=c;if((oc(Ja(140,f|0)|0)|0)<0){k[d>>2]=-1;a=-1}else a=k[d>>2]|0;r=e;return a|0}function Hc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;p=r;r=r+48|0;m=p+16|0;l=p;d=p+32|0;n=a+28|0;e=k[n>>2]|0;k[d>>2]=e;o=a+20|0;e=(k[o>>2]|0)-e|0;k[d+4>>2]=e;k[d+8>>2]=b;k[d+12>>2]=c;i=a+60|0;j=a+44|0;b=2;e=e+c|0;while(1){if(!(k[49]|0)){k[m>>2]=k[i>>2];k[m+4>>2]=d;k[m+8>>2]=b;g=oc(Na(146,m|0)|0)|0}else{Ba(7,a|0);k[l>>2]=k[i>>2];k[l+4>>2]=d;k[l+8>>2]=b;g=oc(Na(146,l|0)|0)|0;ua(0)}if((e|0)==(g|0)){e=6;break}if((g|0)<0){e=8;break}e=e-g|0;f=k[d+4>>2]|0;if(g>>>0<=f>>>0)if((b|0)==2){k[n>>2]=(k[n>>2]|0)+g;h=f;b=2}else h=f;else{h=k[j>>2]|0;k[n>>2]=h;k[o>>2]=h;h=k[d+12>>2]|0;g=g-f|0;d=d+8|0;b=b+-1|0}k[d>>2]=(k[d>>2]|0)+g;k[d+4>>2]=h-g}if((e|0)==6){m=k[j>>2]|0;k[a+16>>2]=m+(k[a+48>>2]|0);a=m;k[n>>2]=a;k[o>>2]=a}else if((e|0)==8){k[a+16>>2]=0;k[n>>2]=0;k[o>>2]=0;k[a>>2]=k[a>>2]|32;if((b|0)==2)c=0;else c=c-(k[d+4>>2]|0)|0}r=p;return c|0}function Ic(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;e=r;r=r+80|0;d=e;k[a+36>>2]=3;if((k[a>>2]&64|0)==0?(k[d>>2]=k[a+60>>2],k[d+4>>2]=21505,k[d+8>>2]=e+12,(Ia(54,d|0)|0)!=0):0)i[a+75>>0]=-1;d=Hc(a,b,c)|0;r=e;return d|0}function Jc(a){a=a|0;var b=0,c=0;b=a+74|0;c=i[b>>0]|0;i[b>>0]=c+255|c;b=k[a>>2]|0;if(!(b&8)){k[a+8>>2]=0;k[a+4>>2]=0;b=k[a+44>>2]|0;k[a+28>>2]=b;k[a+20>>2]=b;k[a+16>>2]=b+(k[a+48>>2]|0);b=0}else{k[a>>2]=b|32;b=-1}return b|0}function Kc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;f=b&255;d=(c|0)!=0;a:do if(d&(a&3|0)!=0){e=b&255;while(1){if((i[a>>0]|0)==e<<24>>24){g=6;break a}a=a+1|0;c=c+-1|0;d=(c|0)!=0;if(!(d&(a&3|0)!=0)){g=5;break}}}else g=5;while(0);if((g|0)==5)if(d)g=6;else c=0;b:do if((g|0)==6){e=b&255;if((i[a>>0]|0)!=e<<24>>24){d=ha(f,16843009)|0;c:do if(c>>>0>3)while(1){f=k[a>>2]^d;if((f&-2139062144^-2139062144)&f+-16843009)break;a=a+4|0;c=c+-4|0;if(c>>>0<=3){g=11;break c}}else g=11;while(0);if((g|0)==11)if(!c){c=0;break}while(1){if((i[a>>0]|0)==e<<24>>24)break b;a=a+1|0;c=c+-1|0;if(!c){c=0;break}}}}while(0);return ((c|0)!=0?a:0)|0}function Lc(a){a=a|0;var b=0,c=0,d=0;d=a;a:do if(!(d&3))c=4;else{b=a;a=d;while(1){if(!(i[b>>0]|0))break a;b=b+1|0;a=b;if(!(a&3)){a=b;c=4;break}}}while(0);if((c|0)==4){while(1){b=k[a>>2]|0;if(!((b&-2139062144^-2139062144)&b+-16843009))a=a+4|0;else break}if((b&255)<<24>>24)do a=a+1|0;while((i[a>>0]|0)!=0)}return a-d|0}function Mc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,m=0,n=0.0,o=0,q=0,s=0,u=0,v=0.0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,M=0,N=0,O=0,P=0,Q=0,R=0,S=0,T=0,U=0,V=0,W=0,X=0,Y=0,Z=0,_=0,$=0,aa=0,ba=0,ca=0,da=0,ea=0,fa=0,ga=0;ga=r;r=r+624|0;ba=ga+24|0;da=ga+16|0;ca=ga+588|0;Y=ga+576|0;aa=ga;V=ga+536|0;fa=ga+8|0;ea=ga+528|0;M=(a|0)!=0;N=V+40|0;U=N;V=V+39|0;W=fa+4|0;X=Y+12|0;Y=Y+11|0;Z=ca;_=X;$=_-Z|0;O=-2-Z|0;P=_+2|0;Q=ba+288|0;R=ca+9|0;S=R;T=ca+8|0;f=0;w=b;g=0;b=0;a:while(1){do if((f|0)>-1)if((g|0)>(2147483647-f|0)){f=nc()|0;k[f>>2]=75;f=-1;break}else{f=g+f|0;break}while(0);g=i[w>>0]|0;if(!(g<<24>>24)){K=245;break}else h=w;b:while(1){switch(g<<24>>24){case 37:{g=h;K=9;break b}case 0:{g=h;break b}default:{}}J=h+1|0;g=i[J>>0]|0;h=J}c:do if((K|0)==9)while(1){K=0;if((i[g+1>>0]|0)!=37)break c;h=h+1|0;g=g+2|0;if((i[g>>0]|0)==37)K=9;else break}while(0);y=h-w|0;if(M?(k[a>>2]&32|0)==0:0)vc(w,y,a)|0;if((h|0)!=(w|0)){w=g;g=y;continue}o=g+1|0;h=i[o>>0]|0;m=(h<<24>>24)+-48|0;if(m>>>0<10){J=(i[g+2>>0]|0)==36;o=J?g+3|0:o;h=i[o>>0]|0;u=J?m:-1;b=J?1:b}else u=-1;g=h<<24>>24;d:do if((g&-32|0)==32){m=0;while(1){if(!(1<>24)+-32|m;o=o+1|0;h=i[o>>0]|0;g=h<<24>>24;if((g&-32|0)!=32){q=m;g=o;break}}}else{q=0;g=o}while(0);do if(h<<24>>24==42){m=g+1|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+2>>0]|0)==36:0){k[e+(h<<2)>>2]=10;b=1;g=g+3|0;h=k[d+((i[m>>0]|0)+-48<<3)>>2]|0}else{if(b){f=-1;break a}if(!M){x=q;g=m;b=0;J=0;break}b=(k[c>>2]|0)+(4-1)&~(4-1);h=k[b>>2]|0;k[c>>2]=b+4;b=0;g=m}if((h|0)<0){x=q|8192;J=0-h|0}else{x=q;J=h}}else{m=(h<<24>>24)+-48|0;if(m>>>0<10){h=0;do{h=(h*10|0)+m|0;g=g+1|0;m=(i[g>>0]|0)+-48|0}while(m>>>0<10);if((h|0)<0){f=-1;break a}else{x=q;J=h}}else{x=q;J=0}}while(0);e:do if((i[g>>0]|0)==46){m=g+1|0;h=i[m>>0]|0;if(h<<24>>24!=42){o=(h<<24>>24)+-48|0;if(o>>>0<10){g=m;h=0}else{g=m;o=0;break}while(1){h=(h*10|0)+o|0;g=g+1|0;o=(i[g>>0]|0)+-48|0;if(o>>>0>=10){o=h;break e}}}m=g+2|0;h=(i[m>>0]|0)+-48|0;if(h>>>0<10?(i[g+3>>0]|0)==36:0){k[e+(h<<2)>>2]=10;g=g+4|0;o=k[d+((i[m>>0]|0)+-48<<3)>>2]|0;break}if(b){f=-1;break a}if(M){g=(k[c>>2]|0)+(4-1)&~(4-1);o=k[g>>2]|0;k[c>>2]=g+4;g=m}else{g=m;o=0}}else o=-1;while(0);s=0;while(1){h=(i[g>>0]|0)+-65|0;if(h>>>0>57){f=-1;break a}m=g+1|0;h=i[5347+(s*58|0)+h>>0]|0;q=h&255;if((q+-1|0)>>>0<8){g=m;s=q}else{I=m;break}}if(!(h<<24>>24)){f=-1;break}m=(u|0)>-1;do if(h<<24>>24==19)if(m){f=-1;break a}else K=52;else{if(m){k[e+(u<<2)>>2]=q;G=d+(u<<3)|0;H=k[G+4>>2]|0;K=aa;k[K>>2]=k[G>>2];k[K+4>>2]=H;K=52;break}if(!M){f=0;break a}Pc(aa,q,c)}while(0);if((K|0)==52?(K=0,!M):0){w=I;g=y;continue}u=i[g>>0]|0;u=(s|0)!=0&(u&15|0)==3?u&-33:u;m=x&-65537;H=(x&8192|0)==0?x:m;f:do switch(u|0){case 110:switch(s|0){case 0:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 1:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 2:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}case 3:{j[k[aa>>2]>>1]=f;w=I;g=y;continue a}case 4:{i[k[aa>>2]>>0]=f;w=I;g=y;continue a}case 6:{k[k[aa>>2]>>2]=f;w=I;g=y;continue a}case 7:{w=k[aa>>2]|0;k[w>>2]=f;k[w+4>>2]=((f|0)<0)<<31>>31;w=I;g=y;continue a}default:{w=I;g=y;continue a}}case 112:{s=H|8;o=o>>>0>8?o:8;u=120;K=64;break}case 88:case 120:{s=H;K=64;break}case 111:{m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;if((h|0)==0&(m|0)==0)g=N;else{g=N;do{g=g+-1|0;i[g>>0]=h&7|48;h=ad(h|0,m|0,3)|0;m=L}while(!((h|0)==0&(m|0)==0))}if(!(H&8)){h=H;s=0;q=5827;K=77}else{s=U-g+1|0;h=H;o=(o|0)<(s|0)?s:o;s=0;q=5827;K=77}break}case 105:case 100:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;if((h|0)<0){g=Zc(0,0,g|0,h|0)|0;h=L;m=aa;k[m>>2]=g;k[m+4>>2]=h;m=1;q=5827;K=76;break f}if(!(H&2048)){q=H&1;m=q;q=(q|0)==0?5827:5829;K=76}else{m=1;q=5828;K=76}break}case 117:{h=aa;g=k[h>>2]|0;h=k[h+4>>2]|0;m=0;q=5827;K=76;break}case 99:{i[V>>0]=k[aa>>2];w=V;h=1;s=0;u=5827;g=N;break}case 109:{g=nc()|0;g=mc(k[g>>2]|0)|0;K=82;break}case 115:{g=k[aa>>2]|0;g=(g|0)!=0?g:5837;K=82;break}case 67:{k[fa>>2]=k[aa>>2];k[W>>2]=0;k[aa>>2]=fa;o=-1;K=86;break}case 83:{if(!o){Rc(a,32,J,0,H);g=0;K=98}else K=86;break}case 65:case 71:case 70:case 69:case 97:case 103:case 102:case 101:{n=+p[aa>>3];k[da>>2]=0;p[t>>3]=n;if((k[t+4>>2]|0)>=0)if(!(H&2048)){G=H&1;F=G;G=(G|0)==0?5845:5850}else{F=1;G=5847}else{n=-n;F=1;G=5844}p[t>>3]=n;E=k[t+4>>2]&2146435072;do if(E>>>0<2146435072|(E|0)==2146435072&0<0){v=+qc(n,da)*2.0;h=v!=0.0;if(h)k[da>>2]=(k[da>>2]|0)+-1;C=u|32;if((C|0)==97){w=u&32;y=(w|0)==0?G:G+9|0;x=F|2;g=12-o|0;do if(!(o>>>0>11|(g|0)==0)){n=8.0;do{g=g+-1|0;n=n*16.0}while((g|0)!=0);if((i[y>>0]|0)==45){n=-(n+(-v-n));break}else{n=v+n-n;break}}else n=v;while(0);h=k[da>>2]|0;g=(h|0)<0?0-h|0:h;g=Qc(g,((g|0)<0)<<31>>31,X)|0;if((g|0)==(X|0)){i[Y>>0]=48;g=Y}i[g+-1>>0]=(h>>31&2)+43;s=g+-2|0;i[s>>0]=u+15;q=(o|0)<1;m=(H&8|0)==0;h=ca;while(1){G=~~n;g=h+1|0;i[h>>0]=l[5811+G>>0]|w;n=(n-+(G|0))*16.0;do if((g-Z|0)==1){if(m&(q&n==0.0))break;i[g>>0]=46;g=h+2|0}while(0);if(!(n!=0.0))break;else h=g}o=(o|0)!=0&(O+g|0)<(o|0)?P+o-s|0:$-s+g|0;m=o+x|0;Rc(a,32,J,m,H);if(!(k[a>>2]&32))vc(y,x,a)|0;Rc(a,48,J,m,H^65536);g=g-Z|0;if(!(k[a>>2]&32))vc(ca,g,a)|0;h=_-s|0;Rc(a,48,o-(g+h)|0,0,0);if(!(k[a>>2]&32))vc(s,h,a)|0;Rc(a,32,J,m,H^8192);g=(m|0)<(J|0)?J:m;break}g=(o|0)<0?6:o;if(h){h=(k[da>>2]|0)+-28|0;k[da>>2]=h;n=v*268435456.0}else{n=v;h=k[da>>2]|0}E=(h|0)<0?ba:Q;D=E;h=E;do{B=~~n>>>0;k[h>>2]=B;h=h+4|0;n=(n-+(B>>>0))*1.0e9}while(n!=0.0);m=h;h=k[da>>2]|0;if((h|0)>0){q=E;while(1){s=(h|0)>29?29:h;o=m+-4|0;do if(o>>>0>>0)o=q;else{h=0;do{B=bd(k[o>>2]|0,0,s|0)|0;B=_c(B|0,L|0,h|0,0)|0;h=L;A=kd(B|0,h|0,1e9,0)|0;k[o>>2]=A;h=jd(B|0,h|0,1e9,0)|0;o=o+-4|0}while(o>>>0>=q>>>0);if(!h){o=q;break}o=q+-4|0;k[o>>2]=h}while(0);while(1){if(m>>>0<=o>>>0)break;h=m+-4|0;if(!(k[h>>2]|0))m=h;else break}h=(k[da>>2]|0)-s|0;k[da>>2]=h;if((h|0)>0)q=o;else break}}else o=E;if((h|0)<0){y=((g+25|0)/9|0)+1|0;z=(C|0)==102;w=o;while(1){x=0-h|0;x=(x|0)>9?9:x;do if(w>>>0>>0){h=(1<>>x;o=0;s=w;do{B=k[s>>2]|0;k[s>>2]=(B>>>x)+o;o=ha(B&h,q)|0;s=s+4|0}while(s>>>0>>0);h=(k[w>>2]|0)==0?w+4|0:w;if(!o){o=h;break}k[m>>2]=o;o=h;m=m+4|0}else o=(k[w>>2]|0)==0?w+4|0:w;while(0);h=z?E:o;m=(m-h>>2|0)>(y|0)?h+(y<<2)|0:m;h=(k[da>>2]|0)+x|0;k[da>>2]=h;if((h|0)>=0){w=o;break}else w=o}}else w=o;do if(w>>>0>>0){h=(D-w>>2)*9|0;q=k[w>>2]|0;if(q>>>0<10)break;else o=10;do{o=o*10|0;h=h+1|0}while(q>>>0>=o>>>0)}else h=0;while(0);A=(C|0)==103;B=(g|0)!=0;o=g-((C|0)!=102?h:0)+((B&A)<<31>>31)|0;if((o|0)<(((m-D>>2)*9|0)+-9|0)){s=o+9216|0;z=(s|0)/9|0;o=E+(z+-1023<<2)|0;s=((s|0)%9|0)+1|0;if((s|0)<9){q=10;do{q=q*10|0;s=s+1|0}while((s|0)!=9)}else q=10;x=k[o>>2]|0;y=(x>>>0)%(q>>>0)|0;if((y|0)==0?(E+(z+-1022<<2)|0)==(m|0):0)q=w;else K=163;do if((K|0)==163){K=0;v=(((x>>>0)/(q>>>0)|0)&1|0)==0?9007199254740992.0:9007199254740994.0;s=(q|0)/2|0;do if(y>>>0>>0)n=.5;else{if((y|0)==(s|0)?(E+(z+-1022<<2)|0)==(m|0):0){n=1.0;break}n=1.5}while(0);do if(F){if((i[G>>0]|0)!=45)break;v=-v;n=-n}while(0);s=x-y|0;k[o>>2]=s;if(!(v+n!=v)){q=w;break}C=s+q|0;k[o>>2]=C;if(C>>>0>999999999){h=w;while(1){q=o+-4|0;k[o>>2]=0;if(q>>>0>>0){h=h+-4|0;k[h>>2]=0}C=(k[q>>2]|0)+1|0;k[q>>2]=C;if(C>>>0>999999999)o=q;else{w=h;o=q;break}}}h=(D-w>>2)*9|0;s=k[w>>2]|0;if(s>>>0<10){q=w;break}else q=10;do{q=q*10|0;h=h+1|0}while(s>>>0>=q>>>0);q=w}while(0);C=o+4|0;w=q;m=m>>>0>C>>>0?C:m}y=0-h|0;while(1){if(m>>>0<=w>>>0){z=0;C=m;break}o=m+-4|0;if(!(k[o>>2]|0))m=o;else{z=1;C=m;break}}do if(A){g=(B&1^1)+g|0;if((g|0)>(h|0)&(h|0)>-5){u=u+-1|0;g=g+-1-h|0}else{u=u+-2|0;g=g+-1|0}m=H&8;if(m)break;do if(z){m=k[C+-4>>2]|0;if(!m){o=9;break}if(!((m>>>0)%10|0)){q=10;o=0}else{o=0;break}do{q=q*10|0;o=o+1|0}while(((m>>>0)%(q>>>0)|0|0)==0)}else o=9;while(0);m=((C-D>>2)*9|0)+-9|0;if((u|32|0)==102){m=m-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}else{m=m+h-o|0;m=(m|0)<0?0:m;g=(g|0)<(m|0)?g:m;m=0;break}}else m=H&8;while(0);x=g|m;q=(x|0)!=0&1;s=(u|32|0)==102;if(s){h=(h|0)>0?h:0;u=0}else{o=(h|0)<0?y:h;o=Qc(o,((o|0)<0)<<31>>31,X)|0;if((_-o|0)<2)do{o=o+-1|0;i[o>>0]=48}while((_-o|0)<2);i[o+-1>>0]=(h>>31&2)+43;D=o+-2|0;i[D>>0]=u;h=_-D|0;u=D}y=F+1+g+q+h|0;Rc(a,32,J,y,H);if(!(k[a>>2]&32))vc(G,F,a)|0;Rc(a,48,J,y,H^65536);do if(s){o=w>>>0>E>>>0?E:w;h=o;do{m=Qc(k[h>>2]|0,0,R)|0;do if((h|0)==(o|0)){if((m|0)!=(R|0))break;i[T>>0]=48;m=T}else{if(m>>>0<=ca>>>0)break;do{m=m+-1|0;i[m>>0]=48}while(m>>>0>ca>>>0)}while(0);if(!(k[a>>2]&32))vc(m,S-m|0,a)|0;h=h+4|0}while(h>>>0<=E>>>0);do if(x){if(k[a>>2]&32)break;vc(5879,1,a)|0}while(0);if((g|0)>0&h>>>0>>0){m=h;while(1){h=Qc(k[m>>2]|0,0,R)|0;if(h>>>0>ca>>>0)do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0);if(!(k[a>>2]&32))vc(h,(g|0)>9?9:g,a)|0;m=m+4|0;h=g+-9|0;if(!((g|0)>9&m>>>0>>0)){g=h;break}else g=h}}Rc(a,48,g+9|0,9,0)}else{s=z?C:w+4|0;if((g|0)>-1){q=(m|0)==0;o=w;do{h=Qc(k[o>>2]|0,0,R)|0;if((h|0)==(R|0)){i[T>>0]=48;h=T}do if((o|0)==(w|0)){m=h+1|0;if(!(k[a>>2]&32))vc(h,1,a)|0;if(q&(g|0)<1){h=m;break}if(k[a>>2]&32){h=m;break}vc(5879,1,a)|0;h=m}else{if(h>>>0<=ca>>>0)break;do{h=h+-1|0;i[h>>0]=48}while(h>>>0>ca>>>0)}while(0);m=S-h|0;if(!(k[a>>2]&32))vc(h,(g|0)>(m|0)?m:g,a)|0;g=g-m|0;o=o+4|0}while(o>>>0>>0&(g|0)>-1)}Rc(a,48,g+18|0,18,0);if(k[a>>2]&32)break;vc(u,_-u|0,a)|0}while(0);Rc(a,32,J,y,H^8192);g=(y|0)<(J|0)?J:y}else{s=(u&32|0)!=0;q=n!=n|0.0!=0.0;h=q?0:F;o=h+3|0;Rc(a,32,J,o,m);g=k[a>>2]|0;if(!(g&32)){vc(G,h,a)|0;g=k[a>>2]|0}if(!(g&32))vc(q?(s?5871:5875):s?5863:5867,3,a)|0;Rc(a,32,J,o,H^8192);g=(o|0)<(J|0)?J:o}while(0);w=I;continue a}default:{m=H;h=o;s=0;u=5827;g=N}}while(0);g:do if((K|0)==64){m=aa;h=k[m>>2]|0;m=k[m+4>>2]|0;q=u&32;if(!((h|0)==0&(m|0)==0)){g=N;do{g=g+-1|0;i[g>>0]=l[5811+(h&15)>>0]|q;h=ad(h|0,m|0,4)|0;m=L}while(!((h|0)==0&(m|0)==0));K=aa;if((s&8|0)==0|(k[K>>2]|0)==0&(k[K+4>>2]|0)==0){h=s;s=0;q=5827;K=77}else{h=s;s=2;q=5827+(u>>4)|0;K=77}}else{g=N;h=s;s=0;q=5827;K=77}}else if((K|0)==76){g=Qc(g,h,N)|0;h=H;s=m;K=77}else if((K|0)==82){K=0;H=Kc(g,0,o)|0;G=(H|0)==0;w=g;h=G?o:H-g|0;s=0;u=5827;g=G?g+o|0:H}else if((K|0)==86){K=0;h=0;g=0;q=k[aa>>2]|0;while(1){m=k[q>>2]|0;if(!m)break;g=sc(ea,m)|0;if((g|0)<0|g>>>0>(o-h|0)>>>0)break;h=g+h|0;if(o>>>0>h>>>0)q=q+4|0;else break}if((g|0)<0){f=-1;break a}Rc(a,32,J,h,H);if(!h){g=0;K=98}else{m=0;o=k[aa>>2]|0;while(1){g=k[o>>2]|0;if(!g){g=h;K=98;break g}g=sc(ea,g)|0;m=g+m|0;if((m|0)>(h|0)){g=h;K=98;break g}if(!(k[a>>2]&32))vc(ea,g,a)|0;if(m>>>0>=h>>>0){g=h;K=98;break}else o=o+4|0}}}while(0);if((K|0)==98){K=0;Rc(a,32,J,g,H^8192);w=I;g=(J|0)>(g|0)?J:g;continue}if((K|0)==77){K=0;m=(o|0)>-1?h&-65537:h;h=aa;h=(k[h>>2]|0)!=0|(k[h+4>>2]|0)!=0;if((o|0)!=0|h){h=(h&1^1)+(U-g)|0;w=g;h=(o|0)>(h|0)?o:h;u=q;g=N}else{w=N;h=0;u=q;g=N}}q=g-w|0;h=(h|0)<(q|0)?q:h;o=s+h|0;g=(J|0)<(o|0)?o:J;Rc(a,32,g,o,m);if(!(k[a>>2]&32))vc(u,s,a)|0;Rc(a,48,g,o,m^65536);Rc(a,48,h,q,0);if(!(k[a>>2]&32))vc(w,q,a)|0;Rc(a,32,g,o,m^8192);w=I}h:do if((K|0)==245)if(!a)if(b){f=1;while(1){b=k[e+(f<<2)>>2]|0;if(!b)break;Pc(d+(f<<3)|0,b,c);f=f+1|0;if((f|0)>=10){f=1;break h}}if((f|0)<10)while(1){if(k[e+(f<<2)>>2]|0){f=-1;break h}f=f+1|0;if((f|0)>=10){f=1;break}}else f=1}else f=0;while(0);r=ga;return f|0}function Nc(a){a=a|0;if(!(k[a+68>>2]|0))Dc(a);return}function Oc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0;d=a+20|0;e=k[d>>2]|0;a=(k[a+16>>2]|0)-e|0;a=a>>>0>c>>>0?c:a;cd(e|0,b|0,a|0)|0;k[d>>2]=(k[d>>2]|0)+a;return c|0}function Pc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0.0;a:do if(b>>>0<=20)do switch(b|0){case 9:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;k[a>>2]=b;break a}case 10:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=((b|0)<0)<<31>>31;break a}case 11:{d=(k[c>>2]|0)+(4-1)&~(4-1);b=k[d>>2]|0;k[c>>2]=d+4;d=a;k[d>>2]=b;k[d+4>>2]=0;break a}case 12:{d=(k[c>>2]|0)+(8-1)&~(8-1);b=d;e=k[b>>2]|0;b=k[b+4>>2]|0;k[c>>2]=d+8;d=a;k[d>>2]=e;k[d+4>>2]=b;break a}case 13:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&65535)<<16>>16;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 14:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&65535;k[e+4>>2]=0;break a}case 15:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;d=(d&255)<<24>>24;e=a;k[e>>2]=d;k[e+4>>2]=((d|0)<0)<<31>>31;break a}case 16:{e=(k[c>>2]|0)+(4-1)&~(4-1);d=k[e>>2]|0;k[c>>2]=e+4;e=a;k[e>>2]=d&255;k[e+4>>2]=0;break a}case 17:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}case 18:{e=(k[c>>2]|0)+(8-1)&~(8-1);f=+p[e>>3];k[c>>2]=e+8;p[a>>3]=f;break a}default:break a}while(0);while(0);return}function Qc(a,b,c){a=a|0;b=b|0;c=c|0;var d=0;if(b>>>0>0|(b|0)==0&a>>>0>4294967295)while(1){d=kd(a|0,b|0,10,0)|0;c=c+-1|0;i[c>>0]=d|48;d=jd(a|0,b|0,10,0)|0;if(b>>>0>9|(b|0)==9&a>>>0>4294967295){a=d;b=L}else{a=d;break}}if(a)while(1){c=c+-1|0;i[c>>0]=(a>>>0)%10|0|48;if(a>>>0<10)break;else a=(a>>>0)/10|0}return c|0}function Rc(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0;h=r;r=r+256|0;g=h;do if((c|0)>(d|0)&(e&73728|0)==0){e=c-d|0;$c(g|0,b|0,(e>>>0>256?256:e)|0)|0;b=k[a>>2]|0;f=(b&32|0)==0;if(e>>>0>255){d=c-d|0;do{if(f){vc(g,256,a)|0;b=k[a>>2]|0}e=e+-256|0;f=(b&32|0)==0}while(e>>>0>255);if(f)e=d&255;else break}else if(!f)break;vc(g,e,a)|0}while(0);r=h;return}function Sc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0,v=0,w=0,x=0,y=0,z=0,A=0,B=0,C=0,D=0,E=0,F=0,G=0,H=0,I=0,J=0,K=0,L=0,M=0;do if(a>>>0<245){o=a>>>0<11?16:a+11&-8;a=o>>>3;h=k[147]|0;c=h>>>a;if(c&3){a=(c&1^1)+a|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;e=k[d>>2]|0;f=e+8|0;g=k[f>>2]|0;do if((c|0)!=(g|0)){if(g>>>0<(k[151]|0)>>>0)Aa();b=g+12|0;if((k[b>>2]|0)==(e|0)){k[b>>2]=c;k[d>>2]=g;break}else Aa()}else k[147]=h&~(1<>2]=M|3;M=e+(M|4)|0;k[M>>2]=k[M>>2]|1;M=f;return M|0}g=k[149]|0;if(o>>>0>g>>>0){if(c){d=2<>>12&16;d=d>>>i;e=d>>>5&8;d=d>>>e;f=d>>>2&4;d=d>>>f;c=d>>>1&2;d=d>>>c;a=d>>>1&1;a=(e|i|f|c|a)+(d>>>a)|0;d=a<<1;c=628+(d<<2)|0;d=628+(d+2<<2)|0;f=k[d>>2]|0;i=f+8|0;e=k[i>>2]|0;do if((c|0)!=(e|0)){if(e>>>0<(k[151]|0)>>>0)Aa();b=e+12|0;if((k[b>>2]|0)==(f|0)){k[b>>2]=c;k[d>>2]=e;j=k[149]|0;break}else Aa()}else{k[147]=h&~(1<>2]=o|3;h=f+o|0;k[f+(o|4)>>2]=g|1;k[f+M>>2]=g;if(j){e=k[152]|0;c=j>>>3;b=c<<1;d=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(b>>>0<(k[151]|0)>>>0)Aa();else{l=a;m=b}}else{k[147]=a|c;l=628+(b+2<<2)|0;m=d}k[l>>2]=e;k[m+12>>2]=e;k[e+8>>2]=m;k[e+12>>2]=d}k[149]=g;k[152]=h;M=i;return M|0}a=k[148]|0;if(a){c=(a&0-a)+-1|0;L=c>>>12&16;c=c>>>L;K=c>>>5&8;c=c>>>K;M=c>>>2&4;c=c>>>M;a=c>>>1&2;c=c>>>a;d=c>>>1&1;d=k[892+((K|L|M|a|d)+(c>>>d)<<2)>>2]|0;c=(k[d+4>>2]&-8)-o|0;a=d;while(1){b=k[a+16>>2]|0;if(!b){b=k[a+20>>2]|0;if(!b){i=c;break}}a=(k[b+4>>2]&-8)-o|0;M=a>>>0>>0;c=M?a:c;a=b;d=M?b:d}f=k[151]|0;if(d>>>0>>0)Aa();h=d+o|0;if(d>>>0>=h>>>0)Aa();g=k[d+24>>2]|0;c=k[d+12>>2]|0;do if((c|0)==(d|0)){a=d+20|0;b=k[a>>2]|0;if(!b){a=d+16|0;b=k[a>>2]|0;if(!b){n=0;break}}while(1){c=b+20|0;e=k[c>>2]|0;if(e){b=e;a=c;continue}c=b+16|0;e=k[c>>2]|0;if(!e)break;else{b=e;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;n=b;break}}else{e=k[d+8>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(d|0))Aa();a=c+8|0;if((k[a>>2]|0)==(d|0)){k[b>>2]=c;k[a>>2]=e;n=c;break}else Aa()}while(0);do if(g){b=k[d+28>>2]|0;a=892+(b<<2)|0;if((d|0)==(k[a>>2]|0)){k[a>>2]=n;if(!n){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(d|0))k[b>>2]=n;else k[g+20>>2]=n;if(!n)break}a=k[151]|0;if(n>>>0>>0)Aa();k[n+24>>2]=g;b=k[d+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[n+16>>2]=b;k[b+24>>2]=n;break}while(0);b=k[d+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[n+20>>2]=b;k[b+24>>2]=n;break}}while(0);if(i>>>0<16){M=i+o|0;k[d+4>>2]=M|3;M=d+(M+4)|0;k[M>>2]=k[M>>2]|1}else{k[d+4>>2]=o|3;k[d+(o|4)>>2]=i|1;k[d+(i+o)>>2]=i;b=k[149]|0;if(b){f=k[152]|0;c=b>>>3;b=c<<1;e=628+(b<<2)|0;a=k[147]|0;c=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{p=b;q=a}}else{k[147]=a|c;p=628+(b+2<<2)|0;q=e}k[p>>2]=f;k[q+12>>2]=f;k[f+8>>2]=q;k[f+12>>2]=e}k[149]=i;k[152]=h}M=d+8|0;return M|0}else q=o}else q=o}else if(a>>>0<=4294967231){a=a+11|0;m=a&-8;l=k[148]|0;if(l){c=0-m|0;a=a>>>8;if(a)if(m>>>0>16777215)j=31;else{q=(a+1048320|0)>>>16&8;v=a<>>16&4;v=v<>>16&2;j=14-(p|q|j)+(v<>>15)|0;j=m>>>(j+7|0)&1|j<<1}else j=0;a=k[892+(j<<2)>>2]|0;a:do if(!a){e=0;a=0;v=86}else{g=c;e=0;h=m<<((j|0)==31?0:25-(j>>>1)|0);i=a;a=0;while(1){f=k[i+4>>2]&-8;c=f-m|0;if(c>>>0>>0)if((f|0)==(m|0)){f=i;a=i;v=90;break a}else a=i;else c=g;v=k[i+20>>2]|0;i=k[i+16+(h>>>31<<2)>>2]|0;e=(v|0)==0|(v|0)==(i|0)?e:v;if(!i){v=86;break}else{g=c;h=h<<1}}}while(0);if((v|0)==86){if((e|0)==0&(a|0)==0){a=2<>>12&16;a=a>>>n;l=a>>>5&8;a=a>>>l;p=a>>>2&4;a=a>>>p;q=a>>>1&2;a=a>>>q;e=a>>>1&1;e=k[892+((l|n|p|q|e)+(a>>>e)<<2)>>2]|0;a=0}if(!e){h=c;i=a}else{f=e;v=90}}if((v|0)==90)while(1){v=0;q=(k[f+4>>2]&-8)-m|0;e=q>>>0>>0;c=e?q:c;a=e?f:a;e=k[f+16>>2]|0;if(e){f=e;v=90;continue}f=k[f+20>>2]|0;if(!f){h=c;i=a;break}else v=90}if((i|0)!=0?h>>>0<((k[149]|0)-m|0)>>>0:0){e=k[151]|0;if(i>>>0>>0)Aa();g=i+m|0;if(i>>>0>=g>>>0)Aa();f=k[i+24>>2]|0;c=k[i+12>>2]|0;do if((c|0)==(i|0)){a=i+20|0;b=k[a>>2]|0;if(!b){a=i+16|0;b=k[a>>2]|0;if(!b){o=0;break}}while(1){c=b+20|0;d=k[c>>2]|0;if(d){b=d;a=c;continue}c=b+16|0;d=k[c>>2]|0;if(!d)break;else{b=d;a=c}}if(a>>>0>>0)Aa();else{k[a>>2]=0;o=b;break}}else{d=k[i+8>>2]|0;if(d>>>0>>0)Aa();b=d+12|0;if((k[b>>2]|0)!=(i|0))Aa();a=c+8|0;if((k[a>>2]|0)==(i|0)){k[b>>2]=c;k[a>>2]=d;o=c;break}else Aa()}while(0);do if(f){b=k[i+28>>2]|0;a=892+(b<<2)|0;if((i|0)==(k[a>>2]|0)){k[a>>2]=o;if(!o){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=f+16|0;if((k[b>>2]|0)==(i|0))k[b>>2]=o;else k[f+20>>2]=o;if(!o)break}a=k[151]|0;if(o>>>0>>0)Aa();k[o+24>>2]=f;b=k[i+16>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[o+16>>2]=b;k[b+24>>2]=o;break}while(0);b=k[i+20>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[o+20>>2]=b;k[b+24>>2]=o;break}}while(0);b:do if(h>>>0>=16){k[i+4>>2]=m|3;k[i+(m|4)>>2]=h|1;k[i+(h+m)>>2]=h;b=h>>>3;if(h>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{s=b;t=a}}else{k[147]=c|b;s=628+(a+2<<2)|0;t=d}k[s>>2]=g;k[t+12>>2]=g;k[i+(m+8)>>2]=t;k[i+(m+12)>>2]=d;break}b=h>>>8;if(b)if(h>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=h>>>(d+7|0)&1|d<<1}else d=0;b=892+(d<<2)|0;k[i+(m+28)>>2]=d;k[i+(m+20)>>2]=0;k[i+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break}b=k[b>>2]|0;c:do if((k[b+4>>2]&-8|0)!=(h|0)){d=h<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(h|0)){y=c;break c}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[i+(m+24)>>2]=b;k[i+(m+12)>>2]=g;k[i+(m+8)>>2]=g;break b}}else y=b;while(0);b=y+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&y>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[i+(m+8)>>2]=a;k[i+(m+12)>>2]=y;k[i+(m+24)>>2]=0;break}else Aa()}else{M=h+m|0;k[i+4>>2]=M|3;M=i+(M+4)|0;k[M>>2]=k[M>>2]|1}while(0);M=i+8|0;return M|0}else q=m}else q=m}else q=-1;while(0);c=k[149]|0;if(c>>>0>=q>>>0){b=c-q|0;a=k[152]|0;if(b>>>0>15){k[152]=a+q;k[149]=b;k[a+(q+4)>>2]=b|1;k[a+c>>2]=b;k[a+4>>2]=q|3}else{k[149]=0;k[152]=0;k[a+4>>2]=c|3;M=a+(c+4)|0;k[M>>2]=k[M>>2]|1}M=a+8|0;return M|0}a=k[150]|0;if(a>>>0>q>>>0){L=a-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}do if(!(k[265]|0)){a=Ma(30)|0;if(!(a+-1&a)){k[267]=a;k[266]=a;k[268]=-1;k[269]=-1;k[270]=0;k[258]=0;y=(Ea(0)|0)&-16^1431655768;k[265]=y;break}else Aa()}while(0);i=q+48|0;h=k[267]|0;j=q+47|0;g=h+j|0;h=0-h|0;l=g&h;if(l>>>0<=q>>>0){M=0;return M|0}a=k[257]|0;if((a|0)!=0?(t=k[255]|0,y=t+l|0,y>>>0<=t>>>0|y>>>0>a>>>0):0){M=0;return M|0}d:do if(!(k[258]&4)){a=k[153]|0;e:do if(a){e=1036;while(1){c=k[e>>2]|0;if(c>>>0<=a>>>0?(r=e+4|0,(c+(k[r>>2]|0)|0)>>>0>a>>>0):0){f=e;a=r;break}e=k[e+8>>2]|0;if(!e){v=174;break e}}c=g-(k[150]|0)&h;if(c>>>0<2147483647){e=Da(c|0)|0;y=(e|0)==((k[f>>2]|0)+(k[a>>2]|0)|0);a=y?c:0;if(y){if((e|0)!=(-1|0)){w=e;p=a;v=194;break d}}else v=184}else a=0}else v=174;while(0);do if((v|0)==174){f=Da(0)|0;if((f|0)!=(-1|0)){a=f;c=k[266]|0;e=c+-1|0;if(!(e&a))c=l;else c=l-a+(e+a&0-c)|0;a=k[255]|0;e=a+c|0;if(c>>>0>q>>>0&c>>>0<2147483647){y=k[257]|0;if((y|0)!=0?e>>>0<=a>>>0|e>>>0>y>>>0:0){a=0;break}e=Da(c|0)|0;y=(e|0)==(f|0);a=y?c:0;if(y){w=f;p=a;v=194;break d}else v=184}else a=0}else a=0}while(0);f:do if((v|0)==184){f=0-c|0;do if(i>>>0>c>>>0&(c>>>0<2147483647&(e|0)!=(-1|0))?(u=k[267]|0,u=j-c+u&0-u,u>>>0<2147483647):0)if((Da(u|0)|0)==(-1|0)){Da(f|0)|0;break f}else{c=u+c|0;break}while(0);if((e|0)!=(-1|0)){w=e;p=c;v=194;break d}}while(0);k[258]=k[258]|4;v=191}else{a=0;v=191}while(0);if((((v|0)==191?l>>>0<2147483647:0)?(w=Da(l|0)|0,x=Da(0)|0,w>>>0>>0&((w|0)!=(-1|0)&(x|0)!=(-1|0))):0)?(z=x-w|0,A=z>>>0>(q+40|0)>>>0,A):0){p=A?z:a;v=194}if((v|0)==194){a=(k[255]|0)+p|0;k[255]=a;if(a>>>0>(k[256]|0)>>>0)k[256]=a;g=k[153]|0;g:do if(g){f=1036;do{a=k[f>>2]|0;c=f+4|0;e=k[c>>2]|0;if((w|0)==(a+e|0)){B=a;C=c;D=e;E=f;v=204;break}f=k[f+8>>2]|0}while((f|0)!=0);if(((v|0)==204?(k[E+12>>2]&8|0)==0:0)?g>>>0>>0&g>>>0>=B>>>0:0){k[C>>2]=D+p;M=(k[150]|0)+p|0;L=g+8|0;L=(L&7|0)==0?0:0-L&7;K=M-L|0;k[153]=g+L;k[150]=K;k[g+(L+4)>>2]=K|1;k[g+(M+4)>>2]=40;k[154]=k[269];break}a=k[151]|0;if(w>>>0>>0){k[151]=w;a=w}c=w+p|0;f=1036;while(1){if((k[f>>2]|0)==(c|0)){e=f;c=f;v=212;break}f=k[f+8>>2]|0;if(!f){c=1036;break}}if((v|0)==212)if(!(k[c+12>>2]&8)){k[e>>2]=w;n=c+4|0;k[n>>2]=(k[n>>2]|0)+p;n=w+8|0;n=(n&7|0)==0?0:0-n&7;j=w+(p+8)|0;j=(j&7|0)==0?0:0-j&7;b=w+(j+p)|0;m=n+q|0;o=w+m|0;l=b-(w+n)-q|0;k[w+(n+4)>>2]=q|3;h:do if((b|0)!=(g|0)){if((b|0)==(k[152]|0)){M=(k[149]|0)+l|0;k[149]=M;k[152]=o;k[w+(m+4)>>2]=M|1;k[w+(M+m)>>2]=M;break}h=p+4|0;c=k[w+(h+j)>>2]|0;if((c&3|0)==1){i=c&-8;f=c>>>3;i:do if(c>>>0>=256){g=k[w+((j|24)+p)>>2]|0;d=k[w+(p+12+j)>>2]|0;do if((d|0)==(b|0)){e=j|16;d=w+(h+e)|0;c=k[d>>2]|0;if(!c){d=w+(e+p)|0;c=k[d>>2]|0;if(!c){J=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;J=c;break}}else{e=k[w+((j|8)+p)>>2]|0;if(e>>>0>>0)Aa();a=e+12|0;if((k[a>>2]|0)!=(b|0))Aa();c=d+8|0;if((k[c>>2]|0)==(b|0)){k[a>>2]=d;k[c>>2]=e;J=d;break}else Aa()}while(0);if(!g)break;a=k[w+(p+28+j)>>2]|0;c=892+(a<<2)|0;do if((b|0)!=(k[c>>2]|0)){if(g>>>0<(k[151]|0)>>>0)Aa();a=g+16|0;if((k[a>>2]|0)==(b|0))k[a>>2]=J;else k[g+20>>2]=J;if(!J)break i}else{k[c>>2]=J;if(J)break;k[148]=k[148]&~(1<>>0>>0)Aa();k[J+24>>2]=g;b=j|16;a=k[w+(b+p)>>2]|0;do if(a)if(a>>>0>>0)Aa();else{k[J+16>>2]=a;k[a+24>>2]=J;break}while(0);b=k[w+(h+b)>>2]|0;if(!b)break;if(b>>>0<(k[151]|0)>>>0)Aa();else{k[J+20>>2]=b;k[b+24>>2]=J;break}}else{d=k[w+((j|8)+p)>>2]|0;e=k[w+(p+12+j)>>2]|0;c=628+(f<<1<<2)|0;do if((d|0)!=(c|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)==(b|0))break;Aa()}while(0);if((e|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();a=e+8|0;if((k[a>>2]|0)==(b|0)){F=a;break}Aa()}while(0);k[d+12>>2]=e;k[F>>2]=d}while(0);b=w+((i|j)+p)|0;e=i+l|0}else e=l;b=b+4|0;k[b>>2]=k[b>>2]&-2;k[w+(m+4)>>2]=e|1;k[w+(e+m)>>2]=e;b=e>>>3;if(e>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0>=(k[151]|0)>>>0){K=b;L=a;break}Aa()}while(0);k[K>>2]=o;k[L+12>>2]=o;k[w+(m+8)>>2]=L;k[w+(m+12)>>2]=d;break}b=e>>>8;do if(!b)d=0;else{if(e>>>0>16777215){d=31;break}K=(b+1048320|0)>>>16&8;L=b<>>16&4;L=L<>>16&2;d=14-(J|K|d)+(L<>>15)|0;d=e>>>(d+7|0)&1|d<<1}while(0);b=892+(d<<2)|0;k[w+(m+28)>>2]=d;k[w+(m+20)>>2]=0;k[w+(m+16)>>2]=0;a=k[148]|0;c=1<>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break}b=k[b>>2]|0;j:do if((k[b+4>>2]&-8|0)!=(e|0)){d=e<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(e|0)){M=c;break j}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=o;k[w+(m+24)>>2]=b;k[w+(m+12)>>2]=o;k[w+(m+8)>>2]=o;break h}}else M=b;while(0);b=M+8|0;a=k[b>>2]|0;L=k[151]|0;if(a>>>0>=L>>>0&M>>>0>=L>>>0){k[a+12>>2]=o;k[b>>2]=o;k[w+(m+8)>>2]=a;k[w+(m+12)>>2]=M;k[w+(m+24)>>2]=0;break}else Aa()}else{M=(k[150]|0)+l|0;k[150]=M;k[153]=o;k[w+(m+4)>>2]=M|1}while(0);M=w+(n|8)|0;return M|0}else c=1036;while(1){a=k[c>>2]|0;if(a>>>0<=g>>>0?(b=k[c+4>>2]|0,d=a+b|0,d>>>0>g>>>0):0)break;c=k[c+8>>2]|0}e=a+(b+-39)|0;a=a+(b+-47+((e&7|0)==0?0:0-e&7))|0;e=g+16|0;a=a>>>0>>0?g:a;b=a+8|0;c=w+8|0;c=(c&7|0)==0?0:0-c&7;M=p+-40-c|0;k[153]=w+c;k[150]=M;k[w+(c+4)>>2]=M|1;k[w+(p+-36)>>2]=40;k[154]=k[269];c=a+4|0;k[c>>2]=27;k[b>>2]=k[259];k[b+4>>2]=k[260];k[b+8>>2]=k[261];k[b+12>>2]=k[262];k[259]=w;k[260]=p;k[262]=0;k[261]=b;b=a+28|0;k[b>>2]=7;if((a+32|0)>>>0>>0)do{M=b;b=b+4|0;k[b>>2]=7}while((M+8|0)>>>0>>0);if((a|0)!=(g|0)){f=a-g|0;k[c>>2]=k[c>>2]&-2;k[g+4>>2]=f|1;k[a>>2]=f;b=f>>>3;if(f>>>0<256){a=b<<1;d=628+(a<<2)|0;c=k[147]|0;b=1<>2]|0;if(a>>>0<(k[151]|0)>>>0)Aa();else{G=b;H=a}}else{k[147]=c|b;G=628+(a+2<<2)|0;H=d}k[G>>2]=g;k[H+12>>2]=g;k[g+8>>2]=H;k[g+12>>2]=d;break}b=f>>>8;if(b)if(f>>>0>16777215)d=31;else{L=(b+1048320|0)>>>16&8;M=b<>>16&4;M=M<>>16&2;d=14-(K|L|d)+(M<>>15)|0;d=f>>>(d+7|0)&1|d<<1}else d=0;c=892+(d<<2)|0;k[g+28>>2]=d;k[g+20>>2]=0;k[e>>2]=0;b=k[148]|0;a=1<>2]=g;k[g+24>>2]=c;k[g+12>>2]=g;k[g+8>>2]=g;break}b=k[c>>2]|0;k:do if((k[b+4>>2]&-8|0)!=(f|0)){d=f<<((d|0)==31?0:25-(d>>>1)|0);while(1){a=b+16+(d>>>31<<2)|0;c=k[a>>2]|0;if(!c)break;if((k[c+4>>2]&-8|0)==(f|0)){I=c;break k}else{d=d<<1;b=c}}if(a>>>0<(k[151]|0)>>>0)Aa();else{k[a>>2]=g;k[g+24>>2]=b;k[g+12>>2]=g;k[g+8>>2]=g;break g}}else I=b;while(0);b=I+8|0;a=k[b>>2]|0;M=k[151]|0;if(a>>>0>=M>>>0&I>>>0>=M>>>0){k[a+12>>2]=g;k[b>>2]=g;k[g+8>>2]=a;k[g+12>>2]=I;k[g+24>>2]=0;break}else Aa()}}else{M=k[151]|0;if((M|0)==0|w>>>0>>0)k[151]=w;k[259]=w;k[260]=p;k[262]=0;k[156]=k[265];k[155]=-1;b=0;do{M=b<<1;L=628+(M<<2)|0;k[628+(M+3<<2)>>2]=L;k[628+(M+2<<2)>>2]=L;b=b+1|0}while((b|0)!=32);M=w+8|0;M=(M&7|0)==0?0:0-M&7;L=p+-40-M|0;k[153]=w+M;k[150]=L;k[w+(M+4)>>2]=L|1;k[w+(p+-36)>>2]=40;k[154]=k[269]}while(0);b=k[150]|0;if(b>>>0>q>>>0){L=b-q|0;k[150]=L;M=k[153]|0;k[153]=M+q;k[M+(q+4)>>2]=L|1;k[M+4>>2]=q|3;M=M+8|0;return M|0}}M=nc()|0;k[M>>2]=12;M=0;return M|0}function Tc(a){a=a|0;var b=0,c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0,u=0;if(!a)return;b=a+-8|0;h=k[151]|0;if(b>>>0>>0)Aa();c=k[a+-4>>2]|0;d=c&3;if((d|0)==1)Aa();o=c&-8;q=a+(o+-8)|0;do if(!(c&1)){b=k[b>>2]|0;if(!d)return;i=-8-b|0;l=a+i|0;m=b+o|0;if(l>>>0>>0)Aa();if((l|0)==(k[152]|0)){b=a+(o+-4)|0;c=k[b>>2]|0;if((c&3|0)!=3){u=l;f=m;break}k[149]=m;k[b>>2]=c&-2;k[a+(i+4)>>2]=m|1;k[q>>2]=m;return}e=b>>>3;if(b>>>0<256){d=k[a+(i+8)>>2]|0;c=k[a+(i+12)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0>>0)Aa();if((k[d+12>>2]|0)!=(l|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(l|0))g=b;else Aa()}else g=c+8|0;k[d+12>>2]=c;k[g>>2]=d;u=l;f=m;break}g=k[a+(i+24)>>2]|0;d=k[a+(i+12)>>2]|0;do if((d|0)==(l|0)){c=a+(i+20)|0;b=k[c>>2]|0;if(!b){c=a+(i+16)|0;b=k[c>>2]|0;if(!b){j=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0>>0)Aa();else{k[c>>2]=0;j=b;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();b=e+12|0;if((k[b>>2]|0)!=(l|0))Aa();c=d+8|0;if((k[c>>2]|0)==(l|0)){k[b>>2]=d;k[c>>2]=e;j=d;break}else Aa()}while(0);if(g){b=k[a+(i+28)>>2]|0;c=892+(b<<2)|0;if((l|0)==(k[c>>2]|0)){k[c>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(l|0))k[b>>2]=j;else k[g+20>>2]=j;if(!j){u=l;f=m;break}}c=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;b=k[a+(i+16)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[j+16>>2]=b;k[b+24>>2]=j;break}while(0);b=k[a+(i+20)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=b;k[b+24>>2]=j;u=l;f=m;break}else{u=l;f=m}}else{u=l;f=m}}else{u=b;f=o}while(0);if(u>>>0>=q>>>0)Aa();b=a+(o+-4)|0;c=k[b>>2]|0;if(!(c&1))Aa();if(!(c&2)){if((q|0)==(k[153]|0)){t=(k[150]|0)+f|0;k[150]=t;k[153]=u;k[u+4>>2]=t|1;if((u|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){t=(k[149]|0)+f|0;k[149]=t;k[152]=u;k[u+4>>2]=t|1;k[u+t>>2]=t;return}f=(c&-8)+f|0;e=c>>>3;do if(c>>>0>=256){g=k[a+(o+16)>>2]|0;b=k[a+(o|4)>>2]|0;do if((b|0)==(q|0)){c=a+(o+12)|0;b=k[c>>2]|0;if(!b){c=a+(o+8)|0;b=k[c>>2]|0;if(!b){p=0;break}}while(1){d=b+20|0;e=k[d>>2]|0;if(e){b=e;c=d;continue}d=b+16|0;e=k[d>>2]|0;if(!e)break;else{b=e;c=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=0;p=b;break}}else{c=k[a+o>>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();d=c+12|0;if((k[d>>2]|0)!=(q|0))Aa();e=b+8|0;if((k[e>>2]|0)==(q|0)){k[d>>2]=b;k[e>>2]=c;p=b;break}else Aa()}while(0);if(g){b=k[a+(o+20)>>2]|0;c=892+(b<<2)|0;if((q|0)==(k[c>>2]|0)){k[c>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();b=g+16|0;if((k[b>>2]|0)==(q|0))k[b>>2]=p;else k[g+20>>2]=p;if(!p)break}c=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=g;b=k[a+(o+8)>>2]|0;do if(b)if(b>>>0>>0)Aa();else{k[p+16>>2]=b;k[b+24>>2]=p;break}while(0);b=k[a+(o+12)>>2]|0;if(b)if(b>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=b;k[b+24>>2]=p;break}}}else{d=k[a+o>>2]|0;c=k[a+(o|4)>>2]|0;b=628+(e<<1<<2)|0;if((d|0)!=(b|0)){if(d>>>0<(k[151]|0)>>>0)Aa();if((k[d+12>>2]|0)!=(q|0))Aa()}if((c|0)==(d|0)){k[147]=k[147]&~(1<>>0<(k[151]|0)>>>0)Aa();b=c+8|0;if((k[b>>2]|0)==(q|0))n=b;else Aa()}else n=c+8|0;k[d+12>>2]=c;k[n>>2]=d}while(0);k[u+4>>2]=f|1;k[u+f>>2]=f;if((u|0)==(k[152]|0)){k[149]=f;return}}else{k[b>>2]=c&-2;k[u+4>>2]=f|1;k[u+f>>2]=f}b=f>>>3;if(f>>>0<256){c=b<<1;e=628+(c<<2)|0;d=k[147]|0;b=1<>2]|0;if(c>>>0<(k[151]|0)>>>0)Aa();else{r=b;s=c}}else{k[147]=d|b;r=628+(c+2<<2)|0;s=e}k[r>>2]=u;k[s+12>>2]=u;k[u+8>>2]=s;k[u+12>>2]=e;return}b=f>>>8;if(b)if(f>>>0>16777215)e=31;else{r=(b+1048320|0)>>>16&8;s=b<>>16&4;s=s<>>16&2;e=14-(q|r|e)+(s<>>15)|0;e=f>>>(e+7|0)&1|e<<1}else e=0;b=892+(e<<2)|0;k[u+28>>2]=e;k[u+20>>2]=0;k[u+16>>2]=0;c=k[148]|0;d=1<>2]|0;b:do if((k[b+4>>2]&-8|0)!=(f|0)){e=f<<((e|0)==31?0:25-(e>>>1)|0);while(1){c=b+16+(e>>>31<<2)|0;d=k[c>>2]|0;if(!d)break;if((k[d+4>>2]&-8|0)==(f|0)){t=d;break b}else{e=e<<1;b=d}}if(c>>>0<(k[151]|0)>>>0)Aa();else{k[c>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u;break a}}else t=b;while(0);b=t+8|0;c=k[b>>2]|0;s=k[151]|0;if(c>>>0>=s>>>0&t>>>0>=s>>>0){k[c+12>>2]=u;k[b>>2]=u;k[u+8>>2]=c;k[u+12>>2]=t;k[u+24>>2]=0;break}else Aa()}else{k[148]=c|d;k[b>>2]=u;k[u+24>>2]=b;k[u+12>>2]=u;k[u+8>>2]=u}while(0);u=(k[155]|0)+-1|0;k[155]=u;if(!u)b=1044;else return;while(1){b=k[b>>2]|0;if(!b)break;else b=b+8|0}k[155]=-1;return}function Uc(a,b){a=a|0;b=b|0;var c=0,d=0;if(!a){a=Sc(b)|0;return a|0}if(b>>>0>4294967231){a=nc()|0;k[a>>2]=12;a=0;return a|0}c=Wc(a+-8|0,b>>>0<11?16:b+11&-8)|0;if(c){a=c+8|0;return a|0}c=Sc(b)|0;if(!c){a=0;return a|0}d=k[a+-4>>2]|0;d=(d&-8)-((d&3|0)==0?8:4)|0;cd(c|0,a|0,(d>>>0>>0?d:b)|0)|0;Tc(a);a=c;return a|0}function Vc(a){a=a|0;var b=0;if(!a){b=0;return b|0}a=k[a+-4>>2]|0;b=a&3;if((b|0)==1){b=0;return b|0}b=(a&-8)-((b|0)==0?8:4)|0;return b|0}function Wc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;o=a+4|0;p=k[o>>2]|0;i=p&-8;l=a+i|0;h=k[151]|0;c=p&3;if(!((c|0)!=1&a>>>0>=h>>>0&a>>>0>>0))Aa();d=a+(i|4)|0;e=k[d>>2]|0;if(!(e&1))Aa();if(!c){if(b>>>0<256){a=0;return a|0}if(i>>>0>=(b+4|0)>>>0?(i-b|0)>>>0<=k[267]<<1>>>0:0)return a|0;a=0;return a|0}if(i>>>0>=b>>>0){c=i-b|0;if(c>>>0<=15)return a|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|3;k[d>>2]=k[d>>2]|1;Xc(a+b|0,c);return a|0}if((l|0)==(k[153]|0)){c=(k[150]|0)+i|0;if(c>>>0<=b>>>0){a=0;return a|0}n=c-b|0;k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|1;k[153]=a+b;k[150]=n;return a|0}if((l|0)==(k[152]|0)){d=(k[149]|0)+i|0;if(d>>>0>>0){a=0;return a|0}c=d-b|0;if(c>>>0>15){k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=c|1;k[a+d>>2]=c;d=a+(d+4)|0;k[d>>2]=k[d>>2]&-2;d=a+b|0}else{k[o>>2]=p&1|d|2;d=a+(d+4)|0;k[d>>2]=k[d>>2]|1;d=0;c=0}k[149]=c;k[152]=d;return a|0}if(e&2){a=0;return a|0}m=(e&-8)+i|0;if(m>>>0>>0){a=0;return a|0}n=m-b|0;f=e>>>3;do if(e>>>0>=256){g=k[a+(i+24)>>2]|0;f=k[a+(i+12)>>2]|0;do if((f|0)==(l|0)){d=a+(i+20)|0;c=k[d>>2]|0;if(!c){d=a+(i+16)|0;c=k[d>>2]|0;if(!c){j=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;j=c;break}}else{e=k[a+(i+8)>>2]|0;if(e>>>0>>0)Aa();c=e+12|0;if((k[c>>2]|0)!=(l|0))Aa();d=f+8|0;if((k[d>>2]|0)==(l|0)){k[c>>2]=f;k[d>>2]=e;j=f;break}else Aa()}while(0);if(g){c=k[a+(i+28)>>2]|0;d=892+(c<<2)|0;if((l|0)==(k[d>>2]|0)){k[d>>2]=j;if(!j){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=g+16|0;if((k[c>>2]|0)==(l|0))k[c>>2]=j;else k[g+20>>2]=j;if(!j)break}d=k[151]|0;if(j>>>0>>0)Aa();k[j+24>>2]=g;c=k[a+(i+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[j+16>>2]=c;k[c+24>>2]=j;break}while(0);c=k[a+(i+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[j+20>>2]=c;k[c+24>>2]=j;break}}}else{e=k[a+(i+8)>>2]|0;d=k[a+(i+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(l|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(l|0))g=c;else Aa()}else g=d+8|0;k[e+12>>2]=d;k[g>>2]=e}while(0);if(n>>>0<16){k[o>>2]=m|p&1|2;b=a+(m|4)|0;k[b>>2]=k[b>>2]|1;return a|0}else{k[o>>2]=p&1|b|2;k[a+(b+4)>>2]=n|3;p=a+(m|4)|0;k[p>>2]=k[p>>2]|1;Xc(a+b|0,n);return a|0}return 0}function Xc(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0,q=0,r=0,s=0,t=0;q=a+b|0;c=k[a+4>>2]|0;do if(!(c&1)){j=k[a>>2]|0;if(!(c&3))return;n=a+(0-j)|0;m=j+b|0;i=k[151]|0;if(n>>>0>>0)Aa();if((n|0)==(k[152]|0)){d=a+(b+4)|0;c=k[d>>2]|0;if((c&3|0)!=3){t=n;g=m;break}k[149]=m;k[d>>2]=c&-2;k[a+(4-j)>>2]=m|1;k[q>>2]=m;return}f=j>>>3;if(j>>>0<256){e=k[a+(8-j)>>2]|0;d=k[a+(12-j)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(n|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(n|0))h=c;else Aa()}else h=d+8|0;k[e+12>>2]=d;k[h>>2]=e;t=n;g=m;break}h=k[a+(24-j)>>2]|0;e=k[a+(12-j)>>2]|0;do if((e|0)==(n|0)){e=16-j|0;d=a+(e+4)|0;c=k[d>>2]|0;if(!c){d=a+e|0;c=k[d>>2]|0;if(!c){l=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;l=c;break}}else{f=k[a+(8-j)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(n|0))Aa();d=e+8|0;if((k[d>>2]|0)==(n|0)){k[c>>2]=e;k[d>>2]=f;l=e;break}else Aa()}while(0);if(h){c=k[a+(28-j)>>2]|0;d=892+(c<<2)|0;if((n|0)==(k[d>>2]|0)){k[d>>2]=l;if(!l){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(n|0))k[c>>2]=l;else k[h+20>>2]=l;if(!l){t=n;g=m;break}}e=k[151]|0;if(l>>>0>>0)Aa();k[l+24>>2]=h;c=16-j|0;d=k[a+c>>2]|0;do if(d)if(d>>>0>>0)Aa();else{k[l+16>>2]=d;k[d+24>>2]=l;break}while(0);c=k[a+(c+4)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[l+20>>2]=c;k[c+24>>2]=l;t=n;g=m;break}else{t=n;g=m}}else{t=n;g=m}}else{t=a;g=b}while(0);i=k[151]|0;if(q>>>0>>0)Aa();c=a+(b+4)|0;d=k[c>>2]|0;if(!(d&2)){if((q|0)==(k[153]|0)){s=(k[150]|0)+g|0;k[150]=s;k[153]=t;k[t+4>>2]=s|1;if((t|0)!=(k[152]|0))return;k[152]=0;k[149]=0;return}if((q|0)==(k[152]|0)){s=(k[149]|0)+g|0;k[149]=s;k[152]=t;k[t+4>>2]=s|1;k[t+s>>2]=s;return}g=(d&-8)+g|0;f=d>>>3;do if(d>>>0>=256){h=k[a+(b+24)>>2]|0;e=k[a+(b+12)>>2]|0;do if((e|0)==(q|0)){d=a+(b+20)|0;c=k[d>>2]|0;if(!c){d=a+(b+16)|0;c=k[d>>2]|0;if(!c){p=0;break}}while(1){e=c+20|0;f=k[e>>2]|0;if(f){c=f;d=e;continue}e=c+16|0;f=k[e>>2]|0;if(!f)break;else{c=f;d=e}}if(d>>>0>>0)Aa();else{k[d>>2]=0;p=c;break}}else{f=k[a+(b+8)>>2]|0;if(f>>>0>>0)Aa();c=f+12|0;if((k[c>>2]|0)!=(q|0))Aa();d=e+8|0;if((k[d>>2]|0)==(q|0)){k[c>>2]=e;k[d>>2]=f;p=e;break}else Aa()}while(0);if(h){c=k[a+(b+28)>>2]|0;d=892+(c<<2)|0;if((q|0)==(k[d>>2]|0)){k[d>>2]=p;if(!p){k[148]=k[148]&~(1<>>0<(k[151]|0)>>>0)Aa();c=h+16|0;if((k[c>>2]|0)==(q|0))k[c>>2]=p;else k[h+20>>2]=p;if(!p)break}d=k[151]|0;if(p>>>0>>0)Aa();k[p+24>>2]=h;c=k[a+(b+16)>>2]|0;do if(c)if(c>>>0>>0)Aa();else{k[p+16>>2]=c;k[c+24>>2]=p;break}while(0);c=k[a+(b+20)>>2]|0;if(c)if(c>>>0<(k[151]|0)>>>0)Aa();else{k[p+20>>2]=c;k[c+24>>2]=p;break}}}else{e=k[a+(b+8)>>2]|0;d=k[a+(b+12)>>2]|0;c=628+(f<<1<<2)|0;if((e|0)!=(c|0)){if(e>>>0>>0)Aa();if((k[e+12>>2]|0)!=(q|0))Aa()}if((d|0)==(e|0)){k[147]=k[147]&~(1<>>0>>0)Aa();c=d+8|0;if((k[c>>2]|0)==(q|0))o=c;else Aa()}else o=d+8|0;k[e+12>>2]=d;k[o>>2]=e}while(0);k[t+4>>2]=g|1;k[t+g>>2]=g;if((t|0)==(k[152]|0)){k[149]=g;return}}else{k[c>>2]=d&-2;k[t+4>>2]=g|1;k[t+g>>2]=g}c=g>>>3;if(g>>>0<256){d=c<<1;f=628+(d<<2)|0;e=k[147]|0;c=1<>2]|0;if(d>>>0<(k[151]|0)>>>0)Aa();else{r=c;s=d}}else{k[147]=e|c;r=628+(d+2<<2)|0;s=f}k[r>>2]=t;k[s+12>>2]=t;k[t+8>>2]=s;k[t+12>>2]=f;return}c=g>>>8;if(c)if(g>>>0>16777215)f=31;else{r=(c+1048320|0)>>>16&8;s=c<>>16&4;s=s<>>16&2;f=14-(q|r|f)+(s<>>15)|0;f=g>>>(f+7|0)&1|f<<1}else f=0;c=892+(f<<2)|0;k[t+28>>2]=f;k[t+20>>2]=0;k[t+16>>2]=0;d=k[148]|0;e=1<>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}c=k[c>>2]|0;a:do if((k[c+4>>2]&-8|0)!=(g|0)){f=g<<((f|0)==31?0:25-(f>>>1)|0);while(1){d=c+16+(f>>>31<<2)|0;e=k[d>>2]|0;if(!e)break;if((k[e+4>>2]&-8|0)==(g|0)){c=e;break a}else{f=f<<1;c=e}}if(d>>>0<(k[151]|0)>>>0)Aa();k[d>>2]=t;k[t+24>>2]=c;k[t+12>>2]=t;k[t+8>>2]=t;return}while(0);d=c+8|0;e=k[d>>2]|0;s=k[151]|0;if(!(e>>>0>=s>>>0&c>>>0>=s>>>0))Aa();k[e+12>>2]=t;k[d>>2]=t;k[t+8>>2]=e;k[t+12>>2]=c;k[t+24>>2]=0;return}function Yc(){}function Zc(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;d=b-d-(c>>>0>a>>>0|0)>>>0;return (L=d,a-c>>>0|0)|0}function _c(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;c=a+c>>>0;return (L=b+d+(c>>>0>>0|0)>>>0,c|0)|0}function $c(a,b,c){a=a|0;b=b|0;c=c|0;var d=0,e=0,f=0,g=0;d=a+c|0;if((c|0)>=20){b=b&255;f=a&3;g=b|b<<8|b<<16|b<<24;e=d&~3;if(f){f=a+4-f|0;while((a|0)<(f|0)){i[a>>0]=b;a=a+1|0}}while((a|0)<(e|0)){k[a>>2]=g;a=a+4|0}}while((a|0)<(d|0)){i[a>>0]=b;a=a+1|0}return a-c|0}function ad(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>>c;return a>>>c|(b&(1<>>c-32|0}function bd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b<>>32-c;return a<=4096)return Ha(a|0,b|0,c|0)|0;d=a|0;if((a&3)==(b&3)){while(a&3){if(!c)return d|0;i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}while((c|0)>=4){k[a>>2]=k[b>>2];a=a+4|0;b=b+4|0;c=c-4|0}}while((c|0)>0){i[a>>0]=i[b>>0]|0;a=a+1|0;b=b+1|0;c=c-1|0}return d|0}function dd(a,b,c){a=a|0;b=b|0;c=c|0;if((c|0)<32){L=b>>c;return a>>>c|(b&(1<>c-32|0}function ed(a){a=a|0;var b=0;b=i[v+(a&255)>>0]|0;if((b|0)<8)return b|0;b=i[v+(a>>8&255)>>0]|0;if((b|0)<8)return b+8|0;b=i[v+(a>>16&255)>>0]|0;if((b|0)<8)return b+16|0;return (i[v+(a>>>24)>>0]|0)+24|0}function fd(a,b){a=a|0;b=b|0;var c=0,d=0,e=0,f=0;f=a&65535;e=b&65535;c=ha(e,f)|0;d=a>>>16;a=(c>>>16)+(ha(e,d)|0)|0;e=b>>>16;b=ha(e,f)|0;return (L=(a>>>16)+(ha(e,d)|0)+(((a&65535)+b|0)>>>16)|0,a+b<<16|c&65535|0)|0}function gd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;j=b>>31|((b|0)<0?-1:0)<<1;i=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;f=d>>31|((d|0)<0?-1:0)<<1;e=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;h=Zc(j^a,i^b,j,i)|0;g=L;a=f^j;b=e^i;return Zc((ld(h,g,Zc(f^c,e^d,f,e)|0,L,0)|0)^a,L^b,a,b)|0}function hd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0,g=0,h=0,i=0,j=0;e=r;r=r+16|0;h=e|0;g=b>>31|((b|0)<0?-1:0)<<1;f=((b|0)<0?-1:0)>>31|((b|0)<0?-1:0)<<1;j=d>>31|((d|0)<0?-1:0)<<1;i=((d|0)<0?-1:0)>>31|((d|0)<0?-1:0)<<1;a=Zc(g^a,f^b,g,f)|0;b=L;ld(a,b,Zc(j^c,i^d,j,i)|0,L,h)|0;d=Zc(k[h>>2]^g,k[h+4>>2]^f,g,f)|0;c=L;r=e;return (L=c,d)|0}function id(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;e=a;f=c;c=fd(e,f)|0;a=L;return (L=(ha(b,f)|0)+(ha(d,e)|0)+a|a&0,c|0|0)|0}function jd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return ld(a,b,c,d,0)|0}function kd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;var e=0,f=0;f=r;r=r+16|0;e=f|0;ld(a,b,c,d,e)|0;r=f;return (L=k[e+4>>2]|0,k[e>>2]|0)|0}function ld(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;var f=0,g=0,h=0,i=0,j=0,l=0,m=0,n=0,o=0,p=0;l=a;i=b;j=i;g=c;n=d;h=n;if(!j){f=(e|0)!=0;if(!h){if(f){k[e>>2]=(l>>>0)%(g>>>0);k[e+4>>2]=0}n=0;e=(l>>>0)/(g>>>0)>>>0;return (L=n,e)|0}else{if(!f){n=0;e=0;return (L=n,e)|0}k[e>>2]=a|0;k[e+4>>2]=b&0;n=0;e=0;return (L=n,e)|0}}f=(h|0)==0;do if(g){if(!f){f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=31){m=f+1|0;h=31-f|0;b=f-31>>31;g=m;a=l>>>(m>>>0)&b|j<>>(m>>>0)&b;f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;n=0;e=0;return (L=n,e)|0}f=g-1|0;if(f&g){h=(ja(g|0)|0)+33-(ja(j|0)|0)|0;p=64-h|0;m=32-h|0;i=m>>31;o=h-32|0;b=o>>31;g=h;a=m-1>>31&j>>>(o>>>0)|(j<>>(h>>>0))&b;b=b&j>>>(h>>>0);f=l<>>(o>>>0))&i|l<>31;break}if(e){k[e>>2]=f&l;k[e+4>>2]=0}if((g|0)==1){o=i|b&0;p=a|0|0;return (L=o,p)|0}else{p=ed(g|0)|0;o=j>>>(p>>>0)|0;p=j<<32-p|l>>>(p>>>0)|0;return (L=o,p)|0}}else{if(f){if(e){k[e>>2]=(j>>>0)%(g>>>0);k[e+4>>2]=0}o=0;p=(j>>>0)/(g>>>0)>>>0;return (L=o,p)|0}if(!l){if(e){k[e>>2]=0;k[e+4>>2]=(j>>>0)%(h>>>0)}o=0;p=(j>>>0)/(h>>>0)>>>0;return (L=o,p)|0}f=h-1|0;if(!(f&h)){if(e){k[e>>2]=a|0;k[e+4>>2]=f&j|b&0}o=0;p=j>>>((ed(h|0)|0)>>>0);return (L=o,p)|0}f=(ja(h|0)|0)-(ja(j|0)|0)|0;if(f>>>0<=30){b=f+1|0;h=31-f|0;g=b;a=j<>>(b>>>0);b=j>>>(b>>>0);f=0;h=l<>2]=a|0;k[e+4>>2]=i|b&0;o=0;p=0;return (L=o,p)|0}while(0);if(!g){j=h;i=0;h=0}else{m=c|0|0;l=n|d&0;j=_c(m|0,l|0,-1,-1)|0;c=L;i=h;h=0;do{d=i;i=f>>>31|i<<1;f=h|f<<1;d=a<<1|d>>>31|0;n=a>>>31|b<<1|0;Zc(j,c,d,n)|0;p=L;o=p>>31|((p|0)<0?-1:0)<<1;h=o&1;a=Zc(d,n,o&m,(((p|0)<0?-1:0)>>31|((p|0)<0?-1:0)<<1)&l)|0;b=L;g=g-1|0}while((g|0)!=0);j=i;i=0}g=0;if(e){k[e>>2]=a;k[e+4>>2]=b}o=(f|0)>>>31|(j|g)<<1|(g<<1|f>>>31)&0|i;p=(f<<1|0>>>31)&-2|h;return (L=o,p)|0}function md(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;return Ra[a&7](b|0,c|0,d|0)|0}function nd(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;Sa[a&3](b|0,c|0,d|0,e|0,f|0)}function od(a,b){a=a|0;b=b|0;Ta[a&7](b|0)}function pd(a,b){a=a|0;b=b|0;return Ua[a&1](b|0)|0}function qd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;Va[a&0](b|0,c|0,d|0)}function rd(a){a=a|0;Wa[a&3]()}function sd(a,b,c,d,e,f,g){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;g=g|0;Xa[a&3](b|0,c|0,d|0,e|0,f|0,g|0)}function td(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;Ya[a&3](b|0,c|0,d|0,e|0)}function ud(a,b,c){a=a|0;b=b|0;c=c|0;ka(0);return 0}function vd(a,b,c,d,e){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;ka(1)}function wd(a){a=a|0;ka(2)}function xd(a){a=a|0;ka(3);return 0}function yd(a,b,c){a=a|0;b=b|0;c=c|0;ka(4)}function zd(){ka(5)}function Ad(a,b,c,d,e,f){a=a|0;b=b|0;c=c|0;d=d|0;e=e|0;f=f|0;ka(6)}function Bd(a,b,c,d){a=a|0;b=b|0;c=c|0;d=d|0;ka(7)} + +// EMSCRIPTEN_END_FUNCS + var Ra=[ud,Zb,Oc,Hc,Gc,Ic,ud,ud];var Sa=[vd,ec,dc,vd];var Ta=[wd,Ub,Xb,Vb,Wb,Yb,lc,Nc];var Ua=[xd,Fc];var Va=[yd];var Wa=[zd,jc,kc,zd];var Xa=[Ad,gc,fc,Ad];var Ya=[Bd,$b,ac,Bd];return{___cxa_can_catch:hc,_crn_get_levels:zb,_crn_get_uncompressed_size:Cb,_crn_decompress:Db,_i64Add:_c,_crn_get_width:xb,___cxa_is_pointer_type:ic,_crn_get_bytes_per_block:Bb,_memset:$c,_malloc:Sc,_memcpy:cd,_i64Subtract:Zc,_bitshift64Lshr:ad,_free:Tc,_bitshift64Shl:bd,_crn_get_height:yb,_crn_get_dxt_format:Ab,runPostSets:Yc,_emscripten_replace_memory:Qa,stackAlloc:Za,stackSave:_a,stackRestore:$a,establishStackSpace:ab,setThrew:bb,setTempRet0:eb,getTempRet0:fb,dynCall_iiii:md,dynCall_viiiii:nd,dynCall_vi:od,dynCall_ii:pd,dynCall_viii:qd,dynCall_v:rd,dynCall_viiiiii:sd,dynCall_viiii:td}}) + + + // EMSCRIPTEN_END_ASM + (Module.asmGlobalArg,Module.asmLibraryArg,buffer);var ___cxa_can_catch=Module["___cxa_can_catch"]=asm["___cxa_can_catch"];var _crn_get_levels=Module["_crn_get_levels"]=asm["_crn_get_levels"];var runPostSets=Module["runPostSets"]=asm["runPostSets"];var _crn_get_uncompressed_size=Module["_crn_get_uncompressed_size"]=asm["_crn_get_uncompressed_size"];var _crn_decompress=Module["_crn_decompress"]=asm["_crn_decompress"];var _i64Add=Module["_i64Add"]=asm["_i64Add"];var _crn_get_height=Module["_crn_get_height"]=asm["_crn_get_height"];var ___cxa_is_pointer_type=Module["___cxa_is_pointer_type"]=asm["___cxa_is_pointer_type"];var _crn_get_bytes_per_block=Module["_crn_get_bytes_per_block"]=asm["_crn_get_bytes_per_block"];var _memset=Module["_memset"]=asm["_memset"];var _malloc=Module["_malloc"]=asm["_malloc"];var _memcpy=Module["_memcpy"]=asm["_memcpy"];var _emscripten_replace_memory=Module["_emscripten_replace_memory"]=asm["_emscripten_replace_memory"];var _i64Subtract=Module["_i64Subtract"]=asm["_i64Subtract"];var _bitshift64Lshr=Module["_bitshift64Lshr"]=asm["_bitshift64Lshr"];var _free=Module["_free"]=asm["_free"];var _crn_get_dxt_format=Module["_crn_get_dxt_format"]=asm["_crn_get_dxt_format"];var _crn_get_width=Module["_crn_get_width"]=asm["_crn_get_width"];var _bitshift64Shl=Module["_bitshift64Shl"]=asm["_bitshift64Shl"];var dynCall_iiii=Module["dynCall_iiii"]=asm["dynCall_iiii"];var dynCall_viiiii=Module["dynCall_viiiii"]=asm["dynCall_viiiii"];var dynCall_vi=Module["dynCall_vi"]=asm["dynCall_vi"];var dynCall_ii=Module["dynCall_ii"]=asm["dynCall_ii"];var dynCall_viii=Module["dynCall_viii"]=asm["dynCall_viii"];var dynCall_v=Module["dynCall_v"]=asm["dynCall_v"];var dynCall_viiiiii=Module["dynCall_viiiiii"]=asm["dynCall_viiiiii"];var dynCall_viiii=Module["dynCall_viiii"]=asm["dynCall_viiii"];Runtime.stackAlloc=asm["stackAlloc"];Runtime.stackSave=asm["stackSave"];Runtime.stackRestore=asm["stackRestore"];Runtime.establishStackSpace=asm["establishStackSpace"];Runtime.setTempRet0=asm["setTempRet0"];Runtime.getTempRet0=asm["getTempRet0"];function ExitStatus(status){this.name="ExitStatus";this.message="Program terminated with exit("+status+")";this.status=status}ExitStatus.prototype=new Error;ExitStatus.prototype.constructor=ExitStatus;var initialStackTop;var preloadStartTime=null;var calledMain=false;dependenciesFulfilled=function runCaller(){if(!Module["calledRun"])run();if(!Module["calledRun"])dependenciesFulfilled=runCaller};Module["callMain"]=Module.callMain=function callMain(args){assert(runDependencies==0,"cannot call main when async dependencies remain! (listen on __ATMAIN__)");assert(__ATPRERUN__.length==0,"cannot call main when preRun functions remain to be called");args=args||[];ensureInitRuntime();var argc=args.length+1;function pad(){for(var i=0;i<4-1;i++){argv.push(0)}}var argv=[allocate(intArrayFromString(Module["thisProgram"]),"i8",ALLOC_NORMAL)];pad();for(var i=0;i0){return}preRun();if(runDependencies>0)return;if(Module["calledRun"])return;function doRun(){if(Module["calledRun"])return;Module["calledRun"]=true;if(ABORT)return;ensureInitRuntime();preMain();if(Module["onRuntimeInitialized"])Module["onRuntimeInitialized"]();if(Module["_main"]&&shouldRunNow)Module["callMain"](args);postRun()}if(Module["setStatus"]){Module["setStatus"]("Running...");setTimeout((function(){setTimeout((function(){Module["setStatus"]("")}),1);doRun()}),1)}else{doRun()}}Module["run"]=Module.run=run;function exit(status,implicit){if(implicit&&Module["noExitRuntime"]){return}if(Module["noExitRuntime"]){}else{ABORT=true;EXITSTATUS=status;STACKTOP=initialStackTop;exitRuntime();if(Module["onExit"])Module["onExit"](status)}if(ENVIRONMENT_IS_NODE){process["stdout"]["once"]("drain",(function(){process["exit"](status)}));console.log(" ");setTimeout((function(){process["exit"](status)}),500)}else if(ENVIRONMENT_IS_SHELL&&typeof quit==="function"){quit(status)}throw new ExitStatus(status)}Module["exit"]=Module.exit=exit;var abortDecorators=[];function abort(what){if(what!==undefined){Module.print(what);Module.printErr(what);what=JSON.stringify(what)}else{what=""}ABORT=true;EXITSTATUS=1;var extra="\nIf this abort() is unexpected, build with -s ASSERTIONS=1 which can give more information.";var output="abort("+what+") at "+stackTrace()+extra;if(abortDecorators){abortDecorators.forEach((function(decorator){output=decorator(output,what)}))}throw output}Module["abort"]=Module.abort=abort;if(Module["preInit"]){if(typeof Module["preInit"]=="function")Module["preInit"]=[Module["preInit"]];while(Module["preInit"].length>0){Module["preInit"].pop()()}}var shouldRunNow=true;if(Module["noInitialRun"]){shouldRunNow=false}Module["noExitRuntime"]=true;run() + + return Module; +}); \ No newline at end of file diff --git a/Source/ThirdParty/gltfDefaults.js b/Source/ThirdParty/gltfDefaults.js index 31562cbd20fd..d9174d665b2f 100644 --- a/Source/ThirdParty/gltfDefaults.js +++ b/Source/ThirdParty/gltfDefaults.js @@ -4,7 +4,7 @@ define([ '../Core/defaultValue', '../Core/defined', '../Core/Quaternion', - '../Renderer/WebGLConstants' + '../Core/WebGLConstants' ], function( Cartesian3, defaultValue, @@ -401,7 +401,7 @@ define([ for (var name in skins) { if (skins.hasOwnProperty(name)) { var skin = skins[name]; - if (defined(skin.bindShapeMatrix)) { + if (!defined(skin.bindShapeMatrix)) { skin.bindShapeMatrix = [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, diff --git a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js index 57b76e94c8a3..107e0368e755 100644 --- a/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js +++ b/Source/Widgets/CesiumInspector/CesiumInspectorViewModel.js @@ -1,6 +1,5 @@ /*global define*/ define([ - '../../Core/Color', '../../Core/defined', '../../Core/defineProperties', '../../Core/destroyObject', @@ -14,7 +13,6 @@ define([ '../../ThirdParty/knockout', '../createCommand' ], function( - Color, defined, defineProperties, destroyObject, @@ -72,6 +70,7 @@ define([ * @constructor * * @param {Scene} scene The scene instance to use. + * @param {PerformanceContainer} performanceContainer The instance to use for performance container. * * @exception {DeveloperError} scene is required. */ @@ -805,7 +804,7 @@ define([ get : function() { var that = this; return createCommand(function() { - that.tile = that.tile.children[0]; + that.tile = that.tile.northwestChild; }); } }, @@ -820,7 +819,7 @@ define([ get : function() { var that = this; return createCommand(function() { - that.tile = that.tile.children[1]; + that.tile = that.tile.northeastChild; }); } }, @@ -835,7 +834,7 @@ define([ get : function() { var that = this; return createCommand(function() { - that.tile = that.tile.children[2]; + that.tile = that.tile.southwestChild; }); } }, @@ -850,7 +849,7 @@ define([ get : function() { var that = this; return createCommand(function() { - that.tile = that.tile.children[3]; + that.tile = that.tile.southeastChild; }); } }, diff --git a/Source/Widgets/Geocoder/Geocoder.css b/Source/Widgets/Geocoder/Geocoder.css index b8da4c244277..244e41de2c8d 100644 --- a/Source/Widgets/Geocoder/Geocoder.css +++ b/Source/Widgets/Geocoder/Geocoder.css @@ -37,6 +37,33 @@ width: 250px; } +.cesium-viewer-geocoderContainer .search-results { + position: absolute; + background-color: #000; + color: #eee; + overflow-y: auto; + opacity: 0.8; + width: 100%; +} + +.cesium-viewer-geocoderContainer .search-results ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.cesium-viewer-geocoderContainer .search-results ul li { + font-size: 14px; + padding: 3px 10px; +} +.cesium-viewer-geocoderContainer .search-results ul li:hover { + cursor: pointer; +} + +.cesium-viewer-geocoderContainer .search-results ul li.active { + background: #48b; +} + .cesium-geocoder-searchButton { background-color: #303336; display: inline-block; diff --git a/Source/Widgets/Geocoder/Geocoder.js b/Source/Widgets/Geocoder/Geocoder.js index 6ed87298029e..2b42e86a2ccb 100644 --- a/Source/Widgets/Geocoder/Geocoder.js +++ b/Source/Widgets/Geocoder/Geocoder.js @@ -32,6 +32,8 @@ define([ * @param {Object} options Object with the following properties: * @param {Element|String} options.container The DOM element or ID that will contain the widget. * @param {Scene} options.scene The Scene instance to use. + * @param {GeocoderService[]} [options.geocoderServices] The geocoder services to be used + * @param {Boolean} [options.autoComplete = true] True if the geocoder should query as the user types to autocomplete * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. * @param {String} [options.key] The Bing Maps key for your application, which can be * created at {@link https://www.bingmapsportal.com}. @@ -66,10 +68,11 @@ define([ textBox.className = 'cesium-geocoder-input'; textBox.setAttribute('placeholder', 'Enter an address or landmark...'); textBox.setAttribute('data-bind', '\ -value: searchText,\ -valueUpdate: "afterkeydown",\ +textInput: searchText,\ disable: isSearchInProgress,\ -css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 }'); +event: { keyup: handleKeyUp, keydown: handleKeyDown, mouseover: deselectSuggestion },\ +css: { "cesium-geocoder-input-wide" : keepExpanded || searchText.length > 0 },\ +hasFocus: _focusTextbox'); this._onTextBoxFocus = function() { // as of 2016-10-19, setTimeout is required to ensure that the @@ -92,21 +95,41 @@ cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, container.appendChild(form); + var searchSuggestionsContainer = document.createElement('div'); + searchSuggestionsContainer.className = 'search-results'; + searchSuggestionsContainer.setAttribute('data-bind', 'visible: _suggestionsVisible'); + + var suggestionsList = document.createElement('ul'); + suggestionsList.setAttribute('data-bind', 'foreach: _suggestions'); + var suggestions = document.createElement('li'); + suggestionsList.appendChild(suggestions); + suggestions.setAttribute('data-bind', 'text: $data.displayName, \ +click: $parent.activateSuggestion, \ +event: { mouseover: $parent.handleMouseover}, \ +css: { active: $data === $parent._selectedSuggestion }'); + + searchSuggestionsContainer.appendChild(suggestionsList); + container.appendChild(searchSuggestionsContainer); + knockout.applyBindings(viewModel, form); + knockout.applyBindings(viewModel, searchSuggestionsContainer); this._container = container; + this._searchSuggestionsContainer = searchSuggestionsContainer; this._viewModel = viewModel; this._form = form; this._onInputBegin = function(e) { if (!container.contains(e.target)) { - textBox.blur(); + viewModel._focusTextbox = false; + viewModel.hideSuggestions(); } }; this._onInputEnd = function(e) { if (container.contains(e.target)) { - textBox.focus(); + viewModel._focusTextbox = true; + viewModel.showSuggestions(); } }; @@ -140,6 +163,18 @@ cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, } }, + /** + * Gets the parent container. + * @memberof Geocoder.prototype + * + * @type {Element} + */ + searchSuggestionsContainer : { + get : function() { + return this._searchSuggestionsContainer; + } + }, + /** * Gets the view model. * @memberof Geocoder.prototype @@ -174,9 +209,11 @@ cesiumSvgPath: { path: isSearchInProgress ? _stopSearchPath : _startSearchPath, document.removeEventListener('touchstart', this._onInputBegin, true); document.removeEventListener('touchend', this._onInputEnd, true); } - + this._viewModel.destroy(); knockout.cleanNode(this._form); + knockout.cleanNode(this._searchSuggestionsContainer); this._container.removeChild(this._form); + this._container.removeChild(this._searchSuggestionsContainer); this._textBox.removeEventListener('focus', this._onTextBoxFocus, false); return destroyObject(this); diff --git a/Source/Widgets/Geocoder/GeocoderViewModel.js b/Source/Widgets/Geocoder/GeocoderViewModel.js index f2b6d37880d6..6f51f93db92b 100644 --- a/Source/Widgets/Geocoder/GeocoderViewModel.js +++ b/Source/Widgets/Geocoder/GeocoderViewModel.js @@ -1,36 +1,40 @@ /*global define*/ define([ '../../Core/BingMapsApi', + '../../Core/BingMapsGeocoderService', '../../Core/Cartesian3', '../../Core/defaultValue', '../../Core/defined', '../../Core/defineProperties', + '../../Core/deprecationWarning', '../../Core/DeveloperError', '../../Core/Event', - '../../Core/loadJsonp', + '../../Core/CartographicGeocoderService', '../../Core/Matrix4', '../../Core/Rectangle', '../../Core/RequestScheduler', - '../../Scene/SceneMode', '../../ThirdParty/knockout', '../../ThirdParty/when', - '../createCommand' + '../createCommand', + '../getElement' ], function( BingMapsApi, + BingMapsGeocoderService, Cartesian3, defaultValue, defined, defineProperties, + deprecationWarning, DeveloperError, Event, - loadJsonp, + CartographicGeocoderService, Matrix4, Rectangle, RequestScheduler, - SceneMode, knockout, when, - createCommand) { + createCommand, + getElement) { 'use strict'; /** @@ -40,6 +44,9 @@ define([ * * @param {Object} options Object with the following properties: * @param {Scene} options.scene The Scene instance to use. + * @param {GeocoderService[]} [options.geocoderServices] Geocoder services to use for geocoding queries. + * If more than one are supplied, suggestions will be gathered for the geocoders that support it, + * and if no suggestion is selected the result from the first geocoder service wil be used. * @param {String} [options.url='https://dev.virtualearth.net'] The base URL of the Bing Maps API. * @param {String} [options.key] The Bing Maps key for your application, which can be * created at {@link https://www.bingmapsportal.com}. @@ -57,33 +64,123 @@ define([ } //>>includeEnd('debug'); + if (defined(options.geocoderServices)) { + this._geocoderServices = options.geocoderServices; + } else { + this._geocoderServices = [ + new CartographicGeocoderService(), + new BingMapsGeocoderService() + ]; + } + + var errorCredit; this._url = defaultValue(options.url, 'https://dev.virtualearth.net/'); if (this._url.length > 0 && this._url[this._url.length - 1] !== '/') { this._url += '/'; } this._key = BingMapsApi.getKey(options.key); - var errorCredit = BingMapsApi.getErrorCredit(options.key); + this._defaultGeocoderOptions = { + url: this._url, + key: this._key + }; + + if (defined(options.key)) { + errorCredit = BingMapsApi.getErrorCredit(options.key); + } if (defined(errorCredit)) { options.scene._frameState.creditDisplay.addDefaultCredit(errorCredit); } + this._viewContainer = options.container; this._scene = options.scene; this._flightDuration = options.flightDuration; this._searchText = ''; this._isSearchInProgress = false; - this._geocodeInProgress = undefined; + this._geocodePromise = undefined; this._complete = new Event(); + this._suggestions = []; + this._selectedSuggestion = undefined; + this._showSuggestions = true; + this._updateCamera = updateCamera; + this._adjustSuggestionsScroll = adjustSuggestionsScroll; + this._updateSearchSuggestions = updateSearchSuggestions; + this._handleArrowDown = handleArrowDown; + this._handleArrowUp = handleArrowUp; var that = this; + + this._suggestionsVisible = knockout.pureComputed(function () { + var suggestions = knockout.getObservable(that, '_suggestions'); + var suggestionsNotEmpty = suggestions().length > 0; + var showSuggestions = knockout.getObservable(that, '_showSuggestions')(); + return suggestionsNotEmpty && showSuggestions; + }); + this._searchCommand = createCommand(function() { + that.hideSuggestions(); + if (defined(that._selectedSuggestion)) { + that.activateSuggestion(that._selectedSuggestion); + return false; + } if (that.isSearchInProgress) { cancelGeocode(that); } else { - geocode(that); + geocode(that, that._geocoderServices); } }); + this.deselectSuggestion = function () { + that._selectedSuggestion = undefined; + }; + + this.handleKeyDown = function(data, event) { + var downKey = event.key === 'ArrowDown' || event.key === 'Down' || event.keyCode === 40; + var upKey = event.key === 'ArrowUp' || event.key === 'Up' || event.keyCode === 38; + if (downKey || upKey) { + event.preventDefault(); + } + + return true; + }; + + this.handleKeyUp = function (data, event) { + var downKey = event.key === 'ArrowDown' || event.key === 'Down' || event.keyCode === 40; + var upKey = event.key === 'ArrowUp' || event.key === 'Up' || event.keyCode === 38; + var enterKey = event.key === 'Enter' || event.keyCode === 13; + if (upKey) { + handleArrowUp(that); + } else if (downKey) { + handleArrowDown(that); + } else if (enterKey) { + that._searchCommand(); + } + return true; + }; + + this.activateSuggestion = function (data) { + that.hideSuggestions(); + that._searchText = data.displayName; + var destination = data.destination; + clearSuggestions(that); + updateCamera(that, destination); + }; + + this.hideSuggestions = function () { + that._showSuggestions = false; + that._selectedSuggestion = undefined; + }; + + this.showSuggestions = function () { + that._showSuggestions = true; + }; + + this.handleMouseover = function (data, event) { + if (data !== that._selectedSuggestion) { + that._selectedSuggestion = data; + } + }; + /** * Gets or sets a value indicating if this instance should always show its text input field. * @@ -92,8 +189,22 @@ define([ */ this.keepExpanded = false; - knockout.track(this, ['_searchText', '_isSearchInProgress', 'keepExpanded']); + /** + * True if the geocoder should query as the user types to autocomplete + * @type {Booelan} + * @default true + */ + this.autoComplete = defaultValue(options.autocomplete, true); + + this._focusTextbox = false; + knockout.track(this, ['_searchText', '_isSearchInProgress', 'keepExpanded', '_suggestions', '_selectedSuggestion', '_showSuggestions', '_focusTextbox']); + + var searchTextObservable = knockout.getObservable(this, '_searchText'); + searchTextObservable.extend({ rateLimit: { timeout: 500 } }); + this._suggestionSubscription = searchTextObservable.subscribe(function() { + updateSearchSuggestions(that); + }); /** * Gets a value indicating whether a search is currently in progress. This property is observable. * @@ -118,6 +229,7 @@ define([ if (this.isSearchInProgress) { return 'Searching...'; } + return this._searchText; }, set : function(value) { @@ -126,7 +238,6 @@ define([ throw new DeveloperError('value must be a valid string.'); } //>>includeEnd('debug'); - this._searchText = value; } }); @@ -159,24 +270,28 @@ define([ defineProperties(GeocoderViewModel.prototype, { /** * Gets the Bing maps url. + * @deprecated * @memberof GeocoderViewModel.prototype * * @type {String} */ url : { get : function() { + deprecationWarning('url is deprecated', 'The url property was deprecated in Cesium 1.30 and will be removed in version 1.31.'); return this._url; } }, /** * Gets the Bing maps key. + * @deprecated * @memberof GeocoderViewModel.prototype * * @type {String} */ key : { get : function() { + deprecationWarning('key is deprecated', 'The key property was deprecated in Cesium 1.30 and will be removed in version 1.31.'); return this._key; } }, @@ -215,9 +330,68 @@ define([ get : function() { return this._searchCommand; } + }, + + /** + * Gets the currently selected geocoder search suggestion + * @memberof GeocoderViewModel.prototype + * + * @type {Object} + */ + selectedSuggestion : { + get : function() { + return this._selectedSuggestion; + } + }, + + /** + * Gets the list of geocoder search suggestions + * @memberof GeocoderViewModel.prototype + * + * @type {Object[]} + */ + suggestions : { + get : function() { + return this._suggestions; + } } }); + /** + * Destroys the widget. Should be called if permanently + * removing the widget from layout. + */ + GeocoderViewModel.prototype.destroy = function() { + this._suggestionSubscription.dispose(); + }; + + function handleArrowUp(viewModel) { + if (viewModel._suggestions.length === 0) { + return; + } + var next; + var currentIndex = viewModel._suggestions.indexOf(viewModel._selectedSuggestion); + if (currentIndex === -1 || currentIndex === 0) { + viewModel._selectedSuggestion = undefined; + return; + } + next = currentIndex - 1; + viewModel._selectedSuggestion = viewModel._suggestions[next]; + adjustSuggestionsScroll(viewModel, next); + } + + function handleArrowDown(viewModel) { + if (viewModel._suggestions.length === 0) { + return; + } + var numberOfSuggestions = viewModel._suggestions.length; + var currentIndex = viewModel._suggestions.indexOf(viewModel._selectedSuggestion); + var next = (currentIndex + 1) % numberOfSuggestions; + viewModel._selectedSuggestion = viewModel._suggestions[next]; + + adjustSuggestionsScroll(viewModel, next); + } + function updateCamera(viewModel, destination) { viewModel._scene.camera.flyTo({ destination : destination, @@ -229,81 +403,124 @@ define([ }); } - function geocode(viewModel) { - var query = viewModel.searchText; + function chainPromise(promise, geocoderService, query) { + return promise + .then(function(result) { + if (defined(result) && result.state === 'fulfilled' && result.value.length > 0){ + return result; + } + var nextPromise = geocoderService.geocode(query) + .then(function (result) { + return {state: 'fulfilled', value: result}; + }) + .otherwise(function (err) { + return {state: 'rejected', reason: err}; + }); + + return nextPromise; + }); + } - if (/^\s*$/.test(query)) { - //whitespace string + function geocode(viewModel, geocoderServices) { + var query = viewModel._searchText; + + if (hasOnlyWhitespace(query)) { + viewModel.showSuggestions(); return; } - // If the user entered (longitude, latitude, [height]) in degrees/meters, - // fly without calling the geocoder. - var splitQuery = query.match(/[^\s,\n]+/g); - if ((splitQuery.length === 2) || (splitQuery.length === 3)) { - var longitude = +splitQuery[0]; - var latitude = +splitQuery[1]; - var height = (splitQuery.length === 3) ? +splitQuery[2] : 300.0; - - if (!isNaN(longitude) && !isNaN(latitude) && !isNaN(height)) { - updateCamera(viewModel, Cartesian3.fromDegrees(longitude, latitude, height)); - return; - } - } viewModel._isSearchInProgress = true; - var promise = RequestScheduler.request(viewModel._url + 'REST/v1/Locations', loadJsonp, { - parameters : { - query : query, - key : viewModel._key + var promise = when.resolve(); + for (var i = 0; i < geocoderServices.length; i++) { + promise = chainPromise(promise, geocoderServices[i], query); + } - }, - callbackParameterName : 'jsonp' - }); + viewModel._geocodePromise = promise; + promise + .then(function (result) { + if (promise.cancel) { + return; + } + viewModel._isSearchInProgress = false; - var geocodeInProgress = viewModel._geocodeInProgress = when(promise, function(result) { - if (geocodeInProgress.cancel) { - return; - } - viewModel._isSearchInProgress = false; + var geocoderResults = result.value; + if (result.state === 'fulfilled' && defined(geocoderResults) && geocoderResults.length > 0) { + viewModel._searchText = geocoderResults[0].displayName; + updateCamera(viewModel, geocoderResults[0].destination); + return; + } + viewModel._searchText = query + ' (not found)'; + }); + } - if (result.resourceSets.length === 0) { - viewModel.searchText = viewModel._searchText + ' (not found)'; - return; - } + function adjustSuggestionsScroll(viewModel, focusedItemIndex) { + var container = getElement(viewModel._viewContainer); + var searchResults = container.getElementsByClassName('search-results')[0]; + var listItems = container.getElementsByTagName('li'); + var element = listItems[focusedItemIndex]; - var resourceSet = result.resourceSets[0]; - if (resourceSet.resources.length === 0) { - viewModel.searchText = viewModel._searchText + ' (not found)'; - return; - } + if (focusedItemIndex === 0) { + searchResults.scrollTop = 0; + return; + } - var resource = resourceSet.resources[0]; + var offsetTop = element.offsetTop; + if (offsetTop + element.clientHeight > searchResults.clientHeight) { + searchResults.scrollTop = offsetTop + element.clientHeight; + } else if (offsetTop < searchResults.scrollTop) { + searchResults.scrollTop = offsetTop; + } + } - viewModel._searchText = resource.name; - var bbox = resource.bbox; - var south = bbox[0]; - var west = bbox[1]; - var north = bbox[2]; - var east = bbox[3]; + function cancelGeocode(viewModel) { + viewModel._isSearchInProgress = false; + if (defined(viewModel._geocodePromise)) { + viewModel._geocodePromise.cancel = true; + viewModel._geocodePromise = undefined; + } + } - updateCamera(viewModel, Rectangle.fromDegrees(west, south, east, north)); - }, function() { - if (geocodeInProgress.cancel) { - return; - } + function hasOnlyWhitespace(string) { + return /^\s*$/.test(string); + } - viewModel._isSearchInProgress = false; - viewModel.searchText = viewModel._searchText + ' (error)'; - }); + function clearSuggestions(viewModel) { + knockout.getObservable(viewModel, '_suggestions').removeAll(); } - function cancelGeocode(viewModel) { - viewModel._isSearchInProgress = false; - if (defined(viewModel._geocodeInProgress)) { - viewModel._geocodeInProgress.cancel = true; - viewModel._geocodeInProgress = undefined; + function updateSearchSuggestions(viewModel) { + if (!viewModel.autoComplete) { + return; + } + + var query = viewModel._searchText; + + clearSuggestions(viewModel); + if (hasOnlyWhitespace(query)) { + return; } + + var promise = when.resolve([]); + viewModel._geocoderServices.forEach(function (service) { + promise = promise.then(function(results) { + if (results.length >= 5) { + return results; + } + return service.geocode(query) + .then(function(newResults) { + results = results.concat(newResults); + return results; + }); + }); + }); + promise + .then(function (results) { + var suggestions = viewModel._suggestions; + for (var i = 0; i < results.length; i++) { + suggestions.push(results[i]); + } + }); } return GeocoderViewModel; diff --git a/Source/Widgets/HomeButton/HomeButtonViewModel.js b/Source/Widgets/HomeButton/HomeButtonViewModel.js index 46c569ed5bbe..1c869d24bcb9 100644 --- a/Source/Widgets/HomeButton/HomeButtonViewModel.js +++ b/Source/Widgets/HomeButton/HomeButtonViewModel.js @@ -1,26 +1,14 @@ /*global define*/ define([ - '../../Core/Cartesian3', - '../../Core/defaultValue', '../../Core/defined', '../../Core/defineProperties', '../../Core/DeveloperError', - '../../Core/Matrix4', - '../../Core/Rectangle', - '../../Scene/Camera', - '../../Scene/SceneMode', '../../ThirdParty/knockout', '../createCommand' ], function( - Cartesian3, - defaultValue, defined, defineProperties, DeveloperError, - Matrix4, - Rectangle, - Camera, - SceneMode, knockout, createCommand) { 'use strict'; diff --git a/Source/Widgets/Viewer/Viewer.js b/Source/Widgets/Viewer/Viewer.js index aa067441d541..63a858b38c9b 100644 --- a/Source/Widgets/Viewer/Viewer.js +++ b/Source/Widgets/Viewer/Viewer.js @@ -8,7 +8,6 @@ define([ '../../Core/destroyObject', '../../Core/DeveloperError', '../../Core/EventHelper', - '../../Core/Fullscreen', '../../Core/isArray', '../../Core/Matrix4', '../../Core/Rectangle', @@ -22,7 +21,6 @@ define([ '../../DataSources/Property', '../../Scene/ImageryLayer', '../../Scene/SceneMode', - '../../Scene/ShadowMode', '../../ThirdParty/knockout', '../../ThirdParty/when', '../Animation/Animation', @@ -52,7 +50,6 @@ define([ destroyObject, DeveloperError, EventHelper, - Fullscreen, isArray, Matrix4, Rectangle, @@ -66,7 +63,6 @@ define([ Property, ImageryLayer, SceneMode, - ShadowMode, knockout, when, Animation, @@ -473,6 +469,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to toolbar.appendChild(geocoderContainer); geocoder = new Geocoder({ container : geocoderContainer, + geocoderServices: defined(options.geocoder) ? (isArray(options.geocoder) ? options.geocoder : [options.geocoder]) : undefined, scene : cesiumWidget.scene }); // Subscribe to search so that we can clear the trackedEntity when it is clicked. @@ -1208,6 +1205,7 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to }, /** * Gets or sets the data source to track with the viewer's clock. + * @memberof Viewer.prototype * @type {DataSource} */ clockTrackedDataSource : { @@ -1269,6 +1267,11 @@ Either specify options.terrainProvider instead or set options.baseLayerPicker to baseLayerPickerDropDown.style.maxHeight = panelMaxHeight + 'px'; } + if (defined(this._geocoder)) { + var geocoderSuggestions = this._geocoder.searchSuggestionsContainer; + geocoderSuggestions.style.maxHeight = panelMaxHeight + 'px'; + } + if (defined(this._infoBox)) { this._infoBox.viewModel.maxHeight = panelMaxHeight; } diff --git a/Source/Widgets/Viewer/viewerDragDropMixin.js b/Source/Widgets/Viewer/viewerDragDropMixin.js index bfb21466cda1..183424f9fe21 100644 --- a/Source/Widgets/Viewer/viewerDragDropMixin.js +++ b/Source/Widgets/Viewer/viewerDragDropMixin.js @@ -9,7 +9,6 @@ define([ '../../DataSources/CzmlDataSource', '../../DataSources/GeoJsonDataSource', '../../DataSources/KmlDataSource', - '../../Scene/GroundPrimitive', '../getElement' ], function( defaultValue, @@ -21,7 +20,6 @@ define([ CzmlDataSource, GeoJsonDataSource, KmlDataSource, - GroundPrimitive, getElement) { 'use strict'; diff --git a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js index 9b6f57bd98c5..e92ec1e76385 100644 --- a/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js +++ b/Source/Widgets/Viewer/viewerPerformanceWatchdogMixin.js @@ -20,6 +20,7 @@ define([ * @exports viewerPerformanceWatchdogMixin * * @param {Viewer} viewer The viewer instance. + * @param {Object} [options] An object with properties. * @param {String} [options.lowFrameRateMessage='This application appears to be performing poorly on your system. Please try using a different web browser or updating your video drivers.'] The * message to display when a low frame rate is detected. The message is interpeted as HTML, so make sure * it comes from a trusted source so that your application is not vulnerable to cross-site scripting attacks. diff --git a/Source/Workers/cesiumWorkerBootstrapper.js b/Source/Workers/cesiumWorkerBootstrapper.js index 955e265dfa96..d955005d42bf 100644 --- a/Source/Workers/cesiumWorkerBootstrapper.js +++ b/Source/Workers/cesiumWorkerBootstrapper.js @@ -178,8 +178,9 @@ var requirejs, require, define; /** * Constructs an error with a pointer to an URL with more information. * @param {String} id the error ID that maps to an ID on a web page. - * @param {String} message human readable error. + * @param {String} msg human readable error. * @param {Error} [err] the original error, if there is one. + * @param {RequireModules} requireModules The modules required but not found. * * @returns {Error} */ diff --git a/Source/Workers/createGeometry.js b/Source/Workers/createGeometry.js index 1b0871fcfcec..7afe0f2c4f1b 100644 --- a/Source/Workers/createGeometry.js +++ b/Source/Workers/createGeometry.js @@ -2,13 +2,11 @@ define([ '../Core/defined', '../Scene/PrimitivePipeline', - '../ThirdParty/when', './createTaskProcessorWorker', 'require' ], function( defined, PrimitivePipeline, - when, createTaskProcessorWorker, require) { 'use strict'; diff --git a/Source/Workers/createVerticesFromQuantizedTerrainMesh.js b/Source/Workers/createVerticesFromQuantizedTerrainMesh.js index 2dcd5d9d5cb5..3a9d5118dad0 100644 --- a/Source/Workers/createVerticesFromQuantizedTerrainMesh.js +++ b/Source/Workers/createVerticesFromQuantizedTerrainMesh.js @@ -10,7 +10,6 @@ define([ '../Core/Ellipsoid', '../Core/IndexDatatype', '../Core/Math', - '../Core/Matrix3', '../Core/Matrix4', '../Core/OrientedBoundingBox', '../Core/TerrainEncoding', @@ -28,7 +27,6 @@ define([ Ellipsoid, IndexDatatype, CesiumMath, - Matrix3, Matrix4, OrientedBoundingBox, TerrainEncoding, diff --git a/Source/Workers/transcodeCRNToDXT.js b/Source/Workers/transcodeCRNToDXT.js new file mode 100644 index 000000000000..c1f57876e457 --- /dev/null +++ b/Source/Workers/transcodeCRNToDXT.js @@ -0,0 +1,142 @@ +/*global define*/ +define([ + '../Core/CompressedTextureBuffer', + '../Core/defined', + '../Core/PixelFormat', + '../Core/RuntimeError', + '../ThirdParty/crunch', + './createTaskProcessorWorker' +], function( + CompressedTextureBuffer, + defined, + PixelFormat, + RuntimeError, + crunch, + createTaskProcessorWorker +) { + 'use strict'; + + // Modified from texture-tester + // See: + // https://github.com/toji/texture-tester/blob/master/js/webgl-texture-util.js + // http://toji.github.io/texture-tester/ + + /** + * @license + * + * Copyright (c) 2014, Brandon Jones. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * + * * Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + + // Taken from crnlib.h + var CRN_FORMAT = { + cCRNFmtInvalid: -1, + + cCRNFmtDXT1: 0, + // cCRNFmtDXT3 is not currently supported when writing to CRN - only DDS. + cCRNFmtDXT3: 1, + cCRNFmtDXT5: 2 + + // Crunch supports more formats than this, but we can't use them here. + }; + + // Mapping of Crunch formats to DXT formats. + var DXT_FORMAT_MAP = {}; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT1] = PixelFormat.RGB_DXT1; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT3] = PixelFormat.RGBA_DXT3; + DXT_FORMAT_MAP[CRN_FORMAT.cCRNFmtDXT5] = PixelFormat.RGBA_DXT5; + + var dst; + var dxtData; + var cachedDstSize = 0; + + // Copy an array of bytes into or out of the emscripten heap. + function arrayBufferCopy(src, dst, dstByteOffset, numBytes) { + var i; + var dst32Offset = dstByteOffset / 4; + var tail = (numBytes % 4); + var src32 = new Uint32Array(src.buffer, 0, (numBytes - tail) / 4); + var dst32 = new Uint32Array(dst.buffer); + for (i = 0; i < src32.length; i++) { + dst32[dst32Offset + i] = src32[i]; + } + for (i = numBytes - tail; i < numBytes; i++) { + dst[dstByteOffset + i] = src[i]; + } + } + + /** + * @private + */ + function transcodeCRNToDXT(arrayBuffer, transferableObjects) { + // Copy the contents of the arrayBuffer into emscriptens heap. + var srcSize = arrayBuffer.byteLength; + var bytes = new Uint8Array(arrayBuffer); + var src = crunch._malloc(srcSize); + arrayBufferCopy(bytes, crunch.HEAPU8, src, srcSize); + + // Determine what type of compressed data the file contains. + var crnFormat = crunch._crn_get_dxt_format(src, srcSize); + var format = DXT_FORMAT_MAP[crnFormat]; + if (!defined(format)) { + throw new RuntimeError('Unsupported compressed format.'); + } + + // Gather basic metrics about the DXT data. + var levels = crunch._crn_get_levels(src, srcSize); + var width = crunch._crn_get_width(src, srcSize); + var height = crunch._crn_get_height(src, srcSize); + + // Determine the size of the decoded DXT data. + var dstSize = 0; + var i; + for (i = 0; i < levels; ++i) { + dstSize += PixelFormat.compressedTextureSize(format, width >> i, height >> i); + } + + // Allocate enough space on the emscripten heap to hold the decoded DXT data + // or reuse the existing allocation if a previous call to this function has + // already acquired a large enough buffer. + if(cachedDstSize < dstSize) { + if(defined(dst)) { + crunch._free(dst); + } + dst = crunch._malloc(dstSize); + dxtData = new Uint8Array(crunch.HEAPU8.buffer, dst, dstSize); + cachedDstSize = dstSize; + } + + // Decompress the DXT data from the Crunch file into the allocated space. + crunch._crn_decompress(src, srcSize, dst, dstSize, 0, levels); + + // Release the crunch file data from the emscripten heap. + crunch._free(src); + + // Mipmaps are unsupported, so copy the level 0 texture + // When mipmaps are supported, a copy will still be necessary as dxtData is a view on the heap. + var level0DXTData = dxtData.slice(0, PixelFormat.compressedTextureSize(format, width, height)); + transferableObjects.push(level0DXTData.buffer); + return new CompressedTextureBuffer(format, width, height, level0DXTData); + } + + return createTaskProcessorWorker(transcodeCRNToDXT); +}); diff --git a/Specs/Cesium3DTilesTester.js b/Specs/Cesium3DTilesTester.js index dd0701710532..1e1d3cb5a24d 100644 --- a/Specs/Cesium3DTilesTester.js +++ b/Specs/Cesium3DTilesTester.js @@ -83,11 +83,21 @@ define([ expectRender(scene, tileset); }; - Cesium3DTilesTester.waitForPendingRequests = function(scene, tileset) { + Cesium3DTilesTester.waitForTilesLoaded = function(scene, tileset) { return pollToPromise(function() { scene.renderForSpecs(); - var stats = tileset._statistics; - return ((stats.numberOfPendingRequests === 0) && (stats.numberProcessing === 0)); + return tileset.tilesLoaded; + }).then(function() { + return tileset; + }); + }; + + Cesium3DTilesTester.waitForReady = function(scene, tileset) { + return pollToPromise(function() { + scene.renderForSpecs(); + return tileset.ready; + }).then(function() { + return tileset; }); }; @@ -97,11 +107,7 @@ define([ url : url })); - return tileset.readyPromise.then(function() { - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { - return tileset; - }); - }); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset); }; Cesium3DTilesTester.loadTileExpectError = function(scene, arrayBuffer, type) { diff --git a/Specs/Core/AxisAlignedBoundingBoxSpec.js b/Specs/Core/AxisAlignedBoundingBoxSpec.js index 25662097d1e6..07ea32ac8b1a 100644 --- a/Specs/Core/AxisAlignedBoundingBoxSpec.js +++ b/Specs/Core/AxisAlignedBoundingBoxSpec.js @@ -2,13 +2,11 @@ defineSuite([ 'Core/AxisAlignedBoundingBox', 'Core/Cartesian3', - 'Core/Cartesian4', 'Core/Intersect', 'Core/Plane' ], function( AxisAlignedBoundingBox, Cartesian3, - Cartesian4, Intersect, Plane) { 'use strict'; diff --git a/Specs/Core/BingMapsGeocoderServiceSpec.js b/Specs/Core/BingMapsGeocoderServiceSpec.js new file mode 100644 index 000000000000..5c68a7804d1c --- /dev/null +++ b/Specs/Core/BingMapsGeocoderServiceSpec.js @@ -0,0 +1,57 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/BingMapsGeocoderService', + 'Core/Cartesian3', + 'Core/loadJsonp', + 'Core/Rectangle' +], function( + BingMapsGeocoderService, + Cartesian3, + loadJsonp, + Rectangle) { + 'use strict'; + + var service = new BingMapsGeocoderService(); + + it('returns geocoder results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [{ + resources : [{ + name : 'a', + bbox : [32.0, 3.0, 3.0, 4.0] + }] + }] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0].displayName).toEqual('a'); + expect(results[0].destination).toBeInstanceOf(Rectangle); + done(); + }); + }); + + it('returns no geocoder results if Bing has no results', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + + it('returns no geocoder results if Bing has results but no resources', function (done) { + var query = 'some query'; + jasmine.createSpy('testSpy', loadJsonp).and.returnValue({ + resourceSets: [{ + resources: [] + }] + }); + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); +}); diff --git a/Specs/Core/BoundingSphereSpec.js b/Specs/Core/BoundingSphereSpec.js index b5d0d9c0f891..849ba66278c7 100644 --- a/Specs/Core/BoundingSphereSpec.js +++ b/Specs/Core/BoundingSphereSpec.js @@ -2,7 +2,6 @@ defineSuite([ 'Core/BoundingSphere', 'Core/Cartesian3', - 'Core/Cartesian4', 'Core/Cartographic', 'Core/Ellipsoid', 'Core/EncodedCartesian3', @@ -18,7 +17,6 @@ defineSuite([ ], function( BoundingSphere, Cartesian3, - Cartesian4, Cartographic, Ellipsoid, EncodedCartesian3, diff --git a/Specs/Core/Cartesian2Spec.js b/Specs/Core/Cartesian2Spec.js index 4087a64e6959..a2af6188b0e1 100644 --- a/Specs/Core/Cartesian2Spec.js +++ b/Specs/Core/Cartesian2Spec.js @@ -328,6 +328,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian2(2.0, 3.0); + var right = new Cartesian2(4.0, 5.0); + var result = new Cartesian2(); + var expectedResult = new Cartesian2(0.5, 0.6); + var returnedResult = Cartesian2.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian2(2.0, 3.0); + var right = new Cartesian2(4.0, 5.0); + var expectedResult = new Cartesian2(0.5, 0.6); + var returnedResult = Cartesian2.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian2(2.0, 3.0); var right = new Cartesian2(4.0, 5.0); @@ -614,6 +633,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian2(4.0, 5.0); + expect(function() { + Cartesian2.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian2(4.0, 5.0); + expect(function() { + Cartesian2.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('add throws with no left parameter', function() { expect(function() { Cartesian2.add(undefined, new Cartesian2()); @@ -761,6 +794,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian2.divideComponents(new Cartesian2(), new Cartesian2()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian2.add(new Cartesian2(), new Cartesian2()); diff --git a/Specs/Core/Cartesian3Spec.js b/Specs/Core/Cartesian3Spec.js index 188e6ee724a2..854b0e62a1b7 100644 --- a/Specs/Core/Cartesian3Spec.js +++ b/Specs/Core/Cartesian3Spec.js @@ -400,6 +400,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian3(2.0, 3.0, 6.0); + var right = new Cartesian3(4.0, 5.0, 8.0); + var result = new Cartesian3(); + var expectedResult = new Cartesian3(0.5, 0.6, 0.75); + var returnedResult = Cartesian3.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian3(2.0, 3.0, 6.0); + var right = new Cartesian3(4.0, 5.0, 8.0); + var expectedResult = new Cartesian3(0.5, 0.6, 0.75); + var returnedResult = Cartesian3.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian3(2.0, 3.0, 6.0); var right = new Cartesian3(4.0, 5.0, 7.0); @@ -742,6 +761,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian3(4.0, 5.0, 6.0); + expect(function() { + Cartesian3.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian3(4.0, 5.0, 6.0); + expect(function() { + Cartesian3.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('dot throws with no right parameter', function() { expect(function() { Cartesian3.dot(new Cartesian3(), undefined); @@ -1149,6 +1182,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian3.divideComponents(new Cartesian3(), new Cartesian3()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian3.add(new Cartesian3(), new Cartesian3()); diff --git a/Specs/Core/Cartesian4Spec.js b/Specs/Core/Cartesian4Spec.js index 4e9cbb91737b..a2e877a6aef7 100644 --- a/Specs/Core/Cartesian4Spec.js +++ b/Specs/Core/Cartesian4Spec.js @@ -464,6 +464,25 @@ defineSuite([ expect(left).toEqual(expectedResult); }); + it('divideComponents works with a result parameter', function() { + var left = new Cartesian4(2.0, 3.0, 6.0, 15.0); + var right = new Cartesian4(4.0, 5.0, 8.0, 2.0); + var result = new Cartesian4(); + var expectedResult = new Cartesian4(0.5, 0.6, 0.75, 7.5); + var returnedResult = Cartesian4.divideComponents(left, right, result); + expect(result).toBe(returnedResult); + expect(result).toEqual(expectedResult); + }); + + it('divideComponents works with a result parameter that is an input parameter', function() { + var left = new Cartesian4(2.0, 3.0, 6.0, 15.0); + var right = new Cartesian4(4.0, 5.0, 8.0, 2.0); + var expectedResult = new Cartesian4(0.5, 0.6, 0.75, 7.5); + var returnedResult = Cartesian4.divideComponents(left, right, left); + expect(left).toBe(returnedResult); + expect(left).toEqual(expectedResult); + }); + it('dot', function() { var left = new Cartesian4(2.0, 3.0, 6.0, 8.0); var right = new Cartesian4(4.0, 5.0, 7.0, 9.0); @@ -740,6 +759,20 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throw with no left parameter', function() { + var right = new Cartesian4(4.0, 5.0, 6.0, 7.0); + expect(function() { + Cartesian4.divideComponents(undefined, right); + }).toThrowDeveloperError(); + }); + + it('divideComponents throw with no right parameter', function() { + var left = new Cartesian4(4.0, 5.0, 6.0, 7.0); + expect(function() { + Cartesian4.divideComponents(left, undefined); + }).toThrowDeveloperError(); + }); + it('dot throws with no right parameter', function() { expect(function() { Cartesian4.dot(new Cartesian4(), undefined); @@ -866,6 +899,12 @@ defineSuite([ }).toThrowDeveloperError(); }); + it('divideComponents throws with no result', function() { + expect(function() { + Cartesian4.divideComponents(new Cartesian4(), new Cartesian4()); + }).toThrowDeveloperError(); + }); + it('add throws with no result', function() { expect(function() { Cartesian4.add(new Cartesian4(), new Cartesian4()); diff --git a/Specs/Core/CartographicGeocoderServiceSpec.js b/Specs/Core/CartographicGeocoderServiceSpec.js new file mode 100644 index 000000000000..5ecf68dbca37 --- /dev/null +++ b/Specs/Core/CartographicGeocoderServiceSpec.js @@ -0,0 +1,47 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/CartographicGeocoderService', + 'Core/Cartesian3' +], function( + CartographicGeocoderService, + Cartesian3) { + 'use strict'; + + var service = new CartographicGeocoderService(); + + it('returns cartesian with matching coordinates for long/lat/height input', function (done) { + var query = ' 1.0, 2.0, 3.0 '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0]).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); + done(); + }); + }); + + it('returns cartesian with matching coordinates for long/lat input', function (done) { + var query = ' 1.0, 2.0 '; + var defaultHeight = 300.0; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(1); + expect(results[0]).toEqual(Cartesian3.fromDegrees(1.0, 2.0, defaultHeight)); + done(); + }); + }); + + it('returns empty array for input with only one number', function (done) { + var query = ' 2.0 '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + + it('returns empty array for with string', function (done) { + var query = ' aoeu '; + service.geocode(query, function(err, results) { + expect(results.length).toEqual(0); + done(); + }); + }); + +}); diff --git a/Specs/Core/CesiumTerrainProviderSpec.js b/Specs/Core/CesiumTerrainProviderSpec.js index c12508912b59..d8c0ab71d083 100644 --- a/Specs/Core/CesiumTerrainProviderSpec.js +++ b/Specs/Core/CesiumTerrainProviderSpec.js @@ -2,7 +2,6 @@ defineSuite([ 'Core/CesiumTerrainProvider', 'Core/DefaultProxy', - 'Core/defined', 'Core/Ellipsoid', 'Core/GeographicTilingScheme', 'Core/getAbsoluteUri', @@ -14,12 +13,10 @@ defineSuite([ 'Core/RequestScheduler', 'Core/TerrainProvider', 'Specs/pollToPromise', - 'ThirdParty/Uri', 'ThirdParty/when' ], function( CesiumTerrainProvider, DefaultProxy, - defined, Ellipsoid, GeographicTilingScheme, getAbsoluteUri, @@ -31,7 +28,6 @@ defineSuite([ RequestScheduler, TerrainProvider, pollToPromise, - Uri, when) { 'use strict'; diff --git a/Specs/Core/CheckSpec.js b/Specs/Core/CheckSpec.js new file mode 100644 index 000000000000..36c06c062063 --- /dev/null +++ b/Specs/Core/CheckSpec.js @@ -0,0 +1,177 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/Check' + ], function( + Check) { + 'use strict'; + + describe('type checks', function () { + it('Check.typeOf.bool does not throw when passed a boolean', function () { + expect(function () { + Check.typeOf.bool(true); + }).not.toThrowDeveloperError(); + }); + + it('Check.typeOf.boolean throws when passed a non-boolean', function () { + expect(function () { + Check.typeOf.bool({}, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.bool([], 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.bool(1, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.bool('snth', 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.bool(function () {return true;}, 'mockName'); + }).toThrowDeveloperError(); + }); + + it('Check.typeOf.func does not throw when passed a function', function () { + expect(function () { + Check.typeOf.func(function () {return true;}, 'mockName'); + }).not.toThrowDeveloperError(); + }); + + it('Check.typeOf.func throws when passed a non-function', function () { + expect(function () { + Check.typeOf.func({}, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.func([], 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.func(1, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.func('snth', 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.func(true, 'mockName'); + }).toThrowDeveloperError(); + }); + + it('Check.typeOf.object does not throw when passed object', function() { + expect(function () { + Check.typeOf.object({}, 'mockName'); + }).not.toThrowDeveloperError(); + }); + + it('Check.typeOf.object throws when passed non-object', function() { + expect(function () { + Check.typeOf.object('snth', 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.object(true, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.object(1, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.object(function () {return true;}, 'mockName'); + }).toThrowDeveloperError(); + }); + + it('Check.typeOf.number does not throw when passed number', function() { + expect(function () { + Check.typeOf.number(2, 'mockName'); + }).not.toThrowDeveloperError(); + }); + + it('Check.typeOf.number throws when passed non-number', function() { + expect(function () { + Check.typeOf.number('snth', 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.number(true, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.number({}, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.number([2], 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.number(function () {return true;}, 'mockName'); + }).toThrowDeveloperError(); + }); + + it('Check.typeOf.string does not throw when passed a string', function () { + expect(function () { + Check.typeOf.string('s', 'mockName'); + }).not.toThrowDeveloperError(); + }); + + it('Check.typeOf.string throws on non-string', function () { + expect(function () { + Check.typeOf.string({}, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.string(true, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.string(1, 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.string([2], 'mockName'); + }).toThrowDeveloperError(); + expect(function () { + Check.typeOf.string(function () {return true;}, 'mockName'); + }).toThrowDeveloperError(); + }); + }); + + describe('Check.numeric', function () { + it('minimum throws on value less than minimum', function () { + expect(function () { + Check.numeric.minimum(4, 5); + }).toThrowDeveloperError(); + }); + it('minimum does not throw on value at least as big as minimum', function () { + expect(function () { + Check.numeric.minimum(4, 4); + Check.numeric.minimum(4, 3); + }).not.toThrowDeveloperError(); + }); + + it('maximum throws on value greater than maximum', function () { + expect(function () { + Check.numeric.maximum(6, 5); + }).toThrowDeveloperError(); + }); + it('maximum does not throw on value at most as big as maximum', function () { + expect(function () { + Check.numeric.maximum(5, 5); + Check.numeric.maximum(4, 5); + }).not.toThrowDeveloperError(); + }); + }); + + it('Check.defined does not throw unless passed value that is undefined or null', function () { + expect(function () { + Check.defined({}, 'mockName'); + }).not.toThrowDeveloperError(); + expect(function () { + Check.defined([], 'mockName'); + }).not.toThrowDeveloperError(); + expect(function () { + Check.defined(2, 'mockName'); + }).not.toThrowDeveloperError(); + expect(function () { + Check.defined(function() {return true;}, 'mockName'); + }).not.toThrowDeveloperError(); + expect(function () { + Check.defined('snt', 'mockName'); + }).not.toThrowDeveloperError(); + }); + + it('Check.defined throws when passed undefined', function () { + expect(function () { + Check.defined(undefined, 'mockName'); + }).toThrowDeveloperError(); + }); + +}); diff --git a/Specs/Core/CircleGeometrySpec.js b/Specs/Core/CircleGeometrySpec.js index d41fc2a3c42a..ec7fdac5fb63 100644 --- a/Specs/Core/CircleGeometrySpec.js +++ b/Specs/Core/CircleGeometrySpec.js @@ -178,6 +178,6 @@ defineSuite([ radius : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(CircleGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/ClockSpec.js b/Specs/Core/ClockSpec.js index b7ba51e50e97..5bc6e164a8f2 100644 --- a/Specs/Core/ClockSpec.js +++ b/Specs/Core/ClockSpec.js @@ -4,15 +4,13 @@ defineSuite([ 'Core/ClockRange', 'Core/ClockStep', 'Core/defined', - 'Core/JulianDate', - 'Specs/pollToPromise' + 'Core/JulianDate' ], function( Clock, ClockRange, ClockStep, defined, - JulianDate, - pollToPromise) { + JulianDate) { 'use strict'; it('sets default parameters when constructed', function() { diff --git a/Specs/Core/CorridorGeometrySpec.js b/Specs/Core/CorridorGeometrySpec.js index 1862108eabbc..4bac8615e1ba 100644 --- a/Specs/Core/CorridorGeometrySpec.js +++ b/Specs/Core/CorridorGeometrySpec.js @@ -291,6 +291,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1); + packedInstance.push(30000.0, 0.0, 0.0, 2.0, 0.1, 0.0); createPackableSpecs(CorridorGeometry, corridor, packedInstance); }); diff --git a/Specs/Core/DistanceDisplayConditionSpec.js b/Specs/Core/DistanceDisplayConditionSpec.js index 0a0b3fc5c44c..22b35a8ae8d2 100644 --- a/Specs/Core/DistanceDisplayConditionSpec.js +++ b/Specs/Core/DistanceDisplayConditionSpec.js @@ -1,12 +1,8 @@ /*global defineSuite*/ defineSuite([ - 'Core/DistanceDisplayCondition', - 'Core/Cartesian3', - 'Core/Matrix4' + 'Core/DistanceDisplayCondition' ], function( - DistanceDisplayCondition, - Cartesian3, - Matrix4) { + DistanceDisplayCondition) { 'use strict'; it('default constructs', function() { diff --git a/Specs/Core/EllipseGeometrySpec.js b/Specs/Core/EllipseGeometrySpec.js index df9f86701a16..0af786c8bf03 100644 --- a/Specs/Core/EllipseGeometrySpec.js +++ b/Specs/Core/EllipseGeometrySpec.js @@ -265,7 +265,7 @@ defineSuite([ semiMinorAxis : 1.0, stRotation : CesiumMath.PI_OVER_TWO }); - var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0]; + var packedInstance = [center.x, center.y, center.z, ellipsoid.radii.x, ellipsoid.radii.y, ellipsoid.radii.z, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, rectangle.west, rectangle.south, rectangle.east, rectangle.north, 1.0, 1.0, 0.0, CesiumMath.PI_OVER_TWO, 0.0, 0.1, 0.0, 0.0, 0.0]; createPackableSpecs(EllipseGeometry, packableInstance, packedInstance); }); diff --git a/Specs/Core/EllipsoidSpec.js b/Specs/Core/EllipsoidSpec.js index d4dfa16d1092..944c388ebb21 100644 --- a/Specs/Core/EllipsoidSpec.js +++ b/Specs/Core/EllipsoidSpec.js @@ -434,5 +434,114 @@ defineSuite([ expect(cloned).toEqual(myEllipsoid); }); + it('getSurfaceNormalIntersectionWithZAxis throws with no position', function() { + expect(function() { + Ellipsoid.WGS84.getSurfaceNormalIntersectionWithZAxis(undefined); + }).toThrowDeveloperError(); + }); + + it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid is not an ellipsoid of revolution', function() { + expect(function() { + var ellipsoid = new Ellipsoid(1,2,3); + var cartesian = new Cartesian3(); + ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian); + }).toThrowDeveloperError(); + }); + + it('getSurfaceNormalIntersectionWithZAxis throws if the ellipsoid has radii.z === 0', function() { + expect(function() { + var ellipsoid = new Ellipsoid(1,2,0); + var cartesian = new Cartesian3(); + ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesian); + }).toThrowDeveloperError(); + }); + + it('getSurfaceNormalIntersectionWithZAxis works without a result parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface); + expect(returnedResult instanceof Cartesian3).toBe(true); + }); + + it('getSurfaceNormalIntersectionWithZAxis works with a result parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined , cartesianOnTheSurface); + expect(returnedResult).toBe(cartesianOnTheSurface); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns undefined if the result is outside the ellipsoid with buffer parameter', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, ellipsoid.radii.z); + expect(returnedResult).toBe(undefined); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns undefined if the result is outside the ellipsoid without buffer parameter', function() { + var majorAxis = 10; + var minorAxis = 1; + var ellipsoid = new Ellipsoid(majorAxis,majorAxis,minorAxis); + var cartographic = Cartographic.fromDegrees(45.0,90.0); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var returnedResult = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(returnedResult).toBe(undefined); + }); + + it('getSurfaceNormalIntersectionWithZAxis returns a result that is equal to a value that computed in a different way', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + var magnitude = cartesianOnTheSurface.x / surfaceNormal.x; + + var expected = new Cartesian3(); + expected.z = cartesianOnTheSurface.z - surfaceNormal.z * magnitude; + var result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(result).toEqualEpsilon(expected, CesiumMath.EPSILON8); + + // at the equator + cartesianOnTheSurface = new Cartesian3(ellipsoid.radii.x, 0 , 0); + result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + expect(result).toEqualEpsilon(Cartesian3.ZERO, CesiumMath.EPSILON8); + + }); + + it('getSurfaceNormalIntersectionWithZAxis returns a result that when it\'s used as an origin for a vector with the surface normal direction it produces an accurate cartographic', function() { + var ellipsoid = Ellipsoid.WGS84; + var cartographic = Cartographic.fromDegrees(35.23,33.23); + var cartesianOnTheSurface = ellipsoid.cartographicToCartesian(cartographic); + var surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + + var result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + + var surfaceNormalWithLength = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.maximumRadius, new Cartesian3()); + var position = Cartesian3.add(result,surfaceNormalWithLength,new Cartesian3()); + var resultCartographic = ellipsoid.cartesianToCartographic(position); + resultCartographic.height = 0.0; + expect(resultCartographic).toEqualEpsilon(cartographic, CesiumMath.EPSILON8); + + // at the north pole + cartographic = Cartographic.fromDegrees(0,90); + cartesianOnTheSurface = new Cartesian3(0, 0 ,ellipsoid.radii.z); + surfaceNormal = ellipsoid.geodeticSurfaceNormal(cartesianOnTheSurface); + surfaceNormalWithLength = Cartesian3.multiplyByScalar(surfaceNormal, ellipsoid.maximumRadius, new Cartesian3()); + result = ellipsoid.getSurfaceNormalIntersectionWithZAxis(cartesianOnTheSurface, undefined); + position = Cartesian3.add(result,surfaceNormalWithLength,new Cartesian3()); + resultCartographic = ellipsoid.cartesianToCartographic(position); + resultCartographic.height = 0.0; + expect(resultCartographic).toEqualEpsilon(cartographic, CesiumMath.EPSILON8); + + }); + + it('ellipsoid is initialized with _sqauredXOverSquaredZ property', function() { + var ellipsoid = new Ellipsoid(4 , 4 , 3); + + var sqauredXOverSquaredZ = ellipsoid.radiiSquared.x / ellipsoid.radiiSquared.z; + expect(ellipsoid._sqauredXOverSquaredZ).toEqual(sqauredXOverSquaredZ); + }); + createPackableSpecs(Ellipsoid, Ellipsoid.WGS84, [Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z]); }); diff --git a/Specs/Core/EllipsoidTangentPlaneSpec.js b/Specs/Core/EllipsoidTangentPlaneSpec.js index 1768014b2f6d..54e34c0e8641 100644 --- a/Specs/Core/EllipsoidTangentPlaneSpec.js +++ b/Specs/Core/EllipsoidTangentPlaneSpec.js @@ -3,18 +3,12 @@ defineSuite([ 'Core/EllipsoidTangentPlane', 'Core/Cartesian2', 'Core/Cartesian3', - 'Core/Ellipsoid', - 'Core/Math', - 'Core/Matrix3', - 'Core/OrientedBoundingBox' + 'Core/Ellipsoid' ], function( EllipsoidTangentPlane, Cartesian2, Cartesian3, - Ellipsoid, - CesiumMath, - Matrix3, - OrientedBoundingBox) { + Ellipsoid) { 'use strict'; it('constructor defaults to WGS84', function() { diff --git a/Specs/Core/HeadingPitchRollSpec.js b/Specs/Core/HeadingPitchRollSpec.js index cb0212267adf..93c150ea666e 100644 --- a/Specs/Core/HeadingPitchRollSpec.js +++ b/Specs/Core/HeadingPitchRollSpec.js @@ -1,12 +1,12 @@ /*global defineSuite*/ defineSuite([ - 'Core/HeadingPitchRoll', - 'Core/Math', - 'Core/Quaternion' -], function( - HeadingPitchRoll, - CesiumMath, - Quaternion) { + 'Core/HeadingPitchRoll', + 'Core/Math', + 'Core/Quaternion' + ], function( + HeadingPitchRoll, + CesiumMath, + Quaternion) { "use strict"; /*global it,expect*/ diff --git a/Specs/Core/HeightmapTerrainDataSpec.js b/Specs/Core/HeightmapTerrainDataSpec.js index 809ba6b61585..d0c64e8053ca 100644 --- a/Specs/Core/HeightmapTerrainDataSpec.js +++ b/Specs/Core/HeightmapTerrainDataSpec.js @@ -1,16 +1,12 @@ /*global defineSuite*/ defineSuite([ 'Core/HeightmapTerrainData', - 'Core/defined', 'Core/GeographicTilingScheme', - 'Core/TerrainData', - 'ThirdParty/when' + 'Core/TerrainData' ], function( HeightmapTerrainData, - defined, GeographicTilingScheme, - TerrainData, - when) { + TerrainData) { 'use strict'; it('conforms to TerrainData interface', function() { diff --git a/Specs/Core/Matrix3Spec.js b/Specs/Core/Matrix3Spec.js index 213593f49e66..df3c4c009bc3 100644 --- a/Specs/Core/Matrix3Spec.js +++ b/Specs/Core/Matrix3Spec.js @@ -1,16 +1,16 @@ /*global defineSuite*/ defineSuite([ - 'Core/Matrix3', - 'Core/Cartesian3', - 'Core/Math', - 'Core/HeadingPitchRoll', - 'Core/Quaternion' -], function( - Matrix3, - Cartesian3, - CesiumMath, - HeadingPitchRoll, - Quaternion) { + 'Core/Matrix3', + 'Core/Cartesian3', + 'Core/HeadingPitchRoll', + 'Core/Math', + 'Core/Quaternion' + ], function( + Matrix3, + Cartesian3, + HeadingPitchRoll, + CesiumMath, + Quaternion) { 'use strict'; it('default constructor creates values array with all zeros.', function() { diff --git a/Specs/Core/OrientedBoundingBoxSpec.js b/Specs/Core/OrientedBoundingBoxSpec.js index 9845c0dc700e..38f1a6855cb5 100644 --- a/Specs/Core/OrientedBoundingBoxSpec.js +++ b/Specs/Core/OrientedBoundingBoxSpec.js @@ -1,12 +1,10 @@ /*global defineSuite*/ defineSuite([ 'Core/OrientedBoundingBox', - 'Core/BoundingRectangle', 'Core/BoundingSphere', 'Core/Cartesian3', 'Core/Cartesian4', 'Core/Ellipsoid', - 'Core/EllipsoidTangentPlane', 'Core/Intersect', 'Core/Math', 'Core/Matrix3', @@ -16,12 +14,10 @@ defineSuite([ 'Core/Rectangle' ], function( OrientedBoundingBox, - BoundingRectangle, BoundingSphere, Cartesian3, Cartesian4, Ellipsoid, - EllipsoidTangentPlane, Intersect, CesiumMath, Matrix3, diff --git a/Specs/Core/PinBuilderSpec.js b/Specs/Core/PinBuilderSpec.js index 2895c3d66100..33d6b8ba4f99 100644 --- a/Specs/Core/PinBuilderSpec.js +++ b/Specs/Core/PinBuilderSpec.js @@ -3,13 +3,11 @@ defineSuite([ 'Core/PinBuilder', 'Core/buildModuleUrl', 'Core/Color', - 'Core/defined', 'ThirdParty/when' ], function( PinBuilder, buildModuleUrl, Color, - defined, when) { 'use strict'; diff --git a/Specs/Core/PolygonGeometrySpec.js b/Specs/Core/PolygonGeometrySpec.js index 2d2aae6b3d41..d29fdb8bbc43 100644 --- a/Specs/Core/PolygonGeometrySpec.js +++ b/Specs/Core/PolygonGeometrySpec.js @@ -699,6 +699,6 @@ defineSuite([ packedInstance.push(Ellipsoid.WGS84.radii.x, Ellipsoid.WGS84.radii.y, Ellipsoid.WGS84.radii.z); packedInstance.push(1.0, 0.0, 0.0, 0.0, 0.0, 0.0); packedInstance.push(rectangle.west, rectangle.south, rectangle.east, rectangle.north); - packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 55); + packedInstance.push(0.0, 0.0, CesiumMath.PI_OVER_THREE, 0.0, 0.0, 1.0, 0, 1, 0, 56); createPackableSpecs(PolygonGeometry, polygon, packedInstance); }); diff --git a/Specs/Core/PolylineGeometrySpec.js b/Specs/Core/PolylineGeometrySpec.js index 1d02cc1284ec..4f7b6d3a27e8 100644 --- a/Specs/Core/PolylineGeometrySpec.js +++ b/Specs/Core/PolylineGeometrySpec.js @@ -4,7 +4,6 @@ defineSuite([ 'Core/Cartesian3', 'Core/Color', 'Core/Ellipsoid', - 'Core/Math', 'Core/VertexFormat', 'Specs/createPackableSpecs' ], function( @@ -12,7 +11,6 @@ defineSuite([ Cartesian3, Color, Ellipsoid, - CesiumMath, VertexFormat, createPackableSpecs) { 'use strict'; diff --git a/Specs/Core/QuantizedMeshTerrainDataSpec.js b/Specs/Core/QuantizedMeshTerrainDataSpec.js index b2981728f2fd..c66692cc7b95 100644 --- a/Specs/Core/QuantizedMeshTerrainDataSpec.js +++ b/Specs/Core/QuantizedMeshTerrainDataSpec.js @@ -3,7 +3,6 @@ defineSuite([ 'Core/QuantizedMeshTerrainData', 'Core/BoundingSphere', 'Core/Cartesian3', - 'Core/defined', 'Core/GeographicTilingScheme', 'Core/Math', 'Core/TerrainData', @@ -13,7 +12,6 @@ defineSuite([ QuantizedMeshTerrainData, BoundingSphere, Cartesian3, - defined, GeographicTilingScheme, CesiumMath, TerrainData, diff --git a/Specs/Core/RectangleGeometrySpec.js b/Specs/Core/RectangleGeometrySpec.js index 7ead596031a6..0e1e51f92d7e 100644 --- a/Specs/Core/RectangleGeometrySpec.js +++ b/Specs/Core/RectangleGeometrySpec.js @@ -145,6 +145,28 @@ defineSuite([ expect(st[length - 1]).toEqualEpsilon(0.0, CesiumMath.EPSILON14); }); + it('compute texture coordinate rotation with rectangle rotation', function() { + var rectangle = new Rectangle(-1, -1, 1, 1); + var angle = CesiumMath.toRadians(30); + var m = RectangleGeometry.createGeometry(new RectangleGeometry({ + vertexFormat : VertexFormat.POSITION_AND_ST, + rectangle : rectangle, + rotation: angle, + stRotation : angle, + granularity : 1.0 + })); + var st = m.attributes.st.values; + + expect(st[0]).toEqual(0.0); //top left corner + expect(st[1]).toEqual(1.0); + expect(st[4]).toEqual(1.0); //top right corner + expect(st[5]).toEqual(1.0); + expect(st[12]).toEqual(0.0); //bottom left corner + expect(st[13]).toEqual(0.0); + expect(st[16]).toEqual(1.0); //bottom right corner + expect(st[17]).toEqual(0.0); + }); + it('throws without rectangle', function() { expect(function() { return new RectangleGeometry({}); @@ -327,6 +349,6 @@ defineSuite([ granularity : 1.0, ellipsoid : Ellipsoid.UNIT_SPHERE }); - var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0]; + var packedInstance = [-2.0, -1.0, 0.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, -2.0, -1.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0]; createPackableSpecs(RectangleGeometry, rectangle, packedInstance); }); diff --git a/Specs/Core/RectangleSpec.js b/Specs/Core/RectangleSpec.js index 2caa2aba0944..b95c52202f1b 100644 --- a/Specs/Core/RectangleSpec.js +++ b/Specs/Core/RectangleSpec.js @@ -577,6 +577,30 @@ defineSuite([ expect(returnedResult).toEqual(expected); }); + it('union works with first rectangle crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, -0.5, 0.9); + var rectangle2 = new Rectangle(-0.85, 0.0, -0.4, 0.8); + var expected = new Rectangle(0.5, 0.0, -0.4, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + + it('union works with second rectangle crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, 0.75, 0.9); + var rectangle2 = new Rectangle(0.6, 0.0, -0.2, 0.8); + var expected = new Rectangle(0.5, 0.0, -0.2, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + + it('union works with both rectangles crossing the IDL', function() { + var rectangle1 = new Rectangle(0.5, 0.1, -0.4, 0.9); + var rectangle2 = new Rectangle(0.4, 0.0, -0.5, 0.8); + var expected = new Rectangle(0.4, 0.0, -0.4, 0.9); + var returnedResult = Rectangle.union(rectangle1, rectangle2); + expect(returnedResult).toEqualEpsilon(expected, CesiumMath.EPSILON15); + }); + it('expand works if rectangle needs to grow right', function() { var rectangle = new Rectangle(0.5, 0.1, 0.75, 0.9); var cartographic = new Cartographic(0.85, 0.5); diff --git a/Specs/Core/TerrainEncodingSpec.js b/Specs/Core/TerrainEncodingSpec.js index 8b511b1bbee1..de33f7b07687 100644 --- a/Specs/Core/TerrainEncodingSpec.js +++ b/Specs/Core/TerrainEncodingSpec.js @@ -5,7 +5,6 @@ defineSuite([ 'Core/AxisAlignedBoundingBox', 'Core/Cartesian2', 'Core/Cartesian3', - 'Core/Math', 'Core/Matrix4', 'Core/TerrainQuantization', 'Core/Transforms' @@ -15,7 +14,6 @@ defineSuite([ AxisAlignedBoundingBox, Cartesian2, Cartesian3, - CesiumMath, Matrix4, TerrainQuantization, Transforms) { diff --git a/Specs/Core/TransformsSpec.js b/Specs/Core/TransformsSpec.js index 40221fc9bc1f..1d4682ca3b7a 100644 --- a/Specs/Core/TransformsSpec.js +++ b/Specs/Core/TransformsSpec.js @@ -1,46 +1,38 @@ /*global defineSuite*/ defineSuite([ - 'Core/Transforms', - 'Core/Cartesian2', - 'Core/Cartesian3', - 'Core/Cartesian4', - 'Core/defined', - 'Core/DeveloperError', - 'Core/EarthOrientationParameters', - 'Core/Ellipsoid', - 'Core/GeographicProjection', - 'Core/HeadingPitchRoll', - 'Core/Iau2006XysData', - 'Core/JulianDate', - 'Core/loadJson', - 'Core/Math', - 'Core/Matrix3', - 'Core/Matrix4', - 'Core/Quaternion', - 'Core/TimeConstants', - 'Core/TimeInterval', - 'ThirdParty/when' -], function( - Transforms, - Cartesian2, - Cartesian3, - Cartesian4, - defined, - DeveloperError, - EarthOrientationParameters, - Ellipsoid, - GeographicProjection, - HeadingPitchRoll, - Iau2006XysData, - JulianDate, - loadJson, - CesiumMath, - Matrix3, - Matrix4, - Quaternion, - TimeConstants, - TimeInterval, - when) { + 'Core/Transforms', + 'Core/Cartesian2', + 'Core/Cartesian3', + 'Core/Cartesian4', + 'Core/EarthOrientationParameters', + 'Core/Ellipsoid', + 'Core/GeographicProjection', + 'Core/HeadingPitchRoll', + 'Core/Iau2006XysData', + 'Core/JulianDate', + 'Core/loadJson', + 'Core/Math', + 'Core/Matrix3', + 'Core/Matrix4', + 'Core/Quaternion', + 'Core/TimeInterval' + ], function( + Transforms, + Cartesian2, + Cartesian3, + Cartesian4, + EarthOrientationParameters, + Ellipsoid, + GeographicProjection, + HeadingPitchRoll, + Iau2006XysData, + JulianDate, + loadJson, + CesiumMath, + Matrix3, + Matrix4, + Quaternion, + TimeInterval) { 'use strict'; var negativeX = new Cartesian4(-1, 0, 0, 0); @@ -365,7 +357,7 @@ defineSuite([ var transform = Transforms.headingPitchRollToFixedFrame(origin, hpr, Ellipsoid.UNIT_SPHERE); var expected = Matrix4.getRotation(transform, new Matrix3()); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE); var actual = Matrix3.fromQuaternion(quaternion); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); }); @@ -396,7 +388,7 @@ defineSuite([ var expected = Matrix4.getRotation(transform, new Matrix3()); var result = new Quaternion(); - var quaternion = Transforms.headingPitchRollQuaternion(origin, heading, pitch, roll, Ellipsoid.UNIT_SPHERE, result); + var quaternion = Transforms.headingPitchRollQuaternion(origin, hpr, Ellipsoid.UNIT_SPHERE, result); var actual = Matrix3.fromQuaternion(quaternion); expect(quaternion).toBe(result); expect(actual).toEqualEpsilon(expected, CesiumMath.EPSILON11); @@ -931,21 +923,9 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('headingPitchRollToFixedFrame throws without an heading', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined, 0.0, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an pitch', function() { - expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, undefined, 0.0); - }).toThrowDeveloperError(); - }); - - it('headingPitchRollToFixedFrame throws without an roll', function() { + it('headingPitchRollToFixedFrame throws without a headingPitchRoll', function() { expect(function() { - Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, 0.0, 0.0, undefined); + Transforms.headingPitchRollToFixedFrame(Cartesian3.ZERO, undefined); }).toThrowDeveloperError(); }); diff --git a/Specs/Core/TranslationRotationScaleSpec.js b/Specs/Core/TranslationRotationScaleSpec.js index 1b2b14344b13..ab51f2e833f1 100644 --- a/Specs/Core/TranslationRotationScaleSpec.js +++ b/Specs/Core/TranslationRotationScaleSpec.js @@ -2,12 +2,10 @@ defineSuite([ 'Core/TranslationRotationScale', 'Core/Cartesian3', - 'Core/Matrix4', 'Core/Quaternion' ], function( TranslationRotationScale, Cartesian3, - Matrix4, Quaternion) { 'use strict'; diff --git a/Specs/Core/TrustedServersSpec.js b/Specs/Core/TrustedServersSpec.js index 0eee872ec672..164b9b0340aa 100644 --- a/Specs/Core/TrustedServersSpec.js +++ b/Specs/Core/TrustedServersSpec.js @@ -1,8 +1,8 @@ /*global defineSuite*/ defineSuite([ - 'Core/TrustedServers' -], function( - TrustedServers) { + 'Core/TrustedServers' + ], function( + TrustedServers) { 'use strict'; afterEach(function() { diff --git a/Specs/Core/VRTheWorldTerrainProviderSpec.js b/Specs/Core/VRTheWorldTerrainProviderSpec.js index 04d3e8a74f6e..35c259cf5e29 100644 --- a/Specs/Core/VRTheWorldTerrainProviderSpec.js +++ b/Specs/Core/VRTheWorldTerrainProviderSpec.js @@ -2,7 +2,6 @@ defineSuite([ 'Core/VRTheWorldTerrainProvider', 'Core/DefaultProxy', - 'Core/defined', 'Core/GeographicTilingScheme', 'Core/HeightmapTerrainData', 'Core/loadImage', @@ -15,7 +14,6 @@ defineSuite([ ], function( VRTheWorldTerrainProvider, DefaultProxy, - defined, GeographicTilingScheme, HeightmapTerrainData, loadImage, diff --git a/Specs/Core/loadCRNSpec.js b/Specs/Core/loadCRNSpec.js new file mode 100644 index 000000000000..40164fe346aa --- /dev/null +++ b/Specs/Core/loadCRNSpec.js @@ -0,0 +1,150 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/loadCRN', + 'Core/PixelFormat', + 'Core/RequestErrorEvent', + 'Core/RuntimeError' +], function( + loadCRN, + PixelFormat, + RequestErrorEvent, + RuntimeError) { + 'use strict'; + + var validCompressed = new Uint8Array([72, 120, 0, 74, 227, 123, 0, 0, 0, 138, 92, 167, 0, 4, 0, 4, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 22, 0, 1, 0, 0, 96, 0, 0, 12, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29, 0, 0, 108, 0, 0, 0, 137, 0, 10, 96, 0, 0, 0, 0, 0, 0, 16, 4, 9, 130, 0, 0, 0, 0, 0, 0, 109, 4, 0, 0, 198, 96, 128, 0, 0, 0, 0, 0, 26, 80, 0, 0, 6, 96, 0, 0, 0, 0, 0, 0, 16, 0, 51, 0, 0, 0, 0, 0, 0, 0, 128, 1, 152, 0, 0, 0, 0, 0, 0, 4, 0]); + var fakeXHR; + + beforeEach(function() { + fakeXHR = jasmine.createSpyObj('XMLHttpRequest', ['send', 'open', 'setRequestHeader', 'abort', 'getAllResponseHeaders']); + fakeXHR.simulateLoad = function(response) { + fakeXHR.status = 200; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + fakeXHR.simulateError = function() { + fakeXHR.response = ''; + if (typeof fakeXHR.onerror === 'function') { + fakeXHR.onerror(); + } + }; + fakeXHR.simulateHttpError = function(statusCode, response) { + fakeXHR.status = statusCode; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + + spyOn(window, 'XMLHttpRequest').and.returnValue(fakeXHR); + }); + + it('throws with no url', function() { + expect(function() { + loadCRN(); + }).toThrowDeveloperError(); + }); + + it('creates and sends request without any custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadCRN(testUrl); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader).not.toHaveBeenCalled(); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('creates and sends request with custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadCRN(testUrl, { + 'Accept' : 'application/json', + 'Cache-Control' : 'no-cache' + }); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader.calls.count()).toEqual(2); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Accept', 'application/json'); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache'); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('returns a promise that rejects when the request errors', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + fakeXHR.simulateError(); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toBeUndefined(); + expect(rejectedError.response).toBeUndefined(); + }); + + it('returns a promise that rejects when the request results in an HTTP error code', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var error = 'some error'; + fakeXHR.simulateHttpError(404, error); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toEqual(404); + expect(rejectedError.response).toEqual(error); + }); + + it('returns a promise that resolves to an compressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadCRN(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + var newPromise = promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validCompressed.buffer; + fakeXHR.simulateLoad(response); + + return newPromise.then(function() { + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + }); +}); diff --git a/Specs/Core/loadImageFromTypedArraySpec.js b/Specs/Core/loadImageFromTypedArraySpec.js index 8231513950b1..d16e6468ab4f 100644 --- a/Specs/Core/loadImageFromTypedArraySpec.js +++ b/Specs/Core/loadImageFromTypedArraySpec.js @@ -1,14 +1,10 @@ /*global defineSuite*/ defineSuite([ 'Core/loadImageFromTypedArray', - 'Core/defined', - 'Core/loadArrayBuffer', - 'ThirdParty/when' + 'Core/loadArrayBuffer' ], function( loadImageFromTypedArray, - defined, - loadArrayBuffer, - when) { + loadArrayBuffer) { 'use strict'; it('can load an image', function() { diff --git a/Specs/Core/loadImageSpec.js b/Specs/Core/loadImageSpec.js index b396a886f61d..2a31f4cb2bdb 100644 --- a/Specs/Core/loadImageSpec.js +++ b/Specs/Core/loadImageSpec.js @@ -1,11 +1,9 @@ /*global defineSuite*/ defineSuite([ 'Core/loadImage', - 'Core/defined', 'ThirdParty/when' ], function( loadImage, - defined, when) { 'use strict'; diff --git a/Specs/Core/loadImageViaBlobSpec.js b/Specs/Core/loadImageViaBlobSpec.js index 372d61c4fdf8..bfbe82e5b965 100644 --- a/Specs/Core/loadImageViaBlobSpec.js +++ b/Specs/Core/loadImageViaBlobSpec.js @@ -1,11 +1,9 @@ /*global defineSuite*/ defineSuite([ 'Core/loadImageViaBlob', - 'Core/defined', 'ThirdParty/when' ], function( loadImageViaBlob, - defined, when) { 'use strict'; diff --git a/Specs/Core/loadJsonpSpec.js b/Specs/Core/loadJsonpSpec.js index 066ce79e0a6c..9b735b692178 100644 --- a/Specs/Core/loadJsonpSpec.js +++ b/Specs/Core/loadJsonpSpec.js @@ -1,12 +1,10 @@ /*global defineSuite*/ defineSuite([ 'Core/loadJsonp', - 'Core/DefaultProxy', - 'Core/RequestErrorEvent' + 'Core/DefaultProxy' ], function( loadJsonp, - DefaultProxy, - RequestErrorEvent) { + DefaultProxy) { 'use strict'; it('throws with no url', function() { diff --git a/Specs/Core/loadKTXSpec.js b/Specs/Core/loadKTXSpec.js new file mode 100644 index 000000000000..3718ca996ca4 --- /dev/null +++ b/Specs/Core/loadKTXSpec.js @@ -0,0 +1,375 @@ +/*global defineSuite*/ +defineSuite([ + 'Core/loadKTX', + 'Core/PixelFormat', + 'Core/RequestErrorEvent', + 'Core/RuntimeError' + ], function( + loadKTX, + PixelFormat, + RequestErrorEvent, + RuntimeError) { + 'use strict'; + + var validCompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 241, 131, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 8, 0, 0, 0, 224, 7, 224, 7, 0, 0, 0, 0]); + var validUncompressed = new Uint8Array([171, 75, 84, 88, 32, 49, 49, 187, 13, 10, 26, 10, 1, 2, 3, 4, 1, 20, 0, 0, 1, 0, 0, 0, 8, 25, 0, 0, 88, 128, 0, 0, 8, 25, 0, 0, 4, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 32, 0, 0, 0, 27, 0, 0, 0, 75, 84, 88, 79, 114, 105, 101, 110, 116, 97, 116, 105, 111, 110, 0, 83, 61, 114, 44, 84, 61, 100, 44, 82, 61, 105, 0, 0, 64, 0, 0, 0, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255, 0, 255]); + + var fakeXHR; + + beforeEach(function() { + fakeXHR = jasmine.createSpyObj('XMLHttpRequest', ['send', 'open', 'setRequestHeader', 'abort', 'getAllResponseHeaders']); + fakeXHR.simulateLoad = function(response) { + fakeXHR.status = 200; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + fakeXHR.simulateError = function() { + fakeXHR.response = ''; + if (typeof fakeXHR.onerror === 'function') { + fakeXHR.onerror(); + } + }; + fakeXHR.simulateHttpError = function(statusCode, response) { + fakeXHR.status = statusCode; + fakeXHR.response = response; + if (typeof fakeXHR.onload === 'function') { + fakeXHR.onload(); + } + }; + + spyOn(window, 'XMLHttpRequest').and.returnValue(fakeXHR); + }); + + it('throws with no url', function() { + expect(function() { + loadKTX(); + }).toThrowDeveloperError(); + }); + + it('creates and sends request without any custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadKTX(testUrl); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader).not.toHaveBeenCalled(); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('creates and sends request with custom headers', function() { + var testUrl = 'http://example.invalid/testuri'; + loadKTX(testUrl, { + 'Accept' : 'application/json', + 'Cache-Control' : 'no-cache' + }); + + expect(fakeXHR.open).toHaveBeenCalledWith('GET', testUrl, true); + expect(fakeXHR.setRequestHeader.calls.count()).toEqual(2); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Accept', 'application/json'); + expect(fakeXHR.setRequestHeader).toHaveBeenCalledWith('Cache-Control', 'no-cache'); + expect(fakeXHR.send).toHaveBeenCalled(); + }); + + it('returns a promise that rejects when the request errors', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + fakeXHR.simulateError(); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toBeUndefined(); + expect(rejectedError.response).toBeUndefined(); + }); + + it('returns a promise that rejects when the request results in an HTTP error code', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var error = 'some error'; + fakeXHR.simulateHttpError(404, error); + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RequestErrorEvent).toBe(true); + expect(rejectedError.statusCode).toEqual(404); + expect(rejectedError.response).toEqual(error); + }); + + it('returns a promise that resolves to an uncompressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validUncompressed.buffer; + fakeXHR.simulateLoad(response); + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(false); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + + it('returns a promise that resolves to an compressed texture when the request loads', function() { + var testUrl = 'http://example.invalid/testuri'; + var promise = loadKTX(testUrl); + + expect(promise).toBeDefined(); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError).toBeUndefined(); + + var response = validCompressed.buffer; + fakeXHR.simulateLoad(response); + expect(resolvedValue).toBeDefined(); + expect(resolvedValue.width).toEqual(4); + expect(resolvedValue.height).toEqual(4); + expect(PixelFormat.isCompressedFormat(resolvedValue.internalFormat)).toEqual(true); + expect(resolvedValue.bufferView).toBeDefined(); + expect(rejectedError).toBeUndefined(); + }); + + it('cannot parse invalid KTX buffer', function() { + var invalidKTX = new Uint8Array(validCompressed); + invalidKTX[0] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Invalid KTX file.'); + }); + + it('cannot parse KTX buffer with invalid endianness', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[3] = 0x01020304; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('File is the wrong endianness.'); + }); + + it('cannot parse KTX buffer with invalid internal format', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[7] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('glInternalFormat is not a valid format.'); + }); + + it('cannot parse KTX buffer with compressed texture and invalid type', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[4] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('glType must be zero when the texture is compressed.'); + }); + + it('cannot parse KTX buffer with compressed texture and invalid type size', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[5] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('The type size for compressed textures must be 1.'); + }); + + it('cannot parse KTX buffer with compressed texture and needs to generate mipmaps', function() { + var reinterprestBuffer = new Uint32Array(validCompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[14] = 0; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Generating mipmaps for a compressed texture is unsupported.'); + }); + + it('cannot parse KTX buffer with uncompressed texture and base format is not the same as format', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[8] = invalidKTX[6] + 1; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('The base internal format must be the same as the format for uncompressed textures.'); + }); + + it('3D textures are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[11] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('3D textures are unsupported.'); + }); + + it('Texture arrays are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[12] = 15; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Texture arrays are unsupported.'); + }); + + it('Cubemaps are unsupported', function() { + var reinterprestBuffer = new Uint32Array(validUncompressed.buffer); + var invalidKTX = new Uint32Array(reinterprestBuffer); + invalidKTX[13] = 6; + + var promise = loadKTX(invalidKTX.buffer); + + var resolvedValue; + var rejectedError; + promise.then(function(value) { + resolvedValue = value; + }, function(error) { + rejectedError = error; + }); + + expect(resolvedValue).toBeUndefined(); + expect(rejectedError instanceof RuntimeError).toEqual(true); + expect(rejectedError.message).toEqual('Cubemaps are unsupported.'); + }); +}); diff --git a/Specs/Core/loadWithXhrSpec.js b/Specs/Core/loadWithXhrSpec.js index 44cc1799f33a..6b2b5a5742ec 100644 --- a/Specs/Core/loadWithXhrSpec.js +++ b/Specs/Core/loadWithXhrSpec.js @@ -2,13 +2,11 @@ defineSuite([ 'Core/loadWithXhr', 'Core/loadImage', - 'Core/RequestErrorEvent', - 'Core/RuntimeError' + 'Core/RequestErrorEvent' ], function( loadWithXhr, loadImage, - RequestErrorEvent, - RuntimeError) { + RequestErrorEvent) { 'use strict'; it('throws with no url', function() { diff --git a/Specs/Core/sampleTerrainSpec.js b/Specs/Core/sampleTerrainSpec.js index 1cf13884d8c7..3ab1971a23f4 100644 --- a/Specs/Core/sampleTerrainSpec.js +++ b/Specs/Core/sampleTerrainSpec.js @@ -2,13 +2,11 @@ defineSuite([ 'Core/sampleTerrain', 'Core/Cartographic', - 'Core/CesiumTerrainProvider', - 'ThirdParty/when' + 'Core/CesiumTerrainProvider' ], function( sampleTerrain, Cartographic, - CesiumTerrainProvider, - when) { + CesiumTerrainProvider) { 'use strict'; var terrainProvider = new CesiumTerrainProvider({ diff --git a/Specs/Core/writeTextToCanvasSpec.js b/Specs/Core/writeTextToCanvasSpec.js index 96870daf1d5b..8d7afe453c2e 100644 --- a/Specs/Core/writeTextToCanvasSpec.js +++ b/Specs/Core/writeTextToCanvasSpec.js @@ -80,8 +80,10 @@ defineSuite([ stroke : false }); - // canvas1 is filled, so there should only be two "edges" - expect(getColorChangeCount(canvas1)).toEqual(2); + // canvas1 is filled, completely by the I on the left + // and then has empty space on the right, so there + // should only be one "edge": fill -> outside + expect(getColorChangeCount(canvas1)).toEqual(1); var canvas2 = writeTextToCanvas('I', { font : '90px "Open Sans"', @@ -90,8 +92,8 @@ defineSuite([ strokeColor : Color.BLUE }); - // canvas2 is stroked, so there should be four "edges" - expect(getColorChangeCount(canvas2)).toEqual(4); + // canvas2 is stroked, so there should be three "edges": outline -> inside -> outline -> outside + expect(getColorChangeCount(canvas2)).toEqual(3); }); it('background color defaults to transparent', function() { diff --git a/Specs/Data/CZML/ValidationDocument.czml b/Specs/Data/CZML/ValidationDocument.czml index f7e17fa73f64..ada01b4758fd 100644 --- a/Specs/Data/CZML/ValidationDocument.czml +++ b/Specs/Data/CZML/ValidationDocument.czml @@ -14,34 +14,34 @@ }, { "id":"Constant", - "description":"string1", + "description":"string31449", "position":{ "cartesian":[ - 1,2,3 + 24944,16481,24896 ] }, "orientation":{ "unitQuaternion":[ - 0.36514837167011116,0.5477225575051662,0.7302967433402213,0.18257418583505508 + 0.43149331197758906,0.5608119145093391,0.42352282258757407,0.5656252619981141 ] }, "viewFrom":{ "cartesian":[ - 4,5,6 + 17794,13381,18228 ] }, "billboard":{ "show":true, - "image":"http://example.com/1", - "scale":1, + "image":"http://example.com/3792", + "scale":27514, "pixelOffset":{ "cartesian2":[ - 1,2 + 16996,51010 ] }, "eyeOffset":{ "cartesian":[ - 7,8,9 + 64633,11516,17196 ] }, "horizontalOrigin":"LEFT", @@ -49,36 +49,36 @@ "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 2,3,4,1 + 87,118,167,140 ] }, - "rotation":2, + "rotation":57379, "alignedAxis":{ "unitCartesian":[ - 0.26726124191242406,0.5345224838248491,0.8017837257372731 + 0.20506209189572408,0.9757682134856994,0.07632779322289032 ] }, "sizeInMeters":true, - "width":3, - "height":4, + "width":25197, + "height":53328, "scaleByDistance":{ "nearFarScalar":[ - 1,2,3,4 + 59318,31207,63353,55287 ] }, "translucencyByDistance":{ "nearFarScalar":[ - 5,6,7,8 + 43707,31146,12921,57138 ] }, "pixelOffsetScaleByDistance":{ "nearFarScalar":[ - 9,10,11,12 + 11873,40494,29598,27507 ] }, "imageSubRegion":{ "boundingRectangle":[ - 1,2,3,4 + 62620,63220,23030,63321 ] } }, @@ -86,7 +86,7 @@ "show":true, "dimensions":{ "cartesian":[ - 10,11,12 + 57494,62432,42995 ] }, "fill":true, @@ -94,7 +94,7 @@ "solidColor":{ "color":{ "rgba":[ - 6,7,8,5 + 88,226,91,144 ] } } @@ -102,29 +102,30 @@ "outline":true, "outlineColor":{ "rgba":[ - 10,11,12,9 + 121,42,244,168 ] }, - "outlineWidth":5 + "outlineWidth":15323, + "shadows":"CAST_ONLY" }, "corridor":{ "show":true, "positions":{ "cartesian":[ - 1,2,3,4,5,6 + 36415,2702,36618,47759,11706,63277 ] }, - "width":6, - "height":7, - "extrudedHeight":8, + "width":20413, + "height":8062, + "extrudedHeight":22846, "cornerType":"BEVELED", - "granularity":9, + "granularity":44105, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 14,15,16,13 + 230,252,22,236 ] } } @@ -132,22 +133,23 @@ "outline":true, "outlineColor":{ "rgba":[ - 18,19,20,17 + 198,25,134,60 ] }, - "outlineWidth":10 + "outlineWidth":9132, + "shadows":"CAST_ONLY" }, "cylinder":{ "show":true, - "length":11, - "topRadius":12, - "bottomRadius":13, + "length":33298, + "topRadius":16245, + "bottomRadius":59378, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 22,23,24,21 + 216,68,53,64 ] } } @@ -155,28 +157,29 @@ "outline":true, "outlineColor":{ "rgba":[ - 26,27,28,25 + 4,90,209,96 ] }, - "outlineWidth":14, - "numberOfVerticalLines":15, - "slices":16 + "outlineWidth":64018, + "numberOfVerticalLines":38567, + "slices":39979, + "shadows":"CAST_ONLY" }, "ellipse":{ "show":true, - "semiMajorAxis":17, - "semiMinorAxis":18, - "height":19, - "extrudedHeight":20, - "rotation":21, - "stRotation":22, - "granularity":23, + "semiMajorAxis":60072, + "semiMinorAxis":38653, + "height":15549, + "extrudedHeight":55640, + "rotation":27722, + "stRotation":4692, + "granularity":62192, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 30,31,32,29 + 116,186,200,40 ] } } @@ -184,17 +187,18 @@ "outline":true, "outlineColor":{ "rgba":[ - 34,35,36,33 + 160,82,145,104 ] }, - "outlineWidth":24, - "numberOfVerticalLines":25 + "outlineWidth":8839, + "numberOfVerticalLines":38878, + "shadows":"CAST_ONLY" }, "ellipsoid":{ "show":true, "radii":{ "cartesian":[ - 13,14,15 + 15638,24381,37983 ] }, "fill":true, @@ -202,7 +206,7 @@ "solidColor":{ "color":{ "rgba":[ - 38,39,40,37 + 202,67,110,69 ] } } @@ -210,28 +214,40 @@ "outline":true, "outlineColor":{ "rgba":[ - 42,43,44,41 + 55,23,226,7 ] }, - "outlineWidth":26, - "stackPartitions":27, - "slicePartitions":28, - "subdivisions":29 + "outlineWidth":47507, + "stackPartitions":54278, + "slicePartitions":28562, + "subdivisions":14008, + "shadows":"CAST_ONLY" }, "label":{ "show":true, - "text":"string2", - "font":"6px sans-serif", + "text":"string36641", + "font":"14px sans-serif", "style":"FILL_AND_OUTLINE", - "scale":30, + "scale":6510, + "showBackground":true, + "backgroundColor":{ + "rgba":[ + 225,114,54,128 + ] + }, + "backgroundPadding":{ + "cartesian2":[ + 5508,56341 + ] + }, "pixelOffset":{ "cartesian2":[ - 3,4 + 25913,30821 ] }, "eyeOffset":{ "cartesian":[ - 16,17,18 + 30502,29047,25457 ] }, "horizontalOrigin":"LEFT", @@ -239,50 +255,64 @@ "heightReference":"CLAMP_TO_GROUND", "fillColor":{ "rgba":[ - 46,47,48,45 + 88,197,147,137 ] }, "outlineColor":{ "rgba":[ - 50,51,52,49 + 171,128,159,223 ] }, - "outlineWidth":31, + "outlineWidth":36637, "translucencyByDistance":{ "nearFarScalar":[ - 13,14,15,16 + 34067,16517,11328,13612 ] }, "pixelOffsetScaleByDistance":{ "nearFarScalar":[ - 17,18,19,20 + 21220,35154,33161,36737 ] } }, "model":{ "show":true, - "gltf":"http://example.com/2", - "scale":32, - "minimumPixelSize":33, - "maximumScale":34, + "gltf":"http://example.com/60043", + "scale":44278, + "minimumPixelSize":35888, + "maximumScale":64305, "incrementallyLoadTextures":true, "runAnimations":true, + "shadows":"CAST_ONLY", "heightReference":"CLAMP_TO_GROUND", + "silhouetteColor":{ + "rgba":[ + 29,61,52,101 + ] + }, + "silhouetteSize":4645, + "color":{ + "rgba":[ + 0,52,75,73 + ] + }, + "colorBlendMode":"REPLACE", + "colorBlendAmount":7475, "nodeTransformations":{ "prop":{ "translation":{ "cartesian":[ - 19,20,21 + 18548,48456,21181 ] }, "rotation":{ "unitQuaternion":[ - 0.454858826147342,0.530668630505232,0.606478434863123,0.379049021789452 + 0.5279606063289254,0.5671567049191863,0.6248129645698993,0.09591469926647515 ] }, "scale":{ "cartesian":[ - 22,23,24 + 53739,37841,41107 ] } } @@ -290,15 +320,15 @@ }, "path":{ "show":true, - "width":35, - "resolution":36, - "leadTime":37, - "trailTime":38, + "width":56040, + "resolution":31563, + "leadTime":5997, + "trailTime":52915, "material":{ "solidColor":{ "color":{ "rgba":[ - 54,55,56,53 + 10,78,168,13 ] } } @@ -306,27 +336,27 @@ }, "point":{ "show":true, - "pixelSize":39, + "pixelSize":53869, "heightReference":"CLAMP_TO_GROUND", "color":{ "rgba":[ - 58,59,60,57 + 3,147,219,77 ] }, "outlineColor":{ "rgba":[ - 62,63,64,61 + 254,106,11,94 ] }, - "outlineWidth":40, + "outlineWidth":27922, "scaleByDistance":{ "nearFarScalar":[ - 21,22,23,24 + 20128,16462,49728,18882 ] }, "translucencyByDistance":{ "nearFarScalar":[ - 25,26,27,28 + 52796,43982,61099,50158 ] } }, @@ -334,19 +364,19 @@ "show":true, "positions":{ "cartesian":[ - 7,8,9,10,11,12 + 39143,2200,6408,27161,33386,62338 ] }, - "height":41, - "extrudedHeight":42, - "stRotation":43, - "granularity":44, + "height":26391, + "extrudedHeight":15922, + "stRotation":2555, + "granularity":17060, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 66,67,68,65 + 216,139,124,253 ] } } @@ -354,52 +384,54 @@ "outline":true, "outlineColor":{ "rgba":[ - 70,71,72,69 + 172,48,134,87 ] }, - "outlineWidth":45, + "outlineWidth":62220, "perPositionHeight":true, "closeTop":true, - "closeBottom":true + "closeBottom":true, + "shadows":"CAST_ONLY" }, "polyline":{ "show":true, "positions":{ "cartesian":[ - 13,14,15,16,17,18 + 23333,31067,17529,57924,41186,31648 ] }, - "width":46, - "granularity":47, + "width":14667, + "granularity":53395, "material":{ "solidColor":{ "color":{ "rgba":[ - 74,75,76,73 + 88,0,232,230 ] } } }, - "followSurface":true + "followSurface":true, + "shadows":"CAST_ONLY" }, "rectangle":{ "show":true, "coordinates":{ "wsen":[ - 1,0.429203673205103,1.4292036732051,0.858407346410207 + 1.13325368272577,0.703573207377445,0.756676249095309,0.339217858685931 ] }, - "height":48, - "extrudedHeight":49, - "rotation":50, - "stRotation":51, - "granularity":52, + "height":20608, + "extrudedHeight":23002, + "rotation":54979, + "stRotation":8079, + "granularity":60343, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 78,79,80,77 + 160,249,70,249 ] } } @@ -407,37 +439,38 @@ "outline":true, "outlineColor":{ "rgba":[ - 82,83,84,81 + 196,59,142,36 ] }, - "outlineWidth":53, + "outlineWidth":59794, "closeTop":true, - "closeBottom":true + "closeBottom":true, + "shadows":"CAST_ONLY" }, "wall":{ "show":true, "positions":{ "cartesian":[ - 19,20,21,22,23,24 + 21681,40276,30621,3959,61967,19442 ] }, "minimumHeights":{ "array":[ - 1,2 + 49466,44737 ] }, "maximumHeights":{ "array":[ - 3,4 + 59672,62697 ] }, - "granularity":54, + "granularity":47652, "fill":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 86,87,88,85 + 64,176,190,65 ] } } @@ -445,31 +478,32 @@ "outline":true, "outlineColor":{ "rgba":[ - 90,91,92,89 + 107,196,96,198 ] }, - "outlineWidth":55 + "outlineWidth":50458, + "shadows":"CAST_ONLY" }, "agi_conicSensor":{ "show":true, - "innerHalfAngle":56, - "outerHalfAngle":57, - "minimumClockAngle":58, - "maximumClockAngle":59, - "radius":60, + "innerHalfAngle":62994, + "outerHalfAngle":27216, + "minimumClockAngle":18231, + "maximumClockAngle":59909, + "radius":29788, "showIntersection":true, "intersectionColor":{ "rgba":[ - 94,95,96,93 + 61,222,182,163 ] }, - "intersectionWidth":61, + "intersectionWidth":50429, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 98,99,100,97 + 130,80,209,249 ] } } @@ -479,7 +513,7 @@ "solidColor":{ "color":{ "rgba":[ - 102,103,104,101 + 107,30,24,25 ] } } @@ -489,7 +523,7 @@ "solidColor":{ "color":{ "rgba":[ - 106,107,108,105 + 149,40,134,42 ] } } @@ -499,7 +533,7 @@ "solidColor":{ "color":{ "rgba":[ - 110,111,112,109 + 208,75,13,71 ] } } @@ -511,7 +545,7 @@ "solidColor":{ "color":{ "rgba":[ - 114,115,116,113 + 241,9,164,213 ] } } @@ -519,32 +553,32 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 118,119,120,117 + 83,22,249,147 ] }, - "environmentIntersectionWidth":62 + "environmentIntersectionWidth":13317 }, "agi_customPatternSensor":{ "show":true, "directions":{ "spherical":[ - 1,2,3,4,5,6 + 49130,29887,4468,25873,21605,54100 ] }, - "radius":63, + "radius":26731, "showIntersection":true, "intersectionColor":{ "rgba":[ - 122,123,124,121 + 59,147,243,67 ] }, - "intersectionWidth":64, + "intersectionWidth":63237, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 126,127,128,125 + 35,33,155,191 ] } } @@ -554,7 +588,7 @@ "solidColor":{ "color":{ "rgba":[ - 130,131,132,129 + 6,121,164,89 ] } } @@ -564,7 +598,7 @@ "solidColor":{ "color":{ "rgba":[ - 134,135,136,133 + 185,102,188,167 ] } } @@ -574,7 +608,7 @@ "solidColor":{ "color":{ "rgba":[ - 138,139,140,137 + 160,74,45,44 ] } } @@ -586,7 +620,7 @@ "solidColor":{ "color":{ "rgba":[ - 142,143,144,141 + 238,207,29,137 ] } } @@ -594,29 +628,29 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 146,147,148,145 + 134,29,12,55 ] }, - "environmentIntersectionWidth":65 + "environmentIntersectionWidth":53576 }, "agi_rectangularSensor":{ "show":true, - "xHalfAngle":66, - "yHalfAngle":67, - "radius":68, + "xHalfAngle":4927, + "yHalfAngle":37224, + "radius":35686, "showIntersection":true, "intersectionColor":{ "rgba":[ - 150,151,152,149 + 211,199,212,246 ] }, - "intersectionWidth":69, + "intersectionWidth":41682, "showLateralSurfaces":true, "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgba":[ - 154,155,156,153 + 34,130,31,98 ] } } @@ -626,7 +660,7 @@ "solidColor":{ "color":{ "rgba":[ - 158,159,160,157 + 134,158,149,146 ] } } @@ -636,7 +670,7 @@ "solidColor":{ "color":{ "rgba":[ - 162,163,164,161 + 52,43,245,197 ] } } @@ -646,7 +680,7 @@ "solidColor":{ "color":{ "rgba":[ - 166,167,168,165 + 32,23,251,181 ] } } @@ -658,7 +692,7 @@ "solidColor":{ "color":{ "rgba":[ - 170,171,172,169 + 175,187,53,80 ] } } @@ -666,25 +700,25 @@ "showEnvironmentIntersection":true, "environmentIntersectionColor":{ "rgba":[ - 174,175,176,173 + 84,60,81,144 ] }, - "environmentIntersectionWidth":70 + "environmentIntersectionWidth":64839 }, "agi_fan":{ "show":true, "directions":{ "spherical":[ - 7,8,9,10,11,12 + 19722,1613,23046,14938,16954,50242 ] }, - "radius":71, + "radius":54355, "perDirectionRadius":true, "material":{ "solidColor":{ "color":{ "rgba":[ - 178,179,180,177 + 172,23,214,145 ] } } @@ -693,80 +727,80 @@ "outline":true, "outlineColor":{ "rgba":[ - 182,183,184,181 + 107,168,140,214 ] }, - "outlineWidth":72, - "numberOfRings":73 + "outlineWidth":18367, + "numberOfRings":33012 }, "agi_vector":{ "show":true, "color":{ "rgba":[ - 186,187,188,185 + 92,133,96,189 ] }, "direction":{ "spherical":[ - 1,2,3 + 44405,20909,43089 ] }, - "length":74, - "minimumLengthInPixels":75 + "length":5478, + "minimumLengthInPixels":58959 } }, { - "id":"constant1", + "id":"constant_position_cartographicRadians", "position":{ "cartographicRadians":[ - 1,0.429203673205103,3 + 0.368123392863751,0.678098621973879,32050 ] } }, { - "id":"constant2", + "id":"constant_position_cartographicDegrees", "position":{ "cartographicDegrees":[ - 4,5,6 + 14,14,24697 ] } }, { - "id":"constant3", + "id":"constant_position_cartesianVelocity", "position":{ "cartesianVelocity":[ - 1,2,3,4,5,6 + 15776,23613,14940,35130,14217,19511 ] } }, { - "id":"constant4", + "id":"constant_billboard_color_rgbaf", "billboard":{ "color":{ "rgbaf":[ - 0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098 + 0.6745098039215687,0.8666666666666667,0.6,0.6509803921568628 ] } } }, { - "id":"constant5", + "id":"constant_billboard_alignedAxis_unitSpherical", "billboard":{ "alignedAxis":{ "unitSpherical":[ - 1,2 + 20514,39760 ] } } }, { - "id":"constant6", + "id":"constant_box_material_solidColor_color", "box":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549 + 0.996078431372549,0.08235294117647059,0.49411764705882355,0.10196078431372549 ] } } @@ -778,15 +812,15 @@ "box":{ "material":{ "image":{ - "image":"http://example.com/3", + "image":"http://example.com/50881", "repeat":{ "cartesian2":[ - 5,6 + 58955,45286 ] }, "color":{ "rgba":[ - 190,191,192,189 + 98,97,133,129 ] }, "transparent":true @@ -801,23 +835,23 @@ "grid":{ "color":{ "rgba":[ - 194,195,196,193 + 178,10,106,226 ] }, - "cellAlpha":76, + "cellAlpha":47180, "lineCount":{ "cartesian2":[ - 7,8 + 24659,13408 ] }, "lineThickness":{ "cartesian2":[ - 9,10 + 13897,25654 ] }, "lineOffset":{ "cartesian2":[ - 11,12 + 14153,49207 ] } } @@ -832,28 +866,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 198,199,200,197 + 18,147,177,80 ] }, "oddColor":{ "rgba":[ - 202,203,204,201 + 189,226,187,107 ] }, - "offset":77, - "repeat":78 + "offset":43563, + "repeat":24480 } } } }, { - "id":"material1", + "id":"constant_box_material_image_color", "box":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882 + 0.7333333333333333,0.4745098039215686,0.5607843137254902,0.34901960784313724 ] } } @@ -861,13 +895,13 @@ } }, { - "id":"material2", + "id":"constant_box_material_grid_color", "box":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744 + 0.8470588235294118,0.39215686274509803,0.35294117647058826,0.8980392156862745 ] } } @@ -875,13 +909,13 @@ } }, { - "id":"material3", + "id":"constant_box_material_stripe_evenColor", "box":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667 + 0.6666666666666666,0.9764705882352941,0.8392156862745098,0.6431372549019608 ] } } @@ -889,13 +923,13 @@ } }, { - "id":"material4", + "id":"constant_box_material_stripe_oddColor", "box":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059 + 0.25882352941176473,0.796078431372549,0.7176470588235294,0.7490196078431373 ] } } @@ -903,43 +937,43 @@ } }, { - "id":"constant7", + "id":"constant_box_outlineColor_rgbaf", "box":{ "outlineColor":{ "rgbaf":[ - 0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451 + 0.8352941176470589,0.03137254901960784,0.2823529411764706,0.33725490196078434 ] } } }, { - "id":"constant8", + "id":"constant_corridor_positions_cartographicRadians", "corridor":{ "positions":{ "cartographicRadians":[ - 1,0.429203673205103,3,0.858407346410207,0.28761101961531,6 + 0.220356654342316,0.879184920197648,64909,0.175978952571564,1.00316515710468,913 ] } } }, { - "id":"constant9", + "id":"constant_corridor_positions_cartographicDegrees", "corridor":{ "positions":{ "cartographicDegrees":[ - 7,8,9,10,11,12 + 28,14,63058,15,37,26381 ] } } }, { - "id":"constant10", + "id":"constant_corridor_material_solidColor_color", "corridor":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843 + 0.3333333333333333,0.8784313725490196,0.3568627450980392,0.43529411764705883 ] } } @@ -951,15 +985,15 @@ "corridor":{ "material":{ "image":{ - "image":"http://example.com/4", + "image":"http://example.com/8903", "repeat":{ "cartesian2":[ - 13,14 + 41660,35234 ] }, "color":{ "rgba":[ - 206,207,208,205 + 213,25,147,247 ] }, "transparent":true @@ -974,23 +1008,23 @@ "grid":{ "color":{ "rgba":[ - 210,211,212,209 + 236,51,112,235 ] }, - "cellAlpha":79, + "cellAlpha":11472, "lineCount":{ "cartesian2":[ - 15,16 + 1254,38404 ] }, "lineThickness":{ "cartesian2":[ - 17,18 + 48962,63679 ] }, "lineOffset":{ "cartesian2":[ - 19,20 + 39061,4.7e4 ] } } @@ -1005,28 +1039,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 214,215,216,213 + 245,61,208,138 ] }, "oddColor":{ "rgba":[ - 218,219,220,217 + 114,73,91,165 ] }, - "offset":80, - "repeat":81 + "offset":12788, + "repeat":33136 } } } }, { - "id":"material5", + "id":"constant_corridor_material_image_color", "corridor":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237 + 0.01568627450980392,0.09411764705882353,0.4,0.5294117647058824 ] } } @@ -1034,13 +1068,13 @@ } }, { - "id":"material6", + "id":"constant_corridor_material_grid_color", "corridor":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863 + 0.5764705882352941,0.7607843137254902,0.15294117647058825,0.00392156862745098 ] } } @@ -1048,13 +1082,13 @@ } }, { - "id":"material7", + "id":"constant_corridor_material_stripe_evenColor", "corridor":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902 + 0.9137254901960784,0.6392156862745098,0.6313725490196078,0.8901960784313725 ] } } @@ -1062,13 +1096,13 @@ } }, { - "id":"material8", + "id":"constant_corridor_material_stripe_oddColor", "corridor":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413 + 0.2,0.13725490196078433,0.792156862745098,0.30196078431372547 ] } } @@ -1076,23 +1110,23 @@ } }, { - "id":"constant11", + "id":"constant_corridor_outlineColor_rgbaf", "corridor":{ "outlineColor":{ "rgbaf":[ - 0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805 + 0.6901960784313725,0.054901960784313725,0.24705882352941178,0.2980392156862745 ] } } }, { - "id":"constant12", + "id":"constant_cylinder_material_solidColor_color", "cylinder":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197 + 0.47843137254901963,0.050980392156862744,0.45098039215686275,0.8784313725490196 ] } } @@ -1104,15 +1138,15 @@ "cylinder":{ "material":{ "image":{ - "image":"http://example.com/5", + "image":"http://example.com/27447", "repeat":{ "cartesian2":[ - 21,22 + 65243,41470 ] }, "color":{ "rgba":[ - 222,223,224,221 + 200,175,107,217 ] }, "transparent":true @@ -1127,23 +1161,23 @@ "grid":{ "color":{ "rgba":[ - 226,227,228,225 + 173,210,231,62 ] }, - "cellAlpha":82, + "cellAlpha":9555, "lineCount":{ "cartesian2":[ - 23,24 + 58545,26852 ] }, "lineThickness":{ "cartesian2":[ - 25,26 + 58520,44260 ] }, "lineOffset":{ "cartesian2":[ - 27,28 + 61513,28656 ] } } @@ -1158,28 +1192,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 230,231,232,229 + 158,155,154,86 ] }, "oddColor":{ "rgba":[ - 234,235,236,233 + 191,226,188,74 ] }, - "offset":83, - "repeat":84 + "offset":55018, + "repeat":33073 } } } }, { - "id":"material9", + "id":"constant_cylinder_material_image_color", "cylinder":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059 + 0.6549019607843137,0.06274509803921569,0.5176470588235295,0.5372549019607843 ] } } @@ -1187,13 +1221,13 @@ } }, { - "id":"material10", + "id":"constant_cylinder_material_grid_color", "cylinder":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981 + 0.9019607843137255,0.36470588235294116,0.3058823529411765,0.9450980392156862 ] } } @@ -1201,13 +1235,13 @@ } }, { - "id":"material11", + "id":"constant_cylinder_material_stripe_evenColor", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137 + 0.09019607843137255,0.13333333333333333,0.37254901960784315,0.4980392156862745 ] } } @@ -1215,13 +1249,13 @@ } }, { - "id":"material12", + "id":"constant_cylinder_material_stripe_oddColor", "cylinder":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763 + 0.9058823529411765,0.5647058823529412,0.48627450980392156,0.6784313725490196 ] } } @@ -1229,23 +1263,23 @@ } }, { - "id":"constant13", + "id":"constant_cylinder_outlineColor_rgbaf", "cylinder":{ "outlineColor":{ "rgbaf":[ - 0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155 + 0.6470588235294118,0.5647058823529412,0.4,0.08627450980392157 ] } } }, { - "id":"constant14", + "id":"constant_ellipse_material_solidColor_color", "ellipse":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547 + 0.09803921568627451,0.9137254901960784,0.8117647058823529,0.2 ] } } @@ -1257,15 +1291,15 @@ "ellipse":{ "material":{ "image":{ - "image":"http://example.com/6", + "image":"http://example.com/2481", "repeat":{ "cartesian2":[ - 29,30 + 45447,53937 ] }, "color":{ "rgba":[ - 238,239,240,237 + 45,86,136,120 ] }, "transparent":true @@ -1280,23 +1314,23 @@ "grid":{ "color":{ "rgba":[ - 242,243,244,241 + 217,159,32,60 ] }, - "cellAlpha":85, + "cellAlpha":24764, "lineCount":{ "cartesian2":[ - 31,32 + 25721,6500 ] }, "lineThickness":{ "cartesian2":[ - 33,34 + 57205,63455 ] }, "lineOffset":{ "cartesian2":[ - 35,36 + 49829,3778 ] } } @@ -1311,28 +1345,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 246,247,248,245 + 7,152,58,224 ] }, "oddColor":{ "rgba":[ - 250,251,252,249 + 4,228,224,57 ] }, - "offset":86, - "repeat":87 + "offset":26719, + "repeat":15097 } } } }, { - "id":"material13", + "id":"constant_ellipse_material_image_color", "ellipse":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294 + 0.36470588235294116,0.6980392156862745,0.803921568627451,0.8431372549019608 ] } } @@ -1340,13 +1374,13 @@ } }, { - "id":"material14", + "id":"constant_ellipse_material_grid_color", "ellipse":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333 + 0.6784313725490196,0.5803921568627451,0.8235294117647058,0.6274509803921569 ] } } @@ -1354,13 +1388,13 @@ } }, { - "id":"material15", + "id":"constant_ellipse_material_stripe_evenColor", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724 + 0.3137254901960784,0.7686274509803922,0.6745098039215687,0.7058823529411765 ] } } @@ -1368,13 +1402,13 @@ } }, { - "id":"material16", + "id":"constant_ellipse_material_stripe_oddColor", "ellipse":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116 + 0.6823529411764706,0.6588235294117647,0.9529411764705882,0.08235294117647059 ] } } @@ -1382,23 +1416,23 @@ } }, { - "id":"constant15", + "id":"constant_ellipse_outlineColor_rgbaf", "ellipse":{ "outlineColor":{ "rgbaf":[ - 0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451 + 0.5725490196078431,0.9568627450980393,0.9686274509803922,0.6745098039215687 ] } } }, { - "id":"constant16", + "id":"constant_ellipsoid_material_solidColor_color", "ellipsoid":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.4,0.403921568627451,0.40784313725490196,0.396078431372549 + 0.5725490196078431,0.5333333333333333,0.3843137254901961,0.2 ] } } @@ -1410,15 +1444,15 @@ "ellipsoid":{ "material":{ "image":{ - "image":"http://example.com/7", + "image":"http://example.com/47428", "repeat":{ "cartesian2":[ - 37,38 + 53733,35793 ] }, "color":{ "rgba":[ - 254,0,1,253 + 125,49,160,165 ] }, "transparent":true @@ -1433,23 +1467,23 @@ "grid":{ "color":{ "rgba":[ - 3,4,5,2 + 95,212,218,57 ] }, - "cellAlpha":88, + "cellAlpha":53044, "lineCount":{ "cartesian2":[ - 39,40 + 7763,58654 ] }, "lineThickness":{ "cartesian2":[ - 41,42 + 25480,4707 ] }, "lineOffset":{ "cartesian2":[ - 43,44 + 38422,44182 ] } } @@ -1464,28 +1498,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 7,8,9,6 + 174,241,84,24 ] }, "oddColor":{ "rgba":[ - 11,12,13,10 + 134,51,175,154 ] }, - "offset":89, - "repeat":90 + "offset":24796, + "repeat":2913 } } } }, { - "id":"material17", + "id":"constant_ellipsoid_material_image_color", "ellipsoid":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529 + 0.24705882352941178,0.403921568627451,0.1450980392156863,0.47843137254901963 ] } } @@ -1493,13 +1527,13 @@ } }, { - "id":"material18", + "id":"constant_ellipsoid_material_grid_color", "ellipsoid":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684 + 0.27058823529411763,0.7843137254901961,0.17254901960784313,0.8352941176470589 ] } } @@ -1507,13 +1541,13 @@ } }, { - "id":"material19", + "id":"constant_ellipsoid_material_stripe_evenColor", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076 + 0.41568627450980394,0.19215686274509805,0.3686274509803922,0.12941176470588237 ] } } @@ -1521,13 +1555,13 @@ } }, { - "id":"material20", + "id":"constant_ellipsoid_material_stripe_oddColor", "ellipsoid":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647 + 0.5803921568627451,0.16470588235294117,0.7411764705882353,0.09411764705882353 ] } } @@ -1535,43 +1569,73 @@ } }, { - "id":"constant17", + "id":"constant_ellipsoid_outlineColor_rgbaf", "ellipsoid":{ "outlineColor":{ "rgbaf":[ - 0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686 + 0.49411764705882355,0.08235294117647059,0.27450980392156865,0.8235294117647058 ] } } }, { - "id":"constant18", + "id":"constant_label_backgroundColor_rgbaf", + "label":{ + "backgroundColor":{ + "rgbaf":[ + 0.8941176470588236,0.9490196078431372,0.49411764705882355,0.8431372549019608 + ] + } + } + }, + { + "id":"constant_label_fillColor_rgbaf", "label":{ "fillColor":{ "rgbaf":[ - 0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253 + 0.1607843137254902,0.5686274509803921,0.7764705882352941,0.5058823529411764 ] } } }, { - "id":"constant19", + "id":"constant_label_outlineColor_rgbaf", "label":{ "outlineColor":{ "rgbaf":[ - 0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764 + 0.4588235294117647,0.3254901960784314,0.9098039215686274,0.6784313725490196 + ] + } + } + }, + { + "id":"constant_model_silhouetteColor_rgbaf", + "model":{ + "silhouetteColor":{ + "rgbaf":[ + 0.29411764705882354,0.3137254901960784,0.4196078431372549,0.8784313725490196 ] } } }, { - "id":"constant20", + "id":"constant_model_color_rgbaf", + "model":{ + "color":{ + "rgbaf":[ + 0.5686274509803921,0.3333333333333333,0.1411764705882353,0.5725490196078431 + ] + } + } + }, + { + "id":"constant_path_material_solidColor_color", "path":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + 0.4588235294117647,0.5176470588235295,0.5215686274509804,0.9254901960784314 ] } } @@ -1585,15 +1649,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 15,16,17,14 + 158,14,3,86 ] }, "outlineColor":{ "rgba":[ - 19,20,21,18 + 137,101,236,136 ] }, - "outlineWidth":91 + "outlineWidth":11017 } } } @@ -1605,7 +1669,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 23,24,25,22 + 166,131,155,102 ] } } @@ -1619,10 +1683,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 27,28,29,26 + 72,114,200,147 ] }, - "glowPower":92 + "glowPower":42344 } } } @@ -1632,15 +1696,15 @@ "path":{ "material":{ "image":{ - "image":"http://example.com/8", + "image":"http://example.com/31068", "repeat":{ "cartesian2":[ - 45,46 + 48351,63420 ] }, "color":{ "rgba":[ - 31,32,33,30 + 105,166,133,7 ] }, "transparent":true @@ -1655,23 +1719,23 @@ "grid":{ "color":{ "rgba":[ - 35,36,37,34 + 120,196,99,165 ] }, - "cellAlpha":93, + "cellAlpha":41317, "lineCount":{ "cartesian2":[ - 47,48 + 52557,7629 ] }, "lineThickness":{ "cartesian2":[ - 49,50 + 21845,52309 ] }, "lineOffset":{ "cartesian2":[ - 51,52 + 48700,4542 ] } } @@ -1686,28 +1750,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 39,40,41,38 + 20,43,77,229 ] }, "oddColor":{ "rgba":[ - 43,44,45,42 + 157,171,93,187 ] }, - "offset":94, - "repeat":95 + "offset":41305, + "repeat":43637 } } } }, { - "id":"material21", + "id":"constant_path_material_polylineOutline_color", "path":{ "material":{ "polylineOutline":{ "color":{ "rgbaf":[ - 0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843 + 0.058823529411764705,0.08235294117647059,0.9647058823529412,0.3176470588235294 ] } } @@ -1715,13 +1779,13 @@ } }, { - "id":"material22", + "id":"constant_path_material_polylineOutline_outlineColor", "path":{ "material":{ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 + 0.26666666666666666,0.5568627450980392,0.35294117647058826,0.7607843137254902 ] } } @@ -1729,13 +1793,13 @@ } }, { - "id":"material23", + "id":"constant_path_material_polylineArrow_color", "path":{ "material":{ "polylineArrow":{ "color":{ "rgbaf":[ - 0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921 + 0.6274509803921569,0.2784313725490196,0.9725490196078431,0.9215686274509803 ] } } @@ -1743,13 +1807,13 @@ } }, { - "id":"material24", + "id":"constant_path_material_polylineGlow_color", "path":{ "material":{ "polylineGlow":{ "color":{ "rgbaf":[ - 0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 + 0.5843137254901961,0.01568627450980392,0.32941176470588235,0.27058823529411763 ] } } @@ -1757,13 +1821,13 @@ } }, { - "id":"material25", + "id":"constant_path_material_image_color", "path":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.6039215686274509,0.6078431372549019,0.611764705882353,0.6 + 0.44313725490196076,0.45098039215686275,0.6392156862745098,0.41568627450980394 ] } } @@ -1771,13 +1835,13 @@ } }, { - "id":"material26", + "id":"constant_path_material_grid_color", "path":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 + 0.984313725490196,0.9450980392156862,0.7647058823529411,0.9333333333333333 ] } } @@ -1785,13 +1849,13 @@ } }, { - "id":"material27", + "id":"constant_path_material_stripe_evenColor", "path":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078 + 0.5843137254901961,0.6313725490196078,0.0196078431372549,0.34901960784313724 ] } } @@ -1799,13 +1863,13 @@ } }, { - "id":"material28", + "id":"constant_path_material_stripe_oddColor", "path":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 + 0.23137254901960785,0.21176470588235294,0.9411764705882353,0.5019607843137255 ] } } @@ -1813,53 +1877,53 @@ } }, { - "id":"constant21", + "id":"constant_point_color_rgbaf", "point":{ "color":{ "rgbaf":[ - 0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157 + 0.6627450980392157,0.3176470588235294,0.6431372549019608,0.7058823529411765 ] } } }, { - "id":"constant22", + "id":"constant_point_outlineColor_rgbaf", "point":{ "outlineColor":{ "rgbaf":[ - 0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 + 0.00392156862745098,0.38823529411764707,0.10196078431372549,0.1607843137254902 ] } } }, { - "id":"constant23", + "id":"constant_polygon_hierarchy_cartographicRadians", "polygon":{ "positions":{ "cartographicRadians":[ - 0.433629385640828,1.43362938564083,15,0.292036732051034,1.29203673205103,18 + 0.612948853926511,1.3346715688367,54401,1.1867596160592,0.345663242797974,35811 ] } } }, { - "id":"constant24", + "id":"constant_polygon_hierarchy_cartographicDegrees", "polygon":{ "positions":{ "cartographicDegrees":[ - 19,20,21,22,23,24 + 19,41,50907,28,40,24937 ] } } }, { - "id":"constant25", + "id":"constant_polygon_material_solidColor_color", "polygon":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235 + 0.9803921568627451,0.9058823529411765,0.27450980392156865,0.9725490196078431 ] } } @@ -1871,15 +1935,15 @@ "polygon":{ "material":{ "image":{ - "image":"http://example.com/9", + "image":"http://example.com/3481", "repeat":{ "cartesian2":[ - 53,54 + 29381,10354 ] }, "color":{ "rgba":[ - 47,48,49,46 + 36,184,236,209 ] }, "transparent":true @@ -1894,23 +1958,23 @@ "grid":{ "color":{ "rgba":[ - 51,52,53,50 + 246,64,141,13 ] }, - "cellAlpha":96, + "cellAlpha":986, "lineCount":{ "cartesian2":[ - 55,56 + 26094,44645 ] }, "lineThickness":{ "cartesian2":[ - 57,58 + 30775,17784 ] }, "lineOffset":{ "cartesian2":[ - 59,60 + 58344,3555 ] } } @@ -1925,28 +1989,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 55,56,57,54 + 98,184,45,52 ] }, "oddColor":{ "rgba":[ - 59,60,61,58 + 164,123,182,228 ] }, - "offset":97, - "repeat":98 + "offset":12114, + "repeat":60350 } } } }, { - "id":"material29", + "id":"constant_polygon_material_image_color", "polygon":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 + 0.6745098039215687,0.8,0.4117647058823529,0.20784313725490197 ] } } @@ -1954,13 +2018,13 @@ } }, { - "id":"material30", + "id":"constant_polygon_material_grid_color", "polygon":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313 + 0.6039215686274509,0.09411764705882353,0.00784313725490196,0.08627450980392157 ] } } @@ -1968,13 +2032,13 @@ } }, { - "id":"material31", + "id":"constant_polygon_material_stripe_evenColor", "polygon":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 + 0.7725490196078432,0.8666666666666667,0.9647058823529412,0.8627450980392157 ] } } @@ -1982,13 +2046,13 @@ } }, { - "id":"material32", + "id":"constant_polygon_material_stripe_oddColor", "polygon":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392 + 0.8627450980392157,0.0392156862745098,0.4588235294117647,0.596078431372549 ] } } @@ -1996,43 +2060,43 @@ } }, { - "id":"constant26", + "id":"constant_polygon_outlineColor_rgbaf", "polygon":{ "outlineColor":{ "rgbaf":[ - 0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 + 0.10588235294117647,0.4235294117647059,0.6196078431372549,0.9568627450980393 ] } } }, { - "id":"constant27", + "id":"constant_polyline_positions_cartographicRadians", "polyline":{ "positions":{ "cartographicRadians":[ - 1.43805509807655,0.867258771281655,27,1.29646244448676,0.725666117691862,30 + 0.23083587429617,0.738315731088925,41390,0.537259577218533,0.25389340391868,10573 ] } } }, { - "id":"constant28", + "id":"constant_polyline_positions_cartographicDegrees", "polyline":{ "positions":{ "cartographicDegrees":[ - 31,32,33,34,35,36 + 19,5,11802,15,40,39495 ] } } }, { - "id":"constant29", + "id":"constant_polyline_material_solidColor_color", "polyline":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.792156862745098,0.796078431372549,0.8,0.788235294117647 + 0.7647058823529411,0.8941176470588236,0.8745098039215686,0.10588235294117647 ] } } @@ -2046,15 +2110,15 @@ "polylineOutline":{ "color":{ "rgba":[ - 63,64,65,62 + 152,14,11,33 ] }, "outlineColor":{ "rgba":[ - 67,68,69,66 + 222,51,202,92 ] }, - "outlineWidth":99 + "outlineWidth":6879 } } } @@ -2066,7 +2130,7 @@ "polylineArrow":{ "color":{ "rgba":[ - 71,72,73,70 + 82,169,80,107 ] } } @@ -2080,10 +2144,10 @@ "polylineGlow":{ "color":{ "rgba":[ - 75,76,77,74 + 59,125,181,171 ] }, - "glowPower":100 + "glowPower":41345 } } } @@ -2093,15 +2157,15 @@ "polyline":{ "material":{ "image":{ - "image":"http://example.com/10", + "image":"http://example.com/29020", "repeat":{ "cartesian2":[ - 61,62 + 8980,60451 ] }, "color":{ "rgba":[ - 79,80,81,78 + 46,136,39,94 ] }, "transparent":true @@ -2116,23 +2180,23 @@ "grid":{ "color":{ "rgba":[ - 83,84,85,82 + 157,57,26,26 ] }, - "cellAlpha":101, + "cellAlpha":27197, "lineCount":{ "cartesian2":[ - 63,64 + 17878,15173 ] }, "lineThickness":{ "cartesian2":[ - 65,66 + 64504,24571 ] }, "lineOffset":{ "cartesian2":[ - 67,68 + 51933,9674 ] } } @@ -2147,28 +2211,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 87,88,89,86 + 98,239,47,132 ] }, "oddColor":{ "rgba":[ - 91,92,93,90 + 41,198,29,144 ] }, - "offset":102, - "repeat":103 + "offset":10077, + "repeat":31817 } } } }, { - "id":"material33", + "id":"constant_polyline_material_polylineOutline_color", "polyline":{ "material":{ "polylineOutline":{ "color":{ "rgbaf":[ - 0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 + 0.45098039215686275,0.8901960784313725,0.403921568627451,0.1607843137254902 ] } } @@ -2176,13 +2240,13 @@ } }, { - "id":"material34", + "id":"constant_polyline_material_polylineOutline_outlineColor", "polyline":{ "material":{ "polylineOutline":{ "outlineColor":{ "rgbaf":[ - 0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549 + 0.8156862745098039,0.5450980392156862,0.5294117647058824,0.3176470588235294 ] } } @@ -2190,13 +2254,13 @@ } }, { - "id":"material35", + "id":"constant_polyline_material_polylineArrow_color", "polyline":{ "material":{ "polylineArrow":{ "color":{ "rgbaf":[ - 0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 + 0.8313725490196079,0.8235294117647058,0.6313725490196078,0.44313725490196076 ] } } @@ -2204,13 +2268,13 @@ } }, { - "id":"material36", + "id":"constant_polyline_material_polylineGlow_color", "polyline":{ "material":{ "polylineGlow":{ "color":{ "rgbaf":[ - 0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627 + 0.4117647058823529,0.3137254901960784,0.8588235294117647,0.3803921568627451 ] } } @@ -2218,13 +2282,13 @@ } }, { - "id":"material37", + "id":"constant_polyline_material_image_color", "polyline":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 + 0.13333333333333333,0.5529411764705883,0.043137254901960784,0.1843137254901961 ] } } @@ -2232,13 +2296,13 @@ } }, { - "id":"material38", + "id":"constant_polyline_material_grid_color", "polyline":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706 + 0.1411764705882353,0.8235294117647058,0.5882352941176471,0.5607843137254902 ] } } @@ -2246,13 +2310,13 @@ } }, { - "id":"material39", + "id":"constant_polyline_material_stripe_evenColor", "polyline":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 + 0.6470588235294118,0.8627450980392157,0.12941176470588237,0.7803921568627451 ] } } @@ -2260,13 +2324,13 @@ } }, { - "id":"material40", + "id":"constant_polyline_material_stripe_oddColor", "polyline":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784 + 0.2901960784313726,0.7803921568627451,0.07058823529411765,0.2784313725490196 ] } } @@ -2274,23 +2338,23 @@ } }, { - "id":"constant30", + "id":"constant_rectangle_coordinates_wsenDegrees", "rectangle":{ "coordinates":{ "wsenDegrees":[ - 5,6,7,8 + 42,22,5,35 ] } } }, { - "id":"constant31", + "id":"constant_rectangle_material_solidColor_color", "rectangle":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 + 0.8980392156862745,0.8,0.9058823529411765,0.9529411764705882 ] } } @@ -2302,15 +2366,15 @@ "rectangle":{ "material":{ "image":{ - "image":"http://example.com/11", + "image":"http://example.com/18033", "repeat":{ "cartesian2":[ - 69,70 + 41461,31905 ] }, "color":{ "rgba":[ - 95,96,97,94 + 93,203,88,125 ] }, "transparent":true @@ -2325,23 +2389,23 @@ "grid":{ "color":{ "rgba":[ - 99,100,101,98 + 245,105,152,83 ] }, - "cellAlpha":104, + "cellAlpha":57393, "lineCount":{ "cartesian2":[ - 71,72 + 4947,4627 ] }, "lineThickness":{ "cartesian2":[ - 73,74 + 37424,19602 ] }, "lineOffset":{ "cartesian2":[ - 75,76 + 43685,31658 ] } } @@ -2356,28 +2420,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 103,104,105,102 + 196,12,53,2 ] }, "oddColor":{ "rgba":[ - 107,108,109,106 + 103,243,111,72 ] }, - "offset":105, - "repeat":106 + "offset":26578, + "repeat":52842 } } } }, { - "id":"material41", + "id":"constant_rectangle_material_image_color", "rectangle":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862 + 0.24705882352941178,0.4980392156862745,0.7411764705882353,0.9686274509803922 ] } } @@ -2385,13 +2449,13 @@ } }, { - "id":"material42", + "id":"constant_rectangle_material_grid_color", "rectangle":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 + 0.4588235294117647,0.06274509803921569,0.8862745098039215,0.8392156862745098 ] } } @@ -2399,13 +2463,13 @@ } }, { - "id":"material43", + "id":"constant_rectangle_material_stripe_evenColor", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941 + 0.5764705882352941,0.3411764705882353,0.611764705882353,0.20784313725490197 ] } } @@ -2413,13 +2477,13 @@ } }, { - "id":"material44", + "id":"constant_rectangle_material_stripe_oddColor", "rectangle":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.996078431372549,0,0.00392156862745098,0.9921568627450981 + 0.8666666666666667,0.9490196078431372,0.06274509803921569,0.0196078431372549 ] } } @@ -2427,43 +2491,43 @@ } }, { - "id":"constant32", + "id":"constant_rectangle_outlineColor_rgbaf", "rectangle":{ "outlineColor":{ "rgbaf":[ - 0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196 + 0.30196078431372547,0.03529411764705882,0.9176470588235294,0.20784313725490197 ] } } }, { - "id":"constant33", + "id":"constant_wall_positions_cartographicRadians", "wall":{ "positions":{ "cartographicRadians":[ - 0.871684483717379,0.300888156922483,39,0.730091830127586,0.159295503332689,42 + 0.990822494752221,0.11729920547879,47975,1.22405890229697,1.46292679641256,13438 ] } } }, { - "id":"constant34", + "id":"constant_wall_positions_cartographicDegrees", "wall":{ "positions":{ "cartographicDegrees":[ - 43,44,45,1,2,48 + 30,24,27738,14,41,41667 ] } } }, { - "id":"constant35", + "id":"constant_wall_material_solidColor_color", "wall":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 + 0.6941176470588235,0.3176470588235294,0.9098039215686274,0.5019607843137255 ] } } @@ -2475,15 +2539,15 @@ "wall":{ "material":{ "image":{ - "image":"http://example.com/12", + "image":"http://example.com/58529", "repeat":{ "cartesian2":[ - 77,78 + 36340,47245 ] }, "color":{ "rgba":[ - 111,112,113,110 + 252,63,12,38 ] }, "transparent":true @@ -2498,23 +2562,23 @@ "grid":{ "color":{ "rgba":[ - 115,116,117,114 + 38,183,237,174 ] }, - "cellAlpha":107, + "cellAlpha":59606, "lineCount":{ "cartesian2":[ - 79,80 + 3079,31244 ] }, "lineThickness":{ "cartesian2":[ - 81,82 + 32099,44157 ] }, "lineOffset":{ "cartesian2":[ - 83,84 + 13529,1844 ] } } @@ -2529,28 +2593,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 119,120,121,118 + 202,190,37,215 ] }, "oddColor":{ "rgba":[ - 123,124,125,122 + 56,107,92,38 ] }, - "offset":108, - "repeat":109 + "offset":34142, + "repeat":33528 } } } }, { - "id":"material45", + "id":"constant_wall_material_image_color", "wall":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098 + 0.34901960784313724,0.8431372549019608,0.2901960784313726,0.043137254901960784 ] } } @@ -2558,13 +2622,13 @@ } }, { - "id":"material46", + "id":"constant_wall_material_grid_color", "wall":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 + 0.7568627450980392,0.9921568627450981,0.9921568627450981,0.4627450980392157 ] } } @@ -2572,13 +2636,13 @@ } }, { - "id":"material47", + "id":"constant_wall_material_stripe_evenColor", "wall":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765 + 0.6901960784313725,0.21176470588235294,0.615686274509804,0.6274509803921569 ] } } @@ -2586,13 +2650,13 @@ } }, { - "id":"material48", + "id":"constant_wall_material_stripe_oddColor", "wall":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 + 0.9686274509803922,0.3686274509803922,0.2196078431372549,0.00392156862745098 ] } } @@ -2600,33 +2664,33 @@ } }, { - "id":"constant36", + "id":"constant_wall_outlineColor_rgbaf", "wall":{ "outlineColor":{ "rgbaf":[ - 0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549 + 0.5647058823529412,0.6784313725490196,0.7647058823529411,0.8117647058823529 ] } } }, { - "id":"constant37", + "id":"constant_agi_conicSensor_intersectionColor_rgbaf", "agi_conicSensor":{ "intersectionColor":{ "rgbaf":[ - 0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 + 0.9568627450980393,0.3333333333333333,0.6431372549019608,0.43137254901960786 ] } } }, { - "id":"constant38", + "id":"constant_conicSensor_lateralSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333 + 0.6941176470588235,0.21176470588235294,0.3686274509803922,0.24705882352941178 ] } } @@ -2638,15 +2702,15 @@ "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/13", + "image":"http://example.com/21823", "repeat":{ "cartesian2":[ - 85,86 + 25181,35938 ] }, "color":{ "rgba":[ - 127,128,129,126 + 67,8,98,44 ] }, "transparent":true @@ -2661,23 +2725,23 @@ "grid":{ "color":{ "rgba":[ - 131,132,133,130 + 61,0,183,35 ] }, - "cellAlpha":110, + "cellAlpha":51635, "lineCount":{ "cartesian2":[ - 87,88 + 2156,25864 ] }, "lineThickness":{ "cartesian2":[ - 89,90 + 33546,23683 ] }, "lineOffset":{ "cartesian2":[ - 91,92 + 38184,24725 ] } } @@ -2692,28 +2756,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 135,136,137,134 + 15,60,203,52 ] }, "oddColor":{ "rgba":[ - 139,140,141,138 + 32,223,184,18 ] }, - "offset":111, - "repeat":112 + "offset":5179, + "repeat":19988 } } } }, { - "id":"material49", + "id":"constant_conicSensor_lateralSurfaceMaterial_image_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 + 0.6392156862745098,0.6039215686274509,0.596078431372549,0.5098039215686274 ] } } @@ -2721,13 +2785,13 @@ } }, { - "id":"material50", + "id":"constant_conicSensor_lateralSurfaceMaterial_grid_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117 + 0.5686274509803921,0.12941176470588237,0.2196078431372549,0.0784313725490196 ] } } @@ -2735,13 +2799,13 @@ } }, { - "id":"material51", + "id":"constant_conicSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 + 0.44313725490196076,0.4980392156862745,0.596078431372549,0.7058823529411765 ] } } @@ -2749,13 +2813,13 @@ } }, { - "id":"material52", + "id":"constant_conicSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902 + 0.12549019607843137,0.45098039215686275,0.6078431372549019,0.5686274509803921 ] } } @@ -2763,13 +2827,13 @@ } }, { - "id":"constant39", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 + 0.07450980392156863,0.23921568627450981,0.3607843137254902,0.788235294117647 ] } } @@ -2781,15 +2845,15 @@ "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/14", + "image":"http://example.com/3660", "repeat":{ "cartesian2":[ - 93,94 + 21421,10579 ] }, "color":{ "rgba":[ - 143,144,145,142 + 6,107,206,126 ] }, "transparent":true @@ -2804,23 +2868,23 @@ "grid":{ "color":{ "rgba":[ - 147,148,149,146 + 4,151,187,61 ] }, - "cellAlpha":113, + "cellAlpha":59779, "lineCount":{ "cartesian2":[ - 95,96 + 10702,63785 ] }, "lineThickness":{ "cartesian2":[ - 97,98 + 38065,47764 ] }, "lineOffset":{ "cartesian2":[ - 99,100 + 49821,31938 ] } } @@ -2835,28 +2899,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 151,152,153,150 + 86,123,192,5 ] }, "oddColor":{ "rgba":[ - 155,156,157,154 + 7,238,130,191 ] }, - "offset":114, - "repeat":115 + "offset":4651, + "repeat":23937 } } } }, { - "id":"material53", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686 + 0.6470588235294118,0.49019607843137253,0.7019607843137254,0.00784313725490196 ] } } @@ -2864,13 +2928,13 @@ } }, { - "id":"material54", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 + 0.1411764705882353,0.3058823529411765,0.1450980392156863,0.12549019607843137 ] } } @@ -2878,13 +2942,13 @@ } }, { - "id":"material55", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473 + 0.17647058823529413,0.8784313725490196,0.13725490196078433,0.6901960784313725 ] } } @@ -2892,13 +2956,13 @@ } }, { - "id":"material56", + "id":"constant_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 + 0.4549019607843137,0.6196078431372549,0.11372549019607843,0.8588235294117647 ] } } @@ -2906,13 +2970,13 @@ } }, { - "id":"constant40", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726 + 0.13725490196078433,0.9058823529411765,0.8274509803921568,0.2980392156862745 ] } } @@ -2924,15 +2988,15 @@ "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/15", + "image":"http://example.com/42334", "repeat":{ "cartesian2":[ - 101,102 + 35010,3208 ] }, "color":{ "rgba":[ - 159,160,161,158 + 139,142,32,175 ] }, "transparent":true @@ -2947,23 +3011,23 @@ "grid":{ "color":{ "rgba":[ - 163,164,165,162 + 13,160,236,34 ] }, - "cellAlpha":116, + "cellAlpha":16915, "lineCount":{ "cartesian2":[ - 103,104 + 55175,19927 ] }, "lineThickness":{ "cartesian2":[ - 105,106 + 19695,1356 ] }, "lineOffset":{ "cartesian2":[ - 107,108 + 20937,31057 ] } } @@ -2978,28 +3042,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 167,168,169,166 + 55,198,189,25 ] }, "oddColor":{ "rgba":[ - 171,172,173,170 + 228,141,11,198 ] }, - "offset":117, - "repeat":118 + "offset":5749, + "repeat":65092 } } } }, { - "id":"material57", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 + 0.34901960784313724,0.7490196078431373,0.25098039215686274,0.8470588235294118 ] } } @@ -3007,13 +3071,13 @@ } }, { - "id":"material58", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804 + 0.19215686274509805,0.11764705882352941,0.1411764705882353,0.8627450980392157 ] } } @@ -3021,13 +3085,13 @@ } }, { - "id":"material59", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 + 0.8823529411764706,0.6862745098039216,0.7803921568627451,0.11372549019607843 ] } } @@ -3035,13 +3099,13 @@ } }, { - "id":"material60", + "id":"constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826 + 0.39215686274509803,0.8627450980392157,0.8470588235294118,0.3333333333333333 ] } } @@ -3049,13 +3113,13 @@ } }, { - "id":"constant41", + "id":"constant_conicSensor_domeSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 + 0.10980392156862745,0.9254901960784314,0.1803921568627451,0.3137254901960784 ] } } @@ -3067,15 +3131,15 @@ "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/16", + "image":"http://example.com/32043", "repeat":{ "cartesian2":[ - 109,110 + 47952,25019 ] }, "color":{ "rgba":[ - 175,176,177,174 + 116,1,117,93 ] }, "transparent":true @@ -3090,23 +3154,23 @@ "grid":{ "color":{ "rgba":[ - 179,180,181,178 + 85,86,101,143 ] }, - "cellAlpha":119, + "cellAlpha":15766, "lineCount":{ "cartesian2":[ - 111,112 + 60249,20459 ] }, "lineThickness":{ "cartesian2":[ - 113,114 + 14212,1847 ] }, "lineOffset":{ "cartesian2":[ - 115,116 + 47595,2489 ] } } @@ -3121,28 +3185,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 183,184,185,182 + 99,63,25,77 ] }, "oddColor":{ "rgba":[ - 187,188,189,186 + 196,159,121,70 ] }, - "offset":120, - "repeat":121 + "offset":3098, + "repeat":62080 } } } }, { - "id":"material61", + "id":"constant_conicSensor_domeSurfaceMaterial_image_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961 + 0.5843137254901961,0.18823529411764706,0.5882352941176471,0.011764705882352941 ] } } @@ -3150,13 +3214,13 @@ } }, { - "id":"material62", + "id":"constant_conicSensor_domeSurfaceMaterial_grid_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 + 0.23921568627450981,0.4980392156862745,0.4117647058823529,0.803921568627451 ] } } @@ -3164,13 +3228,13 @@ } }, { - "id":"material63", + "id":"constant_conicSensor_domeSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394 + 0.5176470588235295,0.20784313725490197,0.4745098039215686,0.9764705882352941 ] } } @@ -3178,13 +3242,13 @@ } }, { - "id":"material64", + "id":"constant_conicSensor_domeSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 + 0.8823529411764706,0.2235294117647059,0.9411764705882353,0.6509803921568628 ] } } @@ -3192,13 +3256,13 @@ } }, { - "id":"constant42", + "id":"constant_conicSensor_environmentOcclusionMaterial_solidColor_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118 + 0.5137254901960784,0.17647058823529413,0.8431372549019608,0.011764705882352941 ] } } @@ -3210,15 +3274,15 @@ "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/17", + "image":"http://example.com/37360", "repeat":{ "cartesian2":[ - 117,118 + 9889,48166 ] }, "color":{ "rgba":[ - 191,192,193,190 + 154,113,32,175 ] }, "transparent":true @@ -3233,23 +3297,23 @@ "grid":{ "color":{ "rgba":[ - 195,196,197,194 + 133,84,224,205 ] }, - "cellAlpha":122, + "cellAlpha":34722, "lineCount":{ "cartesian2":[ - 119,120 + 3975,47375 ] }, "lineThickness":{ "cartesian2":[ - 121,122 + 39364,37529 ] }, "lineOffset":{ "cartesian2":[ - 123,124 + 3660,28430 ] } } @@ -3264,28 +3328,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 199,200,201,198 + 63,231,182,22 ] }, "oddColor":{ "rgba":[ - 203,204,205,202 + 145,64,200,90 ] }, - "offset":123, - "repeat":124 + "offset":30686, + "repeat":53567 } } } }, { - "id":"material65", + "id":"constant_conicSensor_environmentOcclusionMaterial_image_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 + 0.8823529411764706,0.9490196078431372,0.47843137254901963,0.15294117647058825 ] } } @@ -3293,13 +3357,13 @@ } }, { - "id":"material66", + "id":"constant_conicSensor_environmentOcclusionMaterial_grid_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963 + 0.4823529411764706,0.054901960784313725,0.2549019607843137,0.9450980392156862 ] } } @@ -3307,13 +3371,13 @@ } }, { - "id":"material67", + "id":"constant_conicSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 + 0.07058823529411765,0.2627450980392157,0.8392156862745098,0.24313725490196078 ] } } @@ -3321,13 +3385,13 @@ } }, { - "id":"material68", + "id":"constant_conicSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274 + 0.0784313725490196,0.5450980392156862,0.5254901960784314,0.592156862745098 ] } } @@ -3335,63 +3399,63 @@ } }, { - "id":"constant43", + "id":"constant_agi_conicSensor_environmentIntersectionColor_rgbaf", "agi_conicSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 + 0.9372549019607843,0.5098039215686274,0.23529411764705882,0.38823529411764707 ] } } }, { - "id":"constant44", + "id":"constant_agi_customPatternSensor_directions_unitSpherical", "agi_customPatternSensor":{ "directions":{ "unitSpherical":[ - 1,2,3,4 + 47421,31161,31609,11387 ] } } }, { - "id":"constant45", + "id":"constant_agi_customPatternSensor_directions_cartesian", "agi_customPatternSensor":{ "directions":{ "cartesian":[ - 25,26,27,28,29,30 + 22239,54614,35029,5768,61974,38386 ] } } }, { - "id":"constant46", + "id":"constant_agi_customPatternSensor_directions_unitCartesian", "agi_customPatternSensor":{ "directions":{ "unitCartesian":[ - 0.26726124191242406,0.5345224838248491,0.8017837257372731,0.4558423058385518,0.5698028822981898,0.6837634587578276 + 0.4878261102190049,0.8708200715109468,0.06081191694285649,0.532391171359761,0.837660156389704,0.122004520634927 ] } } }, { - "id":"constant47", + "id":"constant_agi_customPatternSensor_intersectionColor_rgbaf", "agi_customPatternSensor":{ "intersectionColor":{ "rgbaf":[ - 0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353 + 0.5215686274509804,0.37254901960784315,0.2980392156862745,0.9490196078431372 ] } } }, { - "id":"constant48", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 + 0.9333333333333333,0.792156862745098,0.1450980392156863,0.8862745098039215 ] } } @@ -3403,15 +3467,15 @@ "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/18", + "image":"http://example.com/43097", "repeat":{ "cartesian2":[ - 125,126 + 52089,65227 ] }, "color":{ "rgba":[ - 207,208,209,206 + 43,75,177,17 ] }, "transparent":true @@ -3426,23 +3490,23 @@ "grid":{ "color":{ "rgba":[ - 211,212,213,210 + 31,237,211,220 ] }, - "cellAlpha":125, + "cellAlpha":54409, "lineCount":{ "cartesian2":[ - 127,128 + 60604,52716 ] }, "lineThickness":{ "cartesian2":[ - 129,130 + 35445,54154 ] }, "lineOffset":{ "cartesian2":[ - 131,132 + 60273,55787 ] } } @@ -3457,28 +3521,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 215,216,217,214 + 126,117,233,95 ] }, "oddColor":{ "rgba":[ - 219,220,221,218 + 156,140,249,65 ] }, - "offset":126, - "repeat":127 + "offset":63167, + "repeat":18519 } } } }, { - "id":"material69", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_image_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431 + 0.34509803921568627,0.6705882352941176,0.6588235294117647,0.5176470588235295 ] } } @@ -3486,13 +3550,13 @@ } }, { - "id":"material70", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.592156862745098,0.596078431372549,0.6,0.5882352941176471 + 0.047058823529411764,0.3254901960784314,0.9254901960784314,0.20784313725490197 ] } } @@ -3500,13 +3564,13 @@ } }, { - "id":"material71", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509 + 0.21568627450980393,0.7411764705882353,0.8823529411764706,0.12941176470588237 ] } } @@ -3514,13 +3578,13 @@ } }, { - "id":"material72", + "id":"constant_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 + 0.7294117647058823,0.5372549019607843,0.6941176470588235,0.12549019607843137 ] } } @@ -3528,13 +3592,13 @@ } }, { - "id":"constant49", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588 + 0.1803921568627451,0.8392156862745098,0.2196078431372549,0.10980392156862745 ] } } @@ -3546,15 +3610,15 @@ "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/19", + "image":"http://example.com/53957", "repeat":{ "cartesian2":[ - 133,134 + 54128,19667 ] }, "color":{ "rgba":[ - 223,224,225,222 + 197,165,19,139 ] }, "transparent":true @@ -3569,23 +3633,23 @@ "grid":{ "color":{ "rgba":[ - 227,228,229,226 + 112,146,248,160 ] }, - "cellAlpha":128, + "cellAlpha":44766, "lineCount":{ "cartesian2":[ - 135,136 + 30524,42103 ] }, "lineThickness":{ "cartesian2":[ - 137,138 + 11464,16684 ] }, "lineOffset":{ "cartesian2":[ - 139,140 + 23594,33884 ] } } @@ -3600,28 +3664,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 231,232,233,230 + 252,48,62,0 ] }, "oddColor":{ "rgba":[ - 235,236,237,234 + 34,219,166,59 ] }, - "offset":129, - "repeat":130 + "offset":14619, + "repeat":31654 } } } }, { - "id":"material73", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 + 0.10196078431372549,0.9333333333333333,0.2901960784313726,0.8352941176470589 ] } } @@ -3629,13 +3693,13 @@ } }, { - "id":"material74", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666 + 0.3686274509803922,0.03529411764705882,0.4627450980392157,0.4196078431372549 ] } } @@ -3643,13 +3707,13 @@ } }, { - "id":"material75", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 + 0.2784313725490196,0.792156862745098,0.6313725490196078,0.43529411764705883 ] } } @@ -3657,13 +3721,13 @@ } }, { - "id":"material76", + "id":"constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745 + 0.27058823529411763,0.2196078431372549,0.8196078431372549,0.13725490196078433 ] } } @@ -3671,13 +3735,13 @@ } }, { - "id":"constant50", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 + 0.1843137254901961,0.6941176470588235,0.9372549019607843,0.023529411764705882 ] } } @@ -3689,15 +3753,15 @@ "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/20", + "image":"http://example.com/17353", "repeat":{ "cartesian2":[ - 141,142 + 55611,32217 ] }, "color":{ "rgba":[ - 239,240,241,238 + 86,76,232,146 ] }, "transparent":true @@ -3712,23 +3776,23 @@ "grid":{ "color":{ "rgba":[ - 243,244,245,242 + 196,96,175,103 ] }, - "cellAlpha":131, + "cellAlpha":37213, "lineCount":{ "cartesian2":[ - 143,144 + 44500,4781 ] }, "lineThickness":{ "cartesian2":[ - 145,146 + 30042,49013 ] }, "lineOffset":{ "cartesian2":[ - 147,148 + 37409,34962 ] } } @@ -3743,28 +3807,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 247,248,249,246 + 73,110,9,101 ] }, "oddColor":{ "rgba":[ - 251,252,253,250 + 249,200,205,202 ] }, - "offset":132, - "repeat":133 + "offset":28340, + "repeat":34666 } } } }, { - "id":"material77", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823 + 0.21176470588235294,0.12941176470588237,0.5764705882352941,0.3843137254901961 ] } } @@ -3772,13 +3836,13 @@ } }, { - "id":"material78", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 + 0.12549019607843137,0.7450980392156863,0.21176470588235294,0.4745098039215686 ] } } @@ -3786,13 +3850,13 @@ } }, { - "id":"material79", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902 + 0.2784313725490196,0.1568627450980392,0.047058823529411764,0.9882352941176471 ] } } @@ -3800,13 +3864,13 @@ } }, { - "id":"material80", + "id":"constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 + 0.788235294117647,0.6392156862745098,0.8862745098039215,0.12941176470588237 ] } } @@ -3814,13 +3878,13 @@ } }, { - "id":"constant51", + "id":"constant_customPatternSensor_domeSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.796078431372549,0.8,0.803921568627451,0.792156862745098 + 0.1803921568627451,0.30196078431372547,0.22745098039215686,0.16862745098039217 ] } } @@ -3832,15 +3896,15 @@ "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/21", + "image":"http://example.com/30161", "repeat":{ "cartesian2":[ - 149,150 + 35321,31113 ] }, "color":{ "rgba":[ - 0,1,2,254 + 65,246,253,233 ] }, "transparent":true @@ -3855,23 +3919,23 @@ "grid":{ "color":{ "rgba":[ - 4,5,6,3 + 77,194,210,132 ] }, - "cellAlpha":134, + "cellAlpha":54307, "lineCount":{ "cartesian2":[ - 151,152 + 24794,1120 ] }, "lineThickness":{ "cartesian2":[ - 153,154 + 63618,58104 ] }, "lineOffset":{ "cartesian2":[ - 155,156 + 58084,43234 ] } } @@ -3886,28 +3950,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 8,9,10,7 + 48,139,176,154 ] }, "oddColor":{ "rgba":[ - 12,13,14,11 + 237,89,130,61 ] }, - "offset":135, - "repeat":136 + "offset":64570, + "repeat":64333 } } } }, { - "id":"material81", + "id":"constant_customPatternSensor_domeSurfaceMaterial_image_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 + 0.4823529411764706,0.4980392156862745,0.8117647058823529,0.9647058823529412 ] } } @@ -3915,13 +3979,13 @@ } }, { - "id":"material82", + "id":"constant_customPatternSensor_domeSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058 + 0.5372549019607843,0.30196078431372547,0.07450980392156863,0.17647058823529413 ] } } @@ -3929,13 +3993,13 @@ } }, { - "id":"material83", + "id":"constant_customPatternSensor_domeSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 + 0.4,0.09411764705882353,0.4823529411764706,0.792156862745098 ] } } @@ -3943,13 +4007,13 @@ } }, { - "id":"material84", + "id":"constant_customPatternSensor_domeSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137 + 0.8627450980392157,0.44313725490196076,0.6509803921568628,0.34901960784313724 ] } } @@ -3957,13 +4021,13 @@ } }, { - "id":"constant52", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_solidColor_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 + 0.6470588235294118,0.9882352941176471,0.4470588235294118,0.1803921568627451 ] } } @@ -3975,15 +4039,15 @@ "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/22", + "image":"http://example.com/43990", "repeat":{ "cartesian2":[ - 157,158 + 15786,37437 ] }, "color":{ "rgba":[ - 16,17,18,15 + 194,23,148,35 ] }, "transparent":true @@ -3998,23 +4062,23 @@ "grid":{ "color":{ "rgba":[ - 20,21,22,19 + 53,92,100,103 ] }, - "cellAlpha":137, + "cellAlpha":61818, "lineCount":{ "cartesian2":[ - 159,160 + 16838,19777 ] }, "lineThickness":{ "cartesian2":[ - 161,162 + 18042,19782 ] }, "lineOffset":{ "cartesian2":[ - 163,164 + 63892,17401 ] } } @@ -4029,28 +4093,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 24,25,26,23 + 240,118,45,44 ] }, "oddColor":{ "rgba":[ - 28,29,30,27 + 73,99,195,45 ] }, - "offset":138, - "repeat":139 + "offset":48052, + "repeat":39502 } } } }, { - "id":"material85", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_image_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215 + 0.054901960784313725,0.6901960784313725,0.3333333333333333,0.792156862745098 ] } } @@ -4058,13 +4122,13 @@ } }, { - "id":"material86", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_grid_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 + 0.4196078431372549,0.596078431372549,0.2,0.16862745098039217 ] } } @@ -4072,13 +4136,13 @@ } }, { - "id":"material87", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294 + 0.5019607843137255,0.8784313725490196,0.984313725490196,0.1568627450980392 ] } } @@ -4086,13 +4150,13 @@ } }, { - "id":"material88", + "id":"constant_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 + 0.1803921568627451,0.7215686274509804,0.10196078431372549,0.7058823529411765 ] } } @@ -4100,33 +4164,33 @@ } }, { - "id":"constant53", + "id":"constant_agi_customPatternSensor_environmentIntersectionColor_rgbaf", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372 + 0.36470588235294116,0.8823529411764706,0.4666666666666667,0.9137254901960784 ] } } }, { - "id":"constant54", + "id":"constant_agi_rectangularSensor_intersectionColor_rgbaf", "agi_rectangularSensor":{ "intersectionColor":{ "rgbaf":[ - 0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 + 0.10588235294117647,0.4627450980392157,0.4392156862745098,0.20392156862745098 ] } } }, { - "id":"constant55", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451 + 0.8823529411764706,0.8980392156862745,0.47058823529411764,0.6666666666666666 ] } } @@ -4138,15 +4202,15 @@ "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ - "image":"http://example.com/23", + "image":"http://example.com/43004", "repeat":{ "cartesian2":[ - 165,166 + 62347,2291 ] }, "color":{ "rgba":[ - 32,33,34,31 + 117,86,172,66 ] }, "transparent":true @@ -4161,23 +4225,23 @@ "grid":{ "color":{ "rgba":[ - 36,37,38,35 + 137,21,181,20 ] }, - "cellAlpha":140, + "cellAlpha":7977, "lineCount":{ "cartesian2":[ - 167,168 + 38214,27541 ] }, "lineThickness":{ "cartesian2":[ - 169,170 + 15407,35132 ] }, "lineOffset":{ "cartesian2":[ - 171,172 + 15638,41789 ] } } @@ -4192,28 +4256,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 40,41,42,39 + 32,87,110,222 ] }, "oddColor":{ "rgba":[ - 44,45,46,43 + 90,108,154,48 ] }, - "offset":141, - "repeat":142 + "offset":1333, + "repeat":28338 } } } }, { - "id":"material89", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_image_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.996078431372549 + 0.6666666666666666,0.1843137254901961,0.8470588235294118,0.7803921568627451 ] } } @@ -4221,13 +4285,13 @@ } }, { - "id":"material90", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941 + 0.6980392156862745,0.4823529411764706,0.803921568627451,0.8784313725490196 ] } } @@ -4235,13 +4299,13 @@ } }, { - "id":"material91", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 + 0.21176470588235294,0.8,0.5254901960784314,0.47843137254901963 ] } } @@ -4249,13 +4313,13 @@ } }, { - "id":"material92", + "id":"constant_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784 + 0.2627450980392157,0.21176470588235294,0.8196078431372549,0.4666666666666667 ] } } @@ -4263,13 +4327,13 @@ } }, { - "id":"constant56", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 + 0.13725490196078433,0.6039215686274509,0.9803921568627451,0.2 ] } } @@ -4281,15 +4345,15 @@ "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ - "image":"http://example.com/24", + "image":"http://example.com/9645", "repeat":{ "cartesian2":[ - 173,174 + 32574,59007 ] }, "color":{ "rgba":[ - 48,49,50,47 + 45,73,29,164 ] }, "transparent":true @@ -4304,23 +4368,23 @@ "grid":{ "color":{ "rgba":[ - 52,53,54,51 + 20,238,183,85 ] }, - "cellAlpha":143, + "cellAlpha":9816, "lineCount":{ "cartesian2":[ - 175,176 + 638,49922 ] }, "lineThickness":{ "cartesian2":[ - 177,178 + 33475,32898 ] }, "lineOffset":{ "cartesian2":[ - 179,180 + 27656,20076 ] } } @@ -4335,28 +4399,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 56,57,58,55 + 24,90,119,189 ] }, "oddColor":{ "rgba":[ - 60,61,62,59 + 205,98,105,209 ] }, - "offset":144, - "repeat":145 + "offset":37589, + "repeat":65125 } } } }, { - "id":"material93", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863 + 0.2901960784313726,0.10196078431372549,0.4627450980392157,0.9607843137254902 ] } } @@ -4364,13 +4428,13 @@ } }, { - "id":"material94", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 + 0.6549019607843137,0.2627450980392157,0.6235294117647059,0.0196078431372549 ] } } @@ -4378,13 +4442,13 @@ } }, { - "id":"material95", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647 + 0.7176470588235294,0.8901960784313725,0,0.30196078431372547 ] } } @@ -4392,13 +4456,13 @@ } }, { - "id":"material96", + "id":"constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 + 0.10196078431372549,0.611764705882353,0.8235294117647058,0.00784313725490196 ] } } @@ -4406,13 +4470,13 @@ } }, { - "id":"constant57", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433 + 0.023529411764705882,0.6313725490196078,0.30980392156862746,0.6705882352941176 ] } } @@ -4424,15 +4488,15 @@ "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ - "image":"http://example.com/25", + "image":"http://example.com/24029", "repeat":{ "cartesian2":[ - 181,182 + 25949,5221 ] }, "color":{ "rgba":[ - 64,65,66,63 + 250,150,27,141 ] }, "transparent":true @@ -4447,23 +4511,23 @@ "grid":{ "color":{ "rgba":[ - 68,69,70,67 + 72,123,65,214 ] }, - "cellAlpha":146, + "cellAlpha":64262, "lineCount":{ "cartesian2":[ - 183,184 + 55649,41177 ] }, "lineThickness":{ "cartesian2":[ - 185,186 + 9279,32036 ] }, "lineOffset":{ "cartesian2":[ - 187,188 + 22057,32854 ] } } @@ -4478,28 +4542,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 72,73,74,71 + 232,205,141,211 ] }, "oddColor":{ "rgba":[ - 76,77,78,75 + 213,74,9,194 ] }, - "offset":147, - "repeat":148 + "offset":27981, + "repeat":35510 } } } }, { - "id":"material97", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 + 0.7254901960784313,0.8666666666666667,0.49019607843137253,0.8352941176470589 ] } } @@ -4507,13 +4571,13 @@ } }, { - "id":"material98", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217 + 0.49411764705882355,0.2784313725490196,0.7490196078431373,0.9647058823529412 ] } } @@ -4521,13 +4585,13 @@ } }, { - "id":"material99", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 + 0.7176470588235294,0.6392156862745098,0.7019607843137254,0.3764705882352941 ] } } @@ -4535,13 +4599,13 @@ } }, { - "id":"material100", + "id":"constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2 + 0.788235294117647,0.5372549019607843,0.1568627450980392,0.20392156862745098 ] } } @@ -4549,13 +4613,13 @@ } }, { - "id":"constant58", + "id":"constant_rectangularSensor_domeSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 + 0.15294117647058825,0.9450980392156862,0.5254901960784314,0.5764705882352941 ] } } @@ -4567,15 +4631,15 @@ "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ - "image":"http://example.com/26", + "image":"http://example.com/39720", "repeat":{ "cartesian2":[ - 189,190 + 36759,34959 ] }, "color":{ "rgba":[ - 80,81,82,79 + 93,221,12,137 ] }, "transparent":true @@ -4590,23 +4654,23 @@ "grid":{ "color":{ "rgba":[ - 84,85,86,83 + 117,242,182,185 ] }, - "cellAlpha":149, + "cellAlpha":58215, "lineCount":{ "cartesian2":[ - 191,192 + 12463,42544 ] }, "lineThickness":{ "cartesian2":[ - 193,194 + 56378,63452 ] }, "lineOffset":{ "cartesian2":[ - 195,196 + 33185,51585 ] } } @@ -4621,28 +4685,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 88,89,90,87 + 99,109,104,142 ] }, "oddColor":{ "rgba":[ - 92,93,94,91 + 144,89,171,94 ] }, - "offset":150, - "repeat":151 + "offset":55592, + "repeat":20225 } } } }, { - "id":"material101", + "id":"constant_rectangularSensor_domeSurfaceMaterial_image_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785 + 0.0784313725490196,0.8666666666666667,0.7058823529411765,0.4117647058823529 ] } } @@ -4650,13 +4714,13 @@ } }, { - "id":"material102", + "id":"constant_rectangularSensor_domeSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 + 0.7294117647058823,0.6431372549019608,0.6392156862745098,0.4392156862745098 ] } } @@ -4664,13 +4728,13 @@ } }, { - "id":"material103", + "id":"constant_rectangularSensor_domeSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157 + 0.6431372549019608,0.8470588235294118,0.19607843137254902,0.3137254901960784 ] } } @@ -4678,13 +4742,13 @@ } }, { - "id":"material104", + "id":"constant_rectangularSensor_domeSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 + 0.9411764705882353,0.6313725490196078,0.7058823529411765,0.49411764705882355 ] } } @@ -4692,13 +4756,13 @@ } }, { - "id":"constant59", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_solidColor_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "rgbaf":[ - 0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354 + 0.2823529411764706,0.18823529411764706,0.7843137254901961,0.7215686274509804 ] } } @@ -4710,15 +4774,15 @@ "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ - "image":"http://example.com/27", + "image":"http://example.com/22276", "repeat":{ "cartesian2":[ - 197,198 + 24100,51550 ] }, "color":{ "rgba":[ - 96,97,98,95 + 11,6,155,54 ] }, "transparent":true @@ -4733,23 +4797,23 @@ "grid":{ "color":{ "rgba":[ - 100,101,102,99 + 212,195,41,10 ] }, - "cellAlpha":152, + "cellAlpha":36411, "lineCount":{ "cartesian2":[ - 199,200 + 46422,32693 ] }, "lineThickness":{ "cartesian2":[ - 201,202 + 48390,49341 ] }, "lineOffset":{ "cartesian2":[ - 203,204 + 8359,23584 ] } } @@ -4764,28 +4828,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 104,105,106,103 + 249,180,43,229 ] }, "oddColor":{ "rgba":[ - 108,109,110,107 + 192,184,121,71 ] }, - "offset":153, - "repeat":154 + "offset":38358, + "repeat":12111 } } } }, { - "id":"material105", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_image_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "rgbaf":[ - 0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 + 0.7686274509803922,0.4196078431372549,0.5294117647058824,0.43137254901960786 ] } } @@ -4793,13 +4857,13 @@ } }, { - "id":"material106", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_grid_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "rgbaf":[ - 0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314 + 0.2,0.21568627450980393,0.6549019607843137,0.396078431372549 ] } } @@ -4807,13 +4871,13 @@ } }, { - "id":"material107", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 + 0.06666666666666667,0.1803921568627451,0.6039215686274509,0.6196078431372549 ] } } @@ -4821,13 +4885,13 @@ } }, { - "id":"material108", + "id":"constant_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392 + 0.21568627450980393,0.6941176470588235,0.38823529411764707,0.4470588235294118 ] } } @@ -4835,53 +4899,53 @@ } }, { - "id":"constant60", + "id":"constant_agi_rectangularSensor_environmentIntersectionColor_rgbaf", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "rgbaf":[ - 0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 + 0.1607843137254902,0.16862745098039217,0.30196078431372547,0.11764705882352941 ] } } }, { - "id":"constant61", + "id":"constant_agi_fan_directions_unitSpherical", "agi_fan":{ "directions":{ "unitSpherical":[ - 5,6,7,8 + 58733,12261,59695,54505 ] } } }, { - "id":"constant62", + "id":"constant_agi_fan_directions_cartesian", "agi_fan":{ "directions":{ "cartesian":[ - 31,32,33,34,35,36 + 26610,54119,64979,9469,6948,56091 ] } } }, { - "id":"constant63", + "id":"constant_agi_fan_directions_unitCartesian", "agi_fan":{ "directions":{ "unitCartesian":[ - 0.5025707110324169,0.5743665268941909,0.6461623427559638,0.5234239225902138,0.5757663148492348,0.6281087071082566 + 0.5116366868952748,0.8586182289997567,0.03166445092130639,0.121216354583563,0.632759881014748,0.76480162680245 ] } } }, { - "id":"constant64", + "id":"constant_fan_material_solidColor_color", "agi_fan":{ "material":{ "solidColor":{ "color":{ "rgbaf":[ - 0.39215686274509803,0.396078431372549,0.4,0.38823529411764707 + 0.26666666666666666,0.5764705882352941,0.23529411764705882,0.592156862745098 ] } } @@ -4893,15 +4957,15 @@ "agi_fan":{ "material":{ "image":{ - "image":"http://example.com/28", + "image":"http://example.com/11768", "repeat":{ "cartesian2":[ - 205,206 + 24583,56160 ] }, "color":{ "rgba":[ - 112,113,114,111 + 173,42,118,148 ] }, "transparent":true @@ -4916,23 +4980,23 @@ "grid":{ "color":{ "rgba":[ - 116,117,118,115 + 41,240,181,146 ] }, - "cellAlpha":155, + "cellAlpha":25319, "lineCount":{ "cartesian2":[ - 207,208 + 32075,36477 ] }, "lineThickness":{ "cartesian2":[ - 209,210 + 10654,41513 ] }, "lineOffset":{ "cartesian2":[ - 211,212 + 16605,57664 ] } } @@ -4947,28 +5011,28 @@ "orientation":"VERTICAL", "evenColor":{ "rgba":[ - 120,121,122,119 + 166,47,64,156 ] }, "oddColor":{ "rgba":[ - 124,125,126,123 + 245,22,105,253 ] }, - "offset":156, - "repeat":157 + "offset":40932, + "repeat":32181 } } } }, { - "id":"material109", + "id":"constant_fan_material_image_color", "agi_fan":{ "material":{ "image":{ "color":{ "rgbaf":[ - 0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 + 0.8901960784313725,0.49019607843137253,0.8705882352941177,0.8352941176470589 ] } } @@ -4976,13 +5040,13 @@ } }, { - "id":"material110", + "id":"constant_fan_material_grid_color", "agi_fan":{ "material":{ "grid":{ "color":{ "rgbaf":[ - 0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549 + 0.5607843137254902,0.403921568627451,0.27450980392156865,0.7215686274509804 ] } } @@ -4990,13 +5054,13 @@ } }, { - "id":"material111", + "id":"constant_fan_material_stripe_evenColor", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "rgbaf":[ - 0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 + 0.12549019607843137,0.8235294117647058,0.34509803921568627,0.9058823529411765 ] } } @@ -5004,13 +5068,13 @@ } }, { - "id":"material112", + "id":"constant_fan_material_stripe_oddColor", "agi_fan":{ "material":{ "stripe":{ "oddColor":{ "rgbaf":[ - 0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275 + 0.9568627450980393,0.5372549019607843,0.9882352941176471,0.7411764705882353 ] } } @@ -5018,51 +5082,51 @@ } }, { - "id":"constant65", + "id":"constant_agi_fan_outlineColor_rgbaf", "agi_fan":{ "outlineColor":{ "rgbaf":[ - 0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 + 0.1607843137254902,0.592156862745098,0.21176470588235294,0.8588235294117647 ] } } }, { - "id":"constant66", + "id":"constant_agi_vector_color_rgbaf", "agi_vector":{ "color":{ "rgbaf":[ - 0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706 + 0.36470588235294116,0.8,0.7490196078431373,0.6745098039215687 ] } } }, { - "id":"constant67", + "id":"constant_agi_vector_direction_unitSpherical", "agi_vector":{ "direction":{ "unitSpherical":[ - 3,4 + 34609,391 ] } } }, { - "id":"constant68", + "id":"constant_agi_vector_direction_cartesian", "agi_vector":{ "direction":{ "cartesian":[ - 25,26,27 + 42919,34215,55429 ] } } }, { - "id":"constant69", + "id":"constant_agi_vector_direction_unitCartesian", "agi_vector":{ "direction":{ "unitCartesian":[ - 0.4558423058385518,0.5698028822981898,0.6837634587578276 + 0.408369179119112,0.647772264783761,0.643137393192543 ] } } @@ -5071,28 +5135,28 @@ "id":"ConstantPosition1", "position":{ "cartesian":[ - 28,29,30 + 48370,3260,44044 ] } }, { "id":"ConstantDouble1", "billboard":{ - "scale":158 + "scale":1155 } }, { "id":"ConstantPosition2", "position":{ "cartesian":[ - 31,32,33 + 2599,10,39168 ] } }, { "id":"ConstantDouble2", "billboard":{ - "scale":159 + "scale":16451 } }, { @@ -5190,6 +5254,9 @@ }, "outlineWidth":{ "reference":"Constant#box.outlineWidth" + }, + "shadows":{ + "reference":"Constant#box.shadows" } }, "corridor":{ @@ -5234,6 +5301,9 @@ }, "outlineWidth":{ "reference":"Constant#corridor.outlineWidth" + }, + "shadows":{ + "reference":"Constant#corridor.shadows" } }, "cylinder":{ @@ -5273,6 +5343,9 @@ }, "slices":{ "reference":"Constant#cylinder.slices" + }, + "shadows":{ + "reference":"Constant#cylinder.shadows" } }, "ellipse":{ @@ -5321,6 +5394,9 @@ }, "numberOfVerticalLines":{ "reference":"Constant#ellipse.numberOfVerticalLines" + }, + "shadows":{ + "reference":"Constant#ellipse.shadows" } }, "ellipsoid":{ @@ -5357,6 +5433,9 @@ }, "subdivisions":{ "reference":"Constant#ellipsoid.subdivisions" + }, + "shadows":{ + "reference":"Constant#ellipsoid.shadows" } }, "label":{ @@ -5375,6 +5454,15 @@ "scale":{ "reference":"Constant#label.scale" }, + "showBackground":{ + "reference":"Constant#label.showBackground" + }, + "backgroundColor":{ + "reference":"Constant#label.backgroundColor" + }, + "backgroundPadding":{ + "reference":"Constant#label.backgroundPadding" + }, "pixelOffset":{ "reference":"Constant#label.pixelOffset" }, @@ -5428,9 +5516,27 @@ "runAnimations":{ "reference":"Constant#model.runAnimations" }, + "shadows":{ + "reference":"Constant#model.shadows" + }, "heightReference":{ "reference":"Constant#model.heightReference" }, + "silhouetteColor":{ + "reference":"Constant#model.silhouetteColor" + }, + "silhouetteSize":{ + "reference":"Constant#model.silhouetteSize" + }, + "color":{ + "reference":"Constant#model.color" + }, + "colorBlendMode":{ + "reference":"Constant#model.colorBlendMode" + }, + "colorBlendAmount":{ + "reference":"Constant#model.colorBlendAmount" + }, "nodeTransformations":{ "referenceProp":{ "translation":{ @@ -5543,6 +5649,9 @@ }, "closeBottom":{ "reference":"Constant#polygon.closeBottom" + }, + "shadows":{ + "reference":"Constant#polygon.shadows" } }, "polyline":{ @@ -5569,6 +5678,9 @@ }, "followSurface":{ "reference":"Constant#polyline.followSurface" + }, + "shadows":{ + "reference":"Constant#polyline.shadows" } }, "rectangle":{ @@ -5617,6 +5729,9 @@ }, "closeBottom":{ "reference":"Constant#rectangle.closeBottom" + }, + "shadows":{ + "reference":"Constant#rectangle.shadows" } }, "wall":{ @@ -5659,6 +5774,9 @@ }, "outlineWidth":{ "reference":"Constant#wall.outlineWidth" + }, + "shadows":{ + "reference":"Constant#wall.shadows" } }, "agi_conicSensor":{ @@ -5977,7 +6095,7 @@ } }, { - "id":"reference1", + "id":"reference_box_material_image", "box":{ "material":{ "image":{ @@ -5998,7 +6116,7 @@ } }, { - "id":"reference2", + "id":"reference_box_material_grid", "box":{ "material":{ "grid":{ @@ -6022,7 +6140,7 @@ } }, { - "id":"reference3", + "id":"reference_box_material_stripe", "box":{ "material":{ "stripe":{ @@ -6046,7 +6164,7 @@ } }, { - "id":"reference4", + "id":"reference_corridor_material_image", "corridor":{ "material":{ "image":{ @@ -6067,7 +6185,7 @@ } }, { - "id":"reference5", + "id":"reference_corridor_material_grid", "corridor":{ "material":{ "grid":{ @@ -6091,7 +6209,7 @@ } }, { - "id":"reference6", + "id":"reference_corridor_material_stripe", "corridor":{ "material":{ "stripe":{ @@ -6115,7 +6233,7 @@ } }, { - "id":"reference7", + "id":"reference_cylinder_material_image", "cylinder":{ "material":{ "image":{ @@ -6136,7 +6254,7 @@ } }, { - "id":"reference8", + "id":"reference_cylinder_material_grid", "cylinder":{ "material":{ "grid":{ @@ -6160,7 +6278,7 @@ } }, { - "id":"reference9", + "id":"reference_cylinder_material_stripe", "cylinder":{ "material":{ "stripe":{ @@ -6184,7 +6302,7 @@ } }, { - "id":"reference10", + "id":"reference_ellipse_material_image", "ellipse":{ "material":{ "image":{ @@ -6205,7 +6323,7 @@ } }, { - "id":"reference11", + "id":"reference_ellipse_material_grid", "ellipse":{ "material":{ "grid":{ @@ -6229,7 +6347,7 @@ } }, { - "id":"reference12", + "id":"reference_ellipse_material_stripe", "ellipse":{ "material":{ "stripe":{ @@ -6253,7 +6371,7 @@ } }, { - "id":"reference13", + "id":"reference_ellipsoid_material_image", "ellipsoid":{ "material":{ "image":{ @@ -6274,7 +6392,7 @@ } }, { - "id":"reference14", + "id":"reference_ellipsoid_material_grid", "ellipsoid":{ "material":{ "grid":{ @@ -6298,7 +6416,7 @@ } }, { - "id":"reference15", + "id":"reference_ellipsoid_material_stripe", "ellipsoid":{ "material":{ "stripe":{ @@ -6322,7 +6440,7 @@ } }, { - "id":"reference16", + "id":"reference_path_material_polylineOutline", "path":{ "material":{ "polylineOutline":{ @@ -6340,7 +6458,7 @@ } }, { - "id":"reference17", + "id":"reference_path_material_polylineArrow", "path":{ "material":{ "polylineArrow":{ @@ -6352,7 +6470,7 @@ } }, { - "id":"reference18", + "id":"reference_path_material_polylineGlow", "path":{ "material":{ "polylineGlow":{ @@ -6367,7 +6485,7 @@ } }, { - "id":"reference19", + "id":"reference_path_material_image", "path":{ "material":{ "image":{ @@ -6388,7 +6506,7 @@ } }, { - "id":"reference20", + "id":"reference_path_material_grid", "path":{ "material":{ "grid":{ @@ -6412,7 +6530,7 @@ } }, { - "id":"reference21", + "id":"reference_path_material_stripe", "path":{ "material":{ "stripe":{ @@ -6436,7 +6554,7 @@ } }, { - "id":"reference22", + "id":"reference_polygon_material_image", "polygon":{ "material":{ "image":{ @@ -6457,7 +6575,7 @@ } }, { - "id":"reference23", + "id":"reference_polygon_material_grid", "polygon":{ "material":{ "grid":{ @@ -6481,7 +6599,7 @@ } }, { - "id":"reference24", + "id":"reference_polygon_material_stripe", "polygon":{ "material":{ "stripe":{ @@ -6505,7 +6623,7 @@ } }, { - "id":"reference25", + "id":"reference_polyline_material_polylineOutline", "polyline":{ "material":{ "polylineOutline":{ @@ -6523,7 +6641,7 @@ } }, { - "id":"reference26", + "id":"reference_polyline_material_polylineArrow", "polyline":{ "material":{ "polylineArrow":{ @@ -6535,7 +6653,7 @@ } }, { - "id":"reference27", + "id":"reference_polyline_material_polylineGlow", "polyline":{ "material":{ "polylineGlow":{ @@ -6550,7 +6668,7 @@ } }, { - "id":"reference28", + "id":"reference_polyline_material_image", "polyline":{ "material":{ "image":{ @@ -6571,7 +6689,7 @@ } }, { - "id":"reference29", + "id":"reference_polyline_material_grid", "polyline":{ "material":{ "grid":{ @@ -6595,7 +6713,7 @@ } }, { - "id":"reference30", + "id":"reference_polyline_material_stripe", "polyline":{ "material":{ "stripe":{ @@ -6619,7 +6737,7 @@ } }, { - "id":"reference31", + "id":"reference_rectangle_material_image", "rectangle":{ "material":{ "image":{ @@ -6640,7 +6758,7 @@ } }, { - "id":"reference32", + "id":"reference_rectangle_material_grid", "rectangle":{ "material":{ "grid":{ @@ -6664,7 +6782,7 @@ } }, { - "id":"reference33", + "id":"reference_rectangle_material_stripe", "rectangle":{ "material":{ "stripe":{ @@ -6688,7 +6806,7 @@ } }, { - "id":"reference34", + "id":"reference_wall_material_image", "wall":{ "material":{ "image":{ @@ -6709,7 +6827,7 @@ } }, { - "id":"reference35", + "id":"reference_wall_material_grid", "wall":{ "material":{ "grid":{ @@ -6733,7 +6851,7 @@ } }, { - "id":"reference36", + "id":"reference_wall_material_stripe", "wall":{ "material":{ "stripe":{ @@ -6757,7 +6875,7 @@ } }, { - "id":"reference37", + "id":"reference_conicSensor_lateralSurfaceMaterial_image", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -6778,7 +6896,7 @@ } }, { - "id":"reference38", + "id":"reference_conicSensor_lateralSurfaceMaterial_grid", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -6802,7 +6920,7 @@ } }, { - "id":"reference39", + "id":"reference_conicSensor_lateralSurfaceMaterial_stripe", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -6826,7 +6944,7 @@ } }, { - "id":"reference40", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -6847,7 +6965,7 @@ } }, { - "id":"reference41", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -6871,7 +6989,7 @@ } }, { - "id":"reference42", + "id":"reference_conicSensor_ellipsoidSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -6895,7 +7013,7 @@ } }, { - "id":"reference43", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -6916,7 +7034,7 @@ } }, { - "id":"reference44", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -6940,7 +7058,7 @@ } }, { - "id":"reference45", + "id":"reference_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -6964,7 +7082,7 @@ } }, { - "id":"reference46", + "id":"reference_conicSensor_domeSurfaceMaterial_image", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -6985,7 +7103,7 @@ } }, { - "id":"reference47", + "id":"reference_conicSensor_domeSurfaceMaterial_grid", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7009,7 +7127,7 @@ } }, { - "id":"reference48", + "id":"reference_conicSensor_domeSurfaceMaterial_stripe", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7033,7 +7151,7 @@ } }, { - "id":"reference49", + "id":"reference_conicSensor_environmentOcclusionMaterial_image", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7054,7 +7172,7 @@ } }, { - "id":"reference50", + "id":"reference_conicSensor_environmentOcclusionMaterial_grid", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7078,7 +7196,7 @@ } }, { - "id":"reference51", + "id":"reference_conicSensor_environmentOcclusionMaterial_stripe", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7102,7 +7220,7 @@ } }, { - "id":"reference52", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_image", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -7123,7 +7241,7 @@ } }, { - "id":"reference53", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_grid", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -7147,7 +7265,7 @@ } }, { - "id":"reference54", + "id":"reference_customPatternSensor_lateralSurfaceMaterial_stripe", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -7171,7 +7289,7 @@ } }, { - "id":"reference55", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -7192,7 +7310,7 @@ } }, { - "id":"reference56", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -7216,7 +7334,7 @@ } }, { - "id":"reference57", + "id":"reference_customPatternSensor_ellipsoidSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -7240,7 +7358,7 @@ } }, { - "id":"reference58", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -7261,7 +7379,7 @@ } }, { - "id":"reference59", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -7285,7 +7403,7 @@ } }, { - "id":"reference60", + "id":"reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -7309,7 +7427,7 @@ } }, { - "id":"reference61", + "id":"reference_customPatternSensor_domeSurfaceMaterial_image", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -7330,7 +7448,7 @@ } }, { - "id":"reference62", + "id":"reference_customPatternSensor_domeSurfaceMaterial_grid", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7354,7 +7472,7 @@ } }, { - "id":"reference63", + "id":"reference_customPatternSensor_domeSurfaceMaterial_stripe", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7378,7 +7496,7 @@ } }, { - "id":"reference64", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_image", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7399,7 +7517,7 @@ } }, { - "id":"reference65", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_grid", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7423,7 +7541,7 @@ } }, { - "id":"reference66", + "id":"reference_customPatternSensor_environmentOcclusionMaterial_stripe", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7447,7 +7565,7 @@ } }, { - "id":"reference67", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_image", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ @@ -7468,7 +7586,7 @@ } }, { - "id":"reference68", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_grid", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ @@ -7492,7 +7610,7 @@ } }, { - "id":"reference69", + "id":"reference_rectangularSensor_lateralSurfaceMaterial_stripe", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ @@ -7516,7 +7634,7 @@ } }, { - "id":"reference70", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ @@ -7537,7 +7655,7 @@ } }, { - "id":"reference71", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ @@ -7561,7 +7679,7 @@ } }, { - "id":"reference72", + "id":"reference_rectangularSensor_ellipsoidSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ @@ -7585,7 +7703,7 @@ } }, { - "id":"reference73", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ @@ -7606,7 +7724,7 @@ } }, { - "id":"reference74", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ @@ -7630,7 +7748,7 @@ } }, { - "id":"reference75", + "id":"reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ @@ -7654,7 +7772,7 @@ } }, { - "id":"reference76", + "id":"reference_rectangularSensor_domeSurfaceMaterial_image", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ @@ -7675,7 +7793,7 @@ } }, { - "id":"reference77", + "id":"reference_rectangularSensor_domeSurfaceMaterial_grid", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ @@ -7699,7 +7817,7 @@ } }, { - "id":"reference78", + "id":"reference_rectangularSensor_domeSurfaceMaterial_stripe", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ @@ -7723,7 +7841,7 @@ } }, { - "id":"reference79", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_image", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ @@ -7744,7 +7862,7 @@ } }, { - "id":"reference80", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_grid", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ @@ -7768,7 +7886,7 @@ } }, { - "id":"reference81", + "id":"reference_rectangularSensor_environmentOcclusionMaterial_stripe", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ @@ -7792,7 +7910,7 @@ } }, { - "id":"reference82", + "id":"reference_fan_material_image", "agi_fan":{ "material":{ "image":{ @@ -7813,7 +7931,7 @@ } }, { - "id":"reference83", + "id":"reference_fan_material_grid", "agi_fan":{ "material":{ "grid":{ @@ -7837,7 +7955,7 @@ } }, { - "id":"reference84", + "id":"reference_fan_material_stripe", "agi_fan":{ "material":{ "stripe":{ @@ -7871,7 +7989,7 @@ } }, { - "id":"velocityReference1", + "id":"velocityReference_billboard_alignedAxis", "billboard":{ "alignedAxis":{ "velocityReference":"VelocityPosition#position" @@ -7883,107 +8001,107 @@ "position":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,34,35,36, - 3600,37,38,39 + 0,14893,22330,50775, + 3600,44952,52911,45006 ] }, "orientation":{ "epoch":"2016-06-17T12:00:00Z", "unitQuaternion":[ - 0,0.4735137238103781,0.5208650961914161,0.5682164685724541,0.4261623514293411, - 3600,0.48132991492077,0.515710623129397,0.550091331338023,0.446949206712144 + 0,0.63382030572505,0.114406464045845,0.748788933003267,0.156518736408648, + 3600,0.6707789298754215,0.6087904034756936,0.3200138287815148,0.27752661360612185 ] }, "viewFrom":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,40,41,42, - 3600,43,44,45 + 0,36965,47504,12985, + 3600,16155,2367,57353 ] }, "billboard":{ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,160, - 3600,161 + 0,5763, + 3600,31607 ] }, "pixelOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,213,214, - 3600,215,216 + 0,2029,62215, + 3600,30658,12919 ] }, "eyeOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,46,47,48, - 3600,49,50,51 + 0,3553,23821,42589, + 3600,3059,48139,28860 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,128,129,130,127, - 3600,132,133,134,131 + 0,85,19,239,63, + 3600,160,189,87,99 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,162, - 3600,163 + 0,4554, + 3600,21210 ] }, "alignedAxis":{ "epoch":"2016-06-17T12:00:00Z", "unitCartesian":[ - 0,0.5025707110324169,0.5743665268941909,0.6461623427559638, - 3600,0.5234239225902138,0.5757663148492348,0.6281087071082566 + 0,0.9715593944537291,0.23009485437483201,0.055934792740548404, + 3600,0.3848107755162362,0.8228733250893204,0.41809108804546224 ] }, "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,164, - 3600,165 + 0,21333, + 3600,51893 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,166, - 3600,167 + 0,48314, + 3600,61118 ] }, "scaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,29,30,31,32, - 3600,33,34,35,36 + 0,46842,10678,46377,15029, + 3600,20642,43600,7082,11291 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,37,38,39,40, - 3600,41,42,43,44 + 0,64366,52219,8139,10015, + 3600,10918,18986,49738,60610 ] }, "pixelOffsetScaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,45,46,47,48, - 3600,49,50,51,52 + 0,54503,26068,41061,59552, + 3600,37417,4754,19986,15182 ] }, "imageSubRegion":{ "epoch":"2016-06-17T12:00:00Z", "boundingRectangle":[ - 0,5,6,7,8, - 3600,9,10,11,12 + 0,26590,12135,16431,56640, + 3600,43063,42664,60326,52715 ] } }, @@ -7991,8 +8109,8 @@ "dimensions":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,52,53,54, - 3600,55,56,57 + 0,37525,42898,18087, + 3600,49399,59584,63976 ] }, "material":{ @@ -8000,8 +8118,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,136,137,138,135, - 3600,140,141,142,139 + 0,172,28,222,165, + 3600,16,192,121,150 ] } } @@ -8009,15 +8127,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,144,145,146,143, - 3600,148,149,150,147 + 0,53,66,217,237, + 3600,163,75,228,48 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,168, - 3600,169 + 0,45211, + 3600,20490 ] } }, @@ -8025,29 +8143,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,170, - 3600,171 + 0,62443, + 3600,13988 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,172, - 3600,173 + 0,20585, + 3600,63872 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,174, - 3600,175 + 0,63407, + 3600,42397 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,176, - 3600,177 + 0,43027, + 3600,55912 ] }, "material":{ @@ -8055,8 +8173,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,152,153,154,151, - 3600,156,157,158,155 + 0,35,213,31,79, + 3600,87,126,23,40 ] } } @@ -8064,15 +8182,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,160,161,162,159, - 3600,164,165,166,163 + 0,137,114,57,34, + 3600,93,178,74,64 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,178, - 3600,179 + 0,14678, + 3600,57820 ] } }, @@ -8080,22 +8198,22 @@ "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,180, - 3600,181 + 0,30241, + 3600,48364 ] }, "topRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,182, - 3600,183 + 0,62881, + 3600,16270 ] }, "bottomRadius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,184, - 3600,185 + 0,61925, + 3600,21514 ] }, "material":{ @@ -8103,8 +8221,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,168,169,170,167, - 3600,172,173,174,171 + 0,133,36,52,121, + 3600,7,13,34,201 ] } } @@ -8112,29 +8230,29 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,176,177,178,175, - 3600,180,181,182,179 + 0,112,241,40,103, + 3600,237,75,59,51 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,186, - 3600,187 + 0,36483, + 3600,32586 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,188, - 3600,189 + 0,45816, + 3600,42247 ] }, "slices":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,190, - 3600,191 + 0,46140, + 3600,53530 ] } }, @@ -8142,50 +8260,50 @@ "semiMajorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,192, - 3600,193 + 0,13136, + 3600,55507 ] }, "semiMinorAxis":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,194, - 3600,195 + 0,41580, + 3600,60905 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,196, - 3600,197 + 0,5567, + 3600,45588 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,198, - 3600,199 + 0,16542, + 3600,13545 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,200, - 3600,201 + 0,5797, + 3600,24542 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,202, - 3600,203 + 0,20596, + 3600,58204 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,204, - 3600,205 + 0,2228, + 3600,43731 ] }, "material":{ @@ -8193,8 +8311,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,184,185,186,183, - 3600,188,189,190,187 + 0,174,250,78,96, + 3600,63,102,221,174 ] } } @@ -8202,22 +8320,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,192,193,194,191, - 3600,196,197,198,195 + 0,243,123,194,31, + 3600,236,100,22,203 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,206, - 3600,207 + 0,60636, + 3600,24194 ] }, "numberOfVerticalLines":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,208, - 3600,209 + 0,52822, + 3600,45768 ] } }, @@ -8225,8 +8343,8 @@ "radii":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,58,59,60, - 3600,61,62,63 + 0,5183,10004,13863, + 3600,39497,12186,45103 ] }, "material":{ @@ -8234,8 +8352,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,200,201,202,199, - 3600,204,205,206,203 + 0,137,128,194,84, + 3600,50,122,190,247 ] } } @@ -8243,36 +8361,36 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,208,209,210,207, - 3600,212,213,214,211 + 0,247,210,180,171, + 3600,239,35,237,247 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,210, - 3600,211 + 0,10713, + 3600,10444 ] }, "stackPartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,212, - 3600,213 + 0,5841, + 3600,39170 ] }, "slicePartitions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,214, - 3600,215 + 0,50327, + 3600,4672 ] }, "subdivisions":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,216, - 3600,217 + 0,10225, + 3600,53957 ] } }, @@ -8280,57 +8398,71 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,218, - 3600,219 + 0,40153, + 3600,42123 + ] + }, + "backgroundColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,30,92,161,169, + 3600,85,52,166,62 + ] + }, + "backgroundPadding":{ + "epoch":"2016-06-17T12:00:00Z", + "cartesian2":[ + 0,32945,5504, + 3600,35323,6281 ] }, "pixelOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,217,218, - 3600,219,220 + 0,8539,9761, + 3600,10537,54569 ] }, "eyeOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,64,65,66, - 3600,67,68,69 + 0,5984,34327,59014, + 3600,1931,5127,18964 ] }, "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,216,217,218,215, - 3600,220,221,222,219 + 0,17,212,62,58, + 3600,214,69,90,116 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,224,225,226,223, - 3600,228,229,230,227 + 0,205,14,169,70, + 3600,143,73,168,17 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,220, - 3600,221 + 0,53305, + 3600,43838 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,53,54,55,56, - 3600,57,58,59,60 + 0,25055,32865,32128,29309, + 3600,58875,9189,20515,15696 ] }, "pixelOffsetScaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,61,62,63,64, - 3600,65,66,67,68 + 0,45296,62896,38133,40084, + 3600,28657,25711,9316,62756 ] } }, @@ -8338,22 +8470,50 @@ "scale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,222, - 3600,223 + 0,63647, + 3600,53878 ] }, "minimumPixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,224, - 3600,225 + 0,16357, + 3600,40522 ] }, "maximumScale":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,226, - 3600,227 + 0,8290, + 3600,25558 + ] + }, + "silhouetteColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,33,239,70,81, + 3600,60,48,26,123 + ] + }, + "silhouetteSize":{ + "epoch":"2016-06-17T12:00:00Z", + "number":[ + 0,65103, + 3600,29065 + ] + }, + "color":{ + "epoch":"2016-06-17T12:00:00Z", + "rgba":[ + 0,74,69,164,116, + 3600,127,30,46,170 + ] + }, + "colorBlendAmount":{ + "epoch":"2016-06-17T12:00:00Z", + "number":[ + 0,64130, + 3600,21967 ] } }, @@ -8361,29 +8521,29 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,228, - 3600,229 + 0,32449, + 3600,33819 ] }, "resolution":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,230, - 3600,231 + 0,8399, + 3600,19400 ] }, "leadTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,232, - 3600,233 + 0,40222, + 3600,33294 ] }, "trailTime":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,234, - 3600,235 + 0,34052, + 3600,57713 ] }, "material":{ @@ -8391,8 +8551,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,232,233,234,231, - 3600,236,237,238,235 + 0,97,239,22,105, + 3600,242,157,215,125 ] } } @@ -8402,43 +8562,43 @@ "pixelSize":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,236, - 3600,237 + 0,39714, + 3600,3313 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,240,241,242,239, - 3600,244,245,246,243 + 0,137,151,128,95, + 3600,99,157,124,108 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,248,249,250,247, - 3600,252,253,254,251 + 0,225,246,102,195, + 3600,248,38,75,222 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,238, - 3600,239 + 0,48323, + 3600,50914 ] }, "scaleByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,69,70,71,72, - 3600,73,74,75,76 + 0,39727,50843,56262,15579, + 3600,60522,63980,30201,25205 ] }, "translucencyByDistance":{ "epoch":"2016-06-17T12:00:00Z", "nearFarScalar":[ - 0,77,78,79,80, - 3600,81,82,83,84 + 0,61190,16879,16449,10048, + 3600,46491,47541,35769,13707 ] } }, @@ -8446,29 +8606,29 @@ "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,240, - 3600,241 + 0,64265, + 3600,19257 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,242, - 3600,243 + 0,12315, + 3600,4797 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,244, - 3600,245 + 0,24959, + 3600,32341 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,246, - 3600,247 + 0,51922, + 3600,9185 ] }, "material":{ @@ -8476,8 +8636,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,1,2,3,0, - 3600,5,6,7,4 + 0,19,40,12,31, + 3600,179,204,8,194 ] } } @@ -8485,15 +8645,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,9,10,11,8, - 3600,13,14,15,12 + 0,187,223,120,26, + 3600,20,135,105,81 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,248, - 3600,249 + 0,48428, + 3600,41508 ] } }, @@ -8501,15 +8661,15 @@ "width":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,250, - 3600,251 + 0,60367, + 3600,31077 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,252, - 3600,253 + 0,62537, + 3600,14676 ] }, "material":{ @@ -8517,8 +8677,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,17,18,19,16, - 3600,21,22,23,20 + 0,90,30,195,220, + 3600,39,17,221,74 ] } } @@ -8528,43 +8688,43 @@ "coordinates":{ "epoch":"2016-06-17T12:00:00Z", "wsen":[ - 0,1.14601836602552,0.575222039230621,0.00442571243572409,1.00442571243572, - 3600,0.433629385640828,1.43362938564083,0.862833058845931,0.292036732051034 + 0,0.392205830501108,1.04907471338688,0.00211010473645246,0.064281089310235, + 3600,0.523469985903937,0.229690388867811,0.399550037703662,0.48478405941078 ] }, "height":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,254, - 3600,255 + 0,56388, + 3600,59991 ] }, "extrudedHeight":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,256, - 3600,257 + 0,39796, + 3600,33335 ] }, "rotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,258, - 3600,259 + 0,26921, + 3600,46937 ] }, "stRotation":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,260, - 3600,261 + 0,65255, + 3600,12220 ] }, "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,262, - 3600,263 + 0,6948, + 3600,2204 ] }, "material":{ @@ -8572,8 +8732,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,25,26,27,24, - 3600,29,30,31,28 + 0,106,81,64,152, + 3600,94,108,96,154 ] } } @@ -8581,15 +8741,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,33,34,35,32, - 3600,37,38,39,36 + 0,6,244,49,131, + 3600,87,190,148,55 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,264, - 3600,265 + 0,41576, + 3600,33933 ] } }, @@ -8597,8 +8757,8 @@ "granularity":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,266, - 3600,267 + 0,64428, + 3600,25333 ] }, "material":{ @@ -8606,8 +8766,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,41,42,43,40, - 3600,45,46,47,44 + 0,31,188,250,46, + 3600,78,91,199,227 ] } } @@ -8615,15 +8775,15 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,49,50,51,48, - 3600,53,54,55,52 + 0,241,39,105,205, + 3600,184,17,208,44 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,268, - 3600,269 + 0,6.2e4, + 3600,40549 ] } }, @@ -8631,50 +8791,50 @@ "innerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,270, - 3600,271 + 0,16886, + 3600,9960 ] }, "outerHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,272, - 3600,273 + 0,19166, + 3600,1511 ] }, "minimumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,274, - 3600,275 + 0,47420, + 3600,40115 ] }, "maximumClockAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,276, - 3600,277 + 0,42591, + 3600,2115 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,278, - 3600,279 + 0,37448, + 3600,5744 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,57,58,59,56, - 3600,61,62,63,60 + 0,32,200,181,86, + 3600,212,15,7,176 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,280, - 3600,281 + 0,15969, + 3600,33925 ] }, "lateralSurfaceMaterial":{ @@ -8682,8 +8842,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,65,66,67,64, - 3600,69,70,71,68 + 0,206,145,134,201, + 3600,38,167,50,18 ] } } @@ -8693,8 +8853,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,73,74,75,72, - 3600,77,78,79,76 + 0,198,112,61,75, + 3600,102,141,218,229 ] } } @@ -8704,8 +8864,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,81,82,83,80, - 3600,85,86,87,84 + 0,18,35,91,20, + 3600,162,212,131,214 ] } } @@ -8715,8 +8875,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,89,90,91,88, - 3600,93,94,95,92 + 0,254,199,146,19, + 3600,221,70,233,225 ] } } @@ -8726,8 +8886,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,97,98,99,96, - 3600,101,102,103,100 + 0,251,80,120,192, + 3600,138,101,244,185 ] } } @@ -8735,15 +8895,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,105,106,107,104, - 3600,109,110,111,108 + 0,117,84,113,65, + 3600,24,241,104,132 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,282, - 3600,283 + 0,54383, + 3600,48814 ] } }, @@ -8751,22 +8911,22 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,284, - 3600,285 + 0,51649, + 3600,47224 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,113,114,115,112, - 3600,117,118,119,116 + 0,234,156,105,180, + 3600,181,97,242,62 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,286, - 3600,287 + 0,54947, + 3600,32744 ] }, "lateralSurfaceMaterial":{ @@ -8774,8 +8934,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,121,122,123,120, - 3600,125,126,127,124 + 0,23,46,232,9, + 3600,119,104,98,121 ] } } @@ -8785,8 +8945,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,129,130,131,128, - 3600,133,134,135,132 + 0,3,198,203,85, + 3600,16,212,3,28 ] } } @@ -8796,8 +8956,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,137,138,139,136, - 3600,141,142,143,140 + 0,152,99,18,216, + 3600,89,151,205,251 ] } } @@ -8807,8 +8967,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,145,146,147,144, - 3600,149,150,151,148 + 0,231,234,144,228, + 3600,185,26,16,169 ] } } @@ -8818,8 +8978,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,153,154,155,152, - 3600,157,158,159,156 + 0,214,222,56,37, + 3600,132,87,218,73 ] } } @@ -8827,15 +8987,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,161,162,163,160, - 3600,165,166,167,164 + 0,182,99,116,67, + 3600,101,186,29,220 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,288, - 3600,289 + 0,15461, + 3600,8e3 ] } }, @@ -8843,36 +9003,36 @@ "xHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,290, - 3600,291 + 0,58366, + 3600,22538 ] }, "yHalfAngle":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,292, - 3600,293 + 0,50294, + 3600,14328 ] }, "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,294, - 3600,295 + 0,35659, + 3600,22080 ] }, "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,169,170,171,168, - 3600,173,174,175,172 + 0,115,140,110,208, + 3600,107,143,73,68 ] }, "intersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,296, - 3600,297 + 0,28687, + 3600,9820 ] }, "lateralSurfaceMaterial":{ @@ -8880,8 +9040,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,177,178,179,176, - 3600,181,182,183,180 + 0,78,198,201,229, + 3600,66,187,189,91 ] } } @@ -8891,8 +9051,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,185,186,187,184, - 3600,189,190,191,188 + 0,110,214,130,40, + 3600,57,28,75,170 ] } } @@ -8902,8 +9062,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,193,194,195,192, - 3600,197,198,199,196 + 0,250,52,250,191, + 3600,26,38,17,69 ] } } @@ -8913,8 +9073,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,201,202,203,200, - 3600,205,206,207,204 + 0,90,167,164,121, + 3600,179,244,230,18 ] } } @@ -8924,8 +9084,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,209,210,211,208, - 3600,213,214,215,212 + 0,38,90,83,20, + 3600,53,203,240,55 ] } } @@ -8933,15 +9093,15 @@ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,217,218,219,216, - 3600,221,222,223,220 + 0,247,228,88,199, + 3600,34,163,220,250 ] }, "environmentIntersectionWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,298, - 3600,299 + 0,637, + 3600,10677 ] } }, @@ -8949,8 +9109,8 @@ "radius":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,300, - 3600,301 + 0,48400, + 3600,13510 ] }, "material":{ @@ -8958,8 +9118,8 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,225,226,227,224, - 3600,229,230,231,228 + 0,169,16,250,136, + 3600,211,131,53,139 ] } } @@ -8967,22 +9127,22 @@ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,233,234,235,232, - 3600,237,238,239,236 + 0,112,11,118,88, + 3600,31,167,62,4 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,302, - 3600,303 + 0,42860, + 3600,62479 ] }, "numberOfRings":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,304, - 3600,305 + 0,30719, + 3600,44188 ] } }, @@ -8990,97 +9150,97 @@ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,241,242,243,240, - 3600,245,246,247,244 + 0,150,8,197,98, + 3600,71,74,62,207 ] }, "direction":{ "epoch":"2016-06-17T12:00:00Z", "spherical":[ - 0,4,5,6, - 3600,7,8,9 + 0,31576,24187,52062, + 3600,31098,2937,4107 ] }, "length":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,306, - 3600,307 + 0,37352, + 3600,28352 ] }, "minimumLengthInPixels":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,308, - 3600,309 + 0,194, + 3600,54242 ] } } }, { - "id":"sampled1", + "id":"sampled_position_cartographicRadians", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartographicRadians":[ - 0,0.716814692820414,0.146018366025517,9, - 3600,0.575222039230621,0.00442571243572409,12 + 0,1.00319530145806,0.889718921347432,16911, + 3600,0.828301545608097,0.517994728610812,62937 ] } }, { - "id":"sampled2", + "id":"sampled_position_cartographicDegrees", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartographicDegrees":[ - 0,13,14,15, - 3600,16,17,18 + 0,43,23,63733, + 3600,28,12,9806 ] } }, { - "id":"sampled3", + "id":"sampled_position_cartesianVelocity", "position":{ "epoch":"2016-06-17T12:00:00Z", "cartesianVelocity":[ - 0,7,8,9,10,11,12, - 3600,13,14,15,16,17,18 + 0,40342,23709,14940,12602,34609,44423, + 3600,25648,55396,53208,60367,62699,54004 ] } }, { - "id":"sampled4", + "id":"sampled_billboard_color_rgbaf", "billboard":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745, - 3600,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784 + 0,0.023529411764705882,0.42745098039215684,0.6588235294117647,0.09803921568627451, + 3600,0.9686274509803922,0.7529411764705882,0.8431372549019608,0.16470588235294117 ] } } }, { - "id":"sampled5", + "id":"sampled_billboard_alignedAxis_unitSpherical", "billboard":{ "alignedAxis":{ "epoch":"2016-06-17T12:00:00Z", "unitSpherical":[ - 0,5,6, - 3600,7,8 + 0,57328,53471, + 3600,51360,27848 ] } } }, { - "id":"sampled6", + "id":"sampled_box_material_solidColor_color", "box":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824, - 3600,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862 + 0,0.5568627450980392,0.5411764705882353,0.9568627450980393,0.3176470588235294, + 3600,0.792156862745098,0.9215686274509803,0.12549019607843137,0.7843137254901961 ] } } @@ -9088,22 +9248,22 @@ } }, { - "id":"sampled7", + "id":"sampled_box_material_image", "box":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,221,222, - 3600,223,224 + 0,21562,11604, + 3600,56719,11741 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,249,250,251,248, - 3600,253,254,0,252 + 0,146,124,215,53, + 3600,229,219,61,100 ] } } @@ -9111,43 +9271,43 @@ } }, { - "id":"sampled8", + "id":"sampled_box_material_grid", "box":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,2,3,4,1, - 3600,6,7,8,5 + 0,111,151,56,118, + 3600,178,77,41,86 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,310, - 3600,311 + 0,10400, + 3600,10941 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,225,226, - 3600,227,228 + 0,3433,28173, + 3600,53350,6864 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,229,230, - 3600,231,232 + 0,36990,37264, + 3600,38412,45974 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,233,234, - 3600,235,236 + 0,38761,46487, + 3600,62553,37876 ] } } @@ -9155,36 +9315,36 @@ } }, { - "id":"sampled9", + "id":"sampled_box_material_stripe", "box":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,10,11,12,9, - 3600,14,15,16,13 + 0,251,59,84,41, + 3600,20,214,81,152 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,18,19,20,17, - 3600,22,23,24,21 + 0,233,71,17,115, + 3600,20,178,40,30 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,312, - 3600,313 + 0,46979, + 3600,1457 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,314, - 3600,315 + 0,10283, + 3600,63419 ] } } @@ -9192,15 +9352,15 @@ } }, { - "id":"sampled10", + "id":"sampled_box_material_image_color", "box":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902, - 3600,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941 + 0,0.14901960784313725,0.9294117647058824,0.4627450980392157,0.7647058823529411, + 3600,0.8901960784313725,0.2627450980392157,0.8666666666666667,0.792156862745098 ] } } @@ -9208,15 +9368,15 @@ } }, { - "id":"sampled11", + "id":"sampled_box_material_grid_color", "box":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.596078431372549,0.6,0.6039215686274509,0.592156862745098, - 3600,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019 + 0,0.5019607843137255,0.4470588235294118,0.7215686274509804,0.39215686274509803, + 3600,0.8901960784313725,0.5058823529411764,0.5607843137254902,0.6745098039215687 ] } } @@ -9224,15 +9384,15 @@ } }, { - "id":"sampled12", + "id":"sampled_box_material_stripe_evenColor", "box":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059, - 3600,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098 + 0,0.9803921568627451,0.34509803921568627,0.9294117647058824,0.5333333333333333, + 3600,0.9882352941176471,0.37254901960784315,0.7137254901960784,0.4666666666666667 ] } } @@ -9240,15 +9400,15 @@ } }, { - "id":"sampled13", + "id":"sampled_box_material_stripe_oddColor", "box":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137, - 3600,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176 + 0,0.5450980392156862,0.16862745098039217,0.6549019607843137,0.19607843137254902, + 3600,0.40784313725490196,0.45098039215686275,0.8745098039215686,0.6039215686274509 ] } } @@ -9256,27 +9416,27 @@ } }, { - "id":"sampled14", + "id":"sampled_box_outlineColor_rgbaf", "box":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216, - 3600,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254 + 0,0.21568627450980393,0.4980392156862745,0.27450980392156865,0.12941176470588237, + 3600,0.8549019607843137,0.7294117647058823,0.17254901960784313,0.9568627450980393 ] } } }, { - "id":"sampled15", + "id":"sampled_corridor_material_solidColor_color", "corridor":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294, - 3600,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333 + 0,0.8588235294117647,0.9882352941176471,0.7333333333333333,0.6901960784313725, + 3600,0.5490196078431373,0.3686274509803922,0.9647058823529412,0.13333333333333333 ] } } @@ -9284,22 +9444,22 @@ } }, { - "id":"sampled16", + "id":"sampled_corridor_material_image", "corridor":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,237,238, - 3600,239,240 + 0,14885,62522, + 3600,45129,25776 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,26,27,28,25, - 3600,30,31,32,29 + 0,57,37,208,54, + 3600,24,80,140,151 ] } } @@ -9307,43 +9467,43 @@ } }, { - "id":"sampled17", + "id":"sampled_corridor_material_grid", "corridor":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,34,35,36,33, - 3600,38,39,40,37 + 0,130,99,15,168, + 3600,246,60,236,5 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,316, - 3600,317 + 0,22161, + 3600,55997 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,241,242, - 3600,243,244 + 0,7285,25116, + 3600,18095,8262 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,245,246, - 3600,247,248 + 0,31150,55929, + 3600,40043,22428 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,249,250, - 3600,251,252 + 0,41105,52128, + 3600,2387,32009 ] } } @@ -9351,36 +9511,36 @@ } }, { - "id":"sampled18", + "id":"sampled_corridor_material_stripe", "corridor":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,42,43,44,41, - 3600,46,47,48,45 + 0,8,64,254,66, + 3600,47,28,112,168 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,50,51,52,49, - 3600,54,55,56,53 + 0,17,233,150,181, + 3600,171,148,181,68 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,318, - 3600,319 + 0,21351, + 3600,20709 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,320, - 3600,321 + 0,25188, + 3600,19705 ] } } @@ -9388,15 +9548,15 @@ } }, { - "id":"sampled19", + "id":"sampled_corridor_material_image_color", "corridor":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373, - 3600,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411 + 0,0.9490196078431372,0.6666666666666666,0.058823529411764705,0.7843137254901961, + 3600,0.38823529411764707,0.2627450980392157,0.7647058823529411,0.8823529411764706 ] } } @@ -9404,15 +9564,15 @@ } }, { - "id":"sampled20", + "id":"sampled_corridor_material_grid_color", "corridor":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451, - 3600,0.8,0.803921568627451,0.807843137254902,0.796078431372549 + 0,0.2901960784313726,0.8392156862745098,0.5882352941176471,0.5254901960784314, + 3600,0.26666666666666666,0.00392156862745098,0.1803921568627451,0.7019607843137254 ] } } @@ -9420,15 +9580,15 @@ } }, { - "id":"sampled21", + "id":"sampled_corridor_material_stripe_evenColor", "corridor":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529, - 3600,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568 + 0,0.5176470588235295,0.2823529411764706,0.7098039215686275,0.7372549019607844, + 3600,0.5647058823529412,0.40784313725490196,0.9450980392156862,0.6666666666666666 ] } } @@ -9436,15 +9596,15 @@ } }, { - "id":"sampled22", + "id":"sampled_corridor_material_stripe_oddColor", "corridor":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608, - 3600,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647 + 0,0.13725490196078433,0.4,0.3568627450980392,0.5019607843137255, + 3600,0.9921568627450981,0.43137254901960786,0.30196078431372547,0.2549019607843137 ] } } @@ -9452,27 +9612,27 @@ } }, { - "id":"sampled23", + "id":"sampled_corridor_outlineColor_rgbaf", "corridor":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686, - 3600,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725 + 0,0.8823529411764706,0.2627450980392157,0.24705882352941178,0.9372549019607843, + 3600,0.7019607843137254,0.2627450980392157,0.06274509803921569,0.6274509803921569 ] } } }, { - "id":"sampled24", + "id":"sampled_cylinder_material_solidColor_color", "cylinder":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765, - 3600,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803 + 0,0.11764705882352941,0.34901960784313724,0.4117647058823529,0.10588235294117647, + 3600,0.5137254901960784,0.5137254901960784,0.6666666666666666,0.596078431372549 ] } } @@ -9480,22 +9640,22 @@ } }, { - "id":"sampled25", + "id":"sampled_cylinder_material_image", "cylinder":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,253,254, - 3600,255,256 + 0,42846,26023, + 3600,19184,35658 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,58,59,60,57, - 3600,62,63,64,61 + 0,59,239,245,44, + 3600,77,93,176,39 ] } } @@ -9503,43 +9663,43 @@ } }, { - "id":"sampled26", + "id":"sampled_cylinder_material_grid", "cylinder":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,66,67,68,65, - 3600,70,71,72,69 + 0,211,199,71,148, + 3600,142,126,167,247 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,322, - 3600,323 + 0,12751, + 3600,16373 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,257,258, - 3600,259,260 + 0,11469,5164, + 3600,8167,36383 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,261,262, - 3600,263,264 + 0,22021,38742, + 3600,45350,43441 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,265,266, - 3600,267,268 + 0,23237,58970, + 3600,62223,62963 ] } } @@ -9547,36 +9707,36 @@ } }, { - "id":"sampled27", + "id":"sampled_cylinder_material_stripe", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,74,75,76,73, - 3600,78,79,80,77 + 0,131,133,216,18, + 3600,78,238,32,231 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,82,83,84,81, - 3600,86,87,88,85 + 0,209,149,133,207, + 3600,53,207,16,210 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,324, - 3600,325 + 0,49593, + 3600,25216 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,326, - 3600,327 + 0,16819, + 3600,12539 ] } } @@ -9584,15 +9744,15 @@ } }, { - "id":"sampled28", + "id":"sampled_cylinder_material_image_color", "cylinder":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843, - 3600,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882 + 0,0.7607843137254902,0.13333333333333333,0.23137254901960785,0.6313725490196078, + 3600,0.8823529411764706,0.08235294117647059,0.8,0.08235294117647059 ] } } @@ -9600,15 +9760,15 @@ } }, { - "id":"sampled29", + "id":"sampled_cylinder_material_grid_color", "cylinder":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922, - 3600,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196 + 0,0.17647058823529413,0.40784313725490196,0.6235294117647059,0.7294117647058823, + 3600,0.4392156862745098,0.07450980392156863,0.6039215686274509,0.7137254901960784 ] } } @@ -9616,15 +9776,15 @@ } }, { - "id":"sampled30", + "id":"sampled_cylinder_material_stripe_evenColor", "cylinder":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.00392156862745098,0.00784313725490196,0.011764705882352941,0, - 3600,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392 + 0,0.3803921568627451,0.14901960784313725,0.8,0.6588235294117647, + 3600,0.4627450980392157,0.17254901960784313,0.3254901960784314,0.8549019607843137 ] } } @@ -9632,15 +9792,15 @@ } }, { - "id":"sampled31", + "id":"sampled_cylinder_material_stripe_oddColor", "cylinder":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784, - 3600,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764 + 0,0.20784313725490197,0.4666666666666667,0.42745098039215684,0.10980392156862745, + 3600,0.3137254901960784,0.4980392156862745,0.2,0.4235294117647059 ] } } @@ -9648,27 +9808,27 @@ } }, { - "id":"sampled32", + "id":"sampled_cylinder_outlineColor_rgbaf", "cylinder":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569, - 3600,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196 + 0,0.7803921568627451,0.6588235294117647,0.23529411764705882,0.07058823529411765, + 3600,0.6431372549019608,0.37254901960784315,0.1607843137254902,0.5882352941176471 ] } } }, { - "id":"sampled33", + "id":"sampled_ellipse_material_solidColor_color", "ellipse":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353, - 3600,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745 + 0,0.6784313725490196,0.807843137254902,0.5411764705882353,0.2901960784313726, + 3600,0.7490196078431373,0.25882352941176473,0.7333333333333333,0.24705882352941178 ] } } @@ -9676,22 +9836,22 @@ } }, { - "id":"sampled34", + "id":"sampled_ellipse_material_image", "ellipse":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,269,270, - 3600,271,272 + 0,41027,32928, + 3600,30513,54647 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,90,91,92,89, - 3600,94,95,96,93 + 0,243,25,233,224, + 3600,230,62,9,20 ] } } @@ -9699,43 +9859,43 @@ } }, { - "id":"sampled35", + "id":"sampled_ellipse_material_grid", "ellipse":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,98,99,100,97, - 3600,102,103,104,101 + 0,103,140,88,233, + 3600,224,133,210,4 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,328, - 3600,329 + 0,39159, + 3600,47494 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,273,274, - 3600,275,276 + 0,40987,3488, + 3600,5066,58131 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,277,278, - 3600,279,280 + 0,11466,25388, + 3600,17761,21317 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,281,282, - 3600,283,284 + 0,478,18945, + 3600,25914,29541 ] } } @@ -9743,36 +9903,36 @@ } }, { - "id":"sampled36", + "id":"sampled_ellipse_material_stripe", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,106,107,108,105, - 3600,110,111,112,109 + 0,218,225,186,34, + 3600,109,193,18,44 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,114,115,116,113, - 3600,118,119,120,117 + 0,119,198,180,58, + 3600,79,137,65,31 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,330, - 3600,331 + 0,16964, + 3600,16523 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,332, - 3600,333 + 0,50015, + 3600,64942 ] } } @@ -9780,15 +9940,15 @@ } }, { - "id":"sampled37", + "id":"sampled_ellipse_material_image_color", "ellipse":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137, - 3600,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353 + 0,0.20784313725490197,0.0392156862745098,0.12156862745098039,0.611764705882353, + 3600,0.611764705882353,0.011764705882352941,0.6941176470588235,0.5764705882352941 ] } } @@ -9796,15 +9956,15 @@ } }, { - "id":"sampled38", + "id":"sampled_ellipse_material_grid_color", "ellipse":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392, - 3600,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313 + 0,0.5803921568627451,0.03137254901960784,0.2784313725490196,0.20392156862745098, + 3600,0.050980392156862744,0.8705882352941177,0.11764705882352941,0.5882352941176471 ] } } @@ -9812,15 +9972,15 @@ } }, { - "id":"sampled39", + "id":"sampled_ellipse_material_stripe_evenColor", "ellipse":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706, - 3600,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098 + 0,0.054901960784313725,0.11764705882352941,0.6235294117647059,0.9294117647058824, + 3600,0.26666666666666666,0.11372549019607843,0.9372549019607843,0.16862745098039217 ] } } @@ -9828,15 +9988,15 @@ } }, { - "id":"sampled40", + "id":"sampled_ellipse_material_stripe_oddColor", "ellipse":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549, - 3600,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882 + 0,0.2627450980392157,0.17254901960784313,0.2823529411764706,0.12941176470588237, + 3600,0.9686274509803922,0.6352941176470588,0.5254901960784314,0.8313725490196079 ] } } @@ -9844,27 +10004,27 @@ } }, { - "id":"sampled41", + "id":"sampled_ellipse_outlineColor_rgbaf", "ellipse":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274, - 3600,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666 + 0,0.7607843137254902,0.3607843137254902,0.2235294117647059,0.611764705882353, + 3600,0.1607843137254902,0.8392156862745098,0.7529411764705882,0.6470588235294118 ] } } }, { - "id":"sampled42", + "id":"sampled_ellipsoid_material_solidColor_color", "ellipsoid":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706, - 3600,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745 + 0,0.592156862745098,0.9764705882352941,0.20784313725490197,0.5019607843137255, + 3600,0.09019607843137255,0.6627450980392157,0.8196078431372549,0.23529411764705882 ] } } @@ -9872,22 +10032,22 @@ } }, { - "id":"sampled43", + "id":"sampled_ellipsoid_material_image", "ellipsoid":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,285,286, - 3600,287,288 + 0,63583,15096, + 3600,48977,60351 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,122,123,124,121, - 3600,126,127,128,125 + 0,49,50,177,104, + 3600,131,27,208,157 ] } } @@ -9895,43 +10055,43 @@ } }, { - "id":"sampled44", + "id":"sampled_ellipsoid_material_grid", "ellipsoid":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,130,131,132,129, - 3600,134,135,136,133 + 0,121,105,70,72, + 3600,204,122,157,57 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,334, - 3600,335 + 0,39442, + 3600,463 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,289,290, - 3600,291,292 + 0,33778,30083, + 3600,5202,18708 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,293,294, - 3600,295,296 + 0,44058,37804, + 3600,34449,3718 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,297,298, - 3600,299,300 + 0,33149,21889, + 3600,35482,10122 ] } } @@ -9939,36 +10099,36 @@ } }, { - "id":"sampled45", + "id":"sampled_ellipsoid_material_stripe", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,138,139,140,137, - 3600,142,143,144,141 + 0,153,245,201,196, + 3600,245,113,5,131 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,146,147,148,145, - 3600,150,151,152,149 + 0,99,151,174,111, + 3600,188,89,18,1 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,336, - 3600,337 + 0,44961, + 3600,5690 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,338, - 3600,339 + 0,3351, + 3600,44332 ] } } @@ -9976,15 +10136,15 @@ } }, { - "id":"sampled46", + "id":"sampled_ellipsoid_material_image_color", "ellipsoid":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784, - 3600,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235 + 0,0.6549019607843137,0.5176470588235295,0.8588235294117647,0.48627450980392156, + 3600,0.8627450980392157,0.7137254901960784,0.5647058823529412,0.09019607843137255 ] } } @@ -9992,15 +10152,15 @@ } }, { - "id":"sampled47", + "id":"sampled_ellipsoid_material_grid_color", "ellipsoid":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627, - 3600,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902 + 0,0.6,0.42745098039215684,0.20392156862745098,0.2235294117647059, + 3600,0.5254901960784314,0.3058823529411765,0.1607843137254902,0.8196078431372549 ] } } @@ -10008,15 +10168,15 @@ } }, { - "id":"sampled48", + "id":"sampled_ellipsoid_material_stripe_evenColor", "ellipsoid":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941, - 3600,0.396078431372549,0.4,0.403921568627451,0.39215686274509803 + 0,0.30196078431372547,0.5725490196078431,0.8784313725490196,0.2196078431372549, + 3600,0.33725490196078434,0.8352941176470589,0.9647058823529412,0.9098039215686274 ] } } @@ -10024,15 +10184,15 @@ } }, { - "id":"sampled49", + "id":"sampled_ellipsoid_material_stripe_oddColor", "ellipsoid":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196, - 3600,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059 + 0,0.6470588235294118,0.6352941176470588,0.25882352941176473,0.25098039215686274, + 3600,0.9176470588235294,0.2627450980392157,0.6666666666666666,0.9803921568627451 ] } } @@ -10040,51 +10200,87 @@ } }, { - "id":"sampled50", + "id":"sampled_ellipsoid_outlineColor_rgbaf", "ellipsoid":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098, - 3600,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137 + 0,0.5529411764705883,0.5490196078431373,0.43137254901960786,0.5686274509803921, + 3600,0.43529411764705883,0.6980392156862745,0.396078431372549,0.7725490196078432 + ] + } + } + }, + { + "id":"sampled_label_backgroundColor_rgbaf", + "label":{ + "backgroundColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.9607843137254902,0.18823529411764706,0.8705882352941177,0.27058823529411763, + 3600,0.8823529411764706,0.796078431372549,0.6039215686274509,0.8235294117647058 ] } } }, { - "id":"sampled51", + "id":"sampled_label_fillColor_rgbaf", "label":{ "fillColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764, - 3600,0.49019607843137253,0.49411764705882355,0.4980392156862745,0.48627450980392156 + 0,0.7098039215686275,0.5568627450980392,0.33725490196078434,0.24705882352941178, + 3600,0.4392156862745098,0.6941176470588235,0.9019607843137255,0.08235294117647059 ] } } }, { - "id":"sampled52", + "id":"sampled_label_outlineColor_rgbaf", "label":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5058823529411764,0.5098039215686274,0.5137254901960784,0.5019607843137255, - 3600,0.5215686274509804,0.5254901960784314,0.5294117647058824,0.5176470588235295 + 0,0.6313725490196078,0.7098039215686275,0.27058823529411763,0.792156862745098, + 3600,0.43529411764705883,0.17647058823529413,0.23529411764705882,0.6313725490196078 ] } } }, { - "id":"sampled53", + "id":"sampled_model_silhouetteColor_rgbaf", + "model":{ + "silhouetteColor":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.23137254901960785,0.8666666666666667,0.26666666666666666,0.6352941176470588, + 3600,0.7490196078431373,0.22745098039215686,0.807843137254902,0.08235294117647059 + ] + } + } + }, + { + "id":"sampled_model_color_rgbaf", + "model":{ + "color":{ + "epoch":"2016-06-17T12:00:00Z", + "rgbaf":[ + 0,0.050980392156862744,0.8392156862745098,0.47058823529411764,0.9568627450980393, + 3600,0.43529411764705883,0.9450980392156862,0.43137254901960786,0.6196078431372549 + ] + } + } + }, + { + "id":"sampled_path_material_solidColor_color", "path":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5372549019607843,0.5411764705882353,0.5450980392156862,0.5333333333333333, - 3600,0.5529411764705883,0.5568627450980392,0.5607843137254902,0.5490196078431373 + 0,0.5176470588235295,0.5607843137254902,0.2549019607843137,0.49411764705882355, + 3600,0.9058823529411765,0.15294117647058825,0.8549019607843137,0.8901960784313725 ] } } @@ -10092,29 +10288,29 @@ } }, { - "id":"sampled54", + "id":"sampled_path_material_polylineOutline", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,154,155,156,153, - 3600,158,159,160,157 + 0,209,154,35,76, + 3600,186,25,242,140 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,162,163,164,161, - 3600,166,167,168,165 + 0,218,241,216,157, + 3600,70,200,183,199 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,340, - 3600,341 + 0,2699, + 3600,1320 ] } } @@ -10122,15 +10318,15 @@ } }, { - "id":"sampled55", + "id":"sampled_path_material_polylineArrow", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,170,171,172,169, - 3600,174,175,176,173 + 0,150,221,161,136, + 3600,19,231,68,117 ] } } @@ -10138,22 +10334,22 @@ } }, { - "id":"sampled56", + "id":"sampled_path_material_polylineGlow", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,178,179,180,177, - 3600,182,183,184,181 + 0,197,117,196,254, + 3600,18,17,195,230 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,342, - 3600,343 + 0,5579, + 3600,59951 ] } } @@ -10161,22 +10357,22 @@ } }, { - "id":"sampled57", + "id":"sampled_path_material_image", "path":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,301,302, - 3600,303,304 + 0,25033,47457, + 3600,30413,15734 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,186,187,188,185, - 3600,190,191,192,189 + 0,225,149,237,92, + 3600,234,146,229,9 ] } } @@ -10184,43 +10380,43 @@ } }, { - "id":"sampled58", + "id":"sampled_path_material_grid", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,194,195,196,193, - 3600,198,199,200,197 + 0,99,177,19,203, + 3600,231,169,202,127 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,344, - 3600,345 + 0,63572, + 3600,26232 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,305,306, - 3600,307,308 + 0,34101,5509, + 3600,11991,23086 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,309,310, - 3600,311,312 + 0,39225,58265, + 3600,60443,36332 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,313,314, - 3600,315,316 + 0,25536,59747, + 3600,43164,57256 ] } } @@ -10228,36 +10424,36 @@ } }, { - "id":"sampled59", + "id":"sampled_path_material_stripe", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,202,203,204,201, - 3600,206,207,208,205 + 0,252,51,215,123, + 3600,164,66,75,80 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,210,211,212,209, - 3600,214,215,216,213 + 0,192,190,37,99, + 3600,196,81,62,248 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,346, - 3600,347 + 0,45320, + 3600,41173 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,348, - 3600,349 + 0,42078, + 3600,11633 ] } } @@ -10265,15 +10461,15 @@ } }, { - "id":"sampled60", + "id":"sampled_path_material_polylineOutline_color", "path":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5686274509803921,0.5725490196078431,0.5764705882352941,0.5647058823529412, - 3600,0.5843137254901961,0.5882352941176471,0.592156862745098,0.5803921568627451 + 0,0.49019607843137253,0.4980392156862745,0.8196078431372549,0.7215686274509804, + 3600,0.30980392156862746,0.32941176470588235,0.807843137254902,0.3686274509803922 ] } } @@ -10281,15 +10477,15 @@ } }, { - "id":"sampled61", + "id":"sampled_path_material_polylineOutline_outlineColor", "path":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6,0.6039215686274509,0.6078431372549019,0.596078431372549, - 3600,0.615686274509804,0.6196078431372549,0.6235294117647059,0.611764705882353 + 0,0.42745098039215684,0.9607843137254902,0.996078431372549,0.6627450980392157, + 3600,0.9176470588235294,0.6352941176470588,0.6745098039215687,0.2980392156862745 ] } } @@ -10297,15 +10493,15 @@ } }, { - "id":"sampled62", + "id":"sampled_path_material_polylineArrow_color", "path":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6313725490196078,0.6352941176470588,0.6392156862745098,0.6274509803921569, - 3600,0.6470588235294118,0.6509803921568628,0.6549019607843137,0.6431372549019608 + 0,0.06666666666666667,0.9725490196078431,0.6862745098039216,0.3254901960784314, + 3600,0.2,0.4823529411764706,0.4980392156862745,0.2196078431372549 ] } } @@ -10313,15 +10509,15 @@ } }, { - "id":"sampled63", + "id":"sampled_path_material_polylineGlow_color", "path":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6627450980392157,0.6666666666666666,0.6705882352941176,0.6588235294117647, - 3600,0.6784313725490196,0.6823529411764706,0.6862745098039216,0.6745098039215687 + 0,0.6392156862745098,0.2,0.0196078431372549,0.984313725490196, + 3600,0.3764705882352941,0.8156862745098039,0.9333333333333333,0.023529411764705882 ] } } @@ -10329,15 +10525,15 @@ } }, { - "id":"sampled64", + "id":"sampled_path_material_image_color", "path":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6941176470588235,0.6980392156862745,0.7019607843137254,0.6901960784313725, - 3600,0.7098039215686275,0.7137254901960784,0.7176470588235294,0.7058823529411765 + 0,0.8980392156862745,0.7725490196078432,0.29411764705882354,0.043137254901960784, + 3600,0.8156862745098039,0.09019607843137255,0.8980392156862745,0.30980392156862746 ] } } @@ -10345,15 +10541,15 @@ } }, { - "id":"sampled65", + "id":"sampled_path_material_grid_color", "path":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7254901960784313,0.7294117647058823,0.7333333333333333,0.7215686274509804, - 3600,0.7411764705882353,0.7450980392156863,0.7490196078431373,0.7372549019607844 + 0,0.8901960784313725,0,0.7176470588235294,0.32941176470588235, + 3600,0.4745098039215686,0.6901960784313725,0.043137254901960784,0.25882352941176473 ] } } @@ -10361,15 +10557,15 @@ } }, { - "id":"sampled66", + "id":"sampled_path_material_stripe_evenColor", "path":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7568627450980392,0.7607843137254902,0.7647058823529411,0.7529411764705882, - 3600,0.7725490196078432,0.7764705882352941,0.7803921568627451,0.7686274509803922 + 0,0.3686274509803922,0.5843137254901961,0.8313725490196079,0.5411764705882353, + 3600,0.3176470588235294,0.4,0.8392156862745098,0.5372549019607843 ] } } @@ -10377,15 +10573,15 @@ } }, { - "id":"sampled67", + "id":"sampled_path_material_stripe_oddColor", "path":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.788235294117647,0.792156862745098,0.796078431372549,0.7843137254901961, - 3600,0.803921568627451,0.807843137254902,0.8117647058823529,0.8 + 0,0.1450980392156863,0.5882352941176471,0.9176470588235294,0.6078431372549019, + 3600,0.11764705882352941,0.07058823529411765,0.9019607843137255,0.5254901960784314 ] } } @@ -10393,39 +10589,39 @@ } }, { - "id":"sampled68", + "id":"sampled_point_color_rgbaf", "point":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8196078431372549,0.8235294117647058,0.8274509803921568,0.8156862745098039, - 3600,0.8352941176470589,0.8392156862745098,0.8431372549019608,0.8313725490196079 + 0,0.6784313725490196,0.3568627450980392,0.5882352941176471,0.796078431372549, + 3600,0.9686274509803922,0.2980392156862745,0.5137254901960784,0.6313725490196078 ] } } }, { - "id":"sampled69", + "id":"sampled_point_outlineColor_rgbaf", "point":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8509803921568627,0.8549019607843137,0.8588235294117647,0.8470588235294118, - 3600,0.8666666666666667,0.8705882352941177,0.8745098039215686,0.8627450980392157 + 0,0.42745098039215684,0.8941176470588236,0.16862745098039217,0.7686274509803922, + 3600,0.4588235294117647,0.4666666666666667,0.38823529411764707,0.792156862745098 ] } } }, { - "id":"sampled70", + "id":"sampled_polygon_material_solidColor_color", "polygon":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8823529411764706,0.8862745098039215,0.8901960784313725,0.8784313725490196, - 3600,0.8980392156862745,0.9019607843137255,0.9058823529411765,0.8941176470588236 + 0,0.3058823529411765,0.615686274509804,0.33725490196078434,0.8941176470588236, + 3600,0.1843137254901961,0.6196078431372549,0.35294117647058826,0.03137254901960784 ] } } @@ -10433,22 +10629,22 @@ } }, { - "id":"sampled71", + "id":"sampled_polygon_material_image", "polygon":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,317,318, - 3600,319,320 + 0,19536,17484, + 3600,46291,28852 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,218,219,220,217, - 3600,222,223,224,221 + 0,157,5,231,29, + 3600,53,2,148,36 ] } } @@ -10456,43 +10652,43 @@ } }, { - "id":"sampled72", + "id":"sampled_polygon_material_grid", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,226,227,228,225, - 3600,230,231,232,229 + 0,179,243,247,124, + 3600,15,128,159,42 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,350, - 3600,351 + 0,11565, + 3600,42611 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,321,322, - 3600,323,324 + 0,47065,65463, + 3600,29170,16497 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,325,326, - 3600,327,328 + 0,62674,26868, + 3600,22008,39509 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,329,330, - 3600,331,332 + 0,28793,1648, + 3600,44991,42159 ] } } @@ -10500,36 +10696,36 @@ } }, { - "id":"sampled73", + "id":"sampled_polygon_material_stripe", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,234,235,236,233, - 3600,238,239,240,237 + 0,113,233,143,146, + 3600,106,138,115,44 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,242,243,244,241, - 3600,246,247,248,245 + 0,104,146,138,244, + 3600,161,95,25,36 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,352, - 3600,353 + 0,4711, + 3600,65087 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,354, - 3600,355 + 0,44013, + 3600,7595 ] } } @@ -10537,15 +10733,15 @@ } }, { - "id":"sampled74", + "id":"sampled_polygon_material_image_color", "polygon":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9137254901960784,0.9176470588235294,0.9215686274509803,0.9098039215686274, - 3600,0.9294117647058824,0.9333333333333333,0.9372549019607843,0.9254901960784314 + 0,0.5019607843137255,0.08235294117647059,0.2823529411764706,0.3058823529411765, + 3600,0.07450980392156863,0.6549019607843137,0.6,0.8862745098039215 ] } } @@ -10553,15 +10749,15 @@ } }, { - "id":"sampled75", + "id":"sampled_polygon_material_grid_color", "polygon":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9450980392156862,0.9490196078431372,0.9529411764705882,0.9411764705882353, - 3600,0.9607843137254902,0.9647058823529412,0.9686274509803922,0.9568627450980393 + 0,0.19215686274509805,0.7098039215686275,0.807843137254902,0.7372549019607844, + 3600,0.6745098039215687,0.023529411764705882,0.7647058823529411,0.9764705882352941 ] } } @@ -10569,15 +10765,15 @@ } }, { - "id":"sampled76", + "id":"sampled_polygon_material_stripe_evenColor", "polygon":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9764705882352941,0.9803921568627451,0.984313725490196,0.9725490196078431, - 3600,0.9921568627450981,0.996078431372549,0,0.9882352941176471 + 0,0.5686274509803921,0.35294117647058826,0.396078431372549,0.43529411764705883, + 3600,0.27450980392156865,0.4392156862745098,0.6862745098039216,0.4196078431372549 ] } } @@ -10585,15 +10781,15 @@ } }, { - "id":"sampled77", + "id":"sampled_polygon_material_stripe_oddColor", "polygon":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.00784313725490196,0.011764705882352941,0.01568627450980392,0.00392156862745098, - 3600,0.023529411764705882,0.027450980392156862,0.03137254901960784,0.0196078431372549 + 0,0.3254901960784314,0.34901960784313724,0.5803921568627451,0.7254901960784313, + 3600,0.5686274509803921,0.6901960784313725,0.00392156862745098,0.8588235294117647 ] } } @@ -10601,27 +10797,27 @@ } }, { - "id":"sampled78", + "id":"sampled_polygon_outlineColor_rgbaf", "polygon":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0392156862745098,0.043137254901960784,0.047058823529411764,0.03529411764705882, - 3600,0.054901960784313725,0.058823529411764705,0.06274509803921569,0.050980392156862744 + 0,0.6745098039215687,0.5568627450980392,0.11372549019607843,0.6, + 3600,0.6509803921568628,0.8274509803921568,0.5372549019607843,0.7137254901960784 ] } } }, { - "id":"sampled79", + "id":"sampled_polyline_material_solidColor_color", "polyline":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.07058823529411765,0.07450980392156863,0.0784313725490196,0.06666666666666667, - 3600,0.08627450980392157,0.09019607843137255,0.09411764705882353,0.08235294117647059 + 0,0.9764705882352941,0.9490196078431372,0.45098039215686275,0.4666666666666667, + 3600,0.2627450980392157,0.5098039215686274,0.5372549019607843,0.8509803921568627 ] } } @@ -10629,29 +10825,29 @@ } }, { - "id":"sampled80", + "id":"sampled_polyline_material_polylineOutline", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,250,251,252,249, - 3600,254,0,1,253 + 0,245,92,109,218, + 3600,241,96,196,167 ] }, "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,3,4,5,2, - 3600,7,8,9,6 + 0,174,2,11,244, + 3600,31,126,140,138 ] }, "outlineWidth":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,356, - 3600,357 + 0,33279, + 3600,26855 ] } } @@ -10659,15 +10855,15 @@ } }, { - "id":"sampled81", + "id":"sampled_polyline_material_polylineArrow", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,11,12,13,10, - 3600,15,16,17,14 + 0,141,137,252,157, + 3600,8,236,198,57 ] } } @@ -10675,22 +10871,22 @@ } }, { - "id":"sampled82", + "id":"sampled_polyline_material_polylineGlow", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,19,20,21,18, - 3600,23,24,25,22 + 0,174,178,78,176, + 3600,79,191,38,195 ] }, "glowPower":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,358, - 3600,359 + 0,55378, + 3600,60643 ] } } @@ -10698,22 +10894,22 @@ } }, { - "id":"sampled83", + "id":"sampled_polyline_material_image", "polyline":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,333,334, - 3600,335,336 + 0,50957,35783, + 3600,59533,6.5e4 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,27,28,29,26, - 3600,31,32,33,30 + 0,174,154,113,185, + 3600,123,236,118,155 ] } } @@ -10721,43 +10917,43 @@ } }, { - "id":"sampled84", + "id":"sampled_polyline_material_grid", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,35,36,37,34, - 3600,39,40,41,38 + 0,26,89,33,224, + 3600,215,131,203,1 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,360, - 3600,361 + 0,34343, + 3600,63863 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,337,338, - 3600,339,340 + 0,52308,51660, + 3600,45338,51633 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,341,342, - 3600,343,344 + 0,47738,52154, + 3600,42674,38822 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,345,346, - 3600,347,348 + 0,29194,52338, + 3600,25319,28514 ] } } @@ -10765,36 +10961,36 @@ } }, { - "id":"sampled85", + "id":"sampled_polyline_material_stripe", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,43,44,45,42, - 3600,47,48,49,46 + 0,141,205,78,73, + 3600,107,159,97,34 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,51,52,53,50, - 3600,55,56,57,54 + 0,19,76,127,197, + 3600,214,222,19,168 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,362, - 3600,363 + 0,51126, + 3600,10891 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,364, - 3600,365 + 0,25313, + 3600,22020 ] } } @@ -10802,15 +10998,15 @@ } }, { - "id":"sampled86", + "id":"sampled_polyline_material_polylineOutline_color", "polyline":{ "material":{ "polylineOutline":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10196078431372549,0.10588235294117647,0.10980392156862745,0.09803921568627451, - 3600,0.11764705882352941,0.12156862745098039,0.12549019607843137,0.11372549019607843 + 0,0.3843137254901961,0.16862745098039217,0.44313725490196076,0.6588235294117647, + 3600,0.027450980392156862,0.6470588235294118,0.396078431372549,0.10588235294117647 ] } } @@ -10818,15 +11014,15 @@ } }, { - "id":"sampled87", + "id":"sampled_polyline_material_polylineOutline_outlineColor", "polyline":{ "material":{ "polylineOutline":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.13333333333333333,0.13725490196078433,0.1411764705882353,0.12941176470588237, - 3600,0.14901960784313725,0.15294117647058825,0.1568627450980392,0.1450980392156863 + 0,0.08235294117647059,0.054901960784313725,0.14901960784313725,0.5803921568627451, + 3600,0.7333333333333333,0.792156862745098,0.6392156862745098,0.5647058823529412 ] } } @@ -10834,15 +11030,15 @@ } }, { - "id":"sampled88", + "id":"sampled_polyline_material_polylineArrow_color", "polyline":{ "material":{ "polylineArrow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.16470588235294117,0.16862745098039217,0.17254901960784313,0.1607843137254902, - 3600,0.1803921568627451,0.1843137254901961,0.18823529411764706,0.17647058823529413 + 0,0.5215686274509804,0.7254901960784313,0.8784313725490196,0.8235294117647058, + 3600,0.7725490196078432,0.8627450980392157,0.3254901960784314,0 ] } } @@ -10850,15 +11046,15 @@ } }, { - "id":"sampled89", + "id":"sampled_polyline_material_polylineGlow_color", "polyline":{ "material":{ "polylineGlow":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.19607843137254902,0.2,0.20392156862745098,0.19215686274509805, - 3600,0.21176470588235294,0.21568627450980393,0.2196078431372549,0.20784313725490197 + 0,0.7058823529411765,0.9019607843137255,0.0784313725490196,0.3568627450980392, + 3600,0.5176470588235295,0.20784313725490197,0.7019607843137254,0.10588235294117647 ] } } @@ -10866,15 +11062,15 @@ } }, { - "id":"sampled90", + "id":"sampled_polyline_material_image_color", "polyline":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.22745098039215686,0.23137254901960785,0.23529411764705882,0.2235294117647059, - 3600,0.24313725490196078,0.24705882352941178,0.25098039215686274,0.23921568627450981 + 0,0.796078431372549,0.7411764705882353,0.7411764705882353,0.34901960784313724, + 3600,0.9254901960784314,0.26666666666666666,0.09411764705882353,0.5568627450980392 ] } } @@ -10882,15 +11078,15 @@ } }, { - "id":"sampled91", + "id":"sampled_polyline_material_grid_color", "polyline":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.25882352941176473,0.2627450980392157,0.26666666666666666,0.2549019607843137, - 3600,0.27450980392156865,0.2784313725490196,0.2823529411764706,0.27058823529411763 + 0,0.5450980392156862,0.8470588235294118,0.3411764705882353,0.10196078431372549, + 3600,0.43137254901960786,0.9529411764705882,0.1843137254901961,0.1843137254901961 ] } } @@ -10898,15 +11094,15 @@ } }, { - "id":"sampled92", + "id":"sampled_polyline_material_stripe_evenColor", "polyline":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2901960784313726,0.29411764705882354,0.2980392156862745,0.28627450980392155, - 3600,0.3058823529411765,0.30980392156862746,0.3137254901960784,0.30196078431372547 + 0,0.807843137254902,0.2627450980392157,0.8980392156862745,0.8117647058823529, + 3600,0.41568627450980394,0.9686274509803922,0.09803921568627451,0.4235294117647059 ] } } @@ -10914,15 +11110,15 @@ } }, { - "id":"sampled93", + "id":"sampled_polyline_material_stripe_oddColor", "polyline":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3215686274509804,0.3254901960784314,0.32941176470588235,0.3176470588235294, - 3600,0.33725490196078434,0.3411764705882353,0.34509803921568627,0.3333333333333333 + 0,0.42745098039215684,0.40784313725490196,0.47058823529411764,0.8745098039215686, + 3600,0.5098039215686274,0.42745098039215684,0.9764705882352941,0 ] } } @@ -10930,27 +11126,27 @@ } }, { - "id":"sampled94", + "id":"sampled_rectangle_coordinates_wsenDegrees", "rectangle":{ "coordinates":{ "epoch":"2016-06-17T12:00:00Z", "wsenDegrees":[ - 0,17,18,19,20, - 3600,21,22,23,24 + 0,35,18,38,15, + 3600,38,1,12,30 ] } } }, { - "id":"sampled95", + "id":"sampled_rectangle_material_solidColor_color", "rectangle":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.35294117647058826,0.3568627450980392,0.3607843137254902,0.34901960784313724, - 3600,0.3686274509803922,0.37254901960784315,0.3764705882352941,0.36470588235294116 + 0,0.20392156862745098,0.24313725490196078,0.5764705882352941,0.09803921568627451, + 3600,0.9137254901960784,0.8313725490196079,0.7607843137254902,0.9529411764705882 ] } } @@ -10958,22 +11154,22 @@ } }, { - "id":"sampled96", + "id":"sampled_rectangle_material_image", "rectangle":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,349,350, - 3600,351,352 + 0,3711,44302, + 3600,52318,60108 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,59,60,61,58, - 3600,63,64,65,62 + 0,49,142,97,190, + 3600,189,250,238,118 ] } } @@ -10981,43 +11177,43 @@ } }, { - "id":"sampled97", + "id":"sampled_rectangle_material_grid", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,67,68,69,66, - 3600,71,72,73,70 + 0,95,53,115,82, + 3600,204,71,209,187 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,366, - 3600,367 + 0,48813, + 3600,21269 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,353,354, - 3600,355,356 + 0,22945,32857, + 3600,55972,34522 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,357,358, - 3600,359,360 + 0,37146,39825, + 3600,64636,13052 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,361,362, - 3600,363,364 + 0,8882,38690, + 3600,8857,21794 ] } } @@ -11025,36 +11221,36 @@ } }, { - "id":"sampled98", + "id":"sampled_rectangle_material_stripe", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,75,76,77,74, - 3600,79,80,81,78 + 0,243,96,246,5, + 3600,74,28,207,87 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,83,84,85,82, - 3600,87,88,89,86 + 0,147,18,134,10, + 3600,59,151,72,114 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,368, - 3600,369 + 0,57328, + 3600,2602 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,370, - 3600,371 + 0,29729, + 3600,30206 ] } } @@ -11062,15 +11258,15 @@ } }, { - "id":"sampled99", + "id":"sampled_rectangle_material_image_color", "rectangle":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3843137254901961,0.38823529411764707,0.39215686274509803,0.3803921568627451, - 3600,0.4,0.403921568627451,0.40784313725490196,0.396078431372549 + 0,0.5529411764705883,0.10196078431372549,0.7725490196078432,0.00392156862745098, + 3600,0.01568627450980392,0.9647058823529412,0.592156862745098,0.396078431372549 ] } } @@ -11078,15 +11274,15 @@ } }, { - "id":"sampled100", + "id":"sampled_rectangle_material_grid_color", "rectangle":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.41568627450980394,0.4196078431372549,0.4235294117647059,0.4117647058823529, - 3600,0.43137254901960786,0.43529411764705883,0.4392156862745098,0.42745098039215684 + 0,0.49019607843137253,0.3843137254901961,0.9372549019607843,0.16862745098039217, + 3600,0.39215686274509803,0.7568627450980392,0.4549019607843137,0.5294117647058824 ] } } @@ -11094,15 +11290,15 @@ } }, { - "id":"sampled101", + "id":"sampled_rectangle_material_stripe_evenColor", "rectangle":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4470588235294118,0.45098039215686275,0.4549019607843137,0.44313725490196076, - 3600,0.4627450980392157,0.4666666666666667,0.47058823529411764,0.4588235294117647 + 0,0.3215686274509804,0.7764705882352941,0.22745098039215686,0.08235294117647059, + 3600,0.9294117647058824,0.7254901960784313,0.00392156862745098,0.36470588235294116 ] } } @@ -11110,15 +11306,15 @@ } }, { - "id":"sampled102", + "id":"sampled_rectangle_material_stripe_oddColor", "rectangle":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.47843137254901963,0.4823529411764706,0.48627450980392156,0.4745098039215686, - 3600,0.49411764705882355,0.4980392156862745,0.5019607843137255,0.49019607843137253 + 0,0.984313725490196,0.8313725490196079,0.8274509803921568,0.9254901960784314, + 3600,0.1450980392156863,0.01568627450980392,0.3803921568627451,0.49019607843137253 ] } } @@ -11126,27 +11322,27 @@ } }, { - "id":"sampled103", + "id":"sampled_rectangle_outlineColor_rgbaf", "rectangle":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5098039215686274,0.5137254901960784,0.5176470588235295,0.5058823529411764, - 3600,0.5254901960784314,0.5294117647058824,0.5333333333333333,0.5215686274509804 + 0,0.9803921568627451,0.4666666666666667,0.7529411764705882,0.7098039215686275, + 3600,0.5490196078431373,0.9490196078431372,0.5450980392156862,0.3803921568627451 ] } } }, { - "id":"sampled104", + "id":"sampled_wall_material_solidColor_color", "wall":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5411764705882353,0.5450980392156862,0.5490196078431373,0.5372549019607843, - 3600,0.5568627450980392,0.5607843137254902,0.5647058823529412,0.5529411764705883 + 0,0.3843137254901961,0.9647058823529412,0.8274509803921568,0.8156862745098039, + 3600,0.00784313725490196,0.3254901960784314,0.9529411764705882,0.054901960784313725 ] } } @@ -11154,22 +11350,22 @@ } }, { - "id":"sampled105", + "id":"sampled_wall_material_image", "wall":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,365,366, - 3600,367,368 + 0,13369,38196, + 3600,36874,55696 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,91,92,93,90, - 3600,95,96,97,94 + 0,1,152,139,83, + 3600,127,110,56,69 ] } } @@ -11177,43 +11373,43 @@ } }, { - "id":"sampled106", + "id":"sampled_wall_material_grid", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,99,100,101,98, - 3600,103,104,105,102 + 0,243,153,88,43, + 3600,169,159,82,75 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,372, - 3600,373 + 0,32179, + 3600,55901 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,369,370, - 3600,371,372 + 0,46941,30391, + 3600,51565,6089 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,373,374, - 3600,375,376 + 0,35543,16778, + 3600,32904,18048 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,377,378, - 3600,379,380 + 0,2955,19723, + 3600,58723,15333 ] } } @@ -11221,36 +11417,36 @@ } }, { - "id":"sampled107", + "id":"sampled_wall_material_stripe", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,107,108,109,106, - 3600,111,112,113,110 + 0,204,233,122,70, + 3600,215,44,132,84 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,115,116,117,114, - 3600,119,120,121,118 + 0,20,6,10,253, + 3600,96,118,90,117 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,374, - 3600,375 + 0,63629, + 3600,38486 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,376, - 3600,377 + 0,41791, + 3600,56258 ] } } @@ -11258,15 +11454,15 @@ } }, { - "id":"sampled108", + "id":"sampled_wall_material_image_color", "wall":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5725490196078431,0.5764705882352941,0.5803921568627451,0.5686274509803921, - 3600,0.5882352941176471,0.592156862745098,0.596078431372549,0.5843137254901961 + 0,0.5843137254901961,0.7529411764705882,0.5882352941176471,0.7333333333333333, + 3600,0.30980392156862746,0.9882352941176471,0.0784313725490196,0.4588235294117647 ] } } @@ -11274,15 +11470,15 @@ } }, { - "id":"sampled109", + "id":"sampled_wall_material_grid_color", "wall":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6039215686274509,0.6078431372549019,0.611764705882353,0.6, - 3600,0.6196078431372549,0.6235294117647059,0.6274509803921569,0.615686274509804 + 0,0.2784313725490196,0.5490196078431373,0.9647058823529412,0.9607843137254902, + 3600,0.7098039215686275,0.8313725490196079,0.6784313725490196,0.40784313725490196 ] } } @@ -11290,15 +11486,15 @@ } }, { - "id":"sampled110", + "id":"sampled_wall_material_stripe_evenColor", "wall":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6352941176470588,0.6392156862745098,0.6431372549019608,0.6313725490196078, - 3600,0.6509803921568628,0.6549019607843137,0.6588235294117647,0.6470588235294118 + 0,0.09019607843137255,0.24313725490196078,0.5372549019607843,0.16862745098039217, + 3600,0.38823529411764707,0.8470588235294118,0.25882352941176473,0.11372549019607843 ] } } @@ -11306,15 +11502,15 @@ } }, { - "id":"sampled111", + "id":"sampled_wall_material_stripe_oddColor", "wall":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6666666666666666,0.6705882352941176,0.6745098039215687,0.6627450980392157, - 3600,0.6823529411764706,0.6862745098039216,0.6901960784313725,0.6784313725490196 + 0,0.34509803921568627,0.0196078431372549,0.054901960784313725,0.6627450980392157, + 3600,0.6941176470588235,0.8901960784313725,0.3803921568627451,0.3176470588235294 ] } } @@ -11322,39 +11518,39 @@ } }, { - "id":"sampled112", + "id":"sampled_wall_outlineColor_rgbaf", "wall":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6980392156862745,0.7019607843137254,0.7058823529411765,0.6941176470588235, - 3600,0.7137254901960784,0.7176470588235294,0.7215686274509804,0.7098039215686275 + 0,0.9333333333333333,0.10588235294117647,0.06274509803921569,0.396078431372549, + 3600,0.9019607843137255,0.43529411764705883,0.35294117647058826,0.7137254901960784 ] } } }, { - "id":"sampled113", + "id":"sampled_conicSensor_intersectionColor_rgbaf", "agi_conicSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7294117647058823,0.7333333333333333,0.7372549019607844,0.7254901960784313, - 3600,0.7450980392156863,0.7490196078431373,0.7529411764705882,0.7411764705882353 + 0,0.6784313725490196,0.2901960784313726,0.6666666666666666,0.21568627450980393, + 3600,0.32941176470588235,0.38823529411764707,0.23529411764705882,0.26666666666666666 ] } } }, { - "id":"sampled114", + "id":"sampled_conicSensor_lateralSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7607843137254902,0.7647058823529411,0.7686274509803922,0.7568627450980392, - 3600,0.7764705882352941,0.7803921568627451,0.7843137254901961,0.7725490196078432 + 0,0.40784313725490196,0.7843137254901961,0.8784313725490196,0.9803921568627451, + 3600,0.6470588235294118,0.9176470588235294,0.12156862745098039,0.29411764705882354 ] } } @@ -11362,22 +11558,22 @@ } }, { - "id":"sampled115", + "id":"sampled_conicSensor_lateralSurfaceMaterial_image", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,381,382, - 3600,383,384 + 0,26885,9577, + 3600,43369,23209 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,123,124,125,122, - 3600,127,128,129,126 + 0,190,252,218,221, + 3600,110,253,27,68 ] } } @@ -11385,43 +11581,43 @@ } }, { - "id":"sampled116", + "id":"sampled_conicSensor_lateralSurfaceMaterial_grid", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,131,132,133,130, - 3600,135,136,137,134 + 0,78,27,189,149, + 3600,17,205,226,252 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,378, - 3600,379 + 0,3298, + 3600,62899 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,385,386, - 3600,387,388 + 0,29248,29298, + 3600,10801,50474 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,389,390, - 3600,391,392 + 0,29571,1651, + 3600,24960,22113 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,393,394, - 3600,395,396 + 0,55103,11223, + 3600,45946,59571 ] } } @@ -11429,36 +11625,36 @@ } }, { - "id":"sampled117", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,139,140,141,138, - 3600,143,144,145,142 + 0,5,144,249,28, + 3600,83,107,130,252 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,147,148,149,146, - 3600,151,152,153,150 + 0,228,116,212,245, + 3600,59,44,249,118 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,380, - 3600,381 + 0,51637, + 3600,63711 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,382, - 3600,383 + 0,48031, + 3600,63777 ] } } @@ -11466,15 +11662,15 @@ } }, { - "id":"sampled118", + "id":"sampled_conicSensor_lateralSurfaceMaterial_image_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.792156862745098,0.796078431372549,0.8,0.788235294117647, - 3600,0.807843137254902,0.8117647058823529,0.8156862745098039,0.803921568627451 + 0,0.6470588235294118,0.2980392156862745,0.403921568627451,0.1843137254901961, + 3600,0.42745098039215684,0.47843137254901963,0.26666666666666666,0.2980392156862745 ] } } @@ -11482,15 +11678,15 @@ } }, { - "id":"sampled119", + "id":"sampled_conicSensor_lateralSurfaceMaterial_grid_color", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8235294117647058,0.8274509803921568,0.8313725490196079,0.8196078431372549, - 3600,0.8392156862745098,0.8431372549019608,0.8470588235294118,0.8352941176470589 + 0,0.9568627450980393,0.1450980392156863,0.2627450980392157,0.10980392156862745, + 3600,0.25882352941176473,0.00784313725490196,0.9019607843137255,0.23529411764705882 ] } } @@ -11498,15 +11694,15 @@ } }, { - "id":"sampled120", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8549019607843137,0.8588235294117647,0.8627450980392157,0.8509803921568627, - 3600,0.8705882352941177,0.8745098039215686,0.8784313725490196,0.8666666666666667 + 0,0.6627450980392157,0.28627450980392155,0.06666666666666667,0.20392156862745098, + 3600,0.023529411764705882,0.5254901960784314,0.2980392156862745,0.6588235294117647 ] } } @@ -11514,15 +11710,15 @@ } }, { - "id":"sampled121", + "id":"sampled_conicSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8862745098039215,0.8901960784313725,0.8941176470588236,0.8823529411764706, - 3600,0.9019607843137255,0.9058823529411765,0.9098039215686274,0.8980392156862745 + 0,0.7568627450980392,0.09411764705882353,0.8666666666666667,0.9921568627450981, + 3600,0.058823529411764705,0.1411764705882353,0.6470588235294118,0.3803921568627451 ] } } @@ -11530,15 +11726,15 @@ } }, { - "id":"sampled122", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9176470588235294,0.9215686274509803,0.9254901960784314,0.9137254901960784, - 3600,0.9333333333333333,0.9372549019607843,0.9411764705882353,0.9294117647058824 + 0,0.2,0.08235294117647059,0.5098039215686274,0.2549019607843137, + 3600,0.9019607843137255,0.592156862745098,0.8352941176470589,0.5725490196078431 ] } } @@ -11546,22 +11742,22 @@ } }, { - "id":"sampled123", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,397,398, - 3600,399,400 + 0,15751,40509, + 3600,35728,34187 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,155,156,157,154, - 3600,159,160,161,158 + 0,146,78,244,4, + 3600,29,181,189,242 ] } } @@ -11569,43 +11765,43 @@ } }, { - "id":"sampled124", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,163,164,165,162, - 3600,167,168,169,166 + 0,73,204,84,240, + 3600,52,49,65,80 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,384, - 3600,385 + 0,24247, + 3600,16802 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,401,402, - 3600,403,404 + 0,27080,64105, + 3600,2556,11273 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,405,406, - 3600,407,408 + 0,56653,64989, + 3600,16857,36929 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,409,410, - 3600,411,412 + 0,44206,26796, + 3600,38284,28309 ] } } @@ -11613,36 +11809,36 @@ } }, { - "id":"sampled125", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,171,172,173,170, - 3600,175,176,177,174 + 0,166,158,42,119, + 3600,52,206,201,181 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,179,180,181,178, - 3600,183,184,185,182 + 0,103,139,237,102, + 3600,35,89,140,235 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,386, - 3600,387 + 0,50863, + 3600,48603 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,388, - 3600,389 + 0,52624, + 3600,10786 ] } } @@ -11650,15 +11846,15 @@ } }, { - "id":"sampled126", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9490196078431372,0.9529411764705882,0.9568627450980393,0.9450980392156862, - 3600,0.9647058823529412,0.9686274509803922,0.9725490196078431,0.9607843137254902 + 0,0.8745098039215686,0.24705882352941178,0.5137254901960784,0.5529411764705883, + 3600,0,0.4745098039215686,0.1607843137254902,0.7098039215686275 ] } } @@ -11666,15 +11862,15 @@ } }, { - "id":"sampled127", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9803921568627451,0.984313725490196,0.9882352941176471,0.9764705882352941, - 3600,0.996078431372549,0,0.00392156862745098,0.9921568627450981 + 0,0.5725490196078431,0.34901960784313724,0.35294117647058826,0.5607843137254902, + 3600,0.9725490196078431,0.34901960784313724,0.5450980392156862,0.4588235294117647 ] } } @@ -11682,15 +11878,15 @@ } }, { - "id":"sampled128", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.011764705882352941,0.01568627450980392,0.0196078431372549,0.00784313725490196, - 3600,0.027450980392156862,0.03137254901960784,0.03529411764705882,0.023529411764705882 + 0,0.8235294117647058,0.8745098039215686,0.7803921568627451,0.2901960784313726, + 3600,0.2980392156862745,0.5568627450980392,0.03529411764705882,0.47843137254901963 ] } } @@ -11698,15 +11894,15 @@ } }, { - "id":"sampled129", + "id":"sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.043137254901960784,0.047058823529411764,0.050980392156862744,0.0392156862745098, - 3600,0.058823529411764705,0.06274509803921569,0.06666666666666667,0.054901960784313725 + 0,0.40784313725490196,0.4588235294117647,0.5647058823529412,0.7647058823529411, + 3600,0.1803921568627451,0.49411764705882355,0.47843137254901963,0.7372549019607844 ] } } @@ -11714,15 +11910,15 @@ } }, { - "id":"sampled130", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.07450980392156863,0.0784313725490196,0.08235294117647059,0.07058823529411765, - 3600,0.09019607843137255,0.09411764705882353,0.09803921568627451,0.08627450980392157 + 0,0.07450980392156863,0.9411764705882353,0.5568627450980392,0.8901960784313725, + 3600,0.2901960784313726,0.3803921568627451,0.7607843137254902,0.4117647058823529 ] } } @@ -11730,22 +11926,22 @@ } }, { - "id":"sampled131", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,413,414, - 3600,415,416 + 0,60426,50668, + 3600,37349,39057 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,187,188,189,186, - 3600,191,192,193,190 + 0,219,106,121,33, + 3600,231,17,163,9 ] } } @@ -11753,43 +11949,43 @@ } }, { - "id":"sampled132", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,195,196,197,194, - 3600,199,200,201,198 + 0,95,6,140,189, + 3600,8,141,87,20 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,390, - 3600,391 + 0,22274, + 3600,42079 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,417,418, - 3600,419,420 + 0,1497,17669, + 3600,52287,29644 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,421,422, - 3600,423,424 + 0,49813,39106, + 3600,56035,42714 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,425,426, - 3600,427,428 + 0,1548,39430, + 3600,20317,63823 ] } } @@ -11797,36 +11993,36 @@ } }, { - "id":"sampled133", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,203,204,205,202, - 3600,207,208,209,206 + 0,82,72,9,165, + 3600,19,34,239,152 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,211,212,213,210, - 3600,215,216,217,214 + 0,69,252,0,171, + 3600,156,96,221,7 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,392, - 3600,393 + 0,50512, + 3600,37692 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,394, - 3600,395 + 0,10637, + 3600,26810 ] } } @@ -11834,15 +12030,15 @@ } }, { - "id":"sampled134", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10588235294117647,0.10980392156862745,0.11372549019607843,0.10196078431372549, - 3600,0.12156862745098039,0.12549019607843137,0.12941176470588237,0.11764705882352941 + 0,0.7764705882352941,0.796078431372549,0.9019607843137255,0.19215686274509805, + 3600,0.26666666666666666,0.34901960784313724,0.5882352941176471,0.7019607843137254 ] } } @@ -11850,15 +12046,15 @@ } }, { - "id":"sampled135", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.13725490196078433,0.1411764705882353,0.1450980392156863,0.13333333333333333, - 3600,0.15294117647058825,0.1568627450980392,0.1607843137254902,0.14901960784313725 + 0,0.00784313725490196,0.5215686274509804,0.14901960784313725,0.3568627450980392, + 3600,0.6235294117647059,0.2823529411764706,0.01568627450980392,0.18823529411764706 ] } } @@ -11866,15 +12062,15 @@ } }, { - "id":"sampled136", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.16862745098039217,0.17254901960784313,0.17647058823529413,0.16470588235294117, - 3600,0.1843137254901961,0.18823529411764706,0.19215686274509805,0.1803921568627451 + 0,0.14901960784313725,0.596078431372549,0.36470588235294116,0.13333333333333333, + 3600,0.9333333333333333,0.8823529411764706,0.8549019607843137,0.33725490196078434 ] } } @@ -11882,15 +12078,15 @@ } }, { - "id":"sampled137", + "id":"sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2,0.20392156862745098,0.20784313725490197,0.19607843137254902, - 3600,0.21568627450980393,0.2196078431372549,0.2235294117647059,0.21176470588235294 + 0,0.3764705882352941,0.050980392156862744,0.7215686274509804,0.027450980392156862, + 3600,0.21568627450980393,0.9529411764705882,0.17254901960784313,0.9254901960784314 ] } } @@ -11898,15 +12094,15 @@ } }, { - "id":"sampled138", + "id":"sampled_conicSensor_domeSurfaceMaterial_solidColor_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23137254901960785,0.23529411764705882,0.23921568627450981,0.22745098039215686, - 3600,0.24705882352941178,0.25098039215686274,0.2549019607843137,0.24313725490196078 + 0,0.3333333333333333,0.7254901960784313,0.9686274509803922,0.8470588235294118, + 3600,0.27058823529411763,0.47058823529411764,0.054901960784313725,0.7372549019607844 ] } } @@ -11914,22 +12110,22 @@ } }, { - "id":"sampled139", + "id":"sampled_conicSensor_domeSurfaceMaterial_image", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,429,430, - 3600,431,432 + 0,15155,54843, + 3600,23043,52314 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,219,220,221,218, - 3600,223,224,225,222 + 0,227,216,30,201, + 3600,178,83,144,162 ] } } @@ -11937,43 +12133,43 @@ } }, { - "id":"sampled140", + "id":"sampled_conicSensor_domeSurfaceMaterial_grid", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,227,228,229,226, - 3600,231,232,233,230 + 0,129,93,151,96, + 3600,162,106,178,82 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,396, - 3600,397 + 0,39199, + 3600,13647 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,433,434, - 3600,435,436 + 0,36585,398, + 3600,55649,1753 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,437,438, - 3600,439,440 + 0,46298,48052, + 3600,2425,23049 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,441,442, - 3600,443,444 + 0,32050,28285, + 3600,28995,12145 ] } } @@ -11981,36 +12177,36 @@ } }, { - "id":"sampled141", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,235,236,237,234, - 3600,239,240,241,238 + 0,216,215,206,248, + 3600,42,243,185,48 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,243,244,245,242, - 3600,247,248,249,246 + 0,207,180,175,154, + 3600,243,210,191,196 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,398, - 3600,399 + 0,63301, + 3600,2332 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,400, - 3600,401 + 0,5736, + 3600,39376 ] } } @@ -12018,15 +12214,15 @@ } }, { - "id":"sampled142", + "id":"sampled_conicSensor_domeSurfaceMaterial_image_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2627450980392157,0.26666666666666666,0.27058823529411763,0.25882352941176473, - 3600,0.2784313725490196,0.2823529411764706,0.28627450980392155,0.27450980392156865 + 0,0.7450980392156863,0.5294117647058824,0.8,0.047058823529411764, + 3600,0.21176470588235294,0.1411764705882353,0.8549019607843137,0.19607843137254902 ] } } @@ -12034,15 +12230,15 @@ } }, { - "id":"sampled143", + "id":"sampled_conicSensor_domeSurfaceMaterial_grid_color", "agi_conicSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.29411764705882354,0.2980392156862745,0.30196078431372547,0.2901960784313726, - 3600,0.30980392156862746,0.3137254901960784,0.3176470588235294,0.3058823529411765 + 0,0.4980392156862745,0.23137254901960785,0.4392156862745098,0.8705882352941177, + 3600,0.6980392156862745,0.2235294117647059,0.803921568627451,0.5607843137254902 ] } } @@ -12050,15 +12246,15 @@ } }, { - "id":"sampled144", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe_evenColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3254901960784314,0.32941176470588235,0.3333333333333333,0.3215686274509804, - 3600,0.3411764705882353,0.34509803921568627,0.34901960784313724,0.33725490196078434 + 0,0.1568627450980392,0.6980392156862745,0.3176470588235294,0.18823529411764706, + 3600,0.5450980392156862,0.00784313725490196,0.6313725490196078,0.6392156862745098 ] } } @@ -12066,15 +12262,15 @@ } }, { - "id":"sampled145", + "id":"sampled_conicSensor_domeSurfaceMaterial_stripe_oddColor", "agi_conicSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3568627450980392,0.3607843137254902,0.36470588235294116,0.35294117647058826, - 3600,0.37254901960784315,0.3764705882352941,0.3803921568627451,0.3686274509803922 + 0,0.7607843137254902,0.9450980392156862,0.9647058823529412,0.4666666666666667, + 3600,0.4980392156862745,0.24705882352941178,0.26666666666666666,0.5372549019607843 ] } } @@ -12082,15 +12278,15 @@ } }, { - "id":"sampled146", + "id":"sampled_conicSensor_environmentOcclusionMaterial_solidColor_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.38823529411764707,0.39215686274509803,0.396078431372549,0.3843137254901961, - 3600,0.403921568627451,0.40784313725490196,0.4117647058823529,0.4 + 0,0.9607843137254902,0.3176470588235294,0.9882352941176471,0.9176470588235294, + 3600,0.7215686274509804,0.5294117647058824,0.8,0.9686274509803922 ] } } @@ -12098,22 +12294,22 @@ } }, { - "id":"sampled147", + "id":"sampled_conicSensor_environmentOcclusionMaterial_image", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,445,446, - 3600,447,448 + 0,9595,10789, + 3600,18969,45642 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,251,252,253,250, - 3600,0,1,2,254 + 0,25,152,209,110, + 3600,0,177,98,21 ] } } @@ -12121,43 +12317,43 @@ } }, { - "id":"sampled148", + "id":"sampled_conicSensor_environmentOcclusionMaterial_grid", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,4,5,6,3, - 3600,8,9,10,7 + 0,30,179,241,183, + 3600,238,22,9,76 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,402, - 3600,403 + 0,60897, + 3600,28396 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,449,450, - 3600,451,452 + 0,36175,49549, + 3600,25282,43362 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,453,454, - 3600,455,456 + 0,3202,31500, + 3600,31331,9594 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,457,458, - 3600,459,460 + 0,26878,19048, + 3600,14809,8505 ] } } @@ -12165,36 +12361,36 @@ } }, { - "id":"sampled149", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,12,13,14,11, - 3600,16,17,18,15 + 0,21,240,212,151, + 3600,170,35,91,106 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,20,21,22,19, - 3600,24,25,26,23 + 0,245,81,159,72, + 3600,191,198,205,36 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,404, - 3600,405 + 0,48703, + 3600,42572 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,406, - 3600,407 + 0,60568, + 3600,43395 ] } } @@ -12202,15 +12398,15 @@ } }, { - "id":"sampled150", + "id":"sampled_conicSensor_environmentOcclusionMaterial_image_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4196078431372549,0.4235294117647059,0.42745098039215684,0.41568627450980394, - 3600,0.43529411764705883,0.4392156862745098,0.44313725490196076,0.43137254901960786 + 0,0.7764705882352941,0.1450980392156863,0.07450980392156863,0.1411764705882353, + 3600,0.9411764705882353,0.6745098039215687,0.1411764705882353,0.7529411764705882 ] } } @@ -12218,15 +12414,15 @@ } }, { - "id":"sampled151", + "id":"sampled_conicSensor_environmentOcclusionMaterial_grid_color", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.45098039215686275,0.4549019607843137,0.4588235294117647,0.4470588235294118, - 3600,0.4666666666666667,0.47058823529411764,0.4745098039215686,0.4627450980392157 + 0,0.9607843137254902,0.27450980392156865,0.2,0.6352941176470588, + 3600,0.23529411764705882,0.3176470588235294,0.8588235294117647,0.3764705882352941 ] } } @@ -12234,15 +12430,15 @@ } }, { - "id":"sampled152", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4823529411764706,0.48627450980392156,0.49019607843137253,0.47843137254901963, - 3600,0.4980392156862745,0.5019607843137255,0.5058823529411764,0.49411764705882355 + 0,0.8352941176470589,0.3686274509803922,0.9450980392156862,0.21568627450980393, + 3600,0.3333333333333333,0.10588235294117647,0.9764705882352941,0.10196078431372549 ] } } @@ -12250,15 +12446,15 @@ } }, { - "id":"sampled153", + "id":"sampled_conicSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_conicSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5137254901960784,0.5176470588235295,0.5215686274509804,0.5098039215686274, - 3600,0.5294117647058824,0.5333333333333333,0.5372549019607843,0.5254901960784314 + 0,0.4823529411764706,0.21176470588235294,0.054901960784313725,0.7450980392156863, + 3600,0.30196078431372547,0.5882352941176471,0.5058823529411764,0.4 ] } } @@ -12266,39 +12462,39 @@ } }, { - "id":"sampled154", + "id":"sampled_conicSensor_environmentIntersectionColor_rgbaf", "agi_conicSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5450980392156862,0.5490196078431373,0.5529411764705883,0.5411764705882353, - 3600,0.5607843137254902,0.5647058823529412,0.5686274509803921,0.5568627450980392 + 0,0.23921568627450981,0.5647058823529412,0.3843137254901961,0.9490196078431372, + 3600,0.6705882352941176,0.7019607843137254,0.7176470588235294,0.4823529411764706 ] } } }, { - "id":"sampled155", + "id":"sampled_customPatternSensor_intersectionColor_rgbaf", "agi_customPatternSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5764705882352941,0.5803921568627451,0.5843137254901961,0.5725490196078431, - 3600,0.592156862745098,0.596078431372549,0.6,0.5882352941176471 + 0,0.5294117647058824,0.6431372549019608,0.00392156862745098,0.6823529411764706, + 3600,0.44313725490196076,0.7372549019607844,0.9411764705882353,0.25098039215686274 ] } } }, { - "id":"sampled156", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6078431372549019,0.611764705882353,0.615686274509804,0.6039215686274509, - 3600,0.6235294117647059,0.6274509803921569,0.6313725490196078,0.6196078431372549 + 0,0.7450980392156863,0.9098039215686274,0.9176470588235294,0.9137254901960784, + 3600,0.8980392156862745,0.9803921568627451,0.9254901960784314,0.21176470588235294 ] } } @@ -12306,22 +12502,22 @@ } }, { - "id":"sampled157", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_image", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,461,462, - 3600,463,464 + 0,63029,3574, + 3600,55389,39128 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,28,29,30,27, - 3600,32,33,34,31 + 0,16,191,200,176, + 3600,37,9,107,51 ] } } @@ -12329,43 +12525,43 @@ } }, { - "id":"sampled158", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_grid", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,36,37,38,35, - 3600,40,41,42,39 + 0,153,234,93,240, + 3600,137,26,245,109 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,408, - 3600,409 + 0,30588, + 3600,50527 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,465,466, - 3600,467,468 + 0,32706,60287, + 3600,9849,57894 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,469,470, - 3600,471,472 + 0,52801,55758, + 3600,21243,12882 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,473,474, - 3600,475,476 + 0,32497,63102, + 3600,872,8963 ] } } @@ -12373,36 +12569,36 @@ } }, { - "id":"sampled159", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,44,45,46,43, - 3600,48,49,50,47 + 0,178,77,10,254, + 3600,25,134,53,12 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,52,53,54,51, - 3600,56,57,58,55 + 0,106,116,1,164, + 3600,84,10,153,15 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,410, - 3600,411 + 0,21926, + 3600,50927 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,412, - 3600,413 + 0,53175, + 3600,3927 ] } } @@ -12410,15 +12606,15 @@ } }, { - "id":"sampled160", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_image_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6392156862745098,0.6431372549019608,0.6470588235294118,0.6352941176470588, - 3600,0.6549019607843137,0.6588235294117647,0.6627450980392157,0.6509803921568628 + 0,0.4666666666666667,0.6823529411764706,0.4117647058823529,0.40784313725490196, + 3600,0.19607843137254902,0.9294117647058824,0.9294117647058824,0.8 ] } } @@ -12426,15 +12622,15 @@ } }, { - "id":"sampled161", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6705882352941176,0.6745098039215687,0.6784313725490196,0.6666666666666666, - 3600,0.6862745098039216,0.6901960784313725,0.6941176470588235,0.6823529411764706 + 0,0.9294117647058824,0.4627450980392157,0.5803921568627451,0.9568627450980393, + 3600,0.1607843137254902,0.2784313725490196,0.49019607843137253,0.13333333333333333 ] } } @@ -12442,15 +12638,15 @@ } }, { - "id":"sampled162", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7019607843137254,0.7058823529411765,0.7098039215686275,0.6980392156862745, - 3600,0.7176470588235294,0.7215686274509804,0.7254901960784313,0.7137254901960784 + 0,0.08235294117647059,0.8549019607843137,0.2,0.11764705882352941, + 3600,0.09411764705882353,0.023529411764705882,0.6313725490196078,0.9294117647058824 ] } } @@ -12458,15 +12654,15 @@ } }, { - "id":"sampled163", + "id":"sampled_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7333333333333333,0.7372549019607844,0.7411764705882353,0.7294117647058823, - 3600,0.7490196078431373,0.7529411764705882,0.7568627450980392,0.7450980392156863 + 0,0.43529411764705883,0.6235294117647059,0.09019607843137255,0.403921568627451, + 3600,0.9764705882352941,0.4980392156862745,0.9372549019607843,0.15294117647058825 ] } } @@ -12474,15 +12670,15 @@ } }, { - "id":"sampled164", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7647058823529411,0.7686274509803922,0.7725490196078432,0.7607843137254902, - 3600,0.7803921568627451,0.7843137254901961,0.788235294117647,0.7764705882352941 + 0,0.5137254901960784,0.29411764705882354,0.2823529411764706,0.13725490196078433, + 3600,0.3764705882352941,0.1411764705882353,0.8784313725490196,0.21568627450980393 ] } } @@ -12490,22 +12686,22 @@ } }, { - "id":"sampled165", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,477,478, - 3600,479,480 + 0,58698,40933, + 3600,41986,11428 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,60,61,62,59, - 3600,64,65,66,63 + 0,215,165,21,133, + 3600,242,52,43,231 ] } } @@ -12513,43 +12709,43 @@ } }, { - "id":"sampled166", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,68,69,70,67, - 3600,72,73,74,71 + 0,145,51,29,30, + 3600,232,196,204,59 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,414, - 3600,415 + 0,41972, + 3600,5785 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,481,482, - 3600,483,484 + 0,53003,15055, + 3600,54783,43989 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,485,486, - 3600,487,488 + 0,20747,61009, + 3600,44483,19885 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,489,490, - 3600,491,492 + 0,4601,33809, + 3600,5562,9237 ] } } @@ -12557,36 +12753,36 @@ } }, { - "id":"sampled167", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,76,77,78,75, - 3600,80,81,82,79 + 0,22,135,242,53, + 3600,125,39,146,95 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,84,85,86,83, - 3600,88,89,90,87 + 0,78,145,160,107, + 3600,20,221,2,55 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,416, - 3600,417 + 0,56324, + 3600,23443 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,418, - 3600,419 + 0,60008, + 3600,19240 ] } } @@ -12594,15 +12790,15 @@ } }, { - "id":"sampled168", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.796078431372549,0.8,0.803921568627451,0.792156862745098, - 3600,0.8117647058823529,0.8156862745098039,0.8196078431372549,0.807843137254902 + 0,0.14901960784313725,0.07450980392156863,0.047058823529411764,0.26666666666666666, + 3600,0.37254901960784315,0.8588235294117647,0.07450980392156863,0.6392156862745098 ] } } @@ -12610,15 +12806,15 @@ } }, { - "id":"sampled169", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8274509803921568,0.8313725490196079,0.8352941176470589,0.8235294117647058, - 3600,0.8431372549019608,0.8470588235294118,0.8509803921568627,0.8392156862745098 + 0,0.2235294117647059,0.6039215686274509,0.5372549019607843,0.4392156862745098, + 3600,0.2901960784313726,0.30980392156862746,0.7058823529411765,0.050980392156862744 ] } } @@ -12626,15 +12822,15 @@ } }, { - "id":"sampled170", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8588235294117647,0.8627450980392157,0.8666666666666667,0.8549019607843137, - 3600,0.8745098039215686,0.8784313725490196,0.8823529411764706,0.8705882352941177 + 0,0.5098039215686274,0.8705882352941177,0.08235294117647059,0.7843137254901961, + 3600,0.9725490196078431,0.396078431372549,0.7137254901960784,0.16862745098039217 ] } } @@ -12642,15 +12838,15 @@ } }, { - "id":"sampled171", + "id":"sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8901960784313725,0.8941176470588236,0.8980392156862745,0.8862745098039215, - 3600,0.9058823529411765,0.9098039215686274,0.9137254901960784,0.9019607843137255 + 0,0.7411764705882353,0.3254901960784314,0.9607843137254902,0.5490196078431373, + 3600,0.49411764705882355,0.8980392156862745,0.30980392156862746,0.9333333333333333 ] } } @@ -12658,15 +12854,15 @@ } }, { - "id":"sampled172", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9215686274509803,0.9254901960784314,0.9294117647058824,0.9176470588235294, - 3600,0.9372549019607843,0.9411764705882353,0.9450980392156862,0.9333333333333333 + 0,0.7137254901960784,0.4745098039215686,0.6941176470588235,0.9490196078431372, + 3600,0.5254901960784314,0.39215686274509803,0.4196078431372549,0.48627450980392156 ] } } @@ -12674,22 +12870,22 @@ } }, { - "id":"sampled173", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,493,494, - 3600,495,496 + 0,21969,13397, + 3600,39494,53658 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,92,93,94,91, - 3600,96,97,98,95 + 0,53,192,208,251, + 3600,37,130,111,72 ] } } @@ -12697,43 +12893,43 @@ } }, { - "id":"sampled174", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,100,101,102,99, - 3600,104,105,106,103 + 0,93,214,17,148, + 3600,128,142,221,86 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,420, - 3600,421 + 0,44108, + 3600,54524 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,497,498, - 3600,499,500 + 0,50481,2245, + 3600,37420,18578 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,501,502, - 3600,503,504 + 0,12996,37682, + 3600,52906,32974 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,505,506, - 3600,507,508 + 0,1153,65284, + 3600,20666,28496 ] } } @@ -12741,36 +12937,36 @@ } }, { - "id":"sampled175", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,108,109,110,107, - 3600,112,113,114,111 + 0,26,41,223,127, + 3600,73,101,144,40 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,116,117,118,115, - 3600,120,121,122,119 + 0,61,131,101,136, + 3600,156,76,210,101 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,422, - 3600,423 + 0,43262, + 3600,4288 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,424, - 3600,425 + 0,56775, + 3600,18120 ] } } @@ -12778,15 +12974,15 @@ } }, { - "id":"sampled176", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9529411764705882,0.9568627450980393,0.9607843137254902,0.9490196078431372, - 3600,0.9686274509803922,0.9725490196078431,0.9764705882352941,0.9647058823529412 + 0,0.984313725490196,0.19215686274509805,0.47843137254901963,0.8392156862745098, + 3600,0.6,0.6745098039215687,0.3176470588235294,0.24705882352941178 ] } } @@ -12794,15 +12990,15 @@ } }, { - "id":"sampled177", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.984313725490196,0.9882352941176471,0.9921568627450981,0.9803921568627451, - 3600,0,0.00392156862745098,0.00784313725490196,0.996078431372549 + 0,0.3058823529411765,0.35294117647058826,0.9098039215686274,0.49411764705882355, + 3600,0.1411764705882353,0.7764705882352941,0.37254901960784315,0.8196078431372549 ] } } @@ -12810,15 +13006,15 @@ } }, { - "id":"sampled178", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.01568627450980392,0.0196078431372549,0.023529411764705882,0.011764705882352941, - 3600,0.03137254901960784,0.03529411764705882,0.0392156862745098,0.027450980392156862 + 0,0.2196078431372549,0.36470588235294116,0.8862745098039215,0.2549019607843137, + 3600,0.21176470588235294,0.12156862745098039,0.42745098039215684,0.4588235294117647 ] } } @@ -12826,15 +13022,15 @@ } }, { - "id":"sampled179", + "id":"sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.047058823529411764,0.050980392156862744,0.054901960784313725,0.043137254901960784, - 3600,0.06274509803921569,0.06666666666666667,0.07058823529411765,0.058823529411764705 + 0,0.054901960784313725,0.403921568627451,0.023529411764705882,0.29411764705882354, + 3600,0.43529411764705883,0.4117647058823529,0.20392156862745098,0.12156862745098039 ] } } @@ -12842,15 +13038,15 @@ } }, { - "id":"sampled180", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_solidColor_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0784313725490196,0.08235294117647059,0.08627450980392157,0.07450980392156863, - 3600,0.09411764705882353,0.09803921568627451,0.10196078431372549,0.09019607843137255 + 0,0.43137254901960786,0.6901960784313725,0.4117647058823529,0.2, + 3600,0.16862745098039217,0.07450980392156863,0.027450980392156862,0.5411764705882353 ] } } @@ -12858,22 +13054,22 @@ } }, { - "id":"sampled181", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_image", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,509,510, - 3600,511,512 + 0,60682,27373, + 3600,52685,47309 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,124,125,126,123, - 3600,128,129,130,127 + 0,22,127,40,32, + 3600,189,75,228,77 ] } } @@ -12881,43 +13077,43 @@ } }, { - "id":"sampled182", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_grid", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,132,133,134,131, - 3600,136,137,138,135 + 0,162,99,20,206, + 3600,195,98,58,1 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,426, - 3600,427 + 0,3954, + 3600,6671 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,513,514, - 3600,515,516 + 0,62334,24819, + 3600,21928,49237 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,517,518, - 3600,519,520 + 0,20309,29263, + 3600,37015,21392 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,521,522, - 3600,523,524 + 0,25094,25442, + 3600,627,60674 ] } } @@ -12925,36 +13121,36 @@ } }, { - "id":"sampled183", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,140,141,142,139, - 3600,144,145,146,143 + 0,131,24,117,197, + 3600,174,167,243,249 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,148,149,150,147, - 3600,152,153,154,151 + 0,56,97,210,44, + 3600,241,167,104,188 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,428, - 3600,429 + 0,36642, + 3600,59203 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,430, - 3600,431 + 0,22486, + 3600,32253 ] } } @@ -12962,15 +13158,15 @@ } }, { - "id":"sampled184", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_image_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.10980392156862745,0.11372549019607843,0.11764705882352941,0.10588235294117647, - 3600,0.12549019607843137,0.12941176470588237,0.13333333333333333,0.12156862745098039 + 0,0.47058823529411764,0.12549019607843137,0.22745098039215686,0.5686274509803921, + 3600,0.792156862745098,0.054901960784313725,0.8627450980392157,0.6823529411764706 ] } } @@ -12978,15 +13174,15 @@ } }, { - "id":"sampled185", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_grid_color", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1411764705882353,0.1450980392156863,0.14901960784313725,0.13725490196078433, - 3600,0.1568627450980392,0.1607843137254902,0.16470588235294117,0.15294117647058825 + 0,0.8117647058823529,0.8588235294117647,0.9019607843137255,0.3607843137254902, + 3600,0.047058823529411764,0.9529411764705882,0.13333333333333333,0.2235294117647059 ] } } @@ -12994,15 +13190,15 @@ } }, { - "id":"sampled186", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe_evenColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.17254901960784313,0.17647058823529413,0.1803921568627451,0.16862745098039217, - 3600,0.18823529411764706,0.19215686274509805,0.19607843137254902,0.1843137254901961 + 0,0.5254901960784314,0.8313725490196079,0.43529411764705883,0.13333333333333333, + 3600,0.047058823529411764,0.9098039215686274,0.8666666666666667,0.00784313725490196 ] } } @@ -13010,15 +13206,15 @@ } }, { - "id":"sampled187", + "id":"sampled_customPatternSensor_domeSurfaceMaterial_stripe_oddColor", "agi_customPatternSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.20392156862745098,0.20784313725490197,0.21176470588235294,0.2, - 3600,0.2196078431372549,0.2235294117647059,0.22745098039215686,0.21568627450980393 + 0,0.7450980392156863,0.6823529411764706,0.6862745098039216,0.592156862745098, + 3600,0.8156862745098039,0.20392156862745098,0.7372549019607844,0.01568627450980392 ] } } @@ -13026,15 +13222,15 @@ } }, { - "id":"sampled188", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_solidColor_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23529411764705882,0.23921568627450981,0.24313725490196078,0.23137254901960785, - 3600,0.25098039215686274,0.2549019607843137,0.25882352941176473,0.24705882352941178 + 0,0.18823529411764706,0.13725490196078433,0.34901960784313724,0.12549019607843137, + 3600,0.5372549019607843,0.050980392156862744,0.39215686274509803,0.5411764705882353 ] } } @@ -13042,22 +13238,22 @@ } }, { - "id":"sampled189", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_image", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,525,526, - 3600,527,528 + 0,62312,48883, + 3600,57031,8414 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,156,157,158,155, - 3600,160,161,162,159 + 0,27,82,30,220, + 3600,239,104,2,127 ] } } @@ -13065,43 +13261,43 @@ } }, { - "id":"sampled190", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_grid", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,164,165,166,163, - 3600,168,169,170,167 + 0,201,18,142,140, + 3600,172,191,241,52 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,432, - 3600,433 + 0,47281, + 3600,32249 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,529,530, - 3600,531,532 + 0,39465,33434, + 3600,34009,23428 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,533,534, - 3600,535,536 + 0,12138,31535, + 3600,21340,63571 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,537,538, - 3600,539,540 + 0,41772,53923, + 3600,38657,39063 ] } } @@ -13109,36 +13305,36 @@ } }, { - "id":"sampled191", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,172,173,174,171, - 3600,176,177,178,175 + 0,102,16,35,158, + 3600,144,113,131,165 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,180,181,182,179, - 3600,184,185,186,183 + 0,127,174,171,80, + 3600,188,244,211,154 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,434, - 3600,435 + 0,45459, + 3600,39807 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,436, - 3600,437 + 0,3015, + 3600,44396 ] } } @@ -13146,15 +13342,15 @@ } }, { - "id":"sampled192", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_image_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.26666666666666666,0.27058823529411763,0.27450980392156865,0.2627450980392157, - 3600,0.2823529411764706,0.28627450980392155,0.2901960784313726,0.2784313725490196 + 0,0.6980392156862745,0.7176470588235294,0.34901960784313724,0.8901960784313725, + 3600,0.26666666666666666,0.9921568627450981,0,0.9215686274509803 ] } } @@ -13162,15 +13358,15 @@ } }, { - "id":"sampled193", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_grid_color", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.2980392156862745,0.30196078431372547,0.3058823529411765,0.29411764705882354, - 3600,0.3137254901960784,0.3176470588235294,0.3215686274509804,0.30980392156862746 + 0,0.45098039215686275,0.6509803921568628,0.788235294117647,0.6352941176470588, + 3600,0.8784313725490196,0.011764705882352941,0.7058823529411765,0.37254901960784315 ] } } @@ -13178,15 +13374,15 @@ } }, { - "id":"sampled194", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.32941176470588235,0.3333333333333333,0.33725490196078434,0.3254901960784314, - 3600,0.34509803921568627,0.34901960784313724,0.35294117647058826,0.3411764705882353 + 0,0.7294117647058823,0.047058823529411764,0.996078431372549,0.9294117647058824, + 3600,0.24705882352941178,0.38823529411764707,0.33725490196078434,0.13333333333333333 ] } } @@ -13194,15 +13390,15 @@ } }, { - "id":"sampled195", + "id":"sampled_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_customPatternSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3607843137254902,0.36470588235294116,0.3686274509803922,0.3568627450980392, - 3600,0.3764705882352941,0.3803921568627451,0.3843137254901961,0.37254901960784315 + 0,0.49019607843137253,0.47843137254901963,0.21176470588235294,0.8784313725490196, + 3600,0.25882352941176473,0.4117647058823529,0.2549019607843137,0.8705882352941177 ] } } @@ -13210,39 +13406,39 @@ } }, { - "id":"sampled196", + "id":"sampled_customPatternSensor_environmentIntersectionColor_rgbaf", "agi_customPatternSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.39215686274509803,0.396078431372549,0.4,0.38823529411764707, - 3600,0.40784313725490196,0.4117647058823529,0.41568627450980394,0.403921568627451 + 0,0.7137254901960784,0.6666666666666666,0.6313725490196078,0.6039215686274509, + 3600,0.19607843137254902,0.03137254901960784,0.4588235294117647,0.12941176470588237 ] } } }, { - "id":"sampled197", + "id":"sampled_rectangularSensor_intersectionColor_rgbaf", "agi_rectangularSensor":{ "intersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4235294117647059,0.42745098039215684,0.43137254901960786,0.4196078431372549, - 3600,0.4392156862745098,0.44313725490196076,0.4470588235294118,0.43529411764705883 + 0,0.611764705882353,0.6235294117647059,0.615686274509804,0.2980392156862745, + 3600,0.47058823529411764,0.792156862745098,0.4470588235294118,0.3411764705882353 ] } } }, { - "id":"sampled198", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4549019607843137,0.4588235294117647,0.4627450980392157,0.45098039215686275, - 3600,0.47058823529411764,0.4745098039215686,0.47843137254901963,0.4666666666666667 + 0,0.11372549019607843,0.8235294117647058,0.054901960784313725,0.8274509803921568, + 3600,0.25882352941176473,0.20784313725490197,0.6235294117647059,0.3843137254901961 ] } } @@ -13250,22 +13446,22 @@ } }, { - "id":"sampled199", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_image", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,541,542, - 3600,543,544 + 0,52010,29131, + 3600,37742,39315 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,188,189,190,187, - 3600,192,193,194,191 + 0,87,76,78,224, + 3600,112,228,110,174 ] } } @@ -13273,43 +13469,43 @@ } }, { - "id":"sampled200", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_grid", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,196,197,198,195, - 3600,200,201,202,199 + 0,195,212,244,21, + 3600,42,102,1,242 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,438, - 3600,439 + 0,48728, + 3600,1546 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,545,546, - 3600,547,548 + 0,50687,36037, + 3600,13907,20534 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,549,550, - 3600,551,552 + 0,54144,36307, + 3600,51987,20683 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,553,554, - 3600,555,556 + 0,44547,50094, + 3600,41657,39586 ] } } @@ -13317,36 +13513,36 @@ } }, { - "id":"sampled201", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,204,205,206,203, - 3600,208,209,210,207 + 0,30,217,21,42, + 3600,44,19,54,180 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,212,213,214,211, - 3600,216,217,218,215 + 0,3,65,14,125, + 3600,91,20,83,43 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,440, - 3600,441 + 0,18254, + 3600,54296 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,442, - 3600,443 + 0,43781, + 3600,10453 ] } } @@ -13354,15 +13550,15 @@ } }, { - "id":"sampled202", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_image_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.48627450980392156,0.49019607843137253,0.49411764705882355,0.4823529411764706, - 3600,0.5019607843137255,0.5058823529411764,0.5098039215686274,0.4980392156862745 + 0,0.4196078431372549,0.25882352941176473,0.8,0.3254901960784314, + 3600,0.29411764705882354,0.34509803921568627,0.6313725490196078,0.17254901960784313 ] } } @@ -13370,15 +13566,15 @@ } }, { - "id":"sampled203", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5176470588235295,0.5215686274509804,0.5254901960784314,0.5137254901960784, - 3600,0.5333333333333333,0.5372549019607843,0.5411764705882353,0.5294117647058824 + 0,0.9294117647058824,0.32941176470588235,0.9058823529411765,0.17647058823529413, + 3600,0.13333333333333333,0.9921568627450981,0.4980392156862745,0.6823529411764706 ] } } @@ -13386,15 +13582,15 @@ } }, { - "id":"sampled204", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5490196078431373,0.5529411764705883,0.5568627450980392,0.5450980392156862, - 3600,0.5647058823529412,0.5686274509803921,0.5725490196078431,0.5607843137254902 + 0,0.49019607843137253,0.10588235294117647,0.7411764705882353,0.9254901960784314, + 3600,0.39215686274509803,0.3803921568627451,0.9568627450980393,0.42745098039215684 ] } } @@ -13402,15 +13598,15 @@ } }, { - "id":"sampled205", + "id":"sampled_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "lateralSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.5803921568627451,0.5843137254901961,0.5882352941176471,0.5764705882352941, - 3600,0.596078431372549,0.6,0.6039215686274509,0.592156862745098 + 0,0.6392156862745098,0.6470588235294118,0.7764705882352941,0.03529411764705882, + 3600,0.20784313725490197,0.7843137254901961,0.41568627450980394,0.23137254901960785 ] } } @@ -13418,15 +13614,15 @@ } }, { - "id":"sampled206", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.611764705882353,0.615686274509804,0.6196078431372549,0.6078431372549019, - 3600,0.6274509803921569,0.6313725490196078,0.6352941176470588,0.6235294117647059 + 0,0.34509803921568627,0.6235294117647059,0.7411764705882353,0.788235294117647, + 3600,0.9921568627450981,0.8823529411764706,0.5843137254901961,0.3254901960784314 ] } } @@ -13434,22 +13630,22 @@ } }, { - "id":"sampled207", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,557,558, - 3600,559,560 + 0,19293,30027, + 3600,53447,40400 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,220,221,222,219, - 3600,224,225,226,223 + 0,169,234,204,34, + 3600,206,171,37,176 ] } } @@ -13457,43 +13653,43 @@ } }, { - "id":"sampled208", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,228,229,230,227, - 3600,232,233,234,231 + 0,64,198,223,2, + 3600,158,10,217,142 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,444, - 3600,445 + 0,25939, + 3600,4058 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,561,562, - 3600,563,564 + 0,3767,19214, + 3600,25536,29283 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,565,566, - 3600,567,568 + 0,46435,13749, + 3600,59883,59113 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,569,570, - 3600,571,572 + 0,3470,23821, + 3600,21415,22355 ] } } @@ -13501,36 +13697,36 @@ } }, { - "id":"sampled209", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,236,237,238,235, - 3600,240,241,242,239 + 0,15,225,249,111, + 3600,137,66,192,72 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,244,245,246,243, - 3600,248,249,250,247 + 0,43,126,128,44, + 3600,224,158,234,137 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,446, - 3600,447 + 0,13161, + 3600,16735 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,448, - 3600,449 + 0,61379, + 3600,24898 ] } } @@ -13538,15 +13734,15 @@ } }, { - "id":"sampled210", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6431372549019608,0.6470588235294118,0.6509803921568628,0.6392156862745098, - 3600,0.6588235294117647,0.6627450980392157,0.6666666666666666,0.6549019607843137 + 0,0.7411764705882353,0.7843137254901961,0.33725490196078434,0.49019607843137253, + 3600,0.2235294117647059,0.4470588235294118,0.47843137254901963,0.9490196078431372 ] } } @@ -13554,15 +13750,15 @@ } }, { - "id":"sampled211", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.6745098039215687,0.6784313725490196,0.6823529411764706,0.6705882352941176, - 3600,0.6901960784313725,0.6941176470588235,0.6980392156862745,0.6862745098039216 + 0,0.7647058823529411,0.6901960784313725,0.7843137254901961,0.6196078431372549, + 3600,0.5058823529411764,0.7411764705882353,0.3764705882352941,0.7019607843137254 ] } } @@ -13570,15 +13766,15 @@ } }, { - "id":"sampled212", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7058823529411765,0.7098039215686275,0.7137254901960784,0.7019607843137254, - 3600,0.7215686274509804,0.7254901960784313,0.7294117647058823,0.7176470588235294 + 0,0.8745098039215686,0.1803921568627451,0.6745098039215687,0.3176470588235294, + 3600,0.2980392156862745,0.5647058823529412,0.9686274509803922,0.06666666666666667 ] } } @@ -13586,15 +13782,15 @@ } }, { - "id":"sampled213", + "id":"sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7372549019607844,0.7411764705882353,0.7450980392156863,0.7333333333333333, - 3600,0.7529411764705882,0.7568627450980392,0.7607843137254902,0.7490196078431373 + 0,0.07450980392156863,0.23137254901960785,0.7803921568627451,0.8745098039215686, + 3600,0.011764705882352941,0.27058823529411763,0.8980392156862745,0.8235294117647058 ] } } @@ -13602,15 +13798,15 @@ } }, { - "id":"sampled214", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.7686274509803922,0.7725490196078432,0.7764705882352941,0.7647058823529411, - 3600,0.7843137254901961,0.788235294117647,0.792156862745098,0.7803921568627451 + 0,0.3411764705882353,0.00392156862745098,0.3764705882352941,0.10196078431372549, + 3600,0.7764705882352941,0.21176470588235294,0.49019607843137253,0.9803921568627451 ] } } @@ -13618,22 +13814,22 @@ } }, { - "id":"sampled215", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,573,574, - 3600,575,576 + 0,23214,39258, + 3600,2670,15370 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,252,253,254,251, - 3600,1,2,3,0 + 0,153,182,217,31, + 3600,62,102,70,94 ] } } @@ -13641,43 +13837,43 @@ } }, { - "id":"sampled216", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,5,6,7,4, - 3600,9,10,11,8 + 0,48,105,98,196, + 3600,130,147,68,208 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,450, - 3600,451 + 0,41629, + 3600,11517 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,577,578, - 3600,579,580 + 0,47204,22456, + 3600,26036,49253 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,581,582, - 3600,583,584 + 0,49429,31425, + 3600,12054,27951 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,585,586, - 3600,587,588 + 0,22478,51031, + 3600,53335,18640 ] } } @@ -13685,36 +13881,36 @@ } }, { - "id":"sampled217", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,13,14,15,12, - 3600,17,18,19,16 + 0,78,72,114,131, + 3600,53,121,5,189 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,21,22,23,20, - 3600,25,26,27,24 + 0,171,248,41,119, + 3600,246,179,239,251 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,452, - 3600,453 + 0,22252, + 3600,63736 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,454, - 3600,455 + 0,53120, + 3600,53949 ] } } @@ -13722,15 +13918,15 @@ } }, { - "id":"sampled218", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8,0.803921568627451,0.807843137254902,0.796078431372549, - 3600,0.8156862745098039,0.8196078431372549,0.8235294117647058,0.8117647058823529 + 0,0.7372549019607844,0.3137254901960784,0.5333333333333333,0.44313725490196076, + 3600,0.5372549019607843,0.9647058823529412,0.21568627450980393,0.6588235294117647 ] } } @@ -13738,15 +13934,15 @@ } }, { - "id":"sampled219", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8313725490196079,0.8352941176470589,0.8392156862745098,0.8274509803921568, - 3600,0.8470588235294118,0.8509803921568627,0.8549019607843137,0.8431372549019608 + 0,0.7490196078431373,0.7607843137254902,0.7333333333333333,0.4823529411764706, + 3600,0.2235294117647059,0.5882352941176471,0.39215686274509803,0.5098039215686274 ] } } @@ -13754,15 +13950,15 @@ } }, { - "id":"sampled220", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8627450980392157,0.8666666666666667,0.8705882352941177,0.8588235294117647, - 3600,0.8784313725490196,0.8823529411764706,0.8862745098039215,0.8745098039215686 + 0,0.5647058823529412,0.34901960784313724,0.1450980392156863,0.44313725490196076, + 3600,0.023529411764705882,0.596078431372549,0.8588235294117647,0.047058823529411764 ] } } @@ -13770,15 +13966,15 @@ } }, { - "id":"sampled221", + "id":"sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "ellipsoidHorizonSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.8941176470588236,0.8980392156862745,0.9019607843137255,0.8901960784313725, - 3600,0.9098039215686274,0.9137254901960784,0.9176470588235294,0.9058823529411765 + 0,0.9137254901960784,0.7294117647058823,0.7137254901960784,0.7254901960784313, + 3600,0.592156862745098,0.9529411764705882,0.4745098039215686,0.8 ] } } @@ -13786,15 +13982,15 @@ } }, { - "id":"sampled222", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_solidColor_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9254901960784314,0.9294117647058824,0.9333333333333333,0.9215686274509803, - 3600,0.9411764705882353,0.9450980392156862,0.9490196078431372,0.9372549019607843 + 0,0.10980392156862745,0.7058823529411765,0.6980392156862745,0.7333333333333333, + 3600,0.7254901960784313,0.6274509803921569,0.596078431372549,0.06274509803921569 ] } } @@ -13802,22 +13998,22 @@ } }, { - "id":"sampled223", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_image", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,589,590, - 3600,591,592 + 0,32842,39552, + 3600,1658,6662 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,29,30,31,28, - 3600,33,34,35,32 + 0,23,109,70,110, + 3600,145,162,148,145 ] } } @@ -13825,43 +14021,43 @@ } }, { - "id":"sampled224", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_grid", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,37,38,39,36, - 3600,41,42,43,40 + 0,228,38,182,37, + 3600,90,71,163,159 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,456, - 3600,457 + 0,46557, + 3600,63381 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,593,594, - 3600,595,596 + 0,28334,23918, + 3600,33281,50050 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,597,598, - 3600,599,600 + 0,63911,12025, + 3600,39352,60313 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,601,602, - 3600,603,604 + 0,27723,47724, + 3600,25108,20066 ] } } @@ -13869,36 +14065,36 @@ } }, { - "id":"sampled225", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,45,46,47,44, - 3600,49,50,51,48 + 0,239,63,112,19, + 3600,203,111,250,39 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,53,54,55,52, - 3600,57,58,59,56 + 0,221,185,121,189, + 3600,17,205,57,29 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,458, - 3600,459 + 0,12138, + 3600,63703 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,460, - 3600,461 + 0,43570, + 3600,2074 ] } } @@ -13906,15 +14102,15 @@ } }, { - "id":"sampled226", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_image_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9568627450980393,0.9607843137254902,0.9647058823529412,0.9529411764705882, - 3600,0.9725490196078431,0.9764705882352941,0.9803921568627451,0.9686274509803922 + 0,0.07450980392156863,0.5568627450980392,0.9450980392156862,0.11372549019607843, + 3600,0.4117647058823529,0.5058823529411764,0.6549019607843137,0.3764705882352941 ] } } @@ -13922,15 +14118,15 @@ } }, { - "id":"sampled227", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_grid_color", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.9882352941176471,0.9921568627450981,0.996078431372549,0.984313725490196, - 3600,0.00392156862745098,0.00784313725490196,0.011764705882352941,0 + 0,0.25098039215686274,0.0196078431372549,0.4,0.24313725490196078, + 3600,0.12941176470588237,0.6,0.7490196078431373,0.2784313725490196 ] } } @@ -13938,15 +14134,15 @@ } }, { - "id":"sampled228", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe_evenColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.0196078431372549,0.023529411764705882,0.027450980392156862,0.01568627450980392, - 3600,0.03529411764705882,0.0392156862745098,0.043137254901960784,0.03137254901960784 + 0,0.7019607843137254,0.6196078431372549,0.34509803921568627,0.050980392156862744, + 3600,0.8549019607843137,0.5019607843137255,0.9058823529411765,0.25882352941176473 ] } } @@ -13954,15 +14150,15 @@ } }, { - "id":"sampled229", + "id":"sampled_rectangularSensor_domeSurfaceMaterial_stripe_oddColor", "agi_rectangularSensor":{ "domeSurfaceMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.050980392156862744,0.054901960784313725,0.058823529411764705,0.047058823529411764, - 3600,0.06666666666666667,0.07058823529411765,0.07450980392156863,0.06274509803921569 + 0,0.01568627450980392,0.592156862745098,0.5725490196078431,0.9882352941176471, + 3600,0.9647058823529412,0.27450980392156865,0.07450980392156863,0.3137254901960784 ] } } @@ -13970,15 +14166,15 @@ } }, { - "id":"sampled230", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_solidColor_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.08235294117647059,0.08627450980392157,0.09019607843137255,0.0784313725490196, - 3600,0.09803921568627451,0.10196078431372549,0.10588235294117647,0.09411764705882353 + 0,0.06666666666666667,0.26666666666666666,0.5843137254901961,0.9294117647058824, + 3600,0.7019607843137254,0.1803921568627451,0.9019607843137255,0.7529411764705882 ] } } @@ -13986,22 +14182,22 @@ } }, { - "id":"sampled231", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_image", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,605,606, - 3600,607,608 + 0,19700,62796, + 3600,47399,44729 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,61,62,63,60, - 3600,65,66,67,64 + 0,109,139,89,7, + 3600,44,196,205,58 ] } } @@ -14009,43 +14205,43 @@ } }, { - "id":"sampled232", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_grid", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,69,70,71,68, - 3600,73,74,75,72 + 0,184,7,85,40, + 3600,113,30,153,94 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,462, - 3600,463 + 0,31388, + 3600,50246 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,609,610, - 3600,611,612 + 0,47281,7864, + 3600,39095,25240 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,613,614, - 3600,615,616 + 0,3327,5644, + 3600,25573,63843 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,617,618, - 3600,619,620 + 0,38263,47765, + 3600,65149,50686 ] } } @@ -14053,36 +14249,36 @@ } }, { - "id":"sampled233", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,77,78,79,76, - 3600,81,82,83,80 + 0,7,198,5,254, + 3600,58,1,207,7 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,85,86,87,84, - 3600,89,90,91,88 + 0,132,103,81,252, + 3600,132,126,121,50 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,464, - 3600,465 + 0,25002, + 3600,49962 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,466, - 3600,467 + 0,42274, + 3600,48798 ] } } @@ -14090,15 +14286,15 @@ } }, { - "id":"sampled234", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_image_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.11372549019607843,0.11764705882352941,0.12156862745098039,0.10980392156862745, - 3600,0.12941176470588237,0.13333333333333333,0.13725490196078433,0.12549019607843137 + 0,0.22745098039215686,0.4549019607843137,0.5176470588235295,0.11372549019607843, + 3600,0.29411764705882354,0.4745098039215686,0.6509803921568628,0.07058823529411765 ] } } @@ -14106,15 +14302,15 @@ } }, { - "id":"sampled235", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_grid_color", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.1450980392156863,0.14901960784313725,0.15294117647058825,0.1411764705882353, - 3600,0.1607843137254902,0.16470588235294117,0.16862745098039217,0.1568627450980392 + 0,0.8509803921568627,0.6588235294117647,0.7529411764705882,0.24705882352941178, + 3600,0.10980392156862745,0.43529411764705883,0.6745098039215687,0.7490196078431373 ] } } @@ -14122,15 +14318,15 @@ } }, { - "id":"sampled236", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.17647058823529413,0.1803921568627451,0.1843137254901961,0.17254901960784313, - 3600,0.19215686274509805,0.19607843137254902,0.2,0.18823529411764706 + 0,0.4392156862745098,0.4470588235294118,0.4549019607843137,0.6431372549019608, + 3600,0.00392156862745098,0.8470588235294118,0.7294117647058823,0.7450980392156863 ] } } @@ -14138,15 +14334,15 @@ } }, { - "id":"sampled237", + "id":"sampled_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor", "agi_rectangularSensor":{ "environmentOcclusionMaterial":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.20784313725490197,0.21176470588235294,0.21568627450980393,0.20392156862745098, - 3600,0.2235294117647059,0.22745098039215686,0.23137254901960785,0.2196078431372549 + 0,0.33725490196078434,0.4588235294117647,0.2901960784313726,0.26666666666666666, + 3600,0.4666666666666667,0.592156862745098,0.7490196078431373,0.1411764705882353 ] } } @@ -14154,27 +14350,27 @@ } }, { - "id":"sampled238", + "id":"sampled_rectangularSensor_environmentIntersectionColor_rgbaf", "agi_rectangularSensor":{ "environmentIntersectionColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.23921568627450981,0.24313725490196078,0.24705882352941178,0.23529411764705882, - 3600,0.2549019607843137,0.25882352941176473,0.2627450980392157,0.25098039215686274 + 0,0.788235294117647,0.8156862745098039,0.3568627450980392,0.08235294117647059, + 3600,0.5098039215686274,0.49411764705882355,0.984313725490196,0.5490196078431373 ] } } }, { - "id":"sampled239", + "id":"sampled_fan_material_solidColor_color", "agi_fan":{ "material":{ "solidColor":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.27058823529411763,0.27450980392156865,0.2784313725490196,0.26666666666666666, - 3600,0.28627450980392155,0.2901960784313726,0.29411764705882354,0.2823529411764706 + 0,0.9372549019607843,0.24705882352941178,0.43137254901960786,0.6705882352941176, + 3600,0.33725490196078434,0.25098039215686274,0.8901960784313725,0.30196078431372547 ] } } @@ -14182,22 +14378,22 @@ } }, { - "id":"sampled240", + "id":"sampled_fan_material_image", "agi_fan":{ "material":{ "image":{ "repeat":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,621,622, - 3600,623,624 + 0,58726,59621, + 3600,46654,63670 ] }, "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,93,94,95,92, - 3600,97,98,99,96 + 0,216,94,86,115, + 3600,82,234,215,175 ] } } @@ -14205,43 +14401,43 @@ } }, { - "id":"sampled241", + "id":"sampled_fan_material_grid", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,101,102,103,100, - 3600,105,106,107,104 + 0,200,56,170,12, + 3600,168,225,32,247 ] }, "cellAlpha":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,468, - 3600,469 + 0,190, + 3600,41775 ] }, "lineCount":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,625,626, - 3600,627,628 + 0,10435,52008, + 3600,35404,57482 ] }, "lineThickness":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,629,630, - 3600,631,632 + 0,44794,63406, + 3600,17262,1347 ] }, "lineOffset":{ "epoch":"2016-06-17T12:00:00Z", "cartesian2":[ - 0,633,634, - 3600,635,636 + 0,35392,13706, + 3600,21580,53844 ] } } @@ -14249,36 +14445,36 @@ } }, { - "id":"sampled242", + "id":"sampled_fan_material_stripe", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,109,110,111,108, - 3600,113,114,115,112 + 0,84,13,181,112, + 3600,149,17,180,191 ] }, "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgba":[ - 0,117,118,119,116, - 3600,121,122,123,120 + 0,233,177,162,91, + 3600,130,61,125,114 ] }, "offset":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,470, - 3600,471 + 0,51679, + 3600,59208 ] }, "repeat":{ "epoch":"2016-06-17T12:00:00Z", "number":[ - 0,472, - 3600,473 + 0,19977, + 3600,19954 ] } } @@ -14286,15 +14482,15 @@ } }, { - "id":"sampled243", + "id":"sampled_fan_material_image_color", "agi_fan":{ "material":{ "image":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.30196078431372547,0.3058823529411765,0.30980392156862746,0.2980392156862745, - 3600,0.3176470588235294,0.3215686274509804,0.3254901960784314,0.3137254901960784 + 0,0.9490196078431372,0.6941176470588235,0.9098039215686274,0.3176470588235294, + 3600,0.8784313725490196,0.08235294117647059,0.7529411764705882,0.2235294117647059 ] } } @@ -14302,15 +14498,15 @@ } }, { - "id":"sampled244", + "id":"sampled_fan_material_grid_color", "agi_fan":{ "material":{ "grid":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.3333333333333333,0.33725490196078434,0.3411764705882353,0.32941176470588235, - 3600,0.34901960784313724,0.35294117647058826,0.3568627450980392,0.34509803921568627 + 0,0.4117647058823529,0.4235294117647059,0.3764705882352941,0.5019607843137255, + 3600,0.8823529411764706,0.03137254901960784,0.13725490196078433,0.9490196078431372 ] } } @@ -14318,15 +14514,15 @@ } }, { - "id":"sampled245", + "id":"sampled_fan_material_stripe_evenColor", "agi_fan":{ "material":{ "stripe":{ "evenColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.36470588235294116,0.3686274509803922,0.37254901960784315,0.3607843137254902, - 3600,0.3803921568627451,0.3843137254901961,0.38823529411764707,0.3764705882352941 + 0,0.00392156862745098,0.16470588235294117,0.9019607843137255,0.9215686274509803, + 3600,0.33725490196078434,0.27450980392156865,0.6,0.6941176470588235 ] } } @@ -14334,15 +14530,15 @@ } }, { - "id":"sampled246", + "id":"sampled_fan_material_stripe_oddColor", "agi_fan":{ "material":{ "stripe":{ "oddColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.396078431372549,0.4,0.403921568627451,0.39215686274509803, - 3600,0.4117647058823529,0.41568627450980394,0.4196078431372549,0.40784313725490196 + 0,0.0392156862745098,0.611764705882353,0.8,0.3254901960784314, + 3600,0.17647058823529413,0.8470588235294118,0.8784313725490196,0.023529411764705882 ] } } @@ -14350,61 +14546,61 @@ } }, { - "id":"sampled247", + "id":"sampled_fan_outlineColor_rgbaf", "agi_fan":{ "outlineColor":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.42745098039215684,0.43137254901960786,0.43529411764705883,0.4235294117647059, - 3600,0.44313725490196076,0.4470588235294118,0.45098039215686275,0.4392156862745098 + 0,0.1411764705882353,0.6784313725490196,0.6705882352941176,0.9254901960784314, + 3600,0.5411764705882353,0.7607843137254902,0.38823529411764707,0.12941176470588237 ] } } }, { - "id":"sampled248", + "id":"sampled_vector_color_rgbaf", "agi_vector":{ "color":{ "epoch":"2016-06-17T12:00:00Z", "rgbaf":[ - 0,0.4588235294117647,0.4627450980392157,0.4666666666666667,0.4549019607843137, - 3600,0.4745098039215686,0.47843137254901963,0.4823529411764706,0.47058823529411764 + 0,0.3058823529411765,0.9803921568627451,0.796078431372549,0.24313725490196078, + 3600,0.5686274509803921,0.6352941176470588,0.6588235294117647,0.0196078431372549 ] } } }, { - "id":"sampled249", + "id":"sampled_vector_direction_unitSpherical", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "unitSpherical":[ - 0,9,10, - 3600,11,12 + 0,42298,7077, + 3600,35027,44936 ] } } }, { - "id":"sampled250", + "id":"sampled_vector_direction_cartesian", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "cartesian":[ - 0,70,71,72, - 3600,73,74,75 + 0,23178,55642,4825, + 3600,11195,57387,64992 ] } } }, { - "id":"sampled251", + "id":"sampled_vector_direction_unitCartesian", "agi_vector":{ "direction":{ "epoch":"2016-06-17T12:00:00Z", "unitCartesian":[ - 0,0.5352015302352019,0.5763708787148328,0.6175402271944639, - 3600,0.542762825242207,0.576685501819845,0.610608178397482 + 0,0.5532827915003591,0.6961099100967651,0.4575031646826541, + 3600,0.7546657014303162,0.11520131359926604,0.6459166636878882 ] } } diff --git a/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/batchedWithKHRMaterialsCommon.b3dm b/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/batchedWithKHRMaterialsCommon.b3dm new file mode 100644 index 000000000000..fab6cb074ed9 Binary files /dev/null and b/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/batchedWithKHRMaterialsCommon.b3dm differ diff --git a/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/tileset.json b/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/tileset.json new file mode 100644 index 000000000000..f9fe0ca601fc --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Batched/BatchedWithKHRMaterialsCommon/tileset.json @@ -0,0 +1,37 @@ +{ + "asset": { + "version": "0.0" + }, + "properties": { + "Longitude": { + "minimum": -1.3196972173766555, + "maximum": -1.3196718547473905 + }, + "Latitude": { + "minimum": 0.6988624606923348, + "maximum": 0.6988888301460953 + }, + "Height": { + "minimum": 6.2074098233133554, + "maximum": 12.83180232718587 + } + }, + "geometricError": 70, + "root": { + "refine": "add", + "boundingVolume": { + "region": [ + -1.3197004795898053, + 0.6988582109, + -1.3196595204101946, + 0.6988897891, + 0, + 20 + ] + }, + "geometricError": 0, + "content": { + "url": "batchedWithKHRMaterialsCommon.b3dm" + } + } +} diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm new file mode 100644 index 000000000000..77156b3dccb6 Binary files /dev/null and b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tile.b3dm differ diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json new file mode 100644 index 000000000000..cd19543ab8eb --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchy/tileset.json @@ -0,0 +1,47 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 70, + "root": { + "transform": [ + 0.9686356343768792, + 0.24848542777253735, + 0, + 0, + -0.15986460744966327, + 0.623177611820219, + 0.765567091384559, + 0, + 0.19023226619126932, + -0.7415555652213445, + 0.6433560667227647, + 0, + 1215011.9317263428, + -4736309.3434217675, + 4081602.0044800863, + 1 + ], + "refine": "add", + "boundingVolume": { + "box": [ + 0, + 0, + 25, + 100, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 50 + ] + }, + "geometricError": 0, + "content": { + "url": "tile.b3dm" + } + } +} diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm new file mode 100644 index 000000000000..eb06f1087456 Binary files /dev/null and b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tile.b3dm differ diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json new file mode 100644 index 000000000000..cd19543ab8eb --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyBinary/tileset.json @@ -0,0 +1,47 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 70, + "root": { + "transform": [ + 0.9686356343768792, + 0.24848542777253735, + 0, + 0, + -0.15986460744966327, + 0.623177611820219, + 0.765567091384559, + 0, + 0.19023226619126932, + -0.7415555652213445, + 0.6433560667227647, + 0, + 1215011.9317263428, + -4736309.3434217675, + 4081602.0044800863, + 1 + ], + "refine": "add", + "boundingVolume": { + "box": [ + 0, + 0, + 25, + 100, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 50 + ] + }, + "geometricError": 0, + "content": { + "url": "tile.b3dm" + } + } +} diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm new file mode 100644 index 000000000000..56b174d069ee Binary files /dev/null and b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tile.b3dm differ diff --git a/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json new file mode 100644 index 000000000000..cd19543ab8eb --- /dev/null +++ b/Specs/Data/Cesium3DTiles/Hierarchy/BatchTableHierarchyMultipleParents/tileset.json @@ -0,0 +1,47 @@ +{ + "asset": { + "version": "0.0" + }, + "geometricError": 70, + "root": { + "transform": [ + 0.9686356343768792, + 0.24848542777253735, + 0, + 0, + -0.15986460744966327, + 0.623177611820219, + 0.765567091384559, + 0, + 0.19023226619126932, + -0.7415555652213445, + 0.6433560667227647, + 0, + 1215011.9317263428, + -4736309.3434217675, + 4081602.0044800863, + 1 + ], + "refine": "add", + "boundingVolume": { + "box": [ + 0, + 0, + 25, + 100, + 0, + 0, + 0, + 100, + 0, + 0, + 0, + 50 + ] + }, + "geometricError": 0, + "content": { + "url": "tile.b3dm" + } + } +} diff --git a/Specs/Data/Images/Blue2x2.png b/Specs/Data/Images/Blue2x2.png new file mode 100644 index 000000000000..e604f8cbee00 Binary files /dev/null and b/Specs/Data/Images/Blue2x2.png differ diff --git a/Specs/Data/Images/Green2x2.png b/Specs/Data/Images/Green2x2.png new file mode 100644 index 000000000000..2247add0559e Binary files /dev/null and b/Specs/Data/Images/Green2x2.png differ diff --git a/Specs/Data/Images/Green4x4.crn b/Specs/Data/Images/Green4x4.crn new file mode 100644 index 000000000000..d32561e1af30 Binary files /dev/null and b/Specs/Data/Images/Green4x4.crn differ diff --git a/Specs/Data/Images/Green4x4.ktx b/Specs/Data/Images/Green4x4.ktx new file mode 100644 index 000000000000..b251f62c3f5e Binary files /dev/null and b/Specs/Data/Images/Green4x4.ktx differ diff --git a/Specs/Data/Images/Green4x4DXT1.KTX b/Specs/Data/Images/Green4x4DXT1.KTX new file mode 100644 index 000000000000..7d013e8d2e94 Binary files /dev/null and b/Specs/Data/Images/Green4x4DXT1.KTX differ diff --git a/Specs/Data/Images/Green4x4ETC1.ktx b/Specs/Data/Images/Green4x4ETC1.ktx new file mode 100644 index 000000000000..d3d1123c0906 Binary files /dev/null and b/Specs/Data/Images/Green4x4ETC1.ktx differ diff --git a/Specs/Data/Images/Green4x4PVR.ktx b/Specs/Data/Images/Green4x4PVR.ktx new file mode 100644 index 000000000000..c6fe6296866f Binary files /dev/null and b/Specs/Data/Images/Green4x4PVR.ktx differ diff --git a/Specs/Data/Images/Red256x256.png b/Specs/Data/Images/Red256x256.png new file mode 100644 index 000000000000..693565bf26b3 Binary files /dev/null and b/Specs/Data/Images/Red256x256.png differ diff --git a/Specs/Data/Images/White2x2.png b/Specs/Data/Images/White2x2.png new file mode 100644 index 000000000000..7ea0256ddd34 Binary files /dev/null and b/Specs/Data/Images/White2x2.png differ diff --git a/Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb b/Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb new file mode 100644 index 000000000000..1930d0d634ec Binary files /dev/null and b/Specs/Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb differ diff --git a/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt b/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt new file mode 100644 index 000000000000..b0958ffb1be8 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Binary/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-CRN, except it is "Binary glTF" using the KHR_binary_glTF (CesiumTexturedBoxTest.glb) extensions. diff --git a/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..2db727d6f041 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf @@ -0,0 +1,275 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_1", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR", + "min": [ + 0 + ], + "max": [ + 23 + ] + }, + "accessor_23": { + "bufferView": "bufferView_0", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_0", + "byteOffset": 288, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_0", + "byteOffset": 576, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_0": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 0, + "target": 34962 + }, + "bufferView_1": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 768, + "target": 34963 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "type": "arraybuffer", + "byteLength": 840, + "uri": "data:application/octet-stream;base64,AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAL8AAAC/AAAAPwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAADAQAAAAAAAAKBAAAAAAAAAwED+/38/AACgQP7/fz8AAIBAAAAAAAAAoEAAAAAAAACAQAAAgD8AAKBAAACAPwAAAEAAAAAAAACAPwAAAAAAAABAAACAPwAAgD8AAIA/AABAQAAAAAAAAIBAAAAAAAAAQEAAAIA/AACAQAAAgD8AAEBAAAAAAAAAAEAAAAAAAABAQAAAgD8AAABAAACAPwAAAAAAAAAAAAAAAP7/fz8AAIA/AAAAAAAAgD/+/38/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "data:image/crn;base64,SHgASmGqAAAT7ZSwAQABAAEBAAAAAAAAAAAAAAAAAAAAAABKAALtAncAAzcAAxoBqwAAAAAAAAAAAAAAAAAAAAABTgAGUQAAB58AgnAA20AwBBBM1yWiohAfKgkfAIE5AGoqIAKKLztBYugnMxwOg2MCH69+v58/n98McAAAAKgAAAAAAAAAAAAAAAAACAhUVAAABUFACAQuQQAKEABQAoGhg270Abve+duW28e/jdxefj4QSBCoKNIOAwiFAA4FQAQQCCAAAg6DAEwDMYAAAAaoKAAIAUAAYAEIAACAEAAABYoBIIAxjgEAAAGCmYARUSCuBQgOQAkKgAgIBJM8evi5yoxAAAAAAAAAAAAAAAAAAAMcMcAAOLwABsoAAY4AAAAAAACjAAwAjAAAAwGY42bQ70GDuDvQwAAAAAAjGYAAADBgAAAAMARNgADAAAABgAAAAAAAAAAABgARgDMYAAoAAAAABgMACM3SAAAAYADAAAABgbBUAEBACgRlEA5yAAAAACCBQAAIGMoiAAMQSAAAAQAABgSKAAAAIAAAAAAAAAAAICQAEAAAAYNgAAxsAAAAAADGJz2qAAIIFAAAggAAAUACACoAQAEAEC4AAFQoKAAACgAAAAQAUAAEAggAAAAAoAAAADABgMEFQAA750AbA6DBtgGBGbuG2DBu7bO9UAAO65xMBAx68hs655egPHx4vQUCgBUAEBCgAXke/r7G70bZt3zqtsNsDBgYDDAA3cGwcDdAwYANsAzdZlgBVVu9AGA2YAMwADABmADAYBg2wCkZCbYbGwAxDEQDdzADAAJhjAAZGNneIAJIV7hznO96VLgiQAASACAd73v37bbYCrZc5T1//XvzphgRsGzMwDvnfn8+DEVKEEcNmqmDnOefj8Zb1/AIS43QGzJn++sBgAABj28NvfmoAB0h0jpAAHSbizA71Td1QuAICAAACggAIAKh3ve+OGLjYA4Y75Xf/9+++Kd6R0Y5pzo4eu/e+Pzxtuc2UCCKAAAAAAIBQDYAwAAAAAAAAAAAAAPc651ez15Dz5vv0bOc/fzt3P1x/t38eeedpz2hzj+/36fP13vquAAAAADGbACgYdcEAFZKYJQI93qHvsQPs/GEXJ1sAAUB4FAHAKAgoAoNABAKBoDQCAM4Bwr6fgCgPQaAWA84HztFDAICA0BSqawI9JPhzMr6BMgGtDcA4AKHUBeBu6BlATANwIAGgaAcQAQB4RAAVHgeBoNa1rnK4cPAoCwAo4hwdoNAHAcAaDAEHA4BwOAEBoCAKINQR8q888888Cy/jQKaAoSrEbYC6R5XAaFUcHECxQ8QBVEAQBQFUFA4BwDQHADgHADhrQAcOcHAARogIC6BvcA1wUgDHA5xALAKrwqiCIIgjhB9wDgCAYBoA4BwD4AzOBrQGAGYHt9pE5wafD7844MaAGR4BAA5xwOAGMaOARoOVfB3socwG5MAmAaCAOcA5Ac6gKA8AKDgLAEA8AgBEAoGQHoAoBgGsBwDQCA0AoFUDYBgGMBHAHve97LQEBoD5AANAlA8CNBz+KA8CuVQUGig192tGh1A3VBoFAQHANxge9ACgSAEABy+4R1Az9wHxzgRG//y5cvfCqqsc4AcoNGtGg80AHgBHn4s/MFIcJQ400qgIbfiIF8I/vYB4PGh6AChYAoDX3BAAa1w0GgDWvPlzFQcCIqqCgCgCArga4DQKAdAM4CcDQHANAIGlgFCgNbpobw0AdQ4ANBqmtqmOdoNYUNBoZvAic4ocHEIgPypwTA3OBe93g95QoU4N5pVgsAaFKEe0I954C+CACgEDgBQHwDmDhQFcAOEBzEGgiN7mM7e5wAQATRVGvv29QBQ3G85dIjDeY0HNoab1AbgaAc4GtFV9PH18X4DvKGtx9m+PsEAdwCRETPr9fX6AKD3gCQMywGgKoC8A4AcCDnIDhEaA8aENAQCgN4VX5AAQGgNAWgIAYBoIAKg5ggKAOAgCgcA3gBQQAFHAgD5aANaNa0zFVvUD8+iCAIAk68OIpvMHwKMGp6/z4ZlIDQH3UH6zB/IPT/lBc+3ve9uTBt2hrQV0Pu+wMNRlx0+fwryIgHnr6+KAKv2/gF+fr/b/rn/vbxzhrH7nO3if6/r7f3P6caH+f5f19v2/b9gCAJogAAAAAAALk/v7+nQTvOjBTsIIAAD/t27u3f+7bdz3du2y7O53/sru5zPwZhy6aVm1pn71sQSglA2JiiJ8aFSEm8K8YG+yIgUgggitCGrwqKLTRCUhQQRUED4xUVaIUvFJnwnMpgiy6aIqG18IOYKCgcjQ3waiHEXxg0gzGtSVJV4sildQzXgg3jDfXhQXhAheNeV4wkFCCRXgxeCFBBeEN4JUMtaiBqCivBIbbww7WiVvnS61Z18Zdo31bt22V3O7Xb47v+7bt2Bq54UOdBBAAAf93AcFydSFASA8LHhiI0KxeGpCOEJEZpNYz43E7GBpUjkg5cyJ4Sakz5BoHId/OBkXGvOW2naulMa87NtOq2mjMGPCTSudgYrVkBQO/wI/FqLOKy6oXdOpgWaZklYEOBC2bTFMOARMZl+EsxlKLQWhEBeHrLMLrg47upiQAAAQAAAIAAAEAAACAABHAzjKqIGLR+UD/6OBnAAAAQAAAIAAAEAAACAAABAAAAgAAAQAAAJAhAc2xhzcdCw3R4TV7B+nZdlt1Wx8Jite/j5L3eA970v5V+tG4yfHdXHSfvu1aHMZus/5i/Beeg5fzlc+A7XEfDmdrn/ZXX2XYvmSD3GJxnDM0jfQIbCXYgWgYQAAAIAAAEAAACAAABAAAAgAAARZBcrbTc5jLvrd1jL5mO5T2Q+DH8f8bbsIzdNIODIEEAIAAAEAAGWzJAguP8r51A6numzYHeI+9US18P8rc63QX6Y5Hgv6Gy+k8u4i+AABAAAAgAAAQAAAIAAAEAishoeGO61mpYjedrzfeWbzm0UvEv52+/gAAgAAAQAAAIAAAEAkcUWyRO+SlQtnL1fUavqkbT6jFoajXMZ4AEAAACAAABAAAAgAiQydXiM5cvM7bmfXRsxD8ncIsAAIAAAEAAACAAABAAAAgABB121ScDhKxJ7lreof47mzedx11SE3SAAQAAAIAAAEAACi5MNc46uzGe8zjtf3LyO3tfpfcgCAAABAAAAgAAAQAAAIAAAEAANp26TmMptUnF9X5/O5cwMLsv3yQ2oTYCAAABAAAAgEhVprPV7mK7kvPkzFEAAACAAABAAAAgAAAQAAAIAAAEAAFm84ddtzrn8NP4/P0fG567jfQAQAAAIAAS196FcZrL52leB7zudOk/G9Vb8OL+ACAABgpQ4XAcZUPY3+Mirpu/h5z2lO56tz/qNbPNQ5TvlB2oAACAAABAAAAgAAAQAAsUvisfd6zQIrXszmdITeWwX5xbQAQAAAIzUTaI3ezei5T9vE1SGAQAAAIAAAEAAACAAABAACNtPe/l/F6ewVTJjMhPRZH4Nxdi3vuPVRPiafTR+EAABAACc1/32veeumw6j+J4j03q0LMAABAACtXHSLBiLL+jEdVpnML5b7+AACAAAB33WN62aiYzct134yOzEJEiZHh+gcVVPpY/+We2MWUAEAAACAAABAAAAgAAAQCPxZbJEr2f9v+O16OtW5D0gAACMqDOrbZLXRt2qGXowgiAAABAAAAgAAAQAAAIAAAGT8f5ODJ6mrwPU5f2G0xvrNs1Vd/lgNn+FNq1320+YJ/FAAAQAAAIBy2wbvsdw9b0UdcFJxu4iAAEr/3ZNxmsvu/4PAWTpFFtOPzWo7nhfZUuewPP+/8ITU7Kfkh2gAACAAABAAAAgAAAQA8vZSt0qUnpfmIbmZXeOxUG+RPmuf0strmC9BB/fF1PWtfJDrS1ZsYUAABAAAA+OtMZO5iodpT69mF/zlN5ai3gaAQCBWe0fOXn/Udt8UXiCQAAAIAAKGo2ck7dg4emVjWMpis3i48qGYACyMSWyRXybzzH+1slg4TrdSqUzxeA4CKz4+QAAAgAAAQAAAIAAMHUd2QIO0cDH1DNpnsOmzONpJUcuAGLjpuQ63oN/w+4AADr0flczQ7FXMLOtGgxihQvEGWf7IbiBqRb+cf+0bmL1qu3r5h5AtenDCAAAIAAAEAAADKYK1WWBB3TpN+unRL9prTuVuzEYETOLycDzp0OMJ5rHEmYaIhd/EwOs595DoOV4Dj5LsxiKER3LB9YAABAADu2/6xvs4/hWLH66MCBHBnHr/B7prlg6Gw4oQQAAEAEmJO7b5Q1D6nZy3IZGSIXMAp4m1Klcf1+E3CXkc5R8aoPg6RwuC1aU6rGcdw9riNO+9sfN2f68AvHI6d+vIeBun6rGyMTz6deHAAAAgAAAQAQRAvnrZnRWa8e6YFNKrBENQ5uIaj969/1KcxmmveBEY1sMtnmcZpxdb/PesnFyalcz7IaRjoegD6/5tM0m417FRtxHODP0Yn+mN40Op9c22sZPrPSkNUhvtTNm/iV/zOTzKQps0u1iFjEAAACAABBwZAg/Q+btv9N5oPKWnTZyOVq24IS19LVhfReR7TwVWzuR9f1YYEAGLnikf2Pi6JQ6rs94+ZstsGNH/ObwoGxdxAg1/AUn3khHZKhWEY4QAAAPKy2A0CJ0cTYupx05HQROR05HBl6x+6VibFidHDAACAKLT7M5OL4Ol6DMy0++bqszAFVms7TmWrEV0+jT/5Mz5XwYAAAFE5EpPeuAu2w/Atez5vzfJD7IrvnRkKs+3tfp7D0nS+xiaiMAIAAAEAQMr25xveZbGaXiMsht+qWWgDnXL8+TiZ2/VruRF1IAAQtK/V+Whxv469sNBSMduYi54Dh9HutbuMXkPU/yDEgAAP0NUzPB8Xf/Z/Tl4N/rNT8l4t548cYP4M+xtX+ryv/+2r8nMWiQk4uK2oZoQAAg4PdfGQINf8t9rcdM5P59trNuqowI5pe9JvVKztVz/sdZ/nkslvd+52IHAgAgAAAfn9gpWExcd7D6MvKYLnNThJnWuQHgD17dIur8xyVz6LthkqEQkQJkQDXfe3GVoVhkq/2SOnEEQDxOr9q9vD8Fhq5lQ6MQDIbhVIMD0OE5aSiibZYjLxNZGpUfpkRVYWqQwjxAAAAgAAAY/hNRqmu+uwvkPRw2hXO54bf8OAbretR43I6aNymwMVI/YV3FgEZAQJW1USpQds1dzp4ywjMhOIzvHydSh+v9vhoAlBAAAAxHRuM0umxXa1WGFcAB9tY+OqfotBcuN+wRkAok6NCIAAZSiGDjz8KtcprO01qvdB6gymNIS881KfmT1Tdan4vsuxmLxf3ltojW5/3t1n3a77HrvI2TpWLj1ij8GMxvxasLtPs+28He7tkd56mMEAAAgAAAQAAouTKPnzvWiTdg9PePk1f1Y6Mf2q0/RqZnIEHX9tj6XIbJa6jtExtm2UOLjP8dirlw3ns7H9+y+7jEAAWO2eKbF3De5+UyFowEl3eMjTiuVACq9BlycarcO4Xagh9TfMHHgEAAACAAABAABOxhrmifo/77P9Tg/S/E+NdB9oMjElskXE5SmOw5q+qlgSo5cALnk34FO/Hq03/yFAnl1n0oAQAAAKHoKqpmc66rxuV8tdt6n0oAQCMnQPw1XEZ57b9kpdPFD7oAACAAHCdQoIEhUveSmX5vK2CpzmH9Ntpl3WERhB/4Sqf6KTWud4DwG/+LO855jrGd8k+Pw1+QAAAIAAAEAAACAAH1etcvFe+5qYlMvmlJg1OGnVZ/SREkREPCpE/TsrfeQ+qG/AAAIBs9Rs/KJG2b77nWpiZusv7qkaXiT3N9AAAgAAAQAAAIAAAEAAETkTW+/c1+N1We6mXrcTwctp9G4mE5ZwOtfvjPd6m+6XRMobB3YAAEAAACKUMjn+fXqmz3tpGyAEAAADlsyT3Tn3bf1fPbl0++bRxIw4gAAAQAAAIAAAEAAACAAABAAAAgAAAQAArN11DkNFJd/Z9YjJ1+IAABAAAAxF7lZFvf26BxExpF02ukd9S58acQAAAIAAAEAAACAAABAAAAgAAAQAAAKSw3CsjuOT7lnU7RIfITMIAQAAAIAAAH3HdN72HZOSmkb9NPZ7AUX739xVhAAAAgAAAQAAAIAAAEAAACAAABAIUDnvG+Ulc/i+l37QOV0loktLkhQAAAEAAACAACkY4HD+68Na7Po8VvnUchoP7aNK5+jgEAAACAAABAAAAgAAAQAAAIAAIUCrKLoOvxsGGk9XeJmxwqAAAgAAAQAAAIAAScwaz4hunzY3v+03SY3X61GkOCgRGM9p04duIAAAEAAACAAABAAAAgAAAYydrl4nnhf0htCv2j4XnrTJaSKiMkoIgAAAQAAAIAAAEAAADI3OrUic1/7j9n9dSvcZTvl71c1Ow9Ld7SYAAAEAAACAAABAAAAimDJTkt9LuthkrNVfYeFh8l8rGzRAAAAgAAAQAAAIAAAEAAADKYInnhF5+RsmG+dxU8/79mWzeSm1M4XiNvSP2rgl+x00jPUE6nR4YgAAAQAAJ2GJ3C4CsXuVf1rslyfSeZ6b82msMKhzandDvHV+T4eGoX/AAAEAAACAAABAAAAgAAAQAAAIAh6AEG+QERoZ84P4nfstrE46jyP3JrpuG27b/obt+OFXcb6PQ6TmfGUStfB4xeZjpVF4bt1yXeFuEXW8ncYn4c03Kl6LUOG/d+ujes1nPJqQxeVlZqVwrxpvNWHoAAAAgAAAQAAAIAAAEAAACAAABAAAAgAAAQAAo8XNAyWKoQAABAAAAgAAAQAAAIAAAAAA==" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "rootNode": { + "children": [], + "meshes": [ + "Geometry-mesh002" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ] + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "rootNode" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0KdW5pZm9ybSBzYW1wbGVyMkQgdV9kaWZmdXNlOw0KdW5pZm9ybSB2ZWM0IHVfc3BlY3VsYXI7DQp1bmlmb3JtIGZsb2F0IHVfc2hpbmluZXNzOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHZfbm9ybWFsKTsNCnZlYzQgY29sb3IgPSB2ZWM0KDAuLCAwLiwgMC4sIDAuKTsNCnZlYzQgZGlmZnVzZSA9IHZlYzQoMC4sIDAuLCAwLiwgMS4pOw0KdmVjNCBzcGVjdWxhcjsNCmRpZmZ1c2UgPSB0ZXh0dXJlMkQodV9kaWZmdXNlLCB2X3RleGNvb3JkMCk7DQpzcGVjdWxhciA9IHVfc3BlY3VsYXI7DQpkaWZmdXNlLnh5eiAqPSBtYXgoZG90KG5vcm1hbCx2ZWMzKDAuLDAuLDEuKSksIDAuKTsNCmNvbG9yLnh5eiArPSBkaWZmdXNlLnh5ejsNCmNvbG9yID0gdmVjNChjb2xvci5yZ2IgKiBkaWZmdXNlLmEsIGRpZmZ1c2UuYSk7DQpnbF9GcmFnQ29sb3IgPSBjb2xvcjsNCn0NCg==" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsNCmF0dHJpYnV0ZSB2ZWMzIGFfbm9ybWFsOw0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdW5pZm9ybSBtYXQzIHVfbm9ybWFsTWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfbW9kZWxWaWV3TWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDsNCmF0dHJpYnV0ZSB2ZWMyIGFfdGV4Y29vcmQwOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzQgcG9zID0gdV9tb2RlbFZpZXdNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sMS4wKTsNCnZfbm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiBhX25vcm1hbDsNCnZfdGV4Y29vcmQwID0gYV90ZXhjb29yZDA7DQpnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHBvczsNCn0NCg==" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + }, + "extensionsUsed": [], + "cameras": {} +} diff --git a/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt b/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt new file mode 100644 index 000000000000..1dd27843c641 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN-Embedded/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-CRN, except the crunch compressed texture is embedded in the glTF. diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin new file mode 100644 index 000000000000..79f5db410b75 Binary files /dev/null and b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.bin differ diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae new file mode 100644 index 000000000000..b07a87d4aa98 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.dae @@ -0,0 +1,126 @@ + + + + + modo 801 [Build 77509], Microsoft Windows 7 Service Pack 1 (6.1.7601 Service Pack 1) + Plug-in: [Build 77509]; Use Absolute Path: No; Merge Reference Items: No; Save Hidden Items: No; Save Cameras: No; Save Lights: No; Save Locators: Yes; Save Triangles as Triangles: Yes; Order Vertex Maps Alphabetically: Yes; Bake Matrices: No; Save Vertex Normals: Yes; Save UV Texture Coordinates: Yes; Save Vertex Colors: No; Save Vertex Weights: No; Save Animation: Yes; Sample Animation: No; Sample Animation Start: 0; Sample Animation End: 120; Save modo Profile: No; Save Maya Profile: No; Save 3ds Max Profile: No; Formatted Arrays: No; + file:///C:/Users/Branden/Creative%20Cloud%20Files/03-2015%20Cesium%20Test%20Models/CesiumTexturedBoxTest.lxo + + 2015-03-04T16:58:00Z + 2015-03-04T16:58:00Z + Z_UP + + + + Cesium_Logo_Flat.png + + + + + + + + + + + + + Image0001 + A8R8G8B8 + + + + + Image0001-surface + LINEAR_MIPMAP_LINEAR + LINEAR + + + + + + + + + 0.2 0.2 0.2 1 + + + 256 + + + + + + + + + + + -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 + + + + + + + + + + 0 0 1 1 0 0 0 1 0 0 -1 0 -1 0 0 0 0 -1 + + + + + + + + + + 6 1 5 1 6 1.09011e-007 5 1.09011e-007 4 1 5 1 4 1.02033e-008 5 1.02033e-008 2 1 1 1 2 1.02033e-008 1 1.02033e-008 3 1 3 1.02033e-008 0 1 0 1.09011e-007 1 1 1 1.09011e-007 + + + + + + + + + + + + + + +

    4 0 0 6 0 1 5 0 2 7 0 3 5 0 2 6 0 1 7 1 4 6 1 5 2 1 6 3 1 7 2 1 6 6 1 5 5 2 8 7 2 9 1 2 10 2 2 11 1 2 10 7 2 9 6 3 12 4 3 4 3 3 13 0 3 6 3 3 13 4 3 4 4 4 12 5 4 8 0 4 13 1 4 10 0 4 13 5 4 8 0 5 14 1 5 15 3 5 16 2 5 17 3 5 16 1 5 15

    + + + + + + + + + + + + + + + + + + + + 0 0 0 + 0 1 0 0 + 1 0 0 0 + 0 0 1 0 + 1 1 1 + + + + + + + + diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..72efec30c86e --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "CesiumTexturedBoxTest.bin" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "Cesium_Logo_Flat.crn" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "CesiumTexturedBoxTest0FS.glsl" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "CesiumTexturedBoxTest0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl new file mode 100644 index 000000000000..782e1f41628c --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0FS.glsl @@ -0,0 +1,18 @@ +precision highp float; +varying vec3 v_normal; +varying vec2 v_texcoord0; +uniform sampler2D u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = texture2D(u_diffuse, v_texcoord0); +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl new file mode 100644 index 000000000000..cacc9ed997a3 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest0VS.glsl @@ -0,0 +1,15 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +v_texcoord0 = a_texcoord0; +gl_Position = u_projectionMatrix * pos; +} diff --git a/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn new file mode 100644 index 000000000000..5a5b9111152c Binary files /dev/null and b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.crn differ diff --git a/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png new file mode 100644 index 000000000000..a3a8cc9d60d0 Binary files /dev/null and b/Specs/Data/Models/Box-Textured-CRN/Cesium_Logo_Flat.png differ diff --git a/Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb b/Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb new file mode 100644 index 000000000000..c276adb6a7ea Binary files /dev/null and b/Specs/Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb differ diff --git a/Specs/Data/Models/Box-Textured-KTX-Binary/Readme.txt b/Specs/Data/Models/Box-Textured-KTX-Binary/Readme.txt new file mode 100644 index 000000000000..89410d78c033 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX-Binary/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-KTX, except it is "Binary glTF" using the KHR_binary_glTF (CesiumTexturedBoxTest.glb) extensions. diff --git a/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..530166206797 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf @@ -0,0 +1,353 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_1", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR", + "min": [ + 0 + ], + "max": [ + 23 + ] + }, + "accessor_23": { + "bufferView": "bufferView_0", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_0", + "byteOffset": 480, + "byteStride": 0, + "componentType": 5120, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_0", + "byteOffset": 288, + "byteStride": 0, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_0": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 552, + "byteOffset": 0, + "target": 34962 + }, + "bufferView_1": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 552, + "target": 34963 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "byteLength": 624, + "type": "arraybuffer", + "uri": "data:application/octet-stream;base64,AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AADAQAAAAAAAAKBAAAAAAAAAwED+/38/AACgQP7/fz8AAIBAAAAAAAAAoEAAAAAAAACAQAAAgD8AAKBAAACAPwAAAEAAAAAAAACAPwAAAAAAAABAAACAPwAAgD8AAIA/AABAQAAAAAAAAIBAAAAAAAAAQEAAAIA/AACAQAAAgD8AAEBAAAAAAAAAAEAAAAAAAABAQAAAgD8AAABAAACAPwAAAAAAAAAAAAAAAP7/fz8AAIA/AAAAAAAAgD/+/38/AAABAAABAAABAAABAQAAAQAAAQAAAQAAAAEAAAEAAAEAAAEAAP8AAP8AAP8AAP8A/wAA/wAA/wAA/wAAAAD/AAD/AAD/AAD/AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUA" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "data:image/ktx;base64,q0tUWCAxMbsNChoKAQIDBAEUAAABAAAACBkAAFiAAAAIGQAAAAEAAAABAAAAAAAAAAAAAAEAAAABAAAAIAAAABsAAABLVFhPcmllbnRhdGlvbgBTPXIsVD1kLFI9aQAAAAAEANzc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3dzc/93c3P/d3Nz/3dzc/93c3P/d3Nz/3t3c/97d3P/e3dz/3t3c/97d3P/e3dz/3t3c/97d3P/e3dz/3t3c/97d3P/e3dz/3t3c/97d3P/d3Nz/3dzc/93c3P/d3Nz/3dzc/93c3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dv/393b/+De2//h3tv/4d7b/+He2//i3tv/497b/+Tf2//k39v/5N/b/+Tf2//k39v/5eDb/+Xg2//l4Nv/5eDb/+Xg2//k39v/5N/b/+Tf2//k39v/497b/+Pe2//i3tv/4d7b/+He2//g3tv/393b/97d2//d3Nv/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3d3c/97d3P/f3dz/393c/9/d3P/e3dz/29zc/9ja2//V2tz/1Nnd/9TZ3f/S2N3/0Njd/87W3f/N1d3/zNXd/8vV3f/K1d3/ytXd/8jU3P/I1Nz/yNTc/8jU3P/K1d3/ytXd/8rU3f/M1t3/zdbd/87W3f/Q193/0djd/9PZ3f/V2d3/1trd/9ja3P/a29v/3t3c/9/d3P/f3dz/393c/97d3P/e3dz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/d3Nz/3t3c/93c3P/d3Nz/29vb/9nb3P/X2t3/1dnc/9TY3P/S2Nz/zdbc/8LR3f+2zN3/rcnf/6nI4f+mx+H/ocXh/5rC4f+Rv+L/jbvh/4q64P+GueH/hLjg/4O44P9+td//fbTf/3203/99tN//grfg/4S44P+FuOD/ibvh/4294f+Rv+H/lsDi/53D4f+kxuH/qMjh/67L4P+2zN7/v8/c/8vV3f/R19z/1Njc/9XZ3P/X2t3/2dvc/9rb2//c3Nz/3dzc/97d3P/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93c3P/e3dz/3dzc/9vc3P/Z29z/19rd/9PZ3P/O1tz/yNPc/7zP3P+uy9//nsXh/4694f+DuOD/fLXg/3ax3v90sN//cq/f/3Gv3v9wr9//cK/f/2+v3/9urt//ba3f/2yt3/9srd//bK3f/2us3/9rrd//aqze/2qs3v9qrN7/aqze/2ut3/9rrN//a6zf/2yt3/9srd//ba3f/26u3/9vrt//cK/f/3Cv3/9xr9//cq/f/3Ow3/91sd//erTf/4C34P+NvOH/m8Pi/6vJ4P+6zd3/x9Lc/83V3P/T2Nz/1trd/9nb3P/b3Nv/3Nzb/93d3P/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/97d3P/e3dz/3dzc/9rb3P/W2tz/0dfc/8bT3P+9z93/r8re/5vD4f+GueH/eLLf/3Ow3v9zsN//ca/e/2+v3/9trt//bK3f/2us3/9qrN//aqzf/2qs3/9rrN//a6zf/2us3/9rrd//a63f/2ut3/9rrd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//a63f/2ut3/9rrd//a63f/2us3/9rrN//a6zf/2qs3/9qrN//aqzf/2qs3v9rrN7/ba3f/2+u3/9xr9//cq/f/3Sw3v93st//g7fh/5jB4v+syeD/us7d/8TS3P/Q19z/1trd/9nb3P/d3Nz/3t3c/97d3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3b/+He2//k4Nv/49/b/9vb3P/C0d//psfg/4q63/9/td7/e7Pe/3iy3/9yseD/bK3f/2ms3/9oq9//aazf/2qs3/9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrN//aqzf/2ms3/9oq9//aazf/2yt3/9ysOD/drLf/3uz3v9+tN//iLrg/6TG4v+/0eD/19rc/+Pf2//l4Nv/4d7b/97d2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93c3P/e3dz/3t3c/9rc2//T2d3/z9fd/8nU3f+8zt3/o8Tg/4a64f9rruD/Y6rf/2Op3/9lqt//aKve/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN7/aKve/2Wq3v9kqd//Y6rf/2mt4P+FueP/oMPh/7jM3f/H093/ztbd/9PZ3v/a3Nz/3t3c/97d3P/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3t3c/93c2//b3Nv/2Nrc/9PY3P/A0d3/pcff/5G94P+EuOD/drHe/3Gv3v9urt//a6ze/2qs3/9qrN//a6zf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrN//aqzf/2qs3/9rrN//bq7f/3Gv3/91sN//gLbg/4y84f+kxuH/vtDe/9HW3P/Y2tz/29zb/93c2//e3dz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/d3dz/2dvc/9TZ3P/I09z/vM7d/6XG4P+IuuH/dbHf/3Cv3/9trt//a63f/2qs3/9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrN//aqzf/2us3/9srd//cK/f/3Sw3v+Ct+D/ocXg/7nO3v/G093/09jc/9nb3P/c3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/e3dz/3dzb/9vc3P/X2t3/zNXc/67J3v+Mu+D/eLLf/3Kv3v9wrt//bK3f/2qs3/9rrN//a63f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9qrN//a6zf/2+u3/9xr97/d7Lf/4m74f+qyeD/yNTc/9ba3f/b3Nz/3dzc/97d3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3dzc/93d3P/b29z/1Nnc/8fT3P+4zd7/ncPh/3214P9xr97/bK3f/2us3/9qrN//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqzf/2us3/9srd//cK/f/3mz3/+ZwuH/tc3f/8TS3v/T2Nz/2tvc/93d3P/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/397b/+Lf2//h39v/yNTe/5/E4P+Ct9//eLLf/3Kw4P9rrd//aqzf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3/9qrN//crDg/3iy3/+Btt//mcHg/8TT3//g3tz/4t/b/+De2//d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/3t3c/9nb3P/U2dz/yNTc/6nH3/+AtuH/Z6zf/2Kp3v9nq97/a6ze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6ze/2ir3v9kqd7/Z6vf/3q04f+kxuD/xtPd/9PZ3f/Y293/3d3c/97d3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/d3dz/2tvc/9DX3P+5z97/pcff/4m64P90sN//ba7f/2ut3/9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqzf/2qs3/9srd//crDf/4W44f+hxeH/tc3g/83W3f/Z293/3d3c/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/93d3P/a29z/0djc/6/K3v+Hud//dbHf/2+v3v9srd//aqzf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3/9srN//b67f/3Ow3/+Ct+D/rMnh/87W3f/Z293/3d3c/97d3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/29zb/9jb3P/O193/s8ve/4m64P9yr9//bKzf/2qs3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9qrN//a6zf/3Gv3/+DuOD/sMvh/83W3v/Y2tz/29zc/93d3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/c3Nz/1dnc/7vO3f+YweH/hLnh/3Ox3/9srd//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//a6zf/3Ow3/+Dt+H/l8Dh/7vQ3//V2tz/3Nzb/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3P/g3tv/1trc/6nH3/9/td//cK/g/2yu4P9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//bK7g/3Cv4P9/teD/qsri/9jb3v/g3tv/3d3c/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9/d3P/d3Nz/1Nnd/7rO3f+KuuD/aKvf/2er3v9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v9nq97/aKvf/4u94/+7z9//1Nnd/93c3P/f3dz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9vc2//Y2tz/y9Xd/6nI3/98teD/bq7f/2qs3/9rrd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//a63f/2qs3/9truD/e7Tg/6jH4f/J1N7/1djc/9vb3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3d3c/9fa3P++0N3/mMDh/4K34f9xsN//aqzf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2qs3v9xr9//fLXh/5C+4P+7z97/19rc/93d3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/d3dv/29zb/8/X3P+kxt//eLPf/22u3/9srd//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2qs3/9srd//eLPf/6XH4f/P193/29vc/93c3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/f3dv/3N3c/8nV3f+awt//drLf/2ms3/9qrd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aq3f/2qs3/92suD/msLi/8nV3//c3d3/4N3c/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/1dnd/8LR3f+qx97/fbbg/2ir3v9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//aKvf/3224v+pyOD/wdLf/9TZ3f/e3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/09jd/6zJ3/+Et9//c6/f/2yt3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9srd//cK/g/4G34f+qyeH/0dfd/9zc2//d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93c3P/b29v/ytTd/5bA4f9zsN//aqze/2qs3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3v9qrN7/crDf/5K/4f/G097/29zc/93c3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3c/93c3P/W2tz/vtDd/4i64f9vrt//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9urt//hbjg/73Q3//X2t3/3dzc/97c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3c/9XZ3P++0N7/pMXe/3y03/9srd//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2ut3/97td//pcjh/7/S4f/W2d3/3d3c/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3tzc/93c3P+xy9//hbjf/3Kw3v9rrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//a6ze/3Kw3/+FueD/s87i/97e3P/e3dv/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/L1d3/lL/g/2yu3/9jqd7/aaze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2mr3v9iqN7/bK7g/5XB4//K1t7/3dzb/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9zc3P/N1t3/mMHf/3Kw3/9rrN//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2qt3/9ysN//lcDh/8nU3f/c29v/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3b/9vc2//G1Nz/j73f/2+u3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/26u3/+KuuH/xdPe/9vc3f/e3dz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/29zb/9HX3f+5zd7/h7nf/22u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bK7f/4a54P+4zuD/0dje/9vc3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/29vb/8HQ3f+PveH/d7Ph/2yt3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9srd//drLh/4694f/A0t//29zc/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/3t3b/83W3f+NvOD/b6/g/2ms4P9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3/9vr+D/i7vg/83X3//e3dz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/3d3c/9jb3P+zy93/dLHg/2ms3/9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN7/aazf/3Ow4P+yzN//2Nrd/97d3P/e3dz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/393b/9nb3P+9z93/gLbf/2us3/9rrd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrN//frbg/7rP3//X293/3t3c/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29vc/83W2/+zy93/gbfg/2ut3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qt3/98teD/rMrg/8jV3//a29z/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29vc/8HQ3f+Ou9//dbHg/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqze/2+v4P+GueD/vdDf/9vb3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9DX3P+OvOD/b6/g/2ms3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9orN//ba7g/4q64P/O197/3d3c/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9vc3P+5zt7/drPh/2ms3/9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6ze/2mr3/9zsOD/tc3f/9rb3f/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93c3P/J1N3/ibrh/2yt3/9qrd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//a63f/4O44f/E0t7/3Nzc/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/93d3P/P1t3/k77h/26u3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9sruD/jLzi/8vV3f/d3Nz/3t3c/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/93d3P/M1t3/m8Lf/3Gv3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/26u3/+UwOH/ydXe/93c3f/d3dz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9ba3f+0zd//l8Dg/3Ow3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//ca/g/5K/4/+wy+L/1trd/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93d2//C0t3/h7nf/22u3/9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9rreD/hbjh/8LT4f/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/Y2tz/qcje/3Ow3v9jqd7/aazf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//Yqne/3Kw3/+oyeL/2Nrd/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/wtDc/3+13/9rrN//aaze/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v9rrN//fbXg/8LS4P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/d3dz/zNbd/4y73/9trd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2yu3/+KvOH/zdfe/93d2//d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/e3dz/1Nnd/5zD3/9vr9//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN//a6zf/2us3/9rrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//b6/g/5vD4//U2d3/3tzc/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/f3tv/1trc/7LL3v90sd//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN//aqve/2yt3/9vr9//cbDg/3Gw4P9xsOD/b6/f/2yt3/9qq97/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/90sN//rMrg/9Xa3f/g3tv/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nv/393c/8fT3f+Iut//a63e/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v9nqt7/ZKje/2Oo3f90suD/jsDm/5zH6v+fyer/nMfp/4/B5/93s+H/Yqjc/2Wp3v9qq97/a6ze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqzf/4G34P/C097/3d7d/93c2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3Nvc/87W3f+vyt//dbLf/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9pq97/ca/g/3iz4v+DuuT/mcfp/7TW7//D3fL/xt/y/8Ld8f+11u//ncjp/4S65P91suH/a6ze/2ir3v9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2mr3v9xr+D/qsrh/8vX4P/c3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9LX3P+gxeD/grnh/22u3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9srN//e7Xi/5zH6f+41u//2+r2/+rz+v/w9/z/8/j8//P4/P/y+Pz/8Pf8/+vz+v/d7Pf/rdHt/4W75P90seD/bKzf/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//ba3f/3634/+dxOP/0dje/93c2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9nb3P+syd//ebPf/2es3/9qrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9trt//jsDm/9fp9v/u9fv/9fn9//3+/////////////////////////////////////////f7///L4/P/o8/r/zuT0/5LB5/9urt//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qt3/9nq9//ebPh/6zL4//Z293/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/93c3P/F0t3/frXg/2us3/9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9urt//lcTo/93s+P/7/f7///////////////////////////////////////////////////////////////////////r8/v/f7fj/mMXo/26u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqze/2qs3/98tOD/xdTf/93c3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9/d3P/a29z/ocTg/2+v3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3v9qrN7/erXi/9Dl9f/6/P7/////////////////////////////////////////////////////////////////////////////////+vz+/9Lm9f98tuP/aqze/2us3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//b67f/57E4v/Z29z/393c/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3P/e3dz/0Nfc/4q74f9srd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9oqt7/ba3f/5LC5//s9Pv////////////////////////////////////////////////////////////////////////////////////////////t9fv/mMbp/2+v3/9nqt7/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2yt3/+Iu+L/z9fe/97d3P/e3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/g3tv/19rc/7LK3v90sN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//Zane/3624//F3/L/9/v9////////////////////////////////////////////////////////////////////////////////////////////+fz+/83k9P+BueP/Zand/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrd//c7Dg/7DM4//W2t7/4N3b/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/3Nzb/8PS3f+Et+D/a6zf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//ba3f/3224/+hy+v/6PL6//7////////////////////////////////////////////////////////////////////////////////////////////////////r9Pr/qs/s/4W75P9trt//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/99tuH/u9Dg/9fb3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/2Nrc/7XN3/+WwOD/cK7f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3Kw4P+p0Oz/0eb1//X6/f//////////////////////////////////////////////////////////////////////////////////////////////////////+Pv9/9vq9/+z1O7/c7Hg/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//b6/g/46+5P+ty+P/1trd/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzb/8TS3f+GuN//bK3g/2us3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v92s+H/zuP0//f6/f/9/v////////////////////////////////////////////////////////////////////////////////////////////////////////7+///6/P7/0eX1/3iz4f9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9oq+D/gLXg/7/R3//b3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9nb3P+kxeD/dbDg/2eq3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9pq97/d7Ph/9bo9v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9nq9/9/t+L/aqze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//Z6re/3Gw4P+aw+L/2Nvc/97d3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/S2Nz/jbzh/26u3/9orN7/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aave/3q04f/X6fb////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b6/f/hLrk/2us3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v9trt//hbrh/8/Y3v/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b3Nv/vNDd/3ax3/9prN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3v9/t+P/2er3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3ez3/4m95f9srN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aazf/3Sx4P+3z+H/29vc/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/1Nnc/5S/4P9trd//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9pq97/e7Ti/9fp9v///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9vr9/+DuuX/a6ze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9srt//i73i/9HY3f/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/29vc/7vO3v91sd//aq3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aaze/3az4f/R5fX/+vz+//7+/////////////////////////////////////////////////////////////////////////////////////////////////////////v////v9/v/T5vb/eLTi/2mr3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/3Ow4P+0zeH/2tvc/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9TZ3P+SvuD/ba7f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9zseD/tdXv/93s+P/4+/3///////////////////////////////////////////////////////////////////////////////////////////////////////r8/v/m8Pn/vdrw/3Sx4f9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9srd//ibrh/9HX3f/e3dz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3b/9zc3P/F0t3/ebPf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//b6/g/5XE6P+82vD/8ff8///////////////////////////////////////////////////////////////////////////////////////////////////////z+Pz/x+Dy/6DK6v9xr+D/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aq3f/3ay4P/B0+H/29zd/97d2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+De2//Y29z/tMze/3Cu3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/22t3/9+uOP/pM3s/+v0+///////////////////////////////////////////////////////////////////////////////////////////////////////7vX7/63R7f+HvOX/bq7f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9wr9//rszi/9fb3v/h3tv/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/i3tv/z9fd/5a/4P9trd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9prN//Zqre/4S75P/V5/b/+/3+/////////////////////////////////////////////////////////////////////////////////////////////P3+/9vr9/+JveX/aave/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//bK7f/4694f/L1t3/4d7b/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d29z/1dnc/7fN3f93st//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2eq3v9vr+D/lsXo/+Tw+f/9/v///////////////////////////////////////////////////////////////////////////////////f7//+bx+f+cyOn/cbDg/2eq3v9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/90sd//rszh/83Y4P/b29z/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/19rc/67L4P+OveH/b67f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqzf/3Gw4P+nzuv/5fH5//z+/v///////////////////////////////////////////////////////////////////////P3+/+nz+v+v0u3/crHh/2qs3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//bq7f/4a75P+myeP/1trd/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3tzc/9DX3P+LvOD/ba/g/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN7/eLTi/7LU7v/z+Pz//////////////////////////////////////////////////////////////////////+71+/+52O//e7Xi/2qs3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9preH/h7rh/83X3//d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/F0t3/fbXf/2Kq4P9prN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2mr3/+Pwef/0+f1//D3/P/4+/7//v7////////////////////////////////////////+/v//9fn9/+Tw+f/K4vT/lsTo/2mr3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9pq9//Yaje/3u03//B0+D/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/Z29z/rMnf/3ay3/9lqt7/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//cK/g/42/5v+72fD/0+b2/+bw+f/y+Pz/+Pv9//v9/v/7/f7/+v3+//j7/f/y+Pz/5/L6/8ri8/+byOn/grrk/3Cv4P9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2aq3v90seD/pcjj/9jb3P/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/0tjc/4m64P9urt//aqze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9srd7/ca/g/3iz4f+JvOX/rNDt/8Xf8v/T5vX/1ef1/9Ll9f/H3vP/r9Ht/4u+5v91suH/ba7f/2ut3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN7/a63f/4C34P/P193/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29zb/73P3f90sd//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3v9qrN7/a6ze/3Cv4P90seD/dbLh/3ay4f92suH/dLHg/3Gw4P9srd7/aqze/2ut3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9zsN//uM/i/9vc3f/d3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9fa3P+cw+D/b67f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqzf/2qs3/9qrN//aqzf/2qs3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bq7f/5fB4v/W2t3/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/S2Nz/grjg/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/99teD/ztbd/97c2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/ytTd/3ez4P9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9pq97/c7Df/8XU3v/d3Nz/3dzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/2tvc/7XM3v9ysN//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3Gv3/+wzeL/2tvd/93c3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9ba3P+ZweD/bq7f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN//aqzf/2qs3/9qrN//aqzf/2qs3/9qrN//aqzf/2qs3/9rrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrN//aqzf/2qs3/9qrN//aqzf/2ms3/9rrN//kL7i/9TZ3f/e3dz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/97c3P/M1dz/fLTg/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN//aave/2us3/9trt//b6/f/3Kw4P90seD/dLHh/3Wy4f91seH/dbHh/3Ox4P9yseD/b6/g/2yt3/9qrN7/aave/2qs3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9prN7/aqze/2ut3v9trt//cbDg/3Ox4P90seH/dbLh/3Wy4f91suH/c7Hg/3624f/L1t//3dzc/93c2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9/d2//Y2tz/ts3e/3Kw3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqze/2qr3v9srN//crDg/3ez4f+IveX/msfp/6bN6/+31u//xt7z/83j9P/S5vX/0uX0/8/j9P/I4PP/vNrw/6fN7P+Pwef/fbfj/3az4f9zseD/bq7f/2qs3v9rrN//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN7/aqze/2us3v9wr+D/dbLg/3y34v+GvOX/msbp/7HU7f/C3fH/y+Hz/9Hl9f/T5vX/0eb1/8vj8//B3PD/097n/9vc3f/c29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/h3tv/09nd/6TG4f9vr9//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//Z6ve/2Gn3f9lqd7/e7Xi/6bN6//O4/T/3Oz4/+Pw+f/n8vr/7vb7//P5/f/2+v3/+Pv+//j7/f/2+v3/9Pn9/+/3/P/o8vr/3+34/9jp9//O4/T/stTv/4i85f9mqd7/Y6je/2eq3v9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9oq97/ZKjd/2Sp3f9xsOD/nMjp/8Tf8f/V6Pb/3Ov4/+Pv+f/s9fv/8vj8//X5/f/3+/7/+Pv+//j7/v/1+v3/8Pb7/+vu8P/e39//2tra/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3dz/49/b/9DY3v+XweL/bq7f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aave/3Gv3/97teL/hrvl/6DK6v/O4/T/9fr9////////////////////////////////////////////////////////////////////////////9vr9/9rr9/+u0u3/iLzl/3m04v9ysOD/aqzf/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9prN7/bq7f/3ez4f+AuOP/lMTo/8Pd8v/s9fr//P3+//////////////////////////////////////////////////7+/v/19fT/4eDg/9nZ2f/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+Pe2//I1N3/grjh/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9qrN//bK3f/3i04f+cyOn/x+Dy/9vr9//p8/r/9fn9//3+//////////////////////////////////////////////////////////////////////////////3+///4+/3/7vX7/97s9/+62PD/n8nq/3+34/9urt//aaze/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN7/dLHg/5DA5v+41/D/z+X1/+Xw+f/z+Pz/+/3+//7/////////////////////////////////////////////////////////+Pj4/+Li4v/a2tr/29vb/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/U2dz/tMzd/3Sx3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3v9truD/dbLh/5HB5//P5fT/7PX7//j7/f/9/v7////////////////////////////////////////////////////////////////////////////////////////////////////////////9/v//9fr9/+/2/P/d7Pj/pMzs/3iz4f9rrN7/a6zf/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqze/2qs3v9vrt//hLvk/7/b8f/m8fn/9fn8//r8/v/+/v////////////////////////////////////////////////////////////////////////r6+v/p6en/4ODg/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/Z29z/u9Df/5zD4P9xr97/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2us3/98tuP/qM7s/8bf8v/l8Pn/+vz+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////f7//+71/P/N4vT/ib3l/2+v3/9qrN7/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqve/22u3/98tuL/pMzr/97s+P/2+v3//v7////////////////////////////////////////////////////////////////////////////////////////8/Pz/8vLy/+np6f/d3d3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/1tnc/6LG4f+CuOL/ba3f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/22t3/+JveX/z+T1/+71/P/4+/7//f7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+fz+/93s+P+ozuz/ib3l/3Kw4P9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqzf/3624/+u0u3/zeP0/+r0+//9/v///////////////////////////////////////////////////////////////////////////////////////////////////v7+//r6+v/w8PD/3t7e/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9TY3P+OvOD/bq/g/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2mr3v+At+L/zuT0//b6/f/+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////6/P7/6fL6/87j9P+Yxen/aaze/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aave/3Kx4P/B3PL/6fP6//X6/f/9/v/////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7/9fX1/97e3v/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97c3P/P1tz/hLff/2ar4P9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2qs3/9wsOD/oMnq/+/2+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////u9vz/u9nx/3u14v9qrN7/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2yt3/+Rwuf/5fD5//3+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////b29v/h4eH/29vb/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/wtHc/3203v9kqd//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2mr3v9xr+D/lMLo/97s+P/8/f7//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P3+/+ny+v+u0e3/dbLg/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2us3/+GvOX/1Of2//n8/v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////4+Pj/5eXl/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/2dvc/67L3/93st//Zare/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2yt3v+AuOL/ocrq/97s9//8/f7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/v//6fP6/63R7f9ysOD/aazf/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aKve/2qs3v+EuuP/1+j2//r8/v//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6/+zs7P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9fa3P+bw+H/crDf/2ir3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2us3/+IvOT/zeP0/+/2+//8/f7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3+///m8fn/nsnq/3Ox4f9oq97/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqve/2us3v+Gu+T/y+Lz//j7/f////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/f/z8/P/3d3d/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/V2dz/jrzh/2+u3/9prN7/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2mr3v9xsOD/w97y//P4/P//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/3+/9Xo9v+Nv+b/bq7f/2qs3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2yt3/+Xxej/vtrx/+71+//+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/f3/97e3v/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dz/1Njc/4W34P9trd//a6ze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN7/iL3l/+Pv+f/9/v/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v9vv/stTu/4u+5f9trt//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/96tOL/udfv/9/s+P/4+/3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////n5+f/f39//29vb/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/8/W3P95s9//aazf/2us3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//dbLg/7za8P/0+f3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////P3+/+/2+//L4vT/g7rk/2qr3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9vruD/osvq/+Du+P/4+/7//v7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+fn/4eHh/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9zc3P/B0Nz/dK/f/2ms3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN//b67g/6LL6v/q8/r//v7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/j8/8be8v94s+H/aazf/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrd//jsDm/+Du+P/7/f7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+vr6/+Xl5f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/a29z/s8vf/3Gw3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9oq97/ba7f/4/A5v/g7vj//f7+/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+///u9vv/rNHs/3Gw4P9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2ms3v9qrN7/gLjj/9fo9v/7/f7////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/v7//v7+//////////////////////////////////z8/P/r6+v/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dz/2Nrc/6TG4f9vrt//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN7/ba3f/4u/5v/V6Pb/+/3+////////////////////////////////////////////////////////////////////////////////////////////////////////////+/z6//H17P/n7t//4urZ/97m0//h6Nb/4+rZ/+Xs3P/t8uf/+fr2//7+/v///////////////////////////////////////////////////////////////////////////////////////////////////////f7//+Tw+f+VxOj/b6/f/2ir3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9nqt7/frbj/7/b8f/1+v3////////////////////////////////////////////////////////////////////////////////////////////////////////////9/v3/8/bv/+nv4v/i6tn/3ufU/97n1P/h6dj/5Ovb/+zx5v/3+fT//f79///////9/f3/8fHx/97e3v/b29v/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9fa3f+cw+L/b67f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//ba3f/5zI6v/D3vL/8ff8/////////////////////////////////////////////////////////////////////////////////////////////////////////////v7+/+zx5/+7zaX/jKpm/3ebS/91mkj/dppJ/3ibS/+Co1n/qcCO/+Do1v/7/Pr////////////////////////////////////////////////////////////////////////////////////////////////////////////6/P7/0OX1/4C44/9kqN3/aqve/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9srd//gbnk/6TN7P/k8Pn//f7/////////////////////////////////////////////////////////////////////////////////////////////////////////////9vjz/8fVtf+VsXL/eZxO/3WZSP91mUn/dppK/36gU/+kvIb/1+LK//b48////////v7+//Pz8//d3d3/29vb/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/W2t3/lsHi/26u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqze/3y24/++2/H/4+/5//n8/v/////////////////////////////////////////////////////////////////////////////////////////////////8/fv/6u/j/9fhyv+/0Kv/j61r/2KLL/9PfRX/TnwU/058FP9PfRX/WIUi/36hVP+0yJz/3ebR//f59P///////////////////////////////////////////////////////////////////////////////////////////////////////////+v0+/+gyer/ebTi/2qs3v9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//c7Dg/6DK6//G4PP/8/j9//////////////////////////////////////////////////////////////////////////////////////////////////3+/f/4+vX/7fLn/9DcwP+ctXv/a5I6/1F+Gf9OfRX/Tn0V/018FP9UgR3/epxO/6vCkf/O27//4unY//b48//19fX/3t7e/9vb2//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/f3dz/1Nnc/4y84f9srd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3Cv3/+kzOv/4e/4//n8/v/+/v/////////////////////////////////////////////////////////////////////////////////////////////8/Pr/4+na/6q/jv93mkr/ZIwx/2CKLP9bhib/WYQj/1mFI/9ZhSP/WYUj/1qGJP9eiSr/Z5A2/5CtbP/N2r3/6u/j//j69v/+//7////////////////////////////////////////////////////////////////////////////////////////////4+/3/3ez4/7fW7/95tOL/aazf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bKzf/5DB5//U5/b/8/j9//3+//////////////////////////////////////////////////////////////////////////////////////////////39/P/r8OX/0d3C/7DElv94m0v/Yosu/1yHJv9ZhSP/WYUj/1mFI/9ZhSP/WYUj/12IKf9ljjT/dZlJ/5OvcP/N2r7/7fDp/9/e3v/c29z/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/393c/9PY3P9/tuD/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2us3/+Pweb/4e75//v9/v/////////////////////////////////////////////////////////////////////////////////////////////////7/Pr/2uTP/42qZ/9jiy//WoUj/1mFIv9ahiX/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qFJP9diCn/aJA3/4WmXv/I1rb/9vjz/////////////////////////////////////////////////////////////////////////////////////////////v////v9/v/n8vr/rtLt/3Kw4f9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqze/4G55P/Y6fb/+fz+//////////////////////////////////////////////////////////////////////////////////////////////////z9+//j69v/n7iA/2+UQP9eiCr/WoUk/1qGJP9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WYUk/1qFJf9chyj/cJZC/7fJof/a3Nj/3Nze/9vb3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzb/97c2//N1dz/drHf/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aaze/2qs3v+AueP/1+n2//v9/v/////////////////////////////////////////////////////////////////////////////////////////////////6+/j/2+TP/4WlXP9eiCn/WoUk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1mFI/9bhiX/c5hF/8zZu//4+vb//////////////////////////////////////////////////////////////////////////////////////////////////P3+/+Tw+f+XxOj/ba3f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3az4f/B3PH/9vr9//////////////////////////////////////////////////////////////////////////////////////////////////z9+//l7N3/mbR6/2OMMP9ZhCP/WYUj/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WoYl/1mEI/9ukz//ydC//93d3v/d3N7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/c3Nz/w9Hc/3Sw3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2ir3v9/t+L/wdzx//b6/f////////////////////////////////////////////////////////////////////////////////////////////39/P/09u//1d/H/46raf9fiSr/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/W4Yl/1qFJP93m0r/0t7E//j69f/////////////////////////////////////////////////////////////////////////////////////////////////8/f7/3Ov4/4a75f9rrN//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqzf/3Cv4P+nzuz/7PT7//7+/////////////////////////////////////////////////////////////////////////////////////////v7+//r7+P/j69v/pr2J/2SNMv9ahST/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahST/ZIwy/8HMsv/c3Nv/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dz/2tvc/77P3P9zsN7/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2yt3/+DuuT/p87s/+bx+f/9/v/////////////////////////////////////////////////////////////////////////////////////////////z9vD/yNa1/563ff9njjX/WoUk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/XYco/4+ta//g6Nb///////////////////////////////////////////////////////////////////////////////////////////////////////b6/f+92vD/b67f/2iq3v9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aaze/2qs3v+BuOP/2On3//v9/v////////////////////////////////////////////////////////////////////////////////////////////r7+P/n7t//v9Cp/3GWQv9ZhSP/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/2SNM/+6x6r/2tvZ/97e4P/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9nb3P+6ztz/c7Df/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9zseD/osvr/8jg8//0+f3////////////////////////////////////////////////////////////////////////////////////////////9/v3/5evc/6K6hP95nE7/XIYm/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1mFJP9vlED/v9Cq/+nv4f/6/Pn////////////////////////////////////////////////////////////////////////////////////////////8/f7/2+v3/4G44/9qq97/aave/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2aq3v9xsOH/n8nq/+/2+//////////////////////////////////////////////////////////////////////////////////////////////////z9u//xdWz/5i0d/9diCj/WYUj/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJP9kjDL/tsWj/9na1//f3uH/3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9/d2//Y2tz/tsze/3Kv3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9srd//ksLn/9bn9v/0+P3//f7/////////////////////////////////////////////////////////////////////////////////////////////9vjz/73PqP9yl0T/V4Mg/1qFJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/X4kr/4GiWP+pv47/5+3f//3+/f///////////////////////////////////////////////////////////////////////////////////////v////D3/P+x1O7/ebTi/2eq3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3v9vr+D/j8Hm/9rq9v/8/f7////////////////////////////////////////////////////////////////////////////////////////////7/Pr/1eHI/4OkW/9fiSz/WoYk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/Y4ww/7DBmv/X2dT/4N7h/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/g3dv/1tnc/7DL3/9xr97/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN7/grrk/9rq9v/6/P7/////////////////////////////////////////////////////////////////////////////////////////////////+/z6/9bhyf91mUn/WoYl/1iFI/9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJP9WgyH/bpQ//7PHmv/y9u/////////////////////////////////////////////////////////////////////////////////////////////9/v//5vH6/6rQ7P+GvOT/bq7f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/93s+H/sdPu/9fp9v/3+v3////////////////////////////////////////////////////////////////////////////////////////////8/fz/3+fU/4emX/9fiSv/WIMh/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/2GLL/+muoz/1NfQ/+He4//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4d7b/9XZ3f+ryOD/ca/f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//d7Ph/8Pd8f/3+v3/////////////////////////////////////////////////////////////////////////////////////////////////+/z6/9/n1P+HpmD/XIco/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WYUj/1mFI/9vlUD/ztu+//r7+P////////////////////////////////////////////////////////////////////////////////////////////z9/v/x9/z/z+T1/4e85f9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9wr+D/qc/s/+Tw+f/7/P7//v7////////////////////////////////////////////////////////////////////////////////////////+/v3/6u/j/523fv9hii3/WoUk/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9hii3/nbR//9LWzf/i3+T/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+He2//T2d3/psfh/3Cv3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//bK3f/5nG6P/n8fr//f7//////////////////////////////////////////////////////////////////////////////////////////////////+vx5f+uxJT/ZI0y/1qGJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/W4cn/4yrZ//r8OX///////////////////////////////////////////////////////////////////////////////////////////////////////H3/P/A2/H/b6/f/2mr3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qrN7/grnj/9nq9//5/P7/////////////////////////////////////////////////////////////////////////////////////////////////+fv3/8zau/9ulT//WoUk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/YIos/5myev/R1sz/4uDl/93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/h3tv/0tnd/6PH4f9vrt//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqvf/3Ox4P+41+//9Pn9/////////////////////////////////////////////////////////////////////////////////////////////f79//b59P/X4sv/jKtn/1uHJv9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1mFI/9tlD3/z9y///r7+P/////////////////////////////////////////////////////////////////////////////////////////////////7/f7/3uz3/4O54/9qq97/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//ba7f/6DK6v/v9vv///////////////////////////////////////////////////////////////////////////////////////////////////////L17f+qwI//XYgp/1mFJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1+JLP+XsHj/0NXL/+Lg5f/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4d7b/9PY3f+ixeH/b67f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aKve/26v4P+Swuf/4+/5//3+//////////////////////////////////////////////////////////////////////////////////////////////X48//R3sP/p7+L/2iPNv9ahiT/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/X4kr/5Swcf/l7N7//P38/////////////////////////////////////////////////////////////////////////////////////////////v////H3/P+01O7/c7Dg/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqve/4O65P/a6vf//P3+//////////////////////////////////////////////////////////////////////////////////////////////////j69v/T38X/c5hF/1qFJP9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9fiSv/k65z/9DUyv/j4Ob/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+He2//S2N3/ocXi/2+u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqve/3Cv4P+Qwef/2ur3//z9/v////////////////////////////////////////////////////////////////////////////////////////////v8+v/U4Mb/gaNY/16JKf9ahST/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJP9kjTL/r8SV/+rv4//9/v3////////////////////////////////////////////////////////////////////////////////////////////9/v//5/L6/5vI6f9trt//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//aazf/3iz4f/G3vL/9/v9/////////////////////////////////////////////////////////////////////////////////////////////P37//L17v/P3MD/g6Rb/1uHJ/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/X4kq/4+sbf/P1Mj/5OHn/97d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/h3tv/0djd/57E4v9vr9//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aazf/3iz4f+11e7/2ur3//f7/f////////////////////////////////////////////////////////////////////////////////////////////z9+//e5tP/hKVc/16IKv9YgyH/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/WoUk/26UQP+6zKP/4+ra//n79/////////////////////////////////////////////////////////////////////////////////////////////z9/v/d7fj/ib3l/2yt3/9oq97/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//Z6re/3az4f+s0ez/7vb7//7//////////////////////////////////////////////////////////////////////////////////////////v79/+ju4v+twpP/haVe/2CKLP9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/16JKv+LqWn/zdPH/+Th5//e3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4t7b/9HY3f+bwuH/bq7f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3Gw4P+r0Oz/5vH6//v9/v/+//////////////////////////////////////////////////////////////////////////////////////////7+/f/p7+L/mrV6/2CJLf9ahST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9bhSb/aI82/42qZ//a5M7//P37////////////////////////////////////////////////////////////////////////////////////////////+fz+/8/k9P+Gu+X/aqvf/2qr3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//ba7f/4K55P+lzez/5PD5//3+//////////////////////////////////////////////////////////////////////////////////////////////T38f+2yZ//cJVB/1eDIf9ahiT/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9diCn/hqVi/8zSxf/k4ej/3t3f/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+Le2//Q2N3/msPg/26u3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3/+EuuT/2uv3//r8/v/////////////////////////////////////////////////////////////////////////////////////////////////5+vf/yti5/22UPv9ZhST/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUl/1aCH/9njzX/oruD//D06/////////////////////////////////////////////////////////////////////////////////////////////7////u9vv/utjw/5PD5/9trd//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqve/3ay4f+/2/H/5vL6//r8/v////////////////////////////////////////////////////////////////////////////////////////////7+/v/l69z/e59S/1qGJv9YhCL/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/XYgo/4WkYP/M0sX/5OHo/97d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/i3tv/0djd/5vD4f9vrt//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9urt//oszr/+/2/P//////////////////////////////////////////////////////////////////////////////////////////////////////8fTs/6i/jP9diCn/WoUk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9XgyD/XIcn/4CiVv/c5dH//P37////////////////////////////////////////////////////////////////////////////////////////////9/v9/9rq9/+11e//eLPi/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2qs3v+QwOb/3+34///////////////////////////////////////////////////////////////////////////////////////////////////////4+vb/xNSx/2ONMP9XhCH/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/12IKP+FpGD/zNLF/+Th6P/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4d7b/9HY3v+exeL/b6/f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN7/hbrk/9vr9//8/f7/////////////////////////////////////////////////////////////////////////////////////////////////+Pr2/9LdxP9yl0T/WoUk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qFI/9kjTL/rsOT//H07P////7///////////////////////////////////////////////////////////////////////////////////////3+///4+/7/3ez4/53H6v9urt//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2ms3/95tOL/yODz//T5/f/////////////////////////////////////////////////////////////////////////////////////////////////8/fv/3eXS/4KjWv9chyf/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9diCn/hqVi/8zSxf/k4ej/3t3f/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+He2//S2N3/ocXi/2+u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9prN//ebTi/8jg8v/4+/3////////////////////////////////////////////////////////////////////////////////////////////8/fv/8vXt/8/cv/+Co1r/XIcn/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WoUk/22TPv/K2Lj/+fr3//////////////////////////////////////////////////////////////////////////////////////////////////v9/v/e7fj/ir7l/2us3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2qr3/9ysOH/rtLt/+/2/P/+/v/////////////////////////////////////////////////////////////////////////////////////////////9/fz/6O7g/5mzd/9giiz/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/Xokq/4uoaP/N0sf/5OHn/97d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/h3tv/09nd/6XH4v9wr9//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9nqt7/eLPi/67R7f/v9vz//v/////////////////////////////////////////////////////////////////////////////////////////+/v3/6O7h/6zBkv+EpFz/YIos/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahiX/fJ9R/9njzf/6+/j/////////////////////////////////////////////////////////////////////////////////////////////////+vz+/9Hl9f99t+P/aqze/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2iq3v9wr9//l8To/+Tw+f/9/v/////////////////////////////////////////////////////////////////////////////////////////////+/v7/7PLn/7XInP9mjjX/WoYk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/16JKv+NqWr/ztPI/+Th5//e3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4d7b/9TZ3f+myOL/cK/f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9trd//g7rk/6bN7P/k8Pn//f7/////////////////////////////////////////////////////////////////////////////////////////////8/bw/7bInv9vlUH/V4Mh/1qGJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/16IKf+PrWv/2OLL//b48//9/v3////////////////////////////////////////////////////////////////////////////////////////////z+Pz/udfv/3y24v9nq97/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2us3/9zsOD/k8Po/9zr+P/8/f7////////////////////////////////////////////////////////////////////////////////////////////6+/j/5u3e/77Pqf9wlkL/WYUk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9fiSv/kq1w/8/Uyf/j4Ob/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/+De2//U2d3/qsni/3Cv3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN7/d7Ph/8Dc8f/n8vr/+vz+/////////////////////////////////////////////////////////////////////////////////////////////v79/+Lp2f97nVD/WoYm/1iEIv9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/aJA3/6nAjf/U38X/9vjz/////////////////////////////////////////////////////////////////////////////////////////////f7//+Hv+f+eyen/e7Xi/2us3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2mr3v9vrt//qtDs/9Pm9f/2+v3/////////////////////////////////////////////////////////////////////////////////////////////////6/Dl/6G5gf92mkj/XIcn/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/X4or/5Suc//Q1Mr/4+Dm/93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/g3tv/1drd/6vJ4v9wr9//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aq3e/5DC5//g7vj///////////////////////////////////////////////////////////////////////////////////////////////////////j59f/C0a7/Y4sw/1eDIf9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/1yIJ/+EpV3/r8SV/+rw5P/+/v7////////////////////////////////////////////////////////////////////////////////////////////y+Pz/wNzx/5rG6P9xsOD/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9qq97/gbjj/83j9P/x+Pz//P3+////////////////////////////////////////////////////////////////////////////////////////////+vz5/9Ddwf96nU//WIQi/1mFI/9chyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/2CKLP+XsHf/0dXL/+Pg5v/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/4N7b/9Xa3f+syuH/ca/f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aavf/3m04v/K4fT/9Pn9//////////////////////////////////////////////////////////////////////////////////////////////////z9+//c5dH/gaJY/1uGJv9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ZhCT/WYQj/3ebTP/G1bX/+Pr2/////////////////////////////////////////////////////////////////////////////////////////////P3+//L4/P/S5vX/jb/m/2yt3/9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//c7Dh/7HU7v/p8/r//P7+//7//////////////////////////////////////////////////////////////////////////////////////////f79/+ft3/+WsXP/ZIwx/1eDIP9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9gii3/nbWA/9LWzf/h3+T/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9/d2//X2tz/tMzf/3Kv3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqvf/3Kw4f+v0+7/8Pf8//7///////////////////////////////////////////////////////////////////////////////////////////////39/P/n7d//lrF1/1+JK/9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1iEIv9bhib/eZ1P/9jjzP/8/fr/////////////////////////////////////////////////////////////////////////////////////////////////+Pv9/9Pm9f9+tuP/aqve/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bq7f/5rH6P/m8fr//P7////////////////////////////////////////////////////////////////////////////////////////////////+//L17v+xxpn/ZY4z/1mFI/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/YYsv/6a6jP/U2ND/4d/j/93d3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dv/2tvc/7zP3v9zsN//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aKre/3Cv3/+Yxuj/5fH6//3+//////////////////////////////////////////////////////////////////////////////////////////////7+/v/s8eb/s8ea/2WONP9ahiT/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/12HKf+Nq2j/4+rZ//z9+//////////////////////////////////////////////////////////////////////////////////////////////////z+f3/utnw/3Sx4P9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//aqze/4e85P/d7Pj//P3+//////////////////////////////////////////////////////////////////////////////////////////////////b58//N2r3/b5VA/1mFI/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/2OLMP+uv5f/19nU/+De4v/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3tzc/9vb3P/C0Nz/dLDf/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqze/2Wp3f+CuuP/0eb1//r8/v////////////////////////////////////////////////////////////////////////////////////////////7+/f/4+vf/0t3E/3mcTv9ahST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/Z5A2/7nLov/v8+r//////////////////////////////////////////////////////////////////////////////////////////////////f7//+Lv+f+Swuf/a6zf/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//Z6re/2+v3//A3PH/9/r9///////////////////////////////////////////////////////////////////////////////////////////////////////f59T/i6pl/1yHJ/9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9jizH/s8Kg/9jZ1v/f3uH/3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97c3P/d3Nz/x9Pc/3Sx3v9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2ys3v99t+L/o8zr/+z0+//////////////////////////////////////////////////////////////////////////////////////////////////3+fX/2ePO/6zCkv9hiy7/WYQj/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/1yHKP+WsnX/3ufT//r7+P/+/v3////////////////////////////////////////////////////////////////////////////////////////////z+Pz/sNPt/3Kw4f9qrN//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aave/2qr3v+DueP/3u33//3+/v////////////////////////////////////////////////////////////////////////////////////////////r7+P/n7uD/vc+o/2uSPP9ahST/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/ZIwy/7fFpf/Z2tj/397h/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/87V3P93sd7/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qr3v97teL/vNnw/+Hu+P/5+/7////////////////////////////////////////////////////////////////////////////////////////////8/fv/2+XP/46tav9pkTn/W4Ym/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ZhCP/apI7/7HGmf/b5dD/+Pr1/////////////////////////////////////////////////////////////////////////////////////////////P7+/9/u+P+NwOb/ba7f/2ir3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/2eq3v96tOL/tNXv//H3/P////////////////////////////////////////////////////////////////////////////////////////////3+/f/l7N3/pb2I/36gU/9fiSr/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/2SNM/+9ya7/2tva/97d3//c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9/d3P/S2Nz/frXg/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9ysOD/stTu/+nz+v/8/v7//v/////////////////////////////////////////////////////////////////////////////////////////9/v3/5eze/5Swcf9jjDD/V4Mg/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qGJf9ijDH/h6dh/9fiy//7/Pr////////////////////////////////////////////////////////////////////////////////////////////7/f7/1ej2/4u/5v9trd//aqze/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/26u3/+IvOX/q9Dt/+fx+v/9/v/////////////////////////////////////////////////////////////////////////////////////////////x9e3/rsSV/2yTPf9XgyD/WoYk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qFJP9mjjX/x9C+/93d3v/d3N7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/f3dz/1Nnc/4m64f9srd//a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9urt//msfp/+bx+v/8/v/////////////////////////////////////////////////////////////////////////////////////////////+//7/8fXt/6/Elf9kjTL/WoUj/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/V4Mg/2CKLP+LqWb/4unY//39/P////////////////////////////////////////////////////////////////////////////////////////////X5/f/R5fX/q9Ds/3Wy4f9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2us3/+KveX/0OT1//H3/P/8/f7////////////////////////////////////////////////////////////////////////////////////////////5+/f/y9m7/26UQP9ahST/WoUk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahST/bJI9/9DVy//g3uH/3Nvc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3c/9ba3f+XwuL/bq7f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9rrN7/iLzk/93s+P/8/f7/////////////////////////////////////////////////////////////////////////////////////////////////9vjz/8vZu/9ulED/WoUk/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ZhST/Yosv/6a9if/u8uj//v7+///////////////////////////////////////////////////////////////////////////////////////+/v//+fz+/+Hv+P+jzOv/cK/f/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qr3v98tuP/z+T1//b6/f/////////////////////////////////////////////////////////////////////////////////////////////////8/fv/2uTO/32fU/9bhSb/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/XIcn/3ucUP/T1s//397h/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/Y293/o8ji/3Cv3/9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9nqt7/cK/f/8Lc8f/3+v3//////////////////////////////////////////////////////////////////////////////////////////////////////97n1P+KqWT/W4Yn/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qFI/9ylkT/1eDI//v8+v/////////////////////////////////////////////////////////////////////////////////////////////////5/P7/1uj2/3634v9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/9trd//qM7s/+72+//+////////////////////////////////////////////////////////////////////////////////////////////////////8PTr/6C5gv9gii3/WoUl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/12IKP+GpGD/1NfR/9/e4P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3dz/2dvd/6vL4v9xsN//aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9oq97/aave/4O54//g7ff//f7+////////////////////////////////////////////////////////////////////////////////////////////+vv4/+bt3/+8zqf/a5I7/1qFJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ZhSP/Xogq/7THm//09/H//////////////////////////////////////////////////////////////////////////////////////////////////////+71+/+cyOn/ba7f/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//eLPi/8bf8v/4+/3/////////////////////////////////////////////////////////////////////////////////////////////////+vz5/9vl0P9+oFX/WoYm/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9fiSr/jqpr/9bY0v/f3uD/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9rb3P+2z+H/crDf/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//Z6re/3q04v+11e//8vf8/////////////////////////////////////////////////////////////////////////////////////////////f79/+Tr2/+jvIX/e55R/16IKv9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qFJP93m0z/1+LL//n7+P/////////////////////////////////////////////////////////////////////////////////////////////////7/f7/1+j2/4G44/9qrN7/a63f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bq7f/53H6v/o8vr//f7///////////////////////////////////////////////////////////////////////////////////////////7//f78/+nv4f+sw5L/ZI0y/1qGJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/YIot/5uzff/X2dX/3t3f/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/c3Nz/w9Le/3Sw3/9prN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//bq7f/4m95f+s0e3/5/L6//3+///////////////////////////////////////////////////////////////////////////////////////////+//D07P+tw5L/bJM8/1eDIP9ahiT/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/XYcp/4qoY//U38b/9Pfx//39/P////////////////////////////////////////////////////////////////////////////////////////////b6/f/A3PH/drPh/2ms3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9oq97/bK3f/4q+5f/e7fj//P3+////////////////////////////////////////////////////////////////////////////////////////////+fr2/+Do1v+3yZ//bZI9/1mEJP9chyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WYUj/2OLMP+uv5f/2tvY/93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3c/87X3P94st//aavf/2us3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//a6zf/4q+5f/R5fX/8vj8//z9/v////////////////////////////////////////////////////////////////////////////////////////////n69//K2Lj/bZM9/1mEI/9ahST/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qFJf9iiy7/jqxq/7fKoP/s8eb//v7+///////////////////////////////////////////////////////////////////////////////////////+/v//7PT6/6bN6/91suD/Z6ve/2qt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN7/a63f/4i95f/R5fX/+vz+/////////////////////////////////////////////////////////////////////////////////////////////P37/9njzf+LqWT/Zo4z/1qGJP9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1mFIv9ljTP/v8mw/9zc3P/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3P/U2d3/h7vi/22u4P9qrN7/bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqve/3y24//Q5fX/9vr9//////////////////////////////////////////////////////////////////////////////////////////////////z9+//Z483/fJ9R/1uGJf9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/WYUj/1iEIf90mEb/wNCr//f59P////////////////////////////////////////////////////////////////////////////////////////////3+///i7vn/ocrq/3634/9srN//a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9qrN//dLLg/6fN6//M4vT/8/j8/////////////////////////////////////////////////////////////////////////////////////////////f78/+Pr2v+PrGv/YYsu/1eDIP9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uHJv9YhSL/aY84/8zSxf/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3Nz/1trc/5fC4/9xsOD/aKve/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/22t3/+ozuz/7vb7//7////////////////////////////////////////////////////////////////////////////////////////////////////v8+r/n7iA/2CKLP9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9XgyD/XIcn/4GjWf/p7uH/////////////////////////////////////////////////////////////////////////////////////////////////+fz+/+Tv+f+82fH/c7Hh/2mr3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrN//a6zf/4/A5v/V6Pb/9Pn9//3+//////////////////////////////////////////////////////////////////////////////////////////////X48/+7zaX/aJA3/1mFJP9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/W4cl/3SXR//R1cz/3t3f/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9fa3P+hx+T/dLLg/2er3v9rrd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2qs3/95tOL/x9/z//j7/f/////////////////////////////////////////////////////////////////////////////////////////////////6/Pn/2+XP/32fU/9bhiX/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1iEIv9mjjT/yde4//n79//////////////////////////////////////////////////////////////////////////////////////////////////+/v7/3ez3/4u/5v9qrN7/a6zf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aqzf/3Gw4P+t0e3/6vP6//////////////////////////////////////////////////////////////////////////////////////////////////7+/v/q7+P/mbR4/12HKP9ZhSP/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WYUj/16IKv9/n1f/09bQ/97d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/Z293/sc3i/3iz4P9lqd7/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3/9urt//nsnq/+jy+v/9/v////////////////////////////////////////////////////////////////////////////////////////7//v/8/fv/5+7g/6vBj/9kjTH/WoYk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/XIcn/4enYP/f6NX//f38//////////////////////////////////////////////////////////////////////////////////////////////////L4/P/D3vL/eLPh/2qs3v9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2yt3/+Nv+f/3+34//v9/v/////////////////////////////////////////////////////////////////////////////////////////////////4+vb/xtS0/2ySPf9ZhCT/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1eDIP9jjDH/ka1y/9bY0//d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/8TT3v9+td7/ZKne/2qs3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2ir3v9trd//jL/m/97t+P/8/f7////////////////////////////////////////////////////////////////////////////////////////////4+vb/3ebU/7TInf9skjz/WYQk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qFJf9hii7/n7iB/+vw5f/9/v3////////////////////////////////////////////////////////////////////////////////////////////+/v//7vb8/63S7f9ysOD/aazf/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aKve/2qs3/+DuuT/1+n2//v9/v/////////////////////////////////////////////////////////////////////////////////////////////////6+/j/2OPM/3qdTv9ahiX/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9UgRz/apE6/6y+lP/Z2tj/3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/R193/irrg/2ut4P9qrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a63f/2qs3v9xr+D/kMHm/9Xo9f/6/f7////////////////////////////////////////////////////////////////////////////////////////////8/fr/2OPM/4ioY/9kjTL/WoYl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUk/2iPN/+9z6f/8fXs//////////////////////////////////////////////////////////////////////////////////////////////////3+///m8fn/ncjq/3Sx4f9pq97/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqve/22t3/+IveX/zOP0//j8/v////////////////////////////////////////////////////////////////////////////////////////////39/P/1+PL/1uHI/42raP9diCn/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahST/UoAZ/3CUQv/By7P/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3Nz/1dnd/53D4v9+tuP/ba7f/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2mr3v9urt//q9Ds/9Tn9f/1+f3/////////////////////////////////////////////////////////////////////////////////////////////////7/Pp/523fP9kjTL/VYIf/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahiT/gKJX/9rkzv/+/v7/////////////////////////////////////////////////////////////////////////////////////////////////+v3+/9bo9v+Tw+f/dLHg/2mr3v9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//aave/2yt3v+fyur/x+Dz//D3/P/+///////////////////////////////////////////////////////////////////////////////////////////////1+PL/z9y//6W9iP9okDb/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WYUk/1OCHP92mUz/zdPG/97d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzc/9fa3f+qyuP/ir3k/22u3/9rrN//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2us3/9qrN7/ib3l/9Lm9f/z+Pz//f7+/////////////////////////////////////////////////////////////////////////////////////////////P37/9njzf97nlD/W4cm/1iEIv9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WYUj/2WOM/+1yZ3/4unY//n69//////////////////////////////////////////////////////////////////////////////////////////////////w9/z/udfv/5TD5/9zseD/aave/2ut3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9srd//a6zf/2qs3v+EuuP/xd7y/+jy+v/6/P7////////////////////////////////////////////////////////////////////////////////////////////+/v3/6e/h/6rBj/+Aolj/XYgo/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9ciCj/gKBb/9LWzv/e3t//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3P/Z29z/vtPj/6DG5P90seD/aave/2us3/9srd//bK3f/2yt3/9srd//bK3f/2yt3/9rrd//aqze/2qr3v9trd7/hLrk/8vi8//y9/z//f7+/////////////////////////////////////////////////////////////////////////////////////////////v/+/+7z6f+nvov/Y4sw/1qFI/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9dhyj/cZZC/5ezdf/f59T//P38/////////////////////////////////////////////////////////////////////////////////////////////P3+//D3/P/V6Pb/m8fp/3Ox4P9pq97/aqzf/2yt3/9srd//bK3f/2yt3/9srd//bK3f/2ut3/9rrd//aqze/2ys3v+AuOP/wdzx/+v0+//6/P7//v7/////////////////////////////////////////////////////////////////////////////////////////////+Pr1/8TUsf91mkr/WIQi/1mFI/9chyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9eiCn/dppJ/5qxfP/V19L/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dvc/9zd3//Q2uT/qs7q/3u24v9urt//aqze/2mr3v9pq97/aqze/2qs3v9prN7/ba7f/3Cw4P94tOL/l8Xo/9zr9//4+/3//v////////////////////////////////////////////////////////////////////////////////////////////////////j69f/E1LH/apI7/1mEI/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/1eDIP9mjzX/nbd9/+rw4//+/v3/////////////////////////////////////////////////////////////////////////////////////////////////+vz+/+fx+v+31u//frfi/3Cv3/9rrN7/aave/2mr3v9qrN7/aqze/2mr3v9srN//bq7f/3Sx4f+Rwef/1+j2//b6/f/9/v//////////////////////////////////////////////////////////////////////////////////////////////////+/z6/9fiy/94nE3/W4Ym/1iEIv9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/Yosv/5iyeP+8yav/2drY/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b29r/4OHh/+rw9f/Z6vb/p87s/4K65P94s+L/drLh/3ay4f92suH/e7bi/5rH6f++2/D/0+f1/+nz+v/8/f7///////////////////////////////////////////////////////////////////////////////////////////////////////n7+P/X4sv/eJxN/1qGJf9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WYUk/2iPNv+7zaX/9fjz///////////////////////////////////////////////////////////////////////////////////////////////////////9/v//9Pn9/9/t+P+z1O7/jb/n/3634/93s+H/dbLh/3ay4f96tOL/jb/m/6PM6//I4PL/6PL6//v9/v///////////////////////////////////////////////////////////////////////////////////////////////////////P36/+Lp2P+LqWX/XYgo/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/2aONv+1w6P/2dvV/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/2tra/9/f3//v7+//+vv8//H3/P/o8vr/4/D5/+Du+P/a6vf/3ez3/+Xx+f/u9fv/9vr9//v9/v/+/////////////////////////////////////////////////////////////////////////////////////////////////////f38//X48f/V4Mf/i6ll/12IKP9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahST/c5hG/9Tgxv/4+vb////////////////////////////////////////////////////////////////////////////////////////////////////////////9/v//8/j8/+v0+//n8vr/4+/5/9rq9//c6/f/5fD5/+r0+//v9/z/+Pv+//7////////////////////////////////////////////////////////////////////////////////////////////////////+/v7/+/z6/+Tr3P+kvYj/YYsw/1qFJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcm/1uHJv93m03/x8++/+Ti6P/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//d3d3/6enp//v7+/////////////7+///9/v//+/z+//z9/v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////T38f/M2rz/oruE/2aPNf9ahiT/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/12IKf+SsG//4enY//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7////7/f7/+/3+//7/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////+/z6/+zx5v/D07H/cZZE/1mFJP9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9fiSr/katt/8/Uyf/k4ef/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b29v/3Nzc/+Xl5f/6+vr///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/f/n7uD/p7+L/32gVP9chyj/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uHJv9ZhST/cZdD/8LSrv/q8OP/+/z5//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////T38f/K2Lr/nbd+/16IKv9ZhSP/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/YYot/6G2hP/T1s7/4d/k/93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29vb/9vb2//g4OD/+Pj4///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////3+fX/wdKu/3SZSP9YhCL/WYUj/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUl/2CJLf+Fpl7/rsST/+nv4v/+/v3///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////v8+v/X4sr/hqVe/2KLLv9ahiX/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/2SNM/+3xqX/2dvX/97e4P/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b29v/3t7e//Hx8f/9/f3////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/Pr/1+LK/3ebS/9bhiX/WIUj/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/VoMh/3CVQv+4yqH/9Pfw//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/P/g6NX/iahj/2CKLP9YgyD/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9xlkX/ztPI/97e4P/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/n5+f/+/v7///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7/Pn/3ubT/4inYf9dhyj/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1mFI/9ahiT/cZhE/8/cwP/6+/j///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/f/p7+L/nrh//2GLLv9ahST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9fiSv/lbB1/9fY1P/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b29v/4ODg//j4+P////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/P/1+PL/2ePN/5eydv9giiz/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1uGJv99n1P/2OPM//v8+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/f/x9Oz/tMea/2aPNf9ahST/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/ZI0y/7nHp//b29r/3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97e3v/z8/P//v7+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////19/H/zdq9/6S8h/9qkTn/WoUk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/X4kr/5ezd//u8uj////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////5+vf/1uDI/3aaSv9ZhST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/2uSPf/M08X/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d3/7u7u//39/f/////////////////////////////////////////////////////////////////////////////////////////////////////////////////8/fv/3+jV/6a9if9/oFb/W4Ym/1qFJP9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qFJP91mkj/ztu+//b48/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/f/5+/f/5+7f/7HFl/9eiCn/WYQj/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1uHJv96nFD/1NbP/97d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/+bm5v/7+/v////////////////////////////////////////////////////////////////////////////////////////////////////////////9/fz/5+3g/6i+jP9ulD//WoUl/1qFJP9chyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/Xokq/4qpZP/O277/7vLo//v8+v////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////7+/v/z9u//1+HJ/7HGl/9wlkL/WoYk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJP9giiz/nbR//9ja1f/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/f39//9vb2//7+/v/////////////////////////////////////////////////////////////////////////////////////////////////8/fv/4+rZ/6O8hf9mjjT/WoUk/1qGJP9chyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9fiSr/dJhH/5eydf/Z48z/+vv3//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////39/P/t8ef/vc6n/3qdT/9fiSr/WYYk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ZhSP/Z483/8HLtP/c3N3/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3d/+vr6//6+vr///////////////////////////////////////////////////////////////////////////////////////3+/f/2+fT/2+TP/5Kvbf9jjDD/WoYk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1qFJP9fiiv/fqBU/87avf/y9u7//f79//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////z9+//j6tr/p76L/2qROf9ahSX/WYUj/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9YhCL/YIor/4WkX//T1s//3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9vb2//h4eH/9fX1//7+/v///////////////////////////////////////////////////////////////////////f38/+7y6P/c5tL/vs+p/3+hVv9fiSr/WoUl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/W4Yl/1uGJv9vlUH/ssea/+Tr2//4+vb//v7+///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/v3/9/n0//D06//X4cr/jqxq/2OMMP9ZhST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/VIIc/2uSO/+uwJn/2tvZ/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t7e//Dw8P/6+vr//v7+//////////////////////////////////////////////////////////////////P27/+zx5v/gKFY/2qRO/9dhyn/WoUk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/WoUk/2yTPf+atXr/3ebS//n79v/+/v3/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////9/n0/9fiy/+1yZ7/gKJX/2CKLf9ZhST/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYk/1WDHf92mUv/x8+//93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3f/q6ur/9PT0//39/f///////////////////////////////////////////////////////P37/+rw4//L2br/iadi/1qFJP9PfRb/WIQi/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1mFJP9Ugh7/cphF/7DFlv/P3L//4urZ//j69v////7////////////////////////////////////////////////////////////////////////////////////////////////////////////9/fz/7vPp/9Lew/+swpL/iall/1yHJ/9Wgx//W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1uHJv9ljzP/iadl/9LWzv/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/4ODg/+jo6P/6+vr//////////////////////////////////v7+//j69v/x9O3/6/Dl/9zl0f+qwI7/dJhH/1+KLP9ahST/WYUj/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUl/12HKP9kjDH/cpdE/5izd//R3cL/6e/i//L27//4+vb//f79///////////////////////////////////////////////////////////////////////+//7/+vz5//T38P/u8+j/3+jW/7bJn/9+oFX/Zo41/16JKv9ahST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9gii3/kKxt/7TEof/Y2df/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9ra2v/h4eH/8/Pz//v8+f/5+/j/9vnz//P27v/w9Or/6/Dk/+Dp1//F1LL/pb2I/42raf9vlkH/YYst/1qGJf9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WYUj/1qFJP9eiCr/aZA4/4upZf+uw5T/xNSx/93m0v/p7uH/7/Pq//X48v/4+vb/+vv4//v8+v/9/vz//P37//r7+P/5+vb/9/nz//L27v/t8ef/4+vb/8/cwP+yxpj/mbR3/3abSv9jjDD/W4Ym/1qFJP9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahSX/bZM+/7rHq//c3dr/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/b29v/3t7e/+Lj4f/W4Mn/yti5/77Pqf+twpL/n7iA/4qpZf9wlkL/ZI0z/2CKLv9eiCr/WoUl/1qGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1qGI/9diCj/Yosv/2SNM/9rkjz/gqNa/564fv+3yqD/xdSy/8vZuv/S3cP/2ePM/9bhyP/N2r3/xtW0/77Pqf+swpL/kq5v/3eaSv9njzb/Yowv/1+KK/9bhiX/WoUk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/X4kr/5ixef/R1cv/4uDl/93d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3//S1cz/hqVg/2+WQf9tkz7/aZA4/2WONP9giiz/WYUj/1iEIv9ahiT/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1qFJP9YhCL/WIMi/12IKf9ljjP/bJM7/2+VQP9xlkL/c5dF/3WZR/90mEf/cZZD/3CVQf9tlD7/aJA4/2KLL/9ahiX/WIQi/1qFI/9bhiX/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WYQj/2KLMP+7yKv/2tzZ/97e4P/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3d//z9PK/3ibT/9Rfxn/UYAZ/1SCHP9Wgx7/WIQh/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9YhSP/VYMf/1OAG/9Sfxn/UX8Y/1B+F/9PfRb/T30X/1B+F/9SgBn/U4Ab/1SBHf9XgyD/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qFJP9vlEH/y9HC/97e3//d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/9na1/+qvZX/YYsu/1iEIf9ahiX/WoYl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1uGJf9ahiX/WoUk/1qFJP9ahST/WYUj/1mFJP9ahST/WoUk/1qFJP9ahiX/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9fiSr/lK9z/9bY0v/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3d7/z9TK/36fVf9chyb/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahST/a5I7/8POtv/c3d3/3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzd/9rb2f+vwZv/ZI0z/1mGI/9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/X4kr/5eweP/W2NP/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3d7/0dTL/4KgWv9fiCr/WIQi/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/WoUk/22TP//Ezbn/3dzd/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/9rb2f+ou5H/Zo42/1KAGf9ahST/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/VoMf/2KLL/+RrG//1djS/93d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/c3Nz/v8qy/3WYSf9YhSH/W4Yk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yk/1WDHf9rkjv/rL6V/9rb2f/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3e/9PWzv+asn7/d5tN/12IKf9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1uGJf9jjC//haNe/8vSw//d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/c3N3/1dfQ/7TBof9tkj//WoUl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJP9kjDL/nLN//8DLsf/a29n/3d3d/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3d/+Hf4//T1s7/obaF/2KLLv9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9diCj/haNe/8nPv//i3+L/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/3t7e/83Txv97nVL/W4cm/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ahST/a5E7/73Jrv/b3Nr/397h/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3//a29j/qbyQ/1+JK/9YhSL/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiT/Xogp/4+rbv/U19D/393f/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d3/3d3d/8LMtP9skj3/WoYk/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WoYk/2WNM/+svpX/29za/97d3//c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3v/U19D/kKxv/2ONMP9YhCD/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WIQi/12IKP98nlT/zdLF/97d3v/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3N3/3dzd/8bOvP+Eo13/ZY4x/1uGJf9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WYYk/1iFIv9zl0b/tsWl/9vc2//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/b29r/yNC8/6W5jP9ojzj/WoYk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/2GLLv+KqGX/rr+X/9bZ1P/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/+Df4v/K0sL/jKlo/12IKP9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcm/1uGJf9zmEX/u8is/9vc2f/e3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3v/j4Ob/19nU/6m8kP9ljTP/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9eiCn/jalq/9DVy//m4+r/3t3f/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3e/97d3v/M0sX/gKBZ/1yHJ/9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ahSX/b5RA/7/JsP/b29r/397h/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/3Nzc/7zIrv9tkz//WoUk/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/Zo40/6m8kf/Y2tf/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3v/Y2tf/qLuR/2aONP9ahiP/W4Yl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahST/YYos/5Suc//T18//3d3e/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/9TX0P+ZsHr/Z482/1iFIf9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9YhCH/Xokq/4GiWv/M0sT/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/e3d7/yM++/4alYf9mjzT/W4Yl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ZhST/U4Ic/22UQP+2xaX/3N3c/93d3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3f/9na2P+ou5D/g6Nc/2CKLf9ahiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/W4Ym/2iROf+LqGr/z9XJ/97e3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/d3d3/2NrV/7zIrf97nFH/W4Ym/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WYUk/2uRPP+mu43/x9G7/9rb2v/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzd/9/e4f/a29n/vMiu/2+VQv9ahiT/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUk/2ePNv+qvZP/1NjP/9/e4P/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3N3/3d3e/9nb2P+vwJz/apE7/1mFJP9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/WoYk/2WNMv+gtoT/1djS/97d3//d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/d3d7/2NnV/6y9lP9pkDj/WYYj/1mGI/9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WoYk/2GML/+Vr3b/09bO/97c3//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzd/97d3//S1s3/l7F5/2GLLf9SgBj/WoUk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/VoMf/1yHJv99oFT/x8++/97d3v/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/3d3e/7fGpv95m07/X4kq/1qFJP9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/1uHJf9rkjv/nLSA/9rb2f/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3//W2NH/s8Ke/5Ksb/9mjjT/WoUk/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Yl/1+KLP95nE//mbJ8/83Sxv/e3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3f/97d3//O08f/nLN+/2SNMv9ahST/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/1+JK/+HpGL/wsu1/9rb2P/d3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3d7/3t3e/9HWzf+Ysnv/ZY0z/1qGJP9ahiT/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WoYl/2CKLP+IpmL/ytHB/93d3f/e3t//3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3v/e3d//zNLF/5Crbf9eiSr/UYAZ/1mFI/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/VoMf/1uHJf96nVD/w8y3/93d3f/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3f/97d3/+xwZz/eZpN/2GKLf9ZhSP/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/WoYk/12HJ/9skjz/m7N9/9vb2f/f3eD/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/d3d//1dfR/7fGpf+YsXn/aZA4/1qFJP9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoUl/2KLL/+AoFf/n7WD/87Txv/e3d//3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3v/d3d7/0tfN/6y+lv9rkTz/WoUk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WYYk/2SOM/+WsHj/yM++/9vb2f/e3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3t3e/97d3//Y2db/scCe/26TQf9bhib/W4Yl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/WoUk/2mPOP+iuIj/0tfO/97e3//e3t//3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3N3/3d3e/9na2P+5xqr/eJtO/2CKLP9bhiX/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahST/W4cm/22TP/+tvpj/1tjT/93d3//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/e3d7/2tvY/7rGqv+Colr/Zo4z/1iEIv9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9YhCH/VYQe/2yUPf+qvpP/1dnS/97d3v/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzd/9/e4f/W2tP/p7qO/4akX/9njzb/WoYk/1uHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ahiT/YIot/3CXRf+QrHD/y9PB/9/e4P/d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3N3/3dze/9na1//Hz73/mLB5/2aONf9ahST/W4cm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ahiT/Yosu/4WkYP+6x6v/0tbN/9vc2v/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/e3t//3t3f/9TX0P+ou5H/bJI9/1uGJv9ahiX/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1uGJf9ahiX/Z482/5mye//O1Mj/3Nzd/97d3//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/d3d7/2NrW/7nGqf99nVT/ZIwx/12HKP9ahiX/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/WoYl/1uHJv9eiSv/cpdF/62/mP/V19H/3t3e/93d3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3v/b3Nv/y9DC/6e5jf+Kp2T/Z482/1qGJf9bhiX/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/WYUk/2OMMP94mk3/lK1z/8PMtv/a29j/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/97d3v/W2NT/ydDA/6O5if9jjTD/V4Qh/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/V4Qh/1qGJP+RrG//v8qy/9LWzv/c3Nz/3t3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d//4+Dn/+Df4v/Gz7r/g6Jc/2KLL/9ahST/WYUi/1uHJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ahiP/WoYj/16JKv93mUv/tMOh/93d3f/m4uv/393g/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/97d3v/e3d7/29va/8bOvP+NqWz/apE6/1+JKv9bhyX/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJv9ahiX/Xokp/2ePNf+Do13/vcmt/9ja1f/e3d7/3t7f/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/d3N3/09bP/73Jrv+juIn/d5pN/2CKLv9ahST/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcm/1qGJP9eiCn/b5RB/5ixef+0xKD/0NXL/9zc3P/d3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93d3v/c3Nv/2drX/8vRw/+dtIH/bJI8/12HKf9ahiT/WoYk/1yHJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhiX/WoUk/1yHJv9mjzb/jalq/8LMtv/W2dP/29zb/97d3v/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/97d3//e3d7/0tbM/7LCnv92mUr/V4Qh/1KAGv9ZhSL/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahST/VIId/1aDHv9rkjn/p7yP/8zTxf/c3Nz/3t3f/97d3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/+Hf5P/T2M7/mrF7/3SYR/9mjjP/XYgo/1qGI/9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJv9ZhSP/W4cl/2SNMv9vlEH/jahq/8rTwf/i4OT/3t3g/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/3dzd/9LWzv+8ya3/pLmL/3ydU/9jjDH/W4cm/1qFJP9chyb/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1qGJf9ahiX/YIou/3KXR/+Zsn3/tMSi/8/UyP/b3Nv/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/d3d7/3Nzc/9na2P/P1Mn/q76X/3qcUP9jizD/XIcn/1qGJP9ahiT/XIcm/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9ahiX/WYUk/1uGJf9gii3/cZVD/6K3h//L0cL/19nV/9vc2//e3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/d3d7/3d3f/9rb2f/P08j/rL2U/4KiW/9ulUD/Y4ww/1yHJ/9ahSX/W4Ym/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyb/XIcm/1qGJP9bhib/YYou/2aONv92mUv/n7aD/8nRwP/Y2tb/3d3e/93d3v/d3d7/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3N3/3d3e/9rb2f/V19L/ydDB/6m8kv97nFL/ZY0z/1+JK/9dhyf/WYUk/1uGJf9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9ahST/W4Ym/12HKP9jjDD/dZlK/6O5if/Dzrj/0NbL/9ja1v/d3d7/3d3e/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/39/h/97e3v/W2NP/xs69/6e7j/+Fo13/bpM9/1aCHv9Vgx7/WoYl/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1uGJf9XgyD/VIIc/16JKP9xl0P/nLN//8PMuP/U19H/3d3d/9/e4f/e3d//3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/4N7j/+Lg5f/L08H/qbuQ/5Grb/91mEn/ZY40/1qHJv9ZhSP/W4Yl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhib/W4Yl/1mFI/9ahiT/ZI0w/3CVQv+AoFn/lq92/8DMsf/h4OP/4d/k/93d3//c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/d3d7/29za/9fZ1f/T1s7/xM24/5y0gP9xl0X/Y4ww/1+KK/9diCj/WoUk/1qGJf9bhib/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4cm/1qGJf9ahST/XIcm/16IKf9ijC//bpRA/5Sucv+7yKv/ztTI/9XY0v/a29n/3t3e/93d3v/c3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/e3d//3t3f/9zd3f/X2dX/zNHE/7DAmv+Vr3X/gqJc/2uRPf9ijDD/XYgp/1qFJP9ahiX/WoYl/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qGJf9ahiX/WoUk/1yHJ/9hiy7/aI83/3maT/+Lp2f/q76T/8rRwf/W2dP/3Nzb/97e3v/e3t//3dzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3d3e/93d3v/a29n/19nV/9TX0P/J0cH/rr+Y/4mmZP9qkDv/Y4sx/2GLL/9fiSr/W4Yl/1qFJP9ahiX/W4Ym/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9bhyb/W4cm/1uGJf9ahiT/WoYk/16IKf9hii7/Y4sw/2iPN/+BoFn/prqM/8XOuf/R1cz/1tjT/9rb2P/d3d7/3t3e/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3dzd/97d3//e3d//3d3e/9rb2P/U19H/yM++/7PEof+kuoz/jqps/3GWRP9ljTT/Yosv/1+JK/9dhyj/WoUl/1qFJP9ahiX/W4Yl/1uGJf9bhyb/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcm/1uGJv9bhib/WoYl/1qFJP9ahST/XIcn/16JKf9gii3/ZI0y/22SP/+Kp2T/oreF/7HBm//Dzbj/09bP/9na1//d3d3/3t3f/97d3//d3N3/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3d7/397g/97d3f/Y2tb/1NjQ/8/TyP/Ezbn/scKd/5awd/9/oFX/bpQ9/1eFIf9SgBn/VIEc/1aDHv9XhCD/WYUj/1uGJv9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/W4Ym/1qGJP9YhCH/V4Mf/1WCHf9SgBn/VYMd/2eQNf91mkn/i6hn/6m8kf/ByrT/zdPG/9PXz//X2dX/3Nzd/9/e4P/e3d7/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/d3N7/397h/+Hf4//k4ef/5OLn/9XZ0P+6yKr/o7iI/5KscP96nFL/bpRB/2qROv9mjjX/ZIwx/1+JKv9ZhSP/WIQi/1mFI/9ahST/WoUk/1qGJf9bhiX/W4Ym/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcn/1yHJ/9chyf/XIcm/1uGJv9ahiX/WoUk/1qFJP9ZhSP/WYUi/1iFIv9ciCf/YYst/2SNMf9okDj/bpNA/3iaTv+Lp2j/mrF8/6/Amv/N1MT/4+Hk/+Th6P/h3+T/397i/93c3v/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/d3N3/3t3e/97e3v/c3Nz/2drX/9fZ0//U19D/zdLH/7zHrf+rvpT/nrWB/5Oucv+BoVr/bJI+/2WNNP9jjDH/Yosv/2GKLf9giiv/Xogp/1yHJ/9ahST/WoUj/1qFI/9ahST/WoYk/1qGJf9ahiX/WoYl/1qGJf9ahiX/WoYl/1qGJf9bhiX/W4Yl/1uGJf9ahiX/WoYl/1qGJf9ahiX/WoYl/1qGJf9ahiT/WoUk/1qFJP9ahST/WYUj/1uGJf9dhyn/X4kr/2GKLf9iiy7/Y4ww/2WNNP9pkDn/eZtP/4qnZf+Vr3X/pbqM/7vIrP/N08b/09bP/9XY0v/X2dX/29za/97d3v/e3d//3dze/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/93c3f/e3d//3t3f/97d3v/c29v/2drY/9jZ1f/W2NP/1NbQ/8/Uyf/Dzbf/scKe/6S5i/+dtIH/la51/4imY/97nFH/bZI//2ePN/9mjjX/ZY00/2SMMv9jjDH/Y4wy/2OMMv9jjDD/Yosv/2KLLv9hii7/YYst/2GLLf9hii3/YYsv/2KLLv9iiy//Y4sw/2OLMP9jjDH/ZI0y/2WNNP9mjjX/Zo41/2iPOP90l0f/hKNd/5Oucf+dtH//o7mJ/67AmP+/y7H/zdLG/9PVz//V19L/1tnU/9ja1v/c3Nv/3t7e/97d3//e3d//3d3e/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzd/93c3f/d3d7/3d3e/97d3//e3t//3N3d/9rb2f/Z2tf/2NnW/9fY1P/V19H/0tbP/9HVzf/O1Mf/ydHB/8LLtf+6xqj/tMOh/7PDof+ywp//rsCY/6q+k/+muo3/o7iI/6C3hf+ftoT/oLaF/6S5i/+muo3/qLuQ/6y+lf+uwJn/s8Of/7vHqv/BzLT/xs+8/8nRwf/N08f/0tXN/9TX0P/W2NP/2NnV/9na1v/a29j/3Nzc/97d3//e3d//3d3e/93d3v/d3d3/3Nzd/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3f/d3d7/3t3f/97d3//e3d//397g/9/e4f/g3uH/397g/97e3//c3Nv/2tvY/9jZ1v/Y2tb/2NrV/9fZ0//V2dP/1dfR/9PX0P/T1s//09bO/9PWzv/U2ND/1dfR/9XX0f/W2dP/19nU/9ja1f/a29n/3Nzb/97d3f/e3d//397g/+De4f/f3uD/3t3f/97d3//e3d//3d3e/93c3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/29vb/9zc3f/d3N3/3t3e/97e4P/f3uH/397h/9/e4f/g3uH/4N7i/+He4//h3+T/4d/k/+Hf5P/h3+T/4d/j/+He4//h3uP/4N7i/+De4v/f3uH/3t7g/97d3v/d3N7/3dze/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3N3/3dzd/93c3f/d3N3/3dzd/93c3f/d3N3/3d3e/93d3v/d3d7/3d3e/93d3f/d3N3/3dzd/93c3f/d3N3/3dzd/9zc3f/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P/c3Nz/3Nzc/9zc3P8=" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0KdW5pZm9ybSBzYW1wbGVyMkQgdV9kaWZmdXNlOw0KdW5pZm9ybSB2ZWM0IHVfc3BlY3VsYXI7DQp1bmlmb3JtIGZsb2F0IHVfc2hpbmluZXNzOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzMgbm9ybWFsID0gbm9ybWFsaXplKHZfbm9ybWFsKTsNCnZlYzQgY29sb3IgPSB2ZWM0KDAuLCAwLiwgMC4sIDAuKTsNCnZlYzQgZGlmZnVzZSA9IHZlYzQoMC4sIDAuLCAwLiwgMS4pOw0KdmVjNCBzcGVjdWxhcjsNCmRpZmZ1c2UgPSB0ZXh0dXJlMkQodV9kaWZmdXNlLCB2X3RleGNvb3JkMCk7DQpzcGVjdWxhciA9IHVfc3BlY3VsYXI7DQpkaWZmdXNlLnh5eiAqPSBtYXgoZG90KG5vcm1hbCx2ZWMzKDAuLDAuLDEuKSksIDAuKTsNCmNvbG9yLnh5eiArPSBkaWZmdXNlLnh5ejsNCmNvbG9yID0gdmVjNChjb2xvci5yZ2IgKiBkaWZmdXNlLmEsIGRpZmZ1c2UuYSk7DQpnbF9GcmFnQ29sb3IgPSBjb2xvcjsNCn0NCg==" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Ow0KYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsNCmF0dHJpYnV0ZSB2ZWMzIGFfbm9ybWFsOw0KdmFyeWluZyB2ZWMzIHZfbm9ybWFsOw0KdW5pZm9ybSBtYXQzIHVfbm9ybWFsTWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfbW9kZWxWaWV3TWF0cml4Ow0KdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDsNCmF0dHJpYnV0ZSB2ZWMyIGFfdGV4Y29vcmQwOw0KdmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQwOw0Kdm9pZCBtYWluKHZvaWQpIHsNCnZlYzQgcG9zID0gdV9tb2RlbFZpZXdNYXRyaXggKiB2ZWM0KGFfcG9zaXRpb24sMS4wKTsNCnZfbm9ybWFsID0gdV9ub3JtYWxNYXRyaXggKiBhX25vcm1hbDsNCnZfdGV4Y29vcmQwID0gYV90ZXhjb29yZDA7DQpnbF9Qb3NpdGlvbiA9IHVfcHJvamVjdGlvbk1hdHJpeCAqIHBvczsNCn0NCg==" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ], + "disable": [] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + }, + "extensionsUsed": [], + "cameras": {}, + "extensions": { + "KHR_materials_common": { + "lights": {} + } + } +} diff --git a/Specs/Data/Models/Box-Textured-KTX-Embedded/Readme.txt b/Specs/Data/Models/Box-Textured-KTX-Embedded/Readme.txt new file mode 100644 index 000000000000..431544f9ba3f --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX-Embedded/Readme.txt @@ -0,0 +1 @@ +This is the same as Box-Textured-KTX, except the KTX texture is embedded in the glTF. diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.bin b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.bin new file mode 100644 index 000000000000..79f5db410b75 Binary files /dev/null and b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.bin differ diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae new file mode 100644 index 000000000000..b07a87d4aa98 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.dae @@ -0,0 +1,126 @@ + + + + + modo 801 [Build 77509], Microsoft Windows 7 Service Pack 1 (6.1.7601 Service Pack 1) + Plug-in: [Build 77509]; Use Absolute Path: No; Merge Reference Items: No; Save Hidden Items: No; Save Cameras: No; Save Lights: No; Save Locators: Yes; Save Triangles as Triangles: Yes; Order Vertex Maps Alphabetically: Yes; Bake Matrices: No; Save Vertex Normals: Yes; Save UV Texture Coordinates: Yes; Save Vertex Colors: No; Save Vertex Weights: No; Save Animation: Yes; Sample Animation: No; Sample Animation Start: 0; Sample Animation End: 120; Save modo Profile: No; Save Maya Profile: No; Save 3ds Max Profile: No; Formatted Arrays: No; + file:///C:/Users/Branden/Creative%20Cloud%20Files/03-2015%20Cesium%20Test%20Models/CesiumTexturedBoxTest.lxo + + 2015-03-04T16:58:00Z + 2015-03-04T16:58:00Z + Z_UP + + + + Cesium_Logo_Flat.png + + + + + + + + + + + + + Image0001 + A8R8G8B8 + + + + + Image0001-surface + LINEAR_MIPMAP_LINEAR + LINEAR + + + + + + + + + 0.2 0.2 0.2 1 + + + 256 + + + + + + + + + + + -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 -0.5 0.5 -0.5 -0.5 -0.5 -0.5 0.5 -0.5 0.5 0.5 0.5 -0.5 0.5 0.5 0.5 0.5 + + + + + + + + + + 0 0 1 1 0 0 0 1 0 0 -1 0 -1 0 0 0 0 -1 + + + + + + + + + + 6 1 5 1 6 1.09011e-007 5 1.09011e-007 4 1 5 1 4 1.02033e-008 5 1.02033e-008 2 1 1 1 2 1.02033e-008 1 1.02033e-008 3 1 3 1.02033e-008 0 1 0 1.09011e-007 1 1 1 1.09011e-007 + + + + + + + + + + + + + + +

    4 0 0 6 0 1 5 0 2 7 0 3 5 0 2 6 0 1 7 1 4 6 1 5 2 1 6 3 1 7 2 1 6 6 1 5 5 2 8 7 2 9 1 2 10 2 2 11 1 2 10 7 2 9 6 3 12 4 3 4 3 3 13 0 3 6 3 3 13 4 3 4 4 4 12 5 4 8 0 4 13 1 4 10 0 4 13 5 4 8 0 5 14 1 5 15 3 5 16 2 5 17 3 5 16 1 5 15

    +
    +
    +
    +
    + + + + + + + + + + + + + + + + 0 0 0 + 0 1 0 0 + 1 0 0 0 + 0 0 1 0 + 1 1 1 + + + + + + + +
    diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf new file mode 100644 index 000000000000..ec3f2d6d0326 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "CesiumTexturedBoxTest", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "CesiumTexturedBoxTest": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "CesiumTexturedBoxTest.bin" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "Cesium_Logo_Flat.ktx" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.20000000298023224, + 0.20000000298023224, + 0.20000000298023224, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "CesiumTexturedBoxTest0FS", + "vertexShader": "CesiumTexturedBoxTest0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9729, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "CesiumTexturedBoxTest0FS": { + "type": 35632, + "uri": "CesiumTexturedBoxTest0FS.glsl" + }, + "CesiumTexturedBoxTest0VS": { + "type": 35633, + "uri": "CesiumTexturedBoxTest0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl new file mode 100644 index 000000000000..782e1f41628c --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0FS.glsl @@ -0,0 +1,18 @@ +precision highp float; +varying vec3 v_normal; +varying vec2 v_texcoord0; +uniform sampler2D u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = texture2D(u_diffuse, v_texcoord0); +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl new file mode 100644 index 000000000000..cacc9ed997a3 --- /dev/null +++ b/Specs/Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest0VS.glsl @@ -0,0 +1,15 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +v_texcoord0 = a_texcoord0; +gl_Position = u_projectionMatrix * pos; +} diff --git a/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx b/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx new file mode 100644 index 000000000000..c05afa20b6b2 Binary files /dev/null and b/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.ktx differ diff --git a/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.png b/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.png new file mode 100644 index 000000000000..a3a8cc9d60d0 Binary files /dev/null and b/Specs/Data/Models/Box-Textured-KTX/Cesium_Logo_Flat.png differ diff --git a/Specs/DataSources/BillboardVisualizerSpec.js b/Specs/DataSources/BillboardVisualizerSpec.js index df82126feca4..d802621455e7 100644 --- a/Specs/DataSources/BillboardVisualizerSpec.js +++ b/Specs/DataSources/BillboardVisualizerSpec.js @@ -14,7 +14,6 @@ defineSuite([ 'DataSources/ConstantProperty', 'DataSources/EntityCluster', 'DataSources/EntityCollection', - 'Scene/BillboardCollection', 'Scene/HeightReference', 'Scene/HorizontalOrigin', 'Scene/VerticalOrigin', @@ -36,7 +35,6 @@ defineSuite([ ConstantProperty, EntityCluster, EntityCollection, - BillboardCollection, HeightReference, HorizontalOrigin, VerticalOrigin, diff --git a/Specs/DataSources/CallbackPropertySpec.js b/Specs/DataSources/CallbackPropertySpec.js index 759b39c17be5..96c992d8c23f 100644 --- a/Specs/DataSources/CallbackPropertySpec.js +++ b/Specs/DataSources/CallbackPropertySpec.js @@ -1,11 +1,9 @@ /*global defineSuite*/ defineSuite([ 'DataSources/CallbackProperty', - 'Core/Cartesian3', 'Core/JulianDate' ], function( CallbackProperty, - Cartesian3, JulianDate) { 'use strict'; diff --git a/Specs/DataSources/CzmlDataSourceSpec.js b/Specs/DataSources/CzmlDataSourceSpec.js index 4e96c76e68fe..7c2c956b09a1 100644 --- a/Specs/DataSources/CzmlDataSourceSpec.js +++ b/Specs/DataSources/CzmlDataSourceSpec.js @@ -9,7 +9,6 @@ defineSuite([ 'Core/ClockStep', 'Core/Color', 'Core/CornerType', - 'Core/defined', 'Core/Ellipsoid', 'Core/Event', 'Core/ExtrapolationType', @@ -28,12 +27,12 @@ defineSuite([ 'DataSources/EntityCollection', 'DataSources/ReferenceProperty', 'DataSources/StripeOrientation', + 'Scene/ColorBlendMode', 'Scene/HeightReference', 'Scene/HorizontalOrigin', 'Scene/LabelStyle', 'Scene/ShadowMode', 'Scene/VerticalOrigin', - 'Specs/pollToPromise', 'ThirdParty/when' ], function( CzmlDataSource, @@ -45,7 +44,6 @@ defineSuite([ ClockStep, Color, CornerType, - defined, Ellipsoid, Event, ExtrapolationType, @@ -64,12 +62,12 @@ defineSuite([ EntityCollection, ReferenceProperty, StripeOrientation, + ColorBlendMode, HeightReference, HorizontalOrigin, LabelStyle, ShadowMode, VerticalOrigin, - pollToPromise, when) { 'use strict'; @@ -1841,7 +1839,16 @@ defineSuite([ gltf : './Data/Models/Box/CesiumBoxTest.gltf', incrementallyLoadTextures : true, shadows : 'ENABLED', - heightReference: 'CLAMP_TO_GROUND', + heightReference : 'CLAMP_TO_GROUND', + silhouetteColor : { + rgbaf : [1.0, 0.0, 0.0, 1.0] + }, + silhouetteSize : 2.0, + color : { + rgbaf : [0.0, 1.0, 0.0, 0.2] + }, + colorBlendMode : 'HIGHLIGHT', + colorBlendAmount : 0.5, nodeTransformations : { Mesh : { scale : { @@ -1871,6 +1878,11 @@ defineSuite([ expect(entity.model.incrementallyLoadTextures.getValue(Iso8601.MINIMUM_VALUE)).toEqual(true); expect(entity.model.shadows.getValue(Iso8601.MINIMUM_VALUE)).toEqual(ShadowMode.ENABLED); expect(entity.model.heightReference.getValue(Iso8601.MINIMUM_VALUE)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(entity.model.silhouetteColor.getValue(Iso8601.MINIMUM_VALUE)).toEqual(new Color(1.0, 0.0, 0.0, 1.0)); + expect(entity.model.silhouetteSize.getValue(Iso8601.MINIMUM_VALUE)).toEqual(2.0); + expect(entity.model.color.getValue(Iso8601.MINIMUM_VALUE)).toEqual(new Color(0.0, 1.0, 0.0, 0.2)); + expect(entity.model.colorBlendMode.getValue(Iso8601.MINIMUM_VALUE)).toEqual(ColorBlendMode.HIGHLIGHT); + expect(entity.model.colorBlendAmount.getValue(Iso8601.MINIMUM_VALUE)).toEqual(0.5); var nodeTransform = entity.model.nodeTransformations.getValue(Iso8601.MINIMUM_VALUE).Mesh; expect(nodeTransform).toBeDefined(); @@ -1896,6 +1908,16 @@ defineSuite([ gltf : './Data/Models/Box/CesiumBoxTest.gltf', incrementallyLoadTextures : true, shadows : 'ENABLED', + heightReference: 'CLAMP_TO_GROUND', + silhouetteColor : { + rgbaf : [1.0, 0.0, 0.0, 1.0] + }, + silhouetteSize : 2.0, + color : { + rgbaf : [0.0, 1.0, 0.0, 0.2] + }, + colorBlendMode : 'HIGHLIGHT', + colorBlendAmount : 0.5, nodeTransformations : { Mesh : { scale : { @@ -1928,6 +1950,12 @@ defineSuite([ expect(entity.model.uri.getValue(validTime)).toEqual('./Data/Models/Box/CesiumBoxTest.gltf'); expect(entity.model.incrementallyLoadTextures.getValue(validTime)).toEqual(true); expect(entity.model.shadows.getValue(validTime)).toEqual(ShadowMode.ENABLED); + expect(entity.model.heightReference.getValue(validTime)).toEqual(HeightReference.CLAMP_TO_GROUND); + expect(entity.model.silhouetteColor.getValue(validTime)).toEqual(new Color(1.0, 0.0, 0.0, 1.0)); + expect(entity.model.silhouetteSize.getValue(validTime)).toEqual(2.0); + expect(entity.model.color.getValue(validTime)).toEqual(new Color(0.0, 1.0, 0.0, 0.2)); + expect(entity.model.colorBlendMode.getValue(validTime)).toEqual(ColorBlendMode.HIGHLIGHT); + expect(entity.model.colorBlendAmount.getValue(validTime)).toEqual(0.5); var nodeTransform = entity.model.nodeTransformations.getValue(validTime).Mesh; expect(nodeTransform).toBeDefined(); @@ -1948,6 +1976,12 @@ defineSuite([ expect(entity.model.uri.getValue(invalidTime)).toBeUndefined(); expect(entity.model.incrementallyLoadTextures.getValue(invalidTime)).toBeUndefined(); expect(entity.model.shadows.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.heightReference.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.color.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.silhouetteColor.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.silhouetteSize.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.colorBlendMode.getValue(invalidTime)).toBeUndefined(); + expect(entity.model.colorBlendAmount.getValue(invalidTime)).toBeUndefined(); expect(entity.model.nodeTransformations.Mesh.getValue(invalidTime)).toEqual(new TranslationRotationScale()); expect(entity.model.nodeTransformations.Mesh.scale.getValue(invalidTime)).toBeUndefined(); @@ -2793,7 +2827,7 @@ defineSuite([ // by the czml-writer ValidationDocumentationGenerator. // https://github.com/AnalyticalGraphicsInc/czml-writer/blob/master/DotNet/GenerateFromSchema/ValidationDocumentGenerator.cs // using command line - // GenerateFromSchema.exe -p ..\..\..\..\Schema\Packet.jsonschema -t validation -o ..\..\..\CesiumLanguageWriterTests\ + // GenerateFromSchema.exe -p ..\..\..\..\Schema\Packet.json -t validation -o ..\..\..\CesiumLanguageWriterTests\ // then running the generated TestGenerateValidationDocument unit test // to produce ValidationDocument.czml and ValidationDocumentAssertions.js @@ -2813,675 +2847,699 @@ defineSuite([ var constant = e = dataSource.entities.getById('Constant'); expect(e).toBeDefined(); date = JulianDate.now(); - expect(e.description.getValue(date)).toEqual('string1'); - expect(e.position.getValue(date)).toEqual(new Cartesian3(1, 2, 3)); - expect(e.orientation.getValue(date)).toEqualEpsilon(new Quaternion(0.365148371670111, 0.547722557505166, 0.730296743340221, 0.182574185835055), 1e-14); - expect(e.viewFrom.getValue(date)).toEqual(new Cartesian3(4, 5, 6)); + expect(e.description.getValue(date)).toEqual('string31449'); + expect(e.position.getValue(date)).toEqual(new Cartesian3(24944, 16481, 24896)); + expect(e.orientation.getValue(date)).toEqualEpsilon(new Quaternion(0.431493311977589, 0.560811914509339, 0.423522822587574, 0.565625261998114), 1e-14); + expect(e.viewFrom.getValue(date)).toEqual(new Cartesian3(17794, 13381, 18228)); expect(e.billboard.show.getValue(date)).toEqual(true); - expect(e.billboard.image.getValue(date)).toEqual('http://example.com/1'); - expect(e.billboard.scale.getValue(date)).toEqual(1.0); - expect(e.billboard.pixelOffset.getValue(date)).toEqual(new Cartesian2(1, 2)); - expect(e.billboard.eyeOffset.getValue(date)).toEqual(new Cartesian3(7, 8, 9)); + expect(e.billboard.image.getValue(date)).toEqual('http://example.com/3792'); + expect(e.billboard.scale.getValue(date)).toEqual(27514.0); + expect(e.billboard.pixelOffset.getValue(date)).toEqual(new Cartesian2(16996, 51010)); + expect(e.billboard.eyeOffset.getValue(date)).toEqual(new Cartesian3(64633, 11516, 17196)); expect(e.billboard.horizontalOrigin.getValue(date)).toEqual(HorizontalOrigin.LEFT); expect(e.billboard.verticalOrigin.getValue(date)).toEqual(VerticalOrigin.BOTTOM); expect(e.billboard.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.billboard.color.getValue(date)).toEqual(Color.fromBytes(2, 3, 4, 1)); - expect(e.billboard.rotation.getValue(date)).toEqual(2.0); - expect(e.billboard.alignedAxis.getValue(date)).toEqualEpsilon(new Cartesian3(0.267261241912424, 0.534522483824849, 0.801783725737273), 1e-14); + expect(e.billboard.color.getValue(date)).toEqual(Color.fromBytes(87, 118, 167, 140)); + expect(e.billboard.rotation.getValue(date)).toEqual(57379.0); + expect(e.billboard.alignedAxis.getValue(date)).toEqualEpsilon(new Cartesian3(0.205062091895724, 0.975768213485699, 0.0763277932228903), 1e-14); expect(e.billboard.sizeInMeters.getValue(date)).toEqual(true); - expect(e.billboard.width.getValue(date)).toEqual(3.0); - expect(e.billboard.height.getValue(date)).toEqual(4.0); - expect(e.billboard.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(1, 2, 3, 4)); - expect(e.billboard.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(5, 6, 7, 8)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(9, 10, 11, 12)); - expect(e.billboard.imageSubRegion.getValue(date)).toEqual(new BoundingRectangle(1, 2, 3, 4)); + expect(e.billboard.width.getValue(date)).toEqual(25197.0); + expect(e.billboard.height.getValue(date)).toEqual(53328.0); + expect(e.billboard.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(59318, 31207, 63353, 55287)); + expect(e.billboard.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(43707, 31146, 12921, 57138)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(11873, 40494, 29598, 27507)); + expect(e.billboard.imageSubRegion.getValue(date)).toEqual(new BoundingRectangle(62620, 63220, 23030, 63321)); expect(e.box.show.getValue(date)).toEqual(true); - expect(e.box.dimensions.getValue(date)).toEqual(new Cartesian3(10, 11, 12)); + expect(e.box.dimensions.getValue(date)).toEqual(new Cartesian3(57494, 62432, 42995)); expect(e.box.fill.getValue(date)).toEqual(true); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(6, 7, 8, 5)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(88, 226, 91, 144)); expect(e.box.outline.getValue(date)).toEqual(true); - expect(e.box.outlineColor.getValue(date)).toEqual(Color.fromBytes(10, 11, 12, 9)); - expect(e.box.outlineWidth.getValue(date)).toEqual(5.0); + expect(e.box.outlineColor.getValue(date)).toEqual(Color.fromBytes(121, 42, 244, 168)); + expect(e.box.outlineWidth.getValue(date)).toEqual(15323.0); + expect(e.box.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.corridor.show.getValue(date)).toEqual(true); - expect(e.corridor.positions.getValue(date)).toEqual([ new Cartesian3(1, 2, 3), new Cartesian3(4, 5, 6) ]); - expect(e.corridor.width.getValue(date)).toEqual(6.0); - expect(e.corridor.height.getValue(date)).toEqual(7.0); - expect(e.corridor.extrudedHeight.getValue(date)).toEqual(8.0); + expect(e.corridor.positions.getValue(date)).toEqual([ new Cartesian3(36415, 2702, 36618), new Cartesian3(47759, 11706, 63277) ]); + expect(e.corridor.width.getValue(date)).toEqual(20413.0); + expect(e.corridor.height.getValue(date)).toEqual(8062.0); + expect(e.corridor.extrudedHeight.getValue(date)).toEqual(22846.0); expect(e.corridor.cornerType.getValue(date)).toEqual(CornerType.BEVELED); - expect(e.corridor.granularity.getValue(date)).toEqual(9.0); + expect(e.corridor.granularity.getValue(date)).toEqual(44105.0); expect(e.corridor.fill.getValue(date)).toEqual(true); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(14, 15, 16, 13)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(230, 252, 22, 236)); expect(e.corridor.outline.getValue(date)).toEqual(true); - expect(e.corridor.outlineColor.getValue(date)).toEqual(Color.fromBytes(18, 19, 20, 17)); - expect(e.corridor.outlineWidth.getValue(date)).toEqual(10.0); + expect(e.corridor.outlineColor.getValue(date)).toEqual(Color.fromBytes(198, 25, 134, 60)); + expect(e.corridor.outlineWidth.getValue(date)).toEqual(9132.0); + expect(e.corridor.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.cylinder.show.getValue(date)).toEqual(true); - expect(e.cylinder.length.getValue(date)).toEqual(11.0); - expect(e.cylinder.topRadius.getValue(date)).toEqual(12.0); - expect(e.cylinder.bottomRadius.getValue(date)).toEqual(13.0); + expect(e.cylinder.length.getValue(date)).toEqual(33298.0); + expect(e.cylinder.topRadius.getValue(date)).toEqual(16245.0); + expect(e.cylinder.bottomRadius.getValue(date)).toEqual(59378.0); expect(e.cylinder.fill.getValue(date)).toEqual(true); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(22, 23, 24, 21)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(216, 68, 53, 64)); expect(e.cylinder.outline.getValue(date)).toEqual(true); - expect(e.cylinder.outlineColor.getValue(date)).toEqual(Color.fromBytes(26, 27, 28, 25)); - expect(e.cylinder.outlineWidth.getValue(date)).toEqual(14.0); - expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(15.0); - expect(e.cylinder.slices.getValue(date)).toEqual(16.0); + expect(e.cylinder.outlineColor.getValue(date)).toEqual(Color.fromBytes(4, 90, 209, 96)); + expect(e.cylinder.outlineWidth.getValue(date)).toEqual(64018.0); + expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(38567.0); + expect(e.cylinder.slices.getValue(date)).toEqual(39979.0); + expect(e.cylinder.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.ellipse.show.getValue(date)).toEqual(true); - expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(17.0); - expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(18.0); - expect(e.ellipse.height.getValue(date)).toEqual(19.0); - expect(e.ellipse.extrudedHeight.getValue(date)).toEqual(20.0); - expect(e.ellipse.rotation.getValue(date)).toEqual(21.0); - expect(e.ellipse.stRotation.getValue(date)).toEqual(22.0); - expect(e.ellipse.granularity.getValue(date)).toEqual(23.0); + expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(60072.0); + expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(38653.0); + expect(e.ellipse.height.getValue(date)).toEqual(15549.0); + expect(e.ellipse.extrudedHeight.getValue(date)).toEqual(55640.0); + expect(e.ellipse.rotation.getValue(date)).toEqual(27722.0); + expect(e.ellipse.stRotation.getValue(date)).toEqual(4692.0); + expect(e.ellipse.granularity.getValue(date)).toEqual(62192.0); expect(e.ellipse.fill.getValue(date)).toEqual(true); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(30, 31, 32, 29)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(116, 186, 200, 40)); expect(e.ellipse.outline.getValue(date)).toEqual(true); - expect(e.ellipse.outlineColor.getValue(date)).toEqual(Color.fromBytes(34, 35, 36, 33)); - expect(e.ellipse.outlineWidth.getValue(date)).toEqual(24.0); - expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(25.0); + expect(e.ellipse.outlineColor.getValue(date)).toEqual(Color.fromBytes(160, 82, 145, 104)); + expect(e.ellipse.outlineWidth.getValue(date)).toEqual(8839.0); + expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(38878.0); + expect(e.ellipse.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.ellipsoid.show.getValue(date)).toEqual(true); - expect(e.ellipsoid.radii.getValue(date)).toEqual(new Cartesian3(13, 14, 15)); + expect(e.ellipsoid.radii.getValue(date)).toEqual(new Cartesian3(15638, 24381, 37983)); expect(e.ellipsoid.fill.getValue(date)).toEqual(true); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(38, 39, 40, 37)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(202, 67, 110, 69)); expect(e.ellipsoid.outline.getValue(date)).toEqual(true); - expect(e.ellipsoid.outlineColor.getValue(date)).toEqual(Color.fromBytes(42, 43, 44, 41)); - expect(e.ellipsoid.outlineWidth.getValue(date)).toEqual(26.0); - expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(27.0); - expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(28.0); - expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(29.0); + expect(e.ellipsoid.outlineColor.getValue(date)).toEqual(Color.fromBytes(55, 23, 226, 7)); + expect(e.ellipsoid.outlineWidth.getValue(date)).toEqual(47507.0); + expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(54278.0); + expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(28562.0); + expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(14008.0); + expect(e.ellipsoid.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.label.show.getValue(date)).toEqual(true); - expect(e.label.text.getValue(date)).toEqual('string2'); - expect(e.label.font.getValue(date)).toEqual('6px sans-serif'); + expect(e.label.text.getValue(date)).toEqual('string36641'); + expect(e.label.font.getValue(date)).toEqual('14px sans-serif'); expect(e.label.style.getValue(date)).toEqual(LabelStyle.FILL_AND_OUTLINE); - expect(e.label.scale.getValue(date)).toEqual(30.0); - expect(e.label.pixelOffset.getValue(date)).toEqual(new Cartesian2(3, 4)); - expect(e.label.eyeOffset.getValue(date)).toEqual(new Cartesian3(16, 17, 18)); + expect(e.label.scale.getValue(date)).toEqual(6510.0); + expect(e.label.showBackground.getValue(date)).toEqual(true); + expect(e.label.backgroundColor.getValue(date)).toEqual(Color.fromBytes(225, 114, 54, 128)); + expect(e.label.backgroundPadding.getValue(date)).toEqual(new Cartesian2(5508, 56341)); + expect(e.label.pixelOffset.getValue(date)).toEqual(new Cartesian2(25913, 30821)); + expect(e.label.eyeOffset.getValue(date)).toEqual(new Cartesian3(30502, 29047, 25457)); expect(e.label.horizontalOrigin.getValue(date)).toEqual(HorizontalOrigin.LEFT); expect(e.label.verticalOrigin.getValue(date)).toEqual(VerticalOrigin.BOTTOM); expect(e.label.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.label.fillColor.getValue(date)).toEqual(Color.fromBytes(46, 47, 48, 45)); - expect(e.label.outlineColor.getValue(date)).toEqual(Color.fromBytes(50, 51, 52, 49)); - expect(e.label.outlineWidth.getValue(date)).toEqual(31.0); - expect(e.label.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(13, 14, 15, 16)); - expect(e.label.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(17, 18, 19, 20)); + expect(e.label.fillColor.getValue(date)).toEqual(Color.fromBytes(88, 197, 147, 137)); + expect(e.label.outlineColor.getValue(date)).toEqual(Color.fromBytes(171, 128, 159, 223)); + expect(e.label.outlineWidth.getValue(date)).toEqual(36637.0); + expect(e.label.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(34067, 16517, 11328, 13612)); + expect(e.label.pixelOffsetScaleByDistance.getValue(date)).toEqual(new NearFarScalar(21220, 35154, 33161, 36737)); expect(e.model.show.getValue(date)).toEqual(true); - expect(e.model.uri.getValue(date)).toEqual('http://example.com/2'); - expect(e.model.scale.getValue(date)).toEqual(32.0); - expect(e.model.minimumPixelSize.getValue(date)).toEqual(33.0); - expect(e.model.maximumScale.getValue(date)).toEqual(34.0); + expect(e.model.uri.getValue(date)).toEqual('http://example.com/60043'); + expect(e.model.scale.getValue(date)).toEqual(44278.0); + expect(e.model.minimumPixelSize.getValue(date)).toEqual(35888.0); + expect(e.model.maximumScale.getValue(date)).toEqual(64305.0); expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(true); expect(e.model.runAnimations.getValue(date)).toEqual(true); + expect(e.model.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.model.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.model.nodeTransformations.prop.translation.getValue(date)).toEqual(new Cartesian3(19, 20, 21)); - expect(e.model.nodeTransformations.prop.rotation.getValue(date)).toEqualEpsilon(new Quaternion(0.454858826147342, 0.530668630505232, 0.606478434863123, 0.379049021789452), 1e-14); - expect(e.model.nodeTransformations.prop.scale.getValue(date)).toEqual(new Cartesian3(22, 23, 24)); + expect(e.model.silhouetteColor.getValue(date)).toEqual(Color.fromBytes(29, 61, 52, 101)); + expect(e.model.silhouetteSize.getValue(date)).toEqual(4645.0); + expect(e.model.color.getValue(date)).toEqual(Color.fromBytes(0, 52, 75, 73)); + expect(e.model.colorBlendMode.getValue(date)).toEqual(ColorBlendMode.REPLACE); + expect(e.model.colorBlendAmount.getValue(date)).toEqual(7475.0); + expect(e.model.nodeTransformations.prop.translation.getValue(date)).toEqual(new Cartesian3(18548, 48456, 21181)); + expect(e.model.nodeTransformations.prop.rotation.getValue(date)).toEqualEpsilon(new Quaternion(0.527960606328925, 0.567156704919186, 0.624812964569899, 0.0959146992664751), 1e-14); + expect(e.model.nodeTransformations.prop.scale.getValue(date)).toEqual(new Cartesian3(53739, 37841, 41107)); expect(e.path.show.getValue(date)).toEqual(true); - expect(e.path.width.getValue(date)).toEqual(35.0); - expect(e.path.resolution.getValue(date)).toEqual(36.0); - expect(e.path.leadTime.getValue(date)).toEqual(37.0); - expect(e.path.trailTime.getValue(date)).toEqual(38.0); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(54, 55, 56, 53)); + expect(e.path.width.getValue(date)).toEqual(56040.0); + expect(e.path.resolution.getValue(date)).toEqual(31563.0); + expect(e.path.leadTime.getValue(date)).toEqual(5997.0); + expect(e.path.trailTime.getValue(date)).toEqual(52915.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(10, 78, 168, 13)); expect(e.point.show.getValue(date)).toEqual(true); - expect(e.point.pixelSize.getValue(date)).toEqual(39.0); + expect(e.point.pixelSize.getValue(date)).toEqual(53869.0); expect(e.point.heightReference.getValue(date)).toEqual(HeightReference.CLAMP_TO_GROUND); - expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(58, 59, 60, 57)); - expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(62, 63, 64, 61)); - expect(e.point.outlineWidth.getValue(date)).toEqual(40.0); - expect(e.point.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(21, 22, 23, 24)); - expect(e.point.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(25, 26, 27, 28)); + expect(e.point.color.getValue(date)).toEqual(Color.fromBytes(3, 147, 219, 77)); + expect(e.point.outlineColor.getValue(date)).toEqual(Color.fromBytes(254, 106, 11, 94)); + expect(e.point.outlineWidth.getValue(date)).toEqual(27922.0); + expect(e.point.scaleByDistance.getValue(date)).toEqual(new NearFarScalar(20128, 16462, 49728, 18882)); + expect(e.point.translucencyByDistance.getValue(date)).toEqual(new NearFarScalar(52796, 43982, 61099, 50158)); expect(e.polygon.show.getValue(date)).toEqual(true); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ new Cartesian3(7, 8, 9), new Cartesian3(10, 11, 12) ]); - expect(e.polygon.height.getValue(date)).toEqual(41.0); - expect(e.polygon.extrudedHeight.getValue(date)).toEqual(42.0); - expect(e.polygon.stRotation.getValue(date)).toEqual(43.0); - expect(e.polygon.granularity.getValue(date)).toEqual(44.0); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ new Cartesian3(39143, 2200, 6408), new Cartesian3(27161, 33386, 62338) ]); + expect(e.polygon.height.getValue(date)).toEqual(26391.0); + expect(e.polygon.extrudedHeight.getValue(date)).toEqual(15922.0); + expect(e.polygon.stRotation.getValue(date)).toEqual(2555.0); + expect(e.polygon.granularity.getValue(date)).toEqual(17060.0); expect(e.polygon.fill.getValue(date)).toEqual(true); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(66, 67, 68, 65)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(216, 139, 124, 253)); expect(e.polygon.outline.getValue(date)).toEqual(true); - expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(70, 71, 72, 69)); - expect(e.polygon.outlineWidth.getValue(date)).toEqual(45.0); + expect(e.polygon.outlineColor.getValue(date)).toEqual(Color.fromBytes(172, 48, 134, 87)); + expect(e.polygon.outlineWidth.getValue(date)).toEqual(62220.0); expect(e.polygon.perPositionHeight.getValue(date)).toEqual(true); expect(e.polygon.closeTop.getValue(date)).toEqual(true); expect(e.polygon.closeBottom.getValue(date)).toEqual(true); + expect(e.polygon.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.polyline.show.getValue(date)).toEqual(true); - expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(13, 14, 15), new Cartesian3(16, 17, 18) ]); - expect(e.polyline.width.getValue(date)).toEqual(46.0); - expect(e.polyline.granularity.getValue(date)).toEqual(47.0); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(74, 75, 76, 73)); + expect(e.polyline.positions.getValue(date)).toEqual([ new Cartesian3(23333, 31067, 17529), new Cartesian3(57924, 41186, 31648) ]); + expect(e.polyline.width.getValue(date)).toEqual(14667.0); + expect(e.polyline.granularity.getValue(date)).toEqual(53395.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(88, 0, 232, 230)); expect(e.polyline.followSurface.getValue(date)).toEqual(true); + expect(e.polyline.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.rectangle.show.getValue(date)).toEqual(true); - expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1, 0.429203673205103, 1.4292036732051, 0.858407346410207)); - expect(e.rectangle.height.getValue(date)).toEqual(48.0); - expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(49.0); - expect(e.rectangle.rotation.getValue(date)).toEqual(50.0); - expect(e.rectangle.stRotation.getValue(date)).toEqual(51.0); - expect(e.rectangle.granularity.getValue(date)).toEqual(52.0); + expect(e.rectangle.coordinates.getValue(date)).toEqual(new Rectangle(1.13325368272577, 0.703573207377445, 0.756676249095309, 0.339217858685931)); + expect(e.rectangle.height.getValue(date)).toEqual(20608.0); + expect(e.rectangle.extrudedHeight.getValue(date)).toEqual(23002.0); + expect(e.rectangle.rotation.getValue(date)).toEqual(54979.0); + expect(e.rectangle.stRotation.getValue(date)).toEqual(8079.0); + expect(e.rectangle.granularity.getValue(date)).toEqual(60343.0); expect(e.rectangle.fill.getValue(date)).toEqual(true); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(78, 79, 80, 77)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(160, 249, 70, 249)); expect(e.rectangle.outline.getValue(date)).toEqual(true); - expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(82, 83, 84, 81)); - expect(e.rectangle.outlineWidth.getValue(date)).toEqual(53.0); + expect(e.rectangle.outlineColor.getValue(date)).toEqual(Color.fromBytes(196, 59, 142, 36)); + expect(e.rectangle.outlineWidth.getValue(date)).toEqual(59794.0); expect(e.rectangle.closeTop.getValue(date)).toEqual(true); expect(e.rectangle.closeBottom.getValue(date)).toEqual(true); + expect(e.rectangle.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); expect(e.wall.show.getValue(date)).toEqual(true); - expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(19, 20, 21), new Cartesian3(22, 23, 24) ]); - expect(e.wall.minimumHeights.getValue(date)).toEqual([ 1, 2 ]); - expect(e.wall.maximumHeights.getValue(date)).toEqual([ 3, 4 ]); - expect(e.wall.granularity.getValue(date)).toEqual(54.0); + expect(e.wall.positions.getValue(date)).toEqual([ new Cartesian3(21681, 40276, 30621), new Cartesian3(3959, 61967, 19442) ]); + expect(e.wall.minimumHeights.getValue(date)).toEqual([ 49466, 44737 ]); + expect(e.wall.maximumHeights.getValue(date)).toEqual([ 59672, 62697 ]); + expect(e.wall.granularity.getValue(date)).toEqual(47652.0); expect(e.wall.fill.getValue(date)).toEqual(true); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(86, 87, 88, 85)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(64, 176, 190, 65)); expect(e.wall.outline.getValue(date)).toEqual(true); - expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(90, 91, 92, 89)); - expect(e.wall.outlineWidth.getValue(date)).toEqual(55.0); - expect(e = dataSource.entities.getById('constant1')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(1, 0.429203673205103, 3)); - expect(e = dataSource.entities.getById('constant2')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(Cartesian3.fromDegrees(4, 5, 6)); - expect(e = dataSource.entities.getById('constant3')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(1, 2, 3)); - expect(e = dataSource.entities.getById('constant4')).toBeDefined(); - expect(e.billboard.color.getValue(date)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant5')).toBeDefined(); - expect(e.billboard.alignedAxis.getValue(date)).toEqual(Cartesian3.fromSpherical(new Spherical(1, 2))); - expect(e = dataSource.entities.getById('constant6')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); + expect(e.wall.outlineColor.getValue(date)).toEqual(Color.fromBytes(107, 196, 96, 198)); + expect(e.wall.outlineWidth.getValue(date)).toEqual(50458.0); + expect(e.wall.shadows.getValue(date)).toEqual(ShadowMode.CAST_ONLY); + expect(e = dataSource.entities.getById('constant_position_cartographicRadians')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(Cartesian3.fromRadians(0.368123392863751, 0.678098621973879, 32050)); + expect(e = dataSource.entities.getById('constant_position_cartographicDegrees')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(Cartesian3.fromDegrees(14, 14, 24697)); + expect(e = dataSource.entities.getById('constant_position_cartesianVelocity')).toBeDefined(); + expect(e.position.getValue(date)).toEqual(new Cartesian3(15776, 23613, 14940)); + expect(e = dataSource.entities.getById('constant_billboard_color_rgbaf')).toBeDefined(); + expect(e.billboard.color.getValue(date)).toEqualEpsilon(new Color(0.674509803921569, 0.866666666666667, 0.6, 0.650980392156863), 1e-14); + expect(e = dataSource.entities.getById('constant_billboard_alignedAxis_unitSpherical')).toBeDefined(); + expect(e.billboard.alignedAxis.getValue(date)).toEqual(Cartesian3.fromSpherical(new Spherical(20514, 39760))); + expect(e = dataSource.entities.getById('constant_box_material_solidColor_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0.0823529411764706, 0.494117647058824, 0.101960784313725), 1e-14); expect(e = dataSource.entities.getById('material_box_material_image')).toBeDefined(); - expect(e.box.material.image.getValue(date)).toEqual('http://example.com/3'); - expect(e.box.material.repeat.getValue(date)).toEqual(new Cartesian2(5, 6)); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(190, 191, 192, 189)); + expect(e.box.material.image.getValue(date)).toEqual('http://example.com/50881'); + expect(e.box.material.repeat.getValue(date)).toEqual(new Cartesian2(58955, 45286)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(98, 97, 133, 129)); expect(e.box.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_box_material_grid')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(194, 195, 196, 193)); - expect(e.box.material.cellAlpha.getValue(date)).toEqual(76.0); - expect(e.box.material.lineCount.getValue(date)).toEqual(new Cartesian2(7, 8)); - expect(e.box.material.lineThickness.getValue(date)).toEqual(new Cartesian2(9, 10)); - expect(e.box.material.lineOffset.getValue(date)).toEqual(new Cartesian2(11, 12)); + expect(e.box.material.color.getValue(date)).toEqual(Color.fromBytes(178, 10, 106, 226)); + expect(e.box.material.cellAlpha.getValue(date)).toEqual(47180.0); + expect(e.box.material.lineCount.getValue(date)).toEqual(new Cartesian2(24659, 13408)); + expect(e.box.material.lineThickness.getValue(date)).toEqual(new Cartesian2(13897, 25654)); + expect(e.box.material.lineOffset.getValue(date)).toEqual(new Cartesian2(14153, 49207)); expect(e = dataSource.entities.getById('material_box_material_stripe')).toBeDefined(); expect(e.box.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e.box.material.offset.getValue(date)).toEqual(77.0); - expect(e.box.material.repeat.getValue(date)).toEqual(78.0); - expect(e = dataSource.entities.getById('material1')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); - expect(e = dataSource.entities.getById('material2')).toBeDefined(); - expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); - expect(e = dataSource.entities.getById('material3')).toBeDefined(); - expect(e.box.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); - expect(e = dataSource.entities.getById('material4')).toBeDefined(); - expect(e.box.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); - expect(e = dataSource.entities.getById('constant7')).toBeDefined(); - expect(e.box.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); - expect(e = dataSource.entities.getById('constant8')).toBeDefined(); - expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1, 0.429203673205103, 3), Cartesian3.fromRadians(0.858407346410207, 0.28761101961531, 6) ]); - expect(e = dataSource.entities.getById('constant9')).toBeDefined(); - expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(7, 8, 9), Cartesian3.fromDegrees(10, 11, 12) ]); - expect(e = dataSource.entities.getById('constant10')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); + expect(e.box.material.evenColor.getValue(date)).toEqual(Color.fromBytes(18, 147, 177, 80)); + expect(e.box.material.oddColor.getValue(date)).toEqual(Color.fromBytes(189, 226, 187, 107)); + expect(e.box.material.offset.getValue(date)).toEqual(43563.0); + expect(e.box.material.repeat.getValue(date)).toEqual(24480.0); + expect(e = dataSource.entities.getById('constant_box_material_image_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.733333333333333, 0.474509803921569, 0.56078431372549, 0.349019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_grid_color')).toBeDefined(); + expect(e.box.material.color.getValue(date)).toEqualEpsilon(new Color(0.847058823529412, 0.392156862745098, 0.352941176470588, 0.898039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_stripe_evenColor')).toBeDefined(); + expect(e.box.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.976470588235294, 0.83921568627451, 0.643137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_box_material_stripe_oddColor')).toBeDefined(); + expect(e.box.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.258823529411765, 0.796078431372549, 0.717647058823529, 0.749019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_box_outlineColor_rgbaf')).toBeDefined(); + expect(e.box.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.835294117647059, 0.0313725490196078, 0.282352941176471, 0.337254901960784), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_positions_cartographicRadians')).toBeDefined(); + expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.220356654342316, 0.879184920197648, 64909), Cartesian3.fromRadians(0.175978952571564, 1.00316515710468, 913) ]); + expect(e = dataSource.entities.getById('constant_corridor_positions_cartographicDegrees')).toBeDefined(); + expect(e.corridor.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(28, 14, 63058), Cartesian3.fromDegrees(15, 37, 26381) ]); + expect(e = dataSource.entities.getById('constant_corridor_material_solidColor_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.333333333333333, 0.87843137254902, 0.356862745098039, 0.435294117647059), 1e-14); expect(e = dataSource.entities.getById('material_corridor_material_image')).toBeDefined(); - expect(e.corridor.material.image.getValue(date)).toEqual('http://example.com/4'); - expect(e.corridor.material.repeat.getValue(date)).toEqual(new Cartesian2(13, 14)); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(206, 207, 208, 205)); + expect(e.corridor.material.image.getValue(date)).toEqual('http://example.com/8903'); + expect(e.corridor.material.repeat.getValue(date)).toEqual(new Cartesian2(41660, 35234)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(213, 25, 147, 247)); expect(e.corridor.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_corridor_material_grid')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(210, 211, 212, 209)); - expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(79.0); - expect(e.corridor.material.lineCount.getValue(date)).toEqual(new Cartesian2(15, 16)); - expect(e.corridor.material.lineThickness.getValue(date)).toEqual(new Cartesian2(17, 18)); - expect(e.corridor.material.lineOffset.getValue(date)).toEqual(new Cartesian2(19, 20)); + expect(e.corridor.material.color.getValue(date)).toEqual(Color.fromBytes(236, 51, 112, 235)); + expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(11472.0); + expect(e.corridor.material.lineCount.getValue(date)).toEqual(new Cartesian2(1254, 38404)); + expect(e.corridor.material.lineThickness.getValue(date)).toEqual(new Cartesian2(48962, 63679)); + expect(e.corridor.material.lineOffset.getValue(date)).toEqual(new Cartesian2(39061, 47000)); expect(e = dataSource.entities.getById('material_corridor_material_stripe')).toBeDefined(); expect(e.corridor.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.corridor.material.offset.getValue(date)).toEqual(80.0); - expect(e.corridor.material.repeat.getValue(date)).toEqual(81.0); - expect(e = dataSource.entities.getById('material5')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); - expect(e = dataSource.entities.getById('material6')).toBeDefined(); - expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); - expect(e = dataSource.entities.getById('material7')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); - expect(e = dataSource.entities.getById('material8')).toBeDefined(); - expect(e.corridor.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); - expect(e = dataSource.entities.getById('constant11')).toBeDefined(); - expect(e.corridor.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant12')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); + expect(e.corridor.material.evenColor.getValue(date)).toEqual(Color.fromBytes(245, 61, 208, 138)); + expect(e.corridor.material.oddColor.getValue(date)).toEqual(Color.fromBytes(114, 73, 91, 165)); + expect(e.corridor.material.offset.getValue(date)).toEqual(12788.0); + expect(e.corridor.material.repeat.getValue(date)).toEqual(33136.0); + expect(e = dataSource.entities.getById('constant_corridor_material_image_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.0156862745098039, 0.0941176470588235, 0.4, 0.529411764705882), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_grid_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(date)).toEqualEpsilon(new Color(0.576470588235294, 0.76078431372549, 0.152941176470588, 0.00392156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_stripe_evenColor')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.913725490196078, 0.63921568627451, 0.631372549019608, 0.890196078431373), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_material_stripe_oddColor')).toBeDefined(); + expect(e.corridor.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.2, 0.137254901960784, 0.792156862745098, 0.301960784313725), 1e-14); + expect(e = dataSource.entities.getById('constant_corridor_outlineColor_rgbaf')).toBeDefined(); + expect(e.corridor.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.690196078431373, 0.0549019607843137, 0.247058823529412, 0.298039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_solidColor_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.47843137254902, 0.0509803921568627, 0.450980392156863, 0.87843137254902), 1e-14); expect(e = dataSource.entities.getById('material_cylinder_material_image')).toBeDefined(); - expect(e.cylinder.material.image.getValue(date)).toEqual('http://example.com/5'); - expect(e.cylinder.material.repeat.getValue(date)).toEqual(new Cartesian2(21, 22)); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(222, 223, 224, 221)); + expect(e.cylinder.material.image.getValue(date)).toEqual('http://example.com/27447'); + expect(e.cylinder.material.repeat.getValue(date)).toEqual(new Cartesian2(65243, 41470)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(200, 175, 107, 217)); expect(e.cylinder.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_cylinder_material_grid')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(226, 227, 228, 225)); - expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(82.0); - expect(e.cylinder.material.lineCount.getValue(date)).toEqual(new Cartesian2(23, 24)); - expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(new Cartesian2(25, 26)); - expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(new Cartesian2(27, 28)); + expect(e.cylinder.material.color.getValue(date)).toEqual(Color.fromBytes(173, 210, 231, 62)); + expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(9555.0); + expect(e.cylinder.material.lineCount.getValue(date)).toEqual(new Cartesian2(58545, 26852)); + expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(new Cartesian2(58520, 44260)); + expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(new Cartesian2(61513, 28656)); expect(e = dataSource.entities.getById('material_cylinder_material_stripe')).toBeDefined(); expect(e.cylinder.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e.cylinder.material.offset.getValue(date)).toEqual(83.0); - expect(e.cylinder.material.repeat.getValue(date)).toEqual(84.0); - expect(e = dataSource.entities.getById('material9')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); - expect(e = dataSource.entities.getById('material10')).toBeDefined(); - expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); - expect(e = dataSource.entities.getById('material11')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); - expect(e = dataSource.entities.getById('material12')).toBeDefined(); - expect(e.cylinder.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); - expect(e = dataSource.entities.getById('constant13')).toBeDefined(); - expect(e.cylinder.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); - expect(e = dataSource.entities.getById('constant14')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); + expect(e.cylinder.material.evenColor.getValue(date)).toEqual(Color.fromBytes(158, 155, 154, 86)); + expect(e.cylinder.material.oddColor.getValue(date)).toEqual(Color.fromBytes(191, 226, 188, 74)); + expect(e.cylinder.material.offset.getValue(date)).toEqual(55018.0); + expect(e.cylinder.material.repeat.getValue(date)).toEqual(33073.0); + expect(e = dataSource.entities.getById('constant_cylinder_material_image_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.654901960784314, 0.0627450980392157, 0.517647058823529, 0.537254901960784), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_grid_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.364705882352941, 0.305882352941176, 0.945098039215686), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_stripe_evenColor')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.133333333333333, 0.372549019607843, 0.498039215686275), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_material_stripe_oddColor')).toBeDefined(); + expect(e.cylinder.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.905882352941176, 0.564705882352941, 0.486274509803922, 0.67843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_cylinder_outlineColor_rgbaf')).toBeDefined(); + expect(e.cylinder.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.647058823529412, 0.564705882352941, 0.4, 0.0862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_solidColor_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.0980392156862745, 0.913725490196078, 0.811764705882353, 0.2), 1e-14); expect(e = dataSource.entities.getById('material_ellipse_material_image')).toBeDefined(); - expect(e.ellipse.material.image.getValue(date)).toEqual('http://example.com/6'); - expect(e.ellipse.material.repeat.getValue(date)).toEqual(new Cartesian2(29, 30)); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(238, 239, 240, 237)); + expect(e.ellipse.material.image.getValue(date)).toEqual('http://example.com/2481'); + expect(e.ellipse.material.repeat.getValue(date)).toEqual(new Cartesian2(45447, 53937)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(45, 86, 136, 120)); expect(e.ellipse.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipse_material_grid')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(242, 243, 244, 241)); - expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(85.0); - expect(e.ellipse.material.lineCount.getValue(date)).toEqual(new Cartesian2(31, 32)); - expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(new Cartesian2(33, 34)); - expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(new Cartesian2(35, 36)); + expect(e.ellipse.material.color.getValue(date)).toEqual(Color.fromBytes(217, 159, 32, 60)); + expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(24764.0); + expect(e.ellipse.material.lineCount.getValue(date)).toEqual(new Cartesian2(25721, 6500)); + expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(new Cartesian2(57205, 63455)); + expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(new Cartesian2(49829, 3778)); expect(e = dataSource.entities.getById('material_ellipse_material_stripe')).toBeDefined(); expect(e.ellipse.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.ellipse.material.offset.getValue(date)).toEqual(86.0); - expect(e.ellipse.material.repeat.getValue(date)).toEqual(87.0); - expect(e = dataSource.entities.getById('material13')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); - expect(e = dataSource.entities.getById('material14')).toBeDefined(); - expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); - expect(e = dataSource.entities.getById('material15')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); - expect(e = dataSource.entities.getById('material16')).toBeDefined(); - expect(e.ellipse.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); - expect(e = dataSource.entities.getById('constant15')).toBeDefined(); - expect(e.ellipse.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); - expect(e = dataSource.entities.getById('constant16')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); + expect(e.ellipse.material.evenColor.getValue(date)).toEqual(Color.fromBytes(7, 152, 58, 224)); + expect(e.ellipse.material.oddColor.getValue(date)).toEqual(Color.fromBytes(4, 228, 224, 57)); + expect(e.ellipse.material.offset.getValue(date)).toEqual(26719.0); + expect(e.ellipse.material.repeat.getValue(date)).toEqual(15097.0); + expect(e = dataSource.entities.getById('constant_ellipse_material_image_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.364705882352941, 0.698039215686274, 0.803921568627451, 0.843137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_grid_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(date)).toEqualEpsilon(new Color(0.67843137254902, 0.580392156862745, 0.823529411764706, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.313725490196078, 0.768627450980392, 0.674509803921569, 0.705882352941177), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipse.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.658823529411765, 0.952941176470588, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipse_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipse.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.956862745098039, 0.968627450980392, 0.674509803921569), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_solidColor_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.533333333333333, 0.384313725490196, 0.2), 1e-14); expect(e = dataSource.entities.getById('material_ellipsoid_material_image')).toBeDefined(); - expect(e.ellipsoid.material.image.getValue(date)).toEqual('http://example.com/7'); - expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(new Cartesian2(37, 38)); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(254, 0, 1, 253)); + expect(e.ellipsoid.material.image.getValue(date)).toEqual('http://example.com/47428'); + expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(new Cartesian2(53733, 35793)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(125, 49, 160, 165)); expect(e.ellipsoid.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_ellipsoid_material_grid')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(3, 4, 5, 2)); - expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(88.0); - expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(new Cartesian2(39, 40)); - expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(new Cartesian2(41, 42)); - expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(new Cartesian2(43, 44)); + expect(e.ellipsoid.material.color.getValue(date)).toEqual(Color.fromBytes(95, 212, 218, 57)); + expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(53044.0); + expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(new Cartesian2(7763, 58654)); + expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(new Cartesian2(25480, 4707)); + expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(new Cartesian2(38422, 44182)); expect(e = dataSource.entities.getById('material_ellipsoid_material_stripe')).toBeDefined(); expect(e.ellipsoid.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.ellipsoid.material.offset.getValue(date)).toEqual(89.0); - expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(90.0); - expect(e = dataSource.entities.getById('material17')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); - expect(e = dataSource.entities.getById('material18')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); - expect(e = dataSource.entities.getById('material19')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); - expect(e = dataSource.entities.getById('material20')).toBeDefined(); - expect(e.ellipsoid.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); - expect(e = dataSource.entities.getById('constant17')).toBeDefined(); - expect(e.ellipsoid.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); - expect(e = dataSource.entities.getById('constant18')).toBeDefined(); - expect(e.label.fillColor.getValue(date)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); - expect(e = dataSource.entities.getById('constant19')).toBeDefined(); - expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); - expect(e = dataSource.entities.getById('constant20')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(Color.fromBytes(174, 241, 84, 24)); + expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(Color.fromBytes(134, 51, 175, 154)); + expect(e.ellipsoid.material.offset.getValue(date)).toEqual(24796.0); + expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(2913.0); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_image_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.247058823529412, 0.403921568627451, 0.145098039215686, 0.47843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_grid_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(date)).toEqualEpsilon(new Color(0.270588235294118, 0.784313725490196, 0.172549019607843, 0.835294117647059), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.415686274509804, 0.192156862745098, 0.368627450980392, 0.129411764705882), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipsoid.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.580392156862745, 0.164705882352941, 0.741176470588235, 0.0941176470588235), 1e-14); + expect(e = dataSource.entities.getById('constant_ellipsoid_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipsoid.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.494117647058824, 0.0823529411764706, 0.274509803921569, 0.823529411764706), 1e-14); + expect(e = dataSource.entities.getById('constant_label_backgroundColor_rgbaf')).toBeDefined(); + expect(e.label.backgroundColor.getValue(date)).toEqualEpsilon(new Color(0.894117647058824, 0.949019607843137, 0.494117647058824, 0.843137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_label_fillColor_rgbaf')).toBeDefined(); + expect(e.label.fillColor.getValue(date)).toEqualEpsilon(new Color(0.16078431372549, 0.568627450980392, 0.776470588235294, 0.505882352941176), 1e-14); + expect(e = dataSource.entities.getById('constant_label_outlineColor_rgbaf')).toBeDefined(); + expect(e.label.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.325490196078431, 0.909803921568627, 0.67843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_model_silhouetteColor_rgbaf')).toBeDefined(); + expect(e.model.silhouetteColor.getValue(date)).toEqualEpsilon(new Color(0.294117647058824, 0.313725490196078, 0.419607843137255, 0.87843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_model_color_rgbaf')).toBeDefined(); + expect(e.model.color.getValue(date)).toEqualEpsilon(new Color(0.568627450980392, 0.333333333333333, 0.141176470588235, 0.572549019607843), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_solidColor_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.517647058823529, 0.52156862745098, 0.925490196078431), 1e-14); expect(e = dataSource.entities.getById('material_path_material_polylineOutline')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(15, 16, 17, 14)); - expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.path.material.outlineWidth.getValue(date)).toEqual(91.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(158, 14, 3, 86)); + expect(e.path.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(137, 101, 236, 136)); + expect(e.path.material.outlineWidth.getValue(date)).toEqual(11017.0); expect(e = dataSource.entities.getById('material_path_material_polylineArrow')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(23, 24, 25, 22)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(166, 131, 155, 102)); expect(e = dataSource.entities.getById('material_path_material_polylineGlow')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(27, 28, 29, 26)); - expect(e.path.material.glowPower.getValue(date)).toEqual(92.0); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(72, 114, 200, 147)); + expect(e.path.material.glowPower.getValue(date)).toEqual(42344.0); expect(e = dataSource.entities.getById('material_path_material_image')).toBeDefined(); - expect(e.path.material.image.getValue(date)).toEqual('http://example.com/8'); - expect(e.path.material.repeat.getValue(date)).toEqual(new Cartesian2(45, 46)); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(31, 32, 33, 30)); + expect(e.path.material.image.getValue(date)).toEqual('http://example.com/31068'); + expect(e.path.material.repeat.getValue(date)).toEqual(new Cartesian2(48351, 63420)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(105, 166, 133, 7)); expect(e.path.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_path_material_grid')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(35, 36, 37, 34)); - expect(e.path.material.cellAlpha.getValue(date)).toEqual(93.0); - expect(e.path.material.lineCount.getValue(date)).toEqual(new Cartesian2(47, 48)); - expect(e.path.material.lineThickness.getValue(date)).toEqual(new Cartesian2(49, 50)); - expect(e.path.material.lineOffset.getValue(date)).toEqual(new Cartesian2(51, 52)); + expect(e.path.material.color.getValue(date)).toEqual(Color.fromBytes(120, 196, 99, 165)); + expect(e.path.material.cellAlpha.getValue(date)).toEqual(41317.0); + expect(e.path.material.lineCount.getValue(date)).toEqual(new Cartesian2(52557, 7629)); + expect(e.path.material.lineThickness.getValue(date)).toEqual(new Cartesian2(21845, 52309)); + expect(e.path.material.lineOffset.getValue(date)).toEqual(new Cartesian2(48700, 4542)); expect(e = dataSource.entities.getById('material_path_material_stripe')).toBeDefined(); expect(e.path.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e.path.material.offset.getValue(date)).toEqual(94.0); - expect(e.path.material.repeat.getValue(date)).toEqual(95.0); - expect(e = dataSource.entities.getById('material21')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); - expect(e = dataSource.entities.getById('material22')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); - expect(e = dataSource.entities.getById('material23')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e = dataSource.entities.getById('material24')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); - expect(e = dataSource.entities.getById('material25')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e = dataSource.entities.getById('material26')).toBeDefined(); - expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); - expect(e = dataSource.entities.getById('material27')).toBeDefined(); - expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); - expect(e = dataSource.entities.getById('material28')).toBeDefined(); - expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); - expect(e = dataSource.entities.getById('constant21')).toBeDefined(); - expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); - expect(e = dataSource.entities.getById('constant22')).toBeDefined(); - expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); - expect(e = dataSource.entities.getById('constant23')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.433629385640828, 1.43362938564083, 15), Cartesian3.fromRadians(0.292036732051034, 1.29203673205103, 18) ]); - expect(e = dataSource.entities.getById('constant24')).toBeDefined(); - expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 20, 21), Cartesian3.fromDegrees(22, 23, 24) ]); - expect(e = dataSource.entities.getById('constant25')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); + expect(e.path.material.evenColor.getValue(date)).toEqual(Color.fromBytes(20, 43, 77, 229)); + expect(e.path.material.oddColor.getValue(date)).toEqual(Color.fromBytes(157, 171, 93, 187)); + expect(e.path.material.offset.getValue(date)).toEqual(41305.0); + expect(e.path.material.repeat.getValue(date)).toEqual(43637.0); + expect(e = dataSource.entities.getById('constant_path_material_polylineOutline_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.0588235294117647, 0.0823529411764706, 0.964705882352941, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.path.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.266666666666667, 0.556862745098039, 0.352941176470588, 0.76078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineArrow_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.627450980392157, 0.27843137254902, 0.972549019607843, 0.92156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_polylineGlow_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.584313725490196, 0.0156862745098039, 0.329411764705882, 0.270588235294118), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_image_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.443137254901961, 0.450980392156863, 0.63921568627451, 0.415686274509804), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_grid_color')).toBeDefined(); + expect(e.path.material.color.getValue(date)).toEqualEpsilon(new Color(0.984313725490196, 0.945098039215686, 0.764705882352941, 0.933333333333333), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_stripe_evenColor')).toBeDefined(); + expect(e.path.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.584313725490196, 0.631372549019608, 0.0196078431372549, 0.349019607843137), 1e-14); + expect(e = dataSource.entities.getById('constant_path_material_stripe_oddColor')).toBeDefined(); + expect(e.path.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.231372549019608, 0.211764705882353, 0.941176470588235, 0.501960784313725), 1e-14); + expect(e = dataSource.entities.getById('constant_point_color_rgbaf')).toBeDefined(); + expect(e.point.color.getValue(date)).toEqualEpsilon(new Color(0.662745098039216, 0.317647058823529, 0.643137254901961, 0.705882352941177), 1e-14); + expect(e = dataSource.entities.getById('constant_point_outlineColor_rgbaf')).toBeDefined(); + expect(e.point.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.00392156862745098, 0.388235294117647, 0.101960784313725, 0.16078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_hierarchy_cartographicRadians')).toBeDefined(); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromRadians(0.612948853926511, 1.3346715688367, 54401), Cartesian3.fromRadians(1.1867596160592, 0.345663242797974, 35811) ]); + expect(e = dataSource.entities.getById('constant_polygon_hierarchy_cartographicDegrees')).toBeDefined(); + expect(e.polygon.hierarchy.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 41, 50907), Cartesian3.fromDegrees(28, 40, 24937) ]); + expect(e = dataSource.entities.getById('constant_polygon_material_solidColor_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.905882352941176, 0.274509803921569, 0.972549019607843), 1e-14); expect(e = dataSource.entities.getById('material_polygon_material_image')).toBeDefined(); - expect(e.polygon.material.image.getValue(date)).toEqual('http://example.com/9'); - expect(e.polygon.material.repeat.getValue(date)).toEqual(new Cartesian2(53, 54)); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(47, 48, 49, 46)); + expect(e.polygon.material.image.getValue(date)).toEqual('http://example.com/3481'); + expect(e.polygon.material.repeat.getValue(date)).toEqual(new Cartesian2(29381, 10354)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(36, 184, 236, 209)); expect(e.polygon.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polygon_material_grid')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(51, 52, 53, 50)); - expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(96.0); - expect(e.polygon.material.lineCount.getValue(date)).toEqual(new Cartesian2(55, 56)); - expect(e.polygon.material.lineThickness.getValue(date)).toEqual(new Cartesian2(57, 58)); - expect(e.polygon.material.lineOffset.getValue(date)).toEqual(new Cartesian2(59, 60)); + expect(e.polygon.material.color.getValue(date)).toEqual(Color.fromBytes(246, 64, 141, 13)); + expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(986.0); + expect(e.polygon.material.lineCount.getValue(date)).toEqual(new Cartesian2(26094, 44645)); + expect(e.polygon.material.lineThickness.getValue(date)).toEqual(new Cartesian2(30775, 17784)); + expect(e.polygon.material.lineOffset.getValue(date)).toEqual(new Cartesian2(58344, 3555)); expect(e = dataSource.entities.getById('material_polygon_material_stripe')).toBeDefined(); expect(e.polygon.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.polygon.material.offset.getValue(date)).toEqual(97.0); - expect(e.polygon.material.repeat.getValue(date)).toEqual(98.0); - expect(e = dataSource.entities.getById('material29')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); - expect(e = dataSource.entities.getById('material30')).toBeDefined(); - expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.729411764705882, 0.733333333333333, 0.737254901960784, 0.725490196078431), 1e-14); - expect(e = dataSource.entities.getById('material31')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.745098039215686, 0.749019607843137, 0.752941176470588, 0.741176470588235), 1e-14); - expect(e = dataSource.entities.getById('material32')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.76078431372549, 0.764705882352941, 0.768627450980392, 0.756862745098039), 1e-14); - expect(e = dataSource.entities.getById('constant26')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.776470588235294, 0.780392156862745, 0.784313725490196, 0.772549019607843), 1e-14); - expect(e = dataSource.entities.getById('constant27')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(1.43805509807655, 0.867258771281655, 27), Cartesian3.fromRadians(1.29646244448676, 0.725666117691862, 30) ]); - expect(e = dataSource.entities.getById('constant28')).toBeDefined(); - expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(31, 32, 33), Cartesian3.fromDegrees(34, 35, 36) ]); - expect(e = dataSource.entities.getById('constant29')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.792156862745098, 0.796078431372549, 0.8, 0.788235294117647), 1e-14); + expect(e.polygon.material.evenColor.getValue(date)).toEqual(Color.fromBytes(98, 184, 45, 52)); + expect(e.polygon.material.oddColor.getValue(date)).toEqual(Color.fromBytes(164, 123, 182, 228)); + expect(e.polygon.material.offset.getValue(date)).toEqual(12114.0); + expect(e.polygon.material.repeat.getValue(date)).toEqual(60350.0); + expect(e = dataSource.entities.getById('constant_polygon_material_image_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.674509803921569, 0.8, 0.411764705882353, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_grid_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(date)).toEqualEpsilon(new Color(0.603921568627451, 0.0941176470588235, 0.00784313725490196, 0.0862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_stripe_evenColor')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.772549019607843, 0.866666666666667, 0.964705882352941, 0.862745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_material_stripe_oddColor')).toBeDefined(); + expect(e.polygon.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.862745098039216, 0.0392156862745098, 0.458823529411765, 0.596078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polygon_outlineColor_rgbaf')).toBeDefined(); + expect(e.polygon.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.423529411764706, 0.619607843137255, 0.956862745098039), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_positions_cartographicRadians')).toBeDefined(); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.23083587429617, 0.738315731088925, 41390), Cartesian3.fromRadians(0.537259577218533, 0.25389340391868, 10573) ]); + expect(e = dataSource.entities.getById('constant_polyline_positions_cartographicDegrees')).toBeDefined(); + expect(e.polyline.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(19, 5, 11802), Cartesian3.fromDegrees(15, 40, 39495) ]); + expect(e = dataSource.entities.getById('constant_polyline_material_solidColor_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.764705882352941, 0.894117647058824, 0.874509803921569, 0.105882352941176), 1e-14); expect(e = dataSource.entities.getById('material_polyline_material_polylineOutline')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(99.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(152, 14, 11, 33)); + expect(e.polyline.material.outlineColor.getValue(date)).toEqual(Color.fromBytes(222, 51, 202, 92)); + expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(6879.0); expect(e = dataSource.entities.getById('material_polyline_material_polylineArrow')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(71, 72, 73, 70)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(82, 169, 80, 107)); expect(e = dataSource.entities.getById('material_polyline_material_polylineGlow')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(75, 76, 77, 74)); - expect(e.polyline.material.glowPower.getValue(date)).toEqual(100.0); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(59, 125, 181, 171)); + expect(e.polyline.material.glowPower.getValue(date)).toEqual(41345.0); expect(e = dataSource.entities.getById('material_polyline_material_image')).toBeDefined(); - expect(e.polyline.material.image.getValue(date)).toEqual('http://example.com/10'); - expect(e.polyline.material.repeat.getValue(date)).toEqual(new Cartesian2(61, 62)); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(79, 80, 81, 78)); + expect(e.polyline.material.image.getValue(date)).toEqual('http://example.com/29020'); + expect(e.polyline.material.repeat.getValue(date)).toEqual(new Cartesian2(8980, 60451)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(46, 136, 39, 94)); expect(e.polyline.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_polyline_material_grid')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(83, 84, 85, 82)); - expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(101.0); - expect(e.polyline.material.lineCount.getValue(date)).toEqual(new Cartesian2(63, 64)); - expect(e.polyline.material.lineThickness.getValue(date)).toEqual(new Cartesian2(65, 66)); - expect(e.polyline.material.lineOffset.getValue(date)).toEqual(new Cartesian2(67, 68)); + expect(e.polyline.material.color.getValue(date)).toEqual(Color.fromBytes(157, 57, 26, 26)); + expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(27197.0); + expect(e.polyline.material.lineCount.getValue(date)).toEqual(new Cartesian2(17878, 15173)); + expect(e.polyline.material.lineThickness.getValue(date)).toEqual(new Cartesian2(64504, 24571)); + expect(e.polyline.material.lineOffset.getValue(date)).toEqual(new Cartesian2(51933, 9674)); expect(e = dataSource.entities.getById('material_polyline_material_stripe')).toBeDefined(); expect(e.polyline.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.polyline.material.offset.getValue(date)).toEqual(102.0); - expect(e.polyline.material.repeat.getValue(date)).toEqual(103.0); - expect(e = dataSource.entities.getById('material33')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.807843137254902, 0.811764705882353, 0.815686274509804, 0.803921568627451), 1e-14); - expect(e = dataSource.entities.getById('material34')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.823529411764706, 0.827450980392157, 0.831372549019608, 0.819607843137255), 1e-14); - expect(e = dataSource.entities.getById('material35')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.83921568627451, 0.843137254901961, 0.847058823529412, 0.835294117647059), 1e-14); - expect(e = dataSource.entities.getById('material36')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.854901960784314, 0.858823529411765, 0.862745098039216, 0.850980392156863), 1e-14); - expect(e = dataSource.entities.getById('material37')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.870588235294118, 0.874509803921569, 0.87843137254902, 0.866666666666667), 1e-14); - expect(e = dataSource.entities.getById('material38')).toBeDefined(); - expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.886274509803922, 0.890196078431373, 0.894117647058824, 0.882352941176471), 1e-14); - expect(e = dataSource.entities.getById('material39')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.901960784313726, 0.905882352941176, 0.909803921568627, 0.898039215686275), 1e-14); - expect(e = dataSource.entities.getById('material40')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.917647058823529, 0.92156862745098, 0.925490196078431, 0.913725490196078), 1e-14); - expect(e = dataSource.entities.getById('constant30')).toBeDefined(); - expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(5, 6, 7, 8)); - expect(e = dataSource.entities.getById('constant31')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.933333333333333, 0.937254901960784, 0.941176470588235, 0.929411764705882), 1e-14); + expect(e.polyline.material.evenColor.getValue(date)).toEqual(Color.fromBytes(98, 239, 47, 132)); + expect(e.polyline.material.oddColor.getValue(date)).toEqual(Color.fromBytes(41, 198, 29, 144)); + expect(e.polyline.material.offset.getValue(date)).toEqual(10077.0); + expect(e.polyline.material.repeat.getValue(date)).toEqual(31817.0); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineOutline_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.450980392156863, 0.890196078431373, 0.403921568627451, 0.16078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.polyline.material.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.815686274509804, 0.545098039215686, 0.529411764705882, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineArrow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.831372549019608, 0.823529411764706, 0.631372549019608, 0.443137254901961), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_polylineGlow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.411764705882353, 0.313725490196078, 0.858823529411765, 0.380392156862745), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_image_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.133333333333333, 0.552941176470588, 0.0431372549019608, 0.184313725490196), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_grid_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(date)).toEqualEpsilon(new Color(0.141176470588235, 0.823529411764706, 0.588235294117647, 0.56078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_stripe_evenColor')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.647058823529412, 0.862745098039216, 0.129411764705882, 0.780392156862745), 1e-14); + expect(e = dataSource.entities.getById('constant_polyline_material_stripe_oddColor')).toBeDefined(); + expect(e.polyline.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.290196078431373, 0.780392156862745, 0.0705882352941176, 0.27843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_coordinates_wsenDegrees')).toBeDefined(); + expect(e.rectangle.coordinates.getValue(date)).toEqual(Rectangle.fromDegrees(42, 22, 5, 35)); + expect(e = dataSource.entities.getById('constant_rectangle_material_solidColor_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.898039215686275, 0.8, 0.905882352941176, 0.952941176470588), 1e-14); expect(e = dataSource.entities.getById('material_rectangle_material_image')).toBeDefined(); - expect(e.rectangle.material.image.getValue(date)).toEqual('http://example.com/11'); - expect(e.rectangle.material.repeat.getValue(date)).toEqual(new Cartesian2(69, 70)); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(95, 96, 97, 94)); + expect(e.rectangle.material.image.getValue(date)).toEqual('http://example.com/18033'); + expect(e.rectangle.material.repeat.getValue(date)).toEqual(new Cartesian2(41461, 31905)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(93, 203, 88, 125)); expect(e.rectangle.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_rectangle_material_grid')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(99, 100, 101, 98)); - expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(104.0); - expect(e.rectangle.material.lineCount.getValue(date)).toEqual(new Cartesian2(71, 72)); - expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(new Cartesian2(73, 74)); - expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(new Cartesian2(75, 76)); + expect(e.rectangle.material.color.getValue(date)).toEqual(Color.fromBytes(245, 105, 152, 83)); + expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(57393.0); + expect(e.rectangle.material.lineCount.getValue(date)).toEqual(new Cartesian2(4947, 4627)); + expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(new Cartesian2(37424, 19602)); + expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(new Cartesian2(43685, 31658)); expect(e = dataSource.entities.getById('material_rectangle_material_stripe')).toBeDefined(); expect(e.rectangle.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e.rectangle.material.offset.getValue(date)).toEqual(105.0); - expect(e.rectangle.material.repeat.getValue(date)).toEqual(106.0); - expect(e = dataSource.entities.getById('material41')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.949019607843137, 0.952941176470588, 0.956862745098039, 0.945098039215686), 1e-14); - expect(e = dataSource.entities.getById('material42')).toBeDefined(); - expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.964705882352941, 0.968627450980392, 0.972549019607843, 0.96078431372549), 1e-14); - expect(e = dataSource.entities.getById('material43')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.980392156862745, 0.984313725490196, 0.988235294117647, 0.976470588235294), 1e-14); - expect(e = dataSource.entities.getById('material44')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.996078431372549, 0, 0.00392156862745098, 0.992156862745098), 1e-14); - expect(e = dataSource.entities.getById('constant32')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.0117647058823529, 0.0156862745098039, 0.0196078431372549, 0.00784313725490196), 1e-14); - expect(e = dataSource.entities.getById('constant33')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.871684483717379, 0.300888156922483, 39), Cartesian3.fromRadians(0.730091830127586, 0.159295503332689, 42) ]); - expect(e = dataSource.entities.getById('constant34')).toBeDefined(); - expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(43, 44, 45), Cartesian3.fromDegrees(1, 2, 48) ]); - expect(e = dataSource.entities.getById('constant35')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0274509803921569, 0.0313725490196078, 0.0352941176470588, 0.0235294117647059), 1e-14); + expect(e.rectangle.material.evenColor.getValue(date)).toEqual(Color.fromBytes(196, 12, 53, 2)); + expect(e.rectangle.material.oddColor.getValue(date)).toEqual(Color.fromBytes(103, 243, 111, 72)); + expect(e.rectangle.material.offset.getValue(date)).toEqual(26578.0); + expect(e.rectangle.material.repeat.getValue(date)).toEqual(52842.0); + expect(e = dataSource.entities.getById('constant_rectangle_material_image_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.247058823529412, 0.498039215686275, 0.741176470588235, 0.968627450980392), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_grid_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(date)).toEqualEpsilon(new Color(0.458823529411765, 0.0627450980392157, 0.886274509803922, 0.83921568627451), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_stripe_evenColor')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.576470588235294, 0.341176470588235, 0.611764705882353, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_material_stripe_oddColor')).toBeDefined(); + expect(e.rectangle.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.866666666666667, 0.949019607843137, 0.0627450980392157, 0.0196078431372549), 1e-14); + expect(e = dataSource.entities.getById('constant_rectangle_outlineColor_rgbaf')).toBeDefined(); + expect(e.rectangle.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.301960784313725, 0.0352941176470588, 0.917647058823529, 0.207843137254902), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_positions_cartographicRadians')).toBeDefined(); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromRadians(0.990822494752221, 0.11729920547879, 47975), Cartesian3.fromRadians(1.22405890229697, 1.46292679641256, 13438) ]); + expect(e = dataSource.entities.getById('constant_wall_positions_cartographicDegrees')).toBeDefined(); + expect(e.wall.positions.getValue(date)).toEqual([ Cartesian3.fromDegrees(30, 24, 27738), Cartesian3.fromDegrees(14, 41, 41667) ]); + expect(e = dataSource.entities.getById('constant_wall_material_solidColor_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.694117647058824, 0.317647058823529, 0.909803921568627, 0.501960784313725), 1e-14); expect(e = dataSource.entities.getById('material_wall_material_image')).toBeDefined(); - expect(e.wall.material.image.getValue(date)).toEqual('http://example.com/12'); - expect(e.wall.material.repeat.getValue(date)).toEqual(new Cartesian2(77, 78)); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(111, 112, 113, 110)); + expect(e.wall.material.image.getValue(date)).toEqual('http://example.com/58529'); + expect(e.wall.material.repeat.getValue(date)).toEqual(new Cartesian2(36340, 47245)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(252, 63, 12, 38)); expect(e.wall.material.transparent.getValue(date)).toEqual(true); expect(e = dataSource.entities.getById('material_wall_material_grid')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(115, 116, 117, 114)); - expect(e.wall.material.cellAlpha.getValue(date)).toEqual(107.0); - expect(e.wall.material.lineCount.getValue(date)).toEqual(new Cartesian2(79, 80)); - expect(e.wall.material.lineThickness.getValue(date)).toEqual(new Cartesian2(81, 82)); - expect(e.wall.material.lineOffset.getValue(date)).toEqual(new Cartesian2(83, 84)); + expect(e.wall.material.color.getValue(date)).toEqual(Color.fromBytes(38, 183, 237, 174)); + expect(e.wall.material.cellAlpha.getValue(date)).toEqual(59606.0); + expect(e.wall.material.lineCount.getValue(date)).toEqual(new Cartesian2(3079, 31244)); + expect(e.wall.material.lineThickness.getValue(date)).toEqual(new Cartesian2(32099, 44157)); + expect(e.wall.material.lineOffset.getValue(date)).toEqual(new Cartesian2(13529, 1844)); expect(e = dataSource.entities.getById('material_wall_material_stripe')).toBeDefined(); expect(e.wall.material.orientation.getValue(date)).toEqual(StripeOrientation.VERTICAL); - expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(123, 124, 125, 122)); - expect(e.wall.material.offset.getValue(date)).toEqual(108.0); - expect(e.wall.material.repeat.getValue(date)).toEqual(109.0); - expect(e = dataSource.entities.getById('material45')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0431372549019608, 0.0470588235294118, 0.0509803921568627, 0.0392156862745098), 1e-14); - expect(e = dataSource.entities.getById('material46')).toBeDefined(); - expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.0588235294117647, 0.0627450980392157, 0.0666666666666667, 0.0549019607843137), 1e-14); - expect(e = dataSource.entities.getById('material47')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.0745098039215686, 0.0784313725490196, 0.0823529411764706, 0.0705882352941176), 1e-14); - expect(e = dataSource.entities.getById('material48')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.0901960784313725, 0.0941176470588235, 0.0980392156862745, 0.0862745098039216), 1e-14); - expect(e = dataSource.entities.getById('constant36')).toBeDefined(); - expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.105882352941176, 0.109803921568627, 0.113725490196078, 0.101960784313725), 1e-14); - expect(e = dataSource.entities.getById('constant37')).toBeDefined(); - expect(e = dataSource.entities.getById('constant38')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(date)).toEqual(Color.fromBytes(202, 190, 37, 215)); + expect(e.wall.material.oddColor.getValue(date)).toEqual(Color.fromBytes(56, 107, 92, 38)); + expect(e.wall.material.offset.getValue(date)).toEqual(34142.0); + expect(e.wall.material.repeat.getValue(date)).toEqual(33528.0); + expect(e = dataSource.entities.getById('constant_wall_material_image_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.349019607843137, 0.843137254901961, 0.290196078431373, 0.0431372549019608), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_grid_color')).toBeDefined(); + expect(e.wall.material.color.getValue(date)).toEqualEpsilon(new Color(0.756862745098039, 0.992156862745098, 0.992156862745098, 0.462745098039216), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_stripe_evenColor')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(date)).toEqualEpsilon(new Color(0.690196078431373, 0.211764705882353, 0.615686274509804, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_material_stripe_oddColor')).toBeDefined(); + expect(e.wall.material.oddColor.getValue(date)).toEqualEpsilon(new Color(0.968627450980392, 0.368627450980392, 0.219607843137255, 0.00392156862745098), 1e-14); + expect(e = dataSource.entities.getById('constant_wall_outlineColor_rgbaf')).toBeDefined(); + expect(e.wall.outlineColor.getValue(date)).toEqualEpsilon(new Color(0.564705882352941, 0.67843137254902, 0.764705882352941, 0.811764705882353), 1e-14); + expect(e = dataSource.entities.getById('constant_agi_conicSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material49')).toBeDefined(); - expect(e = dataSource.entities.getById('material50')).toBeDefined(); - expect(e = dataSource.entities.getById('material51')).toBeDefined(); - expect(e = dataSource.entities.getById('material52')).toBeDefined(); - expect(e = dataSource.entities.getById('constant39')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material53')).toBeDefined(); - expect(e = dataSource.entities.getById('material54')).toBeDefined(); - expect(e = dataSource.entities.getById('material55')).toBeDefined(); - expect(e = dataSource.entities.getById('material56')).toBeDefined(); - expect(e = dataSource.entities.getById('constant40')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material57')).toBeDefined(); - expect(e = dataSource.entities.getById('material58')).toBeDefined(); - expect(e = dataSource.entities.getById('material59')).toBeDefined(); - expect(e = dataSource.entities.getById('material60')).toBeDefined(); - expect(e = dataSource.entities.getById('constant41')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material61')).toBeDefined(); - expect(e = dataSource.entities.getById('material62')).toBeDefined(); - expect(e = dataSource.entities.getById('material63')).toBeDefined(); - expect(e = dataSource.entities.getById('material64')).toBeDefined(); - expect(e = dataSource.entities.getById('constant42')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material65')).toBeDefined(); - expect(e = dataSource.entities.getById('material66')).toBeDefined(); - expect(e = dataSource.entities.getById('material67')).toBeDefined(); - expect(e = dataSource.entities.getById('material68')).toBeDefined(); - expect(e = dataSource.entities.getById('constant43')).toBeDefined(); - expect(e = dataSource.entities.getById('constant44')).toBeDefined(); - expect(e = dataSource.entities.getById('constant45')).toBeDefined(); - expect(e = dataSource.entities.getById('constant46')).toBeDefined(); - expect(e = dataSource.entities.getById('constant47')).toBeDefined(); - expect(e = dataSource.entities.getById('constant48')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_conicSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_conicSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_directions_unitCartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material69')).toBeDefined(); - expect(e = dataSource.entities.getById('material70')).toBeDefined(); - expect(e = dataSource.entities.getById('material71')).toBeDefined(); - expect(e = dataSource.entities.getById('material72')).toBeDefined(); - expect(e = dataSource.entities.getById('constant49')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material73')).toBeDefined(); - expect(e = dataSource.entities.getById('material74')).toBeDefined(); - expect(e = dataSource.entities.getById('material75')).toBeDefined(); - expect(e = dataSource.entities.getById('material76')).toBeDefined(); - expect(e = dataSource.entities.getById('constant50')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material77')).toBeDefined(); - expect(e = dataSource.entities.getById('material78')).toBeDefined(); - expect(e = dataSource.entities.getById('material79')).toBeDefined(); - expect(e = dataSource.entities.getById('material80')).toBeDefined(); - expect(e = dataSource.entities.getById('constant51')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material81')).toBeDefined(); - expect(e = dataSource.entities.getById('material82')).toBeDefined(); - expect(e = dataSource.entities.getById('material83')).toBeDefined(); - expect(e = dataSource.entities.getById('material84')).toBeDefined(); - expect(e = dataSource.entities.getById('constant52')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material85')).toBeDefined(); - expect(e = dataSource.entities.getById('material86')).toBeDefined(); - expect(e = dataSource.entities.getById('material87')).toBeDefined(); - expect(e = dataSource.entities.getById('material88')).toBeDefined(); - expect(e = dataSource.entities.getById('constant53')).toBeDefined(); - expect(e = dataSource.entities.getById('constant54')).toBeDefined(); - expect(e = dataSource.entities.getById('constant55')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_customPatternSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_rectangularSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material89')).toBeDefined(); - expect(e = dataSource.entities.getById('material90')).toBeDefined(); - expect(e = dataSource.entities.getById('material91')).toBeDefined(); - expect(e = dataSource.entities.getById('material92')).toBeDefined(); - expect(e = dataSource.entities.getById('constant56')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material93')).toBeDefined(); - expect(e = dataSource.entities.getById('material94')).toBeDefined(); - expect(e = dataSource.entities.getById('material95')).toBeDefined(); - expect(e = dataSource.entities.getById('material96')).toBeDefined(); - expect(e = dataSource.entities.getById('constant57')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material97')).toBeDefined(); - expect(e = dataSource.entities.getById('material98')).toBeDefined(); - expect(e = dataSource.entities.getById('material99')).toBeDefined(); - expect(e = dataSource.entities.getById('material100')).toBeDefined(); - expect(e = dataSource.entities.getById('constant58')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material101')).toBeDefined(); - expect(e = dataSource.entities.getById('material102')).toBeDefined(); - expect(e = dataSource.entities.getById('material103')).toBeDefined(); - expect(e = dataSource.entities.getById('material104')).toBeDefined(); - expect(e = dataSource.entities.getById('constant59')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material105')).toBeDefined(); - expect(e = dataSource.entities.getById('material106')).toBeDefined(); - expect(e = dataSource.entities.getById('material107')).toBeDefined(); - expect(e = dataSource.entities.getById('material108')).toBeDefined(); - expect(e = dataSource.entities.getById('constant60')).toBeDefined(); - expect(e = dataSource.entities.getById('constant61')).toBeDefined(); - expect(e = dataSource.entities.getById('constant62')).toBeDefined(); - expect(e = dataSource.entities.getById('constant63')).toBeDefined(); - expect(e = dataSource.entities.getById('constant64')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_rectangularSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_directions_unitCartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_solidColor_color')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_image')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_grid')).toBeDefined(); expect(e = dataSource.entities.getById('material_fan_material_stripe')).toBeDefined(); - expect(e = dataSource.entities.getById('material109')).toBeDefined(); - expect(e = dataSource.entities.getById('material110')).toBeDefined(); - expect(e = dataSource.entities.getById('material111')).toBeDefined(); - expect(e = dataSource.entities.getById('material112')).toBeDefined(); - expect(e = dataSource.entities.getById('constant65')).toBeDefined(); - expect(e = dataSource.entities.getById('constant66')).toBeDefined(); - expect(e = dataSource.entities.getById('constant67')).toBeDefined(); - expect(e = dataSource.entities.getById('constant68')).toBeDefined(); - expect(e = dataSource.entities.getById('constant69')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_fan_material_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_fan_outlineColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_color_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('constant_agi_vector_direction_unitCartesian')).toBeDefined(); expect(e = dataSource.entities.getById('ConstantPosition1')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(28, 29, 30)); + expect(e.position.getValue(date)).toEqual(new Cartesian3(48370, 3260, 44044)); expect(e = dataSource.entities.getById('ConstantDouble1')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(158.0); + expect(e.billboard.scale.getValue(date)).toEqual(1155.0); expect(e = dataSource.entities.getById('ConstantPosition2')).toBeDefined(); - expect(e.position.getValue(date)).toEqual(new Cartesian3(31, 32, 33)); + expect(e.position.getValue(date)).toEqual(new Cartesian3(2599, 10, 39168)); expect(e = dataSource.entities.getById('ConstantDouble2')).toBeDefined(); - expect(e.billboard.scale.getValue(date)).toEqual(159.0); + expect(e.billboard.scale.getValue(date)).toEqual(16451.0); expect(e = dataSource.entities.getById('Reference')).toBeDefined(); expect(e.description.getValue(date)).toEqual(constant.description.getValue(date)); expect(e.position.getValue(date)).toEqual(constant.position.getValue(date)); @@ -3512,6 +3570,7 @@ defineSuite([ expect(e.box.outline.getValue(date)).toEqual(constant.box.outline.getValue(date)); expect(e.box.outlineColor.getValue(date)).toEqual(constant.box.outlineColor.getValue(date)); expect(e.box.outlineWidth.getValue(date)).toEqual(constant.box.outlineWidth.getValue(date)); + expect(e.box.shadows.getValue(date)).toEqual(constant.box.shadows.getValue(date)); expect(e.corridor.show.getValue(date)).toEqual(constant.corridor.show.getValue(date)); expect(e.corridor.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.corridor.width.getValue(date)).toEqual(constant.corridor.width.getValue(date)); @@ -3524,6 +3583,7 @@ defineSuite([ expect(e.corridor.outline.getValue(date)).toEqual(constant.corridor.outline.getValue(date)); expect(e.corridor.outlineColor.getValue(date)).toEqual(constant.corridor.outlineColor.getValue(date)); expect(e.corridor.outlineWidth.getValue(date)).toEqual(constant.corridor.outlineWidth.getValue(date)); + expect(e.corridor.shadows.getValue(date)).toEqual(constant.corridor.shadows.getValue(date)); expect(e.cylinder.show.getValue(date)).toEqual(constant.cylinder.show.getValue(date)); expect(e.cylinder.length.getValue(date)).toEqual(constant.cylinder.length.getValue(date)); expect(e.cylinder.topRadius.getValue(date)).toEqual(constant.cylinder.topRadius.getValue(date)); @@ -3535,6 +3595,7 @@ defineSuite([ expect(e.cylinder.outlineWidth.getValue(date)).toEqual(constant.cylinder.outlineWidth.getValue(date)); expect(e.cylinder.numberOfVerticalLines.getValue(date)).toEqual(constant.cylinder.numberOfVerticalLines.getValue(date)); expect(e.cylinder.slices.getValue(date)).toEqual(constant.cylinder.slices.getValue(date)); + expect(e.cylinder.shadows.getValue(date)).toEqual(constant.cylinder.shadows.getValue(date)); expect(e.ellipse.show.getValue(date)).toEqual(constant.ellipse.show.getValue(date)); expect(e.ellipse.semiMajorAxis.getValue(date)).toEqual(constant.ellipse.semiMajorAxis.getValue(date)); expect(e.ellipse.semiMinorAxis.getValue(date)).toEqual(constant.ellipse.semiMinorAxis.getValue(date)); @@ -3549,6 +3610,7 @@ defineSuite([ expect(e.ellipse.outlineColor.getValue(date)).toEqual(constant.ellipse.outlineColor.getValue(date)); expect(e.ellipse.outlineWidth.getValue(date)).toEqual(constant.ellipse.outlineWidth.getValue(date)); expect(e.ellipse.numberOfVerticalLines.getValue(date)).toEqual(constant.ellipse.numberOfVerticalLines.getValue(date)); + expect(e.ellipse.shadows.getValue(date)).toEqual(constant.ellipse.shadows.getValue(date)); expect(e.ellipsoid.show.getValue(date)).toEqual(constant.ellipsoid.show.getValue(date)); expect(e.ellipsoid.radii.getValue(date)).toEqual(constant.ellipsoid.radii.getValue(date)); expect(e.ellipsoid.fill.getValue(date)).toEqual(constant.ellipsoid.fill.getValue(date)); @@ -3559,11 +3621,15 @@ defineSuite([ expect(e.ellipsoid.stackPartitions.getValue(date)).toEqual(constant.ellipsoid.stackPartitions.getValue(date)); expect(e.ellipsoid.slicePartitions.getValue(date)).toEqual(constant.ellipsoid.slicePartitions.getValue(date)); expect(e.ellipsoid.subdivisions.getValue(date)).toEqual(constant.ellipsoid.subdivisions.getValue(date)); + expect(e.ellipsoid.shadows.getValue(date)).toEqual(constant.ellipsoid.shadows.getValue(date)); expect(e.label.show.getValue(date)).toEqual(constant.label.show.getValue(date)); expect(e.label.text.getValue(date)).toEqual(constant.label.text.getValue(date)); expect(e.label.font.getValue(date)).toEqual(constant.label.font.getValue(date)); expect(e.label.style.getValue(date)).toEqual(constant.label.style.getValue(date)); expect(e.label.scale.getValue(date)).toEqual(constant.label.scale.getValue(date)); + expect(e.label.showBackground.getValue(date)).toEqual(constant.label.showBackground.getValue(date)); + expect(e.label.backgroundColor.getValue(date)).toEqual(constant.label.backgroundColor.getValue(date)); + expect(e.label.backgroundPadding.getValue(date)).toEqual(constant.label.backgroundPadding.getValue(date)); expect(e.label.pixelOffset.getValue(date)).toEqual(constant.label.pixelOffset.getValue(date)); expect(e.label.eyeOffset.getValue(date)).toEqual(constant.label.eyeOffset.getValue(date)); expect(e.label.horizontalOrigin.getValue(date)).toEqual(constant.label.horizontalOrigin.getValue(date)); @@ -3581,7 +3647,13 @@ defineSuite([ expect(e.model.maximumScale.getValue(date)).toEqual(constant.model.maximumScale.getValue(date)); expect(e.model.incrementallyLoadTextures.getValue(date)).toEqual(constant.model.incrementallyLoadTextures.getValue(date)); expect(e.model.runAnimations.getValue(date)).toEqual(constant.model.runAnimations.getValue(date)); + expect(e.model.shadows.getValue(date)).toEqual(constant.model.shadows.getValue(date)); expect(e.model.heightReference.getValue(date)).toEqual(constant.model.heightReference.getValue(date)); + expect(e.model.silhouetteColor.getValue(date)).toEqual(constant.model.silhouetteColor.getValue(date)); + expect(e.model.silhouetteSize.getValue(date)).toEqual(constant.model.silhouetteSize.getValue(date)); + expect(e.model.color.getValue(date)).toEqual(constant.model.color.getValue(date)); + expect(e.model.colorBlendMode.getValue(date)).toEqual(constant.model.colorBlendMode.getValue(date)); + expect(e.model.colorBlendAmount.getValue(date)).toEqual(constant.model.colorBlendAmount.getValue(date)); expect(e.model.nodeTransformations.referenceProp.translation.getValue(date)).toEqual(constant.model.nodeTransformations.prop.translation.getValue(date)); expect(e.model.nodeTransformations.referenceProp.rotation.getValue(date)).toEqual(constant.model.nodeTransformations.prop.rotation.getValue(date)); expect(e.model.nodeTransformations.referenceProp.scale.getValue(date)).toEqual(constant.model.nodeTransformations.prop.scale.getValue(date)); @@ -3613,12 +3685,14 @@ defineSuite([ expect(e.polygon.perPositionHeight.getValue(date)).toEqual(constant.polygon.perPositionHeight.getValue(date)); expect(e.polygon.closeTop.getValue(date)).toEqual(constant.polygon.closeTop.getValue(date)); expect(e.polygon.closeBottom.getValue(date)).toEqual(constant.polygon.closeBottom.getValue(date)); + expect(e.polygon.shadows.getValue(date)).toEqual(constant.polygon.shadows.getValue(date)); expect(e.polyline.show.getValue(date)).toEqual(constant.polyline.show.getValue(date)); expect(e.polyline.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.polyline.width.getValue(date)).toEqual(constant.polyline.width.getValue(date)); expect(e.polyline.granularity.getValue(date)).toEqual(constant.polyline.granularity.getValue(date)); expect(e.polyline.material.color.getValue(date)).toEqual(constant.polyline.material.color.getValue(date)); expect(e.polyline.followSurface.getValue(date)).toEqual(constant.polyline.followSurface.getValue(date)); + expect(e.polyline.shadows.getValue(date)).toEqual(constant.polyline.shadows.getValue(date)); expect(e.rectangle.show.getValue(date)).toEqual(constant.rectangle.show.getValue(date)); expect(e.rectangle.coordinates.getValue(date)).toEqual(constant.rectangle.coordinates.getValue(date)); expect(e.rectangle.height.getValue(date)).toEqual(constant.rectangle.height.getValue(date)); @@ -3633,6 +3707,7 @@ defineSuite([ expect(e.rectangle.outlineWidth.getValue(date)).toEqual(constant.rectangle.outlineWidth.getValue(date)); expect(e.rectangle.closeTop.getValue(date)).toEqual(constant.rectangle.closeTop.getValue(date)); expect(e.rectangle.closeBottom.getValue(date)).toEqual(constant.rectangle.closeBottom.getValue(date)); + expect(e.rectangle.shadows.getValue(date)).toEqual(constant.rectangle.shadows.getValue(date)); expect(e.wall.show.getValue(date)).toEqual(constant.wall.show.getValue(date)); expect(e.wall.positions.getValue(date)).toEqual([dataSource.entities.getById('ConstantPosition1').position.getValue(date), dataSource.entities.getById('ConstantPosition2').position.getValue(date)]); expect(e.wall.minimumHeights.getValue(date)).toEqual([dataSource.entities.getById('ConstantDouble1').billboard.scale.getValue(date), dataSource.entities.getById('ConstantDouble2').billboard.scale.getValue(date)]); @@ -3643,1089 +3718,1111 @@ defineSuite([ expect(e.wall.outline.getValue(date)).toEqual(constant.wall.outline.getValue(date)); expect(e.wall.outlineColor.getValue(date)).toEqual(constant.wall.outlineColor.getValue(date)); expect(e.wall.outlineWidth.getValue(date)).toEqual(constant.wall.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference1')).toBeDefined(); + expect(e.wall.shadows.getValue(date)).toEqual(constant.wall.shadows.getValue(date)); + expect(e = dataSource.entities.getById('reference_box_material_image')).toBeDefined(); expect(e.box.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.image.getValue(date)); expect(e.box.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.repeat.getValue(date)); expect(e.box.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.color.getValue(date)); expect(e.box.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_image').box.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference2')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_box_material_grid')).toBeDefined(); expect(e.box.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.color.getValue(date)); expect(e.box.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.cellAlpha.getValue(date)); expect(e.box.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineCount.getValue(date)); expect(e.box.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineThickness.getValue(date)); expect(e.box.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_grid').box.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference3')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_box_material_stripe')).toBeDefined(); expect(e.box.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.orientation.getValue(date)); expect(e.box.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.evenColor.getValue(date)); expect(e.box.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.oddColor.getValue(date)); expect(e.box.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.offset.getValue(date)); expect(e.box.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_box_material_stripe').box.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference4')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_image')).toBeDefined(); expect(e.corridor.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.image.getValue(date)); expect(e.corridor.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.repeat.getValue(date)); expect(e.corridor.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.color.getValue(date)); expect(e.corridor.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_image').corridor.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference5')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_grid')).toBeDefined(); expect(e.corridor.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.color.getValue(date)); expect(e.corridor.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.cellAlpha.getValue(date)); expect(e.corridor.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineCount.getValue(date)); expect(e.corridor.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineThickness.getValue(date)); expect(e.corridor.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_grid').corridor.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference6')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_corridor_material_stripe')).toBeDefined(); expect(e.corridor.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.orientation.getValue(date)); expect(e.corridor.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.evenColor.getValue(date)); expect(e.corridor.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.oddColor.getValue(date)); expect(e.corridor.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.offset.getValue(date)); expect(e.corridor.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_corridor_material_stripe').corridor.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference7')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_image')).toBeDefined(); expect(e.cylinder.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.image.getValue(date)); expect(e.cylinder.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.repeat.getValue(date)); expect(e.cylinder.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.color.getValue(date)); expect(e.cylinder.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_image').cylinder.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference8')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_grid')).toBeDefined(); expect(e.cylinder.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.color.getValue(date)); expect(e.cylinder.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.cellAlpha.getValue(date)); expect(e.cylinder.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineCount.getValue(date)); expect(e.cylinder.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineThickness.getValue(date)); expect(e.cylinder.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_grid').cylinder.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference9')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_cylinder_material_stripe')).toBeDefined(); expect(e.cylinder.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.orientation.getValue(date)); expect(e.cylinder.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.evenColor.getValue(date)); expect(e.cylinder.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.oddColor.getValue(date)); expect(e.cylinder.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.offset.getValue(date)); expect(e.cylinder.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_cylinder_material_stripe').cylinder.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference10')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_image')).toBeDefined(); expect(e.ellipse.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.image.getValue(date)); expect(e.ellipse.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.repeat.getValue(date)); expect(e.ellipse.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.color.getValue(date)); expect(e.ellipse.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_image').ellipse.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference11')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_grid')).toBeDefined(); expect(e.ellipse.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.color.getValue(date)); expect(e.ellipse.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.cellAlpha.getValue(date)); expect(e.ellipse.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineCount.getValue(date)); expect(e.ellipse.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineThickness.getValue(date)); expect(e.ellipse.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_grid').ellipse.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference12')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipse_material_stripe')).toBeDefined(); expect(e.ellipse.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.orientation.getValue(date)); expect(e.ellipse.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.evenColor.getValue(date)); expect(e.ellipse.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.oddColor.getValue(date)); expect(e.ellipse.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.offset.getValue(date)); expect(e.ellipse.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipse_material_stripe').ellipse.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference13')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_image')).toBeDefined(); expect(e.ellipsoid.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.image.getValue(date)); expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.repeat.getValue(date)); expect(e.ellipsoid.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.color.getValue(date)); expect(e.ellipsoid.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_image').ellipsoid.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference14')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_grid')).toBeDefined(); expect(e.ellipsoid.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.color.getValue(date)); expect(e.ellipsoid.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.cellAlpha.getValue(date)); expect(e.ellipsoid.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineCount.getValue(date)); expect(e.ellipsoid.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineThickness.getValue(date)); expect(e.ellipsoid.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_grid').ellipsoid.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference15')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_ellipsoid_material_stripe')).toBeDefined(); expect(e.ellipsoid.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.orientation.getValue(date)); expect(e.ellipsoid.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.evenColor.getValue(date)); expect(e.ellipsoid.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.oddColor.getValue(date)); expect(e.ellipsoid.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.offset.getValue(date)); expect(e.ellipsoid.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_ellipsoid_material_stripe').ellipsoid.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference16')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineOutline')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.color.getValue(date)); expect(e.path.material.outlineColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.outlineColor.getValue(date)); expect(e.path.material.outlineWidth.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineOutline').path.material.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference17')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineArrow')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineArrow').path.material.color.getValue(date)); - expect(e = dataSource.entities.getById('reference18')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_polylineGlow')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineGlow').path.material.color.getValue(date)); expect(e.path.material.glowPower.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_polylineGlow').path.material.glowPower.getValue(date)); - expect(e = dataSource.entities.getById('reference19')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_image')).toBeDefined(); expect(e.path.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.image.getValue(date)); expect(e.path.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.repeat.getValue(date)); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.color.getValue(date)); expect(e.path.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_image').path.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference20')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_grid')).toBeDefined(); expect(e.path.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.color.getValue(date)); expect(e.path.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.cellAlpha.getValue(date)); expect(e.path.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineCount.getValue(date)); expect(e.path.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineThickness.getValue(date)); expect(e.path.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_grid').path.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference21')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_path_material_stripe')).toBeDefined(); expect(e.path.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.orientation.getValue(date)); expect(e.path.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.evenColor.getValue(date)); expect(e.path.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.oddColor.getValue(date)); expect(e.path.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.offset.getValue(date)); expect(e.path.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_path_material_stripe').path.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference22')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_image')).toBeDefined(); expect(e.polygon.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.image.getValue(date)); expect(e.polygon.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.repeat.getValue(date)); expect(e.polygon.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.color.getValue(date)); expect(e.polygon.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_image').polygon.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference23')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_grid')).toBeDefined(); expect(e.polygon.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.color.getValue(date)); expect(e.polygon.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.cellAlpha.getValue(date)); expect(e.polygon.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineCount.getValue(date)); expect(e.polygon.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineThickness.getValue(date)); expect(e.polygon.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_grid').polygon.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference24')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polygon_material_stripe')).toBeDefined(); expect(e.polygon.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.orientation.getValue(date)); expect(e.polygon.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.evenColor.getValue(date)); expect(e.polygon.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.oddColor.getValue(date)); expect(e.polygon.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.offset.getValue(date)); expect(e.polygon.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polygon_material_stripe').polygon.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference25')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineOutline')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.color.getValue(date)); expect(e.polyline.material.outlineColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.outlineColor.getValue(date)); expect(e.polyline.material.outlineWidth.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineOutline').polyline.material.outlineWidth.getValue(date)); - expect(e = dataSource.entities.getById('reference26')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineArrow')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineArrow').polyline.material.color.getValue(date)); - expect(e = dataSource.entities.getById('reference27')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_polylineGlow')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineGlow').polyline.material.color.getValue(date)); expect(e.polyline.material.glowPower.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_polylineGlow').polyline.material.glowPower.getValue(date)); - expect(e = dataSource.entities.getById('reference28')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_image')).toBeDefined(); expect(e.polyline.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.image.getValue(date)); expect(e.polyline.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.repeat.getValue(date)); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.color.getValue(date)); expect(e.polyline.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_image').polyline.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference29')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_grid')).toBeDefined(); expect(e.polyline.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.color.getValue(date)); expect(e.polyline.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.cellAlpha.getValue(date)); expect(e.polyline.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineCount.getValue(date)); expect(e.polyline.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineThickness.getValue(date)); expect(e.polyline.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_grid').polyline.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference30')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_polyline_material_stripe')).toBeDefined(); expect(e.polyline.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.orientation.getValue(date)); expect(e.polyline.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.evenColor.getValue(date)); expect(e.polyline.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.oddColor.getValue(date)); expect(e.polyline.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.offset.getValue(date)); expect(e.polyline.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_polyline_material_stripe').polyline.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference31')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_image')).toBeDefined(); expect(e.rectangle.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.image.getValue(date)); expect(e.rectangle.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.repeat.getValue(date)); expect(e.rectangle.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.color.getValue(date)); expect(e.rectangle.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_image').rectangle.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference32')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_grid')).toBeDefined(); expect(e.rectangle.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.color.getValue(date)); expect(e.rectangle.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.cellAlpha.getValue(date)); expect(e.rectangle.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineCount.getValue(date)); expect(e.rectangle.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineThickness.getValue(date)); expect(e.rectangle.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_grid').rectangle.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference33')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangle_material_stripe')).toBeDefined(); expect(e.rectangle.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.orientation.getValue(date)); expect(e.rectangle.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.evenColor.getValue(date)); expect(e.rectangle.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.oddColor.getValue(date)); expect(e.rectangle.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.offset.getValue(date)); expect(e.rectangle.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_rectangle_material_stripe').rectangle.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference34')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_image')).toBeDefined(); expect(e.wall.material.image.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.image.getValue(date)); expect(e.wall.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.repeat.getValue(date)); expect(e.wall.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.color.getValue(date)); expect(e.wall.material.transparent.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_image').wall.material.transparent.getValue(date)); - expect(e = dataSource.entities.getById('reference35')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_grid')).toBeDefined(); expect(e.wall.material.color.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.color.getValue(date)); expect(e.wall.material.cellAlpha.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.cellAlpha.getValue(date)); expect(e.wall.material.lineCount.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineCount.getValue(date)); expect(e.wall.material.lineThickness.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineThickness.getValue(date)); expect(e.wall.material.lineOffset.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_grid').wall.material.lineOffset.getValue(date)); - expect(e = dataSource.entities.getById('reference36')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_wall_material_stripe')).toBeDefined(); expect(e.wall.material.orientation.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.orientation.getValue(date)); expect(e.wall.material.evenColor.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.evenColor.getValue(date)); expect(e.wall.material.oddColor.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.oddColor.getValue(date)); expect(e.wall.material.offset.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.offset.getValue(date)); expect(e.wall.material.repeat.getValue(date)).toEqual(dataSource.entities.getById('material_wall_material_stripe').wall.material.repeat.getValue(date)); - expect(e = dataSource.entities.getById('reference37')).toBeDefined(); - expect(e = dataSource.entities.getById('reference38')).toBeDefined(); - expect(e = dataSource.entities.getById('reference39')).toBeDefined(); - expect(e = dataSource.entities.getById('reference40')).toBeDefined(); - expect(e = dataSource.entities.getById('reference41')).toBeDefined(); - expect(e = dataSource.entities.getById('reference42')).toBeDefined(); - expect(e = dataSource.entities.getById('reference43')).toBeDefined(); - expect(e = dataSource.entities.getById('reference44')).toBeDefined(); - expect(e = dataSource.entities.getById('reference45')).toBeDefined(); - expect(e = dataSource.entities.getById('reference46')).toBeDefined(); - expect(e = dataSource.entities.getById('reference47')).toBeDefined(); - expect(e = dataSource.entities.getById('reference48')).toBeDefined(); - expect(e = dataSource.entities.getById('reference49')).toBeDefined(); - expect(e = dataSource.entities.getById('reference50')).toBeDefined(); - expect(e = dataSource.entities.getById('reference51')).toBeDefined(); - expect(e = dataSource.entities.getById('reference52')).toBeDefined(); - expect(e = dataSource.entities.getById('reference53')).toBeDefined(); - expect(e = dataSource.entities.getById('reference54')).toBeDefined(); - expect(e = dataSource.entities.getById('reference55')).toBeDefined(); - expect(e = dataSource.entities.getById('reference56')).toBeDefined(); - expect(e = dataSource.entities.getById('reference57')).toBeDefined(); - expect(e = dataSource.entities.getById('reference58')).toBeDefined(); - expect(e = dataSource.entities.getById('reference59')).toBeDefined(); - expect(e = dataSource.entities.getById('reference60')).toBeDefined(); - expect(e = dataSource.entities.getById('reference61')).toBeDefined(); - expect(e = dataSource.entities.getById('reference62')).toBeDefined(); - expect(e = dataSource.entities.getById('reference63')).toBeDefined(); - expect(e = dataSource.entities.getById('reference64')).toBeDefined(); - expect(e = dataSource.entities.getById('reference65')).toBeDefined(); - expect(e = dataSource.entities.getById('reference66')).toBeDefined(); - expect(e = dataSource.entities.getById('reference67')).toBeDefined(); - expect(e = dataSource.entities.getById('reference68')).toBeDefined(); - expect(e = dataSource.entities.getById('reference69')).toBeDefined(); - expect(e = dataSource.entities.getById('reference70')).toBeDefined(); - expect(e = dataSource.entities.getById('reference71')).toBeDefined(); - expect(e = dataSource.entities.getById('reference72')).toBeDefined(); - expect(e = dataSource.entities.getById('reference73')).toBeDefined(); - expect(e = dataSource.entities.getById('reference74')).toBeDefined(); - expect(e = dataSource.entities.getById('reference75')).toBeDefined(); - expect(e = dataSource.entities.getById('reference76')).toBeDefined(); - expect(e = dataSource.entities.getById('reference77')).toBeDefined(); - expect(e = dataSource.entities.getById('reference78')).toBeDefined(); - expect(e = dataSource.entities.getById('reference79')).toBeDefined(); - expect(e = dataSource.entities.getById('reference80')).toBeDefined(); - expect(e = dataSource.entities.getById('reference81')).toBeDefined(); - expect(e = dataSource.entities.getById('reference82')).toBeDefined(); - expect(e = dataSource.entities.getById('reference83')).toBeDefined(); - expect(e = dataSource.entities.getById('reference84')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_image')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('reference_fan_material_stripe')).toBeDefined(); expect(e = dataSource.entities.getById('VelocityPosition')).toBeDefined(); expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(1, 2, 3)); expect(e.position.getValue(JulianDate.addSeconds(documentStartDate, 60, new JulianDate()))).toEqual(new Cartesian3(61, 122, 183)); - expect(e = dataSource.entities.getById('velocityReference1')).toBeDefined(); + expect(e = dataSource.entities.getById('velocityReference_billboard_alignedAxis')).toBeDefined(); expect(e.billboard.alignedAxis.getValue(JulianDate.addSeconds(documentStartDate, 50, new JulianDate()))).toEqualEpsilon(new Cartesian3(0.267261241912424, 0.534522483824849, 0.801783725737273), 1e-13); expect(e = dataSource.entities.getById('Sampled')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(34, 35, 36)); - expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(37, 38, 39)); - expect(e.orientation.getValue(documentStartDate)).toEqualEpsilon(new Quaternion(0.473513723810378, 0.520865096191416, 0.568216468572454, 0.426162351429341), 1e-14); - expect(e.orientation.getValue(documentStopDate)).toEqualEpsilon(new Quaternion(0.48132991492077, 0.515710623129397, 0.550091331338023, 0.446949206712144), 1e-14); - expect(e.viewFrom.getValue(documentStartDate)).toEqual(new Cartesian3(40, 41, 42)); - expect(e.viewFrom.getValue(documentStopDate)).toEqual(new Cartesian3(43, 44, 45)); - expect(e.billboard.scale.getValue(documentStartDate)).toEqual(160.0); - expect(e.billboard.scale.getValue(documentStopDate)).toEqual(161.0); - expect(e.billboard.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(213, 214)); - expect(e.billboard.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(215, 216)); - expect(e.billboard.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(46, 47, 48)); - expect(e.billboard.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(49, 50, 51)); - expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(128, 129, 130, 127)); - expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(132, 133, 134, 131)); - expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(162.0); - expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(163.0); - expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqualEpsilon(new Cartesian3(0.502570711032417, 0.574366526894191, 0.646162342755964), 1e-14); - expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqualEpsilon(new Cartesian3(0.523423922590214, 0.575766314849235, 0.628108707108257), 1e-14); - expect(e.billboard.width.getValue(documentStartDate)).toEqual(164.0); - expect(e.billboard.width.getValue(documentStopDate)).toEqual(165.0); - expect(e.billboard.height.getValue(documentStartDate)).toEqual(166.0); - expect(e.billboard.height.getValue(documentStopDate)).toEqual(167.0); - expect(e.billboard.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(29, 30, 31, 32)); - expect(e.billboard.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(33, 34, 35, 36)); - expect(e.billboard.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(37, 38, 39, 40)); - expect(e.billboard.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(41, 42, 43, 44)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(45, 46, 47, 48)); - expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(49, 50, 51, 52)); - expect(e.billboard.imageSubRegion.getValue(documentStartDate)).toEqual(new BoundingRectangle(5, 6, 7, 8)); - expect(e.billboard.imageSubRegion.getValue(documentStopDate)).toEqual(new BoundingRectangle(9, 10, 11, 12)); - expect(e.box.dimensions.getValue(documentStartDate)).toEqual(new Cartesian3(52, 53, 54)); - expect(e.box.dimensions.getValue(documentStopDate)).toEqual(new Cartesian3(55, 56, 57)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(136, 137, 138, 135)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(140, 141, 142, 139)); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(144, 145, 146, 143)); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(148, 149, 150, 147)); - expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(168.0); - expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(169.0); - expect(e.corridor.width.getValue(documentStartDate)).toEqual(170.0); - expect(e.corridor.width.getValue(documentStopDate)).toEqual(171.0); - expect(e.corridor.height.getValue(documentStartDate)).toEqual(172.0); - expect(e.corridor.height.getValue(documentStopDate)).toEqual(173.0); - expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(174.0); - expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(175.0); - expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(176.0); - expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(177.0); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(152, 153, 154, 151)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(156, 157, 158, 155)); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(160, 161, 162, 159)); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(164, 165, 166, 163)); - expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(178.0); - expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(179.0); - expect(e.cylinder.length.getValue(documentStartDate)).toEqual(180.0); - expect(e.cylinder.length.getValue(documentStopDate)).toEqual(181.0); - expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(182.0); - expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(183.0); - expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(184.0); - expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(185.0); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(168, 169, 170, 167)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(172, 173, 174, 171)); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(176, 177, 178, 175)); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(180, 181, 182, 179)); - expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(186.0); - expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(187.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(188.0); - expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(189.0); - expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(190.0); - expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(191.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(192.0); - expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(193.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(194.0); - expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(195.0); - expect(e.ellipse.height.getValue(documentStartDate)).toEqual(196.0); - expect(e.ellipse.height.getValue(documentStopDate)).toEqual(197.0); - expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(198.0); - expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(199.0); - expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(200.0); - expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(201.0); - expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(202.0); - expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(203.0); - expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(204.0); - expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(205.0); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(184, 185, 186, 183)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(188, 189, 190, 187)); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(192, 193, 194, 191)); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(196, 197, 198, 195)); - expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(206.0); - expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(207.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(208.0); - expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(209.0); - expect(e.ellipsoid.radii.getValue(documentStartDate)).toEqual(new Cartesian3(58, 59, 60)); - expect(e.ellipsoid.radii.getValue(documentStopDate)).toEqual(new Cartesian3(61, 62, 63)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(200, 201, 202, 199)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 205, 206, 203)); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(208, 209, 210, 207)); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(212, 213, 214, 211)); - expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(210.0); - expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(211.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(212.0); - expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(213.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(214.0); - expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(215.0); - expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(216.0); - expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(217.0); - expect(e.label.scale.getValue(documentStartDate)).toEqual(218.0); - expect(e.label.scale.getValue(documentStopDate)).toEqual(219.0); - expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(217, 218)); - expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(219, 220)); - expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(64, 65, 66)); - expect(e.label.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(67, 68, 69)); - expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(216, 217, 218, 215)); - expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(220, 221, 222, 219)); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(224, 225, 226, 223)); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(228, 229, 230, 227)); - expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(220.0); - expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(221.0); - expect(e.label.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(53, 54, 55, 56)); - expect(e.label.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(57, 58, 59, 60)); - expect(e.label.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(61, 62, 63, 64)); - expect(e.label.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(65, 66, 67, 68)); - expect(e.model.scale.getValue(documentStartDate)).toEqual(222.0); - expect(e.model.scale.getValue(documentStopDate)).toEqual(223.0); - expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(224.0); - expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(225.0); - expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(226.0); - expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(227.0); - expect(e.path.width.getValue(documentStartDate)).toEqual(228.0); - expect(e.path.width.getValue(documentStopDate)).toEqual(229.0); - expect(e.path.resolution.getValue(documentStartDate)).toEqual(230.0); - expect(e.path.resolution.getValue(documentStopDate)).toEqual(231.0); - expect(e.path.leadTime.getValue(documentStartDate)).toEqual(232.0); - expect(e.path.leadTime.getValue(documentStopDate)).toEqual(233.0); - expect(e.path.trailTime.getValue(documentStartDate)).toEqual(234.0); - expect(e.path.trailTime.getValue(documentStopDate)).toEqual(235.0); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(232, 233, 234, 231)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(236, 237, 238, 235)); - expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(236.0); - expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(237.0); - expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(240, 241, 242, 239)); - expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(244, 245, 246, 243)); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(248, 249, 250, 247)); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(252, 253, 254, 251)); - expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(238.0); - expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(239.0); - expect(e.point.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(69, 70, 71, 72)); - expect(e.point.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(73, 74, 75, 76)); - expect(e.point.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(77, 78, 79, 80)); - expect(e.point.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(81, 82, 83, 84)); - expect(e.polygon.height.getValue(documentStartDate)).toEqual(240.0); - expect(e.polygon.height.getValue(documentStopDate)).toEqual(241.0); - expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(242.0); - expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(243.0); - expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(244.0); - expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(245.0); - expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(246.0); - expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(247.0); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(1, 2, 3, 0)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(5, 6, 7, 4)); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(9, 10, 11, 8)); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(13, 14, 15, 12)); - expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(248.0); - expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(249.0); - expect(e.polyline.width.getValue(documentStartDate)).toEqual(250.0); - expect(e.polyline.width.getValue(documentStopDate)).toEqual(251.0); - expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(252.0); - expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(253.0); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 18, 19, 16)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(21, 22, 23, 20)); - expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(new Rectangle(1.14601836602552, 0.575222039230621, 0.00442571243572409, 1.00442571243572)); - expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(new Rectangle(0.433629385640828, 1.43362938564083, 0.862833058845931, 0.292036732051034)); - expect(e.rectangle.height.getValue(documentStartDate)).toEqual(254.0); - expect(e.rectangle.height.getValue(documentStopDate)).toEqual(255.0); - expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(256.0); - expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(257.0); - expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(258.0); - expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(259.0); - expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(260.0); - expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(261.0); - expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(262.0); - expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(263.0); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(25, 26, 27, 24)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(29, 30, 31, 28)); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(33, 34, 35, 32)); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(37, 38, 39, 36)); - expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(264.0); - expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(265.0); - expect(e.wall.granularity.getValue(documentStartDate)).toEqual(266.0); - expect(e.wall.granularity.getValue(documentStopDate)).toEqual(267.0); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(41, 42, 43, 40)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(45, 46, 47, 44)); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 50, 51, 48)); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 54, 55, 52)); - expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(268.0); - expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(269.0); - expect(e = dataSource.entities.getById('sampled1')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromRadians(0.716814692820414, 0.146018366025517, 9)); - expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromRadians(0.575222039230621, 0.00442571243572409, 12)); - expect(e = dataSource.entities.getById('sampled2')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromDegrees(13, 14, 15)); - expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromDegrees(16, 17, 18)); - expect(e = dataSource.entities.getById('sampled3')).toBeDefined(); - expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(7, 8, 9)); - expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(13, 14, 15)); - expect(e = dataSource.entities.getById('sampled4')).toBeDefined(); - expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.505882352941176, 0.509803921568627, 0.498039215686275), 1e-14); - expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.517647058823529, 0.52156862745098, 0.525490196078431, 0.513725490196078), 1e-14); - expect(e = dataSource.entities.getById('sampled5')).toBeDefined(); - expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqual(Cartesian3.fromSpherical(new Spherical(5, 6))); - expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqual(Cartesian3.fromSpherical(new Spherical(7, 8))); - expect(e = dataSource.entities.getById('sampled6')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.533333333333333, 0.537254901960784, 0.541176470588235, 0.529411764705882), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.552941176470588, 0.556862745098039, 0.545098039215686), 1e-14); - expect(e = dataSource.entities.getById('sampled7')).toBeDefined(); - expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(221, 222)); - expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(223, 224)); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(249, 250, 251, 248)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(253, 254, 0, 252)); - expect(e = dataSource.entities.getById('sampled8')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(2, 3, 4, 1)); - expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(6, 7, 8, 5)); - expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(310.0); - expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(311.0); - expect(e.box.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(225, 226)); - expect(e.box.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(227, 228)); - expect(e.box.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(229, 230)); - expect(e.box.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(231, 232)); - expect(e.box.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(233, 234)); - expect(e.box.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(235, 236)); - expect(e = dataSource.entities.getById('sampled9')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(10, 11, 12, 9)); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(14, 15, 16, 13)); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(18, 19, 20, 17)); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(22, 23, 24, 21)); - expect(e.box.material.offset.getValue(documentStartDate)).toEqual(312.0); - expect(e.box.material.offset.getValue(documentStopDate)).toEqual(313.0); - expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(314.0); - expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(315.0); - expect(e = dataSource.entities.getById('sampled10')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.564705882352941, 0.568627450980392, 0.572549019607843, 0.56078431372549), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.580392156862745, 0.584313725490196, 0.588235294117647, 0.576470588235294), 1e-14); - expect(e = dataSource.entities.getById('sampled11')).toBeDefined(); - expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.596078431372549, 0.6, 0.603921568627451, 0.592156862745098), 1e-14); - expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.611764705882353, 0.615686274509804, 0.619607843137255, 0.607843137254902), 1e-14); - expect(e = dataSource.entities.getById('sampled12')).toBeDefined(); - expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.627450980392157, 0.631372549019608, 0.635294117647059, 0.623529411764706), 1e-14); - expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.643137254901961, 0.647058823529412, 0.650980392156863, 0.63921568627451), 1e-14); - expect(e = dataSource.entities.getById('sampled13')).toBeDefined(); - expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.658823529411765, 0.662745098039216, 0.666666666666667, 0.654901960784314), 1e-14); - expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.674509803921569, 0.67843137254902, 0.682352941176471, 0.670588235294118), 1e-14); - expect(e = dataSource.entities.getById('sampled14')).toBeDefined(); - expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.690196078431373, 0.694117647058824, 0.698039215686274, 0.686274509803922), 1e-14); - expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.705882352941177, 0.709803921568627, 0.713725490196078, 0.701960784313725), 1e-14); - expect(e = dataSource.entities.getById('sampled15')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.72156862745098, 0.725490196078431, 0.729411764705882, 0.717647058823529), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.737254901960784, 0.741176470588235, 0.745098039215686, 0.733333333333333), 1e-14); - expect(e = dataSource.entities.getById('sampled16')).toBeDefined(); - expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(237, 238)); - expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(239, 240)); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(26, 27, 28, 25)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(30, 31, 32, 29)); - expect(e = dataSource.entities.getById('sampled17')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(34, 35, 36, 33)); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(38, 39, 40, 37)); - expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(316.0); - expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(317.0); - expect(e.corridor.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(241, 242)); - expect(e.corridor.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(243, 244)); - expect(e.corridor.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(245, 246)); - expect(e.corridor.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(247, 248)); - expect(e.corridor.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(249, 250)); - expect(e.corridor.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(251, 252)); - expect(e = dataSource.entities.getById('sampled18')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(42, 43, 44, 41)); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(46, 47, 48, 45)); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(50, 51, 52, 49)); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(54, 55, 56, 53)); - expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(318.0); - expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(319.0); - expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(320.0); - expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(321.0); - expect(e = dataSource.entities.getById('sampled19')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.752941176470588, 0.756862745098039, 0.76078431372549, 0.749019607843137), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.768627450980392, 0.772549019607843, 0.776470588235294, 0.764705882352941), 1e-14); - expect(e = dataSource.entities.getById('sampled20')).toBeDefined(); - expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.784313725490196, 0.788235294117647, 0.792156862745098, 0.780392156862745), 1e-14); - expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.8, 0.803921568627451, 0.807843137254902, 0.796078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled21')).toBeDefined(); - expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.815686274509804, 0.819607843137255, 0.823529411764706, 0.811764705882353), 1e-14); - expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.831372549019608, 0.835294117647059, 0.83921568627451, 0.827450980392157), 1e-14); - expect(e = dataSource.entities.getById('sampled22')).toBeDefined(); - expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.847058823529412, 0.850980392156863, 0.854901960784314, 0.843137254901961), 1e-14); - expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.862745098039216, 0.866666666666667, 0.870588235294118, 0.858823529411765), 1e-14); - expect(e = dataSource.entities.getById('sampled23')).toBeDefined(); - expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.87843137254902, 0.882352941176471, 0.886274509803922, 0.874509803921569), 1e-14); - expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.894117647058824, 0.898039215686275, 0.901960784313726, 0.890196078431373), 1e-14); - expect(e = dataSource.entities.getById('sampled24')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.909803921568627, 0.913725490196078, 0.917647058823529, 0.905882352941176), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.925490196078431, 0.929411764705882, 0.933333333333333, 0.92156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled25')).toBeDefined(); - expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(253, 254)); - expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(255, 256)); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(58, 59, 60, 57)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(62, 63, 64, 61)); - expect(e = dataSource.entities.getById('sampled26')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(66, 67, 68, 65)); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(70, 71, 72, 69)); - expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(322.0); - expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(323.0); - expect(e.cylinder.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(257, 258)); - expect(e.cylinder.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(259, 260)); - expect(e.cylinder.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(261, 262)); - expect(e.cylinder.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(263, 264)); - expect(e.cylinder.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(265, 266)); - expect(e.cylinder.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(267, 268)); - expect(e = dataSource.entities.getById('sampled27')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(74, 75, 76, 73)); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 79, 80, 77)); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(82, 83, 84, 81)); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(86, 87, 88, 85)); - expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(324.0); - expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(325.0); - expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(326.0); - expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(327.0); - expect(e = dataSource.entities.getById('sampled28')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.941176470588235, 0.945098039215686, 0.949019607843137, 0.937254901960784), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.956862745098039, 0.96078431372549, 0.964705882352941, 0.952941176470588), 1e-14); - expect(e = dataSource.entities.getById('sampled29')).toBeDefined(); - expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.972549019607843, 0.976470588235294, 0.980392156862745, 0.968627450980392), 1e-14); - expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.988235294117647, 0.992156862745098, 0.996078431372549, 0.984313725490196), 1e-14); - expect(e = dataSource.entities.getById('sampled30')).toBeDefined(); - expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.00392156862745098, 0.00784313725490196, 0.0117647058823529, 0), 1e-14); - expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0196078431372549, 0.0235294117647059, 0.0274509803921569, 0.0156862745098039), 1e-14); - expect(e = dataSource.entities.getById('sampled31')).toBeDefined(); - expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0352941176470588, 0.0392156862745098, 0.0431372549019608, 0.0313725490196078), 1e-14); - expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.0549019607843137, 0.0588235294117647, 0.0470588235294118), 1e-14); - expect(e = dataSource.entities.getById('sampled32')).toBeDefined(); - expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.0705882352941176, 0.0745098039215686, 0.0627450980392157), 1e-14); - expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0862745098039216, 0.0901960784313725, 0.0784313725490196), 1e-14); - expect(e = dataSource.entities.getById('sampled33')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0980392156862745, 0.101960784313725, 0.105882352941176, 0.0941176470588235), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.113725490196078, 0.117647058823529, 0.12156862745098, 0.109803921568627), 1e-14); - expect(e = dataSource.entities.getById('sampled34')).toBeDefined(); - expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(269, 270)); - expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(271, 272)); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(90, 91, 92, 89)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(94, 95, 96, 93)); - expect(e = dataSource.entities.getById('sampled35')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(98, 99, 100, 97)); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(102, 103, 104, 101)); - expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(328.0); - expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(329.0); - expect(e.ellipse.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(273, 274)); - expect(e.ellipse.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(275, 276)); - expect(e.ellipse.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(277, 278)); - expect(e.ellipse.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(279, 280)); - expect(e.ellipse.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(281, 282)); - expect(e.ellipse.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(283, 284)); - expect(e = dataSource.entities.getById('sampled36')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(106, 107, 108, 105)); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(110, 111, 112, 109)); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(114, 115, 116, 113)); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(118, 119, 120, 117)); - expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(330.0); - expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(331.0); - expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(332.0); - expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(333.0); - expect(e = dataSource.entities.getById('sampled37')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.129411764705882, 0.133333333333333, 0.137254901960784, 0.125490196078431), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.145098039215686, 0.149019607843137, 0.152941176470588, 0.141176470588235), 1e-14); - expect(e = dataSource.entities.getById('sampled38')).toBeDefined(); - expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.16078431372549, 0.164705882352941, 0.168627450980392, 0.156862745098039), 1e-14); - expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.176470588235294, 0.180392156862745, 0.184313725490196, 0.172549019607843), 1e-14); - expect(e = dataSource.entities.getById('sampled39')).toBeDefined(); - expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.192156862745098, 0.196078431372549, 0.2, 0.188235294117647), 1e-14); - expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.207843137254902, 0.211764705882353, 0.215686274509804, 0.203921568627451), 1e-14); - expect(e = dataSource.entities.getById('sampled40')).toBeDefined(); - expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.223529411764706, 0.227450980392157, 0.231372549019608, 0.219607843137255), 1e-14); - expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.23921568627451, 0.243137254901961, 0.247058823529412, 0.235294117647059), 1e-14); - expect(e = dataSource.entities.getById('sampled41')).toBeDefined(); - expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.254901960784314, 0.258823529411765, 0.262745098039216, 0.250980392156863), 1e-14); - expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.270588235294118, 0.274509803921569, 0.27843137254902, 0.266666666666667), 1e-14); - expect(e = dataSource.entities.getById('sampled42')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.286274509803922, 0.290196078431373, 0.294117647058824, 0.282352941176471), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.301960784313725, 0.305882352941176, 0.309803921568627, 0.298039215686275), 1e-14); - expect(e = dataSource.entities.getById('sampled43')).toBeDefined(); - expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(285, 286)); - expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(287, 288)); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(122, 123, 124, 121)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(126, 127, 128, 125)); - expect(e = dataSource.entities.getById('sampled44')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(130, 131, 132, 129)); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(134, 135, 136, 133)); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(334.0); - expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(335.0); - expect(e.ellipsoid.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(289, 290)); - expect(e.ellipsoid.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(291, 292)); - expect(e.ellipsoid.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(293, 294)); - expect(e.ellipsoid.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(295, 296)); - expect(e.ellipsoid.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(297, 298)); - expect(e.ellipsoid.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(299, 300)); - expect(e = dataSource.entities.getById('sampled45')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(138, 139, 140, 137)); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(142, 143, 144, 141)); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(146, 147, 148, 145)); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(150, 151, 152, 149)); - expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(336.0); - expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(337.0); - expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(338.0); - expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(339.0); - expect(e = dataSource.entities.getById('sampled46')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.317647058823529, 0.32156862745098, 0.325490196078431, 0.313725490196078), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.333333333333333, 0.337254901960784, 0.341176470588235, 0.329411764705882), 1e-14); - expect(e = dataSource.entities.getById('sampled47')).toBeDefined(); - expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.349019607843137, 0.352941176470588, 0.356862745098039, 0.345098039215686), 1e-14); - expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.364705882352941, 0.368627450980392, 0.372549019607843, 0.36078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled48')).toBeDefined(); - expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.380392156862745, 0.384313725490196, 0.388235294117647, 0.376470588235294), 1e-14); - expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.396078431372549, 0.4, 0.403921568627451, 0.392156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled49')).toBeDefined(); - expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.411764705882353, 0.415686274509804, 0.419607843137255, 0.407843137254902), 1e-14); - expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.427450980392157, 0.431372549019608, 0.435294117647059, 0.423529411764706), 1e-14); - expect(e = dataSource.entities.getById('sampled50')).toBeDefined(); - expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.443137254901961, 0.447058823529412, 0.450980392156863, 0.43921568627451), 1e-14); - expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.458823529411765, 0.462745098039216, 0.466666666666667, 0.454901960784314), 1e-14); - expect(e = dataSource.entities.getById('sampled51')).toBeDefined(); - expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.474509803921569, 0.47843137254902, 0.482352941176471, 0.470588235294118), 1e-14); - expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.490196078431373, 0.494117647058824, 0.498039215686275, 0.486274509803922), 1e-14); - expect(e = dataSource.entities.getById('sampled52')).toBeDefined(); - expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.505882352941176, 0.509803921568627, 0.513725490196078, 0.501960784313725), 1e-14); - expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.52156862745098, 0.525490196078431, 0.529411764705882, 0.517647058823529), 1e-14); - expect(e = dataSource.entities.getById('sampled53')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.537254901960784, 0.541176470588235, 0.545098039215686, 0.533333333333333), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.552941176470588, 0.556862745098039, 0.56078431372549, 0.549019607843137), 1e-14); - expect(e = dataSource.entities.getById('sampled54')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(154, 155, 156, 153)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(158, 159, 160, 157)); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(162, 163, 164, 161)); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(166, 167, 168, 165)); - expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(340.0); - expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(341.0); - expect(e = dataSource.entities.getById('sampled55')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(170, 171, 172, 169)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(174, 175, 176, 173)); - expect(e = dataSource.entities.getById('sampled56')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(178, 179, 180, 177)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(182, 183, 184, 181)); - expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(342.0); - expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(343.0); - expect(e = dataSource.entities.getById('sampled57')).toBeDefined(); - expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(301, 302)); - expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(303, 304)); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(186, 187, 188, 185)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(190, 191, 192, 189)); - expect(e = dataSource.entities.getById('sampled58')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(194, 195, 196, 193)); - expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(198, 199, 200, 197)); - expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(344.0); - expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(345.0); - expect(e.path.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(305, 306)); - expect(e.path.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(307, 308)); - expect(e.path.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(309, 310)); - expect(e.path.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(311, 312)); - expect(e.path.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(313, 314)); - expect(e.path.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(315, 316)); - expect(e = dataSource.entities.getById('sampled59')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(202, 203, 204, 201)); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(206, 207, 208, 205)); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(210, 211, 212, 209)); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 215, 216, 213)); - expect(e.path.material.offset.getValue(documentStartDate)).toEqual(346.0); - expect(e.path.material.offset.getValue(documentStopDate)).toEqual(347.0); - expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(348.0); - expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(349.0); - expect(e = dataSource.entities.getById('sampled60')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.568627450980392, 0.572549019607843, 0.576470588235294, 0.564705882352941), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.584313725490196, 0.588235294117647, 0.592156862745098, 0.580392156862745), 1e-14); - expect(e = dataSource.entities.getById('sampled61')).toBeDefined(); - expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.6, 0.603921568627451, 0.607843137254902, 0.596078431372549), 1e-14); - expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.615686274509804, 0.619607843137255, 0.623529411764706, 0.611764705882353), 1e-14); - expect(e = dataSource.entities.getById('sampled62')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.631372549019608, 0.635294117647059, 0.63921568627451, 0.627450980392157), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.647058823529412, 0.650980392156863, 0.654901960784314, 0.643137254901961), 1e-14); - expect(e = dataSource.entities.getById('sampled63')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.662745098039216, 0.666666666666667, 0.670588235294118, 0.658823529411765), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.67843137254902, 0.682352941176471, 0.686274509803922, 0.674509803921569), 1e-14); - expect(e = dataSource.entities.getById('sampled64')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.694117647058824, 0.698039215686274, 0.701960784313725, 0.690196078431373), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.709803921568627, 0.713725490196078, 0.717647058823529, 0.705882352941177), 1e-14); - expect(e = dataSource.entities.getById('sampled65')).toBeDefined(); - expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.725490196078431, 0.729411764705882, 0.733333333333333, 0.72156862745098), 1e-14); - expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.741176470588235, 0.745098039215686, 0.749019607843137, 0.737254901960784), 1e-14); - expect(e = dataSource.entities.getById('sampled66')).toBeDefined(); - expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.756862745098039, 0.76078431372549, 0.764705882352941, 0.752941176470588), 1e-14); - expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.772549019607843, 0.776470588235294, 0.780392156862745, 0.768627450980392), 1e-14); - expect(e = dataSource.entities.getById('sampled67')).toBeDefined(); - expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.788235294117647, 0.792156862745098, 0.796078431372549, 0.784313725490196), 1e-14); - expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.803921568627451, 0.807843137254902, 0.811764705882353, 0.8), 1e-14); - expect(e = dataSource.entities.getById('sampled68')).toBeDefined(); - expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.819607843137255, 0.823529411764706, 0.827450980392157, 0.815686274509804), 1e-14); - expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.835294117647059, 0.83921568627451, 0.843137254901961, 0.831372549019608), 1e-14); - expect(e = dataSource.entities.getById('sampled69')).toBeDefined(); - expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.850980392156863, 0.854901960784314, 0.858823529411765, 0.847058823529412), 1e-14); - expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.866666666666667, 0.870588235294118, 0.874509803921569, 0.862745098039216), 1e-14); - expect(e = dataSource.entities.getById('sampled70')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.882352941176471, 0.886274509803922, 0.890196078431373, 0.87843137254902), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.898039215686275, 0.901960784313726, 0.905882352941176, 0.894117647058824), 1e-14); - expect(e = dataSource.entities.getById('sampled71')).toBeDefined(); - expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(317, 318)); - expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(319, 320)); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 219, 220, 217)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(222, 223, 224, 221)); - expect(e = dataSource.entities.getById('sampled72')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(226, 227, 228, 225)); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(230, 231, 232, 229)); - expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(350.0); - expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(351.0); - expect(e.polygon.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(321, 322)); - expect(e.polygon.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(323, 324)); - expect(e.polygon.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(325, 326)); - expect(e.polygon.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(327, 328)); - expect(e.polygon.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(329, 330)); - expect(e.polygon.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(331, 332)); - expect(e = dataSource.entities.getById('sampled73')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(234, 235, 236, 233)); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(238, 239, 240, 237)); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(242, 243, 244, 241)); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(246, 247, 248, 245)); - expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(352.0); - expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(353.0); - expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(354.0); - expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(355.0); - expect(e = dataSource.entities.getById('sampled74')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.913725490196078, 0.917647058823529, 0.92156862745098, 0.909803921568627), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.929411764705882, 0.933333333333333, 0.937254901960784, 0.925490196078431), 1e-14); - expect(e = dataSource.entities.getById('sampled75')).toBeDefined(); - expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.945098039215686, 0.949019607843137, 0.952941176470588, 0.941176470588235), 1e-14); - expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.96078431372549, 0.964705882352941, 0.968627450980392, 0.956862745098039), 1e-14); - expect(e = dataSource.entities.getById('sampled76')).toBeDefined(); - expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.976470588235294, 0.980392156862745, 0.984313725490196, 0.972549019607843), 1e-14); - expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.992156862745098, 0.996078431372549, 0, 0.988235294117647), 1e-14); - expect(e = dataSource.entities.getById('sampled77')).toBeDefined(); - expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.0117647058823529, 0.0156862745098039, 0.00392156862745098), 1e-14); - expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.0274509803921569, 0.0313725490196078, 0.0196078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled78')).toBeDefined(); - expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0392156862745098, 0.0431372549019608, 0.0470588235294118, 0.0352941176470588), 1e-14); - expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.0588235294117647, 0.0627450980392157, 0.0509803921568627), 1e-14); - expect(e = dataSource.entities.getById('sampled79')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0705882352941176, 0.0745098039215686, 0.0784313725490196, 0.0666666666666667), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0862745098039216, 0.0901960784313725, 0.0941176470588235, 0.0823529411764706), 1e-14); - expect(e = dataSource.entities.getById('sampled80')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(250, 251, 252, 249)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(254, 0, 1, 253)); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(3, 4, 5, 2)); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(7, 8, 9, 6)); - expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(356.0); - expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(357.0); - expect(e = dataSource.entities.getById('sampled81')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(11, 12, 13, 10)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(15, 16, 17, 14)); - expect(e = dataSource.entities.getById('sampled82')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 20, 21, 18)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(23, 24, 25, 22)); - expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(358.0); - expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(359.0); - expect(e = dataSource.entities.getById('sampled83')).toBeDefined(); - expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(333, 334)); - expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(335, 336)); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(27, 28, 29, 26)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(31, 32, 33, 30)); - expect(e = dataSource.entities.getById('sampled84')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(35, 36, 37, 34)); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(39, 40, 41, 38)); - expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(360.0); - expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(361.0); - expect(e.polyline.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(337, 338)); - expect(e.polyline.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(339, 340)); - expect(e.polyline.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(341, 342)); - expect(e.polyline.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(343, 344)); - expect(e.polyline.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(345, 346)); - expect(e.polyline.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(347, 348)); - expect(e = dataSource.entities.getById('sampled85')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(43, 44, 45, 42)); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(47, 48, 49, 46)); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(51, 52, 53, 50)); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(55, 56, 57, 54)); - expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(362.0); - expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(363.0); - expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(364.0); - expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(365.0); - expect(e = dataSource.entities.getById('sampled86')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.101960784313725, 0.105882352941176, 0.109803921568627, 0.0980392156862745), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.117647058823529, 0.12156862745098, 0.125490196078431, 0.113725490196078), 1e-14); - expect(e = dataSource.entities.getById('sampled87')).toBeDefined(); - expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.133333333333333, 0.137254901960784, 0.141176470588235, 0.129411764705882), 1e-14); - expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.149019607843137, 0.152941176470588, 0.156862745098039, 0.145098039215686), 1e-14); - expect(e = dataSource.entities.getById('sampled88')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.164705882352941, 0.168627450980392, 0.172549019607843, 0.16078431372549), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.180392156862745, 0.184313725490196, 0.188235294117647, 0.176470588235294), 1e-14); - expect(e = dataSource.entities.getById('sampled89')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.196078431372549, 0.2, 0.203921568627451, 0.192156862745098), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.211764705882353, 0.215686274509804, 0.219607843137255, 0.207843137254902), 1e-14); - expect(e = dataSource.entities.getById('sampled90')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.227450980392157, 0.231372549019608, 0.235294117647059, 0.223529411764706), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.243137254901961, 0.247058823529412, 0.250980392156863, 0.23921568627451), 1e-14); - expect(e = dataSource.entities.getById('sampled91')).toBeDefined(); - expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.258823529411765, 0.262745098039216, 0.266666666666667, 0.254901960784314), 1e-14); - expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.274509803921569, 0.27843137254902, 0.282352941176471, 0.270588235294118), 1e-14); - expect(e = dataSource.entities.getById('sampled92')).toBeDefined(); - expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.290196078431373, 0.294117647058824, 0.298039215686275, 0.286274509803922), 1e-14); - expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.305882352941176, 0.309803921568627, 0.313725490196078, 0.301960784313725), 1e-14); - expect(e = dataSource.entities.getById('sampled93')).toBeDefined(); - expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.32156862745098, 0.325490196078431, 0.329411764705882, 0.317647058823529), 1e-14); - expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.337254901960784, 0.341176470588235, 0.345098039215686, 0.333333333333333), 1e-14); - expect(e = dataSource.entities.getById('sampled94')).toBeDefined(); - expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(Rectangle.fromDegrees(17, 18, 19, 20)); - expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(Rectangle.fromDegrees(21, 22, 23, 24)); - expect(e = dataSource.entities.getById('sampled95')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.352941176470588, 0.356862745098039, 0.36078431372549, 0.349019607843137), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.368627450980392, 0.372549019607843, 0.376470588235294, 0.364705882352941), 1e-14); - expect(e = dataSource.entities.getById('sampled96')).toBeDefined(); - expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(349, 350)); - expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(351, 352)); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(59, 60, 61, 58)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(63, 64, 65, 62)); - expect(e = dataSource.entities.getById('sampled97')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(67, 68, 69, 66)); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(71, 72, 73, 70)); - expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(366.0); - expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(367.0); - expect(e.rectangle.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(353, 354)); - expect(e.rectangle.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(355, 356)); - expect(e.rectangle.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(357, 358)); - expect(e.rectangle.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(359, 360)); - expect(e.rectangle.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(361, 362)); - expect(e.rectangle.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(363, 364)); - expect(e = dataSource.entities.getById('sampled98')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(75, 76, 77, 74)); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 80, 81, 78)); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(83, 84, 85, 82)); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 88, 89, 86)); - expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(368.0); - expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(369.0); - expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(370.0); - expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(371.0); - expect(e = dataSource.entities.getById('sampled99')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.388235294117647, 0.392156862745098, 0.380392156862745), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.4, 0.403921568627451, 0.407843137254902, 0.396078431372549), 1e-14); - expect(e = dataSource.entities.getById('sampled100')).toBeDefined(); - expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.415686274509804, 0.419607843137255, 0.423529411764706, 0.411764705882353), 1e-14); - expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.431372549019608, 0.435294117647059, 0.43921568627451, 0.427450980392157), 1e-14); - expect(e = dataSource.entities.getById('sampled101')).toBeDefined(); - expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.447058823529412, 0.450980392156863, 0.454901960784314, 0.443137254901961), 1e-14); - expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.462745098039216, 0.466666666666667, 0.470588235294118, 0.458823529411765), 1e-14); - expect(e = dataSource.entities.getById('sampled102')).toBeDefined(); - expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.47843137254902, 0.482352941176471, 0.486274509803922, 0.474509803921569), 1e-14); - expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.494117647058824, 0.498039215686275, 0.501960784313725, 0.490196078431373), 1e-14); - expect(e = dataSource.entities.getById('sampled103')).toBeDefined(); - expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.509803921568627, 0.513725490196078, 0.517647058823529, 0.505882352941176), 1e-14); - expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.525490196078431, 0.529411764705882, 0.533333333333333, 0.52156862745098), 1e-14); - expect(e = dataSource.entities.getById('sampled104')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.541176470588235, 0.545098039215686, 0.549019607843137, 0.537254901960784), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.556862745098039, 0.56078431372549, 0.564705882352941, 0.552941176470588), 1e-14); - expect(e = dataSource.entities.getById('sampled105')).toBeDefined(); - expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(365, 366)); - expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(367, 368)); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(91, 92, 93, 90)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(95, 96, 97, 94)); - expect(e = dataSource.entities.getById('sampled106')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 100, 101, 98)); - expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(103, 104, 105, 102)); - expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(372.0); - expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(373.0); - expect(e.wall.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(369, 370)); - expect(e.wall.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(371, 372)); - expect(e.wall.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(373, 374)); - expect(e.wall.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(375, 376)); - expect(e.wall.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(377, 378)); - expect(e.wall.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(379, 380)); - expect(e = dataSource.entities.getById('sampled107')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(107, 108, 109, 106)); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(111, 112, 113, 110)); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(115, 116, 117, 114)); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(119, 120, 121, 118)); - expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(374.0); - expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(375.0); - expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(376.0); - expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(377.0); - expect(e = dataSource.entities.getById('sampled108')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.572549019607843, 0.576470588235294, 0.580392156862745, 0.568627450980392), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.588235294117647, 0.592156862745098, 0.596078431372549, 0.584313725490196), 1e-14); - expect(e = dataSource.entities.getById('sampled109')).toBeDefined(); - expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.603921568627451, 0.607843137254902, 0.611764705882353, 0.6), 1e-14); - expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.619607843137255, 0.623529411764706, 0.627450980392157, 0.615686274509804), 1e-14); - expect(e = dataSource.entities.getById('sampled110')).toBeDefined(); - expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.635294117647059, 0.63921568627451, 0.643137254901961, 0.631372549019608), 1e-14); - expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.650980392156863, 0.654901960784314, 0.658823529411765, 0.647058823529412), 1e-14); - expect(e = dataSource.entities.getById('sampled111')).toBeDefined(); - expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.666666666666667, 0.670588235294118, 0.674509803921569, 0.662745098039216), 1e-14); - expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.682352941176471, 0.686274509803922, 0.690196078431373, 0.67843137254902), 1e-14); - expect(e = dataSource.entities.getById('sampled112')).toBeDefined(); - expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.698039215686274, 0.701960784313725, 0.705882352941177, 0.694117647058824), 1e-14); - expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.713725490196078, 0.717647058823529, 0.72156862745098, 0.709803921568627), 1e-14); - expect(e = dataSource.entities.getById('sampled113')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled114')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled115')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled116')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled117')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled118')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled119')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled120')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled121')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled122')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled123')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled124')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled125')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled126')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled127')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled128')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled129')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled130')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled131')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled132')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled133')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled134')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled135')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled136')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled137')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled138')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled139')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled140')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled141')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled142')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled143')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled144')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled145')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled146')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled147')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled148')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled149')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled150')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled151')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled152')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled153')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled154')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled155')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled156')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled157')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled158')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled159')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled160')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled161')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled162')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled163')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled164')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled165')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled166')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled167')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled168')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled169')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled170')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled171')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled172')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled173')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled174')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled175')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled176')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled177')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled178')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled179')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled180')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled181')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled182')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled183')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled184')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled185')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled186')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled187')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled188')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled189')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled190')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled191')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled192')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled193')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled194')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled195')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled196')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled197')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled198')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled199')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled200')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled201')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled202')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled203')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled204')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled205')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled206')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled207')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled208')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled209')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled210')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled211')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled212')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled213')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled214')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled215')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled216')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled217')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled218')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled219')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled220')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled221')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled222')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled223')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled224')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled225')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled226')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled227')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled228')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled229')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled230')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled231')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled232')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled233')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled234')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled235')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled236')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled237')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled238')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled239')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled240')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled241')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled242')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled243')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled244')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled245')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled246')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled247')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled248')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled249')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled250')).toBeDefined(); - expect(e = dataSource.entities.getById('sampled251')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(14893, 22330, 50775)); + expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(44952, 52911, 45006)); + expect(e.orientation.getValue(documentStartDate)).toEqualEpsilon(new Quaternion(0.63382030572505, 0.114406464045845, 0.748788933003267, 0.156518736408648), 1e-14); + expect(e.orientation.getValue(documentStopDate)).toEqualEpsilon(new Quaternion(0.670778929875422, 0.608790403475694, 0.320013828781515, 0.277526613606122), 1e-14); + expect(e.viewFrom.getValue(documentStartDate)).toEqual(new Cartesian3(36965, 47504, 12985)); + expect(e.viewFrom.getValue(documentStopDate)).toEqual(new Cartesian3(16155, 2367, 57353)); + expect(e.billboard.scale.getValue(documentStartDate)).toEqual(5763.0); + expect(e.billboard.scale.getValue(documentStopDate)).toEqual(31607.0); + expect(e.billboard.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(2029, 62215)); + expect(e.billboard.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(30658, 12919)); + expect(e.billboard.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(3553, 23821, 42589)); + expect(e.billboard.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(3059, 48139, 28860)); + expect(e.billboard.color.getValue(documentStartDate)).toEqual(Color.fromBytes(85, 19, 239, 63)); + expect(e.billboard.color.getValue(documentStopDate)).toEqual(Color.fromBytes(160, 189, 87, 99)); + expect(e.billboard.rotation.getValue(documentStartDate)).toEqual(4554.0); + expect(e.billboard.rotation.getValue(documentStopDate)).toEqual(21210.0); + expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqualEpsilon(new Cartesian3(0.971559394453729, 0.230094854374832, 0.0559347927405484), 1e-14); + expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqualEpsilon(new Cartesian3(0.384810775516236, 0.82287332508932, 0.418091088045462), 1e-14); + expect(e.billboard.width.getValue(documentStartDate)).toEqual(21333.0); + expect(e.billboard.width.getValue(documentStopDate)).toEqual(51893.0); + expect(e.billboard.height.getValue(documentStartDate)).toEqual(48314.0); + expect(e.billboard.height.getValue(documentStopDate)).toEqual(61118.0); + expect(e.billboard.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(46842, 10678, 46377, 15029)); + expect(e.billboard.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(20642, 43600, 7082, 11291)); + expect(e.billboard.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(64366, 52219, 8139, 10015)); + expect(e.billboard.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(10918, 18986, 49738, 60610)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(54503, 26068, 41061, 59552)); + expect(e.billboard.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(37417, 4754, 19986, 15182)); + expect(e.billboard.imageSubRegion.getValue(documentStartDate)).toEqual(new BoundingRectangle(26590, 12135, 16431, 56640)); + expect(e.billboard.imageSubRegion.getValue(documentStopDate)).toEqual(new BoundingRectangle(43063, 42664, 60326, 52715)); + expect(e.box.dimensions.getValue(documentStartDate)).toEqual(new Cartesian3(37525, 42898, 18087)); + expect(e.box.dimensions.getValue(documentStopDate)).toEqual(new Cartesian3(49399, 59584, 63976)); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(172, 28, 222, 165)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(16, 192, 121, 150)); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(53, 66, 217, 237)); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(163, 75, 228, 48)); + expect(e.box.outlineWidth.getValue(documentStartDate)).toEqual(45211.0); + expect(e.box.outlineWidth.getValue(documentStopDate)).toEqual(20490.0); + expect(e.corridor.width.getValue(documentStartDate)).toEqual(62443.0); + expect(e.corridor.width.getValue(documentStopDate)).toEqual(13988.0); + expect(e.corridor.height.getValue(documentStartDate)).toEqual(20585.0); + expect(e.corridor.height.getValue(documentStopDate)).toEqual(63872.0); + expect(e.corridor.extrudedHeight.getValue(documentStartDate)).toEqual(63407.0); + expect(e.corridor.extrudedHeight.getValue(documentStopDate)).toEqual(42397.0); + expect(e.corridor.granularity.getValue(documentStartDate)).toEqual(43027.0); + expect(e.corridor.granularity.getValue(documentStopDate)).toEqual(55912.0); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(35, 213, 31, 79)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 126, 23, 40)); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 114, 57, 34)); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(93, 178, 74, 64)); + expect(e.corridor.outlineWidth.getValue(documentStartDate)).toEqual(14678.0); + expect(e.corridor.outlineWidth.getValue(documentStopDate)).toEqual(57820.0); + expect(e.cylinder.length.getValue(documentStartDate)).toEqual(30241.0); + expect(e.cylinder.length.getValue(documentStopDate)).toEqual(48364.0); + expect(e.cylinder.topRadius.getValue(documentStartDate)).toEqual(62881.0); + expect(e.cylinder.topRadius.getValue(documentStopDate)).toEqual(16270.0); + expect(e.cylinder.bottomRadius.getValue(documentStartDate)).toEqual(61925.0); + expect(e.cylinder.bottomRadius.getValue(documentStopDate)).toEqual(21514.0); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(133, 36, 52, 121)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(7, 13, 34, 201)); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(112, 241, 40, 103)); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(237, 75, 59, 51)); + expect(e.cylinder.outlineWidth.getValue(documentStartDate)).toEqual(36483.0); + expect(e.cylinder.outlineWidth.getValue(documentStopDate)).toEqual(32586.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStartDate)).toEqual(45816.0); + expect(e.cylinder.numberOfVerticalLines.getValue(documentStopDate)).toEqual(42247.0); + expect(e.cylinder.slices.getValue(documentStartDate)).toEqual(46140.0); + expect(e.cylinder.slices.getValue(documentStopDate)).toEqual(53530.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStartDate)).toEqual(13136.0); + expect(e.ellipse.semiMajorAxis.getValue(documentStopDate)).toEqual(55507.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStartDate)).toEqual(41580.0); + expect(e.ellipse.semiMinorAxis.getValue(documentStopDate)).toEqual(60905.0); + expect(e.ellipse.height.getValue(documentStartDate)).toEqual(5567.0); + expect(e.ellipse.height.getValue(documentStopDate)).toEqual(45588.0); + expect(e.ellipse.extrudedHeight.getValue(documentStartDate)).toEqual(16542.0); + expect(e.ellipse.extrudedHeight.getValue(documentStopDate)).toEqual(13545.0); + expect(e.ellipse.rotation.getValue(documentStartDate)).toEqual(5797.0); + expect(e.ellipse.rotation.getValue(documentStopDate)).toEqual(24542.0); + expect(e.ellipse.stRotation.getValue(documentStartDate)).toEqual(20596.0); + expect(e.ellipse.stRotation.getValue(documentStopDate)).toEqual(58204.0); + expect(e.ellipse.granularity.getValue(documentStartDate)).toEqual(2228.0); + expect(e.ellipse.granularity.getValue(documentStopDate)).toEqual(43731.0); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 250, 78, 96)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(63, 102, 221, 174)); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 123, 194, 31)); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(236, 100, 22, 203)); + expect(e.ellipse.outlineWidth.getValue(documentStartDate)).toEqual(60636.0); + expect(e.ellipse.outlineWidth.getValue(documentStopDate)).toEqual(24194.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStartDate)).toEqual(52822.0); + expect(e.ellipse.numberOfVerticalLines.getValue(documentStopDate)).toEqual(45768.0); + expect(e.ellipsoid.radii.getValue(documentStartDate)).toEqual(new Cartesian3(5183, 10004, 13863)); + expect(e.ellipsoid.radii.getValue(documentStopDate)).toEqual(new Cartesian3(39497, 12186, 45103)); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 128, 194, 84)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(50, 122, 190, 247)); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(247, 210, 180, 171)); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(239, 35, 237, 247)); + expect(e.ellipsoid.outlineWidth.getValue(documentStartDate)).toEqual(10713.0); + expect(e.ellipsoid.outlineWidth.getValue(documentStopDate)).toEqual(10444.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStartDate)).toEqual(5841.0); + expect(e.ellipsoid.stackPartitions.getValue(documentStopDate)).toEqual(39170.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStartDate)).toEqual(50327.0); + expect(e.ellipsoid.slicePartitions.getValue(documentStopDate)).toEqual(4672.0); + expect(e.ellipsoid.subdivisions.getValue(documentStartDate)).toEqual(10225.0); + expect(e.ellipsoid.subdivisions.getValue(documentStopDate)).toEqual(53957.0); + expect(e.label.scale.getValue(documentStartDate)).toEqual(40153.0); + expect(e.label.scale.getValue(documentStopDate)).toEqual(42123.0); + expect(e.label.backgroundColor.getValue(documentStartDate)).toEqual(Color.fromBytes(30, 92, 161, 169)); + expect(e.label.backgroundColor.getValue(documentStopDate)).toEqual(Color.fromBytes(85, 52, 166, 62)); + expect(e.label.backgroundPadding.getValue(documentStartDate)).toEqual(new Cartesian2(32945, 5504)); + expect(e.label.backgroundPadding.getValue(documentStopDate)).toEqual(new Cartesian2(35323, 6281)); + expect(e.label.pixelOffset.getValue(documentStartDate)).toEqual(new Cartesian2(8539, 9761)); + expect(e.label.pixelOffset.getValue(documentStopDate)).toEqual(new Cartesian2(10537, 54569)); + expect(e.label.eyeOffset.getValue(documentStartDate)).toEqual(new Cartesian3(5984, 34327, 59014)); + expect(e.label.eyeOffset.getValue(documentStopDate)).toEqual(new Cartesian3(1931, 5127, 18964)); + expect(e.label.fillColor.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 212, 62, 58)); + expect(e.label.fillColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 69, 90, 116)); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(205, 14, 169, 70)); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(143, 73, 168, 17)); + expect(e.label.outlineWidth.getValue(documentStartDate)).toEqual(53305.0); + expect(e.label.outlineWidth.getValue(documentStopDate)).toEqual(43838.0); + expect(e.label.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(25055, 32865, 32128, 29309)); + expect(e.label.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(58875, 9189, 20515, 15696)); + expect(e.label.pixelOffsetScaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(45296, 62896, 38133, 40084)); + expect(e.label.pixelOffsetScaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(28657, 25711, 9316, 62756)); + expect(e.model.scale.getValue(documentStartDate)).toEqual(63647.0); + expect(e.model.scale.getValue(documentStopDate)).toEqual(53878.0); + expect(e.model.minimumPixelSize.getValue(documentStartDate)).toEqual(16357.0); + expect(e.model.minimumPixelSize.getValue(documentStopDate)).toEqual(40522.0); + expect(e.model.maximumScale.getValue(documentStartDate)).toEqual(8290.0); + expect(e.model.maximumScale.getValue(documentStopDate)).toEqual(25558.0); + expect(e.model.silhouetteColor.getValue(documentStartDate)).toEqual(Color.fromBytes(33, 239, 70, 81)); + expect(e.model.silhouetteColor.getValue(documentStopDate)).toEqual(Color.fromBytes(60, 48, 26, 123)); + expect(e.model.silhouetteSize.getValue(documentStartDate)).toEqual(65103.0); + expect(e.model.silhouetteSize.getValue(documentStopDate)).toEqual(29065.0); + expect(e.model.color.getValue(documentStartDate)).toEqual(Color.fromBytes(74, 69, 164, 116)); + expect(e.model.color.getValue(documentStopDate)).toEqual(Color.fromBytes(127, 30, 46, 170)); + expect(e.model.colorBlendAmount.getValue(documentStartDate)).toEqual(64130.0); + expect(e.model.colorBlendAmount.getValue(documentStopDate)).toEqual(21967.0); + expect(e.path.width.getValue(documentStartDate)).toEqual(32449.0); + expect(e.path.width.getValue(documentStopDate)).toEqual(33819.0); + expect(e.path.resolution.getValue(documentStartDate)).toEqual(8399.0); + expect(e.path.resolution.getValue(documentStopDate)).toEqual(19400.0); + expect(e.path.leadTime.getValue(documentStartDate)).toEqual(40222.0); + expect(e.path.leadTime.getValue(documentStopDate)).toEqual(33294.0); + expect(e.path.trailTime.getValue(documentStartDate)).toEqual(34052.0); + expect(e.path.trailTime.getValue(documentStopDate)).toEqual(57713.0); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(97, 239, 22, 105)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(242, 157, 215, 125)); + expect(e.point.pixelSize.getValue(documentStartDate)).toEqual(39714.0); + expect(e.point.pixelSize.getValue(documentStopDate)).toEqual(3313.0); + expect(e.point.color.getValue(documentStartDate)).toEqual(Color.fromBytes(137, 151, 128, 95)); + expect(e.point.color.getValue(documentStopDate)).toEqual(Color.fromBytes(99, 157, 124, 108)); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(225, 246, 102, 195)); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(248, 38, 75, 222)); + expect(e.point.outlineWidth.getValue(documentStartDate)).toEqual(48323.0); + expect(e.point.outlineWidth.getValue(documentStopDate)).toEqual(50914.0); + expect(e.point.scaleByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(39727, 50843, 56262, 15579)); + expect(e.point.scaleByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(60522, 63980, 30201, 25205)); + expect(e.point.translucencyByDistance.getValue(documentStartDate)).toEqual(new NearFarScalar(61190, 16879, 16449, 10048)); + expect(e.point.translucencyByDistance.getValue(documentStopDate)).toEqual(new NearFarScalar(46491, 47541, 35769, 13707)); + expect(e.polygon.height.getValue(documentStartDate)).toEqual(64265.0); + expect(e.polygon.height.getValue(documentStopDate)).toEqual(19257.0); + expect(e.polygon.extrudedHeight.getValue(documentStartDate)).toEqual(12315.0); + expect(e.polygon.extrudedHeight.getValue(documentStopDate)).toEqual(4797.0); + expect(e.polygon.stRotation.getValue(documentStartDate)).toEqual(24959.0); + expect(e.polygon.stRotation.getValue(documentStopDate)).toEqual(32341.0); + expect(e.polygon.granularity.getValue(documentStartDate)).toEqual(51922.0); + expect(e.polygon.granularity.getValue(documentStopDate)).toEqual(9185.0); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 40, 12, 31)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(179, 204, 8, 194)); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(187, 223, 120, 26)); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 135, 105, 81)); + expect(e.polygon.outlineWidth.getValue(documentStartDate)).toEqual(48428.0); + expect(e.polygon.outlineWidth.getValue(documentStopDate)).toEqual(41508.0); + expect(e.polyline.width.getValue(documentStartDate)).toEqual(60367.0); + expect(e.polyline.width.getValue(documentStopDate)).toEqual(31077.0); + expect(e.polyline.granularity.getValue(documentStartDate)).toEqual(62537.0); + expect(e.polyline.granularity.getValue(documentStopDate)).toEqual(14676.0); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(90, 30, 195, 220)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(39, 17, 221, 74)); + expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(new Rectangle(0.392205830501108, 1.04907471338688, 0.00211010473645246, 0.064281089310235)); + expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(new Rectangle(0.523469985903937, 0.229690388867811, 0.399550037703662, 0.48478405941078)); + expect(e.rectangle.height.getValue(documentStartDate)).toEqual(56388.0); + expect(e.rectangle.height.getValue(documentStopDate)).toEqual(59991.0); + expect(e.rectangle.extrudedHeight.getValue(documentStartDate)).toEqual(39796.0); + expect(e.rectangle.extrudedHeight.getValue(documentStopDate)).toEqual(33335.0); + expect(e.rectangle.rotation.getValue(documentStartDate)).toEqual(26921.0); + expect(e.rectangle.rotation.getValue(documentStopDate)).toEqual(46937.0); + expect(e.rectangle.stRotation.getValue(documentStartDate)).toEqual(65255.0); + expect(e.rectangle.stRotation.getValue(documentStopDate)).toEqual(12220.0); + expect(e.rectangle.granularity.getValue(documentStartDate)).toEqual(6948.0); + expect(e.rectangle.granularity.getValue(documentStopDate)).toEqual(2204.0); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(106, 81, 64, 152)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(94, 108, 96, 154)); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(6, 244, 49, 131)); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(87, 190, 148, 55)); + expect(e.rectangle.outlineWidth.getValue(documentStartDate)).toEqual(41576.0); + expect(e.rectangle.outlineWidth.getValue(documentStopDate)).toEqual(33933.0); + expect(e.wall.granularity.getValue(documentStartDate)).toEqual(64428.0); + expect(e.wall.granularity.getValue(documentStopDate)).toEqual(25333.0); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(31, 188, 250, 46)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 91, 199, 227)); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(241, 39, 105, 205)); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(184, 17, 208, 44)); + expect(e.wall.outlineWidth.getValue(documentStartDate)).toEqual(62000.0); + expect(e.wall.outlineWidth.getValue(documentStopDate)).toEqual(40549.0); + expect(e = dataSource.entities.getById('sampled_position_cartographicRadians')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromRadians(1.00319530145806, 0.889718921347432, 16911)); + expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromRadians(0.828301545608097, 0.517994728610812, 62937)); + expect(e = dataSource.entities.getById('sampled_position_cartographicDegrees')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(Cartesian3.fromDegrees(43, 23, 63733)); + expect(e.position.getValue(documentStopDate)).toEqual(Cartesian3.fromDegrees(28, 12, 9806)); + expect(e = dataSource.entities.getById('sampled_position_cartesianVelocity')).toBeDefined(); + expect(e.position.getValue(documentStartDate)).toEqual(new Cartesian3(40342, 23709, 14940)); + expect(e.position.getValue(documentStopDate)).toEqual(new Cartesian3(25648, 55396, 53208)); + expect(e = dataSource.entities.getById('sampled_billboard_color_rgbaf')).toBeDefined(); + expect(e.billboard.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0235294117647059, 0.427450980392157, 0.658823529411765, 0.0980392156862745), 1e-14); + expect(e.billboard.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.752941176470588, 0.843137254901961, 0.164705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_billboard_alignedAxis_unitSpherical')).toBeDefined(); + expect(e.billboard.alignedAxis.getValue(documentStartDate)).toEqual(Cartesian3.fromSpherical(new Spherical(57328, 53471))); + expect(e.billboard.alignedAxis.getValue(documentStopDate)).toEqual(Cartesian3.fromSpherical(new Spherical(51360, 27848))); + expect(e = dataSource.entities.getById('sampled_box_material_solidColor_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.556862745098039, 0.541176470588235, 0.956862745098039, 0.317647058823529), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.792156862745098, 0.92156862745098, 0.125490196078431, 0.784313725490196), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_image')).toBeDefined(); + expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(21562, 11604)); + expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(56719, 11741)); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(146, 124, 215, 53)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(229, 219, 61, 100)); + expect(e = dataSource.entities.getById('sampled_box_material_grid')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(111, 151, 56, 118)); + expect(e.box.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(178, 77, 41, 86)); + expect(e.box.material.cellAlpha.getValue(documentStartDate)).toEqual(10400.0); + expect(e.box.material.cellAlpha.getValue(documentStopDate)).toEqual(10941.0); + expect(e.box.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(3433, 28173)); + expect(e.box.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(53350, 6864)); + expect(e.box.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(36990, 37264)); + expect(e.box.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(38412, 45974)); + expect(e.box.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(38761, 46487)); + expect(e.box.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(62553, 37876)); + expect(e = dataSource.entities.getById('sampled_box_material_stripe')).toBeDefined(); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(251, 59, 84, 41)); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 214, 81, 152)); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(233, 71, 17, 115)); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(20, 178, 40, 30)); + expect(e.box.material.offset.getValue(documentStartDate)).toEqual(46979.0); + expect(e.box.material.offset.getValue(documentStopDate)).toEqual(1457.0); + expect(e.box.material.repeat.getValue(documentStartDate)).toEqual(10283.0); + expect(e.box.material.repeat.getValue(documentStopDate)).toEqual(63419.0); + expect(e = dataSource.entities.getById('sampled_box_material_image_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.149019607843137, 0.929411764705882, 0.462745098039216, 0.764705882352941), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.890196078431373, 0.262745098039216, 0.866666666666667, 0.792156862745098), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_grid_color')).toBeDefined(); + expect(e.box.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.447058823529412, 0.72156862745098, 0.392156862745098), 1e-14); + expect(e.box.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.890196078431373, 0.505882352941176, 0.56078431372549, 0.674509803921569), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_stripe_evenColor')).toBeDefined(); + expect(e.box.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.980392156862745, 0.345098039215686, 0.929411764705882, 0.533333333333333), 1e-14); + expect(e.box.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.988235294117647, 0.372549019607843, 0.713725490196078, 0.466666666666667), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_material_stripe_oddColor')).toBeDefined(); + expect(e.box.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.545098039215686, 0.168627450980392, 0.654901960784314, 0.196078431372549), 1e-14); + expect(e.box.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.407843137254902, 0.450980392156863, 0.874509803921569, 0.603921568627451), 1e-14); + expect(e = dataSource.entities.getById('sampled_box_outlineColor_rgbaf')).toBeDefined(); + expect(e.box.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.215686274509804, 0.498039215686275, 0.274509803921569, 0.129411764705882), 1e-14); + expect(e.box.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.854901960784314, 0.729411764705882, 0.172549019607843, 0.956862745098039), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_solidColor_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.858823529411765, 0.988235294117647, 0.733333333333333, 0.690196078431373), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.368627450980392, 0.964705882352941, 0.133333333333333), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_image')).toBeDefined(); + expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(14885, 62522)); + expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(45129, 25776)); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(57, 37, 208, 54)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(24, 80, 140, 151)); + expect(e = dataSource.entities.getById('sampled_corridor_material_grid')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(130, 99, 15, 168)); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(246, 60, 236, 5)); + expect(e.corridor.material.cellAlpha.getValue(documentStartDate)).toEqual(22161.0); + expect(e.corridor.material.cellAlpha.getValue(documentStopDate)).toEqual(55997.0); + expect(e.corridor.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(7285, 25116)); + expect(e.corridor.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(18095, 8262)); + expect(e.corridor.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(31150, 55929)); + expect(e.corridor.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(40043, 22428)); + expect(e.corridor.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(41105, 52128)); + expect(e.corridor.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(2387, 32009)); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(8, 64, 254, 66)); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(47, 28, 112, 168)); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(17, 233, 150, 181)); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(171, 148, 181, 68)); + expect(e.corridor.material.offset.getValue(documentStartDate)).toEqual(21351.0); + expect(e.corridor.material.offset.getValue(documentStopDate)).toEqual(20709.0); + expect(e.corridor.material.repeat.getValue(documentStartDate)).toEqual(25188.0); + expect(e.corridor.material.repeat.getValue(documentStopDate)).toEqual(19705.0); + expect(e = dataSource.entities.getById('sampled_corridor_material_image_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.949019607843137, 0.666666666666667, 0.0588235294117647, 0.784313725490196), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.388235294117647, 0.262745098039216, 0.764705882352941, 0.882352941176471), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_grid_color')).toBeDefined(); + expect(e.corridor.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.290196078431373, 0.83921568627451, 0.588235294117647, 0.525490196078431), 1e-14); + expect(e.corridor.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.266666666666667, 0.00392156862745098, 0.180392156862745, 0.701960784313725), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe_evenColor')).toBeDefined(); + expect(e.corridor.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.282352941176471, 0.709803921568627, 0.737254901960784), 1e-14); + expect(e.corridor.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.564705882352941, 0.407843137254902, 0.945098039215686, 0.666666666666667), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_material_stripe_oddColor')).toBeDefined(); + expect(e.corridor.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.137254901960784, 0.4, 0.356862745098039, 0.501960784313725), 1e-14); + expect(e.corridor.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.992156862745098, 0.431372549019608, 0.301960784313725, 0.254901960784314), 1e-14); + expect(e = dataSource.entities.getById('sampled_corridor_outlineColor_rgbaf')).toBeDefined(); + expect(e.corridor.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.882352941176471, 0.262745098039216, 0.247058823529412, 0.937254901960784), 1e-14); + expect(e.corridor.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.701960784313725, 0.262745098039216, 0.0627450980392157, 0.627450980392157), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_solidColor_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.117647058823529, 0.349019607843137, 0.411764705882353, 0.105882352941176), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.513725490196078, 0.513725490196078, 0.666666666666667, 0.596078431372549), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_image')).toBeDefined(); + expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(42846, 26023)); + expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(19184, 35658)); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(59, 239, 245, 44)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(77, 93, 176, 39)); + expect(e = dataSource.entities.getById('sampled_cylinder_material_grid')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(211, 199, 71, 148)); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(142, 126, 167, 247)); + expect(e.cylinder.material.cellAlpha.getValue(documentStartDate)).toEqual(12751.0); + expect(e.cylinder.material.cellAlpha.getValue(documentStopDate)).toEqual(16373.0); + expect(e.cylinder.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(11469, 5164)); + expect(e.cylinder.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(8167, 36383)); + expect(e.cylinder.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(22021, 38742)); + expect(e.cylinder.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(45350, 43441)); + expect(e.cylinder.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(23237, 58970)); + expect(e.cylinder.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(62223, 62963)); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(131, 133, 216, 18)); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(78, 238, 32, 231)); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(209, 149, 133, 207)); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 207, 16, 210)); + expect(e.cylinder.material.offset.getValue(documentStartDate)).toEqual(49593.0); + expect(e.cylinder.material.offset.getValue(documentStopDate)).toEqual(25216.0); + expect(e.cylinder.material.repeat.getValue(documentStartDate)).toEqual(16819.0); + expect(e.cylinder.material.repeat.getValue(documentStopDate)).toEqual(12539.0); + expect(e = dataSource.entities.getById('sampled_cylinder_material_image_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.76078431372549, 0.133333333333333, 0.231372549019608, 0.631372549019608), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.0823529411764706, 0.8, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_grid_color')).toBeDefined(); + expect(e.cylinder.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.176470588235294, 0.407843137254902, 0.623529411764706, 0.729411764705882), 1e-14); + expect(e.cylinder.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.43921568627451, 0.0745098039215686, 0.603921568627451, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe_evenColor')).toBeDefined(); + expect(e.cylinder.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.380392156862745, 0.149019607843137, 0.8, 0.658823529411765), 1e-14); + expect(e.cylinder.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.462745098039216, 0.172549019607843, 0.325490196078431, 0.854901960784314), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_material_stripe_oddColor')).toBeDefined(); + expect(e.cylinder.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.466666666666667, 0.427450980392157, 0.109803921568627), 1e-14); + expect(e.cylinder.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.313725490196078, 0.498039215686275, 0.2, 0.423529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_cylinder_outlineColor_rgbaf')).toBeDefined(); + expect(e.cylinder.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.780392156862745, 0.658823529411765, 0.235294117647059, 0.0705882352941176), 1e-14); + expect(e.cylinder.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.643137254901961, 0.372549019607843, 0.16078431372549, 0.588235294117647), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_solidColor_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.807843137254902, 0.541176470588235, 0.290196078431373), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.749019607843137, 0.258823529411765, 0.733333333333333, 0.247058823529412), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_image')).toBeDefined(); + expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(41027, 32928)); + expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(30513, 54647)); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 25, 233, 224)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(230, 62, 9, 20)); + expect(e = dataSource.entities.getById('sampled_ellipse_material_grid')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(103, 140, 88, 233)); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(224, 133, 210, 4)); + expect(e.ellipse.material.cellAlpha.getValue(documentStartDate)).toEqual(39159.0); + expect(e.ellipse.material.cellAlpha.getValue(documentStopDate)).toEqual(47494.0); + expect(e.ellipse.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(40987, 3488)); + expect(e.ellipse.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(5066, 58131)); + expect(e.ellipse.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(11466, 25388)); + expect(e.ellipse.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(17761, 21317)); + expect(e.ellipse.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(478, 18945)); + expect(e.ellipse.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(25914, 29541)); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 225, 186, 34)); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(109, 193, 18, 44)); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(119, 198, 180, 58)); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 137, 65, 31)); + expect(e.ellipse.material.offset.getValue(documentStartDate)).toEqual(16964.0); + expect(e.ellipse.material.offset.getValue(documentStopDate)).toEqual(16523.0); + expect(e.ellipse.material.repeat.getValue(documentStartDate)).toEqual(50015.0); + expect(e.ellipse.material.repeat.getValue(documentStopDate)).toEqual(64942.0); + expect(e = dataSource.entities.getById('sampled_ellipse_material_image_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.207843137254902, 0.0392156862745098, 0.12156862745098, 0.611764705882353), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.611764705882353, 0.0117647058823529, 0.694117647058824, 0.576470588235294), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_grid_color')).toBeDefined(); + expect(e.ellipse.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.580392156862745, 0.0313725490196078, 0.27843137254902, 0.203921568627451), 1e-14); + expect(e.ellipse.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.870588235294118, 0.117647058823529, 0.588235294117647), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipse.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0549019607843137, 0.117647058823529, 0.623529411764706, 0.929411764705882), 1e-14); + expect(e.ellipse.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.266666666666667, 0.113725490196078, 0.937254901960784, 0.168627450980392), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipse.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.262745098039216, 0.172549019607843, 0.282352941176471, 0.129411764705882), 1e-14); + expect(e.ellipse.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.635294117647059, 0.525490196078431, 0.831372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipse_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipse.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.76078431372549, 0.36078431372549, 0.223529411764706, 0.611764705882353), 1e-14); + expect(e.ellipse.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.16078431372549, 0.83921568627451, 0.752941176470588, 0.647058823529412), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_solidColor_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.592156862745098, 0.976470588235294, 0.207843137254902, 0.501960784313725), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0901960784313725, 0.662745098039216, 0.819607843137255, 0.235294117647059), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_image')).toBeDefined(); + expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(63583, 15096)); + expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(48977, 60351)); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 50, 177, 104)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(131, 27, 208, 157)); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_grid')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(121, 105, 70, 72)); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 122, 157, 57)); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStartDate)).toEqual(39442.0); + expect(e.ellipsoid.material.cellAlpha.getValue(documentStopDate)).toEqual(463.0); + expect(e.ellipsoid.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(33778, 30083)); + expect(e.ellipsoid.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(5202, 18708)); + expect(e.ellipsoid.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(44058, 37804)); + expect(e.ellipsoid.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(34449, 3718)); + expect(e.ellipsoid.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(33149, 21889)); + expect(e.ellipsoid.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(35482, 10122)); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(153, 245, 201, 196)); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(245, 113, 5, 131)); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 151, 174, 111)); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(188, 89, 18, 1)); + expect(e.ellipsoid.material.offset.getValue(documentStartDate)).toEqual(44961.0); + expect(e.ellipsoid.material.offset.getValue(documentStopDate)).toEqual(5690.0); + expect(e.ellipsoid.material.repeat.getValue(documentStartDate)).toEqual(3351.0); + expect(e.ellipsoid.material.repeat.getValue(documentStopDate)).toEqual(44332.0); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_image_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.654901960784314, 0.517647058823529, 0.858823529411765, 0.486274509803922), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.862745098039216, 0.713725490196078, 0.564705882352941, 0.0901960784313725), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_grid_color')).toBeDefined(); + expect(e.ellipsoid.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.6, 0.427450980392157, 0.203921568627451, 0.223529411764706), 1e-14); + expect(e.ellipsoid.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.525490196078431, 0.305882352941176, 0.16078431372549, 0.819607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe_evenColor')).toBeDefined(); + expect(e.ellipsoid.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.301960784313725, 0.572549019607843, 0.87843137254902, 0.219607843137255), 1e-14); + expect(e.ellipsoid.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.337254901960784, 0.835294117647059, 0.964705882352941, 0.909803921568627), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_material_stripe_oddColor')).toBeDefined(); + expect(e.ellipsoid.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.647058823529412, 0.635294117647059, 0.258823529411765, 0.250980392156863), 1e-14); + expect(e.ellipsoid.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.917647058823529, 0.262745098039216, 0.666666666666667, 0.980392156862745), 1e-14); + expect(e = dataSource.entities.getById('sampled_ellipsoid_outlineColor_rgbaf')).toBeDefined(); + expect(e.ellipsoid.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.549019607843137, 0.431372549019608, 0.568627450980392), 1e-14); + expect(e.ellipsoid.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.698039215686274, 0.396078431372549, 0.772549019607843), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_backgroundColor_rgbaf')).toBeDefined(); + expect(e.label.backgroundColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.96078431372549, 0.188235294117647, 0.870588235294118, 0.270588235294118), 1e-14); + expect(e.label.backgroundColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.882352941176471, 0.796078431372549, 0.603921568627451, 0.823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_fillColor_rgbaf')).toBeDefined(); + expect(e.label.fillColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.709803921568627, 0.556862745098039, 0.337254901960784, 0.247058823529412), 1e-14); + expect(e.label.fillColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.43921568627451, 0.694117647058824, 0.901960784313726, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_label_outlineColor_rgbaf')).toBeDefined(); + expect(e.label.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.631372549019608, 0.709803921568627, 0.270588235294118, 0.792156862745098), 1e-14); + expect(e.label.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.176470588235294, 0.235294117647059, 0.631372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_model_silhouetteColor_rgbaf')).toBeDefined(); + expect(e.model.silhouetteColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.231372549019608, 0.866666666666667, 0.266666666666667, 0.635294117647059), 1e-14); + expect(e.model.silhouetteColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.749019607843137, 0.227450980392157, 0.807843137254902, 0.0823529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_model_color_rgbaf')).toBeDefined(); + expect(e.model.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0509803921568627, 0.83921568627451, 0.470588235294118, 0.956862745098039), 1e-14); + expect(e.model.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.435294117647059, 0.945098039215686, 0.431372549019608, 0.619607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_solidColor_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.517647058823529, 0.56078431372549, 0.254901960784314, 0.494117647058824), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.905882352941176, 0.152941176470588, 0.854901960784314, 0.890196078431373), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(209, 154, 35, 76)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(186, 25, 242, 140)); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(218, 241, 216, 157)); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(70, 200, 183, 199)); + expect(e.path.material.outlineWidth.getValue(documentStartDate)).toEqual(2699.0); + expect(e.path.material.outlineWidth.getValue(documentStopDate)).toEqual(1320.0); + expect(e = dataSource.entities.getById('sampled_path_material_polylineArrow')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(150, 221, 161, 136)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(19, 231, 68, 117)); + expect(e = dataSource.entities.getById('sampled_path_material_polylineGlow')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(197, 117, 196, 254)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(18, 17, 195, 230)); + expect(e.path.material.glowPower.getValue(documentStartDate)).toEqual(5579.0); + expect(e.path.material.glowPower.getValue(documentStopDate)).toEqual(59951.0); + expect(e = dataSource.entities.getById('sampled_path_material_image')).toBeDefined(); + expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(25033, 47457)); + expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(30413, 15734)); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(225, 149, 237, 92)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(234, 146, 229, 9)); + expect(e = dataSource.entities.getById('sampled_path_material_grid')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(99, 177, 19, 203)); + expect(e.path.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(231, 169, 202, 127)); + expect(e.path.material.cellAlpha.getValue(documentStartDate)).toEqual(63572.0); + expect(e.path.material.cellAlpha.getValue(documentStopDate)).toEqual(26232.0); + expect(e.path.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(34101, 5509)); + expect(e.path.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(11991, 23086)); + expect(e.path.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(39225, 58265)); + expect(e.path.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(60443, 36332)); + expect(e.path.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(25536, 59747)); + expect(e.path.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(43164, 57256)); + expect(e = dataSource.entities.getById('sampled_path_material_stripe')).toBeDefined(); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(252, 51, 215, 123)); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(164, 66, 75, 80)); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(192, 190, 37, 99)); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(196, 81, 62, 248)); + expect(e.path.material.offset.getValue(documentStartDate)).toEqual(45320.0); + expect(e.path.material.offset.getValue(documentStopDate)).toEqual(41173.0); + expect(e.path.material.repeat.getValue(documentStartDate)).toEqual(42078.0); + expect(e.path.material.repeat.getValue(documentStopDate)).toEqual(11633.0); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.498039215686275, 0.819607843137255, 0.72156862745098), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.309803921568627, 0.329411764705882, 0.807843137254902, 0.368627450980392), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.path.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.96078431372549, 0.996078431372549, 0.662745098039216), 1e-14); + expect(e.path.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.917647058823529, 0.635294117647059, 0.674509803921569, 0.298039215686275), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineArrow_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0666666666666667, 0.972549019607843, 0.686274509803922, 0.325490196078431), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.2, 0.482352941176471, 0.498039215686275, 0.219607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_polylineGlow_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.63921568627451, 0.2, 0.0196078431372549, 0.984313725490196), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.376470588235294, 0.815686274509804, 0.933333333333333, 0.0235294117647059), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_image_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.898039215686275, 0.772549019607843, 0.294117647058824, 0.0431372549019608), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.815686274509804, 0.0901960784313725, 0.898039215686275, 0.309803921568627), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_grid_color')).toBeDefined(); + expect(e.path.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.890196078431373, 0, 0.717647058823529, 0.329411764705882), 1e-14); + expect(e.path.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.474509803921569, 0.690196078431373, 0.0431372549019608, 0.258823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_stripe_evenColor')).toBeDefined(); + expect(e.path.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.368627450980392, 0.584313725490196, 0.831372549019608, 0.541176470588235), 1e-14); + expect(e.path.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.317647058823529, 0.4, 0.83921568627451, 0.537254901960784), 1e-14); + expect(e = dataSource.entities.getById('sampled_path_material_stripe_oddColor')).toBeDefined(); + expect(e.path.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.145098039215686, 0.588235294117647, 0.917647058823529, 0.607843137254902), 1e-14); + expect(e.path.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.117647058823529, 0.0705882352941176, 0.901960784313726, 0.525490196078431), 1e-14); + expect(e = dataSource.entities.getById('sampled_point_color_rgbaf')).toBeDefined(); + expect(e.point.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.67843137254902, 0.356862745098039, 0.588235294117647, 0.796078431372549), 1e-14); + expect(e.point.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.968627450980392, 0.298039215686275, 0.513725490196078, 0.631372549019608), 1e-14); + expect(e = dataSource.entities.getById('sampled_point_outlineColor_rgbaf')).toBeDefined(); + expect(e.point.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.894117647058824, 0.168627450980392, 0.768627450980392), 1e-14); + expect(e.point.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.458823529411765, 0.466666666666667, 0.388235294117647, 0.792156862745098), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_solidColor_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.305882352941176, 0.615686274509804, 0.337254901960784, 0.894117647058824), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.184313725490196, 0.619607843137255, 0.352941176470588, 0.0313725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_image')).toBeDefined(); + expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(19536, 17484)); + expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(46291, 28852)); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(157, 5, 231, 29)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(53, 2, 148, 36)); + expect(e = dataSource.entities.getById('sampled_polygon_material_grid')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(179, 243, 247, 124)); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(15, 128, 159, 42)); + expect(e.polygon.material.cellAlpha.getValue(documentStartDate)).toEqual(11565.0); + expect(e.polygon.material.cellAlpha.getValue(documentStopDate)).toEqual(42611.0); + expect(e.polygon.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(47065, 65463)); + expect(e.polygon.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(29170, 16497)); + expect(e.polygon.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(62674, 26868)); + expect(e.polygon.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(22008, 39509)); + expect(e.polygon.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(28793, 1648)); + expect(e.polygon.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(44991, 42159)); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(113, 233, 143, 146)); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(106, 138, 115, 44)); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(104, 146, 138, 244)); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(161, 95, 25, 36)); + expect(e.polygon.material.offset.getValue(documentStartDate)).toEqual(4711.0); + expect(e.polygon.material.offset.getValue(documentStopDate)).toEqual(65087.0); + expect(e.polygon.material.repeat.getValue(documentStartDate)).toEqual(44013.0); + expect(e.polygon.material.repeat.getValue(documentStopDate)).toEqual(7595.0); + expect(e = dataSource.entities.getById('sampled_polygon_material_image_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.501960784313725, 0.0823529411764706, 0.282352941176471, 0.305882352941176), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0745098039215686, 0.654901960784314, 0.6, 0.886274509803922), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_grid_color')).toBeDefined(); + expect(e.polygon.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.192156862745098, 0.709803921568627, 0.807843137254902, 0.737254901960784), 1e-14); + expect(e.polygon.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.674509803921569, 0.0235294117647059, 0.764705882352941, 0.976470588235294), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe_evenColor')).toBeDefined(); + expect(e.polygon.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.568627450980392, 0.352941176470588, 0.396078431372549, 0.435294117647059), 1e-14); + expect(e.polygon.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.274509803921569, 0.43921568627451, 0.686274509803922, 0.419607843137255), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_material_stripe_oddColor')).toBeDefined(); + expect(e.polygon.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.325490196078431, 0.349019607843137, 0.580392156862745, 0.725490196078431), 1e-14); + expect(e.polygon.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.568627450980392, 0.690196078431373, 0.00392156862745098, 0.858823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_polygon_outlineColor_rgbaf')).toBeDefined(); + expect(e.polygon.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.674509803921569, 0.556862745098039, 0.113725490196078, 0.6), 1e-14); + expect(e.polygon.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.650980392156863, 0.827450980392157, 0.537254901960784, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_solidColor_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.976470588235294, 0.949019607843137, 0.450980392156863, 0.466666666666667), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.262745098039216, 0.509803921568627, 0.537254901960784, 0.850980392156863), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(245, 92, 109, 218)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(241, 96, 196, 167)); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 2, 11, 244)); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqual(Color.fromBytes(31, 126, 140, 138)); + expect(e.polyline.material.outlineWidth.getValue(documentStartDate)).toEqual(33279.0); + expect(e.polyline.material.outlineWidth.getValue(documentStopDate)).toEqual(26855.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineArrow')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(141, 137, 252, 157)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(8, 236, 198, 57)); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineGlow')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 178, 78, 176)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(79, 191, 38, 195)); + expect(e.polyline.material.glowPower.getValue(documentStartDate)).toEqual(55378.0); + expect(e.polyline.material.glowPower.getValue(documentStopDate)).toEqual(60643.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_image')).toBeDefined(); + expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(50957, 35783)); + expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(59533, 65000)); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(174, 154, 113, 185)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(123, 236, 118, 155)); + expect(e = dataSource.entities.getById('sampled_polyline_material_grid')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(26, 89, 33, 224)); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(215, 131, 203, 1)); + expect(e.polyline.material.cellAlpha.getValue(documentStartDate)).toEqual(34343.0); + expect(e.polyline.material.cellAlpha.getValue(documentStopDate)).toEqual(63863.0); + expect(e.polyline.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(52308, 51660)); + expect(e.polyline.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(45338, 51633)); + expect(e.polyline.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(47738, 52154)); + expect(e.polyline.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(42674, 38822)); + expect(e.polyline.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(29194, 52338)); + expect(e.polyline.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(25319, 28514)); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(141, 205, 78, 73)); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(107, 159, 97, 34)); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(19, 76, 127, 197)); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(214, 222, 19, 168)); + expect(e.polyline.material.offset.getValue(documentStartDate)).toEqual(51126.0); + expect(e.polyline.material.offset.getValue(documentStopDate)).toEqual(10891.0); + expect(e.polyline.material.repeat.getValue(documentStartDate)).toEqual(25313.0); + expect(e.polyline.material.repeat.getValue(documentStopDate)).toEqual(22020.0); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.168627450980392, 0.443137254901961, 0.658823529411765), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0274509803921569, 0.647058823529412, 0.396078431372549, 0.105882352941176), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineOutline_outlineColor')).toBeDefined(); + expect(e.polyline.material.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0823529411764706, 0.0549019607843137, 0.149019607843137, 0.580392156862745), 1e-14); + expect(e.polyline.material.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.733333333333333, 0.792156862745098, 0.63921568627451, 0.564705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineArrow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.52156862745098, 0.725490196078431, 0.87843137254902, 0.823529411764706), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.772549019607843, 0.862745098039216, 0.325490196078431, 0), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_polylineGlow_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.705882352941177, 0.901960784313726, 0.0784313725490196, 0.356862745098039), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.517647058823529, 0.207843137254902, 0.701960784313725, 0.105882352941176), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_image_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.796078431372549, 0.741176470588235, 0.741176470588235, 0.349019607843137), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.925490196078431, 0.266666666666667, 0.0941176470588235, 0.556862745098039), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_grid_color')).toBeDefined(); + expect(e.polyline.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.545098039215686, 0.847058823529412, 0.341176470588235, 0.101960784313725), 1e-14); + expect(e.polyline.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.431372549019608, 0.952941176470588, 0.184313725490196, 0.184313725490196), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe_evenColor')).toBeDefined(); + expect(e.polyline.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.807843137254902, 0.262745098039216, 0.898039215686275, 0.811764705882353), 1e-14); + expect(e.polyline.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.415686274509804, 0.968627450980392, 0.0980392156862745, 0.423529411764706), 1e-14); + expect(e = dataSource.entities.getById('sampled_polyline_material_stripe_oddColor')).toBeDefined(); + expect(e.polyline.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.427450980392157, 0.407843137254902, 0.470588235294118, 0.874509803921569), 1e-14); + expect(e.polyline.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.509803921568627, 0.427450980392157, 0.976470588235294, 0), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_coordinates_wsenDegrees')).toBeDefined(); + expect(e.rectangle.coordinates.getValue(documentStartDate)).toEqual(Rectangle.fromDegrees(35, 18, 38, 15)); + expect(e.rectangle.coordinates.getValue(documentStopDate)).toEqual(Rectangle.fromDegrees(38, 1, 12, 30)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_solidColor_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.203921568627451, 0.243137254901961, 0.576470588235294, 0.0980392156862745), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.913725490196078, 0.831372549019608, 0.76078431372549, 0.952941176470588), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_image')).toBeDefined(); + expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(3711, 44302)); + expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(52318, 60108)); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(49, 142, 97, 190)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(189, 250, 238, 118)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_grid')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(95, 53, 115, 82)); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(204, 71, 209, 187)); + expect(e.rectangle.material.cellAlpha.getValue(documentStartDate)).toEqual(48813.0); + expect(e.rectangle.material.cellAlpha.getValue(documentStopDate)).toEqual(21269.0); + expect(e.rectangle.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(22945, 32857)); + expect(e.rectangle.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(55972, 34522)); + expect(e.rectangle.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(37146, 39825)); + expect(e.rectangle.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(64636, 13052)); + expect(e.rectangle.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(8882, 38690)); + expect(e.rectangle.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(8857, 21794)); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 96, 246, 5)); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(74, 28, 207, 87)); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(147, 18, 134, 10)); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(59, 151, 72, 114)); + expect(e.rectangle.material.offset.getValue(documentStartDate)).toEqual(57328.0); + expect(e.rectangle.material.offset.getValue(documentStopDate)).toEqual(2602.0); + expect(e.rectangle.material.repeat.getValue(documentStartDate)).toEqual(29729.0); + expect(e.rectangle.material.repeat.getValue(documentStopDate)).toEqual(30206.0); + expect(e = dataSource.entities.getById('sampled_rectangle_material_image_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.552941176470588, 0.101960784313725, 0.772549019607843, 0.00392156862745098), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.0156862745098039, 0.964705882352941, 0.592156862745098, 0.396078431372549), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_grid_color')).toBeDefined(); + expect(e.rectangle.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.490196078431373, 0.384313725490196, 0.937254901960784, 0.168627450980392), 1e-14); + expect(e.rectangle.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.392156862745098, 0.756862745098039, 0.454901960784314, 0.529411764705882), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe_evenColor')).toBeDefined(); + expect(e.rectangle.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.32156862745098, 0.776470588235294, 0.227450980392157, 0.0823529411764706), 1e-14); + expect(e.rectangle.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.929411764705882, 0.725490196078431, 0.00392156862745098, 0.364705882352941), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_material_stripe_oddColor')).toBeDefined(); + expect(e.rectangle.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.984313725490196, 0.831372549019608, 0.827450980392157, 0.925490196078431), 1e-14); + expect(e.rectangle.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.145098039215686, 0.0156862745098039, 0.380392156862745, 0.490196078431373), 1e-14); + expect(e = dataSource.entities.getById('sampled_rectangle_outlineColor_rgbaf')).toBeDefined(); + expect(e.rectangle.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.980392156862745, 0.466666666666667, 0.752941176470588, 0.709803921568627), 1e-14); + expect(e.rectangle.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.549019607843137, 0.949019607843137, 0.545098039215686, 0.380392156862745), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_solidColor_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.384313725490196, 0.964705882352941, 0.827450980392157, 0.815686274509804), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.00784313725490196, 0.325490196078431, 0.952941176470588, 0.0549019607843137), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_image')).toBeDefined(); + expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(new Cartesian2(13369, 38196)); + expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(new Cartesian2(36874, 55696)); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(1, 152, 139, 83)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(127, 110, 56, 69)); + expect(e = dataSource.entities.getById('sampled_wall_material_grid')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqual(Color.fromBytes(243, 153, 88, 43)); + expect(e.wall.material.color.getValue(documentStopDate)).toEqual(Color.fromBytes(169, 159, 82, 75)); + expect(e.wall.material.cellAlpha.getValue(documentStartDate)).toEqual(32179.0); + expect(e.wall.material.cellAlpha.getValue(documentStopDate)).toEqual(55901.0); + expect(e.wall.material.lineCount.getValue(documentStartDate)).toEqual(new Cartesian2(46941, 30391)); + expect(e.wall.material.lineCount.getValue(documentStopDate)).toEqual(new Cartesian2(51565, 6089)); + expect(e.wall.material.lineThickness.getValue(documentStartDate)).toEqual(new Cartesian2(35543, 16778)); + expect(e.wall.material.lineThickness.getValue(documentStopDate)).toEqual(new Cartesian2(32904, 18048)); + expect(e.wall.material.lineOffset.getValue(documentStartDate)).toEqual(new Cartesian2(2955, 19723)); + expect(e.wall.material.lineOffset.getValue(documentStopDate)).toEqual(new Cartesian2(58723, 15333)); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqual(Color.fromBytes(204, 233, 122, 70)); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqual(Color.fromBytes(215, 44, 132, 84)); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqual(Color.fromBytes(20, 6, 10, 253)); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqual(Color.fromBytes(96, 118, 90, 117)); + expect(e.wall.material.offset.getValue(documentStartDate)).toEqual(63629.0); + expect(e.wall.material.offset.getValue(documentStopDate)).toEqual(38486.0); + expect(e.wall.material.repeat.getValue(documentStartDate)).toEqual(41791.0); + expect(e.wall.material.repeat.getValue(documentStopDate)).toEqual(56258.0); + expect(e = dataSource.entities.getById('sampled_wall_material_image_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.584313725490196, 0.752941176470588, 0.588235294117647, 0.733333333333333), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.309803921568627, 0.988235294117647, 0.0784313725490196, 0.458823529411765), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_grid_color')).toBeDefined(); + expect(e.wall.material.color.getValue(documentStartDate)).toEqualEpsilon(new Color(0.27843137254902, 0.549019607843137, 0.964705882352941, 0.96078431372549), 1e-14); + expect(e.wall.material.color.getValue(documentStopDate)).toEqualEpsilon(new Color(0.709803921568627, 0.831372549019608, 0.67843137254902, 0.407843137254902), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe_evenColor')).toBeDefined(); + expect(e.wall.material.evenColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.0901960784313725, 0.243137254901961, 0.537254901960784, 0.168627450980392), 1e-14); + expect(e.wall.material.evenColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.388235294117647, 0.847058823529412, 0.258823529411765, 0.113725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_material_stripe_oddColor')).toBeDefined(); + expect(e.wall.material.oddColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.345098039215686, 0.0196078431372549, 0.0549019607843137, 0.662745098039216), 1e-14); + expect(e.wall.material.oddColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.694117647058824, 0.890196078431373, 0.380392156862745, 0.317647058823529), 1e-14); + expect(e = dataSource.entities.getById('sampled_wall_outlineColor_rgbaf')).toBeDefined(); + expect(e.wall.outlineColor.getValue(documentStartDate)).toEqualEpsilon(new Color(0.933333333333333, 0.105882352941176, 0.0627450980392157, 0.396078431372549), 1e-14); + expect(e.wall.outlineColor.getValue(documentStopDate)).toEqualEpsilon(new Color(0.901960784313726, 0.435294117647059, 0.352941176470588, 0.713725490196078), 1e-14); + expect(e = dataSource.entities.getById('sampled_conicSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_conicSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_customPatternSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_intersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_lateralSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_ellipsoidHorizonSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_domeSurfaceMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentOcclusionMaterial_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_rectangularSensor_environmentIntersectionColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_solidColor_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_image')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_grid')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_image_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_grid_color')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe_evenColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_material_stripe_oddColor')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_fan_outlineColor_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_color_rgbaf')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_unitSpherical')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_cartesian')).toBeDefined(); + expect(e = dataSource.entities.getById('sampled_vector_direction_unitCartesian')).toBeDefined(); }); }); }); diff --git a/Specs/DataSources/DataSourceClockSpec.js b/Specs/DataSources/DataSourceClockSpec.js index e957725cb1f1..3a40542bb5d9 100644 --- a/Specs/DataSources/DataSourceClockSpec.js +++ b/Specs/DataSources/DataSourceClockSpec.js @@ -89,4 +89,34 @@ defineSuite([ target.merge(undefined); }).toThrowDeveloperError(); }); + + it('gets value as a clock instance',function () { + var source = new DataSourceClock(); + source.startTime = JulianDate.now(); + source.stopTime = JulianDate.now(); + source.currentTime = JulianDate.now(); + source.clockRange = ClockRange.CLAMPED; + source.clockStep = ClockStep.TICK_DEPENDENT; + source.multiplier = 2; + + var clock = source.getValue(); + expect(clock.startTime).toEqual(source.startTime); + expect(clock.stopTime).toEqual(source.stopTime); + expect(clock.currentTime).toEqual(source.currentTime); + expect(clock.clockRange).toEqual(source.clockRange); + expect(clock.clockStep).toEqual(source.clockStep); + expect(clock.multiplier).toEqual(source.multiplier); + + source.multiplier = undefined; + source.clockStep = undefined; + source.clockRange = undefined; + + clock = source.getValue(); + expect(clock.startTime).toEqual(source.startTime); + expect(clock.stopTime).toEqual(source.stopTime); + expect(clock.currentTime).toEqual(source.currentTime); + expect(clock.clockRange).toEqual(ClockRange.UNBOUNDED); + expect(clock.clockStep).toEqual(ClockStep.SYSTEM_CLOCK_MULTIPLIER); + expect(clock.multiplier).toEqual(1.0); + }); }); diff --git a/Specs/DataSources/EntityClusterSpec.js b/Specs/DataSources/EntityClusterSpec.js index ea5d75ec066d..466323b543a4 100644 --- a/Specs/DataSources/EntityClusterSpec.js +++ b/Specs/DataSources/EntityClusterSpec.js @@ -13,7 +13,7 @@ defineSuite([ 'Scene/SceneTransforms', 'Specs/createCanvas', 'Specs/createGlobe', - 'Specs/createScene', + 'Specs/createScene' ], function( EntityCluster, Cartesian2, @@ -44,7 +44,9 @@ defineSuite([ tileProvider : { ready : true }, - _tileLoadQueue : {}, + _tileLoadQueueHigh : [], + _tileLoadQueueMedium : [], + _tileLoadQueueLow : [], _debug : { tilesWaitingForChildren : 0 } diff --git a/Specs/DataSources/KmlDataSourceSpec.js b/Specs/DataSources/KmlDataSourceSpec.js index 6047c568d1a1..5745748e366a 100644 --- a/Specs/DataSources/KmlDataSourceSpec.js +++ b/Specs/DataSources/KmlDataSourceSpec.js @@ -1014,6 +1014,23 @@ defineSuite([ }); }); + it('Styles: empty color', function() { + CesiumMath.setRandomNumberSeed(0); + + var kml = '\ + \ + \ + '; + + return KmlDataSource.load(parser.parseFromString(kml, "text/xml"), options).then(function(dataSource) { + expect(dataSource.entities.values[0].billboard.color).toBeUndefined(); + }); + }); + it('Styles: Applies expected styles to Point geometry', function() { var kml = '\ >includeStart('debug', pragmas.debug); + // Circular dependencies are only caught in debug builds. + it('throws if hierarchy has a circular dependency', function() { + // window0 -> door0 -> building0 -> window0 + var batchTableJson = { + HIERARCHY : { + instancesLength : 3, + classIds : [0, 1, 2], + parentIds : [1, 2, 0], + classes : [{ + name : 'window', + length : 1, + instances : { + window_name : ['window0'] + } + }, { + name : 'door', + length : 1, + instances : { + door_name : ['door0'] + } + }, { + name : 'building', + length : 1, + instances : { + building_name : ['building0'] + } + }] + } + }; + expect(function() { + return new Cesium3DTileBatchTable(mockContent, 3, batchTableJson); + }).toThrowDeveloperError(); + }); + + it('throws if hierarchy has a circular dependency (2)', function() { + // window0 -> door0 -> building0 -> window1 -> door0 + var batchTableJson = { + HIERARCHY : { + instancesLength : 4, + classIds : [0, 1, 2, 0], + parentIds : [1, 2, 3, 1], + classes : [{ + name : 'window', + length : 2, + instances : { + window_name : ['window0', 'window1'] + } + }, { + name : 'door', + length : 1, + instances : { + door_name : ['door0'] + } + }, { + name : 'building', + length : 1, + instances : { + building_name : ['building0'] + } + }] + } + }; + expect(function() { + return new Cesium3DTileBatchTable(mockContent, 4, batchTableJson); + }).toThrowDeveloperError(); + }); + //>>includeEnd('debug'); + + it('throws if an instance\'s parentId exceeds instancesLength', function() { + var batchTableJson = { + HIERARCHY : { + instancesLength : 2, + classIds : [0, 1], + parentIds : [1, 2], + classes : [{ + name : 'window', + length : 1, + instances : { + window_name : ['window0'] + } + }, { + name : 'door', + length : 1, + instances : { + door_name : ['door0'] + } + }] + } + }; + expect(function() { + return new Cesium3DTileBatchTable(mockContent, 2, batchTableJson); + }).toThrowDeveloperError(); + }); + it('destroys', function() { return Cesium3DTilesTester.loadTileset(scene, withoutBatchTableUrl).then(function(tileset) { var content = tileset._root.content; diff --git a/Specs/Scene/Cesium3DTileProviderSpec.js b/Specs/Scene/Cesium3DTileProviderSpec.js index 08fc6554c1c0..234cf1c9dd31 100644 --- a/Specs/Scene/Cesium3DTileProviderSpec.js +++ b/Specs/Scene/Cesium3DTileProviderSpec.js @@ -14,7 +14,7 @@ defineSuite([ return content.innerContents; }).toThrowDeveloperError(); expect(function() { - return content.hasProperty('height'); + return content.hasProperty(0, 'height'); }).toThrowDeveloperError(); expect(function() { return content.getFeature(0); diff --git a/Specs/Scene/Cesium3DTileSpec.js b/Specs/Scene/Cesium3DTileSpec.js index 3b94006d797e..806db5c39227 100644 --- a/Specs/Scene/Cesium3DTileSpec.js +++ b/Specs/Scene/Cesium3DTileSpec.js @@ -1,31 +1,33 @@ /*global defineSuite*/ defineSuite([ 'Scene/Cesium3DTile', - 'Scene/TileBoundingRegion', - 'Scene/TileOrientedBoundingBox', 'Core/Cartesian3', 'Core/clone', 'Core/defined', + 'Core/HeadingPitchRoll', 'Core/Math', 'Core/Matrix3', 'Core/Matrix4', 'Core/Rectangle', 'Core/SphereOutlineGeometry', 'Core/Transforms', + 'Scene/TileBoundingRegion', + 'Scene/TileOrientedBoundingBox', 'Specs/createScene' ], function( Cesium3DTile, - TileBoundingRegion, - TileOrientedBoundingBox, Cartesian3, clone, defined, + HeadingPitchRoll, CesiumMath, Matrix3, Matrix4, Rectangle, SphereOutlineGeometry, Transforms, + TileBoundingRegion, + TileOrientedBoundingBox, createScene) { 'use strict'; @@ -136,7 +138,8 @@ defineSuite([ function getTileTransform(longitude, latitude) { var transformCenter = Cartesian3.fromRadians(longitude, latitude, 0.0); - var transformMatrix = Transforms.headingPitchRollToFixedFrame(transformCenter, 0.0, 0.0, 0.0); + var hpr = new HeadingPitchRoll(); + var transformMatrix = Transforms.headingPitchRollToFixedFrame(transformCenter, hpr); return Matrix4.pack(transformMatrix, new Array(16)); } diff --git a/Specs/Scene/Cesium3DTileStyleSpec.js b/Specs/Scene/Cesium3DTileStyleSpec.js index 273ec01c8dff..c4d4d4adc206 100644 --- a/Specs/Scene/Cesium3DTileStyleSpec.js +++ b/Specs/Scene/Cesium3DTileStyleSpec.js @@ -281,7 +281,7 @@ defineSuite([ volume : '${Height} * ${Width} * ${Depth}' } }); - expect(style.meta.featureColor.evaluate(frameState, feature1)).toEqual(Color.fromBytes(38, 255, 82)); + expect(style.meta.featureColor.evaluateColor(frameState, feature1)).toEqual(Color.fromBytes(38, 255, 82)); expect(style.meta.volume.evaluate(frameState, feature1)).toEqual(20 * 20 * 100); }); @@ -324,7 +324,7 @@ defineSuite([ }); expect(style.show.evaluate(frameState, undefined)).toEqual(true); - expect(style.color.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(style.color.evaluateColor(frameState, undefined)).toEqual(Color.WHITE); expect(style.pointSize.evaluate(frameState, undefined)).toEqual(1.0); }); @@ -335,7 +335,7 @@ defineSuite([ expect(style.show.evaluate(frameState, feature1)).toEqual(true); expect(style.show.evaluate(frameState, feature2)).toEqual(false); - expect(style.color.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(style.color.evaluateColor(frameState, undefined)).toEqual(Color.WHITE); }); it('applies show style with regexp and variables', function() { @@ -345,7 +345,7 @@ defineSuite([ expect(style.show.evaluate(frameState, feature1)).toEqual(true); expect(style.show.evaluate(frameState, feature2)).toEqual(false); - expect(style.color.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(style.color.evaluateColor(frameState, undefined)).toEqual(Color.WHITE); }); it('applies show style with complex conditional', function() { @@ -388,8 +388,8 @@ defineSuite([ "color" : "(${Temperature} > 90) ? color('red') : color('white')" }); expect(style.show.evaluate(frameState, feature1)).toEqual(true); - expect(style.color.evaluate(frameState, feature1)).toEqual(Color.WHITE); - expect(style.color.evaluate(frameState, feature2)).toEqual(Color.RED); + expect(style.color.evaluateColor(frameState, feature1)).toEqual(Color.WHITE); + expect(style.color.evaluateColor(frameState, feature2)).toEqual(Color.RED); }); it('applies color style with new color', function() { @@ -397,8 +397,8 @@ defineSuite([ "color" : "rgba(${red}, ${green}, ${blue}, (${volume} > 100 ? 0.5 : 1.0))" }); expect(style.show.evaluate(frameState, feature1)).toEqual(true); - expect(style.color.evaluate(frameState, feature1)).toEqual(new Color(38/255, 255/255, 82/255, 0.5)); - expect(style.color.evaluate(frameState, feature2)).toEqual(new Color(255/255, 30/255, 30/255, 1.0)); + expect(style.color.evaluateColor(frameState, feature1)).toEqual(new Color(38/255, 255/255, 82/255, 0.5)); + expect(style.color.evaluateColor(frameState, feature2)).toEqual(new Color(255/255, 30/255, 30/255, 1.0)); }); it('applies color style that maps id to color', function() { @@ -413,8 +413,8 @@ defineSuite([ } }); expect(style.show.evaluate(frameState, feature1)).toEqual(true); - expect(style.color.evaluate(frameState, feature1)).toEqual(Color.RED); - expect(style.color.evaluate(frameState, feature2)).toEqual(Color.LIME); + expect(style.color.evaluateColor(frameState, feature1)).toEqual(Color.RED); + expect(style.color.evaluateColor(frameState, feature2)).toEqual(Color.LIME); }); it('applies color style with complex conditional', function() { @@ -432,8 +432,8 @@ defineSuite([ } }); expect(style.show.evaluate(frameState, feature1)).toEqual(true); - expect(style.color.evaluate(frameState, feature1)).toEqual(Color.BLUE); - expect(style.color.evaluate(frameState, feature2)).toEqual(Color.YELLOW); + expect(style.color.evaluateColor(frameState, feature1)).toEqual(Color.BLUE); + expect(style.color.evaluateColor(frameState, feature2)).toEqual(Color.YELLOW); }); it('applies color style with conditional', function() { @@ -450,8 +450,8 @@ defineSuite([ } }); expect(style.show.evaluate(frameState, feature1)).toEqual(true); - expect(style.color.evaluate(frameState, feature1)).toEqual(Color.BLUE); - expect(style.color.evaluate(frameState, feature2)).toEqual(Color.YELLOW); + expect(style.color.evaluateColor(frameState, feature1)).toEqual(Color.BLUE); + expect(style.color.evaluateColor(frameState, feature2)).toEqual(Color.YELLOW); }); it('applies pointSize style with variable', function() { diff --git a/Specs/Scene/Cesium3DTilesetSpec.js b/Specs/Scene/Cesium3DTilesetSpec.js index 9d4139bc8a5d..5137391f4c5d 100644 --- a/Specs/Scene/Cesium3DTilesetSpec.js +++ b/Specs/Scene/Cesium3DTilesetSpec.js @@ -7,6 +7,7 @@ defineSuite([ 'Core/HeadingPitchRange', 'Core/loadWithXhr', 'Core/Matrix4', + 'Core/PrimitiveType', 'Core/RequestScheduler', 'Renderer/ContextLimits', 'Scene/Cesium3DTile', @@ -27,6 +28,7 @@ defineSuite([ HeadingPitchRange, loadWithXhr, Matrix4, + PrimitiveType, RequestScheduler, ContextLimits, Cesium3DTile, @@ -151,7 +153,7 @@ defineSuite([ url : 'invalid' })); scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { + return tileset.readyPromise.then(function() { fail('should not resolve'); }).otherwise(function(error) { expect(tileset.ready).toEqual(false); @@ -171,8 +173,7 @@ defineSuite([ var tileset = scene.primitives.add(new Cesium3DTileset({ url : uri })); - scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { + return tileset.readyPromise.then(function() { fail('should not resolve'); }).otherwise(function(error) { expect(tileset.ready).toEqual(false); @@ -277,7 +278,7 @@ defineSuite([ expect(stats.numberOfPendingRequests).toEqual(4); expect(stats.numberProcessing).toEqual(0); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { expect(stats.numberOfPendingRequests).toEqual(0); expect(stats.numberProcessing).toEqual(0); @@ -317,23 +318,22 @@ defineSuite([ var tileset = scene.primitives.add(new Cesium3DTileset({ url : tilesetUrl })); - scene.renderForSpecs(); - return tileset.readyPromise.then(function(tileset) { - // Verify initial values - var stats = tileset._statistics; - expect(stats.visited).toEqual(0); - expect(stats.numberOfCommands).toEqual(0); - expect(stats.numberOfPendingRequests).toEqual(0); - expect(stats.numberProcessing).toEqual(0); - // Update and check that root tile is requested - scene.renderForSpecs(); + // Verify initial values + var stats = tileset._statistics; + expect(stats.visited).toEqual(0); + expect(stats.numberOfCommands).toEqual(0); + expect(stats.numberOfPendingRequests).toEqual(0); + expect(stats.numberProcessing).toEqual(0); + + return Cesium3DTilesTester.waitForReady(scene, tileset).then(function() { + // Check that root tile is requested expect(stats.visited).toEqual(0); expect(stats.numberOfCommands).toEqual(0); expect(stats.numberOfPendingRequests).toEqual(1); expect(stats.numberProcessing).toEqual(0); - // Update again and check that child tiles are now requested + // Update and check that child tiles are now requested scene.renderForSpecs(); expect(stats.visited).toEqual(1); // Root is visited expect(stats.numberOfCommands).toEqual(0); @@ -341,7 +341,7 @@ defineSuite([ expect(stats.numberProcessing).toEqual(0); // Wait for all tiles to load and check that they are all visited and rendered - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); expect(stats.numberOfCommands).toEqual(5); @@ -613,7 +613,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, child tiles aren't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { // Even though we are only looking at the lower-left tile, all child tiles are loaded scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Only visible tiles are visited - root and ll @@ -650,7 +650,7 @@ defineSuite([ expect(stats.visited).toEqual(1); // Visits root only, ll (lower-left child) isn't ready expect(stats.numberOfCommands).toEqual(1); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(1); // ll is the only visible child and is ready, so it replaces root @@ -661,7 +661,7 @@ defineSuite([ expect(stats.visited).toEqual(2); // Visits root and ll expect(stats.numberOfCommands).toEqual(2); // Now other children are visible but not ready. Render root and any visible ready children (only ll) - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.visited).toEqual(5); // Visits root and all children expect(stats.numberOfCommands).toEqual(4); // Renders children, root is replaced because all visible children are ready @@ -728,7 +728,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading grandchildren - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); // Render children }); @@ -754,14 +754,14 @@ defineSuite([ var root = tileset._root; expect(root.descendantsWithContent).toBeDefined(); expect(root.descendantsWithContent.length).toEqual(2); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(1); setZoom(5.0); // Zoom into the last tile, when it is ready the root is refinable scene.renderForSpecs(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(2); // Renders two content tiles }); @@ -796,7 +796,7 @@ defineSuite([ expect(stats.numberOfCommands).toEqual(1); // Render root expect(stats.numberOfPendingRequests).toEqual(4); // Loading child content tiles - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(root.selected).toEqual(false); expect(stats.numberOfCommands).toEqual(4); // Render child content tiles @@ -939,6 +939,27 @@ defineSuite([ }); }); + it('debugWireframe', function() { + return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { + viewRootOnly(); + tileset.debugWireframe = true; + scene.renderForSpecs(); + var commands = scene.frameState.commandList; + var length = commands.length; + var i; + for (i = 0; i < length; ++i) { + expect(commands[i].primitiveType).toEqual(PrimitiveType.LINES); + } + + tileset.debugWireframe = false; + scene.renderForSpecs(); + commands = scene.frameState.commandList; + for (i = 0; i < length; ++i) { + expect(commands[i].primitiveType).toEqual(PrimitiveType.TRIANGLES); + } + }); + }); + it('debugShowBoundingVolume', function() { return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { viewRootOnly(); @@ -1045,7 +1066,7 @@ defineSuite([ return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { tileset.loadProgress.addEventListener(spyUpdate); viewRootOnly(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(spyUpdate.calls.count()).toEqual(3); expect(spyUpdate.calls.allArgs()).toEqual(results); @@ -1053,6 +1074,36 @@ defineSuite([ }); }); + it('tilesLoaded', function() { + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + expect(tileset.tilesLoaded).toBe(false); + tileset.readyPromise.then(function() { + expect(tileset.tilesLoaded).toBe(false); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { + expect(tileset.tilesLoaded).toBe(true); + }); + }); + }); + + it('all tiles loaded event is raised', function() { + // Called first when only the root is visible and it becomes loaded, and then again when + // the rest of the tileset is visible and all tiles are loaded. + var spyUpdate = jasmine.createSpy('listener'); + viewRootOnly(); + var tileset = scene.primitives.add(new Cesium3DTileset({ + url : tilesetUrl + })); + tileset.allTilesLoaded.addEventListener(spyUpdate); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { + viewAllTiles(); + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { + expect(spyUpdate.calls.count()).toEqual(2); + }); + }); + }); + it('tile visible event is raised', function() { viewRootOnly(); return Cesium3DTilesTester.loadTileset(scene, tilesetUrl).then(function(tileset) { @@ -1546,7 +1597,7 @@ defineSuite([ // Zoom back in so all four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1578,7 +1629,7 @@ defineSuite([ // Zoom back in so the two children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); // Five loaded tiles @@ -1607,7 +1658,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1639,7 +1690,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(5); expect(stats.numberContentReady).toEqual(5); @@ -1671,7 +1722,7 @@ defineSuite([ // Reset camera so all tiles are reloaded viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(4); @@ -1708,7 +1759,7 @@ defineSuite([ // Zoom back in so the four children are re-requested. viewAllTiles(); - return Cesium3DTilesTester.waitForPendingRequests(scene, tileset).then(function() { + return Cesium3DTilesTester.waitForTilesLoaded(scene, tileset).then(function() { scene.renderForSpecs(); expect(stats.numberOfCommands).toEqual(4); expect(stats.numberContentReady).toEqual(5); diff --git a/Specs/Scene/ConditionsExpressionSpec.js b/Specs/Scene/ConditionsExpressionSpec.js index a8c9ac681ec9..4bc58500ff71 100644 --- a/Specs/Scene/ConditionsExpressionSpec.js +++ b/Specs/Scene/ConditionsExpressionSpec.js @@ -1,12 +1,12 @@ /*global defineSuite*/ defineSuite([ 'Scene/ConditionsExpression', - 'Scene/Expression', - 'Core/Color' + 'Core/Color', + 'Scene/Expression' ], function( ConditionsExpression, - Expression, - Color) { + Color, + Expression) { 'use strict'; var frameState = {}; @@ -81,16 +81,16 @@ defineSuite([ it('evaluates conditional', function() { var expression = new ConditionsExpression(jsonExp); - expect(expression.evaluate(frameState, new MockFeature(101))).toEqual(Color.BLUE); - expect(expression.evaluate(frameState, new MockFeature(52))).toEqual(Color.RED); - expect(expression.evaluate(frameState, new MockFeature(3))).toEqual(Color.LIME); + expect(expression.evaluateColor(frameState, new MockFeature(101))).toEqual(Color.BLUE); + expect(expression.evaluateColor(frameState, new MockFeature(52))).toEqual(Color.RED); + expect(expression.evaluateColor(frameState, new MockFeature(3))).toEqual(Color.LIME); }); it('evaluates conditional with multiple expressions', function() { var expression = new ConditionsExpression(jsonExpWithMultipleExpression); - expect(expression.evaluate(frameState, new MockFeature(101))).toEqual(Color.BLUE); - expect(expression.evaluate(frameState, new MockFeature(52))).toEqual(Color.LIME); - expect(expression.evaluate(frameState, new MockFeature(3))).toEqual(Color.LIME); + expect(expression.evaluateColor(frameState, new MockFeature(101))).toEqual(Color.BLUE); + expect(expression.evaluateColor(frameState, new MockFeature(52))).toEqual(Color.LIME); + expect(expression.evaluateColor(frameState, new MockFeature(3))).toEqual(Color.LIME); }); it('constructs and evaluates empty conditional', function() { @@ -113,15 +113,15 @@ defineSuite([ it('evaluates conditional with expression', function() { var expression = new ConditionsExpression(jsonExpWithExpression); - expect(expression.evaluate(frameState, new MockFeature(101))).toEqual(Color.BLUE); - expect(expression.evaluate(frameState, new MockFeature(52))).toEqual(Color.RED); - expect(expression.evaluate(frameState, new MockFeature(3))).toEqual(Color.LIME); + expect(expression.evaluateColor(frameState, new MockFeature(101))).toEqual(Color.BLUE); + expect(expression.evaluateColor(frameState, new MockFeature(52))).toEqual(Color.RED); + expect(expression.evaluateColor(frameState, new MockFeature(3))).toEqual(Color.LIME); }); it('evaluates undefined conditional expression', function() { var expression = new ConditionsExpression(jsonExpWithUndefinedExpression); expect(expression._expression).toEqual(undefined); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.BLUE); + expect(expression.evaluateColor(frameState, undefined)).toEqual(Color.BLUE); }); it('gets shader function', function() { diff --git a/Specs/Scene/DebugAppearanceSpec.js b/Specs/Scene/DebugAppearanceSpec.js index 229e31d72582..ce9f5d1cd096 100644 --- a/Specs/Scene/DebugAppearanceSpec.js +++ b/Specs/Scene/DebugAppearanceSpec.js @@ -8,7 +8,6 @@ defineSuite([ 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/VertexFormat', - 'Renderer/ClearCommand', 'Scene/Appearance', 'Scene/Primitive', 'Specs/createScene' @@ -21,7 +20,6 @@ defineSuite([ Rectangle, RectangleGeometry, VertexFormat, - ClearCommand, Appearance, Primitive, createScene) { diff --git a/Specs/Scene/DebugModelMatrixPrimitiveSpec.js b/Specs/Scene/DebugModelMatrixPrimitiveSpec.js index 8f95c8f24a4d..7210ab1fc002 100644 --- a/Specs/Scene/DebugModelMatrixPrimitiveSpec.js +++ b/Specs/Scene/DebugModelMatrixPrimitiveSpec.js @@ -1,13 +1,11 @@ /*global defineSuite*/ defineSuite([ 'Scene/DebugModelMatrixPrimitive', - 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Matrix4', 'Specs/createScene' ], function( DebugModelMatrixPrimitive, - Cartesian2, Cartesian3, Matrix4, createScene) { diff --git a/Specs/Scene/DiscardMissingTileImagePolicySpec.js b/Specs/Scene/DiscardMissingTileImagePolicySpec.js index 63857e64dcaa..bf1281142743 100644 --- a/Specs/Scene/DiscardMissingTileImagePolicySpec.js +++ b/Specs/Scene/DiscardMissingTileImagePolicySpec.js @@ -2,7 +2,6 @@ defineSuite([ 'Scene/DiscardMissingTileImagePolicy', 'Core/Cartesian2', - 'Core/defined', 'Core/loadImage', 'Core/loadWithXhr', 'Specs/pollToPromise', @@ -10,7 +9,6 @@ defineSuite([ ], function( DiscardMissingTileImagePolicy, Cartesian2, - defined, loadImage, loadWithXhr, pollToPromise, diff --git a/Specs/Scene/EllipsoidPrimitiveSpec.js b/Specs/Scene/EllipsoidPrimitiveSpec.js index 96431a7a6162..f0927d332a54 100644 --- a/Specs/Scene/EllipsoidPrimitiveSpec.js +++ b/Specs/Scene/EllipsoidPrimitiveSpec.js @@ -4,7 +4,6 @@ defineSuite([ 'Core/Cartesian3', 'Core/defined', 'Core/Matrix4', - 'Renderer/ClearCommand', 'Scene/Material', 'Specs/createScene' ], function( @@ -12,7 +11,6 @@ defineSuite([ Cartesian3, defined, Matrix4, - ClearCommand, Material, createScene) { 'use strict'; @@ -57,7 +55,7 @@ defineSuite([ var e = new EllipsoidPrimitive({ center : new Cartesian3(1.0, 2.0, 3.0), radii : new Cartesian3(4.0, 5.0, 6.0), - modelMatrix : Matrix4.fromScale(2.0), + modelMatrix : Matrix4.fromUniformScale(2.0), show : false, material : material, id : 'id', @@ -66,7 +64,7 @@ defineSuite([ expect(e.center).toEqual(new Cartesian3(1.0, 2.0, 3.0)); expect(e.radii).toEqual(new Cartesian3(4.0, 5.0, 6.0)); - expect(e.modelMatrix).toEqual(Matrix4.fromScale(2.0)); + expect(e.modelMatrix).toEqual(Matrix4.fromUniformScale(2.0)); expect(e.show).toEqual(false); expect(e.material).toBe(material); expect(e.id).toEqual('id'); diff --git a/Specs/Scene/EllipsoidSurfaceAppearanceSpec.js b/Specs/Scene/EllipsoidSurfaceAppearanceSpec.js index 1919c32b5dc3..eb3815022919 100644 --- a/Specs/Scene/EllipsoidSurfaceAppearanceSpec.js +++ b/Specs/Scene/EllipsoidSurfaceAppearanceSpec.js @@ -5,7 +5,6 @@ defineSuite([ 'Core/GeometryInstance', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Renderer/ClearCommand', 'Scene/Appearance', 'Scene/Material', 'Scene/Primitive', @@ -16,7 +15,6 @@ defineSuite([ GeometryInstance, Rectangle, RectangleGeometry, - ClearCommand, Appearance, Material, Primitive, diff --git a/Specs/Scene/ExpressionSpec.js b/Specs/Scene/ExpressionSpec.js index 3bc68400eee0..0517f2425970 100644 --- a/Specs/Scene/ExpressionSpec.js +++ b/Specs/Scene/ExpressionSpec.js @@ -1,18 +1,28 @@ /*global defineSuite*/ defineSuite([ 'Scene/Expression', - 'Scene/ExpressionNodeType', - 'Core/Color' + 'Core/Cartesian2', + 'Core/Cartesian3', + 'Core/Cartesian4', + 'Core/Color', + 'Core/Math', + 'Scene/ExpressionNodeType' ], function( Expression, - ExpressionNodeType, - Color) { + Cartesian2, + Cartesian3, + Cartesian4, + Color, + CesiumMath, + ExpressionNodeType) { 'use strict'; var frameState = {}; function MockFeature() { this._properties = {}; + this._className = undefined; + this._inheritedClassName = undefined; this._content = { _tileset : { timeSinceLoad : 0.0 @@ -28,6 +38,26 @@ defineSuite([ return this._properties[name]; }; + MockFeature.prototype.setClass = function(className) { + this._className = className; + }; + + MockFeature.prototype.setInheritedClass = function(className) { + this._inheritedClassName = className; + }; + + MockFeature.prototype.isExactClass = function(className) { + return this._className === className; + }; + + MockFeature.prototype.isClass = function(className) { + return (this._className === className) || (this._inheritedClassName === className); + }; + + MockFeature.prototype.getExactClassName = function() { + return this._className; + }; + it('parses backslashes', function() { var expression = new Expression('"\\he\\\\\\ll\\\\o"'); expect(expression.evaluate(frameState, undefined)).toEqual('\\he\\\\\\ll\\\\o'); @@ -39,7 +69,7 @@ defineSuite([ feature.addProperty('width', 5); feature.addProperty('string', 'hello'); feature.addProperty('boolean', true); - feature.addProperty('color', Color.RED); + feature.addProperty('vector', Cartesian3.UNIT_X); feature.addProperty('null', null); feature.addProperty('undefined', undefined); @@ -73,11 +103,11 @@ defineSuite([ expression = new Expression('\'${boolean}\''); expect(expression.evaluate(frameState, feature)).toEqual('true'); - expression = new Expression('${color}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.RED); + expression = new Expression('${vector}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian3.UNIT_X); - expression = new Expression('\'${color}\''); - expect(expression.evaluate(frameState, feature)).toEqual(Color.RED.toString()); + expression = new Expression('\'${vector}\''); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian3.UNIT_X.toString()); expression = new Expression('${null}'); expect(expression.evaluate(frameState, feature)).toEqual(null); @@ -264,52 +294,52 @@ defineSuite([ it('evaluates literal color', function() { var expression = new Expression('color(\'#ffffff\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(\'#00FFFF\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.CYAN); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.CYAN)); expression = new Expression('color(\'#fff\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(\'#0FF\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.CYAN); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.CYAN)); expression = new Expression('color(\'white\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(\'cyan\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.CYAN); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.CYAN)); expression = new Expression('color(\'white\', 0.5)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Color(1.0, 1.0, 1.0, 0.5)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromAlpha(Color.WHITE, 0.5))); expression = new Expression('rgb(255, 255, 255)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('rgb(100, 255, 190)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.fromBytes(100, 255, 190)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromBytes(100, 255, 190))); expression = new Expression('hsl(0, 0, 1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('hsl(1.0, 0.6, 0.7)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.fromHsl(1.0, 0.6, 0.7)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromHsl(1.0, 0.6, 0.7))); expression = new Expression('rgba(255, 255, 255, 0.5)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Color(1.0, 1.0, 1.0, 0.5)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromAlpha(Color.WHITE, 0.5))); expression = new Expression('rgba(100, 255, 190, 0.25)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.fromBytes(100, 255, 190, 0.25 * 255)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromBytes(100, 255, 190, 0.25 * 255))); expression = new Expression('hsla(0, 0, 1, 0.5)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Color(1.0, 1.0, 1.0, 0.5)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(new Color(1.0, 1.0, 1.0, 0.5))); expression = new Expression('hsla(1.0, 0.6, 0.7, 0.75)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.fromHsl(1.0, 0.6, 0.7, 0.75)); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.fromHsl(1.0, 0.6, 0.7, 0.75))); expression = new Expression('color()'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); }); it('evaluates literal color with result parameter', function() { @@ -360,19 +390,19 @@ defineSuite([ feature.addProperty('alpha', 0.2); var expression = new Expression('color(${hex6})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(${hex3})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(${keyword})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('color(${keyword}, ${alpha} + 0.6)'); - expect(expression.evaluate(frameState, feature).red).toEqual(1.0); - expect(expression.evaluate(frameState, feature).green).toEqual(1.0); - expect(expression.evaluate(frameState, feature).blue).toEqual(1.0); - expect(expression.evaluate(frameState, feature).alpha).toEqual(0.8); + expect(expression.evaluate(frameState, feature).x).toEqual(1.0); + expect(expression.evaluate(frameState, feature).y).toEqual(1.0); + expect(expression.evaluate(frameState, feature).z).toEqual(1.0); + expect(expression.evaluate(frameState, feature).w).toEqual(0.8); }); it('evaluates rgb with expressions as arguments', function() { @@ -382,10 +412,10 @@ defineSuite([ feature.addProperty('blue', 255); var expression = new Expression('rgb(${red}, ${green}, ${blue})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(100, 200, 255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(100, 200, 255))); expression = new Expression('rgb(${red}/2, ${green}/2, ${blue})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(50, 100, 255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(50, 100, 255))); }); it('evaluates hsl with expressions as arguments', function() { @@ -395,10 +425,10 @@ defineSuite([ feature.addProperty('l', 1.0); var expression = new Expression('hsl(${h}, ${s}, ${l})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('hsl(${h} + 0.2, ${s} + 1.0, ${l} - 0.5)'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromHsl(0.2, 1.0, 0.5)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromHsl(0.2, 1.0, 0.5))); }); it('evaluates rgba with expressions as arguments', function() { @@ -409,10 +439,10 @@ defineSuite([ feature.addProperty('a', 0.3); var expression = new Expression('rgba(${red}, ${green}, ${blue}, ${a})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(100, 200, 255, 0.3*255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(100, 200, 255, 0.3*255))); expression = new Expression('rgba(${red}/2, ${green}/2, ${blue}, ${a} * 2)'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(50, 100, 255, 0.6*255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(50, 100, 255, 0.6*255))); }); it('evaluates hsla with expressions as arguments', function() { @@ -423,10 +453,10 @@ defineSuite([ feature.addProperty('a', 1.0); var expression = new Expression('hsla(${h}, ${s}, ${l}, ${a})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.WHITE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.WHITE)); expression = new Expression('hsla(${h} + 0.2, ${s} + 1.0, ${l} - 0.5, ${a} / 4)'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromHsl(0.2, 1.0, 0.5, 0.25)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromHsl(0.2, 1.0, 0.5, 0.25))); }); it('evaluates rgba with expressions as arguments', function() { @@ -437,10 +467,10 @@ defineSuite([ feature.addProperty('alpha', 0.5); var expression = new Expression('rgba(${red}, ${green}, ${blue}, ${alpha})'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(100, 200, 255, 0.5 * 255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(100, 200, 255, 0.5 * 255))); expression = new Expression('rgba(${red}/2, ${green}/2, ${blue}, ${alpha} + 0.1)'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.fromBytes(50, 100, 255, 0.6 * 255)); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.fromColor(Color.fromBytes(50, 100, 255, 0.6 * 255))); }); it('color constructors throw with wrong number of arguments', function() { @@ -461,20 +491,268 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('evaluates color properties', function() { - var expression = new Expression('color(\'#ffffff\').red'); + it('evaluates color properties (r, g, b, a)', function() { + var expression = new Expression('color(\'#ffffff\').r'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0).g'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan").b'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5).a'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties (x, y, z, w)', function() { + var expression = new Expression('color(\'#ffffff\').x'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0).y'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan").z'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5).w'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties ([0], [1], [2]. [3])', function() { + var expression = new Expression('color(\'#ffffff\')[0]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0)[1]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan")[2]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5)[3]'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties (["r"], ["g"], ["b"], ["a"])', function() { + var expression = new Expression('color(\'#ffffff\')["r"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgb(255, 255, 0)["g"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('color("cyan")["b"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('rgba(255, 255, 0, 0.5)["a"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.5); + }); + + it('evaluates color properties (["x"], ["y"], ["z"], ["w"])', function() { + var expression = new Expression('color(\'#ffffff\')["x"]'); expect(expression.evaluate(frameState, undefined)).toEqual(1); - expression = new Expression('rgb(255, 255, 0).green'); + expression = new Expression('rgb(255, 255, 0)["y"]'); expect(expression.evaluate(frameState, undefined)).toEqual(1); - expression = new Expression('color("cyan").blue'); + expression = new Expression('color("cyan")["z"]'); expect(expression.evaluate(frameState, undefined)).toEqual(1); - expression = new Expression('rgba(255, 255, 0, 0.5).alpha'); + expression = new Expression('rgba(255, 255, 0, 0.5)["w"]'); expect(expression.evaluate(frameState, undefined)).toEqual(0.5); }); + it('evaluates vec2', function() { + var expression = new Expression('vec2(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(2.0, 2.0)); + + expression = new Expression('vec2(3.0, 4.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec2(3.0, 4.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec3(3.0, 4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + + expression = new Expression('vec2(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3.0, 4.0)); + }); + + it('throws if vec2 has invalid number of arguments', function() { + var expression = new Expression('vec2()'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec2(3.0, 4.0, 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec2(vec2(3.0, 4.0), 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates vec3', function() { + var expression = new Expression('vec3(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(2.0, 2.0, 2.0)); + + expression = new Expression('vec3(3.0, 4.0, 5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec2(3.0, 4.0), 5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(3.0, vec2(4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec3(3.0, 4.0, 5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + + expression = new Expression('vec3(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3.0, 4.0, 5.0)); + }); + + it ('throws if vec3 has invalid number of arguments', function() { + var expression = new Expression('vec3()'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(3.0, 4.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(3.0, 4.0, 5.0, 6.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(vec2(3.0, 4.0), vec2(5.0, 6.0))'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec3(vec4(3.0, 4.0, 5.0, 6.0), 1.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates vec4', function() { + var expression = new Expression('vec4(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 2.0, 2.0)); + + expression = new Expression('vec4(3.0, 4.0, 5.0, 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(vec2(3.0, 4.0), 5.0, 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(3.0, vec2(4.0, 5.0), 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(3.0, 4.0, vec2(5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(vec3(3.0, 4.0, 5.0), 6.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(3.0, vec3(4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + + expression = new Expression('vec4(vec4(3.0, 4.0, 5.0, 6.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3.0, 4.0, 5.0, 6.0)); + }); + + it ('throws if vec4 has invalid number of arguments', function() { + var expression = new Expression('vec4()'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(3.0, 4.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(3.0, 4.0, 5.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(3.0, 4.0, 5.0, 6.0, 7.0)'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('vec4(vec3(3.0, 4.0, 5.0))'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates vector with expressions as arguments', function() { + var feature = new MockFeature(); + feature.addProperty('height', 2); + feature.addProperty('width', 4); + feature.addProperty('depth', 3); + feature.addProperty('scale', 1); + + var expression = new Expression('vec4(${height}, ${width}, ${depth}, ${scale})'); + expect(expression.evaluate(frameState, feature)).toEqual(new Cartesian4(2.0, 4.0, 3.0, 1.0)); + }); + + it('evaluates expression with multiple nested vectors', function() { + var expression = new Expression('vec4(vec2(1, 2)[vec3(6, 1, 5).y], 2, vec4(1.0).w, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 2.0, 1.0, 5.0)); + }); + + it('evaluates vector properties (x, y, z, w)', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).x'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).y'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).z'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0).w'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + + it('evaluates vector properties ([0], [1], [2], [3])', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[0]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[1]'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[2]'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)[3]'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + + it('evaluates vector properties (["x"], ["y"], ["z"]. ["w"])', function() { + var expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["x"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["y"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["z"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(3.0); + + expression = new Expression('vec4(1.0, 2.0, 3.0, 4.0)["w"]'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + }); + it('evaluates unary not', function() { var expression = new Expression('!true'); expect(expression.evaluate(frameState, undefined)).toEqual(false); @@ -700,184 +978,969 @@ defineSuite([ }).toThrowDeveloperError(); }); - it('evaluates logical or', function() { - var expression = new Expression('false || false'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + it('evaluates logical or', function() { + var expression = new Expression('false || false'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('false || true'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('true || true'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + }); + + it('throws with invalid or operands', function() { + var expression = new Expression('2 || false'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + + expression = new Expression('false || color(\'red\')'); + expect(function() { + expression.evaluate(frameState, undefined); + }).toThrowDeveloperError(); + }); + + it('evaluates color operations', function() { + var expression = new Expression('+rgba(255, 0, 0, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.RED)); + + expression = new Expression('rgba(255, 0, 0, 0.5) + rgba(0, 0, 255, 0.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.MAGENTA)); + + expression = new Expression('rgba(0, 255, 255, 1.0) - rgba(0, 255, 0, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.BLUE)); + + expression = new Expression('rgba(255, 255, 255, 1.0) * rgba(255, 0, 0, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.RED)); + + expression = new Expression('rgba(255, 255, 0, 1.0) * 1.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.YELLOW)); + + expression = new Expression('1 * rgba(255, 255, 0, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.YELLOW)); + + expression = new Expression('rgba(255, 255, 255, 1.0) / rgba(255, 255, 255, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(Color.WHITE)); + + expression = new Expression('rgba(255, 255, 255, 1.0) / 2'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(new Color(0.5, 0.5, 0.5, 0.5))); + + expression = new Expression('rgba(255, 255, 255, 1.0) % rgba(255, 255, 255, 1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Cartesian4.fromColor(new Color(0, 0, 0, 0))); + + expression = new Expression('color(\'green\') == color(\'green\')'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('color() == color()'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('!!color() == true'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('color(\'green\') != color(\'green\')'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('color(\'green\') !== color(\'green\')'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + }); + + it('evaluates vector operations', function() { + var expression = new Expression('+vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(1, 2)); + + expression = new Expression('+vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(1, 2, 3)); + + expression = new Expression('+vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1, 2, 3, 4)); + + expression = new Expression('-vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(-1, -2)); + + expression = new Expression('-vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(-1, -2, -3)); + + expression = new Expression('-vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-1, -2, -3, -4)); + + expression = new Expression('vec2(1, 2) + vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(4, 6)); + + expression = new Expression('vec3(1, 2, 3) + vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(4, 6, 8)); + + expression = new Expression('vec4(1, 2, 3, 4) + vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(4, 6, 8, 10)); + + expression = new Expression('vec2(1, 2) - vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(-2, -2)); + + expression = new Expression('vec3(1, 2, 3) - vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(-2, -2, -2)); + + expression = new Expression('vec4(1, 2, 3, 4) - vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(-2, -2, -2, -2)); + + expression = new Expression('vec2(1, 2) * vec2(3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 8)); + + expression = new Expression('vec2(1, 2) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 6)); + + expression = new Expression('3.0 * vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(3, 6)); + + expression = new Expression('vec3(1, 2, 3) * vec3(3, 4, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 8, 15)); + + expression = new Expression('vec3(1, 2, 3) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 6, 9)); + + expression = new Expression('3.0 * vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(3, 6, 9)); + + expression = new Expression('vec4(1, 2, 3, 4) * vec4(3, 4, 5, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 8, 15, 24)); + + expression = new Expression('vec4(1, 2, 3, 4) * 3.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 12)); + + expression = new Expression('3.0 * vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(3, 6, 9, 12)); + + expression = new Expression('vec2(1, 2) / vec2(2, 5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.5, 0.4)); + + expression = new Expression('vec2(1, 2) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.5, 1.0)); + + expression = new Expression('vec3(1, 2, 3) / vec3(2, 5, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.5, 0.4, 1.0)); + + expression = new Expression('vec3(1, 2, 3) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.5, 1.0, 1.5)); + + expression = new Expression('vec4(1, 2, 3, 4) / vec4(2, 5, 3, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 0.4, 1.0, 2.0)); + + expression = new Expression('vec4(1, 2, 3, 4) / 2.0'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.5, 1.0, 1.5, 2.0)); + + expression = new Expression('vec2(2, 3) % vec2(3, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(2, 0)); + + expression = new Expression('vec3(2, 3, 4) % vec3(3, 3, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(2, 0, 1)); + + expression = new Expression('vec4(2, 3, 4, 5) % vec4(3, 3, 3, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2, 0, 1, 1)); + + expression = new Expression('vec2(1, 3) == vec2(1, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec3(1, 3, 4) == vec3(1, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec4(1, 3, 4, 6) == vec4(1, 3, 4, 6)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec2(1, 2) === vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec3(1, 2, 3) === vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec4(1, 2, 3, 4) === vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('!!vec4(1.0) == true'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('vec2(1, 2) != vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec3(1, 2, 3) != vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec4(1, 2, 3, 4) != vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec2(1, 2) !== vec2(1, 2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec3(1, 2, 3) !== vec3(1, 2, 3)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('vec4(1, 2, 3, 4) !== vec4(1, 2, 3, 4)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + }); + + it('evaluates color toString function', function() { + var expression = new Expression('color("red").toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 0, 0, 1)'); + + expression = new Expression('rgba(0, 0, 255, 0.5).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(0, 0, 1, 0.5)'); + }); + + it('evaluates vector toString function', function() { + var feature = new MockFeature(); + feature.addProperty('property', new Cartesian4(1, 2, 3, 4)); + + var expression = new Expression('vec2(1, 2).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2)'); + + expression = new Expression('vec3(1, 2, 3).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2, 3)'); + + expression = new Expression('vec4(1, 2, 3, 4).toString()'); + expect(expression.evaluate(frameState, undefined)).toEqual('(1, 2, 3, 4)'); + + expression = new Expression('${property}.toString()'); + expect(expression.evaluate(frameState, feature)).toEqual('(1, 2, 3, 4)'); + }); + + it('evaluates isNaN function', function() { + var expression = new Expression('isNaN()'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isNaN(NaN)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isNaN(1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isNaN(Infinity)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isNaN(null)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isNaN(true)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isNaN("hello")'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isNaN(color("white"))'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + }); + + it('evaluates isFinite function', function() { + var expression = new Expression('isFinite()'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isFinite(NaN)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isFinite(1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isFinite(Infinity)'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isFinite(null)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isFinite(true)'); + expect(expression.evaluate(frameState, undefined)).toEqual(true); + + expression = new Expression('isFinite("hello")'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + + expression = new Expression('isFinite(color("white"))'); + expect(expression.evaluate(frameState, undefined)).toEqual(false); + }); + + it('evaluates isExactClass function', function() { + var feature = new MockFeature(); + feature.setClass('door'); + + var expression = new Expression('isExactClass("door")'); + expect(expression.evaluate(frameState, feature)).toEqual(true); + + expression = new Expression('isExactClass("roof")'); + expect(expression.evaluate(frameState, feature)).toEqual(false); + }); + + it('throws if isExactClass takes an invalid number of arguments', function() { + expect(function() { + return new Expression('isExactClass()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('isExactClass("door", "roof")'); + }).toThrowDeveloperError(); + }); + + it('evaluates isClass function', function() { + var feature = new MockFeature(); + + feature.setClass('door'); + feature.setInheritedClass('building'); + + var expression = new Expression('isClass("door") && isClass("building")'); + expect(expression.evaluate(frameState, feature)).toEqual(true); + }); + + it('throws if isClass takes an invalid number of arguments', function() { + expect(function() { + return new Expression('isClass()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('isClass("door", "building")'); + }).toThrowDeveloperError(); + }); + + it('evaluates getExactClassName function', function() { + var feature = new MockFeature(); + feature.setClass('door'); + var expression = new Expression('getExactClassName()'); + expect(expression.evaluate(frameState, feature)).toEqual('door'); + }); + + it('throws if getExactClassName takes an invalid number of arguments', function() { + expect(function() { + return new Expression('getExactClassName("door")'); + }).toThrowDeveloperError(); + }); + + it('evaluates abs function', function() { + var expression = new Expression('abs(-1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('abs(1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('abs(vec2(-1.0, 1.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(1.0, 1.0)); + + expression = new Expression('abs(vec3(-1.0, 1.0, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(1.0, 1.0, 0.0)); + + expression = new Expression('abs(vec4(-1.0, 1.0, 0.0, -1.2))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 1.0, 0.0, 1.2)); + }); + + it('throws if abs function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('abs()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('abs(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates cos function', function() { + var expression = new Expression('cos(0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('cos(vec2(0, PI))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(1.0, -1.0), CesiumMath.EPSILON7); + + expression = new Expression('cos(vec3(0, PI, -PI)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(1.0, -1.0, -1.0), CesiumMath.EPSILON7); + + expression = new Expression('cos(vec4(0, PI, -PI, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(1.0, -1.0, -1.0, 1.0), CesiumMath.EPSILON7); + }); + + it('throws if cos function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('cos()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('cos(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates sin function', function() { + var expression = new Expression('sin(0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('sin(vec2(0, PI/2))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(0.0, 1.0), CesiumMath.EPSILON7); + + expression = new Expression('sin(vec3(0, PI/2, -PI/2)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(0.0, 1.0, -1.0), CesiumMath.EPSILON7); + + expression = new Expression('sin(vec4(0, PI/2, -PI/2, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(0.0, 1.0, -1.0, 0.0), CesiumMath.EPSILON7); + }); + + it('throws if sin function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('sin()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('sin(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates tan function', function() { + var expression = new Expression('tan(0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('tan(vec2(0, PI/4))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(0.0, 1.0), CesiumMath.EPSILON7); + + expression = new Expression('tan(vec3(0, PI/4, PI)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(0.0, 1.0, 0.0), CesiumMath.EPSILON7); + + expression = new Expression('tan(vec4(0, PI/4, PI, -PI/4)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(0.0, 1.0, 0.0, -1.0), CesiumMath.EPSILON7); + }); + + it('throws if tan function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('tan()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('tan(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates acos function', function() { + var expression = new Expression('acos(1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('acos(vec2(1, 0))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(0.0, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + + expression = new Expression('acos(vec3(1, 0, 1)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(0.0, CesiumMath.PI_OVER_TWO, 0.0, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + + expression = new Expression('acos(vec4(1, 0, 1, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(0.0, CesiumMath.PI_OVER_TWO, 0.0, CesiumMath.PI_OVER_TWO, 0.0), CesiumMath.EPSILON7); + }); + + it('throws if acos function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('acos()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('acos(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates asin function', function() { + var expression = new Expression('asin(0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('asin(vec2(0, 1))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(0.0, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + + expression = new Expression('asin(vec3(0, 1, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(0.0, CesiumMath.PI_OVER_TWO, 0.0, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + + expression = new Expression('asin(vec4(0, 1, 0, 1)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(0.0, CesiumMath.PI_OVER_TWO, 0.0, CesiumMath.PI_OVER_TWO, 0.0), CesiumMath.EPSILON7); + }); + + it('throws if asin function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('asin()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('asin(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates atan function', function() { + var expression = new Expression('atan(0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('atan(vec2(0, 1))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(0.0, CesiumMath.PI_OVER_FOUR), CesiumMath.EPSILON7); + + expression = new Expression('atan(vec3(0, 1, 0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(0.0, CesiumMath.PI_OVER_FOUR, 0.0, CesiumMath.PI_OVER_FOUR), CesiumMath.EPSILON7); + + expression = new Expression('atan(vec4(0, 1, 0, 1)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(0.0, CesiumMath.PI_OVER_FOUR, 0.0, CesiumMath.PI_OVER_FOUR, 0.0), CesiumMath.EPSILON7); + }); + + it('throws if atan function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('atan()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('atan(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates radians function', function() { + var expression = new Expression('radians(180)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(Math.PI, CesiumMath.EPSILON10); + + expression = new Expression('radians(vec2(180, 90))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(Math.PI, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + + expression = new Expression('radians(vec3(180, 90, 180))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(Math.PI, CesiumMath.PI_OVER_TWO, Math.PI), CesiumMath.EPSILON7); + + expression = new Expression('radians(vec4(180, 90, 180, 90)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(Math.PI, CesiumMath.PI_OVER_TWO, Math.PI, CesiumMath.PI_OVER_TWO), CesiumMath.EPSILON7); + }); + + it('throws if radians function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('radians()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('radians(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates degrees function', function() { + var expression = new Expression('degrees(2 * PI)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(360, CesiumMath.EPSILON10); + + expression = new Expression('degrees(vec2(2 * PI, PI))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian2(360, 180), CesiumMath.EPSILON7); + + expression = new Expression('degrees(vec3(2 * PI, PI, 2 * PI))'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian3(360, 180, 360), CesiumMath.EPSILON7); + + expression = new Expression('degrees(vec4(2 * PI, PI, 2 * PI, PI)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(new Cartesian4(360, 180, 360, 180), CesiumMath.EPSILON7); + }); + + it('throws if degrees function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('degrees()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('degrees(1, 2)'); + }); + }); + + it('evaluates sqrt function', function() { + var expression = new Expression('sqrt(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('sqrt(4.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('sqrt(-1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(NaN); + + expression = new Expression('sqrt(vec2(1.0, 4.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(1.0, 2.0)); + + expression = new Expression('sqrt(vec3(1.0, 4.0, 9.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(1.0, 2.0, 3.0)); + + expression = new Expression('sqrt(vec4(1.0, 4.0, 9.0, 16.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, 2.0, 3.0, 4.0)); + }); + + it('throws if sqrt function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('sqrt()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('sqrt(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates sign function', function() { + var expression = new Expression('sign(5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('sign(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); + + expression = new Expression('sign(-5.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(-1.0); + + expression = new Expression('sign(vec2(5.0, -5.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(1.0, -1.0)); + + expression = new Expression('sign(vec3(5.0, -5.0, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(1.0, -1.0, 0.0)); + + expression = new Expression('sign(vec4(5.0, -5.0, 0.0, 1.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(1.0, -1.0, 0.0, 1.0)); + }); + + it('throws if sign function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('sign()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('sign(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates floor function', function() { + var expression = new Expression('floor(5.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(5.0); + + expression = new Expression('floor(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); + + expression = new Expression('floor(-1.2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(-2.0); + + expression = new Expression('floor(vec2(5.5, -1.2))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(5.0, -2.0)); + + expression = new Expression('floor(vec3(5.5, -1.2, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(5.0, -2.0, 0.0)); + + expression = new Expression('floor(vec4(5.5, -1.2, 0.0, -2.9))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(5.0, -2.0, 0.0, -3.0)); + }); + + it('throws if floor function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('floor()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('floor(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates ceil function', function() { + var expression = new Expression('ceil(5.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(6.0); + + expression = new Expression('ceil(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); + + expression = new Expression('ceil(-1.2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(-1.0); + + expression = new Expression('ceil(vec2(5.5, -1.2))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(6.0, -1.0)); + + expression = new Expression('ceil(vec3(5.5, -1.2, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(6.0, -1.0, 0.0)); + + expression = new Expression('ceil(vec4(5.5, -1.2, 0.0, -2.9))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(6.0, -1.0, 0.0, -2.0)); + }); + + it('throws if ceil function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('ceil()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('ceil(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates round function', function() { + var expression = new Expression('round(5.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(6); + + expression = new Expression('round(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0); + + expression = new Expression('round(1.2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1); + + expression = new Expression('round(vec2(5.5, -1.2))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(6.0, -1.0)); + + expression = new Expression('round(vec3(5.5, -1.2, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(6.0, -1.0, 0.0)); + + expression = new Expression('round(vec4(5.5, -1.2, 0.0, -2.9))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(6.0, -1.0, 0.0, -3.0)); + }); + + it('throws if round function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('round()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('round(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates exp function', function() { + var expression = new Expression('exp(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(Math.E); + + expression = new Expression('exp(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('exp(vec2(1.0, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(Math.E, 1.0)); + + expression = new Expression('exp(vec3(1.0, 0.0, 1.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(Math.E, 1.0, Math.E)); + + expression = new Expression('exp(vec4(1.0, 0.0, 1.0, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(Math.E, 1.0, Math.E, 1.0)); + }); + + it('throws if exp function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('exp()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('exp(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates exp2 function', function() { + var expression = new Expression('exp2(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); + + expression = new Expression('exp2(0.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); + + expression = new Expression('exp2(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(4.0); + + expression = new Expression('exp2(vec2(1.0, 0.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(2.0, 1.0)); + + expression = new Expression('exp2(vec3(1.0, 0.0, 2.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(2.0, 1.0, 4.0)); + + expression = new Expression('exp2(vec4(1.0, 0.0, 2.0, 3.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(2.0, 1.0, 4.0, 8.0)); + }); + + it('throws if exp2 function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('exp2()'); + }).toThrowDeveloperError(); + + expect(function() { + return new Expression('exp2(1, 2)'); + }).toThrowDeveloperError(); + }); + + it('evaluates log function', function() { + var expression = new Expression('log(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); + + expression = new Expression('log(10.0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(2.302585092994046, CesiumMath.EPSILON7); - expression = new Expression('false || true'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('log(vec2(1.0, E))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.0, 1.0)); - expression = new Expression('true || true'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('log(vec3(1.0, E, 1.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.0, 1.0, 0.0)); + + expression = new Expression('log(vec4(1.0, E, 1.0, E))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 1.0, 0.0, 1.0)); }); - it('throws with invalid or operands', function() { - var expression = new Expression('2 || false'); + it('throws if log function takes an invalid number of arguments', function() { expect(function() { - expression.evaluate(frameState, undefined); + return new Expression('log()'); }).toThrowDeveloperError(); - expression = new Expression('false || color(\'red\')'); expect(function() { - expression.evaluate(frameState, undefined); + return new Expression('log(1, 2)'); }).toThrowDeveloperError(); }); - it('evaluates color operations', function() { - var expression = new Expression('rgba(255, 0, 0, 0.5) + rgba(0, 0, 255, 0.5)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.MAGENTA); + it('evaluates log2 function', function() { + var expression = new Expression('log2(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); - expression = new Expression('rgba(0, 255, 255, 1.0) - rgba(0, 255, 0, 0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.BLUE); + expression = new Expression('log2(2.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); - expression = new Expression('rgba(255, 255, 255, 1.0) * rgba(255, 0, 0, 1.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.RED); + expression = new Expression('log2(4.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(2.0); - expression = new Expression('rgba(255, 255, 0, 1.0) * 1.0'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.YELLOW); + expression = new Expression('log2(vec2(1.0, 2.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.0, 1.0)); - expression = new Expression('1 * rgba(255, 255, 0, 1.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.YELLOW); + expression = new Expression('log2(vec3(1.0, 2.0, 4.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.0, 1.0, 2.0)); - expression = new Expression('rgba(255, 255, 255, 1.0) / rgba(255, 255, 255, 1.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(Color.WHITE); + expression = new Expression('log2(vec4(1.0, 2.0, 4.0, 8.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 1.0, 2.0, 3.0)); + }); - expression = new Expression('rgba(255, 255, 255, 1.0) / 2'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Color(0.5, 0.5, 0.5, 0.5)); + it('throws if log2 function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('log2()'); + }).toThrowDeveloperError(); - expression = new Expression('rgba(255, 255, 255, 1.0) % rgba(255, 255, 255, 1.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(new Color(0, 0, 0, 0)); + expect(function() { + return new Expression('log2(1, 2)'); + }).toThrowDeveloperError(); + }); - expression = new Expression('color(\'green\') == color(\'green\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + it('evaluates fract function', function() { + var expression = new Expression('fract(1.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); - expression = new Expression('color() == color()'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('fract(2.25)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.25); - expression = new Expression('!!color() == true'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('fract(-2.25)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.75); - expression = new Expression('color(\'green\') != color(\'green\')'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); - }); + expression = new Expression('fract(vec2(1.0, 2.25))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian2(0.0, 0.25)); - it('evaluates color toString function', function() { - var feature = new MockFeature(); - feature.addProperty('property', Color.BLUE); + expression = new Expression('fract(vec3(1.0, 2.25, -2.25))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian3(0.0, 0.25, 0.75)); - var expression = new Expression('color("red").toString()'); - expect(expression.evaluate(frameState, undefined)).toEqual('(1, 0, 0, 1)'); + expression = new Expression('fract(vec4(1.0, 2.25, -2.25, 1.0))'); + expect(expression.evaluate(frameState, undefined)).toEqual(new Cartesian4(0.0, 0.25, 0.75, 0.0)); + }); - expression = new Expression('rgba(0, 0, 255, 0.5).toString()'); - expect(expression.evaluate(frameState, undefined)).toEqual('(0, 0, 1, 0.5)'); + it('throws if fract function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('log2()'); + }).toThrowDeveloperError(); - expression = new Expression('${property}.toString()'); - expect(expression.evaluate(frameState, feature)).toEqual('(0, 0, 1, 1)'); + expect(function() { + return new Expression('log2(1, 2)'); + }).toThrowDeveloperError(); }); - it('evaluates isNaN function', function() { - var expression = new Expression('isNaN()'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + it('evaluates clamp function', function() { + var expression = new Expression('clamp(50.0, 0.0, 100.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(50.0); - expression = new Expression('isNaN(NaN)'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('clamp(50.0, 0.0, 25.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(25.0); - expression = new Expression('isNaN(1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expression = new Expression('clamp(50.0, 75.0, 100.0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(75.0); + }); - expression = new Expression('isNaN(Infinity)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + it('throws if clamp function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('clamp()'); + }).toThrowDeveloperError(); - expression = new Expression('isNaN(null)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expect(function() { + return new Expression('clamp(1)'); + }).toThrowDeveloperError(); - expression = new Expression('isNaN(true)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expect(function() { + return new Expression('clamp(1, 2)'); + }).toThrowDeveloperError(); - expression = new Expression('isNaN("hello")'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expect(function() { + return new Expression('clamp(1, 2, 3, 4)'); + }).toThrowDeveloperError(); + }); - expression = new Expression('isNaN(color("white"))'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + it('evaluates mix function', function() { + var expression = new Expression('mix(0.0, 2.0, 0.5)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); }); - it('evaluates isFinite function', function() { - var expression = new Expression('isFinite()'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + it('throws if mix function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('mix()'); + }).toThrowDeveloperError(); - expression = new Expression('isFinite(NaN)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expect(function() { + return new Expression('mix(1)'); + }).toThrowDeveloperError(); - expression = new Expression('isFinite(1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expect(function() { + return new Expression('mix(1, 2)'); + }).toThrowDeveloperError(); - expression = new Expression('isFinite(Infinity)'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expect(function() { + return new Expression('mix(1, 2, 3, 4)'); + }).toThrowDeveloperError(); + }); - expression = new Expression('isFinite(null)'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + it('evaluates atan2 function', function() { + var expression = new Expression('atan2(0,1)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(0.0, CesiumMath.EPSILON10); - expression = new Expression('isFinite(true)'); - expect(expression.evaluate(frameState, undefined)).toEqual(true); + expression = new Expression('atan2(1,0)'); + expect(expression.evaluate(frameState, undefined)).toEqualEpsilon(0.5*Math.PI, CesiumMath.EPSILON10); + }); - expression = new Expression('isFinite("hello")'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + it('throws if atan2 function takes an invalid number of arguments', function() { + expect(function() { + return new Expression('atan2(0.0)'); + }).toThrowDeveloperError(); - expression = new Expression('isFinite(color("white"))'); - expect(expression.evaluate(frameState, undefined)).toEqual(false); + expect(function() { + return new Expression('atan2(1, 2, 0)'); + }).toThrowDeveloperError(); }); - it('evaluates abs function', function() { - var expression = new Expression('abs(-1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(1); + it('evaluates pow function', function() { + var expression = new Expression('pow(5,0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(1.0); - expression = new Expression('abs(1)'); - expect(expression.evaluate(frameState, undefined)).toEqual(1); + expression = new Expression('pow(4,2)'); + expect(expression.evaluate(frameState, undefined)).toEqual(16.0); }); - it('throws if abs function takes an invalid number of arguments', function() { + it('throws if pow function takes an invalid number of arguments', function() { expect(function() { - return new Expression('abs()'); + return new Expression('pow(0.0)'); }).toThrowDeveloperError(); expect(function() { - return new Expression('abs(1, 2)'); + return new Expression('pow(1, 2, 0)'); }).toThrowDeveloperError(); }); - it('evaluates cos function', function() { - var expression = new Expression('cos(0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(1); + it('evaluates min function', function() { + var expression = new Expression('min(0,1)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); + + expression = new Expression('min(-1,0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(-1.0); }); - it('throws if cos function takes an invalid number of arguments', function() { + it('throws if min function takes an invalid number of arguments', function() { expect(function() { - return new Expression('cos()'); + return new Expression('min(0.0)'); }).toThrowDeveloperError(); expect(function() { - return new Expression('cos(1, 2)'); + return new Expression('min(1, 2, 0)'); }).toThrowDeveloperError(); }); - it('evaluates sqrt function', function() { - var expression = new Expression('sqrt(1.0)'); + it('evaluates max function', function() { + var expression = new Expression('max(0,1)'); expect(expression.evaluate(frameState, undefined)).toEqual(1.0); - expression = new Expression('sqrt(4.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(2.0); - - expression = new Expression('sqrt(-1.0)'); - expect(expression.evaluate(frameState, undefined)).toEqual(NaN); + expression = new Expression('max(-1,0)'); + expect(expression.evaluate(frameState, undefined)).toEqual(0.0); }); - it('throws if sqrt function takes an invalid number of arguments', function() { + it('throws if max function takes an invalid number of arguments', function() { expect(function() { - return new Expression('sqrt()'); + return new Expression('max(0.0)'); }).toThrowDeveloperError(); expect(function() { - return new Expression('sqrt(1, 2)'); + return new Expression('max(1, 2, 0)'); }).toThrowDeveloperError(); }); @@ -898,11 +1961,11 @@ defineSuite([ feature.addProperty('width', 5); feature.addProperty('string', 'hello'); feature.addProperty('boolean', true); - feature.addProperty('color', Color.RED); - feature.addProperty('color.red', 'something else'); - feature.addProperty('feature.color', Color.GREEN); + feature.addProperty('vector', Cartesian4.UNIT_X); + feature.addProperty('vector.x', 'something else'); + feature.addProperty('feature.vector', Cartesian4.UNIT_Y); feature.addProperty('feature', { - color : Color.BLUE + vector : Cartesian4.UNIT_Z }); feature.addProperty('null', null); feature.addProperty('undefined', undefined); @@ -911,30 +1974,30 @@ defineSuite([ "city" : "Example City" }); - var expression = new Expression('${color.red}'); + var expression = new Expression('${vector.x}'); expect(expression.evaluate(frameState, feature)).toEqual(1.0); - expression = new Expression('${color.blue}'); + expression = new Expression('${vector.z}'); expect(expression.evaluate(frameState, feature)).toEqual(0.0); - expression = new Expression('${height.blue}'); + expression = new Expression('${height.z}'); expect(expression.evaluate(frameState, feature)).toEqual(undefined); - expression = new Expression('${undefined.blue}'); + expression = new Expression('${undefined.z}'); expect(expression.evaluate(frameState, feature)).toEqual(undefined); expression = new Expression('${feature}'); expect(expression.evaluate(frameState, feature)).toEqual({ - color : Color.BLUE + vector : Cartesian4.UNIT_Z }); - expression = new Expression('${feature.color}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.RED); + expression = new Expression('${feature.vector}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_X); - expression = new Expression('${feature.feature.color}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.BLUE); + expression = new Expression('${feature.feature.vector}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Z); - expression = new Expression('${feature.color.red}'); + expression = new Expression('${feature.vector.x}'); expect(expression.evaluate(frameState, feature)).toEqual(1.0); expression = new Expression('${address.street}'); @@ -950,11 +2013,11 @@ defineSuite([ feature.addProperty('width', 5); feature.addProperty('string', 'hello'); feature.addProperty('boolean', true); - feature.addProperty('color', Color.RED); - feature.addProperty('color.red', 'something else'); - feature.addProperty('feature.color', Color.GREEN); + feature.addProperty('vector', Cartesian4.UNIT_X); + feature.addProperty('vector.x', 'something else'); + feature.addProperty('feature.vector', Cartesian4.UNIT_Y); feature.addProperty('feature', { - color : Color.BLUE + vector : Cartesian4.UNIT_Z }); feature.addProperty('null', null); feature.addProperty('undefined', undefined); @@ -964,35 +2027,35 @@ defineSuite([ "city" : "Example City" }); - var expression = new Expression('${color["red"]}'); + var expression = new Expression('${vector["x"]}'); expect(expression.evaluate(frameState, feature)).toEqual(1.0); - expression = new Expression('${color["blue"]}'); + expression = new Expression('${vector["z"]}'); expect(expression.evaluate(frameState, feature)).toEqual(0.0); - expression = new Expression('${height["blue"]}'); + expression = new Expression('${height["z"]}'); expect(expression.evaluate(frameState, feature)).toEqual(undefined); - expression = new Expression('${undefined["blue"]}'); + expression = new Expression('${undefined["z"]}'); expect(expression.evaluate(frameState, feature)).toEqual(undefined); - expression = new Expression('${feature["color"]}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.RED); + expression = new Expression('${feature["vector"]}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_X); - expression = new Expression('${feature.color["red"]}'); + expression = new Expression('${feature.vector["x"]}'); expect(expression.evaluate(frameState, feature)).toEqual(1.0); - expression = new Expression('${feature["color"].red}'); + expression = new Expression('${feature["vector"].x}'); expect(expression.evaluate(frameState, feature)).toEqual(1.0); - expression = new Expression('${feature["color.red"]}'); + expression = new Expression('${feature["vector.x"]}'); expect(expression.evaluate(frameState, feature)).toEqual('something else'); - expression = new Expression('${feature.feature["color"]}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.BLUE); + expression = new Expression('${feature.feature["vector"]}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Z); - expression = new Expression('${feature["feature.color"]}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.GREEN); + expression = new Expression('${feature["feature.vector"]}'); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Y); expression = new Expression('${address.street}'); expect(expression.evaluate(frameState, feature)).toEqual("Example Street"); @@ -1015,33 +2078,33 @@ defineSuite([ it('member expressions throw without variable notation', function() { expect(function() { - return new Expression('color.red'); + return new Expression('color.r'); }).toThrowDeveloperError(); expect(function() { - return new Expression('color["red"]'); + return new Expression('color["r"]'); }).toThrowDeveloperError(); }); it('member expression throws with variable property', function() { var feature = new MockFeature(); - feature.addProperty('color', Color.RED); - feature.addProperty('colorName', 'red'); + feature.addProperty('vector', Cartesian4.UNIT_X); + feature.addProperty('vectorName', 'UNIT_X'); expect(function() { - return new Expression('${color[${colorName}]}'); + return new Expression('${vector[${vectorName}]}'); }).toThrowDeveloperError(); }); it('evaluates feature property', function() { var feature = new MockFeature(); feature.addProperty('feature', { - color : Color.BLUE + vector : Cartesian4.UNIT_X }); var expression = new Expression('${feature}'); expect(expression.evaluate(frameState, feature)).toEqual({ - color : Color.BLUE + vector : Cartesian4.UNIT_X }); expression = new Expression('${feature} == ${feature.feature}'); @@ -1217,7 +2280,7 @@ defineSuite([ expect(expression.evaluate(frameState, feature)).toEqual(false); }); - it('throws if test is not call with a RegExp', function() { + it('throws if test is not called with a RegExp', function() { expect(function() { return new Expression('color("blue").test()'); }).toThrowDeveloperError(); @@ -1254,13 +2317,13 @@ defineSuite([ it('evaluates array expression', function() { var feature = new MockFeature(); feature.addProperty('property', 'value'); - feature.addProperty('array', [Color.GREEN, Color.PURPLE, Color.YELLOW]); + feature.addProperty('array', [Cartesian4.UNIT_X, Cartesian4.UNIT_Y, Cartesian4.UNIT_Z]); feature.addProperty('complicatedArray', [{ - 'subproperty' : Color.ORANGE, - 'anotherproperty' : Color.RED + 'subproperty' : Cartesian4.UNIT_X, + 'anotherproperty' : Cartesian4.UNIT_Y }, { - 'subproperty' : Color.BLUE, - 'anotherproperty' : Color.WHITE + 'subproperty' : Cartesian4.UNIT_Z, + 'anotherproperty' : Cartesian4.UNIT_W }]); feature.addProperty('temperatures', { "scale" : "fahrenheit", @@ -1271,7 +2334,7 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual([1, 2, 3]); expression = new Expression('[1+2, "hello", 2 < 3, color("blue"), ${property}]'); - expect(expression.evaluate(frameState, feature)).toEqual([3, 'hello', true, Color.BLUE, 'value']); + expect(expression.evaluate(frameState, feature)).toEqual([3, 'hello', true, Cartesian4.fromColor(Color.BLUE), 'value']); expression = new Expression('[1, 2, 3] * 4'); expect(expression.evaluate(frameState, undefined)).toEqual(NaN); @@ -1280,13 +2343,13 @@ defineSuite([ expect(expression.evaluate(frameState, undefined)).toEqual(NaN); expression = new Expression('${array[1]}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.PURPLE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Y); expression = new Expression('${complicatedArray[1].subproperty}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.BLUE); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Z); expression = new Expression('${complicatedArray[0]["anotherproperty"]}'); - expect(expression.evaluate(frameState, feature)).toEqual(Color.RED); + expect(expression.evaluate(frameState, feature)).toEqual(Cartesian4.UNIT_Y); expression = new Expression('${temperatures["scale"]}'); expect(expression.evaluate(frameState, feature)).toEqual('fahrenheit'); @@ -1473,12 +2536,12 @@ defineSuite([ it('gets shader expression for array indexing', function() { var expression = new Expression('${property[0]}'); var shaderExpression = expression.getShaderExpression('', {}); - var expected = 'property[int(0.0)]'; + var expected = 'property[0]'; expect(shaderExpression).toEqual(expected); - expression = new Expression('rgb(0,0,0)[1]'); + expression = new Expression('${property[4 / 2]}'); shaderExpression = expression.getShaderExpression('', {}); - expected = 'vec4(0.0, 0.0, 0.0, 1.0)[int(1.0)]'; + expected = 'property[int((4.0 / 2.0))]'; expect(shaderExpression).toEqual(expected); }); @@ -1637,6 +2700,55 @@ defineSuite([ expect(shaderState.translucent).toBe(true); }); + it('gets shader expression for color components', function() { + // .r, .g, .b, .a + var expression = new Expression('color().r + color().g + color().b + color().a'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = '(((vec4(1.0)[0] + vec4(1.0)[1]) + vec4(1.0)[2]) + vec4(1.0)[3])'; + expect(shaderExpression).toEqual(expected); + + // .x, .y, .z, .w + expression = new Expression('color().x + color().y + color().z + color().w'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + + // [0], [1], [2], [3] + expression = new Expression('color()[0] + color()[1] + color()[2] + color()[3]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for vector', function() { + var expression = new Expression('vec4(1, 2, 3, 4)'); + var shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('vec4(1.0, 2.0, 3.0, 4.0)'); + + expression = new Expression('vec4(1) + vec4(2)'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('(vec4(1.0) + vec4(2.0))'); + + expression = new Expression('vec4(1, ${property}, vec2(1, 2).x, 0)'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('vec4(1.0, property, vec2(1.0, 2.0)[0], 0.0)'); + + expression = new Expression('vec4(vec3(2), 1.0)'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual('vec4(vec3(2.0), 1.0)'); + }); + + it('gets shader expression for vector components', function() { + // .x, .y, .z, .w + var expression = new Expression('vec4(1).x + vec4(1).y + vec4(1).z + vec4(1).w'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = '(((vec4(1.0)[0] + vec4(1.0)[1]) + vec4(1.0)[2]) + vec4(1.0)[3])'; + expect(shaderExpression).toEqual(expected); + + // [0], [1], [2], [3] + expression = new Expression('vec4(1)[0] + vec4(1)[1] + vec4(1)[2] + vec4(1)[3]'); + shaderExpression = expression.getShaderExpression('', {}); + expect(shaderExpression).toEqual(expected); + }); + it('gets shader expression for TILES3D_TILESET_TIME', function() { var expression = new Expression('TILES3D_TILESET_TIME'); var shaderExpression = expression.getShaderExpression('', {}); @@ -1658,6 +2770,41 @@ defineSuite([ expect(shaderExpression).toEqual(expected); }); + it('gets shader expression for sin', function() { + var expression = new Expression('sin(0.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'sin(0.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for tan', function() { + var expression = new Expression('tan(0.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'tan(0.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for acos', function() { + var expression = new Expression('acos(0.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'acos(0.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for asin', function() { + var expression = new Expression('asin(0.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'asin(0.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for atan', function() { + var expression = new Expression('atan(0.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'atan(0.0)'; + expect(shaderExpression).toEqual(expected); + }); + it('gets shader expression for sqrt', function() { var expression = new Expression('sqrt(1.0)'); var shaderExpression = expression.getShaderExpression('', {}); @@ -1665,6 +2812,111 @@ defineSuite([ expect(shaderExpression).toEqual(expected); }); + it('gets shader expression for sign', function() { + var expression = new Expression('sign(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'sign(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for floor', function() { + var expression = new Expression('floor(1.5)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'floor(1.5)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for ceil', function() { + var expression = new Expression('ceil(1.2)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'ceil(1.2)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for round', function() { + var expression = new Expression('round(1.2)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'floor(1.2 + 0.5)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for exp', function() { + var expression = new Expression('exp(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'exp(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for exp2', function() { + var expression = new Expression('exp2(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'exp2(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for log', function() { + var expression = new Expression('log(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'log(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for log2', function() { + var expression = new Expression('log2(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'log2(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for fract', function() { + var expression = new Expression('fract(1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'fract(1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for clamp', function() { + var expression = new Expression('clamp(50.0, 0.0, 100.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'clamp(50.0, 0.0, 100.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for mix', function() { + var expression = new Expression('mix(0.0, 2.0, 0.5)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'mix(0.0, 2.0, 0.5)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for atan2', function() { + var expression = new Expression('atan2(0.0,1.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'atan(0.0, 1.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for pow', function() { + var expression = new Expression('pow(2.0,2.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'pow(2.0, 2.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for min', function() { + var expression = new Expression('min(3.0,5.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'min(3.0, 5.0)'; + expect(shaderExpression).toEqual(expected); + }); + + it('gets shader expression for max', function() { + var expression = new Expression('max(3.0,5.0)'); + var shaderExpression = expression.getShaderExpression('', {}); + var expected = 'max(3.0, 5.0)'; + expect(shaderExpression).toEqual(expected); + }); + it('throws when getting shader expression for regex', function() { var expression = new Expression('regExp("a").test("abc")'); expect(function() { @@ -1756,4 +3008,25 @@ defineSuite([ return expression.getShaderExpression('', {}); }).toThrowDeveloperError(); }); + + it('throws when getting shader expression for isExactClass', function() { + var expression = new Expression('isExactClass("door")'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); + + it('throws when getting shader expression for isClass', function() { + var expression = new Expression('isClass("door")'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); + + it('throws when getting shader expression for getExactClassName', function() { + var expression = new Expression('getExactClassName()'); + expect(function() { + return expression.getShaderExpression('', {}); + }).toThrowDeveloperError(); + }); }); diff --git a/Specs/Scene/FrustumCommandsSpec.js b/Specs/Scene/FrustumCommandsSpec.js index 57bc636a5a0b..e3f5a7eb9afe 100644 --- a/Specs/Scene/FrustumCommandsSpec.js +++ b/Specs/Scene/FrustumCommandsSpec.js @@ -1,10 +1,10 @@ /*global defineSuite*/ defineSuite([ - 'Scene/FrustumCommands', - 'Scene/Pass' + 'Renderer/Pass', + 'Scene/FrustumCommands' ], function( - FrustumCommands, - Pass) { + Pass, + FrustumCommands) { 'use strict'; it('constructs without arguments', function() { diff --git a/Specs/Scene/GeometryRenderingSpec.js b/Specs/Scene/GeometryRenderingSpec.js index e732ef84f9d6..9b1e7effa501 100644 --- a/Specs/Scene/GeometryRenderingSpec.js +++ b/Specs/Scene/GeometryRenderingSpec.js @@ -15,7 +15,6 @@ defineSuite([ 'Core/EllipseGeometry', 'Core/Ellipsoid', 'Core/EllipsoidGeometry', - 'Core/GeographicProjection', 'Core/Geometry', 'Core/GeometryAttribute', 'Core/GeometryInstance', @@ -31,10 +30,8 @@ defineSuite([ 'Core/SphereGeometry', 'Core/Transforms', 'Core/WallGeometry', - 'Renderer/ClearCommand', 'Scene/EllipsoidSurfaceAppearance', 'Scene/Material', - 'Scene/OrthographicFrustum', 'Scene/PerInstanceColorAppearance', 'Scene/PolylineColorAppearance', 'Scene/Primitive', @@ -57,7 +54,6 @@ defineSuite([ EllipseGeometry, Ellipsoid, EllipsoidGeometry, - GeographicProjection, Geometry, GeometryAttribute, GeometryInstance, @@ -73,10 +69,8 @@ defineSuite([ SphereGeometry, Transforms, WallGeometry, - ClearCommand, EllipsoidSurfaceAppearance, Material, - OrthographicFrustum, PerInstanceColorAppearance, PolylineColorAppearance, Primitive, diff --git a/Specs/Scene/GlobeSpec.js b/Specs/Scene/GlobeSpec.js index bae5e841afa7..78de4c934908 100644 --- a/Specs/Scene/GlobeSpec.js +++ b/Specs/Scene/GlobeSpec.js @@ -3,10 +3,8 @@ defineSuite([ 'Scene/Globe', 'Core/CesiumTerrainProvider', 'Core/defined', - 'Core/Ellipsoid', 'Core/loadWithXhr', 'Core/Rectangle', - 'Renderer/ClearCommand', 'Scene/SingleTileImageryProvider', 'Specs/createScene', 'Specs/pollToPromise' @@ -14,10 +12,8 @@ defineSuite([ Globe, CesiumTerrainProvider, defined, - Ellipsoid, loadWithXhr, Rectangle, - ClearCommand, SingleTileImageryProvider, createScene, pollToPromise) { @@ -68,7 +64,7 @@ defineSuite([ return pollToPromise(function() { globe._surface._debug.enableDebugOutput = true; scene.render(); - return globe._surface.tileProvider.ready && !defined(globe._surface._tileLoadQueue.head) && globe._surface._debug.tilesWaitingForChildren === 0; + return globe._surface.tileProvider.ready && globe._surface._tileLoadQueueHigh.length === 0 && globe._surface._tileLoadQueueMedium.length === 0 && globe._surface._tileLoadQueueLow.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0; }); } diff --git a/Specs/Scene/GlobeSurfaceTileProviderSpec.js b/Specs/Scene/GlobeSurfaceTileProviderSpec.js index 5a88ef6a3ffe..6ff67e4bb0a7 100644 --- a/Specs/Scene/GlobeSurfaceTileProviderSpec.js +++ b/Specs/Scene/GlobeSurfaceTileProviderSpec.js @@ -9,7 +9,6 @@ defineSuite([ 'Core/Ellipsoid', 'Core/EllipsoidTerrainProvider', 'Core/GeographicProjection', - 'Core/Math', 'Core/Rectangle', 'Core/WebMercatorProjection', 'Renderer/ContextLimits', @@ -19,7 +18,6 @@ defineSuite([ 'Scene/Globe', 'Scene/GlobeSurfaceShaderSet', 'Scene/ImageryLayerCollection', - 'Scene/OrthographicFrustum', 'Scene/QuadtreeTile', 'Scene/QuadtreeTileProvider', 'Scene/SceneMode', @@ -37,7 +35,6 @@ defineSuite([ Ellipsoid, EllipsoidTerrainProvider, GeographicProjection, - CesiumMath, Rectangle, WebMercatorProjection, ContextLimits, @@ -47,7 +44,6 @@ defineSuite([ Globe, GlobeSurfaceShaderSet, ImageryLayerCollection, - OrthographicFrustum, QuadtreeTile, QuadtreeTileProvider, SceneMode, @@ -83,7 +79,7 @@ defineSuite([ // update until the load queue is empty. return pollToPromise(function() { scene.renderForSpecs(); - return globe._surface.tileProvider.ready && !defined(globe._surface._tileLoadQueue.head) && globe._surface._debug.tilesWaitingForChildren === 0; + return globe._surface.tileProvider.ready && globe._surface._tileLoadQueueHigh.length === 0 && globe._surface._tileLoadQueueMedium.length === 0 && globe._surface._tileLoadQueueLow.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0; }); } diff --git a/Specs/Scene/GoogleEarthImageryProviderSpec.js b/Specs/Scene/GoogleEarthImageryProviderSpec.js index b642eed65e88..7df3ce2e74ea 100644 --- a/Specs/Scene/GoogleEarthImageryProviderSpec.js +++ b/Specs/Scene/GoogleEarthImageryProviderSpec.js @@ -2,7 +2,6 @@ defineSuite([ 'Scene/GoogleEarthImageryProvider', 'Core/DefaultProxy', - 'Core/defined', 'Core/GeographicTilingScheme', 'Core/loadImage', 'Core/loadWithXhr', @@ -16,7 +15,6 @@ defineSuite([ ], function( GoogleEarthImageryProvider, DefaultProxy, - defined, GeographicTilingScheme, loadImage, loadWithXhr, diff --git a/Specs/Scene/GroundPrimitiveSpec.js b/Specs/Scene/GroundPrimitiveSpec.js index a09afbb7360e..35201b444668 100644 --- a/Specs/Scene/GroundPrimitiveSpec.js +++ b/Specs/Scene/GroundPrimitiveSpec.js @@ -1,64 +1,40 @@ /*global defineSuite*/ defineSuite([ 'Scene/GroundPrimitive', - 'Core/Cartesian3', 'Core/Color', 'Core/ColorGeometryInstanceAttribute', - 'Core/ComponentDatatype', 'Core/destroyObject', 'Core/DistanceDisplayConditionGeometryInstanceAttribute', 'Core/Ellipsoid', - 'Core/Geometry', - 'Core/GeometryAttribute', 'Core/GeometryInstance', - 'Core/GeometryInstanceAttribute', 'Core/HeadingPitchRange', 'Core/Math', 'Core/PolygonGeometry', - 'Core/PrimitiveType', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Core/RuntimeError', 'Core/ShowGeometryInstanceAttribute', - 'Core/Transforms', - 'Scene/MaterialAppearance', - 'Scene/OrthographicFrustum', - 'Scene/Pass', + 'Renderer/Pass', 'Scene/PerInstanceColorAppearance', 'Scene/Primitive', - 'Scene/SceneMode', - 'Specs/BadGeometry', 'Specs/createScene', 'Specs/pollToPromise' ], function( GroundPrimitive, - Cartesian3, Color, ColorGeometryInstanceAttribute, - ComponentDatatype, destroyObject, DistanceDisplayConditionGeometryInstanceAttribute, Ellipsoid, - Geometry, - GeometryAttribute, GeometryInstance, - GeometryInstanceAttribute, HeadingPitchRange, CesiumMath, PolygonGeometry, - PrimitiveType, Rectangle, RectangleGeometry, - RuntimeError, ShowGeometryInstanceAttribute, - Transforms, - MaterialAppearance, - OrthographicFrustum, Pass, PerInstanceColorAppearance, Primitive, - SceneMode, - BadGeometry, createScene, pollToPromise) { 'use strict'; diff --git a/Specs/Scene/ImageryLayerCollectionSpec.js b/Specs/Scene/ImageryLayerCollectionSpec.js index 39f392a2f7a9..7749c1f490ff 100644 --- a/Specs/Scene/ImageryLayerCollectionSpec.js +++ b/Specs/Scene/ImageryLayerCollectionSpec.js @@ -304,7 +304,7 @@ defineSuite([ return pollToPromise(function() { globe._surface._debug.enableDebugOutput = true; scene.render(); - return globe._surface.tileProvider.ready && globe._surface._tileLoadQueue.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0; + return globe._surface.tileProvider.ready && globe._surface._tileLoadQueueHigh.length === 0 && globe._surface._tileLoadQueueMedium.length === 0 && globe._surface._tileLoadQueueLow.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0; }); } diff --git a/Specs/Scene/ImageryLayerSpec.js b/Specs/Scene/ImageryLayerSpec.js index 94ddc52ac0a2..4c9ec1fcbcbb 100644 --- a/Specs/Scene/ImageryLayerSpec.js +++ b/Specs/Scene/ImageryLayerSpec.js @@ -10,7 +10,6 @@ defineSuite([ 'Scene/ArcGisMapServerImageryProvider', 'Scene/BingMapsImageryProvider', 'Scene/createTileMapServiceImageryProvider', - 'Scene/Globe', 'Scene/GlobeSurfaceTile', 'Scene/Imagery', 'Scene/ImageryLayerCollection', @@ -18,6 +17,7 @@ defineSuite([ 'Scene/NeverTileDiscardPolicy', 'Scene/QuadtreeTile', 'Scene/SingleTileImageryProvider', + 'Scene/UrlTemplateImageryProvider', 'Scene/WebMapServiceImageryProvider', 'Specs/createScene', 'Specs/pollToPromise' @@ -32,7 +32,6 @@ defineSuite([ ArcGisMapServerImageryProvider, BingMapsImageryProvider, createTileMapServiceImageryProvider, - Globe, GlobeSurfaceTile, Imagery, ImageryLayerCollection, @@ -40,6 +39,7 @@ defineSuite([ NeverTileDiscardPolicy, QuadtreeTile, SingleTileImageryProvider, + UrlTemplateImageryProvider, WebMapServiceImageryProvider, createScene, pollToPromise) { @@ -273,6 +273,50 @@ defineSuite([ }); }); + it('assigns texture property when reprojection is skipped because the tile is very small', function() { + loadImage.createImage = function(url, crossOrigin, deferred) { + loadImage.defaultCreateImage('Data/Images/Red256x256.png', crossOrigin, deferred); + }; + + var provider = new UrlTemplateImageryProvider({ + url : 'http://example.com/{z}/{x}/{y}.png', + minimumLevel : 13, + maximumLevel: 19, + rectangle : Rectangle.fromDegrees(13.39657249732205, 52.49127999816725, 13.42722986993895, 52.50998943590507) + }); + var layer = new ImageryLayer(provider); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + var imagery = new Imagery(layer, 4400, 2686, 13); + imagery.addReference(); + layer._requestImagery(imagery); + + return pollToPromise(function() { + return imagery.state === ImageryState.RECEIVED; + }).then(function() { + layer._createTexture(scene.context, imagery); + + return pollToPromise(function() { + return imagery.state === ImageryState.TEXTURE_LOADED; + }).then(function() { + layer._reprojectTexture(scene.frameState, imagery, true); + layer.queueReprojectionCommands(scene.frameState); + expect(scene.frameState.commandList.length).toBe(0); + + return pollToPromise(function() { + return imagery.state === ImageryState.READY; + }).then(function() { + expect(imagery.texture).toBeDefined(); + expect(imagery.texture).toBe(imagery.textureWebMercator); + imagery.releaseReference(); + }); + }); + }); + }); + }); + it('cancels reprojection', function() { var provider = createWebMercatorProvider(); var layer = new ImageryLayer(provider); diff --git a/Specs/Scene/Instanced3DModel3DTileContentSpec.js b/Specs/Scene/Instanced3DModel3DTileContentSpec.js index d6326f5be6d6..4b73c42d0dcb 100644 --- a/Specs/Scene/Instanced3DModel3DTileContentSpec.js +++ b/Specs/Scene/Instanced3DModel3DTileContentSpec.js @@ -3,6 +3,7 @@ defineSuite([ 'Scene/Instanced3DModel3DTileContent', 'Core/Cartesian3', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/Transforms', 'Scene/Cesium3DTileContentState', 'Scene/TileBoundingSphere', @@ -12,6 +13,7 @@ defineSuite([ Instanced3DModel3DTileContent, Cartesian3, HeadingPitchRange, + HeadingPitchRoll, Transforms, Cesium3DTileContentState, TileBoundingSphere, @@ -198,7 +200,8 @@ defineSuite([ var newLongitude = -1.31962; var newLatitude = 0.698874; var newCenter = Cartesian3.fromRadians(newLongitude, newLatitude, 15.0); - var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, 0.0, 0.0, 0.0); + var newHPR = new HeadingPitchRoll(); + var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, newHPR); // Update tile transform tileset._root.transform = newTransform; diff --git a/Specs/Scene/LabelCollectionSpec.js b/Specs/Scene/LabelCollectionSpec.js index 81a460109812..a83fb94b3f52 100644 --- a/Specs/Scene/LabelCollectionSpec.js +++ b/Specs/Scene/LabelCollectionSpec.js @@ -8,17 +8,14 @@ defineSuite([ 'Core/Color', 'Core/defined', 'Core/DistanceDisplayCondition', - 'Core/Ellipsoid', 'Core/Math', 'Core/NearFarScalar', 'Core/Rectangle', - 'Renderer/ContextLimits', + 'Scene/Globe', 'Scene/HeightReference', 'Scene/HorizontalOrigin', - 'Scene/Globe', 'Scene/Label', 'Scene/LabelStyle', - 'Scene/OrthographicFrustum', 'Scene/VerticalOrigin', 'Specs/createGlobe', 'Specs/createScene' @@ -31,17 +28,14 @@ defineSuite([ Color, defined, DistanceDisplayCondition, - Ellipsoid, CesiumMath, NearFarScalar, Rectangle, - ContextLimits, + Globe, HeightReference, HorizontalOrigin, - Globe, Label, LabelStyle, - OrthographicFrustum, VerticalOrigin, createGlobe, createScene) { @@ -54,6 +48,9 @@ defineSuite([ var labels; var labelsWithHeight; + // This Unicode square block will more reliably cover the center pixel than an 'x' or a 'w' char. + var solidBox = '\u25a0'; + beforeAll(function() { scene = createScene(); camera = scene.camera; @@ -62,6 +59,7 @@ defineSuite([ afterAll(function() { scene.destroyForSpecs(); }); + beforeEach(function() { scene.morphTo3D(0); @@ -87,12 +85,15 @@ defineSuite([ expect(label.fillColor).toEqual(Color.WHITE); expect(label.outlineColor).toEqual(Color.BLACK); expect(label.outlineWidth).toEqual(1); + expect(label.showBackground).toEqual(false); + expect(label.backgroundColor).toEqual(new Color(0.165, 0.165, 0.165, 0.8)); + expect(label.backgroundPadding).toEqual(new Cartesian2(7, 5)); expect(label.style).toEqual(LabelStyle.FILL); expect(label.pixelOffset).toEqual(Cartesian2.ZERO); expect(label.eyeOffset).toEqual(Cartesian3.ZERO); expect(label.heightReference).toEqual(HeightReference.NONE); expect(label.horizontalOrigin).toEqual(HorizontalOrigin.LEFT); - expect(label.verticalOrigin).toEqual(VerticalOrigin.BOTTOM); + expect(label.verticalOrigin).toEqual(VerticalOrigin.BASELINE); expect(label.scale).toEqual(1.0); expect(label.id).not.toBeDefined(); expect(label.translucencyByDistance).not.toBeDefined(); @@ -125,6 +126,9 @@ defineSuite([ var horizontalOrigin = HorizontalOrigin.LEFT; var verticalOrigin = VerticalOrigin.BOTTOM; var scale = 2.0; + var showBackground = true; + var backgroundColor = Color.BLUE; + var backgroundPadding = new Cartesian2(11, 12); var translucency = new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0); var pixelOffsetScale = new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0); var distanceDisplayCondition = new DistanceDisplayCondition(10.0, 100.0); @@ -137,6 +141,9 @@ defineSuite([ outlineColor : outlineColor, outlineWidth : outlineWidth, style : style, + showBackground : showBackground, + backgroundColor : backgroundColor, + backgroundPadding : backgroundPadding, pixelOffset : pixelOffset, eyeOffset : eyeOffset, horizontalOrigin : horizontalOrigin, @@ -156,6 +163,9 @@ defineSuite([ expect(label.outlineColor).toEqual(outlineColor); expect(label.outlineWidth).toEqual(outlineWidth); expect(label.style).toEqual(style); + expect(label.showBackground).toEqual(showBackground); + expect(label.backgroundColor).toEqual(backgroundColor); + expect(label.backgroundPadding).toEqual(backgroundPadding); expect(label.pixelOffset).toEqual(pixelOffset); expect(label.eyeOffset).toEqual(eyeOffset); expect(label.horizontalOrigin).toEqual(horizontalOrigin); @@ -336,19 +346,19 @@ defineSuite([ it('can render after adding a label', function() { labels.add({ position : Cartesian3.ZERO, - text : 'w', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); var actual = scene.renderForSpecs(); - expect(actual[0]).toBeGreaterThan(10); - expect(actual[1]).toBeGreaterThan(10); - expect(actual[2]).toBeGreaterThan(10); + expect(actual[0]).toBeGreaterThan(200); + expect(actual[1]).toBeGreaterThan(200); + expect(actual[2]).toBeGreaterThan(200); labels.add({ position : new Cartesian3(1.0, 0.0, 0.0), // Closer to camera - text : 'x', + text : solidBox, fillColor : { red : 1.0, green : 0.0, @@ -360,7 +370,7 @@ defineSuite([ }); actual = scene.renderForSpecs(); - expect(actual[0]).toBeGreaterThan(10); + expect(actual[0]).toBeGreaterThan(200); expect(actual[1]).toBeLessThan(10); expect(actual[2]).toBeLessThan(10); }); @@ -435,6 +445,22 @@ defineSuite([ expect(scene.renderForSpecs()[0]).toBeGreaterThan(10); }); + it('can render a label background', function() { + var label = labels.add({ + position : Cartesian3.ZERO, + text : '_', + horizontalOrigin : HorizontalOrigin.CENTER, + verticalOrigin : VerticalOrigin.CENTER, + showBackground : true, + backgroundColor : Color.BLUE + }); + + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + + labels.remove(label); + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + }); + it('does not render labels with show set to false', function() { var label = labels.add({ position : Cartesian3.ZERO, @@ -452,6 +478,25 @@ defineSuite([ expect(scene.renderForSpecs()[0]).toBeGreaterThan(10); }); + it('does not render label background with show set to false', function() { + var label = labels.add({ + position : Cartesian3.ZERO, + text : '_', + horizontalOrigin : HorizontalOrigin.CENTER, + verticalOrigin : VerticalOrigin.CENTER, + showBackground : true, + backgroundColor : Color.BLUE + }); + + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + + label.show = false; + expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); + + label.show = true; + expect(scene.renderForSpecs()).toEqual([0, 0, 255, 255]); + }); + it('does not render labels that are behind the viewer', function() { var label = labels.add({ position : new Cartesian3(20.0, 0.0, 0.0), // Behind camera @@ -501,7 +546,7 @@ defineSuite([ labels.add({ position : Cartesian3.ZERO, pixelOffset : new Cartesian2(1.0, 0.0), - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, pixelOffsetScaleByDistance: new NearFarScalar(2.0, 0.0, 4.0, 1000.0) @@ -517,7 +562,7 @@ defineSuite([ it('renders label with distanceDisplayCondition', function() { labels.add({ position : Cartesian3.ZERO, - text : 'm', + text : solidBox, distanceDisplayCondition : new DistanceDisplayCondition(10.0, 100.0), horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER @@ -555,7 +600,7 @@ defineSuite([ it('can pick a label', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, id : 'id' @@ -569,7 +614,7 @@ defineSuite([ it('can change pick id', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER, id : 'id' @@ -590,7 +635,7 @@ defineSuite([ labels.add({ show : false, position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -602,7 +647,7 @@ defineSuite([ it('picks a label using translucencyByDistance', function() { var label = labels.add({ position : Cartesian3.ZERO, - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -625,7 +670,7 @@ defineSuite([ var label = labels.add({ position : Cartesian3.ZERO, pixelOffset : new Cartesian2(0.0, 100.0), - text : 'x', + text : solidBox, horizontalOrigin : HorizontalOrigin.CENTER, verticalOrigin : VerticalOrigin.CENTER }); @@ -724,14 +769,34 @@ defineSuite([ }); scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(0); label.text = 'a'; scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(2); label.text = 'def'; scene.renderForSpecs(); expect(labels._billboardCollection.length).toEqual(3); + expect(labels._spareBillboards.length).toEqual(0); + }); + + it('should not reuse background billboards that are not needed any more', function() { + var label = labels.add({ + text : 'abc', + showBackground : true + }); + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(1); + + label.showBackground = false; + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(0); + + label.showBackground = true; + scene.renderForSpecs(); + expect(labels._backgroundBillboardCollection.length).toEqual(1); }); describe('Label', function() { @@ -869,30 +934,13 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - width += billboard.width; - height = Math.max(height, billboard.height); - } - - width *= scale; - height *= scale; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(0); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeDefined(); + expect(bbox.y).toBeDefined(); + expect(bbox.width).toBeGreaterThan(30); + expect(bbox.width).toBeLessThan(200); + expect(bbox.height).toBeGreaterThan(10); + expect(bbox.height).toBeLessThan(50); }); it('computes screen space bounding box with result', function() { @@ -904,35 +952,18 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; - - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } - - width += billboard.width; - height = Math.max(height, billboard.height); - } - - width *= scale; - height *= scale; - var result = new BoundingRectangle(); var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO, result); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(0); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + expect(bbox.x).toBeDefined(); + expect(bbox.y).toBeDefined(); + expect(bbox.width).toBeGreaterThan(30); + expect(bbox.width).toBeLessThan(200); + expect(bbox.height).toBeGreaterThan(10); + expect(bbox.height).toBeLessThan(50); expect(bbox).toBe(result); }); - it('computes screen space bounding box with vertical origin', function() { + it('computes screen space bounding box with vertical origin center', function() { var scale = 1.5; var label = labels.add({ @@ -942,39 +973,39 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.y).toBeGreaterThan(bbox.height * -0.9); + expect(bbox.y).toBeLessThan(bbox.height * -0.3); + }); - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } + it('computes screen space bounding box with vertical origin top', function() { + var scale = 1.5; - width += billboard.width; - height = Math.max(height, billboard.height); - } + var label = labels.add({ + text : 'abc', + scale : scale, + verticalOrigin : VerticalOrigin.TOP + }); + scene.renderForSpecs(); - width *= scale; - height *= scale; + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.y).toBeLessThan(5); + expect(bbox.y).toBeGreaterThan(-5); + }); - var halfHeight = height * 0.5; + it('computes screen space bounding box with vertical origin baseline', function() { + var scale = 1.5; - var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(-halfHeight); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + var label = labels.add({ + text : 'abc', + scale : scale, + verticalOrigin : VerticalOrigin.BASELINE + }); + scene.renderForSpecs(); - label.verticalOrigin = VerticalOrigin.TOP; - bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(0); - expect(bbox.y).toEqual(-height); - expect(bbox.width).toEqual(width); - expect(bbox.height).toEqual(height); + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.y).toBeLessThan(bbox.height * -0.8); + expect(bbox.y).toBeGreaterThan(bbox.height * -1.2); }); it('computes screen space bounding box with horizontal origin', function() { @@ -987,37 +1018,47 @@ defineSuite([ }); scene.renderForSpecs(); - var width = 0; - var height = 0; + var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.x).toBeLessThan(bbox.width * -0.3); + expect(bbox.x).toBeGreaterThan(bbox.width * -0.7); - var glyphs = label._glyphs; - var length = glyphs.length; - for (var i = 0; i < length; ++i) { - var glyph = glyphs[i]; - var billboard = glyph.billboard; - if (!defined(billboard)) { - continue; - } + label.horizontalOrigin = HorizontalOrigin.RIGHT; + scene.renderForSpecs(); + bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + expect(bbox.x).toBeLessThan(bbox.width * -0.8); + expect(bbox.x).toBeGreaterThan(bbox.width * -1.2); + }); - width += billboard.width; - height = Math.max(height, billboard.height); - } + it('computes screen space bounding box with padded background', function() { + var scale = 1.5; - width *= scale; - height *= scale; + var label = labels.add({ + text : 'abc', + scale : scale, + showBackground : true, + backgroundPadding : new Cartesian2(15, 10) + }); + scene.renderForSpecs(); - var halfWidth = width * 0.5; + var backgroundBillboard = label._backgroundBillboard; + var width = backgroundBillboard.width * scale; + var height = backgroundBillboard.height * scale; + var x = backgroundBillboard._translate.x; + var y = -(backgroundBillboard._translate.y + height); var bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(-halfWidth); - expect(bbox.y).toEqual(0); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); - label.horizontalOrigin = HorizontalOrigin.RIGHT; + label.verticalOrigin = VerticalOrigin.CENTER; + scene.renderForSpecs(); + y = -(backgroundBillboard._translate.y + height * 0.5); + bbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); - expect(bbox.x).toEqual(-width); - expect(bbox.y).toEqual(0); + expect(bbox.x).toEqual(x); + expect(bbox.y).toEqual(y); expect(bbox.width).toEqual(width); expect(bbox.height).toEqual(height); }); @@ -1092,6 +1133,10 @@ defineSuite([ return Cartesian2.clone(label._glyphs[index].billboard._translate, new Cartesian2()); } + function getBackgroundBillboardVertexTranslate(label) { + return Cartesian2.clone(label._backgroundBillboard._translate, new Cartesian2()); + } + it('sets billboard properties properly when they change on the label', function() { var position1 = new Cartesian3(1.0, 2.0, 3.0); var position2 = new Cartesian3(4.0, 5.0, 6.0); @@ -1100,7 +1145,7 @@ defineSuite([ var eyeOffset1 = new Cartesian3(6.0, 7.0, 8.0); var eyeOffset2 = new Cartesian3(16.0, 17.0, 18.0); var verticalOrigin1 = VerticalOrigin.TOP; - var verticalOrigin2 = VerticalOrigin.BOTTOM; + var verticalOrigin2 = VerticalOrigin.BASELINE; var scale1 = 2.0; var scale2 = 3.0; var id1 = 'id1'; @@ -1119,7 +1164,8 @@ defineSuite([ scale : scale1, id : id1, translucencyByDistance : translucency1, - pixelOffsetScaleByDistance : pixelOffsetScale1 + pixelOffsetScaleByDistance : pixelOffsetScale1, + showBackground : true }); scene.renderForSpecs(); @@ -1166,7 +1212,8 @@ defineSuite([ scale : 2.0, id : 'id1', translucencyByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0), - pixelOffsetScaleByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0) + pixelOffsetScaleByDistance : new NearFarScalar(1.0e4, 1.0, 1.0e6, 0.0), + showBackground : true }); scene.renderForSpecs(); }); @@ -1234,6 +1281,26 @@ defineSuite([ }); }); + it('showBackground', function() { + expect(label.showBackground).toEqual(true); + label.showBackground = false; + expect(label.showBackground).toEqual(false); + }); + + it('backgroundColor', function() { + var newValue = Color.RED; + expect(label.backgroundColor).not.toEqual(newValue); + label.backgroundColor = newValue; + expect(label.backgroundColor).toEqual(newValue); + }); + + it('backgroundPadding', function() { + var newValue = new Cartesian2(8, 5); + expect(label.backgroundPadding).not.toEqual(newValue); + label.backgroundPadding = newValue; + expect(label.backgroundPadding).toEqual(newValue); + }); + it('id', function() { var newValue = 'id2'; expect(label.id).not.toEqual(newValue); @@ -1288,6 +1355,12 @@ defineSuite([ expect(billboard.pixelOffsetScaleByDistance).toEqual(label.pixelOffsetScaleByDistance); }); }); + + it('clusterShow', function() { + expect(label.clusterShow).toEqual(true); + label.clusterShow = false; + expect(label.clusterShow).toEqual(false); + }); }); it('should set vertexTranslate of billboards correctly when vertical origin is changed', function() { @@ -1306,10 +1379,8 @@ defineSuite([ label.verticalOrigin = VerticalOrigin.TOP; scene.renderForSpecs(); - // vertical origin TOP should decrease (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeLessThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeLessThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeLessThanOrEqualTo(offset2.y); + // Because changing the label's vertical origin also changes the vertical origin of each + // individual glyph, it is not safe to assume anything about Y offsets being more or less. // X offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).x).toEqual(offset0.x); @@ -1319,11 +1390,6 @@ defineSuite([ label.verticalOrigin = VerticalOrigin.BOTTOM; scene.renderForSpecs(); - // vertical origin BOTTOM should increase (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeGreaterThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeGreaterThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeGreaterThanOrEqualTo(offset2.y); - // X offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).x).toEqual(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toEqual(offset1.x); @@ -1334,7 +1400,8 @@ defineSuite([ var label = labels.add({ text : 'apl', font : '90px "Open Sans"', - horizontalOrigin : HorizontalOrigin.CENTER + horizontalOrigin : HorizontalOrigin.CENTER, + showBackground : true }); scene.renderForSpecs(); @@ -1342,6 +1409,7 @@ defineSuite([ var offset0 = getGlyphBillboardVertexTranslate(label, 0); var offset1 = getGlyphBillboardVertexTranslate(label, 1); var offset2 = getGlyphBillboardVertexTranslate(label, 2); + var offsetBack = getBackgroundBillboardVertexTranslate(label); label.horizontalOrigin = HorizontalOrigin.LEFT; scene.renderForSpecs(); @@ -1350,11 +1418,13 @@ defineSuite([ expect(getGlyphBillboardVertexTranslate(label, 0).x).toBeGreaterThan(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toBeGreaterThan(offset1.x); expect(getGlyphBillboardVertexTranslate(label, 2).x).toBeGreaterThan(offset2.x); + expect(getBackgroundBillboardVertexTranslate(label).x).toBeGreaterThan(offsetBack.x); // Y offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).y).toEqual(offset0.y); expect(getGlyphBillboardVertexTranslate(label, 1).y).toEqual(offset1.y); expect(getGlyphBillboardVertexTranslate(label, 2).y).toEqual(offset2.y); + expect(getBackgroundBillboardVertexTranslate(label).y).toEqual(offsetBack.y); label.horizontalOrigin = HorizontalOrigin.RIGHT; scene.renderForSpecs(); @@ -1363,11 +1433,13 @@ defineSuite([ expect(getGlyphBillboardVertexTranslate(label, 0).x).toBeLessThan(offset0.x); expect(getGlyphBillboardVertexTranslate(label, 1).x).toBeLessThan(offset1.x); expect(getGlyphBillboardVertexTranslate(label, 2).x).toBeLessThan(offset2.x); + expect(getBackgroundBillboardVertexTranslate(label).x).toBeLessThan(offsetBack.x); // Y offset should be unchanged expect(getGlyphBillboardVertexTranslate(label, 0).y).toEqual(offset0.y); expect(getGlyphBillboardVertexTranslate(label, 1).y).toEqual(offset1.y); expect(getGlyphBillboardVertexTranslate(label, 2).y).toEqual(offset2.y); + expect(getBackgroundBillboardVertexTranslate(label).y).toEqual(offsetBack.y); }); it('should set vertexTranslate of billboards correctly when scale is changed', function() { @@ -1400,20 +1472,9 @@ defineSuite([ offset1 = getGlyphBillboardVertexTranslate(label, 1); offset2 = getGlyphBillboardVertexTranslate(label, 2); - // vertical origin TOP should decrease (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeLessThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeLessThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeLessThanOrEqualTo(offset2.y); + // Because changing the label's vertical origin also changes the vertical origin of each + // individual glyph, it is not safe to assume anything about Y offsets being more or less. - label.verticalOrigin = VerticalOrigin.BOTTOM; - scene.renderForSpecs(); - - // vertical origin BOTTOM should increase (or equal) Y offset compared to CENTER - expect(getGlyphBillboardVertexTranslate(label, 0).y).toBeGreaterThanOrEqualTo(offset0.y); - expect(getGlyphBillboardVertexTranslate(label, 1).y).toBeGreaterThanOrEqualTo(offset1.y); - expect(getGlyphBillboardVertexTranslate(label, 2).y).toBeGreaterThanOrEqualTo(offset2.y); - - label.verticalOrigin = VerticalOrigin.CENTER; label.horizontalOrigin = HorizontalOrigin.LEFT; scene.renderForSpecs(); @@ -1615,6 +1676,23 @@ defineSuite([ expect(dimensions.height).toBeLessThan(originalDimensions.height); expect(dimensions.descent).toBeLessThanOrEqualTo(originalDimensions.descent); }); + + it('should increase label height and decrease width when adding newlines', function() { + var label = labels.add({ + text : 'apl apl apl', + }); + scene.renderForSpecs(); + + var originalBbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + + label.text = 'apl\napl\napl'; + scene.renderForSpecs(); + var newlinesBbox = Label.getScreenSpaceBoundingBox(label, Cartesian2.ZERO); + + expect(newlinesBbox.width).toBeLessThan(originalBbox.width); + expect(newlinesBbox.height).toBeGreaterThan(originalBbox.height); + }); + }, 'WebGL'); it('computes bounding sphere in 3D', function() { @@ -1637,6 +1715,12 @@ defineSuite([ }); it('computes bounding sphere in Columbus view', function() { + + // Disable collision detection to allow controlled camera position, + // hence predictable bounding sphere size + var originalEnableCollisionDetection = scene.screenSpaceCameraController.enableCollisionDetection; + scene.screenSpaceCameraController.enableCollisionDetection = false; + var projection = scene.mapProjection; var ellipsoid = projection.ellipsoid; @@ -1662,6 +1746,7 @@ defineSuite([ expected.center = new Cartesian3(0.0, expected.center.x, expected.center.y); expect(actual.center).toEqualEpsilon(expected.center, CesiumMath.EPSILON8); expect(actual.radius).toBeGreaterThan(expected.radius); + scene.screenSpaceCameraController.enableCollisionDetection = originalEnableCollisionDetection; }); it('computes bounding sphere in 2D', function() { diff --git a/Specs/Scene/MaterialAppearanceSpec.js b/Specs/Scene/MaterialAppearanceSpec.js index 28a305b88217..d2d535827b5a 100644 --- a/Specs/Scene/MaterialAppearanceSpec.js +++ b/Specs/Scene/MaterialAppearanceSpec.js @@ -7,7 +7,6 @@ defineSuite([ 'Core/GeometryInstance', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Renderer/ClearCommand', 'Scene/Appearance', 'Scene/Material', 'Scene/Primitive', @@ -20,7 +19,6 @@ defineSuite([ GeometryInstance, Rectangle, RectangleGeometry, - ClearCommand, Appearance, Material, Primitive, diff --git a/Specs/Scene/MaterialSpec.js b/Specs/Scene/MaterialSpec.js index e6c3b44b71ca..e80880c11d12 100644 --- a/Specs/Scene/MaterialSpec.js +++ b/Specs/Scene/MaterialSpec.js @@ -3,17 +3,13 @@ defineSuite([ 'Scene/Material', 'Core/Cartesian3', 'Core/Color', - 'Core/ColorGeometryInstanceAttribute', 'Core/defaultValue', 'Core/Ellipsoid', 'Core/GeometryInstance', - 'Core/Math', - 'Core/Matrix4', - 'Core/PolygonGeometry', + 'Core/loadImage', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Renderer/ClearCommand', - 'Scene/EllipsoidSurfaceAppearance', + 'Renderer/Texture', 'Scene/MaterialAppearance', 'Scene/PolylineCollection', 'Scene/Primitive', @@ -23,17 +19,13 @@ defineSuite([ Material, Cartesian3, Color, - ColorGeometryInstanceAttribute, defaultValue, Ellipsoid, GeometryInstance, - CesiumMath, - Matrix4, - PolygonGeometry, + loadImage, Rectangle, RectangleGeometry, - ClearCommand, - EllipsoidSurfaceAppearance, + Texture, MaterialAppearance, PolylineCollection, Primitive, @@ -356,6 +348,50 @@ defineSuite([ renderMaterial(material); }); + it('creates a material with an ktx compressed image uniform', function () { + var compressedUrl; + var context = scene.context; + if (context.s3tc) { + compressedUrl = './Data/Images/Green4x4DXT1.ktx'; + } else if (context.etc1) { + compressedUrl = './Data/Images/Green4x4ETC1.ktx'; + } else if (context.pvrtc) { + compressedUrl = './Data/Images/Green4x4PVR.ktx'; + } else { + return; + } + + var material = new Material({ + strict : true, + fabric : { + type : 'DiffuseMap', + uniforms : { + image : compressedUrl + } + } + }); + renderMaterial(material); + }); + + it('creates a material with an crn compressed image uniform', function () { + var context = scene.context; + if (!context.s3tc) { + return; + } + + var compressedUrl = './Data/Images/Green4x4.crn'; + var material = new Material({ + strict : true, + fabric : { + type : 'DiffuseMap', + uniforms : { + image : compressedUrl + } + } + }); + renderMaterial(material); + }); + it('creates a material with a cube map uniform', function() { var material = new Material({ strict : true, diff --git a/Specs/Scene/ModelInstanceCollectionSpec.js b/Specs/Scene/ModelInstanceCollectionSpec.js index 8313638afe6d..13a0c47d80d9 100644 --- a/Specs/Scene/ModelInstanceCollectionSpec.js +++ b/Specs/Scene/ModelInstanceCollectionSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/defaultValue', 'Core/defined', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/JulianDate', 'Core/Math', 'Core/Matrix4', @@ -25,6 +26,7 @@ defineSuite([ defaultValue, defined, HeadingPitchRange, + HeadingPitchRoll, JulianDate, CesiumMath, Matrix4, @@ -127,7 +129,8 @@ defineSuite([ var heading = Math.PI/2.0; var pitch = 0.0; var roll = 0.0; - var modelMatrix = Transforms.headingPitchRollToFixedFrame(position, heading, pitch, roll); + var hpr = new HeadingPitchRoll(heading, pitch, roll); + var modelMatrix = Transforms.headingPitchRollToFixedFrame(position, hpr); instances.push({ modelMatrix : modelMatrix }); diff --git a/Specs/Scene/ModelSpec.js b/Specs/Scene/ModelSpec.js index 7d661199d642..790bd654b266 100644 --- a/Specs/Scene/ModelSpec.js +++ b/Specs/Scene/ModelSpec.js @@ -6,8 +6,8 @@ defineSuite([ 'Core/Cartesian4', 'Core/CesiumTerrainProvider', 'Core/clone', + 'Core/Color', 'Core/combine', - 'Core/defaultValue', 'Core/defined', 'Core/defineProperties', 'Core/DistanceDisplayCondition', @@ -23,9 +23,11 @@ defineSuite([ 'Core/Matrix4', 'Core/PrimitiveType', 'Core/Transforms', + 'Core/WebGLConstants', + 'Renderer/Pass', 'Renderer/RenderState', 'Renderer/ShaderSource', - 'Renderer/WebGLConstants', + 'Scene/ColorBlendMode', 'Scene/HeightReference', 'Scene/ModelAnimationLoop', 'Specs/createScene', @@ -38,8 +40,8 @@ defineSuite([ Cartesian4, CesiumTerrainProvider, clone, + Color, combine, - defaultValue, defined, defineProperties, DistanceDisplayCondition, @@ -55,9 +57,11 @@ defineSuite([ Matrix4, PrimitiveType, Transforms, + WebGLConstants, + Pass, RenderState, ShaderSource, - WebGLConstants, + ColorBlendMode, HeightReference, ModelAnimationLoop, createScene, @@ -70,6 +74,12 @@ defineSuite([ var boxNoIndicesUrl = './Data/Models/Box-NoIndices/box-noindices.gltf'; var texturedBoxUrl = './Data/Models/Box-Textured/CesiumTexturedBoxTest.gltf'; var texturedBoxSeparateUrl = './Data/Models/Box-Textured-Separate/CesiumTexturedBoxTest.gltf'; + var texturedBoxKTXUrl = './Data/Models/Box-Textured-KTX/CesiumTexturedBoxTest.gltf'; + var texturedBoxKTXBinaryUrl = './Data/Models/Box-Textured-KTX-Binary/CesiumTexturedBoxTest.glb'; + var texturedBoxKTXEmbeddedUrl = './Data/Models/Box-Textured-KTX-Embedded/CesiumTexturedBoxTest.gltf'; + var texturedBoxCRNUrl = './Data/Models/Box-Textured-CRN/CesiumTexturedBoxTest.gltf'; + var texturedBoxCRNBinaryUrl = './Data/Models/Box-Textured-CRN-Binary/CesiumTexturedBoxTest.glb'; + var texturedBoxCRNEmbeddedUrl = './Data/Models/Box-Textured-CRN-Embedded/CesiumTexturedBoxTest.gltf'; var texturedBoxCustomUrl = './Data/Models/Box-Textured-Custom/CesiumTexturedBoxTest.gltf'; var texturedBoxKhrBinaryUrl = './Data/Models/Box-Textured-Binary/CesiumTexturedBoxTest.glb'; var boxRtcUrl = './Data/Models/Box-RTC/Box.gltf'; @@ -233,6 +243,11 @@ defineSuite([ expect(texturedBoxModel.debugShowBoundingVolume).toEqual(false); expect(texturedBoxModel.debugWireframe).toEqual(false); expect(texturedBoxModel.distanceDisplayCondition).toBeUndefined(); + expect(texturedBoxModel.silhouetteColor).toEqual(Color.RED); + expect(texturedBoxModel.silhouetteSize).toEqual(0.0); + expect(texturedBoxModel.color).toEqual(Color.WHITE); + expect(texturedBoxModel.colorBlendMode).toEqual(ColorBlendMode.HIGHLIGHT); + expect(texturedBoxModel.colorBlendAmount).toEqual(0.5); }); it('preserves query string in url', function() { @@ -759,6 +774,57 @@ defineSuite([ }); }); + it('renders textured box with external KTX texture', function() { + return loadModel(texturedBoxKTXUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded binary KTX texture', function() { + return loadModel(texturedBoxKTXBinaryUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded base64 encoded KTX texture', function() { + return loadModel(texturedBoxKTXEmbeddedUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with external CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded binary CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNBinaryUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + + it('renders textured box with embedded base64 encoded CRN texture', function() { + if (!(scene.context.s3tc)) { + return; + } + return loadModel(texturedBoxCRNEmbeddedUrl).then(function(m) { + verifyRender(m); + primitives.remove(m); + }); + }); + /////////////////////////////////////////////////////////////////////////// it('loads cesiumAir', function() { @@ -1897,6 +1963,190 @@ defineSuite([ }); }); + it('renders with a color', function() { + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.zoomTo(); + + // Model is originally red + var sourceColor = scene.renderForSpecs(); + expect(sourceColor[0]).toBeGreaterThan(0); + expect(sourceColor[1]).toEqual(0); + + // Check MIX + model.colorBlendMode = ColorBlendMode.MIX; + model.color = Color.LIME; + + model.colorBlendAmount = 0.0; + var color = scene.renderForSpecs(); + expect(color).toEqual(sourceColor); + + model.colorBlendAmount = 0.5; + color = scene.renderForSpecs(); + expect(color[0]).toBeGreaterThan(0); + expect(color[1]).toBeGreaterThan(0); + + model.colorBlendAmount = 1.0; + color = scene.renderForSpecs(); + expect(color[0]).toEqual(0); + expect(color[1]).toEqual(255); + + // Check REPLACE + model.colorBlendMode = ColorBlendMode.REPLACE; + model.colorBlendAmount = 0.5; // Should have no effect + color = scene.renderForSpecs(); + expect(color[0]).toEqual(0); + expect(color[1]).toEqual(255); + + // Check HIGHLIGHT + model.colorBlendMode = ColorBlendMode.HIGHLIGHT; + model.color = Color.DARKGRAY; + color = scene.renderForSpecs(); + expect(sourceColor[0]).toBeGreaterThan(0); + expect(sourceColor[0]).toBeLessThan(255); + expect(sourceColor[1]).toEqual(0); + expect(sourceColor[2]).toEqual(0); + + // Check alpha + model.colorBlendMode = ColorBlendMode.REPLACE; + model.color = Color.fromAlpha(Color.LIME, 0.5); + color = scene.renderForSpecs(); + expect(color[0]).toEqual(0); + expect(color[1]).toBeLessThan(255); + expect(color[1]).toBeGreaterThan(0); + + // No commands are issued when the alpha is 0.0 + model.color = Color.fromAlpha(Color.LIME, 0.0); + scene.renderForSpecs(); + var commands = scene.frameState.commandList; + expect(commands.length).toBe(0); + }); + }); + + it('silhouetteSupported', function() { + expect(Model.silhouetteSupported(scene)).toBe(true); + scene.context._stencilBits = 0; + expect(Model.silhouetteSupported(scene)).toBe(false); + scene.context._stencilBits = 8; + }); + + it('renders with a silhouette', function() { + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.zoomTo(); + + var commands = scene.frameState.commandList; + + // No silhouette + model.silhouetteSize = 0.0; + scene.renderForSpecs(); + expect(commands.length).toBe(1); + expect(commands[0].renderState.stencilTest.enabled).toBe(false); + expect(commands[0].pass).toBe(Pass.OPAQUE); + + // Opaque silhouette + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + + // Translucent silhouette + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + // Invisible silhouette. The model is rendered normally. + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.0); + scene.renderForSpecs(); + expect(commands.length).toBe(1); + expect(commands[0].renderState.stencilTest.enabled).toBe(false); + expect(commands[0].pass).toBe(Pass.OPAQUE); + + // Invisible model with no silhouette. No commands. + model.color = Color.fromAlpha(Color.WHITE, 0.0); + model.silhouetteColor = Color.GREEN; + model.silhouetteSize = 0.0; + scene.renderForSpecs(); + expect(commands.length).toBe(0); + + // Invisible model with silhouette. Model command is stencil-only. + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.colorMask).toEqual({ + red : false, + green : false, + blue : false, + alpha : false + }); + expect(commands[0].renderState.depthMask).toEqual(false); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + + // Translucent model with opaque silhouette. Silhouette is placed in the translucent pass. + model.color = Color.fromAlpha(Color.WHITE, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + // Model with translucent commands with silhouette + model.color = Color.WHITE; + model._nodeCommands[0].command.pass = Pass.TRANSLUCENT; + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + model._nodeCommands[0].command.pass = Pass.OPAQUE; // Revert change + + // Translucent model with translucent silhouette. + model.color = Color.fromAlpha(Color.WHITE, 0.5); + model.silhouetteColor = Color.fromAlpha(Color.GREEN, 0.5); + scene.renderForSpecs(); + expect(commands.length).toBe(2); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.TRANSLUCENT); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.TRANSLUCENT); + + model.color = Color.WHITE; + model.silhouetteColor = Color.GREEN; + + // Load a second model + return loadModel(boxUrl).then(function(model) { + model.show = true; + model.silhouetteSize = 1.0; + scene.renderForSpecs(); + expect(commands.length).toBe(4); + expect(commands[0].renderState.stencilTest.enabled).toBe(true); + expect(commands[0].pass).toBe(Pass.OPAQUE); + expect(commands[1].renderState.stencilTest.enabled).toBe(true); + expect(commands[1].pass).toBe(Pass.OPAQUE); + expect(commands[2].renderState.stencilTest.enabled).toBe(true); + expect(commands[2].pass).toBe(Pass.OPAQUE); + expect(commands[3].renderState.stencilTest.enabled).toBe(true); + expect(commands[3].pass).toBe(Pass.OPAQUE); + + var reference1 = commands[0].renderState.stencilTest.reference; + var reference2 = commands[2].renderState.stencilTest.reference; + expect(reference2).toEqual(reference1 + 1); + }); + }); + }); + describe('height referenced model', function() { function createMockGlobe() { var globe = { @@ -1911,7 +2161,9 @@ defineSuite([ tileProvider : { ready : true }, - _tileLoadQueue : {}, + _tileLoadQueueHigh : [], + _tileLoadQueueMedium : [], + _tileLoadQueueLow : [], _debug : { tilesWaitingForChildren : 0 } @@ -2014,7 +2266,7 @@ defineSuite([ scene.renderForSpecs(); expect(scene.globe.removedCallback).toEqual(true); expect(scene.globe.callback).not.toBeDefined(); - + primitives.remove(model); }); }); diff --git a/Specs/Scene/MoonSpec.js b/Specs/Scene/MoonSpec.js index e38e521411c5..a743dfe7ec6c 100644 --- a/Specs/Scene/MoonSpec.js +++ b/Specs/Scene/MoonSpec.js @@ -2,24 +2,20 @@ defineSuite([ 'Scene/Moon', 'Core/BoundingSphere', - 'Core/Cartesian3', 'Core/Color', 'Core/defined', 'Core/Ellipsoid', 'Core/Matrix3', - 'Core/Matrix4', 'Core/Simon1994PlanetaryPositions', 'Core/Transforms', 'Specs/createScene' ], function( Moon, BoundingSphere, - Cartesian3, Color, defined, Ellipsoid, Matrix3, - Matrix4, Simon1994PlanetaryPositions, Transforms, createScene) { diff --git a/Specs/Scene/MultifrustumSpec.js b/Specs/Scene/MultifrustumSpec.js index 7b0ff8a8f5c9..dfa07c5481fc 100644 --- a/Specs/Scene/MultifrustumSpec.js +++ b/Specs/Scene/MultifrustumSpec.js @@ -14,6 +14,7 @@ defineSuite([ 'Core/Matrix4', 'Renderer/BufferUsage', 'Renderer/DrawCommand', + 'Renderer/Pass', 'Renderer/RenderState', 'Renderer/Sampler', 'Renderer/ShaderProgram', @@ -22,7 +23,6 @@ defineSuite([ 'Renderer/VertexArray', 'Scene/BillboardCollection', 'Scene/BlendingState', - 'Scene/Pass', 'Scene/TextureAtlas', 'Specs/createScene', 'ThirdParty/when' @@ -41,6 +41,7 @@ defineSuite([ Matrix4, BufferUsage, DrawCommand, + Pass, RenderState, Sampler, ShaderProgram, @@ -49,7 +50,6 @@ defineSuite([ VertexArray, BillboardCollection, BlendingState, - Pass, TextureAtlas, createScene, when) { diff --git a/Specs/Scene/PerInstanceColorAppearanceSpec.js b/Specs/Scene/PerInstanceColorAppearanceSpec.js index db0352c87045..4c87261aa69d 100644 --- a/Specs/Scene/PerInstanceColorAppearanceSpec.js +++ b/Specs/Scene/PerInstanceColorAppearanceSpec.js @@ -5,7 +5,6 @@ defineSuite([ 'Core/GeometryInstance', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Renderer/ClearCommand', 'Scene/Appearance', 'Scene/Primitive', 'Specs/createScene' @@ -15,7 +14,6 @@ defineSuite([ GeometryInstance, Rectangle, RectangleGeometry, - ClearCommand, Appearance, Primitive, createScene) { diff --git a/Specs/Scene/PickSpec.js b/Specs/Scene/PickSpec.js index ee2e62e6d99f..4f462a08243f 100644 --- a/Specs/Scene/PickSpec.js +++ b/Specs/Scene/PickSpec.js @@ -1,34 +1,26 @@ /*global defineSuite*/ defineSuite([ 'Core/Cartesian2', - 'Core/Cartesian3', - 'Core/Ellipsoid', 'Core/FeatureDetection', 'Core/GeometryInstance', 'Core/Math', - 'Core/Matrix4', 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/ShowGeometryInstanceAttribute', 'Scene/EllipsoidSurfaceAppearance', - 'Scene/OrthographicFrustum', 'Scene/PerspectiveFrustum', 'Scene/Primitive', 'Scene/SceneMode', 'Specs/createScene' ], 'Scene/Pick', function( Cartesian2, - Cartesian3, - Ellipsoid, FeatureDetection, GeometryInstance, CesiumMath, - Matrix4, Rectangle, RectangleGeometry, ShowGeometryInstanceAttribute, EllipsoidSurfaceAppearance, - OrthographicFrustum, PerspectiveFrustum, Primitive, SceneMode, diff --git a/Specs/Scene/PointCloud3DTileContentSpec.js b/Specs/Scene/PointCloud3DTileContentSpec.js index dec0f6ba5b87..6710109a50a0 100644 --- a/Specs/Scene/PointCloud3DTileContentSpec.js +++ b/Specs/Scene/PointCloud3DTileContentSpec.js @@ -6,8 +6,10 @@ defineSuite([ 'Core/ComponentDatatype', 'Core/defined', 'Core/HeadingPitchRange', + 'Core/HeadingPitchRoll', 'Core/Transforms', 'Scene/Cesium3DTileStyle', + 'Scene/Expression', 'Specs/Cesium3DTilesTester', 'Specs/createScene' ], function( @@ -17,8 +19,10 @@ defineSuite([ ComponentDatatype, defined, HeadingPitchRange, + HeadingPitchRoll, Transforms, Cesium3DTileStyle, + Expression, Cesium3DTilesTester, createScene) { 'use strict'; @@ -231,7 +235,8 @@ defineSuite([ var newLongitude = -1.31962; var newLatitude = 0.698874; var newCenter = Cartesian3.fromRadians(newLongitude, newLatitude, 5.0); - var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, 0.0, 0.0, 0.0); + var newHPR = new HeadingPitchRoll(); + var newTransform = Transforms.headingPitchRollToFixedFrame(newCenter, newHPR); // Update tile transform tileset._root.transform = newTransform; @@ -292,7 +297,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(false); + expect(content.hasProperty(0, 'name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); @@ -302,7 +307,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(8); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(true); + expect(content.hasProperty(0, 'name')).toBe(true); expect(content.getFeature(0)).toBeDefined(); }); }); @@ -315,7 +320,7 @@ defineSuite([ var content = tileset._root.content; expect(content.featuresLength).toBe(0); expect(content.innerContents).toBeUndefined(); - expect(content.hasProperty('name')).toBe(false); + expect(content.hasProperty(0, 'name')).toBe(false); expect(content.getFeature(0)).toBeUndefined(); }); }); @@ -467,6 +472,20 @@ defineSuite([ }); }); + it('rebuilds shader style when expression changes', function() { + return Cesium3DTilesTester.loadTileset(scene, pointCloudWithPerPointPropertiesUrl).then(function(tileset) { + // Solid red color + tileset.style = new Cesium3DTileStyle({ + color : 'color("red")' + }); + expect(scene.renderForSpecs()).toEqual([255, 0, 0, 255]); + + tileset.style.color = new Expression('color("lime")'); + tileset.makeStyleDirty(); + expect(scene.renderForSpecs()).toEqual([0, 255, 0, 255]); + }); + }); + it('applies shader style to point cloud with normals', function() { return Cesium3DTilesTester.loadTileset(scene, pointCloudQuantizedOctEncodedUrl).then(function(tileset) { tileset.style = new Cesium3DTileStyle({ diff --git a/Specs/Scene/PointPrimitiveCollectionSpec.js b/Specs/Scene/PointPrimitiveCollectionSpec.js index ef8f95a99aaa..521c33a6d4d4 100644 --- a/Specs/Scene/PointPrimitiveCollectionSpec.js +++ b/Specs/Scene/PointPrimitiveCollectionSpec.js @@ -10,7 +10,6 @@ defineSuite([ 'Core/Math', 'Core/NearFarScalar', 'Core/Rectangle', - 'Scene/OrthographicFrustum', 'Scene/PointPrimitive', 'Specs/createScene' ], function( @@ -24,7 +23,6 @@ defineSuite([ CesiumMath, NearFarScalar, Rectangle, - OrthographicFrustum, PointPrimitive, createScene) { 'use strict'; diff --git a/Specs/Scene/PolylineCollectionSpec.js b/Specs/Scene/PolylineCollectionSpec.js index 6a2cb9753638..04464b91230c 100644 --- a/Specs/Scene/PolylineCollectionSpec.js +++ b/Specs/Scene/PolylineCollectionSpec.js @@ -373,11 +373,11 @@ defineSuite([ } polylines.add({ - positions : positions, + positions : positions }); polylines.add(); polylines.add({ - positions: positions, + positions: positions }); expect(scene.renderForSpecs()).toEqual([0, 0, 0, 255]); @@ -1227,10 +1227,6 @@ defineSuite([ }); it('renders with a distance display condition', function() { - if (!scene.context.floatingPointTexture) { - return; - } - var near = 100.0; var far = 10000.0; diff --git a/Specs/Scene/PrimitiveCollectionSpec.js b/Specs/Scene/PrimitiveCollectionSpec.js index 5f68ce96c6ee..d1495de85684 100644 --- a/Specs/Scene/PrimitiveCollectionSpec.js +++ b/Specs/Scene/PrimitiveCollectionSpec.js @@ -1,13 +1,10 @@ /*global defineSuite*/ defineSuite([ 'Scene/PrimitiveCollection', - 'Core/Cartesian3', 'Core/ColorGeometryInstanceAttribute', 'Core/defaultValue', 'Core/defined', 'Core/GeometryInstance', - 'Core/Math', - 'Core/Matrix4', 'Core/Rectangle', 'Core/RectangleGeometry', 'Scene/HorizontalOrigin', @@ -18,13 +15,10 @@ defineSuite([ 'Specs/createScene' ], function( PrimitiveCollection, - Cartesian3, ColorGeometryInstanceAttribute, defaultValue, defined, GeometryInstance, - CesiumMath, - Matrix4, Rectangle, RectangleGeometry, HorizontalOrigin, diff --git a/Specs/Scene/PrimitiveCullingSpec.js b/Specs/Scene/PrimitiveCullingSpec.js index f295209e315e..0adeeeaf5b9c 100644 --- a/Specs/Scene/PrimitiveCullingSpec.js +++ b/Specs/Scene/PrimitiveCullingSpec.js @@ -1,70 +1,44 @@ /*global defineSuite*/ defineSuite([ - 'Core/BoundingSphere', - 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Color', 'Core/ColorGeometryInstanceAttribute', 'Core/defaultValue', - 'Core/Ellipsoid', 'Core/GeometryInstance', 'Core/loadImage', - 'Core/Math', - 'Core/Occluder', - 'Core/PolygonGeometry', 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/Transforms', - 'Renderer/Sampler', - 'Renderer/TextureMagnificationFilter', - 'Renderer/TextureMinificationFilter', 'Scene/BillboardCollection', - 'Scene/EllipsoidSurfaceAppearance', 'Scene/Globe', 'Scene/HorizontalOrigin', 'Scene/LabelCollection', 'Scene/Material', - 'Scene/OrthographicFrustum', 'Scene/PerInstanceColorAppearance', 'Scene/PolylineCollection', 'Scene/Primitive', - 'Scene/PrimitiveCollection', 'Scene/SceneMode', - 'Scene/TextureAtlas', 'Scene/VerticalOrigin', 'Specs/createScene' ], 'Scene/PrimitiveCulling', function( - BoundingSphere, - Cartesian2, Cartesian3, Color, ColorGeometryInstanceAttribute, defaultValue, - Ellipsoid, GeometryInstance, loadImage, - CesiumMath, - Occluder, - PolygonGeometry, Rectangle, RectangleGeometry, Transforms, - Sampler, - TextureMagnificationFilter, - TextureMinificationFilter, BillboardCollection, - EllipsoidSurfaceAppearance, Globe, HorizontalOrigin, LabelCollection, Material, - OrthographicFrustum, PerInstanceColorAppearance, PolylineCollection, Primitive, - PrimitiveCollection, SceneMode, - TextureAtlas, VerticalOrigin, createScene) { 'use strict'; diff --git a/Specs/Scene/PrimitiveSpec.js b/Specs/Scene/PrimitiveSpec.js index dc3ded46321b..01d76d630de6 100644 --- a/Specs/Scene/PrimitiveSpec.js +++ b/Specs/Scene/PrimitiveSpec.js @@ -6,6 +6,7 @@ defineSuite([ 'Core/Cartesian3', 'Core/ColorGeometryInstanceAttribute', 'Core/ComponentDatatype', + 'Core/CylinderGeometry', 'Core/defined', 'Core/DistanceDisplayConditionGeometryInstanceAttribute', 'Core/Ellipsoid', @@ -17,16 +18,13 @@ defineSuite([ 'Core/Math', 'Core/Matrix4', 'Core/PolygonGeometry', - 'Core/CylinderGeometry', 'Core/PrimitiveType', 'Core/Rectangle', 'Core/RectangleGeometry', - 'Core/RuntimeError', 'Core/ShowGeometryInstanceAttribute', 'Core/Transforms', 'Scene/Camera', 'Scene/MaterialAppearance', - 'Scene/OrthographicFrustum', 'Scene/PerInstanceColorAppearance', 'Scene/SceneMode', 'Specs/BadGeometry', @@ -39,6 +37,7 @@ defineSuite([ Cartesian3, ColorGeometryInstanceAttribute, ComponentDatatype, + CylinderGeometry, defined, DistanceDisplayConditionGeometryInstanceAttribute, Ellipsoid, @@ -50,16 +49,13 @@ defineSuite([ CesiumMath, Matrix4, PolygonGeometry, - CylinderGeometry, PrimitiveType, Rectangle, RectangleGeometry, - RuntimeError, ShowGeometryInstanceAttribute, Transforms, Camera, MaterialAppearance, - OrthographicFrustum, PerInstanceColorAppearance, SceneMode, BadGeometry, @@ -1035,7 +1031,7 @@ defineSuite([ positions : [] }), attributes : { - color : new ColorGeometryInstanceAttribute(1.0, 0.0, 1.0, 1.0), + color : new ColorGeometryInstanceAttribute(1.0, 0.0, 1.0, 1.0) }, id : 'invalid' })); diff --git a/Specs/Scene/QuadtreePrimitiveSpec.js b/Specs/Scene/QuadtreePrimitiveSpec.js index 57e606d5642c..03647b5f9b03 100644 --- a/Specs/Scene/QuadtreePrimitiveSpec.js +++ b/Specs/Scene/QuadtreePrimitiveSpec.js @@ -9,7 +9,8 @@ defineSuite([ 'Core/Visibility', 'Scene/QuadtreeTile', 'Scene/QuadtreeTileLoadState', - 'Specs/createScene' + 'Specs/createScene', + 'Specs/pollToPromise' ], function( QuadtreePrimitive, Cartesian3, @@ -20,7 +21,8 @@ defineSuite([ Visibility, QuadtreeTile, QuadtreeTileLoadState, - createScene) { + createScene, + pollToPromise) { 'use strict'; var scene; @@ -191,18 +193,14 @@ defineSuite([ expect(progressEventSpy.calls.mostRecent().args[0]).toEqual(1); // Simulate the second zero-level child having loaded with two children. - quadtree._levelZeroTiles[1]._children = [ - buildEmptyQuadtreeTile(tileProvider), - buildEmptyQuadtreeTile(tileProvider) - ]; quadtree._levelZeroTiles[1].state = QuadtreeTileLoadState.DONE; quadtree._levelZeroTiles[1].renderable = true; quadtree.beginFrame(scene.frameState); quadtree.update(scene.frameState); quadtree.endFrame(scene.frameState); - // Now this should be back to 2. - expect(progressEventSpy.calls.mostRecent().args[0]).toEqual(2); + // Now that tile's four children should be in the load queue. + expect(progressEventSpy.calls.mostRecent().args[0]).toEqual(4); }); it('forEachLoadedTile does not enumerate tiles in the START state', function() { @@ -355,12 +353,141 @@ defineSuite([ expect(position).toEqual(updatedPosition); }); - function buildEmptyQuadtreeTile(tileProvider) { - return new QuadtreeTile({ - x : 0, - y : 0, - level : 0, - tilingScheme : tileProvider.tilingScheme + it('gives correct priority to tile loads', function() { + var tileProvider = createSpyTileProvider(); + tileProvider.getReady.and.returnValue(true); + tileProvider.computeTileVisibility.and.returnValue(Visibility.FULL); + + var quadtree = new QuadtreePrimitive({ + tileProvider : tileProvider }); - } + + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + // The root tiles should be in the high priority load queue + expect(quadtree._tileLoadQueueHigh.length).toBe(2); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[1]); + expect(quadtree._tileLoadQueueMedium.length).toBe(0); + expect(quadtree._tileLoadQueueLow.length).toBe(0); + + // Mark the first root tile renderable (but not done loading) + quadtree._levelZeroTiles[0].renderable = true; + + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + // That root tile should now load with low priority while its children should load with high. + expect(quadtree._tileLoadQueueHigh.length).toBe(5); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[1]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[0]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[1]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[2]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[3]); + expect(quadtree._tileLoadQueueMedium.length).toBe(0); + expect(quadtree._tileLoadQueueLow.length).toBe(1); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0]); + + // Mark the children of that root tile renderable too, so we can refine it + quadtree._levelZeroTiles[0].children[0].renderable = true; + quadtree._levelZeroTiles[0].children[1].renderable = true; + quadtree._levelZeroTiles[0].children[2].renderable = true; + quadtree._levelZeroTiles[0].children[3].renderable = true; + + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + expect(quadtree._tileLoadQueueHigh.length).toBe(17); // levelZeroTiles[1] plus levelZeroTiles[0]'s 16 grandchildren + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[1]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[0].children[0]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[0].children[1]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[0].children[2]); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[0].children[0].children[3]); + expect(quadtree._tileLoadQueueMedium.length).toBe(0); + expect(quadtree._tileLoadQueueLow.length).toBe(5); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[0]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[1]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[2]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[3]); + + // Mark the children of levelZeroTiles[0] upsampled + quadtree._levelZeroTiles[0].children[0].upsampledFromParent = true; + quadtree._levelZeroTiles[0].children[1].upsampledFromParent = true; + quadtree._levelZeroTiles[0].children[2].upsampledFromParent = true; + quadtree._levelZeroTiles[0].children[3].upsampledFromParent = true; + + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + // levelZeroTiles[0] should move to medium priority. + // Its descendents should continue loading, so they have a chance to decide they're not upsampled later. + expect(quadtree._tileLoadQueueHigh.length).toBe(1); + expect(quadtree._tileLoadQueueHigh).toContain(quadtree._levelZeroTiles[1]); + expect(quadtree._tileLoadQueueMedium.length).toBe(1); + expect(quadtree._tileLoadQueueMedium).toContain(quadtree._levelZeroTiles[0]); + expect(quadtree._tileLoadQueueLow.length).toBe(4); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[0]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[1]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[2]); + expect(quadtree._tileLoadQueueLow).toContain(quadtree._levelZeroTiles[0].children[3]); + }); + + it('renders tiles in approximate near-to-far order', function() { + var tileProvider = createSpyTileProvider(); + tileProvider.getReady.and.returnValue(true); + tileProvider.computeTileVisibility.and.returnValue(Visibility.FULL); + + var quadtree = new QuadtreePrimitive({ + tileProvider : tileProvider + }); + + tileProvider.loadTile.and.callFake(function(frameState, tile) { + if (tile.level <= 1) { + tile.state = QuadtreeTileLoadState.DONE; + tile.renderable = true; + } + }); + + scene.camera.setView({ + destination : Cartesian3.fromDegrees(1.0, 1.0, 15000.0) + }); + scene.camera.update(scene.mode); + + return pollToPromise(function() { + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + return quadtree._tilesToRender.filter(function(tile) { return tile.level === 1; }).length === 8; + }).then(function() { + quadtree.beginFrame(scene.frameState); + quadtree.update(scene.frameState); + quadtree.endFrame(scene.frameState); + + // Rendered tiles: + // +----+----+----+----+ + // |w.nw|w.ne|e.nw|e.ne| + // +----+----+----+----+ + // |w.sw|w.se|e.sw|e.se| + // +----+----+----+----+ + // camera is located in e.nw (east.northwestChild) + + var west = quadtree._levelZeroTiles.filter(function(tile) { return tile.x === 0; })[0]; + var east = quadtree._levelZeroTiles.filter(function(tile) { return tile.x === 1; })[0]; + expect(quadtree._tilesToRender[0]).toBe(east.northwestChild); + expect(quadtree._tilesToRender[1] === east.southwestChild || quadtree._tilesToRender[1] === east.northeastChild).toBe(true); + expect(quadtree._tilesToRender[2] === east.southwestChild || quadtree._tilesToRender[2] === east.northeastChild).toBe(true); + expect(quadtree._tilesToRender[3]).toBe(east.southeastChild); + expect(quadtree._tilesToRender[4]).toBe(west.northeastChild); + expect(quadtree._tilesToRender[5] === west.northwestChild || quadtree._tilesToRender[5] === west.southeastChild).toBe(true); + expect(quadtree._tilesToRender[6] === west.northwestChild || quadtree._tilesToRender[6] === west.southeastChild).toBe(true); + expect(quadtree._tilesToRender[7]).toBe(west.southwestChild); + }); + }); }, 'WebGL'); diff --git a/Specs/Scene/SceneSpec.js b/Specs/Scene/SceneSpec.js index 58d0d78edcab..b18de90eb279 100644 --- a/Specs/Scene/SceneSpec.js +++ b/Specs/Scene/SceneSpec.js @@ -12,18 +12,18 @@ defineSuite([ 'Core/Rectangle', 'Core/RectangleGeometry', 'Core/RuntimeError', + 'Core/WebGLConstants', 'Core/WebMercatorProjection', 'Renderer/DrawCommand', 'Renderer/Framebuffer', + 'Renderer/Pass', 'Renderer/PixelDatatype', 'Renderer/ShaderProgram', 'Renderer/Texture', - 'Renderer/WebGLConstants', 'Scene/Camera', 'Scene/EllipsoidSurfaceAppearance', 'Scene/FrameState', 'Scene/Globe', - 'Scene/Pass', 'Scene/Primitive', 'Scene/PrimitiveCollection', 'Scene/Scene', @@ -47,18 +47,18 @@ defineSuite([ Rectangle, RectangleGeometry, RuntimeError, + WebGLConstants, WebMercatorProjection, DrawCommand, Framebuffer, + Pass, PixelDatatype, ShaderProgram, Texture, - WebGLConstants, Camera, EllipsoidSurfaceAppearance, FrameState, Globe, - Pass, Primitive, PrimitiveCollection, Scene, @@ -117,7 +117,7 @@ defineSuite([ var contextAttributes = scene.context._gl.getContextAttributes(); // Do not check depth and antialias since they are requests not requirements expect(contextAttributes.alpha).toEqual(false); - expect(contextAttributes.stencil).toEqual(false); + expect(contextAttributes.stencil).toEqual(true); expect(contextAttributes.premultipliedAlpha).toEqual(true); expect(contextAttributes.preserveDrawingBuffer).toEqual(false); }); diff --git a/Specs/Scene/SceneTransformsSpec.js b/Specs/Scene/SceneTransformsSpec.js index de674888cb81..3592c301d076 100644 --- a/Specs/Scene/SceneTransformsSpec.js +++ b/Specs/Scene/SceneTransformsSpec.js @@ -1,23 +1,23 @@ /*global defineSuite*/ defineSuite([ 'Scene/SceneTransforms', - 'Scene/SceneMode', 'Core/Cartesian2', 'Core/Cartesian3', 'Core/Ellipsoid', 'Core/Math', 'Core/Rectangle', 'Scene/Camera', + 'Scene/SceneMode', 'Specs/createScene' ], function( SceneTransforms, - SceneMode, Cartesian2, Cartesian3, Ellipsoid, CesiumMath, Rectangle, Camera, + SceneMode, createScene) { 'use strict'; diff --git a/Specs/Scene/ScreenSpaceCameraControllerSpec.js b/Specs/Scene/ScreenSpaceCameraControllerSpec.js index f205c1ce6db6..e5cca443b05d 100644 --- a/Specs/Scene/ScreenSpaceCameraControllerSpec.js +++ b/Specs/Scene/ScreenSpaceCameraControllerSpec.js @@ -4,7 +4,6 @@ defineSuite([ 'Core/Cartesian2', 'Core/Cartesian3', 'Core/combine', - 'Core/defined', 'Core/Ellipsoid', 'Core/FeatureDetection', 'Core/GeographicProjection', @@ -26,7 +25,6 @@ defineSuite([ Cartesian2, Cartesian3, combine, - defined, Ellipsoid, FeatureDetection, GeographicProjection, @@ -72,7 +70,9 @@ defineSuite([ tileProvider : { ready : true }, - _tileLoadQueue : {}, + _tileLoadQueueHigh : [], + _tileLoadQueueMedium : [], + _tileLoadQueueLow : [], _debug : { tilesWaitingForChildren : 0 } diff --git a/Specs/Scene/ShadowMapSpec.js b/Specs/Scene/ShadowMapSpec.js index 692a68548a2f..95d3b828297c 100644 --- a/Specs/Scene/ShadowMapSpec.js +++ b/Specs/Scene/ShadowMapSpec.js @@ -17,11 +17,11 @@ defineSuite([ 'Core/Math', 'Core/PixelFormat', 'Core/Transforms', + 'Core/WebGLConstants', 'Renderer/Context', 'Renderer/Framebuffer', 'Renderer/PixelDatatype', 'Renderer/Texture', - 'Renderer/WebGLConstants', 'Scene/Camera', 'Scene/Globe', 'Scene/Model', @@ -50,11 +50,11 @@ defineSuite([ CesiumMath, PixelFormat, Transforms, + WebGLConstants, Context, Framebuffer, PixelDatatype, Texture, - WebGLConstants, Camera, Globe, Model, @@ -247,7 +247,8 @@ defineSuite([ function loadGlobe() { return pollToPromise(function() { scene.render(); - return scene.globe._surface.tileProvider.ready && !defined(scene.globe._surface._tileLoadQueue.head) && scene.globe._surface._debug.tilesWaitingForChildren === 0; + var globe = scene.globe; + return globe._surface.tileProvider.ready && globe._surface._tileLoadQueueHigh.length === 0 && globe._surface._tileLoadQueueMedium.length === 0 && globe._surface._tileLoadQueueLow.length === 0 && globe._surface._debug.tilesWaitingForChildren === 0; }); } @@ -899,7 +900,7 @@ defineSuite([ render(); expect(scene.frameState.commandList.length).toBe(0); }); - + it('enable fitNearFar', function() { box.show = true; floor.show = true; diff --git a/Specs/Scene/SkyAtmosphereSpec.js b/Specs/Scene/SkyAtmosphereSpec.js index d2b61728dc20..6e6121e261a8 100644 --- a/Specs/Scene/SkyAtmosphereSpec.js +++ b/Specs/Scene/SkyAtmosphereSpec.js @@ -4,7 +4,6 @@ defineSuite([ 'Core/Cartesian3', 'Core/Ellipsoid', 'Core/Math', - 'Renderer/ClearCommand', 'Scene/SceneMode', 'Specs/createScene' ], function( @@ -12,7 +11,6 @@ defineSuite([ Cartesian3, Ellipsoid, CesiumMath, - ClearCommand, SceneMode, createScene) { 'use strict'; diff --git a/Specs/Scene/SkyBoxSpec.js b/Specs/Scene/SkyBoxSpec.js index a109d5ed20d0..de55582f714f 100644 --- a/Specs/Scene/SkyBoxSpec.js +++ b/Specs/Scene/SkyBoxSpec.js @@ -1,16 +1,12 @@ /*global defineSuite*/ defineSuite([ 'Scene/SkyBox', - 'Core/Cartesian3', 'Core/loadImage', - 'Renderer/ClearCommand', 'Scene/SceneMode', 'Specs/createScene' ], function( SkyBox, - Cartesian3, loadImage, - ClearCommand, SceneMode, createScene) { 'use strict'; diff --git a/Specs/Scene/SunSpec.js b/Specs/Scene/SunSpec.js index 135e892f63dc..06b2a5693047 100644 --- a/Specs/Scene/SunSpec.js +++ b/Specs/Scene/SunSpec.js @@ -2,21 +2,15 @@ defineSuite([ 'Scene/Sun', 'Core/BoundingSphere', - 'Core/Cartesian3', 'Core/Color', - 'Core/Ellipsoid', 'Core/Math', - 'Core/Matrix4', 'Scene/SceneMode', 'Specs/createScene' ], function( Sun, BoundingSphere, - Cartesian3, Color, - Ellipsoid, CesiumMath, - Matrix4, SceneMode, createScene) { 'use strict'; diff --git a/Specs/Scene/TextureAtlasSpec.js b/Specs/Scene/TextureAtlasSpec.js index 2d2a81c164aa..d4bff44d253d 100644 --- a/Specs/Scene/TextureAtlasSpec.js +++ b/Specs/Scene/TextureAtlasSpec.js @@ -194,8 +194,8 @@ void main() {\n\ expect(texture.height).toEqual(atlasHeight); var coords = atlas.textureCoordinates[index]; - expect(coords.x).toEqual(0.0 / atlasWidth); - expect(coords.y).toEqual(0.0 / atlasHeight); + expect(coords.x).toEqual(1.0 / atlasWidth); + expect(coords.y).toEqual(1.0 / atlasHeight); expect(coords.width).toEqual(1.0 / atlasWidth); expect(coords.height).toEqual(1.0 / atlasHeight); }); @@ -383,23 +383,23 @@ void main() {\n\ expect(texture.width).toEqual(atlasWidth); expect(texture.height).toEqual(atlasHeight); - expect(c0.x).toEqualEpsilon(0.0 / atlasWidth, CesiumMath.EPSILON16); - expect(c0.y).toEqualEpsilon(0.0 / atlasHeight, CesiumMath.EPSILON16); + expect(c0.x).toEqualEpsilon(2.0 / atlasWidth, CesiumMath.EPSILON16); + expect(c0.y).toEqualEpsilon(2.0 / atlasHeight, CesiumMath.EPSILON16); expect(c0.width).toEqualEpsilon(greenImage.width / atlasWidth, CesiumMath.EPSILON16); expect(c0.height).toEqualEpsilon(greenImage.height / atlasHeight, CesiumMath.EPSILON16); - expect(c1.x).toEqualEpsilon((greenImage.width + atlas.borderWidthInPixels) / atlasWidth, CesiumMath.EPSILON16); - expect(c1.y).toEqualEpsilon(0.0 / atlasHeight, CesiumMath.EPSILON16); + expect(c1.x).toEqualEpsilon((greenImage.width + 2 * atlas.borderWidthInPixels) / atlasWidth, CesiumMath.EPSILON16); + expect(c1.y).toEqualEpsilon(2.0 / atlasHeight, CesiumMath.EPSILON16); expect(c1.width).toEqualEpsilon(blueImage.width / atlasWidth, CesiumMath.EPSILON16); expect(c1.height).toEqualEpsilon(blueImage.width / atlasHeight, CesiumMath.EPSILON16); - expect(c2.x).toEqualEpsilon((bigRedImage.width + atlas.borderWidthInPixels) / atlasWidth, CesiumMath.EPSILON16); - expect(c2.y).toEqualEpsilon(0.0 / atlasHeight, CesiumMath.EPSILON16); + expect(c2.x).toEqualEpsilon(2.0 / atlasWidth, CesiumMath.EPSILON16); + expect(c2.y).toEqualEpsilon((bigRedImage.height + atlas.borderWidthInPixels) / atlasHeight, CesiumMath.EPSILON16); expect(c2.width).toEqualEpsilon(bigRedImage.width / atlasWidth, CesiumMath.EPSILON16); expect(c2.height).toEqualEpsilon(bigRedImage.height / atlasHeight, CesiumMath.EPSILON16); - expect(c3.x).toEqualEpsilon(0.0 / atlasWidth, CesiumMath.EPSILON16); - expect(c3.y).toEqualEpsilon((greenImage.height + atlas.borderWidthInPixels) / atlasHeight, CesiumMath.EPSILON16); + expect(c3.x).toEqualEpsilon(2.0 / atlasWidth, CesiumMath.EPSILON16); + expect(c3.y).toEqualEpsilon((greenImage.height + 2 * atlas.borderWidthInPixels) / atlasHeight, CesiumMath.EPSILON16); expect(c3.width).toEqualEpsilon(bigBlueImage.width / atlasWidth, CesiumMath.EPSILON16); expect(c3.height).toEqualEpsilon(bigBlueImage.height / atlasHeight, CesiumMath.EPSILON16); }); @@ -577,20 +577,20 @@ void main() {\n\ var texture = atlas.texture; var coordinates = atlas.textureCoordinates; - var atlasWidth = 6.0; - var atlasHeight = 6.0; + var atlasWidth = 10.0; + var atlasHeight = 10.0; expect(atlas.borderWidthInPixels).toEqual(2); expect(atlas.numberOfImages).toEqual(2); expect(texture.width).toEqual(atlasWidth); expect(texture.height).toEqual(atlasHeight); - expect(coordinates[greenIndex].x).toEqual(0.0 / atlasWidth); - expect(coordinates[greenIndex].y).toEqual(0.0 / atlasHeight); + expect(coordinates[greenIndex].x).toEqual(atlas.borderWidthInPixels / atlasWidth); + expect(coordinates[greenIndex].y).toEqual(atlas.borderWidthInPixels / atlasHeight); expect(coordinates[greenIndex].width).toEqual(1.0 / atlasWidth); expect(coordinates[greenIndex].height).toEqual(1.0 / atlasHeight); - expect(coordinates[blueIndex].x).toEqual(3.0 / atlasWidth); - expect(coordinates[blueIndex].y).toEqual(0.0 / atlasHeight); + expect(coordinates[blueIndex].x).toEqual(5.0 / atlasWidth); + expect(coordinates[blueIndex].y).toEqual(2.0 / atlasHeight); expect(coordinates[blueIndex].width).toEqual(1.0 / atlasWidth); expect(coordinates[blueIndex].height).toEqual(1.0 / atlasHeight); }); diff --git a/Specs/Scene/TileCoordinatesImageryProviderSpec.js b/Specs/Scene/TileCoordinatesImageryProviderSpec.js index 82bfeea7559c..e6f4b954cf34 100644 --- a/Specs/Scene/TileCoordinatesImageryProviderSpec.js +++ b/Specs/Scene/TileCoordinatesImageryProviderSpec.js @@ -1,7 +1,6 @@ /*global defineSuite*/ defineSuite([ 'Scene/TileCoordinatesImageryProvider', - 'Core/defined', 'Core/Ellipsoid', 'Core/GeographicTilingScheme', 'Core/WebMercatorTilingScheme', @@ -10,7 +9,6 @@ defineSuite([ 'ThirdParty/when' ], function( TileCoordinatesImageryProvider, - defined, Ellipsoid, GeographicTilingScheme, WebMercatorTilingScheme, diff --git a/Specs/Scene/TileImagerySpec.js b/Specs/Scene/TileImagerySpec.js new file mode 100644 index 000000000000..5baaf57f95dd --- /dev/null +++ b/Specs/Scene/TileImagerySpec.js @@ -0,0 +1,66 @@ +/*global defineSuite*/ +defineSuite([ + 'Scene/TileImagery', + 'Scene/ImageryState' + ], function( + TileImagery, + ImageryState) { + 'use strict'; + + it('does not use ancestor ready imagery that needs to be reprojected', function() { + var imageryLayer = { + _calculateTextureTranslationAndScale: function() {} + }; + + var grandparentImagery = { + imageryLayer: imageryLayer, + level: 0, + x: 0, + y: 0, + state: ImageryState.READY, + texture: {}, + textureWebMercator: {}, + addReference: function() {} + }; + + var parentImagery = { + imageryLayer: imageryLayer, + parent: grandparentImagery, + level: 1, + x: 0, + y: 0, + state: ImageryState.READY, + texture: undefined, + textureWebMercator: {}, + processStateMachine: function() { + ++this.processStateMachineCalls; + }, + processStateMachineCalls: 0, + addReference: function() {} + }; + + var thisImagery = { + imageryLayer: imageryLayer, + parent: parentImagery, + level: 2, + x: 0, + y: 0, + state: ImageryState.FAILED, + processStateMachine: function() {}, + addReference: function() {} + }; + + // This TileImagery needs reprojected imagery, and: + // * thisImagery has failed + // * parentImagery needs to be reprojected + // * grandparentImagery is good to go + // When we process the state machine, it should selected grandparentImagery for rendering + // and process the state machine of parentImagery. + var tileImagery = new TileImagery(thisImagery, undefined, false); + + tileImagery.processStateMachine({}, {}); + + expect(tileImagery.readyImagery).toBe(grandparentImagery); + expect(parentImagery.processStateMachineCalls).toBe(1); + }); +}); diff --git a/Specs/Scene/ViewportQuadSpec.js b/Specs/Scene/ViewportQuadSpec.js index ba5311e8fa3e..7184e72cf57f 100644 --- a/Specs/Scene/ViewportQuadSpec.js +++ b/Specs/Scene/ViewportQuadSpec.js @@ -4,7 +4,6 @@ defineSuite([ 'Core/BoundingRectangle', 'Core/Color', 'Core/loadImage', - 'Renderer/ClearCommand', 'Renderer/Texture', 'Scene/Material', 'Specs/createScene', @@ -14,7 +13,6 @@ defineSuite([ BoundingRectangle, Color, loadImage, - ClearCommand, Texture, Material, createScene, diff --git a/Specs/Scene/WebMapServiceImageryProviderSpec.js b/Specs/Scene/WebMapServiceImageryProviderSpec.js index a29244632b54..f02ef6422204 100644 --- a/Specs/Scene/WebMapServiceImageryProviderSpec.js +++ b/Specs/Scene/WebMapServiceImageryProviderSpec.js @@ -3,7 +3,6 @@ defineSuite([ 'Scene/WebMapServiceImageryProvider', 'Core/Cartographic', 'Core/DefaultProxy', - 'Core/defined', 'Core/Ellipsoid', 'Core/GeographicTilingScheme', 'Core/loadImage', @@ -19,13 +18,11 @@ defineSuite([ 'Scene/ImageryProvider', 'Scene/ImageryState', 'Specs/pollToPromise', - 'ThirdParty/Uri', - 'ThirdParty/when' + 'ThirdParty/Uri' ], function( WebMapServiceImageryProvider, Cartographic, DefaultProxy, - defined, Ellipsoid, GeographicTilingScheme, loadImage, @@ -41,8 +38,7 @@ defineSuite([ ImageryProvider, ImageryState, pollToPromise, - Uri, - when) { + Uri) { 'use strict'; afterEach(function() { @@ -118,7 +114,8 @@ defineSuite([ layers : 'someLayer', parameters : { something : 'foo', - another : false + another : false, + version: '1.3.0' } }); @@ -130,9 +127,10 @@ defineSuite([ var params = queryToObject(uri.query); expect(params.something).toEqual('foo'); expect(params.another).toEqual('false'); + expect(params.version).toEqual('1.3.0'); - // Just return any old image. - loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); return provider.requestImage(0, 0, 0).then(function(image) { @@ -181,8 +179,8 @@ defineSuite([ var questionMarkCount = url.match(/\?/g).length; expect(questionMarkCount).toEqual(1); - // Just return any old image. - loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); return provider.requestImage(0, 0, 0).then(function(image) { @@ -205,9 +203,8 @@ defineSuite([ expect(questionMarkCount).toEqual(1); expect(url).not.toContain('&&'); - // Just return any old image. - loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); - + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); return provider.requestImage(0, 0, 0).then(function(image) { @@ -233,8 +230,60 @@ defineSuite([ var params = queryToObject(uri.query); expect(params.foo).toEqual('bar'); - // Just return any old image. - loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); + }); + + provider.requestImage(0, 0, 0); + + expect(loadImage.createImage).toHaveBeenCalled(); + }); + }); + + it('defaults WMS version to 1.1.1', function() { + + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server?foo=bar', + layers : 'someLayer' + }); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + + var uri = new Uri(url); + var params = queryToObject(uri.query); + expect(params.version).toEqual('1.1.1'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); + }); + + provider.requestImage(0, 0, 0); + + expect(loadImage.createImage).toHaveBeenCalled(); + }); + }); + + it('defaults WMS version to 1.1.1', function() { + + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server?foo=bar', + layers : 'someLayer' + }); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + + var uri = new Uri(url); + var params = queryToObject(uri.query); + expect(params.version).toEqual('1.1.1'); + + // Don't need to actually load image, but satisfy the request. + deferred.resolve(true); }); return provider.requestImage(0, 0, 0).then(function(image) { @@ -273,7 +322,7 @@ defineSuite([ }); }); - it('requestImage requests tiles with SRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme', function() { + it('requestImage requests tiles with SRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme, WMS 1.1.1', function() { var tilingScheme = new WebMercatorTilingScheme(); var provider = new WebMapServiceImageryProvider({ url : 'made/up/wms/server', @@ -298,6 +347,262 @@ defineSuite([ var params = queryToObject(uri.query); expect(params.srs).toEqual('EPSG:3857'); + expect(params.version).toEqual('1.1.1'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS EPSG:3857 when tiling scheme is WebMercatorTilingScheme, WMS 1.3.0', function() { + var tilingScheme = new WebMercatorTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(WebMercatorTilingScheme); + expect(provider.rectangle).toEqual(new WebMercatorTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('EPSG:3857'); + expect(params.version).toEqual('1.3.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with SRS EPSG:4326 when tiling scheme is GeographicTilingScheme, WMS 1.1.1', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.srs).toEqual('EPSG:4326'); + expect(params.version).toEqual('1.1.1'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with SRS EPSG:4326 when tiling scheme is GeographicTilingScheme, WMS 1.1.0', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.1.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.srs).toEqual('EPSG:4326'); + expect(params.version).toEqual('1.1.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS CRS:84 when tiling scheme is GeographicTilingScheme, WMS 1.3.0', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.0' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('CRS:84'); + expect(params.version).toEqual('1.3.0'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS CRS:84 when tiling scheme is GeographicTilingScheme, WMS 1.3.1', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.1' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('CRS:84'); + expect(params.version).toEqual('1.3.1'); + + var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); + expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); + + loadImage.defaultCreateImage('Data/Images/Red16x16.png', crossOrigin, deferred); + }); + + return provider.requestImage(0, 0, 0).then(function(image) { + expect(loadImage.createImage).toHaveBeenCalled(); + expect(image).toBeInstanceOf(Image); + }); + }); + }); + + it('requestImage requests tiles with CRS CRS:84 when tiling scheme is GeographicTilingScheme, WMS 1.3.1', function() { + var tilingScheme = new GeographicTilingScheme(); + var provider = new WebMapServiceImageryProvider({ + url : 'made/up/wms/server', + layers : 'someLayer', + tilingScheme : tilingScheme, + parameters: { + version: '1.3.1' + } + }); + + expect(provider.url).toEqual('made/up/wms/server'); + expect(provider.layers).toEqual('someLayer'); + + return pollToPromise(function() { + return provider.ready; + }).then(function() { + expect(provider.tileWidth).toEqual(256); + expect(provider.tileHeight).toEqual(256); + expect(provider.maximumLevel).toBeUndefined(); + expect(provider.tilingScheme).toBeInstanceOf(GeographicTilingScheme); + expect(provider.rectangle).toEqual(new GeographicTilingScheme().rectangle); + + spyOn(loadImage, 'createImage').and.callFake(function(url, crossOrigin, deferred) { + var uri = new Uri(url); + var params = queryToObject(uri.query); + + expect(params.crs).toEqual('CRS:84'); + expect(params.version).toEqual('1.3.1'); var rect = tilingScheme.tileXYToNativeRectangle(0, 0, 0); expect(params.bbox).toEqual(rect.west + ',' + rect.south + ',' + rect.east + ',' + rect.north); @@ -690,6 +995,8 @@ defineSuite([ enablePickFeatures : false }); + expect(provider.enablePickFeatures).toBe(false); + return pollToPromise(function() { return provider.ready; }).then(function() { @@ -705,6 +1012,7 @@ defineSuite([ }); provider.enablePickFeatures = false; + expect(provider.enablePickFeatures).toBe(false); return pollToPromise(function() { return provider.ready; @@ -721,6 +1029,7 @@ defineSuite([ }); provider.enablePickFeatures = true; + expect(provider.enablePickFeatures).toBe(true); return pollToPromise(function() { return provider.ready; diff --git a/Specs/Scene/WebMapTileServiceImageryProviderSpec.js b/Specs/Scene/WebMapTileServiceImageryProviderSpec.js index 8dea133eea30..078a18542a65 100644 --- a/Specs/Scene/WebMapTileServiceImageryProviderSpec.js +++ b/Specs/Scene/WebMapTileServiceImageryProviderSpec.js @@ -3,7 +3,6 @@ defineSuite([ 'Scene/WebMapTileServiceImageryProvider', 'Core/Credit', 'Core/DefaultProxy', - 'Core/defined', 'Core/GeographicTilingScheme', 'Core/loadImage', 'Core/queryToObject', @@ -18,7 +17,6 @@ defineSuite([ WebMapTileServiceImageryProvider, Credit, DefaultProxy, - defined, GeographicTilingScheme, loadImage, queryToObject, diff --git a/Specs/Scene/createOpenStreetMapImageryProviderSpec.js b/Specs/Scene/createOpenStreetMapImageryProviderSpec.js index 94c79e28f307..77800b4d2983 100644 --- a/Specs/Scene/createOpenStreetMapImageryProviderSpec.js +++ b/Specs/Scene/createOpenStreetMapImageryProviderSpec.js @@ -8,7 +8,6 @@ defineSuite([ 'Core/WebMercatorTilingScheme', 'Scene/Imagery', 'Scene/ImageryLayer', - 'Scene/ImageryProvider', 'Scene/ImageryState', 'Scene/UrlTemplateImageryProvider', 'Specs/pollToPromise' @@ -21,7 +20,6 @@ defineSuite([ WebMercatorTilingScheme, Imagery, ImageryLayer, - ImageryProvider, ImageryState, UrlTemplateImageryProvider, pollToPromise) { diff --git a/Specs/Scene/createTileMapServiceImageryProviderSpec.js b/Specs/Scene/createTileMapServiceImageryProviderSpec.js index 22b6e9243bc9..cacd63f62166 100644 --- a/Specs/Scene/createTileMapServiceImageryProviderSpec.js +++ b/Specs/Scene/createTileMapServiceImageryProviderSpec.js @@ -263,7 +263,7 @@ defineSuite([ }); var provider = createTileMapServiceImageryProvider({ - url : 'server.invalid?query=1', + url : 'server.invalid?query=1' }); return requestMetadata.promise.then(function(url) { diff --git a/Specs/Widgets/CesiumInspector/CesiumInspectorViewModelSpec.js b/Specs/Widgets/CesiumInspector/CesiumInspectorViewModelSpec.js index b74b124d4166..943895de0fc1 100644 --- a/Specs/Widgets/CesiumInspector/CesiumInspectorViewModelSpec.js +++ b/Specs/Widgets/CesiumInspector/CesiumInspectorViewModelSpec.js @@ -10,7 +10,6 @@ defineSuite([ 'Scene/EllipsoidSurfaceAppearance', 'Scene/Globe', 'Scene/GlobeSurfaceTile', - 'Scene/Material', 'Scene/Primitive', 'Scene/QuadtreeTile', 'Specs/createScene' @@ -25,7 +24,6 @@ defineSuite([ EllipsoidSurfaceAppearance, Globe, GlobeSurfaceTile, - Material, Primitive, QuadtreeTile, createScene) { diff --git a/Specs/Widgets/Geocoder/GeocoderSpec.js b/Specs/Widgets/Geocoder/GeocoderSpec.js index 484dfb350750..0b2bde8b24ad 100644 --- a/Specs/Widgets/Geocoder/GeocoderSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderSpec.js @@ -1,13 +1,36 @@ /*global defineSuite*/ defineSuite([ 'Widgets/Geocoder/Geocoder', - 'Specs/createScene' + 'Core/Cartesian3', + 'Specs/createScene', + 'ThirdParty/when' ], function( Geocoder, - createScene) { + Cartesian3, + createScene, + when) { 'use strict'; var scene; + + var mockDestination = new Cartesian3(1.0, 2.0, 3.0); + var geocoderResults = [{ + displayName: 'a', + destination: mockDestination + }, { + displayName: 'b', + destination: mockDestination + }, { + displayName: 'c', + destination: mockDestination + }]; + + var customGeocoderOptions = { + autoComplete : true, + geocode : function (input) { + return when.resolve(geocoderResults); + } + }; beforeEach(function() { scene = createScene(); }); @@ -80,4 +103,33 @@ defineSuite([ }); }).toThrowDeveloperError(); }); + + it('automatic suggestions can be navigated by arrow up/down keys', function() { + var container = document.createElement('div'); + container.id = 'testContainer'; + document.body.appendChild(container); + var geocoder = new Geocoder({ + container : 'testContainer', + scene : scene, + geocoderServices : [customGeocoderOptions] + }); + var viewModel = geocoder._viewModel; + viewModel._searchText = 'some_text'; + viewModel._updateSearchSuggestions(viewModel); + + expect(viewModel._selectedSuggestion).toEqual(undefined); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowDown(viewModel); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('c'); + viewModel._handleArrowDown(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowDown(viewModel); + viewModel._handleArrowUp(viewModel); + expect(viewModel._selectedSuggestion.displayName).toEqual('a'); + viewModel._handleArrowUp(viewModel); + expect(viewModel._selectedSuggestion).toBeUndefined(); + }); + }, 'WebGL'); diff --git a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js index 3df6917aad7d..442e7dd9ded2 100644 --- a/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js +++ b/Specs/Widgets/Geocoder/GeocoderViewModelSpec.js @@ -4,16 +4,55 @@ defineSuite([ 'Core/Cartesian3', 'Scene/Camera', 'Specs/createScene', - 'Specs/pollToPromise' + 'Specs/pollToPromise', + 'ThirdParty/when' ], function( GeocoderViewModel, Cartesian3, Camera, createScene, - pollToPromise) { + pollToPromise, + when) { 'use strict'; var scene; + var mockDestination = new Cartesian3(1.0, 2.0, 3.0); + + var geocoderResults1 = [{ + displayName: 'a', + destination: mockDestination + }, { + displayName: 'b', + destination: mockDestination + }]; + var customGeocoderOptions = { + autoComplete: true, + geocode: function (input) { + return when.resolve(geocoderResults1); + } + }; + + var geocoderResults2 = [{ + displayName: '1', + destination: mockDestination + }, { + displayName: '2', + destination: mockDestination + }]; + var customGeocoderOptions2 = { + autoComplete: true, + geocode: function (input) { + return when.resolve(geocoderResults2); + } + }; + + var noResultsGeocoder = { + autoComplete: true, + geocode: function (input) { + return when.resolve([]); + } + }; + beforeAll(function() { scene = createScene(); }); @@ -55,7 +94,8 @@ defineSuite([ it('throws is searchText is not a string', function() { var viewModel = new GeocoderViewModel({ - scene : scene + scene : scene, + geocoderServices : [customGeocoderOptions] }); expect(function() { viewModel.searchText = undefined; @@ -64,7 +104,8 @@ defineSuite([ it('moves camera when search command invoked', function() { var viewModel = new GeocoderViewModel({ - scene : scene + scene : scene, + geocoderServices : [customGeocoderOptions] }); var cameraPosition = Cartesian3.clone(scene.camera.position); @@ -78,27 +119,6 @@ defineSuite([ }); }); - it('Zooms to longitude, latitude, height', function() { - var viewModel = new GeocoderViewModel({ - scene : scene - }); - - spyOn(Camera.prototype, 'flyTo'); - - viewModel.searchText = ' 1.0, 2.0, 3.0 '; - viewModel.search(); - expect(Camera.prototype.flyTo).toHaveBeenCalled(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); - - viewModel.searchText = '1.0 2.0 3.0'; - viewModel.search(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(1.0, 2.0, 3.0)); - - viewModel.searchText = '-1.0, -2.0'; - viewModel.search(); - expect(Camera.prototype.flyTo.calls.mostRecent().args[0].destination).toEqual(Cartesian3.fromDegrees(-1.0, -2.0, 300.0)); - }); - it('constructor throws without scene', function() { expect(function() { return new GeocoderViewModel(); @@ -108,7 +128,8 @@ defineSuite([ it('raises the complete event camera finished', function() { var viewModel = new GeocoderViewModel({ scene : scene, - flightDuration : 0 + flightDuration : 0, + geocoderServices : [customGeocoderOptions] }); var spyListener = jasmine.createSpy('listener'); @@ -120,7 +141,7 @@ defineSuite([ expect(spyListener.calls.count()).toBe(1); viewModel.flightDuration = 1.5; - viewModel.serachText = '2.0, 2.0'; + viewModel.searchText = '2.0, 2.0'; viewModel.search(); return pollToPromise(function() { @@ -128,4 +149,73 @@ defineSuite([ return spyListener.calls.count() === 2; }); }); + + it('can be created with a custom geocoder', function() { + expect(function() { + return new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions] + }); + }).not.toThrowDeveloperError(); + }); + + it('automatic suggestions can be retrieved', function() { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions] + }); + geocoder._searchText = 'some_text'; + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(2); + }); + + it('update search suggestions results in empty list if the query is empty', function() { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions] + }); + geocoder._searchText = ''; + spyOn(geocoder, '_adjustSuggestionsScroll'); + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(0); + }); + + it('can activate selected search suggestion', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions] + }); + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); + + var suggestion = {displayName: 'a', destination: {west: 0.0, east: 0.1, north: 0.1, south: -0.1}}; + geocoder._selectedSuggestion = suggestion; + geocoder.activateSuggestion(suggestion); + expect(geocoder._searchText).toEqual('a'); + }); + + it('if more than one geocoder service is provided, use first result from first geocode in array order', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [noResultsGeocoder, customGeocoderOptions2] + }); + geocoder._searchText = 'sthsnth'; // an empty query will prevent geocoding + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); + geocoder.search(); + expect(geocoder._searchText).toEqual(geocoderResults2[0].displayName); + }); + + it('can update autoComplete suggestions list using multiple geocoders', function () { + var geocoder = new GeocoderViewModel({ + scene : scene, + geocoderServices : [customGeocoderOptions, customGeocoderOptions2] + }); + geocoder._searchText = 'sthsnth'; // an empty query will prevent geocoding + spyOn(geocoder, '_updateCamera'); + spyOn(geocoder, '_adjustSuggestionsScroll'); + geocoder._updateSearchSuggestions(geocoder); + expect(geocoder._suggestions.length).toEqual(geocoderResults1.length + geocoderResults2.length); + }); + }, 'WebGL'); diff --git a/Specs/Widgets/InfoBox/InfoBoxViewModelSpec.js b/Specs/Widgets/InfoBox/InfoBoxViewModelSpec.js index 2b4add7e8474..e269a982f702 100644 --- a/Specs/Widgets/InfoBox/InfoBoxViewModelSpec.js +++ b/Specs/Widgets/InfoBox/InfoBoxViewModelSpec.js @@ -1,10 +1,8 @@ /*global defineSuite*/ defineSuite([ - 'Widgets/InfoBox/InfoBoxViewModel', - 'Specs/pollToPromise' + 'Widgets/InfoBox/InfoBoxViewModel' ], function( - InfoBoxViewModel, - pollToPromise) { + InfoBoxViewModel) { 'use strict'; it('constructor sets expected values', function() { diff --git a/Specs/Widgets/SvgPathBindingHandlerSpec.js b/Specs/Widgets/SvgPathBindingHandlerSpec.js index e84f49cb8367..b1014541e0c8 100644 --- a/Specs/Widgets/SvgPathBindingHandlerSpec.js +++ b/Specs/Widgets/SvgPathBindingHandlerSpec.js @@ -1,9 +1,7 @@ /*global defineSuite*/ defineSuite([ - 'Widgets/SvgPathBindingHandler', 'ThirdParty/knockout' ], function( - SvgPathBindingHandler, knockout) { 'use strict'; diff --git a/Specs/Widgets/Viewer/ViewerSpec.js b/Specs/Widgets/Viewer/ViewerSpec.js index 5fd773162693..a5fbed70cfa6 100644 --- a/Specs/Widgets/Viewer/ViewerSpec.js +++ b/Specs/Widgets/Viewer/ViewerSpec.js @@ -1,6 +1,5 @@ /*global defineSuite*/ defineSuite([ - 'Widgets/Viewer/Viewer', 'Core/Cartesian3', 'Core/ClockRange', 'Core/ClockStep', @@ -35,7 +34,6 @@ defineSuite([ 'Widgets/SelectionIndicator/SelectionIndicator', 'Widgets/Timeline/Timeline' ], function( - Viewer, Cartesian3, ClockRange, ClockStep, diff --git a/Specs/createPackableArraySpecs.js b/Specs/createPackableArraySpecs.js index 47cd53a4c88e..2ea31b3fedc9 100644 --- a/Specs/createPackableArraySpecs.js +++ b/Specs/createPackableArraySpecs.js @@ -1,10 +1,8 @@ /*global define*/ define([ - 'Core/defaultValue', - 'Core/defined' + 'Core/defaultValue' ], function( - defaultValue, - defined) { + defaultValue) { 'use strict'; function createPackableArraySpecs(packable, unpackedArray, packedArray, namePrefix) { diff --git a/Specs/createScene.js b/Specs/createScene.js index 09111123dfbf..6b070ae6772a 100644 --- a/Specs/createScene.js +++ b/Specs/createScene.js @@ -4,7 +4,6 @@ define([ 'Core/clone', 'Core/defaultValue', 'Core/defined', - 'Core/queryToObject', 'Scene/Scene', 'Specs/createCanvas', 'Specs/destroyCanvas' @@ -13,7 +12,6 @@ define([ clone, defaultValue, defined, - queryToObject, Scene, createCanvas, destroyCanvas) { @@ -34,6 +32,7 @@ define([ var contextOptions = options.contextOptions; contextOptions.webgl = defaultValue(contextOptions.webgl, {}); contextOptions.webgl.antialias = defaultValue(contextOptions.webgl.antialias, false); + contextOptions.webgl.stencil = defaultValue(contextOptions.webgl.stencil, true); var scene = new Scene(options); diff --git a/Specs/pick.js b/Specs/pick.js index 409a28f8549f..711798051a7d 100644 --- a/Specs/pick.js +++ b/Specs/pick.js @@ -4,19 +4,19 @@ define([ 'Core/Color', 'Core/defined', 'Renderer/ClearCommand', + 'Renderer/Pass', 'Scene/CreditDisplay', 'Scene/FrameState', - 'Scene/JobScheduler', - 'Scene/Pass' + 'Scene/JobScheduler' ], function( BoundingRectangle, Color, defined, ClearCommand, + Pass, CreditDisplay, FrameState, - JobScheduler, - Pass) { + JobScheduler) { 'use strict'; function executeCommands(context, passState, commands) { diff --git a/Specs/render.js b/Specs/render.js index b769b1e485ec..d239ed626176 100644 --- a/Specs/render.js +++ b/Specs/render.js @@ -1,12 +1,10 @@ /*global define*/ define([ - 'Core/defaultValue', 'Core/defined', 'Core/Intersect', - 'Scene/Pass', + 'Renderer/Pass', 'Scene/SceneMode' ], function( - defaultValue, defined, Intersect, Pass, diff --git a/gulpfile.js b/gulpfile.js index 1dee79486602..619232965ebf 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -12,8 +12,9 @@ var request = require('request'); var globby = require('globby'); var jshint = require('gulp-jshint'); +var gulpTap = require('gulp-tap'); var rimraf = require('rimraf'); -var stripComments = require('strip-comments'); +var glslStripComments = require('glsl-strip-comments'); var mkdirp = require('mkdirp'); var eventStream = require('event-stream'); var gulp = require('gulp'); @@ -288,6 +289,14 @@ gulp.task('makeZipFile', ['release'], function() { var indexSrc = gulp.src('index.release.html').pipe(gulpRename("index.html")); return eventStream.merge(builtSrc, staticSrc, indexSrc) + .pipe(gulpTap(function(file) { + // Work around an issue with gulp-zip where archives generated on Windows do + // not properly have their directory executable mode set. + // see https://github.com/sindresorhus/gulp-zip/issues/64#issuecomment-205324031 + if (file.isDirectory()) { + file.stat.mode = parseInt('40777', 8); + } + })) .pipe(gulpZip('Cesium-' + version + '.zip')) .pipe(gulp.dest('.')); }); @@ -993,7 +1002,7 @@ function glslToJavaScript(minify, minifyStateFilePath) { } if (minify) { - contents = stripComments(contents); + contents = glslStripComments(contents); contents = contents.replace(/\s+$/gm, '').replace(/^\s+/gm, '').replace(/\n+/gm, '\n'); contents += '\n'; } @@ -1117,8 +1126,10 @@ function createGalleryList() { fileList.push('!Apps/Sandcastle/gallery/development/**/*.html'); } + var helloWorld; globby.sync(fileList).forEach(function(file) { var demo = filePathToModuleId(path.relative('Apps/Sandcastle/gallery', file)); + var demoObject = { name : demo, date : fs.statSync(file).mtime.getTime() @@ -1129,6 +1140,10 @@ function createGalleryList() { } demoObjects.push(demoObject); + + if (demo === 'Hello World') { + helloWorld = demoObject; + } }); demoObjects.sort(function(a, b) { @@ -1141,6 +1156,8 @@ function createGalleryList() { } }); + var helloWorldIndex = Math.max(demoObjects.indexOf(helloWorld), 0); + var i; for (i = 0; i < demoObjects.length; ++i) { demoJSONs[i] = JSON.stringify(demoObjects[i], null, 2); @@ -1148,6 +1165,7 @@ function createGalleryList() { var contents = '\ // This file is automatically rebuilt by the Cesium build process.\n\ +var hello_world_index = ' + helloWorldIndex + ';\n\ var gallery_demos = [' + demoJSONs.join(', ') + '];'; fs.writeFileSync(output, contents); diff --git a/package.json b/package.json index 778c24336f19..c5df42eebcee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cesium", - "version": "1.27.0", + "version": "1.29.0", "description": "Cesium is a JavaScript library for creating 3D globes and 2D maps in a web browser without a plugin.", "homepage": "http://cesiumjs.org", "license": "Apache-2.0", @@ -30,44 +30,45 @@ "email": "cesium-dev@googlegroups.com" }, "dependencies": { - "requirejs": "2.3.2" + "requirejs": "^2.3.2" }, "devDependencies": { - "almond": "0.3.3", - "aws-sdk": "2.6.15", - "bluebird": "3.4.6", - "compressible": "2.0.9", - "compression": "1.6.2", - "electron": "1.4.5", - "event-stream": "3.3.4", - "express": "4.14.0", - "globby": "6.1.0", - "gulp": "3.9.1", - "gulp-insert": "0.5.0", - "gulp-jshint": "2.0.2", - "gulp-rename": "1.2.2", - "gulp-replace": "0.5.4", - "gulp-zip": "3.0.2", - "jasmine-core": "2.5.2", - "jsdoc": "3.4.2", - "jshint": "2.9.4", - "jshint-stylish": "2.2.1", - "karma": "1.3.0", - "karma-chrome-launcher": "2.0.0", - "karma-detect-browsers": "2.2.1", - "karma-electron": "5.1.1", - "karma-firefox-launcher": "1.0.0", - "karma-ie-launcher": "1.0.0", - "karma-jasmine": "1.0.2", - "karma-requirejs": "1.1.0", - "karma-safari-launcher": "1.0.0", - "karma-spec-reporter": "0.0.26", - "mime": "1.3.4", - "mkdirp": "0.5.1", - "request": "2.78.0", - "rimraf": "2.5.4", - "strip-comments": "0.3.2", - "yargs": "6.3.0" + "almond": "^0.3.3", + "aws-sdk": "^2.7.9", + "bluebird": "^3.4.6", + "compressible": "^2.0.9", + "compression": "^1.6.2", + "electron": "^1.4.10", + "event-stream": "^3.3.4", + "express": "^4.14.0", + "globby": "^6.1.0", + "glsl-strip-comments": "^1.0.0", + "gulp": "^3.9.1", + "gulp-insert": "^0.5.0", + "gulp-jshint": "^2.0.4", + "gulp-rename": "^1.2.2", + "gulp-replace": "^0.5.4", + "gulp-tap": "^0.1.3", + "gulp-zip": "^3.2.0", + "jasmine-core": "^2.5.2", + "jsdoc": "^3.4.3", + "jshint": "^2.9.4", + "jshint-stylish": "^2.2.1", + "karma": "^1.3.0", + "karma-chrome-launcher": "^2.0.0", + "karma-detect-browsers": "^2.2.3", + "karma-electron": "^5.1.1", + "karma-firefox-launcher": "^1.0.0", + "karma-ie-launcher": "^1.0.0", + "karma-jasmine": "^1.1.0", + "karma-requirejs": "^1.1.0", + "karma-safari-launcher": "^1.0.0", + "karma-spec-reporter": "^0.0.26", + "mime": "^1.3.4", + "mkdirp": "^0.5.1", + "request": "^2.79.0", + "rimraf": "^2.5.4", + "yargs": "^6.4.0" }, "scripts": { "start": "node server.js", diff --git a/server.js b/server.js index b4dd17cec442..cf67d9fc6b44 100644 --- a/server.js +++ b/server.js @@ -40,6 +40,8 @@ var mime = express.static.mime; mime.define({ 'application/json' : ['czml', 'json', 'geojson', 'topojson'], + 'image/crn' : ['crn'], + 'image/ktx' : ['ktx'], 'model/vnd.gltf+json' : ['gltf'], 'model/vnd.gltf.binary' : ['glb'], 'application/octet-stream' : ['b3dm', 'pnts', 'i3dm', 'cmpt'], diff --git a/web.config b/web.config index 2b980d1f469b..286fec0d14e8 100644 --- a/web.config +++ b/web.config @@ -36,6 +36,10 @@ + + + +