<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
</head>
<body>
<p> { "HAnimHumanoid":<br>
{<br>
"@name":"JinLOA4",<br>
"@DEF":"hanim_JinLOA4",<br>
"@loa":4,<br>
"@scale":[0.0225,0.0225,0.0225],<br>
"@version":"2.0",<br>
<u><b><i> "-metadata":</i></b></u><br>
{ "MetadataSet":<br>
{ <br>
<br>
</p>
<div class="moz-cite-prefix">On 12/24/21 00:45, Brutzman, Donald
(Don) (CIV) wrote:<br>
</div>
<blockquote type="cite"
cite="mid:SA1PR13MB4893082778CE467BAF147EBEC47F9@SA1PR13MB4893.namprd13.prod.outlook.com">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta name="Generator" content="Microsoft Word 15 (filtered
medium)">
<style>@font-face
{font-family:Wingdings;
panose-1:5 0 0 0 0 0 0 0 0 0;}@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;}@font-face
{font-family:"Courier New \;color\:black";
panose-1:0 0 0 0 0 0 0 0 0 0;}p.MsoNormal, li.MsoNormal, div.MsoNormal
{margin:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
{mso-style-priority:99;
color:blue;
text-decoration:underline;}a:visited, span.MsoHyperlinkFollowed
{mso-style-priority:99;
color:purple;
text-decoration:underline;}p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
{mso-style-priority:34;
margin-top:0in;
margin-right:0in;
margin-bottom:0in;
margin-left:.5in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}p.msonormal0, li.msonormal0, div.msonormal0
{mso-style-name:msonormal;
mso-margin-top-alt:auto;
margin-right:0in;
mso-margin-bottom-alt:auto;
margin-left:0in;
font-size:11.0pt;
font-family:"Calibri",sans-serif;}span.EmailStyle20
{mso-style-type:personal;
font-family:"Calibri",sans-serif;
color:windowtext;}span.EmailStyle21
{mso-style-type:personal-reply;
font-family:"Calibri",sans-serif;
color:windowtext;}.MsoChpDefault
{mso-style-type:export-only;
font-size:10.0pt;}div.WordSection1
{page:WordSection1;}ol
{margin-bottom:0in;}ul
{margin-bottom:0in;}</style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
<div class="WordSection1">
<p class="MsoNormal">The error was in the source .x3d file, the
MetadataSet within HAnimHumanoid need correct containerField
definition:<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<ul style="margin-top:0in" type="disc">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l2 level1 lfo10"><MetadataSet
name='HAnimHumanoid.info' containerField='metadata' etc.
<o:p></o:p></li>
</ul>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"><o:p> </o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">all the best, Don<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">--
<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Don Brutzman Naval Postgraduate School,
Code USW/Br <a class="moz-txt-link-abbreviated" href="mailto:brutzman@nps.edu">brutzman@nps.edu</a><o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Watkins 270, MOVES Institute, Monterey
CA 93943-5000 USA +1.831.656.2149<o:p></o:p></span></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">X3D graphics, virtual worlds, navy
robotics https://</span>
<span style="font-size:10.0pt;font-family:"Courier
New",serif">faculty.nps.edu/brutzman<o:p></o:p></span></p>
</div>
<p class="MsoNormal"><o:p> </o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> John Carlson
<a class="moz-txt-link-rfc2396E" href="mailto:yottzumm@gmail.com"><yottzumm@gmail.com></a> <br>
<b>Sent:</b> Thursday, December 23, 2021 10:40 PM<br>
<b>To:</b> Brutzman, Donald (Don) (CIV)
<a class="moz-txt-link-rfc2396E" href="mailto:brutzman@nps.edu"><brutzman@nps.edu></a><br>
<b>Cc:</b> X3D Graphics public mailing list
<a class="moz-txt-link-rfc2396E" href="mailto:x3d-public@web3d.org"><x3d-public@web3d.org></a><br>
<b>Subject:</b> Re: HAnim, X3dToPython.xslt X3dToJson.xslt
Upgrade X3DUOM? HAnimHumanoid explained, problem
identified, corrections applied<o:p></o:p></p>
</div>
</div>
<div>
<p>I think there's still a error in X3dToJson.xslt, conversion
from XML to JSON produces<o:p></o:p></p>
<p>[snippet]<o:p></o:p></p>
<p>{ "HAnimHumanoid":<br>
{ <br>
"@name":"JinLOA4",<br>
"@DEF":"hanim_JinLOA4",<br>
"@loa":4, <br>
"@scale":[0.0225,0.0225,0.0225],<br>
"@version":"2.0",<br>
<b><u> "-value":[ </u></b> <br>
{ "MetadataSet":<br>
{ "-value":[ <o:p></o:p></p>
<p><o:p> </o:p></p>
<p>I believe this affects all my downstream serialzers.<o:p></o:p></p>
<p>I will double check that I am using the stylesheet.<o:p></o:p></p>
<p>John<o:p></o:p></p>
<div>
<p class="MsoNormal">On 12/23/21 13:50, Brutzman, Donald
(Don) (CIV) wrote:<o:p></o:p></p>
</div>
<blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
<p class="MsoNormal">Hi John, thanks for this elaboration of
the question. Here is an in-depth explanation giving
multiple related references that answer the question: yes,
the /metadata/ field is part of HAnimHumanoid node.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">More precise URL for HAnimHumanoid in
HAnim v2.0 specification is<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="1">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3">Part 1:
Humanoid animation (HAnim) architecture, Clause 6 Object
Interfaces, 6.2 Humanoid<o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/documents/specifications/19774-1/V2.0/Architecture/Obje"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/documents/specifications/19774-1/V2.0/Architecture/Obje</a>
Part 1: Humanoid animation (HAnim)
architecturectInterfaces.html#Humanoid<o:p></o:p></li>
</ol>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">HAnim architecture specification is
abstract and must be implemented by other specifications.
Thus you have to look in X3D Architecture specification
for corresponding X3D details.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Corresponding X3D Architecture
specification is<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="3">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3">X3D4
Part 1: Architecture and base components, 26 Humanoid
Animation (HAnim) component, clause 26.3.2 HAnimHumanoid<o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimHumanoid"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimHumanoid</a><o:p></o:p></li>
</ol>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif">HAnimHumanoid : X3DChildNode,
X3DBoundedObject {</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFVec3f [in,out]
center 0 0 0 (-∞,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFString [in,out]
description ""</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFBool [in,out]
bboxDisplay FALSE</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFBool [in,out]
visible TRUE</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFString [in,out]
info []</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFVec3f [in,out]
jointBindingPositions [] (-∞,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFRotation [in,out]
jointBindingRotations [] (-∞,∞)|[-1,1]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFVec3f [in,out]
jointBindingScales [] (0,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
joints [] [HAnimJoint]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFInt32 [in,out]
loa -1 [-1,4]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFNode [in,out]
metadata NULL [X3DMetadataObject]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
motions [] [HAnimMotion]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFBool [in,out]
motionsEnabled []</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFString [in,out]
name ""</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFRotation [in,out]
rotation 0 0 1 0 (-∞,∞)|[-1,1]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFVec3f [in,out]
scale 1 1 1 (0,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFRotation [in,out]
scaleOrientation 0 0 1 0 (-∞,∞)|[-1,1]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
segments [] [HAnimSegment]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
sites [] [HAnimSite]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFString [in,out]
skeletalConfiguration "BASIC"</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
skeleton [] [HAnimJoint, HAnimSite]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
skin []
<s><span style="color:black;background:orange">[IndexedFaceSet,
X3DGroupingNode, Shape]</span></s><span
style="color:black;background:yellow">[IndexedFaceSet,
IndexedFanSet, IndexedQuadSet, IndexedTriangleSet,
IndexedTriangleStripSet]</span></span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFNode [in,out]
skinBindingCoord NULL [X3DCoordinateNode]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFNode [in,out]
skinBindingNormal NULL [X3DNormalNode]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFNode [in,out]
skinCoord NULL [X3DCoordinateNode]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFNode [in,out]
skinNormal NULL [X3DNormalNode]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFVec3f [in,out]
translation 0 0 0 (-∞,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFString [in,out]
version ""</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> MFNode [in,out]
viewpoints [] [HAnimSite]</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFVec3f []
bboxCenter 0 0 0 (-∞,∞)</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif"> SFVec3f []
bboxSize -1 -1 -1 [0,∞) or −1 −1 −1</span><o:p></o:p></p>
<p class="MsoNormal" style="margin-left:18.75pt"><span
style="font-size:8.5pt;font-family:"Courier New
;color:black",serif">}</span><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<p class="MsoNormal">As you can see, this node signature
does include /metadata/ field.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">As you can also see, there is no
/value/ field.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Of note is that there is an
HAnimHumanoid /info/ field for metadata information, an
MFString array of “name=value” pairs. Very clumsy to
use in practice. The X3D4 Architecture notes in 26.3.2
the preferred alternative approach:<o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="5">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><span
style="background:yellow;mso-highlight:yellow">Metadata
values from the
<i>info</i> field can be equivalently encoded via
MetadataSet containing related X3DMetadataObject
nodes.</span>
<o:p></o:p></li>
</ol>
<p class="MsoNormal">Conversions are provided by X3dTidy
cleanup stylesheet, and converted examples online. (Not
finding this information in X3D Scene Authoring Hints,
will add it.)<o:p></o:p></p>
<div style="border:none;border-bottom:solid windowtext
1.5pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="6">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3">HumanoidAnimation
X3D Examples Archive<o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/x3d/content/examples/HumanoidAnimation"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/x3d/content/examples/HumanoidAnimation</a><o:p></o:p></li>
</ol>
<div style="border:none;border-bottom:solid windowtext
1.5pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="8">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3">X3D
Example Archives: Humanoid Animation, Characters, Jin
LOA 4<o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4Index.html"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4Index.html</a><o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.html#hanim_JinLOA4"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.html#hanim_JinLOA4</a><o:p></o:p></li>
</ol>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><HAnimHumanoid DEF='hanim_JinLOA4' loa='4' name='JinLOA4' scale='0.0225
0.0225 0.0225'>
<o:p></o:p></p>
<p class="MsoNormal"> <MetadataSet name='HAnimHumanoid.info' reference='<a
href="https://www.web3d.org/documents/specifications/19774/V2.0/Architecture/ObjectInterfaces.html#Humanoid"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/documents/specifications/19774/V2.0/Architecture/ObjectInterfaces.html#Humanoid</a>' containerField='metadata'>
<o:p></o:p></p>
<p class="MsoNormal"> <MetadataString containerField='value' name='authorName' value='Jin
Hoon Lee and Min Joo Lee, Chul Hee Jung and Myeong Won
Lee'/>
<br>
<a
href="mailto:MetadataString containerField='value' name='authorEmail' value='myeongwonlee@gmail.com'/"
moz-do-not-send="true"><MetadataString containerField='value' name='authorEmail' value='myeongwonlee@gmail.com'/></a>
<br>
<MetadataString containerField='value' name='creationDate' value='31
March 2011'/>
<br>
<MetadataString containerField='value' name='gender' value='female'/>
<br>
<MetadataFloat containerField='value' name='height' value='1.5'/>
<br>
<MetadataString containerField='value' name='humanoidVersion' value='"2.0"'/>
<o:p></o:p></p>
<div style="border:none;border-bottom:solid windowtext
1.5pt;padding:0in 0in 1.0pt 0in">
<p class="MsoNormal"> </MetadataSet> <br>
<a name="hanim_humanoid_root" moz-do-not-send="true"></a> <HAnimJoint DEF='hanim_humanoid_root' center='0
36.709999
-0.707600' containerField='skeleton' name='humanoid_root'><o:p></o:p></p>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Reviewing X3D Tooltips confirms this
answer to your question, along with convenient links to
clauses in both specifications. (Each of the node names
e.g. HAnimHumanoid links to the current X3D Architecture
CD1 clause.)<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="11">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3">X3D
Tooltips HAnimHumanoid
<o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/x3d/tooltips/X3dTooltips.html#HAnimHumanoid"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/x3d/tooltips/X3dTooltips.html#HAnimHumanoid</a><o:p></o:p></li>
</ol>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Now checking X3D Unified Object Model
(X3DUOM) X3dUnifiedObjectModel-4.0.xml<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<ol style="margin-top:0in" type="1" start="13">
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/specifications"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/specifications</a><o:p></o:p></li>
<li class="MsoListParagraph"
style="margin-left:0in;mso-list:l4 level1 lfo3"><a
href="https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/specifications/X3dUnifiedObjectModel-4.0.xml</a><o:p></o:p></li>
</ol>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"> <ConcreteNode
name="HAnimHumanoid"><o:p></o:p></p>
<p class="MsoNormal"> <InterfaceDefinition
specificationUrl=”<a
href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimHumanoid”"
moz-do-not-send="true">https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimHumanoid”</a><o:p></o:p></p>
<p class="MsoNormal"> appinfo="The
HAnimHumanoid node is used to: (a) store references to
the joints, segments, sites, skeleton, optional skin,
and fixed viewpoints, (b) serve as a container for the
entire humanoid, (c) provide a convenient way of moving
the humanoid through its environment, and (d) store
human-readable metadata such as name, version, author,
copyright, age, gender and other information."><o:p></o:p></p>
<p class="MsoNormal"> <componentInfo
name="HAnim" level="1"/><o:p></o:p></p>
<p class="MsoNormal"> <Inheritance
baseType="X3DChildNode"/><o:p></o:p></p>
<p class="MsoNormal"> <AdditionalInheritance
baseType="X3DBoundedObject"/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="bboxCenter"<o:p></o:p></p>
<p class="MsoNormal"> type="SFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="initializeOnly"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 0"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DBoundedObject"<o:p></o:p></p>
<p class="MsoNormal">
description="Bounding box center accompanies bboxSize
and provides an optional hint for bounding box position
offset from origin of local coordinate system."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="bboxDisplay"<o:p></o:p></p>
<p class="MsoNormal"> type="SFBool"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="false"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DBoundedObject"<o:p></o:p></p>
<p class="MsoNormal">
description="Whether to display bounding box for
associated geometry, aligned with world
coordinates."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="bboxSize"<o:p></o:p></p>
<p class="MsoNormal"> type="SFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="initializeOnly"<o:p></o:p></p>
<p class="MsoNormal"> default="-1 -1 -1"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DBoundedObject"<o:p></o:p></p>
<p class="MsoNormal">
baseType="bboxSizeType"<o:p></o:p></p>
<p class="MsoNormal">
description="Bounding box size is usually omitted, and
can easily be calculated automatically by an X3D player
at scene-loading time with minimal computational
cost."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="center"<o:p></o:p></p>
<p class="MsoNormal"> type="SFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Translation offset from origin of local
coordinate system."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="description"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
description="Author-provided prose that describes
intended purpose of this node."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="info"<o:p></o:p></p>
<p class="MsoNormal"> type="MFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
description="Contains metadata keyword=value pairs,
where approved keyword terms are humanoidVersion
authorName authorEmail copyright creationDate
usageRestrictions age gender height and weight."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="IS"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="IS"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="jointBindingPositions"<o:p></o:p></p>
<p class="MsoNormal"> type="MFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Specifies an array of position values for
each HAnimJoint node in the joints field, in order,
corresponding to each binding pose."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="jointBindingRotations"<o:p></o:p></p>
<p class="MsoNormal"> type="MFRotation"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 1 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Specifies an array of rotation values for
each HAnimJoint node in the joints field, in order,
corresponding to each binding pose."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="jointBindingScales"<o:p></o:p></p>
<p class="MsoNormal"> type="MFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Specifies an array of scale values for each
HAnimJoint node in the joints field, in order,
corresponding to each binding pose."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="joints"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimJoint"<o:p></o:p></p>
<p class="MsoNormal"> description="The
joints field contains a list of USE references for all
HAnimJoint node instances found within the preceding
skeleton hierarchy."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="loa"<o:p></o:p></p>
<p class="MsoNormal"> type="SFInt32"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="-1"<o:p></o:p></p>
<p class="MsoNormal"> minInclusive="-1"<o:p></o:p></p>
<p class="MsoNormal"> maxInclusive="4"<o:p></o:p></p>
<p class="MsoNormal"> baseType="loaType"<o:p></o:p></p>
<p class="MsoNormal"> description="Level
Of Articulation 0."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="metadata"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="X3DMetadataObject"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal">
description="Information about this node can be
contained in a MetadataBoolean, MetadataDouble,
MetadataFloat, MetadataInteger, MetadataString or
MetadataSet node."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="motions"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimMotion"<o:p></o:p></p>
<p class="MsoNormal">
description="Contains any HAnimMotion nodes that can
animate the HAnimHumanoid."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="name"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
baseType="xs:NMTOKEN"<o:p></o:p></p>
<p class="MsoNormal">
description="Unique name attribute must be defined so
that each HAnimHumanoid node in a scene can be
identified at run time for animation purposes."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="rotation"<o:p></o:p></p>
<p class="MsoNormal"> type="SFRotation"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 1 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Orientation of children relative to local
coordinate system."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="scale"<o:p></o:p></p>
<p class="MsoNormal"> type="SFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="1 1 1"<o:p></o:p></p>
<p class="MsoNormal"> minExclusive="0"<o:p></o:p></p>
<p class="MsoNormal">
description="Non-uniform x-y-z scale of child coordinate
system, adjusted by center and scaleOrientation."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="scaleOrientation"<o:p></o:p></p>
<p class="MsoNormal"> type="SFRotation"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 1 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Preliminary rotation of coordinate system
before scaling (to allow scaling around arbitrary
orientations)."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="segments"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimSegment"<o:p></o:p></p>
<p class="MsoNormal"> description="The
segments field contains a list of USE references for all
HAnimSegment node instances found within the preceding
skeleton hierarchy."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="sites"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimSite"<o:p></o:p></p>
<p class="MsoNormal"> description="sites
field contains a list of USE references for all
HAnimSite node instances found within the preceding
skeleton hierarchy."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="skeletalConfiguration"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="BASIC"<o:p></o:p></p>
<p class="MsoNormal">
description="Models sharing a common skeletal
configuration can share animations and binding
poses."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="skeleton"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimJoint|HAnimSite"<o:p></o:p></p>
<p class="MsoNormal"> description="List
of top-level HAnimJoint and HAnimSite nodes that create
the skeleton model."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="skin"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="Group|Transform|Shape|IndexedFaceSet"<o:p></o:p></p>
<p class="MsoNormal"> description="List
of one or more indexed mesh definitions (such as
IndexedFaceSet) that utilize skinCoord point and
skinNormal normal data."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="skinBindingCoord"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="X3DCoordinateNode"<o:p></o:p></p>
<p class="MsoNormal"> description="Array
of Coordinate nodes to handle non-default source pose so
that both skin and skeleton can be in same binding
pose."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="skinBindingNormal"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="X3DNormalNode"<o:p></o:p></p>
<p class="MsoNormal"> description="Array
of Normal nodes to handle non-default source pose so
that both skin and skeleton can be in same binding
pose."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="skinCoord"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="X3DCoordinateNode"<o:p></o:p></p>
<p class="MsoNormal">
description="Coordinate node utilized by indexed mesh
definitions for skin."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="skinNormal"<o:p></o:p></p>
<p class="MsoNormal"> type="SFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="NULL"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="X3DNormalNode"<o:p></o:p></p>
<p class="MsoNormal">
description="Single Normal node utilized by indexed mesh
definitions for skin."/><o:p></o:p></p>
<p class="MsoNormal"> <field
name="translation"<o:p></o:p></p>
<p class="MsoNormal"> type="SFVec3f"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="0 0 0"<o:p></o:p></p>
<p class="MsoNormal">
description="Position of children relative to local
coordinate system."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="version"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="2.0"<o:p></o:p></p>
<p class="MsoNormal">
additionalEnumerationValuesAllowed="false"<o:p></o:p></p>
<p class="MsoNormal">
simpleType="hanimVersionChoices"<o:p></o:p></p>
<p class="MsoNormal">
baseType="xs:NMTOKEN"<o:p></o:p></p>
<p class="MsoNormal">
description="HAnimHumanoid version, where value is
1."><o:p></o:p></p>
<p class="MsoNormal"> <enumeration
value="1.0"<o:p></o:p></p>
<p class="MsoNormal">
appinfo="International standard HAnim 19774 version 1
approved by ISO in 2006. Note that HAnim version 2.0 has
more capabilties, while version 1.0 includes several
small incompatibilities. Since no other versions were
formally approved, no other values are allowed for
earlier HAnim versions."<o:p></o:p></p>
<p class="MsoNormal">
documentation=<a
href="https://www.web3d.org/documents/specifications/19774/V1.0"
moz-do-not-send="true">"https://www.web3d.org/documents/specifications/19774/V1.0"</a>
/><o:p></o:p></p>
<p class="MsoNormal"> <enumeration
value="2.0"<o:p></o:p></p>
<p class="MsoNormal">
appinfo="Revised standard HAnim 19774 version 2 (parts 1
and 2) were approved by ISO in November 2019, published
by Web3D Consortium May 2020."<o:p></o:p></p>
<p class="MsoNormal">
documentation=<a
href="https://www.web3d.org/documents/specifications/19774/V2.0"
moz-do-not-send="true">"https://www.web3d.org/documents/specifications/19774/V2.0"</a>
/><o:p></o:p></p>
<p class="MsoNormal"> </field><o:p></o:p></p>
<p class="MsoNormal"> <field
name="viewpoints"<o:p></o:p></p>
<p class="MsoNormal"> type="MFNode"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
acceptableNodeTypes="HAnimSite"<o:p></o:p></p>
<p class="MsoNormal"> description="List
of HAnimSite nodes containing Viewpoint nodes that
appear in the skeleton model, usually as USE node
references."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="visible"<o:p></o:p></p>
<p class="MsoNormal"> type="SFBool"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal"> default="true"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DBoundedObject"<o:p></o:p></p>
<p class="MsoNormal">
description="Whether or not renderable content within
this node is visually displayed."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="DEF"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal"> baseType="xs:ID"<o:p></o:p></p>
<p class="MsoNormal"> description="DEF
defines a unique ID name for this node, referenceable by
other nodes."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="USE"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal">
baseType="xs:IDREF"<o:p></o:p></p>
<p class="MsoNormal"> description="USE
means reuse an already DEF-ed node ID, excluding all
child nodes and all other attributes (except for
containerField, which can have a different value)."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="class"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal">
baseType="xs:NMTOKENS"<o:p></o:p></p>
<p class="MsoNormal"> description="The
class attribute on each X3D node and statement is a
space-separated list of classes, reserved for use by
Cascading Style Sheets (CSS) and XML stylesheets."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="id"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal">
baseType="xs:NMTOKEN"<o:p></o:p></p>
<p class="MsoNormal"> description="The
id attribute on each X3D node and statement is
considered a unique identifier when used as part of an
encompassing HTML/DOM context."/><o:p></o:p></p>
<p class="MsoNormal"> <field name="style"<o:p></o:p></p>
<p class="MsoNormal"> type="SFString"<o:p></o:p></p>
<p class="MsoNormal">
accessType="inputOutput"<o:p></o:p></p>
<p class="MsoNormal">
inheritedFrom="X3DNode"<o:p></o:p></p>
<p class="MsoNormal"> description="The
style attribute on each X3D node and statement provides
an inline block of CSS source for element styling,
reserved for use by Cascading Style Sheets (CSS) and XML
stylesheets."/><o:p></o:p></p>
<p class="MsoNormal"> <containerField
default="children" type="xs:NMTOKEN"/><o:p></o:p></p>
<p class="MsoNormal"> <ContentModel><o:p></o:p></p>
<p class="MsoNormal"> <GroupContentModel
name="ChildContentModelCore" minOccurs="0"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="HAnimJoint" minOccurs="0"
maxOccurs="unbounded"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="HAnimSegment" minOccurs="0"
maxOccurs="unbounded"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="HAnimSite" minOccurs="0"
maxOccurs="unbounded"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="HAnimMotion" minOccurs="0"
maxOccurs="unbounded"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="Group"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="Transform"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="Shape"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="IndexedFaceSet"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="Coordinate"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="CoordinateDouble"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="Normal" minOccurs="0" maxOccurs="2"/><o:p></o:p></p>
<p class="MsoNormal"> <NodeContentModel
name="ProtoInstance" minOccurs="0"
maxOccurs="unbounded"/><o:p></o:p></p>
<p class="MsoNormal"> </ContentModel><o:p></o:p></p>
<p class="MsoNormal"> </InterfaceDefinition><o:p></o:p></p>
<p class="MsoNormal"> </ConcreteNode><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Regarding python, I checked the
conversion of JinLOA4.x3d to JinLOA4.py<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Stylesheet X3dToPython.xstl seemed to
work OK <o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">
HAnimHumanoid(DEF='hanim_JinLOA4',loa=4,name='JinLOA4',scale=(0.0225,0.0225,0.0225),version='2.0',</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> skeleton=[</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">
HAnimJoint(DEF='hanim_humanoid_root',center=(0,36.709999,-0.707600),name='humanoid_root',stiffness=[0,0,0],</span><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">but then got a self-validation error
by the JinLOA4.py python program,
<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">create python:</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.x3d"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation/Characters//JinLOA4.x3d</a>
processing with X3dToPython stylesheet...</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.py"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation/Characters//JinLOA4.py</a>
self-validation tests...</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">validate python:</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">x3d.py package loaded, have fun with
X3D Graphics!</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Traceback (most recent call last):</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> File "C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.py"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation\Characters\JinLOA4.py</a>",
line 169, in <module></span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">
HAnimJoint(DEF='hanim_l_tarsal_distal_interphalangeal_1',center=(2.761,0.539400,5.125),name='l_tarsal_distal_interphalangeal_1',stiffness=[0,0,0],</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> File "C:\x3d-code\<a
href="http://www.web3d.org/x3d/stylesheets/python/x3d/x3d.py"
moz-do-not-send="true">www.web3d.org\x3d\stylesheets\python\x3d\x3d.py</a>",
line 43724, in __init__</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> self.stiffness = stiffness</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> File "C:\x3d-code\<a
href="http://www.web3d.org/x3d/stylesheets/python/x3d/x3d.py"
moz-do-not-send="true">www.web3d.org\x3d\stylesheets\python\x3d\x3d.py</a>",
line 43873, in stiffness</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> assertValidSFVec3f(stiffness)</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> File "C:\x3d-code\<a
href="http://www.web3d.org/x3d/stylesheets/python/x3d/x3d.py"
moz-do-not-send="true">www.web3d.org\x3d\stylesheets\python\x3d\x3d.py</a>",
line 3953, in assertValidSFVec3f</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> raise
X3DTypeError(str(value)[:100] + ', type=' +
str(type(value)) + ' is not a valid Python tuple for
SFVec3f')</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">x3d.X3DTypeError: [0, 0, 0],
type=<class 'list'> is not a valid Python tuple
for SFVec3f</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Result: 1</span><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Note how <span
style="font-size:10.0pt;font-family:"Courier
New",serif">
stiffness=[0,0,0]</span>was given as a list in
brackets, rather than a tuple value in parentheses
<span style="font-size:10.0pt;font-family:"Courier
New",serif">stiffness=(0,0,0)</span> as might be
expected for SFVec3f, and so this is a useful
diagnostic.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">However the actual specification type
for stiffness is MFFloat. (This was a mantis issue,
might we tighten it to SFVec3f, but decided to keep it
MFFloat in case more-advanced kinematics engines were
someday of interest.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">* <a
href="https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimJoint"
moz-do-not-send="true" class="moz-txt-link-freetext">
https://www.web3d.org/specifications/X3Dv4Draft/ISO-IEC19775-1v4-CD1/Part01/components/hanim.html#HAnimJoint</a><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">26.3.3 HAnimJoint</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">HAnimJoint : X3DGroupingNode {</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">[…]</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> MFFloat [in,out]
stiffness [0 0 0] [0,1]</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Applied change to X3D DTD, X3D XML
Schema and again autogenerated X3DUOM and x3d.py and X3D
Ontology to match.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">23 DEC 2021, carlson brutzman</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">- restore type of HAnimJoint
stiffness field as MFFloat (vice SFVec3f) to match</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> specification, since more-advanced
kinematics engines might someday hold interest.</span><o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">This fixed the stiffness error.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">However, next got a surprising
conversion error (which might have been what you
experienced originally):<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">=====================</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">create python:</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.x3d"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation/Characters//JinLOA4.x3d</a>
processing with X3dToPython stylesheet...</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.py"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation/Characters//JinLOA4.py</a>
self-validation tests...</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">validate python:</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">x3d.py package loaded, have fun with
X3D Graphics!Traceback (most recent call last):</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> File "C:\x3d-code\<a
href="http://www.web3d.org/x3d/content/examples/HumanoidAnimation/Characters/JinLOA4.py"
moz-do-not-send="true">www.web3d.org\x3d\content\examples\HumanoidAnimation\Characters\JinLOA4.py</a>",
line 50, in <module></span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">
HAnimHumanoid(DEF='hanim_JinLOA4',loa=4,name='JinLOA4',scale=(0.0225,0.0225,0.0225),version='2.0',</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">TypeError: HAnimHumanoid.__init__()
got an unexpected keyword argument 'value'</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Result: 1</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">=====================</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal">Which apparently was on line 1950,<o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">
value=MetadataSet(name='HAnimHumanoid.info',reference='<a
href="https://www.web3d.org/documents/specifications/19774/V2.0/Architecture/ObjectInterfaces.html#Humanoid"
moz-do-not-send="true" class="moz-txt-link-freetext">https://www.web3d.org/documents/specifications/19774/V2.0/Architecture/ObjectInterfaces.html#Humanoid</a>',</span>etc.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">This conversion should have been <span
style="font-size:10.0pt;font-family:"Courier
New",serif">
metadata=MetadataSet</span> etc. Looks like the field
name for the HAnimHumanoid MetadataSet was not specified
incorrectly, the automatic conversion by X3dTidy did not
apply correct containerField value.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">I have added a rule to X3dTidy.xslt
that looks for this case (for either representation,
X3D3 or X3D4) and corrects it. I have added a similar
diagnostic rule to X3dSchematron checks.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">All affected HAnimHumanoid scenes
have been updated and are now getting compiled correctly
by Python.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">All changes checked into subversion.
Further regression testing continuing, website uploads
to follow.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">So again thanks for exposing this
issue. Pretty complex but resolvable. Once again the
strict nature of Python aided us in achieving high
Quality Assurance (QA) for X3D.<o:p></o:p></p>
<p class="MsoNormal"> <o:p></o:p></p>
<p class="MsoNormal">Happy holidays with X3D! 8)<o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif"> </span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">all the best, Don</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">--
</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Don Brutzman Naval Postgraduate
School, Code USW/Br
<a href="mailto:brutzman@nps.edu"
moz-do-not-send="true" class="moz-txt-link-freetext">brutzman@nps.edu</a></span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">Watkins 270, MOVES Institute,
Monterey CA 93943-5000 USA +1.831.656.2149</span><o:p></o:p></p>
<p class="MsoNormal"><span
style="font-size:10.0pt;font-family:"Courier
New",serif">X3D graphics, virtual worlds, navy
robotics https://</span>
<span style="font-size:10.0pt;font-family:"Courier
New",serif">faculty.nps.edu/brutzman</span><o:p></o:p></p>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<div style="border:none;border-top:solid #E1E1E1
1.0pt;padding:3.0pt 0in 0in 0in">
<p class="MsoNormal"><b>From:</b> John Carlson <a
href="mailto:yottzumm@gmail.com"
moz-do-not-send="true">
<yottzumm@gmail.com></a> <br>
<b>Sent:</b> Wednesday, December 22, 2021 12:44 PM<br>
<b>To:</b> Brutzman, Donald (Don) (CIV) <a
href="mailto:brutzman@nps.edu"
moz-do-not-send="true"><brutzman@nps.edu></a>;
X3D Graphics public mailing list
<a href="mailto:x3d-public@web3d.org"
moz-do-not-send="true"><x3d-public@web3d.org></a><br>
<b>Subject:</b> Re: HAnim, X3dToPython.xslt
X3dToJson.xslt Upgrade X3DUOM?<o:p></o:p></p>
</div>
</div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">I believe I checked the right
standard, here:<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<p class="MsoNormal"><a
href="https://www.web3d.org/documents/specifications/19774-1/V2.0/index.html"
moz-do-not-send="true"
class="moz-txt-link-freetext">https://www.web3d.org/documents/specifications/19774-1/V2.0/index.html</a><o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<p class="MsoNormal"> And neither value or metadata is a
field????<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Seems a bit strange.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">On Wed, Dec 22, 2021 at 2:20 PM
John Carlson <<a
href="mailto:yottzumm@gmail.com"
moz-do-not-send="true"
class="moz-txt-link-freetext">yottzumm@gmail.com</a>>
wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid
#CCCCCC 1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<p class="MsoNormal">hoping to see value field
added to HAnimHumanoid in X3DUOM, or some notice
that the package generating stylesheets are not
up-to-date.<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
</div>
<div>
<p class="MsoNormal">Also, check to make sure
stiffness is assigned the right data structure
(between list and tuple). And no, iOS, I do
not want “Tupperware” for the second time. We
need more women mathematicians (sorry for any
stereotyping). On that subject, I wonder what
coordinate system crocheted hats use?<o:p></o:p></p>
</div>
<div>
<p class="MsoNormal"> <o:p></o:p></p>
<div>
<div>
<p class="MsoNormal">On Mon, Dec 20, 2021 at
3:17 AM John Carlson <<a
href="mailto:yottzumm@gmail.com"
target="_blank" moz-do-not-send="true"
class="moz-txt-link-freetext">yottzumm@gmail.com</a>>
wrote:<o:p></o:p></p>
</div>
<blockquote style="border:none;border-left:solid
#CCCCCC 1.0pt;padding:0in 0in 0in
6.0pt;margin-left:4.8pt;margin-top:5.0pt;margin-right:0in;margin-bottom:5.0pt">
<div>
<p>Okay, now I seem to be having a similar
problem between my python serializer,
X3dToPython.xslt, and probably other
serialized stuff. I couldn't figure out
how to fix the stiffness issue in
X3dToPython.xslt, but hand-editing saved
that on this particular python file
(python/net/x3djsonld/data/JinLOA4.py).
Other JinLOA's still have lists with Don's
generator.<o:p></o:p></p>
<p>I believe the main change I am dealing
with is metadata vs value
containerFields. See JSON diff below.
I'm not seeing relevant changes to X3D
JSON schema 4.0. Does something need to
be upgraded in X3DUOM or X3D JSON schema?
I'm not seeing a value field in
HAnimHumanoid.<o:p></o:p></p>
<p><b>~/X3DJSONLD/src/main/python/net/coderextreme/data</b>$
python JinLOA4.py <span
style="font-family:"Courier
New",serif"><br>
Traceback (most recent call last): <br>
File
"/home/coderextreme/X3DJSONLD/src/main/python/net/coderextreme/data/JinLOA4.py",
line 148, in <module>
<br>
HAnimHumanoid23.setValue(MetadataSet24) <br>
AttributeError:
'org.web3d.x3d.jsail.HAnim.HAnimHumanoid'
object has no attribute 'setValue'. Did
you mean: 'setName'?
<br>
<b><span
style="color:#5454FF;background:white">~/X3DJSONLD/src/main/python/net/x3djsonld/data</span></b><span
style="color:black;background:white">$
python JinLOA4.py </span><br>
x3d.py package loaded, have fun with X3D
Graphics! <br>
Traceback (most recent call last): <br>
File
"/home/coderextreme/X3DJSONLD/src/main/python/net/x3djsonld/data/JinLOA4.py",
line 50, in <module>
<br>
HAnimHumanoid(DEF='hanim_JinLOA4',loa=4,name='JinLOA4',scale=(0.0225,0.0225,0.0225),version='2.0',
<br>
TypeError: HAnimHumanoid.__init__() got
an unexpected keyword argument 'value'</span><o:p></o:p></p>
<p> <o:p></o:p></p>
<p> <o:p></o:p></p>
<p><br>
<b>~/X3DJSONLD/src/main/data</b>$ git diff
JinLOA4.json <span
style="font-family:"Courier
New",serif">
<br>
<b><span
style="color:black;background:white">diff
--git a/src/main/data/JinLOA4.json
b/src/main/data/JinLOA4.json</span></b><span
style="color:black;background:white">
</span><br>
<b><span
style="color:black;background:white">index
c970a652a..e1930f4cf 100644</span></b><span
style="color:black;background:white">
</span><br>
<b><span
style="color:black;background:white">---
a/src/main/data/JinLOA4.json</span></b><span
style="color:black;background:white">
</span><br>
<b><span
style="color:black;background:white">+++
b/src/main/data/JinLOA4.json</span></b><span
style="color:black;background:white">
</span><br>
<span
style="color:#18B2B2;background:white">@@
-78,7 +78,7 @@</span><span
style="color:black;background:white">
</span><br>
}, <br>
{ <br>
"@name":"translated", <br>
<span
style="color:#B21818;background:white">-
"@content":"14 October
2021"</span><span
style="color:black;background:white">
</span><br>
<span
style="color:#18B218;background:white">+
"@content":"20 December
2021"</span><span
style="color:black;background:white">
</span><br>
}, <br>
{ <br>
"@name":"generator", <br>
<span
style="color:#18B2B2;background:white">@@
-116,7 +116,7 @@</span><span
style="color:black;background:white">
</span><br>
"@loa":4, <br>
"@scale":[0.0225,0.0225,0.0225], <br>
"@version":"2.0", <br>
<span
style="color:#B21818;background:white">-
"-metadata":</span><span
style="color:black;background:white">
</span><br>
<span
style="color:#18B218;background:white">+
"-value":[</span><span
style="color:black;background:white">
</span><br>
{ "MetadataSet": <br>
{ <br>
"@name":"HAnimHumanoid.info", <br>
<span
style="color:#18B2B2;background:white">@@
-160,7 +160,8 @@</span><span
style="color:black;background:white">
</span><br>
} <br>
] <br>
} <br>
<span
style="color:#B21818;background:white">-
},</span><span
style="color:black;background:white">
</span><br>
<span
style="color:#18B218;background:white">+
}</span><span
style="color:black;background:white">
</span><br>
<span
style="color:#18B218;background:white">+
],</span><span
style="color:black;background:white">
</span><br>
"-skeleton":[ <br>
{ "HAnimJoint": <br>
{<br>
<br>
===================</span><o:p></o:p></p>
<p><span style="font-family:"Courier
New",serif">Validating JSON against
schema:</span><o:p></o:p></p>
<p><b>~/X3DJSONLD/src/main/schema</b>$ node
~/x3dvalidate/x3dvalidate.js
../data/JinLOA4.json <span
style="font-family:"Courier
New",serif"><br>
Loading schema <br>
Parsing schema <br>
Adding schema <br>
Schema 4.0 added <br>
Schema 4.0 compiled <br>
================================================================================
<br>
File: ../data/JinLOA4.json <br>
Error reading ../data/JinLOA4.json <br>
keyword: required <br>
instancePath:
/X3D/Scene/-children/3/HAnimHumanoid <br>
message: must have required property
@USE <br>
params: {"missingProperty":"@USE"} <br>
file: ../data/JinLOA4.json <br>
version: 4.0 <br>
<br>
keyword: additionalProperties <br>
instancePath:
/X3D/Scene/-children/3/HAnimHumanoid <br>
message: must NOT have additional
properties <br>
params: {"additionalProperty":"-value"}
<br>
file: ../data/JinLOA4.json <br>
version: 4.0 <br>
<br>
keyword: oneOf <br>
instancePath:
/X3D/Scene/-children/3/HAnimHumanoid <br>
message: must match exactly one schema
in "oneOf" <br>
params: {"passingSchemas":null} <br>
file: ../data/JinLOA4.json <br>
version: 4.0</span><o:p></o:p></p>
</div>
</blockquote>
</div>
</div>
</blockquote>
</div>
</div>
</div>
</blockquote>
</div>
</div>
</blockquote>
</body>
</html>