| <?xml version="1.0" encoding="UTF-8"?> | ||
| <coverage generated="1764937975239" clover="3.2.0"> | ||
| <project timestamp="1764937975239" name="All files"> | ||
| <metrics statements="203" coveredstatements="82" conditionals="69" coveredconditionals="24" methods="24" coveredmethods="12" elements="296" coveredelements="118" complexity="0" loc="203" ncloc="203" packages="1" files="5" classes="5"/> | ||
| <file name="core.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js"> | ||
| <metrics statements="55" coveredstatements="23" conditionals="31" coveredconditionals="15" methods="7" coveredmethods="3"/> | ||
| <line num="5" count="2" type="stmt"/> | ||
| <line num="6" count="2" type="stmt"/> | ||
| <line num="7" count="2" type="stmt"/> | ||
| <line num="8" count="2" type="stmt"/> | ||
| <line num="9" count="2" type="stmt"/> | ||
| <line num="15" count="2" type="stmt"/> | ||
| <line num="27" count="23" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="29" count="23" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="30" count="1" type="stmt"/> | ||
| <line num="35" count="22" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="36" count="22" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="37" count="22" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="40" count="22" type="stmt"/> | ||
| <line num="43" count="22" type="stmt"/> | ||
| <line num="49" count="22" type="stmt"/> | ||
| <line num="63" count="0" type="stmt"/> | ||
| <line num="64" count="0" type="stmt"/> | ||
| <line num="65" count="0" type="stmt"/> | ||
| <line num="67" count="0" type="stmt"/> | ||
| <line num="81" count="9" type="stmt"/> | ||
| <line num="82" count="9" type="stmt"/> | ||
| <line num="89" count="9" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="98" count="3" type="stmt"/> | ||
| <line num="100" count="3" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="101" count="1" type="stmt"/> | ||
| <line num="104" count="3" type="stmt"/> | ||
| <line num="121" count="0" type="stmt"/> | ||
| <line num="124" count="0" type="stmt"/> | ||
| <line num="127" count="0" type="stmt"/> | ||
| <line num="134" count="0" type="stmt"/> | ||
| <line num="141" count="0" type="stmt"/> | ||
| <line num="142" count="0" type="stmt"/> | ||
| <line num="145" count="0" type="stmt"/> | ||
| <line num="147" count="0" type="stmt"/> | ||
| <line num="162" count="0" type="stmt"/> | ||
| <line num="165" count="0" type="stmt"/> | ||
| <line num="168" count="0" type="stmt"/> | ||
| <line num="169" count="0" type="stmt"/> | ||
| <line num="170" count="0" type="stmt"/> | ||
| <line num="173" count="0" type="stmt"/> | ||
| <line num="179" count="0" type="stmt"/> | ||
| <line num="186" count="0" type="stmt"/> | ||
| <line num="187" count="0" type="stmt"/> | ||
| <line num="190" count="0" type="stmt"/> | ||
| <line num="191" count="0" type="stmt"/> | ||
| <line num="193" count="0" type="stmt"/> | ||
| <line num="213" count="0" type="stmt"/> | ||
| <line num="216" count="0" type="stmt"/> | ||
| <line num="219" count="0" type="cond" truecount="0" falsecount="2"/> | ||
| <line num="220" count="0" type="stmt"/> | ||
| <line num="226" count="0" type="stmt"/> | ||
| <line num="233" count="0" type="cond" truecount="0" falsecount="2"/> | ||
| <line num="234" count="0" type="stmt"/> | ||
| <line num="237" count="0" type="stmt"/> | ||
| <line num="241" count="2" type="stmt"/> | ||
| </file> | ||
| <file name="index.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js"> | ||
| <metrics statements="8" coveredstatements="8" conditionals="0" coveredconditionals="0" methods="0" coveredmethods="0"/> | ||
| <line num="12" count="1" type="stmt"/> | ||
| <line num="13" count="1" type="stmt"/> | ||
| <line num="15" count="1" type="stmt"/> | ||
| <line num="16" count="1" type="stmt"/> | ||
| <line num="17" count="1" type="stmt"/> | ||
| <line num="18" count="1" type="stmt"/> | ||
| <line num="19" count="1" type="stmt"/> | ||
| <line num="20" count="1" type="stmt"/> | ||
| </file> | ||
| <file name="models.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/models.js"> | ||
| <metrics statements="23" coveredstatements="23" conditionals="2" coveredconditionals="2" methods="6" coveredmethods="6"/> | ||
| <line num="15" count="20" type="stmt"/> | ||
| <line num="16" count="20" type="stmt"/> | ||
| <line num="17" count="20" type="stmt"/> | ||
| <line num="18" count="20" type="stmt"/> | ||
| <line num="19" count="20" type="stmt"/> | ||
| <line num="29" count="3" type="stmt"/> | ||
| <line num="30" count="3" type="stmt"/> | ||
| <line num="31" count="3" type="stmt"/> | ||
| <line num="32" count="3" type="stmt"/> | ||
| <line num="33" count="3" type="stmt"/> | ||
| <line num="42" count="8" type="stmt"/> | ||
| <line num="43" count="8" type="stmt"/> | ||
| <line num="64" count="4" type="stmt"/> | ||
| <line num="65" count="4" type="stmt"/> | ||
| <line num="66" count="4" type="stmt"/> | ||
| <line num="67" count="4" type="stmt"/> | ||
| <line num="68" count="4" type="stmt"/> | ||
| <line num="69" count="4" type="stmt"/> | ||
| <line num="81" count="6" type="stmt"/> | ||
| <line num="82" count="6" type="stmt"/> | ||
| <line num="83" count="6" type="stmt"/> | ||
| <line num="91" count="3" type="stmt"/> | ||
| <line num="95" count="4" type="stmt"/> | ||
| </file> | ||
| <file name="utils.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/utils.js"> | ||
| <metrics statements="51" coveredstatements="23" conditionals="12" coveredconditionals="7" methods="3" coveredmethods="3"/> | ||
| <line num="5" count="3" type="stmt"/> | ||
| <line num="6" count="3" type="stmt"/> | ||
| <line num="14" count="12" type="stmt"/> | ||
| <line num="15" count="12" type="stmt"/> | ||
| <line num="16" count="13" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="17" count="4" type="stmt"/> | ||
| <line num="18" count="4" type="stmt"/> | ||
| <line num="19" count="4" type="stmt"/> | ||
| <line num="22" count="12" type="stmt"/> | ||
| <line num="31" count="5" type="stmt"/> | ||
| <line num="32" count="5" type="stmt"/> | ||
| <line num="34" count="5" type="stmt"/> | ||
| <line num="35" count="5" type="stmt"/> | ||
| <line num="36" count="8" type="cond" truecount="2" falsecount="0"/> | ||
| <line num="37" count="7" type="stmt"/> | ||
| <line num="41" count="5" type="stmt"/> | ||
| <line num="52" count="2" type="stmt"/> | ||
| <line num="53" count="2" type="stmt"/> | ||
| <line num="55" count="2" type="stmt"/> | ||
| <line num="57" count="2" type="stmt"/> | ||
| <line num="58" count="3" type="cond" truecount="3" falsecount="1"/> | ||
| <line num="60" count="0" type="stmt"/> | ||
| <line num="61" count="0" type="stmt"/> | ||
| <line num="64" count="0" type="stmt"/> | ||
| <line num="65" count="0" type="stmt"/> | ||
| <line num="66" count="0" type="stmt"/> | ||
| <line num="67" count="0" type="stmt"/> | ||
| <line num="69" count="0" type="stmt"/> | ||
| <line num="70" count="0" type="stmt"/> | ||
| <line num="73" count="0" type="stmt"/> | ||
| <line num="74" count="0" type="stmt"/> | ||
| <line num="77" count="0" type="stmt"/> | ||
| <line num="78" count="0" type="stmt"/> | ||
| <line num="79" count="0" type="stmt"/> | ||
| <line num="80" count="0" type="stmt"/> | ||
| <line num="83" count="0" type="stmt"/> | ||
| <line num="84" count="0" type="stmt"/> | ||
| <line num="86" count="0" type="stmt"/> | ||
| <line num="87" count="0" type="stmt"/> | ||
| <line num="91" count="0" type="stmt"/> | ||
| <line num="93" count="0" type="stmt"/> | ||
| <line num="94" count="0" type="stmt"/> | ||
| <line num="95" count="0" type="stmt"/> | ||
| <line num="96" count="0" type="stmt"/> | ||
| <line num="97" count="0" type="stmt"/> | ||
| <line num="99" count="0" type="cond" truecount="0" falsecount="4"/> | ||
| <line num="100" count="0" type="stmt"/> | ||
| <line num="101" count="0" type="stmt"/> | ||
| <line num="106" count="0" type="stmt"/> | ||
| <line num="111" count="2" type="stmt"/> | ||
| <line num="114" count="3" type="stmt"/> | ||
| </file> | ||
| <file name="visualize.js" path="/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/visualize.js"> | ||
| <metrics statements="66" coveredstatements="5" conditionals="24" coveredconditionals="0" methods="8" coveredmethods="0"/> | ||
| <line num="5" count="2" type="stmt"/> | ||
| <line num="6" count="2" type="stmt"/> | ||
| <line num="7" count="2" type="stmt"/> | ||
| <line num="10" count="2" type="stmt"/> | ||
| <line num="30" count="0" type="stmt"/> | ||
| <line num="32" count="0" type="stmt"/> | ||
| <line num="33" count="0" type="stmt"/> | ||
| <line num="34" count="0" type="stmt"/> | ||
| <line num="36" count="0" type="stmt"/> | ||
| <line num="37" count="0" type="stmt"/> | ||
| <line num="39" count="0" type="stmt"/> | ||
| <line num="40" count="0" type="stmt"/> | ||
| <line num="41" count="0" type="stmt"/> | ||
| <line num="44" count="0" type="stmt"/> | ||
| <line num="45" count="0" type="stmt"/> | ||
| <line num="48" count="0" type="cond" truecount="0" falsecount="4"/> | ||
| <line num="49" count="0" type="stmt"/> | ||
| <line num="50" count="0" type="stmt"/> | ||
| <line num="54" count="0" type="stmt"/> | ||
| <line num="67" count="0" type="stmt"/> | ||
| <line num="68" count="0" type="stmt"/> | ||
| <line num="69" count="0" type="stmt"/> | ||
| <line num="72" count="0" type="stmt"/> | ||
| <line num="73" count="0" type="stmt"/> | ||
| <line num="74" count="0" type="stmt"/> | ||
| <line num="75" count="0" type="stmt"/> | ||
| <line num="78" count="0" type="stmt"/> | ||
| <line num="79" count="0" type="stmt"/> | ||
| <line num="80" count="0" type="cond" truecount="0" falsecount="2"/> | ||
| <line num="81" count="0" type="stmt"/> | ||
| <line num="82" count="0" type="stmt"/> | ||
| <line num="84" count="0" type="stmt"/> | ||
| <line num="85" count="0" type="stmt"/> | ||
| <line num="86" count="0" type="stmt"/> | ||
| <line num="90" count="0" type="stmt"/> | ||
| <line num="106" count="0" type="stmt"/> | ||
| <line num="108" count="0" type="stmt"/> | ||
| <line num="109" count="0" type="stmt"/> | ||
| <line num="110" count="0" type="stmt"/> | ||
| <line num="113" count="0" type="stmt"/> | ||
| <line num="114" count="0" type="stmt"/> | ||
| <line num="115" count="0" type="stmt"/> | ||
| <line num="119" count="0" type="stmt"/> | ||
| <line num="120" count="0" type="stmt"/> | ||
| <line num="122" count="0" type="stmt"/> | ||
| <line num="123" count="0" type="stmt"/> | ||
| <line num="126" count="0" type="stmt"/> | ||
| <line num="127" count="0" type="stmt"/> | ||
| <line num="130" count="0" type="cond" truecount="0" falsecount="4"/> | ||
| <line num="131" count="0" type="stmt"/> | ||
| <line num="132" count="0" type="stmt"/> | ||
| <line num="136" count="0" type="stmt"/> | ||
| <line num="146" count="0" type="stmt"/> | ||
| <line num="149" count="0" type="stmt"/> | ||
| <line num="150" count="0" type="stmt"/> | ||
| <line num="152" count="0" type="cond" truecount="0" falsecount="4"/> | ||
| <line num="153" count="0" type="stmt"/> | ||
| <line num="154" count="0" type="stmt"/> | ||
| <line num="155" count="0" type="stmt"/> | ||
| <line num="159" count="0" type="stmt"/> | ||
| <line num="160" count="0" type="stmt"/> | ||
| <line num="161" count="0" type="stmt"/> | ||
| <line num="163" count="0" type="stmt"/> | ||
| <line num="172" count="0" type="stmt"/> | ||
| <line num="173" count="0" type="stmt"/> | ||
| <line num="176" count="2" type="stmt"/> | ||
| </file> | ||
| </project> | ||
| </coverage> |
| {"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/core.js","statementMap":{"0":{"start":{"line":5,"column":31},"end":{"line":5,"column":63}},"1":{"start":{"line":6,"column":22},"end":{"line":6,"column":39}},"2":{"start":{"line":7,"column":11},"end":{"line":7,"column":33}},"3":{"start":{"line":8,"column":31},"end":{"line":8,"column":50}},"4":{"start":{"line":9,"column":55},"end":{"line":9,"column":73}},"5":{"start":{"line":15,"column":4},"end":{"line":15,"column":26}},"6":{"start":{"line":27,"column":4},"end":{"line":27,"column":63}},"7":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"8":{"start":{"line":30,"column":6},"end":{"line":32,"column":8}},"9":{"start":{"line":35,"column":4},"end":{"line":35,"column":56}},"10":{"start":{"line":36,"column":4},"end":{"line":36,"column":85}},"11":{"start":{"line":37,"column":4},"end":{"line":37,"column":47}},"12":{"start":{"line":40,"column":4},"end":{"line":40,"column":53}},"13":{"start":{"line":43,"column":4},"end":{"line":46,"column":13}},"14":{"start":{"line":49,"column":4},"end":{"line":54,"column":6}},"15":{"start":{"line":63,"column":24},"end":{"line":63,"column":52}},"16":{"start":{"line":64,"column":23},"end":{"line":64,"column":53}},"17":{"start":{"line":65,"column":21},"end":{"line":65,"column":49}},"18":{"start":{"line":67,"column":4},"end":{"line":72,"column":6}},"19":{"start":{"line":81,"column":16},"end":{"line":81,"column":55}},"20":{"start":{"line":82,"column":22},"end":{"line":88,"column":5}},"21":{"start":{"line":89,"column":4},"end":{"line":89,"column":42}},"22":{"start":{"line":98,"column":23},"end":{"line":98,"column":53}},"23":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"24":{"start":{"line":101,"column":6},"end":{"line":101,"column":48}},"25":{"start":{"line":104,"column":4},"end":{"line":104,"column":24}},"26":{"start":{"line":121,"column":8},"end":{"line":121,"column":15}},"27":{"start":{"line":124,"column":18},"end":{"line":124,"column":50}},"28":{"start":{"line":127,"column":18},"end":{"line":131,"column":6}},"29":{"start":{"line":134,"column":19},"end":{"line":139,"column":6}},"30":{"start":{"line":141,"column":21},"end":{"line":141,"column":36}},"31":{"start":{"line":142,"column":17},"end":{"line":142,"column":32}},"32":{"start":{"line":145,"column":18},"end":{"line":145,"column":42}},"33":{"start":{"line":147,"column":4},"end":{"line":147,"column":53}},"34":{"start":{"line":162,"column":8},"end":{"line":162,"column":15}},"35":{"start":{"line":165,"column":18},"end":{"line":165,"column":50}},"36":{"start":{"line":168,"column":16},"end":{"line":168,"column":42}},"37":{"start":{"line":169,"column":21},"end":{"line":169,"column":30}},"38":{"start":{"line":170,"column":22},"end":{"line":170,"column":32}},"39":{"start":{"line":173,"column":18},"end":{"line":176,"column":6}},"40":{"start":{"line":179,"column":19},"end":{"line":184,"column":6}},"41":{"start":{"line":186,"column":21},"end":{"line":186,"column":36}},"42":{"start":{"line":187,"column":17},"end":{"line":187,"column":32}},"43":{"start":{"line":190,"column":18},"end":{"line":190,"column":42}},"44":{"start":{"line":191,"column":18},"end":{"line":191,"column":73}},"45":{"start":{"line":193,"column":4},"end":{"line":193,"column":54}},"46":{"start":{"line":213,"column":8},"end":{"line":213,"column":15}},"47":{"start":{"line":216,"column":19},"end":{"line":216,"column":59}},"48":{"start":{"line":219,"column":4},"end":{"line":230,"column":5}},"49":{"start":{"line":220,"column":6},"end":{"line":224,"column":9}},"50":{"start":{"line":226,"column":6},"end":{"line":229,"column":9}},"51":{"start":{"line":233,"column":4},"end":{"line":235,"column":5}},"52":{"start":{"line":234,"column":6},"end":{"line":234,"column":43}},"53":{"start":{"line":237,"column":4},"end":{"line":237,"column":18}},"54":{"start":{"line":241,"column":0},"end":{"line":241,"column":27}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":26,"column":2},"end":{"line":26,"column":3}},"loc":{"start":{"line":26,"column":28},"end":{"line":55,"column":3}},"line":26},"1":{"name":"(anonymous_1)","decl":{"start":{"line":62,"column":2},"end":{"line":62,"column":3}},"loc":{"start":{"line":62,"column":30},"end":{"line":73,"column":3}},"line":62},"2":{"name":"(anonymous_2)","decl":{"start":{"line":80,"column":2},"end":{"line":80,"column":3}},"loc":{"start":{"line":80,"column":25},"end":{"line":90,"column":3}},"line":80},"3":{"name":"(anonymous_3)","decl":{"start":{"line":97,"column":2},"end":{"line":97,"column":3}},"loc":{"start":{"line":97,"column":45},"end":{"line":105,"column":3}},"line":97},"4":{"name":"(anonymous_4)","decl":{"start":{"line":116,"column":2},"end":{"line":116,"column":3}},"loc":{"start":{"line":116,"column":45},"end":{"line":148,"column":3}},"line":116},"5":{"name":"(anonymous_5)","decl":{"start":{"line":158,"column":2},"end":{"line":158,"column":3}},"loc":{"start":{"line":158,"column":41},"end":{"line":194,"column":3}},"line":158},"6":{"name":"(anonymous_6)","decl":{"start":{"line":207,"column":2},"end":{"line":207,"column":3}},"loc":{"start":{"line":207,"column":51},"end":{"line":238,"column":3}},"line":207}},"branchMap":{"0":{"loc":{"start":{"line":26,"column":14},"end":{"line":26,"column":26}},"type":"default-arg","locations":[{"start":{"line":26,"column":24},"end":{"line":26,"column":26}}],"line":26},"1":{"loc":{"start":{"line":27,"column":18},"end":{"line":27,"column":62}},"type":"binary-expr","locations":[{"start":{"line":27,"column":18},"end":{"line":27,"column":32}},{"start":{"line":27,"column":36},"end":{"line":27,"column":62}}],"line":27},"2":{"loc":{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},"type":"if","locations":[{"start":{"line":29,"column":4},"end":{"line":33,"column":5}},{"start":{},"end":{}}],"line":29},"3":{"loc":{"start":{"line":35,"column":17},"end":{"line":35,"column":55}},"type":"binary-expr","locations":[{"start":{"line":35,"column":17},"end":{"line":35,"column":30}},{"start":{"line":35,"column":34},"end":{"line":35,"column":55}}],"line":35},"4":{"loc":{"start":{"line":36,"column":23},"end":{"line":36,"column":84}},"type":"cond-expr","locations":[{"start":{"line":36,"column":59},"end":{"line":36,"column":78}},{"start":{"line":36,"column":81},"end":{"line":36,"column":84}}],"line":36},"5":{"loc":{"start":{"line":37,"column":22},"end":{"line":37,"column":46}},"type":"binary-expr","locations":[{"start":{"line":37,"column":22},"end":{"line":37,"column":40}},{"start":{"line":37,"column":44},"end":{"line":37,"column":46}}],"line":37},"6":{"loc":{"start":{"line":89,"column":11},"end":{"line":89,"column":41}},"type":"binary-expr","locations":[{"start":{"line":89,"column":11},"end":{"line":89,"column":25}},{"start":{"line":89,"column":29},"end":{"line":89,"column":41}}],"line":89},"7":{"loc":{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},"type":"if","locations":[{"start":{"line":100,"column":4},"end":{"line":102,"column":5}},{"start":{},"end":{}}],"line":100},"8":{"loc":{"start":{"line":116,"column":31},"end":{"line":116,"column":43}},"type":"default-arg","locations":[{"start":{"line":116,"column":41},"end":{"line":116,"column":43}}],"line":116},"9":{"loc":{"start":{"line":118,"column":6},"end":{"line":118,"column":45}},"type":"default-arg","locations":[{"start":{"line":118,"column":15},"end":{"line":118,"column":45}}],"line":118},"10":{"loc":{"start":{"line":119,"column":6},"end":{"line":119,"column":31}},"type":"default-arg","locations":[{"start":{"line":119,"column":27},"end":{"line":119,"column":31}}],"line":119},"11":{"loc":{"start":{"line":120,"column":6},"end":{"line":120,"column":20}},"type":"default-arg","locations":[{"start":{"line":120,"column":16},"end":{"line":120,"column":20}}],"line":120},"12":{"loc":{"start":{"line":158,"column":27},"end":{"line":158,"column":39}},"type":"default-arg","locations":[{"start":{"line":158,"column":37},"end":{"line":158,"column":39}}],"line":158},"13":{"loc":{"start":{"line":160,"column":6},"end":{"line":160,"column":269}},"type":"default-arg","locations":[{"start":{"line":160,"column":15},"end":{"line":160,"column":269}}],"line":160},"14":{"loc":{"start":{"line":161,"column":6},"end":{"line":161,"column":20}},"type":"default-arg","locations":[{"start":{"line":161,"column":16},"end":{"line":161,"column":20}}],"line":161},"15":{"loc":{"start":{"line":207,"column":37},"end":{"line":207,"column":49}},"type":"default-arg","locations":[{"start":{"line":207,"column":47},"end":{"line":207,"column":49}}],"line":207},"16":{"loc":{"start":{"line":209,"column":6},"end":{"line":209,"column":23}},"type":"default-arg","locations":[{"start":{"line":209,"column":19},"end":{"line":209,"column":23}}],"line":209},"17":{"loc":{"start":{"line":210,"column":6},"end":{"line":210,"column":19}},"type":"default-arg","locations":[{"start":{"line":210,"column":18},"end":{"line":210,"column":19}}],"line":210},"18":{"loc":{"start":{"line":211,"column":6},"end":{"line":211,"column":19}},"type":"default-arg","locations":[{"start":{"line":211,"column":17},"end":{"line":211,"column":19}}],"line":211},"19":{"loc":{"start":{"line":212,"column":6},"end":{"line":212,"column":17}},"type":"default-arg","locations":[{"start":{"line":212,"column":14},"end":{"line":212,"column":17}}],"line":212},"20":{"loc":{"start":{"line":219,"column":4},"end":{"line":230,"column":5}},"type":"if","locations":[{"start":{"line":219,"column":4},"end":{"line":230,"column":5}},{"start":{"line":225,"column":11},"end":{"line":230,"column":5}}],"line":219},"21":{"loc":{"start":{"line":233,"column":4},"end":{"line":235,"column":5}},"type":"if","locations":[{"start":{"line":233,"column":4},"end":{"line":235,"column":5}},{"start":{},"end":{}}],"line":233}},"s":{"0":2,"1":2,"2":2,"3":2,"4":2,"5":2,"6":23,"7":23,"8":1,"9":22,"10":22,"11":22,"12":22,"13":22,"14":22,"15":0,"16":0,"17":0,"18":0,"19":9,"20":9,"21":9,"22":3,"23":3,"24":1,"25":3,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":2},"f":{"0":23,"1":0,"2":9,"3":3,"4":0,"5":0,"6":0},"b":{"0":[2],"1":[23,2],"2":[1,22],"3":[22,21],"4":[2,20],"5":[22,17],"6":[9,2],"7":[1,2],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0],"13":[0],"14":[0],"15":[0],"16":[0],"17":[0],"18":[0],"19":[0],"20":[0,0],"21":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"bf6161d7489f642b263454c505b791081bf6a6eb"} | ||
| ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/index.js","statementMap":{"0":{"start":{"line":12,"column":18},"end":{"line":12,"column":35}},"1":{"start":{"line":13,"column":62},"end":{"line":13,"column":81}},"2":{"start":{"line":15,"column":0},"end":{"line":15,"column":27}},"3":{"start":{"line":16,"column":0},"end":{"line":16,"column":37}},"4":{"start":{"line":17,"column":0},"end":{"line":17,"column":41}},"5":{"start":{"line":18,"column":0},"end":{"line":18,"column":51}},"6":{"start":{"line":19,"column":0},"end":{"line":19,"column":55}},"7":{"start":{"line":20,"column":0},"end":{"line":20,"column":33}}},"fnMap":{},"branchMap":{},"s":{"0":1,"1":1,"2":1,"3":1,"4":1,"5":1,"6":1,"7":1},"f":{},"b":{},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"919dc8d2b2062d2a9f4217ee076649d050f5f3a9"} | ||
| ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/models.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/models.js","statementMap":{"0":{"start":{"line":15,"column":4},"end":{"line":15,"column":23}},"1":{"start":{"line":16,"column":4},"end":{"line":16,"column":17}},"2":{"start":{"line":17,"column":4},"end":{"line":17,"column":17}},"3":{"start":{"line":18,"column":4},"end":{"line":18,"column":17}},"4":{"start":{"line":19,"column":4},"end":{"line":19,"column":17}},"5":{"start":{"line":29,"column":18},"end":{"line":29,"column":57}},"6":{"start":{"line":30,"column":18},"end":{"line":30,"column":58}},"7":{"start":{"line":31,"column":18},"end":{"line":31,"column":57}},"8":{"start":{"line":32,"column":18},"end":{"line":32,"column":58}},"9":{"start":{"line":33,"column":4},"end":{"line":33,"column":40}},"10":{"start":{"line":42,"column":16},"end":{"line":42,"column":27}},"11":{"start":{"line":43,"column":4},"end":{"line":49,"column":6}},"12":{"start":{"line":64,"column":4},"end":{"line":64,"column":17}},"13":{"start":{"line":65,"column":4},"end":{"line":65,"column":17}},"14":{"start":{"line":66,"column":4},"end":{"line":66,"column":17}},"15":{"start":{"line":67,"column":4},"end":{"line":67,"column":17}},"16":{"start":{"line":68,"column":4},"end":{"line":68,"column":21}},"17":{"start":{"line":69,"column":4},"end":{"line":69,"column":23}},"18":{"start":{"line":81,"column":4},"end":{"line":81,"column":23}},"19":{"start":{"line":82,"column":4},"end":{"line":82,"column":23}},"20":{"start":{"line":83,"column":4},"end":{"line":83,"column":35}},"21":{"start":{"line":91,"column":4},"end":{"line":91,"column":29}},"22":{"start":{"line":95,"column":0},"end":{"line":99,"column":2}}},"fnMap":{"0":{"name":"(anonymous_0)","decl":{"start":{"line":14,"column":2},"end":{"line":14,"column":3}},"loc":{"start":{"line":14,"column":37},"end":{"line":20,"column":3}},"line":14},"1":{"name":"(anonymous_1)","decl":{"start":{"line":28,"column":2},"end":{"line":28,"column":3}},"loc":{"start":{"line":28,"column":34},"end":{"line":34,"column":3}},"line":28},"2":{"name":"(anonymous_2)","decl":{"start":{"line":41,"column":2},"end":{"line":41,"column":3}},"loc":{"start":{"line":41,"column":24},"end":{"line":50,"column":3}},"line":41},"3":{"name":"(anonymous_3)","decl":{"start":{"line":63,"column":2},"end":{"line":63,"column":3}},"loc":{"start":{"line":63,"column":43},"end":{"line":70,"column":3}},"line":63},"4":{"name":"(anonymous_4)","decl":{"start":{"line":80,"column":2},"end":{"line":80,"column":3}},"loc":{"start":{"line":80,"column":55},"end":{"line":84,"column":3}},"line":80},"5":{"name":"(anonymous_5)","decl":{"start":{"line":90,"column":2},"end":{"line":90,"column":3}},"loc":{"start":{"line":90,"column":15},"end":{"line":92,"column":3}},"line":90}},"branchMap":{"0":{"loc":{"start":{"line":80,"column":21},"end":{"line":80,"column":33}},"type":"default-arg","locations":[{"start":{"line":80,"column":29},"end":{"line":80,"column":33}}],"line":80},"1":{"loc":{"start":{"line":80,"column":35},"end":{"line":80,"column":53}},"type":"default-arg","locations":[{"start":{"line":80,"column":49},"end":{"line":80,"column":53}}],"line":80}},"s":{"0":20,"1":20,"2":20,"3":20,"4":20,"5":3,"6":3,"7":3,"8":3,"9":3,"10":8,"11":8,"12":4,"13":4,"14":4,"15":4,"16":4,"17":4,"18":6,"19":6,"20":6,"21":3,"22":4},"f":{"0":20,"1":3,"2":8,"3":4,"4":6,"5":3},"b":{"0":[4],"1":[5]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3d02bea040e833fecbb6ae9f688106aa3a88eb96"} | ||
| ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/utils.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/utils.js","statementMap":{"0":{"start":{"line":5,"column":42},"end":{"line":5,"column":61}},"1":{"start":{"line":6,"column":36},"end":{"line":6,"column":53}},"2":{"start":{"line":14,"column":16},"end":{"line":14,"column":38}},"3":{"start":{"line":15,"column":2},"end":{"line":21,"column":3}},"4":{"start":{"line":15,"column":15},"end":{"line":15,"column":16}},"5":{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},"6":{"start":{"line":17,"column":6},"end":{"line":17,"column":49}},"7":{"start":{"line":18,"column":6},"end":{"line":18,"column":46}},"8":{"start":{"line":19,"column":6},"end":{"line":19,"column":12}},"9":{"start":{"line":22,"column":2},"end":{"line":22,"column":27}},"10":{"start":{"line":31,"column":22},"end":{"line":31,"column":45}},"11":{"start":{"line":32,"column":15},"end":{"line":32,"column":38}},"12":{"start":{"line":34,"column":16},"end":{"line":34,"column":18}},"13":{"start":{"line":35,"column":2},"end":{"line":39,"column":3}},"14":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"15":{"start":{"line":37,"column":6},"end":{"line":37,"column":45}},"16":{"start":{"line":41,"column":2},"end":{"line":41,"column":15}},"17":{"start":{"line":52,"column":22},"end":{"line":52,"column":45}},"18":{"start":{"line":53,"column":15},"end":{"line":53,"column":38}},"19":{"start":{"line":55,"column":16},"end":{"line":55,"column":18}},"20":{"start":{"line":57,"column":2},"end":{"line":109,"column":3}},"21":{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},"22":{"start":{"line":58,"column":36},"end":{"line":58,"column":45}},"23":{"start":{"line":60,"column":16},"end":{"line":60,"column":27}},"24":{"start":{"line":61,"column":18},"end":{"line":61,"column":28}},"25":{"start":{"line":64,"column":18},"end":{"line":64,"column":57}},"26":{"start":{"line":65,"column":18},"end":{"line":65,"column":56}},"27":{"start":{"line":66,"column":18},"end":{"line":66,"column":57}},"28":{"start":{"line":67,"column":18},"end":{"line":67,"column":56}},"29":{"start":{"line":69,"column":22},"end":{"line":69,"column":35}},"30":{"start":{"line":70,"column":23},"end":{"line":70,"column":36}},"31":{"start":{"line":73,"column":23},"end":{"line":73,"column":72}},"32":{"start":{"line":74,"column":23},"end":{"line":74,"column":56}},"33":{"start":{"line":77,"column":20},"end":{"line":77,"column":47}},"34":{"start":{"line":78,"column":19},"end":{"line":78,"column":54}},"35":{"start":{"line":79,"column":16},"end":{"line":79,"column":39}},"36":{"start":{"line":80,"column":4},"end":{"line":80,"column":56}},"37":{"start":{"line":83,"column":22},"end":{"line":83,"column":67}},"38":{"start":{"line":84,"column":21},"end":{"line":84,"column":59}},"39":{"start":{"line":86,"column":4},"end":{"line":88,"column":5}},"40":{"start":{"line":86,"column":17},"end":{"line":86,"column":18}},"41":{"start":{"line":87,"column":6},"end":{"line":87,"column":46}},"42":{"start":{"line":91,"column":21},"end":{"line":91,"column":55}},"43":{"start":{"line":93,"column":4},"end":{"line":104,"column":5}},"44":{"start":{"line":93,"column":17},"end":{"line":93,"column":18}},"45":{"start":{"line":94,"column":6},"end":{"line":103,"column":7}},"46":{"start":{"line":94,"column":19},"end":{"line":94,"column":20}},"47":{"start":{"line":95,"column":23},"end":{"line":95,"column":40}},"48":{"start":{"line":96,"column":21},"end":{"line":96,"column":30}},"49":{"start":{"line":97,"column":21},"end":{"line":97,"column":30}},"50":{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},"51":{"start":{"line":100,"column":25},"end":{"line":100,"column":47}},"52":{"start":{"line":101,"column":10},"end":{"line":101,"column":46}},"53":{"start":{"line":106,"column":4},"end":{"line":108,"column":7}},"54":{"start":{"line":111,"column":2},"end":{"line":111,"column":15}},"55":{"start":{"line":114,"column":0},"end":{"line":118,"column":2}}},"fnMap":{"0":{"name":"parseJson","decl":{"start":{"line":13,"column":9},"end":{"line":13,"column":18}},"loc":{"start":{"line":13,"column":31},"end":{"line":23,"column":1}},"line":13},"1":{"name":"parseBoundingBoxes","decl":{"start":{"line":30,"column":9},"end":{"line":30,"column":27}},"loc":{"start":{"line":30,"column":42},"end":{"line":42,"column":1}},"line":30},"2":{"name":"parseSegmentationMasks","decl":{"start":{"line":51,"column":15},"end":{"line":51,"column":37}},"loc":{"start":{"line":51,"column":73},"end":{"line":112,"column":1}},"line":51}},"branchMap":{"0":{"loc":{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},"type":"if","locations":[{"start":{"line":16,"column":4},"end":{"line":20,"column":5}},{"start":{},"end":{}}],"line":16},"1":{"loc":{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},"type":"if","locations":[{"start":{"line":36,"column":4},"end":{"line":38,"column":5}},{"start":{},"end":{}}],"line":36},"2":{"loc":{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},"type":"if","locations":[{"start":{"line":58,"column":4},"end":{"line":58,"column":45}},{"start":{},"end":{}}],"line":58},"3":{"loc":{"start":{"line":58,"column":8},"end":{"line":58,"column":34}},"type":"binary-expr","locations":[{"start":{"line":58,"column":8},"end":{"line":58,"column":20}},{"start":{"line":58,"column":24},"end":{"line":58,"column":34}}],"line":58},"4":{"loc":{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},"type":"if","locations":[{"start":{"line":99,"column":8},"end":{"line":102,"column":9}},{"start":{},"end":{}}],"line":99},"5":{"loc":{"start":{"line":99,"column":12},"end":{"line":99,"column":47}},"type":"binary-expr","locations":[{"start":{"line":99,"column":12},"end":{"line":99,"column":28}},{"start":{"line":99,"column":32},"end":{"line":99,"column":47}}],"line":99}},"s":{"0":3,"1":3,"2":12,"3":12,"4":12,"5":13,"6":4,"7":4,"8":4,"9":12,"10":5,"11":5,"12":5,"13":5,"14":8,"15":7,"16":5,"17":2,"18":2,"19":2,"20":2,"21":3,"22":3,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":2,"55":3},"f":{"0":12,"1":5,"2":2},"b":{"0":[4,9],"1":[7,1],"2":[3,0],"3":[3,2],"4":[0,0],"5":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"c6222b511313a24a286eb18bc56c8b87e16a5c13"} | ||
| ,"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/visualize.js": {"path":"/Users/marcokotrotsos/NXTPHASE/visualsegmenting/node_vsegments/src/visualize.js","statementMap":{"0":{"start":{"line":5,"column":50},"end":{"line":5,"column":67}},"1":{"start":{"line":6,"column":11},"end":{"line":6,"column":33}},"2":{"start":{"line":7,"column":13},"end":{"line":7,"column":28}},"3":{"start":{"line":10,"column":15},"end":{"line":16,"column":1}},"4":{"start":{"line":30,"column":6},"end":{"line":30,"column":13}},"5":{"start":{"line":32,"column":14},"end":{"line":32,"column":37}},"6":{"start":{"line":33,"column":16},"end":{"line":33,"column":28}},"7":{"start":{"line":34,"column":17},"end":{"line":34,"column":30}},"8":{"start":{"line":36,"column":2},"end":{"line":36,"column":28}},"9":{"start":{"line":37,"column":2},"end":{"line":37,"column":35}},"10":{"start":{"line":39,"column":2},"end":{"line":52,"column":5}},"11":{"start":{"line":40,"column":18},"end":{"line":40,"column":43}},"12":{"start":{"line":41,"column":41},"end":{"line":41,"column":70}},"13":{"start":{"line":44,"column":4},"end":{"line":44,"column":28}},"14":{"start":{"line":45,"column":4},"end":{"line":45,"column":63}},"15":{"start":{"line":48,"column":4},"end":{"line":51,"column":5}},"16":{"start":{"line":49,"column":6},"end":{"line":49,"column":28}},"17":{"start":{"line":50,"column":6},"end":{"line":50,"column":63}},"18":{"start":{"line":54,"column":2},"end":{"line":54,"column":16}},"19":{"start":{"line":67,"column":14},"end":{"line":67,"column":37}},"20":{"start":{"line":68,"column":20},"end":{"line":68,"column":57}},"21":{"start":{"line":69,"column":15},"end":{"line":69,"column":29}},"22":{"start":{"line":72,"column":19},"end":{"line":72,"column":47}},"23":{"start":{"line":73,"column":12},"end":{"line":73,"column":34}},"24":{"start":{"line":74,"column":12},"end":{"line":74,"column":33}},"25":{"start":{"line":75,"column":12},"end":{"line":75,"column":26}},"26":{"start":{"line":78,"column":2},"end":{"line":88,"column":3}},"27":{"start":{"line":78,"column":15},"end":{"line":78,"column":16}},"28":{"start":{"line":79,"column":22},"end":{"line":79,"column":39}},"29":{"start":{"line":80,"column":4},"end":{"line":87,"column":5}},"30":{"start":{"line":81,"column":18},"end":{"line":81,"column":23}},"31":{"start":{"line":82,"column":24},"end":{"line":82,"column":41}},"32":{"start":{"line":84,"column":6},"end":{"line":84,"column":74}},"33":{"start":{"line":85,"column":6},"end":{"line":85,"column":82}},"34":{"start":{"line":86,"column":6},"end":{"line":86,"column":82}},"35":{"start":{"line":90,"column":2},"end":{"line":90,"column":36}},"36":{"start":{"line":106,"column":6},"end":{"line":106,"column":13}},"37":{"start":{"line":108,"column":14},"end":{"line":108,"column":37}},"38":{"start":{"line":109,"column":16},"end":{"line":109,"column":28}},"39":{"start":{"line":110,"column":17},"end":{"line":110,"column":30}},"40":{"start":{"line":113,"column":2},"end":{"line":116,"column":5}},"41":{"start":{"line":114,"column":18},"end":{"line":114,"column":43}},"42":{"start":{"line":115,"column":4},"end":{"line":115,"column":64}},"43":{"start":{"line":119,"column":2},"end":{"line":119,"column":28}},"44":{"start":{"line":120,"column":2},"end":{"line":120,"column":35}},"45":{"start":{"line":122,"column":2},"end":{"line":134,"column":5}},"46":{"start":{"line":123,"column":18},"end":{"line":123,"column":43}},"47":{"start":{"line":126,"column":4},"end":{"line":126,"column":28}},"48":{"start":{"line":127,"column":4},"end":{"line":127,"column":75}},"49":{"start":{"line":130,"column":4},"end":{"line":133,"column":5}},"50":{"start":{"line":131,"column":6},"end":{"line":131,"column":28}},"51":{"start":{"line":132,"column":6},"end":{"line":132,"column":57}},"52":{"start":{"line":136,"column":2},"end":{"line":136,"column":16}},"53":{"start":{"line":146,"column":14},"end":{"line":146,"column":40}},"54":{"start":{"line":149,"column":14},"end":{"line":149,"column":23}},"55":{"start":{"line":150,"column":15},"end":{"line":150,"column":25}},"56":{"start":{"line":152,"column":2},"end":{"line":156,"column":3}},"57":{"start":{"line":153,"column":18},"end":{"line":153,"column":61}},"58":{"start":{"line":154,"column":4},"end":{"line":154,"column":38}},"59":{"start":{"line":155,"column":4},"end":{"line":155,"column":40}},"60":{"start":{"line":159,"column":17},"end":{"line":159,"column":44}},"61":{"start":{"line":160,"column":14},"end":{"line":160,"column":37}},"62":{"start":{"line":161,"column":2},"end":{"line":161,"column":42}},"63":{"start":{"line":163,"column":2},"end":{"line":163,"column":16}},"64":{"start":{"line":172,"column":17},"end":{"line":172,"column":45}},"65":{"start":{"line":173,"column":2},"end":{"line":173,"column":41}},"66":{"start":{"line":176,"column":0},"end":{"line":182,"column":2}}},"fnMap":{"0":{"name":"plotBoundingBoxes","decl":{"start":{"line":25,"column":9},"end":{"line":25,"column":26}},"loc":{"start":{"line":25,"column":56},"end":{"line":55,"column":1}},"line":25},"1":{"name":"(anonymous_1)","decl":{"start":{"line":39,"column":16},"end":{"line":39,"column":17}},"loc":{"start":{"line":39,"column":28},"end":{"line":52,"column":3}},"line":39},"2":{"name":"overlayMask","decl":{"start":{"line":66,"column":9},"end":{"line":66,"column":20}},"loc":{"start":{"line":66,"column":68},"end":{"line":91,"column":1}},"line":66},"3":{"name":"plotSegmentationMasks","decl":{"start":{"line":100,"column":9},"end":{"line":100,"column":30}},"loc":{"start":{"line":100,"column":60},"end":{"line":137,"column":1}},"line":100},"4":{"name":"(anonymous_4)","decl":{"start":{"line":113,"column":16},"end":{"line":113,"column":17}},"loc":{"start":{"line":113,"column":29},"end":{"line":116,"column":3}},"line":113},"5":{"name":"(anonymous_5)","decl":{"start":{"line":122,"column":16},"end":{"line":122,"column":17}},"loc":{"start":{"line":122,"column":29},"end":{"line":134,"column":3}},"line":122},"6":{"name":"loadImageToCanvas","decl":{"start":{"line":145,"column":15},"end":{"line":145,"column":32}},"loc":{"start":{"line":145,"column":60},"end":{"line":164,"column":1}},"line":145},"7":{"name":"saveCanvas","decl":{"start":{"line":171,"column":15},"end":{"line":171,"column":25}},"loc":{"start":{"line":171,"column":46},"end":{"line":174,"column":1}},"line":171}},"branchMap":{"0":{"loc":{"start":{"line":25,"column":42},"end":{"line":25,"column":54}},"type":"default-arg","locations":[{"start":{"line":25,"column":52},"end":{"line":25,"column":54}}],"line":25},"1":{"loc":{"start":{"line":27,"column":4},"end":{"line":27,"column":17}},"type":"default-arg","locations":[{"start":{"line":27,"column":16},"end":{"line":27,"column":17}}],"line":27},"2":{"loc":{"start":{"line":28,"column":4},"end":{"line":28,"column":17}},"type":"default-arg","locations":[{"start":{"line":28,"column":15},"end":{"line":28,"column":17}}],"line":28},"3":{"loc":{"start":{"line":29,"column":4},"end":{"line":29,"column":21}},"type":"default-arg","locations":[{"start":{"line":29,"column":17},"end":{"line":29,"column":21}}],"line":29},"4":{"loc":{"start":{"line":48,"column":4},"end":{"line":51,"column":5}},"type":"if","locations":[{"start":{"line":48,"column":4},"end":{"line":51,"column":5}},{"start":{},"end":{}}],"line":48},"5":{"loc":{"start":{"line":48,"column":8},"end":{"line":48,"column":31}},"type":"binary-expr","locations":[{"start":{"line":48,"column":8},"end":{"line":48,"column":18}},{"start":{"line":48,"column":22},"end":{"line":48,"column":31}}],"line":48},"6":{"loc":{"start":{"line":80,"column":4},"end":{"line":87,"column":5}},"type":"if","locations":[{"start":{"line":80,"column":4},"end":{"line":87,"column":5}},{"start":{},"end":{}}],"line":80},"7":{"loc":{"start":{"line":100,"column":46},"end":{"line":100,"column":58}},"type":"default-arg","locations":[{"start":{"line":100,"column":56},"end":{"line":100,"column":58}}],"line":100},"8":{"loc":{"start":{"line":102,"column":4},"end":{"line":102,"column":17}},"type":"default-arg","locations":[{"start":{"line":102,"column":16},"end":{"line":102,"column":17}}],"line":102},"9":{"loc":{"start":{"line":103,"column":4},"end":{"line":103,"column":17}},"type":"default-arg","locations":[{"start":{"line":103,"column":15},"end":{"line":103,"column":17}}],"line":103},"10":{"loc":{"start":{"line":104,"column":4},"end":{"line":104,"column":15}},"type":"default-arg","locations":[{"start":{"line":104,"column":12},"end":{"line":104,"column":15}}],"line":104},"11":{"loc":{"start":{"line":105,"column":4},"end":{"line":105,"column":21}},"type":"default-arg","locations":[{"start":{"line":105,"column":17},"end":{"line":105,"column":21}}],"line":105},"12":{"loc":{"start":{"line":130,"column":4},"end":{"line":133,"column":5}},"type":"if","locations":[{"start":{"line":130,"column":4},"end":{"line":133,"column":5}},{"start":{},"end":{}}],"line":130},"13":{"loc":{"start":{"line":130,"column":8},"end":{"line":130,"column":32}},"type":"binary-expr","locations":[{"start":{"line":130,"column":8},"end":{"line":130,"column":18}},{"start":{"line":130,"column":22},"end":{"line":130,"column":32}}],"line":130},"14":{"loc":{"start":{"line":145,"column":44},"end":{"line":145,"column":58}},"type":"default-arg","locations":[{"start":{"line":145,"column":54},"end":{"line":145,"column":58}}],"line":145},"15":{"loc":{"start":{"line":152,"column":2},"end":{"line":156,"column":3}},"type":"if","locations":[{"start":{"line":152,"column":2},"end":{"line":156,"column":3}},{"start":{},"end":{}}],"line":152},"16":{"loc":{"start":{"line":152,"column":6},"end":{"line":152,"column":41}},"type":"binary-expr","locations":[{"start":{"line":152,"column":6},"end":{"line":152,"column":21}},{"start":{"line":152,"column":25},"end":{"line":152,"column":41}}],"line":152}},"s":{"0":2,"1":2,"2":2,"3":2,"4":0,"5":0,"6":0,"7":0,"8":0,"9":0,"10":0,"11":0,"12":0,"13":0,"14":0,"15":0,"16":0,"17":0,"18":0,"19":0,"20":0,"21":0,"22":0,"23":0,"24":0,"25":0,"26":0,"27":0,"28":0,"29":0,"30":0,"31":0,"32":0,"33":0,"34":0,"35":0,"36":0,"37":0,"38":0,"39":0,"40":0,"41":0,"42":0,"43":0,"44":0,"45":0,"46":0,"47":0,"48":0,"49":0,"50":0,"51":0,"52":0,"53":0,"54":0,"55":0,"56":0,"57":0,"58":0,"59":0,"60":0,"61":0,"62":0,"63":0,"64":0,"65":0,"66":2},"f":{"0":0,"1":0,"2":0,"3":0,"4":0,"5":0,"6":0,"7":0},"b":{"0":[0],"1":[0],"2":[0],"3":[0],"4":[0,0],"5":[0,0],"6":[0,0],"7":[0],"8":[0],"9":[0],"10":[0],"11":[0],"12":[0,0],"13":[0,0],"14":[0],"15":[0,0],"16":[0,0]},"_coverageSchema":"1a1c01bbd47fc00a2c39e90264f33305004495a9","hash":"3459a8c13e76638987758fb891c4373a528443cb"} | ||
| } |
| body, html { | ||
| margin:0; padding: 0; | ||
| height: 100%; | ||
| } | ||
| body { | ||
| font-family: Helvetica Neue, Helvetica, Arial; | ||
| font-size: 14px; | ||
| color:#333; | ||
| } | ||
| .small { font-size: 12px; } | ||
| *, *:after, *:before { | ||
| -webkit-box-sizing:border-box; | ||
| -moz-box-sizing:border-box; | ||
| box-sizing:border-box; | ||
| } | ||
| h1 { font-size: 20px; margin: 0;} | ||
| h2 { font-size: 14px; } | ||
| pre { | ||
| font: 12px/1.4 Consolas, "Liberation Mono", Menlo, Courier, monospace; | ||
| margin: 0; | ||
| padding: 0; | ||
| -moz-tab-size: 2; | ||
| -o-tab-size: 2; | ||
| tab-size: 2; | ||
| } | ||
| a { color:#0074D9; text-decoration:none; } | ||
| a:hover { text-decoration:underline; } | ||
| .strong { font-weight: bold; } | ||
| .space-top1 { padding: 10px 0 0 0; } | ||
| .pad2y { padding: 20px 0; } | ||
| .pad1y { padding: 10px 0; } | ||
| .pad2x { padding: 0 20px; } | ||
| .pad2 { padding: 20px; } | ||
| .pad1 { padding: 10px; } | ||
| .space-left2 { padding-left:55px; } | ||
| .space-right2 { padding-right:20px; } | ||
| .center { text-align:center; } | ||
| .clearfix { display:block; } | ||
| .clearfix:after { | ||
| content:''; | ||
| display:block; | ||
| height:0; | ||
| clear:both; | ||
| visibility:hidden; | ||
| } | ||
| .fl { float: left; } | ||
| @media only screen and (max-width:640px) { | ||
| .col3 { width:100%; max-width:100%; } | ||
| .hide-mobile { display:none!important; } | ||
| } | ||
| .quiet { | ||
| color: #7f7f7f; | ||
| color: rgba(0,0,0,0.5); | ||
| } | ||
| .quiet a { opacity: 0.7; } | ||
| .fraction { | ||
| font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; | ||
| font-size: 10px; | ||
| color: #555; | ||
| background: #E8E8E8; | ||
| padding: 4px 5px; | ||
| border-radius: 3px; | ||
| vertical-align: middle; | ||
| } | ||
| div.path a:link, div.path a:visited { color: #333; } | ||
| table.coverage { | ||
| border-collapse: collapse; | ||
| margin: 10px 0 0 0; | ||
| padding: 0; | ||
| } | ||
| table.coverage td { | ||
| margin: 0; | ||
| padding: 0; | ||
| vertical-align: top; | ||
| } | ||
| table.coverage td.line-count { | ||
| text-align: right; | ||
| padding: 0 5px 0 20px; | ||
| } | ||
| table.coverage td.line-coverage { | ||
| text-align: right; | ||
| padding-right: 10px; | ||
| min-width:20px; | ||
| } | ||
| table.coverage td span.cline-any { | ||
| display: inline-block; | ||
| padding: 0 5px; | ||
| width: 100%; | ||
| } | ||
| .missing-if-branch { | ||
| display: inline-block; | ||
| margin-right: 5px; | ||
| border-radius: 3px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #333; | ||
| color: yellow; | ||
| } | ||
| .skip-if-branch { | ||
| display: none; | ||
| margin-right: 10px; | ||
| position: relative; | ||
| padding: 0 4px; | ||
| background: #ccc; | ||
| color: white; | ||
| } | ||
| .missing-if-branch .typ, .skip-if-branch .typ { | ||
| color: inherit !important; | ||
| } | ||
| .coverage-summary { | ||
| border-collapse: collapse; | ||
| width: 100%; | ||
| } | ||
| .coverage-summary tr { border-bottom: 1px solid #bbb; } | ||
| .keyline-all { border: 1px solid #ddd; } | ||
| .coverage-summary td, .coverage-summary th { padding: 10px; } | ||
| .coverage-summary tbody { border: 1px solid #bbb; } | ||
| .coverage-summary td { border-right: 1px solid #bbb; } | ||
| .coverage-summary td:last-child { border-right: none; } | ||
| .coverage-summary th { | ||
| text-align: left; | ||
| font-weight: normal; | ||
| white-space: nowrap; | ||
| } | ||
| .coverage-summary th.file { border-right: none !important; } | ||
| .coverage-summary th.pct { } | ||
| .coverage-summary th.pic, | ||
| .coverage-summary th.abs, | ||
| .coverage-summary td.pct, | ||
| .coverage-summary td.abs { text-align: right; } | ||
| .coverage-summary td.file { white-space: nowrap; } | ||
| .coverage-summary td.pic { min-width: 120px !important; } | ||
| .coverage-summary tfoot td { } | ||
| .coverage-summary .sorter { | ||
| height: 10px; | ||
| width: 7px; | ||
| display: inline-block; | ||
| margin-left: 0.5em; | ||
| background: url(sort-arrow-sprite.png) no-repeat scroll 0 0 transparent; | ||
| } | ||
| .coverage-summary .sorted .sorter { | ||
| background-position: 0 -20px; | ||
| } | ||
| .coverage-summary .sorted-desc .sorter { | ||
| background-position: 0 -10px; | ||
| } | ||
| .status-line { height: 10px; } | ||
| /* yellow */ | ||
| .cbranch-no { background: yellow !important; color: #111; } | ||
| /* dark red */ | ||
| .red.solid, .status-line.low, .low .cover-fill { background:#C21F39 } | ||
| .low .chart { border:1px solid #C21F39 } | ||
| .highlighted, | ||
| .highlighted .cstat-no, .highlighted .fstat-no, .highlighted .cbranch-no{ | ||
| background: #C21F39 !important; | ||
| } | ||
| /* medium red */ | ||
| .cstat-no, .fstat-no, .cbranch-no, .cbranch-no { background:#F6C6CE } | ||
| /* light red */ | ||
| .low, .cline-no { background:#FCE1E5 } | ||
| /* light green */ | ||
| .high, .cline-yes { background:rgb(230,245,208) } | ||
| /* medium green */ | ||
| .cstat-yes { background:rgb(161,215,106) } | ||
| /* dark green */ | ||
| .status-line.high, .high .cover-fill { background:rgb(77,146,33) } | ||
| .high .chart { border:1px solid rgb(77,146,33) } | ||
| /* dark yellow (gold) */ | ||
| .status-line.medium, .medium .cover-fill { background: #f9cd0b; } | ||
| .medium .chart { border:1px solid #f9cd0b; } | ||
| /* light yellow */ | ||
| .medium { background: #fff4c2; } | ||
| .cstat-skip { background: #ddd; color: #111; } | ||
| .fstat-skip { background: #ddd; color: #111 !important; } | ||
| .cbranch-skip { background: #ddd !important; color: #111; } | ||
| span.cline-neutral { background: #eaeaea; } | ||
| .coverage-summary td.empty { | ||
| opacity: .5; | ||
| padding-top: 4px; | ||
| padding-bottom: 4px; | ||
| line-height: 1; | ||
| color: #888; | ||
| } | ||
| .cover-fill, .cover-empty { | ||
| display:inline-block; | ||
| height: 12px; | ||
| } | ||
| .chart { | ||
| line-height: 0; | ||
| } | ||
| .cover-empty { | ||
| background: white; | ||
| } | ||
| .cover-full { | ||
| border-right: none !important; | ||
| } | ||
| pre.prettyprint { | ||
| border: none !important; | ||
| padding: 0 !important; | ||
| margin: 0 !important; | ||
| } | ||
| .com { color: #999 !important; } | ||
| .ignore-none { color: #999; font-weight: normal; } | ||
| .wrapper { | ||
| min-height: 100%; | ||
| height: auto !important; | ||
| height: 100%; | ||
| margin: 0 auto -48px; | ||
| } | ||
| .footer, .push { | ||
| height: 48px; | ||
| } |
| /* eslint-disable */ | ||
| var jumpToCode = (function init() { | ||
| // Classes of code we would like to highlight in the file view | ||
| var missingCoverageClasses = ['.cbranch-no', '.cstat-no', '.fstat-no']; | ||
| // Elements to highlight in the file listing view | ||
| var fileListingElements = ['td.pct.low']; | ||
| // We don't want to select elements that are direct descendants of another match | ||
| var notSelector = ':not(' + missingCoverageClasses.join('):not(') + ') > '; // becomes `:not(a):not(b) > ` | ||
| // Selector that finds elements on the page to which we can jump | ||
| var selector = | ||
| fileListingElements.join(', ') + | ||
| ', ' + | ||
| notSelector + | ||
| missingCoverageClasses.join(', ' + notSelector); // becomes `:not(a):not(b) > a, :not(a):not(b) > b` | ||
| // The NodeList of matching elements | ||
| var missingCoverageElements = document.querySelectorAll(selector); | ||
| var currentIndex; | ||
| function toggleClass(index) { | ||
| missingCoverageElements | ||
| .item(currentIndex) | ||
| .classList.remove('highlighted'); | ||
| missingCoverageElements.item(index).classList.add('highlighted'); | ||
| } | ||
| function makeCurrent(index) { | ||
| toggleClass(index); | ||
| currentIndex = index; | ||
| missingCoverageElements.item(index).scrollIntoView({ | ||
| behavior: 'smooth', | ||
| block: 'center', | ||
| inline: 'center' | ||
| }); | ||
| } | ||
| function goToPrevious() { | ||
| var nextIndex = 0; | ||
| if (typeof currentIndex !== 'number' || currentIndex === 0) { | ||
| nextIndex = missingCoverageElements.length - 1; | ||
| } else if (missingCoverageElements.length > 1) { | ||
| nextIndex = currentIndex - 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| function goToNext() { | ||
| var nextIndex = 0; | ||
| if ( | ||
| typeof currentIndex === 'number' && | ||
| currentIndex < missingCoverageElements.length - 1 | ||
| ) { | ||
| nextIndex = currentIndex + 1; | ||
| } | ||
| makeCurrent(nextIndex); | ||
| } | ||
| return function jump(event) { | ||
| if ( | ||
| document.getElementById('fileSearch') === document.activeElement && | ||
| document.activeElement != null | ||
| ) { | ||
| // if we're currently focused on the search input, we don't want to navigate | ||
| return; | ||
| } | ||
| switch (event.which) { | ||
| case 78: // n | ||
| case 74: // j | ||
| goToNext(); | ||
| break; | ||
| case 66: // b | ||
| case 75: // k | ||
| case 80: // p | ||
| goToPrevious(); | ||
| break; | ||
| } | ||
| }; | ||
| })(); | ||
| window.addEventListener('keydown', jumpToCode); |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for core.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> core.js</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">41.81% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>23/55</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">48.38% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>15/31</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">42.85% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/7</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">41.81% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>23/55</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a> | ||
| <a name='L147'></a><a href='#L147'>147</a> | ||
| <a name='L148'></a><a href='#L148'>148</a> | ||
| <a name='L149'></a><a href='#L149'>149</a> | ||
| <a name='L150'></a><a href='#L150'>150</a> | ||
| <a name='L151'></a><a href='#L151'>151</a> | ||
| <a name='L152'></a><a href='#L152'>152</a> | ||
| <a name='L153'></a><a href='#L153'>153</a> | ||
| <a name='L154'></a><a href='#L154'>154</a> | ||
| <a name='L155'></a><a href='#L155'>155</a> | ||
| <a name='L156'></a><a href='#L156'>156</a> | ||
| <a name='L157'></a><a href='#L157'>157</a> | ||
| <a name='L158'></a><a href='#L158'>158</a> | ||
| <a name='L159'></a><a href='#L159'>159</a> | ||
| <a name='L160'></a><a href='#L160'>160</a> | ||
| <a name='L161'></a><a href='#L161'>161</a> | ||
| <a name='L162'></a><a href='#L162'>162</a> | ||
| <a name='L163'></a><a href='#L163'>163</a> | ||
| <a name='L164'></a><a href='#L164'>164</a> | ||
| <a name='L165'></a><a href='#L165'>165</a> | ||
| <a name='L166'></a><a href='#L166'>166</a> | ||
| <a name='L167'></a><a href='#L167'>167</a> | ||
| <a name='L168'></a><a href='#L168'>168</a> | ||
| <a name='L169'></a><a href='#L169'>169</a> | ||
| <a name='L170'></a><a href='#L170'>170</a> | ||
| <a name='L171'></a><a href='#L171'>171</a> | ||
| <a name='L172'></a><a href='#L172'>172</a> | ||
| <a name='L173'></a><a href='#L173'>173</a> | ||
| <a name='L174'></a><a href='#L174'>174</a> | ||
| <a name='L175'></a><a href='#L175'>175</a> | ||
| <a name='L176'></a><a href='#L176'>176</a> | ||
| <a name='L177'></a><a href='#L177'>177</a> | ||
| <a name='L178'></a><a href='#L178'>178</a> | ||
| <a name='L179'></a><a href='#L179'>179</a> | ||
| <a name='L180'></a><a href='#L180'>180</a> | ||
| <a name='L181'></a><a href='#L181'>181</a> | ||
| <a name='L182'></a><a href='#L182'>182</a> | ||
| <a name='L183'></a><a href='#L183'>183</a> | ||
| <a name='L184'></a><a href='#L184'>184</a> | ||
| <a name='L185'></a><a href='#L185'>185</a> | ||
| <a name='L186'></a><a href='#L186'>186</a> | ||
| <a name='L187'></a><a href='#L187'>187</a> | ||
| <a name='L188'></a><a href='#L188'>188</a> | ||
| <a name='L189'></a><a href='#L189'>189</a> | ||
| <a name='L190'></a><a href='#L190'>190</a> | ||
| <a name='L191'></a><a href='#L191'>191</a> | ||
| <a name='L192'></a><a href='#L192'>192</a> | ||
| <a name='L193'></a><a href='#L193'>193</a> | ||
| <a name='L194'></a><a href='#L194'>194</a> | ||
| <a name='L195'></a><a href='#L195'>195</a> | ||
| <a name='L196'></a><a href='#L196'>196</a> | ||
| <a name='L197'></a><a href='#L197'>197</a> | ||
| <a name='L198'></a><a href='#L198'>198</a> | ||
| <a name='L199'></a><a href='#L199'>199</a> | ||
| <a name='L200'></a><a href='#L200'>200</a> | ||
| <a name='L201'></a><a href='#L201'>201</a> | ||
| <a name='L202'></a><a href='#L202'>202</a> | ||
| <a name='L203'></a><a href='#L203'>203</a> | ||
| <a name='L204'></a><a href='#L204'>204</a> | ||
| <a name='L205'></a><a href='#L205'>205</a> | ||
| <a name='L206'></a><a href='#L206'>206</a> | ||
| <a name='L207'></a><a href='#L207'>207</a> | ||
| <a name='L208'></a><a href='#L208'>208</a> | ||
| <a name='L209'></a><a href='#L209'>209</a> | ||
| <a name='L210'></a><a href='#L210'>210</a> | ||
| <a name='L211'></a><a href='#L211'>211</a> | ||
| <a name='L212'></a><a href='#L212'>212</a> | ||
| <a name='L213'></a><a href='#L213'>213</a> | ||
| <a name='L214'></a><a href='#L214'>214</a> | ||
| <a name='L215'></a><a href='#L215'>215</a> | ||
| <a name='L216'></a><a href='#L216'>216</a> | ||
| <a name='L217'></a><a href='#L217'>217</a> | ||
| <a name='L218'></a><a href='#L218'>218</a> | ||
| <a name='L219'></a><a href='#L219'>219</a> | ||
| <a name='L220'></a><a href='#L220'>220</a> | ||
| <a name='L221'></a><a href='#L221'>221</a> | ||
| <a name='L222'></a><a href='#L222'>222</a> | ||
| <a name='L223'></a><a href='#L223'>223</a> | ||
| <a name='L224'></a><a href='#L224'>224</a> | ||
| <a name='L225'></a><a href='#L225'>225</a> | ||
| <a name='L226'></a><a href='#L226'>226</a> | ||
| <a name='L227'></a><a href='#L227'>227</a> | ||
| <a name='L228'></a><a href='#L228'>228</a> | ||
| <a name='L229'></a><a href='#L229'>229</a> | ||
| <a name='L230'></a><a href='#L230'>230</a> | ||
| <a name='L231'></a><a href='#L231'>231</a> | ||
| <a name='L232'></a><a href='#L232'>232</a> | ||
| <a name='L233'></a><a href='#L233'>233</a> | ||
| <a name='L234'></a><a href='#L234'>234</a> | ||
| <a name='L235'></a><a href='#L235'>235</a> | ||
| <a name='L236'></a><a href='#L236'>236</a> | ||
| <a name='L237'></a><a href='#L237'>237</a> | ||
| <a name='L238'></a><a href='#L238'>238</a> | ||
| <a name='L239'></a><a href='#L239'>239</a> | ||
| <a name='L240'></a><a href='#L240'>240</a> | ||
| <a name='L241'></a><a href='#L241'>241</a> | ||
| <a name='L242'></a><a href='#L242'>242</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">23x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">23x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">22x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">9x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** | ||
| * Core VSegments class for image segmentation and bounding box detection | ||
| */ | ||
| | ||
| const { GoogleGenerativeAI } = require('@google/generative-ai'); | ||
| const { loadImage } = require('canvas'); | ||
| const fs = require('fs').promises; | ||
| const { SegmentationResult } = require('./models'); | ||
| const { parseBoundingBoxes, parseSegmentationMasks } = require('./utils'); | ||
| const { | ||
| loadImageToCanvas, | ||
| plotBoundingBoxes, | ||
| plotSegmentationMasks, | ||
| saveCanvas | ||
| } = require('./visualize'); | ||
| | ||
| class VSegments { | ||
| /** | ||
| * Main class for visual segmentation using Google Gemini AI | ||
| * @param {Object} options - Configuration options | ||
| * @param {string} options.apiKey - Google API key (defaults to GOOGLE_API_KEY env var) | ||
| * @param {string} options.model - Model name (default: gemini-flash-latest) | ||
| * @param {number} options.temperature - Sampling temperature (default: 0.5) | ||
| * @param {number} options.maxObjects - Maximum objects to detect (default: 25) | ||
| */ | ||
| constructor(options = {}) { | ||
| this.apiKey = options.apiKey || process.env.GOOGLE_API_KEY; | ||
| if (!this.apiKey) { | ||
| throw new Error( | ||
| 'API key must be provided or set in GOOGLE_API_KEY environment variable' | ||
| ); | ||
| } | ||
| this.model = options.model || 'gemini-flash-latest'; | ||
| this.temperature = options.temperature !== undefined ? options.temperature : 0.5; | ||
| this.maxObjects = options.maxObjects || 25; | ||
| // Initialize Google AI client | ||
| this.genAI = new GoogleGenerativeAI(this.apiKey); | ||
| // Default system instructions | ||
| this.defaultSystemInstructions = ` | ||
| Return bounding boxes as a JSON array with labels. Never return masks or code fencing. Limit to ${this.maxObjects} objects. | ||
| If an object is present multiple times, name them according to their unique characteristic (colors, size, position, unique characteristics, etc..). | ||
| `.trim(); | ||
| // Safety settings | ||
| this.safetySettings = [ | ||
| { | ||
| category: 'HARM_CATEGORY_DANGEROUS_CONTENT', | ||
| threshold: 'BLOCK_ONLY_HIGH', | ||
| }, | ||
| ]; | ||
| } | ||
| /** | ||
| * Load image from file and convert to format for API | ||
| * @param {string} imagePath - Path to image file | ||
| * @returns {Promise<Object>} - Image data for API | ||
| */ | ||
| <span class="fstat-no" title="function not covered" > as</span>ync _loadImage(imagePath) { | ||
| const imageBuffer = <span class="cstat-no" title="statement not covered" >await fs.readFile(imagePath);</span> | ||
| const base64Data = <span class="cstat-no" title="statement not covered" >imageBuffer.toString('base64');</span> | ||
| const mimeType = <span class="cstat-no" title="statement not covered" >this._getMimeType(imagePath);</span> | ||
| <span class="cstat-no" title="statement not covered" > return {</span> | ||
| inlineData: { | ||
| data: base64Data, | ||
| mimeType: mimeType | ||
| } | ||
| }; | ||
| } | ||
| /** | ||
| * Get MIME type from file extension | ||
| * @param {string} filePath - File path | ||
| * @returns {string} - MIME type | ||
| */ | ||
| _getMimeType(filePath) { | ||
| const ext = filePath.toLowerCase().split('.').pop(); | ||
| const mimeTypes = { | ||
| 'jpg': 'image/jpeg', | ||
| 'jpeg': 'image/jpeg', | ||
| 'png': 'image/png', | ||
| 'gif': 'image/gif', | ||
| 'webp': 'image/webp' | ||
| }; | ||
| return mimeTypes[ext] || 'image/jpeg'; | ||
| } | ||
| /** | ||
| * Get system instructions with custom additions | ||
| * @param {string} customInstructions - Additional instructions | ||
| * @returns {string} - Complete system instructions | ||
| */ | ||
| _getSystemInstructions(customInstructions) { | ||
| let instructions = this.defaultSystemInstructions; | ||
| if (customInstructions) { | ||
| instructions += '\n' + customInstructions; | ||
| } | ||
| return instructions; | ||
| } | ||
| /** | ||
| * Detect bounding boxes in an image | ||
| * @param {string} imagePath - Path to image file | ||
| * @param {Object} options - Detection options | ||
| * @param {string} options.prompt - Custom prompt | ||
| * @param {string} options.customInstructions - Additional system instructions | ||
| * @param {number} options.maxSize - Maximum image dimension | ||
| * @returns {Promise<SegmentationResult>} - Detection results | ||
| */ | ||
| <span class="fstat-no" title="function not covered" > as</span>ync detectBoxes(imagePath, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> { | ||
| const { | ||
| prompt = <span class="branch-0 cbranch-no" title="branch not covered" >'Detect the 2d bounding boxes',</span> | ||
| customInstructions = <span class="branch-0 cbranch-no" title="branch not covered" >null,</span> | ||
| maxSize = <span class="branch-0 cbranch-no" title="branch not covered" >1024</span> | ||
| } = <span class="cstat-no" title="statement not covered" >options;</span> | ||
| // Load image | ||
| const image = <span class="cstat-no" title="statement not covered" >await this._loadImage(imagePath);</span> | ||
| // Get model | ||
| const model = <span class="cstat-no" title="statement not covered" >this.genAI.getGenerativeModel({</span> | ||
| model: this.model, | ||
| safetySettings: this.safetySettings, | ||
| systemInstruction: this._getSystemInstructions(customInstructions) | ||
| }); | ||
| // Generate content | ||
| const result = <span class="cstat-no" title="statement not covered" >await model.generateContent({</span> | ||
| contents: [{ role: 'user', parts: [{ text: prompt }, image] }], | ||
| generationConfig: { | ||
| temperature: this.temperature, | ||
| } | ||
| }); | ||
| const response = <span class="cstat-no" title="statement not covered" >result.response;</span> | ||
| const text = <span class="cstat-no" title="statement not covered" >response.text();</span> | ||
| // Parse response | ||
| const boxes = <span class="cstat-no" title="statement not covered" >parseBoundingBoxes(text);</span> | ||
| <span class="cstat-no" title="statement not covered" > return new SegmentationResult(boxes, null, text);</span> | ||
| } | ||
| /** | ||
| * Perform segmentation on an image | ||
| * @param {string} imagePath - Path to image file | ||
| * @param {Object} options - Segmentation options | ||
| * @param {string} options.prompt - Custom prompt | ||
| * @param {number} options.maxSize - Maximum image dimension | ||
| * @returns {Promise<SegmentationResult>} - Segmentation results | ||
| */ | ||
| <span class="fstat-no" title="function not covered" > as</span>ync segment(imagePath, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> { | ||
| const { | ||
| prompt = <span class="branch-0 cbranch-no" title="branch not covered" >'Give the segmentation masks for the objects. Output a JSON list of segmentation masks where each entry contains the 2D bounding box in the key "box_2d", the segmentation mask in key "mask", and the text label in the key "label". Use descriptive labels.',</span> | ||
| maxSize = <span class="branch-0 cbranch-no" title="branch not covered" >1024</span> | ||
| } = <span class="cstat-no" title="statement not covered" >options;</span> | ||
| // Load image | ||
| const image = <span class="cstat-no" title="statement not covered" >await this._loadImage(imagePath);</span> | ||
| // Get image dimensions | ||
| const img = <span class="cstat-no" title="statement not covered" >await loadImage(imagePath);</span> | ||
| const imgWidth = <span class="cstat-no" title="statement not covered" >img.width;</span> | ||
| const imgHeight = <span class="cstat-no" title="statement not covered" >img.height;</span> | ||
| // Get model (no system instructions for segmentation) | ||
| const model = <span class="cstat-no" title="statement not covered" >this.genAI.getGenerativeModel({</span> | ||
| model: this.model, | ||
| safetySettings: this.safetySettings | ||
| }); | ||
| // Generate content | ||
| const result = <span class="cstat-no" title="statement not covered" >await model.generateContent({</span> | ||
| contents: [{ role: 'user', parts: [{ text: prompt }, image] }], | ||
| generationConfig: { | ||
| temperature: this.temperature, | ||
| } | ||
| }); | ||
| const response = <span class="cstat-no" title="statement not covered" >result.response;</span> | ||
| const text = <span class="cstat-no" title="statement not covered" >response.text();</span> | ||
| // Parse response | ||
| const boxes = <span class="cstat-no" title="statement not covered" >parseBoundingBoxes(text);</span> | ||
| const masks = <span class="cstat-no" title="statement not covered" >await parseSegmentationMasks(text, imgHeight, imgWidth);</span> | ||
| <span class="cstat-no" title="statement not covered" > return new SegmentationResult(boxes, masks, text);</span> | ||
| } | ||
| /** | ||
| * Visualize detection/segmentation results | ||
| * @param {string} imagePath - Path to original image | ||
| * @param {SegmentationResult} result - Detection/segmentation results | ||
| * @param {Object} options - Visualization options | ||
| * @param {string} options.outputPath - Path to save output | ||
| * @param {number} options.lineWidth - Bounding box line width | ||
| * @param {number} options.fontSize - Label font size | ||
| * @param {number} options.alpha - Mask transparency (0-1) | ||
| * @returns {Promise<Canvas>} - Canvas with visualizations | ||
| */ | ||
| <span class="fstat-no" title="function not covered" > as</span>ync visualize(imagePath, result, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> { | ||
| const { | ||
| outputPath = <span class="branch-0 cbranch-no" title="branch not covered" >null,</span> | ||
| lineWidth = <span class="branch-0 cbranch-no" title="branch not covered" >4,</span> | ||
| fontSize = <span class="branch-0 cbranch-no" title="branch not covered" >14,</span> | ||
| alpha = <span class="branch-0 cbranch-no" title="branch not covered" >0.7</span> | ||
| } = <span class="cstat-no" title="statement not covered" >options;</span> | ||
| // Load image to canvas | ||
| const canvas = <span class="cstat-no" title="statement not covered" >await loadImageToCanvas(imagePath, 2048);</span> | ||
| // Draw visualizations | ||
| <span class="cstat-no" title="statement not covered" > if (result.masks) {</span> | ||
| <span class="cstat-no" title="statement not covered" > plotSegmentationMasks(canvas, result.masks, {</span> | ||
| lineWidth, | ||
| fontSize, | ||
| alpha | ||
| }); | ||
| } else { | ||
| <span class="cstat-no" title="statement not covered" > plotBoundingBoxes(canvas, result.boxes, {</span> | ||
| lineWidth, | ||
| fontSize | ||
| }); | ||
| } | ||
| // Save if requested | ||
| <span class="cstat-no" title="statement not covered" > if (outputPath) {</span> | ||
| <span class="cstat-no" title="statement not covered" > await saveCanvas(canvas, outputPath);</span> | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > return canvas;</span> | ||
| } | ||
| } | ||
| | ||
| module.exports = VSegments; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for All files</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1>All files</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">40.19% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>84/209</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">34.78% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>24/69</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">50% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>12/24</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">40.39% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>82/203</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <div class="pad1"> | ||
| <table class="coverage-summary"> | ||
| <thead> | ||
| <tr> | ||
| <th data-col="file" data-fmt="html" data-html="true" class="file">File</th> | ||
| <th data-col="pic" data-type="number" data-fmt="html" data-html="true" class="pic"></th> | ||
| <th data-col="statements" data-type="number" data-fmt="pct" class="pct">Statements</th> | ||
| <th data-col="statements_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="branches" data-type="number" data-fmt="pct" class="pct">Branches</th> | ||
| <th data-col="branches_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="functions" data-type="number" data-fmt="pct" class="pct">Functions</th> | ||
| <th data-col="functions_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| <th data-col="lines" data-type="number" data-fmt="pct" class="pct">Lines</th> | ||
| <th data-col="lines_raw" data-type="number" data-fmt="html" class="abs"></th> | ||
| </tr> | ||
| </thead> | ||
| <tbody><tr> | ||
| <td class="file low" data-value="core.js"><a href="core.js.html">core.js</a></td> | ||
| <td data-value="41.81" class="pic low"> | ||
| <div class="chart"><div class="cover-fill" style="width: 41%"></div><div class="cover-empty" style="width: 59%"></div></div> | ||
| </td> | ||
| <td data-value="41.81" class="pct low">41.81%</td> | ||
| <td data-value="55" class="abs low">23/55</td> | ||
| <td data-value="48.38" class="pct low">48.38%</td> | ||
| <td data-value="31" class="abs low">15/31</td> | ||
| <td data-value="42.85" class="pct low">42.85%</td> | ||
| <td data-value="7" class="abs low">3/7</td> | ||
| <td data-value="41.81" class="pct low">41.81%</td> | ||
| <td data-value="55" class="abs low">23/55</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="index.js"><a href="index.js.html">index.js</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="0" class="abs high">0/0</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="8" class="abs high">8/8</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file high" data-value="models.js"><a href="models.js.html">models.js</a></td> | ||
| <td data-value="100" class="pic high"> | ||
| <div class="chart"><div class="cover-fill cover-full" style="width: 100%"></div><div class="cover-empty" style="width: 0%"></div></div> | ||
| </td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="23" class="abs high">23/23</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="2" class="abs high">2/2</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="6" class="abs high">6/6</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="23" class="abs high">23/23</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file low" data-value="utils.js"><a href="utils.js.html">utils.js</a></td> | ||
| <td data-value="44.64" class="pic low"> | ||
| <div class="chart"><div class="cover-fill" style="width: 44%"></div><div class="cover-empty" style="width: 56%"></div></div> | ||
| </td> | ||
| <td data-value="44.64" class="pct low">44.64%</td> | ||
| <td data-value="56" class="abs low">25/56</td> | ||
| <td data-value="58.33" class="pct medium">58.33%</td> | ||
| <td data-value="12" class="abs medium">7/12</td> | ||
| <td data-value="100" class="pct high">100%</td> | ||
| <td data-value="3" class="abs high">3/3</td> | ||
| <td data-value="45.09" class="pct low">45.09%</td> | ||
| <td data-value="51" class="abs low">23/51</td> | ||
| </tr> | ||
| <tr> | ||
| <td class="file low" data-value="visualize.js"><a href="visualize.js.html">visualize.js</a></td> | ||
| <td data-value="7.46" class="pic low"> | ||
| <div class="chart"><div class="cover-fill" style="width: 7%"></div><div class="cover-empty" style="width: 93%"></div></div> | ||
| </td> | ||
| <td data-value="7.46" class="pct low">7.46%</td> | ||
| <td data-value="67" class="abs low">5/67</td> | ||
| <td data-value="0" class="pct low">0%</td> | ||
| <td data-value="24" class="abs low">0/24</td> | ||
| <td data-value="0" class="pct low">0%</td> | ||
| <td data-value="8" class="abs low">0/8</td> | ||
| <td data-value="7.57" class="pct low">7.57%</td> | ||
| <td data-value="66" class="abs low">5/66</td> | ||
| </tr> | ||
| </tbody> | ||
| </table> | ||
| </div> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for index.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> index.js</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/0</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>8/8</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-yes">1x</span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** | ||
| * vsegments - Visual Segmentation Library | ||
| * | ||
| * A Node.js library for image segmentation and bounding box detection | ||
| * using Google Gemini AI. | ||
| * | ||
| * @module vsegments | ||
| * @author Marco Kotrotsos | ||
| * @license MIT | ||
| */ | ||
| | ||
| const VSegments = require('./core'); | ||
| const { BoundingBox, SegmentationMask, SegmentationResult } = require('./models'); | ||
| | ||
| module.exports = VSegments; | ||
| module.exports.VSegments = VSegments; | ||
| module.exports.BoundingBox = BoundingBox; | ||
| module.exports.SegmentationMask = SegmentationMask; | ||
| module.exports.SegmentationResult = SegmentationResult; | ||
| module.exports.version = '0.1.0'; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for models.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> models.js</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>23/23</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>2/2</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>6/6</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>23/23</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line high'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-yes">20x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-yes">6x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** | ||
| * Data models for vsegments | ||
| */ | ||
| | ||
| class BoundingBox { | ||
| /** | ||
| * Represents a 2D bounding box with label | ||
| * @param {string} label - Object label | ||
| * @param {number} y1 - Top coordinate (normalized 0-1000) | ||
| * @param {number} x1 - Left coordinate (normalized 0-1000) | ||
| * @param {number} y2 - Bottom coordinate (normalized 0-1000) | ||
| * @param {number} x2 - Right coordinate (normalized 0-1000) | ||
| */ | ||
| constructor(label, y1, x1, y2, x2) { | ||
| this.label = label; | ||
| this.y1 = y1; | ||
| this.x1 = x1; | ||
| this.y2 = y2; | ||
| this.x2 = x2; | ||
| } | ||
| | ||
| /** | ||
| * Convert normalized coordinates to absolute pixel coordinates | ||
| * @param {number} imgWidth - Image width in pixels | ||
| * @param {number} imgHeight - Image height in pixels | ||
| * @returns {number[]} - [absX1, absY1, absX2, absY2] | ||
| */ | ||
| toAbsolute(imgWidth, imgHeight) { | ||
| const absX1 = Math.round((this.x1 / 1000) * imgWidth); | ||
| const absY1 = Math.round((this.y1 / 1000) * imgHeight); | ||
| const absX2 = Math.round((this.x2 / 1000) * imgWidth); | ||
| const absY2 = Math.round((this.y2 / 1000) * imgHeight); | ||
| return [absX1, absY1, absX2, absY2]; | ||
| } | ||
| | ||
| /** | ||
| * Create BoundingBox from API response object | ||
| * @param {Object} data - Raw data from API | ||
| * @returns {BoundingBox} | ||
| */ | ||
| static fromDict(data) { | ||
| const box = data.box_2d; | ||
| return new BoundingBox( | ||
| data.label, | ||
| box[0], | ||
| box[1], | ||
| box[2], | ||
| box[3] | ||
| ); | ||
| } | ||
| } | ||
| | ||
| class SegmentationMask { | ||
| /** | ||
| * Represents a segmentation mask for an object | ||
| * @param {number} y0 - Top coordinate (absolute pixels) | ||
| * @param {number} x0 - Left coordinate (absolute pixels) | ||
| * @param {number} y1 - Bottom coordinate (absolute pixels) | ||
| * @param {number} x1 - Right coordinate (absolute pixels) | ||
| * @param {Buffer} mask - Mask data [height, width] with values 0-255 | ||
| * @param {string} label - Object label | ||
| */ | ||
| constructor(y0, x0, y1, x1, mask, label) { | ||
| this.y0 = y0; | ||
| this.x0 = x0; | ||
| this.y1 = y1; | ||
| this.x1 = x1; | ||
| this.mask = mask; | ||
| this.label = label; | ||
| } | ||
| } | ||
| | ||
| class SegmentationResult { | ||
| /** | ||
| * Container for segmentation/detection results | ||
| * @param {BoundingBox[]} boxes - Array of bounding boxes | ||
| * @param {SegmentationMask[]|null} masks - Array of segmentation masks (optional) | ||
| * @param {string|null} rawResponse - Raw API response (optional) | ||
| */ | ||
| constructor(boxes, masks = null, rawResponse = null) { | ||
| this.boxes = boxes; | ||
| this.masks = masks; | ||
| this.rawResponse = rawResponse; | ||
| } | ||
| | ||
| /** | ||
| * Get number of detected objects | ||
| * @returns {number} | ||
| */ | ||
| get length() { | ||
| return this.boxes.length; | ||
| } | ||
| } | ||
| | ||
| module.exports = { | ||
| BoundingBox, | ||
| SegmentationMask, | ||
| SegmentationResult | ||
| }; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| .pln{color:#000}@media screen{.str{color:#080}.kwd{color:#008}.com{color:#800}.typ{color:#606}.lit{color:#066}.pun,.opn,.clo{color:#660}.tag{color:#008}.atn{color:#606}.atv{color:#080}.dec,.var{color:#606}.fun{color:red}}@media print,projection{.str{color:#060}.kwd{color:#006;font-weight:bold}.com{color:#600;font-style:italic}.typ{color:#404;font-weight:bold}.lit{color:#044}.pun,.opn,.clo{color:#440}.tag{color:#006;font-weight:bold}.atn{color:#404}.atv{color:#060}}pre.prettyprint{padding:2px;border:1px solid #888}ol.linenums{margin-top:0;margin-bottom:0}li.L0,li.L1,li.L2,li.L3,li.L5,li.L6,li.L7,li.L8{list-style-type:none}li.L1,li.L3,li.L5,li.L7,li.L9{background:#eee} |
| /* eslint-disable */ | ||
| window.PR_SHOULD_USE_CONTINUATION=true;(function(){var h=["break,continue,do,else,for,if,return,while"];var u=[h,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"];var p=[u,"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"];var l=[p,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"];var x=[p,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"];var R=[x,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"];var r="all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes";var w=[p,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"];var s="caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END";var I=[h,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"];var f=[h,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"];var H=[h,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"];var A=[l,R,w,s+I,f,H];var e=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/;var C="str";var z="kwd";var j="com";var O="typ";var G="lit";var L="pun";var F="pln";var m="tag";var E="dec";var J="src";var P="atn";var n="atv";var N="nocode";var M="(?:^^\\.?|[+-]|\\!|\\!=|\\!==|\\#|\\%|\\%=|&|&&|&&=|&=|\\(|\\*|\\*=|\\+=|\\,|\\-=|\\->|\\/|\\/=|:|::|\\;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|\\?|\\@|\\[|\\^|\\^=|\\^\\^|\\^\\^=|\\{|\\||\\|=|\\|\\||\\|\\|=|\\~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\\s*";function k(Z){var ad=0;var S=false;var ac=false;for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.ignoreCase){ac=true}else{if(/[a-z]/i.test(ae.source.replace(/\\u[0-9a-f]{4}|\\x[0-9a-f]{2}|\\[^ux]/gi,""))){S=true;ac=false;break}}}var Y={b:8,t:9,n:10,v:11,f:12,r:13};function ab(ah){var ag=ah.charCodeAt(0);if(ag!==92){return ag}var af=ah.charAt(1);ag=Y[af];if(ag){return ag}else{if("0"<=af&&af<="7"){return parseInt(ah.substring(1),8)}else{if(af==="u"||af==="x"){return parseInt(ah.substring(2),16)}else{return ah.charCodeAt(1)}}}}function T(af){if(af<32){return(af<16?"\\x0":"\\x")+af.toString(16)}var ag=String.fromCharCode(af);if(ag==="\\"||ag==="-"||ag==="["||ag==="]"){ag="\\"+ag}return ag}function X(am){var aq=am.substring(1,am.length-1).match(new RegExp("\\\\u[0-9A-Fa-f]{4}|\\\\x[0-9A-Fa-f]{2}|\\\\[0-3][0-7]{0,2}|\\\\[0-7]{1,2}|\\\\[\\s\\S]|-|[^-\\\\]","g"));var ak=[];var af=[];var ao=aq[0]==="^";for(var ar=ao?1:0,aj=aq.length;ar<aj;++ar){var ah=aq[ar];if(/\\[bdsw]/i.test(ah)){ak.push(ah)}else{var ag=ab(ah);var al;if(ar+2<aj&&"-"===aq[ar+1]){al=ab(aq[ar+2]);ar+=2}else{al=ag}af.push([ag,al]);if(!(al<65||ag>122)){if(!(al<65||ag>90)){af.push([Math.max(65,ag)|32,Math.min(al,90)|32])}if(!(al<97||ag>122)){af.push([Math.max(97,ag)&~32,Math.min(al,122)&~32])}}}}af.sort(function(av,au){return(av[0]-au[0])||(au[1]-av[1])});var ai=[];var ap=[NaN,NaN];for(var ar=0;ar<af.length;++ar){var at=af[ar];if(at[0]<=ap[1]+1){ap[1]=Math.max(ap[1],at[1])}else{ai.push(ap=at)}}var an=["["];if(ao){an.push("^")}an.push.apply(an,ak);for(var ar=0;ar<ai.length;++ar){var at=ai[ar];an.push(T(at[0]));if(at[1]>at[0]){if(at[1]+1>at[0]){an.push("-")}an.push(T(at[1]))}}an.push("]");return an.join("")}function W(al){var aj=al.source.match(new RegExp("(?:\\[(?:[^\\x5C\\x5D]|\\\\[\\s\\S])*\\]|\\\\u[A-Fa-f0-9]{4}|\\\\x[A-Fa-f0-9]{2}|\\\\[0-9]+|\\\\[^ux0-9]|\\(\\?[:!=]|[\\(\\)\\^]|[^\\x5B\\x5C\\(\\)\\^]+)","g"));var ah=aj.length;var an=[];for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){an[af]=-1}}}}for(var ak=1;ak<an.length;++ak){if(-1===an[ak]){an[ak]=++ad}}for(var ak=0,am=0;ak<ah;++ak){var ag=aj[ak];if(ag==="("){++am;if(an[am]===undefined){aj[ak]="(?:"}}else{if("\\"===ag.charAt(0)){var af=+ag.substring(1);if(af&&af<=am){aj[ak]="\\"+an[am]}}}}for(var ak=0,am=0;ak<ah;++ak){if("^"===aj[ak]&&"^"!==aj[ak+1]){aj[ak]=""}}if(al.ignoreCase&&S){for(var ak=0;ak<ah;++ak){var ag=aj[ak];var ai=ag.charAt(0);if(ag.length>=2&&ai==="["){aj[ak]=X(ag)}else{if(ai!=="\\"){aj[ak]=ag.replace(/[a-zA-Z]/g,function(ao){var ap=ao.charCodeAt(0);return"["+String.fromCharCode(ap&~32,ap|32)+"]"})}}}}return aj.join("")}var aa=[];for(var V=0,U=Z.length;V<U;++V){var ae=Z[V];if(ae.global||ae.multiline){throw new Error(""+ae)}aa.push("(?:"+W(ae)+")")}return new RegExp(aa.join("|"),ac?"gi":"g")}function a(V){var U=/(?:^|\s)nocode(?:\s|$)/;var X=[];var T=0;var Z=[];var W=0;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=document.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Y=S&&"pre"===S.substring(0,3);function aa(ab){switch(ab.nodeType){case 1:if(U.test(ab.className)){return}for(var ae=ab.firstChild;ae;ae=ae.nextSibling){aa(ae)}var ad=ab.nodeName;if("BR"===ad||"LI"===ad){X[W]="\n";Z[W<<1]=T++;Z[(W++<<1)|1]=ab}break;case 3:case 4:var ac=ab.nodeValue;if(ac.length){if(!Y){ac=ac.replace(/[ \t\r\n]+/g," ")}else{ac=ac.replace(/\r\n?/g,"\n")}X[W]=ac;Z[W<<1]=T;T+=ac.length;Z[(W++<<1)|1]=ab}break}}aa(V);return{sourceCode:X.join("").replace(/\n$/,""),spans:Z}}function B(S,U,W,T){if(!U){return}var V={sourceCode:U,basePos:S};W(V);T.push.apply(T,V.decorations)}var v=/\S/;function o(S){var V=undefined;for(var U=S.firstChild;U;U=U.nextSibling){var T=U.nodeType;V=(T===1)?(V?S:U):(T===3)?(v.test(U.nodeValue)?S:V):V}return V===S?undefined:V}function g(U,T){var S={};var V;(function(){var ad=U.concat(T);var ah=[];var ag={};for(var ab=0,Z=ad.length;ab<Z;++ab){var Y=ad[ab];var ac=Y[3];if(ac){for(var ae=ac.length;--ae>=0;){S[ac.charAt(ae)]=Y}}var af=Y[1];var aa=""+af;if(!ag.hasOwnProperty(aa)){ah.push(af);ag[aa]=null}}ah.push(/[\0-\uffff]/);V=k(ah)})();var X=T.length;var W=function(ah){var Z=ah.sourceCode,Y=ah.basePos;var ad=[Y,F];var af=0;var an=Z.match(V)||[];var aj={};for(var ae=0,aq=an.length;ae<aq;++ae){var ag=an[ae];var ap=aj[ag];var ai=void 0;var am;if(typeof ap==="string"){am=false}else{var aa=S[ag.charAt(0)];if(aa){ai=ag.match(aa[1]);ap=aa[0]}else{for(var ao=0;ao<X;++ao){aa=T[ao];ai=ag.match(aa[1]);if(ai){ap=aa[0];break}}if(!ai){ap=F}}am=ap.length>=5&&"lang-"===ap.substring(0,5);if(am&&!(ai&&typeof ai[1]==="string")){am=false;ap=J}if(!am){aj[ag]=ap}}var ab=af;af+=ag.length;if(!am){ad.push(Y+ab,ap)}else{var al=ai[1];var ak=ag.indexOf(al);var ac=ak+al.length;if(ai[2]){ac=ag.length-ai[2].length;ak=ac-al.length}var ar=ap.substring(5);B(Y+ab,ag.substring(0,ak),W,ad);B(Y+ab+ak,al,q(ar,al),ad);B(Y+ab+ac,ag.substring(ac),W,ad)}}ah.decorations=ad};return W}function i(T){var W=[],S=[];if(T.tripleQuotedStrings){W.push([C,/^(?:\'\'\'(?:[^\'\\]|\\[\s\S]|\'{1,2}(?=[^\']))*(?:\'\'\'|$)|\"\"\"(?:[^\"\\]|\\[\s\S]|\"{1,2}(?=[^\"]))*(?:\"\"\"|$)|\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$))/,null,"'\""])}else{if(T.multiLineStrings){W.push([C,/^(?:\'(?:[^\\\']|\\[\s\S])*(?:\'|$)|\"(?:[^\\\"]|\\[\s\S])*(?:\"|$)|\`(?:[^\\\`]|\\[\s\S])*(?:\`|$))/,null,"'\"`"])}else{W.push([C,/^(?:\'(?:[^\\\'\r\n]|\\.)*(?:\'|$)|\"(?:[^\\\"\r\n]|\\.)*(?:\"|$))/,null,"\"'"])}}if(T.verbatimStrings){S.push([C,/^@\"(?:[^\"]|\"\")*(?:\"|$)/,null])}var Y=T.hashComments;if(Y){if(T.cStyleComments){if(Y>1){W.push([j,/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,null,"#"])}else{W.push([j,/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\r\n]*)/,null,"#"])}S.push([C,/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,null])}else{W.push([j,/^#[^\r\n]*/,null,"#"])}}if(T.cStyleComments){S.push([j,/^\/\/[^\r\n]*/,null]);S.push([j,/^\/\*[\s\S]*?(?:\*\/|$)/,null])}if(T.regexLiterals){var X=("/(?=[^/*])(?:[^/\\x5B\\x5C]|\\x5C[\\s\\S]|\\x5B(?:[^\\x5C\\x5D]|\\x5C[\\s\\S])*(?:\\x5D|$))+/");S.push(["lang-regex",new RegExp("^"+M+"("+X+")")])}var V=T.types;if(V){S.push([O,V])}var U=(""+T.keywords).replace(/^ | $/g,"");if(U.length){S.push([z,new RegExp("^(?:"+U.replace(/[\s,]+/g,"|")+")\\b"),null])}W.push([F,/^\s+/,null," \r\n\t\xA0"]);S.push([G,/^@[a-z_$][a-z_$@0-9]*/i,null],[O,/^(?:[@_]?[A-Z]+[a-z][A-Za-z_$@0-9]*|\w+_t\b)/,null],[F,/^[a-z_$][a-z_$@0-9]*/i,null],[G,new RegExp("^(?:0x[a-f0-9]+|(?:\\d(?:_\\d+)*\\d*(?:\\.\\d*)?|\\.\\d\\+)(?:e[+\\-]?\\d+)?)[a-z]*","i"),null,"0123456789"],[F,/^\\[\s\S]?/,null],[L,/^.[^\s\w\.$@\'\"\`\/\#\\]*/,null]);return g(W,S)}var K=i({keywords:A,hashComments:true,cStyleComments:true,multiLineStrings:true,regexLiterals:true});function Q(V,ag){var U=/(?:^|\s)nocode(?:\s|$)/;var ab=/\r\n?|\n/;var ac=V.ownerDocument;var S;if(V.currentStyle){S=V.currentStyle.whiteSpace}else{if(window.getComputedStyle){S=ac.defaultView.getComputedStyle(V,null).getPropertyValue("white-space")}}var Z=S&&"pre"===S.substring(0,3);var af=ac.createElement("LI");while(V.firstChild){af.appendChild(V.firstChild)}var W=[af];function ae(al){switch(al.nodeType){case 1:if(U.test(al.className)){break}if("BR"===al.nodeName){ad(al);if(al.parentNode){al.parentNode.removeChild(al)}}else{for(var an=al.firstChild;an;an=an.nextSibling){ae(an)}}break;case 3:case 4:if(Z){var am=al.nodeValue;var aj=am.match(ab);if(aj){var ai=am.substring(0,aj.index);al.nodeValue=ai;var ah=am.substring(aj.index+aj[0].length);if(ah){var ak=al.parentNode;ak.insertBefore(ac.createTextNode(ah),al.nextSibling)}ad(al);if(!ai){al.parentNode.removeChild(al)}}}break}}function ad(ak){while(!ak.nextSibling){ak=ak.parentNode;if(!ak){return}}function ai(al,ar){var aq=ar?al.cloneNode(false):al;var ao=al.parentNode;if(ao){var ap=ai(ao,1);var an=al.nextSibling;ap.appendChild(aq);for(var am=an;am;am=an){an=am.nextSibling;ap.appendChild(am)}}return aq}var ah=ai(ak.nextSibling,0);for(var aj;(aj=ah.parentNode)&&aj.nodeType===1;){ah=aj}W.push(ah)}for(var Y=0;Y<W.length;++Y){ae(W[Y])}if(ag===(ag|0)){W[0].setAttribute("value",ag)}var aa=ac.createElement("OL");aa.className="linenums";var X=Math.max(0,((ag-1))|0)||0;for(var Y=0,T=W.length;Y<T;++Y){af=W[Y];af.className="L"+((Y+X)%10);if(!af.firstChild){af.appendChild(ac.createTextNode("\xA0"))}aa.appendChild(af)}V.appendChild(aa)}function D(ac){var aj=/\bMSIE\b/.test(navigator.userAgent);var am=/\n/g;var al=ac.sourceCode;var an=al.length;var V=0;var aa=ac.spans;var T=aa.length;var ah=0;var X=ac.decorations;var Y=X.length;var Z=0;X[Y]=an;var ar,aq;for(aq=ar=0;aq<Y;){if(X[aq]!==X[aq+2]){X[ar++]=X[aq++];X[ar++]=X[aq++]}else{aq+=2}}Y=ar;for(aq=ar=0;aq<Y;){var at=X[aq];var ab=X[aq+1];var W=aq+2;while(W+2<=Y&&X[W+1]===ab){W+=2}X[ar++]=at;X[ar++]=ab;aq=W}Y=X.length=ar;var ae=null;while(ah<T){var af=aa[ah];var S=aa[ah+2]||an;var ag=X[Z];var ap=X[Z+2]||an;var W=Math.min(S,ap);var ak=aa[ah+1];var U;if(ak.nodeType!==1&&(U=al.substring(V,W))){if(aj){U=U.replace(am,"\r")}ak.nodeValue=U;var ai=ak.ownerDocument;var ao=ai.createElement("SPAN");ao.className=X[Z+1];var ad=ak.parentNode;ad.replaceChild(ao,ak);ao.appendChild(ak);if(V<S){aa[ah+1]=ak=ai.createTextNode(al.substring(W,S));ad.insertBefore(ak,ao.nextSibling)}}V=W;if(V>=S){ah+=2}if(V>=ap){Z+=2}}}var t={};function c(U,V){for(var S=V.length;--S>=0;){var T=V[S];if(!t.hasOwnProperty(T)){t[T]=U}else{if(window.console){console.warn("cannot override language handler %s",T)}}}}function q(T,S){if(!(T&&t.hasOwnProperty(T))){T=/^\s*</.test(S)?"default-markup":"default-code"}return t[T]}c(K,["default-code"]);c(g([],[[F,/^[^<?]+/],[E,/^<!\w[^>]*(?:>|$)/],[j,/^<\!--[\s\S]*?(?:-\->|$)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],[L,/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),["default-markup","htm","html","mxml","xhtml","xml","xsl"]);c(g([[F,/^[\s]+/,null," \t\r\n"],[n,/^(?:\"[^\"]*\"?|\'[^\']*\'?)/,null,"\"'"]],[[m,/^^<\/?[a-z](?:[\w.:-]*\w)?|\/?>$/i],[P,/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^>\'\"\s]*(?:[^>\'\"\s\/]|\/(?=\s)))/],[L,/^[=<>\/]+/],["lang-js",/^on\w+\s*=\s*\"([^\"]+)\"/i],["lang-js",/^on\w+\s*=\s*\'([^\']+)\'/i],["lang-js",/^on\w+\s*=\s*([^\"\'>\s]+)/i],["lang-css",/^style\s*=\s*\"([^\"]+)\"/i],["lang-css",/^style\s*=\s*\'([^\']+)\'/i],["lang-css",/^style\s*=\s*([^\"\'>\s]+)/i]]),["in.tag"]);c(g([],[[n,/^[\s\S]+/]]),["uq.val"]);c(i({keywords:l,hashComments:true,cStyleComments:true,types:e}),["c","cc","cpp","cxx","cyc","m"]);c(i({keywords:"null,true,false"}),["json"]);c(i({keywords:R,hashComments:true,cStyleComments:true,verbatimStrings:true,types:e}),["cs"]);c(i({keywords:x,cStyleComments:true}),["java"]);c(i({keywords:H,hashComments:true,multiLineStrings:true}),["bsh","csh","sh"]);c(i({keywords:I,hashComments:true,multiLineStrings:true,tripleQuotedStrings:true}),["cv","py"]);c(i({keywords:s,hashComments:true,multiLineStrings:true,regexLiterals:true}),["perl","pl","pm"]);c(i({keywords:f,hashComments:true,multiLineStrings:true,regexLiterals:true}),["rb"]);c(i({keywords:w,cStyleComments:true,regexLiterals:true}),["js"]);c(i({keywords:r,hashComments:3,cStyleComments:true,multilineStrings:true,tripleQuotedStrings:true,regexLiterals:true}),["coffee"]);c(g([],[[C,/^[\s\S]+/]]),["regex"]);function d(V){var U=V.langExtension;try{var S=a(V.sourceNode);var T=S.sourceCode;V.sourceCode=T;V.spans=S.spans;V.basePos=0;q(U,T)(V);D(V)}catch(W){if("console" in window){console.log(W&&W.stack?W.stack:W)}}}function y(W,V,U){var S=document.createElement("PRE");S.innerHTML=W;if(U){Q(S,U)}var T={langExtension:V,numberLines:U,sourceNode:S};d(T);return S.innerHTML}function b(ad){function Y(af){return document.getElementsByTagName(af)}var ac=[Y("pre"),Y("code"),Y("xmp")];var T=[];for(var aa=0;aa<ac.length;++aa){for(var Z=0,V=ac[aa].length;Z<V;++Z){T.push(ac[aa][Z])}}ac=null;var W=Date;if(!W.now){W={now:function(){return +(new Date)}}}var X=0;var S;var ab=/\blang(?:uage)?-([\w.]+)(?!\S)/;var ae=/\bprettyprint\b/;function U(){var ag=(window.PR_SHOULD_USE_CONTINUATION?W.now()+250:Infinity);for(;X<T.length&&W.now()<ag;X++){var aj=T[X];var ai=aj.className;if(ai.indexOf("prettyprint")>=0){var ah=ai.match(ab);var am;if(!ah&&(am=o(aj))&&"CODE"===am.tagName){ah=am.className.match(ab)}if(ah){ah=ah[1]}var al=false;for(var ak=aj.parentNode;ak;ak=ak.parentNode){if((ak.tagName==="pre"||ak.tagName==="code"||ak.tagName==="xmp")&&ak.className&&ak.className.indexOf("prettyprint")>=0){al=true;break}}if(!al){var af=aj.className.match(/\blinenums\b(?::(\d+))?/);af=af?af[1]&&af[1].length?+af[1]:true:false;if(af){Q(aj,af)}S={langExtension:ah,sourceNode:aj,numberLines:af};d(S)}}}if(X<T.length){setTimeout(U,250)}else{if(ad){ad()}}}U()}window.prettyPrintOne=y;window.prettyPrint=b;window.PR={createSimpleLexer:g,registerLangHandler:c,sourceDecorator:i,PR_ATTRIB_NAME:P,PR_ATTRIB_VALUE:n,PR_COMMENT:j,PR_DECLARATION:E,PR_KEYWORD:z,PR_LITERAL:G,PR_NOCODE:N,PR_PLAIN:F,PR_PUNCTUATION:L,PR_SOURCE:J,PR_STRING:C,PR_TAG:m,PR_TYPE:O}})();PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_DECLARATION,/^<!\w[^>]*(?:>|$)/],[PR.PR_COMMENT,/^<\!--[\s\S]*?(?:-\->|$)/],[PR.PR_PUNCTUATION,/^(?:<[%?]|[%?]>)/],["lang-",/^<\?([\s\S]+?)(?:\?>|$)/],["lang-",/^<%([\s\S]+?)(?:%>|$)/],["lang-",/^<xmp\b[^>]*>([\s\S]+?)<\/xmp\b[^>]*>/i],["lang-handlebars",/^<script\b[^>]*type\s*=\s*['"]?text\/x-handlebars-template['"]?\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-js",/^<script\b[^>]*>([\s\S]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\s\S]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i],[PR.PR_DECLARATION,/^{{[#^>/]?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{&?\s*[\w.][^}]*}}/],[PR.PR_DECLARATION,/^{{{>?\s*[\w.][^}]*}}}/],[PR.PR_COMMENT,/^{{![^}]*}}/]]),["handlebars","hbs"]);PR.registerLangHandler(PR.createSimpleLexer([[PR.PR_PLAIN,/^[ \t\r\n\f]+/,null," \t\r\n\f"]],[[PR.PR_STRING,/^\"(?:[^\n\r\f\\\"]|\\(?:\r\n?|\n|\f)|\\[\s\S])*\"/,null],[PR.PR_STRING,/^\'(?:[^\n\r\f\\\']|\\(?:\r\n?|\n|\f)|\\[\s\S])*\'/,null],["lang-css-str",/^url\(([^\)\"\']*)\)/i],[PR.PR_KEYWORD,/^(?:url|rgb|\!important|@import|@page|@media|@charset|inherit)(?=[^\-\w]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|(?:\\[0-9a-f]+ ?))(?:[_a-z0-9\-]|\\(?:\\[0-9a-f]+ ?))*)\s*:/i],[PR.PR_COMMENT,/^\/\*[^*]*\*+(?:[^\/*][^*]*\*+)*\//],[PR.PR_COMMENT,/^(?:<!--|-->)/],[PR.PR_LITERAL,/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],[PR.PR_LITERAL,/^#(?:[0-9a-f]{3}){1,2}/i],[PR.PR_PLAIN,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i],[PR.PR_PUNCTUATION,/^[^\s\w\'\"]+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_KEYWORD,/^-?(?:[_a-z]|(?:\\[\da-f]+ ?))(?:[_a-z\d\-]|\\(?:\\[\da-f]+ ?))*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[[PR.PR_STRING,/^[^\)\"\']+/]]),["css-str"]); |
| /* eslint-disable */ | ||
| var addSorting = (function() { | ||
| 'use strict'; | ||
| var cols, | ||
| currentSort = { | ||
| index: 0, | ||
| desc: false | ||
| }; | ||
| // returns the summary table element | ||
| function getTable() { | ||
| return document.querySelector('.coverage-summary'); | ||
| } | ||
| // returns the thead element of the summary table | ||
| function getTableHeader() { | ||
| return getTable().querySelector('thead tr'); | ||
| } | ||
| // returns the tbody element of the summary table | ||
| function getTableBody() { | ||
| return getTable().querySelector('tbody'); | ||
| } | ||
| // returns the th element for nth column | ||
| function getNthColumn(n) { | ||
| return getTableHeader().querySelectorAll('th')[n]; | ||
| } | ||
| function onFilterInput() { | ||
| const searchValue = document.getElementById('fileSearch').value; | ||
| const rows = document.getElementsByTagName('tbody')[0].children; | ||
| // Try to create a RegExp from the searchValue. If it fails (invalid regex), | ||
| // it will be treated as a plain text search | ||
| let searchRegex; | ||
| try { | ||
| searchRegex = new RegExp(searchValue, 'i'); // 'i' for case-insensitive | ||
| } catch (error) { | ||
| searchRegex = null; | ||
| } | ||
| for (let i = 0; i < rows.length; i++) { | ||
| const row = rows[i]; | ||
| let isMatch = false; | ||
| if (searchRegex) { | ||
| // If a valid regex was created, use it for matching | ||
| isMatch = searchRegex.test(row.textContent); | ||
| } else { | ||
| // Otherwise, fall back to the original plain text search | ||
| isMatch = row.textContent | ||
| .toLowerCase() | ||
| .includes(searchValue.toLowerCase()); | ||
| } | ||
| row.style.display = isMatch ? '' : 'none'; | ||
| } | ||
| } | ||
| // loads the search box | ||
| function addSearchBox() { | ||
| var template = document.getElementById('filterTemplate'); | ||
| var templateClone = template.content.cloneNode(true); | ||
| templateClone.getElementById('fileSearch').oninput = onFilterInput; | ||
| template.parentElement.appendChild(templateClone); | ||
| } | ||
| // loads all columns | ||
| function loadColumns() { | ||
| var colNodes = getTableHeader().querySelectorAll('th'), | ||
| colNode, | ||
| cols = [], | ||
| col, | ||
| i; | ||
| for (i = 0; i < colNodes.length; i += 1) { | ||
| colNode = colNodes[i]; | ||
| col = { | ||
| key: colNode.getAttribute('data-col'), | ||
| sortable: !colNode.getAttribute('data-nosort'), | ||
| type: colNode.getAttribute('data-type') || 'string' | ||
| }; | ||
| cols.push(col); | ||
| if (col.sortable) { | ||
| col.defaultDescSort = col.type === 'number'; | ||
| colNode.innerHTML = | ||
| colNode.innerHTML + '<span class="sorter"></span>'; | ||
| } | ||
| } | ||
| return cols; | ||
| } | ||
| // attaches a data attribute to every tr element with an object | ||
| // of data values keyed by column name | ||
| function loadRowData(tableRow) { | ||
| var tableCols = tableRow.querySelectorAll('td'), | ||
| colNode, | ||
| col, | ||
| data = {}, | ||
| i, | ||
| val; | ||
| for (i = 0; i < tableCols.length; i += 1) { | ||
| colNode = tableCols[i]; | ||
| col = cols[i]; | ||
| val = colNode.getAttribute('data-value'); | ||
| if (col.type === 'number') { | ||
| val = Number(val); | ||
| } | ||
| data[col.key] = val; | ||
| } | ||
| return data; | ||
| } | ||
| // loads all row data | ||
| function loadData() { | ||
| var rows = getTableBody().querySelectorAll('tr'), | ||
| i; | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| rows[i].data = loadRowData(rows[i]); | ||
| } | ||
| } | ||
| // sorts the table using the data for the ith column | ||
| function sortByIndex(index, desc) { | ||
| var key = cols[index].key, | ||
| sorter = function(a, b) { | ||
| a = a.data[key]; | ||
| b = b.data[key]; | ||
| return a < b ? -1 : a > b ? 1 : 0; | ||
| }, | ||
| finalSorter = sorter, | ||
| tableBody = document.querySelector('.coverage-summary tbody'), | ||
| rowNodes = tableBody.querySelectorAll('tr'), | ||
| rows = [], | ||
| i; | ||
| if (desc) { | ||
| finalSorter = function(a, b) { | ||
| return -1 * sorter(a, b); | ||
| }; | ||
| } | ||
| for (i = 0; i < rowNodes.length; i += 1) { | ||
| rows.push(rowNodes[i]); | ||
| tableBody.removeChild(rowNodes[i]); | ||
| } | ||
| rows.sort(finalSorter); | ||
| for (i = 0; i < rows.length; i += 1) { | ||
| tableBody.appendChild(rows[i]); | ||
| } | ||
| } | ||
| // removes sort indicators for current column being sorted | ||
| function removeSortIndicators() { | ||
| var col = getNthColumn(currentSort.index), | ||
| cls = col.className; | ||
| cls = cls.replace(/ sorted$/, '').replace(/ sorted-desc$/, ''); | ||
| col.className = cls; | ||
| } | ||
| // adds sort indicators for current column being sorted | ||
| function addSortIndicators() { | ||
| getNthColumn(currentSort.index).className += currentSort.desc | ||
| ? ' sorted-desc' | ||
| : ' sorted'; | ||
| } | ||
| // adds event listeners for all sorter widgets | ||
| function enableUI() { | ||
| var i, | ||
| el, | ||
| ithSorter = function ithSorter(i) { | ||
| var col = cols[i]; | ||
| return function() { | ||
| var desc = col.defaultDescSort; | ||
| if (currentSort.index === i) { | ||
| desc = !currentSort.desc; | ||
| } | ||
| sortByIndex(i, desc); | ||
| removeSortIndicators(); | ||
| currentSort.index = i; | ||
| currentSort.desc = desc; | ||
| addSortIndicators(); | ||
| }; | ||
| }; | ||
| for (i = 0; i < cols.length; i += 1) { | ||
| if (cols[i].sortable) { | ||
| // add the click event handler on the th so users | ||
| // dont have to click on those tiny arrows | ||
| el = getNthColumn(i).querySelector('.sorter').parentElement; | ||
| if (el.addEventListener) { | ||
| el.addEventListener('click', ithSorter(i)); | ||
| } else { | ||
| el.attachEvent('onclick', ithSorter(i)); | ||
| } | ||
| } | ||
| } | ||
| } | ||
| // adds sorting functionality to the UI | ||
| return function() { | ||
| if (!getTable()) { | ||
| return; | ||
| } | ||
| cols = loadColumns(); | ||
| loadData(); | ||
| addSearchBox(); | ||
| addSortIndicators(); | ||
| enableUI(); | ||
| }; | ||
| })(); | ||
| window.addEventListener('load', addSorting); |
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for utils.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> utils.js</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">44.64% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>25/56</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">58.33% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>7/12</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">100% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>3/3</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">45.09% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>23/51</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-yes">13x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-yes">4x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">12x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-yes">8x</span> | ||
| <span class="cline-any cline-yes">7x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">5x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">3x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** | ||
| * Utility functions for parsing and processing API responses | ||
| */ | ||
| | ||
| const { BoundingBox, SegmentationMask } = require('./models'); | ||
| const { createCanvas, loadImage } = require('canvas'); | ||
| | ||
| /** | ||
| * Parse JSON output, removing markdown fencing if present | ||
| * @param {string} jsonOutput - Raw JSON string | ||
| * @returns {string} - Cleaned JSON string | ||
| */ | ||
| function parseJson(jsonOutput) { | ||
| const lines = jsonOutput.split('\n'); | ||
| for (let i = 0; i < lines.length; i++) { | ||
| if (lines[i].trim() === '```json') { | ||
| jsonOutput = lines.slice(i + 1).join('\n'); | ||
| jsonOutput = jsonOutput.split('```')[0]; | ||
| break; | ||
| } | ||
| } | ||
| return jsonOutput.trim(); | ||
| } | ||
| | ||
| /** | ||
| * Parse bounding boxes from API response | ||
| * @param {string} responseText - Raw response text from API | ||
| * @returns {BoundingBox[]} - Array of BoundingBox objects | ||
| */ | ||
| function parseBoundingBoxes(responseText) { | ||
| const cleanedJson = parseJson(responseText); | ||
| const data = JSON.parse(cleanedJson); | ||
| const boxes = []; | ||
| for (const item of data) { | ||
| if (item.box_2d) { | ||
| boxes.push(BoundingBox.fromDict(item)); | ||
| } | ||
| } | ||
| return boxes; | ||
| } | ||
| | ||
| /** | ||
| * Parse segmentation masks from API response | ||
| * @param {string} responseText - Raw response text | ||
| * @param {number} imgHeight - Image height | ||
| * @param {number} imgWidth - Image width | ||
| * @returns {Promise<SegmentationMask[]>} - Array of SegmentationMask objects | ||
| */ | ||
| async function parseSegmentationMasks(responseText, imgHeight, imgWidth) { | ||
| const cleanedJson = parseJson(responseText); | ||
| const data = JSON.parse(cleanedJson); | ||
| const masks = []; | ||
| for (const item of data) { | ||
| <span class="missing-if-branch" title="else path not taken" >E</span>if (!item.box_2d || !item.mask) continue; | ||
| const box = <span class="cstat-no" title="statement not covered" >item.box_2d;</span> | ||
| const label = <span class="cstat-no" title="statement not covered" >item.label;</span> | ||
| // Convert normalized bbox to absolute coordinates | ||
| const absY0 = <span class="cstat-no" title="statement not covered" >Math.round((box[0] / 1000) * imgHeight);</span> | ||
| const absX0 = <span class="cstat-no" title="statement not covered" >Math.round((box[1] / 1000) * imgWidth);</span> | ||
| const absY1 = <span class="cstat-no" title="statement not covered" >Math.round((box[2] / 1000) * imgHeight);</span> | ||
| const absX1 = <span class="cstat-no" title="statement not covered" >Math.round((box[3] / 1000) * imgWidth);</span> | ||
| const bboxWidth = <span class="cstat-no" title="statement not covered" >absX1 - absX0;</span> | ||
| const bboxHeight = <span class="cstat-no" title="statement not covered" >absY1 - absY0;</span> | ||
| // Decode base64 mask | ||
| const maskBase64 = <span class="cstat-no" title="statement not covered" >item.mask.replace(/^data:image\/png;base64,/, '');</span> | ||
| const maskBuffer = <span class="cstat-no" title="statement not covered" >Buffer.from(maskBase64, 'base64');</span> | ||
| // Load mask image and resize to bbox size | ||
| const maskImg = <span class="cstat-no" title="statement not covered" >await loadImage(maskBuffer);</span> | ||
| const canvas = <span class="cstat-no" title="statement not covered" >createCanvas(bboxWidth, bboxHeight);</span> | ||
| const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.drawImage(maskImg, 0, 0, bboxWidth, bboxHeight);</span> | ||
| // Get image data and extract alpha channel | ||
| const imageData = <span class="cstat-no" title="statement not covered" >ctx.getImageData(0, 0, bboxWidth, bboxHeight);</span> | ||
| const maskData = <span class="cstat-no" title="statement not covered" >new Uint8Array(bboxWidth * bboxHeight);</span> | ||
| <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < imageData.data.length; i += 4) {</span> | ||
| <span class="cstat-no" title="statement not covered" > maskData[i / 4] = imageData.data[i + 3]; </span>// Alpha channel | ||
| } | ||
| // Create full-size mask | ||
| const fullMask = <span class="cstat-no" title="statement not covered" >Buffer.alloc(imgHeight * imgWidth);</span> | ||
| <span class="cstat-no" title="statement not covered" > for (let y = <span class="cstat-no" title="statement not covered" >0;</span> y < bboxHeight; y++) {</span> | ||
| <span class="cstat-no" title="statement not covered" > for (let x = <span class="cstat-no" title="statement not covered" >0;</span> x < bboxWidth; x++) {</span> | ||
| const srcIdx = <span class="cstat-no" title="statement not covered" >y * bboxWidth + x;</span> | ||
| const dstY = <span class="cstat-no" title="statement not covered" >absY0 + y;</span> | ||
| const dstX = <span class="cstat-no" title="statement not covered" >absX0 + x;</span> | ||
| <span class="cstat-no" title="statement not covered" > if (dstY < imgHeight && dstX < imgWidth) {</span> | ||
| const dstIdx = <span class="cstat-no" title="statement not covered" >dstY * imgWidth + dstX;</span> | ||
| <span class="cstat-no" title="statement not covered" > fullMask[dstIdx] = maskData[srcIdx];</span> | ||
| } | ||
| } | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > masks.push(new SegmentationMask(</span> | ||
| absY0, absX0, absY1, absX1, fullMask, label | ||
| )); | ||
| } | ||
| return masks; | ||
| } | ||
| | ||
| module.exports = { | ||
| parseJson, | ||
| parseBoundingBoxes, | ||
| parseSegmentationMasks | ||
| }; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
| <!doctype html> | ||
| <html lang="en"> | ||
| <head> | ||
| <title>Code coverage report for visualize.js</title> | ||
| <meta charset="utf-8" /> | ||
| <link rel="stylesheet" href="prettify.css" /> | ||
| <link rel="stylesheet" href="base.css" /> | ||
| <link rel="shortcut icon" type="image/x-icon" href="favicon.png" /> | ||
| <meta name="viewport" content="width=device-width, initial-scale=1" /> | ||
| <style type='text/css'> | ||
| .coverage-summary .sorter { | ||
| background-image: url(sort-arrow-sprite.png); | ||
| } | ||
| </style> | ||
| </head> | ||
| <body> | ||
| <div class='wrapper'> | ||
| <div class='pad1'> | ||
| <h1><a href="index.html">All files</a> visualize.js</h1> | ||
| <div class='clearfix'> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">7.46% </span> | ||
| <span class="quiet">Statements</span> | ||
| <span class='fraction'>5/67</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Branches</span> | ||
| <span class='fraction'>0/24</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">0% </span> | ||
| <span class="quiet">Functions</span> | ||
| <span class='fraction'>0/8</span> | ||
| </div> | ||
| <div class='fl pad1y space-right2'> | ||
| <span class="strong">7.57% </span> | ||
| <span class="quiet">Lines</span> | ||
| <span class='fraction'>5/66</span> | ||
| </div> | ||
| </div> | ||
| <p class="quiet"> | ||
| Press <em>n</em> or <em>j</em> to go to the next uncovered block, <em>b</em>, <em>p</em> or <em>k</em> for the previous block. | ||
| </p> | ||
| <template id="filterTemplate"> | ||
| <div class="quiet"> | ||
| Filter: | ||
| <input type="search" id="fileSearch"> | ||
| </div> | ||
| </template> | ||
| </div> | ||
| <div class='status-line low'></div> | ||
| <pre><table class="coverage"> | ||
| <tr><td class="line-count quiet"><a name='L1'></a><a href='#L1'>1</a> | ||
| <a name='L2'></a><a href='#L2'>2</a> | ||
| <a name='L3'></a><a href='#L3'>3</a> | ||
| <a name='L4'></a><a href='#L4'>4</a> | ||
| <a name='L5'></a><a href='#L5'>5</a> | ||
| <a name='L6'></a><a href='#L6'>6</a> | ||
| <a name='L7'></a><a href='#L7'>7</a> | ||
| <a name='L8'></a><a href='#L8'>8</a> | ||
| <a name='L9'></a><a href='#L9'>9</a> | ||
| <a name='L10'></a><a href='#L10'>10</a> | ||
| <a name='L11'></a><a href='#L11'>11</a> | ||
| <a name='L12'></a><a href='#L12'>12</a> | ||
| <a name='L13'></a><a href='#L13'>13</a> | ||
| <a name='L14'></a><a href='#L14'>14</a> | ||
| <a name='L15'></a><a href='#L15'>15</a> | ||
| <a name='L16'></a><a href='#L16'>16</a> | ||
| <a name='L17'></a><a href='#L17'>17</a> | ||
| <a name='L18'></a><a href='#L18'>18</a> | ||
| <a name='L19'></a><a href='#L19'>19</a> | ||
| <a name='L20'></a><a href='#L20'>20</a> | ||
| <a name='L21'></a><a href='#L21'>21</a> | ||
| <a name='L22'></a><a href='#L22'>22</a> | ||
| <a name='L23'></a><a href='#L23'>23</a> | ||
| <a name='L24'></a><a href='#L24'>24</a> | ||
| <a name='L25'></a><a href='#L25'>25</a> | ||
| <a name='L26'></a><a href='#L26'>26</a> | ||
| <a name='L27'></a><a href='#L27'>27</a> | ||
| <a name='L28'></a><a href='#L28'>28</a> | ||
| <a name='L29'></a><a href='#L29'>29</a> | ||
| <a name='L30'></a><a href='#L30'>30</a> | ||
| <a name='L31'></a><a href='#L31'>31</a> | ||
| <a name='L32'></a><a href='#L32'>32</a> | ||
| <a name='L33'></a><a href='#L33'>33</a> | ||
| <a name='L34'></a><a href='#L34'>34</a> | ||
| <a name='L35'></a><a href='#L35'>35</a> | ||
| <a name='L36'></a><a href='#L36'>36</a> | ||
| <a name='L37'></a><a href='#L37'>37</a> | ||
| <a name='L38'></a><a href='#L38'>38</a> | ||
| <a name='L39'></a><a href='#L39'>39</a> | ||
| <a name='L40'></a><a href='#L40'>40</a> | ||
| <a name='L41'></a><a href='#L41'>41</a> | ||
| <a name='L42'></a><a href='#L42'>42</a> | ||
| <a name='L43'></a><a href='#L43'>43</a> | ||
| <a name='L44'></a><a href='#L44'>44</a> | ||
| <a name='L45'></a><a href='#L45'>45</a> | ||
| <a name='L46'></a><a href='#L46'>46</a> | ||
| <a name='L47'></a><a href='#L47'>47</a> | ||
| <a name='L48'></a><a href='#L48'>48</a> | ||
| <a name='L49'></a><a href='#L49'>49</a> | ||
| <a name='L50'></a><a href='#L50'>50</a> | ||
| <a name='L51'></a><a href='#L51'>51</a> | ||
| <a name='L52'></a><a href='#L52'>52</a> | ||
| <a name='L53'></a><a href='#L53'>53</a> | ||
| <a name='L54'></a><a href='#L54'>54</a> | ||
| <a name='L55'></a><a href='#L55'>55</a> | ||
| <a name='L56'></a><a href='#L56'>56</a> | ||
| <a name='L57'></a><a href='#L57'>57</a> | ||
| <a name='L58'></a><a href='#L58'>58</a> | ||
| <a name='L59'></a><a href='#L59'>59</a> | ||
| <a name='L60'></a><a href='#L60'>60</a> | ||
| <a name='L61'></a><a href='#L61'>61</a> | ||
| <a name='L62'></a><a href='#L62'>62</a> | ||
| <a name='L63'></a><a href='#L63'>63</a> | ||
| <a name='L64'></a><a href='#L64'>64</a> | ||
| <a name='L65'></a><a href='#L65'>65</a> | ||
| <a name='L66'></a><a href='#L66'>66</a> | ||
| <a name='L67'></a><a href='#L67'>67</a> | ||
| <a name='L68'></a><a href='#L68'>68</a> | ||
| <a name='L69'></a><a href='#L69'>69</a> | ||
| <a name='L70'></a><a href='#L70'>70</a> | ||
| <a name='L71'></a><a href='#L71'>71</a> | ||
| <a name='L72'></a><a href='#L72'>72</a> | ||
| <a name='L73'></a><a href='#L73'>73</a> | ||
| <a name='L74'></a><a href='#L74'>74</a> | ||
| <a name='L75'></a><a href='#L75'>75</a> | ||
| <a name='L76'></a><a href='#L76'>76</a> | ||
| <a name='L77'></a><a href='#L77'>77</a> | ||
| <a name='L78'></a><a href='#L78'>78</a> | ||
| <a name='L79'></a><a href='#L79'>79</a> | ||
| <a name='L80'></a><a href='#L80'>80</a> | ||
| <a name='L81'></a><a href='#L81'>81</a> | ||
| <a name='L82'></a><a href='#L82'>82</a> | ||
| <a name='L83'></a><a href='#L83'>83</a> | ||
| <a name='L84'></a><a href='#L84'>84</a> | ||
| <a name='L85'></a><a href='#L85'>85</a> | ||
| <a name='L86'></a><a href='#L86'>86</a> | ||
| <a name='L87'></a><a href='#L87'>87</a> | ||
| <a name='L88'></a><a href='#L88'>88</a> | ||
| <a name='L89'></a><a href='#L89'>89</a> | ||
| <a name='L90'></a><a href='#L90'>90</a> | ||
| <a name='L91'></a><a href='#L91'>91</a> | ||
| <a name='L92'></a><a href='#L92'>92</a> | ||
| <a name='L93'></a><a href='#L93'>93</a> | ||
| <a name='L94'></a><a href='#L94'>94</a> | ||
| <a name='L95'></a><a href='#L95'>95</a> | ||
| <a name='L96'></a><a href='#L96'>96</a> | ||
| <a name='L97'></a><a href='#L97'>97</a> | ||
| <a name='L98'></a><a href='#L98'>98</a> | ||
| <a name='L99'></a><a href='#L99'>99</a> | ||
| <a name='L100'></a><a href='#L100'>100</a> | ||
| <a name='L101'></a><a href='#L101'>101</a> | ||
| <a name='L102'></a><a href='#L102'>102</a> | ||
| <a name='L103'></a><a href='#L103'>103</a> | ||
| <a name='L104'></a><a href='#L104'>104</a> | ||
| <a name='L105'></a><a href='#L105'>105</a> | ||
| <a name='L106'></a><a href='#L106'>106</a> | ||
| <a name='L107'></a><a href='#L107'>107</a> | ||
| <a name='L108'></a><a href='#L108'>108</a> | ||
| <a name='L109'></a><a href='#L109'>109</a> | ||
| <a name='L110'></a><a href='#L110'>110</a> | ||
| <a name='L111'></a><a href='#L111'>111</a> | ||
| <a name='L112'></a><a href='#L112'>112</a> | ||
| <a name='L113'></a><a href='#L113'>113</a> | ||
| <a name='L114'></a><a href='#L114'>114</a> | ||
| <a name='L115'></a><a href='#L115'>115</a> | ||
| <a name='L116'></a><a href='#L116'>116</a> | ||
| <a name='L117'></a><a href='#L117'>117</a> | ||
| <a name='L118'></a><a href='#L118'>118</a> | ||
| <a name='L119'></a><a href='#L119'>119</a> | ||
| <a name='L120'></a><a href='#L120'>120</a> | ||
| <a name='L121'></a><a href='#L121'>121</a> | ||
| <a name='L122'></a><a href='#L122'>122</a> | ||
| <a name='L123'></a><a href='#L123'>123</a> | ||
| <a name='L124'></a><a href='#L124'>124</a> | ||
| <a name='L125'></a><a href='#L125'>125</a> | ||
| <a name='L126'></a><a href='#L126'>126</a> | ||
| <a name='L127'></a><a href='#L127'>127</a> | ||
| <a name='L128'></a><a href='#L128'>128</a> | ||
| <a name='L129'></a><a href='#L129'>129</a> | ||
| <a name='L130'></a><a href='#L130'>130</a> | ||
| <a name='L131'></a><a href='#L131'>131</a> | ||
| <a name='L132'></a><a href='#L132'>132</a> | ||
| <a name='L133'></a><a href='#L133'>133</a> | ||
| <a name='L134'></a><a href='#L134'>134</a> | ||
| <a name='L135'></a><a href='#L135'>135</a> | ||
| <a name='L136'></a><a href='#L136'>136</a> | ||
| <a name='L137'></a><a href='#L137'>137</a> | ||
| <a name='L138'></a><a href='#L138'>138</a> | ||
| <a name='L139'></a><a href='#L139'>139</a> | ||
| <a name='L140'></a><a href='#L140'>140</a> | ||
| <a name='L141'></a><a href='#L141'>141</a> | ||
| <a name='L142'></a><a href='#L142'>142</a> | ||
| <a name='L143'></a><a href='#L143'>143</a> | ||
| <a name='L144'></a><a href='#L144'>144</a> | ||
| <a name='L145'></a><a href='#L145'>145</a> | ||
| <a name='L146'></a><a href='#L146'>146</a> | ||
| <a name='L147'></a><a href='#L147'>147</a> | ||
| <a name='L148'></a><a href='#L148'>148</a> | ||
| <a name='L149'></a><a href='#L149'>149</a> | ||
| <a name='L150'></a><a href='#L150'>150</a> | ||
| <a name='L151'></a><a href='#L151'>151</a> | ||
| <a name='L152'></a><a href='#L152'>152</a> | ||
| <a name='L153'></a><a href='#L153'>153</a> | ||
| <a name='L154'></a><a href='#L154'>154</a> | ||
| <a name='L155'></a><a href='#L155'>155</a> | ||
| <a name='L156'></a><a href='#L156'>156</a> | ||
| <a name='L157'></a><a href='#L157'>157</a> | ||
| <a name='L158'></a><a href='#L158'>158</a> | ||
| <a name='L159'></a><a href='#L159'>159</a> | ||
| <a name='L160'></a><a href='#L160'>160</a> | ||
| <a name='L161'></a><a href='#L161'>161</a> | ||
| <a name='L162'></a><a href='#L162'>162</a> | ||
| <a name='L163'></a><a href='#L163'>163</a> | ||
| <a name='L164'></a><a href='#L164'>164</a> | ||
| <a name='L165'></a><a href='#L165'>165</a> | ||
| <a name='L166'></a><a href='#L166'>166</a> | ||
| <a name='L167'></a><a href='#L167'>167</a> | ||
| <a name='L168'></a><a href='#L168'>168</a> | ||
| <a name='L169'></a><a href='#L169'>169</a> | ||
| <a name='L170'></a><a href='#L170'>170</a> | ||
| <a name='L171'></a><a href='#L171'>171</a> | ||
| <a name='L172'></a><a href='#L172'>172</a> | ||
| <a name='L173'></a><a href='#L173'>173</a> | ||
| <a name='L174'></a><a href='#L174'>174</a> | ||
| <a name='L175'></a><a href='#L175'>175</a> | ||
| <a name='L176'></a><a href='#L176'>176</a> | ||
| <a name='L177'></a><a href='#L177'>177</a> | ||
| <a name='L178'></a><a href='#L178'>178</a> | ||
| <a name='L179'></a><a href='#L179'>179</a> | ||
| <a name='L180'></a><a href='#L180'>180</a> | ||
| <a name='L181'></a><a href='#L181'>181</a> | ||
| <a name='L182'></a><a href='#L182'>182</a> | ||
| <a name='L183'></a><a href='#L183'>183</a></td><td class="line-coverage quiet"><span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-no"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-yes">2x</span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span> | ||
| <span class="cline-any cline-neutral"> </span></td><td class="text"><pre class="prettyprint lang-js">/** | ||
| * Visualization utilities for drawing bounding boxes and segmentation masks | ||
| */ | ||
| | ||
| const { createCanvas, loadImage, registerFont } = require('canvas'); | ||
| const fs = require('fs').promises; | ||
| const path = require('path'); | ||
| | ||
| // Extended color palette | ||
| const COLORS = [ | ||
| '#FF0000', '#00FF00', '#0000FF', '#FFFF00', '#FF00FF', '#00FFFF', | ||
| '#FFA500', '#800080', '#FFC0CB', '#A52A2A', '#808080', '#F5F5DC', | ||
| '#40E0D0', '#FF7F50', '#E6E6FA', '#EE82EE', '#FFD700', '#C0C0C0', | ||
| '#000080', '#800000', '#008080', '#808000', '#FF6347', '#4B0082', | ||
| '#DC143C', '#00CED1', '#9370DB', '#FF1493', '#7FFF00', '#D2691E' | ||
| ]; | ||
| | ||
| /** | ||
| * Draw bounding boxes on an image | ||
| * @param {Canvas} canvas - Canvas with loaded image | ||
| * @param {BoundingBox[]} boxes - Array of bounding boxes | ||
| * @param {Object} options - Drawing options | ||
| * @returns {Canvas} - Canvas with bounding boxes drawn | ||
| */ | ||
| function <span class="fstat-no" title="function not covered" >plotBoundingBoxes(</span>canvas, boxes, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> { | ||
| const { | ||
| lineWidth = <span class="branch-0 cbranch-no" title="branch not covered" >4,</span> | ||
| fontSize = <span class="branch-0 cbranch-no" title="branch not covered" >14,</span> | ||
| showLabels = <span class="branch-0 cbranch-no" title="branch not covered" >true</span> | ||
| } = <span class="cstat-no" title="statement not covered" >options;</span> | ||
| const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span> | ||
| const width = <span class="cstat-no" title="statement not covered" >canvas.width;</span> | ||
| const height = <span class="cstat-no" title="statement not covered" >canvas.height;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.lineWidth = lineWidth;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.font = `${fontSize}px Arial`;</span> | ||
| <span class="cstat-no" title="statement not covered" > boxes.forEach(<span class="fstat-no" title="function not covered" >(b</span>ox, i) => {</span> | ||
| const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span> | ||
| const [absX1, absY1, absX2, absY2] = <span class="cstat-no" title="statement not covered" >box.toAbsolute(width, height);</span> | ||
| // Draw rectangle | ||
| <span class="cstat-no" title="statement not covered" > ctx.strokeStyle = color;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.strokeRect(absX1, absY1, absX2 - absX1, absY2 - absY1);</span> | ||
| // Draw label | ||
| <span class="cstat-no" title="statement not covered" > if (showLabels && box.label) {</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.fillStyle = color;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.fillText(box.label, absX1 + 8, absY1 + fontSize + 6);</span> | ||
| } | ||
| }); | ||
| <span class="cstat-no" title="statement not covered" > return canvas;</span> | ||
| } | ||
| | ||
| /** | ||
| * Overlay a mask on the image | ||
| * @param {Canvas} canvas - Canvas with image | ||
| * @param {Buffer} maskData - Mask data | ||
| * @param {number} width - Image width | ||
| * @param {number} height - Image height | ||
| * @param {string} color - Color to use for mask | ||
| * @param {number} alpha - Transparency (0-1) | ||
| */ | ||
| function <span class="fstat-no" title="function not covered" >overlayMask(</span>canvas, maskData, width, height, color, alpha) { | ||
| const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span> | ||
| const imageData = <span class="cstat-no" title="statement not covered" >ctx.getImageData(0, 0, width, height);</span> | ||
| const data = <span class="cstat-no" title="statement not covered" >imageData.data;</span> | ||
| // Parse color | ||
| const colorInt = <span class="cstat-no" title="statement not covered" >parseInt(color.slice(1), 16);</span> | ||
| const r = <span class="cstat-no" title="statement not covered" >(colorInt >> 16) & 255;</span> | ||
| const g = <span class="cstat-no" title="statement not covered" >(colorInt >> 8) & 255;</span> | ||
| const b = <span class="cstat-no" title="statement not covered" >colorInt & 255;</span> | ||
| // Apply mask | ||
| <span class="cstat-no" title="statement not covered" > for (let i = <span class="cstat-no" title="statement not covered" >0;</span> i < maskData.length; i++) {</span> | ||
| const maskValue = <span class="cstat-no" title="statement not covered" >maskData[i] / 255;</span> | ||
| <span class="cstat-no" title="statement not covered" > if (maskValue > 0) {</span> | ||
| const idx = <span class="cstat-no" title="statement not covered" >i * 4;</span> | ||
| const maskAlpha = <span class="cstat-no" title="statement not covered" >maskValue * alpha;</span> | ||
| <span class="cstat-no" title="statement not covered" > data[idx] = Math.round(data[idx] * (1 - maskAlpha) + r * maskAlpha);</span> | ||
| <span class="cstat-no" title="statement not covered" > data[idx + 1] = Math.round(data[idx + 1] * (1 - maskAlpha) + g * maskAlpha);</span> | ||
| <span class="cstat-no" title="statement not covered" > data[idx + 2] = Math.round(data[idx + 2] * (1 - maskAlpha) + b * maskAlpha);</span> | ||
| } | ||
| } | ||
| <span class="cstat-no" title="statement not covered" > ctx.putImageData(imageData, 0, 0);</span> | ||
| } | ||
| | ||
| /** | ||
| * Draw segmentation masks on an image | ||
| * @param {Canvas} canvas - Canvas with loaded image | ||
| * @param {SegmentationMask[]} masks - Array of segmentation masks | ||
| * @param {Object} options - Drawing options | ||
| * @returns {Canvas} - Canvas with masks drawn | ||
| */ | ||
| function <span class="fstat-no" title="function not covered" >plotSegmentationMasks(</span>canvas, masks, options = <span class="branch-0 cbranch-no" title="branch not covered" >{})</span> { | ||
| const { | ||
| lineWidth = <span class="branch-0 cbranch-no" title="branch not covered" >4,</span> | ||
| fontSize = <span class="branch-0 cbranch-no" title="branch not covered" >14,</span> | ||
| alpha = <span class="branch-0 cbranch-no" title="branch not covered" >0.7,</span> | ||
| showLabels = <span class="branch-0 cbranch-no" title="branch not covered" >true</span> | ||
| } = <span class="cstat-no" title="statement not covered" >options;</span> | ||
| const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span> | ||
| const width = <span class="cstat-no" title="statement not covered" >canvas.width;</span> | ||
| const height = <span class="cstat-no" title="statement not covered" >canvas.height;</span> | ||
| // Overlay masks first | ||
| <span class="cstat-no" title="statement not covered" > masks.forEach(<span class="fstat-no" title="function not covered" >(m</span>ask, i) => {</span> | ||
| const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span> | ||
| <span class="cstat-no" title="statement not covered" > overlayMask(canvas, mask.mask, width, height, color, alpha);</span> | ||
| }); | ||
| // Draw bounding boxes and labels | ||
| <span class="cstat-no" title="statement not covered" > ctx.lineWidth = lineWidth;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.font = `${fontSize}px Arial`;</span> | ||
| <span class="cstat-no" title="statement not covered" > masks.forEach(<span class="fstat-no" title="function not covered" >(m</span>ask, i) => {</span> | ||
| const color = <span class="cstat-no" title="statement not covered" >COLORS[i % COLORS.length];</span> | ||
| // Draw bounding box | ||
| <span class="cstat-no" title="statement not covered" > ctx.strokeStyle = color;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.strokeRect(mask.x0, mask.y0, mask.x1 - mask.x0, mask.y1 - mask.y0);</span> | ||
| // Draw label | ||
| <span class="cstat-no" title="statement not covered" > if (showLabels && mask.label) {</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.fillStyle = color;</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.fillText(mask.label, mask.x0 + 8, mask.y0 - 6);</span> | ||
| } | ||
| }); | ||
| <span class="cstat-no" title="statement not covered" > return canvas;</span> | ||
| } | ||
| | ||
| /** | ||
| * Load image into canvas | ||
| * @param {string} imagePath - Path to image file | ||
| * @param {number} maxSize - Maximum dimension | ||
| * @returns {Promise<Canvas>} - Canvas with loaded image | ||
| */ | ||
| async function <span class="fstat-no" title="function not covered" >loadImageToCanvas(</span>imagePath, maxSize = <span class="branch-0 cbranch-no" title="branch not covered" >1024)</span> { | ||
| const img = <span class="cstat-no" title="statement not covered" >await loadImage(imagePath);</span> | ||
| // Calculate new dimensions | ||
| let width = <span class="cstat-no" title="statement not covered" >img.width;</span> | ||
| let height = <span class="cstat-no" title="statement not covered" >img.height;</span> | ||
| <span class="cstat-no" title="statement not covered" > if (width > maxSize || height > maxSize) {</span> | ||
| const scale = <span class="cstat-no" title="statement not covered" >Math.min(maxSize / width, maxSize / height);</span> | ||
| <span class="cstat-no" title="statement not covered" > width = Math.round(width * scale);</span> | ||
| <span class="cstat-no" title="statement not covered" > height = Math.round(height * scale);</span> | ||
| } | ||
| // Create canvas and draw image | ||
| const canvas = <span class="cstat-no" title="statement not covered" >createCanvas(width, height);</span> | ||
| const ctx = <span class="cstat-no" title="statement not covered" >canvas.getContext('2d');</span> | ||
| <span class="cstat-no" title="statement not covered" > ctx.drawImage(img, 0, 0, width, height);</span> | ||
| <span class="cstat-no" title="statement not covered" > return canvas;</span> | ||
| } | ||
| | ||
| /** | ||
| * Save canvas to file | ||
| * @param {Canvas} canvas - Canvas to save | ||
| * @param {string} outputPath - Output file path | ||
| */ | ||
| async function <span class="fstat-no" title="function not covered" >saveCanvas(</span>canvas, outputPath) { | ||
| const buffer = <span class="cstat-no" title="statement not covered" >canvas.toBuffer('image/png');</span> | ||
| <span class="cstat-no" title="statement not covered" > await fs.writeFile(outputPath, buffer);</span> | ||
| } | ||
| | ||
| module.exports = { | ||
| plotBoundingBoxes, | ||
| plotSegmentationMasks, | ||
| loadImageToCanvas, | ||
| saveCanvas, | ||
| COLORS | ||
| }; | ||
| </pre></td></tr></table></pre> | ||
| <div class='push'></div><!-- for sticky footer --> | ||
| </div><!-- /wrapper --> | ||
| <div class='footer quiet pad2 space-top1 center small'> | ||
| Code coverage generated by | ||
| <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a> | ||
| at 2025-12-05T12:32:55.225Z | ||
| </div> | ||
| <script src="prettify.js"></script> | ||
| <script> | ||
| window.onload = function () { | ||
| prettyPrint(); | ||
| }; | ||
| </script> | ||
| <script src="sorter.js"></script> | ||
| <script src="block-navigation.js"></script> | ||
| </body> | ||
| </html> | ||
Sorry, the diff of this file is not supported yet
| module.exports = { | ||
| testEnvironment: 'node', | ||
| testMatch: ['**/test/**/*.test.js'], | ||
| coverageDirectory: 'coverage', | ||
| collectCoverageFrom: [ | ||
| 'src/**/*.js', | ||
| '!src/index.d.ts', | ||
| '!src/**/*.test.js' | ||
| ], | ||
| coveragePathIgnorePatterns: [ | ||
| '/node_modules/' | ||
| ], | ||
| verbose: true, | ||
| testTimeout: 10000 | ||
| }; |
| #!/usr/bin/env node | ||
| /** | ||
| * Pre-deployment verification script | ||
| * Run this before publishing to npm to ensure everything is ready | ||
| */ | ||
| const { execSync } = require('child_process'); | ||
| const fs = require('fs'); | ||
| const path = require('path'); | ||
| console.log('🔍 Running pre-deployment checks...\n'); | ||
| let hasErrors = false; | ||
| // Check 1: Run tests | ||
| console.log('1️⃣ Running tests...'); | ||
| try { | ||
| execSync('npm test', { stdio: 'inherit' }); | ||
| console.log('✅ All tests passed\n'); | ||
| } catch (error) { | ||
| console.error('❌ Tests failed\n'); | ||
| hasErrors = true; | ||
| } | ||
| // Check 2: Check for required files | ||
| console.log('2️⃣ Checking required files...'); | ||
| const requiredFiles = [ | ||
| 'package.json', | ||
| 'README.md', | ||
| 'LICENSE', | ||
| 'src/index.js', | ||
| 'src/core.js', | ||
| 'src/models.js', | ||
| 'src/utils.js', | ||
| 'bin/cli.js' | ||
| ]; | ||
| let allFilesExist = true; | ||
| for (const file of requiredFiles) { | ||
| if (!fs.existsSync(path.join(__dirname, '..', file))) { | ||
| console.error(`❌ Missing required file: ${file}`); | ||
| allFilesExist = false; | ||
| hasErrors = true; | ||
| } | ||
| } | ||
| if (allFilesExist) { | ||
| console.log('✅ All required files present\n'); | ||
| } | ||
| // Check 3: Verify package.json | ||
| console.log('3️⃣ Verifying package.json...'); | ||
| const pkg = require('../package.json'); | ||
| const requiredFields = ['name', 'version', 'description', 'main', 'author', 'license']; | ||
| let allFieldsPresent = true; | ||
| for (const field of requiredFields) { | ||
| if (!pkg[field]) { | ||
| console.error(`❌ Missing required field in package.json: ${field}`); | ||
| allFieldsPresent = false; | ||
| hasErrors = true; | ||
| } | ||
| } | ||
| if (allFieldsPresent) { | ||
| console.log('✅ package.json is valid\n'); | ||
| } | ||
| // Check 4: Verify dependencies | ||
| console.log('4️⃣ Checking dependencies...'); | ||
| const requiredDeps = ['@google/generative-ai', 'canvas', 'commander']; | ||
| let allDepsPresent = true; | ||
| for (const dep of requiredDeps) { | ||
| if (!pkg.dependencies || !pkg.dependencies[dep]) { | ||
| console.error(`❌ Missing required dependency: ${dep}`); | ||
| allDepsPresent = false; | ||
| hasErrors = true; | ||
| } | ||
| } | ||
| if (allDepsPresent) { | ||
| console.log('✅ All dependencies present\n'); | ||
| } | ||
| // Check 5: Test coverage | ||
| console.log('5️⃣ Running test coverage...'); | ||
| try { | ||
| execSync('npm run test:coverage -- --silent', { stdio: 'pipe' }); | ||
| console.log('✅ Coverage report generated\n'); | ||
| } catch (error) { | ||
| console.error('❌ Coverage check failed\n'); | ||
| hasErrors = true; | ||
| } | ||
| // Final result | ||
| console.log('━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━'); | ||
| if (hasErrors) { | ||
| console.log('❌ Pre-deployment checks failed!'); | ||
| console.log('Please fix the issues above before deploying.\n'); | ||
| process.exit(1); | ||
| } else { | ||
| console.log('✅ All pre-deployment checks passed!'); | ||
| console.log('Your package is ready to deploy.\n'); | ||
| console.log('To publish to npm, run: npm publish\n'); | ||
| process.exit(0); | ||
| } |
+131
| # Testing Summary for vsegments | ||
| ## Overview | ||
| Comprehensive test suite created for the vsegments library with **59 passing tests** covering all major components. | ||
| ## Test Files Created | ||
| ### 1. `test/models.test.js` (12 tests) | ||
| Tests for data models: | ||
| - **BoundingBox**: Constructor, coordinate conversion (`toAbsolute`), API response parsing | ||
| - **SegmentationMask**: Constructor, buffer handling | ||
| - **SegmentationResult**: Container functionality, length getter | ||
| ### 2. `test/utils.test.js` (12 tests) | ||
| Tests for utility functions: | ||
| - **parseJson**: Clean JSON, markdown fence removal, whitespace handling | ||
| - **parseBoundingBoxes**: Single/multiple boxes, markdown fencing, validation | ||
| - **parseSegmentationMasks**: Empty arrays, validation | ||
| ### 3. `test/core.test.js` (21 tests) | ||
| Tests for VSegments core class: | ||
| - **Constructor**: API key handling, environment variables, custom configurations | ||
| - **_getMimeType**: File extension detection (jpg, png, gif, webp) | ||
| - **_getSystemInstructions**: Default and custom instructions | ||
| - **API methods**: Method availability checks | ||
| ### 4. `test/integration.test.js` (10 tests) | ||
| Library integration tests: | ||
| - Module exports verification | ||
| - Instance creation | ||
| - Cross-component integration | ||
| ### 5. `test/cli.test.js` (4 tests) | ||
| CLI validation: | ||
| - File existence | ||
| - Shebang validation | ||
| - Module requirements | ||
| ## Test Infrastructure | ||
| ### Configuration Files | ||
| - **`jest.config.js`**: Jest test configuration | ||
| - **`test/fixtures/mockResponses.js`**: Mock API responses for testing | ||
| ### Package Scripts | ||
| ```bash | ||
| npm test # Run all tests | ||
| npm run test:watch # Run tests in watch mode | ||
| npm run test:coverage # Run tests with coverage report | ||
| npm run pre-deploy # Run full pre-deployment validation | ||
| ``` | ||
| ## Coverage Summary | ||
| Tests cover: | ||
| - ✅ Data models (100%) | ||
| - ✅ Utility functions (parsing, validation) | ||
| - ✅ Core class initialization and configuration | ||
| - ✅ MIME type detection | ||
| - ✅ System instruction generation | ||
| - ✅ Module exports | ||
| - ✅ CLI structure | ||
| ## Pre-Deployment Checklist | ||
| Run before deploying: | ||
| ```bash | ||
| npm run pre-deploy | ||
| ``` | ||
| This script verifies: | ||
| 1. ✅ All tests pass | ||
| 2. ✅ Required files present | ||
| 3. ✅ package.json is valid | ||
| 4. ✅ Dependencies are installed | ||
| 5. ✅ Coverage report generates | ||
| ## Test Results | ||
| ``` | ||
| Test Suites: 5 passed, 5 total | ||
| Tests: 59 passed, 59 total | ||
| Snapshots: 0 total | ||
| Time: ~0.5s | ||
| ``` | ||
| ## Notes | ||
| ### What's Tested | ||
| - ✅ Core functionality (initialization, configuration) | ||
| - ✅ Data models (BoundingBox, SegmentationMask, SegmentationResult) | ||
| - ✅ Utility functions (parsing, validation) | ||
| - ✅ Module exports and integration | ||
| - ✅ CLI structure | ||
| ### What's Not Tested (Would Require Real API/Images) | ||
| - ⚠️ Actual API calls to Google Gemini | ||
| - ⚠️ Real image loading and processing | ||
| - ⚠️ Actual segmentation/detection operations | ||
| - ⚠️ Canvas rendering and visualization | ||
| - ⚠️ Full CLI execution with images | ||
| These would require: | ||
| - Integration tests with test images | ||
| - Mocking the Google Generative AI SDK | ||
| - Test API keys | ||
| - Canvas rendering verification | ||
| ## Recommendations Before Production | ||
| 1. **Run pre-deployment check**: `npm run pre-deploy` | ||
| 2. **Review coverage**: Check `coverage/` directory after running tests | ||
| 3. **Manual testing**: Test with real images and API keys | ||
| 4. **Version bump**: Update version in `package.json` if needed | ||
| 5. **Documentation**: Ensure README.md is up to date | ||
| ## Quick Start for Testing | ||
| ```bash | ||
| # Install dependencies (already done) | ||
| npm install | ||
| # Run tests | ||
| npm test | ||
| # Run with coverage | ||
| npm run test:coverage | ||
| # Pre-deployment validation | ||
| npm run pre-deploy | ||
| ``` | ||
| All tests are ready and passing! 🎉 |
+9
-2
| { | ||
| "name": "vsegments", | ||
| "version": "0.1.1", | ||
| "version": "0.1.2", | ||
| "description": "Visual segmentation and bounding box detection using Google Gemini AI", | ||
@@ -11,3 +11,6 @@ "main": "src/index.js", | ||
| "scripts": { | ||
| "test": "echo \"Error: no test specified\" && exit 1", | ||
| "test": "jest", | ||
| "test:watch": "jest --watch", | ||
| "test:coverage": "jest --coverage", | ||
| "pre-deploy": "node scripts/pre-deploy.js", | ||
| "lint": "eslint src/**/*.js", | ||
@@ -44,3 +47,7 @@ "format": "prettier --write \"src/**/*.js\"" | ||
| "commander": "^12.0.0" | ||
| }, | ||
| "devDependencies": { | ||
| "@types/jest": "^30.0.0", | ||
| "jest": "^30.2.0" | ||
| } | ||
| } |
Shell access
Supply chain riskThis module accesses the system shell. Accessing the system shell increases the risk of executing arbitrary code.
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
URL strings
Supply chain riskPackage contains fragments of external URLs or IP addresses, which the package may be accessing at runtime.
No tests
QualityPackage does not have any tests. This is a strong signal of a poorly maintained or low quality package.
255326
357.26%31
121.43%1554
102.08%2
Infinity%6
50%1
Infinity%