From f93f1a4d2701856dcfc953aa477dfb0d750b70eb Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Wed, 12 Oct 2022 15:28:49 +0200 Subject: [PATCH 01/20] joint, hingejoint, jointparamaters, hingejointsparameters,logicaldevice --- resources/web/wwi/Parser.js | 79 +++++++++++++++++-- resources/web/wwi/nodes/WbHingeJoint.js | 39 +++++++++ .../web/wwi/nodes/WbHingeJointParameters.js | 13 +++ resources/web/wwi/nodes/WbJoint.js | 63 +++++++++++++++ resources/web/wwi/nodes/WbJointParameters.js | 42 ++++++++++ resources/web/wwi/nodes/WbLogicalDevice.js | 24 ++++++ resources/web/wwi/nodes/WbSlot.js | 25 +++--- .../wwi/protoDesigner/classes/FieldModel.js | 12 +-- resources/web/wwi/protos/ProtoHinge.proto | 69 ++++++++++++++++ resources/web/wwi/test.html | 4 +- 10 files changed, 339 insertions(+), 31 deletions(-) create mode 100644 resources/web/wwi/nodes/WbHingeJoint.js create mode 100644 resources/web/wwi/nodes/WbHingeJointParameters.js create mode 100644 resources/web/wwi/nodes/WbJoint.js create mode 100644 resources/web/wwi/nodes/WbJointParameters.js create mode 100644 resources/web/wwi/nodes/WbLogicalDevice.js create mode 100644 resources/web/wwi/protos/ProtoHinge.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 1ee16440c5b..6b1324a9eeb 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -13,10 +13,14 @@ import WbElevationGrid from './nodes/WbElevationGrid.js'; import WbFog from './nodes/WbFog.js'; import WbGeometry from './nodes/WbGeometry.js'; import WbGroup from './nodes/WbGroup.js'; +import WbHingeJoint from './nodes/WbHingeJoint.js'; +import WbHingeJointParameters from './nodes/WbHingeJointParameters.js'; import WbImageTexture from './nodes/WbImageTexture.js'; import WbIndexedFaceSet from './nodes/WbIndexedFaceSet.js'; import WbIndexedLineSet from './nodes/WbIndexedLineSet.js'; +import WbJoint from './nodes/WbJoint.js'; import WbLight from './nodes/WbLight.js'; +import WbLogicalDevice from './nodes/WbLogicalDevice.js'; import WbMaterial from './nodes/WbMaterial.js'; import WbMesh from './nodes/WbMesh.js'; import WbPbrAppearance from './nodes/WbPbrAppearance.js'; @@ -159,6 +163,12 @@ export default class Parser { result = this.#parseBackground(node); else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid') result = this.#parseTransform(node, parentNode, isBoundingObject); + else if (node.tagName === 'HingeJoint') + result = this.#parseHingeJoint(node, parentNode); + else if (node.tagName === 'HingeJointParameters') + result = this.#parseHingeJointParameters(node, parentNode); + else if (node.tagName === 'PositionSensor') + result = this.#parsePositionSensor(node, parentNode); else if (node.tagName === 'Billboard') result = this.#parseBillboard(node, parentNode); else if (node.tagName === 'Group') @@ -500,7 +510,7 @@ export default class Parser { parentNode.geometryField = newNode; else if (isBoundingObject && parentNode instanceof WbSolid) parentNode.boundingObject = newNode; - else if (parentNode instanceof WbSlot) + else if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = newNode; else parentNode.children.push(newNode); @@ -527,7 +537,7 @@ export default class Parser { group.parent = parentNode.id; if (isBoundingObject && parentNode instanceof WbSolid) parentNode.boundingObject = group; - else if (parentNode instanceof WbSlot) + else if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = group; else parentNode.children.push(group); @@ -549,7 +559,7 @@ export default class Parser { if (typeof parentNode !== 'undefined') { slot.parent = parentNode.id; - if (parentNode instanceof WbSlot) + if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = slot; else parentNode.children.push(slot); @@ -558,6 +568,61 @@ export default class Parser { return slot; } + #parseHingeJoint(node, parentNode) { + const id = this.#parseId(node); + + const parameters = undefined; + const hingeJoint = new WbHingeJoint(id, parameters); + WbWorld.instance.nodes.set(hingeJoint.id, hingeJoint); + this.#parseChildren(node, hingeJoint); + + if (typeof parentNode !== 'undefined') { + hingeJoint.parent = parentNode.id; + if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) + parentNode.endPoint = hingeJoint; + else + parentNode.children.push(hingeJoint); + } + + return hingeJoint; + } + + #parseHingeJointParameters(node, parentNode) { + const id = this.#parseId(node); + + const position = parseFloat(getNodeAttribute(node, 'position', '0')); + const axis = convertStringToVec3(getNodeAttribute(node, 'axis', '1 0 0')); + const anchor = convertStringToVec3(getNodeAttribute(node, 'anchor', '0 0 0')); + const minStop = parseFloat(getNodeAttribute(node, 'minStop', '0')); + const maxStop = parseFloat(getNodeAttribute(node, 'maxStop', '0')); + + const hingeJointParameters = new WbHingeJointParameters(id, position, axis, anchor, minStop, maxStop); + WbWorld.instance.nodes.set(hingeJointParameters.id, hingeJointParameters); + + if (typeof parentNode !== 'undefined') { + hingeJointParameters.parent = parentNode.id; + parentNode.jointParameters = hingeJointParameters; + } + + return hingeJointParameters; + } + + #parsePositionSensor(node, parentNode) { + const id = this.#parseId(node); + + const name = getNodeAttribute(node, 'name', ''); + + const positionSensor = new WbLogicalDevice(id, name); + WbWorld.instance.nodes.set(positionSensor.id, positionSensor); + + if (typeof parentNode !== 'undefined') { + positionSensor.parent = parentNode.id; + parentNode.device.push(positionSensor); + } + + return positionSensor; + } + #parseShape(node, parentNode, isBoundingObject) { const use = this.#checkUse(node, parentNode); if (typeof use !== 'undefined') @@ -605,7 +670,7 @@ export default class Parser { if (typeof parentNode !== 'undefined') { if (isBoundingObject && parentNode instanceof WbSolid) parentNode.boundingObject = shape; - else if (parentNode instanceof WbSlot) + else if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = shape; else parentNode.children.push(shape); @@ -641,7 +706,7 @@ export default class Parser { if (typeof parentNode !== 'undefined') { cadShape.parent = parentNode.id; - if (parentNode instanceof WbSlot) + if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = cadShape; else parentNode.children.push(cadShape); @@ -688,7 +753,7 @@ export default class Parser { if (typeof parentNode !== 'undefined' && typeof dirLight !== 'undefined') { dirLight.parent = parentNode.id; - if (parentNode instanceof WbSlot) + if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = dirLight; else parentNode.children.push(dirLight); @@ -718,7 +783,7 @@ export default class Parser { castShadows, parentNode); if (typeof parentNode !== 'undefined' && typeof pointLight !== 'undefined') { - if (parentNode instanceof WbSlot) + if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) parentNode.endPoint = pointLight; else parentNode.children.push(pointLight); diff --git a/resources/web/wwi/nodes/WbHingeJoint.js b/resources/web/wwi/nodes/WbHingeJoint.js new file mode 100644 index 00000000000..bea3a53772a --- /dev/null +++ b/resources/web/wwi/nodes/WbHingeJoint.js @@ -0,0 +1,39 @@ +import WbJoint from './WbJoint.js'; + +export default class WbHingeJoint extends WbJoint { + #device; + constructor(id) { + super(id); + this.#device = []; + } + + get device() { + return this.#device; + } + + set device(device) { + return this.#device; + } + + preFinalize() { + super.preFinalize(); + + this.device.forEach(child => child.preFinalize()); + } + + postFinalize() { + super.postFinalize(); + + this.device.forEach(child => child.postFinalize()); + } + + delete() { + let index = this.device.length - 1; + while (index >= 0) { + this.device[index].delete(); + --index; + } + + super.delete(); + } +} diff --git a/resources/web/wwi/nodes/WbHingeJointParameters.js b/resources/web/wwi/nodes/WbHingeJointParameters.js new file mode 100644 index 00000000000..69f64b2a00d --- /dev/null +++ b/resources/web/wwi/nodes/WbHingeJointParameters.js @@ -0,0 +1,13 @@ +import WbJointParameters from './WbJointParameters.js'; + +export default class WbHingeJointParameters extends WbJointParameters { + #anchor; + constructor(id, position, axis, anchor, minStop, maxStop) { + super(id, position, axis, minStop, maxStop); + this.#anchor = anchor; + } + + get anchor() { + return this.#anchor; + } +} diff --git a/resources/web/wwi/nodes/WbJoint.js b/resources/web/wwi/nodes/WbJoint.js new file mode 100644 index 00000000000..c6a202ee5d4 --- /dev/null +++ b/resources/web/wwi/nodes/WbJoint.js @@ -0,0 +1,63 @@ +import WbBaseNode from './WbBaseNode.js'; +import WbWorld from './WbWorld.js'; + +export default class WbJoint extends WbBaseNode { + #endPoint; + #jointParameters; + + get endPoint() { + return this.#endPoint; + } + + set endPoint(endPoint) { + this.#endPoint = endPoint; + } + + get jointParameters() { + return this.#jointParameters; + } + + set jointParameters(jointParameters) { + this.#jointParameters = jointParameters; + } + + updateBoundingObjectVisibility() { + this.#endPoint?.updateBoundingObjectVisibility(); + } + + createWrenObjects() { + super.createWrenObjects(); + + this.#endPoint?.createWrenObjects(); + } + + delete() { + const parent = WbWorld.instance.nodes.get(this.parent); + if (typeof parent !== 'undefined') { + if (typeof parent.endPoint !== 'undefined') + parent.endPoint = undefined; + else { + const index = parent.children.indexOf(this); + parent.children.splice(index, 1); + } + } + + this.#jointParameters?.delete(); + this.#endPoint?.delete(); + + super.delete(); + } + + preFinalize() { + super.preFinalize(); + this.#jointParameters?.preFinalize(); + this.#endPoint?.preFinalize(); + } + + postFinalize() { + super.postFinalize(); + + this.#jointParameters?.postFinalize(); + this.#endPoint?.postFinalize(); + } +} diff --git a/resources/web/wwi/nodes/WbJointParameters.js b/resources/web/wwi/nodes/WbJointParameters.js new file mode 100644 index 00000000000..fed68ed46ca --- /dev/null +++ b/resources/web/wwi/nodes/WbJointParameters.js @@ -0,0 +1,42 @@ +import WbBaseNode from './WbBaseNode.js'; +import WbWorld from './WbWorld.js'; + +export default class WbJointParameters extends WbBaseNode { + #position; + #axis; + #minStop; + #maxStop; + constructor(id, position, axis, minStop, maxStop) { + super(id); + this.#position = position; + this.#axis = axis; + this.#minStop = minStop; + this.#maxStop = maxStop; + } + + get position() { + return this.#position; + } + + get axis() { + return this.#axis; + } + + get minStop() { + return this.#minStop; + } + + get maxStop() { + return this.#maxStop; + } + + delete() { + const parent = WbWorld.instance.nodes.get(this.parent); + if (typeof parent !== 'undefined') { + if (typeof parent.jointParameters !== 'undefined') + parent.jointParameters = undefined; + } + + super.delete(); + } +} diff --git a/resources/web/wwi/nodes/WbLogicalDevice.js b/resources/web/wwi/nodes/WbLogicalDevice.js new file mode 100644 index 00000000000..e23a6db26cd --- /dev/null +++ b/resources/web/wwi/nodes/WbLogicalDevice.js @@ -0,0 +1,24 @@ +import WbBaseNode from './WbBaseNode.js'; +import WbWorld from './WbWorld.js'; + +export default class WbLogicalDevice extends WbBaseNode { + #deviceName; + constructor(id, deviceName) { + super(id); + this.#deviceName = deviceName; + } + + get deviceName() { + return this.#deviceName; + } + + delete() { + const parent = WbWorld.instance.nodes.get(this.parent); + if (typeof parent !== 'undefined') { + const index = parent?.device.indexOf(this); + parent?.device.splice(index, 1); + } + + super.delete(); + } +} diff --git a/resources/web/wwi/nodes/WbSlot.js b/resources/web/wwi/nodes/WbSlot.js index 6c4fd5a484f..93d01695cd1 100644 --- a/resources/web/wwi/nodes/WbSlot.js +++ b/resources/web/wwi/nodes/WbSlot.js @@ -1,17 +1,15 @@ import WbBaseNode from './WbBaseNode.js'; -import WbGroup from './WbGroup.js'; import WbWorld from './WbWorld.js'; import {getAnId} from './utils/id_provider.js'; export default class WbSlot extends WbBaseNode { - constructor(id, type, endPoint) { + constructor(id, type) { super(id); this.type = type; - this.endPoint = endPoint; } clone(customID) { - const slot = new WbGroup(customID, this.type); + const slot = new WbSlot(customID, this.type); if (typeof this.endPoint !== 'undefined') { slot.endPoint = this.endPoint.clone(getAnId()); @@ -30,18 +28,13 @@ export default class WbSlot extends WbBaseNode { } delete() { - if (typeof this.parent === 'undefined') { - const index = WbWorld.instance.sceneTree.indexOf(this); - WbWorld.instance.sceneTree.splice(index, 1); - } else { - const parent = WbWorld.instance.nodes.get(this.parent); - if (typeof parent !== 'undefined') { - if (typeof parent.endPoint !== 'undefined') - parent.endPoint = undefined; - else { - const index = parent.children.indexOf(this); - parent.children.splice(index, 1); - } + const parent = WbWorld.instance.nodes.get(this.parent); + if (typeof parent !== 'undefined') { + if (typeof parent.endPoint !== 'undefined') + parent.endPoint = undefined; + else { + const index = parent.children.indexOf(this); + parent.children.splice(index, 1); } } diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index b06b01d3ab1..0b7545754a3 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -62,12 +62,12 @@ export const FieldModel = { 'unsupported': {} }, 'HingeJoint': { - 'supported': {'endPoint': VRML.SFNode}, - 'unsupported': {'jointParameters': VRML.SFNode, 'device': VRML.MFNode, 'position': VRML.SFFloat} + 'supported': {'endPoint': VRML.SFNode, 'jointParameters': VRML.SFNode, 'device': VRML.MFNode, 'position': VRML.SFFloat}, + 'unsupported': {} }, 'HingeJointParameters': { - 'supported': {}, - 'unsupported': {'position': VRML.SFFloat, 'axis': VRML.SFVec3f, 'anchor': VRML.SFVec3f, 'minStop': VRML.SFFloat, 'maxStop': VRML.SFFloat, 'springConstant': VRML.SFFloat, 'dampingConstant': VRML.SFFloat, 'staticFriction': VRML.SFFloat, 'suspensionSpringConstant': VRML.SFFloat, 'suspensionDampingConstant': VRML.SFFloat, 'suspensionAxis': VRML.SFVec3f, 'stopCFM': VRML.SFFloat, 'stopERP': VRML.SFFloat} + 'supported': {'position': VRML.SFFloat, 'axis': VRML.SFVec3f, 'anchor': VRML.SFVec3f, 'minStop': VRML.SFFloat, 'maxStop': VRML.SFFloat}, + 'unsupported': {'springConstant': VRML.SFFloat, 'dampingConstant': VRML.SFFloat, 'staticFriction': VRML.SFFloat, 'suspensionSpringConstant': VRML.SFFloat, 'suspensionDampingConstant': VRML.SFFloat, 'suspensionAxis': VRML.SFVec3f, 'stopCFM': VRML.SFFloat, 'stopERP': VRML.SFFloat} }, 'ImageTexture': { 'supported': {'url': VRML.MFString, 'repeatS': VRML.SFBool, 'repeatT': VRML.SFBool, 'filtering': VRML.SFInt32}, @@ -122,8 +122,8 @@ export const FieldModel = { 'unsupported': {} }, 'PositionSensor': { - 'supported': {}, - 'unsupported': {'name': VRML.SFString, 'noise': VRML.SFFloat, 'resolution': VRML.SFFloat} + 'supported': {'name': VRML.SFString}, + 'unsupported': {'noise': VRML.SFFloat, 'resolution': VRML.SFFloat} }, 'Robot': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, diff --git a/resources/web/wwi/protos/ProtoHinge.proto b/resources/web/wwi/protos/ProtoHinge.proto new file mode 100644 index 00000000000..8dc0f693f5a --- /dev/null +++ b/resources/web/wwi/protos/ProtoHinge.proto @@ -0,0 +1,69 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoHinge [ +] +{ +Robot { + children [ + DEF TEST HingeJoint { + jointParameters DEF PARAM HingeJointParameters { + position 1.5078 + axis 0 1 0 + anchor 2 0 0 + minStop -1 + maxStop 2 + } + device [ + PositionSensor { + name "position sensorsssss" + } + ] + endPoint Solid { + translation 1.874090664297881 0 1.9960327750773659 + rotation 0 1 0 1.5077999999999998 + children [ + Shape { + appearance PBRAppearance { + baseColorMap ImageTexture { + url [ + "webots://projects/appearances/protos/textures/copper/copper_base_color.jpg" + ] + } + roughnessMap ImageTexture { + url [ + "webots://projects/appearances/protos/textures/copper/copper_roughness.jpg" + ] + } + metalnessMap ImageTexture { + url [ + "webots://projects/appearances/protos/textures/copper/copper_metalness.jpg" + ] + } + } + geometry IndexedFaceSet { + coord Coordinate { + point [ + -3 0 1.65, -2.98711 0.098436 1.65, -2.98711 -0.09844 1.65, -2.9709 0.098438 1.48621, -2.9709 -0.098439 1.48621, -2.9835 0 1.48308, -2.96388 0.098436 1.79534, -2.96388 -0.09844 1.79534, -2.97656 0 1.79853, -2.95313 0.168748 1.65, -2.95313 -0.168752 1.65, -2.9377 0.168748 1.49447, -2.9377 -0.168752 1.49447, -2.93359 0 1.32012, -2.93045 0.168748 1.78693, -2.93045 -0.168752 1.78693, -2.92188 0.098438 1.32553, -2.92188 -0.098438 1.32553, -2.90625 0 1.91016, -2.89423 0.098436 1.90457, -2.89423 -0.09844 1.90457, -2.89099 0.16875 1.3398, -2.89099 -0.16875 1.3398, -2.85 0.224998 1.65, -2.85 -0.225002 1.65, -2.82867 0.094933 1.17598, -2.82867 -0.094933 1.17598, -2.86255 0.168748 1.88983, -2.86255 -0.168752 1.88983, -2.84971 0 1.16155, -2.76641 0.224998 1.84512, -2.76641 -0.225002 1.84512, -2.77821 0.098436 1.98283, -2.77821 -0.09844 1.98283, -2.829 0.224998 1.7614, -2.829 -0.225002 1.7614, -2.81231 0.16875 1.18719, -2.81231 -0.16875 1.18719, -2.79727 0.225 1.38311, -2.79727 -0.225 1.38311, -2.78906 0 1.99014, -2.7496 0.168748 1.96356, -2.7496 -0.168752 1.96356, -2.74688 0.168748 1.65, -2.74688 -0.168752 1.65, -2.73125 0 1.00781, -2.72756 0.168748 1.73587, -2.72756 -0.168752 1.73587, -2.69413 0.098436 1.72746, -2.69413 -0.09844 1.72746, -2.71289 0.098436 1.65, -2.71289 -0.09844 1.65, -2.67265 0.098438 1.44068, -2.67265 -0.098438 1.44068, -2.70354 0.16875 1.42641, -2.70354 -0.16875 1.42641, -2.70098 0.16875 1.03784, -2.70098 -0.16875 1.03784, -2.7 0 1.65, -2.68144 0 1.72427, -2.67026 0.168748 1.8004, -2.67026 -0.168752 1.8004, -2.66279 0.224998 1.9051, -2.66279 -0.225002 1.9051, -2.66094 0 1.44609, -2.63858 0.098436 1.78567, -2.63858 -0.09844 1.78567, -2.63438 0.225 1.10391, -2.63438 -0.225 1.10391, -2.51875 0.224998 1.94531, -2.51875 -0.225002 1.94531, -2.62656 0 1.78008, -2.625 0 2.04375, -2.5918 0.168748 2.01299, -2.5918 -0.168752 2.01299, -2.56777 0.16875 1.16997, -2.56777 -0.16875 1.16997, -2.5375 0 1.2, -2.4457 0.168748 1.87764, -2.4457 -0.168752 1.87764, -2.4125 0 1.84687, -2.38828 0 0.716602, -1.92188 0 0.453516, -2.37766 0.16875 0.75368, -2.37766 -0.16875 0.75368, -2.3543 -0.225 0.835254, -2.3543 0.225 0.835254, -1.95 -0.225 0.6, -2.11172 -0.225002 1.98223, -2.33093 0.16875 0.916827, -2.33093 -0.16875 0.916827, -2.32031 0 0.953906, -2.06719 0 1.87148, -2.15625 0 2.09297, -2.14233 0.168748 2.05836, -2.14233 -0.168752 2.05836, -2.11172 0.224998 1.98223, -2.0811 0.16875 1.90609, -2.0811 -0.16875 1.90609, -2 0 0.75, -1.98438 0.16875 0.703125, -1.98438 -0.16875 0.703125, -1.97852 0 0.59165, -1.93895 0.403123 0.59165, -1.96 0.4075 0.75, -1.96 -0.4075 0.75, -1.95703 0 1.10039, -1.95 0.225 0.6, -1.93895 -0.403123 0.59165, -1.88344 0.391582 0.453516, -1.91789 0.398745 1.10039, -1.91789 -0.398745 1.10039, -1.91562 0.16875 0.496875, -1.91562 -0.16875 0.496875, -1.82518 0.776567 0.59165, -1.88344 -0.391582 0.453516, -1.845 0.785 0.75, -1.77293 0.754336 0.453516, -1.845 -0.785 0.75, -1.84375 0 1.47187, -1.82518 -0.776567 0.59165, -1.715 0.356563 0.234375, -1.75 0 0.234375, -1.80536 0.768135 1.10039, -1.80687 0.375664 1.47187, -1.80687 -0.375664 1.47187, -1.80536 -0.768135 1.10039, -1.77293 -0.754336 0.453516, -1.61437 0.686875 0.234375, -1.715 -0.356562 0.234375, -1.64464 1.11292 0.59165, -1.6625 1.125 0.75, -1.59756 1.08106 0.453516, -1.70086 0.723672 1.47187, -1.70086 -0.723672 1.47187, -1.62678 1.10083 1.10039, -1.6625 -1.125 0.75, -1.54656 0.321543 0.085547, -1.57813 0 0.085547, -1.64464 -1.11292 0.59165, -1.62678 -1.10083 1.10039, -1.61437 -0.686875 0.234375, -1.45469 0.984375 0.234375, -1.6 0 1.875, -1.59756 -1.08106 0.453516, -1.58438 0.16875 1.91016, -1.58438 -0.16875 1.91016, -1.45582 0.619414 0.085547, -1.54656 -0.321543 0.085547, -1.55 0.225 1.9875, -1.55 -0.225 1.9875, -1.40475 1.40475 0.59165, -1.53262 1.03711 1.47187, -1.53262 -1.03711 1.47187, -1.42 1.42 0.75, -1.47 0.305625 0, -1.5 0 0, -1.51563 0.16875 2.06484, -1.51563 -0.16875 2.06484, -1.36453 1.36453 0.453516, -1.5 0 2.1, -1.5 0 2.25, -1.47 -0.305625 0, -1.47 0.305624 2.25, -1.47 -0.305625 2.25, -1.38949 1.38949 1.10039, -1.38375 0.58875 0, -1.31182 0.887695 0.085547, -1.45582 -0.619414 0.085547, -1.45469 -0.984375 0.234375, -1.44922 0 2.32383, -1.42023 0.295278 2.32383, -1.42023 -0.29528 2.32383, -1.42 -1.42 0.75, -1.2425 1.2425 0.234375, -1.40475 -1.40475 0.59165, -1.40313 0 2.34844, -1.38375 0.58875 2.25, -1.4 0 2.25, -1.38949 -1.38949 1.10039, -1.38375 -0.58875 0, -1.38375 -0.58875 2.25, -1.38047 0 2.32383, -1.37506 0.285885 2.34844, -1.35286 0.281271 2.32383, -1.37506 -0.285888 2.34844, -1.372 0.28525 2.25, -1.372 -0.28525 2.25, -1.36453 -1.36453 0.453516, -1.3369 0.568817 2.32383, -1.35286 -0.281273 2.32383, -1.24688 0.84375 0, -1.3369 -0.568818 2.32383, -1.29438 0.550727 2.34844, -1.27348 0.541834 2.32383, -1.31182 -0.887695 0.085547, -1.30906 1.30906 1.47187, -1.30906 -1.30906 1.47187, -1.3 0 2.25, -1.29438 -0.550727 2.34844, -1.24688 0.84375 2.25, -1.2915 0.5495 2.25, -1.2915 -0.5495 2.25, -1.12047 1.12047 0.085547, -1.274 0.264875 2.25, -1.274 -0.264875 2.25, -1.27348 -0.541834 2.32383, 0 0 0, -1.11292 1.64464 0.59165, -1.26094 0 2.2998, -1.125 1.6625 0.75, -1.20466 0.815186 2.32383, -1.24688 -0.84375 0, -1.24688 -0.84375 2.25, -1.2425 -1.2425 0.234375, -1.08106 1.59756 0.453516, -1.23572 0.256916 2.2998, -1.23572 -0.256916 2.2998, -1.16635 0.789258 2.34844, -1.14752 0.776514 2.32383, -1.19925 0.510249 2.25, -1.10083 1.62678 1.10039, -1.20466 -0.815187 2.32383, -1.19925 -0.51025 2.25, -1.15625 0 2.33906, -1.13312 -0.235586 2.33906, -1.065 1.065 0, -0.984375 1.45469 0.234375, -1.16635 -0.789258 2.34844, -1.16375 0.7875 2.25, -1.16375 -0.787501 2.25, -1.16322 0.494918 2.2998, -1.16322 -0.494918 2.2998, 1.47 -0.305625 0, -1.13312 0.235586 2.33906, -1.06664 -0.453828 2.33906, -1.14752 -0.776514 2.32383, -1.065 1.065 2.25, 1.5 0 0, 1.47 0.305625 0, -1.125 -1.6625 0.75, -1.08063 0.73125 2.25, -1.12047 -1.12047 0.085547, -1.11292 -1.64464 0.59165, -1.10083 -1.62678 1.10039, -1.02894 1.028939 2.32383, -1.08106 -1.59756 0.453516, -1.08063 -0.73125 2.25, -0.996219 0.996219 2.34844, -0.980133 0.980133 2.32383, -1.06664 0.453828 2.33906, 1.38375 -0.58875 0, -1.065 -1.065 0, -1.065 -1.065001 2.25, -1.03711 1.53262 1.47187, 1.38375 0.58875 0, -0.961133 -0.650391 2.33906, -0.887695 1.31182 0.085547, -1.04815 0.709276 2.2998, -1.04815 -0.709277 2.2998, -1.03711 -1.53262 1.47187, -1.02894 -1.02894 2.32383, -0.996219 -0.996219 2.34844, -0.994 0.994 2.25, -0.994 -0.994 2.25, -0.923 0.923 2.25, -0.984375 -1.45469 0.234375, -0.980133 -0.980133 2.32383, -0.84375 1.24688 0, -0.961133 0.650391 2.33906, -1.47 0.305625 0, -0.776567 1.82518 0.59165, -0.785 1.845 0.75, -0.84375 1.24688 2.25, 1.24688 -0.84375 0, -0.820938 -0.820938 2.33906, -0.754336 1.77293 0.453516, -0.923 -0.923 2.25, -0.768135 1.80536 1.10039, -0.815186 1.20466 2.32383, -0.895266 0.895266 2.2998, -0.895266 -0.895266 2.2998, -0.887695 -1.31182 0.085547, -0.789258 1.16635 2.34844, -0.776514 1.147519 2.32383, -0.686875 1.61437 0.234375, -0.84375 -1.24688 0, -0.84375 -1.246881 2.25, -0.825 0 2.4, -0.820938 0.820938 2.33906, -1.5 0 0, -0.815186 -1.204661 2.32383, -0.73125 1.080629 2.25, -0.8085 0.168094 2.4, -0.8085 -0.168094 2.4, -0.723672 1.70086 1.47187, -0.619414 1.45582 0.085547, -0.789258 -1.16635 2.34844, -0.7875 1.16375 2.25, -0.7875 -1.163751 2.25, -0.785 -1.845 0.75, -0.776567 -1.82518 0.59165, -0.776514 -1.14752 2.32383, 1.24688 0.84375 0, -0.650391 -0.961133 2.33906, -0.768135 -1.80536 1.10039, -0.761063 0.323813 2.4, -0.761063 -0.323813 2.4, -0.754336 -1.77293 0.453516, -0.58875 1.38375 0, -0.73125 -1.08063 2.25, -0.723672 -1.70086 1.47187, -0.709277 1.048149 2.2998, -0.709277 -1.04815 2.2998, -0.58875 1.383749 2.25, -0.686875 -1.61437 0.234375, -0.685781 0.464063 2.4, -0.685781 -0.464063 2.4, -0.568818 1.3369 2.32383, -0.550727 1.294379 2.34844, -0.541834 1.27348 2.32383, -0.650391 0.961133 2.33906, -1.47 -0.305625 0, -0.420891 0.179078 2.46094, -0.420891 -0.179078 2.46094, -0.619414 -1.45582 0.085547, -0.51025 1.19925 2.25, -0.403123 1.93895 0.59165, -0.4075 1.96 0.75, -0.58875 -1.38375 0, -0.58875 -1.38375 2.25, -0.58575 0.58575 2.4, -0.58575 -0.58575 2.4, -0.391582 1.88344 0.453516, 1.065 -1.065 0, -0.453828 -1.06664 2.33906, -0.568818 -1.3369 2.32383, -0.398745 1.91789 1.10039, -0.550727 -1.29438 2.34844, -0.5495 1.2915 2.25, -0.5495 -1.2915 2.25, -0.356562 1.715 0.234375, -0.541834 -1.273481 2.32383, -0.51025 -1.19925 2.25, -0.375664 1.80687 1.47187, -0.321543 1.54656 0.085547, -0.494918 1.16322 2.2998, -0.494918 -1.163221 2.2998, -0.453828 1.06664 2.33906, -0.464063 0.685781 2.4, -0.464063 -0.685781 2.4, -0.305625 1.47 0, -0.45625 0 2.46094, -1.38375 0.58875 0, -0.305625 1.47 2.25, -0.295278 1.42023 2.32383, -0.285887 1.37506 2.34844, -0.281271 1.35286 2.32383, -0.4075 -1.96 0.75, -0.179078 0.420891 2.46094, -0.179078 -0.420891 2.46094, -0.403123 -1.93895 0.59165, -0.398745 -1.91789 1.10039, -0.391582 -1.88344 0.453516, -0.264875 1.274 2.25, -0.375664 -1.80687 1.47187, -0.362109 0 2.89717, 1.065 1.065 0, -0.235586 -1.13312 2.33906, -0.356563 -1.715 0.234375, -0.340625 0 2.95078, -0.314464 0.134405 2.95078, -0.314464 -0.134409 2.95078, -0.334238 0.142703 2.89717, -0.334238 -0.142707 2.89717, -0.299953 0.127984 2.83125, -0.299953 -0.127984 2.83125, -0.325 0 2.83125, -0.323938 0.323938 2.46094, -0.323938 -0.323938 2.46094, -0.323813 0.761063 2.4, -0.323813 -0.761063 2.4, -0.321543 -1.54656 0.085547, -0.305625 -1.47 0, -0.305625 -1.47 2.25, -0.235586 1.13312 2.33906, -0.295278 -1.42023 2.32383, -0.285887 -1.37506 2.34844, -0.28525 1.372 2.25, -0.28525 -1.372 2.25, -0.281271 -1.35286 2.32383, -0.264875 -1.274 2.25, -0.25761 0.257609 2.89717, -0.25761 -0.25761 2.89717, -0.256916 1.23572 2.2998, -0.256916 -1.23572 2.2998, -0.242477 0.242475 2.95078, -0.242477 -0.242479 2.95078, -1.38375 -0.58875 0, -0.231125 0.231125 2.83125, -0.231125 -0.231125 2.83125, -0.230078 0 2.98682, -0.212516 0.091111 2.98682, -0.212516 -0.091115 2.98682, 0 1.97852 0.59165, 0 2 0.75, -0.2 0 2.55, 0 1.92188 0.453516, -0.196875 0 2.68359, -0.134407 0.314462 2.95078, -0.134407 -0.314465 2.95078, 0 1.95703 1.10039, -0.127984 0.299953 2.83125, -0.127984 -0.299953 2.83125, 0 1.75 0.234375, -0.1845 0.0785 2.55, -0.1845 -0.0785 2.55, -0.181661 0.077405 2.68359, -0.181661 -0.077405 2.68359, -0.153882 0.065504 2.6124, -0.153882 -0.065504 2.6124, 0 1.84375 1.47187, 0 1.57813 0.085547, -0.168094 0.8085 2.4, -0.168094 -0.8085 2.4, -0.166797 0 2.6124, -0.164073 0.164072 2.98682, -0.164073 -0.164075 2.98682, 0 1.5 0, 0 1.5 2.25, 0 1.44922 2.32383, -0.142705 0.334238 2.89717, -0.142705 -0.334238 2.89717, -0.142 0.142 2.55, -0.142 -0.142 2.55, 0 1.40313 2.34844, 0 1.38047 2.32383, -0.139898 0.139898 2.68359, -0.139898 -0.139898 2.68359, 0 1.3 2.25, 0.84375 -1.24688 0, 0 -1.15625 2.33906, -0.118458 0.118458 2.6124, -0.118458 -0.118458 2.6124, 0 0 3, -0.065504 0.153882 2.6124, -0.065504 -0.153882 2.6124, 0 1.15625 2.33906, -0.091113 0.212516 2.98682, -0.091113 -0.212516 2.98682, -0.0785 0.1845 2.55, -0.0785 -0.1845 2.55, -0.077405 0.181661 2.68359, -0.077405 -0.181661 2.68359, 0 -1.5 0, 0 -1.57813 0.085547, 0 -1.75 0.234375, 0 -1.92188 0.453516, 0 -1.97852 0.59165, 0 -2 0.75, 0 -1.95703 1.10039, 0 -1.84375 1.47187, 0 1.4 2.25, 0 -1.3 2.25, 0 -1.4 2.25, 0 -1.5 2.25, 0 1.26094 2.2998, 0 -1.26094 2.2998, 0 -1.38047 2.32383, 0 -1.44922 2.32383, -1.24688 0.84375 0, 0 -1.40313 2.34844, 0 0.825 2.4, 0 -0.825 2.4, 0 0.45625 2.46094, 0 -0.45625 2.46094, 0 0.2 2.55, 0 -0.2 2.55, 0 0.166797 2.6124, 0 -0.166797 2.6124, 0 0.196875 2.68359, 0 -0.196875 2.68359, 0 0.325 2.83125, 0 -0.325 2.83125, 0 0.362109 2.89717, 0 -0.362109 2.89717, 0 0.340625 2.95078, 0 -0.340625 2.95078, 0 0.230078 2.98682, 0 -0.230078 2.98682, 0.065504 0.153882 2.6124, 0.065504 -0.153882 2.6124, 0.127984 0.299953 2.83125, 0.127984 -0.299953 2.83125, 0.134407 0.314464 2.95078, 0.134407 -0.314464 2.95078, 0.179078 0.420891 2.46094, 0.179078 -0.420891 2.46094, 0.077405 0.181661 2.68359, 0.077405 -0.181661 2.68359, 0.0785 0.1845 2.55, 0.0785 -0.1845 2.55, 0.091113 0.212516 2.98682, 0.091113 -0.212516 2.98682, 0.235586 1.13312 2.33906, 0.118458 0.118458 2.6124, 0.118458 -0.118458 2.6124, 0.84375 1.24688 0, 0.235586 -1.13312 2.33906, 0.264875 1.274 2.25, 0.139898 0.139898 2.68359, 0.139898 -0.139898 2.68359, 0.281271 1.35286 2.32383, 0.285887 1.37506 2.34844, 0.142 0.142 2.55, 0.142 -0.142 2.55, 0.142705 0.334238 2.89717, 0.142705 -0.334238 2.89717, 0.295278 1.42023 2.32383, 0.153882 0.065504 2.6124, 0.153882 -0.065504 2.6124, 0.305625 1.47 2.25, 0.305625 1.47 0, 0.164073 0.164073 2.98682, 0.164073 -0.164073 2.98682, 0.166797 0 2.6124, 0.168094 0.8085 2.4, 0.168094 -0.8085 2.4, 0.321543 1.54656 0.085547, 0.375664 1.80687 1.47187, 0.181661 0.077405 2.68359, 0.181661 -0.077405 2.68359, 0.1845 0.0785 2.55, 0.1845 -0.0785 2.55, 0.356563 1.715 0.234375, 0.398745 1.91789 1.10039, 0.196875 0 2.68359, 0.391582 1.88344 0.453516, 0.2 0 2.55, 0.4075 1.96 0.75, 0.403123 1.93895 0.59165, 0.212516 0.091113 2.98682, 0.212516 -0.091113 2.98682, 0.299953 0.127984 2.83125, 0.299953 -0.127984 2.83125, 0.230078 0 2.98682, 0.231125 0.231125 2.83125, 0.231125 -0.231125 2.83125, 0.314464 0.134407 2.95078, 0.314464 -0.134407 2.95078, -1.24688 -0.84375 0, 0.242477 0.242477 2.95078, 0.242477 -0.242477 2.95078, 0.256916 1.23572 2.2998, 0.256916 -1.23572 2.2998, 0.25761 0.25761 2.89717, 0.25761 -0.25761 2.89717, 0.264875 -1.274 2.25, 0.420891 0.179078 2.46094, 0.420891 -0.179078 2.46094, 0.281271 -1.35286 2.32383, 0.28525 1.372 2.25, 0.28525 -1.372 2.25, 0.285887 -1.37506 2.34844, 0.295278 -1.42023 2.32383, 0.453828 1.06664 2.33906, 0.305625 -1.47 0, 0.305625 -1.47 2.25, 0.321543 -1.54656 0.085547, 0.323813 0.761063 2.4, 0.323813 -0.761063 2.4, 0.323938 0.323938 2.46094, 0.323938 -0.323938 2.46094, 0.325 0 2.83125, 0.334238 0.142705 2.89717, 0.334238 -0.142705 2.89717, 0.340625 0 2.95078, 0.356562 -1.715 0.234375, 0.58875 -1.38375 0, 0.453828 -1.06664 2.33906, 0.362109 0 2.89717, 0.375664 -1.80687 1.47187, 0.51025 1.19925 2.25, 0.391582 -1.88344 0.453516, 0.398745 -1.91789 1.10039, 0.403123 -1.93895 0.59165, 0.4075 -1.96 0.75, 0.541834 1.27348 2.32383, 0.550727 1.29438 2.34844, 0.568818 1.3369 2.32383, 0.58875 1.38375 2.25, -1.065 1.065 0, 0.45625 0 2.46094, 0.58875 1.38375 0, 0.464063 0.685781 2.4, 0.464063 -0.685781 2.4, 0.650391 0.961133 2.33906, 0.494918 1.16322 2.2998, 0.494918 -1.16322 2.2998, 0.619414 1.45582 0.085547, 0.723672 1.70086 1.47187, 0.51025 -1.19925 2.25, 0.541834 -1.27348 2.32383, 0.686875 1.61437 0.234375, 0.5495 1.2915 2.25, 0.5495 -1.2915 2.25, 0.550727 -1.29438 2.34844, 0.768135 1.80536 1.10039, 0.568818 -1.3369 2.32383, 0.58875 1.38375 0, 0.650391 -0.961133 2.33906, 0.754336 1.77293 0.453516, 0.58575 0.58575 2.4, 0.58575 -0.58575 2.4, 0.58875 -1.38375 0, 0.58875 -1.38375 2.25, 0.785 1.845 0.75, 0.776567 1.82518 0.59165, 0.73125 1.08063 2.25, 0.619414 -1.45582 0.085547, 0.820938 0.820938 2.33906, -1.065 -1.065 0, 0.776514 1.14752 2.32383, 0.789258 1.16635 2.34844, 0.815186 1.20466 2.32383, 0.685781 0.464063 2.4, 0.685781 -0.464063 2.4, 0.686875 -1.61437 0.234375, 0.84375 1.24688 2.25, 0.709277 1.04815 2.2998, 0.709277 -1.04815 2.2998, 0.723672 -1.70086 1.47187, 0.73125 -1.08063 2.25, 0.84375 1.24688 0, 0.754336 -1.77293 0.453516, 0.761063 0.323813 2.4, 0.761063 -0.323813 2.4, 0.961133 0.650391 2.33906, 0.820938 -0.820938 2.33906, 0.768135 -1.80536 1.10039, 0.305625 -1.47 0, 0.776514 -1.14752 2.32383, 0.776567 -1.82518 0.59165, 0.785 -1.845 0.75, 0.7875 1.16375 2.25, 0.7875 -1.16375 2.25, 0.789258 -1.16635 2.34844, 0.887695 1.31182 0.085547, 1.03711 1.53262 1.47187, 0.8085 0.168094 2.4, 0.8085 -0.168094 2.4, 0.923 0.923 2.25, 0.815186 -1.20466 2.32383, -0.84375 1.24688 0, 0.825 0 2.4, 0.84375 -1.24688 0, 0.84375 -1.24688 2.25, 1.06664 0.453828 2.33906, 0.961133 -0.650391 2.33906, 0.984375 1.45469 0.234375, 0.980133 0.980133 2.32383, 0.996219 0.996219 2.34844, 0.887695 -1.31182 0.085547, 0.895266 0.895266 2.2998, 0.895266 -0.895266 2.2998, 1.02894 1.02894 2.32383, 1.10083 1.62678 1.10039, 0.923 -0.923 2.25, 1.08106 1.59756 0.453516, 0.305625 1.47 0, 1.065 1.065 2.25, 1.13312 0.235586 2.33906, 1.06664 -0.453828 2.33906, 1.125 1.6625 0.75, 1.11292 1.64464 0.59165, -0.84375 -1.24688 0, 1.065 1.065 0, 0.980133 -0.980133 2.32383, 1.15625 0 2.33906, 1.13312 -0.235586 2.33906, 0.984375 -1.45469 0.234375, 1.08063 0.73125 2.25, 0.994 0.994 2.25, 0.994 -0.994 2.25, 0.996219 -0.996219 2.34844, 1.02894 -1.02894 2.32383, 1.03711 -1.53262 1.47187, 1.04815 0.709277 2.2998, 1.04815 -0.709277 2.2998, 1.12047 1.12047 0.085547, 0 -1.5 0, 1.30906 1.30906 1.47187, 1.065 -1.065 0, 1.065 -1.065 2.25, -0.58875 1.38375 0, 1.14752 0.776514 2.32383, 1.16635 0.789258 2.34844, 1.08063 -0.73125 2.25, 1.08106 -1.59756 0.453516, 1.20466 0.815186 2.32383, 1.10083 -1.62678 1.10039, 1.11292 -1.64464 0.59165, 1.12047 -1.12047 0.085547, 1.19925 0.51025 2.25, 1.125 -1.6625 0.75, 1.24688 0.84375 2.25, 1.14752 -0.776514 2.32383, 0 1.5 0, -0.58875 -1.38375 0, 1.16322 0.494918 2.2998, 1.16322 -0.494918 2.2998, 1.16375 0.7875 2.25, 1.16375 -0.7875 2.25, 1.16635 -0.789258 2.34844, 1.2425 1.2425 0.234375, 1.24688 0.84375 0, -0.305625 -1.47 0, -0.305625 1.47 0, 1.19925 -0.51025 2.25, 1.20466 -0.815186 2.32383, 1.38949 1.38949 1.10039, 1.274 0.264875 2.25, 1.27348 0.541834 2.32383, 1.29438 0.550727 2.34844, 1.23572 0.256916 2.2998, 1.23572 -0.256916 2.2998, 1.36453 1.36453 0.453516, 1.2425 -1.2425 0.234375, 1.24688 -0.84375 0, 1.24688 -0.84375 2.25, 1.3369 0.568818 2.32383, 1.42 1.42 0.75, 1.26094 0 2.2998, 1.40475 1.40475 0.59165, 1.274 -0.264875 2.25, 1.27348 -0.541834 2.32383, 1.31182 0.887695 0.085547, 1.53262 1.03711 1.47187, 1.30906 -1.30906 1.47187, 1.2915 0.5495 2.25, 1.2915 -0.5495 2.25, 1.38375 0.58875 2.25, 1.29438 -0.550727 2.34844, 1.3 0 2.25, 1.31182 -0.887695 0.085547, 1.35286 0.281271 2.32383, 1.37506 0.285887 2.34844, 1.3369 -0.568818 2.32383, 1.38375 0.58875 0, 1.35286 -0.281271 2.32383, 1.42023 0.295278 2.32383, 1.36453 -1.36453 0.453516, 1.372 0.28525 2.25, 1.372 -0.28525 2.25, 1.37506 -0.285887 2.34844, 1.38047 0 2.32383, 1.40313 0 2.34844, 1.38375 -0.58875 0, 1.38375 -0.58875 2.25, 1.38949 -1.38949 1.10039, 1.4 0 2.25, 1.47 0.305625 2.25, 1.40475 -1.40475 0.59165, 1.44922 0 2.32383, 1.42023 -0.295278 2.32383, 1.45469 0.984375 0.234375, 1.42 -1.42 0.75, 1.45469 -0.984375 0.234375, 1.45582 0.619414 0.085547, 1.45582 -0.619414 0.085547, 1.5 0 2.25, 1.47 -0.305625 2.25, 1.47 0.305625 0, 1.62678 1.10083 1.10039, 1.70086 0.723672 1.47187, 1.53262 -1.03711 1.47187, 1.47 -0.305625 0, 1.5 0 0, 1.59756 1.08106 0.453516, 1.6625 1.125 0.75, 1.64464 1.11292 0.59165, 1.54656 0.321543 0.085547, 1.54656 -0.321543 0.085547, 1.57813 0 0.085547, 1.80687 0.375664 1.47187, 1.70086 -0.723672 1.47187, 1.59756 -1.08106 0.453516, 1.61437 0.686875 0.234375, 1.61437 -0.686875 0.234375, 1.62678 -1.10083 1.10039, 1.64464 -1.11292 0.59165, 1.84375 0 1.47187, 1.80687 -0.375664 1.47187, 1.6625 -1.125 0.75, 1.80536 0.768135 1.10039, 1.7 0 0.522129, 1.7 0.37125 0.578906, 1.7 -0.37125 0.578906, 1.7 0.464063 0.711035, 1.7 -0.464063 0.711035, 1.7 0.495 0.8625, 1.7 -0.495 0.8625, 1.7 0.464063 1.01397, 1.7 -0.464063 1.01397, 1.7 0.37125 1.14609, 1.7 -0.37125 1.14609, 1.7 0.216563 1.23955, 1.7 -0.216563 1.23955, 1.7 0 1.275, 1.77293 0.754336 0.453516, 1.715 0.356562 0.234375, 1.715 -0.356563 0.234375, 1.845 0.785 0.75, 1.82518 0.776567 0.59165, 1.75 0 0.234375, 1.77293 -0.754336 0.453516, 1.80536 -0.768135 1.10039, 1.91789 0.398745 1.10039, 1.82518 -0.776567 0.59165, 1.845 -0.785 0.75, 1.88344 0.391582 0.453516, 1.95703 0 1.10039, 1.91789 -0.398745 1.10039, 1.96 0.4075 0.75, 1.88344 -0.391582 0.453516, 1.93895 0.403123 0.59165, 1.92188 0 0.453516, 1.93879 0 0.546766, 1.93895 -0.403123 0.59165, 2 0 0.75, 1.96 -0.4075 0.75, 1.97852 0 0.59165, 1.98496 0 1.30459, 1.99136 0.210782 1.27331, 1.99136 -0.210782 1.27331, 2.11053 0.36134 0.690317, 2.11053 -0.36134 0.690317, 2.00821 0.36134 1.19084, 2.00821 -0.36134 1.19084, 2.03205 0.451675 1.07424, 2.03205 -0.451675 1.07424, 2.13379 0 0.576563, 2.05938 0.481787 0.940576, 2.05938 -0.481787 0.940576, 2.17969 0 1.38516, 2.0867 0.451675 0.806915, 2.0867 -0.451675 0.806915, 2.21631 0.335215 1.28957, 2.21631 -0.335215 1.28957, 2.12739 0.210782 0.607845, 2.12739 -0.210782 0.607845, 2.29688 0.446953 1.0793, 2.29688 -0.446953 1.0793, 2.18976 0.195542 1.35887, 2.18976 -0.195542 1.35887, 2.2202 0.434457 0.891314, 2.2202 -0.434457 0.891314, 2.25384 0.419019 1.1916, 2.25384 -0.419019 1.1916, 2.25944 0.349967 0.772489, 2.25944 -0.349967 0.772489, 2.28189 0.204147 0.696393, 2.28189 -0.204147 0.696393, 2.29041 0 0.667529, 2.37744 0.335215 0.869019, 2.37744 -0.335215 0.869019, 2.30644 0 1.5044, 2.31838 0.173996 1.48356, 2.31838 -0.173996 1.48356, 2.33991 0.419019 0.966989, 2.33991 -0.419019 0.966989, 2.41406 0 0.773438, 2.34984 0.298279 1.42864, 2.34984 -0.298279 1.42864, 2.3875 0 1.65, 1.19925 0.51025 2.25, 2.43438 0.255938 1.59434, 2.40039 -0.149297 1.63469, 1.08063 -0.73125 2.25, 2.39432 0.372849 1.35098, 2.39432 -0.372849 1.35098, 2.40039 0.149297 1.63469, 1.16375 -0.7875 2.25, 2.40399 0.195542 0.799722, 2.40399 -0.195542 0.799722, 2.48242 0.319922 1.53728, 2.43438 -0.255938 1.59434, -0.264875 1.274 2.25, 1.2915 -0.5495 2.25, 2.44531 0.397705 1.26196, 2.44531 -0.397705 1.26196, 2.50156 0 1.97109, 0.994 -0.994 2.25, 2.5375 0.34125 1.47187, 2.48242 -0.319922 1.53728, 2.55869 0.17666 1.95095, 2.51727 -0.103052 1.96555, -0.51025 -1.19925 2.25, 1.3 0 2.25, 2.4963 0.372849 1.17295, 2.4963 -0.372849 1.17295, 0.994 0.994 2.25, 2.51727 0.103052 1.96555, 1.274 -0.264875 2.25, 2.59258 0.319922 1.40647, 2.59258 -0.319922 1.40647, 2.61725 0.220825 1.93031, 2.55869 -0.17666 1.95095, -0.5495 -1.2915 2.25, 2.5375 -0.34125 1.47187, 2.54078 0.298279 1.09529, 2.54078 -0.298279 1.09529, 2.5791 0 2.12197, 1.08063 0.73125 2.25, -0.28525 1.372 2.25, 1.2915 0.5495 2.25, 2.57225 0.173996 1.04036, 2.57225 -0.173996 1.04036, 0.923 -0.923 2.25, 2.68438 0.235547 1.90664, 2.61725 -0.220825 1.93031, 2.6496 0.150535 2.11451, 2.59849 -0.087812 2.11992, 2.58418 0 1.01953, 2.59849 0.087812 2.11992, 1.274 0.264875 2.25, 2.67461 0.149297 1.30906, 2.67461 -0.149297 1.30906, 2.61162 0.287908 1.69128, 2.61162 -0.287908 1.69128, -0.28525 -1.372 2.25, 1.16375 0.7875 2.25, 2.72599 0.17525 2.10643, 2.72599 -0.17525 2.10643, 2.64063 0.255938 1.34941, 2.64063 -0.255938 1.34941, 0 -1.3 2.25, 2.6496 -0.150535 2.11451, 2.7 0 2.25, 0.923 0.923 2.25, 2.66542 0.266995 1.64925, 2.66542 -0.266995 1.64925, 2.7515 0.220825 1.88297, 2.7515 -0.220825 1.88297, -0.264875 -1.274 2.25, 2.68438 -0.235547 1.90664, 2.6875 0 1.29375, 2.79375 0.140625 2.25, 2.72578 -0.082031 2.25, 0.7875 -1.16375 2.25, 2.80469 0.200713 2.0981, 2.80469 -0.200713 2.0981, 2.71703 0.213596 1.61167, 2.71703 -0.213596 1.61167, 2.72578 0.082031 2.25, 1.19925 -0.51025 2.25, 0 1.4 2.25, 2.77556 0 2.284, 0.7875 1.16375 2.25, 2.75354 0.124598 1.58508, 2.75354 -0.124598 1.58508, 2.76738 0 1.575, 0.73125 -1.08063 2.25, 2.85148 0.103052 1.84773, 2.85148 -0.103052 1.84773, 0 -1.4 2.25, 2.79375 -0.140625 2.25, 2.87228 0.131836 2.29425, 2.79949 -0.076904 2.29275, 2.79949 0.076904 2.29275, 0.5495 1.2915 2.25, 0 1.3 2.25, 2.81006 0.17666 1.86233, 2.81006 -0.17666 1.86233, 3 0.1875 2.25, 3 -0.1875 2.25, 2.825 0 2.30625, 0.73125 1.08063 2.25, 0.5495 -1.2915 2.25, -0.7875 1.16375 2.25, -0.5495 1.2915 2.25, 2.85092 0.065625 2.30716, 2.85092 -0.065625 2.30716, 2.91924 0.1125 2.30955, 2.91924 -0.1125 2.30955, -0.73125 1.080629 2.25, -0.51025 1.19925 2.25, -0.923 -0.923 2.25, -0.73125 -1.08063 2.25, 2.86719 0 1.84219, 0.264875 1.274 2.25, 2.87228 -0.131836 2.29425, 2.95978 0.150535 2.08168, 2.95978 -0.150535 2.08168, -0.923 0.923 2.25, -0.7875 -1.163751 2.25, 2.89827 0.194382 2.17088, 2.89827 -0.194382 2.17088, 0.51025 1.19925 2.25, 0.51025 -1.19925 2.25, 3.09316 0.175781 2.29878, 3.09316 -0.175781 2.29878, 0.264875 -1.274 2.25, 3.12656 0.15 2.3168, 3.12656 -0.15 2.3168, 3.01089 0.087812 2.07627, 3.01089 -0.087812 2.07627, -0.994 -0.994 2.25, -1.16375 -0.787501 2.25, 3.03027 0 2.07422, 3.12691 0.083542 2.17128, 3.12691 -0.083542 2.17128, 3.20625 0.140625 2.25, 3.20625 -0.140625 2.25, 3.06842 0.143215 2.17345, 3.06842 -0.143215 2.17345, 3.1491 0 2.17046, 0.28525 1.372 2.25, -0.994 0.994 2.25, -1.16375 0.7875 2.25, 0.28525 -1.372 2.25, 1.372 0.28525 2.25, -1.08063 -0.73125 2.25, -1.19925 -0.51025 2.25, 3.31405 0.131836 2.30331, 3.31405 -0.131836 2.30331, 3.27422 0.082031 2.25, 3.27422 -0.082031 2.25, -1.08063 0.73125 2.25, -1.19925 0.510249 2.25, 3.3 0 2.25, 3.33389 0.1125 2.32405, 3.33389 -0.1125 2.32405, -1.2915 0.5495 2.25, -1.274 -0.264875 2.25, 3.38684 0.076904 2.30481, 3.38684 -0.076904 2.30481, -1.3 0 2.25, -1.274 0.264875 2.25, 1.4 0 2.25, 3.406018 0 2.323659, -1.2915 -0.5495 2.25, 3.398311 0 2.309932, 3.40221 0.065625 2.32644, 3.40221 -0.065625 2.32644, -1.372 0.28525 2.25, -1.4 0 2.25, 1.372 -0.28525 2.25, -1.372 -0.28525 2.25, -1.988644 0 0.75, -1.910524 0 0.453516, 2.8 0 2.25, 2.825 0 2.30625, 2.81719 0.049219 2.25, 2.81719 -0.049219 2.25, 2.86263 0.054346 2.29298, 2.86263 -0.054346 2.29298, 2.84063 0 2.29219, 2.85092 0.065625 2.30716, 2.85092 -0.065625 2.30716, 2.91924 0.1125 2.30955, 2.91924 -0.1125 2.30955, 2.8625 0.084375 2.25, 2.8625 -0.084375 2.25, 2.92064 0.093164 2.29507, 2.92064 -0.093164 2.29507, 3.09668 0.124219 2.30142, 3.09668 -0.124219 2.30142, 3 0.1125 2.25, 3 -0.1125 2.25, 3.12656 0.15 2.3168, 3.12656 -0.15 2.3168, 3.1375 0.084375 2.25, 3.1375 -0.084375 2.25, 3.18281 0.049219 2.25, 3.18281 -0.049219 2.25, 3.2 0 2.25, 3.33389 0.1125 2.32405, 3.33389 -0.1125 2.32405, 3.33073 0.054346 2.30985, 3.33073 -0.054346 2.30985, 3.27272 0.093164 2.30776, 3.27272 -0.093164 2.30776, 3.406018 0 2.323659, 3.35543 0 2.3027, 3.40221 0.065625 2.32644, 3.40221 -0.065625 2.32644, 2.571933 0 2.036519, 2.587657 0.045022 2.036519, 2.587657 -0.045023 2.036519, 2.629104 0.077181 2.036519, 2.629104 -0.077181 2.036519, 2.75488 0.102908 2.036519, 2.75488 -0.102908 2.036519, 2.880657 0.077181 2.036519, 2.880657 -0.077181 2.036519, 2.922104 0.045022 2.036519, 2.922104 -0.045023 2.036519, 2.937828 0 2.036519, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628, 2.555185 0 1.614628 + ] + } + texCoord TextureCoordinate { + point [ + 1.9341 0.9434, 1.9341 0.974, 1.9993 0.9434, 1.9993 0.9434, 1.9341 0.974, 1.9993 0.974, 1.8713 0.9434, 1.8713 0.974, 1.9341 0.9434, 1.9341 0.9434, 1.8713 0.974, 1.9341 0.974, 1.8099 0.9434, 1.8099 0.974, 1.8713 0.9434, 1.8713 0.9434, 1.8099 0.974, 1.8713 0.974, 1.7493 0.9434, 1.7493 0.974, 1.8099 0.9434, 1.8099 0.9434, 1.7493 0.974, 1.8099 0.974, 1.9341 0.974, 1.9341 0.9842, 1.9993 0.974, 1.9993 0.974, 1.9341 0.9842, 1.9993 0.9842, 1.8713 0.974, 1.8713 0.9842, 1.9341 0.974, 1.9341 0.974, 1.8713 0.9842, 1.9341 0.9842, 1.8099 0.974, 1.8099 0.9842, 1.8713 0.974, 1.8713 0.974, 1.8099 0.9842, 1.8713 0.9842, 1.7493 0.974, 1.7493 0.9842, 1.8099 0.974, 1.8099 0.974, 1.7493 0.9842, 1.8099 0.9842, 1.6887 0.9434, 1.6887 0.974, 1.7493 0.9434, 1.7493 0.9434, 1.6887 0.974, 1.7493 0.974, 1.6274 0.9434, 1.6274 0.974, 1.6887 0.9434, 1.6887 0.9434, 1.6274 0.974, 1.6887 0.974, 1.5646 0.9434, 1.5646 0.974, 1.6274 0.9434, 1.6274 0.9434, 1.5646 0.974, 1.6274 0.974, 1.4993 0.9434, 1.4993 0.974, 1.5646 0.9434, 1.5646 0.9434, 1.4993 0.974, 1.5646 0.974, 1.6887 0.974, 1.6887 0.9842, 1.7493 0.974, 1.7493 0.974, 1.6887 0.9842, 1.7493 0.9842, 1.6274 0.974, 1.6274 0.9842, 1.6887 0.974, 1.6887 0.974, 1.6274 0.9842, 1.6887 0.9842, 1.5646 0.974, 1.5646 0.9842, 1.6274 0.974, 1.6274 0.974, 1.5646 0.9842, 1.6274 0.9842, 1.4993 0.974, 1.4993 0.9842, 1.5646 0.974, 1.5646 0.974, 1.4993 0.9842, 1.5646 0.9842, 1.9341 0.9842, 1.9341 0.974, 1.9993 0.9842, 1.9993 0.9842, 1.9341 0.974, 1.9993 0.974, 1.8713 0.9842, 1.8713 0.974, 1.9341 0.9842, 1.9341 0.9842, 1.8713 0.974, 1.9341 0.974, 1.8099 0.9842, 1.8099 0.974, 1.8713 0.9842, 1.8713 0.9842, 1.8099 0.974, 1.8713 0.974, 1.7493 0.9842, 1.7493 0.974, 1.8099 0.9842, 1.8099 0.9842, 1.7493 0.974, 1.8099 0.974, 1.9341 0.974, 1.9341 0.9434, 1.9993 0.974, 1.9993 0.974, 1.9341 0.9434, 1.9993 0.9434, 1.8713 0.974, 1.8713 0.9434, 1.9341 0.974, 1.9341 0.974, 1.8713 0.9434, 1.9341 0.9434, 1.8099 0.974, 1.8099 0.9434, 1.8713 0.974, 1.8713 0.974, 1.8099 0.9434, 1.8713 0.9434, 1.7493 0.974, 1.7493 0.9434, 1.8099 0.974, 1.8099 0.974, 1.7493 0.9434, 1.8099 0.9434, 1.6887 0.9842, 1.6887 0.974, 1.7493 0.9842, 1.7493 0.9842, 1.6887 0.974, 1.7493 0.974, 1.6274 0.9842, 1.6274 0.974, 1.6887 0.9842, 1.6887 0.9842, 1.6274 0.974, 1.6887 0.974, 1.5646 0.9842, 1.5646 0.974, 1.6274 0.9842, 1.6274 0.9842, 1.5646 0.974, 1.6274 0.974, 1.4993 0.9842, 1.4993 0.974, 1.5646 0.9842, 1.5646 0.9842, 1.4993 0.974, 1.5646 0.974, 1.6887 0.974, 1.6887 0.9434, 1.7493 0.974, 1.7493 0.974, 1.6887 0.9434, 1.7493 0.9434, 1.6274 0.974, 1.6274 0.9434, 1.6887 0.974, 1.6887 0.974, 1.6274 0.9434, 1.6887 0.9434, 1.5646 0.974, 1.5646 0.9434, 1.6274 0.974, 1.6274 0.974, 1.5646 0.9434, 1.6274 0.9434, 1.4993 0.974, 1.4993 0.9434, 1.5646 0.974, 1.5646 0.974, 1.4993 0.9434, 1.5646 0.9434, 1.4341 0.9434, 1.4341 0.974, 1.4993 0.9434, 1.4993 0.9434, 1.4341 0.974, 1.4993 0.974, 1.3713 0.9434, 1.3713 0.974, 1.4341 0.9434, 1.4341 0.9434, 1.3713 0.974, 1.4341 0.974, 1.3099 0.9434, 1.3099 0.974, 1.3713 0.9434, 1.3713 0.9434, 1.3099 0.974, 1.3713 0.974, 1.2493 0.9434, 1.2493 0.974, 1.3099 0.9434, 1.3099 0.9434, 1.2493 0.974, 1.3099 0.974, 1.4341 0.974, 1.4341 0.9842, 1.4993 0.974, 1.4993 0.974, 1.4341 0.9842, 1.4993 0.9842, 1.3713 0.974, 1.3713 0.9842, 1.4341 0.974, 1.4341 0.974, 1.3713 0.9842, 1.4341 0.9842, 1.3099 0.974, 1.3099 0.9842, 1.3713 0.974, 1.3713 0.974, 1.3099 0.9842, 1.3713 0.9842, 1.2493 0.974, 1.2493 0.9842, 1.3099 0.974, 1.3099 0.974, 1.2493 0.9842, 1.3099 0.9842, 1.1887 0.9434, 1.1887 0.974, 1.2493 0.9434, 1.2493 0.9434, 1.1887 0.974, 1.2493 0.974, 1.1274 0.9434, 1.1274 0.974, 1.1887 0.9434, 1.1887 0.9434, 1.1274 0.974, 1.1887 0.974, 1.0646 0.9434, 1.0646 0.974, 1.1274 0.9434, 1.1274 0.9434, 1.0646 0.974, 1.1274 0.974, 0.9993 0.9434, 0.9993 0.974, 1.0646 0.9434, 1.0646 0.9434, 0.9993 0.974, 1.0646 0.974, 1.1887 0.974, 1.1887 0.9842, 1.2493 0.974, 1.2493 0.974, 1.1887 0.9842, 1.2493 0.9842, 1.1274 0.974, 1.1274 0.9842, 1.1887 0.974, 1.1887 0.974, 1.1274 0.9842, 1.1887 0.9842, 1.0646 0.974, 1.0646 0.9842, 1.1274 0.974, 1.1274 0.974, 1.0646 0.9842, 1.1274 0.9842, 0.9993 0.974, 0.9993 0.9842, 1.0646 0.974, 1.0646 0.974, 0.9993 0.9842, 1.0646 0.9842, 1.4341 0.9842, 1.4341 0.974, 1.4993 0.9842, 1.4993 0.9842, 1.4341 0.974, 1.4993 0.974, 1.3713 0.9842, 1.3713 0.974, 1.4341 0.9842, 1.4341 0.9842, 1.3713 0.974, 1.4341 0.974, 1.3099 0.9842, 1.3099 0.974, 1.3713 0.9842, 1.3713 0.9842, 1.3099 0.974, 1.3713 0.974, 1.2493 0.9842, 1.2493 0.974, 1.3099 0.9842, 1.3099 0.9842, 1.2493 0.974, 1.3099 0.974, 1.4341 0.974, 1.4341 0.9434, 1.4993 0.974, 1.4993 0.974, 1.4341 0.9434, 1.4993 0.9434, 1.3713 0.974, 1.3713 0.9434, 1.4341 0.974, 1.4341 0.974, 1.3713 0.9434, 1.4341 0.9434, 1.3099 0.974, 1.3099 0.9434, 1.3713 0.974, 1.3713 0.974, 1.3099 0.9434, 1.3713 0.9434, 1.2493 0.974, 1.2493 0.9434, 1.3099 0.974, 1.3099 0.974, 1.2493 0.9434, 1.3099 0.9434, 1.1887 0.9842, 1.1887 0.974, 1.2493 0.9842, 1.2493 0.9842, 1.1887 0.974, 1.2493 0.974, 1.1274 0.9842, 1.1274 0.974, 1.1887 0.9842, 1.1887 0.9842, 1.1274 0.974, 1.1887 0.974, 1.0646 0.9842, 1.0646 0.974, 1.1274 0.9842, 1.1274 0.9842, 1.0646 0.974, 1.1274 0.974, 0.9993 0.9842, 0.9993 0.974, 1.0646 0.9842, 1.0646 0.9842, 0.9993 0.974, 1.0646 0.974, 1.1887 0.974, 1.1887 0.9434, 1.2493 0.974, 1.2493 0.974, 1.1887 0.9434, 1.2493 0.9434, 1.1274 0.974, 1.1274 0.9434, 1.1887 0.974, 1.1887 0.974, 1.1274 0.9434, 1.1887 0.9434, 1.0646 0.974, 1.0646 0.9434, 1.1274 0.974, 1.1274 0.974, 1.0646 0.9434, 1.1274 0.9434, 0.9993 0.974, 0.9993 0.9434, 1.0646 0.974, 1.0646 0.974, 0.9993 0.9434, 1.0646 0.9434, 0.9341 0.9434, 0.9341 0.974, 0.9993 0.9434, 0.9993 0.9434, 0.9341 0.974, 0.9993 0.974, 0.8713 0.9434, 0.8713 0.974, 0.9341 0.9434, 0.9341 0.9434, 0.8713 0.974, 0.9341 0.974, 0.8099 0.9434, 0.8099 0.974, 0.8713 0.9434, 0.8713 0.9434, 0.8099 0.974, 0.8713 0.974, 0.7493 0.9434, 0.7493 0.974, 0.8099 0.9434, 0.8099 0.9434, 0.7493 0.974, 0.8099 0.974, 0.9341 0.974, 0.9341 0.9842, 0.9993 0.974, 0.9993 0.974, 0.9341 0.9842, 0.9993 0.9842, 0.8713 0.974, 0.8713 0.9842, 0.9341 0.974, 0.9341 0.974, 0.8713 0.9842, 0.9341 0.9842, 0.8099 0.974, 0.8099 0.9842, 0.8713 0.974, 0.8713 0.974, 0.8099 0.9842, 0.8713 0.9842, 0.7493 0.974, 0.7493 0.9842, 0.8099 0.974, 0.8099 0.974, 0.7493 0.9842, 0.8099 0.9842, 0.6887 0.9434, 0.6887 0.974, 0.7493 0.9434, 0.7493 0.9434, 0.6887 0.974, 0.7493 0.974, 0.6274 0.9434, 0.6274 0.974, 0.6887 0.9434, 0.6887 0.9434, 0.6274 0.974, 0.6887 0.974, 0.5646 0.9434, 0.5646 0.974, 0.6274 0.9434, 0.6274 0.9434, 0.5646 0.974, 0.6274 0.974, 0.4993 0.9434, 0.4993 0.974, 0.5646 0.9434, 0.5646 0.9434, 0.4993 0.974, 0.5646 0.974, 0.6887 0.974, 0.6887 0.9842, 0.7493 0.974, 0.7493 0.974, 0.6887 0.9842, 0.7493 0.9842, 0.6274 0.974, 0.6274 0.9842, 0.6887 0.974, 0.6887 0.974, 0.6274 0.9842, 0.6887 0.9842, 0.5646 0.974, 0.5646 0.9842, 0.6274 0.974, 0.6274 0.974, 0.5646 0.9842, 0.6274 0.9842, 0.4993 0.974, 0.4993 0.9842, 0.5646 0.974, 0.5646 0.974, 0.4993 0.9842, 0.5646 0.9842, 0.9341 0.9842, 0.9341 0.974, 0.9993 0.9842, 0.9993 0.9842, 0.9341 0.974, 0.9993 0.974, 0.8713 0.9842, 0.8713 0.974, 0.9341 0.9842, 0.9341 0.9842, 0.8713 0.974, 0.9341 0.974, 0.8099 0.9842, 0.8099 0.974, 0.8713 0.9842, 0.8713 0.9842, 0.8099 0.974, 0.8713 0.974, 0.7493 0.9842, 0.7493 0.974, 0.8099 0.9842, 0.8099 0.9842, 0.7493 0.974, 0.8099 0.974, 0.9341 0.974, 0.9341 0.9434, 0.9993 0.974, 0.9993 0.974, 0.9341 0.9434, 0.9993 0.9434, 0.8713 0.974, 0.8713 0.9434, 0.9341 0.974, 0.9341 0.974, 0.8713 0.9434, 0.9341 0.9434, 0.8099 0.974, 0.8099 0.9434, 0.8713 0.974, 0.8713 0.974, 0.8099 0.9434, 0.8713 0.9434, 0.7493 0.974, 0.7493 0.9434, 0.8099 0.974, 0.8099 0.974, 0.7493 0.9434, 0.8099 0.9434, 0.6887 0.9842, 0.6887 0.974, 0.7493 0.9842, 0.7493 0.9842, 0.6887 0.974, 0.7493 0.974, 0.6274 0.9842, 0.6274 0.974, 0.6887 0.9842, 0.6887 0.9842, 0.6274 0.974, 0.6887 0.974, 0.5646 0.9842, 0.5646 0.974, 0.6274 0.9842, 0.6274 0.9842, 0.5646 0.974, 0.6274 0.974, 0.4993 0.9842, 0.4993 0.974, 0.5646 0.9842, 0.5646 0.9842, 0.4993 0.974, 0.5646 0.974, 0.6887 0.974, 0.6887 0.9434, 0.7493 0.974, 0.7493 0.974, 0.6887 0.9434, 0.7493 0.9434, 0.6274 0.974, 0.6274 0.9434, 0.6887 0.974, 0.6887 0.974, 0.6274 0.9434, 0.6887 0.9434, 0.5646 0.974, 0.5646 0.9434, 0.6274 0.974, 0.6274 0.974, 0.5646 0.9434, 0.6274 0.9434, 0.4993 0.974, 0.4993 0.9434, 0.5646 0.974, 0.5646 0.974, 0.4993 0.9434, 0.5646 0.9434, 0.4341 0.9434, 0.4341 0.974, 0.4993 0.9434, 0.4993 0.9434, 0.4341 0.974, 0.4993 0.974, 0.3713 0.9434, 0.3713 0.974, 0.4341 0.9434, 0.4341 0.9434, 0.3713 0.974, 0.4341 0.974, 0.3099 0.9434, 0.3099 0.974, 0.3713 0.9434, 0.3713 0.9434, 0.3099 0.974, 0.3713 0.974, 0.2493 0.9434, 0.2493 0.974, 0.3099 0.9434, 0.3099 0.9434, 0.2493 0.974, 0.3099 0.974, 0.4341 0.974, 0.4341 0.9842, 0.4993 0.974, 0.4993 0.974, 0.4341 0.9842, 0.4993 0.9842, 0.3713 0.974, 0.3713 0.9842, 0.4341 0.974, 0.4341 0.974, 0.3713 0.9842, 0.4341 0.9842, 0.3099 0.974, 0.3099 0.9842, 0.3713 0.974, 0.3713 0.974, 0.3099 0.9842, 0.3713 0.9842, 0.2493 0.974, 0.2493 0.9842, 0.3099 0.974, 0.3099 0.974, 0.2493 0.9842, 0.3099 0.9842, 0.1887 0.9434, 0.1887 0.974, 0.2493 0.9434, 0.2493 0.9434, 0.1887 0.974, 0.2493 0.974, 0.1274 0.9434, 0.1274 0.974, 0.1887 0.9434, 0.1887 0.9434, 0.1274 0.974, 0.1887 0.974, 0.0646 0.9434, 0.0646 0.974, 0.1274 0.9434, 0.1274 0.9434, 0.0646 0.974, 0.1274 0.974, 1.9993 0.9434, 1.9993 0.974, 2.0646 0.9434, 2.0646 0.9434, 1.9993 0.974, 2.0646 0.974, 0.1887 0.974, 0.1887 0.9842, 0.2493 0.974, 0.2493 0.974, 0.1887 0.9842, 0.2493 0.9842, 0.1274 0.974, 0.1274 0.9842, 0.1887 0.974, 0.1887 0.974, 0.1274 0.9842, 0.1887 0.9842, 0.0646 0.974, 0.0646 0.9842, 0.1274 0.974, 0.1274 0.974, 0.0646 0.9842, 0.1274 0.9842, 1.9993 0.974, 1.9993 0.9842, 2.0646 0.974, 2.0646 0.974, 1.9993 0.9842, 2.0646 0.9842, 0.4341 0.9842, 0.4341 0.974, 0.4993 0.9842, 0.4993 0.9842, 0.4341 0.974, 0.4993 0.974, 0.3713 0.9842, 0.3713 0.974, 0.4341 0.9842, 0.4341 0.9842, 0.3713 0.974, 0.4341 0.974, 0.3099 0.9842, 0.3099 0.974, 0.3713 0.9842, 0.3713 0.9842, 0.3099 0.974, 0.3713 0.974, 0.2493 0.9842, 0.2493 0.974, 0.3099 0.9842, 0.3099 0.9842, 0.2493 0.974, 0.3099 0.974, 0.4341 0.974, 0.4341 0.9434, 0.4993 0.974, 0.4993 0.974, 0.4341 0.9434, 0.4993 0.9434, 0.3713 0.974, 0.3713 0.9434, 0.4341 0.974, 0.4341 0.974, 0.3713 0.9434, 0.4341 0.9434, 0.3099 0.974, 0.3099 0.9434, 0.3713 0.974, 0.3713 0.974, 0.3099 0.9434, 0.3713 0.9434, 0.2493 0.974, 0.2493 0.9434, 0.3099 0.974, 0.3099 0.974, 0.2493 0.9434, 0.3099 0.9434, 0.1887 0.9842, 0.1887 0.974, 0.2493 0.9842, 0.2493 0.9842, 0.1887 0.974, 0.2493 0.974, 0.1274 0.9842, 0.1274 0.974, 0.1887 0.9842, 0.1887 0.9842, 0.1274 0.974, 0.1887 0.974, 0.0646 0.9842, 0.0646 0.974, 0.1274 0.9842, 0.1274 0.9842, 0.0646 0.974, 0.1274 0.974, 1.9993 0.9842, 1.9993 0.974, 2.0646 0.9842, 2.0646 0.9842, 1.9993 0.974, 2.0646 0.974, 0.1887 0.974, 0.1887 0.9434, 0.2493 0.974, 0.2493 0.974, 0.1887 0.9434, 0.2493 0.9434, 0.1274 0.974, 0.1274 0.9434, 0.1887 0.974, 0.1887 0.974, 0.1274 0.9434, 0.1887 0.9434, 0.0646 0.974, 0.0646 0.9434, 0.1274 0.974, 0.1274 0.974, 0.0646 0.9434, 0.1274 0.9434, 1.9993 0.974, 1.9993 0.9434, 2.0646 0.974, 2.0646 0.974, 1.9993 0.9434, 2.0646 0.9434, 1.9341 0.9434, 1.9341 0.6207, 1.9993 0.9434, 1.9993 0.9434, 1.9341 0.6207, 1.9993 0.6207, 1.8713 0.9434, 1.8713 0.6207, 1.9341 0.9434, 1.9341 0.9434, 1.8713 0.6207, 1.9341 0.6207, 1.8099 0.9434, 1.8099 0.6207, 1.8713 0.9434, 1.8713 0.9434, 1.8099 0.6207, 1.8713 0.6207, 1.7493 0.9434, 1.7493 0.6207, 1.8099 0.9434, 1.8099 0.9434, 1.7493 0.6207, 1.8099 0.6207, 1.6887 0.9434, 1.6887 0.6207, 1.7493 0.9434, 1.7493 0.9434, 1.6887 0.6207, 1.7493 0.6207, 1.6274 0.9434, 1.6274 0.6207, 1.6887 0.9434, 1.6887 0.9434, 1.6274 0.6207, 1.6887 0.6207, 1.5646 0.9434, 1.5646 0.6207, 1.6274 0.9434, 1.6274 0.9434, 1.5646 0.6207, 1.6274 0.6207, 1.4993 0.9434, 1.4993 0.6207, 1.5646 0.9434, 1.5646 0.9434, 1.4993 0.6207, 1.5646 0.6207, 1.9341 0.6207, 1.9341 0.4667, 1.9993 0.6207, 1.9993 0.6207, 1.9341 0.4667, 1.9993 0.4667, 1.8713 0.6207, 1.8713 0.4667, 1.9341 0.6207, 1.9341 0.6207, 1.8713 0.4667, 1.9341 0.4667, 1.8099 0.6207, 1.8099 0.4667, 1.8713 0.6207, 1.8713 0.6207, 1.8099 0.4667, 1.8713 0.4667, 1.7493 0.6207, 1.7493 0.4667, 1.8099 0.6207, 1.8099 0.6207, 1.7493 0.4667, 1.8099 0.4667, 1.9341 0.4667, 1.9341 0.3214, 1.9993 0.4667, 1.9993 0.4667, 1.9341 0.3214, 1.9993 0.3214, 1.8713 0.4667, 1.8713 0.3214, 1.9341 0.4667, 1.9341 0.4667, 1.8713 0.3214, 1.9341 0.3214, 1.8099 0.4667, 1.8099 0.3214, 1.8713 0.4667, 1.8713 0.4667, 1.8099 0.3214, 1.8713 0.3214, 1.7493 0.4667, 1.7493 0.3214, 1.8099 0.4667, 1.8099 0.4667, 1.7493 0.3214, 1.8099 0.3214, 1.6887 0.6207, 1.6887 0.4667, 1.7493 0.6207, 1.7493 0.6207, 1.6887 0.4667, 1.7493 0.4667, 1.6274 0.6207, 1.6274 0.4667, 1.6887 0.6207, 1.6887 0.6207, 1.6274 0.4667, 1.6887 0.4667, 1.5646 0.6207, 1.5646 0.4667, 1.6274 0.6207, 1.6274 0.6207, 1.5646 0.4667, 1.6274 0.4667, 1.4993 0.6207, 1.4993 0.4667, 1.5646 0.6207, 1.5646 0.6207, 1.4993 0.4667, 1.5646 0.4667, 1.6887 0.4667, 1.6887 0.3214, 1.7493 0.4667, 1.7493 0.4667, 1.6887 0.3214, 1.7493 0.3214, 1.6274 0.4667, 1.6274 0.3214, 1.6887 0.4667, 1.6887 0.4667, 1.6274 0.3214, 1.6887 0.3214, 1.5646 0.4667, 1.5646 0.3214, 1.6274 0.4667, 1.6274 0.4667, 1.5646 0.3214, 1.6274 0.3214, 1.4993 0.4667, 1.4993 0.3214, 1.5646 0.4667, 1.5646 0.4667, 1.4993 0.3214, 1.5646 0.3214, 1.4341 0.9434, 1.4341 0.6207, 1.4993 0.9434, 1.4993 0.9434, 1.4341 0.6207, 1.4993 0.6207, 1.3713 0.9434, 1.3713 0.6207, 1.4341 0.9434, 1.4341 0.9434, 1.3713 0.6207, 1.4341 0.6207, 1.3099 0.9434, 1.3099 0.6207, 1.3713 0.9434, 1.3713 0.9434, 1.3099 0.6207, 1.3713 0.6207, 1.2493 0.9434, 1.2493 0.6207, 1.3099 0.9434, 1.3099 0.9434, 1.2493 0.6207, 1.3099 0.6207, 1.1887 0.9434, 1.1887 0.6207, 1.2493 0.9434, 1.2493 0.9434, 1.1887 0.6207, 1.2493 0.6207, 1.1274 0.9434, 1.1274 0.6207, 1.1887 0.9434, 1.1887 0.9434, 1.1274 0.6207, 1.1887 0.6207, 1.0646 0.9434, 1.0646 0.6207, 1.1274 0.9434, 1.1274 0.9434, 1.0646 0.6207, 1.1274 0.6207, 0.9993 0.9434, 0.9993 0.6207, 1.0646 0.9434, 1.0646 0.9434, 0.9993 0.6207, 1.0646 0.6207, 1.4341 0.6207, 1.4341 0.4667, 1.4993 0.6207, 1.4993 0.6207, 1.4341 0.4667, 1.4993 0.4667, 1.3713 0.6207, 1.3713 0.4667, 1.4341 0.6207, 1.4341 0.6207, 1.3713 0.4667, 1.4341 0.4667, 1.3099 0.6207, 1.3099 0.4667, 1.3713 0.6207, 1.3713 0.6207, 1.3099 0.4667, 1.3713 0.4667, 1.2493 0.6207, 1.2493 0.4667, 1.3099 0.6207, 1.3099 0.6207, 1.2493 0.4667, 1.3099 0.4667, 1.4341 0.4667, 1.4341 0.3214, 1.4993 0.4667, 1.4993 0.4667, 1.4341 0.3214, 1.4993 0.3214, 1.3713 0.4667, 1.3713 0.3214, 1.4341 0.4667, 1.4341 0.4667, 1.3713 0.3214, 1.4341 0.3214, 1.3099 0.4667, 1.3099 0.3214, 1.3713 0.4667, 1.3713 0.4667, 1.3099 0.3214, 1.3713 0.3214, 1.2493 0.4667, 1.2493 0.3214, 1.3099 0.4667, 1.3099 0.4667, 1.2493 0.3214, 1.3099 0.3214, 1.1887 0.6207, 1.1887 0.4667, 1.2493 0.6207, 1.2493 0.6207, 1.1887 0.4667, 1.2493 0.4667, 1.1274 0.6207, 1.1274 0.4667, 1.1887 0.6207, 1.1887 0.6207, 1.1274 0.4667, 1.1887 0.4667, 1.0646 0.6207, 1.0646 0.4667, 1.1274 0.6207, 1.1274 0.6207, 1.0646 0.4667, 1.1274 0.4667, 0.9993 0.6207, 0.9993 0.4667, 1.0646 0.6207, 1.0646 0.6207, 0.9993 0.4667, 1.0646 0.4667, 1.1887 0.4667, 1.1887 0.3214, 1.2493 0.4667, 1.2493 0.4667, 1.1887 0.3214, 1.2493 0.3214, 1.1274 0.4667, 1.1274 0.3214, 1.1887 0.4667, 1.1887 0.4667, 1.1274 0.3214, 1.1887 0.3214, 1.0646 0.4667, 1.0646 0.3214, 1.1274 0.4667, 1.1274 0.4667, 1.0646 0.3214, 1.1274 0.3214, 0.9993 0.4667, 0.9993 0.3214, 1.0646 0.4667, 1.0646 0.4667, 0.9993 0.3214, 1.0646 0.3214, 0.9341 0.9434, 0.9341 0.6207, 0.9993 0.9434, 0.9993 0.9434, 0.9341 0.6207, 0.9993 0.6207, 0.8713 0.9434, 0.8713 0.6207, 0.9341 0.9434, 0.9341 0.9434, 0.8713 0.6207, 0.9341 0.6207, 0.8099 0.9434, 0.8099 0.6207, 0.8713 0.9434, 0.8713 0.9434, 0.8099 0.6207, 0.8713 0.6207, 0.7493 0.9434, 0.7493 0.6207, 0.8099 0.9434, 0.8099 0.9434, 0.7493 0.6207, 0.8099 0.6207, 0.6887 0.9434, 0.6887 0.6207, 0.7493 0.9434, 0.7493 0.9434, 0.6887 0.6207, 0.7493 0.6207, 0.6274 0.9434, 0.6274 0.6207, 0.6887 0.9434, 0.6887 0.9434, 0.6274 0.6207, 0.6887 0.6207, 0.5646 0.9434, 0.5646 0.6207, 0.6274 0.9434, 0.6274 0.9434, 0.5646 0.6207, 0.6274 0.6207, 0.4993 0.9434, 0.4993 0.6207, 0.5646 0.9434, 0.5646 0.9434, 0.4993 0.6207, 0.5646 0.6207, 0.9341 0.6207, 0.9341 0.4667, 0.9993 0.6207, 0.9993 0.6207, 0.9341 0.4667, 0.9993 0.4667, 0.8713 0.6207, 0.8713 0.4667, 0.9341 0.6207, 0.9341 0.6207, 0.8713 0.4667, 0.9341 0.4667, 0.8099 0.6207, 0.8099 0.4667, 0.8713 0.6207, 0.8713 0.6207, 0.8099 0.4667, 0.8713 0.4667, 0.7493 0.6207, 0.7493 0.4667, 0.8099 0.6207, 0.8099 0.6207, 0.7493 0.4667, 0.8099 0.4667, 0.9341 0.4667, 0.9341 0.3214, 0.9993 0.4667, 0.9993 0.4667, 0.9341 0.3214, 0.9993 0.3214, 0.8713 0.4667, 0.8713 0.3214, 0.9341 0.4667, 0.9341 0.4667, 0.8713 0.3214, 0.9341 0.3214, 0.8099 0.4667, 0.8099 0.3214, 0.8713 0.4667, 0.8713 0.4667, 0.8099 0.3214, 0.8713 0.3214, 0.7493 0.4667, 0.7493 0.3214, 0.8099 0.4667, 0.8099 0.4667, 0.7493 0.3214, 0.8099 0.3214, 0.6887 0.6207, 0.6887 0.4667, 0.7493 0.6207, 0.7493 0.6207, 0.6887 0.4667, 0.7493 0.4667, 0.6274 0.6207, 0.6274 0.4667, 0.6887 0.6207, 0.6887 0.6207, 0.6274 0.4667, 0.6887 0.4667, 0.5646 0.6207, 0.5646 0.4667, 0.6274 0.6207, 0.6274 0.6207, 0.5646 0.4667, 0.6274 0.4667, 0.4993 0.6207, 0.4993 0.4667, 0.5646 0.6207, 0.5646 0.6207, 0.4993 0.4667, 0.5646 0.4667, 0.6887 0.4667, 0.6887 0.3214, 0.7493 0.4667, 0.7493 0.4667, 0.6887 0.3214, 0.7493 0.3214, 0.6274 0.4667, 0.6274 0.3214, 0.6887 0.4667, 0.6887 0.4667, 0.6274 0.3214, 0.6887 0.3214, 0.5646 0.4667, 0.5646 0.3214, 0.6274 0.4667, 0.6274 0.4667, 0.5646 0.3214, 0.6274 0.3214, 0.4993 0.4667, 0.4993 0.3214, 0.5646 0.4667, 0.5646 0.4667, 0.4993 0.3214, 0.5646 0.3214, 0.4341 0.9434, 0.4341 0.6207, 0.4993 0.9434, 0.4993 0.9434, 0.4341 0.6207, 0.4993 0.6207, 0.3713 0.9434, 0.3713 0.6207, 0.4341 0.9434, 0.4341 0.9434, 0.3713 0.6207, 0.4341 0.6207, 0.3099 0.9434, 0.3099 0.6207, 0.3713 0.9434, 0.3713 0.9434, 0.3099 0.6207, 0.3713 0.6207, 0.2493 0.9434, 0.2493 0.6207, 0.3099 0.9434, 0.3099 0.9434, 0.2493 0.6207, 0.3099 0.6207, 0.1887 0.9434, 0.1887 0.6207, 0.2493 0.9434, 0.2493 0.9434, 0.1887 0.6207, 0.2493 0.6207, 0.1274 0.9434, 0.1274 0.6207, 0.1887 0.9434, 0.1887 0.9434, 0.1274 0.6207, 0.1887 0.6207, 0.0646 0.9434, 0.0646 0.6207, 0.1274 0.9434, 0.1274 0.9434, 0.0646 0.6207, 0.1274 0.6207, 1.9993 0.9434, 1.9993 0.6207, 2.0646 0.9434, 0.0646 0.9434, -0.0007 0.6207, 0.0646 0.6207, 0.4341 0.6207, 0.4341 0.4667, 0.4993 0.6207, 0.4993 0.6207, 0.4341 0.4667, 0.4993 0.4667, 0.3713 0.6207, 0.3713 0.4667, 0.4341 0.6207, 0.4341 0.6207, 0.3713 0.4667, 0.4341 0.4667, 0.3099 0.6207, 0.3099 0.4667, 0.3713 0.6207, 0.3713 0.6207, 0.3099 0.4667, 0.3713 0.4667, 0.2493 0.6207, 0.2493 0.4667, 0.3099 0.6207, 0.3099 0.6207, 0.2493 0.4667, 0.3099 0.4667, 0.4341 0.4667, 0.4341 0.3214, 0.4993 0.4667, 0.4993 0.4667, 0.4341 0.3214, 0.4993 0.3214, 0.3713 0.4667, 0.3713 0.3214, 0.4341 0.4667, 0.4341 0.4667, 0.3713 0.3214, 0.4341 0.3214, 0.3099 0.4667, 0.3099 0.3214, 0.3713 0.4667, 0.3713 0.4667, 0.3099 0.3214, 0.3713 0.3214, 0.2493 0.4667, 0.2493 0.3214, 0.3099 0.4667, 0.3099 0.4667, 0.2493 0.3214, 0.3099 0.3214, 0.1887 0.6207, 0.1887 0.4667, 0.2493 0.6207, 0.2493 0.6207, 0.1887 0.4667, 0.2493 0.4667, 0.1274 0.6207, 0.1274 0.4667, 0.1887 0.6207, 0.1887 0.6207, 0.1274 0.4667, 0.1887 0.4667, 0.0646 0.6207, 0.0646 0.4667, 0.1274 0.6207, 0.1274 0.6207, 0.0646 0.4667, 0.1274 0.4667, -0.0007 0.6207, -0.0007 0.4667, 0.0646 0.6207, 0.0646 0.6207, -0.0007 0.4667, 0.0646 0.4667, 0.1887 0.4667, 0.1887 0.3214, 0.2493 0.4667, 0.2493 0.4667, 0.1887 0.3214, 0.2493 0.3214, 0.1274 0.4667, 0.1274 0.3214, 0.1887 0.4667, 0.1887 0.4667, 0.1274 0.3214, 0.1887 0.3214, 0.0646 0.4667, 0.0646 0.3214, 0.1274 0.4667, 0.1274 0.4667, 0.0646 0.3214, 0.1274 0.3214, -0.0007 0.4667, -0.0007 0.3214, 0.0646 0.4667, 0.0646 0.4667, -0.0007 0.3214, 0.0646 0.3214, 1.9341 0.3214, 1.9341 0.2557, 1.9993 0.3214, 1.9993 0.3214, 1.9341 0.2557, 1.9993 0.2557, 1.8713 0.3214, 1.8713 0.2557, 1.9341 0.3214, 1.9341 0.3214, 1.8713 0.2557, 1.9341 0.2557, 1.9341 0.2557, 1.9341 0.1984, 1.9993 0.2557, 1.9993 0.2557, 1.9341 0.1984, 1.9993 0.1984, 1.8713 0.2557, 1.8713 0.1984, 1.9341 0.2557, 1.9341 0.2557, 1.8713 0.1984, 1.9341 0.1984, 1.8099 0.3214, 1.8099 0.2557, 1.8713 0.3214, 1.8713 0.3214, 1.8099 0.2557, 1.8713 0.2557, 1.7493 0.3214, 1.7493 0.2557, 1.8099 0.3214, 1.8099 0.3214, 1.7493 0.2557, 1.8099 0.2557, 1.8099 0.2557, 1.8099 0.1984, 1.8713 0.2557, 1.8713 0.2557, 1.8099 0.1984, 1.8713 0.1984, 1.7493 0.2557, 1.7493 0.1984, 1.8099 0.2557, 1.8099 0.2557, 1.7493 0.1984, 1.8099 0.1984, 1.9341 0.1984, 1.9341 0.1075, 1.9993 0.1984, 1.9993 0.1984, 1.9341 0.1075, 1.9993 0.1075, 1.8713 0.1984, 1.8713 0.1075, 1.9341 0.1984, 1.9341 0.1984, 1.8713 0.1075, 1.9341 0.1075, 1.8099 0.1984, 1.8099 0.1075, 1.8713 0.1984, 1.8713 0.1984, 1.8099 0.1075, 1.8713 0.1075, 1.7493 0.1984, 1.7493 0.1075, 1.8099 0.1984, 1.8099 0.1984, 1.7493 0.1075, 1.8099 0.1075, 1.6887 0.3214, 1.6887 0.2557, 1.7493 0.3214, 1.7493 0.3214, 1.6887 0.2557, 1.7493 0.2557, 1.6274 0.3214, 1.6274 0.2557, 1.6887 0.3214, 1.6887 0.3214, 1.6274 0.2557, 1.6887 0.2557, 1.6887 0.2557, 1.6887 0.1984, 1.7493 0.2557, 1.7493 0.2557, 1.6887 0.1984, 1.7493 0.1984, 1.6274 0.2557, 1.6274 0.1984, 1.6887 0.2557, 1.6887 0.2557, 1.6274 0.1984, 1.6887 0.1984, 1.5646 0.3214, 1.5646 0.2557, 1.6274 0.3214, 1.6274 0.3214, 1.5646 0.2557, 1.6274 0.2557, 1.4993 0.3214, 1.4993 0.2557, 1.5646 0.3214, 1.5646 0.3214, 1.4993 0.2557, 1.5646 0.2557, 1.5646 0.2557, 1.5646 0.1984, 1.6274 0.2557, 1.6274 0.2557, 1.5646 0.1984, 1.6274 0.1984, 1.4993 0.2557, 1.4993 0.1984, 1.5646 0.2557, 1.5646 0.2557, 1.4993 0.1984, 1.5646 0.1984, 1.6887 0.1984, 1.6887 0.1075, 1.7493 0.1984, 1.7493 0.1984, 1.6887 0.1075, 1.7493 0.1075, 1.6274 0.1984, 1.6274 0.1075, 1.6887 0.1984, 1.6887 0.1984, 1.6274 0.1075, 1.6887 0.1075, 1.5646 0.1984, 1.5646 0.1075, 1.6274 0.1984, 1.6274 0.1984, 1.5646 0.1075, 1.6274 0.1075, 1.4993 0.1984, 1.4993 0.1075, 1.5646 0.1984, 1.5646 0.1984, 1.4993 0.1075, 1.5646 0.1075, 1.9341 0.1075, 1.9341 0.0458, 1.9993 0.1075, 1.9993 0.1075, 1.9341 0.0458, 1.9993 0.0458, 1.8713 0.1075, 1.8713 0.0458, 1.9341 0.1075, 1.9341 0.1075, 1.8713 0.0458, 1.9341 0.0458, 1.8099 0.1075, 1.8099 0.0458, 1.8713 0.1075, 1.8713 0.1075, 1.8099 0.0458, 1.8713 0.0458, 1.7493 0.1075, 1.7493 0.0458, 1.8099 0.1075, 1.8099 0.1075, 1.7493 0.0458, 1.8099 0.0458, 1.9341 0.0458, 1.9341 0.0104, 1.9993 0.0458, 1.9993 0.0458, 1.9341 0.0104, 1.9993 0.0104, 1.8713 0.0458, 1.8713 0.0104, 1.9341 0.0458, 1.9341 0.0458, 1.8713 0.0104, 1.9341 0.0104, 1.8099 0.0458, 1.8099 0.0104, 1.8713 0.0458, 1.8713 0.0458, 1.8099 0.0104, 1.8713 0.0104, 1.7493 0.0458, 1.7493 0.0104, 1.8099 0.0458, 1.8099 0.0458, 1.7493 0.0104, 1.8099 0.0104, 1.6887 0.1075, 1.6887 0.0458, 1.7493 0.1075, 1.7493 0.1075, 1.6887 0.0458, 1.7493 0.0458, 1.6274 0.1075, 1.6274 0.0458, 1.6887 0.1075, 1.6887 0.1075, 1.6274 0.0458, 1.6887 0.0458, 1.5646 0.1075, 1.5646 0.0458, 1.6274 0.1075, 1.6274 0.1075, 1.5646 0.0458, 1.6274 0.0458, 1.4993 0.1075, 1.4993 0.0458, 1.5646 0.1075, 1.5646 0.1075, 1.4993 0.0458, 1.5646 0.0458, 1.6887 0.0458, 1.6887 0.0104, 1.7493 0.0458, 1.7493 0.0458, 1.6887 0.0104, 1.7493 0.0104, 1.6274 0.0458, 1.6274 0.0104, 1.6887 0.0458, 1.6887 0.0458, 1.6274 0.0104, 1.6887 0.0104, 1.5646 0.0458, 1.5646 0.0104, 1.6274 0.0458, 1.6274 0.0458, 1.5646 0.0104, 1.6274 0.0104, 1.4993 0.0458, 1.4993 0.0104, 1.5646 0.0458, 1.5646 0.0458, 1.4993 0.0104, 1.5646 0.0104, 1.4341 0.3214, 1.4341 0.2557, 1.4993 0.3214, 1.4993 0.3214, 1.4341 0.2557, 1.4993 0.2557, 1.3713 0.3214, 1.3713 0.2557, 1.4341 0.3214, 1.4341 0.3214, 1.3713 0.2557, 1.4341 0.2557, 1.4341 0.2557, 1.4341 0.1984, 1.4993 0.2557, 1.4993 0.2557, 1.4341 0.1984, 1.4993 0.1984, 1.3713 0.2557, 1.3713 0.1984, 1.4341 0.2557, 1.4341 0.2557, 1.3713 0.1984, 1.4341 0.1984, 1.3099 0.3214, 1.3099 0.2557, 1.3713 0.3214, 1.3713 0.3214, 1.3099 0.2557, 1.3713 0.2557, 1.2493 0.3214, 1.2493 0.2557, 1.3099 0.3214, 1.3099 0.3214, 1.2493 0.2557, 1.3099 0.2557, 1.3099 0.2557, 1.3099 0.1984, 1.3713 0.2557, 1.3713 0.2557, 1.3099 0.1984, 1.3713 0.1984, 1.2493 0.2557, 1.2493 0.1984, 1.3099 0.2557, 1.3099 0.2557, 1.2493 0.1984, 1.3099 0.1984, 1.4341 0.1984, 1.4341 0.1075, 1.4993 0.1984, 1.4993 0.1984, 1.4341 0.1075, 1.4993 0.1075, 1.3713 0.1984, 1.3713 0.1075, 1.4341 0.1984, 1.4341 0.1984, 1.3713 0.1075, 1.4341 0.1075, 1.3099 0.1984, 1.3099 0.1075, 1.3713 0.1984, 1.3713 0.1984, 1.3099 0.1075, 1.3713 0.1075, 1.2493 0.1984, 1.2493 0.1075, 1.3099 0.1984, 1.3099 0.1984, 1.2493 0.1075, 1.3099 0.1075, 1.1887 0.3214, 1.1887 0.2557, 1.2493 0.3214, 1.2493 0.3214, 1.1887 0.2557, 1.2493 0.2557, 1.1274 0.3214, 1.1274 0.2557, 1.1887 0.3214, 1.1887 0.3214, 1.1274 0.2557, 1.1887 0.2557, 1.1887 0.2557, 1.1887 0.1984, 1.2493 0.2557, 1.2493 0.2557, 1.1887 0.1984, 1.2493 0.1984, 1.1274 0.2557, 1.1274 0.1984, 1.1887 0.2557, 1.1887 0.2557, 1.1274 0.1984, 1.1887 0.1984, 1.0646 0.3214, 1.0646 0.2557, 1.1274 0.3214, 1.1274 0.3214, 1.0646 0.2557, 1.1274 0.2557, 0.9993 0.3214, 0.9993 0.2557, 1.0646 0.3214, 1.0646 0.3214, 0.9993 0.2557, 1.0646 0.2557, 1.0646 0.2557, 1.0646 0.1984, 1.1274 0.2557, 1.1274 0.2557, 1.0646 0.1984, 1.1274 0.1984, 0.9993 0.2557, 0.9993 0.1984, 1.0646 0.2557, 1.0646 0.2557, 0.9993 0.1984, 1.0646 0.1984, 1.1887 0.1984, 1.1887 0.1075, 1.2493 0.1984, 1.2493 0.1984, 1.1887 0.1075, 1.2493 0.1075, 1.1274 0.1984, 1.1274 0.1075, 1.1887 0.1984, 1.1887 0.1984, 1.1274 0.1075, 1.1887 0.1075, 1.0646 0.1984, 1.0646 0.1075, 1.1274 0.1984, 1.1274 0.1984, 1.0646 0.1075, 1.1274 0.1075, 0.9993 0.1984, 0.9993 0.1075, 1.0646 0.1984, 1.0646 0.1984, 0.9993 0.1075, 1.0646 0.1075, 1.4341 0.1075, 1.4341 0.0458, 1.4993 0.1075, 1.4993 0.1075, 1.4341 0.0458, 1.4993 0.0458, 1.3713 0.1075, 1.3713 0.0458, 1.4341 0.1075, 1.4341 0.1075, 1.3713 0.0458, 1.4341 0.0458, 1.3099 0.1075, 1.3099 0.0458, 1.3713 0.1075, 1.3713 0.1075, 1.3099 0.0458, 1.3713 0.0458, 1.2493 0.1075, 1.2493 0.0458, 1.3099 0.1075, 1.3099 0.1075, 1.2493 0.0458, 1.3099 0.0458, 1.4341 0.0458, 1.4341 0.0104, 1.4993 0.0458, 1.4993 0.0458, 1.4341 0.0104, 1.4993 0.0104, 1.3713 0.0458, 1.3713 0.0104, 1.4341 0.0458, 1.4341 0.0458, 1.3713 0.0104, 1.4341 0.0104, 1.3099 0.0458, 1.3099 0.0104, 1.3713 0.0458, 1.3713 0.0458, 1.3099 0.0104, 1.3713 0.0104, 1.2493 0.0458, 1.2493 0.0104, 1.3099 0.0458, 1.3099 0.0458, 1.2493 0.0104, 1.3099 0.0104, 1.1887 0.1075, 1.1887 0.0458, 1.2493 0.1075, 1.2493 0.1075, 1.1887 0.0458, 1.2493 0.0458, 1.1274 0.1075, 1.1274 0.0458, 1.1887 0.1075, 1.1887 0.1075, 1.1274 0.0458, 1.1887 0.0458, 1.0646 0.1075, 1.0646 0.0458, 1.1274 0.1075, 1.1274 0.1075, 1.0646 0.0458, 1.1274 0.0458, 0.9993 0.1075, 0.9993 0.0458, 1.0646 0.1075, 1.0646 0.1075, 0.9993 0.0458, 1.0646 0.0458, 1.1887 0.0458, 1.1887 0.0104, 1.2493 0.0458, 1.2493 0.0458, 1.1887 0.0104, 1.2493 0.0104, 1.1274 0.0458, 1.1274 0.0104, 1.1887 0.0458, 1.1887 0.0458, 1.1274 0.0104, 1.1887 0.0104, 1.0646 0.0458, 1.0646 0.0104, 1.1274 0.0458, 1.1274 0.0458, 1.0646 0.0104, 1.1274 0.0104, 0.9993 0.0458, 0.9993 0.0104, 1.0646 0.0458, 1.0646 0.0458, 0.9993 0.0104, 1.0646 0.0104, 0.9341 0.3214, 0.9341 0.2557, 0.9993 0.3214, 0.9993 0.3214, 0.9341 0.2557, 0.9993 0.2557, 0.8713 0.3214, 0.8713 0.2557, 0.9341 0.3214, 0.9341 0.3214, 0.8713 0.2557, 0.9341 0.2557, 0.9341 0.2557, 0.9341 0.1984, 0.9993 0.2557, 0.9993 0.2557, 0.9341 0.1984, 0.9993 0.1984, 0.8713 0.2557, 0.8713 0.1984, 0.9341 0.2557, 0.9341 0.2557, 0.8713 0.1984, 0.9341 0.1984, 0.8099 0.3214, 0.8099 0.2557, 0.8713 0.3214, 0.8713 0.3214, 0.8099 0.2557, 0.8713 0.2557, 0.7493 0.3214, 0.7493 0.2557, 0.8099 0.3214, 0.8099 0.3214, 0.7493 0.2557, 0.8099 0.2557, 0.8099 0.2557, 0.8099 0.1984, 0.8713 0.2557, 0.8713 0.2557, 0.8099 0.1984, 0.8713 0.1984, 0.7493 0.2557, 0.7493 0.1984, 0.8099 0.2557, 0.8099 0.2557, 0.7493 0.1984, 0.8099 0.1984, 0.9341 0.1984, 0.9341 0.1075, 0.9993 0.1984, 0.9993 0.1984, 0.9341 0.1075, 0.9993 0.1075, 0.8713 0.1984, 0.8713 0.1075, 0.9341 0.1984, 0.9341 0.1984, 0.8713 0.1075, 0.9341 0.1075, 0.8099 0.1984, 0.8099 0.1075, 0.8713 0.1984, 0.8713 0.1984, 0.8099 0.1075, 0.8713 0.1075, 0.7493 0.1984, 0.7493 0.1075, 0.8099 0.1984, 0.8099 0.1984, 0.7493 0.1075, 0.8099 0.1075, 0.6887 0.3214, 0.6887 0.2557, 0.7493 0.3214, 0.7493 0.3214, 0.6887 0.2557, 0.7493 0.2557, 0.6274 0.3214, 0.6274 0.2557, 0.6887 0.3214, 0.6887 0.3214, 0.6274 0.2557, 0.6887 0.2557, 0.6887 0.2557, 0.6887 0.1984, 0.7493 0.2557, 0.7493 0.2557, 0.6887 0.1984, 0.7493 0.1984, 0.6274 0.2557, 0.6274 0.1984, 0.6887 0.2557, 0.6887 0.2557, 0.6274 0.1984, 0.6887 0.1984, 0.5646 0.3214, 0.5646 0.2557, 0.6274 0.3214, 0.6274 0.3214, 0.5646 0.2557, 0.6274 0.2557, 0.4993 0.3214, 0.4993 0.2557, 0.5646 0.3214, 0.5646 0.3214, 0.4993 0.2557, 0.5646 0.2557, 0.5646 0.2557, 0.5646 0.1984, 0.6274 0.2557, 0.6274 0.2557, 0.5646 0.1984, 0.6274 0.1984, 0.4993 0.2557, 0.4993 0.1984, 0.5646 0.2557, 0.5646 0.2557, 0.4993 0.1984, 0.5646 0.1984, 0.6887 0.1984, 0.6887 0.1075, 0.7493 0.1984, 0.7493 0.1984, 0.6887 0.1075, 0.7493 0.1075, 0.6274 0.1984, 0.6274 0.1075, 0.6887 0.1984, 0.6887 0.1984, 0.6274 0.1075, 0.6887 0.1075, 0.5646 0.1984, 0.5646 0.1075, 0.6274 0.1984, 0.6274 0.1984, 0.5646 0.1075, 0.6274 0.1075, 0.4993 0.1984, 0.4993 0.1075, 0.5646 0.1984, 0.5646 0.1984, 0.4993 0.1075, 0.5646 0.1075, 0.9341 0.1075, 0.9341 0.0458, 0.9993 0.1075, 0.9993 0.1075, 0.9341 0.0458, 0.9993 0.0458, 0.8713 0.1075, 0.8713 0.0458, 0.9341 0.1075, 0.9341 0.1075, 0.8713 0.0458, 0.9341 0.0458, 0.8099 0.1075, 0.8099 0.0458, 0.8713 0.1075, 0.8713 0.1075, 0.8099 0.0458, 0.8713 0.0458, 0.7493 0.1075, 0.7493 0.0458, 0.8099 0.1075, 0.8099 0.1075, 0.7493 0.0458, 0.8099 0.0458, 0.9341 0.0458, 0.9341 0.0104, 0.9993 0.0458, 0.9993 0.0458, 0.9341 0.0104, 0.9993 0.0104, 0.8713 0.0458, 0.8713 0.0104, 0.9341 0.0458, 0.9341 0.0458, 0.8713 0.0104, 0.9341 0.0104, 0.8099 0.0458, 0.8099 0.0104, 0.8713 0.0458, 0.8713 0.0458, 0.8099 0.0104, 0.8713 0.0104, 0.7493 0.0458, 0.7493 0.0104, 0.8099 0.0458, 0.8099 0.0458, 0.7493 0.0104, 0.8099 0.0104, 0.6887 0.1075, 0.6887 0.0458, 0.7493 0.1075, 0.7493 0.1075, 0.6887 0.0458, 0.7493 0.0458, 0.6274 0.1075, 0.6274 0.0458, 0.6887 0.1075, 0.6887 0.1075, 0.6274 0.0458, 0.6887 0.0458, 0.5646 0.1075, 0.5646 0.0458, 0.6274 0.1075, 0.6274 0.1075, 0.5646 0.0458, 0.6274 0.0458, 0.4993 0.1075, 0.4993 0.0458, 0.5646 0.1075, 0.5646 0.1075, 0.4993 0.0458, 0.5646 0.0458, 0.6887 0.0458, 0.6887 0.0104, 0.7493 0.0458, 0.7493 0.0458, 0.6887 0.0104, 0.7493 0.0104, 0.6274 0.0458, 0.6274 0.0104, 0.6887 0.0458, 0.6887 0.0458, 0.6274 0.0104, 0.6887 0.0104, 0.5646 0.0458, 0.5646 0.0104, 0.6274 0.0458, 0.6274 0.0458, 0.5646 0.0104, 0.6274 0.0104, 0.4993 0.0458, 0.4993 0.0104, 0.5646 0.0458, 0.5646 0.0458, 0.4993 0.0104, 0.5646 0.0104, 0.4341 0.3214, 0.4341 0.2557, 0.4993 0.3214, 0.4993 0.3214, 0.4341 0.2557, 0.4993 0.2557, 0.3713 0.3214, 0.3713 0.2557, 0.4341 0.3214, 0.4341 0.3214, 0.3713 0.2557, 0.4341 0.2557, 0.4341 0.2557, 0.4341 0.1984, 0.4993 0.2557, 0.4993 0.2557, 0.4341 0.1984, 0.4993 0.1984, 0.3713 0.2557, 0.3713 0.1984, 0.4341 0.2557, 0.4341 0.2557, 0.3713 0.1984, 0.4341 0.1984, 0.3099 0.3214, 0.3099 0.2557, 0.3713 0.3214, 0.3713 0.3214, 0.3099 0.2557, 0.3713 0.2557, 0.2493 0.3214, 0.2493 0.2557, 0.3099 0.3214, 0.3099 0.3214, 0.2493 0.2557, 0.3099 0.2557, 0.3099 0.2557, 0.3099 0.1984, 0.3713 0.2557, 0.3713 0.2557, 0.3099 0.1984, 0.3713 0.1984, 0.2493 0.2557, 0.2493 0.1984, 0.3099 0.2557, 0.3099 0.2557, 0.2493 0.1984, 0.3099 0.1984, 0.4341 0.1984, 0.4341 0.1075, 0.4993 0.1984, 0.4993 0.1984, 0.4341 0.1075, 0.4993 0.1075, 0.3713 0.1984, 0.3713 0.1075, 0.4341 0.1984, 0.4341 0.1984, 0.3713 0.1075, 0.4341 0.1075, 0.3099 0.1984, 0.3099 0.1075, 0.3713 0.1984, 0.3713 0.1984, 0.3099 0.1075, 0.3713 0.1075, 0.2493 0.1984, 0.2493 0.1075, 0.3099 0.1984, 0.3099 0.1984, 0.2493 0.1075, 0.3099 0.1075, 0.1887 0.3214, 0.1887 0.2557, 0.2493 0.3214, 0.2493 0.3214, 0.1887 0.2557, 0.2493 0.2557, 0.1274 0.3214, 0.1274 0.2557, 0.1887 0.3214, 0.1887 0.3214, 0.1274 0.2557, 0.1887 0.2557, 0.1887 0.2557, 0.1887 0.1984, 0.2493 0.2557, 0.2493 0.2557, 0.1887 0.1984, 0.2493 0.1984, 0.1274 0.2557, 0.1274 0.1984, 0.1887 0.2557, 0.1887 0.2557, 0.1274 0.1984, 0.1887 0.1984, 0.0646 0.3214, 0.0646 0.2557, 0.1274 0.3214, 0.1274 0.3214, 0.0646 0.2557, 0.1274 0.2557, -0.0007 0.3214, -0.0007 0.2557, 0.0646 0.3214, 0.0646 0.3214, -0.0007 0.2557, 0.0646 0.2557, 0.0646 0.2557, 0.0646 0.1984, 0.1274 0.2557, 0.1274 0.2557, 0.0646 0.1984, 0.1274 0.1984, -0.0007 0.2557, -0.0007 0.1984, 0.0646 0.2557, 0.0646 0.2557, -0.0007 0.1984, 0.0646 0.1984, 0.1887 0.1984, 0.1887 0.1075, 0.2493 0.1984, 0.2493 0.1984, 0.1887 0.1075, 0.2493 0.1075, 0.1274 0.1984, 0.1274 0.1075, 0.1887 0.1984, 0.1887 0.1984, 0.1274 0.1075, 0.1887 0.1075, 0.0646 0.1984, 0.0646 0.1075, 0.1274 0.1984, 0.1274 0.1984, 0.0646 0.1075, 0.1274 0.1075, -0.0007 0.1984, -0.0007 0.1075, 0.0646 0.1984, 0.0646 0.1984, -0.0007 0.1075, 0.0646 0.1075, 0.4341 0.1075, 0.4341 0.0458, 0.4993 0.1075, 0.4993 0.1075, 0.4341 0.0458, 0.4993 0.0458, 0.3713 0.1075, 0.3713 0.0458, 0.4341 0.1075, 0.4341 0.1075, 0.3713 0.0458, 0.4341 0.0458, 0.3099 0.1075, 0.3099 0.0458, 0.3713 0.1075, 0.3713 0.1075, 0.3099 0.0458, 0.3713 0.0458, 0.2493 0.1075, 0.2493 0.0458, 0.3099 0.1075, 0.3099 0.1075, 0.2493 0.0458, 0.3099 0.0458, 0.4341 0.0458, 0.4341 0.0104, 0.4993 0.0458, 0.4993 0.0458, 0.4341 0.0104, 0.4993 0.0104, 0.3713 0.0458, 0.3713 0.0104, 0.4341 0.0458, 0.4341 0.0458, 0.3713 0.0104, 0.4341 0.0104, 0.3099 0.0458, 0.3099 0.0104, 0.3713 0.0458, 0.3713 0.0458, 0.3099 0.0104, 0.3713 0.0104, 0.2493 0.0458, 0.2493 0.0104, 0.3099 0.0458, 0.3099 0.0458, 0.2493 0.0104, 0.3099 0.0104, 0.1887 0.1075, 0.1887 0.0458, 0.2493 0.1075, 0.2493 0.1075, 0.1887 0.0458, 0.2493 0.0458, 0.1274 0.1075, 0.1274 0.0458, 0.1887 0.1075, 0.1887 0.1075, 0.1274 0.0458, 0.1887 0.0458, 0.0646 0.1075, 0.0646 0.0458, 0.1274 0.1075, 0.1274 0.1075, 0.0646 0.0458, 0.1274 0.0458, -0.0007 0.1075, -0.0007 0.0458, 0.0646 0.1075, 0.0646 0.1075, -0.0007 0.0458, 0.0646 0.0458, 0.1887 0.0458, 0.1887 0.0104, 0.2493 0.0458, 0.2493 0.0458, 0.1887 0.0104, 0.2493 0.0104, 0.1274 0.0458, 0.1274 0.0104, 0.1887 0.0458, 0.1887 0.0458, 0.1274 0.0104, 0.1887 0.0104, 0.0646 0.0458, 0.0646 0.0104, 0.1274 0.0458, 0.1274 0.0458, 0.0646 0.0104, 0.1274 0.0104, -0.0007 0.0458, -0.0007 0.0104, 0.0646 0.0458, 0.0646 0.0458, -0.0007 0.0104, 0.0646 0.0104, 0.4455 0.6688, 0.509 0.6543, 0.509 0.6556, 0.4455 0.6673, 0.509 0.6543, 0.4455 0.6688, 0.4244 0.6979, 0.4244 0.6959, 0.4455 0.6688, 0.4455 0.6688, 0.4244 0.6959, 0.4455 0.6673, 0.4455 0.6566, 0.509 0.6543, 0.4455 0.6673, 0.509 0.645, 0.509 0.6543, 0.4455 0.6566, 0.4455 0.6566, 0.4244 0.6959, 0.4244 0.682, 0.4455 0.6673, 0.4244 0.6959, 0.4455 0.6566, 0.4455 0.727, 0.4244 0.6959, 0.4244 0.6979, 0.4455 0.7246, 0.4244 0.6959, 0.4455 0.727, 0.509 0.7402, 0.509 0.7376, 0.4455 0.727, 0.4455 0.727, 0.509 0.7376, 0.4455 0.7246, 0.4455 0.7075, 0.4244 0.6959, 0.4455 0.7246, 0.4244 0.682, 0.4244 0.6959, 0.4455 0.7075, 0.509 0.7376, 0.509 0.7191, 0.4455 0.7246, 0.4455 0.7246, 0.509 0.7191, 0.4455 0.7075, 0.509 0.645, 0.472 0.622, 0.509 0.6199, 0.4455 0.6275, 0.472 0.622, 0.4455 0.6566, 0.4455 0.6566, 0.472 0.622, 0.509 0.645, 0.4455 0.6275, 0.4244 0.682, 0.4244 0.6669, 0.4455 0.6566, 0.4244 0.682, 0.4455 0.6275, 0.4244 0.6669, 0.4244 0.6444, 0.4455 0.6275, 0.472 0.622, 0.472 0.6001, 0.509 0.6199, 0.509 0.6199, 0.472 0.6001, 0.509 0.5989, 0.4455 0.6275, 0.472 0.6001, 0.472 0.622, 0.4455 0.6033, 0.472 0.6001, 0.4455 0.6275, 0.509 0.571, 0.472 0.6001, 0.472 0.571, 0.509 0.5989, 0.472 0.6001, 0.509 0.571, 0.4455 0.571, 0.472 0.6001, 0.4455 0.6033, 0.472 0.571, 0.472 0.6001, 0.4455 0.571, 0.4455 0.6033, 0.4244 0.6444, 0.4244 0.6129, 0.4455 0.6275, 0.4244 0.6444, 0.4455 0.6033, 0.4244 0.6129, 0.4244 0.571, 0.4455 0.6033, 0.4455 0.6033, 0.4244 0.571, 0.4455 0.571, 0.4455 0.6889, 0.4244 0.682, 0.4455 0.7075, 0.4244 0.6669, 0.4244 0.682, 0.4455 0.6889, 0.4455 0.6889, 0.4244 0.6444, 0.4244 0.6669, 0.4455 0.6612, 0.4244 0.6444, 0.4455 0.6889, 0.509 0.7191, 0.472 0.6961, 0.4455 0.7075, 0.4455 0.7075, 0.472 0.6961, 0.4455 0.6889, 0.509 0.6989, 0.472 0.6961, 0.509 0.7191, 0.4455 0.6612, 0.472 0.6961, 0.472 0.6667, 0.4455 0.6889, 0.472 0.6961, 0.4455 0.6612, 0.509 0.6688, 0.472 0.6961, 0.509 0.6989, 0.472 0.6667, 0.472 0.6961, 0.509 0.6688, 0.4455 0.6225, 0.4244 0.6444, 0.4455 0.6612, 0.4244 0.6129, 0.4244 0.6444, 0.4455 0.6225, 0.4455 0.6225, 0.4244 0.571, 0.4244 0.6129, 0.4455 0.571, 0.4244 0.571, 0.4455 0.6225, 0.472 0.6667, 0.472 0.6256, 0.4455 0.6612, 0.4455 0.6612, 0.472 0.6256, 0.4455 0.6225, 0.509 0.6688, 0.472 0.6256, 0.472 0.6667, 0.509 0.6268, 0.472 0.6256, 0.509 0.6688, 0.4455 0.571, 0.472 0.6256, 0.472 0.571, 0.4455 0.6225, 0.472 0.6256, 0.4455 0.571, 0.509 0.571, 0.472 0.6256, 0.509 0.6268, 0.472 0.571, 0.472 0.6256, 0.509 0.571, 0.5725 0.727, 0.509 0.7376, 0.509 0.7402, 0.5725 0.7246, 0.509 0.7376, 0.5725 0.727, 0.5936 0.6979, 0.5936 0.6959, 0.5725 0.727, 0.5725 0.727, 0.5936 0.6959, 0.5725 0.7246, 0.5725 0.7246, 0.509 0.7191, 0.509 0.7376, 0.5725 0.7075, 0.509 0.7191, 0.5725 0.7246, 0.5936 0.6959, 0.5936 0.682, 0.5725 0.7246, 0.5725 0.7246, 0.5936 0.682, 0.5725 0.7075, 0.5725 0.6688, 0.5936 0.6959, 0.5936 0.6979, 0.5725 0.6673, 0.5936 0.6959, 0.5725 0.6688, 0.509 0.6556, 0.509 0.6543, 0.5725 0.6688, 0.5725 0.6688, 0.509 0.6543, 0.5725 0.6673, 0.5725 0.6673, 0.5936 0.682, 0.5936 0.6959, 0.5725 0.6566, 0.5936 0.682, 0.5725 0.6673, 0.5725 0.6566, 0.509 0.6543, 0.509 0.645, 0.5725 0.6673, 0.509 0.6543, 0.5725 0.6566, 0.509 0.7191, 0.546 0.6961, 0.509 0.6989, 0.5725 0.7075, 0.546 0.6961, 0.509 0.7191, 0.5725 0.6889, 0.546 0.6961, 0.5725 0.7075, 0.509 0.6688, 0.546 0.6961, 0.546 0.6667, 0.509 0.6989, 0.546 0.6961, 0.509 0.6688, 0.5725 0.6612, 0.546 0.6961, 0.5725 0.6889, 0.546 0.6667, 0.546 0.6961, 0.5725 0.6612, 0.5725 0.6889, 0.5936 0.682, 0.5936 0.6669, 0.5725 0.7075, 0.5936 0.682, 0.5725 0.6889, 0.5936 0.6669, 0.5936 0.6444, 0.5725 0.6889, 0.5725 0.6889, 0.5936 0.6444, 0.5725 0.6612, 0.546 0.6667, 0.546 0.6256, 0.509 0.6688, 0.509 0.6688, 0.546 0.6256, 0.509 0.6268, 0.5725 0.6612, 0.546 0.6256, 0.546 0.6667, 0.5725 0.6225, 0.546 0.6256, 0.5725 0.6612, 0.509 0.571, 0.546 0.6256, 0.546 0.571, 0.509 0.6268, 0.546 0.6256, 0.509 0.571, 0.5725 0.571, 0.546 0.6256, 0.5725 0.6225, 0.546 0.571, 0.546 0.6256, 0.5725 0.571, 0.5725 0.6225, 0.5936 0.6444, 0.5936 0.6129, 0.5725 0.6612, 0.5936 0.6444, 0.5725 0.6225, 0.5936 0.6129, 0.5936 0.571, 0.5725 0.6225, 0.5725 0.6225, 0.5936 0.571, 0.5725 0.571, 0.5725 0.6275, 0.5936 0.682, 0.5725 0.6566, 0.5936 0.6669, 0.5936 0.682, 0.5725 0.6275, 0.5725 0.6275, 0.5936 0.6444, 0.5936 0.6669, 0.5725 0.6566, 0.546 0.622, 0.5725 0.6275, 0.509 0.6199, 0.546 0.622, 0.509 0.645, 0.5725 0.6566, 0.509 0.645, 0.546 0.622, 0.5725 0.6033, 0.5936 0.6444, 0.5725 0.6275, 0.5936 0.6129, 0.5936 0.6444, 0.5725 0.6033, 0.5725 0.6033, 0.5936 0.571, 0.5936 0.6129, 0.5725 0.571, 0.5936 0.571, 0.5725 0.6033, 0.546 0.622, 0.546 0.6001, 0.5725 0.6275, 0.5725 0.6275, 0.546 0.6001, 0.5725 0.6033, 0.509 0.6199, 0.546 0.6001, 0.546 0.622, 0.509 0.5989, 0.546 0.6001, 0.509 0.6199, 0.5725 0.571, 0.546 0.6001, 0.546 0.571, 0.5725 0.6033, 0.546 0.6001, 0.5725 0.571, 0.509 0.571, 0.546 0.6001, 0.509 0.5989, 0.546 0.571, 0.546 0.6001, 0.509 0.571, 0.472 0.571, 0.472 0.4922, 0.509 0.571, 0.509 0.571, 0.472 0.4922, 0.509 0.4943, 0.4455 0.571, 0.472 0.4922, 0.472 0.571, 0.4455 0.4869, 0.472 0.4922, 0.4455 0.571, 0.4455 0.4869, 0.4244 0.571, 0.4244 0.4706, 0.4455 0.571, 0.4244 0.571, 0.4455 0.4869, 0.509 0.4943, 0.472 0.4922, 0.509 0.4017, 0.4455 0.3904, 0.472 0.4922, 0.4455 0.4869, 0.509 0.4017, 0.472 0.4922, 0.4455 0.3904, 0.4244 0.3656, 0.4455 0.4869, 0.4244 0.4706, 0.4455 0.3904, 0.4455 0.4869, 0.4244 0.3656, 0.4455 0.571, 0.4455 0.5125, 0.4244 0.571, 0.4244 0.4706, 0.4455 0.5125, 0.4455 0.4543, 0.4244 0.4706, 0.4244 0.571, 0.4455 0.5125, 0.472 0.571, 0.472 0.5094, 0.4455 0.571, 0.4455 0.571, 0.472 0.5094, 0.4455 0.5125, 0.509 0.571, 0.472 0.5094, 0.472 0.571, 0.509 0.5082, 0.472 0.5094, 0.509 0.571, 0.4455 0.4543, 0.472 0.5094, 0.472 0.4489, 0.4455 0.5125, 0.472 0.5094, 0.4455 0.4543, 0.509 0.4469, 0.472 0.5094, 0.509 0.5082, 0.472 0.4489, 0.472 0.5094, 0.509 0.4469, 0.4455 0.4543, 0.4455 0.3969, 0.4244 0.4706, 0.4244 0.3656, 0.4455 0.3969, 0.4455 0.3407, 0.4244 0.4706, 0.4455 0.3969, 0.4244 0.3656, 0.472 0.4489, 0.4733 0.3927, 0.4455 0.4543, 0.4455 0.4543, 0.4733 0.3927, 0.4455 0.3969, 0.509 0.4469, 0.4733 0.3927, 0.472 0.4489, 0.509 0.3873, 0.4733 0.3927, 0.509 0.4469, 0.509 0.3873, 0.4455 0.3969, 0.4733 0.3927, 0.509 0.3294, 0.4733 0.3927, 0.509 0.3873, 0.4455 0.3407, 0.4733 0.3927, 0.509 0.3294, 0.4455 0.3969, 0.4733 0.3927, 0.4455 0.3407, 0.4455 0.2952, 0.509 0.4017, 0.4455 0.3904, 0.509 0.3092, 0.509 0.4017, 0.4455 0.2952, 0.4244 0.2645, 0.4455 0.3904, 0.4244 0.3656, 0.4455 0.2952, 0.4455 0.3904, 0.4244 0.2645, 0.4455 0.2148, 0.509 0.2325, 0.509 0.3092, 0.509 0.3092, 0.4455 0.2952, 0.4455 0.2148, 0.5725 0.2148, 0.509 0.3092, 0.509 0.2325, 0.4455 0.2952, 0.4244 0.1761, 0.4455 0.2148, 0.4244 0.1761, 0.4455 0.2952, 0.4244 0.2645, 0.4455 0.2339, 0.4244 0.3656, 0.4455 0.3407, 0.4244 0.2645, 0.4244 0.3656, 0.4455 0.2339, 0.509 0.2199, 0.4455 0.3407, 0.509 0.3294, 0.4455 0.2339, 0.4455 0.3407, 0.509 0.2199, 0.509 0.3092, 0.5725 0.2148, 0.5725 0.2952, 0.4455 0.1373, 0.4244 0.2645, 0.4455 0.2339, 0.4455 0.1373, 0.4244 0.1761, 0.4244 0.2645, 0.509 0.121, 0.4455 0.1373, 0.509 0.2199, 0.5725 0.1373, 0.509 0.121, 0.509 0.2199, 0.546 0.571, 0.546 0.5094, 0.509 0.571, 0.509 0.571, 0.546 0.5094, 0.509 0.5082, 0.5725 0.571, 0.546 0.5094, 0.546 0.571, 0.5725 0.5125, 0.546 0.5094, 0.5725 0.571, 0.509 0.4469, 0.546 0.5094, 0.546 0.4489, 0.509 0.5082, 0.546 0.5094, 0.509 0.4469, 0.5725 0.4543, 0.546 0.5094, 0.5725 0.5125, 0.546 0.4489, 0.546 0.5094, 0.5725 0.4543, 0.5936 0.571, 0.5725 0.5125, 0.5725 0.571, 0.5725 0.4543, 0.5725 0.5125, 0.5936 0.4706, 0.5936 0.4706, 0.5725 0.5125, 0.5936 0.571, 0.546 0.4489, 0.5447 0.3927, 0.509 0.4469, 0.509 0.4469, 0.5447 0.3927, 0.509 0.3873, 0.5725 0.4543, 0.5447 0.3927, 0.546 0.4489, 0.5725 0.3969, 0.5447 0.3927, 0.5725 0.4543, 0.5725 0.3969, 0.509 0.3873, 0.5447 0.3927, 0.5725 0.3407, 0.5447 0.3927, 0.5725 0.3969, 0.509 0.3294, 0.5447 0.3927, 0.5725 0.3407, 0.509 0.3873, 0.5447 0.3927, 0.509 0.3294, 0.5936 0.4706, 0.5725 0.3969, 0.5725 0.4543, 0.5725 0.3407, 0.5725 0.3969, 0.5936 0.3656, 0.5936 0.4706, 0.5936 0.3656, 0.5725 0.3969, 0.5725 0.4869, 0.5936 0.571, 0.5725 0.571, 0.5936 0.4706, 0.5936 0.571, 0.5725 0.4869, 0.546 0.571, 0.546 0.4922, 0.5725 0.571, 0.5725 0.571, 0.546 0.4922, 0.5725 0.4869, 0.509 0.571, 0.546 0.4922, 0.546 0.571, 0.509 0.4943, 0.546 0.4922, 0.509 0.571, 0.5936 0.3656, 0.5725 0.4869, 0.5725 0.3904, 0.5936 0.4706, 0.5725 0.4869, 0.5936 0.3656, 0.5725 0.4869, 0.546 0.4922, 0.5725 0.3904, 0.509 0.4017, 0.546 0.4922, 0.509 0.4943, 0.509 0.4017, 0.5725 0.3904, 0.546 0.4922, 0.5725 0.2339, 0.509 0.3294, 0.5725 0.3407, 0.509 0.2199, 0.509 0.3294, 0.5725 0.2339, 0.5936 0.2645, 0.5725 0.3407, 0.5936 0.3656, 0.5725 0.2339, 0.5725 0.3407, 0.5936 0.2645, 0.5725 0.1373, 0.509 0.2199, 0.5725 0.2339, 0.4455 0.2339, 0.509 0.2199, 0.4455 0.1373, 0.5936 0.1761, 0.5725 0.2339, 0.5936 0.2645, 0.5725 0.2339, 0.5936 0.1761, 0.5725 0.1373, 0.5725 0.2952, 0.5936 0.3656, 0.5725 0.3904, 0.5936 0.2645, 0.5936 0.3656, 0.5725 0.2952, 0.5725 0.2952, 0.5725 0.3904, 0.509 0.3092, 0.5725 0.2148, 0.5936 0.2645, 0.5725 0.2952, 0.5936 0.2645, 0.5725 0.2148, 0.5936 0.1761, 0.5725 0.3904, 0.509 0.4017, 0.509 0.3092, 0.4297 0.4293, 0.509 0.4299, 0.4276 0.4166, 0.509 0.4411, 0.509 0.4299, 0.4297 0.4293, 0.4297 0.4293, 0.3694 0.3814, 0.3731 0.3983, 0.4276 0.4166, 0.3694 0.3814, 0.4297 0.4293, 0.4297 0.4293, 0.509 0.4714, 0.509 0.4411, 0.4355 0.4615, 0.509 0.4714, 0.4297 0.4293, 0.3731 0.3983, 0.3829 0.4354, 0.4297 0.4293, 0.4297 0.4293, 0.3829 0.4354, 0.4355 0.4615, 0.3391 0.3544, 0.3694 0.3814, 0.3345 0.3318, 0.3731 0.3983, 0.3694 0.3814, 0.3391 0.3544, 0.3391 0.3544, 0.3228 0.2748, 0.3278 0.3042, 0.3345 0.3318, 0.3228 0.2748, 0.3391 0.3544, 0.3391 0.3544, 0.3829 0.4354, 0.3731 0.3983, 0.3514 0.3986, 0.3829 0.4354, 0.3391 0.3544, 0.3278 0.3042, 0.3409 0.3563, 0.3391 0.3544, 0.3391 0.3544, 0.3409 0.3563, 0.3514 0.3986, 0.4436 0.5084, 0.509 0.4714, 0.4355 0.4615, 0.509 0.5162, 0.509 0.4714, 0.4436 0.5084, 0.4436 0.5084, 0.3829 0.4354, 0.3968 0.4877, 0.4355 0.4615, 0.3829 0.4354, 0.4436 0.5084, 0.4436 0.5084, 0.509 0.571, 0.509 0.5162, 0.4529 0.5652, 0.509 0.571, 0.4436 0.5084, 0.3968 0.4877, 0.4529 0.5652, 0.4436 0.5084, 0.4127 0.55, 0.4529 0.5652, 0.3968 0.4877, 0.3688 0.4585, 0.3829 0.4354, 0.3514 0.3986, 0.3968 0.4877, 0.3829 0.4354, 0.3688 0.4585, 0.3688 0.4585, 0.3409 0.3563, 0.3594 0.425, 0.3514 0.3986, 0.3409 0.3563, 0.3688 0.4585, 0.3688 0.4585, 0.4127 0.55, 0.3968 0.4877, 0.3887 0.5286, 0.4127 0.55, 0.3688 0.4585, 0.3594 0.425, 0.3887 0.5286, 0.3688 0.4585, 0.3807 0.504, 0.3887 0.5286, 0.3594 0.425, 0.3391 0.2539, 0.3228 0.2748, 0.3345 0.2178, 0.3278 0.3042, 0.3228 0.2748, 0.3391 0.2539, 0.3694 0.1681, 0.3731 0.21, 0.3391 0.2539, 0.3391 0.2539, 0.3409 0.3563, 0.3278 0.3042, 0.3514 0.3141, 0.3409 0.3563, 0.3391 0.2539, 0.3456 0.2856, 0.3731 0.21, 0.3774 0.2409, 0.3391 0.2539, 0.3731 0.21, 0.3456 0.2856, 0.3774 0.2409, 0.3829 0.2772, 0.3456 0.2856, 0.3456 0.2856, 0.3829 0.2772, 0.3514 0.3141, 0.3345 0.2178, 0.3694 0.1681, 0.3391 0.2539, 0.4297 0.179, 0.3731 0.21, 0.3694 0.1681, 0.3694 0.1681, 0.509 0.1468, 0.509 0.156, 0.509 0.156, 0.509 0.1672, 0.3694 0.1681, 0.3694 0.1681, 0.509 0.1672, 0.4297 0.179, 0.4322 0.2123, 0.3731 0.21, 0.4297 0.179, 0.3774 0.2409, 0.3731 0.21, 0.4322 0.2123, 0.4322 0.2123, 0.3829 0.2772, 0.3774 0.2409, 0.4355 0.2512, 0.3829 0.2772, 0.4322 0.2123, 0.4322 0.2123, 0.509 0.1672, 0.509 0.2015, 0.4297 0.179, 0.509 0.1672, 0.4322 0.2123, 0.509 0.2015, 0.509 0.2413, 0.4322 0.2123, 0.4322 0.2123, 0.509 0.2413, 0.4355 0.2512, 0.3688 0.3915, 0.3409 0.3563, 0.3514 0.3141, 0.3594 0.425, 0.3409 0.3563, 0.3688 0.3915, 0.3688 0.3915, 0.3829 0.2772, 0.3968 0.3623, 0.3514 0.3141, 0.3829 0.2772, 0.3688 0.3915, 0.3688 0.3915, 0.3887 0.4794, 0.3594 0.425, 0.3594 0.425, 0.3887 0.4794, 0.3807 0.504, 0.3968 0.3623, 0.3887 0.4794, 0.3688 0.3915, 0.4127 0.4579, 0.3887 0.4794, 0.3968 0.3623, 0.4436 0.3417, 0.3829 0.2772, 0.4355 0.2512, 0.3968 0.3623, 0.3829 0.2772, 0.4436 0.3417, 0.4436 0.3417, 0.509 0.2413, 0.509 0.3338, 0.4355 0.2512, 0.509 0.2413, 0.4436 0.3417, 0.4436 0.3417, 0.4529 0.4427, 0.3968 0.3623, 0.3968 0.3623, 0.4529 0.4427, 0.4127 0.4579, 0.509 0.3338, 0.4529 0.4427, 0.4436 0.3417, 0.509 0.437, 0.4529 0.4427, 0.509 0.3338, 0.4529 0.5652, 0.509 0.6917, 0.509 0.571, 0.4702 0.6896, 0.509 0.6917, 0.4529 0.5652, 0.4127 0.55, 0.4702 0.6896, 0.4529 0.5652, 0.4426 0.6842, 0.4702 0.6896, 0.4127 0.55, 0.3887 0.5286, 0.4426 0.6842, 0.4127 0.55, 0.426 0.6764, 0.4426 0.6842, 0.3887 0.5286, 0.3807 0.504, 0.426 0.6764, 0.3887 0.5286, 0.4204 0.6675, 0.426 0.6764, 0.3807 0.504, 0.4702 0.6896, 0.509 0.7485, 0.509 0.6917, 0.476 0.7477, 0.509 0.7485, 0.4702 0.6896, 0.4426 0.6842, 0.476 0.7477, 0.4702 0.6896, 0.4524 0.7457, 0.476 0.7477, 0.4426 0.6842, 0.476 0.7477, 0.509 0.7966, 0.509 0.7485, 0.4782 0.7966, 0.509 0.7966, 0.476 0.7477, 0.4524 0.7457, 0.4782 0.7966, 0.476 0.7477, 0.4561 0.7966, 0.4782 0.7966, 0.4524 0.7457, 0.426 0.6764, 0.4431 0.7426, 0.4426 0.6842, 0.4426 0.6842, 0.4431 0.7426, 0.4524 0.7457, 0.4204 0.6675, 0.4335 0.7395, 0.426 0.6764, 0.426 0.6764, 0.4335 0.7395, 0.4431 0.7426, 0.4335 0.7395, 0.4385 0.7966, 0.4524 0.7457, 0.4524 0.7457, 0.4385 0.7966, 0.4561 0.7966, 0.4007 0.5865, 0.3887 0.4794, 0.4086 0.5707, 0.3807 0.504, 0.3887 0.4794, 0.4007 0.5865, 0.4287 0.5566, 0.3887 0.4794, 0.4127 0.4579, 0.4086 0.5707, 0.3887 0.4794, 0.4287 0.5566, 0.4086 0.5707, 0.426 0.6586, 0.4007 0.5865, 0.4007 0.5865, 0.426 0.6586, 0.4204 0.6675, 0.4287 0.5566, 0.426 0.6586, 0.4086 0.5707, 0.4426 0.6508, 0.426 0.6586, 0.4287 0.5566, 0.4287 0.5566, 0.4529 0.4427, 0.4621 0.5466, 0.4127 0.4579, 0.4529 0.4427, 0.4287 0.5566, 0.509 0.5428, 0.4529 0.4427, 0.509 0.437, 0.4621 0.5466, 0.4529 0.4427, 0.509 0.5428, 0.4621 0.5466, 0.4702 0.6453, 0.4287 0.5566, 0.4287 0.5566, 0.4702 0.6453, 0.4426 0.6508, 0.509 0.5428, 0.4702 0.6453, 0.4621 0.5466, 0.509 0.6432, 0.4702 0.6453, 0.509 0.5428, 0.4335 0.7395, 0.426 0.6586, 0.4524 0.7333, 0.4204 0.6675, 0.426 0.6586, 0.4335 0.7395, 0.4524 0.7333, 0.426 0.6586, 0.4426 0.6508, 0.4359 0.7669, 0.4524 0.7333, 0.4551 0.7678, 0.4335 0.7395, 0.4524 0.7333, 0.4359 0.7669, 0.4551 0.7678, 0.4561 0.7966, 0.4359 0.7669, 0.4359 0.7669, 0.4561 0.7966, 0.4385 0.7966, 0.4524 0.7333, 0.4702 0.6453, 0.476 0.7313, 0.4426 0.6508, 0.4702 0.6453, 0.4524 0.7333, 0.509 0.7305, 0.4702 0.6453, 0.509 0.6432, 0.476 0.7313, 0.4702 0.6453, 0.509 0.7305, 0.476 0.7313, 0.4776 0.767, 0.4524 0.7333, 0.4524 0.7333, 0.4776 0.767, 0.4551 0.7678, 0.4776 0.767, 0.4782 0.7966, 0.4551 0.7678, 0.4551 0.7678, 0.4782 0.7966, 0.4561 0.7966, 0.509 0.7305, 0.509 0.7667, 0.476 0.7313, 0.476 0.7313, 0.509 0.7667, 0.4776 0.767, 0.509 0.7667, 0.509 0.7966, 0.4776 0.767, 0.4776 0.767, 0.509 0.7966, 0.4782 0.7966, 0.509 0.156, 0.509 0.1468, 0.6486 0.1681, 0.6486 0.1681, 0.509 0.1672, 0.509 0.156, 0.5883 0.179, 0.509 0.1672, 0.6486 0.1681, 0.6486 0.1681, 0.6449 0.21, 0.5883 0.179, 0.5858 0.2123, 0.509 0.1672, 0.5883 0.179, 0.509 0.2015, 0.509 0.1672, 0.5858 0.2123, 0.5858 0.2123, 0.509 0.2413, 0.509 0.2015, 0.5825 0.2512, 0.509 0.2413, 0.5858 0.2123, 0.5858 0.2123, 0.6449 0.21, 0.6406 0.2409, 0.5883 0.179, 0.6449 0.21, 0.5858 0.2123, 0.6406 0.2409, 0.6351 0.2772, 0.5858 0.2123, 0.5858 0.2123, 0.6351 0.2772, 0.5825 0.2512, 0.6835 0.2178, 0.6789 0.2539, 0.6486 0.1681, 0.6789 0.2539, 0.6449 0.21, 0.6486 0.1681, 0.6789 0.2539, 0.6952 0.2748, 0.6902 0.3042, 0.6835 0.2178, 0.6952 0.2748, 0.6789 0.2539, 0.6724 0.2856, 0.6449 0.21, 0.6789 0.2539, 0.6406 0.2409, 0.6449 0.21, 0.6724 0.2856, 0.6724 0.2856, 0.6351 0.2772, 0.6406 0.2409, 0.6666 0.3141, 0.6351 0.2772, 0.6724 0.2856, 0.6902 0.3042, 0.6771 0.3563, 0.6789 0.2539, 0.6789 0.2539, 0.6771 0.3563, 0.6666 0.3141, 0.5744 0.3417, 0.509 0.2413, 0.5825 0.2512, 0.509 0.3338, 0.509 0.2413, 0.5744 0.3417, 0.5744 0.3417, 0.6351 0.2772, 0.6212 0.3623, 0.5825 0.2512, 0.6351 0.2772, 0.5744 0.3417, 0.5744 0.3417, 0.5652 0.4427, 0.509 0.3338, 0.509 0.3338, 0.5652 0.4427, 0.509 0.437, 0.6212 0.3623, 0.5652 0.4427, 0.5744 0.3417, 0.6053 0.4579, 0.5652 0.4427, 0.6212 0.3623, 0.6492 0.3915, 0.6351 0.2772, 0.6666 0.3141, 0.6212 0.3623, 0.6351 0.2772, 0.6492 0.3915, 0.6492 0.3915, 0.6771 0.3563, 0.6586 0.425, 0.6666 0.3141, 0.6771 0.3563, 0.6492 0.3915, 0.6492 0.3915, 0.6293 0.4794, 0.6212 0.3623, 0.6212 0.3623, 0.6293 0.4794, 0.6053 0.4579, 0.6586 0.425, 0.6293 0.4794, 0.6492 0.3915, 0.6374 0.504, 0.6293 0.4794, 0.6586 0.425, 0.6789 0.3544, 0.6952 0.2748, 0.6835 0.3318, 0.6902 0.3042, 0.6952 0.2748, 0.6789 0.3544, 0.6789 0.3544, 0.6486 0.3814, 0.6449 0.3983, 0.6835 0.3318, 0.6486 0.3814, 0.6789 0.3544, 0.6789 0.3544, 0.6771 0.3563, 0.6902 0.3042, 0.6666 0.3986, 0.6771 0.3563, 0.6789 0.3544, 0.6449 0.3983, 0.6351 0.4354, 0.6789 0.3544, 0.6789 0.3544, 0.6351 0.4354, 0.6666 0.3986, 0.5883 0.4293, 0.6486 0.3814, 0.5905 0.4166, 0.6449 0.3983, 0.6486 0.3814, 0.5883 0.4293, 0.5883 0.4293, 0.509 0.4299, 0.509 0.4411, 0.5905 0.4166, 0.509 0.4299, 0.5883 0.4293, 0.5883 0.4293, 0.6351 0.4354, 0.6449 0.3983, 0.5825 0.4615, 0.6351 0.4354, 0.5883 0.4293, 0.509 0.4411, 0.509 0.4714, 0.5883 0.4293, 0.5883 0.4293, 0.509 0.4714, 0.5825 0.4615, 0.6492 0.4585, 0.6771 0.3563, 0.6666 0.3986, 0.6586 0.425, 0.6771 0.3563, 0.6492 0.4585, 0.6492 0.4585, 0.6351 0.4354, 0.6212 0.4877, 0.6666 0.3986, 0.6351 0.4354, 0.6492 0.4585, 0.6492 0.4585, 0.6374 0.504, 0.6586 0.425, 0.6293 0.5286, 0.6374 0.504, 0.6492 0.4585, 0.6659 0.7449, 0.6751 0.7422, 0.6761 0.7696, 0.6608 0.7193, 0.6704 0.7184, 0.6659 0.7449, 0.6212 0.4877, 0.6293 0.5286, 0.6492 0.4585, 0.6053 0.55, 0.6293 0.5286, 0.6212 0.4877, 0.6608 0.6935, 0.6658 0.6682, 0.6751 0.671, 0.6761 0.7696, 0.6846 0.7651, 0.6915 0.7926, 0.5744 0.5084, 0.6351 0.4354, 0.5825 0.4615, 0.6212 0.4877, 0.6351 0.4354, 0.5744 0.5084, 0.5744 0.5084, 0.509 0.4714, 0.509 0.5162, 0.5825 0.4615, 0.509 0.4714, 0.5744 0.5084, 0.5744 0.5084, 0.6053 0.55, 0.6212 0.4877, 0.5652 0.5652, 0.6053 0.55, 0.5744 0.5084, 0.7171 0.8046, 0.7377 0.8183, 0.7332 0.8269, 0.711 0.8121, 0.6915 0.7926, 0.6989 0.7864, 0.509 0.5162, 0.509 0.571, 0.5744 0.5084, 0.5744 0.5084, 0.509 0.571, 0.5652 0.5652, 0.509 0.5428, 0.5652 0.4427, 0.5559 0.5466, 0.509 0.437, 0.5652 0.4427, 0.509 0.5428, 0.5893 0.5566, 0.5652 0.4427, 0.6053 0.4579, 0.5559 0.5466, 0.5652 0.4427, 0.5893 0.5566, 0.5559 0.5466, 0.5478 0.6453, 0.509 0.5428, 0.509 0.5428, 0.5478 0.6453, 0.509 0.6432, 0.5893 0.5566, 0.5478 0.6453, 0.5559 0.5466, 0.5754 0.6508, 0.5478 0.6453, 0.5893 0.5566, 0.5893 0.5566, 0.6293 0.4794, 0.6094 0.5707, 0.6053 0.4579, 0.6293 0.4794, 0.5893 0.5566, 0.6173 0.5865, 0.6293 0.4794, 0.6374 0.504, 0.6094 0.5707, 0.6293 0.4794, 0.6173 0.5865, 0.6094 0.5707, 0.5921 0.6586, 0.5893 0.5566, 0.5893 0.5566, 0.5921 0.6586, 0.5754 0.6508, 0.6173 0.5865, 0.5921 0.6586, 0.6094 0.5707, 0.5976 0.6675, 0.5921 0.6586, 0.6173 0.5865, 0.509 0.7305, 0.5478 0.6453, 0.542 0.7313, 0.509 0.6432, 0.5478 0.6453, 0.509 0.7305, 0.5656 0.7333, 0.5478 0.6453, 0.5754 0.6508, 0.542 0.7313, 0.5478 0.6453, 0.5656 0.7333, 0.542 0.7313, 0.509 0.7667, 0.509 0.7305, 0.5404 0.767, 0.509 0.7667, 0.542 0.7313, 0.5404 0.767, 0.509 0.7966, 0.509 0.7667, 0.5399 0.7966, 0.509 0.7966, 0.5404 0.767, 0.5656 0.7333, 0.5404 0.767, 0.542 0.7313, 0.5629 0.7678, 0.5404 0.767, 0.5656 0.7333, 0.5629 0.7678, 0.5399 0.7966, 0.5404 0.767, 0.5619 0.7966, 0.5399 0.7966, 0.5629 0.7678, 0.5754 0.6508, 0.5921 0.6586, 0.5656 0.7333, 0.5845 0.7395, 0.5921 0.6586, 0.5976 0.6675, 0.5656 0.7333, 0.5921 0.6586, 0.5845 0.7395, 0.5821 0.7669, 0.5656 0.7333, 0.5845 0.7395, 0.5629 0.7678, 0.5656 0.7333, 0.5821 0.7669, 0.5821 0.7669, 0.5619 0.7966, 0.5629 0.7678, 0.5795 0.7966, 0.5619 0.7966, 0.5821 0.7669, 0.6293 0.5286, 0.5976 0.6675, 0.6374 0.504, 0.5921 0.6764, 0.5976 0.6675, 0.6293 0.5286, 0.8756 0.8037, 0.8938 0.7855, 0.9013 0.7916, 0.8756 0.8037, 0.8817 0.8112, 0.8542 0.818, 0.6053 0.55, 0.5921 0.6764, 0.6293 0.5286, 0.5754 0.6842, 0.5921 0.6764, 0.6053 0.55, 0.8542 0.818, 0.8587 0.8266, 0.8314 0.8275, 0.8314 0.8275, 0.8341 0.8368, 0.8076 0.8322, 0.5652 0.5652, 0.5754 0.6842, 0.6053 0.55, 0.5478 0.6896, 0.5754 0.6842, 0.5652 0.5652, 0.8076 0.8322, 0.8085 0.8418, 0.7836 0.8322, 0.7827 0.8418, 0.7574 0.8368, 0.7601 0.8275, 0.509 0.571, 0.509 0.6917, 0.5652 0.5652, 0.5652 0.5652, 0.509 0.6917, 0.5478 0.6896, 0.5921 0.6764, 0.5845 0.7395, 0.5976 0.6675, 0.5749 0.7426, 0.5845 0.7395, 0.5921 0.6764, 0.926 0.7452, 0.9161 0.7694, 0.9075 0.7649, 0.9161 0.7694, 0.9013 0.7916, 0.8938 0.7855, 0.5754 0.6842, 0.5749 0.7426, 0.5921 0.6764, 0.5656 0.7457, 0.5749 0.7426, 0.5754 0.6842, 0.7574 0.8368, 0.7332 0.8269, 0.7377 0.8183, 0.9213 0.695, 0.931 0.6941, 0.9213 0.719, 0.5656 0.7457, 0.5795 0.7966, 0.5845 0.7395, 0.5619 0.7966, 0.5795 0.7966, 0.5656 0.7457, 0.5478 0.6896, 0.5656 0.7457, 0.5754 0.6842, 0.542 0.7477, 0.5656 0.7457, 0.5478 0.6896, 0.509 0.6917, 0.509 0.7485, 0.5478 0.6896, 0.5478 0.6896, 0.509 0.7485, 0.542 0.7477, 0.542 0.7477, 0.5619 0.7966, 0.5656 0.7457, 0.5399 0.7966, 0.5619 0.7966, 0.542 0.7477, 0.509 0.7485, 0.509 0.7966, 0.542 0.7477, 0.542 0.7477, 0.509 0.7966, 0.5399 0.7966, 0.4782 0.7966, 0.509 0.8094, 0.509 0.7966, 0.4801 0.8127, 0.509 0.8094, 0.4782 0.7966, 0.4561 0.7966, 0.4801 0.8127, 0.4782 0.7966, 0.4594 0.8133, 0.4801 0.8127, 0.4561 0.7966, 0.4385 0.7966, 0.4429 0.815, 0.4561 0.7966, 0.4561 0.7966, 0.4429 0.815, 0.4594 0.8133, 0.4801 0.8127, 0.509 0.8178, 0.509 0.8094, 0.4843 0.8181, 0.509 0.8178, 0.4801 0.8127, 0.4594 0.8133, 0.4667 0.819, 0.4801 0.8127, 0.4801 0.8127, 0.4667 0.819, 0.4843 0.8181, 0.4429 0.815, 0.4526 0.8218, 0.4594 0.8133, 0.4594 0.8133, 0.4526 0.8218, 0.4667 0.819, 0.4561 0.7966, 0.4594 0.8167, 0.4385 0.7966, 0.4385 0.7966, 0.4594 0.8167, 0.4429 0.815, 0.4782 0.7966, 0.4801 0.8172, 0.4561 0.7966, 0.4561 0.7966, 0.4801 0.8172, 0.4594 0.8167, 0.509 0.7966, 0.509 0.8192, 0.4782 0.7966, 0.4782 0.7966, 0.509 0.8192, 0.4801 0.8172, 0.4594 0.8167, 0.4667 0.8245, 0.4429 0.815, 0.4429 0.815, 0.4667 0.8245, 0.4526 0.8218, 0.4801 0.8172, 0.4843 0.8254, 0.4594 0.8167, 0.4594 0.8167, 0.4843 0.8254, 0.4667 0.8245, 0.8747 0.6089, 0.8807 0.6013, 0.8929 0.627, 0.4843 0.8254, 0.509 0.8192, 0.509 0.8243, 0.6608 0.6935, 0.6704 0.6945, 0.6608 0.7193, 0.6658 0.6682, 0.6757 0.6441, 0.6843 0.6486, 0.6757 0.6441, 0.6905 0.6219, 0.698 0.6279, 0.6905 0.6219, 0.71 0.6023, 0.7162 0.6098, 0.8085 0.8418, 0.7827 0.8418, 0.7836 0.8322, 0.7836 0.8322, 0.7827 0.8418, 0.7601 0.8275, 0.8091 0.5716, 0.8344 0.5766, 0.8317 0.5859, 0.733 0.5869, 0.7375 0.5955, 0.71 0.6023, 0.7577 0.5767, 0.7604 0.586, 0.733 0.5869, 0.7833 0.5716, 0.7842 0.5813, 0.7577 0.5767, 0.7601 0.8275, 0.7574 0.8368, 0.7377 0.8183, 0.711 0.8121, 0.7171 0.8046, 0.7332 0.8269, 0.7171 0.8046, 0.711 0.8121, 0.6989 0.7864, 0.6846 0.7651, 0.6989 0.7864, 0.6915 0.7926, 0.6704 0.6945, 0.6704 0.7184, 0.6608 0.7193, 0.6704 0.6945, 0.6608 0.6935, 0.6751 0.671, 0.509 0.8192, 0.5337 0.8254, 0.509 0.8243, 0.509 0.8192, 0.5379 0.8172, 0.5337 0.8254, 0.6751 0.7422, 0.6846 0.7651, 0.6761 0.7696, 0.6704 0.7184, 0.6751 0.7422, 0.6659 0.7449, 0.6751 0.671, 0.6658 0.6682, 0.6843 0.6486, 0.6843 0.6486, 0.6757 0.6441, 0.698 0.6279, 0.698 0.6279, 0.6905 0.6219, 0.7162 0.6098, 0.7375 0.5955, 0.7162 0.6098, 0.71 0.6023, 0.5399 0.7966, 0.509 0.8192, 0.509 0.7966, 0.5379 0.8172, 0.509 0.8192, 0.5399 0.7966, 0.5619 0.7966, 0.5379 0.8172, 0.5399 0.7966, 0.5586 0.8167, 0.5379 0.8172, 0.5619 0.7966, 0.5795 0.7966, 0.5586 0.8167, 0.5619 0.7966, 0.5751 0.815, 0.5586 0.8167, 0.5795 0.7966, 0.9003 0.6209, 0.9157 0.6439, 0.9072 0.6484, 0.4843 0.8254, 0.4801 0.8172, 0.509 0.8192, 0.5586 0.8167, 0.5337 0.8254, 0.5379 0.8172, 0.5513 0.8245, 0.5337 0.8254, 0.5586 0.8167, 0.5751 0.815, 0.5513 0.8245, 0.5586 0.8167, 0.5654 0.8218, 0.5513 0.8245, 0.5751 0.815, 0.5619 0.7966, 0.5751 0.815, 0.5795 0.7966, 0.5586 0.8133, 0.5751 0.815, 0.5619 0.7966, 0.5399 0.7966, 0.5586 0.8133, 0.5619 0.7966, 0.5379 0.8127, 0.5586 0.8133, 0.5399 0.7966, 0.509 0.7966, 0.509 0.8094, 0.5399 0.7966, 0.5399 0.7966, 0.509 0.8094, 0.5379 0.8127, 0.5586 0.8133, 0.5654 0.8218, 0.5751 0.815, 0.5513 0.819, 0.5654 0.8218, 0.5586 0.8133, 0.5379 0.8127, 0.5513 0.819, 0.5586 0.8133, 0.5337 0.8181, 0.5513 0.819, 0.5379 0.8127, 0.509 0.8094, 0.509 0.8178, 0.5379 0.8127, 0.5379 0.8127, 0.509 0.8178, 0.5337 0.8181, 0.9157 0.6439, 0.9259 0.6685, 0.9166 0.6713, 0.9259 0.6685, 0.931 0.6941, 0.9213 0.695, 0.7604 0.586, 0.7375 0.5955, 0.733 0.5869, 0.7842 0.5813, 0.7604 0.586, 0.7577 0.5767, 0.931 0.6941, 0.931 0.7199, 0.9213 0.719, 0.926 0.7452, 0.9167 0.7425, 0.931 0.7199, 0.8081 0.5813, 0.7842 0.5813, 0.7833 0.5716, 0.8081 0.5813, 0.8091 0.5716, 0.8317 0.5859, 0.8317 0.5859, 0.8344 0.5766, 0.8541 0.5951, 0.8541 0.5951, 0.8585 0.5866, 0.8747 0.6089, 0.9167 0.7425, 0.926 0.7452, 0.9075 0.7649, 0.9075 0.7649, 0.9161 0.7694, 0.8938 0.7855, 0.8817 0.8112, 0.8756 0.8037, 0.9013 0.7916, 0.8817 0.8112, 0.8587 0.8266, 0.8542 0.818, 0.8091 0.5716, 0.8081 0.5813, 0.7833 0.5716, 0.8344 0.5766, 0.8585 0.5866, 0.8541 0.5951, 0.8585 0.5866, 0.8807 0.6013, 0.8747 0.6089, 0.8807 0.6013, 0.9003 0.6209, 0.8929 0.627, 0.8587 0.8266, 0.8341 0.8368, 0.8314 0.8275, 0.8341 0.8368, 0.8085 0.8418, 0.8076 0.8322, 0.9167 0.7425, 0.9213 0.719, 0.931 0.7199, 0.8929 0.627, 0.9003 0.6209, 0.9072 0.6484, 0.9072 0.6484, 0.9157 0.6439, 0.9166 0.6713, 0.9166 0.6713, 0.9259 0.6685, 0.9213 0.695, 0.4233 0.5, 0.5 0.5, 0.4292 0.5304, 0.4292 0.5304, 0.3952 0.5448, 0.4233 0.5, 0.4233 0.5, 0.3952 0.5448, 0.3865 0.5, 0.4292 0.5304, 0.5 0.5, 0.4453 0.5547, 0.4453 0.5547, 0.3952 0.5448, 0.4292 0.5304, 0.4192 0.5808, 0.3952 0.5448, 0.4453 0.5547, 0.3793 0.5, 0.3952 0.5448, 0.3886 0.5476, 0.3865 0.5, 0.3952 0.5448, 0.3793 0.5, 0.3886 0.5476, 0.4 0.5427, 0.3793 0.5, 0.3793 0.5, 0.4 0.5427, 0.3917 0.5, 0.4141 0.5859, 0.3952 0.5448, 0.4192 0.5808, 0.3886 0.5476, 0.3952 0.5448, 0.4141 0.5859, 0.4141 0.5859, 0.4 0.5427, 0.3886 0.5476, 0.423 0.577, 0.4 0.5427, 0.4141 0.5859, 0.4453 0.5547, 0.5 0.5, 0.4696 0.5708, 0.4696 0.5708, 0.4552 0.6048, 0.4453 0.5547, 0.4453 0.5547, 0.4552 0.6048, 0.4192 0.5808, 0.4696 0.5708, 0.5 0.5, 0.5 0.5767, 0.5 0.5767, 0.4552 0.6048, 0.4696 0.5708, 0.5 0.6135, 0.4552 0.6048, 0.5 0.5767, 0.4141 0.5859, 0.4552 0.6048, 0.4524 0.6114, 0.4192 0.5808, 0.4552 0.6048, 0.4141 0.5859, 0.4524 0.6114, 0.4573 0.6, 0.4141 0.5859, 0.4141 0.5859, 0.4573 0.6, 0.423 0.577, 0.5 0.6207, 0.4552 0.6048, 0.5 0.6135, 0.4524 0.6114, 0.4552 0.6048, 0.5 0.6207, 0.5 0.6207, 0.4573 0.6, 0.4524 0.6114, 0.5 0.6083, 0.4573 0.6, 0.5 0.6207, 0.4344 0.5, 0.4 0.5427, 0.4394 0.5258, 0.3917 0.5, 0.4 0.5427, 0.4344 0.5, 0.4534 0.5466, 0.4 0.5427, 0.423 0.577, 0.4394 0.5258, 0.4 0.5427, 0.4534 0.5466, 0.4394 0.5258, 0.4487 0.5218, 0.4344 0.5, 0.4344 0.5, 0.4487 0.5218, 0.4444 0.5, 0.4333 0.5, 0.4487 0.5218, 0.4385 0.5262, 0.4444 0.5, 0.4487 0.5218, 0.4333 0.5, 0.4534 0.5466, 0.4487 0.5218, 0.4394 0.5258, 0.4605 0.5395, 0.4487 0.5218, 0.4534 0.5466, 0.4527 0.5473, 0.4487 0.5218, 0.4605 0.5395, 0.4385 0.5262, 0.4487 0.5218, 0.4527 0.5473, 0.4534 0.5466, 0.4573 0.6, 0.4742 0.5606, 0.423 0.577, 0.4573 0.6, 0.4534 0.5466, 0.5 0.5656, 0.4573 0.6, 0.5 0.6083, 0.4742 0.5606, 0.4573 0.6, 0.5 0.5656, 0.4742 0.5606, 0.4782 0.5513, 0.4534 0.5466, 0.4534 0.5466, 0.4782 0.5513, 0.4605 0.5395, 0.4527 0.5473, 0.4782 0.5513, 0.4738 0.5615, 0.4605 0.5395, 0.4782 0.5513, 0.4527 0.5473, 0.5 0.5656, 0.4782 0.5513, 0.4742 0.5606, 0.5 0.5556, 0.4782 0.5513, 0.5 0.5656, 0.5 0.5667, 0.4782 0.5513, 0.5 0.5556, 0.4738 0.5615, 0.4782 0.5513, 0.5 0.5667, 0.5 0.5767, 0.5 0.5, 0.5304 0.5708, 0.5304 0.5708, 0.5448 0.6048, 0.5 0.5767, 0.5 0.5767, 0.5448 0.6048, 0.5 0.6135, 0.5304 0.5708, 0.5 0.5, 0.5547 0.5547, 0.5547 0.5547, 0.5448 0.6048, 0.5304 0.5708, 0.5808 0.5808, 0.5448 0.6048, 0.5547 0.5547, 0.5 0.6207, 0.5448 0.6048, 0.5476 0.6114, 0.5 0.6135, 0.5448 0.6048, 0.5 0.6207, 0.5476 0.6114, 0.5427 0.6, 0.5 0.6207, 0.5 0.6207, 0.5427 0.6, 0.5 0.6083, 0.5859 0.5859, 0.5448 0.6048, 0.5808 0.5808, 0.5476 0.6114, 0.5448 0.6048, 0.5859 0.5859, 0.5859 0.5859, 0.5427 0.6, 0.5476 0.6114, 0.577 0.577, 0.5427 0.6, 0.5859 0.5859, 0.5547 0.5547, 0.5 0.5, 0.5708 0.5304, 0.5708 0.5304, 0.6048 0.5448, 0.5547 0.5547, 0.5547 0.5547, 0.6048 0.5448, 0.5808 0.5808, 0.5708 0.5304, 0.5 0.5, 0.5767 0.5, 0.5767 0.5, 0.6048 0.5448, 0.5708 0.5304, 0.6135 0.5, 0.6048 0.5448, 0.5767 0.5, 0.5859 0.5859, 0.6048 0.5448, 0.6114 0.5476, 0.5808 0.5808, 0.6048 0.5448, 0.5859 0.5859, 0.6114 0.5476, 0.6 0.5427, 0.5859 0.5859, 0.5859 0.5859, 0.6 0.5427, 0.577 0.577, 0.6207 0.5, 0.6048 0.5448, 0.6135 0.5, 0.6114 0.5476, 0.6048 0.5448, 0.6207 0.5, 0.6207 0.5, 0.6 0.5427, 0.6114 0.5476, 0.6083 0.5, 0.6 0.5427, 0.6207 0.5, 0.5 0.5656, 0.5427 0.6, 0.5258 0.5606, 0.5 0.6083, 0.5427 0.6, 0.5 0.5656, 0.5466 0.5466, 0.5427 0.6, 0.577 0.577, 0.5258 0.5606, 0.5427 0.6, 0.5466 0.5466, 0.5258 0.5606, 0.5218 0.5513, 0.5 0.5656, 0.5 0.5656, 0.5218 0.5513, 0.5 0.5556, 0.5 0.5667, 0.5218 0.5513, 0.5262 0.5615, 0.5 0.5556, 0.5218 0.5513, 0.5 0.5667, 0.5466 0.5466, 0.5218 0.5513, 0.5258 0.5606, 0.5395 0.5395, 0.5218 0.5513, 0.5466 0.5466, 0.5473 0.5473, 0.5218 0.5513, 0.5395 0.5395, 0.5262 0.5615, 0.5218 0.5513, 0.5473 0.5473, 0.5466 0.5466, 0.6 0.5427, 0.5606 0.5258, 0.577 0.577, 0.6 0.5427, 0.5466 0.5466, 0.5656 0.5, 0.6 0.5427, 0.6083 0.5, 0.5606 0.5258, 0.6 0.5427, 0.5656 0.5, 0.5606 0.5258, 0.5513 0.5218, 0.5466 0.5466, 0.5466 0.5466, 0.5513 0.5218, 0.5395 0.5395, 0.5473 0.5473, 0.5513 0.5218, 0.5615 0.5262, 0.5395 0.5395, 0.5513 0.5218, 0.5473 0.5473, 0.5656 0.5, 0.5513 0.5218, 0.5606 0.5258, 0.5556 0.5, 0.5513 0.5218, 0.5656 0.5, 0.5667 0.5, 0.5513 0.5218, 0.5556 0.5, 0.5615 0.5262, 0.5513 0.5218, 0.5667 0.5, 0.5767 0.5, 0.5 0.5, 0.5708 0.4696, 0.5708 0.4696, 0.6048 0.4552, 0.5767 0.5, 0.5767 0.5, 0.6048 0.4552, 0.6135 0.5, 0.5708 0.4696, 0.5 0.5, 0.5547 0.4453, 0.5547 0.4453, 0.6048 0.4552, 0.5708 0.4696, 0.5808 0.4192, 0.6048 0.4552, 0.5547 0.4453, 0.6207 0.5, 0.6048 0.4552, 0.6114 0.4524, 0.6135 0.5, 0.6048 0.4552, 0.6207 0.5, 0.6114 0.4524, 0.6 0.4573, 0.6207 0.5, 0.6207 0.5, 0.6 0.4573, 0.6083 0.5, 0.5859 0.4141, 0.6048 0.4552, 0.5808 0.4192, 0.6114 0.4524, 0.6048 0.4552, 0.5859 0.4141, 0.5859 0.4141, 0.6 0.4573, 0.6114 0.4524, 0.577 0.423, 0.6 0.4573, 0.5859 0.4141, 0.5547 0.4453, 0.5 0.5, 0.5304 0.4292, 0.5304 0.4292, 0.5448 0.3952, 0.5547 0.4453, 0.5547 0.4453, 0.5448 0.3952, 0.5808 0.4192, 0.5304 0.4292, 0.5 0.5, 0.5 0.4233, 0.5 0.4233, 0.5448 0.3952, 0.5304 0.4292, 0.5 0.3865, 0.5448 0.3952, 0.5 0.4233, 0.5859 0.4141, 0.5448 0.3952, 0.5476 0.3886, 0.5808 0.4192, 0.5448 0.3952, 0.5859 0.4141, 0.5476 0.3886, 0.5427 0.4, 0.5859 0.4141, 0.5859 0.4141, 0.5427 0.4, 0.577 0.423, 0.5 0.3793, 0.5448 0.3952, 0.5 0.3865, 0.5476 0.3886, 0.5448 0.3952, 0.5 0.3793, 0.5 0.3793, 0.5427 0.4, 0.5476 0.3886, 0.5 0.3917, 0.5427 0.4, 0.5 0.3793, 0.5656 0.5, 0.6 0.4573, 0.5606 0.4742, 0.6083 0.5, 0.6 0.4573, 0.5656 0.5, 0.5466 0.4534, 0.6 0.4573, 0.577 0.423, 0.5606 0.4742, 0.6 0.4573, 0.5466 0.4534, 0.5606 0.4742, 0.5513 0.4782, 0.5656 0.5, 0.5656 0.5, 0.5513 0.4782, 0.5556 0.5, 0.5667 0.5, 0.5513 0.4782, 0.5615 0.4738, 0.5556 0.5, 0.5513 0.4782, 0.5667 0.5, 0.5466 0.4534, 0.5513 0.4782, 0.5606 0.4742, 0.5395 0.4605, 0.5513 0.4782, 0.5466 0.4534, 0.5473 0.4527, 0.5513 0.4782, 0.5395 0.4605, 0.5615 0.4738, 0.5513 0.4782, 0.5473 0.4527, 0.5466 0.4534, 0.5427 0.4, 0.5258 0.4394, 0.577 0.423, 0.5427 0.4, 0.5466 0.4534, 0.5 0.4344, 0.5427 0.4, 0.5 0.3917, 0.5258 0.4394, 0.5427 0.4, 0.5 0.4344, 0.5258 0.4394, 0.5218 0.4487, 0.5466 0.4534, 0.5466 0.4534, 0.5218 0.4487, 0.5395 0.4605, 0.5473 0.4527, 0.5218 0.4487, 0.5262 0.4385, 0.5395 0.4605, 0.5218 0.4487, 0.5473 0.4527, 0.5 0.4344, 0.5218 0.4487, 0.5258 0.4394, 0.5 0.4444, 0.5218 0.4487, 0.5 0.4344, 0.5 0.4333, 0.5218 0.4487, 0.5 0.4444, 0.5262 0.4385, 0.5218 0.4487, 0.5 0.4333, 0.5 0.4233, 0.5 0.5, 0.4696 0.4292, 0.4696 0.4292, 0.4552 0.3952, 0.5 0.4233, 0.5 0.4233, 0.4552 0.3952, 0.5 0.3865, 0.4696 0.4292, 0.5 0.5, 0.4453 0.4453, 0.4453 0.4453, 0.4552 0.3952, 0.4696 0.4292, 0.4192 0.4192, 0.4552 0.3952, 0.4453 0.4453, 0.5 0.3793, 0.4552 0.3952, 0.4524 0.3886, 0.5 0.3865, 0.4552 0.3952, 0.5 0.3793, 0.4524 0.3886, 0.4573 0.4, 0.5 0.3793, 0.5 0.3793, 0.4573 0.4, 0.5 0.3917, 0.4141 0.4141, 0.4552 0.3952, 0.4192 0.4192, 0.4524 0.3886, 0.4552 0.3952, 0.4141 0.4141, 0.4141 0.4141, 0.4573 0.4, 0.4524 0.3886, 0.423 0.423, 0.4573 0.4, 0.4141 0.4141, 0.4453 0.4453, 0.5 0.5, 0.4292 0.4696, 0.4292 0.4696, 0.3952 0.4552, 0.4453 0.4453, 0.4453 0.4453, 0.3952 0.4552, 0.4192 0.4192, 0.4292 0.4696, 0.5 0.5, 0.4233 0.5, 0.4233 0.5, 0.3952 0.4552, 0.4292 0.4696, 0.3865 0.5, 0.3952 0.4552, 0.4233 0.5, 0.4141 0.4141, 0.3952 0.4552, 0.3886 0.4524, 0.4192 0.4192, 0.3952 0.4552, 0.4141 0.4141, 0.3886 0.4524, 0.4 0.4573, 0.4141 0.4141, 0.4141 0.4141, 0.4 0.4573, 0.423 0.423, 0.3793 0.5, 0.3952 0.4552, 0.3865 0.5, 0.3886 0.4524, 0.3952 0.4552, 0.3793 0.5, 0.3793 0.5, 0.4 0.4573, 0.3886 0.4524, 0.3917 0.5, 0.4 0.4573, 0.3793 0.5, 0.5 0.4344, 0.4573 0.4, 0.4742 0.4394, 0.5 0.3917, 0.4573 0.4, 0.5 0.4344, 0.4534 0.4534, 0.4573 0.4, 0.423 0.423, 0.4742 0.4394, 0.4573 0.4, 0.4534 0.4534, 0.4742 0.4394, 0.4782 0.4487, 0.5 0.4344, 0.5 0.4344, 0.4782 0.4487, 0.5 0.4444, 0.5 0.4333, 0.4782 0.4487, 0.4738 0.4385, 0.5 0.4444, 0.4782 0.4487, 0.5 0.4333, 0.4534 0.4534, 0.4782 0.4487, 0.4742 0.4394, 0.4605 0.4605, 0.4782 0.4487, 0.4534 0.4534, 0.4527 0.4527, 0.4782 0.4487, 0.4605 0.4605, 0.4738 0.4385, 0.4782 0.4487, 0.4527 0.4527, 0.4534 0.4534, 0.4 0.4573, 0.4394 0.4742, 0.423 0.423, 0.4 0.4573, 0.4534 0.4534, 0.4344 0.5, 0.4 0.4573, 0.3917 0.5, 0.4394 0.4742, 0.4 0.4573, 0.4344 0.5, 0.4394 0.4742, 0.4487 0.4782, 0.4534 0.4534, 0.4534 0.4534, 0.4487 0.4782, 0.4605 0.4605, 0.4527 0.4527, 0.4487 0.4782, 0.4385 0.4738, 0.4605 0.4605, 0.4487 0.4782, 0.4527 0.4527, 0.4344 0.5, 0.4487 0.4782, 0.4394 0.4742, 0.4444 0.5, 0.4487 0.4782, 0.4344 0.5, 0.4333 0.5, 0.4487 0.4782, 0.4444 0.5, 0.4385 0.4738, 0.4487 0.4782, 0.4333 0.5, 0.4385 0.5262, 0.3597 0.5597, 0.4333 0.5, 0.4333 0.5, 0.3597 0.5597, 0.3479 0.5, 0.4527 0.5473, 0.3597 0.5597, 0.4385 0.5262, 0.392 0.608, 0.3597 0.5597, 0.4527 0.5473, 0.225 0.5, 0.3597 0.5597, 0.2305 0.556, 0.3479 0.5, 0.3597 0.5597, 0.225 0.5, 0.2305 0.556, 0.3597 0.5597, 0.2463 0.6079, 0.2463 0.6079, 0.3597 0.5597, 0.2714 0.6547, 0.3047 0.6953, 0.3597 0.5597, 0.392 0.608, 0.2714 0.6547, 0.3597 0.5597, 0.3047 0.6953, 0.4738 0.5615, 0.4403 0.6403, 0.4527 0.5473, 0.4527 0.5473, 0.4403 0.6403, 0.392 0.608, 0.5 0.5667, 0.4403 0.6403, 0.4738 0.5615, 0.5 0.6521, 0.4403 0.6403, 0.5 0.5667, 0.3047 0.6953, 0.4403 0.6403, 0.3453 0.7286, 0.392 0.608, 0.4403 0.6403, 0.3047 0.6953, 0.3453 0.7286, 0.4403 0.6403, 0.3921 0.7537, 0.3921 0.7537, 0.4403 0.6403, 0.444 0.7695, 0.5 0.775, 0.4403 0.6403, 0.5 0.6521, 0.444 0.7695, 0.4403 0.6403, 0.5 0.775, 0.2305 0.556, 0.1223 0.5785, 0.225 0.5, 0.225 0.5, 0.1223 0.5785, 0.1146 0.5, 0.2463 0.6079, 0.1445 0.6513, 0.2305 0.556, 0.2305 0.556, 0.1445 0.6513, 0.1223 0.5785, 0.2714 0.6547, 0.1796 0.7168, 0.2463 0.6079, 0.2463 0.6079, 0.1796 0.7168, 0.1445 0.6513, 0.3047 0.6953, 0.2264 0.7736, 0.2714 0.6547, 0.2714 0.6547, 0.2264 0.7736, 0.1796 0.7168, 0 0.5, 0.01 0.6019, 0.5 0.5, 0.0881 0.5856, 0.1146 0.5, 0.1223 0.5785, 0.0797 0.5, 0.1146 0.5, 0.0881 0.5856, 0.0844 0.2188, 0.0388 0.3038, 0.5 0.5, 0.7812 0.0844, 0.6963 0.0388, 0.5 0.5, 0.1123 0.665, 0.1223 0.5785, 0.1445 0.6513, 0.0881 0.5856, 0.1223 0.5785, 0.1123 0.665, 0.9612 0.3038, 0.9156 0.2188, 0.5 0.5, 0.0881 0.5856, 0.0753 0.5883, 0.0797 0.5, 0.0797 0.5, 0.0753 0.5883, 0.0667 0.5, 0.1123 0.665, 0.1002 0.6701, 0.0881 0.5856, 0.0881 0.5856, 0.1002 0.6701, 0.0753 0.5883, 0.0388 0.6963, 0.0844 0.7812, 0.5 0.5, 0.1506 0.7364, 0.1445 0.6513, 0.1796 0.7168, 0.1123 0.665, 0.1445 0.6513, 0.1506 0.7364, 0.3981 0.99, 0.5 1, 0.5 0.5, 0.9156 0.2188, 0.855 0.145, 0.5 0.5, 0.2016 0.7984, 0.1796 0.7168, 0.2264 0.7736, 0.1506 0.7364, 0.1796 0.7168, 0.2016 0.7984, 0.9612 0.6963, 0.99 0.6019, 0.5 0.5, 0.1506 0.7364, 0.1398 0.7438, 0.1123 0.665, 0.1123 0.665, 0.1398 0.7438, 0.1002 0.6701, 0.2016 0.7984, 0.1923 0.8077, 0.1506 0.7364, 0.1506 0.7364, 0.1923 0.8077, 0.1398 0.7438, 0.3453 0.7286, 0.2832 0.8204, 0.3047 0.6953, 0.3047 0.6953, 0.2832 0.8204, 0.2264 0.7736, 0.3921 0.7537, 0.3487 0.8555, 0.3453 0.7286, 0.3453 0.7286, 0.3487 0.8555, 0.2832 0.8204, 0.444 0.7695, 0.4215 0.8777, 0.3921 0.7537, 0.3921 0.7537, 0.4215 0.8777, 0.3487 0.8555, 0.5 0.775, 0.5 0.8854, 0.444 0.7695, 0.444 0.7695, 0.5 0.8854, 0.4215 0.8777, 0.3981 0.01, 0.3037 0.0388, 0.5 0.5, 0.2636 0.8494, 0.2264 0.7736, 0.2832 0.8204, 0.2016 0.7984, 0.2264 0.7736, 0.2636 0.8494, 0.5 1, 0.6019 0.99, 0.5 0.5, 0.145 0.145, 0.0844 0.2188, 0.5 0.5, 0.335 0.8877, 0.2832 0.8204, 0.3487 0.8555, 0.2636 0.8494, 0.2832 0.8204, 0.335 0.8877, 0.855 0.145, 0.7812 0.0844, 0.5 0.5, 0.2636 0.8494, 0.2562 0.8602, 0.2016 0.7984, 0.2016 0.7984, 0.2562 0.8602, 0.1923 0.8077, 0.335 0.8877, 0.3299 0.8998, 0.2636 0.8494, 0.2636 0.8494, 0.3299 0.8998, 0.2562 0.8602, 0.99 0.6019, 1 0.5, 0.5 0.5, 0.4144 0.9119, 0.3487 0.8555, 0.4215 0.8777, 0.335 0.8877, 0.3487 0.8555, 0.4144 0.9119, 0.2187 0.9156, 0.3037 0.9612, 0.5 0.5, 0.99 0.3981, 0.9612 0.3038, 0.5 0.5, 0.5 0.9203, 0.4215 0.8777, 0.5 0.8854, 0.4144 0.9119, 0.4215 0.8777, 0.5 0.9203, 0.3037 0.0388, 0.2188 0.0844, 0.5 0.5, 0.4144 0.9119, 0.4117 0.9247, 0.335 0.8877, 0.335 0.8877, 0.4117 0.9247, 0.3299 0.8998, 0.5 0.9203, 0.5 0.9333, 0.4144 0.9119, 0.4144 0.9119, 0.5 0.9333, 0.4117 0.9247, 0.5262 0.5615, 0.5597 0.6403, 0.5 0.5667, 0.5 0.5667, 0.5597 0.6403, 0.5 0.6521, 0.5473 0.5473, 0.5597 0.6403, 0.5262 0.5615, 0.608 0.608, 0.5597 0.6403, 0.5473 0.5473, 0.5 0.775, 0.5597 0.6403, 0.556 0.7695, 0.5 0.6521, 0.5597 0.6403, 0.5 0.775, 0.556 0.7695, 0.5597 0.6403, 0.6079 0.7537, 0.6079 0.7537, 0.5597 0.6403, 0.6547 0.7286, 0.6953 0.6953, 0.5597 0.6403, 0.608 0.608, 0.6547 0.7286, 0.5597 0.6403, 0.6953 0.6953, 0.5615 0.5262, 0.6403 0.5597, 0.5473 0.5473, 0.5473 0.5473, 0.6403 0.5597, 0.608 0.608, 0.5667 0.5, 0.6403 0.5597, 0.5615 0.5262, 0.6521 0.5, 0.6403 0.5597, 0.5667 0.5, 0.6953 0.6953, 0.6403 0.5597, 0.7286 0.6547, 0.608 0.608, 0.6403 0.5597, 0.6953 0.6953, 0.7286 0.6547, 0.6403 0.5597, 0.7537 0.6079, 0.7537 0.6079, 0.6403 0.5597, 0.7695 0.556, 0.775 0.5, 0.6403 0.5597, 0.6521 0.5, 0.7695 0.556, 0.6403 0.5597, 0.775 0.5, 0.556 0.7695, 0.5785 0.8777, 0.5 0.775, 0.5 0.775, 0.5785 0.8777, 0.5 0.8854, 0.6079 0.7537, 0.6513 0.8555, 0.556 0.7695, 0.556 0.7695, 0.6513 0.8555, 0.5785 0.8777, 0.6547 0.7286, 0.7168 0.8204, 0.6079 0.7537, 0.6079 0.7537, 0.7168 0.8204, 0.6513 0.8555, 0.6953 0.6953, 0.7736 0.7736, 0.6547 0.7286, 0.6547 0.7286, 0.7736 0.7736, 0.7168 0.8204, 0.7812 0.9156, 0.855 0.855, 0.5 0.5, 0.5856 0.9119, 0.5 0.8854, 0.5785 0.8777, 0.5 0.9203, 0.5 0.8854, 0.5856 0.9119, 0.3037 0.9612, 0.3981 0.99, 0.5 0.5, 0.6019 0.01, 0.5 0, 0.5 0.5, 0.665 0.8877, 0.5785 0.8777, 0.6513 0.8555, 0.5856 0.9119, 0.5785 0.8777, 0.665 0.8877, 0.0388 0.3038, 0.01 0.3981, 0.5 0.5, 0.5856 0.9119, 0.5883 0.9247, 0.5 0.9203, 0.5 0.9203, 0.5883 0.9247, 0.5 0.9333, 0.665 0.8877, 0.6701 0.8998, 0.5856 0.9119, 0.5856 0.9119, 0.6701 0.8998, 0.5883 0.9247, 0.6962 0.9612, 0.7812 0.9156, 0.5 0.5, 0.7364 0.8494, 0.6513 0.8555, 0.7168 0.8204, 0.665 0.8877, 0.6513 0.8555, 0.7364 0.8494, 0.0844 0.7812, 0.145 0.855, 0.5 0.5, 0.01 0.3981, 0 0.5, 0.5 0.5, 0.7984 0.7984, 0.7168 0.8204, 0.7736 0.7736, 0.7364 0.8494, 0.7168 0.8204, 0.7984 0.7984, 0.6963 0.0388, 0.6019 0.01, 0.5 0.5, 0.7364 0.8494, 0.7437 0.8602, 0.665 0.8877, 0.665 0.8877, 0.7437 0.8602, 0.6701 0.8998, 0.7984 0.7984, 0.8077 0.8077, 0.7364 0.8494, 0.7364 0.8494, 0.8077 0.8077, 0.7437 0.8602, 0.7286 0.6547, 0.8204 0.7168, 0.6953 0.6953, 0.6953 0.6953, 0.8204 0.7168, 0.7736 0.7736, 0.7537 0.6079, 0.8555 0.6513, 0.7286 0.6547, 0.7286 0.6547, 0.8555 0.6513, 0.8204 0.7168, 0.7695 0.556, 0.8777 0.5785, 0.7537 0.6079, 0.7537 0.6079, 0.8777 0.5785, 0.8555 0.6513, 0.775 0.5, 0.8854 0.5, 0.7695 0.556, 0.7695 0.556, 0.8854 0.5, 0.8777 0.5785, 0.9156 0.7813, 0.9612 0.6963, 0.5 0.5, 0.8494 0.7364, 0.7736 0.7736, 0.8204 0.7168, 0.7984 0.7984, 0.7736 0.7736, 0.8494 0.7364, 0.5 0, 0.3981 0.01, 0.5 0.5, 0.6019 0.99, 0.6962 0.9612, 0.5 0.5, 0.8877 0.665, 0.8204 0.7168, 0.8555 0.6513, 0.8494 0.7364, 0.8204 0.7168, 0.8877 0.665, 1 0.5, 0.99 0.3981, 0.5 0.5, 0.8494 0.7364, 0.8602 0.7438, 0.7984 0.7984, 0.7984 0.7984, 0.8602 0.7438, 0.8077 0.8077, 0.8877 0.665, 0.8997 0.6701, 0.8494 0.7364, 0.8494 0.7364, 0.8997 0.6701, 0.8602 0.7438, 0.9119 0.5856, 0.8555 0.6513, 0.8777 0.5785, 0.8877 0.665, 0.8555 0.6513, 0.9119 0.5856, 0.9203 0.5, 0.8777 0.5785, 0.8854 0.5, 0.9119 0.5856, 0.8777 0.5785, 0.9203 0.5, 0.9119 0.5856, 0.9247 0.5883, 0.8877 0.665, 0.8877 0.665, 0.9247 0.5883, 0.8997 0.6701, 0.9203 0.5, 0.9333 0.5, 0.9119 0.5856, 0.9119 0.5856, 0.9333 0.5, 0.9247 0.5883, 0.5615 0.4738, 0.6403 0.4403, 0.5667 0.5, 0.5667 0.5, 0.6403 0.4403, 0.6521 0.5, 0.5473 0.4527, 0.6403 0.4403, 0.5615 0.4738, 0.608 0.392, 0.6403 0.4403, 0.5473 0.4527, 0.775 0.5, 0.6403 0.4403, 0.7695 0.444, 0.6521 0.5, 0.6403 0.4403, 0.775 0.5, 0.7695 0.444, 0.6403 0.4403, 0.7537 0.3921, 0.7537 0.3921, 0.6403 0.4403, 0.7286 0.3453, 0.6953 0.3048, 0.6403 0.4403, 0.608 0.392, 0.7286 0.3453, 0.6403 0.4403, 0.6953 0.3048, 0.5262 0.4385, 0.5597 0.3597, 0.5473 0.4527, 0.5473 0.4527, 0.5597 0.3597, 0.608 0.392, 0.5 0.4333, 0.5597 0.3597, 0.5262 0.4385, 0.5 0.3479, 0.5597 0.3597, 0.5 0.4333, 0.6953 0.3048, 0.5597 0.3597, 0.6547 0.2714, 0.608 0.392, 0.5597 0.3597, 0.6953 0.3048, 0.6547 0.2714, 0.5597 0.3597, 0.6079 0.2463, 0.6079 0.2463, 0.5597 0.3597, 0.556 0.2305, 0.5 0.225, 0.5597 0.3597, 0.5 0.3479, 0.556 0.2305, 0.5597 0.3597, 0.5 0.225, 0.7695 0.444, 0.8777 0.4215, 0.775 0.5, 0.775 0.5, 0.8777 0.4215, 0.8854 0.5, 0.7537 0.3921, 0.8555 0.3487, 0.7695 0.444, 0.7695 0.444, 0.8555 0.3487, 0.8777 0.4215, 0.7286 0.3453, 0.8204 0.2832, 0.7537 0.3921, 0.7537 0.3921, 0.8204 0.2832, 0.8555 0.3487, 0.6953 0.3048, 0.7736 0.2264, 0.7286 0.3453, 0.7286 0.3453, 0.7736 0.2264, 0.8204 0.2832, 0.9119 0.4144, 0.8854 0.5, 0.8777 0.4215, 0.9203 0.5, 0.8854 0.5, 0.9119 0.4144, 0.8877 0.335, 0.8777 0.4215, 0.8555 0.3487, 0.9119 0.4144, 0.8777 0.4215, 0.8877 0.335, 0.9119 0.4144, 0.9247 0.4117, 0.9203 0.5, 0.9203 0.5, 0.9247 0.4117, 0.9333 0.5, 0.8877 0.335, 0.8997 0.3299, 0.9119 0.4144, 0.9119 0.4144, 0.8997 0.3299, 0.9247 0.4117, 0.8494 0.2636, 0.8555 0.3487, 0.8204 0.2832, 0.8877 0.335, 0.8555 0.3487, 0.8494 0.2636, 0.7984 0.2016, 0.8204 0.2832, 0.7736 0.2264, 0.8494 0.2636, 0.8204 0.2832, 0.7984 0.2016, 0.8494 0.2636, 0.8602 0.2563, 0.8877 0.335, 0.8877 0.335, 0.8602 0.2563, 0.8997 0.3299, 0.7984 0.2016, 0.8077 0.1923, 0.8494 0.2636, 0.8494 0.2636, 0.8077 0.1923, 0.8602 0.2563, 0.6547 0.2714, 0.7168 0.1796, 0.6953 0.3048, 0.6953 0.3048, 0.7168 0.1796, 0.7736 0.2264, 0.6079 0.2463, 0.6513 0.1445, 0.6547 0.2714, 0.6547 0.2714, 0.6513 0.1445, 0.7168 0.1796, 0.556 0.2305, 0.5785 0.1223, 0.6079 0.2463, 0.6079 0.2463, 0.5785 0.1223, 0.6513 0.1445, 0.5 0.225, 0.5 0.1146, 0.556 0.2305, 0.556 0.2305, 0.5 0.1146, 0.5785 0.1223, 0.7364 0.1506, 0.7736 0.2264, 0.7168 0.1796, 0.7984 0.2016, 0.7736 0.2264, 0.7364 0.1506, 0.665 0.1123, 0.7168 0.1796, 0.6513 0.1445, 0.7364 0.1506, 0.7168 0.1796, 0.665 0.1123, 0.7364 0.1506, 0.7438 0.1398, 0.7984 0.2016, 0.7984 0.2016, 0.7438 0.1398, 0.8077 0.1923, 0.665 0.1123, 0.6701 0.1003, 0.7364 0.1506, 0.7364 0.1506, 0.6701 0.1003, 0.7438 0.1398, 0.5856 0.0881, 0.6513 0.1445, 0.5785 0.1223, 0.665 0.1123, 0.6513 0.1445, 0.5856 0.0881, 0.5 0.0797, 0.5785 0.1223, 0.5 0.1146, 0.5856 0.0881, 0.5785 0.1223, 0.5 0.0797, 0.5856 0.0881, 0.5883 0.0753, 0.665 0.1123, 0.665 0.1123, 0.5883 0.0753, 0.6701 0.1003, 0.5 0.0797, 0.5 0.0667, 0.5856 0.0881, 0.5856 0.0881, 0.5 0.0667, 0.5883 0.0753, 0.4738 0.4385, 0.4403 0.3597, 0.5 0.4333, 0.5 0.4333, 0.4403 0.3597, 0.5 0.3479, 0.4527 0.4527, 0.4403 0.3597, 0.4738 0.4385, 0.392 0.392, 0.4403 0.3597, 0.4527 0.4527, 0.5 0.225, 0.4403 0.3597, 0.444 0.2305, 0.5 0.3479, 0.4403 0.3597, 0.5 0.225, 0.444 0.2305, 0.4403 0.3597, 0.3921 0.2463, 0.3921 0.2463, 0.4403 0.3597, 0.3453 0.2714, 0.3047 0.3048, 0.4403 0.3597, 0.392 0.392, 0.3453 0.2714, 0.4403 0.3597, 0.3047 0.3048, 0.4385 0.4738, 0.3597 0.4403, 0.4527 0.4527, 0.4527 0.4527, 0.3597 0.4403, 0.392 0.392, 0.4333 0.5, 0.3597 0.4403, 0.4385 0.4738, 0.3479 0.5, 0.3597 0.4403, 0.4333 0.5, 0.3047 0.3048, 0.3597 0.4403, 0.2714 0.3453, 0.392 0.392, 0.3597 0.4403, 0.3047 0.3048, 0.2714 0.3453, 0.3597 0.4403, 0.2463 0.3921, 0.2463 0.3921, 0.3597 0.4403, 0.2305 0.444, 0.225 0.5, 0.3597 0.4403, 0.3479 0.5, 0.2305 0.444, 0.3597 0.4403, 0.225 0.5, 0.444 0.2305, 0.4215 0.1223, 0.5 0.225, 0.5 0.225, 0.4215 0.1223, 0.5 0.1146, 0.3921 0.2463, 0.3487 0.1445, 0.444 0.2305, 0.444 0.2305, 0.3487 0.1445, 0.4215 0.1223, 0.3453 0.2714, 0.2832 0.1796, 0.3921 0.2463, 0.3921 0.2463, 0.2832 0.1796, 0.3487 0.1445, 0.3047 0.3048, 0.2264 0.2264, 0.3453 0.2714, 0.3453 0.2714, 0.2264 0.2264, 0.2832 0.1796, 0.4144 0.0881, 0.5 0.1146, 0.4215 0.1223, 0.5 0.0797, 0.5 0.1146, 0.4144 0.0881, 0.335 0.1123, 0.4215 0.1223, 0.3487 0.1445, 0.4144 0.0881, 0.4215 0.1223, 0.335 0.1123, 0.4144 0.0881, 0.4117 0.0753, 0.5 0.0797, 0.5 0.0797, 0.4117 0.0753, 0.5 0.0667, 0.335 0.1123, 0.3299 0.1003, 0.4144 0.0881, 0.4144 0.0881, 0.3299 0.1003, 0.4117 0.0753, 0.2636 0.1506, 0.3487 0.1445, 0.2832 0.1796, 0.335 0.1123, 0.3487 0.1445, 0.2636 0.1506, 0.2016 0.2016, 0.2832 0.1796, 0.2264 0.2264, 0.2636 0.1506, 0.2832 0.1796, 0.2016 0.2016, 0.2636 0.1506, 0.2562 0.1398, 0.335 0.1123, 0.335 0.1123, 0.2562 0.1398, 0.3299 0.1003, 0.2016 0.2016, 0.1923 0.1923, 0.2636 0.1506, 0.2636 0.1506, 0.1923 0.1923, 0.2562 0.1398, 0.2714 0.3453, 0.1796 0.2832, 0.3047 0.3048, 0.3047 0.3048, 0.1796 0.2832, 0.2264 0.2264, 0.2463 0.3921, 0.1445 0.3487, 0.2714 0.3453, 0.2714 0.3453, 0.1445 0.3487, 0.1796 0.2832, 0.2305 0.444, 0.1223 0.4215, 0.2463 0.3921, 0.2463 0.3921, 0.1223 0.4215, 0.1445 0.3487, 0.225 0.5, 0.1146 0.5, 0.2305 0.444, 0.2305 0.444, 0.1146 0.5, 0.1223 0.4215, 0.1506 0.2636, 0.2264 0.2264, 0.1796 0.2832, 0.2016 0.2016, 0.2264 0.2264, 0.1506 0.2636, 0.1123 0.335, 0.1796 0.2832, 0.1445 0.3487, 0.1506 0.2636, 0.1796 0.2832, 0.1123 0.335, 0.1506 0.2636, 0.1398 0.2563, 0.2016 0.2016, 0.2016 0.2016, 0.1398 0.2563, 0.1923 0.1923, 0.1123 0.335, 0.1002 0.3299, 0.1506 0.2636, 0.1506 0.2636, 0.1002 0.3299, 0.1398 0.2563, 0.855 0.855, 0.9156 0.7813, 0.5 0.5, 0.0881 0.4144, 0.1445 0.3487, 0.1223 0.4215, 0.1123 0.335, 0.1445 0.3487, 0.0881 0.4144, 0.145 0.855, 0.2187 0.9156, 0.5 0.5, 0.2188 0.0844, 0.145 0.145, 0.5 0.5, 0.0797 0.5, 0.1223 0.4215, 0.1146 0.5, 0.0881 0.4144, 0.1223 0.4215, 0.0797 0.5, 0.01 0.6019, 0.0388 0.6963, 0.5 0.5, 0.0881 0.4144, 0.0753 0.4117, 0.1123 0.335, 0.1123 0.335, 0.0753 0.4117, 0.1002 0.3299, 0.0753 0.4117, 0.0881 0.4144, 0.0667 0.5, 0.0667 0.5, 0.0881 0.4144, 0.0797 0.5, 0.4843 0.8181, 0.4886 0.8128, 0.509 0.8178, 0.509 0.8178, 0.4886 0.8128, 0.509 0.8125, 0.4667 0.819, 0.4886 0.8128, 0.4843 0.8181, 0.474 0.8136, 0.4886 0.8128, 0.4667 0.819, 0.4526 0.8218, 0.4623 0.816, 0.4667 0.819, 0.4667 0.819, 0.4623 0.816, 0.474 0.8136, 0.509 0.7966, 0.4886 0.8128, 0.4905 0.7966, 0.509 0.8125, 0.4886 0.8128, 0.509 0.7966, 0.4773 0.7966, 0.4886 0.8128, 0.474 0.8136, 0.4905 0.7966, 0.4886 0.8128, 0.4773 0.7966, 0.4773 0.7966, 0.4623 0.816, 0.4667 0.7966, 0.474 0.8136, 0.4623 0.816, 0.4773 0.7966, 0.4667 0.8245, 0.4623 0.816, 0.4526 0.8218, 0.474 0.8184, 0.4623 0.816, 0.4667 0.8245, 0.4843 0.8254, 0.4886 0.8191, 0.4667 0.8245, 0.4667 0.8245, 0.4886 0.8191, 0.474 0.8184, 0.5337 0.8254, 0.509 0.8164, 0.509 0.8243, 0.4843 0.8254, 0.509 0.8164, 0.4886 0.8191, 0.4773 0.7966, 0.4623 0.816, 0.474 0.8184, 0.4667 0.7966, 0.4623 0.816, 0.4773 0.7966, 0.4773 0.7966, 0.4886 0.8191, 0.4905 0.7966, 0.474 0.8184, 0.4886 0.8191, 0.4773 0.7966, 0.509 0.7966, 0.4886 0.8191, 0.509 0.8164, 0.4905 0.7966, 0.4886 0.8191, 0.509 0.7966, 0.5294 0.8191, 0.509 0.8164, 0.5337 0.8254, 0.509 0.8243, 0.509 0.8164, 0.4843 0.8254, 0.5513 0.8245, 0.5294 0.8191, 0.5337 0.8254, 0.544 0.8184, 0.5294 0.8191, 0.5513 0.8245, 0.5654 0.8218, 0.5557 0.816, 0.5513 0.8245, 0.5513 0.8245, 0.5557 0.816, 0.544 0.8184, 0.509 0.7966, 0.5294 0.8191, 0.5275 0.7966, 0.509 0.8164, 0.5294 0.8191, 0.509 0.7966, 0.5407 0.7966, 0.5294 0.8191, 0.544 0.8184, 0.5275 0.7966, 0.5294 0.8191, 0.5407 0.7966, 0.5407 0.7966, 0.5557 0.816, 0.5513 0.7966, 0.544 0.8184, 0.5557 0.816, 0.5407 0.7966, 0.5513 0.819, 0.5557 0.816, 0.5654 0.8218, 0.544 0.8136, 0.5557 0.816, 0.5513 0.819, 0.5337 0.8181, 0.5294 0.8128, 0.5513 0.819, 0.5513 0.819, 0.5294 0.8128, 0.544 0.8136, 0.509 0.8178, 0.5294 0.8128, 0.5337 0.8181, 0.509 0.8125, 0.5294 0.8128, 0.509 0.8178, 0.5407 0.7966, 0.5557 0.816, 0.544 0.8136, 0.5513 0.7966, 0.5557 0.816, 0.5407 0.7966, 0.5407 0.7966, 0.5294 0.8128, 0.5275 0.7966, 0.544 0.8136, 0.5294 0.8128, 0.5407 0.7966, 0.509 0.7966, 0.5294 0.8128, 0.509 0.8125, 0.5275 0.7966, 0.5294 0.8128, 0.509 0.7966, 0.5407 0.7966, 0.538 0.7163, 0.5259 0.7163, 0.4773 0.7966, 0.4905 0.7966, 0.4921 0.7163, 0.5275 0.7966, 0.5259 0.7163, 0.509 0.7163, 0.4773 0.7966, 0.4667 0.7966, 0.4703 0.7163, 0.5275 0.7966, 0.5259 0.7163, 0.538 0.7163, 0.4905 0.7966, 0.509 0.7966, 0.509 0.7163, 0.5407 0.7966, 0.538 0.7163, 0.5477 0.7163, 0.4667 0.7966, 0.4773 0.7966, 0.48 0.7163, 0.509 0.7966, 0.509 0.7163, 0.5259 0.7163, 0.5513 0.7966, 0.5477 0.7163, 0.538 0.7163, 0.4905 0.7966, 0.4773 0.7966, 0.48 0.7163, 0.509 0.7966, 0.4905 0.7966, 0.4921 0.7163, 0.5477 0.7163, 0.538 0.7163, 0.509 0.5577, 0.509 0.7163, 0.5259 0.7163, 0.509 0.5577, 0.538 0.7163, 0.5477 0.7163, 0.509 0.5577, 0.48 0.7163, 0.4921 0.7163, 0.509 0.5577, 0.5259 0.7163, 0.509 0.7163, 0.509 0.5577, 0.4921 0.7163, 0.509 0.7163, 0.509 0.5577, 0.4703 0.7163, 0.48 0.7163, 0.509 0.5577, 0.4921 0.7163, 0.48 0.7163, 0.509 0.5577, 0.5259 0.7163, 0.538 0.7163, 0.509 0.5577, 0.48 0.7163, 0.4703 0.7163, 0.509 0.5577, 0.538 0.7163, 0.5259 0.7163, 0.509 0.5577, 0.509 0.7163, 0.4921 0.7163, 0.509 0.5577, 0.5275 0.7966, 0.5407 0.7966, 0.5259 0.7163, 0.48 0.7163, 0.4773 0.7966, 0.4921 0.7163, 0.509 0.7966, 0.5275 0.7966, 0.509 0.7163, 0.48 0.7163, 0.4773 0.7966, 0.4703 0.7163, 0.5407 0.7966, 0.5275 0.7966, 0.538 0.7163, 0.4921 0.7163, 0.4905 0.7966, 0.509 0.7163, 0.5513 0.7966, 0.5407 0.7966, 0.5477 0.7163, 0.4703 0.7163, 0.4667 0.7966, 0.48 0.7163, 0.5275 0.7966, 0.509 0.7966, 0.5259 0.7163, 0.5407 0.7966, 0.5513 0.7966, 0.538 0.7163, 0.4921 0.7163, 0.4905 0.7966, 0.48 0.7163, 0.509 0.7163, 0.509 0.7966, 0.4921 0.7163, 0.509 0.5577, 0.5477 0.7163, 0.509 0.5577, 0.509 0.5577, 0.509 0.7163, 0.509 0.5577, 0.509 0.5577, 0.538 0.7163, 0.509 0.5577, 0.509 0.5577, 0.48 0.7163, 0.509 0.5577, 0.509 0.5577, 0.5259 0.7163, 0.509 0.5577, 0.509 0.5577, 0.4921 0.7163, 0.509 0.5577, 0.509 0.5577, 0.4703 0.7163, 0.509 0.5577, 0.509 0.5577, 0.4921 0.7163, 0.509 0.5577, 0.509 0.5577, 0.5259 0.7163, 0.509 0.5577, 0.509 0.5577, 0.48 0.7163, 0.509 0.5577, 0.509 0.5577, 0.538 0.7163, 0.509 0.5577, 0.509 0.5577, 0.509 0.7163, 0.509 0.5577 + ] + } + coordIndex [ + 753, 749, 760, -1, 760, 749, 755, -1, 740, 735, 753, -1, 753, 735, 749, -1, 712, 706, 740, -1, 740, 706, 735, -1, 683, 677, 712, -1, 712, 677, 706, -1, 749, 754, 755, -1, 755, 754, 756, -1, 735, 742, 749, -1, 749, 742, 754, -1, 706, 713, 735, -1, 735, 713, 742, -1, 677, 684, 706, -1, 706, 684, 713, -1, 645, 641, 683, -1, 683, 641, 677, -1, 605, 602, 645, -1, 645, 602, 641, -1, 562, 560, 605, -1, 605, 560, 602, -1, 464, 468, 562, -1, 562, 468, 560, -1, 641, 646, 677, -1, 677, 646, 684, -1, 602, 606, 641, -1, 641, 606, 646, -1, 560, 563, 602, -1, 602, 563, 606, -1, 468, 471, 560, -1, 560, 471, 563, -1, 754, 764, 756, -1, 756, 764, 763, -1, 742, 747, 754, -1, 754, 747, 764, -1, 713, 719, 742, -1, 742, 719, 747, -1, 684, 685, 713, -1, 713, 685, 719, -1, 764, 771, 763, -1, 763, 771, 770, -1, 747, 758, 764, -1, 764, 758, 771, -1, 719, 729, 747, -1, 747, 729, 758, -1, 685, 693, 719, -1, 719, 693, 729, -1, 646, 652, 684, -1, 684, 652, 685, -1, 606, 608, 646, -1, 646, 608, 652, -1, 563, 564, 606, -1, 606, 564, 608, -1, 471, 469, 563, -1, 563, 469, 564, -1, 652, 656, 685, -1, 685, 656, 693, -1, 608, 615, 652, -1, 652, 615, 656, -1, 564, 567, 608, -1, 608, 567, 615, -1, 469, 465, 564, -1, 564, 465, 567, -1, 389, 390, 464, -1, 464, 390, 468, -1, 340, 342, 389, -1, 389, 342, 390, -1, 299, 302, 340, -1, 340, 302, 342, -1, 264, 267, 299, -1, 299, 267, 302, -1, 390, 387, 468, -1, 468, 387, 471, -1, 342, 338, 390, -1, 390, 338, 387, -1, 302, 297, 342, -1, 342, 297, 338, -1, 267, 262, 302, -1, 302, 262, 297, -1, 230, 236, 264, -1, 264, 236, 267, -1, 202, 206, 230, -1, 230, 206, 236, -1, 187, 190, 202, -1, 202, 190, 206, -1, 178, 182, 187, -1, 187, 182, 190, -1, 236, 228, 267, -1, 267, 228, 262, -1, 206, 199, 236, -1, 236, 199, 228, -1, 190, 185, 206, -1, 206, 185, 199, -1, 182, 176, 190, -1, 190, 176, 185, -1, 387, 386, 471, -1, 471, 386, 469, -1, 338, 336, 387, -1, 387, 336, 386, -1, 297, 291, 338, -1, 338, 291, 336, -1, 262, 261, 297, -1, 297, 261, 291, -1, 386, 384, 469, -1, 469, 384, 465, -1, 336, 330, 386, -1, 386, 330, 384, -1, 291, 287, 336, -1, 336, 287, 330, -1, 261, 253, 291, -1, 291, 253, 287, -1, 228, 222, 262, -1, 262, 222, 261, -1, 199, 192, 228, -1, 228, 192, 222, -1, 185, 172, 199, -1, 199, 172, 192, -1, 176, 170, 185, -1, 185, 170, 172, -1, 222, 213, 261, -1, 261, 213, 253, -1, 192, 181, 222, -1, 222, 181, 213, -1, 172, 164, 192, -1, 192, 164, 181, -1, 170, 161, 172, -1, 172, 161, 164, -1, 186, 184, 178, -1, 178, 184, 182, -1, 201, 194, 186, -1, 186, 194, 184, -1, 229, 219, 201, -1, 201, 219, 194, -1, 263, 249, 229, -1, 229, 249, 219, -1, 184, 183, 182, -1, 182, 183, 176, -1, 194, 193, 184, -1, 184, 193, 183, -1, 219, 218, 194, -1, 194, 218, 193, -1, 249, 248, 219, -1, 219, 248, 218, -1, 298, 284, 263, -1, 263, 284, 249, -1, 339, 320, 298, -1, 298, 320, 284, -1, 388, 357, 339, -1, 339, 357, 320, -1, 462, 436, 388, -1, 388, 436, 357, -1, 284, 283, 249, -1, 249, 283, 248, -1, 320, 319, 284, -1, 284, 319, 283, -1, 357, 356, 320, -1, 320, 356, 319, -1, 436, 435, 357, -1, 357, 435, 356, -1, 183, 171, 176, -1, 176, 171, 170, -1, 193, 189, 183, -1, 183, 189, 171, -1, 218, 211, 193, -1, 193, 211, 189, -1, 248, 245, 218, -1, 218, 245, 211, -1, 171, 163, 170, -1, 170, 163, 161, -1, 189, 177, 171, -1, 171, 177, 163, -1, 211, 200, 189, -1, 189, 200, 177, -1, 245, 237, 211, -1, 211, 237, 200, -1, 283, 279, 248, -1, 248, 279, 245, -1, 319, 318, 283, -1, 283, 318, 279, -1, 356, 355, 319, -1, 319, 355, 318, -1, 435, 430, 356, -1, 356, 430, 355, -1, 279, 273, 245, -1, 245, 273, 237, -1, 318, 314, 279, -1, 279, 314, 273, -1, 355, 354, 318, -1, 318, 354, 314, -1, 430, 429, 355, -1, 355, 429, 354, -1, 561, 512, 462, -1, 462, 512, 436, -1, 604, 587, 561, -1, 561, 587, 512, -1, 644, 622, 604, -1, 604, 622, 587, -1, 682, 660, 644, -1, 644, 660, 622, -1, 512, 513, 436, -1, 436, 513, 435, -1, 587, 588, 512, -1, 512, 588, 513, -1, 622, 623, 587, -1, 587, 623, 588, -1, 660, 661, 622, -1, 622, 661, 623, -1, 711, 695, 682, -1, 682, 695, 660, -1, 739, 722, 711, -1, 711, 722, 695, -1, 752, 745, 739, -1, 739, 745, 722, -1, 760, 755, 752, -1, 752, 755, 745, -1, 695, 696, 660, -1, 660, 696, 661, -1, 722, 723, 695, -1, 695, 723, 696, -1, 745, 746, 722, -1, 722, 746, 723, -1, 755, 756, 745, -1, 745, 756, 746, -1, 513, 518, 435, -1, 435, 518, 430, -1, 588, 589, 513, -1, 513, 589, 518, -1, 623, 624, 588, -1, 588, 624, 589, -1, 661, 665, 623, -1, 623, 665, 624, -1, 518, 521, 430, -1, 430, 521, 429, -1, 589, 590, 518, -1, 518, 590, 521, -1, 624, 628, 589, -1, 589, 628, 590, -1, 665, 670, 624, -1, 624, 670, 628, -1, 696, 699, 661, -1, 661, 699, 665, -1, 723, 730, 696, -1, 696, 730, 699, -1, 746, 750, 723, -1, 723, 750, 730, -1, 756, 763, 746, -1, 746, 763, 750, -1, 699, 705, 665, -1, 665, 705, 670, -1, 730, 741, 699, -1, 699, 741, 705, -1, 750, 761, 730, -1, 730, 761, 741, -1, 763, 770, 750, -1, 750, 770, 761, -1, 771, 792, 770, -1, 770, 792, 791, -1, 758, 785, 771, -1, 771, 785, 792, -1, 729, 775, 758, -1, 758, 775, 785, -1, 693, 738, 729, -1, 729, 738, 775, -1, 656, 686, 693, -1, 693, 686, 738, -1, 615, 631, 656, -1, 656, 631, 686, -1, 567, 581, 615, -1, 615, 581, 631, -1, 465, 461, 567, -1, 567, 461, 581, -1, 792, 822, 791, -1, 791, 822, 821, -1, 785, 816, 792, -1, 792, 816, 822, -1, 775, 789, 785, -1, 785, 789, 816, -1, 738, 759, 775, -1, 775, 759, 789, -1, 822, 830, 821, -1, 821, 830, 829, -1, 816, 819, 822, -1, 822, 819, 830, -1, 789, 793, 816, -1, 816, 793, 819, -1, 759, 766, 789, -1, 789, 766, 793, -1, 686, 700, 738, -1, 738, 700, 759, -1, 631, 639, 686, -1, 686, 639, 700, -1, 581, 584, 631, -1, 631, 584, 639, -1, 461, 460, 581, -1, 581, 460, 584, -1, 700, 704, 759, -1, 759, 704, 766, -1, 639, 643, 700, -1, 700, 643, 704, -1, 584, 586, 639, -1, 639, 586, 643, -1, 460, 459, 584, -1, 584, 459, 586, -1, 384, 365, 465, -1, 465, 365, 461, -1, 330, 311, 384, -1, 384, 311, 365, -1, 287, 260, 330, -1, 330, 260, 311, -1, 253, 197, 287, -1, 287, 197, 260, -1, 213, 153, 253, -1, 253, 153, 197, -1, 181, 134, 213, -1, 213, 134, 153, -1, 164, 125, 181, -1, 181, 125, 134, -1, 161, 119, 164, -1, 164, 119, 125, -1, 365, 362, 461, -1, 461, 362, 460, -1, 311, 305, 365, -1, 365, 305, 362, -1, 260, 244, 311, -1, 311, 244, 305, -1, 197, 179, 260, -1, 260, 179, 244, -1, 362, 358, 460, -1, 460, 358, 459, -1, 305, 300, 362, -1, 362, 300, 358, -1, 244, 240, 305, -1, 305, 240, 300, -1, 179, 173, 244, -1, 244, 173, 240, -1, 153, 140, 197, -1, 197, 140, 179, -1, 134, 126, 153, -1, 153, 126, 140, -1, 125, 111, 134, -1, 134, 111, 126, -1, 119, 106, 125, -1, 125, 106, 111, -1, 140, 136, 179, -1, 179, 136, 173, -1, 126, 118, 140, -1, 140, 118, 136, -1, 111, 105, 126, -1, 126, 105, 118, -1, 106, 99, 111, -1, 111, 99, 105, -1, 163, 124, 161, -1, 161, 124, 119, -1, 177, 133, 163, -1, 163, 133, 124, -1, 200, 152, 177, -1, 177, 152, 133, -1, 237, 196, 200, -1, 200, 196, 152, -1, 273, 254, 237, -1, 237, 254, 196, -1, 314, 295, 273, -1, 273, 295, 254, -1, 354, 344, 314, -1, 314, 344, 295, -1, 429, 421, 354, -1, 354, 421, 344, -1, 124, 110, 119, -1, 119, 110, 106, -1, 133, 123, 124, -1, 124, 123, 110, -1, 152, 135, 133, -1, 133, 135, 123, -1, 196, 165, 152, -1, 152, 165, 135, -1, 110, 104, 106, -1, 106, 104, 99, -1, 123, 116, 110, -1, 110, 116, 104, -1, 135, 131, 123, -1, 123, 131, 116, -1, 165, 154, 135, -1, 135, 154, 131, -1, 254, 221, 196, -1, 196, 221, 165, -1, 295, 278, 254, -1, 254, 278, 221, -1, 344, 337, 295, -1, 295, 337, 278, -1, 421, 411, 344, -1, 344, 411, 337, -1, 221, 210, 165, -1, 165, 210, 154, -1, 278, 272, 221, -1, 221, 272, 210, -1, 337, 328, 278, -1, 278, 328, 272, -1, 411, 405, 337, -1, 337, 405, 328, -1, 521, 529, 429, -1, 429, 529, 421, -1, 590, 600, 521, -1, 521, 600, 529, -1, 628, 648, 590, -1, 590, 648, 600, -1, 670, 691, 628, -1, 628, 691, 648, -1, 705, 737, 670, -1, 670, 737, 691, -1, 741, 774, 705, -1, 705, 774, 737, -1, 761, 784, 741, -1, 741, 784, 774, -1, 770, 791, 761, -1, 761, 791, 784, -1, 529, 535, 421, -1, 421, 535, 411, -1, 600, 607, 529, -1, 529, 607, 535, -1, 648, 666, 600, -1, 600, 666, 607, -1, 691, 720, 648, -1, 648, 720, 666, -1, 535, 539, 411, -1, 411, 539, 405, -1, 607, 616, 535, -1, 535, 616, 539, -1, 666, 673, 607, -1, 607, 673, 616, -1, 720, 731, 666, -1, 666, 731, 673, -1, 737, 773, 691, -1, 691, 773, 720, -1, 774, 794, 737, -1, 737, 794, 773, -1, 784, 817, 774, -1, 774, 817, 794, -1, 791, 821, 784, -1, 784, 821, 817, -1, 773, 779, 720, -1, 720, 779, 731, -1, 794, 812, 773, -1, 773, 812, 779, -1, 817, 823, 794, -1, 794, 823, 812, -1, 821, 829, 817, -1, 817, 829, 823, -1, 830, 828, 829, -1, 829, 828, 831, -1, 819, 818, 830, -1, 830, 818, 828, -1, 828, 824, 831, -1, 831, 824, 826, -1, 818, 815, 828, -1, 828, 815, 824, -1, 793, 790, 819, -1, 819, 790, 818, -1, 766, 762, 793, -1, 793, 762, 790, -1, 790, 786, 818, -1, 818, 786, 815, -1, 762, 751, 790, -1, 790, 751, 786, -1, 824, 811, 826, -1, 826, 811, 814, -1, 815, 788, 824, -1, 824, 788, 811, -1, 786, 767, 815, -1, 815, 767, 788, -1, 751, 727, 786, -1, 786, 727, 767, -1, 704, 701, 766, -1, 766, 701, 762, -1, 643, 642, 704, -1, 704, 642, 701, -1, 701, 698, 762, -1, 762, 698, 751, -1, 642, 634, 701, -1, 701, 634, 698, -1, 586, 585, 643, -1, 643, 585, 642, -1, 459, 458, 586, -1, 586, 458, 585, -1, 585, 583, 642, -1, 642, 583, 634, -1, 458, 457, 585, -1, 585, 457, 583, -1, 698, 680, 751, -1, 751, 680, 727, -1, 634, 627, 698, -1, 698, 627, 680, -1, 583, 577, 634, -1, 634, 577, 627, -1, 457, 456, 583, -1, 583, 456, 577, -1, 811, 782, 814, -1, 814, 782, 783, -1, 788, 769, 811, -1, 811, 769, 782, -1, 767, 744, 788, -1, 788, 744, 769, -1, 727, 702, 767, -1, 767, 702, 744, -1, 782, 776, 783, -1, 783, 776, 777, -1, 769, 757, 782, -1, 782, 757, 776, -1, 744, 728, 769, -1, 769, 728, 757, -1, 702, 692, 744, -1, 744, 692, 728, -1, 680, 662, 727, -1, 727, 662, 702, -1, 627, 619, 680, -1, 680, 619, 662, -1, 577, 568, 627, -1, 627, 568, 619, -1, 456, 455, 577, -1, 577, 455, 568, -1, 662, 655, 702, -1, 702, 655, 692, -1, 619, 614, 662, -1, 662, 614, 655, -1, 568, 566, 619, -1, 619, 566, 614, -1, 455, 454, 568, -1, 568, 454, 566, -1, 358, 361, 459, -1, 459, 361, 458, -1, 300, 301, 358, -1, 358, 301, 361, -1, 361, 363, 458, -1, 458, 363, 457, -1, 301, 308, 361, -1, 361, 308, 363, -1, 240, 243, 300, -1, 300, 243, 301, -1, 173, 175, 240, -1, 240, 175, 243, -1, 243, 246, 301, -1, 301, 246, 308, -1, 175, 188, 243, -1, 243, 188, 246, -1, 363, 369, 457, -1, 457, 369, 456, -1, 308, 315, 363, -1, 363, 315, 369, -1, 246, 266, 308, -1, 308, 266, 315, -1, 188, 214, 246, -1, 246, 214, 266, -1, 136, 139, 173, -1, 173, 139, 175, -1, 118, 120, 136, -1, 136, 120, 139, -1, 139, 144, 175, -1, 175, 144, 188, -1, 120, 127, 139, -1, 139, 127, 144, -1, 105, 108, 118, -1, 118, 108, 120, -1, 99, 102, 105, -1, 105, 102, 108, -1, 108, 115, 120, -1, 120, 115, 127, -1, 102, 82, 108, -1, 108, 82, 115, -1, 144, 169, 188, -1, 188, 169, 214, -1, 127, 141, 144, -1, 144, 141, 169, -1, 115, 129, 127, -1, 127, 129, 141, -1, 82, 122, 115, -1, 115, 122, 129, -1, 369, 382, 456, -1, 456, 382, 455, -1, 315, 325, 369, -1, 369, 325, 382, -1, 266, 282, 315, -1, 315, 282, 325, -1, 214, 242, 266, -1, 266, 242, 282, -1, 382, 383, 455, -1, 455, 383, 454, -1, 325, 329, 382, -1, 382, 329, 383, -1, 282, 286, 325, -1, 325, 286, 329, -1, 242, 252, 282, -1, 282, 252, 286, -1, 169, 195, 214, -1, 214, 195, 242, -1, 141, 168, 169, -1, 169, 168, 195, -1, 129, 148, 141, -1, 141, 148, 168, -1, 122, 138, 129, -1, 129, 138, 148, -1, 195, 212, 242, -1, 242, 212, 252, -1, 168, 180, 195, -1, 195, 180, 212, -1, 148, 162, 168, -1, 168, 162, 180, -1, 138, 156, 148, -1, 148, 156, 162, -1, 104, 103, 99, -1, 99, 103, 102, -1, 116, 114, 104, -1, 104, 114, 103, -1, 103, 109, 102, -1, 102, 109, 82, -1, 114, 117, 103, -1, 103, 117, 109, -1, 131, 130, 116, -1, 116, 130, 114, -1, 154, 151, 131, -1, 131, 151, 130, -1, 130, 132, 114, -1, 114, 132, 117, -1, 151, 159, 130, -1, 130, 159, 132, -1, 109, 121, 82, -1, 82, 121, 122, -1, 117, 128, 109, -1, 109, 128, 121, -1, 132, 142, 117, -1, 117, 142, 128, -1, 159, 174, 132, -1, 132, 174, 142, -1, 210, 208, 154, -1, 154, 208, 151, -1, 272, 271, 210, -1, 210, 271, 208, -1, 208, 215, 151, -1, 151, 215, 159, -1, 271, 276, 208, -1, 208, 276, 215, -1, 328, 327, 272, -1, 272, 327, 271, -1, 405, 404, 328, -1, 328, 404, 327, -1, 327, 333, 271, -1, 271, 333, 276, -1, 404, 407, 327, -1, 327, 407, 333, -1, 215, 227, 159, -1, 159, 227, 174, -1, 276, 285, 215, -1, 215, 285, 227, -1, 333, 341, 276, -1, 276, 341, 285, -1, 407, 414, 333, -1, 333, 414, 341, -1, 121, 137, 122, -1, 122, 137, 138, -1, 128, 147, 121, -1, 121, 147, 137, -1, 142, 167, 128, -1, 128, 167, 147, -1, 174, 203, 142, -1, 142, 203, 167, -1, 137, 155, 138, -1, 138, 155, 156, -1, 147, 166, 137, -1, 137, 166, 155, -1, 167, 191, 147, -1, 147, 191, 166, -1, 203, 226, 167, -1, 167, 226, 191, -1, 227, 257, 174, -1, 174, 257, 203, -1, 285, 296, 227, -1, 227, 296, 257, -1, 341, 345, 285, -1, 285, 345, 296, -1, 414, 422, 341, -1, 341, 422, 345, -1, 257, 268, 203, -1, 203, 268, 226, -1, 296, 309, 257, -1, 257, 309, 268, -1, 345, 351, 296, -1, 296, 351, 309, -1, 422, 428, 345, -1, 345, 428, 351, -1, 539, 540, 405, -1, 405, 540, 404, -1, 616, 617, 539, -1, 539, 617, 540, -1, 540, 537, 404, -1, 404, 537, 407, -1, 617, 611, 540, -1, 540, 611, 537, -1, 673, 674, 616, -1, 616, 674, 617, -1, 731, 733, 673, -1, 673, 733, 674, -1, 674, 668, 617, -1, 617, 668, 611, -1, 733, 726, 674, -1, 674, 726, 668, -1, 537, 534, 407, -1, 407, 534, 414, -1, 611, 603, 537, -1, 537, 603, 534, -1, 668, 659, 611, -1, 611, 659, 603, -1, 726, 714, 668, -1, 668, 714, 659, -1, 779, 780, 731, -1, 731, 780, 733, -1, 812, 813, 779, -1, 779, 813, 780, -1, 780, 778, 733, -1, 733, 778, 726, -1, 813, 809, 780, -1, 780, 809, 778, -1, 823, 825, 812, -1, 812, 825, 813, -1, 829, 831, 823, -1, 823, 831, 825, -1, 825, 820, 813, -1, 813, 820, 809, -1, 831, 826, 825, -1, 825, 826, 820, -1, 778, 765, 726, -1, 726, 765, 714, -1, 809, 787, 778, -1, 778, 787, 765, -1, 820, 810, 809, -1, 809, 810, 787, -1, 826, 814, 820, -1, 820, 814, 810, -1, 534, 528, 414, -1, 414, 528, 422, -1, 603, 599, 534, -1, 534, 599, 528, -1, 659, 647, 603, -1, 603, 647, 599, -1, 714, 689, 659, -1, 659, 689, 647, -1, 528, 522, 422, -1, 422, 522, 428, -1, 599, 593, 528, -1, 528, 593, 522, -1, 647, 633, 599, -1, 599, 633, 593, -1, 689, 676, 647, -1, 647, 676, 633, -1, 765, 736, 714, -1, 714, 736, 689, -1, 787, 768, 765, -1, 765, 768, 736, -1, 810, 781, 787, -1, 787, 781, 768, -1, 814, 783, 810, -1, 810, 783, 781, -1, 736, 715, 689, -1, 689, 715, 676, -1, 768, 748, 736, -1, 736, 748, 715, -1, 781, 772, 768, -1, 768, 772, 748, -1, 783, 777, 781, -1, 781, 777, 772, -1, 146, 92, 143, -1, 98, 92, 146, -1, 150, 88, 146, -1, 146, 88, 98, -1, 79, 92, 98, -1, 80, 92, 79, -1, 79, 88, 70, -1, 98, 88, 79, -1, 158, 88, 150, -1, 95, 88, 158, -1, 160, 93, 158, -1, 158, 93, 95, -1, 74, 88, 95, -1, 70, 88, 74, -1, 93, 72, 95, -1, 95, 72, 74, -1, 80, 66, 71, -1, 61, 66, 79, -1, 79, 66, 80, -1, 61, 70, 63, -1, 79, 70, 61, -1, 63, 31, 61, -1, 66, 49, 71, -1, 71, 49, 59, -1, 61, 49, 66, -1, 47, 49, 61, -1, 58, 49, 51, -1, 59, 49, 58, -1, 44, 49, 47, -1, 51, 49, 44, -1, 47, 31, 35, -1, 61, 31, 47, -1, 35, 24, 47, -1, 47, 24, 44, -1, 42, 70, 74, -1, 63, 70, 42, -1, 42, 31, 63, -1, 28, 31, 42, -1, 72, 33, 74, -1, 74, 33, 42, -1, 40, 33, 72, -1, 28, 33, 20, -1, 42, 33, 28, -1, 18, 33, 40, -1, 20, 33, 18, -1, 15, 31, 28, -1, 35, 31, 15, -1, 15, 24, 35, -1, 10, 24, 15, -1, 20, 7, 28, -1, 28, 7, 15, -1, 18, 7, 20, -1, 8, 7, 18, -1, 10, 7, 2, -1, 15, 7, 10, -1, 0, 7, 8, -1, 2, 7, 0, -1, 157, 93, 160, -1, 94, 93, 157, -1, 149, 96, 157, -1, 157, 96, 94, -1, 94, 72, 93, -1, 73, 72, 94, -1, 96, 69, 94, -1, 94, 69, 73, -1, 145, 96, 149, -1, 97, 96, 145, -1, 143, 92, 145, -1, 145, 92, 97, -1, 97, 69, 96, -1, 78, 69, 97, -1, 78, 92, 80, -1, 97, 92, 78, -1, 72, 32, 40, -1, 73, 32, 72, -1, 41, 32, 73, -1, 18, 32, 19, -1, 40, 32, 18, -1, 27, 32, 41, -1, 19, 32, 27, -1, 41, 69, 62, -1, 73, 69, 41, -1, 62, 30, 41, -1, 41, 30, 27, -1, 19, 6, 18, -1, 18, 6, 8, -1, 27, 6, 19, -1, 14, 6, 27, -1, 0, 6, 1, -1, 8, 6, 0, -1, 9, 6, 14, -1, 1, 6, 9, -1, 14, 30, 34, -1, 27, 30, 14, -1, 34, 23, 14, -1, 14, 23, 9, -1, 60, 69, 78, -1, 62, 69, 60, -1, 60, 30, 62, -1, 78, 65, 60, -1, 71, 65, 80, -1, 78, 80, 65, -1, 46, 30, 60, -1, 34, 30, 46, -1, 46, 23, 34, -1, 43, 23, 46, -1, 65, 48, 60, -1, 60, 48, 46, -1, 71, 48, 65, -1, 59, 48, 71, -1, 43, 48, 50, -1, 46, 48, 43, -1, 58, 48, 59, -1, 50, 48, 58, -1, 51, 53, 58, -1, 58, 53, 64, -1, 44, 53, 51, -1, 55, 53, 44, -1, 55, 24, 39, -1, 44, 24, 55, -1, 64, 53, 77, -1, 76, 53, 55, -1, 77, 53, 76, -1, 68, 55, 39, -1, 76, 55, 68, -1, 10, 12, 24, -1, 39, 12, 22, -1, 39, 24, 12, -1, 2, 4, 10, -1, 10, 4, 12, -1, 0, 4, 2, -1, 5, 4, 0, -1, 22, 4, 17, -1, 12, 4, 22, -1, 13, 4, 5, -1, 17, 4, 13, -1, 22, 37, 39, -1, 68, 37, 57, -1, 39, 37, 68, -1, 17, 26, 22, -1, 22, 26, 37, -1, 13, 26, 17, -1, 29, 26, 13, -1, 29, 37, 26, -1, 45, 26, 29, -1, 57, 26, 45, -1, 37, 26, 57, -1, 90, 77, 76, -1, 91, 77, 90, -1, 85, 76, 68, -1, 90, 76, 85, -1, 101, 1049, 91, -1, 91, 90, 101, -1, 100, 91, 1049, -1, 90, 87, 101, -1, 87, 90, 85, -1, 84, 68, 57, -1, 85, 68, 84, -1, 81, 57, 45, -1, 84, 57, 81, -1, 91, 100, 89, -1, 113, 85, 84, -1, 113, 87, 85, -1, 1050, 113, 81, -1, 112, 1050, 81, -1, 1, 3, 0, -1, 0, 3, 5, -1, 9, 3, 1, -1, 11, 3, 9, -1, 13, 3, 16, -1, 5, 3, 13, -1, 21, 3, 11, -1, 16, 3, 21, -1, 23, 11, 9, -1, 21, 11, 38, -1, 38, 11, 23, -1, 16, 25, 13, -1, 13, 25, 29, -1, 21, 25, 16, -1, 36, 25, 21, -1, 36, 29, 25, -1, 56, 25, 36, -1, 45, 25, 56, -1, 29, 25, 45, -1, 38, 36, 21, -1, 56, 36, 67, -1, 38, 67, 36, -1, 54, 23, 43, -1, 38, 23, 54, -1, 50, 52, 43, -1, 43, 52, 54, -1, 58, 52, 50, -1, 64, 52, 58, -1, 67, 54, 75, -1, 38, 54, 67, -1, 54, 52, 75, -1, 77, 52, 64, -1, 77, 75, 52, -1, 83, 45, 56, -1, 81, 45, 83, -1, 86, 56, 67, -1, 83, 56, 86, -1, 112, 81, 83, -1, 84, 81, 113, -1, 107, 83, 86, -1, 83, 107, 112, -1, 89, 67, 75, -1, 86, 67, 89, -1, 89, 75, 91, -1, 100, 86, 89, -1, 86, 100, 107, -1, 75, 77, 91, -1, 834, 808, 807, -1, 832, 808, 834, -1, 834, 805, 838, -1, 807, 805, 834, -1, 834, 844, 832, -1, 854, 844, 834, -1, 838, 848, 834, -1, 834, 848, 854, -1, 840, 805, 803, -1, 838, 805, 840, -1, 840, 801, 843, -1, 803, 801, 840, -1, 840, 848, 838, -1, 858, 848, 840, -1, 843, 852, 840, -1, 840, 852, 858, -1, 868, 844, 854, -1, 866, 844, 868, -1, 868, 848, 873, -1, 854, 848, 868, -1, 868, 874, 866, -1, 877, 874, 868, -1, 873, 877, 868, -1, 886, 877, 873, -1, 880, 848, 858, -1, 873, 848, 880, -1, 880, 852, 890, -1, 858, 852, 880, -1, 880, 886, 873, -1, 894, 886, 880, -1, 890, 894, 880, -1, 909, 894, 890, -1, 846, 801, 799, -1, 843, 801, 846, -1, 797, 836, 846, -1, 846, 852, 843, -1, 870, 852, 846, -1, 856, 836, 860, -1, 846, 836, 856, -1, 860, 865, 856, -1, 856, 865, 870, -1, 799, 797, 846, -1, 850, 836, 797, -1, 797, 795, 827, -1, 827, 841, 797, -1, 797, 841, 850, -1, 862, 836, 850, -1, 860, 836, 862, -1, 862, 865, 860, -1, 884, 865, 862, -1, 862, 841, 863, -1, 850, 841, 862, -1, 863, 871, 862, -1, 862, 871, 884, -1, 900, 852, 870, -1, 890, 852, 900, -1, 900, 865, 911, -1, 870, 865, 900, -1, 900, 905, 890, -1, 890, 905, 909, -1, 911, 905, 900, -1, 935, 905, 911, -1, 917, 865, 884, -1, 911, 865, 917, -1, 917, 871, 923, -1, 884, 871, 917, -1, 917, 927, 911, -1, 911, 927, 935, -1, 923, 927, 917, -1, 946, 927, 923, -1, 877, 891, 874, -1, 896, 891, 877, -1, 886, 896, 877, -1, 907, 896, 886, -1, 894, 907, 886, -1, 920, 907, 894, -1, 909, 920, 894, -1, 945, 920, 909, -1, 896, 912, 891, -1, 922, 912, 896, -1, 907, 922, 896, -1, 937, 922, 907, -1, 922, 938, 912, -1, 948, 938, 922, -1, 937, 948, 922, -1, 966, 948, 937, -1, 920, 933, 907, -1, 907, 933, 937, -1, 945, 951, 920, -1, 920, 951, 933, -1, 951, 975, 937, -1, 937, 975, 966, -1, 929, 905, 941, -1, 909, 905, 929, -1, 953, 905, 935, -1, 941, 905, 953, -1, 941, 943, 929, -1, 929, 943, 945, -1, 953, 943, 941, -1, 973, 943, 953, -1, 953, 927, 960, -1, 935, 927, 953, -1, 961, 927, 946, -1, 960, 927, 961, -1, 960, 964, 953, -1, 953, 964, 973, -1, 961, 964, 960, -1, 989, 964, 961, -1, 951, 943, 993, -1, 945, 943, 951, -1, 993, 943, 973, -1, 997, 993, 1015, -1, 951, 993, 997, -1, 1015, 1013, 997, -1, 997, 1013, 975, -1, 993, 964, 1006, -1, 973, 964, 993, -1, 1009, 964, 989, -1, 1006, 964, 1009, -1, 1006, 1011, 993, -1, 993, 1011, 1015, -1, 1011, 1027, 1015, -1, 1015, 1027, 1013, -1, 1009, 1016, 1006, -1, 1006, 1016, 1011, -1, 1016, 1030, 1011, -1, 1011, 1030, 1027, -1, 827, 795, 796, -1, 796, 841, 827, -1, 849, 841, 796, -1, 796, 835, 849, -1, 861, 841, 849, -1, 863, 841, 861, -1, 861, 871, 863, -1, 883, 871, 861, -1, 861, 835, 859, -1, 849, 835, 861, -1, 859, 864, 861, -1, 861, 864, 883, -1, 798, 845, 796, -1, 845, 835, 796, -1, 845, 800, 842, -1, 798, 800, 845, -1, 855, 835, 845, -1, 859, 835, 855, -1, 855, 864, 859, -1, 869, 864, 855, -1, 842, 851, 845, -1, 845, 851, 869, -1, 916, 871, 883, -1, 923, 871, 916, -1, 916, 864, 910, -1, 883, 864, 916, -1, 916, 926, 923, -1, 923, 926, 946, -1, 910, 926, 916, -1, 934, 926, 910, -1, 899, 864, 869, -1, 910, 864, 899, -1, 899, 851, 889, -1, 869, 851, 899, -1, 899, 904, 910, -1, 910, 904, 934, -1, 889, 904, 899, -1, 893, 904, 889, -1, 839, 800, 802, -1, 842, 800, 839, -1, 839, 804, 837, -1, 802, 804, 839, -1, 839, 851, 842, -1, 857, 851, 839, -1, 837, 847, 839, -1, 839, 847, 857, -1, 833, 804, 806, -1, 837, 804, 833, -1, 833, 808, 832, -1, 806, 808, 833, -1, 833, 847, 837, -1, 853, 847, 833, -1, 832, 844, 833, -1, 833, 844, 853, -1, 879, 851, 857, -1, 889, 851, 879, -1, 879, 847, 872, -1, 857, 847, 879, -1, 879, 893, 889, -1, 885, 893, 879, -1, 1041, 1023, 1048, -1, 1008, 1022, 1041, -1, 872, 885, 879, -1, 876, 885, 872, -1, 1007, 995, 988, -1, 1048, 1034, 1046, -1, 867, 847, 853, -1, 872, 847, 867, -1, 867, 844, 866, -1, 853, 844, 867, -1, 867, 876, 872, -1, 881, 876, 867, -1, 1038, 1029, 1033, -1, 1045, 1046, 1037, -1, 866, 874, 867, -1, 867, 874, 881, -1, 961, 926, 959, -1, 946, 926, 961, -1, 952, 926, 934, -1, 959, 926, 952, -1, 959, 963, 961, -1, 961, 963, 989, -1, 952, 963, 959, -1, 972, 963, 952, -1, 952, 904, 940, -1, 934, 904, 952, -1, 928, 904, 893, -1, 940, 904, 928, -1, 940, 942, 952, -1, 952, 942, 972, -1, 928, 942, 940, -1, 919, 942, 928, -1, 1009, 963, 1005, -1, 989, 963, 1009, -1, 992, 963, 972, -1, 1005, 963, 992, -1, 1005, 1016, 1009, -1, 1010, 1016, 1005, -1, 1010, 1030, 1016, -1, 1026, 1030, 1010, -1, 992, 1010, 1005, -1, 1014, 1010, 992, -1, 1014, 1026, 1010, -1, 1012, 1026, 1014, -1, 972, 942, 992, -1, 950, 942, 919, -1, 992, 942, 950, -1, 996, 992, 950, -1, 1014, 992, 996, -1, 996, 1012, 1014, -1, 974, 1012, 996, -1, 885, 919, 893, -1, 906, 919, 885, -1, 971, 990, 1017, -1, 971, 956, 887, -1, 876, 906, 885, -1, 895, 906, 876, -1, 887, 914, 986, -1, 986, 980, 985, -1, 881, 895, 876, -1, 902, 895, 881, -1, 985, 979, 994, -1, 1018, 1019, 1028, -1, 874, 891, 881, -1, 881, 891, 902, -1, 906, 950, 919, -1, 932, 950, 906, -1, 958, 970, 998, -1, 970, 1017, 990, -1, 895, 932, 906, -1, 921, 932, 895, -1, 1019, 1033, 1029, -1, 913, 931, 939, -1, 921, 974, 950, -1, 947, 974, 921, -1, 902, 921, 895, -1, 924, 921, 902, -1, 891, 912, 902, -1, 902, 912, 924, -1, 924, 947, 921, -1, 954, 947, 924, -1, 912, 938, 924, -1, 924, 938, 954, -1, 948, 957, 938, -1, 968, 957, 948, -1, 966, 968, 948, -1, 991, 968, 966, -1, 975, 1001, 966, -1, 966, 1001, 991, -1, 968, 976, 957, -1, 982, 976, 968, -1, 991, 984, 968, -1, 968, 984, 982, -1, 1001, 1004, 991, -1, 991, 1004, 984, -1, 1013, 1025, 975, -1, 975, 1025, 1001, -1, 1027, 1036, 1013, -1, 1013, 1036, 1025, -1, 1030, 1042, 1027, -1, 1027, 1042, 1036, -1, 1025, 1032, 1001, -1, 1001, 1032, 1004, -1, 1036, 1044, 1025, -1, 1025, 1044, 1032, -1, 903, 1047, 898, -1, 1044, 1042, 1040, -1, 1007, 987, 1008, -1, 995, 908, 897, -1, 908, 930, 944, -1, 930, 965, 936, -1, 979, 1018, 994, -1, 994, 1018, 1028, -1, 892, 882, 878, -1, 1020, 1002, 965, -1, 978, 999, 1020, -1, 949, 962, 978, -1, 1028, 1019, 1029, -1, 1045, 1038, 1033, -1, 1038, 1045, 1037, -1, 1034, 1037, 1046, -1, 987, 1022, 1008, -1, 987, 1007, 988, -1, 1042, 1043, 1040, -1, 1042, 1035, 1043, -1, 1023, 1034, 1048, -1, 1022, 1023, 1041, -1, 988, 995, 897, -1, 897, 908, 944, -1, 944, 930, 936, -1, 1002, 936, 965, -1, 1026, 1042, 1030, -1, 1035, 1042, 1026, -1, 1012, 1035, 1026, -1, 1024, 1035, 1012, -1, 974, 1024, 1012, -1, 1000, 1024, 974, -1, 1039, 1021, 925, -1, 1044, 1036, 1042, -1, 1024, 1043, 1035, -1, 1031, 1043, 1024, -1, 1000, 1031, 1024, -1, 1003, 1031, 1000, -1, 947, 1000, 974, -1, 967, 1000, 947, -1, 954, 967, 947, -1, 969, 967, 954, -1, 938, 957, 954, -1, 954, 957, 969, -1, 967, 1003, 1000, -1, 983, 1003, 967, -1, 969, 983, 967, -1, 981, 983, 969, -1, 957, 976, 969, -1, 969, 976, 981, -1, 1021, 915, 875, -1, 915, 931, 913, -1, 999, 1002, 1020, -1, 962, 999, 978, -1, 931, 901, 939, -1, 958, 977, 901, -1, 918, 962, 949, -1, 918, 892, 878, -1, 878, 882, 955, -1, 955, 888, 903, -1, 977, 958, 998, -1, 998, 970, 990, -1, 956, 971, 1017, -1, 956, 914, 887, -1, 892, 918, 949, -1, 882, 888, 955, -1, 888, 1047, 903, -1, 1047, 1039, 898, -1, 914, 980, 986, -1, 980, 979, 985, -1, 977, 939, 901, -1, 898, 1039, 925, -1, 925, 1021, 875, -1, 875, 915, 913, -1, 545, 444, 542, -1, 542, 549, 545, -1, 545, 549, 576, -1, 542, 444, 524, -1, 524, 549, 542, -1, 552, 549, 524, -1, 580, 549, 575, -1, 576, 549, 580, -1, 575, 544, 580, -1, 580, 544, 573, -1, 556, 549, 552, -1, 575, 549, 556, -1, 556, 544, 575, -1, 547, 544, 556, -1, 524, 444, 503, -1, 503, 495, 524, -1, 524, 495, 552, -1, 503, 444, 489, -1, 489, 495, 503, -1, 487, 495, 489, -1, 556, 495, 517, -1, 552, 495, 556, -1, 517, 493, 556, -1, 556, 493, 547, -1, 485, 495, 487, -1, 517, 495, 485, -1, 485, 493, 517, -1, 483, 493, 485, -1, 536, 544, 531, -1, 573, 544, 536, -1, 511, 544, 547, -1, 531, 544, 511, -1, 531, 520, 536, -1, 536, 520, 525, -1, 538, 520, 533, -1, 525, 520, 538, -1, 511, 520, 531, -1, 506, 520, 511, -1, 515, 520, 506, -1, 533, 520, 515, -1, 511, 493, 499, -1, 547, 493, 511, -1, 481, 493, 483, -1, 499, 493, 481, -1, 499, 491, 511, -1, 511, 491, 506, -1, 515, 491, 501, -1, 506, 491, 515, -1, 481, 491, 499, -1, 479, 491, 481, -1, 477, 491, 479, -1, 501, 491, 477, -1, 489, 444, 449, -1, 449, 410, 489, -1, 489, 410, 487, -1, 449, 444, 427, -1, 427, 410, 449, -1, 397, 410, 427, -1, 485, 410, 432, -1, 487, 410, 485, -1, 432, 413, 485, -1, 485, 413, 483, -1, 393, 410, 397, -1, 432, 410, 393, -1, 393, 413, 432, -1, 400, 413, 393, -1, 427, 444, 403, -1, 403, 372, 427, -1, 427, 372, 397, -1, 403, 444, 401, -1, 401, 372, 403, -1, 370, 372, 401, -1, 393, 372, 374, -1, 397, 372, 393, -1, 374, 376, 393, -1, 393, 376, 400, -1, 366, 372, 370, -1, 374, 372, 366, -1, 366, 376, 374, -1, 377, 376, 366, -1, 481, 413, 453, -1, 483, 413, 481, -1, 438, 413, 400, -1, 453, 413, 438, -1, 453, 446, 481, -1, 481, 446, 479, -1, 477, 446, 451, -1, 479, 446, 477, -1, 438, 446, 453, -1, 443, 446, 438, -1, 434, 446, 443, -1, 451, 446, 434, -1, 438, 376, 418, -1, 400, 376, 438, -1, 408, 376, 377, -1, 418, 376, 408, -1, 418, 420, 438, -1, 438, 420, 443, -1, 434, 420, 416, -1, 443, 420, 434, -1, 408, 420, 418, -1, 425, 420, 408, -1, 406, 420, 425, -1, 416, 420, 406, -1, 401, 444, 402, -1, 402, 371, 401, -1, 401, 371, 370, -1, 402, 444, 426, -1, 426, 371, 402, -1, 396, 371, 426, -1, 366, 371, 373, -1, 370, 371, 366, -1, 373, 375, 366, -1, 366, 375, 377, -1, 392, 371, 396, -1, 373, 371, 392, -1, 392, 375, 373, -1, 399, 375, 392, -1, 426, 444, 448, -1, 448, 409, 426, -1, 426, 409, 396, -1, 448, 444, 488, -1, 488, 409, 448, -1, 486, 409, 488, -1, 392, 409, 431, -1, 396, 409, 392, -1, 431, 412, 392, -1, 392, 412, 399, -1, 484, 409, 486, -1, 431, 409, 484, -1, 484, 412, 431, -1, 482, 412, 484, -1, 408, 375, 417, -1, 377, 375, 408, -1, 437, 375, 399, -1, 417, 375, 437, -1, 417, 419, 408, -1, 408, 419, 425, -1, 406, 419, 415, -1, 425, 419, 406, -1, 437, 419, 417, -1, 442, 419, 437, -1, 433, 419, 442, -1, 415, 419, 433, -1, 437, 412, 452, -1, 399, 412, 437, -1, 480, 412, 482, -1, 452, 412, 480, -1, 452, 445, 437, -1, 437, 445, 442, -1, 433, 445, 450, -1, 442, 445, 433, -1, 480, 445, 452, -1, 478, 445, 480, -1, 476, 445, 478, -1, 450, 445, 476, -1, 488, 444, 502, -1, 502, 494, 488, -1, 488, 494, 486, -1, 502, 444, 523, -1, 523, 494, 502, -1, 551, 494, 523, -1, 484, 494, 516, -1, 486, 494, 484, -1, 516, 492, 484, -1, 484, 492, 482, -1, 555, 494, 551, -1, 516, 494, 555, -1, 555, 492, 516, -1, 546, 492, 555, -1, 523, 444, 541, -1, 541, 548, 523, -1, 523, 548, 551, -1, 541, 444, 545, -1, 545, 548, 541, -1, 576, 548, 545, -1, 555, 548, 574, -1, 551, 548, 555, -1, 574, 543, 555, -1, 555, 543, 546, -1, 580, 548, 576, -1, 574, 548, 580, -1, 580, 543, 574, -1, 573, 543, 580, -1, 480, 492, 498, -1, 482, 492, 480, -1, 510, 492, 546, -1, 498, 492, 510, -1, 498, 490, 480, -1, 480, 490, 478, -1, 476, 490, 500, -1, 478, 490, 476, -1, 510, 490, 498, -1, 505, 490, 510, -1, 514, 490, 505, -1, 500, 490, 514, -1, 510, 543, 530, -1, 546, 543, 510, -1, 536, 543, 573, -1, 530, 543, 536, -1, 530, 519, 510, -1, 510, 519, 505, -1, 514, 519, 532, -1, 505, 519, 514, -1, 536, 519, 530, -1, 525, 519, 536, -1, 538, 519, 525, -1, 532, 519, 538, -1, 533, 559, 538, -1, 538, 559, 592, -1, 515, 559, 533, -1, 572, 559, 515, -1, 654, 559, 650, -1, 592, 559, 654, -1, 650, 559, 636, -1, 636, 559, 626, -1, 613, 559, 572, -1, 626, 559, 613, -1, 501, 497, 515, -1, 515, 497, 572, -1, 477, 497, 501, -1, 475, 497, 477, -1, 613, 497, 595, -1, 572, 497, 613, -1, 595, 497, 570, -1, 570, 497, 527, -1, 473, 497, 475, -1, 527, 497, 473, -1, 650, 679, 654, -1, 654, 679, 678, -1, 636, 672, 650, -1, 650, 672, 679, -1, 626, 658, 636, -1, 636, 658, 672, -1, 613, 638, 626, -1, 626, 638, 658, -1, 238, 233, 207, -1, 725, 678, 679, -1, 732, 678, 725, -1, 303, 255, 207, -1, 653, 694, 207, -1, 710, 679, 672, -1, 725, 679, 710, -1, 353, 470, 207, -1, 725, 734, 732, -1, 732, 734, 743, -1, 710, 718, 725, -1, 725, 718, 734, -1, 251, 274, 207, -1, 688, 672, 658, -1, 710, 672, 688, -1, 640, 690, 207, -1, 470, 591, 207, -1, 664, 658, 638, -1, 688, 658, 664, -1, 398, 322, 207, -1, 688, 697, 710, -1, 710, 697, 718, -1, 664, 667, 688, -1, 688, 667, 697, -1, 595, 610, 613, -1, 613, 610, 638, -1, 570, 579, 595, -1, 595, 579, 610, -1, 527, 508, 570, -1, 570, 508, 579, -1, 473, 441, 527, -1, 527, 441, 508, -1, 669, 609, 207, -1, 630, 638, 610, -1, 664, 638, 630, -1, 690, 716, 207, -1, 367, 303, 207, -1, 598, 610, 579, -1, 630, 610, 598, -1, 591, 653, 207, -1, 630, 632, 664, -1, 664, 632, 667, -1, 598, 601, 630, -1, 630, 601, 632, -1, 322, 290, 207, -1, 554, 579, 508, -1, 598, 579, 554, -1, 440, 578, 207, -1, 270, 353, 207, -1, 467, 508, 441, -1, 554, 508, 467, -1, 609, 507, 207, -1, 554, 557, 598, -1, 598, 557, 601, -1, 467, 463, 554, -1, 554, 463, 557, -1, 451, 360, 477, -1, 477, 360, 475, -1, 434, 360, 451, -1, 379, 360, 434, -1, 473, 360, 424, -1, 475, 360, 473, -1, 424, 360, 381, -1, 381, 360, 350, -1, 332, 360, 379, -1, 350, 360, 332, -1, 416, 324, 434, -1, 434, 324, 379, -1, 406, 324, 416, -1, 352, 324, 406, -1, 332, 324, 317, -1, 379, 324, 332, -1, 317, 324, 307, -1, 307, 324, 294, -1, 288, 324, 352, -1, 294, 324, 288, -1, 424, 368, 473, -1, 473, 368, 441, -1, 381, 335, 424, -1, 424, 335, 368, -1, 350, 304, 381, -1, 381, 304, 335, -1, 332, 275, 350, -1, 350, 275, 304, -1, 675, 621, 207, -1, 395, 441, 368, -1, 467, 441, 395, -1, 578, 640, 207, -1, 717, 707, 207, -1, 347, 368, 335, -1, 395, 368, 347, -1, 255, 239, 207, -1, 395, 391, 467, -1, 467, 391, 463, -1, 347, 343, 395, -1, 395, 343, 391, -1, 708, 675, 207, -1, 313, 335, 304, -1, 347, 335, 313, -1, 274, 334, 207, -1, 239, 238, 207, -1, 281, 304, 275, -1, 313, 304, 281, -1, 694, 717, 207, -1, 313, 310, 347, -1, 347, 310, 343, -1, 281, 277, 313, -1, 313, 277, 310, -1, 317, 256, 332, -1, 332, 256, 275, -1, 307, 235, 317, -1, 317, 235, 256, -1, 294, 225, 307, -1, 307, 225, 235, -1, 288, 224, 294, -1, 294, 224, 225, -1, 550, 398, 207, -1, 259, 275, 256, -1, 281, 275, 259, -1, 707, 669, 207, -1, 716, 708, 207, -1, 232, 256, 235, -1, 259, 256, 232, -1, 290, 270, 207, -1, 259, 247, 281, -1, 281, 247, 277, -1, 232, 223, 259, -1, 259, 223, 247, -1, 217, 235, 225, -1, 232, 235, 217, -1, 209, 225, 224, -1, 217, 225, 209, -1, 217, 205, 232, -1, 232, 205, 223, -1, 209, 198, 217, -1, 217, 198, 205, -1, 415, 323, 406, -1, 406, 323, 352, -1, 433, 323, 415, -1, 378, 323, 433, -1, 288, 323, 293, -1, 352, 323, 288, -1, 293, 323, 306, -1, 306, 323, 316, -1, 331, 323, 378, -1, 316, 323, 331, -1, 450, 359, 433, -1, 433, 359, 378, -1, 476, 359, 450, -1, 474, 359, 476, -1, 331, 359, 349, -1, 378, 359, 331, -1, 349, 359, 380, -1, 380, 359, 423, -1, 472, 359, 474, -1, 423, 359, 472, -1, 293, 234, 288, -1, 288, 234, 224, -1, 306, 250, 293, -1, 293, 250, 234, -1, 316, 269, 306, -1, 306, 269, 250, -1, 331, 289, 316, -1, 316, 289, 269, -1, 216, 224, 234, -1, 209, 224, 216, -1, 231, 234, 250, -1, 216, 234, 231, -1, 216, 204, 209, -1, 209, 204, 198, -1, 231, 220, 216, -1, 216, 220, 204, -1, 258, 250, 269, -1, 231, 250, 258, -1, 280, 269, 289, -1, 258, 269, 280, -1, 258, 241, 231, -1, 231, 241, 220, -1, 280, 265, 258, -1, 258, 265, 241, -1, 349, 321, 331, -1, 331, 321, 289, -1, 380, 348, 349, -1, 349, 348, 321, -1, 423, 385, 380, -1, 380, 385, 348, -1, 472, 447, 423, -1, 423, 447, 385, -1, 312, 289, 321, -1, 280, 289, 312, -1, 346, 321, 348, -1, 312, 321, 346, -1, 312, 292, 280, -1, 280, 292, 265, -1, 346, 326, 312, -1, 312, 326, 292, -1, 394, 348, 385, -1, 346, 348, 394, -1, 466, 385, 447, -1, 394, 385, 466, -1, 394, 364, 346, -1, 346, 364, 326, -1, 466, 439, 394, -1, 394, 439, 364, -1, 500, 496, 476, -1, 476, 496, 474, -1, 514, 496, 500, -1, 571, 496, 514, -1, 472, 496, 526, -1, 474, 496, 472, -1, 526, 496, 569, -1, 569, 496, 594, -1, 612, 496, 571, -1, 594, 496, 612, -1, 532, 558, 514, -1, 514, 558, 571, -1, 538, 558, 532, -1, 592, 558, 538, -1, 612, 558, 625, -1, 571, 558, 612, -1, 625, 558, 635, -1, 635, 558, 649, -1, 654, 558, 592, -1, 649, 558, 654, -1, 526, 504, 472, -1, 472, 504, 447, -1, 569, 565, 526, -1, 526, 565, 504, -1, 594, 596, 569, -1, 569, 596, 565, -1, 612, 620, 594, -1, 594, 620, 596, -1, 553, 447, 504, -1, 466, 447, 553, -1, 597, 504, 565, -1, 553, 504, 597, -1, 553, 509, 466, -1, 466, 509, 439, -1, 597, 582, 553, -1, 553, 582, 509, -1, 629, 565, 596, -1, 597, 565, 629, -1, 663, 596, 620, -1, 629, 596, 663, -1, 629, 618, 597, -1, 597, 618, 582, -1, 663, 651, 629, -1, 629, 651, 618, -1, 625, 637, 612, -1, 612, 637, 620, -1, 635, 657, 625, -1, 625, 657, 637, -1, 649, 671, 635, -1, 635, 671, 657, -1, 654, 678, 649, -1, 649, 678, 671, -1, 687, 620, 637, -1, 663, 620, 687, -1, 709, 637, 657, -1, 687, 637, 709, -1, 687, 681, 663, -1, 663, 681, 651, -1, 709, 703, 687, -1, 687, 703, 681, -1, 621, 550, 207, -1, 724, 657, 671, -1, 709, 657, 724, -1, 334, 440, 207, -1, 507, 367, 207, -1, 732, 671, 678, -1, 724, 671, 732, -1, 233, 251, 207, -1, 724, 721, 709, -1, 709, 721, 703, -1, 721, 724, 743, -1, 743, 724, 732, -1, 1059, 1056, 1052, -1, 1052, 1056, 1057, -1, 1061, 1056, 1059, -1, 1065, 1056, 1061, -1, 1071, 1067, 1061, -1, 1061, 1067, 1065, -1, 1051, 1056, 1054, -1, 1057, 1056, 1051, -1, 1063, 1056, 1065, -1, 1054, 1056, 1063, -1, 1063, 1067, 1069, -1, 1065, 1067, 1063, -1, 1078, 1067, 1071, -1, 1082, 1067, 1078, -1, 1086, 1080, 1078, -1, 1078, 1080, 1082, -1, 1085, 1084, 1083, -1, 1086, 1084, 1080, -1, 1073, 1067, 1082, -1, 1069, 1067, 1073, -1, 1073, 1080, 1075, -1, 1082, 1080, 1073, -1, 1076, 1080, 1084, -1, 1075, 1080, 1076, -1, 1079, 1084, 1085, -1, 1083, 1084, 1086, -1, 1077, 1079, 1085, -1, 1081, 1079, 1077, -1, 1070, 1066, 1077, -1, 1077, 1066, 1081, -1, 1076, 1079, 1074, -1, 1084, 1079, 1076, -1, 1072, 1079, 1081, -1, 1074, 1079, 1072, -1, 1072, 1066, 1068, -1, 1081, 1066, 1072, -1, 1060, 1066, 1070, -1, 1064, 1066, 1060, -1, 1058, 1055, 1060, -1, 1060, 1055, 1064, -1, 1052, 1055, 1058, -1, 1057, 1055, 1052, -1, 1062, 1066, 1064, -1, 1068, 1066, 1062, -1, 1062, 1055, 1053, -1, 1064, 1055, 1062, -1, 1051, 1055, 1057, -1, 1053, 1055, 1051, -1, 1072, 1094, 1096, -1, 1073, 1075, 1097, -1, 1074, 1096, 1098, -1, 1063, 1069, 1093, -1, 1053, 1088, 1090, -1, 1075, 1076, 1098, -1, 1062, 1090, 1092, -1, 1069, 1073, 1095, -1, 1051, 1087, 1088, -1, 1068, 1092, 1094, -1, 1054, 1063, 1091, -1, 1051, 1054, 1089, -1, 1092, 1090, 1102, -1, 1098, 1096, 1108, -1, 1094, 1092, 1104, -1, 1095, 1097, 1109, -1, 1088, 1087, 1099, -1, 1097, 1098, 1110, -1, 1093, 1095, 1107, -1, 1089, 1091, 1103, -1, 1096, 1094, 1106, -1, 1091, 1093, 1105, -1, 1090, 1088, 1100, -1, 1087, 1089, 1101, -1, 1074, 1072, 1096, -1, 1095, 1073, 1097, -1, 1076, 1074, 1098, -1, 1091, 1063, 1093, -1, 1062, 1053, 1090, -1, 1097, 1075, 1098, -1, 1068, 1062, 1092, -1, 1093, 1069, 1095, -1, 1053, 1051, 1088, -1, 1072, 1068, 1094, -1, 1089, 1054, 1091, -1, 1087, 1051, 1089, -1, 1104, 1092, 1102, -1, 1110, 1098, 1108, -1, 1106, 1094, 1104, -1, 1107, 1095, 1109, -1, 1100, 1088, 1099, -1, 1109, 1097, 1110, -1, 1105, 1093, 1107, -1, 1101, 1089, 1103, -1, 1108, 1096, 1106, -1, 1103, 1091, 1105, -1, 1102, 1090, 1100, -1, 1099, 1087, 1101, -1 + ] + texCoordIndex [ + 0, 1, 2, -1, 3, 4, 5, -1, 6, 7, 8, -1, 9, 10, 11, -1, 12, 13, 14, -1, 15, 16, 17, -1, 18, 19, 20, -1, 21, 22, 23, -1, 24, 25, 26, -1, 27, 28, 29, -1, 30, 31, 32, -1, 33, 34, 35, -1, 36, 37, 38, -1, 39, 40, 41, -1, 42, 43, 44, -1, 45, 46, 47, -1, 48, 49, 50, -1, 51, 52, 53, -1, 54, 55, 56, -1, 57, 58, 59, -1, 60, 61, 62, -1, 63, 64, 65, -1, 66, 67, 68, -1, 69, 70, 71, -1, 72, 73, 74, -1, 75, 76, 77, -1, 78, 79, 80, -1, 81, 82, 83, -1, 84, 85, 86, -1, 87, 88, 89, -1, 90, 91, 92, -1, 93, 94, 95, -1, 96, 97, 98, -1, 99, 100, 101, -1, 102, 103, 104, -1, 105, 106, 107, -1, 108, 109, 110, -1, 111, 112, 113, -1, 114, 115, 116, -1, 117, 118, 119, -1, 120, 121, 122, -1, 123, 124, 125, -1, 126, 127, 128, -1, 129, 130, 131, -1, 132, 133, 134, -1, 135, 136, 137, -1, 138, 139, 140, -1, 141, 142, 143, -1, 144, 145, 146, -1, 147, 148, 149, -1, 150, 151, 152, -1, 153, 154, 155, -1, 156, 157, 158, -1, 159, 160, 161, -1, 162, 163, 164, -1, 165, 166, 167, -1, 168, 169, 170, -1, 171, 172, 173, -1, 174, 175, 176, -1, 177, 178, 179, -1, 180, 181, 182, -1, 183, 184, 185, -1, 186, 187, 188, -1, 189, 190, 191, -1, 192, 193, 194, -1, 195, 196, 197, -1, 198, 199, 200, -1, 201, 202, 203, -1, 204, 205, 206, -1, 207, 208, 209, -1, 210, 211, 212, -1, 213, 214, 215, -1, 216, 217, 218, -1, 219, 220, 221, -1, 222, 223, 224, -1, 225, 226, 227, -1, 228, 229, 230, -1, 231, 232, 233, -1, 234, 235, 236, -1, 237, 238, 239, -1, 240, 241, 242, -1, 243, 244, 245, -1, 246, 247, 248, -1, 249, 250, 251, -1, 252, 253, 254, -1, 255, 256, 257, -1, 258, 259, 260, -1, 261, 262, 263, -1, 264, 265, 266, -1, 267, 268, 269, -1, 270, 271, 272, -1, 273, 274, 275, -1, 276, 277, 278, -1, 279, 280, 281, -1, 282, 283, 284, -1, 285, 286, 287, -1, 288, 289, 290, -1, 291, 292, 293, -1, 294, 295, 296, -1, 297, 298, 299, -1, 300, 301, 302, -1, 303, 304, 305, -1, 306, 307, 308, -1, 309, 310, 311, -1, 312, 313, 314, -1, 315, 316, 317, -1, 318, 319, 320, -1, 321, 322, 323, -1, 324, 325, 326, -1, 327, 328, 329, -1, 330, 331, 332, -1, 333, 334, 335, -1, 336, 337, 338, -1, 339, 340, 341, -1, 342, 343, 344, -1, 345, 346, 347, -1, 348, 349, 350, -1, 351, 352, 353, -1, 354, 355, 356, -1, 357, 358, 359, -1, 360, 361, 362, -1, 363, 364, 365, -1, 366, 367, 368, -1, 369, 370, 371, -1, 372, 373, 374, -1, 375, 376, 377, -1, 378, 379, 380, -1, 381, 382, 383, -1, 384, 385, 386, -1, 387, 388, 389, -1, 390, 391, 392, -1, 393, 394, 395, -1, 396, 397, 398, -1, 399, 400, 401, -1, 402, 403, 404, -1, 405, 406, 407, -1, 408, 409, 410, -1, 411, 412, 413, -1, 414, 415, 416, -1, 417, 418, 419, -1, 420, 421, 422, -1, 423, 424, 425, -1, 426, 427, 428, -1, 429, 430, 431, -1, 432, 433, 434, -1, 435, 436, 437, -1, 438, 439, 440, -1, 441, 442, 443, -1, 444, 445, 446, -1, 447, 448, 449, -1, 450, 451, 452, -1, 453, 454, 455, -1, 456, 457, 458, -1, 459, 460, 461, -1, 462, 463, 464, -1, 465, 466, 467, -1, 468, 469, 470, -1, 471, 472, 473, -1, 474, 475, 476, -1, 477, 478, 479, -1, 480, 481, 482, -1, 483, 484, 485, -1, 486, 487, 488, -1, 489, 490, 491, -1, 492, 493, 494, -1, 495, 496, 497, -1, 498, 499, 500, -1, 501, 502, 503, -1, 504, 505, 506, -1, 507, 508, 509, -1, 510, 511, 512, -1, 513, 514, 515, -1, 516, 517, 518, -1, 519, 520, 521, -1, 522, 523, 524, -1, 525, 526, 527, -1, 528, 529, 530, -1, 531, 532, 533, -1, 534, 535, 536, -1, 537, 538, 539, -1, 540, 541, 542, -1, 543, 544, 545, -1, 546, 547, 548, -1, 549, 550, 551, -1, 552, 553, 554, -1, 555, 556, 557, -1, 558, 559, 560, -1, 561, 562, 563, -1, 564, 565, 566, -1, 567, 568, 569, -1, 570, 571, 572, -1, 573, 574, 575, -1, 576, 577, 578, -1, 579, 580, 581, -1, 582, 583, 584, -1, 585, 586, 587, -1, 588, 589, 590, -1, 591, 592, 593, -1, 594, 595, 596, -1, 597, 598, 599, -1, 600, 601, 602, -1, 603, 604, 605, -1, 606, 607, 608, -1, 609, 610, 611, -1, 612, 613, 614, -1, 615, 616, 617, -1, 618, 619, 620, -1, 621, 622, 623, -1, 624, 625, 626, -1, 627, 628, 629, -1, 630, 631, 632, -1, 633, 634, 635, -1, 636, 637, 638, -1, 639, 640, 641, -1, 642, 643, 644, -1, 645, 646, 647, -1, 648, 649, 650, -1, 651, 652, 653, -1, 654, 655, 656, -1, 657, 658, 659, -1, 660, 661, 662, -1, 663, 664, 665, -1, 666, 667, 668, -1, 669, 670, 671, -1, 672, 673, 674, -1, 675, 676, 677, -1, 678, 679, 680, -1, 681, 682, 683, -1, 684, 685, 686, -1, 687, 688, 689, -1, 690, 691, 692, -1, 693, 694, 695, -1, 696, 697, 698, -1, 699, 700, 701, -1, 702, 703, 704, -1, 705, 706, 707, -1, 708, 709, 710, -1, 711, 712, 713, -1, 714, 715, 716, -1, 717, 718, 719, -1, 720, 721, 722, -1, 723, 724, 725, -1, 726, 727, 728, -1, 729, 730, 731, -1, 732, 733, 734, -1, 735, 736, 737, -1, 738, 739, 740, -1, 741, 742, 743, -1, 744, 745, 746, -1, 747, 748, 749, -1, 750, 751, 752, -1, 753, 754, 755, -1, 756, 757, 758, -1, 759, 760, 761, -1, 762, 763, 764, -1, 765, 766, 767, -1, 768, 769, 770, -1, 771, 772, 773, -1, 774, 775, 776, -1, 777, 778, 779, -1, 780, 781, 782, -1, 783, 784, 785, -1, 786, 787, 788, -1, 789, 790, 791, -1, 792, 793, 794, -1, 795, 796, 797, -1, 798, 799, 800, -1, 801, 802, 803, -1, 804, 805, 806, -1, 807, 808, 809, -1, 810, 811, 812, -1, 813, 814, 815, -1, 816, 817, 818, -1, 819, 820, 821, -1, 822, 823, 824, -1, 825, 826, 827, -1, 828, 829, 830, -1, 831, 832, 833, -1, 834, 835, 836, -1, 837, 838, 839, -1, 840, 841, 842, -1, 843, 844, 845, -1, 846, 847, 848, -1, 849, 850, 851, -1, 852, 853, 854, -1, 855, 856, 857, -1, 858, 859, 860, -1, 861, 862, 863, -1, 864, 865, 866, -1, 867, 868, 869, -1, 870, 871, 872, -1, 873, 874, 875, -1, 876, 877, 878, -1, 879, 880, 881, -1, 882, 883, 884, -1, 885, 886, 887, -1, 888, 889, 890, -1, 891, 892, 893, -1, 894, 895, 896, -1, 897, 898, 899, -1, 900, 901, 902, -1, 903, 904, 905, -1, 906, 907, 908, -1, 909, 910, 911, -1, 912, 913, 914, -1, 915, 916, 917, -1, 918, 919, 920, -1, 921, 922, 923, -1, 924, 925, 926, -1, 927, 928, 929, -1, 930, 931, 932, -1, 933, 934, 935, -1, 936, 937, 938, -1, 939, 940, 941, -1, 942, 943, 944, -1, 945, 946, 947, -1, 948, 949, 950, -1, 951, 952, 953, -1, 954, 955, 956, -1, 957, 958, 959, -1, 960, 961, 962, -1, 963, 964, 965, -1, 966, 967, 968, -1, 969, 970, 971, -1, 972, 973, 974, -1, 975, 976, 977, -1, 978, 979, 980, -1, 981, 982, 983, -1, 984, 985, 986, -1, 987, 988, 989, -1, 990, 991, 992, -1, 993, 994, 995, -1, 996, 997, 998, -1, 999, 1000, 1001, -1, 1002, 1003, 1004, -1, 1005, 1006, 1007, -1, 1008, 1009, 1010, -1, 1011, 1012, 1013, -1, 1014, 1015, 1016, -1, 1017, 1018, 1019, -1, 1020, 1021, 1022, -1, 1023, 1024, 1025, -1, 1026, 1027, 1028, -1, 1029, 1030, 1031, -1, 1032, 1033, 1034, -1, 1035, 1036, 1037, -1, 1038, 1039, 1040, -1, 1041, 1042, 1043, -1, 1044, 1045, 1046, -1, 1047, 1048, 1049, -1, 1050, 1051, 1052, -1, 1053, 1054, 1055, -1, 1056, 1057, 1058, -1, 1059, 1060, 1061, -1, 1062, 1063, 1064, -1, 1065, 1066, 1067, -1, 1068, 1069, 1070, -1, 1071, 1072, 1073, -1, 1074, 1075, 1076, -1, 1077, 1078, 1079, -1, 1080, 1081, 1082, -1, 1083, 1084, 1085, -1, 1086, 1087, 1088, -1, 1089, 1090, 1091, -1, 1092, 1093, 1094, -1, 1095, 1096, 1097, -1, 1098, 1099, 1100, -1, 1101, 1102, 1103, -1, 1104, 1105, 1106, -1, 1107, 1108, 1109, -1, 1110, 1111, 1112, -1, 1113, 1114, 1115, -1, 1116, 1117, 1118, -1, 1119, 1120, 1121, -1, 1122, 1123, 1124, -1, 1125, 1126, 1127, -1, 1128, 1129, 1130, -1, 1131, 1132, 1133, -1, 1134, 1135, 1136, -1, 1137, 1138, 1139, -1, 1140, 1141, 1142, -1, 1143, 1144, 1145, -1, 1146, 1147, 1148, -1, 1149, 1150, 1151, -1, 1152, 1153, 1154, -1, 1155, 1156, 1157, -1, 1158, 1159, 1160, -1, 1161, 1162, 1163, -1, 1164, 1165, 1166, -1, 1167, 1168, 1169, -1, 1170, 1171, 1172, -1, 1173, 1174, 1175, -1, 1176, 1177, 1178, -1, 1179, 1180, 1181, -1, 1182, 1183, 1184, -1, 1185, 1186, 1187, -1, 1188, 1189, 1190, -1, 1191, 1192, 1193, -1, 1194, 1195, 1196, -1, 1197, 1198, 1199, -1, 1200, 1201, 1202, -1, 1203, 1204, 1205, -1, 1206, 1207, 1208, -1, 1209, 1210, 1211, -1, 1212, 1213, 1214, -1, 1215, 1216, 1217, -1, 1218, 1219, 1220, -1, 1221, 1222, 1223, -1, 1224, 1225, 1226, -1, 1227, 1228, 1229, -1, 1230, 1231, 1232, -1, 1233, 1234, 1235, -1, 1236, 1237, 1238, -1, 1239, 1240, 1241, -1, 1242, 1243, 1244, -1, 1245, 1246, 1247, -1, 1248, 1249, 1250, -1, 1251, 1252, 1253, -1, 1254, 1255, 1256, -1, 1257, 1258, 1259, -1, 1260, 1261, 1262, -1, 1263, 1264, 1265, -1, 1266, 1267, 1268, -1, 1269, 1270, 1271, -1, 1272, 1273, 1274, -1, 1275, 1276, 1277, -1, 1278, 1279, 1280, -1, 1281, 1282, 1283, -1, 1284, 1285, 1286, -1, 1287, 1288, 1289, -1, 1290, 1291, 1292, -1, 1293, 1294, 1295, -1, 1296, 1297, 1298, -1, 1299, 1300, 1301, -1, 1302, 1303, 1304, -1, 1305, 1306, 1307, -1, 1308, 1309, 1310, -1, 1311, 1312, 1313, -1, 1314, 1315, 1316, -1, 1317, 1318, 1319, -1, 1320, 1321, 1322, -1, 1323, 1324, 1325, -1, 1326, 1327, 1328, -1, 1329, 1330, 1331, -1, 1332, 1333, 1334, -1, 1335, 1336, 1337, -1, 1338, 1339, 1340, -1, 1341, 1342, 1343, -1, 1344, 1345, 1346, -1, 1347, 1348, 1349, -1, 1350, 1351, 1352, -1, 1353, 1354, 1355, -1, 1356, 1357, 1358, -1, 1359, 1360, 1361, -1, 1362, 1363, 1364, -1, 1365, 1366, 1367, -1, 1368, 1369, 1370, -1, 1371, 1372, 1373, -1, 1374, 1375, 1376, -1, 1377, 1378, 1379, -1, 1380, 1381, 1382, -1, 1383, 1384, 1385, -1, 1386, 1387, 1388, -1, 1389, 1390, 1391, -1, 1392, 1393, 1394, -1, 1395, 1396, 1397, -1, 1398, 1399, 1400, -1, 1401, 1402, 1403, -1, 1404, 1405, 1406, -1, 1407, 1408, 1409, -1, 1410, 1411, 1412, -1, 1413, 1414, 1415, -1, 1416, 1417, 1418, -1, 1419, 1420, 1421, -1, 1422, 1423, 1424, -1, 1425, 1426, 1427, -1, 1428, 1429, 1430, -1, 1431, 1432, 1433, -1, 1434, 1435, 1436, -1, 1437, 1438, 1439, -1, 1440, 1441, 1442, -1, 1443, 1444, 1445, -1, 1446, 1447, 1448, -1, 1449, 1450, 1451, -1, 1452, 1453, 1454, -1, 1455, 1456, 1457, -1, 1458, 1459, 1460, -1, 1461, 1462, 1463, -1, 1464, 1465, 1466, -1, 1467, 1468, 1469, -1, 1470, 1471, 1472, -1, 1473, 1474, 1475, -1, 1476, 1477, 1478, -1, 1479, 1480, 1481, -1, 1482, 1483, 1484, -1, 1485, 1486, 1487, -1, 1488, 1489, 1490, -1, 1491, 1492, 1493, -1, 1494, 1495, 1496, -1, 1497, 1498, 1499, -1, 1500, 1501, 1502, -1, 1503, 1504, 1505, -1, 1506, 1507, 1508, -1, 1509, 1510, 1511, -1, 1512, 1513, 1514, -1, 1515, 1516, 1517, -1, 1518, 1519, 1520, -1, 1521, 1522, 1523, -1, 1524, 1525, 1526, -1, 1527, 1528, 1529, -1, 1530, 1531, 1532, -1, 1533, 1534, 1535, -1, 1536, 1537, 1538, -1, 1539, 1540, 1541, -1, 1542, 1543, 1544, -1, 1545, 1546, 1547, -1, 1548, 1549, 1550, -1, 1551, 1552, 1553, -1, 1554, 1555, 1556, -1, 1557, 1558, 1559, -1, 1560, 1561, 1562, -1, 1563, 1564, 1565, -1, 1566, 1567, 1568, -1, 1569, 1570, 1571, -1, 1572, 1573, 1574, -1, 1575, 1576, 1577, -1, 1578, 1579, 1580, -1, 1581, 1582, 1583, -1, 1584, 1585, 1586, -1, 1587, 1588, 1589, -1, 1590, 1591, 1592, -1, 1593, 1594, 1595, -1, 1596, 1597, 1598, -1, 1599, 1600, 1601, -1, 1602, 1603, 1604, -1, 1605, 1606, 1607, -1, 1608, 1609, 1610, -1, 1611, 1612, 1613, -1, 1614, 1615, 1616, -1, 1617, 1618, 1619, -1, 1620, 1621, 1622, -1, 1623, 1624, 1625, -1, 1626, 1627, 1628, -1, 1629, 1630, 1631, -1, 1632, 1633, 1634, -1, 1635, 1636, 1637, -1, 1638, 1639, 1640, -1, 1641, 1642, 1643, -1, 1644, 1645, 1646, -1, 1647, 1648, 1649, -1, 1650, 1651, 1652, -1, 1653, 1654, 1655, -1, 1656, 1657, 1658, -1, 1659, 1660, 1661, -1, 1662, 1663, 1664, -1, 1665, 1666, 1667, -1, 1668, 1669, 1670, -1, 1671, 1672, 1673, -1, 1674, 1675, 1676, -1, 1677, 1678, 1679, -1, 1680, 1681, 1682, -1, 1683, 1684, 1685, -1, 1686, 1687, 1688, -1, 1689, 1690, 1691, -1, 1692, 1693, 1694, -1, 1695, 1696, 1697, -1, 1698, 1699, 1700, -1, 1701, 1702, 1703, -1, 1704, 1705, 1706, -1, 1707, 1708, 1709, -1, 1710, 1711, 1712, -1, 1713, 1714, 1715, -1, 1716, 1717, 1718, -1, 1719, 1720, 1721, -1, 1722, 1723, 1724, -1, 1725, 1726, 1727, -1, 1728, 1729, 1730, -1, 1731, 1732, 1733, -1, 1734, 1735, 1736, -1, 1737, 1738, 1739, -1, 1740, 1741, 1742, -1, 1743, 1744, 1745, -1, 1746, 1747, 1748, -1, 1749, 1750, 1751, -1, 1752, 1753, 1754, -1, 1755, 1756, 1757, -1, 1758, 1759, 1760, -1, 1761, 1762, 1763, -1, 1764, 1765, 1766, -1, 1767, 1768, 1769, -1, 1770, 1771, 1772, -1, 1773, 1774, 1775, -1, 1776, 1777, 1778, -1, 1779, 1780, 1781, -1, 1782, 1783, 1784, -1, 1785, 1786, 1787, -1, 1788, 1789, 1790, -1, 1791, 1792, 1793, -1, 1794, 1795, 1796, -1, 1797, 1798, 1799, -1, 1800, 1801, 1802, -1, 1803, 1804, 1805, -1, 1806, 1807, 1808, -1, 1809, 1810, 1811, -1, 1812, 1813, 1814, -1, 1815, 1816, 1817, -1, 1818, 1819, 1820, -1, 1821, 1822, 1823, -1, 1824, 1825, 1826, -1, 1827, 1828, 1829, -1, 1830, 1831, 1832, -1, 1833, 1834, 1835, -1, 1836, 1837, 1838, -1, 1839, 1840, 1841, -1, 1842, 1843, 1844, -1, 1845, 1846, 1847, -1, 1848, 1849, 1850, -1, 1851, 1852, 1853, -1, 1854, 1855, 1856, -1, 1857, 1858, 1859, -1, 1860, 1861, 1862, -1, 1863, 1864, 1865, -1, 1866, 1867, 1868, -1, 1869, 1870, 1871, -1, 1872, 1873, 1874, -1, 1875, 1876, 1877, -1, 1878, 1879, 1880, -1, 1881, 1882, 1883, -1, 1884, 1885, 1886, -1, 1887, 1888, 1889, -1, 1890, 1891, 1892, -1, 1893, 1894, 1895, -1, 1896, 1897, 1898, -1, 1899, 1900, 1901, -1, 1902, 1903, 1904, -1, 1905, 1906, 1907, -1, 1908, 1909, 1910, -1, 1911, 1912, 1913, -1, 1914, 1915, 1916, -1, 1917, 1918, 1919, -1, 1920, 1921, 1922, -1, 1923, 1924, 1925, -1, 1926, 1927, 1928, -1, 1929, 1930, 1931, -1, 1932, 1933, 1934, -1, 1935, 1936, 1937, -1, 1938, 1939, 1940, -1, 1941, 1942, 1943, -1, 1944, 1945, 1946, -1, 1947, 1948, 1949, -1, 1950, 1951, 1952, -1, 1953, 1954, 1955, -1, 1956, 1957, 1958, -1, 1959, 1960, 1961, -1, 1962, 1963, 1964, -1, 1965, 1966, 1967, -1, 1968, 1969, 1970, -1, 1971, 1972, 1973, -1, 1974, 1975, 1976, -1, 1977, 1978, 1979, -1, 1980, 1981, 1982, -1, 1983, 1984, 1985, -1, 1986, 1987, 1988, -1, 1989, 1990, 1991, -1, 1992, 1993, 1994, -1, 1995, 1996, 1997, -1, 1998, 1999, 2000, -1, 2001, 2002, 2003, -1, 2004, 2005, 2006, -1, 2007, 2008, 2009, -1, 2010, 2011, 2012, -1, 2013, 2014, 2015, -1, 2016, 2017, 2018, -1, 2019, 2020, 2021, -1, 2022, 2023, 2024, -1, 2025, 2026, 2027, -1, 2028, 2029, 2030, -1, 2031, 2032, 2033, -1, 2034, 2035, 2036, -1, 2037, 2038, 2039, -1, 2040, 2041, 2042, -1, 2043, 2044, 2045, -1, 2046, 2047, 2048, -1, 2049, 2050, 2051, -1, 2052, 2053, 2054, -1, 2055, 2056, 2057, -1, 2058, 2059, 2060, -1, 2061, 2062, 2063, -1, 2064, 2065, 2066, -1, 2067, 2068, 2069, -1, 2070, 2071, 2072, -1, 2073, 2074, 2075, -1, 2076, 2077, 2078, -1, 2079, 2080, 2081, -1, 2082, 2083, 2084, -1, 2085, 2086, 2087, -1, 2088, 2089, 2090, -1, 2091, 2092, 2093, -1, 2094, 2095, 2096, -1, 2097, 2098, 2099, -1, 2100, 2101, 2102, -1, 2103, 2104, 2105, -1, 2106, 2107, 2108, -1, 2109, 2110, 2111, -1, 2112, 2113, 2114, -1, 2115, 2116, 2117, -1, 2118, 2119, 2120, -1, 2121, 2122, 2123, -1, 2124, 2125, 2126, -1, 2127, 2128, 2129, -1, 2130, 2131, 2132, -1, 2133, 2134, 2135, -1, 2136, 2137, 2138, -1, 2139, 2140, 2141, -1, 2142, 2143, 2144, -1, 2145, 2146, 2147, -1, 2148, 2149, 2150, -1, 2151, 2152, 2153, -1, 2154, 2155, 2156, -1, 2157, 2158, 2159, -1, 2160, 2161, 2162, -1, 2163, 2164, 2165, -1, 2166, 2167, 2168, -1, 2169, 2170, 2171, -1, 2172, 2173, 2174, -1, 2175, 2176, 2177, -1, 2178, 2179, 2180, -1, 2181, 2182, 2183, -1, 2184, 2185, 2186, -1, 2187, 2188, 2189, -1, 2190, 2191, 2192, -1, 2193, 2194, 2195, -1, 2196, 2197, 2198, -1, 2199, 2200, 2201, -1, 2202, 2203, 2204, -1, 2205, 2206, 2207, -1, 2208, 2209, 2210, -1, 2211, 2212, 2213, -1, 2214, 2215, 2216, -1, 2217, 2218, 2219, -1, 2220, 2221, 2222, -1, 2223, 2224, 2225, -1, 2226, 2227, 2228, -1, 2229, 2230, 2231, -1, 2232, 2233, 2234, -1, 2235, 2236, 2237, -1, 2238, 2239, 2240, -1, 2241, 2242, 2243, -1, 2244, 2245, 2246, -1, 2247, 2248, 2249, -1, 2250, 2251, 2252, -1, 2253, 2254, 2255, -1, 2256, 2257, 2258, -1, 2259, 2260, 2261, -1, 2262, 2263, 2264, -1, 2265, 2266, 2267, -1, 2268, 2269, 2270, -1, 2271, 2272, 2273, -1, 2274, 2275, 2276, -1, 2277, 2278, 2279, -1, 2280, 2281, 2282, -1, 2283, 2284, 2285, -1, 2286, 2287, 2288, -1, 2289, 2290, 2291, -1, 2292, 2293, 2294, -1, 2295, 2296, 2297, -1, 2298, 2299, 2300, -1, 2301, 2302, 2303, -1, 2304, 2305, 2306, -1, 2307, 2308, 2309, -1, 2310, 2311, 2312, -1, 2313, 2314, 2315, -1, 2316, 2317, 2318, -1, 2319, 2320, 2321, -1, 2322, 2323, 2324, -1, 2325, 2326, 2327, -1, 2328, 2329, 2330, -1, 2331, 2332, 2333, -1, 2334, 2335, 2336, -1, 2337, 2338, 2339, -1, 2340, 2341, 2342, -1, 2343, 2344, 2345, -1, 2346, 2347, 2348, -1, 2349, 2350, 2351, -1, 2352, 2353, 2354, -1, 2355, 2356, 2357, -1, 2358, 2359, 2360, -1, 2361, 2362, 2363, -1, 2364, 2365, 2366, -1, 2367, 2368, 2369, -1, 2370, 2371, 2372, -1, 2373, 2374, 2375, -1, 2376, 2377, 2378, -1, 2379, 2380, 2381, -1, 2382, 2383, 2384, -1, 2385, 2386, 2387, -1, 2388, 2389, 2390, -1, 2391, 2392, 2393, -1, 2394, 2395, 2396, -1, 2397, 2398, 2399, -1, 2400, 2401, 2402, -1, 2403, 2404, 2405, -1, 2406, 2407, 2408, -1, 2409, 2410, 2411, -1, 2412, 2413, 2414, -1, 2415, 2416, 2417, -1, 2418, 2419, 2420, -1, 2421, 2422, 2423, -1, 2424, 2425, 2426, -1, 2427, 2428, 2429, -1, 2430, 2431, 2432, -1, 2433, 2434, 2435, -1, 2436, 2437, 2438, -1, 2439, 2440, 2441, -1, 2442, 2443, 2444, -1, 2445, 2446, 2447, -1, 2448, 2449, 2450, -1, 2451, 2452, 2453, -1, 2454, 2455, 2456, -1, 2457, 2458, 2459, -1, 2460, 2461, 2462, -1, 2463, 2464, 2465, -1, 2466, 2467, 2468, -1, 2469, 2470, 2471, -1, 2472, 2473, 2474, -1, 2475, 2476, 2477, -1, 2478, 2479, 2480, -1, 2481, 2482, 2483, -1, 2484, 2485, 2486, -1, 2487, 2488, 2489, -1, 2490, 2491, 2492, -1, 2493, 2494, 2495, -1, 2496, 2497, 2498, -1, 2499, 2500, 2501, -1, 2502, 2503, 2504, -1, 2505, 2506, 2507, -1, 2508, 2509, 2510, -1, 2511, 2512, 2513, -1, 2514, 2515, 2516, -1, 2517, 2518, 2519, -1, 2520, 2521, 2522, -1, 2523, 2524, 2525, -1, 2526, 2527, 2528, -1, 2529, 2530, 2531, -1, 2532, 2533, 2534, -1, 2535, 2536, 2537, -1, 2538, 2539, 2540, -1, 2541, 2542, 2543, -1, 2544, 2545, 2546, -1, 2547, 2548, 2549, -1, 2550, 2551, 2552, -1, 2553, 2554, 2555, -1, 2556, 2557, 2558, -1, 2559, 2560, 2561, -1, 2562, 2563, 2564, -1, 2565, 2566, 2567, -1, 2568, 2569, 2570, -1, 2571, 2572, 2573, -1, 2574, 2575, 2576, -1, 2577, 2578, 2579, -1, 2580, 2581, 2582, -1, 2583, 2584, 2585, -1, 2586, 2587, 2588, -1, 2589, 2590, 2591, -1, 2592, 2593, 2594, -1, 2595, 2596, 2597, -1, 2598, 2599, 2600, -1, 2601, 2602, 2603, -1, 2604, 2605, 2606, -1, 2607, 2608, 2609, -1, 2610, 2611, 2612, -1, 2613, 2614, 2615, -1, 2616, 2617, 2618, -1, 2619, 2620, 2621, -1, 2622, 2623, 2624, -1, 2625, 2626, 2627, -1, 2628, 2629, 2630, -1, 2631, 2632, 2633, -1, 2634, 2635, 2636, -1, 2637, 2638, 2639, -1, 2640, 2641, 2642, -1, 2643, 2644, 2645, -1, 2646, 2647, 2648, -1, 2649, 2650, 2651, -1, 2652, 2653, 2654, -1, 2655, 2656, 2657, -1, 2658, 2659, 2660, -1, 2661, 2662, 2663, -1, 2664, 2665, 2666, -1, 2667, 2668, 2669, -1, 2670, 2671, 2672, -1, 2673, 2674, 2675, -1, 2676, 2677, 2678, -1, 2679, 2680, 2681, -1, 2682, 2683, 2684, -1, 2685, 2686, 2687, -1, 2688, 2689, 2690, -1, 2691, 2692, 2693, -1, 2694, 2695, 2696, -1, 2697, 2698, 2699, -1, 2700, 2701, 2702, -1, 2703, 2704, 2705, -1, 2706, 2707, 2708, -1, 2709, 2710, 2711, -1, 2712, 2713, 2714, -1, 2715, 2716, 2717, -1, 2718, 2719, 2720, -1, 2721, 2722, 2723, -1, 2724, 2725, 2726, -1, 2727, 2728, 2729, -1, 2730, 2731, 2732, -1, 2733, 2734, 2735, -1, 2736, 2737, 2738, -1, 2739, 2740, 2741, -1, 2742, 2743, 2744, -1, 2745, 2746, 2747, -1, 2748, 2749, 2750, -1, 2751, 2752, 2753, -1, 2754, 2755, 2756, -1, 2757, 2758, 2759, -1, 2760, 2761, 2762, -1, 2763, 2764, 2765, -1, 2766, 2767, 2768, -1, 2769, 2770, 2771, -1, 2772, 2773, 2774, -1, 2775, 2776, 2777, -1, 2778, 2779, 2780, -1, 2781, 2782, 2783, -1, 2784, 2785, 2786, -1, 2787, 2788, 2789, -1, 2790, 2791, 2792, -1, 2793, 2794, 2795, -1, 2796, 2797, 2798, -1, 2799, 2800, 2801, -1, 2802, 2803, 2804, -1, 2805, 2806, 2807, -1, 2808, 2809, 2810, -1, 2811, 2812, 2813, -1, 2814, 2815, 2816, -1, 2817, 2818, 2819, -1, 2820, 2821, 2822, -1, 2823, 2824, 2825, -1, 2826, 2827, 2828, -1, 2829, 2830, 2831, -1, 2832, 2833, 2834, -1, 2835, 2836, 2837, -1, 2838, 2839, 2840, -1, 2841, 2842, 2843, -1, 2844, 2845, 2846, -1, 2847, 2848, 2849, -1, 2850, 2851, 2852, -1, 2853, 2854, 2855, -1, 2856, 2857, 2858, -1, 2859, 2860, 2861, -1, 2862, 2863, 2864, -1, 2865, 2866, 2867, -1, 2868, 2869, 2870, -1, 2871, 2872, 2873, -1, 2874, 2875, 2876, -1, 2877, 2878, 2879, -1, 2880, 2881, 2882, -1, 2883, 2884, 2885, -1, 2886, 2887, 2888, -1, 2889, 2890, 2891, -1, 2892, 2893, 2894, -1, 2895, 2896, 2897, -1, 2898, 2899, 2900, -1, 2901, 2902, 2903, -1, 2904, 2905, 2906, -1, 2907, 2908, 2909, -1, 2910, 2911, 2912, -1, 2913, 2914, 2915, -1, 2916, 2917, 2918, -1, 2919, 2920, 2921, -1, 2922, 2923, 2924, -1, 2925, 2926, 2927, -1, 2928, 2929, 2930, -1, 2931, 2932, 2933, -1, 2934, 2935, 2936, -1, 2937, 2938, 2939, -1, 2940, 2941, 2942, -1, 2943, 2944, 2945, -1, 2946, 2947, 2948, -1, 2949, 2950, 2951, -1, 2952, 2953, 2954, -1, 2955, 2956, 2957, -1, 2958, 2959, 2960, -1, 2961, 2962, 2963, -1, 2964, 2965, 2966, -1, 2967, 2968, 2969, -1, 2970, 2971, 2972, -1, 2973, 2974, 2975, -1, 2976, 2977, 2978, -1, 2979, 2980, 2981, -1, 2982, 2983, 2984, -1, 2985, 2986, 2987, -1, 2988, 2989, 2990, -1, 2991, 2992, 2993, -1, 2994, 2995, 2996, -1, 2997, 2998, 2999, -1, 3000, 3001, 3002, -1, 3003, 3004, 3005, -1, 3006, 3007, 3008, -1, 3009, 3010, 3011, -1, 3012, 3013, 3014, -1, 3015, 3016, 3017, -1, 3018, 3019, 3020, -1, 3021, 3022, 3023, -1, 3024, 3025, 3026, -1, 3027, 3028, 3029, -1, 3030, 3031, 3032, -1, 3033, 3034, 3035, -1, 3036, 3037, 3038, -1, 3039, 3040, 3041, -1, 3042, 3043, 3044, -1, 3045, 3046, 3047, -1, 3048, 3049, 3050, -1, 3051, 3052, 3053, -1, 3054, 3055, 3056, -1, 3057, 3058, 3059, -1, 3060, 3061, 3062, -1, 3063, 3064, 3065, -1, 3066, 3067, 3068, -1, 3069, 3070, 3071, -1, 3072, 3073, 3074, -1, 3075, 3076, 3077, -1, 3078, 3079, 3080, -1, 3081, 3082, 3083, -1, 3084, 3085, 3086, -1, 3087, 3088, 3089, -1, 3090, 3091, 3092, -1, 3093, 3094, 3095, -1, 3096, 3097, 3098, -1, 3099, 3100, 3101, -1, 3102, 3103, 3104, -1, 3105, 3106, 3107, -1, 3108, 3109, 3110, -1, 3111, 3112, 3113, -1, 3114, 3115, 3116, -1, 3117, 3118, 3119, -1, 3120, 3121, 3122, -1, 3123, 3124, 3125, -1, 3126, 3127, 3128, -1, 3129, 3130, 3131, -1, 3132, 3133, 3134, -1, 3135, 3136, 3137, -1, 3138, 3139, 3140, -1, 3141, 3142, 3143, -1, 3144, 3145, 3146, -1, 3147, 3148, 3149, -1, 3150, 3151, 3152, -1, 3153, 3154, 3155, -1, 3156, 3157, 3158, -1, 3159, 3160, 3161, -1, 3162, 3163, 3164, -1, 3165, 3166, 3167, -1, 3168, 3169, 3170, -1, 3171, 3172, 3173, -1, 3174, 3175, 3176, -1, 3177, 3178, 3179, -1, 3180, 3181, 3182, -1, 3183, 3184, 3185, -1, 3186, 3187, 3188, -1, 3189, 3190, 3191, -1, 3192, 3193, 3194, -1, 3195, 3196, 3197, -1, 3198, 3199, 3200, -1, 3201, 3202, 3203, -1, 3204, 3205, 3206, -1, 3207, 3208, 3209, -1, 3210, 3211, 3212, -1, 3213, 3214, 3215, -1, 3216, 3217, 3218, -1, 3219, 3220, 3221, -1, 3222, 3223, 3224, -1, 3225, 3226, 3227, -1, 3228, 3229, 3230, -1, 3231, 3232, 3233, -1, 3234, 3235, 3236, -1, 3237, 3238, 3239, -1, 3240, 3241, 3242, -1, 3243, 3244, 3245, -1, 3246, 3247, 3248, -1, 3249, 3250, 3251, -1, 3252, 3253, 3254, -1, 3255, 3256, 3257, -1, 3258, 3259, 3260, -1, 3261, 3262, 3263, -1, 3264, 3265, 3266, -1, 3267, 3268, 3269, -1, 3270, 3271, 3272, -1, 3273, 3274, 3275, -1, 3276, 3277, 3278, -1, 3279, 3280, 3281, -1, 3282, 3283, 3284, -1, 3285, 3286, 3287, -1, 3288, 3289, 3290, -1, 3291, 3292, 3293, -1, 3294, 3295, 3296, -1, 3297, 3298, 3299, -1, 3300, 3301, 3302, -1, 3303, 3304, 3305, -1, 3306, 3307, 3308, -1, 3309, 3310, 3311, -1, 3312, 3313, 3314, -1, 3315, 3316, 3317, -1, 3318, 3319, 3320, -1, 3321, 3322, 3323, -1, 3324, 3325, 3326, -1, 3327, 3328, 3329, -1, 3330, 3331, 3332, -1, 3333, 3334, 3335, -1, 3336, 3337, 3338, -1, 3339, 3340, 3341, -1, 3342, 3343, 3344, -1, 3345, 3346, 3347, -1, 3348, 3349, 3350, -1, 3351, 3352, 3353, -1, 3354, 3355, 3356, -1, 3357, 3358, 3359, -1, 3360, 3361, 3362, -1, 3363, 3364, 3365, -1, 3366, 3367, 3368, -1, 3369, 3370, 3371, -1, 3372, 3373, 3374, -1, 3375, 3376, 3377, -1, 3378, 3379, 3380, -1, 3381, 3382, 3383, -1, 3384, 3385, 3386, -1, 3387, 3388, 3389, -1, 3390, 3391, 3392, -1, 3393, 3394, 3395, -1, 3396, 3397, 3398, -1, 3399, 3400, 3401, -1, 3402, 3403, 3404, -1, 3405, 3406, 3407, -1, 3408, 3409, 3410, -1, 3411, 3412, 3413, -1, 3414, 3415, 3416, -1, 3417, 3418, 3419, -1, 3420, 3421, 3422, -1, 3423, 3424, 3425, -1, 3426, 3427, 3428, -1, 3429, 3430, 3431, -1, 3432, 3433, 3434, -1, 3435, 3436, 3437, -1, 3438, 3439, 3440, -1, 3441, 3442, 3443, -1, 3444, 3445, 3446, -1, 3447, 3448, 3449, -1, 3450, 3451, 3452, -1, 3453, 3454, 3455, -1, 3456, 3457, 3458, -1, 3459, 3460, 3461, -1, 3462, 3463, 3464, -1, 3465, 3466, 3467, -1, 3468, 3469, 3470, -1, 3471, 3472, 3473, -1, 3474, 3475, 3476, -1, 3477, 3478, 3479, -1, 3480, 3481, 3482, -1, 3483, 3484, 3485, -1, 3486, 3487, 3488, -1, 3489, 3490, 3491, -1, 3492, 3493, 3494, -1, 3495, 3496, 3497, -1, 3498, 3499, 3500, -1, 3501, 3502, 3503, -1, 3504, 3505, 3506, -1, 3507, 3508, 3509, -1, 3510, 3511, 3512, -1, 3513, 3514, 3515, -1, 3516, 3517, 3518, -1, 3519, 3520, 3521, -1, 3522, 3523, 3524, -1, 3525, 3526, 3527, -1, 3528, 3529, 3530, -1, 3531, 3532, 3533, -1, 3534, 3535, 3536, -1, 3537, 3538, 3539, -1, 3540, 3541, 3542, -1, 3543, 3544, 3545, -1, 3546, 3547, 3548, -1, 3549, 3550, 3551, -1, 3552, 3553, 3554, -1, 3555, 3556, 3557, -1, 3558, 3559, 3560, -1, 3561, 3562, 3563, -1, 3564, 3565, 3566, -1, 3567, 3568, 3569, -1, 3570, 3571, 3572, -1, 3573, 3574, 3575, -1, 3576, 3577, 3578, -1, 3579, 3580, 3581, -1, 3582, 3583, 3584, -1, 3585, 3586, 3587, -1, 3588, 3589, 3590, -1, 3591, 3592, 3593, -1, 3594, 3595, 3596, -1, 3597, 3598, 3599, -1, 3600, 3601, 3602, -1, 3603, 3604, 3605, -1, 3606, 3607, 3608, -1, 3609, 3610, 3611, -1, 3612, 3613, 3614, -1, 3615, 3616, 3617, -1, 3618, 3619, 3620, -1, 3621, 3622, 3623, -1, 3624, 3625, 3626, -1, 3627, 3628, 3629, -1, 3630, 3631, 3632, -1, 3633, 3634, 3635, -1, 3636, 3637, 3638, -1, 3639, 3640, 3641, -1, 3642, 3643, 3644, -1, 3645, 3646, 3647, -1, 3648, 3649, 3650, -1, 3651, 3652, 3653, -1, 3654, 3655, 3656, -1, 3657, 3658, 3659, -1, 3660, 3661, 3662, -1, 3663, 3664, 3665, -1, 3666, 3667, 3668, -1, 3669, 3670, 3671, -1, 3672, 3673, 3674, -1, 3675, 3676, 3677, -1, 3678, 3679, 3680, -1, 3681, 3682, 3683, -1, 3684, 3685, 3686, -1, 3687, 3688, 3689, -1, 3690, 3691, 3692, -1, 3693, 3694, 3695, -1, 3696, 3697, 3698, -1, 3699, 3700, 3701, -1, 3702, 3703, 3704, -1, 3705, 3706, 3707, -1, 3708, 3709, 3710, -1, 3711, 3712, 3713, -1, 3714, 3715, 3716, -1, 3717, 3718, 3719, -1, 3720, 3721, 3722, -1, 3723, 3724, 3725, -1, 3726, 3727, 3728, -1, 3729, 3730, 3731, -1, 3732, 3733, 3734, -1, 3735, 3736, 3737, -1, 3738, 3739, 3740, -1, 3741, 3742, 3743, -1, 3744, 3745, 3746, -1, 3747, 3748, 3749, -1, 3750, 3751, 3752, -1, 3753, 3754, 3755, -1, 3756, 3757, 3758, -1, 3759, 3760, 3761, -1, 3762, 3763, 3764, -1, 3765, 3766, 3767, -1, 3768, 3769, 3770, -1, 3771, 3772, 3773, -1, 3774, 3775, 3776, -1, 3777, 3778, 3779, -1, 3780, 3781, 3782, -1, 3783, 3784, 3785, -1, 3786, 3787, 3788, -1, 3789, 3790, 3791, -1, 3792, 3793, 3794, -1, 3795, 3796, 3797, -1, 3798, 3799, 3800, -1, 3801, 3802, 3803, -1, 3804, 3805, 3806, -1, 3807, 3808, 3809, -1, 3810, 3811, 3812, -1, 3813, 3814, 3815, -1, 3816, 3817, 3818, -1, 3819, 3820, 3821, -1, 3822, 3823, 3824, -1, 3825, 3826, 3827, -1, 3828, 3829, 3830, -1, 3831, 3832, 3833, -1, 3834, 3835, 3836, -1, 3837, 3838, 3839, -1, 3840, 3841, 3842, -1, 3843, 3844, 3845, -1, 3846, 3847, 3848, -1, 3849, 3850, 3851, -1, 3852, 3853, 3854, -1, 3855, 3856, 3857, -1, 3858, 3859, 3860, -1, 3861, 3862, 3863, -1, 3864, 3865, 3866, -1, 3867, 3868, 3869, -1, 3870, 3871, 3872, -1, 3873, 3874, 3875, -1, 3876, 3877, 3878, -1, 3879, 3880, 3881, -1, 3882, 3883, 3884, -1, 3885, 3886, 3887, -1, 3888, 3889, 3890, -1, 3891, 3892, 3893, -1, 3894, 3895, 3896, -1, 3897, 3898, 3899, -1, 3900, 3901, 3902, -1, 3903, 3904, 3905, -1, 3906, 3907, 3908, -1, 3909, 3910, 3911, -1, 3912, 3913, 3914, -1, 3915, 3916, 3917, -1, 3918, 3919, 3920, -1, 3921, 3922, 3923, -1, 3924, 3925, 3926, -1, 3927, 3928, 3929, -1, 3930, 3931, 3932, -1, 3933, 3934, 3935, -1, 3936, 3937, 3938, -1, 3939, 3940, 3941, -1, 3942, 3943, 3944, -1, 3945, 3946, 3947, -1, 3948, 3949, 3950, -1, 3951, 3952, 3953, -1, 3954, 3955, 3956, -1, 3957, 3958, 3959, -1, 3960, 3961, 3962, -1, 3963, 3964, 3965, -1, 3966, 3967, 3968, -1, 3969, 3970, 3971, -1, 3972, 3973, 3974, -1, 3975, 3976, 3977, -1, 3978, 3979, 3980, -1, 3981, 3982, 3983, -1, 3984, 3985, 3986, -1, 3987, 3988, 3989, -1, 3990, 3991, 3992, -1, 3993, 3994, 3995, -1, 3996, 3997, 3998, -1, 3999, 4000, 4001, -1, 4002, 4003, 4004, -1, 4005, 4006, 4007, -1, 4008, 4009, 4010, -1, 4011, 4012, 4013, -1, 4014, 4015, 4016, -1, 4017, 4018, 4019, -1, 4020, 4021, 4022, -1, 4023, 4024, 4025, -1, 4026, 4027, 4028, -1, 4029, 4030, 4031, -1, 4032, 4033, 4034, -1, 4035, 4036, 4037, -1, 4038, 4039, 4040, -1, 4041, 4042, 4043, -1, 4044, 4045, 4046, -1, 4047, 4048, 4049, -1, 4050, 4051, 4052, -1, 4053, 4054, 4055, -1, 4056, 4057, 4058, -1, 4059, 4060, 4061, -1, 4062, 4063, 4064, -1, 4065, 4066, 4067, -1, 4068, 4069, 4070, -1, 4071, 4072, 4073, -1, 4074, 4075, 4076, -1, 4077, 4078, 4079, -1, 4080, 4081, 4082, -1, 4083, 4084, 4085, -1, 4086, 4087, 4088, -1, 4089, 4090, 4091, -1, 4092, 4093, 4094, -1, 4095, 4096, 4097, -1, 4098, 4099, 4100, -1, 4101, 4102, 4103, -1, 4104, 4105, 4106, -1, 4107, 4108, 4109, -1, 4110, 4111, 4112, -1, 4113, 4114, 4115, -1, 4116, 4117, 4118, -1, 4119, 4120, 4121, -1, 4122, 4123, 4124, -1, 4125, 4126, 4127, -1, 4128, 4129, 4130, -1, 4131, 4132, 4133, -1, 4134, 4135, 4136, -1, 4137, 4138, 4139, -1, 4140, 4141, 4142, -1, 4143, 4144, 4145, -1, 4146, 4147, 4148, -1, 4149, 4150, 4151, -1, 4152, 4153, 4154, -1, 4155, 4156, 4157, -1, 4158, 4159, 4160, -1, 4161, 4162, 4163, -1, 4164, 4165, 4166, -1, 4167, 4168, 4169, -1, 4170, 4171, 4172, -1, 4173, 4174, 4175, -1, 4176, 4177, 4178, -1, 4179, 4180, 4181, -1, 4182, 4183, 4184, -1, 4185, 4186, 4187, -1, 4188, 4189, 4190, -1, 4191, 4192, 4193, -1, 4194, 4195, 4196, -1, 4197, 4198, 4199, -1, 4200, 4201, 4202, -1, 4203, 4204, 4205, -1, 4206, 4207, 4208, -1, 4209, 4210, 4211, -1, 4212, 4213, 4214, -1, 4215, 4216, 4217, -1, 4218, 4219, 4220, -1, 4221, 4222, 4223, -1, 4224, 4225, 4226, -1, 4227, 4228, 4229, -1, 4230, 4231, 4232, -1, 4233, 4234, 4235, -1, 4236, 4237, 4238, -1, 4239, 4240, 4241, -1, 4242, 4243, 4244, -1, 4245, 4246, 4247, -1, 4248, 4249, 4250, -1, 4251, 4252, 4253, -1, 4254, 4255, 4256, -1, 4257, 4258, 4259, -1, 4260, 4261, 4262, -1, 4263, 4264, 4265, -1, 4266, 4267, 4268, -1, 4269, 4270, 4271, -1, 4272, 4273, 4274, -1, 4275, 4276, 4277, -1, 4278, 4279, 4280, -1, 4281, 4282, 4283, -1, 4284, 4285, 4286, -1, 4287, 4288, 4289, -1, 4290, 4291, 4292, -1, 4293, 4294, 4295, -1, 4296, 4297, 4298, -1, 4299, 4300, 4301, -1, 4302, 4303, 4304, -1, 4305, 4306, 4307, -1, 4308, 4309, 4310, -1, 4311, 4312, 4313, -1, 4314, 4315, 4316, -1, 4317, 4318, 4319, -1, 4320, 4321, 4322, -1, 4323, 4324, 4325, -1, 4326, 4327, 4328, -1, 4329, 4330, 4331, -1, 4332, 4333, 4334, -1, 4335, 4336, 4337, -1, 4338, 4339, 4340, -1, 4341, 4342, 4343, -1, 4344, 4345, 4346, -1, 4347, 4348, 4349, -1, 4350, 4351, 4352, -1, 4353, 4354, 4355, -1, 4356, 4357, 4358, -1, 4359, 4360, 4361, -1, 4362, 4363, 4364, -1, 4365, 4366, 4367, -1, 4368, 4369, 4370, -1, 4371, 4372, 4373, -1, 4374, 4375, 4376, -1, 4377, 4378, 4379, -1, 4380, 4381, 4382, -1, 4383, 4384, 4385, -1, 4386, 4387, 4388, -1, 4389, 4390, 4391, -1, 4392, 4393, 4394, -1, 4395, 4396, 4397, -1, 4398, 4399, 4400, -1, 4401, 4402, 4403, -1, 4404, 4405, 4406, -1, 4407, 4408, 4409, -1, 4410, 4411, 4412, -1, 4413, 4414, 4415, -1, 4416, 4417, 4418, -1, 4419, 4420, 4421, -1, 4422, 4423, 4424, -1, 4425, 4426, 4427, -1, 4428, 4429, 4430, -1, 4431, 4432, 4433, -1, 4434, 4435, 4436, -1, 4437, 4438, 4439, -1, 4440, 4441, 4442, -1, 4443, 4444, 4445, -1, 4446, 4447, 4448, -1, 4449, 4450, 4451, -1, 4452, 4453, 4454, -1, 4455, 4456, 4457, -1, 4458, 4459, 4460, -1, 4461, 4462, 4463, -1, 4464, 4465, 4466, -1, 4467, 4468, 4469, -1, 4470, 4471, 4472, -1, 4473, 4474, 4475, -1, 4476, 4477, 4478, -1, 4479, 4480, 4481, -1, 4482, 4483, 4484, -1, 4485, 4486, 4487, -1, 4488, 4489, 4490, -1, 4491, 4492, 4493, -1, 4494, 4495, 4496, -1, 4497, 4498, 4499, -1, 4500, 4501, 4502, -1, 4503, 4504, 4505, -1, 4506, 4507, 4508, -1, 4509, 4510, 4511, -1, 4512, 4513, 4514, -1, 4515, 4516, 4517, -1, 4518, 4519, 4520, -1, 4521, 4522, 4523, -1, 4524, 4525, 4526, -1, 4527, 4528, 4529, -1, 4530, 4531, 4532, -1, 4533, 4534, 4535, -1, 4536, 4537, 4538, -1, 4539, 4540, 4541, -1, 4542, 4543, 4544, -1, 4545, 4546, 4547, -1, 4548, 4549, 4550, -1, 4551, 4552, 4553, -1, 4554, 4555, 4556, -1, 4557, 4558, 4559, -1, 4560, 4561, 4562, -1, 4563, 4564, 4565, -1, 4566, 4567, 4568, -1, 4569, 4570, 4571, -1, 4572, 4573, 4574, -1, 4575, 4576, 4577, -1, 4578, 4579, 4580, -1, 4581, 4582, 4583, -1, 4584, 4585, 4586, -1, 4587, 4588, 4589, -1, 4590, 4591, 4592, -1, 4593, 4594, 4595, -1, 4596, 4597, 4598, -1, 4599, 4600, 4601, -1, 4602, 4603, 4604, -1, 4605, 4606, 4607, -1, 4608, 4609, 4610, -1, 4611, 4612, 4613, -1, 4614, 4615, 4616, -1, 4617, 4618, 4619, -1, 4620, 4621, 4622, -1, 4623, 4624, 4625, -1, 4626, 4627, 4628, -1, 4629, 4630, 4631, -1, 4632, 4633, 4634, -1, 4635, 4636, 4637, -1, 4638, 4639, 4640, -1, 4641, 4642, 4643, -1, 4644, 4645, 4646, -1, 4647, 4648, 4649, -1, 4650, 4651, 4652, -1, 4653, 4654, 4655, -1, 4656, 4657, 4658, -1, 4659, 4660, 4661, -1, 4662, 4663, 4664, -1, 4665, 4666, 4667, -1, 4668, 4669, 4670, -1, 4671, 4672, 4673, -1, 4674, 4675, 4676, -1, 4677, 4678, 4679, -1, 4680, 4681, 4682, -1, 4683, 4684, 4685, -1, 4686, 4687, 4688, -1, 4689, 4690, 4691, -1, 4692, 4693, 4694, -1, 4695, 4696, 4697, -1, 4698, 4699, 4700, -1, 4701, 4702, 4703, -1, 4704, 4705, 4706, -1, 4707, 4708, 4709, -1, 4710, 4711, 4712, -1, 4713, 4714, 4715, -1, 4716, 4717, 4718, -1, 4719, 4720, 4721, -1, 4722, 4723, 4724, -1, 4725, 4726, 4727, -1, 4728, 4729, 4730, -1, 4731, 4732, 4733, -1, 4734, 4735, 4736, -1, 4737, 4738, 4739, -1, 4740, 4741, 4742, -1, 4743, 4744, 4745, -1, 4746, 4747, 4748, -1, 4749, 4750, 4751, -1, 4752, 4753, 4754, -1, 4755, 4756, 4757, -1, 4758, 4759, 4760, -1, 4761, 4762, 4763, -1, 4764, 4765, 4766, -1, 4767, 4768, 4769, -1, 4770, 4771, 4772, -1, 4773, 4774, 4775, -1, 4776, 4777, 4778, -1, 4779, 4780, 4781, -1, 4782, 4783, 4784, -1, 4785, 4786, 4787, -1, 4788, 4789, 4790, -1, 4791, 4792, 4793, -1, 4794, 4795, 4796, -1, 4797, 4798, 4799, -1, 4800, 4801, 4802, -1, 4803, 4804, 4805, -1, 4806, 4807, 4808, -1, 4809, 4810, 4811, -1, 4812, 4813, 4814, -1, 4815, 4816, 4817, -1, 4818, 4819, 4820, -1, 4821, 4822, 4823, -1, 4824, 4825, 4826, -1, 4827, 4828, 4829, -1, 4830, 4831, 4832, -1, 4833, 4834, 4835, -1, 4836, 4837, 4838, -1, 4839, 4840, 4841, -1, 4842, 4843, 4844, -1, 4845, 4846, 4847, -1, 4848, 4849, 4850, -1, 4851, 4852, 4853, -1, 4854, 4855, 4856, -1, 4857, 4858, 4859, -1, 4860, 4861, 4862, -1, 4863, 4864, 4865, -1, 4866, 4867, 4868, -1, 4869, 4870, 4871, -1, 4872, 4873, 4874, -1, 4875, 4876, 4877, -1, 4878, 4879, 4880, -1, 4881, 4882, 4883, -1, 4884, 4885, 4886, -1, 4887, 4888, 4889, -1, 4890, 4891, 4892, -1, 4893, 4894, 4895, -1, 4896, 4897, 4898, -1, 4899, 4900, 4901, -1, 4902, 4903, 4904, -1, 4905, 4906, 4907, -1, 4908, 4909, 4910, -1, 4911, 4912, 4913, -1, 4914, 4915, 4916, -1, 4917, 4918, 4919, -1, 4920, 4921, 4922, -1, 4923, 4924, 4925, -1, 4926, 4927, 4928, -1, 4929, 4930, 4931, -1, 4932, 4933, 4934, -1, 4935, 4936, 4937, -1, 4938, 4939, 4940, -1, 4941, 4942, 4943, -1, 4944, 4945, 4946, -1, 4947, 4948, 4949, -1, 4950, 4951, 4952, -1, 4953, 4954, 4955, -1, 4956, 4957, 4958, -1, 4959, 4960, 4961, -1, 4962, 4963, 4964, -1, 4965, 4966, 4967, -1, 4968, 4969, 4970, -1, 4971, 4972, 4973, -1, 4974, 4975, 4976, -1, 4977, 4978, 4979, -1, 4980, 4981, 4982, -1, 4983, 4984, 4985, -1, 4986, 4987, 4988, -1, 4989, 4990, 4991, -1, 4992, 4993, 4994, -1, 4995, 4996, 4997, -1, 4998, 4999, 5000, -1, 5001, 5002, 5003, -1, 5004, 5005, 5006, -1, 5007, 5008, 5009, -1, 5010, 5011, 5012, -1, 5013, 5014, 5015, -1, 5016, 5017, 5018, -1, 5019, 5020, 5021, -1, 5022, 5023, 5024, -1, 5025, 5026, 5027, -1, 5028, 5029, 5030, -1, 5031, 5032, 5033, -1, 5034, 5035, 5036, -1, 5037, 5038, 5039, -1, 5040, 5041, 5042, -1, 5043, 5044, 5045, -1, 5046, 5047, 5048, -1, 5049, 5050, 5051, -1, 5052, 5053, 5054, -1, 5055, 5056, 5057, -1, 5058, 5059, 5060, -1, 5061, 5062, 5063, -1, 5064, 5065, 5066, -1, 5067, 5068, 5069, -1, 5070, 5071, 5072, -1, 5073, 5074, 5075, -1, 5076, 5077, 5078, -1, 5079, 5080, 5081, -1, 5082, 5083, 5084, -1, 5085, 5086, 5087, -1, 5088, 5089, 5090, -1, 5091, 5092, 5093, -1, 5094, 5095, 5096, -1, 5097, 5098, 5099, -1, 5100, 5101, 5102, -1, 5103, 5104, 5105, -1, 5106, 5107, 5108, -1, 5109, 5110, 5111, -1, 5112, 5113, 5114, -1, 5115, 5116, 5117, -1, 5118, 5119, 5120, -1, 5121, 5122, 5123, -1, 5124, 5125, 5126, -1, 5127, 5128, 5129, -1, 5130, 5131, 5132, -1, 5133, 5134, 5135, -1, 5136, 5137, 5138, -1, 5139, 5140, 5141, -1, 5142, 5143, 5144, -1, 5145, 5146, 5147, -1, 5148, 5149, 5150, -1, 5151, 5152, 5153, -1, 5154, 5155, 5156, -1, 5157, 5158, 5159, -1, 5160, 5161, 5162, -1, 5163, 5164, 5165, -1, 5166, 5167, 5168, -1, 5169, 5170, 5171, -1, 5172, 5173, 5174, -1, 5175, 5176, 5177, -1, 5178, 5179, 5180, -1, 5181, 5182, 5183, -1, 5184, 5185, 5186, -1, 5187, 5188, 5189, -1, 5190, 5191, 5192, -1, 5193, 5194, 5195, -1, 5196, 5197, 5198, -1, 5199, 5200, 5201, -1, 5202, 5203, 5204, -1, 5205, 5206, 5207, -1, 5208, 5209, 5210, -1, 5211, 5212, 5213, -1, 5214, 5215, 5216, -1, 5217, 5218, 5219, -1, 5220, 5221, 5222, -1, 5223, 5224, 5225, -1, 5226, 5227, 5228, -1, 5229, 5230, 5231, -1, 5232, 5233, 5234, -1, 5235, 5236, 5237, -1, 5238, 5239, 5240, -1, 5241, 5242, 5243, -1, 5244, 5245, 5246, -1, 5247, 5248, 5249, -1, 5250, 5251, 5252, -1, 5253, 5254, 5255, -1, 5256, 5257, 5258, -1, 5259, 5260, 5261, -1, 5262, 5263, 5264, -1, 5265, 5266, 5267, -1, 5268, 5269, 5270, -1, 5271, 5272, 5273, -1, 5274, 5275, 5276, -1, 5277, 5278, 5279, -1, 5280, 5281, 5282, -1, 5283, 5284, 5285, -1, 5286, 5287, 5288, -1, 5289, 5290, 5291, -1, 5292, 5293, 5294, -1, 5295, 5296, 5297, -1, 5298, 5299, 5300, -1, 5301, 5302, 5303, -1, 5304, 5305, 5306, -1, 5307, 5308, 5309, -1, 5310, 5311, 5312, -1, 5313, 5314, 5315, -1, 5316, 5317, 5318, -1, 5319, 5320, 5321, -1, 5322, 5323, 5324, -1, 5325, 5326, 5327, -1, 5328, 5329, 5330, -1, 5331, 5332, 5333, -1, 5334, 5335, 5336, -1, 5337, 5338, 5339, -1, 5340, 5341, 5342, -1, 5343, 5344, 5345, -1, 5346, 5347, 5348, -1, 5349, 5350, 5351, -1, 5352, 5353, 5354, -1, 5355, 5356, 5357, -1, 5358, 5359, 5360, -1, 5361, 5362, 5363, -1, 5364, 5365, 5366, -1, 5367, 5368, 5369, -1, 5370, 5371, 5372, -1, 5373, 5374, 5375, -1, 5376, 5377, 5378, -1, 5379, 5380, 5381, -1, 5382, 5383, 5384, -1, 5385, 5386, 5387, -1, 5388, 5389, 5390, -1, 5391, 5392, 5393, -1, 5394, 5395, 5396, -1, 5397, 5398, 5399, -1, 5400, 5401, 5402, -1, 5403, 5404, 5405, -1, 5406, 5407, 5408, -1, 5409, 5410, 5411, -1, 5412, 5413, 5414, -1, 5415, 5416, 5417, -1, 5418, 5419, 5420, -1, 5421, 5422, 5423, -1, 5424, 5425, 5426, -1, 5427, 5428, 5429, -1, 5430, 5431, 5432, -1, 5433, 5434, 5435, -1, 5436, 5437, 5438, -1, 5439, 5440, 5441, -1, 5442, 5443, 5444, -1, 5445, 5446, 5447, -1, 5448, 5449, 5450, -1, 5451, 5452, 5453, -1, 5454, 5455, 5456, -1, 5457, 5458, 5459, -1, 5460, 5461, 5462, -1, 5463, 5464, 5465, -1, 5466, 5467, 5468, -1, 5469, 5470, 5471, -1, 5472, 5473, 5474, -1, 5475, 5476, 5477, -1, 5478, 5479, 5480, -1, 5481, 5482, 5483, -1, 5484, 5485, 5486, -1, 5487, 5488, 5489, -1, 5490, 5491, 5492, -1, 5493, 5494, 5495, -1, 5496, 5497, 5498, -1, 5499, 5500, 5501, -1, 5502, 5503, 5504, -1, 5505, 5506, 5507, -1, 5508, 5509, 5510, -1, 5511, 5512, 5513, -1, 5514, 5515, 5516, -1, 5517, 5518, 5519, -1, 5520, 5521, 5522, -1, 5523, 5524, 5525, -1, 5526, 5527, 5528, -1, 5529, 5530, 5531, -1, 5532, 5533, 5534, -1, 5535, 5536, 5537, -1, 5538, 5539, 5540, -1, 5541, 5542, 5543, -1, 5544, 5545, 5546, -1, 5547, 5548, 5549, -1, 5550, 5551, 5552, -1, 5553, 5554, 5555, -1, 5556, 5557, 5558, -1, 5559, 5560, 5561, -1, 5562, 5563, 5564, -1, 5565, 5566, 5567, -1, 5568, 5569, 5570, -1, 5571, 5572, 5573, -1, 5574, 5575, 5576, -1, 5577, 5578, 5579, -1, 5580, 5581, 5582, -1, 5583, 5584, 5585, -1, 5586, 5587, 5588, -1, 5589, 5590, 5591, -1, 5592, 5593, 5594, -1, 5595, 5596, 5597, -1, 5598, 5599, 5600, -1, 5601, 5602, 5603, -1, 5604, 5605, 5606, -1, 5607, 5608, 5609, -1, 5610, 5611, 5612, -1, 5613, 5614, 5615, -1, 5616, 5617, 5618, -1, 5619, 5620, 5621, -1, 5622, 5623, 5624, -1, 5625, 5626, 5627, -1, 5628, 5629, 5630, -1, 5631, 5632, 5633, -1, 5634, 5635, 5636, -1, 5637, 5638, 5639, -1, 5640, 5641, 5642, -1, 5643, 5644, 5645, -1, 5646, 5647, 5648, -1, 5649, 5650, 5651, -1, 5652, 5653, 5654, -1, 5655, 5656, 5657, -1, 5658, 5659, 5660, -1, 5661, 5662, 5663, -1, 5664, 5665, 5666, -1, 5667, 5668, 5669, -1, 5670, 5671, 5672, -1, 5673, 5674, 5675, -1, 5676, 5677, 5678, -1, 5679, 5680, 5681, -1, 5682, 5683, 5684, -1, 5685, 5686, 5687, -1, 5688, 5689, 5690, -1, 5691, 5692, 5693, -1, 5694, 5695, 5696, -1, 5697, 5698, 5699, -1, 5700, 5701, 5702, -1, 5703, 5704, 5705, -1, 5706, 5707, 5708, -1, 5709, 5710, 5711, -1, 5712, 5713, 5714, -1, 5715, 5716, 5717, -1, 5718, 5719, 5720, -1, 5721, 5722, 5723, -1, 5724, 5725, 5726, -1, 5727, 5728, 5729, -1, 5730, 5731, 5732, -1, 5733, 5734, 5735, -1, 5736, 5737, 5738, -1, 5739, 5740, 5741, -1, 5742, 5743, 5744, -1, 5745, 5746, 5747, -1, 5748, 5749, 5750, -1, 5751, 5752, 5753, -1, 5754, 5755, 5756, -1, 5757, 5758, 5759, -1, 5760, 5761, 5762, -1, 5763, 5764, 5765, -1, 5766, 5767, 5768, -1, 5769, 5770, 5771, -1, 5772, 5773, 5774, -1, 5775, 5776, 5777, -1, 5778, 5779, 5780, -1, 5781, 5782, 5783, -1, 5784, 5785, 5786, -1, 5787, 5788, 5789, -1, 5790, 5791, 5792, -1, 5793, 5794, 5795, -1, 5796, 5797, 5798, -1, 5799, 5800, 5801, -1, 5802, 5803, 5804, -1, 5805, 5806, 5807, -1, 5808, 5809, 5810, -1, 5811, 5812, 5813, -1, 5814, 5815, 5816, -1, 5817, 5818, 5819, -1, 5820, 5821, 5822, -1, 5823, 5824, 5825, -1, 5826, 5827, 5828, -1, 5829, 5830, 5831, -1, 5832, 5833, 5834, -1, 5835, 5836, 5837, -1, 5838, 5839, 5840, -1, 5841, 5842, 5843, -1, 5844, 5845, 5846, -1, 5847, 5848, 5849, -1, 5850, 5851, 5852, -1, 5853, 5854, 5855, -1, 5856, 5857, 5858, -1, 5859, 5860, 5861, -1 + ] + creaseAngle 1 + } + } + ] + } + } + ] + name "solid" +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 06d253fab3b..96aea9ba9d9 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -18,7 +18,7 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); - webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - // webotsView.loadProto("protos/ProtoMesh.proto"); + // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); + webotsView.loadProto("protos/ProtoHinge.proto"); From 7b5a3a893f5ee7ddc808949418717d560cc5341e Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Wed, 12 Oct 2022 16:19:39 +0200 Subject: [PATCH 02/20] rotational motor --- resources/web/wwi/Parser.js | 30 +++++++++++++------ resources/web/wwi/nodes/WbBrake.js | 5 ++++ resources/web/wwi/nodes/WbHingeJoint.js | 1 - resources/web/wwi/nodes/WbMotor.js | 19 ++++++++++++ resources/web/wwi/nodes/WbPositionSensor.js | 5 ++++ resources/web/wwi/nodes/WbRotationalMotor.js | 5 ++++ .../wwi/protoDesigner/classes/FieldModel.js | 8 +++-- resources/web/wwi/protos/ProtoHinge.proto | 7 +++++ 8 files changed, 68 insertions(+), 12 deletions(-) create mode 100644 resources/web/wwi/nodes/WbBrake.js create mode 100644 resources/web/wwi/nodes/WbMotor.js create mode 100644 resources/web/wwi/nodes/WbPositionSensor.js create mode 100644 resources/web/wwi/nodes/WbRotationalMotor.js diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 6b1324a9eeb..55f7d606328 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -4,6 +4,7 @@ import WbAppearance from './nodes/WbAppearance.js'; import WbBackground from './nodes/WbBackground.js'; import WbBillboard from './nodes/WbBillboard.js'; import WbBox from './nodes/WbBox.js'; +import WbBrake from './nodes/WbBrake.js'; import WbCapsule from './nodes/WbCapsule.js'; import WbCadShape from './nodes/WbCadShape.js'; import WbCone from './nodes/WbCone.js'; @@ -20,9 +21,10 @@ import WbIndexedFaceSet from './nodes/WbIndexedFaceSet.js'; import WbIndexedLineSet from './nodes/WbIndexedLineSet.js'; import WbJoint from './nodes/WbJoint.js'; import WbLight from './nodes/WbLight.js'; -import WbLogicalDevice from './nodes/WbLogicalDevice.js'; +import WbPositionSensor from './nodes/WbPositionSensor.js'; import WbMaterial from './nodes/WbMaterial.js'; import WbMesh from './nodes/WbMesh.js'; +import WbRotationalMotor from './nodes/WbRotationalMotor.js'; import WbPbrAppearance from './nodes/WbPbrAppearance.js'; import WbPlane from './nodes/WbPlane.js'; import WbPointLight from './nodes/WbPointLight.js'; @@ -167,8 +169,8 @@ export default class Parser { result = this.#parseHingeJoint(node, parentNode); else if (node.tagName === 'HingeJointParameters') result = this.#parseHingeJointParameters(node, parentNode); - else if (node.tagName === 'PositionSensor') - result = this.#parsePositionSensor(node, parentNode); + else if (node.tagName === 'PositionSensor' || node.tagName === 'Brake' || node.tagName === 'RotationalMotor') + result = this.#parseLogicalDevice(node, parentNode); else if (node.tagName === 'Billboard') result = this.#parseBillboard(node, parentNode); else if (node.tagName === 'Group') @@ -607,20 +609,30 @@ export default class Parser { return hingeJointParameters; } - #parsePositionSensor(node, parentNode) { + #parseLogicalDevice(node, parentNode) { const id = this.#parseId(node); const name = getNodeAttribute(node, 'name', ''); - const positionSensor = new WbLogicalDevice(id, name); - WbWorld.instance.nodes.set(positionSensor.id, positionSensor); + let logicalDevice; + if (node.tagName === 'PositionSensor') + logicalDevice = new WbPositionSensor(id, name); + else if (node.tagName === 'Brake') + logicalDevice = new WbBrake(id, name); + else if (node.tagName === 'RotationalMotor') { + const minPosition = parseFloat(getNodeAttribute(node, 'minPosition', '0')); + const maxPosition = parseFloat(getNodeAttribute(node, 'maxPosition', '0')); + logicalDevice = new WbRotationalMotor(id, name, minPosition, maxPosition); + } + + WbWorld.instance.nodes.set(logicalDevice.id, logicalDevice); if (typeof parentNode !== 'undefined') { - positionSensor.parent = parentNode.id; - parentNode.device.push(positionSensor); + logicalDevice.parent = parentNode.id; + parentNode.device.push(logicalDevice); } - return positionSensor; + return logicalDevice; } #parseShape(node, parentNode, isBoundingObject) { diff --git a/resources/web/wwi/nodes/WbBrake.js b/resources/web/wwi/nodes/WbBrake.js new file mode 100644 index 00000000000..936b0ff4d9d --- /dev/null +++ b/resources/web/wwi/nodes/WbBrake.js @@ -0,0 +1,5 @@ +import WbLogicalDevice from './WbLogicalDevice.js'; + +// This class is used to retrieve the type of device present in the joint +export default class WbBrake extends WbLogicalDevice { +} diff --git a/resources/web/wwi/nodes/WbHingeJoint.js b/resources/web/wwi/nodes/WbHingeJoint.js index bea3a53772a..e23b79d4a25 100644 --- a/resources/web/wwi/nodes/WbHingeJoint.js +++ b/resources/web/wwi/nodes/WbHingeJoint.js @@ -17,7 +17,6 @@ export default class WbHingeJoint extends WbJoint { preFinalize() { super.preFinalize(); - this.device.forEach(child => child.preFinalize()); } diff --git a/resources/web/wwi/nodes/WbMotor.js b/resources/web/wwi/nodes/WbMotor.js new file mode 100644 index 00000000000..f268dd948de --- /dev/null +++ b/resources/web/wwi/nodes/WbMotor.js @@ -0,0 +1,19 @@ +import WbLogicalDevice from './WbLogicalDevice.js'; + +export default class WbMotor extends WbLogicalDevice { + #minPosition; + #maxPosition; + constructor(id, deviceName, minPosition, maxPosition) { + super(id, deviceName); + this.#minPosition = minPosition; + this.#maxPosition = maxPosition; + } + + get minPosition() { + return this.#minPosition; + } + + get maxPosition() { + return this.#maxPosition; + } +} diff --git a/resources/web/wwi/nodes/WbPositionSensor.js b/resources/web/wwi/nodes/WbPositionSensor.js new file mode 100644 index 00000000000..fbefc1ca89d --- /dev/null +++ b/resources/web/wwi/nodes/WbPositionSensor.js @@ -0,0 +1,5 @@ +import WbLogicalDevice from './WbLogicalDevice.js'; + +// This class is used to retrieve the type of device present in the joint +export default class WbPositionSensor extends WbLogicalDevice { +} diff --git a/resources/web/wwi/nodes/WbRotationalMotor.js b/resources/web/wwi/nodes/WbRotationalMotor.js new file mode 100644 index 00000000000..5197b71895e --- /dev/null +++ b/resources/web/wwi/nodes/WbRotationalMotor.js @@ -0,0 +1,5 @@ +import WbMotor from './WbMotor.js'; + +// This class is used to retrieve the type of device present in the joint +export default class WbRotationalMotor extends WbMotor { +} diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 0b7545754a3..9a258e23461 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -17,6 +17,10 @@ export const FieldModel = { 'supported': {'size': VRML.SFVec3f}, 'unsupported': {} }, + 'Brake': { + 'supported': {'name': VRML.SFString}, + 'unsupported': {} + }, 'CadShape': { 'supported': {'url': VRML.MFString, 'ccw': VRML.SFBool, 'castShadows': VRML.SFBool, 'isPickable': VRML.SFBool}, 'unsupported': {} @@ -130,8 +134,8 @@ export const FieldModel = { 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, 'RotationalMotor': { - 'supported': {}, - 'unsupported': {'name': VRML.SFString, 'acceleration': VRML.SFFloat, 'consumptionFactor': VRML.SFFloat, 'controlPID': VRML.SFVec3f, 'maxVelocity': VRML.SFFloat, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat, 'maxTorque': VRML.SFFloat, 'multiplier': VRML.SFFloat, 'sound': VRML.SFString, 'muscles': VRML.MFNode} + 'supported': {'name': VRML.SFString, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat}, + 'unsupported': {'acceleration': VRML.SFFloat, 'consumptionFactor': VRML.SFFloat, 'controlPID': VRML.SFVec3f, 'maxVelocity': VRML.SFFloat, 'maxTorque': VRML.SFFloat, 'multiplier': VRML.SFFloat, 'sound': VRML.SFString, 'muscles': VRML.MFNode} }, 'Shape': { 'supported': {'appearance': VRML.SFNode, 'geometry': VRML.SFNode, 'castShadows': VRML.SFBool, 'isPickable': VRML.SFBool}, diff --git a/resources/web/wwi/protos/ProtoHinge.proto b/resources/web/wwi/protos/ProtoHinge.proto index 8dc0f693f5a..ee72c924751 100644 --- a/resources/web/wwi/protos/ProtoHinge.proto +++ b/resources/web/wwi/protos/ProtoHinge.proto @@ -14,6 +14,13 @@ Robot { maxStop 2 } device [ + Brake { + name "mybrake" + } + RotationalMotor { + minPosition -1 + maxPosition 1.5078 + } PositionSensor { name "position sensorsssss" } From d977c14a7b0aa2afbde82d54477460adab54146a Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Wed, 12 Oct 2022 17:13:08 +0200 Subject: [PATCH 03/20] linear motor, sliderjoint --- resources/web/wwi/Parser.js | 67 ++++++++++++------- resources/web/wwi/nodes/WbLinearMotor.js | 5 ++ resources/web/wwi/nodes/WbSliderJoint.js | 38 +++++++++++ .../wwi/protoDesigner/classes/FieldModel.js | 4 ++ resources/web/wwi/protos/ProtoSlider.proto | 46 +++++++++++++ resources/web/wwi/test.html | 2 +- 6 files changed, 136 insertions(+), 26 deletions(-) create mode 100644 resources/web/wwi/nodes/WbLinearMotor.js create mode 100644 resources/web/wwi/nodes/WbSliderJoint.js create mode 100644 resources/web/wwi/protos/ProtoSlider.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 55f7d606328..93125536801 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -20,21 +20,24 @@ import WbImageTexture from './nodes/WbImageTexture.js'; import WbIndexedFaceSet from './nodes/WbIndexedFaceSet.js'; import WbIndexedLineSet from './nodes/WbIndexedLineSet.js'; import WbJoint from './nodes/WbJoint.js'; +import WbJoinParameters from './nodes/WbJointParameters.js'; import WbLight from './nodes/WbLight.js'; -import WbPositionSensor from './nodes/WbPositionSensor.js'; +import WbLinearMotor from './nodes/WbLinearMotor.js'; import WbMaterial from './nodes/WbMaterial.js'; import WbMesh from './nodes/WbMesh.js'; -import WbRotationalMotor from './nodes/WbRotationalMotor.js'; +import WbPositionSensor from './nodes/WbPositionSensor.js'; import WbPbrAppearance from './nodes/WbPbrAppearance.js'; import WbPlane from './nodes/WbPlane.js'; import WbPointLight from './nodes/WbPointLight.js'; import WbPointSet from './nodes/WbPointSet.js'; +import WbRotationalMotor from './nodes/WbRotationalMotor.js'; import WbScene from './nodes/WbScene.js'; import WbShape from './nodes/WbShape.js'; import WbSlot from './nodes/WbSlot.js'; import WbSolid from './nodes/WbSolid.js'; import WbSphere from './nodes/WbSphere.js'; import WbSpotLight from './nodes/WbSpotLight.js'; +import WbSliderJoint from './nodes/WbSliderJoint.js'; import WbTextureTransform from './nodes/WbTextureTransform.js'; import WbTrack from './nodes/WbTrack.js'; import WbTrackWheel from './nodes/WbTrackWheel.js'; @@ -165,11 +168,12 @@ export default class Parser { result = this.#parseBackground(node); else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid') result = this.#parseTransform(node, parentNode, isBoundingObject); - else if (node.tagName === 'HingeJoint') - result = this.#parseHingeJoint(node, parentNode); - else if (node.tagName === 'HingeJointParameters') - result = this.#parseHingeJointParameters(node, parentNode); - else if (node.tagName === 'PositionSensor' || node.tagName === 'Brake' || node.tagName === 'RotationalMotor') + else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint') + result = this.#parseJoint(node, parentNode); + else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters') + result = this.#parseJointParameters(node, parentNode); + else if (node.tagName === 'PositionSensor' || node.tagName === 'Brake' || node.tagName === 'RotationalMotor' || + node.tagName === 'LinearMotor') result = this.#parseLogicalDevice(node, parentNode); else if (node.tagName === 'Billboard') result = this.#parseBillboard(node, parentNode); @@ -570,43 +574,53 @@ export default class Parser { return slot; } - #parseHingeJoint(node, parentNode) { + #parseJoint(node, parentNode) { const id = this.#parseId(node); - const parameters = undefined; - const hingeJoint = new WbHingeJoint(id, parameters); - WbWorld.instance.nodes.set(hingeJoint.id, hingeJoint); - this.#parseChildren(node, hingeJoint); + let joint; + if (node.tagName === 'HingeJoint') + joint = new WbHingeJoint(id); + else if (node.tagName === 'SliderJoint') + joint = new WbSliderJoint(id); + + WbWorld.instance.nodes.set(joint.id, joint); + this.#parseChildren(node, joint); if (typeof parentNode !== 'undefined') { - hingeJoint.parent = parentNode.id; + joint.parent = parentNode.id; if (parentNode instanceof WbSlot || parentNode instanceof WbJoint) - parentNode.endPoint = hingeJoint; + parentNode.endPoint = joint; else - parentNode.children.push(hingeJoint); + parentNode.children.push(joint); } - return hingeJoint; + return joint; } - #parseHingeJointParameters(node, parentNode) { + #parseJointParameters(node, parentNode) { const id = this.#parseId(node); const position = parseFloat(getNodeAttribute(node, 'position', '0')); - const axis = convertStringToVec3(getNodeAttribute(node, 'axis', '1 0 0')); const anchor = convertStringToVec3(getNodeAttribute(node, 'anchor', '0 0 0')); const minStop = parseFloat(getNodeAttribute(node, 'minStop', '0')); const maxStop = parseFloat(getNodeAttribute(node, 'maxStop', '0')); - const hingeJointParameters = new WbHingeJointParameters(id, position, axis, anchor, minStop, maxStop); - WbWorld.instance.nodes.set(hingeJointParameters.id, hingeJointParameters); + let jointParameters; + if (node.tagName === 'JointParameters') { + const axis = convertStringToVec3(getNodeAttribute(node, 'axis', '0 0 1')); + jointParameters = new WbJoinParameters(id, position, axis, minStop, maxStop); + } else if (node.tagName === 'HingeJointParameters') { + const axis = convertStringToVec3(getNodeAttribute(node, 'axis', '1 0 0')); + jointParameters = new WbHingeJointParameters(id, position, axis, anchor, minStop, maxStop); + } + WbWorld.instance.nodes.set(jointParameters.id, jointParameters); if (typeof parentNode !== 'undefined') { - hingeJointParameters.parent = parentNode.id; - parentNode.jointParameters = hingeJointParameters; + jointParameters.parent = parentNode.id; + parentNode.jointParameters = jointParameters; } - return hingeJointParameters; + return jointParameters; } #parseLogicalDevice(node, parentNode) { @@ -619,10 +633,13 @@ export default class Parser { logicalDevice = new WbPositionSensor(id, name); else if (node.tagName === 'Brake') logicalDevice = new WbBrake(id, name); - else if (node.tagName === 'RotationalMotor') { + else if (node.tagName === 'RotationalMotor' || node.tagName === 'LinearMotor') { const minPosition = parseFloat(getNodeAttribute(node, 'minPosition', '0')); const maxPosition = parseFloat(getNodeAttribute(node, 'maxPosition', '0')); - logicalDevice = new WbRotationalMotor(id, name, minPosition, maxPosition); + if (node.tagName === 'RotationalMotor') + logicalDevice = new WbRotationalMotor(id, name, minPosition, maxPosition); + else + logicalDevice = new WbLinearMotor(id, name, minPosition, maxPosition); } WbWorld.instance.nodes.set(logicalDevice.id, logicalDevice); diff --git a/resources/web/wwi/nodes/WbLinearMotor.js b/resources/web/wwi/nodes/WbLinearMotor.js new file mode 100644 index 00000000000..5fae44f2aa4 --- /dev/null +++ b/resources/web/wwi/nodes/WbLinearMotor.js @@ -0,0 +1,5 @@ +import WbMotor from './WbMotor.js'; + +// This class is used to retrieve the type of device present in the joint +export default class WbLinearMotor extends WbMotor { +} diff --git a/resources/web/wwi/nodes/WbSliderJoint.js b/resources/web/wwi/nodes/WbSliderJoint.js new file mode 100644 index 00000000000..6a955dbe2b8 --- /dev/null +++ b/resources/web/wwi/nodes/WbSliderJoint.js @@ -0,0 +1,38 @@ +import WbJoint from './WbJoint.js'; + +export default class WbSliderJoint extends WbJoint { + #device; + constructor(id) { + super(id); + this.#device = []; + } + + get device() { + return this.#device; + } + + set device(device) { + return this.#device; + } + + preFinalize() { + super.preFinalize(); + this.device.forEach(child => child.preFinalize()); + } + + postFinalize() { + super.postFinalize(); + + this.device.forEach(child => child.postFinalize()); + } + + delete() { + let index = this.device.length - 1; + while (index >= 0) { + this.device[index].delete(); + --index; + } + + super.delete(); + } +} diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 9a258e23461..83f13ca2e42 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -97,6 +97,10 @@ export const FieldModel = { 'supported': {}, 'unsupported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'lookupTable': VRML.MFVec3f, 'colorFilter': VRML.SFColor, 'occlusion': VRML.SFBool, 'resolution': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, + 'LinearMotor': { + 'supported': {'name': VRML.SFString, 'acceleration': VRML.SFFloat, 'consumptionFactor': VRML.SFFloat, 'controlPID': VRML.Vec3f, 'maxVelocity': VRML.SFFloat, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat, 'maxForce': VRML.SFFloat, 'multiplier': VRML.SFFloat, 'sound': VRML.SFString, 'muscles': VRML.MFNode}, + 'unsupported': {} + }, 'Material': { 'supported': {'ambientIntensity': VRML.SFFloat, 'diffuseColor': VRML.SFColor, 'emissiveColor': VRML.SFColor, 'shininess': VRML.SFFloat, 'specularColor': VRML.SFColor, 'transparency': VRML.SFFloat}, 'unsupported': {} diff --git a/resources/web/wwi/protos/ProtoSlider.proto b/resources/web/wwi/protos/ProtoSlider.proto new file mode 100644 index 00000000000..d7d224f5e61 --- /dev/null +++ b/resources/web/wwi/protos/ProtoSlider.proto @@ -0,0 +1,46 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoHinge [ +] +{ +Robot { + children [ + SliderJoint { + jointParameters JointParameters { + position 0.1 + axis 0 0 1.1 + minStop -1 + maxStop 2 + } + device [ + Brake { + name "krrrrr" + } + LinearMotor { + name "ahead" + minPosition -1 + maxPosition 1 + } + PositionSensor { + name "bip" + } + ] + endPoint Solid { + translation 0 0 0.1 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.5 0.5 0.9 + } + geometry Cone { + bottomRadius 0.05 + height 0.1 + } + } + ] + } + } + ] + name "solid" +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 96aea9ba9d9..6ac13745d3c 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoHinge.proto"); + webotsView.loadProto("protos/ProtoSlider.proto"); From 1efbd6f56f655dae4b5be8cf7f1ee29322353c4a Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 09:42:56 +0200 Subject: [PATCH 04/20] hinge2 with no device distinction --- resources/web/wwi/Parser.js | 14 ++++- resources/web/wwi/nodes/WbHinge2Joint.js | 51 ++++++++++++++++++ resources/web/wwi/nodes/WbHingeJoint.js | 8 +-- .../wwi/protoDesigner/classes/FieldModel.js | 4 ++ .../wwi/protoDesigner/classes/ProtoParser.js | 1 + resources/web/wwi/protos/ProtoHinge2.proto | 52 +++++++++++++++++++ resources/web/wwi/test.html | 2 +- 7 files changed, 125 insertions(+), 7 deletions(-) create mode 100644 resources/web/wwi/nodes/WbHinge2Joint.js create mode 100644 resources/web/wwi/protos/ProtoHinge2.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 93125536801..e7b8cb1cdc6 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -16,6 +16,7 @@ import WbGeometry from './nodes/WbGeometry.js'; import WbGroup from './nodes/WbGroup.js'; import WbHingeJoint from './nodes/WbHingeJoint.js'; import WbHingeJointParameters from './nodes/WbHingeJointParameters.js'; +import WbHinge2Joint from './nodes/WbHinge2Joint.js'; import WbImageTexture from './nodes/WbImageTexture.js'; import WbIndexedFaceSet from './nodes/WbIndexedFaceSet.js'; import WbIndexedLineSet from './nodes/WbIndexedLineSet.js'; @@ -54,6 +55,7 @@ import {getAnId} from './nodes/utils/id_provider.js'; import DefaultUrl from './DefaultUrl.js'; import {webots} from './webots.js'; import {loadImageTextureInWren, loadTextureData} from './image_loader.js'; + /* This module takes an x3d world, parse it and populate the scene. */ @@ -168,7 +170,7 @@ export default class Parser { result = this.#parseBackground(node); else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid') result = this.#parseTransform(node, parentNode, isBoundingObject); - else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint') + else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint') result = this.#parseJoint(node, parentNode); else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters') result = this.#parseJointParameters(node, parentNode); @@ -582,6 +584,8 @@ export default class Parser { joint = new WbHingeJoint(id); else if (node.tagName === 'SliderJoint') joint = new WbSliderJoint(id); + else if (node.tagName === 'Hinge2Joint') + joint = new WbHinge2Joint(id); WbWorld.instance.nodes.set(joint.id, joint); this.#parseChildren(node, joint); @@ -616,8 +620,14 @@ export default class Parser { WbWorld.instance.nodes.set(jointParameters.id, jointParameters); if (typeof parentNode !== 'undefined') { + if (parentNode instanceof WbHinge2Joint) { + if (jointParameters instanceof WbHingeJointParameters) + parentNode.jointParameters = jointParameters; + else + parentNode.jointParameters2 = jointParameters; + } else + parentNode.jointParameters = jointParameters; jointParameters.parent = parentNode.id; - parentNode.jointParameters = jointParameters; } return jointParameters; diff --git a/resources/web/wwi/nodes/WbHinge2Joint.js b/resources/web/wwi/nodes/WbHinge2Joint.js new file mode 100644 index 00000000000..755611757e7 --- /dev/null +++ b/resources/web/wwi/nodes/WbHinge2Joint.js @@ -0,0 +1,51 @@ +import WbHingeJoint from './WbHingeJoint.js'; + +export default class WbHinge2Joint extends WbHingeJoint { + #device2; + #jointParameters2; + constructor(id) { + super(id); + this.#device2 = []; + } + + get device2() { + return this.#device2; + } + + set device2(device) { + return this.#device2; + } + + get jointParameters2() { + return this.#jointParameters2; + } + + set jointParameters2(jointParameters) { + this.#jointParameters2 = jointParameters; + } + + preFinalize() { + super.preFinalize(); + this.#device2.forEach(child => child.preFinalize()); + this.#jointParameters2?.preFinalize(); + } + + postFinalize() { + super.postFinalize(); + + this.#device2.forEach(child => child.postFinalize()); + this.#jointParameters2?.postFinalize(); + } + + delete() { + let index = this.#device2.length - 1; + while (index >= 0) { + this.#device2[index].delete(); + --index; + } + + this.#jointParameters2?.delete(); + + super.delete(); + } +} diff --git a/resources/web/wwi/nodes/WbHingeJoint.js b/resources/web/wwi/nodes/WbHingeJoint.js index e23b79d4a25..e69e3e55f39 100644 --- a/resources/web/wwi/nodes/WbHingeJoint.js +++ b/resources/web/wwi/nodes/WbHingeJoint.js @@ -17,19 +17,19 @@ export default class WbHingeJoint extends WbJoint { preFinalize() { super.preFinalize(); - this.device.forEach(child => child.preFinalize()); + this.#device.forEach(child => child.preFinalize()); } postFinalize() { super.postFinalize(); - this.device.forEach(child => child.postFinalize()); + this.#device.forEach(child => child.postFinalize()); } delete() { - let index = this.device.length - 1; + let index = this.#device.length - 1; while (index >= 0) { - this.device[index].delete(); + this.#device[index].delete(); --index; } diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 83f13ca2e42..30cc6160f8f 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -69,6 +69,10 @@ export const FieldModel = { 'supported': {'endPoint': VRML.SFNode, 'jointParameters': VRML.SFNode, 'device': VRML.MFNode, 'position': VRML.SFFloat}, 'unsupported': {} }, + 'Hinge2Joint': { + 'supported': {'endPoint': VRML.SFNode, 'jointParameters': VRML.SFNode, 'jointParameters2': VRML.SFNode, 'device': VRML.MFNode, 'device2': VRML.MFNode, 'position': VRML.SFFloat, 'position2': VRML.SFFloat}, + 'unsupported': {} + }, 'HingeJointParameters': { 'supported': {'position': VRML.SFFloat, 'axis': VRML.SFVec3f, 'anchor': VRML.SFVec3f, 'minStop': VRML.SFFloat, 'maxStop': VRML.SFFloat}, 'unsupported': {'springConstant': VRML.SFFloat, 'dampingConstant': VRML.SFFloat, 'staticFriction': VRML.SFFloat, 'suspensionSpringConstant': VRML.SFFloat, 'suspensionDampingConstant': VRML.SFFloat, 'suspensionAxis': VRML.SFVec3f, 'stopCFM': VRML.SFFloat, 'stopERP': VRML.SFFloat} diff --git a/resources/web/wwi/protoDesigner/classes/ProtoParser.js b/resources/web/wwi/protoDesigner/classes/ProtoParser.js index edc901cee5c..06df913336d 100644 --- a/resources/web/wwi/protoDesigner/classes/ProtoParser.js +++ b/resources/web/wwi/protoDesigner/classes/ProtoParser.js @@ -99,6 +99,7 @@ export default class ProtoParser { encodeFieldAsX3d(nodeName, fieldName, nodeElement, alias) { // determine if the field is a VRML node of if it should be consumed + console.log(nodeName) const fieldType = FieldModel[nodeName]['supported'][fieldName]; if (typeof fieldType === 'undefined') { const fieldType = FieldModel[nodeName]['unsupported'][fieldName]; // check if it's one of the unsupported ones instead diff --git a/resources/web/wwi/protos/ProtoHinge2.proto b/resources/web/wwi/protos/ProtoHinge2.proto new file mode 100644 index 00000000000..03dca917c8d --- /dev/null +++ b/resources/web/wwi/protos/ProtoHinge2.proto @@ -0,0 +1,52 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoHinge2 [ +] +{ +Robot { + children [ + Robot { + children [ + Hinge2Joint { + jointParameters HingeJointParameters { + position 2 + axis 1 1 0 + anchor 0 -1 0 + minStop -1 + maxStop 2 + } + jointParameters2 JointParameters { + position -1 + axis 0 0 -1 + minStop -2 + maxStop 2 + } + device [ + PositionSensor { + } + RotationalMotor { + } + ] + device2 [ + PositionSensor { + } + RotationalMotor { + } + Brake { + } + ] + endPoint Solid { + children [ + Shape { + geometry Box { + size 0.1 0.1 0.1 + } + } + ] + } + } + ] + } + ] +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 6ac13745d3c..984f3a99135 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoSlider.proto"); + webotsView.loadProto("protos/ProtoHinge2.proto"); From f97828aa0c4174c349b8f98652e164c387410c15 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 10:27:22 +0200 Subject: [PATCH 05/20] balljoint --- resources/web/wwi/Parser.js | 19 ++++-- resources/web/wwi/nodes/WbBallJoint.js | 51 +++++++++++++++ .../web/wwi/nodes/WbBallJointParameters.js | 13 ++++ .../wwi/protoDesigner/classes/FieldModel.js | 7 +++ resources/web/wwi/protos/ProtoBallJoint.proto | 63 +++++++++++++++++++ resources/web/wwi/test.html | 2 +- 6 files changed, 150 insertions(+), 5 deletions(-) create mode 100644 resources/web/wwi/nodes/WbBallJoint.js create mode 100644 resources/web/wwi/nodes/WbBallJointParameters.js create mode 100644 resources/web/wwi/protos/ProtoBallJoint.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index e7b8cb1cdc6..1f744943be4 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -2,6 +2,8 @@ import {M_PI_4} from './nodes/utils/constants.js'; import WbAbstractAppearance from './nodes/WbAbstractAppearance.js'; import WbAppearance from './nodes/WbAppearance.js'; import WbBackground from './nodes/WbBackground.js'; +import WbBallJoint from './nodes/WbBallJoint.js'; +import WbBallJointParameters from './nodes/WbBallJointParameters.js'; import WbBillboard from './nodes/WbBillboard.js'; import WbBox from './nodes/WbBox.js'; import WbBrake from './nodes/WbBrake.js'; @@ -170,9 +172,9 @@ export default class Parser { result = this.#parseBackground(node); else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid') result = this.#parseTransform(node, parentNode, isBoundingObject); - else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint') + else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') result = this.#parseJoint(node, parentNode); - else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters') + else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters' || node.tagName === 'BallJointParameters') result = this.#parseJointParameters(node, parentNode); else if (node.tagName === 'PositionSensor' || node.tagName === 'Brake' || node.tagName === 'RotationalMotor' || node.tagName === 'LinearMotor') @@ -586,6 +588,8 @@ export default class Parser { joint = new WbSliderJoint(id); else if (node.tagName === 'Hinge2Joint') joint = new WbHinge2Joint(id); + else if (node.tagName === 'BallJoint') + joint = new WbBallJoint(id); WbWorld.instance.nodes.set(joint.id, joint); this.#parseChildren(node, joint); @@ -616,11 +620,18 @@ export default class Parser { } else if (node.tagName === 'HingeJointParameters') { const axis = convertStringToVec3(getNodeAttribute(node, 'axis', '1 0 0')); jointParameters = new WbHingeJointParameters(id, position, axis, anchor, minStop, maxStop); - } + } else + jointParameters = new WbBallJointParameters(id, position, undefined, anchor, minStop, maxStop); + WbWorld.instance.nodes.set(jointParameters.id, jointParameters); if (typeof parentNode !== 'undefined') { - if (parentNode instanceof WbHinge2Joint) { + if (parentNode instanceof WbBallJoint){ + if (jointParameters instanceof WbBallJointParameters) + parentNode.jointParameters = jointParameters; + else + parentNode.jointParameters2 = jointParameters; + }else if (parentNode instanceof WbHinge2Joint) { if (jointParameters instanceof WbHingeJointParameters) parentNode.jointParameters = jointParameters; else diff --git a/resources/web/wwi/nodes/WbBallJoint.js b/resources/web/wwi/nodes/WbBallJoint.js new file mode 100644 index 00000000000..12510647cc5 --- /dev/null +++ b/resources/web/wwi/nodes/WbBallJoint.js @@ -0,0 +1,51 @@ +import WbHinge2Joint from './WbHinge2Joint.js'; + +export default class WbBallJoint extends WbHinge2Joint { + #device3; + #jointParameters3; + constructor(id) { + super(id); + this.#device3 = []; + } + + get device2() { + return this.#device3; + } + + set device2(device) { + return this.#device3; + } + + get jointParameters3() { + return this.#jointParameters3; + } + + set jointParameters3(jointParameters) { + this.#jointParameters3 = jointParameters; + } + + preFinalize() { + super.preFinalize(); + this.#device3.forEach(child => child.preFinalize()); + this.#jointParameters3?.preFinalize(); + } + + postFinalize() { + super.postFinalize(); + + this.#device3.forEach(child => child.postFinalize()); + this.#jointParameters3?.postFinalize(); + } + + delete() { + let index = this.#device3.length - 1; + while (index >= 0) { + this.#device3[index].delete(); + --index; + } + + this.#jointParameters3?.delete(); + + super.delete(); + } +} diff --git a/resources/web/wwi/nodes/WbBallJointParameters.js b/resources/web/wwi/nodes/WbBallJointParameters.js new file mode 100644 index 00000000000..bfa38380f4b --- /dev/null +++ b/resources/web/wwi/nodes/WbBallJointParameters.js @@ -0,0 +1,13 @@ +import WbJointParameters from './WbJointParameters.js'; + +export default class WbBallJointParameters extends WbJointParameters { + #anchor; + constructor(id, position, axis, anchor, minStop, maxStop) { + super(id, position, axis, minStop, maxStop); + this.#anchor = anchor; + } + + get anchor() { + return this.#anchor; + } +} diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 30cc6160f8f..590b21a86c4 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -13,6 +13,13 @@ export const FieldModel = { 'supported': {'children': VRML.MFNode}, 'unsupported': {} }, + 'BallJoint': { + 'supported': {'endPoint': VRML.SFNode, 'jointParameters': VRML.SFNode, 'jointParameters2': VRML.SFNode, 'jointParameters3': VRML.SFNode, 'device': VRML.MFNode, 'device2': VRML.MFNode, 'device3': VRML.MFNode, 'position': VRML.SFFloat, 'position2': VRML.SFFloat, 'position3': VRML.SFFloat}, + 'unsupported': {} + }, + 'BallJointParameters': { + 'supported': {'position': VRML.SFFloat, 'axis': VRML.SFVec3f, 'anchor': VRML.SFVec3f, 'minStop': VRML.SFFloat, 'maxStop': VRML.SFFloat}, + 'unsupported': {'springConstant': VRML.SFFloat, 'dampingConstant': VRML.SFFloat, 'staticFriction': VRML.SFFloat, 'suspensionSpringConstant': VRML.SFFloat, 'suspensionDampingConstant': VRML.SFFloat, 'suspensionAxis': VRML.SFVec3f, 'stopCFM': VRML.SFFloat, 'stopERP': VRML.SFFloat} }, 'Box': { 'supported': {'size': VRML.SFVec3f}, 'unsupported': {} diff --git a/resources/web/wwi/protos/ProtoBallJoint.proto b/resources/web/wwi/protos/ProtoBallJoint.proto new file mode 100644 index 00000000000..d1b5b89fa6f --- /dev/null +++ b/resources/web/wwi/protos/ProtoBallJoint.proto @@ -0,0 +1,63 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoHinge2 [ +] +{ +Robot { + children [ + Robot { + children [ + BallJoint { + jointParameters BallJointParameters { + position -1 + anchor 1 0 0 + minStop -2 + maxStop 2 + } + jointParameters2 JointParameters { + minStop -1 + } + jointParameters3 JointParameters { + axis 1 0 1 + } + device [ + PositionSensor { + } + RotationalMotor { + } + Brake { + } + ] + device2 [ + PositionSensor { + } + RotationalMotor { + minPosition -1.5707963267948966 + maxPosition 1.5707963267948966 + } + Brake { + } + ] + device3 [ + Brake { + } + PositionSensor { + } + RotationalMotor { + } + ] + endPoint Solid { + children [ + Shape { + geometry Box { + size 0.1 0.1 0.1 + } + } + ] + } + } + ] + } + ] +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 984f3a99135..1127cbaede8 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoHinge2.proto"); + webotsView.loadProto("protos/ProtoBallJoint.proto"); From d94c5e2022ae00595e489e8cb4c6357fcafd7037 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 11:33:39 +0200 Subject: [PATCH 06/20] accelerometer --- resources/web/wwi/Parser.js | 19 ++++++++++++--- resources/web/wwi/nodes/WbAccelerometer.js | 5 ++++ resources/web/wwi/nodes/WbSolid.js | 10 ++++++++ .../wwi/protoDesigner/classes/FieldModel.js | 8 +++++-- .../web/wwi/protos/ProtoSolidDevice.proto | 24 +++++++++++++++++++ resources/web/wwi/test.html | 2 +- 6 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 resources/web/wwi/nodes/WbAccelerometer.js create mode 100644 resources/web/wwi/protos/ProtoSolidDevice.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 1f744943be4..d0be82e97eb 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -1,4 +1,5 @@ import {M_PI_4} from './nodes/utils/constants.js'; +import WbAccelerometer from './nodes/WbAccelerometer.js'; import WbAbstractAppearance from './nodes/WbAbstractAppearance.js'; import WbAppearance from './nodes/WbAppearance.js'; import WbBackground from './nodes/WbBackground.js'; @@ -170,7 +171,7 @@ export default class Parser { WbWorld.instance.viewpoint = this.#parseViewpoint(node); else if (node.tagName === 'Background') result = this.#parseBackground(node); - else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid') + else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || node.tagName === 'Accelerometer') result = this.#parseTransform(node, parentNode, isBoundingObject); else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') result = this.#parseJoint(node, parentNode); @@ -489,6 +490,7 @@ export default class Parser { const translation = convertStringToVec3(getNodeAttribute(node, 'translation', '0 0 0')); const scale = convertStringToVec3(getNodeAttribute(node, 'scale', '1 1 1')); const rotation = convertStringToQuaternion(getNodeAttribute(node, 'rotation', '0 0 1 0')); + let name = getNodeAttribute(node, 'name', ''); let newNode; if (type === 'track') { @@ -501,8 +503,19 @@ export default class Parser { newNode = new WbTrackWheel(id, translation, scale, rotation, radius, inner); parentNode.wheelsList.push(newNode); - } else if (node.tagName === 'Robot' || node.tagName === 'Solid' || type === 'solid' || type === 'robot') - newNode = new WbSolid(id, translation, scale, rotation); + } else if (node.tagName === 'Robot' || node.tagName === 'Solid' || type === 'solid' || type === 'robot') { + if (name === '') { + if (node.tagName === 'Robot' || type === 'robot') + name = 'robot'; + else + name = 'solid'; + } + newNode = new WbSolid(id, translation, scale, rotation, name); + } else if (node.tagName === 'Accelerometer') { + if (name === '') + name = 'accelerometer'; + newNode = new WbAccelerometer(id, translation, scale, rotation, name); + } else { if (!isBoundingObject) isBoundingObject = getNodeAttribute(node, 'role', undefined) === 'boundingObject'; diff --git a/resources/web/wwi/nodes/WbAccelerometer.js b/resources/web/wwi/nodes/WbAccelerometer.js new file mode 100644 index 00000000000..e33cec6913c --- /dev/null +++ b/resources/web/wwi/nodes/WbAccelerometer.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbAccelerometer extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbSolid.js b/resources/web/wwi/nodes/WbSolid.js index e23c5be6647..aab03b919a0 100644 --- a/resources/web/wwi/nodes/WbSolid.js +++ b/resources/web/wwi/nodes/WbSolid.js @@ -1,6 +1,16 @@ import WbTransform from './WbTransform.js'; export default class WbSolid extends WbTransform { + #name; + constructor(id, translation, scale, rotation, name) { + super(id, translation, scale, rotation); + this.#name = name; + } + + get name() { + return this.#name; + } + clone(customID) { console.error('Trying to clone a solid'); } diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 590b21a86c4..2ad69893baf 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -5,6 +5,10 @@ export const FieldModel = { 'supported': {'material': VRML.SFNode, 'texture': VRML.SFNode, 'textureTransform': VRML.SFNode}, 'unsupported': {'name': VRML.SFString} }, + 'Accelerometer': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString}, + 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'lookupTable': VRML.MFVec3f, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + }, 'Background': { 'supported': {}, 'unsupported': {} @@ -146,7 +150,7 @@ export const FieldModel = { }, 'Robot': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, - 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'controller': VRML.SFString, 'controllerArgs': VRML.MFString, 'customData': VRML.SFString, 'supervisor': VRML.SFBool, 'synchronization': VRML.SFBool, 'battery': VRML.MFFloat, 'cpuConsumption': VRML.SFFloat, 'selfCollision': VRML.SFBool, 'showWindow': VRML.SFBool, 'window': VRML.SFString, 'remoteControl': VRML.SFString} }, 'RotationalMotor': { 'supported': {'name': VRML.SFString, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat}, @@ -166,7 +170,7 @@ export const FieldModel = { }, 'Solid': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, - 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'controller': VRML.SFString, 'controllerArgs': VRML.MFString, 'customData': VRML.SFString, 'supervisor': VRML.SFBool, 'synchronization': VRML.SFBool, 'battery': VRML.MFFloat, 'cpuConsumption': VRML.SFFloat, 'selfCollision': VRML.SFBool, 'showWindow': VRML.SFBool, 'window': VRML.SFString, 'remoteControl': VRML.SFString} + 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, 'Sphere': { 'supported': {'radius': VRML.SFFloat, 'subdivision': VRML.SFInt32, 'ico': VRML.SFBool}, diff --git a/resources/web/wwi/protos/ProtoSolidDevice.proto b/resources/web/wwi/protos/ProtoSolidDevice.proto new file mode 100644 index 00000000000..72ab93ee1af --- /dev/null +++ b/resources/web/wwi/protos/ProtoSolidDevice.proto @@ -0,0 +1,24 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoHinge [ +] +{ +Robot { + children [ + Robot { + children [ + Accelerometer { + name "accel" + children [ + Shape { + geometry Box { + size 0.1 0.1 0.1 + } + } + ] + } + ] + } + ] +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 1127cbaede8..4db8023e5d4 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoBallJoint.proto"); + webotsView.loadProto("protos/ProtoSolidDevice.proto"); From 38c45c5744a2d20b3eba203d150a6b6935dbe80b Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 13:58:42 +0200 Subject: [PATCH 07/20] fieldtype solid device --- .../wwi/protoDesigner/classes/FieldModel.js | 92 ++++++++++++++++--- .../web/wwi/protos/ProtoSolidDevice.proto | 55 +++++++++-- 2 files changed, 125 insertions(+), 22 deletions(-) diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 2ad69893baf..7d99ef32c61 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -6,8 +6,12 @@ export const FieldModel = { 'unsupported': {'name': VRML.SFString} }, 'Accelerometer': { - 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString}, - 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'lookupTable': VRML.MFVec3f, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'lookupTable': VRML.MFVec3f, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + }, + 'Altimeter': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'accuracy': VRML.SFFloat, 'resolution': VRML.SFFloat} }, 'Background': { 'supported': {}, @@ -36,18 +40,34 @@ export const FieldModel = { 'supported': {'url': VRML.MFString, 'ccw': VRML.SFBool, 'castShadows': VRML.SFBool, 'isPickable': VRML.SFBool}, 'unsupported': {} }, + 'Camera': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'fieldOfView': VRML.SFFloat, 'width': VRML.SFInt32, 'height': VRML.SFInt32, 'spherical': VRML.SFBool, 'near': VRML.SFFloat, 'far': VRML.SFFloat, 'exposure': VRML.SFFloat, 'antiAliasing': VRML.SFBool, 'ambientOcclustionRadius': VRML.SFFloat, 'bloomThreshold': VRML.SFFloat, 'motionBlur': VRML.SFFloat, 'noise': VRML.SFFloat, 'noiseMaskURL': VRML.SFString, 'lens': VRML.SFNode, 'focus': VRML.SFNode, 'zoom': VRML.SFNode, 'recognition': VRML.SFNode, 'lensFlare': VRML.SFNode} + }, 'Capsule': { 'supported': {'bottom': VRML.SFBool, 'height': VRML.SFFloat, 'radius': VRML.SFFloat, 'side': VRML.SFBool, 'top': VRML.SFBool, 'subdivision': VRML.SFInt32}, 'unsupported': {} }, + 'Charger': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'battery': VRML.MFFloat, 'radius': VRML.SFFloat, 'emissiveColor': VRML.SFColor, 'gradual': VRML.SFBool} + }, 'Color': { 'supported': {'color': VRML.MFColor}, 'unsupported': {} }, + 'Compass': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'lookupTable': VRML.MFVec3f, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + }, 'Cone': { 'supported': {'bottomRadius': VRML.SFFloat, 'height': VRML.SFFloat, 'side': VRML.SFBool, 'bottom': VRML.SFBool, 'subdivision': VRML.SFInt32}, 'unsupported': {} }, + 'Connector': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'isLocked': VRML.SFBool, 'autoLock': VRML.SFBool, 'unilateralLock': VRML.SFBool, 'unilateralUnlock': VRML.SFBool, 'distanceTolerance': VRML.SFFloat, 'axisTolerance': VRML.SFFloat, 'rotationTolerance': VRML.SFFloat, 'numberOfRotations': VRML.SFInt32, 'snap': VRML.SFBool, 'tensileStrength': VRML.SFFloat, 'shearStrength': VRML.SFFloat} + }, 'Coordinate': { 'supported': {'point': VRML.MFVec3f}, 'unsupported': {} @@ -60,22 +80,38 @@ export const FieldModel = { 'supported': {'ambientIntensity': VRML.SFFloat, 'color': VRML.SFColor, 'direction': VRML.SFVec3f, 'intensity': VRML.SFFloat, 'on': VRML.SFBool, 'castShadows': VRML.SFBool}, 'unsupported': {} }, + 'Display': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'width': VRML.SFInt32, 'height': VRML.SFInt32} + }, 'DistanceSensor': { - 'supported': {}, - 'unsupported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'lookupTable': VRML.MFVec3f, 'type': VRML.SFString, 'numberOfRays': VRML.SFInt32, 'aperture': VRML.SFFloat, 'gaussianWidth': VRML.SFFloat, 'resolution': VRML.SFFloat, 'redColorSensitivity': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'lookupTable': VRML.MFVec3f, 'type': VRML.SFString, 'numberOfRays': VRML.SFInt32, 'aperture': VRML.SFFloat, 'gaussianWidth': VRML.SFFloat, 'resolution': VRML.SFFloat, 'redColorSensitivity': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, 'ElevationGrid': { 'supported': {'height': VRML.MFFloat, 'xDimension': VRML.SFInt32, 'xSpacing': VRML.SFFloat, 'yDimension': VRML.SFInt32, 'ySpacing': VRML.SFFloat, 'thickness': VRML.SFFloat}, 'unsupported': {} }, + 'Emitter': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'range': VRML.SFFloat, 'maxRange': VRML.SFFloat, 'aperture': VRML.SFFloat, 'channel': VRML.SFInt32, 'baudRate': VRML.SFInt32, 'byteSize': VRML.SFInt32, 'bufferSize': VRML.SFInt32, 'allowedChannels': VRML.MFInt32} + }, 'Fog': { 'supported': {'color': VRML.SFColor, 'fogType': VRML.SFString, 'visibilityRange': VRML.SFFloat}, 'unsupported': {} }, + 'GPS': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'accuracy': VRML.SFFloat, 'noiseCorrelation': VRML.SFFloat, 'resolution': VRML.SFFloat, 'speedNoise': VRML.SFFloat, 'speedResolution': VRML.SFFloat} + }, 'Group': { 'supported': {'children': VRML.MFNode}, 'unsupported': {} }, + 'Gyro': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'lookupTable': VRML.MFVec3f, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + }, 'HingeJoint': { 'supported': {'endPoint': VRML.SFNode, 'jointParameters': VRML.SFNode, 'device': VRML.MFNode, 'position': VRML.SFFloat}, 'unsupported': {} @@ -100,17 +136,25 @@ export const FieldModel = { 'supported': {'coord': VRML.SFNode, 'coordIndex': VRML.MFInt32}, 'unsupported': {} }, + 'InertialUnit': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'noise': VRML.SFFloat, 'xAxis': VRML.SFBool, 'yAxis': VRML.SFBool, 'zAxis': VRML.SFBool, 'resolution': VRML.SFFloat} + }, 'JointParameters': { 'supported': {'position': VRML.SFFloat, 'axis': VRML.SFVec3f, 'minStop': VRML.SFFloat, 'maxStop': VRML.SFFloat, 'springConstant': VRML.SFFloat, 'dampingConstant': VRML.SFFloat, 'staticFriction': VRML.SFFloat}, 'unsupported': {} }, 'LED': { - 'supported': {}, - 'unsupported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'color': VRML.MFColor, 'gradual': VRML.SFBool, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'color': VRML.MFColor, 'gradual': VRML.SFBool, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + }, + 'Lidar': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'tiltAngle': VRML.SFFloat, 'horizontalResolution': VRML.SFInt32, 'fieldOfView': VRML.SFFloat, 'verticalFieldOfView': VRML.SFFloat, 'numberOfLayers': VRML.SFInt32, 'near': VRML.SFFloat, 'minRange': VRML.SFFloat, 'maxRange': VRML.SFFloat, 'spherical': VRML.SFBool, 'type': VRML.SFString, 'noise': VRML.SFFloat, 'resolution': VRML.SFFloat, 'defaultFrequency': VRML.SFFloat, 'minFrequency': VRML.SFFloat, 'maxFrequency': VRML.SFFloat, 'rotatingHead': VRML.SFNode} }, 'LightSensor': { - 'supported': {}, - 'unsupported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'lookupTable': VRML.MFVec3f, 'colorFilter': VRML.SFColor, 'occlusion': VRML.SFBool, 'resolution': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'lookupTable': VRML.MFVec3f, 'colorFilter': VRML.SFColor, 'occlusion': VRML.SFBool, 'resolution': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, 'LinearMotor': { 'supported': {'name': VRML.SFString, 'acceleration': VRML.SFFloat, 'consumptionFactor': VRML.SFFloat, 'controlPID': VRML.Vec3f, 'maxVelocity': VRML.SFFloat, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat, 'maxForce': VRML.SFFloat, 'multiplier': VRML.SFFloat, 'sound': VRML.SFString, 'muscles': VRML.MFNode}, @@ -132,6 +176,10 @@ export const FieldModel = { 'supported': {'baseColor': VRML.SFColor, 'baseColorMap': VRML.SFNode, 'transparency': VRML.SFFloat, 'roughness': VRML.SFFloat, 'roughnessMap': VRML.SFNode, 'metalness': VRML.SFFloat, 'metalnessMap': VRML.SFNode, 'IBLStrength': VRML.SFFloat, 'normalMap': VRML.SFNode, 'normalMapFactor': VRML.SFFloat, 'occlusionMap': VRML.SFNode, 'occlusionMapStrength': VRML.SFFloat, 'emissiveColor': VRML.SFColor, 'emissiveColorMap': VRML.SFNode, 'emissiveIntensity': VRML.SFFloat, 'textureTransform': VRML.SFNode}, 'unsupported': {'name': VRML.SFString} }, + 'Pen': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'inkColor': VRML.SFColor, 'inkDensity': VRML.SFFloat, 'leadSize': VRML.SFFloat, 'maxDistance': VRML.SFFloat, 'write': VRML.SFBool} + }, 'Plane': { 'supported': {'size': VRML.SFVec2f}, 'unsupported': {} @@ -148,9 +196,21 @@ export const FieldModel = { 'supported': {'name': VRML.SFString}, 'unsupported': {'noise': VRML.SFFloat, 'resolution': VRML.SFFloat} }, + 'Radar': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'minRange': VRML.SFFloat, 'maxRange': VRML.SFFloat, 'horizontalFieldOfView': VRML.SFFloat, 'verticalFieldOfView': VRML.SFFloat, 'minAbsoluteRadialSpeed': VRML.SFFloat, 'minRadialSpeed': VRML.SFFloat, 'maxRadialSpeed': VRML.SFFloat, 'cellDistance': VRML.SFFloat, 'cellSpeed': VRML.SFFloat, 'rangeNoise': VRML.SFFloat, 'speedNoise': VRML.SFFloat, 'angularNoise': VRML.SFFloat, 'antennaGain': VRML.SFFloat, 'frequency': VRML.SFFloat, 'transmittedPower': VRML.SFFloat, 'minDetectableSignal': VRML.SFFloat, 'occlusion': VRML.SFBool} + }, + 'RangeFinder': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'fieldOfView': VRML.SFFloat, 'width': VRML.SFInt32, 'height': VRML.SFInt32, 'spherical': VRML.SFBool, 'near': VRML.SFFloat, 'minRange': VRML.SFFloat, 'maxRange': VRML.SFFloat, 'motionBlur': VRML.SFFloat, 'noise': VRML.SFFloat, 'resolution': VRML.SFFloat, 'lense': VRML.SFNode} + }, + 'Receiver': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'aperture': VRML.SFFloat, 'channel': SFInt32, 'baudRate': VRML.SFInt32, 'byteSize': VRML.SFInt32, 'bufferSize': VRML.SFInt32, 'signalStrengthNoise': VRML.SFFloat, 'directionNoise': VRML.SFFloat, 'allowedChannels': VRML.MFInt32} + }, 'Robot': { - 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, - 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'controller': VRML.SFString, 'controllerArgs': VRML.MFString, 'customData': VRML.SFString, 'supervisor': VRML.SFBool, 'synchronization': VRML.SFBool, 'battery': VRML.MFFloat, 'cpuConsumption': VRML.SFFloat, 'selfCollision': VRML.SFBool, 'showWindow': VRML.SFBool, 'window': VRML.SFString, 'remoteControl': VRML.SFString} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode,'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'controller': VRML.SFString, 'controllerArgs': VRML.MFString, 'customData': VRML.SFString, 'supervisor': VRML.SFBool, 'synchronization': VRML.SFBool, 'battery': VRML.MFFloat, 'cpuConsumption': VRML.SFFloat, 'selfCollision': VRML.SFBool, 'showWindow': VRML.SFBool, 'window': VRML.SFString, 'remoteControl': VRML.SFString} }, 'RotationalMotor': { 'supported': {'name': VRML.SFString, 'minPosition': VRML.SFFloat, 'maxPosition': VRML.SFFloat}, @@ -169,13 +229,17 @@ export const FieldModel = { 'unsupported': {} }, 'Solid': { - 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, - 'unsupported': {'name': VRML.SFString, 'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'boundingObject': VRML.SFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} }, 'Sphere': { 'supported': {'radius': VRML.SFFloat, 'subdivision': VRML.SFInt32, 'ico': VRML.SFBool}, 'unsupported': {} }, + 'Speaker': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f} + }, 'SpotLight': { 'supported': {'ambientIntensity': VRML.SFFloat, 'attenuation': VRML.SFVec3f, 'beamWidth': VRML.SFFloat, 'color': VRML.SFColor, 'cutOffAngle': VRML.SFFloat, 'direction': VRML.SFVec3f, 'intensity': VRML.SFFloat, 'location': VRML.SFVec3f, 'on': VRML.SFBool, 'radius': VRML.SFFloat, 'castShadows': VRML.SFBool}, 'unsupported': {} @@ -188,6 +252,10 @@ export const FieldModel = { 'supported': {'center': VRML.SFVec2f, 'rotation': VRML.SFFloat, 'scale': VRML.SFVec2f, 'translation': VRML.SFVec2f}, 'unsupported': {} }, + 'TouchSensor': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'lookupTable': VRML.MFVec3f, 'resolution': VRML.SFFloat} + }, 'Transform': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, 'unsupported': {'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat} diff --git a/resources/web/wwi/protos/ProtoSolidDevice.proto b/resources/web/wwi/protos/ProtoSolidDevice.proto index 72ab93ee1af..16e782c52b3 100644 --- a/resources/web/wwi/protos/ProtoSolidDevice.proto +++ b/resources/web/wwi/protos/ProtoSolidDevice.proto @@ -5,20 +5,55 @@ PROTO ProtoHinge [ { Robot { children [ - Robot { + Accelerometer { children [ - Accelerometer { - name "accel" - children [ - Shape { - geometry Box { - size 0.1 0.1 0.1 - } - } - ] + Shape { + geometry Box { + size 0.1 0.1 0.1 + } } ] } + Altimeter { + } + Camera { + } + Charger { + } + Compass { + } + Connector { + } + Display { + } + DistanceSensor { + } + Emitter { + } + GPS { + } + Gyro { + } + InertialUnit { + } + LED { + } + Lidar { + } + LightSensor { + } + Pen { + } + Radar { + } + RangeFinder { + } + Receiver { + } + Speaker { + } + TouchSensor { + } ] } } From 7d16b2c332d9236500d8e7687a98c6d341811668 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 14:07:11 +0200 Subject: [PATCH 08/20] create classes --- resources/web/wwi/nodes/WbAltimeter.js | 5 +++++ resources/web/wwi/nodes/WbCamera.js | 5 +++++ resources/web/wwi/nodes/WbCharger.js | 5 +++++ resources/web/wwi/nodes/WbCompass.js | 5 +++++ resources/web/wwi/nodes/WbConnector.js | 5 +++++ resources/web/wwi/nodes/WbDisplay.js | 5 +++++ resources/web/wwi/nodes/WbDistanceSensor.js | 5 +++++ resources/web/wwi/nodes/WbEmitter.js | 5 +++++ resources/web/wwi/nodes/WbGPS.js | 5 +++++ resources/web/wwi/nodes/WbGyro.js | 5 +++++ resources/web/wwi/nodes/WbInertialUnit.js | 5 +++++ resources/web/wwi/nodes/WbLed.js | 5 +++++ resources/web/wwi/nodes/WbLidar.js | 5 +++++ resources/web/wwi/nodes/WbLightSensor.js | 5 +++++ resources/web/wwi/nodes/WbPen.js | 5 +++++ resources/web/wwi/nodes/WbRadar.js | 5 +++++ resources/web/wwi/nodes/WbRangeFinder.js | 5 +++++ resources/web/wwi/nodes/WbReceiver.js | 5 +++++ resources/web/wwi/nodes/WbSpeaker.js | 5 +++++ resources/web/wwi/nodes/WbTouchSensor.js | 5 +++++ resources/web/wwi/protoDesigner/classes/FieldModel.js | 2 +- 21 files changed, 101 insertions(+), 1 deletion(-) create mode 100644 resources/web/wwi/nodes/WbAltimeter.js create mode 100644 resources/web/wwi/nodes/WbCamera.js create mode 100644 resources/web/wwi/nodes/WbCharger.js create mode 100644 resources/web/wwi/nodes/WbCompass.js create mode 100644 resources/web/wwi/nodes/WbConnector.js create mode 100644 resources/web/wwi/nodes/WbDisplay.js create mode 100644 resources/web/wwi/nodes/WbDistanceSensor.js create mode 100644 resources/web/wwi/nodes/WbEmitter.js create mode 100644 resources/web/wwi/nodes/WbGPS.js create mode 100644 resources/web/wwi/nodes/WbGyro.js create mode 100644 resources/web/wwi/nodes/WbInertialUnit.js create mode 100644 resources/web/wwi/nodes/WbLed.js create mode 100644 resources/web/wwi/nodes/WbLidar.js create mode 100644 resources/web/wwi/nodes/WbLightSensor.js create mode 100644 resources/web/wwi/nodes/WbPen.js create mode 100644 resources/web/wwi/nodes/WbRadar.js create mode 100644 resources/web/wwi/nodes/WbRangeFinder.js create mode 100644 resources/web/wwi/nodes/WbReceiver.js create mode 100644 resources/web/wwi/nodes/WbSpeaker.js create mode 100644 resources/web/wwi/nodes/WbTouchSensor.js diff --git a/resources/web/wwi/nodes/WbAltimeter.js b/resources/web/wwi/nodes/WbAltimeter.js new file mode 100644 index 00000000000..ad84ac567f6 --- /dev/null +++ b/resources/web/wwi/nodes/WbAltimeter.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbAltimeter extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbCamera.js b/resources/web/wwi/nodes/WbCamera.js new file mode 100644 index 00000000000..94319e4cbe4 --- /dev/null +++ b/resources/web/wwi/nodes/WbCamera.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbCamera extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbCharger.js b/resources/web/wwi/nodes/WbCharger.js new file mode 100644 index 00000000000..7a1b64bb67c --- /dev/null +++ b/resources/web/wwi/nodes/WbCharger.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbCharger extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbCompass.js b/resources/web/wwi/nodes/WbCompass.js new file mode 100644 index 00000000000..6b07dc5d2d2 --- /dev/null +++ b/resources/web/wwi/nodes/WbCompass.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbCompass extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbConnector.js b/resources/web/wwi/nodes/WbConnector.js new file mode 100644 index 00000000000..75d6a4f1404 --- /dev/null +++ b/resources/web/wwi/nodes/WbConnector.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbConnector extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbDisplay.js b/resources/web/wwi/nodes/WbDisplay.js new file mode 100644 index 00000000000..eda42729ec4 --- /dev/null +++ b/resources/web/wwi/nodes/WbDisplay.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbDisplay extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbDistanceSensor.js b/resources/web/wwi/nodes/WbDistanceSensor.js new file mode 100644 index 00000000000..a8e5f6d67f8 --- /dev/null +++ b/resources/web/wwi/nodes/WbDistanceSensor.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class DistanceSensor extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbEmitter.js b/resources/web/wwi/nodes/WbEmitter.js new file mode 100644 index 00000000000..aebaca67bc6 --- /dev/null +++ b/resources/web/wwi/nodes/WbEmitter.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbEmitter extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbGPS.js b/resources/web/wwi/nodes/WbGPS.js new file mode 100644 index 00000000000..20150752eae --- /dev/null +++ b/resources/web/wwi/nodes/WbGPS.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbGps extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbGyro.js b/resources/web/wwi/nodes/WbGyro.js new file mode 100644 index 00000000000..6e973ad17de --- /dev/null +++ b/resources/web/wwi/nodes/WbGyro.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbGyro extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbInertialUnit.js b/resources/web/wwi/nodes/WbInertialUnit.js new file mode 100644 index 00000000000..c921b6e1aa8 --- /dev/null +++ b/resources/web/wwi/nodes/WbInertialUnit.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbInertialUnit extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbLed.js b/resources/web/wwi/nodes/WbLed.js new file mode 100644 index 00000000000..57f9a43b215 --- /dev/null +++ b/resources/web/wwi/nodes/WbLed.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbLed extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbLidar.js b/resources/web/wwi/nodes/WbLidar.js new file mode 100644 index 00000000000..28519991fe1 --- /dev/null +++ b/resources/web/wwi/nodes/WbLidar.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbLidar extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbLightSensor.js b/resources/web/wwi/nodes/WbLightSensor.js new file mode 100644 index 00000000000..a3dde8fe764 --- /dev/null +++ b/resources/web/wwi/nodes/WbLightSensor.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbLightSensor extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbPen.js b/resources/web/wwi/nodes/WbPen.js new file mode 100644 index 00000000000..719c6bd4a1d --- /dev/null +++ b/resources/web/wwi/nodes/WbPen.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbPen extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbRadar.js b/resources/web/wwi/nodes/WbRadar.js new file mode 100644 index 00000000000..5f371b89c31 --- /dev/null +++ b/resources/web/wwi/nodes/WbRadar.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbRadar extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbRangeFinder.js b/resources/web/wwi/nodes/WbRangeFinder.js new file mode 100644 index 00000000000..91c9316dc4b --- /dev/null +++ b/resources/web/wwi/nodes/WbRangeFinder.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbRangeFinder extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbReceiver.js b/resources/web/wwi/nodes/WbReceiver.js new file mode 100644 index 00000000000..ef704c74cf1 --- /dev/null +++ b/resources/web/wwi/nodes/WbReceiver.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbReceiver extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbSpeaker.js b/resources/web/wwi/nodes/WbSpeaker.js new file mode 100644 index 00000000000..e83a57299d9 --- /dev/null +++ b/resources/web/wwi/nodes/WbSpeaker.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbSpeaker extends WbSolid { +} diff --git a/resources/web/wwi/nodes/WbTouchSensor.js b/resources/web/wwi/nodes/WbTouchSensor.js new file mode 100644 index 00000000000..9e141250f8e --- /dev/null +++ b/resources/web/wwi/nodes/WbTouchSensor.js @@ -0,0 +1,5 @@ +import WbSolid from './WbSolid.js'; + +// This class is used to retrieve the type of device +export default class WbTouchSensor extends WbSolid { +} diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 7d99ef32c61..25d8e733425 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -206,7 +206,7 @@ export const FieldModel = { }, 'Receiver': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, - 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'aperture': VRML.SFFloat, 'channel': SFInt32, 'baudRate': VRML.SFInt32, 'byteSize': VRML.SFInt32, 'bufferSize': VRML.SFInt32, 'signalStrengthNoise': VRML.SFFloat, 'directionNoise': VRML.SFFloat, 'allowedChannels': VRML.MFInt32} + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'aperture': VRML.SFFloat, 'channel': VRML.SFInt32, 'baudRate': VRML.SFInt32, 'byteSize': VRML.SFInt32, 'bufferSize': VRML.SFInt32, 'signalStrengthNoise': VRML.SFFloat, 'directionNoise': VRML.SFFloat, 'allowedChannels': VRML.MFInt32} }, 'Robot': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode,'name': VRML.SFString, 'boundingObject': VRML.SFNode}, From cf684c55825026c4f8b2484a54872d6ffa48360e Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 14:45:39 +0200 Subject: [PATCH 09/20] connect solid device in parser --- resources/web/wwi/Parser.js | 111 +++++++++++++++++- resources/web/wwi/nodes/WbDistanceSensor.js | 2 +- .../web/wwi/nodes/{WbGPS.js => WbGps.js} | 0 3 files changed, 109 insertions(+), 4 deletions(-) rename resources/web/wwi/nodes/{WbGPS.js => WbGps.js} (100%) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index d0be82e97eb..3d6040c2869 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -1,5 +1,6 @@ import {M_PI_4} from './nodes/utils/constants.js'; import WbAccelerometer from './nodes/WbAccelerometer.js'; +import WbAltimeter from './nodes/WbAltimeter.js'; import WbAbstractAppearance from './nodes/WbAbstractAppearance.js'; import WbAppearance from './nodes/WbAppearance.js'; import WbBackground from './nodes/WbBackground.js'; @@ -8,41 +9,60 @@ import WbBallJointParameters from './nodes/WbBallJointParameters.js'; import WbBillboard from './nodes/WbBillboard.js'; import WbBox from './nodes/WbBox.js'; import WbBrake from './nodes/WbBrake.js'; +import WbCamera from './nodes/WbCamera.js'; import WbCapsule from './nodes/WbCapsule.js'; import WbCadShape from './nodes/WbCadShape.js'; +import WbCharger from './nodes/WbCharger.js'; +import WbCompass from './nodes/WbCompass.js'; import WbCone from './nodes/WbCone.js'; +import WbConnector from './nodes/WbConnector.js'; import WbCylinder from './nodes/WbCylinder.js'; import WbDirectionalLight from './nodes/WbDirectionalLight.js'; +import WbDisplay from './nodes/WbDisplay.js'; +import WbDistanceSensor from './nodes/WbDistanceSensor.js'; import WbElevationGrid from './nodes/WbElevationGrid.js'; +import WbEmitter from './nodes/WbEmitter.js'; import WbFog from './nodes/WbFog.js'; import WbGeometry from './nodes/WbGeometry.js'; +import WbGps from './nodes/WbGps.js'; import WbGroup from './nodes/WbGroup.js'; +import WbGyro from './nodes/WbGyro.js'; import WbHingeJoint from './nodes/WbHingeJoint.js'; import WbHingeJointParameters from './nodes/WbHingeJointParameters.js'; import WbHinge2Joint from './nodes/WbHinge2Joint.js'; import WbImageTexture from './nodes/WbImageTexture.js'; import WbIndexedFaceSet from './nodes/WbIndexedFaceSet.js'; import WbIndexedLineSet from './nodes/WbIndexedLineSet.js'; +import WbInertialUnit from './nodes/WbInertialUnit.js'; import WbJoint from './nodes/WbJoint.js'; import WbJoinParameters from './nodes/WbJointParameters.js'; +import WbLed from './nodes/WbLed.js'; +import WbLidar from './nodes/WbLidar.js'; import WbLight from './nodes/WbLight.js'; +import WbLightSensor from './nodes/WbLightSensor.js'; import WbLinearMotor from './nodes/WbLinearMotor.js'; import WbMaterial from './nodes/WbMaterial.js'; import WbMesh from './nodes/WbMesh.js'; +import WbPen from './nodes/WbPen.js'; import WbPositionSensor from './nodes/WbPositionSensor.js'; import WbPbrAppearance from './nodes/WbPbrAppearance.js'; import WbPlane from './nodes/WbPlane.js'; import WbPointLight from './nodes/WbPointLight.js'; import WbPointSet from './nodes/WbPointSet.js'; +import WbRadar from './nodes/WbRadar.js'; +import WbRangeFinder from './nodes/WbRangeFinder.js'; +import WbReceiver from './nodes/WbReceiver.js'; import WbRotationalMotor from './nodes/WbRotationalMotor.js'; import WbScene from './nodes/WbScene.js'; import WbShape from './nodes/WbShape.js'; import WbSlot from './nodes/WbSlot.js'; import WbSolid from './nodes/WbSolid.js'; +import WbSpeaker from './nodes/WbSpeaker.js'; import WbSphere from './nodes/WbSphere.js'; import WbSpotLight from './nodes/WbSpotLight.js'; import WbSliderJoint from './nodes/WbSliderJoint.js'; import WbTextureTransform from './nodes/WbTextureTransform.js'; +import WbTouchSensor from './nodes/WbTouchSensor.js'; import WbTrack from './nodes/WbTrack.js'; import WbTrackWheel from './nodes/WbTrackWheel.js'; import WbTransform from './nodes/WbTransform.js'; @@ -171,7 +191,13 @@ export default class Parser { WbWorld.instance.viewpoint = this.#parseViewpoint(node); else if (node.tagName === 'Background') result = this.#parseBackground(node); - else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || node.tagName === 'Accelerometer') + else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || + node.tagName === 'Accelerometer' || node.tagName === 'Altimeter' || node.tagName === 'Camera' || + node.tagName === 'Charger' || node.tagName === 'Compass' || node.tagName === 'Connector' || node.tagName === 'Display' || + node.tagName === 'DistanceSensor' || node.tagName === 'Emitter' || node.tagName === 'GPS' || node.tagName === 'Gyro' || + node.tagName === 'InertialUnit' || node.tagName === 'LED' || node.tagName === 'Lidar' || + node.tagName === 'LightSensor' || node.tagName === 'Pen' || node.tagName === 'Radar' || node.tagName === 'RangeFinder' || + node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor') result = this.#parseTransform(node, parentNode, isBoundingObject); else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') result = this.#parseJoint(node, parentNode); @@ -515,8 +541,87 @@ export default class Parser { if (name === '') name = 'accelerometer'; newNode = new WbAccelerometer(id, translation, scale, rotation, name); - } - else { + } else if (node.tagName === 'Altimeter') { + if (name === '') + name = 'altimeter'; + newNode = new WbAltimeter(id, translation, scale, rotation, name); + } else if (node.tagName === 'Camera') { + if (name === '') + name = 'Camera'; + newNode = new WbCamera(id, translation, scale, rotation, name); + } else if (node.tagName === 'Charger') { + if (name === '') + name = 'charger'; + newNode = new WbCharger(id, translation, scale, rotation, name); + } else if (node.tagName === 'Compass') { + if (name === '') + name = 'compass'; + newNode = new WbCompass(id, translation, scale, rotation, name); + } else if (node.tagName === 'Connector') { + if (name === '') + name = 'connector'; + newNode = new WbConnector(id, translation, scale, rotation, name); + } else if (node.tagName === 'Display') { + if (name === '') + name = 'display'; + newNode = new WbDisplay(id, translation, scale, rotation, name); + } else if (node.tagName === 'DistanceSensor') { + if (name === '') + name = 'distance sensor'; + newNode = new WbDistanceSensor(id, translation, scale, rotation, name); + } else if (node.tagName === 'Emitter') { + if (name === '') + name = 'emitter'; + newNode = new WbEmitter(id, translation, scale, rotation, name); + } else if (node.tagName === 'GPS') { + if (name === '') + name = 'gps'; + newNode = new WbGps(id, translation, scale, rotation, name); + } else if (node.tagName === 'Gyro') { + if (name === '') + name = 'gyro'; + newNode = new WbGyro(id, translation, scale, rotation, name); + } else if (node.tagName === 'InertialUnit') { + if (name === '') + name = 'inertial unit'; + newNode = new WbInertialUnit(id, translation, scale, rotation, name); + } else if (node.tagName === 'LED') { + if (name === '') + name = 'led'; + newNode = new WbLed(id, translation, scale, rotation, name); + } else if (node.tagName === 'Lidar') { + if (name === '') + name = 'lidar'; + newNode = new WbLidar(id, translation, scale, rotation, name); + } else if (node.tagName === 'LightSensor') { + if (name === '') + name = 'light sensor'; + newNode = new WbLightSensor(id, translation, scale, rotation, name); + } else if (node.tagName === 'Pen') { + if (name === '') + name = 'pen'; + newNode = new WbPen(id, translation, scale, rotation, name); + } else if (node.tagName === 'Radar') { + if (name === '') + name = 'radar'; + newNode = new WbRadar(id, translation, scale, rotation, name); + } else if (node.tagName === 'RangeFinder') { + if (name === '') + name = 'range finder'; + newNode = new WbRangeFinder(id, translation, scale, rotation, name); + } else if (node.tagName === 'Receiver') { + if (name === '') + name = 'receiver'; + newNode = new WbReceiver(id, translation, scale, rotation, name); + } else if (node.tagName === 'Speaker') { + if (name === '') + name = 'speaker'; + newNode = new WbSpeaker(id, translation, scale, rotation, name); + } else if (node.tagName === 'TouchSensor') { + if (name === '') + name = 'touch sensor'; + newNode = new WbTouchSensor(id, translation, scale, rotation, name); + } else { if (!isBoundingObject) isBoundingObject = getNodeAttribute(node, 'role', undefined) === 'boundingObject'; diff --git a/resources/web/wwi/nodes/WbDistanceSensor.js b/resources/web/wwi/nodes/WbDistanceSensor.js index a8e5f6d67f8..c44e9a9d164 100644 --- a/resources/web/wwi/nodes/WbDistanceSensor.js +++ b/resources/web/wwi/nodes/WbDistanceSensor.js @@ -1,5 +1,5 @@ import WbSolid from './WbSolid.js'; // This class is used to retrieve the type of device -export default class DistanceSensor extends WbSolid { +export default class WbDistanceSensor extends WbSolid { } diff --git a/resources/web/wwi/nodes/WbGPS.js b/resources/web/wwi/nodes/WbGps.js similarity index 100% rename from resources/web/wwi/nodes/WbGPS.js rename to resources/web/wwi/nodes/WbGps.js From e303ce17200db56c232c254ca73fdca76407359a Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 15:18:57 +0200 Subject: [PATCH 10/20] fieldmodel track and propeller --- resources/web/wwi/protoDesigner/classes/FieldModel.js | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index 25d8e733425..a9fe858b863 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -196,6 +196,10 @@ export const FieldModel = { 'supported': {'name': VRML.SFString}, 'unsupported': {'noise': VRML.SFFloat, 'resolution': VRML.SFFloat} }, + 'Propeller': { + 'supported': {'shaftAxis': VRML.SFVec3f, 'centerOfThrust': VRML.SFVec3f, 'thrustConstants': VRML.SFVec2f, 'torqueConstants': VRML.SFVec2f, 'fastHelixThreshold': VRML.SFFloat, 'device': VRML.SFNode, 'fastHelix': VRML.SFNode, 'slowHelix': VRML.SFNode}, + 'unsupported': {} + }, 'Radar': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'minRange': VRML.SFFloat, 'maxRange': VRML.SFFloat, 'horizontalFieldOfView': VRML.SFFloat, 'verticalFieldOfView': VRML.SFFloat, 'minAbsoluteRadialSpeed': VRML.SFFloat, 'minRadialSpeed': VRML.SFFloat, 'maxRadialSpeed': VRML.SFFloat, 'cellDistance': VRML.SFFloat, 'cellSpeed': VRML.SFFloat, 'rangeNoise': VRML.SFFloat, 'speedNoise': VRML.SFFloat, 'angularNoise': VRML.SFFloat, 'antennaGain': VRML.SFFloat, 'frequency': VRML.SFFloat, 'transmittedPower': VRML.SFFloat, 'minDetectableSignal': VRML.SFFloat, 'occlusion': VRML.SFBool} @@ -256,6 +260,10 @@ export const FieldModel = { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode}, 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'type': VRML.SFString, 'lookupTable': VRML.MFVec3f, 'resolution': VRML.SFFloat} }, + 'Track': { + 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode, 'device': VRML.MFNode, 'animatedGeometry': VRML.SFNode, 'geometriesCount': VRML.SFInt32 }, + 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'textureAnimation': VRML.SFVec2f} + }, 'Transform': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, 'unsupported': {'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat} From 60f8567af449b0416cc44367fea40cc7ad54ab44 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 16:07:01 +0200 Subject: [PATCH 11/20] track --- projects/samples/devices/worlds/.track.wbproj | 6 +- projects/samples/devices/worlds/track.wbt | 138 +-------- resources/web/wwi/Parser.js | 11 +- resources/web/wwi/nodes/WbBallJoint.js | 6 +- resources/web/wwi/nodes/WbHinge2Joint.js | 2 +- resources/web/wwi/nodes/WbHingeJoint.js | 2 +- resources/web/wwi/nodes/WbSliderJoint.js | 2 +- resources/web/wwi/nodes/WbTrack.js | 10 + .../wwi/protoDesigner/classes/FieldModel.js | 4 + resources/web/wwi/protos/ProtoTrack.proto | 282 ++++++++++++++++++ resources/web/wwi/test.html | 2 +- 11 files changed, 314 insertions(+), 151 deletions(-) create mode 100644 resources/web/wwi/protos/ProtoTrack.proto diff --git a/projects/samples/devices/worlds/.track.wbproj b/projects/samples/devices/worlds/.track.wbproj index b6bf8b3177e..768f9305ad1 100644 --- a/projects/samples/devices/worlds/.track.wbproj +++ b/projects/samples/devices/worlds/.track.wbproj @@ -1,7 +1,7 @@ Webots Project File version R2023a -perspectives: 000000ff00000000fd00000002000000010000012e00000311fc0200000001fb0000001400540065007800740045006400690074006f0072010000001900000311000000ad00ffffff000000030000073f000000dafc0100000001fb0000000e0043006f006e0073006f006c006501000000000000073f0000005a00ffffff0000060b0000031100000001000000020000000100000008fc00000000 -simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000006010000000101 -sceneTreePerspectives: 000000ff0000000100000002000000c0000001120100000006010000000201 +perspectives: 000000ff00000000fd00000002000000010000012e000002f0fc0200000001fb0000001400540065007800740045006400690074006f00720100000016000002f00000008900ffffff0000000300000738000000dafc0100000002fb0000000e0043006f006e0073006f006c006501000000000000073f0000000000000000fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c0100000000000007380000006900ffffff00000608000002f000000001000000020000000100000008fc00000000 +simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000002010000000101 +sceneTreePerspectives: 000000ff00000001000000030000001c000002b3000000fa0100000002010000000201 maximizedDockId: -1 centralWidgetVisible: 1 orthographicViewHeight: 1 diff --git a/projects/samples/devices/worlds/track.wbt b/projects/samples/devices/worlds/track.wbt index e01726d26f8..38e0827bae6 100644 --- a/projects/samples/devices/worlds/track.wbt +++ b/projects/samples/devices/worlds/track.wbt @@ -2,7 +2,6 @@ EXTERNPROTO "webots://projects/objects/backgrounds/protos/TexturedBackground.proto" EXTERNPROTO "webots://projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" -EXTERNPROTO "webots://projects/objects/floors/protos/RectangleArena.proto" WorldInfo { info [ @@ -21,16 +20,13 @@ WorldInfo { ] } Viewpoint { - orientation 0.16070097299661462 0.7485211140651568 -0.6433438731165457 0.644164285586381 - position -2.2710650615092054 0.8391628545721497 1.372578197601706 + orientation 0.16209099277053524 0.7549960525502184 -0.635379784614092 0.6516820594327573 + position -2.2590070834191676 0.8337352637274158 1.4033237249209494 } TexturedBackground { } TexturedBackgroundLight { } -RectangleArena { - floorSize 2 2 -} DEF TRACKED_ROBOT Robot { translation 0.547744 -0.672268 0.07 rotation 0 0 -1 -2.094395 @@ -308,133 +304,3 @@ DEF TRACKED_ROBOT Robot { } controller "track" } -DEF CONVEYOR_BELT Robot { - translation -0.6 0 0.06 - rotation 0 0 1 -1.570795 - children [ - Shape { - appearance DEF APP PBRAppearance { - baseColor 0.635294 0.607843 0.607843 - roughness 1 - metalness 0 - } - geometry DEF PLANE Box { - size 0.66 0.1 0.12 - } - } - Track { - translation 0 0 0.064 - children [ - DEF BELT Shape { - appearance PBRAppearance { - baseColorMap ImageTexture { - url [ - "webots://projects/default/worlds/textures/checkered_marble.jpg" - ] - } - roughness 1 - metalness 0 - textureTransform TextureTransform { - scale 40 1 - } - } - geometry Box { - size 0.54 0.04 0.004 - } - } - ] - boundingObject USE BELT - physics Physics { - density -1 - mass 10 - } - device [ - LinearMotor { - } - ] - textureAnimation 1.85 0 - } - ] - name "conveyor robot" - boundingObject Group { - children [ - USE PLANE - ] - } - controller "track_conveyor_belt" -} -DEF BOX_1 Solid { - translation -0.6 -0.16 0.145 - rotation 0 0 1 -1.570795 - children [ - Shape { - appearance PBRAppearance { - baseColor 0.992157 0.00784314 0.00784314 - roughness 1 - metalness 0 - } - geometry DEF BO Box { - size 0.02 0.02 0.02 - } - } - ] - name "box 1" - boundingObject USE BO - physics Physics { - } -} -DEF BOX_2 Solid { - translation -0.6 -0.06 0.145 - rotation 0 0 1 -1.570795 - children [ - Shape { - appearance PBRAppearance { - baseColor 0.992157 0.00784314 0.00784314 - roughness 1 - metalness 0 - } - geometry USE BO - } - ] - name "box 2" - boundingObject USE BO - physics Physics { - } -} -DEF BOX_3 Solid { - translation -0.6 0.04 0.145 - rotation 0 0 1 -1.570795 - children [ - Shape { - appearance PBRAppearance { - baseColor 0.992157 0.00784314 0.00784314 - roughness 1 - metalness 0 - } - geometry USE BO - } - ] - name "box 3" - boundingObject USE BO - physics Physics { - } -} -DEF OBSTACLE_GREEN Solid { - translation 0.282729 -0.23299 0.025 - rotation 0.08186798416599658 0.0730449858724437 -0.993962807758666 0.78828 - children [ - Shape { - appearance PBRAppearance { - baseColor 0 1 0 - roughness 1 - metalness 0 - } - geometry DEF BO Box { - size 0.2 0.6 0.05 - } - } - ] - name "green obstacle" - boundingObject USE BO - rotationStep 0.00261799 -} diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 3d6040c2869..8dee55151af 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -197,7 +197,8 @@ export default class Parser { node.tagName === 'DistanceSensor' || node.tagName === 'Emitter' || node.tagName === 'GPS' || node.tagName === 'Gyro' || node.tagName === 'InertialUnit' || node.tagName === 'LED' || node.tagName === 'Lidar' || node.tagName === 'LightSensor' || node.tagName === 'Pen' || node.tagName === 'Radar' || node.tagName === 'RangeFinder' || - node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor') + node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor' || node.tagName === 'Track' || + node.tagName === 'TrackWheel') result = this.#parseTransform(node, parentNode, isBoundingObject); else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') result = this.#parseJoint(node, parentNode); @@ -519,10 +520,10 @@ export default class Parser { let name = getNodeAttribute(node, 'name', ''); let newNode; - if (type === 'track') { + if (type === 'track' || node.tagName === 'Track') { const geometriesCount = parseInt(getNodeAttribute(node, 'geometriesCount', '10')); newNode = new WbTrack(id, translation, scale, rotation, geometriesCount); - } else if (type === 'trackwheel') { + } else if (type === 'trackwheel' || node.tagName === 'Trackwheel') { const radius = parseFloat(getNodeAttribute(node, 'radius', '0.1')); const inner = getNodeAttribute(node, 'inner', '0').toLowerCase() === '1'; @@ -779,9 +780,9 @@ export default class Parser { logicalDevice = new WbRotationalMotor(id, name, minPosition, maxPosition); else logicalDevice = new WbLinearMotor(id, name, minPosition, maxPosition); - } + } - WbWorld.instance.nodes.set(logicalDevice.id, logicalDevice); + WbWorld.instance.nodes.set(logicalDevice.id, logicalDevice); if (typeof parentNode !== 'undefined') { logicalDevice.parent = parentNode.id; diff --git a/resources/web/wwi/nodes/WbBallJoint.js b/resources/web/wwi/nodes/WbBallJoint.js index 12510647cc5..0a10b0eda32 100644 --- a/resources/web/wwi/nodes/WbBallJoint.js +++ b/resources/web/wwi/nodes/WbBallJoint.js @@ -8,12 +8,12 @@ export default class WbBallJoint extends WbHinge2Joint { this.#device3 = []; } - get device2() { + get device3() { return this.#device3; } - set device2(device) { - return this.#device3; + set device3(device) { + this.#device3 = device; } get jointParameters3() { diff --git a/resources/web/wwi/nodes/WbHinge2Joint.js b/resources/web/wwi/nodes/WbHinge2Joint.js index 755611757e7..3021de7e054 100644 --- a/resources/web/wwi/nodes/WbHinge2Joint.js +++ b/resources/web/wwi/nodes/WbHinge2Joint.js @@ -13,7 +13,7 @@ export default class WbHinge2Joint extends WbHingeJoint { } set device2(device) { - return this.#device2; + this.#device2 = device; } get jointParameters2() { diff --git a/resources/web/wwi/nodes/WbHingeJoint.js b/resources/web/wwi/nodes/WbHingeJoint.js index e69e3e55f39..ea56e37897e 100644 --- a/resources/web/wwi/nodes/WbHingeJoint.js +++ b/resources/web/wwi/nodes/WbHingeJoint.js @@ -12,7 +12,7 @@ export default class WbHingeJoint extends WbJoint { } set device(device) { - return this.#device; + this.#device = device; } preFinalize() { diff --git a/resources/web/wwi/nodes/WbSliderJoint.js b/resources/web/wwi/nodes/WbSliderJoint.js index 6a955dbe2b8..2743f769a5e 100644 --- a/resources/web/wwi/nodes/WbSliderJoint.js +++ b/resources/web/wwi/nodes/WbSliderJoint.js @@ -12,7 +12,7 @@ export default class WbSliderJoint extends WbJoint { } set device(device) { - return this.#device; + this.#device = device; } preFinalize() { diff --git a/resources/web/wwi/nodes/WbTrack.js b/resources/web/wwi/nodes/WbTrack.js index 79987e234fc..57704a2ee02 100644 --- a/resources/web/wwi/nodes/WbTrack.js +++ b/resources/web/wwi/nodes/WbTrack.js @@ -10,6 +10,7 @@ import {getAnId} from './utils/id_provider.js'; import {clampedAcos} from './utils/math_utils.js'; export default class WbTrack extends WbSolid { + #device; constructor(id, translation, scale, rotation, geometriesCount) { super(id, translation, scale, rotation); this.geometriesCount = geometriesCount; @@ -17,10 +18,19 @@ export default class WbTrack extends WbSolid { this.wheelsList = []; this.beltElements = []; this.beltPositions = []; + this.#device = []; this.linearSpeed = 0; this.animationStepSize = 0; } + get device() { + return this.#device; + } + + set device(device) { + this.#device = device; + } + delete() { this.clearAnimatedGeometries(); super.delete(); diff --git a/resources/web/wwi/protoDesigner/classes/FieldModel.js b/resources/web/wwi/protoDesigner/classes/FieldModel.js index a9fe858b863..ffe22d96d11 100644 --- a/resources/web/wwi/protoDesigner/classes/FieldModel.js +++ b/resources/web/wwi/protoDesigner/classes/FieldModel.js @@ -264,6 +264,10 @@ export const FieldModel = { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode, 'name': VRML.SFString, 'boundingObject': VRML.SFNode, 'device': VRML.MFNode, 'animatedGeometry': VRML.SFNode, 'geometriesCount': VRML.SFInt32 }, 'unsupported': {'model': VRML.SFString, 'description': VRML.SFString, 'contactMaterial': VRML.SFString, 'immersionProperties': VRML.MFNode, 'physics': VRML.SFNode, 'locked': VRML.SFBool, 'radarCrossSection': VRML.SFFloat, 'recognitionColors': VRML.MFColor, 'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat, 'linearVelocity': VRML.SFVec3f, 'angularVelocity': VRML.SFVec3f, 'textureAnimation': VRML.SFVec2f} }, + 'TrackWheel': { + 'supported': {'children': VRML.MFNode, 'position': VRML.SFVec2f, 'rotation': VRML.SFRotation, 'radius': VRML.SFFloat, 'inner': VRML.SFBool}, + 'unsupported': {} + }, 'Transform': { 'supported': {'translation': VRML.SFVec3f, 'rotation': VRML.SFRotation, 'scale': VRML.SFVec3f, 'children': VRML.MFNode}, 'unsupported': {'translationStep': VRML.SFFloat, 'rotationStep': VRML.SFFloat} diff --git a/resources/web/wwi/protos/ProtoTrack.proto b/resources/web/wwi/protos/ProtoTrack.proto new file mode 100644 index 00000000000..2eee518c89c --- /dev/null +++ b/resources/web/wwi/protos/ProtoTrack.proto @@ -0,0 +1,282 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoTrack [ +] +{ +DEF TRACKED_ROBOT Robot { + translation 0.547744 -0.672268 0.07 + rotation 0 0 -1 -2.094395 + children [ + DEF GEOM Shape { + appearance PBRAppearance { + baseColor 0 0 1 + roughness 1 + metalness 0 + } + geometry Box { + size 0.3 0.13 0.08 + } + } + DEF LEFT_TRACK Track { + translation 0 0.07 0 + scale 0.5 0.5 0.5 + children [ + DEF WHEEL1_LEFT TrackWheel { + position -0.3 0.015 + radius 0.092 + children [ + DEF TRACK_WHEEL_BIG Transform { + rotation -1 0 0 3.141589 + children [ + Shape { + appearance PBRAppearance { + baseColorMap ImageTexture { + url [ + "webots://projects/samples/devices/worlds/textures/tank_wheel.jpg" + ] + } + roughness 1 + metalness 0 + } + geometry Cylinder { + height 0.03 + radius 0.092 + subdivision 20 + } + } + ] + } + ] + } + DEF WHEEL2_LEFT TrackWheel { + position 0.288 0.015 + radius 0.092 + children [ + USE TRACK_WHEEL_BIG + ] + } + DEF WHEEL3_LEFT TrackWheel { + position 0.185 -0.088 + radius 0.04 + children [ + DEF TRACK_WHEEL_SMALL Transform { + rotation -1 0 0 3.141589 + children [ + Shape { + appearance PBRAppearance { + baseColorMap ImageTexture { + url [ + "webots://projects/samples/devices/worlds/textures/tank_wheel.jpg" + ] + } + roughness 1 + metalness 0 + } + geometry Cylinder { + height 0.02 + radius 0.04 + subdivision 20 + } + } + ] + } + ] + } + DEF WHEEL4_LEFT TrackWheel { + position 0.09135 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL5_LEFT TrackWheel { + position -0.00245 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL6_LEFT TrackWheel { + position -0.09625 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL7_LEFT TrackWheel { + position -0.19 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + ] + name "left track" + contactMaterial "track material" + boundingObject DEF TRACK_BO Group { + children [ + Transform { + translation 0 0 -0.009 + rotation 1 0 0 1.570796 + children [ + Box { + size 0.39 0.248 0.03 + } + ] + } + Transform { + translation 0.237434 0 -0.06918 + rotation 0.9561247250869316 -0.20715394043734683 0.20715394043734683 1.615648 + children [ + Box { + size 0.13 0.08 0.03 + } + ] + translationStep 0.001 + rotationStep 0.00261799 + } + Transform { + translation -0.242803 0 -0.070833 + rotation 0.959691189146035 0.19873703916918628 -0.19873703916918628 1.611928 + children [ + Box { + size 0.13 0.08 0.03 + } + ] + translationStep 0.001 + rotationStep 0.00261799 + } + Transform { + translation -0.302 0 0.017 + rotation 1 0 0 1.5708 + children [ + DEF WHEEL_BO Cylinder { + height 0.03 + radius 0.1 + subdivision 16 + } + ] + } + Transform { + translation 0.288 0 0.017 + rotation 1 0 0 1.5708 + children [ + USE WHEEL_BO + ] + } + ] + } + physics Physics { + } + device [ + LinearMotor { + name "left motor" + } + ] + animatedGeometry DEF ANIMATED_GEOM Group { + children [ + Shape { + appearance PBRAppearance { + baseColor 0.141176 0.141176 0.141176 + roughness 1 + metalness 0 + } + geometry Box { + size 0.044 0.03 0.005 + } + } + Transform { + translation 0 0 0.003 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.141176 0.141176 0.141176 + roughness 1 + metalness 0 + } + geometry Box { + size 0.02 0.03 0.006 + } + } + ] + } + ] + } + geometriesCount 40 + } + DEF RIGHT_TRACK Track { + translation 0 -0.07 0 + scale 0.5 0.5 0.5 + children [ + DEF WHEEL1_RIGHT TrackWheel { + position -0.3 0.015 + radius 0.092 + children [ + USE TRACK_WHEEL_BIG + ] + } + DEF WHEEL2_RIGHT TrackWheel { + position 0.288 0.015 + radius 0.092 + children [ + USE TRACK_WHEEL_BIG + ] + } + DEF WHEEL3_RIGHT TrackWheel { + position 0.185 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL4_RIGHT TrackWheel { + position 0.09135 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL5_RIGHT TrackWheel { + position -0.00245 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL6_RIGHT TrackWheel { + position -0.09625 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + DEF WHEEL7_RIGHT TrackWheel { + position -0.19 -0.088 + radius 0.04 + children [ + USE TRACK_WHEEL_SMALL + ] + } + ] + name "right track" + contactMaterial "track material" + boundingObject USE TRACK_BO + physics Physics { + } + device [ + LinearMotor { + name "right motor" + } + ] + animatedGeometry USE ANIMATED_GEOM + geometriesCount 40 + } + ] + name "tracked robot" + boundingObject USE GEOM + physics Physics { + density -1 + mass 40 + } +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 4db8023e5d4..31560e51c76 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoSolidDevice.proto"); + webotsView.loadProto("protos/ProtoTrack.proto"); From 6f32f1836ef5e3c073ed5cd0e3fbea9c0a5812d1 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 16:19:23 +0200 Subject: [PATCH 12/20] propeller --- resources/web/wwi/Parser.js | 4 +- resources/web/wwi/nodes/WbGroup.js | 11 + .../wwi/protoDesigner/classes/ProtoParser.js | 2 +- resources/web/wwi/protos/ProtoPropeller.proto | 412 ++++++++++++++++++ resources/web/wwi/test.html | 2 +- 5 files changed, 427 insertions(+), 4 deletions(-) create mode 100644 resources/web/wwi/protos/ProtoPropeller.proto diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 8dee55151af..830f0d00e85 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -209,7 +209,7 @@ export default class Parser { result = this.#parseLogicalDevice(node, parentNode); else if (node.tagName === 'Billboard') result = this.#parseBillboard(node, parentNode); - else if (node.tagName === 'Group') + else if (node.tagName === 'Group' || node.tagName === 'Propeller') result = this.#parseGroup(node, parentNode); else if (node.tagName === 'Shape') result = this.#parseShape(node, parentNode, isBoundingObject); @@ -655,7 +655,7 @@ export default class Parser { const id = this.#parseId(node); - const isPropeller = getNodeAttribute(node, 'type', '').toLowerCase() === 'propeller'; + const isPropeller = getNodeAttribute(node, 'type', '').toLowerCase() === 'propeller' || node.tagName === 'Propeller'; const isBoundingObject = getNodeAttribute(node, 'role', undefined) === 'boundingObject'; const group = new WbGroup(id, isPropeller); diff --git a/resources/web/wwi/nodes/WbGroup.js b/resources/web/wwi/nodes/WbGroup.js index bd0fc12ff1b..e58d8992b0e 100644 --- a/resources/web/wwi/nodes/WbGroup.js +++ b/resources/web/wwi/nodes/WbGroup.js @@ -5,12 +5,23 @@ import WbWorld from './WbWorld.js'; import {getAnId} from './utils/id_provider.js'; export default class WbGroup extends WbBaseNode { + #device; constructor(id, isPropeller) { super(id); this.children = []; this.isPropeller = isPropeller; this.currentHelix = -1; // to switch between fast and slow helix + if (isPropeller) + this.#device = []; + } + + get device() { + return this.#device; + } + + set device(device) { + this.#device = device; } clone(customID) { diff --git a/resources/web/wwi/protoDesigner/classes/ProtoParser.js b/resources/web/wwi/protoDesigner/classes/ProtoParser.js index 06df913336d..52d36ec16a6 100644 --- a/resources/web/wwi/protoDesigner/classes/ProtoParser.js +++ b/resources/web/wwi/protoDesigner/classes/ProtoParser.js @@ -75,7 +75,7 @@ export default class ProtoParser { this.x3dNodes.push(nodeElement.getAttribute('id')); if (typeof alias !== 'undefined') { if (this.defList.has(alias)) - throw new Error('DEF nodes must be unique.'); + throw new Error('DEF nodes must be unique: ' + alias); this.defList.set(alias, {id: nodeElement.getAttribute('id'), typeName: nodeName}); } diff --git a/resources/web/wwi/protos/ProtoPropeller.proto b/resources/web/wwi/protos/ProtoPropeller.proto new file mode 100644 index 00000000000..2605696511c --- /dev/null +++ b/resources/web/wwi/protos/ProtoPropeller.proto @@ -0,0 +1,412 @@ +#VRML_SIM R2023a utf8 + +PROTO ProtoPropeller [ + +] +{ +DEF RED_HELICOPTER Robot { + translation 0.306436 -0.076934 -0.01 + rotation 0 0 1 3.14159 + children [ + GPS { + } + InertialUnit { + rotation 0 0 1 3.14159 + } + DEF BODY Transform { + translation 0 0 0.1 + rotation -0.5773509358554485 -0.5773509358554485 -0.5773489358556708 -2.094397 + children [ + Shape { + appearance DEF RED_METAL PBRAppearance { + baseColor 0.941176 0.027451 0.027451 + roughness 1.1102230246251565e-16 + metalness 0 + } + geometry Capsule { + height 0.1 + radius 0.05 + subdivision 24 + } + } + ] + } + DEF COCKPIT_WINDOW Transform { + translation 0.065 0 0.105 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.662745 0.858824 0.913725 + transparency 0.10000000149011612 + roughness 1.1102230246251565e-16 + metalness 0 + } + geometry Sphere { + radius 0.042 + subdivision 2 + } + } + ] + } + DEF TAIL Transform { + translation -0.13 0 0.1 + rotation 0 1 0 -0.03 + children [ + Shape { + appearance USE RED_METAL + geometry Box { + size 0.15 0.01 0.021 + } + } + ] + } + DEF TAIL_AXLE Transform { + translation -0.19 0 0.101 + rotation 1 0 0 1.5708 + children [ + Shape { + appearance USE RED_METAL + geometry Cylinder { + height 0.01 + radius 0.02 + subdivision 24 + } + } + Shape { + appearance USE RED_METAL + geometry Cylinder { + height 0.06 + radius 0.01 + subdivision 24 + } + } + Transform { + translation 0 0 0.01 + rotation 0.7071067811865476 0.7071067811865476 0 3.141591 + children [ + Shape { + appearance DEF BLACK_METAL PBRAppearance { + baseColor 0 0 0 + roughness 1.1102230246251565e-16 + metalness 0 + } + geometry Cylinder { + height 0.06 + radius 0.003 + subdivision 24 + } + } + ] + } + ] + } + DEF MAIN_AXLE_LARGE Transform { + translation 0.01 0 0.16 + rotation 0 0 1 1.570796 + children [ + Shape { + appearance USE RED_METAL + geometry Cylinder { + bottom FALSE + height 0.02 + radius 0.02 + subdivision 24 + } + } + ] + } + DEF MAIN_AXLE_THIN Transform { + translation 0.01 0 0.16 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.8 0.8 0.8 + roughness 1.1102230246251565e-16 + metalness 0 + } + geometry Cylinder { + height 0.07 + radius 0.004 + subdivision 24 + } + } + ] + } + Transform { + translation 0.01 0 0.168 + rotation 0 0 1 1.570796 + children [ + Shape { + appearance USE RED_METAL + geometry Sphere { + radius 0.0132 + subdivision 2 + } + } + ] + } + DEF RIGHT_SKI_ANCHORS Transform { + translation 0 -0.052 0 + rotation -1 0 0 -1.270797 + children [ + DEF SKI_GROUP Group { + children [ + Transform { + translation 0.03 0.04 0 + rotation -1 0 0 -1.5708 + children [ + DEF LEG_SHAPE Shape { + appearance PBRAppearance { + baseColor 0 0 0 + roughness 1.1102230246251565e-16 + metalness 0 + } + geometry Cylinder { + bottom FALSE + height 0.05 + radius 0.0035 + top FALSE + } + } + ] + } + Transform { + translation -0.03 0.04 0 + rotation -1 0 0 -1.5708 + children [ + USE LEG_SHAPE + ] + } + ] + } + ] + } + DEF RIGHT_SKI Transform { + translation 0 -0.048 0.015 + rotation 0.5773489358533613 0.5773489358533613 0.5773529358529169 2.094391 + children [ + Shape { + appearance USE BLACK_METAL + geometry Capsule { + height 0.11 + radius 0.005 + } + } + ] + } + DEF LEFT_SKI_ANCHORS Transform { + translation 0 0.052 0 + rotation -1 0 0 -1.870795 + children [ + USE SKI_GROUP + ] + } + DEF LEFT_SKI Transform { + translation 0 0.048 0.015 + rotation 0.5773509358554485 0.5773509358554485 -0.5773489358556708 -2.094397 + children [ + Shape { + appearance USE BLACK_METAL + geometry Capsule { + height 0.11 + radius 0.005 + } + } + ] + } + DEF MAIN_ROTOR Propeller { + shaftAxis 0 0 1 + centerOfThrust 0.00963802 0 0.19 + thrustConstants 0.0016657 0.001 + torqueConstants 1e-07 1e-07 + device RotationalMotor { + name "main_motor" + acceleration 50 + maxVelocity 400 + maxTorque 15 + } + fastHelix DEF FAST_HELIX Solid { + translation 0.01 0 0.2 + children [ + DEF FAST_MAIN_HELIX_SHAPE Shape { + appearance DEF FAST_HELIX_APPEARANCE PBRAppearance { + baseColorMap ImageTexture { + url [ + "webots://projects/samples/devices/worlds/textures/blurred_helix.png" + ] + } + transparency 0.5 + roughness 0.5 + metalness 0 + } + geometry Cylinder { + height 0.003 + radius 0.145 + side FALSE + subdivision 24 + } + } + ] + } + slowHelix DEF SLOW_HELIX Solid { + translation 0.01 0 0.2 + rotation -1 0 0 -1.570796 + children [ + DEF SLOW_MAIN_HELIX_TRANSFORM Transform { + rotation 0 0 1 1.570796 + children [ + DEF SLOW_MAIN_HELIX_GROUP Group { + children [ + Shape { + appearance USE BLACK_METAL + geometry Capsule { + height 0.02 + radius 0.01 + } + } + Shape { + appearance USE BLACK_METAL + geometry Cylinder { + height 0.07 + radius 0.004 + } + } + DEF RIGHT_BLADE Transform { + translation 0 0 0.09 + rotation 0 0 1 0.361801 + children [ + DEF BLADE_SHAPE Shape { + appearance PBRAppearance { + baseColor 0.8 0.8 0.8 + roughness 1 + metalness 0 + } + geometry Box { + size 0.01 0.004 0.11 + } + } + ] + } + Transform { + translation 0 0 -0.09 + rotation 0 0 1 -0.361799 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.8 0.8 0.8 + roughness 1 + metalness 0 + } + geometry Box { + size 0.01 0.004 0.11 + } + } + ] + } + ] + } + ] + } + ] + } + } + DEF TAIL_ROTOR Propeller { + shaftAxis 0 -1 0 + centerOfThrust -0.19 0 0.101009 + thrustConstants 5e-07 0 + torqueConstants 0 0 + device RotationalMotor { + name "tail_motor" + acceleration 50 + maxVelocity 400 + maxTorque 30 + } + fastHelix Solid { + translation -0.19 -0.045 0.101 + rotation -0.577349935856137 0.577349935856137 0.5773509358560258 2.094395 + children [ + DEF TAIL_FAST_HELIX_SHAPE Shape { + appearance USE FAST_HELIX_APPEARANCE + geometry Cylinder { + height 0.003 + radius 0.055 + side FALSE + subdivision 24 + } + } + ] + } + slowHelix DEF HELIX Solid { + translation -0.19 -0.045 0.101 + rotation -1 0 0 3.141591 + children [ + DEF SLOW_TAIL_HELIX Transform { + rotation 0 0 1 1.570796 + children [ + DEF SLOW_TAIL_HELIX_GROUP Group { + children [ + DEF HUB Shape { + appearance USE BLACK_METAL + geometry Capsule { + height 0.01 + radius 0.01 + } + } + DEF BLADE_PITCH_AXIS Shape { + appearance USE BLACK_METAL + geometry Cylinder { + height 0.05 + radius 0.004 + } + } + Transform { + translation 0 0 0.04 + rotation 0 0 1 1.932596 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.8 0.8 0.8 + roughness 1 + metalness 0 + } + geometry Box { + size 0.006 0.002 0.03 + } + } + ] + } + Transform { + translation 0 0 -0.04 + rotation 0 0 1 1.208796 + children [ + USE BLADE_SHAPE + ] + } + ] + } + ] + } + ] + } + } + ] + name "red helicopter" + boundingObject Group { + children [ + USE BODY + USE COCKPIT_WINDOW + USE TAIL + USE RIGHT_SKI + USE LEFT_SKI + USE MAIN_AXLE_LARGE + USE MAIN_AXLE_THIN + ] + } + physics Physics { + damping Damping { + } + } + controller "axial_and_tail_rotors" + supervisor TRUE +} +} diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 31560e51c76..6ff9de2e60c 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoTrack.proto"); + webotsView.loadProto("protos/ProtoPropeller.proto"); From 65d923416be71891ac90c19c1100e21b461661c3 Mon Sep 17 00:00:00 2001 From: BenjaminDeleze Date: Thu, 13 Oct 2022 16:33:18 +0200 Subject: [PATCH 13/20] clean project --- projects/samples/devices/worlds/.track.wbproj | 6 +- projects/samples/devices/worlds/track.wbt | 138 +++++++++++++++++- 2 files changed, 139 insertions(+), 5 deletions(-) diff --git a/projects/samples/devices/worlds/.track.wbproj b/projects/samples/devices/worlds/.track.wbproj index 768f9305ad1..b6bf8b3177e 100644 --- a/projects/samples/devices/worlds/.track.wbproj +++ b/projects/samples/devices/worlds/.track.wbproj @@ -1,7 +1,7 @@ Webots Project File version R2023a -perspectives: 000000ff00000000fd00000002000000010000012e000002f0fc0200000001fb0000001400540065007800740045006400690074006f00720100000016000002f00000008900ffffff0000000300000738000000dafc0100000002fb0000000e0043006f006e0073006f006c006501000000000000073f0000000000000000fb0000001a0043006f006e0073006f006c00650041006c006c0041006c006c0100000000000007380000006900ffffff00000608000002f000000001000000020000000100000008fc00000000 -simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000002010000000101 -sceneTreePerspectives: 000000ff00000001000000030000001c000002b3000000fa0100000002010000000201 +perspectives: 000000ff00000000fd00000002000000010000012e00000311fc0200000001fb0000001400540065007800740045006400690074006f0072010000001900000311000000ad00ffffff000000030000073f000000dafc0100000001fb0000000e0043006f006e0073006f006c006501000000000000073f0000005a00ffffff0000060b0000031100000001000000020000000100000008fc00000000 +simulationViewPerspectives: 000000ff00000001000000020000016c000004a00100000006010000000101 +sceneTreePerspectives: 000000ff0000000100000002000000c0000001120100000006010000000201 maximizedDockId: -1 centralWidgetVisible: 1 orthographicViewHeight: 1 diff --git a/projects/samples/devices/worlds/track.wbt b/projects/samples/devices/worlds/track.wbt index 38e0827bae6..e01726d26f8 100644 --- a/projects/samples/devices/worlds/track.wbt +++ b/projects/samples/devices/worlds/track.wbt @@ -2,6 +2,7 @@ EXTERNPROTO "webots://projects/objects/backgrounds/protos/TexturedBackground.proto" EXTERNPROTO "webots://projects/objects/backgrounds/protos/TexturedBackgroundLight.proto" +EXTERNPROTO "webots://projects/objects/floors/protos/RectangleArena.proto" WorldInfo { info [ @@ -20,13 +21,16 @@ WorldInfo { ] } Viewpoint { - orientation 0.16209099277053524 0.7549960525502184 -0.635379784614092 0.6516820594327573 - position -2.2590070834191676 0.8337352637274158 1.4033237249209494 + orientation 0.16070097299661462 0.7485211140651568 -0.6433438731165457 0.644164285586381 + position -2.2710650615092054 0.8391628545721497 1.372578197601706 } TexturedBackground { } TexturedBackgroundLight { } +RectangleArena { + floorSize 2 2 +} DEF TRACKED_ROBOT Robot { translation 0.547744 -0.672268 0.07 rotation 0 0 -1 -2.094395 @@ -304,3 +308,133 @@ DEF TRACKED_ROBOT Robot { } controller "track" } +DEF CONVEYOR_BELT Robot { + translation -0.6 0 0.06 + rotation 0 0 1 -1.570795 + children [ + Shape { + appearance DEF APP PBRAppearance { + baseColor 0.635294 0.607843 0.607843 + roughness 1 + metalness 0 + } + geometry DEF PLANE Box { + size 0.66 0.1 0.12 + } + } + Track { + translation 0 0 0.064 + children [ + DEF BELT Shape { + appearance PBRAppearance { + baseColorMap ImageTexture { + url [ + "webots://projects/default/worlds/textures/checkered_marble.jpg" + ] + } + roughness 1 + metalness 0 + textureTransform TextureTransform { + scale 40 1 + } + } + geometry Box { + size 0.54 0.04 0.004 + } + } + ] + boundingObject USE BELT + physics Physics { + density -1 + mass 10 + } + device [ + LinearMotor { + } + ] + textureAnimation 1.85 0 + } + ] + name "conveyor robot" + boundingObject Group { + children [ + USE PLANE + ] + } + controller "track_conveyor_belt" +} +DEF BOX_1 Solid { + translation -0.6 -0.16 0.145 + rotation 0 0 1 -1.570795 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.992157 0.00784314 0.00784314 + roughness 1 + metalness 0 + } + geometry DEF BO Box { + size 0.02 0.02 0.02 + } + } + ] + name "box 1" + boundingObject USE BO + physics Physics { + } +} +DEF BOX_2 Solid { + translation -0.6 -0.06 0.145 + rotation 0 0 1 -1.570795 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.992157 0.00784314 0.00784314 + roughness 1 + metalness 0 + } + geometry USE BO + } + ] + name "box 2" + boundingObject USE BO + physics Physics { + } +} +DEF BOX_3 Solid { + translation -0.6 0.04 0.145 + rotation 0 0 1 -1.570795 + children [ + Shape { + appearance PBRAppearance { + baseColor 0.992157 0.00784314 0.00784314 + roughness 1 + metalness 0 + } + geometry USE BO + } + ] + name "box 3" + boundingObject USE BO + physics Physics { + } +} +DEF OBSTACLE_GREEN Solid { + translation 0.282729 -0.23299 0.025 + rotation 0.08186798416599658 0.0730449858724437 -0.993962807758666 0.78828 + children [ + Shape { + appearance PBRAppearance { + baseColor 0 1 0 + roughness 1 + metalness 0 + } + geometry DEF BO Box { + size 0.2 0.6 0.05 + } + } + ] + name "green obstacle" + boundingObject USE BO + rotationStep 0.00261799 +} From 4a2a2e5db253b0098bf93fdb30cefc5a4bee0e33 Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Fri, 14 Oct 2022 08:18:19 +0200 Subject: [PATCH 14/20] reorder --- resources/web/wwi/Parser.js | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 830f0d00e85..b34423a402a 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -191,15 +191,6 @@ export default class Parser { WbWorld.instance.viewpoint = this.#parseViewpoint(node); else if (node.tagName === 'Background') result = this.#parseBackground(node); - else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || - node.tagName === 'Accelerometer' || node.tagName === 'Altimeter' || node.tagName === 'Camera' || - node.tagName === 'Charger' || node.tagName === 'Compass' || node.tagName === 'Connector' || node.tagName === 'Display' || - node.tagName === 'DistanceSensor' || node.tagName === 'Emitter' || node.tagName === 'GPS' || node.tagName === 'Gyro' || - node.tagName === 'InertialUnit' || node.tagName === 'LED' || node.tagName === 'Lidar' || - node.tagName === 'LightSensor' || node.tagName === 'Pen' || node.tagName === 'Radar' || node.tagName === 'RangeFinder' || - node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor' || node.tagName === 'Track' || - node.tagName === 'TrackWheel') - result = this.#parseTransform(node, parentNode, isBoundingObject); else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') result = this.#parseJoint(node, parentNode); else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters' || node.tagName === 'BallJointParameters') @@ -228,7 +219,16 @@ export default class Parser { result = this.#parseFog(node); else console.error('This world already has a fog.'); - } else { + } else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || + node.tagName === 'Accelerometer' || node.tagName === 'Altimeter' || node.tagName === 'Camera' || + node.tagName === 'Charger' || node.tagName === 'Compass' || node.tagName === 'Connector' || node.tagName === 'Display' || + node.tagName === 'DistanceSensor' || node.tagName === 'Emitter' || node.tagName === 'GPS' || node.tagName === 'Gyro' || + node.tagName === 'InertialUnit' || node.tagName === 'LED' || node.tagName === 'Lidar' || + node.tagName === 'LightSensor' || node.tagName === 'Pen' || node.tagName === 'Radar' || node.tagName === 'RangeFinder' || + node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor' || node.tagName === 'Track' || + node.tagName === 'TrackWheel') + result = this.#parseTransform(node, parentNode, isBoundingObject); + else { // Either it is a node added after the whole scene, or it is an unknown node, or a geometry bounding object let id; if (typeof parentNode !== 'undefined') @@ -741,7 +741,7 @@ export default class Parser { jointParameters = new WbHingeJointParameters(id, position, axis, anchor, minStop, maxStop); } else jointParameters = new WbBallJointParameters(id, position, undefined, anchor, minStop, maxStop); - + WbWorld.instance.nodes.set(jointParameters.id, jointParameters); if (typeof parentNode !== 'undefined') { From 196abd30beecf92bbc77b39ad64149132c77ed23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20D=C3=A9l=C3=A8ze?= Date: Fri, 14 Oct 2022 09:40:52 +0200 Subject: [PATCH 15/20] Update resources/web/wwi/Parser.js Co-authored-by: ad-daniel <44834743+ad-daniel@users.noreply.github.com> --- resources/web/wwi/Parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index b34423a402a..3fec4e69f87 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -1,7 +1,7 @@ import {M_PI_4} from './nodes/utils/constants.js'; +import WbAbstractAppearance from './nodes/WbAbstractAppearance.js'; import WbAccelerometer from './nodes/WbAccelerometer.js'; import WbAltimeter from './nodes/WbAltimeter.js'; -import WbAbstractAppearance from './nodes/WbAbstractAppearance.js'; import WbAppearance from './nodes/WbAppearance.js'; import WbBackground from './nodes/WbBackground.js'; import WbBallJoint from './nodes/WbBallJoint.js'; From 65ba97be0922ecb3c8a25b2d0b590e1b366a79cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20D=C3=A9l=C3=A8ze?= Date: Fri, 14 Oct 2022 09:41:00 +0200 Subject: [PATCH 16/20] Update resources/web/wwi/Parser.js Co-authored-by: ad-daniel <44834743+ad-daniel@users.noreply.github.com> --- resources/web/wwi/Parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 3fec4e69f87..c36985891a2 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -9,9 +9,9 @@ import WbBallJointParameters from './nodes/WbBallJointParameters.js'; import WbBillboard from './nodes/WbBillboard.js'; import WbBox from './nodes/WbBox.js'; import WbBrake from './nodes/WbBrake.js'; +import WbCadShape from './nodes/WbCadShape.js'; import WbCamera from './nodes/WbCamera.js'; import WbCapsule from './nodes/WbCapsule.js'; -import WbCadShape from './nodes/WbCadShape.js'; import WbCharger from './nodes/WbCharger.js'; import WbCompass from './nodes/WbCompass.js'; import WbCone from './nodes/WbCone.js'; From 0bb01f910b2d763635c5ecddfe1e1313c01f451a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20D=C3=A9l=C3=A8ze?= Date: Fri, 14 Oct 2022 09:41:13 +0200 Subject: [PATCH 17/20] Update resources/web/wwi/Parser.js Co-authored-by: ad-daniel <44834743+ad-daniel@users.noreply.github.com> --- resources/web/wwi/Parser.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index c36985891a2..c4e6dd59d38 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -43,12 +43,12 @@ import WbLightSensor from './nodes/WbLightSensor.js'; import WbLinearMotor from './nodes/WbLinearMotor.js'; import WbMaterial from './nodes/WbMaterial.js'; import WbMesh from './nodes/WbMesh.js'; -import WbPen from './nodes/WbPen.js'; -import WbPositionSensor from './nodes/WbPositionSensor.js'; import WbPbrAppearance from './nodes/WbPbrAppearance.js'; +import WbPen from './nodes/WbPen.js'; import WbPlane from './nodes/WbPlane.js'; import WbPointLight from './nodes/WbPointLight.js'; import WbPointSet from './nodes/WbPointSet.js'; +import WbPositionSensor from './nodes/WbPositionSensor.js'; import WbRadar from './nodes/WbRadar.js'; import WbRangeFinder from './nodes/WbRangeFinder.js'; import WbReceiver from './nodes/WbReceiver.js'; From 6bc53c80db9b090da49ec31167e07c3128374f22 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20D=C3=A9l=C3=A8ze?= Date: Fri, 14 Oct 2022 09:42:40 +0200 Subject: [PATCH 18/20] Update resources/web/wwi/Parser.js Co-authored-by: ad-daniel <44834743+ad-daniel@users.noreply.github.com> --- resources/web/wwi/Parser.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index c4e6dd59d38..54dc55f80f3 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -750,7 +750,7 @@ export default class Parser { parentNode.jointParameters = jointParameters; else parentNode.jointParameters2 = jointParameters; - }else if (parentNode instanceof WbHinge2Joint) { + } else if (parentNode instanceof WbHinge2Joint) { if (jointParameters instanceof WbHingeJointParameters) parentNode.jointParameters = jointParameters; else From e467b05c73b992a6fd454b36c691ad5cb1fcf83b Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Fri, 14 Oct 2022 10:17:24 +0200 Subject: [PATCH 19/20] e --- resources/web/wwi/Parser.js | 128 ++++++++++++------------------------ 1 file changed, 43 insertions(+), 85 deletions(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index 54dc55f80f3..f14e3fb2547 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -538,91 +538,49 @@ export default class Parser { name = 'solid'; } newNode = new WbSolid(id, translation, scale, rotation, name); - } else if (node.tagName === 'Accelerometer') { - if (name === '') - name = 'accelerometer'; - newNode = new WbAccelerometer(id, translation, scale, rotation, name); - } else if (node.tagName === 'Altimeter') { - if (name === '') - name = 'altimeter'; - newNode = new WbAltimeter(id, translation, scale, rotation, name); - } else if (node.tagName === 'Camera') { - if (name === '') - name = 'Camera'; - newNode = new WbCamera(id, translation, scale, rotation, name); - } else if (node.tagName === 'Charger') { - if (name === '') - name = 'charger'; - newNode = new WbCharger(id, translation, scale, rotation, name); - } else if (node.tagName === 'Compass') { - if (name === '') - name = 'compass'; - newNode = new WbCompass(id, translation, scale, rotation, name); - } else if (node.tagName === 'Connector') { - if (name === '') - name = 'connector'; - newNode = new WbConnector(id, translation, scale, rotation, name); - } else if (node.tagName === 'Display') { - if (name === '') - name = 'display'; - newNode = new WbDisplay(id, translation, scale, rotation, name); - } else if (node.tagName === 'DistanceSensor') { - if (name === '') - name = 'distance sensor'; - newNode = new WbDistanceSensor(id, translation, scale, rotation, name); - } else if (node.tagName === 'Emitter') { - if (name === '') - name = 'emitter'; - newNode = new WbEmitter(id, translation, scale, rotation, name); - } else if (node.tagName === 'GPS') { - if (name === '') - name = 'gps'; - newNode = new WbGps(id, translation, scale, rotation, name); - } else if (node.tagName === 'Gyro') { - if (name === '') - name = 'gyro'; - newNode = new WbGyro(id, translation, scale, rotation, name); - } else if (node.tagName === 'InertialUnit') { - if (name === '') - name = 'inertial unit'; - newNode = new WbInertialUnit(id, translation, scale, rotation, name); - } else if (node.tagName === 'LED') { - if (name === '') - name = 'led'; - newNode = new WbLed(id, translation, scale, rotation, name); - } else if (node.tagName === 'Lidar') { - if (name === '') - name = 'lidar'; - newNode = new WbLidar(id, translation, scale, rotation, name); - } else if (node.tagName === 'LightSensor') { - if (name === '') - name = 'light sensor'; - newNode = new WbLightSensor(id, translation, scale, rotation, name); - } else if (node.tagName === 'Pen') { - if (name === '') - name = 'pen'; - newNode = new WbPen(id, translation, scale, rotation, name); - } else if (node.tagName === 'Radar') { - if (name === '') - name = 'radar'; - newNode = new WbRadar(id, translation, scale, rotation, name); - } else if (node.tagName === 'RangeFinder') { - if (name === '') - name = 'range finder'; - newNode = new WbRangeFinder(id, translation, scale, rotation, name); - } else if (node.tagName === 'Receiver') { - if (name === '') - name = 'receiver'; - newNode = new WbReceiver(id, translation, scale, rotation, name); - } else if (node.tagName === 'Speaker') { - if (name === '') - name = 'speaker'; - newNode = new WbSpeaker(id, translation, scale, rotation, name); - } else if (node.tagName === 'TouchSensor') { - if (name === '') - name = 'touch sensor'; - newNode = new WbTouchSensor(id, translation, scale, rotation, name); - } else { + } else if (node.tagName === 'Accelerometer') + newNode = new WbAccelerometer(id, translation, scale, rotation, name === '' ? 'accelerometer' : name); + else if (node.tagName === 'Altimeter') + newNode = new WbAltimeter(id, translation, scale, rotation, name === '' ? 'altimeter' : name); + else if (node.tagName === 'Camera') + newNode = new WbCamera(id, translation, scale, rotation, name === '' ? 'camera' : name); + else if (node.tagName === 'Charger') + newNode = new WbCharger(id, translation, scale, rotation, name === '' ? 'charger' : name); + else if (node.tagName === 'Compass') + newNode = new WbCompass(id, translation, scale, rotation, name === '' ? 'compass' : name); + else if (node.tagName === 'Connector') + newNode = new WbConnector(id, translation, scale, rotation, name === '' ? 'connector' : name); + else if (node.tagName === 'Display') + newNode = new WbDisplay(id, translation, scale, rotation, name === '' ? 'display' : name); + else if (node.tagName === 'DistanceSensor') + newNode = new WbDistanceSensor(id, translation, scale, rotation, name === '' ? 'distance sensor' : name); + else if (node.tagName === 'Emitter') + newNode = new WbEmitter(id, translation, scale, rotation, name === '' ? 'emitter' : name); + else if (node.tagName === 'GPS') + newNode = new WbGps(id, translation, scale, rotation, name === '' ? 'gps' : name); + else if (node.tagName === 'Gyro') + newNode = new WbGyro(id, translation, scale, rotation, name === '' ? 'gyro' : name); + else if (node.tagName === 'InertialUnit') + newNode = new WbInertialUnit(id, translation, scale, rotation, name === '' ? 'inertial unit' : name); + else if (node.tagName === 'LED') + newNode = new WbLed(id, translation, scale, rotation, name === '' ? 'led' : name); + else if (node.tagName === 'Lidar') + newNode = new WbLidar(id, translation, scale, rotation, name === '' ? 'lidar' : name); + else if (node.tagName === 'LightSensor') + newNode = new WbLightSensor(id, translation, scale, rotation, name === '' ? 'light sensor' : name); + else if (node.tagName === 'Pen') + newNode = new WbPen(id, translation, scale, rotation, name === '' ? 'pen' : name); + else if (node.tagName === 'Radar') + newNode = new WbRadar(id, translation, scale, rotation, name === '' ? 'radar' : name); + else if (node.tagName === 'RangeFinder') + newNode = new WbRangeFinder(id, translation, scale, rotation, name === '' ? 'range finder' : name); + else if (node.tagName === 'Receiver') + newNode = new WbReceiver(id, translation, scale, rotation, name === '' ? 'receiver' : name); + else if (node.tagName === 'Speaker') + newNode = new WbSpeaker(id, translation, scale, rotation, name === '' ? 'speaker' : name); + else if (node.tagName === 'TouchSensor') + newNode = new WbTouchSensor(id, translation, scale, rotation, name === '' ? 'touch sensor' : name); + else { if (!isBoundingObject) isBoundingObject = getNodeAttribute(node, 'role', undefined) === 'boundingObject'; From d5ad9e64a6758999f2c3dcf51b7105096d0611d7 Mon Sep 17 00:00:00 2001 From: Benjamin Deleze Date: Fri, 14 Oct 2022 10:41:44 +0200 Subject: [PATCH 20/20] switch --- resources/web/wwi/Parser.js | 268 +++++++++++++++++++++--------------- resources/web/wwi/test.html | 2 +- 2 files changed, 157 insertions(+), 113 deletions(-) diff --git a/resources/web/wwi/Parser.js b/resources/web/wwi/Parser.js index f14e3fb2547..0488db2e6ed 100644 --- a/resources/web/wwi/Parser.js +++ b/resources/web/wwi/Parser.js @@ -182,122 +182,166 @@ export default class Parser { WbWorld.init(); let result; - if (node.tagName === 'Scene') { - this.#parseScene(node); - this.#parseChildren(node, parentNode); - } else if (node.tagName === 'WorldInfo') - this.#parseWorldInfo(node); - else if (node.tagName === 'Viewpoint') - WbWorld.instance.viewpoint = this.#parseViewpoint(node); - else if (node.tagName === 'Background') - result = this.#parseBackground(node); - else if (node.tagName === 'HingeJoint' || node.tagName === 'SliderJoint' || node.tagName === 'Hinge2Joint' || node.tagName === 'BallJoint') - result = this.#parseJoint(node, parentNode); - else if (node.tagName === 'HingeJointParameters' || node.tagName === 'JointParameters' || node.tagName === 'BallJointParameters') - result = this.#parseJointParameters(node, parentNode); - else if (node.tagName === 'PositionSensor' || node.tagName === 'Brake' || node.tagName === 'RotationalMotor' || - node.tagName === 'LinearMotor') - result = this.#parseLogicalDevice(node, parentNode); - else if (node.tagName === 'Billboard') - result = this.#parseBillboard(node, parentNode); - else if (node.tagName === 'Group' || node.tagName === 'Propeller') - result = this.#parseGroup(node, parentNode); - else if (node.tagName === 'Shape') - result = this.#parseShape(node, parentNode, isBoundingObject); - else if (node.tagName === 'Slot') - result = this.#parseSlot(node, parentNode); - else if (node.tagName === 'CadShape') - result = this.#parseCadShape(node, parentNode); - else if (node.tagName === 'DirectionalLight') - result = this.#parseDirectionalLight(node, parentNode); - else if (node.tagName === 'PointLight') - result = this.#parsePointLight(node, parentNode); - else if (node.tagName === 'SpotLight') - result = this.#parseSpotLight(node, parentNode); - else if (node.tagName === 'Fog') { - if (!WbWorld.instance.hasFog) - result = this.#parseFog(node); - else - console.error('This world already has a fog.'); - } else if (node.tagName === 'Transform' || node.tagName === 'Robot' || node.tagName === 'Solid' || - node.tagName === 'Accelerometer' || node.tagName === 'Altimeter' || node.tagName === 'Camera' || - node.tagName === 'Charger' || node.tagName === 'Compass' || node.tagName === 'Connector' || node.tagName === 'Display' || - node.tagName === 'DistanceSensor' || node.tagName === 'Emitter' || node.tagName === 'GPS' || node.tagName === 'Gyro' || - node.tagName === 'InertialUnit' || node.tagName === 'LED' || node.tagName === 'Lidar' || - node.tagName === 'LightSensor' || node.tagName === 'Pen' || node.tagName === 'Radar' || node.tagName === 'RangeFinder' || - node.tagName === 'Receiver' || node.tagName === 'Speaker' || node.tagName === 'TouchSensor' || node.tagName === 'Track' || - node.tagName === 'TrackWheel') - result = this.#parseTransform(node, parentNode, isBoundingObject); - else { - // Either it is a node added after the whole scene, or it is an unknown node, or a geometry bounding object - let id; - if (typeof parentNode !== 'undefined') - id = parentNode.id; - result = this.#parseGeometry(node, id); - // We are forced to check if the result correspond to the class we expect because of the case of a USE - if (typeof result !== 'undefined' && result instanceof WbGeometry) { - if (typeof parentNode !== 'undefined') { - if (parentNode instanceof WbShape) { - if (typeof parentNode.geometry !== 'undefined') - parentNode.geometry.delete(); - parentNode.geometry = result; - } else if (parentNode instanceof WbSolid || parentNode instanceof WbTransform || parentNode instanceof WbGroup) { - // Bounding object - if (typeof parentNode.boundingObject !== 'undefined') - parentNode.boundingObject.delete(); - const shape = new WbShape(getAnId(), false, false, result); - shape.parent = parentNode.id; - WbWorld.instance.nodes.set(shape.id, shape); - result.parent = shape.id; - if (parentNode instanceof WbSolid) - parentNode.boundingObject = shape; - else - parentNode.children.push(shape); + switch (node.tagName) { + case 'Scene': + this.#parseScene(node); + this.#parseChildren(node, parentNode); + break; + case 'WorldInfo': + this.#parseWorldInfo(node); + break; + case 'Viewpoint': + WbWorld.instance.viewpoint = this.#parseViewpoint(node); + break; + case 'Background': + result = this.#parseBackground(node); + break; + case 'HingeJoint': + case 'SliderJoint': + case 'Hinge2Joint': + case 'BallJoint': + result = this.#parseJoint(node, parentNode); + break; + case 'HingeJointParameters': + case 'JointParameters': + case 'BallJointParameters': + result = this.#parseJointParameters(node, parentNode); + break; + case 'PositionSensor': + case 'Brake': + case 'RotationalMotor': + case 'LinearMotor': + result = this.#parseLogicalDevice(node, parentNode); + break; + case 'Billboard': + result = this.#parseBillboard(node, parentNode); + break; + case 'Group': + case 'Propeller': + result = this.#parseGroup(node, parentNode); + break; + case 'Shape': + result = this.#parseShape(node, parentNode, isBoundingObject); + break; + case 'Slot': + result = this.#parseSlot(node, parentNode); + break; + case 'CadShape': + result = this.#parseCadShape(node, parentNode); + break; + case 'DirectionalLight': + result = this.#parseDirectionalLight(node, parentNode); + break; + case 'PointLight': + result = this.#parsePointLight(node, parentNode); + break; + case 'SpotLight': + result = this.#parseSpotLight(node, parentNode); + break; + case 'Fog': + if (!WbWorld.instance.hasFog) + result = this.#parseFog(node); + else + console.error('This world already has a fog.'); + break; + case 'Transform': + case 'Robot': + case 'Solid': + case 'Accelerometer': + case 'Altimeter': + case 'Camera': + case 'Charger': + case 'Compass': + case 'Connector': + case 'Display': + case 'DistanceSensor': + case 'Emitter': + case 'GPS': + case 'Gyro': + case 'InertialUnit': + case 'LED': + case 'Lidar': + case 'LightSensor': + case 'Pen': + case 'Radar': + case 'RangeFinder': + case 'Receiver': + case 'Speaker': + case 'TouchSensor': + case 'Track': + case 'TrackWheel': + result = this.#parseTransform(node, parentNode, isBoundingObject); + break; + default: + // Either it is a node added after the whole scene, or it is an unknown node, or a geometry bounding object + let id; + if (typeof parentNode !== 'undefined') + id = parentNode.id; + result = this.#parseGeometry(node, id); + // We are forced to check if the result correspond to the class we expect because of the case of a USE + if (typeof result !== 'undefined' && result instanceof WbGeometry) { + if (typeof parentNode !== 'undefined') { + if (parentNode instanceof WbShape) { + if (typeof parentNode.geometry !== 'undefined') + parentNode.geometry.delete(); + parentNode.geometry = result; + } else if (parentNode instanceof WbSolid || parentNode instanceof WbTransform || parentNode instanceof WbGroup) { + // Bounding object + if (typeof parentNode.boundingObject !== 'undefined') + parentNode.boundingObject.delete(); + const shape = new WbShape(getAnId(), false, false, result); + shape.parent = parentNode.id; + WbWorld.instance.nodes.set(shape.id, shape); + result.parent = shape.id; + if (parentNode instanceof WbSolid) + parentNode.boundingObject = shape; + else + parentNode.children.push(shape); + } } - } - } else if (node.tagName === 'PBRAppearance') { - if (typeof parentNode !== 'undefined' && parentNode instanceof WbShape) { - if (typeof parentNode.appearance !== 'undefined') - parentNode.appearance.delete(); - result = this.#parsePbrAppearance(node, id); - parentNode.appearance = result; - } - } else if (node.tagName === 'Appearance') { - if (typeof parentNode !== 'undefined' && parentNode instanceof WbShape) { - if (typeof parentNode.appearance !== 'undefined') - parentNode.appearance.delete(); - result = this.#parseAppearance(node, id); - parentNode.appearance = result; - } - } else if (node.tagName === 'Material') { - result = this.#parseMaterial(node, id); - if (typeof result !== 'undefined') { - if (typeof parentNode !== 'undefined' && parentNode instanceof WbAppearance) { - if (typeof parentNode.material !== 'undefined') - parentNode.material.delete(); - parentNode.material = result; + } else if (node.tagName === 'PBRAppearance') { + if (typeof parentNode !== 'undefined' && parentNode instanceof WbShape) { + if (typeof parentNode.appearance !== 'undefined') + parentNode.appearance.delete(); + result = this.#parsePbrAppearance(node, id); + parentNode.appearance = result; } - } - } else if (node.tagName === 'ImageTexture') { - result = this.#parseImageTexture(node, id); - if (typeof result !== 'undefined') { - if (typeof parentNode !== 'undefined' && parentNode instanceof WbAppearance) { - if (typeof parentNode.material !== 'undefined') - parentNode.texture.delete(); - parentNode.texture = result; + } else if (node.tagName === 'Appearance') { + if (typeof parentNode !== 'undefined' && parentNode instanceof WbShape) { + if (typeof parentNode.appearance !== 'undefined') + parentNode.appearance.delete(); + result = this.#parseAppearance(node, id); + parentNode.appearance = result; } - } - } else if (node.tagName === 'TextureTransform') { - result = this.#parseTextureTransform(node, id); - if (typeof result !== 'undefined') { - if (typeof parentNode !== 'undefined' && parentNode instanceof WbAbstractAppearance) { - if (typeof parentNode.textureTransform !== 'undefined') - parentNode.textureTransform.delete(); - parentNode.textureTransform = result; + } else if (node.tagName === 'Material') { + result = this.#parseMaterial(node, id); + if (typeof result !== 'undefined') { + if (typeof parentNode !== 'undefined' && parentNode instanceof WbAppearance) { + if (typeof parentNode.material !== 'undefined') + parentNode.material.delete(); + parentNode.material = result; + } } - } - } else - console.error("The parser doesn't support this type of node: " + node.tagName); + } else if (node.tagName === 'ImageTexture') { + result = this.#parseImageTexture(node, id); + if (typeof result !== 'undefined') { + if (typeof parentNode !== 'undefined' && parentNode instanceof WbAppearance) { + if (typeof parentNode.material !== 'undefined') + parentNode.texture.delete(); + parentNode.texture = result; + } + } + } else if (node.tagName === 'TextureTransform') { + result = this.#parseTextureTransform(node, id); + if (typeof result !== 'undefined') { + if (typeof parentNode !== 'undefined' && parentNode instanceof WbAbstractAppearance) { + if (typeof parentNode.textureTransform !== 'undefined') + parentNode.textureTransform.delete(); + parentNode.textureTransform = result; + } + } + } else + console.error("The parser doesn't support this type of node: " + node.tagName); } // check if top-level nodes diff --git a/resources/web/wwi/test.html b/resources/web/wwi/test.html index 6ff9de2e60c..4db8023e5d4 100644 --- a/resources/web/wwi/test.html +++ b/resources/web/wwi/test.html @@ -19,6 +19,6 @@ const webotsView = new WebotsView(); document.getElementById('webots-container').appendChild(webotsView); // webotsView.loadProto("https://raw.githubusercontent.com/cyberbotics/webots/develop/projects/objects/fruits/protos/Apple.proto"); - webotsView.loadProto("protos/ProtoPropeller.proto"); + webotsView.loadProto("protos/ProtoSolidDevice.proto");