<?xml version="1.0" encoding="UTF-8"?>
<coverage generated="1786230665">
  <project timestamp="1786230665">
    <file name="/src/src/IPSet.php">
      <class name="Wikimedia\IPSet" namespace="global">
        <metrics complexity="31" methods="5" coveredmethods="5" conditionals="0" coveredconditionals="0" statements="87" coveredstatements="87" elements="92" coveredelements="92"/>
      </class>
      <line num="90" type="method" name="__construct" visibility="public" complexity="2" crap="2" count="12"/>
      <line num="91" type="stmt" count="12"/>
      <line num="92" type="stmt" count="10"/>
      <line num="102" type="method" name="addCidr" visibility="private" complexity="19" crap="19" count="10"/>
      <line num="104" type="stmt" count="10"/>
      <line num="105" type="stmt" count="8"/>
      <line num="106" type="stmt" count="8"/>
      <line num="108" type="stmt" count="6"/>
      <line num="109" type="stmt" count="6"/>
      <line num="113" type="stmt" count="10"/>
      <line num="114" type="stmt" count="5"/>
      <line num="115" type="stmt" count="5"/>
      <line num="117" type="stmt" count="8"/>
      <line num="118" type="stmt" count="8"/>
      <line num="119" type="stmt" count="2"/>
      <line num="120" type="stmt" count="2"/>
      <line num="124" type="stmt" count="8"/>
      <line num="127" type="stmt" count="8"/>
      <line num="128" type="stmt" count="8"/>
      <line num="129" type="stmt" count="1"/>
      <line num="135" type="stmt" count="7"/>
      <line num="136" type="stmt" count="7"/>
      <line num="137" type="stmt" count="7"/>
      <line num="138" type="stmt" count="7"/>
      <line num="139" type="stmt" count="7"/>
      <line num="140" type="stmt" count="7"/>
      <line num="142" type="stmt" count="2"/>
      <line num="145" type="stmt" count="7"/>
      <line num="147" type="stmt" count="7"/>
      <line num="148" type="stmt" count="7"/>
      <line num="151" type="stmt" count="7"/>
      <line num="152" type="stmt" count="7"/>
      <line num="153" type="stmt" count="7"/>
      <line num="154" type="stmt" count="7"/>
      <line num="157" type="stmt" count="7"/>
      <line num="159" type="stmt" count="7"/>
      <line num="160" type="stmt" count="7"/>
      <line num="162" type="stmt" count="6"/>
      <line num="166" type="stmt" count="7"/>
      <line num="167" type="stmt" count="7"/>
      <line num="168" type="stmt" count="7"/>
      <line num="170" type="stmt" count="7"/>
      <line num="171" type="stmt" count="7"/>
      <line num="172" type="stmt" count="7"/>
      <line num="173" type="stmt" count="7"/>
      <line num="177" type="stmt" count="5"/>
      <line num="178" type="stmt" count="5"/>
      <line num="179" type="stmt" count="5"/>
      <line num="180" type="stmt" count="4"/>
      <line num="181" type="stmt" count="5"/>
      <line num="183" type="stmt" count="5"/>
      <line num="186" type="stmt" count="6"/>
      <line num="187" type="stmt" count="6"/>
      <line num="188" type="stmt" count="6"/>
      <line num="190" type="stmt" count="6"/>
      <line num="192" type="stmt" count="6"/>
      <line num="193" type="stmt" count="6"/>
      <line num="205" type="method" name="match" visibility="public" complexity="8" crap="8" count="9"/>
      <line num="207" type="stmt" count="9"/>
      <line num="208" type="stmt" count="9"/>
      <line num="209" type="stmt" count="1"/>
      <line num="212" type="stmt" count="8"/>
      <line num="213" type="stmt" count="8"/>
      <line num="215" type="stmt" count="5"/>
      <line num="218" type="stmt" count="8"/>
      <line num="219" type="stmt" count="8"/>
      <line num="220" type="stmt" count="8"/>
      <line num="221" type="stmt" count="8"/>
      <line num="222" type="stmt" count="7"/>
      <line num="223" type="stmt" count="7"/>
      <line num="224" type="stmt" count="7"/>
      <line num="225" type="stmt" count="7"/>
      <line num="227" type="stmt" count="7"/>
      <line num="229" type="stmt" count="6"/>
      <line num="230" type="stmt" count="6"/>
      <line num="232" type="stmt" count="6"/>
      <line num="233" type="stmt" count="6"/>
      <line num="236" type="stmt" count="6"/>
      <line num="237" type="stmt" count="6"/>
      <line num="238" type="stmt" count="6"/>
      <line num="242" type="stmt" count="8"/>
      <line num="245" type="method" name="newFromJson" visibility="public" complexity="1" crap="1" count="2"/>
      <line num="246" type="stmt" count="2"/>
      <line num="247" type="stmt" count="2"/>
      <line num="248" type="stmt" count="2"/>
      <line num="249" type="stmt" count="2"/>
      <line num="251" type="stmt" count="2"/>
      <line num="254" type="method" name="jsonSerialize" visibility="public" complexity="1" crap="1" count="1"/>
      <line num="255" type="stmt" count="1"/>
      <line num="256" type="stmt" count="1"/>
      <line num="257" type="stmt" count="1"/>
      <line num="258" type="stmt" count="1"/>
      <metrics loc="261" ncloc="156" classes="1" methods="5" coveredmethods="5" conditionals="0" coveredconditionals="0" statements="87" coveredstatements="87" elements="92" coveredelements="92"/>
    </file>
    <file name="/src/src/IPUtils.php">
      <class name="Wikimedia\IPUtils" namespace="global">
        <metrics complexity="129" methods="35" coveredmethods="29" conditionals="0" coveredconditionals="0" statements="261" coveredstatements="254" elements="296" coveredelements="283"/>
      </class>
      <line num="85" type="method" name="isIPAddress" visibility="public" complexity="2" crap="2" count="14"/>
      <line num="86" type="stmt" count="14"/>
      <line num="97" type="method" name="isIPv6" visibility="public" complexity="1" crap="1" count="175"/>
      <line num="98" type="stmt" count="175"/>
      <line num="109" type="method" name="isIPv4" visibility="public" complexity="1" crap="1" count="114"/>
      <line num="110" type="stmt" count="114"/>
      <line num="123" type="method" name="isValid" visibility="public" complexity="2" crap="2" count="2"/>
      <line num="125" type="stmt" count="2"/>
      <line num="134" type="method" name="isValidIPv4" visibility="public" complexity="1" crap="1" count="10"/>
      <line num="135" type="stmt" count="10"/>
      <line num="148" type="method" name="isValidIPv6" visibility="public" complexity="1" crap="1" count="27"/>
      <line num="149" type="stmt" count="27"/>
      <line num="159" type="method" name="isValidIPv4Range" visibility="private" complexity="1" crap="1" count="48"/>
      <line num="160" type="stmt" count="48"/>
      <line num="170" type="method" name="isValidIPv6Range" visibility="private" complexity="1" crap="1" count="53"/>
      <line num="171" type="stmt" count="53"/>
      <line num="190" type="method" name="isValidRange" visibility="public" complexity="2" crap="2" count="44"/>
      <line num="192" type="stmt" count="44"/>
      <line num="202" type="method" name="sanitizeIPv4" visibility="private" complexity="2" crap="2.06" count="57"/>
      <line num="203" type="stmt" count="57"/>
      <line num="204" type="stmt" count="57"/>
      <line num="205" type="stmt" count="0"/>
      <line num="208" type="stmt" count="57"/>
      <line num="218" type="method" name="sanitizeIPv6" visibility="private" complexity="7" crap="7" count="78"/>
      <line num="219" type="stmt" count="78"/>
      <line num="220" type="stmt" count="78"/>
      <line num="221" type="stmt" count="0"/>
      <line num="224" type="stmt" count="78"/>
      <line num="226" type="stmt" count="78"/>
      <line num="227" type="stmt" count="78"/>
      <line num="230" type="stmt" count="53"/>
      <line num="231" type="stmt" count="53"/>
      <line num="232" type="stmt" count="31"/>
      <line num="233" type="stmt" count="38"/>
      <line num="235" type="stmt" count="53"/>
      <line num="236" type="stmt" count="15"/>
      <line num="238" type="stmt" count="15"/>
      <line num="240" type="stmt" count="15"/>
      <line num="242" type="stmt" count="41"/>
      <line num="243" type="stmt" count="23"/>
      <line num="244" type="stmt" count="23"/>
      <line num="246" type="stmt" count="23"/>
      <line num="249" type="stmt" count="26"/>
      <line num="250" type="stmt" count="26"/>
      <line num="252" type="stmt" count="26"/>
      <line num="254" type="stmt" count="53"/>
      <line num="255" type="stmt" count="53"/>
      <line num="256" type="stmt" count="53"/>
      <line num="257" type="stmt" count="53"/>
      <line num="260" type="stmt" count="78"/>
      <line num="272" type="method" name="sanitizeIP" visibility="public" complexity="4" crap="4" count="37"/>
      <line num="273" type="stmt" count="37"/>
      <line num="274" type="stmt" count="10"/>
      <line num="276" type="stmt" count="27"/>
      <line num="277" type="stmt" count="21"/>
      <line num="281" type="stmt" count="6"/>
      <line num="282" type="stmt" count="6"/>
      <line num="283" type="stmt" count="3"/>
      <line num="285" type="stmt" count="3"/>
      <line num="296" type="method" name="prettifyIP" visibility="public" complexity="8" crap="8" count="18"/>
      <line num="298" type="stmt" count="18"/>
      <line num="299" type="stmt" count="18"/>
      <line num="300" type="stmt" count="1"/>
      <line num="302" type="stmt" count="17"/>
      <line num="304" type="stmt" count="17"/>
      <line num="305" type="stmt" count="8"/>
      <line num="307" type="stmt" count="9"/>
      <line num="310" type="stmt" count="17"/>
      <line num="311" type="stmt" count="17"/>
      <line num="312" type="stmt" count="17"/>
      <line num="313" type="stmt" count="17"/>
      <line num="314" type="stmt" count="17"/>
      <line num="316" type="stmt" count="17"/>
      <line num="317" type="stmt" count="17"/>
      <line num="318" type="stmt" count="17"/>
      <line num="319" type="stmt" count="17"/>
      <line num="322" type="stmt" count="17"/>
      <line num="324" type="stmt" count="17"/>
      <line num="326" type="stmt" count="17"/>
      <line num="329" type="stmt" count="17"/>
      <line num="330" type="stmt" count="8"/>
      <line num="333" type="stmt" count="17"/>
      <line num="336" type="stmt" count="17"/>
      <line num="355" type="method" name="splitHostAndPort" visibility="public" complexity="8" crap="8" count="12"/>
      <line num="356" type="stmt" count="12"/>
      <line num="357" type="stmt" count="5"/>
      <line num="358" type="stmt" count="3"/>
      <line num="359" type="stmt" count="1"/>
      <line num="362" type="stmt" count="2"/>
      <line num="366" type="stmt" count="2"/>
      <line num="368" type="stmt" count="7"/>
      <line num="369" type="stmt" count="7"/>
      <line num="371" type="stmt" count="3"/>
      <line num="372" type="stmt" count="2"/>
      <line num="376" type="stmt" count="1"/>
      <line num="378" type="stmt" count="4"/>
      <line num="380" type="stmt" count="3"/>
      <line num="381" type="stmt" count="3"/>
      <line num="382" type="stmt" count="2"/>
      <line num="386" type="stmt" count="1"/>
      <line num="390" type="stmt" count="1"/>
      <line num="404" type="method" name="combineHostAndPort" visibility="public" complexity="4" crap="4" count="4"/>
      <line num="405" type="stmt" count="4"/>
      <line num="406" type="stmt" count="2"/>
      <line num="408" type="stmt" count="4"/>
      <line num="409" type="stmt" count="2"/>
      <line num="412" type="stmt" count="2"/>
      <line num="421" type="method" name="formatHex" visibility="public" complexity="2" crap="2" count="30"/>
      <line num="422" type="stmt" count="30"/>
      <line num="424" type="stmt" count="15"/>
      <line num="428" type="stmt" count="15"/>
      <line num="437" type="method" name="hexToOctet" visibility="public" complexity="3" crap="3" count="15"/>
      <line num="439" type="stmt" count="15"/>
      <line num="441" type="stmt" count="15"/>
      <line num="442" type="stmt" count="15"/>
      <line num="444" type="stmt" count="15"/>
      <line num="446" type="stmt" count="15"/>
      <line num="455" type="method" name="hexToQuad" visibility="public" complexity="2" crap="2" count="15"/>
      <line num="457" type="stmt" count="15"/>
      <line num="459" type="stmt" count="15"/>
      <line num="460" type="stmt" count="15"/>
      <line num="461" type="stmt" count="15"/>
      <line num="464" type="stmt" count="15"/>
      <line num="474" type="method" name="isPublic" visibility="public" complexity="2" crap="2" count="12"/>
      <line num="475" type="stmt" count="12"/>
      <line num="476" type="stmt" count="12"/>
      <line num="477" type="stmt" count="1"/>
      <line num="479" type="stmt" count="1"/>
      <line num="481" type="stmt" count="1"/>
      <line num="483" type="stmt" count="1"/>
      <line num="485" type="stmt" count="1"/>
      <line num="487" type="stmt" count="1"/>
      <line num="489" type="stmt" count="1"/>
      <line num="491" type="stmt" count="1"/>
      <line num="493" type="stmt" count="1"/>
      <line num="495" type="stmt" count="1"/>
      <line num="496" type="stmt" count="1"/>
      <line num="498" type="stmt" count="12"/>
      <line num="512" type="method" name="toHex6" visibility="private" complexity="2" crap="2.06" count="46"/>
      <line num="513" type="stmt" count="46"/>
      <line num="514" type="stmt" count="46"/>
      <line num="515" type="stmt" count="0"/>
      <line num="517" type="stmt" count="46"/>
      <line num="527" type="method" name="toHex4" visibility="private" complexity="3" crap="3.04" count="47"/>
      <line num="530" type="stmt" count="47"/>
      <line num="531" type="stmt" count="47"/>
      <line num="532" type="stmt" count="0"/>
      <line num="534" type="stmt" count="47"/>
      <line num="535" type="stmt" count="47"/>
      <line num="542" type="stmt" count="47"/>
      <line num="556" type="method" name="toHex" visibility="public" complexity="3" crap="3" count="60"/>
      <line num="557" type="stmt" count="60"/>
      <line num="558" type="stmt" count="25"/>
      <line num="559" type="stmt" count="35"/>
      <line num="560" type="stmt" count="30"/>
      <line num="562" type="stmt" count="6"/>
      <line num="571" type="method" name="convertIPv6ToRawHex" visibility="private" complexity="2" crap="2" count="57"/>
      <line num="572" type="stmt" count="57"/>
      <line num="573" type="stmt" count="57"/>
      <line num="574" type="stmt" count="57"/>
      <line num="577" type="stmt" count="57"/>
      <line num="587" type="method" name="parseCIDR" visibility="public" complexity="2" crap="2" count="9"/>
      <line num="588" type="stmt" count="9"/>
      <line num="589" type="stmt" count="5"/>
      <line num="591" type="stmt" count="5"/>
      <line num="611" type="method" name="parseRange" visibility="public" complexity="12" crap="12" count="111"/>
      <line num="612" type="stmt" count="111"/>
      <line num="614" type="stmt" count="61"/>
      <line num="615" type="stmt" count="28"/>
      <line num="617" type="stmt" count="33"/>
      <line num="618" type="stmt" count="33"/>
      <line num="619" type="stmt" count="6"/>
      <line num="621" type="stmt" count="27"/>
      <line num="622" type="stmt" count="27"/>
      <line num="624" type="stmt" count="50"/>
      <line num="626" type="stmt" count="37"/>
      <line num="627" type="stmt" count="37"/>
      <line num="628" type="stmt" count="17"/>
      <line num="630" type="stmt" count="20"/>
      <line num="631" type="stmt" count="18"/>
      <line num="632" type="stmt" count="18"/>
      <line num="633" type="stmt" count="18"/>
      <line num="634" type="stmt" count="1"/>
      <line num="637" type="stmt" count="2"/>
      <line num="641" type="stmt" count="13"/>
      <line num="643" type="stmt" count="66"/>
      <line num="644" type="stmt" count="10"/>
      <line num="647" type="stmt" count="56"/>
      <line num="658" type="method" name="parseCIDR4" visibility="private" complexity="7" crap="7.03" count="35"/>
      <line num="659" type="stmt" count="35"/>
      <line num="660" type="stmt" count="35"/>
      <line num="661" type="stmt" count="2"/>
      <line num="663" type="stmt" count="34"/>
      <line num="664" type="stmt" count="34"/>
      <line num="665" type="stmt" count="34"/>
      <line num="666" type="stmt" count="28"/>
      <line num="668" type="stmt" count="28"/>
      <line num="669" type="stmt" count="0"/>
      <line num="672" type="stmt" count="7"/>
      <line num="673" type="stmt" count="7"/>
      <line num="676" type="stmt" count="34"/>
      <line num="687" type="method" name="parseCIDR6" visibility="private" complexity="5" crap="5.12" count="30"/>
      <line num="689" type="stmt" count="30"/>
      <line num="690" type="stmt" count="30"/>
      <line num="691" type="stmt" count="1"/>
      <line num="693" type="stmt" count="29"/>
      <line num="694" type="stmt" count="29"/>
      <line num="695" type="stmt" count="29"/>
      <line num="698" type="stmt" count="29"/>
      <line num="700" type="stmt" count="29"/>
      <line num="702" type="stmt" count="29"/>
      <line num="704" type="stmt" count="0"/>
      <line num="705" type="stmt" count="0"/>
      <line num="708" type="stmt" count="29"/>
      <line num="725" type="method" name="parseRange6" visibility="private" complexity="7" crap="7" count="45"/>
      <line num="726" type="stmt" count="45"/>
      <line num="727" type="stmt" count="45"/>
      <line num="729" type="stmt" count="45"/>
      <line num="731" type="stmt" count="28"/>
      <line num="732" type="stmt" count="28"/>
      <line num="733" type="stmt" count="28"/>
      <line num="735" type="stmt" count="28"/>
      <line num="737" type="stmt" count="28"/>
      <line num="739" type="stmt" count="28"/>
      <line num="741" type="stmt" count="28"/>
      <line num="742" type="stmt" count="28"/>
      <line num="744" type="stmt" count="17"/>
      <line num="746" type="stmt" count="17"/>
      <line num="747" type="stmt" count="17"/>
      <line num="748" type="stmt" count="17"/>
      <line num="749" type="stmt" count="17"/>
      <line num="750" type="stmt" count="2"/>
      <line num="754" type="stmt" count="45"/>
      <line num="755" type="stmt" count="2"/>
      <line num="758" type="stmt" count="43"/>
      <line num="769" type="method" name="isHexInRange" visibility="private" complexity="3" crap="3" count="54"/>
      <line num="770" type="stmt" count="54"/>
      <line num="772" type="stmt" count="54"/>
      <line num="773" type="stmt" count="54"/>
      <line num="784" type="method" name="isInRange" visibility="public" complexity="2" crap="2" count="43"/>
      <line num="785" type="stmt" count="43"/>
      <line num="786" type="stmt" count="43"/>
      <line num="797" type="method" name="isInRanges" visibility="public" complexity="11" crap="11" count="14"/>
      <line num="798" type="stmt" count="14"/>
      <line num="799" type="stmt" count="9"/>
      <line num="800" type="stmt" count="9"/>
      <line num="802" type="stmt" count="9"/>
      <line num="803" type="stmt" count="9"/>
      <line num="805" type="stmt" count="5"/>
      <line num="808" type="stmt" count="5"/>
      <line num="809" type="stmt" count="4"/>
      <line num="810" type="stmt" count="4"/>
      <line num="812" type="stmt" count="4"/>
      <line num="813" type="stmt" count="4"/>
      <line num="815" type="stmt" count="3"/>
      <line num="819" type="stmt" count="6"/>
      <line num="833" type="method" name="canonicalize" visibility="public" complexity="5" crap="5" count="4"/>
      <line num="835" type="stmt" count="4"/>
      <line num="838" type="stmt" count="4"/>
      <line num="839" type="stmt" count="1"/>
      <line num="847" type="stmt" count="4"/>
      <line num="848" type="stmt" count="2"/>
      <line num="853" type="stmt" count="2"/>
      <line num="854" type="stmt" count="2"/>
      <line num="856" type="stmt" count="1"/>
      <line num="860" type="stmt" count="1"/>
      <line num="861" type="stmt" count="1"/>
      <line num="865" type="stmt" count="1"/>
      <line num="874" type="method" name="sanitizeRange" visibility="public" complexity="2" crap="2" count="8"/>
      <line num="875" type="stmt" count="8"/>
      <line num="876" type="stmt" count="8"/>
      <line num="877" type="stmt" count="8"/>
      <line num="878" type="stmt" count="8"/>
      <line num="880" type="stmt" count="2"/>
      <line num="883" type="stmt" count="6"/>
      <line num="892" type="method" name="getSubnet" visibility="public" complexity="3" crap="3" count="3"/>
      <line num="893" type="stmt" count="3"/>
      <line num="894" type="stmt" count="3"/>
      <line num="895" type="stmt" count="3"/>
      <line num="896" type="stmt" count="1"/>
      <line num="897" type="stmt" count="1"/>
      <line num="898" type="stmt" count="2"/>
      <line num="900" type="stmt" count="1"/>
      <line num="902" type="stmt" count="3"/>
      <line num="915" type="method" name="getIPsInRange" visibility="public" complexity="6" crap="6" count="15"/>
      <line num="917" type="stmt" count="15"/>
      <line num="918" type="stmt" count="3"/>
      <line num="921" type="stmt" count="12"/>
      <line num="922" type="stmt" count="12"/>
      <line num="923" type="stmt" count="5"/>
      <line num="926" type="stmt" count="7"/>
      <line num="927" type="stmt" count="4"/>
      <line num="928" type="stmt" count="4"/>
      <line num="931" type="stmt" count="3"/>
      <line num="932" type="stmt" count="3"/>
      <line num="934" type="stmt" count="3"/>
      <metrics loc="937" ncloc="511" classes="1" methods="35" coveredmethods="29" conditionals="0" coveredconditionals="0" statements="261" coveredstatements="254" elements="296" coveredelements="283"/>
    </file>
    <metrics files="2" loc="1198" ncloc="667" classes="2" methods="40" coveredmethods="34" conditionals="0" coveredconditionals="0" statements="348" coveredstatements="341" elements="388" coveredelements="375"/>
  </project>
</coverage>
