{"elementName":"ObjectSchema","name":"bikery","containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":938,"width":739,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"HeaderBox","elementName":"Core.HtmlBox","style":{"zIndex":"2","transform":{}},"props":{"content":"<h2 style=\"text-align: center;\"><strong>Biking biomechanics</strong></h2>\n<p>&nbsp;</p>\n<p>&nbsp;There are 4 major things to improve your biking.</p>\n<p>&nbsp;</p>\n<ol>\n<li>Setting up the right frame geometry and the right seat position - <a href=\"#FrameGeometrySection\">frame geometry</a></li>\n<li>Improve your power to weight ratio - consider major <a href=\"#ResistanceForces\">resistance forces</a> when biking at a certain speed</li>\n<li>Gearing and padaling sequence -<em> will be available soon</em></li>\n<li>Improve your riding technique - <em>will be available soon</em></li>\n</ol>"}},{"name":"Alert","elementName":"react-bootstrap.Alert","style":{"top":482,"left":-137,"width":400,"height":120,"transform":{"tx":141,"ty":19,"sx":1.0247053428061437,"sy":0.9844375420023924,"rz":0.21383031347317127,"ox":0.5,"oy":0.5}},"props":{"bsStyle":"success","content":"<p><strong>Am i alone on my bike?</strong></p>\n<p>No, there are <strong>wind</strong>, <strong>rolling</strong> <strong>resistance</strong> and <strong>gravity</strong> force you have to fight against.</p>"}},{"name":"Copy Alert","elementName":"react-bootstrap.Alert","style":{"top":568,"left":96,"width":421,"height":122,"transform":{"tx":193,"ty":31,"sx":1,"sy":1,"rz":-0.2919599285542669,"ox":0.5,"oy":0.5}},"props":{"bsStyle":"warning","content":"<p><strong>Which type of bike should I choose?</strong></p>\n<p>Setting up the right geometry and the right seat position is one of the most impornant factor that influences the power and the health of a biker.</p>"}},{"name":"Copy Copy Alert","elementName":"react-bootstrap.Alert","style":{"top":656,"left":-146,"width":212,"height":190,"transform":{"tx":193,"ty":31,"sx":1,"sy":1,"rz":0.45609632195887706,"ox":0.5,"oy":0.5}},"props":{"bsStyle":"info","content":"<p><strong>What is the most important measure in frame geometry?</strong></p>\n<p>The most important is saddle pedal seatback parameter.</p>"}},{"name":"Copy Copy Copy Alert","elementName":"react-bootstrap.Alert","style":{"top":721,"left":257,"width":212,"height":190,"transform":{"tx":193,"ty":31,"sx":1,"sy":1,"rz":0.37783595220356486,"ox":0.5,"oy":0.5}},"props":{"bsStyle":"success","content":"<p><strong>What type of wheel is better 26r, 27,5r or 29r and which tire should are choose?</strong></p>\n<p>The rolling resistance helps to find out the right&nbsp;answer.</p>"}},{"name":"Copy Copy Copy Alert","elementName":"react-bootstrap.Alert","style":{"top":310,"left":410,"width":300,"height":100,"transform":{"tx":0,"ty":0,"sx":1,"sy":1,"rz":-0.1564267791428895,"ox":0.5,"oy":0.5}},"props":{"bsStyle":"danger","content":"<p><strong>What is the secret cycling faster up&nbsp;hills?</strong></p>\n<p>The gravity force is typically the dominant force when climbing. If you lose weight, you can climb much faster to hills.</p>"}},{"name":"Copy ImageBox","elementName":"Core.ImageBox","style":{"top":270,"left":86,"width":300,"height":200,"transform":{}},"props":{"url":"https://www.kolopro.cz/Show_picture_inline.php?id=4832","border":{},"objectFit":"cover","clipPath":"polygon(7% 0, 97% 0, 100% 100%, 0% 100%)"}}],"containers":[]},{"name":"Copy Copy container","elementName":"Container","style":{"top":0,"left":0,"height":117,"width":719,"position":"relative"},"props":{"startOnNewPage":true,"unbreakable":false},"boxes":[{"name":"FrameGeometrySection","elementName":"Core.HtmlBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"content":"<h2 style=\"text-align: center;\">Frame geometry</h2>\n<p>Setting up the right geometry and the right seat position is one of the most impornant factor that influences the power and the health of a biker.</p>"}}],"containers":[]},{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":819,"width":725,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"width":700,"height":231,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"Inseam","elementName":"Core.TangleNumberText","style":{"top":53,"left":100,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.Inseam"},"width":50}},{"name":"Copy BigTtile","elementName":"Core.TextBox","style":{"top":53,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Inseam","font":{"bold":true}}},{"name":"Copy Copy BigTtile","elementName":"Core.TextBox","style":{"top":155,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Forearm","font":{"bold":true}}},{"name":"Torso","elementName":"Core.TangleNumberText","style":{"top":85,"left":100,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.Torso"}}},{"name":"Paze","elementName":"Core.TextBox","style":{"top":85,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Torso","font":{"bold":true}}},{"name":"Copy Paze","elementName":"Core.TextBox","style":{"top":121,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Height","font":{"bold":true}}},{"name":"ArmElbowLength","elementName":"Core.TangleNumberText","style":{"top":155,"left":100,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.ArmElbowLength"}}},{"name":"Height","elementName":"Core.TangleNumberText","style":{"top":118,"left":100,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.Height"},"min":100,"max":200}},{"name":"FrameGeometry","elementName":"Core.JSXBox","style":{"left":407,"transform":{},"top":3},"props":{"content":{"code":"var sharedCode = self.props.customCode;\nif (sharedCode === undefined) return \"No biomechanic available\";\nvar result = new sharedCode.BioMechanic.FrameGeometryFactory().CreateMTB(input);\nvar formatNumber = sharedCode.formatNumber;\nreturn (<div className=\"panel panel-primary\">\n        <div className=\"panel-heading\">Frame geometry (cm)</div>\n  <div className=\"panel-body\">\n  <table>\n        <colgroup>\n        \t<col style={{width:200}} />        \t\n        </colgroup>\n        <tr>\n          <td>Seat tube</td>\n          <td>{formatNumber(result.SeatTube)}</td>\n\t\t</tr>\n \t\n        <tr>\n          <td>Seat height</td>\n          <td>{formatNumber(result.SeatHeight)}</td>\n\t\t</tr>\n        <tr>\n          <td>Saddle pedal seatback</td>\n          <td>{formatNumber(result.SaddlePedalSeatback)}</td>\n\t\t</tr>\n        <tr>\n          <td>Top tube</td>\n          <td>{formatNumber(result.TopTube)}</td>\n\t\t</tr>\n                <tr>\n          <td>Flat handlebars</td>\n          <td>{formatNumber(result.FlatHandlebars)}</td>\n\t\t</tr>\n        <tr>\n          <td>Saddle handlebar drop</td>\n          <td>{formatNumber(result.SaddleHandlebarDrop)}</td>\n\t\t</tr>\n\t\t\t<tr>\n          <td>Reach</td>\n          <td>{formatNumber(result.Reach)}</td>\n\t\t</tr>    \n\t</table>\n  </div>\n</div>)","compiled":"\"use strict\";\n\n(function () {\n        var sharedCode = self.props.customCode;\n        if (sharedCode === undefined) return \"No biomechanic available\";\n        var result = new sharedCode.BioMechanic.FrameGeometryFactory().CreateMTB(input);\n        var formatNumber = sharedCode.formatNumber;\n        return React.createElement(\n                \"div\",\n                { className: \"panel panel-primary\" },\n                React.createElement(\n                        \"div\",\n                        { className: \"panel-heading\" },\n                        \"Frame geometry (cm)\"\n                ),\n                React.createElement(\n                        \"div\",\n                        { className: \"panel-body\" },\n                        React.createElement(\n                                \"table\",\n                                null,\n                                React.createElement(\n                                        \"colgroup\",\n                                        null,\n                                        React.createElement(\"col\", { style: { width: 200 } })\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Seat tube\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.SeatTube)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Seat height\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.SeatHeight)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Saddle pedal seatback\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.SaddlePedalSeatback)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Top tube\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.TopTube)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Flat handlebars\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.FlatHandlebars)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Saddle handlebar drop\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.SaddleHandlebarDrop)\n                                        )\n                                ),\n                                React.createElement(\n                                        \"tr\",\n                                        null,\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                \"Reach\"\n                                        ),\n                                        React.createElement(\n                                                \"td\",\n                                                null,\n                                                formatNumber(result.Reach)\n                                        )\n                                )\n                        )\n                )\n        );\n})();"},"input":{"path":"MTB","converter":{"code":"","compiled":"\"use strict\";\n\n(function () {})();"},"mode":"OneWay"},"output":{}}},{"name":"BikerMeasure","elementName":"react-bootstrap.Panel","style":{"top":0,"left":0,"width":300,"transform":{}},"props":{"header":"Biker measure (cm)","bsStyle":"primary","content":"<div style=\"height: 120px;\">&nbsp;</div>"}}],"containers":[]},{"name":"skeletonContainer","elementName":"Container","style":{"top":0,"left":0,"width":326,"height":610,"position":"relative"},"props":{"visibility":{"path":"showSkeleton","mode":"OneWay"},"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"BikeMeasureImage","elementName":"Core.ImageBox","style":{"width":300,"transform":{}},"props":{"url":"https://upload.wikimedia.org/wikipedia/commons/thumb/d/df/Human_skeleton_front_-_no_labels.svg/500px-Human_skeleton_front_-_no_labels.svg.png","border":{}}},{"name":"Dimension","elementName":"Shapes.Dimension","style":{"top":378,"left":71,"width":250,"height":100,"transform":{"tx":0,"ty":0,"sx":1,"sy":1,"rz":1.5816147474342814,"ox":0.5,"oy":0.5}},"props":{"strokeWidth":3}},{"name":"Dimension","elementName":"Shapes.Dimension","style":{"top":126,"left":16,"width":130,"height":40,"transform":{"tx":-46,"ty":140,"sx":1,"sy":1,"rz":-1.572790667467936,"ox":0.5,"oy":0.5}},"props":{"strokeWidth":3}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":444,"left":234,"transform":{"ty":2,"sx":1,"sy":1,"rz":-1.58260554479891,"ox":0.5,"oy":0.5}},"props":{"content":"Inseam"}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":262,"left":-30,"transform":{"ty":2,"sx":1,"sy":1,"rz":-1.58260554479891,"ox":0.5,"oy":0.5}},"props":{"content":"arm elbow length"}},{"name":"ValueBox","elementName":"Core.ValueBox","style":{"top":520,"left":252},"props":{"content":{"path":"MTB.BikerMeasure.Inseam","mode":"OneWay"},"font":{"bold":true}}},{"name":"Copy ValueBox","elementName":"Core.ValueBox","style":{"top":348,"left":12},"props":{"content":{"path":"MTB.BikerMeasure.ArmElbowLength","mode":"OneWay"},"font":{"bold":true}}},{"name":"Copy Dimension","elementName":"Shapes.Dimension","style":{"top":125,"left":128,"width":150,"height":100,"transform":{"tx":0,"ty":0,"sx":1,"sy":1,"rz":1.5816147474342814,"ox":0.5,"oy":0.5}},"props":{"strokeWidth":3}},{"name":"Copy Dimension","elementName":"Shapes.Dimension","style":{"top":134,"left":-132,"width":550,"height":40,"transform":{"tx":-46,"ty":140,"sx":1,"sy":1,"rz":-1.572790667467936,"ox":0.5,"oy":0.5}},"props":{"strokeWidth":3}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":167,"left":240,"transform":{"ty":2,"sx":1,"sy":1,"rz":-1.58260554479891,"ox":0.5,"oy":0.5}},"props":{"content":"torso"}},{"name":"Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":457,"left":27,"transform":{"ty":2,"sx":1,"sy":1,"rz":-1.58260554479891,"ox":0.5,"oy":0.5}},"props":{"content":"height"}},{"name":"Copy ValueBox","elementName":"Core.ValueBox","style":{"top":513,"left":44},"props":{"content":{"path":"MTB.BikerMeasure.Height","mode":"OneWay"},"font":{"bold":true}}},{"name":"Copy Copy ValueBox","elementName":"Core.ValueBox","style":{"top":108,"left":260},"props":{"content":{"path":"MTB.BikerMeasure.Torso","mode":"OneWay"},"font":{"bold":true}}}],"containers":[]},{"name":"frameGeometry","elementName":"Container","style":{"top":-600,"left":350,"width":381,"height":316,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"FrameGeometryImage","elementName":"Core.ImageBox","style":{"top":0,"left":0},"props":{"url":"http://www.frogworks.de/hobbies/rennrad/rahmengroesse/img/Rahmen/Rahmen.gif","border":{}}},{"name":"ValueBox","elementName":"Core.ValueBox","style":{"top":120,"left":130},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n     return box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"SaddlePedalSeatback","mode":"OneWay"}}},{"name":"Copy ValueBox","elementName":"Core.ValueBox","style":{"top":30,"left":206},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n  \t\treturn box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"SaddleHandlebarDrop","mode":"OneWay"}}},{"name":"Copy Copy ValueBox","elementName":"Core.ValueBox","style":{"top":54,"left":134},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n     return box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"TopTube","mode":"OneWay"}}},{"name":"Copy Copy ValueBox","elementName":"Core.ValueBox","style":{"top":34,"left":304},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n     return result[args];\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return result[args];\n    }\n  };\n})();"},"converterArgs":"Reach","mode":"OneWay"}}},{"name":"Copy ValueBox","elementName":"Core.ValueBox","style":{"top":195,"left":77},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n     return box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"SeatTube","mode":"OneWay"}}},{"name":"Copy Copy ValueBox","elementName":"Core.ValueBox","style":{"top":166,"left":21},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n     return box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"SeatHeight","mode":"OneWay"}}},{"name":"Copy Copy ValueBox","elementName":"Core.ValueBox","style":{"top":0,"left":252},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item,args){\n     if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item)\n  \t\treturn box.customCode.formatNumber(result[args]);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item, args) {\n      if (box.customCode === undefined) return item;\n      var result = new box.customCode.BioMechanic.FrameGeometryFactory().CreateMTB(item);\n      return box.customCode.formatNumber(result[args]);\n    }\n  };\n})();"},"converterArgs":"FlatHandlebars","mode":"OneWay"}}}],"containers":[]}]},{"name":"Copy container","elementName":"Container","style":{"top":0,"left":0,"height":184,"width":743,"position":"relative"},"props":{"startOnNewPage":true,"unbreakable":false},"boxes":[{"name":"ResistanceForces","elementName":"Core.HtmlBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"content":"<h3 style=\"text-align: center;\">Improve you power to weight ratio</h3>\n<p style=\"text-align: left;\">These major forces that the biker must overcome to maintain a certain speed are</p>\n<ul>\n<li>air resistnace -&nbsp;<a href=\"#WindResistanceBox\">wind resistance</a></li>\n<li>rolling resistance -&nbsp;<a href=\"#RollingResistanceBox\">rolling resistance</a></li>\n<li>gravity -&nbsp;<a href=\"#GravityBox\">gravity force</a></li>\n<li>frictional force (in the chain, gears and bearings)</li>\n</ul>"}}],"containers":[]},{"name":"PowerToWeightContainer","elementName":"Container","style":{"top":0,"left":0,"height":879,"width":768,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":144,"width":634,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"TextBox","elementName":"Core.TextBox","style":{"top":44,"left":8,"zIndex":"2","transform":{}},"props":{"content":"Weight of rider (kg)"}},{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":70,"left":140,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikeMeasure.Weight"},"min":5,"max":40}},{"name":"Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":44,"left":368,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.FrontalArea"},"min":0,"max":2,"step":0.001}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":74,"left":9,"zIndex":"2","transform":{}},"props":{"content":"Weight of bike (kg)"}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":44,"left":234,"zIndex":"2","transform":{}},"props":{"content":"Frontal area (m2)"}},{"name":"Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":73,"left":235,"zIndex":"2","transform":{}},"props":{"content":"Drag coefficient"}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":42,"left":140,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.Weight"},"min":10,"max":120}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":77,"left":371,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.DragCoefficient"},"min":0,"max":1,"step":0.001}},{"name":"BikerParameters","elementName":"react-bootstrap.Panel","style":{"top":0,"left":0,"width":600,"height":100,"transform":{}},"props":{"header":"Rider and bike parameters","bsStyle":"primary","content":"<div style=\"height: 40px;\">&nbsp;</div>"}}],"containers":[]},{"name":"Copy container","elementName":"Container","style":{"top":0,"left":0,"height":151,"width":634,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"TextBox","elementName":"Core.TextBox","style":{"top":43,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Percent grade of hill (%)"}},{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":70,"left":210,"width":60,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.Environment.RollingResistanceCoefficient"},"min":0,"max":1,"step":0.001}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":69,"left":10,"zIndex":"2","transform":{}},"props":{"content":"Coefficient of rolling resistance"}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":42,"left":210,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.Environment.HillGrade"}}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":100,"left":210,"width":50,"zIndex":"2","transform":{}},"props":{"value":{"path":"MTB.Environment.AirDensity"},"min":1,"max":2,"step":0.001}},{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":97,"left":10,"zIndex":"2","transform":{}},"props":{"content":"<p>Air density (kg/m<sup>3</sup>)</p>"}},{"name":"EnvironmentParameters","elementName":"react-bootstrap.Panel","style":{"top":0,"left":0,"width":600,"transform":{}},"props":{"header":"Environmental parameters","bsStyle":"success","content":"<div style=\"height: 60px;\">&nbsp;</div>"}}],"containers":[]},{"name":"chart","elementName":"Container","style":{"top":0,"left":0,"height":323,"width":758,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"PowerToWeightSmoothLine","elementName":"Chart.SmoothLine","style":{"top":0,"left":0,"transform":{}},"props":{"data":{"path":"MTB","converter":{"code":"return {\n  format:function(item){\n    var BioMechanic = box.customCode.BioMechanic;    \n    if (BioMechanic === undefined) return;\n    var table = new BioMechanic.BikingTables(item).GetSpeedToPower(60);\n    var gravity = _lodash.map(table,function(item){\n    \treturn {x:item[0],y:item[1].Gravity}\n    })\n    var rolling = _lodash.map(table,function(item){\n    \treturn {x:item[0],y:item[1].Gravity + item[1].RollingResistance}\n    })\n    var wind = _lodash.map(table,function(item){\n    \treturn {x:item[0],y:item[1].Gravity + item[1].RollingResistance + item[1].WindResistance}\n    })\n\n\treturn [gravity,rolling,wind]\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item) {\n      var BioMechanic = box.customCode.BioMechanic;\n      if (BioMechanic === undefined) return;\n      var table = new BioMechanic.BikingTables(item).GetSpeedToPower(60);\n      var gravity = _lodash.map(table, function (item) {\n        return { x: item[0], y: item[1].Gravity };\n      });\n      var rolling = _lodash.map(table, function (item) {\n        return { x: item[0], y: item[1].Gravity + item[1].RollingResistance };\n      });\n      var wind = _lodash.map(table, function (item) {\n        return { x: item[0], y: item[1].Gravity + item[1].RollingResistance + item[1].WindResistance };\n      });\n\n      return [gravity, rolling, wind];\n    }\n  };\n})();"},"mode":"OneWay"},"xKey":"x","yKey":"y","options":{"width":660,"height":200,"margin":{"top":20,"bottom":20},"animate":{},"axisX":{"label":{}},"axisY":{"label":{}}}}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":95,"left":-29,"transform":{"tx":0,"ty":0,"sx":1,"sy":1,"rz":-1.58,"ox":0.5,"oy":0.5}},"props":{"content":"Power (W)","font":{"bold":true}}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":248,"left":290},"props":{"content":"Velocity (km/h)","font":{"bold":true}}}],"containers":[]},{"name":"speedSummary","elementName":"Container","style":{"top":0,"left":0,"height":242,"width":732,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"Pie","elementName":"Chart.Pie","style":{"top":-26,"left":459,"transform":{}},"props":{"data":{"path":"MTB","converter":{"code":"return {\n  format:function(item){\n    var BioMechanic = box.customCode.BioMechanic;    \n    if (BioMechanic === undefined) return;\n    var powers = new BioMechanic.BikingTables(item).SpeedToPower();\n   \n   \n   \t\treturn [\n          {name:\"Gravity\", value:powers.Gravity},\n          {name:\"Rolling Resistance\", value: powers.RollingResistance},\n           {name:\"Wind Resistance\",value: powers.WindResistance}\n          ]\n   \n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item) {\n      var BioMechanic = box.customCode.BioMechanic;\n      if (BioMechanic === undefined) return;\n      var powers = new BioMechanic.BikingTables(item).SpeedToPower();\n\n      return [{ name: \"Gravity\", value: powers.Gravity }, { name: \"Rolling Resistance\", value: powers.RollingResistance }, { name: \"Wind Resistance\", value: powers.WindResistance }];\n    }\n  };\n})();"},"mode":"OneWay"},"accessorKey":"value","options":{"margin":{},"width":200,"height":200,"r":100,"R":50,"legendPosition":"topLeft","animate":{},"label":{"fontSize":8}}}},{"name":"JSXBox","elementName":"Core.JSXBox","style":{"top":43,"transform":{}},"props":{"content":{"code":"var sharedCode = self.props.customCode;\nif (sharedCode === undefined) return;\n//var input = _.merge(input,{BikerMeasure:{Speed:input.speed}});\nvar forces = new sharedCode.BioMechanic.BikingForces(input);\nvar powers = new sharedCode.BioMechanic.BikingTables(input).SpeedToPower();\n\nvar windPower = powers.WindResistance;\nvar rollingPower = powers.RollingResistance;\nvar gravityPower = powers.Gravity;\nvar total = windPower + rollingPower + gravityPower;\n\nreturn (\n  <div className=\"panel panel-primary\">\n        <div className=\"panel-heading\">Forces to overcome at speed <b>{input.BikerMeasure.Speed} km/h</b>:</div>\n  <div className=\"panel-body\">\n  <table>\n        <colgroup>\n        <col style={{width:150}}></col>\n  <col style={{width:80}}></col>\n  <col style={{width:80}}></col>\n  <col style={{width:80}}></col>\n</colgroup>\n        <tr>\n        <td></td>\n <td>Force (N)</td>\n  <td>Power (W)</td>\n<td>(%)</td>\n  </tr>\n  <tr>\n    <td>Wind Resistance</td>\n \t<td>{sharedCode.formatNumber(forces.WindResistance)}</td>\n  \t<td>{sharedCode.formatNumber(windPower)}</td>\n\t<td>{sharedCode.formatNumber((windPower/total) * 100)}</td>\n  </tr>\n  <tr>\n    <td>Rolling Resistance</td>\n \t<td>{sharedCode.formatNumber(forces.RollingResistance)}</td>\n  \t<td>{sharedCode.formatNumber(rollingPower)}</td>\n    <td>{sharedCode.formatNumber((rollingPower/total) * 100)}</td>\n  </tr>\n  <tr>\n    <td>Gravity</td>\n \t<td>{sharedCode.formatNumber(forces.Gravity)}</td>\n  \t<td>{sharedCode.formatNumber(gravityPower)}</td>\n\t<td>{sharedCode.formatNumber((gravityPower/total) * 100)}</td>\n  </tr>   \n    <tr>\n    <td><b>Total</b></td>\n \t<td><b>{sharedCode.formatNumber(forces.Gravity + forces.RollingResistance + forces.WindResistance)}</b></td>\n  \t<td><b>{sharedCode.formatNumber(gravityPower + rollingPower + windPower )}</b></td>\n\t<td><b>{100}</b></td>\n  </tr>      \n  </table></div></div>)","compiled":"\"use strict\";\n\n(function () {\n  var sharedCode = self.props.customCode;\n  if (sharedCode === undefined) return;\n  //var input = _.merge(input,{BikerMeasure:{Speed:input.speed}});\n  var forces = new sharedCode.BioMechanic.BikingForces(input);\n  var powers = new sharedCode.BioMechanic.BikingTables(input).SpeedToPower();\n\n  var windPower = powers.WindResistance;\n  var rollingPower = powers.RollingResistance;\n  var gravityPower = powers.Gravity;\n  var total = windPower + rollingPower + gravityPower;\n\n  return React.createElement(\n    \"div\",\n    { className: \"panel panel-primary\" },\n    React.createElement(\n      \"div\",\n      { className: \"panel-heading\" },\n      \"Forces to overcome at speed \",\n      React.createElement(\n        \"b\",\n        null,\n        input.BikerMeasure.Speed,\n        \" km/h\"\n      ),\n      \":\"\n    ),\n    React.createElement(\n      \"div\",\n      { className: \"panel-body\" },\n      React.createElement(\n        \"table\",\n        null,\n        React.createElement(\n          \"colgroup\",\n          null,\n          React.createElement(\"col\", { style: { width: 150 } }),\n          React.createElement(\"col\", { style: { width: 80 } }),\n          React.createElement(\"col\", { style: { width: 80 } }),\n          React.createElement(\"col\", { style: { width: 80 } })\n        ),\n        React.createElement(\n          \"tr\",\n          null,\n          React.createElement(\"td\", null),\n          React.createElement(\n            \"td\",\n            null,\n            \"Force (N)\"\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            \"Power (W)\"\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            \"(%)\"\n          )\n        ),\n        React.createElement(\n          \"tr\",\n          null,\n          React.createElement(\n            \"td\",\n            null,\n            \"Wind Resistance\"\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(forces.WindResistance)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(windPower)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(windPower / total * 100)\n          )\n        ),\n        React.createElement(\n          \"tr\",\n          null,\n          React.createElement(\n            \"td\",\n            null,\n            \"Rolling Resistance\"\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(forces.RollingResistance)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(rollingPower)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(rollingPower / total * 100)\n          )\n        ),\n        React.createElement(\n          \"tr\",\n          null,\n          React.createElement(\n            \"td\",\n            null,\n            \"Gravity\"\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(forces.Gravity)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(gravityPower)\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            sharedCode.formatNumber(gravityPower / total * 100)\n          )\n        ),\n        React.createElement(\n          \"tr\",\n          null,\n          React.createElement(\n            \"td\",\n            null,\n            React.createElement(\n              \"b\",\n              null,\n              \"Total\"\n            )\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            React.createElement(\n              \"b\",\n              null,\n              sharedCode.formatNumber(forces.Gravity + forces.RollingResistance + forces.WindResistance)\n            )\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            React.createElement(\n              \"b\",\n              null,\n              sharedCode.formatNumber(gravityPower + rollingPower + windPower)\n            )\n          ),\n          React.createElement(\n            \"td\",\n            null,\n            React.createElement(\n              \"b\",\n              null,\n              100\n            )\n          )\n        )\n      )\n    )\n  );\n})();"},"input":{"path":"MTB","mode":"OneWay"},"output":{}}}],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":36,"width":614,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":0,"left":105},"props":{"value":{"path":"MTB.BikerMeasure.Speed"},"min":0,"max":60,"pixelDistance":10}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":0,"left":0},"props":{"content":"Speed (km/h)","font":{"bold":true}}},{"name":"ValueBox","elementName":"Core.ValueBox","style":{"top":-2,"left":228},"props":{"content":{"path":"MTB","converter":{"code":"return {\n  format:function(item){\n    var BioMechanic = box.customCode.BioMechanic;    \n    if (BioMechanic === undefined) return;\n    var powers = new BioMechanic.BikingTables(item).SpeedToPower();\n    console.log(powers);\n   \treturn box.customCode.formatNumber(powers.Gravity + powers.RollingResistance + powers.WindResistance);   \n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(item) {\n      var BioMechanic = box.customCode.BioMechanic;\n      if (BioMechanic === undefined) return;\n      var powers = new BioMechanic.BikingTables(item).SpeedToPower();\n      console.log(powers);\n      return box.customCode.formatNumber(powers.Gravity + powers.RollingResistance + powers.WindResistance);\n    }\n  };\n})();"},"mode":"OneWay"}}}],"containers":[]}]}]},{"name":"GravityContainer","elementName":"Container","style":{"top":0,"left":0,"height":1490,"width":752,"position":"relative"},"props":{"startOnNewPage":true,"unbreakable":false},"boxes":[],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":126,"width":734,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"GravityBox","elementName":"Core.HtmlBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"content":"<h2 style=\"text-align: center;\">Gravity</h2>\n<p>Going uphill adds gravity to forces that must be overcome. Gravity is simple to compute. The force is influence by the the weight of biker and his bike and by the grade of the hill.</p>"}}],"containers":[]},{"name":"container","elementName":"Container","style":{"top":0,"left":0,"width":715,"height":595,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"PowerToWeightRatio","elementName":"Core.ImageBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"url":"http://www.beselfpropelled.com/wp-content/uploads/2012/09/Climb-Uphill.jpg","border":{}}},{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":547,"left":102,"transform":{}},"props":{"content":"<p><strong>Grafic Source:&nbsp;<a href=\"http://www.beselfpropelled.com/the-4-secrets-to-cycling-faster-up-hills/\">http://www.beselfpropelled.com/the-4-secrets-to-cycling-faster-up-hills/</a></strong></p>","font":{"fontFamily":"Helvetica"}}}],"containers":[]},{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":122,"width":713,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":0,"left":117},"props":{"value":{"path":"MTB.BikerMeasure.Weight"}}},{"name":"Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":42,"left":119},"props":{"value":{"path":"MTB.BikeMeasure.Weight","converter":{"code":"","compiled":"\"use strict\";\n\n(function () {})();"}}}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":81,"left":119,"width":50,"transform":{}},"props":{"value":{"path":"MTB.Environment.HillGrade"}}},{"name":"JSXBox","elementName":"Core.JSXBox","style":{"top":4,"left":237},"props":{"content":{"code":"var sharedCode = self.props.customCode;\nif (sharedCode === undefined) return;\nvar forces = new sharedCode.BioMechanic.BikingForces(input);\nreturn (<div>If you want to move uphill, you have to exert a force <b>{sharedCode.formatNumber(forces.Gravity)} N</b> that is larger than the component of gravity that is trying to pull you donw the hill.</div>)","compiled":"\"use strict\";\n\n(function () {\n  var sharedCode = self.props.customCode;\n  if (sharedCode === undefined) return;\n  var forces = new sharedCode.BioMechanic.BikingForces(input);\n  return React.createElement(\n    \"div\",\n    null,\n    \"If you want to move uphill, you have to exert a force \",\n    React.createElement(\n      \"b\",\n      null,\n      sharedCode.formatNumber(forces.Gravity),\n      \" N\"\n    ),\n    \" that is larger than the component of gravity that is trying to pull you donw the hill.\"\n  );\n})();"},"input":{"path":"MTB","mode":"OneWay"},"output":{}}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":0,"left":0},"props":{"content":"Body weight:"}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":34,"left":0},"props":{"content":"Bike weight:"}},{"name":"Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":73,"left":-3},"props":{"content":"% grade of hill"}},{"name":"ValueBox","elementName":"Core.ValueBox","style":{"top":79,"left":233},"props":{"content":{"path":"MTB.Environment.HillGrade","converter":{"code":"return {\n  format:function(value){\n    var convertToAngle = box.customCode.convertToAngle;\n    if (convertToAngle === undefined) return;\n    var angle = convertToAngle(value);\n\tvar formatNumber = box.customCode.formatNumber;\n\tif (formatNumber === undefined) return angle;\n    return formatNumber(angle);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(value) {\n      var convertToAngle = box.customCode.convertToAngle;\n      if (convertToAngle === undefined) return;\n      var angle = convertToAngle(value);\n      var formatNumber = box.customCode.formatNumber;\n      if (formatNumber === undefined) return angle;\n      return formatNumber(angle);\n    }\n  };\n})();"},"mode":"OneWay"}}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":78,"left":178},"props":{"content":"%"}},{"name":"hillExplain","elementName":"Core.TangleBoolText","style":{"top":80,"left":289},"props":{"value":{"path":"hideHillGradeAngle"},"trueText":"show hill versus grade explaination","falseText":"hide explaination"}}],"containers":[]},{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":556,"width":705,"position":"relative"},"props":{"visibility":{"path":"hideHillGradeAngle","mode":"OneWay"},"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"ImageBox","elementName":"Core.ImageBox","style":{"top":112,"left":-9},"props":{"url":"http://runnersconnect.net/wp-content/uploads/2013/10/RC19_gradients-resized.jpg","border":{}}},{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":0,"left":0,"transform":{}},"props":{"content":"<p>There are several systems for expressing grade/slope:</p>\n<ul>\n<li>as an angle of inclination from the horizontal of a right triangle. (This is the angle &alpha; opposite the \"rise\" side of the triangle.)</li>\n<li>as a percentage (also known as the grade), the formula for which is which could also be expressed as the tangent of the angle of inclination times 100</li>\n</ul>"}}],"containers":[]}]},{"name":"WindContainer","elementName":"Container","style":{"top":0,"left":0,"height":965,"width":751,"position":"relative"},"props":{"startOnNewPage":true,"unbreakable":false},"boxes":[],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":238,"width":707,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"WindResistanceBox","elementName":"Core.HtmlBox","style":{"transform":{}},"props":{"content":"<h2 style=\"text-align: center;\">Wind&nbsp;resistance</h2>\n<p>Aerodynamics is a fundamentally complex and difficult subject. However, there is a simple computational approach for computing resistance by multiplying air velocity squared by some values. Air velocity is the sum of your speed over the ground and the speed of the wind if coming from directly ahead (subtract if coming directly from behind). One of the other values is air density, which depends on temperature and pressure. Pressure depends mostly on elevation. Another value depends on your shape - this is the \"Cd\" you may have seen elsewhere. A flat plate has a Cd of 1.00 while a very aerodynamic car might be around 0.30. The final value is your frontal area, which varies with your position on the bike.</p>"}}],"containers":[]},{"name":"Copy container","elementName":"Container","style":{"top":0,"left":0,"width":712,"height":520,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"PowerToWeightRatio","elementName":"Core.ImageBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"url":"http://www.beselfpropelled.com/wp-content/uploads/2012/09/Flat-Physics.jpg","border":{}}},{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":471,"left":99,"transform":{}},"props":{"content":"<p><strong>Grafic Source:&nbsp;<a href=\"http://www.beselfpropelled.com/the-4-secrets-to-cycling-faster-up-hills/\">http://www.beselfpropelled.com/the-4-secrets-to-cycling-faster-up-hills/</a></strong></p>","font":{"fontFamily":"Helvetica"}}}],"containers":[]},{"name":"Copy container","elementName":"Container","style":{"top":0,"left":0,"height":204,"width":702,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":0,"left":117,"width":50,"transform":{}},"props":{"value":{"path":"MTB.BikerMeasure.Speed"}}},{"name":"AirDensity","elementName":"Core.TangleNumberText","style":{"top":81,"left":119},"props":{"value":{"path":"MTB.BikerMeasure.FrontalArea"},"step":0.001}},{"name":"JSXBox","elementName":"Core.JSXBox","style":{"top":4,"left":237},"props":{"content":{"code":"var sharedCode = self.props.customCode;\nif (sharedCode === undefined) return;\nvar forces = new sharedCode.BioMechanic.BikingForces(input);\nreturn (<div>If you want to move ahead with a speed <b>{input.BikerMeasure.Speed} km/h</b>, you have to \n        exert a force <b>{sharedCode.formatNumber(forces.WindResistance)} N</b> that is larger than the component of wind resistance that the air exerts against you.</div>)","compiled":"\"use strict\";\n\n(function () {\n        var sharedCode = self.props.customCode;\n        if (sharedCode === undefined) return;\n        var forces = new sharedCode.BioMechanic.BikingForces(input);\n        return React.createElement(\n                \"div\",\n                null,\n                \"If you want to move ahead with a speed \",\n                React.createElement(\n                        \"b\",\n                        null,\n                        input.BikerMeasure.Speed,\n                        \" km/h\"\n                ),\n                \", you have to exert a force \",\n                React.createElement(\n                        \"b\",\n                        null,\n                        sharedCode.formatNumber(forces.WindResistance),\n                        \" N\"\n                ),\n                \" that is larger than the component of wind resistance that the air exerts against you.\"\n        );\n})();"},"input":{"path":"MTB","converter":{"code":"","compiled":"\"use strict\";\n\n(function () {})();"},"mode":"OneWay"},"output":{}}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":0,"left":0},"props":{"content":"Speed"}},{"name":"Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":73,"left":-3},"props":{"content":"Frontal area"}},{"name":"Drag","elementName":"Core.TextBox","style":{"top":111,"left":-3},"props":{"content":"Drag coefficient "}},{"name":"Copy Copy Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":145,"left":-5},"props":{"content":"Air density (kg/m3)"}},{"name":"Copy AirDensity","elementName":"Core.TangleNumberText","style":{"top":112,"left":114},"props":{"value":{"path":"MTB.BikerMeasure.DragCoefficient"},"step":0.1}},{"name":"Copy AirDensity","elementName":"Core.TangleNumberText","style":{"top":144,"left":116},"props":{"value":{"path":"MTB.Environment.AirDensity"},"step":0.1}},{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":145,"left":226,"transform":{}},"props":{"content":"<p><a href=\"http://www.gribble.org/cycling/air_density.html\">Air density calculator</a></p>"}},{"name":"ValueBox","elementName":"Core.ValueBox","style":{"top":0,"left":183},"props":{"content":{"path":"MTB.BikerMeasure.Speed","converter":{"code":"return {\n  format:function(value){\n    var unitConverter = box.customCode.convertVelocity;\n    if (unitConverter === undefined) return;\n    var convertedValue = unitConverter(value);\n\tvar formatNumber = box.customCode.formatNumber;\n\tif (formatNumber === undefined) return convertedValue;\n    return formatNumber(convertedValue);\n  }\n}","compiled":"\"use strict\";\n\n(function () {\n  return {\n    format: function format(value) {\n      var unitConverter = box.customCode.convertVelocity;\n      if (unitConverter === undefined) return;\n      var convertedValue = unitConverter(value);\n      var formatNumber = box.customCode.formatNumber;\n      if (formatNumber === undefined) return convertedValue;\n      return formatNumber(convertedValue);\n    }\n  };\n})();"},"mode":"OneWay"}}}],"containers":[]}]},{"name":"RollingContainer","elementName":"Container","style":{"top":0,"left":0,"height":344,"width":753,"position":"relative"},"props":{"startOnNewPage":true,"unbreakable":false},"boxes":[],"containers":[{"name":"container","elementName":"Container","style":{"top":0,"left":0,"height":182,"width":702,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":false},"boxes":[{"name":"HtmlBox","elementName":"Core.HtmlBox","style":{"top":0,"left":0,"width":700,"transform":{}},"props":{"content":"<h2 style=\"text-align: center;\">Rolling resistance</h2>\n<p>&nbsp;</p>\n<p>The tire with lower rolling resistance reduces the power required to move forward while also providing a better quality ride. The tire absorbs small bumps by not transferring them into the bicycle and rider, resulting in a smoother ride, faster speeds, and better cornering.</p>"}}],"containers":[]},{"name":"Copy container","elementName":"Container","style":{"top":0,"left":0,"height":122,"width":713,"position":"relative"},"props":{"startOnNewPage":false,"unbreakable":true},"boxes":[{"name":"TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":0,"left":117},"props":{"value":{"path":"MTB.BikerMeasure.Weight"}}},{"name":"Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":42,"left":119},"props":{"value":{"path":"MTB.BikeMeasure.Weight","converter":{"code":"","compiled":"\"use strict\";\n\n(function () {})();"}}}},{"name":"Copy Copy TangleNumberText","elementName":"Core.TangleNumberText","style":{"top":74,"left":203,"width":50,"transform":{}},"props":{"value":{"path":"MTB.Environment.RollingResistanceCoefficient"},"min":0,"max":1,"step":0.001}},{"name":"JSXBox","elementName":"Core.JSXBox","style":{"top":4,"left":237},"props":{"content":{"code":"var sharedCode = self.props.customCode;\nif (sharedCode === undefined) return;\nvar forces = new sharedCode.BioMechanic.BikingForces(input);\nreturn (<div>If you want to move forward, you have to deliver a force <b>{sharedCode.formatNumber(forces.RollingResistance)} N</b> that is larger than rolling resistance.</div>)","compiled":"\"use strict\";\n\n(function () {\n  var sharedCode = self.props.customCode;\n  if (sharedCode === undefined) return;\n  var forces = new sharedCode.BioMechanic.BikingForces(input);\n  return React.createElement(\n    \"div\",\n    null,\n    \"If you want to move forward, you have to deliver a force \",\n    React.createElement(\n      \"b\",\n      null,\n      sharedCode.formatNumber(forces.RollingResistance),\n      \" N\"\n    ),\n    \" that is larger than rolling resistance.\"\n  );\n})();"},"input":{"path":"MTB","converter":{"code":"","compiled":"\"use strict\";\n\n(function () {})();"},"mode":"OneWay"},"output":{}}},{"name":"TextBox","elementName":"Core.TextBox","style":{"top":0,"left":0},"props":{"content":"Body weight:"}},{"name":"Copy TextBox","elementName":"Core.TextBox","style":{"top":34,"left":0},"props":{"content":"Bike weight:"}},{"name":"Copy Copy TextBox","elementName":"Core.TextBox","style":{"top":73,"left":-3},"props":{"content":"Coefficient of rolling resistance"}}],"containers":[]}]}],"props":{"defaultData":{"MTB":{"BikerMeasure":{"Height":160,"Inseam":60,"ShouldersWidth":64,"Torso":55,"ArmElbowLength":45,"FootSize":21,"Weight":75,"Flexibility":3,"FrontalArea":0.509,"DragCoefficient":0.63,"Speed":15},"BikeMeasure":{"Weight":8,"SaddleLength":28},"Environment":{"AirDensity":1.226,"HillGrade":5,"RollingResistanceCoefficient":0.005}},"hideHillGradeAngle":true},"tour":[{"title":"Biking biomechanic","text":"Welcome to bike biomechanic reactive document that shows you 4 major secrets how to improve your biking. Enjoy it.","selector":"#HeaderBox","position":"bottom-left"},{"title":"Body measurement","text":"Please, measure precisly your body. Inseam = Put as much pressure on your crotch as you feel when sitting on your bike seat. Measure the distance from the top of the level to the ground. Then measure your torso, forearm and total heigh.","selector":"#BikerMeasure","position":"top-left"},{"title":"Check body measurement","text":"Please, check that your measurement matches the skeleton graphics.","selector":"#BikeMeasureImage","position":"top-left"},{"title":"Frame geometry","text":"See your optimal geometry. The most important is saddle pedal seatback.","selector":"#FrameGeometry","position":"bottom-left"},{"title":"Frame geometry graphics","text":"Your optimal geometry as graphics  ","selector":"#FrameGeometryImage","position":"bottom-left"},{"title":"Rider and bike parameters","text":"Fill in your weight and the weight of your bicycle. Set up frontal area and drag coefficient.","selector":"#BikerParameters","position":"bottom-left"},{"title":"Environment parameters","text":"Fill in the grade of hill.","selector":"#EnvironmentParameters","position":"bottom-left"},{"title":"Power to velocity chart ","text":"This chart display the relationship between the speed (km/h) and power (W) the biker has to overcomet to go ahead at a certain speed.","selector":"#PowerToWeightSmoothLine","position":"bottom-left"}],"context":{"styles":{"Shapes.Dimension":{"stroke":"#49c240"},"Core.ValueBox":{"font":{"fontSize":16,"bold":true,"underline":false,"color":"#e80c0c"}}},"code":{"code":"var BioMechanic;\n(function (BioMechanic) {\n    (function (CyclingTargetEnum) {\n        CyclingTargetEnum[CyclingTargetEnum[\"Turism\"] = 10] = \"Turism\";\n        CyclingTargetEnum[CyclingTargetEnum[\"Race\"] = 20] = \"Race\";\n    })(BioMechanic.CyclingTargetEnum || (BioMechanic.CyclingTargetEnum = {}));\n    var CyclingTargetEnum = BioMechanic.CyclingTargetEnum;\n    var FrameGeometryFactory = (function () {\n        function FrameGeometryFactory() {\n        }\n        FrameGeometryFactory.prototype.CreateMTB = function (measure) {\n            return new MTBFrameGeometry(measure);\n        };\n        return FrameGeometryFactory;\n    })();\n    BioMechanic.FrameGeometryFactory = FrameGeometryFactory;\n    var GRAVITY = 9.8067;\n    var BikingForces = (function () {\n        function BikingForces(Measure) {\n            this.Measure = Measure;\n        }\n        Object.defineProperty(BikingForces.prototype, \"Gravity\", {\n            get: function () {\n                if (this.Measure.BikeMeasure.Weight === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Weight === undefined)\n                    return undefined;\n                if (this.Measure.Environment.HillGrade === undefined)\n                    return undefined;\n                var m = this.Measure.BikeMeasure.Weight + this.Measure.BikerMeasure.Weight;\n                var grade = this.Measure.Environment.HillGrade;\n                return m * GRAVITY * Math.sin(Math.atan(grade / 100));\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BikingForces.prototype, \"RollingResistance\", {\n            get: function () {\n                if (this.Measure.BikeMeasure.Weight === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Weight === undefined)\n                    return undefined;\n                if (this.Measure.Environment.HillGrade === undefined)\n                    return undefined;\n                if (this.Measure.Environment.RollingResistanceCoefficient === undefined)\n                    return undefined;\n                var m = this.Measure.BikeMeasure.Weight + this.Measure.BikerMeasure.Weight;\n                var grade = this.Measure.Environment.HillGrade;\n                return m * GRAVITY * Math.cos(Math.atan(grade / 100)) * this.Measure.Environment.RollingResistanceCoefficient;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        BikingForces.prototype.getWindResistanceBySpeed = function (speed, drag, frontal, air) {\n            return 0.5 * drag *\n                frontal * air * Math.pow(speed * (1000 / 3600), 2);\n        };\n        Object.defineProperty(BikingForces.prototype, \"WindResistance\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.FrontalArea === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.DragCoefficient === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Speed === undefined)\n                    return undefined;\n                if (this.Measure.Environment.AirDensity === undefined)\n                    return undefined;\n                return this.getWindResistanceBySpeed(this.Measure.BikerMeasure.Speed, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity);\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BikingForces.prototype, \"Friction\", {\n            get: function () {\n                return 0;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(BikingForces.prototype, \"TotalResistance\", {\n            get: function () {\n                return this.WindResistance + this.Gravity + this.RollingResistance;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return BikingForces;\n    })();\n    BioMechanic.BikingForces = BikingForces;\n    var BikingTables = (function () {\n        function BikingTables(Measure) {\n            this.Measure = Measure;\n        }\n        BikingTables.prototype.SpeedToPower = function () {\n            var forces = new BikingForces(this.Measure);\n            var gravity = forces.Gravity;\n            var rolling = forces.RollingResistance;\n            var speed = this.Measure.BikerMeasure.Speed * (1000 / 3600);\n            return {\n                Gravity: gravity * speed,\n                RollingResistance: rolling * speed,\n                WindResistance: forces.getWindResistanceBySpeed(this.Measure.BikerMeasure.Speed, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity) * speed,\n                Friction: 0,\n            };\n        };\n        BikingTables.prototype.GetSpeedToPower = function (maxSpeed) {\n            if (maxSpeed === undefined)\n                maxSpeed = 20;\n            var result = [];\n            var forces = new BikingForces(this.Measure);\n            var gravity = forces.Gravity;\n            var rolling = forces.RollingResistance;\n            for (var i = 0; i <= maxSpeed; i++) {\n                var speed = i * (1000 / 3600);\n                var power = {\n                    Gravity: gravity * speed,\n                    RollingResistance: rolling * speed,\n                    WindResistance: forces.getWindResistanceBySpeed(i, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity) * speed,\n                    Friction: 0,\n                };\n                var totalForce = gravity + rolling +\n                    result.push([i, power]);\n            }\n            return result;\n        };\n        return BikingTables;\n    })();\n    BioMechanic.BikingTables = BikingTables;\n    var MTBFrameGeometry = (function () {\n        function MTBFrameGeometry(Measure) {\n            this.Measure = Measure;\n        }\n        Object.defineProperty(MTBFrameGeometry.prototype, \"SeatTube\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.Inseam === undefined)\n                    return undefined;\n                return this.Measure.BikerMeasure.Inseam * 0.22 * 2.54;\n                ;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"FlatHandlebars\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.ArmElbowLength === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Flexibility === undefined)\n                    return undefined;\n                return this.Measure.BikerMeasure.ArmElbowLength + 5.7 + (4 * (this.Measure.BikerMeasure.Flexibility - 5) / 10);\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"SaddleHandlebarDrop\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.Inseam === undefined)\n                    return undefined;\n                return (this.Measure.BikerMeasure.Inseam - 76.5) / 4 + 5.5;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"SaddlePedalSeatback\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.Inseam === undefined)\n                    return undefined;\n                return (28 - this.Measure.BikeMeasure.SaddleLength) + (this.Measure.BikerMeasure.Inseam - 76.5) / 4 + 6;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"SeatHeight\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.Inseam === undefined)\n                    return undefined;\n                return this.Measure.BikerMeasure.Inseam * 0.889;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"TopTube\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.ArmElbowLength === undefined)\n                    return undefined;\n                return this.Measure.BikerMeasure.ArmElbowLength + 6.5;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        Object.defineProperty(MTBFrameGeometry.prototype, \"Reach\", {\n            get: function () {\n                if (this.Measure.BikerMeasure.Height === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Torso === undefined)\n                    return undefined;\n                if (this.Measure.BikerMeasure.Weight === undefined)\n                    return undefined;\n                if (this.SeatTube === undefined)\n                    return undefined;\n                var kuh = this.Measure.BikerMeasure.Height * 0.23; // Kopf, Hals und Schambereich (23%)\n                var bodyindex = this.Measure.BikerMeasure.Height - (kuh + this.Measure.BikerMeasure.Inseam);\n                var bodycustom = (this.Measure.BikerMeasure.Torso * 70 + bodyindex * 30) / 100;\n                var elvl = (this.Measure.BikerMeasure.ArmElbowLength + bodycustom) / 0.1885;\n                var vlpre = (elvl - 10 * this.TopTube) + ((this.SeatTube / 10 * 17) + (this.Measure.BikerMeasure.Torso * 3.1)) / 2; // Abweichung zu Version 1.2\n                if (vlpre < 65)\n                    return undefined;\n                else if (vlpre < 74.5)\n                    return 7;\n                else if (vlpre < 84.5)\n                    return 8;\n                else if (vlpre < 94.5)\n                    return 9;\n                else if (vlpre < 102.5)\n                    return 10;\n                else if (vlpre < 107.5)\n                    return 10.5;\n                else if (vlpre < 112.5)\n                    return 11;\n                else if (vlpre < 117.5)\n                    return 11.5;\n                else if (vlpre < 124.5)\n                    return 12;\n                else if (vlpre < 134.5)\n                    return 13;\n                else if (vlpre < 144.5)\n                    return 14;\n                else\n                    return undefined;\n            },\n            enumerable: true,\n            configurable: true\n        });\n        return MTBFrameGeometry;\n    })();\n    BioMechanic.MTBFrameGeometry = MTBFrameGeometry;\n})(BioMechanic || (BioMechanic = {}));\n// var measure: BioMechanic.IMeasure = {\n//     BikerMeasure: {\n//       Height: 160,\n//       Inseam: 60,\n//       ShouldersWidth: 64,\n//       Torso: 80,\n//       ArmElbowLength: 45,\n//       FootSize: 21,\n//       Weight: 70,\n//       Flexibility: 3,\n// \t  FrontalArea:0.509,\n// \t  DragCoefficient:0.63,\n// \t  Speed:20\n//     },\n// \tBikeMeasure:{\n// \t    Weight: 10,\n//     \tSaddleLength: 28\n// \t},\n// \tEnvironment:{\n// \t\tAirDensity:1.226,\n// \t\tHillGrade:10,\n// \t\tRollingResistanceCoefficient:0.005\t\t\n// \t}\n// }\n// var button = document.createElement('button');\n// button.textContent = \"Say Hello\";\n// button.onclick = function() {\n// \tvar frame =  new BioMechanic.FrameGeometryFactory().CreateMTB(measure)\n// \tvar forces =  new BioMechanic.BikingForces(measure);\n//     alert(forces.WindResistance);\n// };\n// document.body.appendChild(button);\n\nvar formatNumberEx = function(val,n, x, s, c) {\n  \t\tif (isNaN(val)) return val;\n        var re = '\\\\d(?=(\\\\d{' + (x || 3) + '})+' + (n > 0 ? '\\\\D' : '$') + ')',\n            num = val.toFixed(Math.max(0, ~~n));\n        return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));\n      };\n\treturn {\n      BioMechanic:BioMechanic,\n      formatNumber:\tfunction(s){ return formatNumberEx(s,2,3,' ',',')},\n      convertToAngle:function(value){ return Math.atan(value/100) / (Math.PI/180)},\n      convertVelocity:function(value){ return 1000/3600 * value}\n\t}\n","compiled":"\"use strict\";\n\n(function () {\n    var BioMechanic;\n    (function (BioMechanic) {\n        (function (CyclingTargetEnum) {\n            CyclingTargetEnum[CyclingTargetEnum[\"Turism\"] = 10] = \"Turism\";\n            CyclingTargetEnum[CyclingTargetEnum[\"Race\"] = 20] = \"Race\";\n        })(BioMechanic.CyclingTargetEnum || (BioMechanic.CyclingTargetEnum = {}));\n        var CyclingTargetEnum = BioMechanic.CyclingTargetEnum;\n        var FrameGeometryFactory = (function () {\n            function FrameGeometryFactory() {}\n            FrameGeometryFactory.prototype.CreateMTB = function (measure) {\n                return new MTBFrameGeometry(measure);\n            };\n            return FrameGeometryFactory;\n        })();\n        BioMechanic.FrameGeometryFactory = FrameGeometryFactory;\n        var GRAVITY = 9.8067;\n        var BikingForces = (function () {\n            function BikingForces(Measure) {\n                this.Measure = Measure;\n            }\n            Object.defineProperty(BikingForces.prototype, \"Gravity\", {\n                get: function get() {\n                    if (this.Measure.BikeMeasure.Weight === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Weight === undefined) return undefined;\n                    if (this.Measure.Environment.HillGrade === undefined) return undefined;\n                    var m = this.Measure.BikeMeasure.Weight + this.Measure.BikerMeasure.Weight;\n                    var grade = this.Measure.Environment.HillGrade;\n                    return m * GRAVITY * Math.sin(Math.atan(grade / 100));\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(BikingForces.prototype, \"RollingResistance\", {\n                get: function get() {\n                    if (this.Measure.BikeMeasure.Weight === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Weight === undefined) return undefined;\n                    if (this.Measure.Environment.HillGrade === undefined) return undefined;\n                    if (this.Measure.Environment.RollingResistanceCoefficient === undefined) return undefined;\n                    var m = this.Measure.BikeMeasure.Weight + this.Measure.BikerMeasure.Weight;\n                    var grade = this.Measure.Environment.HillGrade;\n                    return m * GRAVITY * Math.cos(Math.atan(grade / 100)) * this.Measure.Environment.RollingResistanceCoefficient;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            BikingForces.prototype.getWindResistanceBySpeed = function (speed, drag, frontal, air) {\n                return 0.5 * drag * frontal * air * Math.pow(speed * (1000 / 3600), 2);\n            };\n            Object.defineProperty(BikingForces.prototype, \"WindResistance\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.FrontalArea === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.DragCoefficient === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Speed === undefined) return undefined;\n                    if (this.Measure.Environment.AirDensity === undefined) return undefined;\n                    return this.getWindResistanceBySpeed(this.Measure.BikerMeasure.Speed, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity);\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(BikingForces.prototype, \"Friction\", {\n                get: function get() {\n                    return 0;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(BikingForces.prototype, \"TotalResistance\", {\n                get: function get() {\n                    return this.WindResistance + this.Gravity + this.RollingResistance;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            return BikingForces;\n        })();\n        BioMechanic.BikingForces = BikingForces;\n        var BikingTables = (function () {\n            function BikingTables(Measure) {\n                this.Measure = Measure;\n            }\n            BikingTables.prototype.SpeedToPower = function () {\n                var forces = new BikingForces(this.Measure);\n                var gravity = forces.Gravity;\n                var rolling = forces.RollingResistance;\n                var speed = this.Measure.BikerMeasure.Speed * (1000 / 3600);\n                return {\n                    Gravity: gravity * speed,\n                    RollingResistance: rolling * speed,\n                    WindResistance: forces.getWindResistanceBySpeed(this.Measure.BikerMeasure.Speed, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity) * speed,\n                    Friction: 0\n                };\n            };\n            BikingTables.prototype.GetSpeedToPower = function (maxSpeed) {\n                if (maxSpeed === undefined) maxSpeed = 20;\n                var result = [];\n                var forces = new BikingForces(this.Measure);\n                var gravity = forces.Gravity;\n                var rolling = forces.RollingResistance;\n                for (var i = 0; i <= maxSpeed; i++) {\n                    var speed = i * (1000 / 3600);\n                    var power = {\n                        Gravity: gravity * speed,\n                        RollingResistance: rolling * speed,\n                        WindResistance: forces.getWindResistanceBySpeed(i, this.Measure.BikerMeasure.DragCoefficient, this.Measure.BikerMeasure.FrontalArea, this.Measure.Environment.AirDensity) * speed,\n                        Friction: 0\n                    };\n                    var totalForce = gravity + rolling + result.push([i, power]);\n                }\n                return result;\n            };\n            return BikingTables;\n        })();\n        BioMechanic.BikingTables = BikingTables;\n        var MTBFrameGeometry = (function () {\n            function MTBFrameGeometry(Measure) {\n                this.Measure = Measure;\n            }\n            Object.defineProperty(MTBFrameGeometry.prototype, \"SeatTube\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.Inseam === undefined) return undefined;\n                    return this.Measure.BikerMeasure.Inseam * 0.22 * 2.54;\n                    ;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"FlatHandlebars\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.ArmElbowLength === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Flexibility === undefined) return undefined;\n                    return this.Measure.BikerMeasure.ArmElbowLength + 5.7 + 4 * (this.Measure.BikerMeasure.Flexibility - 5) / 10;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"SaddleHandlebarDrop\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.Inseam === undefined) return undefined;\n                    return (this.Measure.BikerMeasure.Inseam - 76.5) / 4 + 5.5;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"SaddlePedalSeatback\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.Inseam === undefined) return undefined;\n                    return 28 - this.Measure.BikeMeasure.SaddleLength + (this.Measure.BikerMeasure.Inseam - 76.5) / 4 + 6;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"SeatHeight\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.Inseam === undefined) return undefined;\n                    return this.Measure.BikerMeasure.Inseam * 0.889;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"TopTube\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.ArmElbowLength === undefined) return undefined;\n                    return this.Measure.BikerMeasure.ArmElbowLength + 6.5;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            Object.defineProperty(MTBFrameGeometry.prototype, \"Reach\", {\n                get: function get() {\n                    if (this.Measure.BikerMeasure.Height === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Torso === undefined) return undefined;\n                    if (this.Measure.BikerMeasure.Weight === undefined) return undefined;\n                    if (this.SeatTube === undefined) return undefined;\n                    var kuh = this.Measure.BikerMeasure.Height * 0.23; // Kopf, Hals und Schambereich (23%)\n                    var bodyindex = this.Measure.BikerMeasure.Height - (kuh + this.Measure.BikerMeasure.Inseam);\n                    var bodycustom = (this.Measure.BikerMeasure.Torso * 70 + bodyindex * 30) / 100;\n                    var elvl = (this.Measure.BikerMeasure.ArmElbowLength + bodycustom) / 0.1885;\n                    var vlpre = elvl - 10 * this.TopTube + (this.SeatTube / 10 * 17 + this.Measure.BikerMeasure.Torso * 3.1) / 2; // Abweichung zu Version 1.2\n                    if (vlpre < 65) return undefined;else if (vlpre < 74.5) return 7;else if (vlpre < 84.5) return 8;else if (vlpre < 94.5) return 9;else if (vlpre < 102.5) return 10;else if (vlpre < 107.5) return 10.5;else if (vlpre < 112.5) return 11;else if (vlpre < 117.5) return 11.5;else if (vlpre < 124.5) return 12;else if (vlpre < 134.5) return 13;else if (vlpre < 144.5) return 14;else return undefined;\n                },\n                enumerable: true,\n                configurable: true\n            });\n            return MTBFrameGeometry;\n        })();\n        BioMechanic.MTBFrameGeometry = MTBFrameGeometry;\n    })(BioMechanic || (BioMechanic = {}));\n    // var measure: BioMechanic.IMeasure = {\n    //     BikerMeasure: {\n    //       Height: 160,\n    //       Inseam: 60,\n    //       ShouldersWidth: 64,\n    //       Torso: 80,\n    //       ArmElbowLength: 45,\n    //       FootSize: 21,\n    //       Weight: 70,\n    //       Flexibility: 3,\n    // \t  FrontalArea:0.509,\n    // \t  DragCoefficient:0.63,\n    // \t  Speed:20\n    //     },\n    // \tBikeMeasure:{\n    // \t    Weight: 10,\n    //     \tSaddleLength: 28\n    // \t},\n    // \tEnvironment:{\n    // \t\tAirDensity:1.226,\n    // \t\tHillGrade:10,\n    // \t\tRollingResistanceCoefficient:0.005\t\t\n    // \t}\n    // }\n    // var button = document.createElement('button');\n    // button.textContent = \"Say Hello\";\n    // button.onclick = function() {\n    // \tvar frame =  new BioMechanic.FrameGeometryFactory().CreateMTB(measure)\n    // \tvar forces =  new BioMechanic.BikingForces(measure);\n    //     alert(forces.WindResistance);\n    // };\n    // document.body.appendChild(button);\n\n    var formatNumberEx = function formatNumberEx(val, n, x, s, c) {\n        if (isNaN(val)) return val;\n        var re = '\\\\d(?=(\\\\d{' + (x || 3) + '})+' + (n > 0 ? '\\\\D' : '$') + ')',\n            num = val.toFixed(Math.max(0, ~ ~n));\n        return (c ? num.replace('.', c) : num).replace(new RegExp(re, 'g'), '$&' + (s || ','));\n    };\n    return {\n        BioMechanic: BioMechanic,\n        formatNumber: function formatNumber(s) {\n            return formatNumberEx(s, 2, 3, ' ', ',');\n        },\n        convertToAngle: function convertToAngle(value) {\n            return Math.atan(value / 100) / (Math.PI / 180);\n        },\n        convertVelocity: function convertVelocity(value) {\n            return 1000 / 3600 * value;\n        }\n    };\n})();"}}}}