<?xml version="1.0" ?>
<informationTable xsi:schemaLocation="http://www.sec.gov/edgar/document/thirteenf/informationtable eis_13FDocument.xsd" xmlns="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:n1="http://www.sec.gov/edgar/document/thirteenf/informationtable" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <infoTable>
    <nameOfIssuer>AAON INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.004</titleOfClass>
    <cusip>000360206</cusip>
    <value>124052</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2225944</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2222277</Sole>
      <Shared>0</Shared>
      <None>3667</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ADOBE SYSTEMS INCORPORATED</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00724F101</cusip>
    <value>547</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1080</Sole>
      <Shared>0</Shared>
      <None>120</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALIGN TECHNOLOGY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>016255101</cusip>
    <value>747</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1714</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1654</Sole>
      <Shared>0</Shared>
      <None>60</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHA TEKNOVA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>02080L102</cusip>
    <value>1217</value>
    <shrsOrPrnAmt>
      <sshPrnamt>88110</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>88110</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL A</titleOfClass>
    <cusip>02079K305</cusip>
    <value>542</value>
    <shrsOrPrnAmt>
      <sshPrnamt>195</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>50</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL C</titleOfClass>
    <cusip>02079K107</cusip>
    <value>545</value>
    <shrsOrPrnAmt>
      <sshPrnamt>195</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>50</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALTAIR ENGR INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>021369103</cusip>
    <value>152155</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2362649</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2340434</Sole>
      <Shared>0</Shared>
      <None>22215</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AMGEN INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031162100</cusip>
    <value>322</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1330</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ANSYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03662Q105</cusip>
    <value>1824</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5743</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5173</Sole>
      <Shared>0</Shared>
      <None>570</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APPLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>1441</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5910</Sole>
      <Shared>0</Shared>
      <None>2340</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APTARGROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>038336103</cusip>
    <value>16144</value>
    <shrsOrPrnAmt>
      <sshPrnamt>137392</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>126047</Sole>
      <Shared>0</Shared>
      <None>11345</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AVALARA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05338G106</cusip>
    <value>14220</value>
    <shrsOrPrnAmt>
      <sshPrnamt>142901</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>131541</Sole>
      <Shared>0</Shared>
      <None>11360</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AXON ENTERPRISE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05464C101</cusip>
    <value>137296</value>
    <shrsOrPrnAmt>
      <sshPrnamt>996851</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>982811</Sole>
      <Shared>0</Shared>
      <None>14040</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AZENTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>114340102</cusip>
    <value>122677</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1480178</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1477786</Sole>
      <Shared>0</Shared>
      <None>2392</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALCHEM CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>057665200</cusip>
    <value>138255</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1011373</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1002334</Sole>
      <Shared>0</Shared>
      <None>9039</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>058498106</cusip>
    <value>735</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8162</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6912</Sole>
      <Shared>0</Shared>
      <None>1250</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BERKSHIRE HATHAWAY INC DEL</nameOfIssuer>
    <titleOfClass>CL B NEW</titleOfClass>
    <cusip>084670702</cusip>
    <value>393</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1115</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1115</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIOLIFE SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>09062W204</cusip>
    <value>1304</value>
    <shrsOrPrnAmt>
      <sshPrnamt>57365</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>57365</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIO-TECHNE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>28069</value>
    <shrsOrPrnAmt>
      <sshPrnamt>64819</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>59894</Sole>
      <Shared>0</Shared>
      <None>4925</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKLINE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09239B109</cusip>
    <value>104531</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1427632</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1425082</Sole>
      <Shared>0</Shared>
      <None>2550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>109194100</cusip>
    <value>25259</value>
    <shrsOrPrnAmt>
      <sshPrnamt>190359</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>174954</Sole>
      <Shared>0</Shared>
      <None>15405</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CAREDX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>14167L103</cusip>
    <value>48966</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1323773</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1305238</Sole>
      <Shared>0</Shared>
      <None>18535</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CASELLA WASTE SYS INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>147448104</cusip>
    <value>267935</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3056871</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3013706</Sole>
      <Shared>0</Shared>
      <None>43165</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CODEXIS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192005106</cusip>
    <value>1465</value>
    <shrsOrPrnAmt>
      <sshPrnamt>71040</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>71040</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COGNEX CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>20024</value>
    <shrsOrPrnAmt>
      <sshPrnamt>259552</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>238777</Sole>
      <Shared>0</Shared>
      <None>20775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COMPUTER SVCS INC COM</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>20539A105</cusip>
    <value>56398</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1139357</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1137502</Sole>
      <Shared>0</Shared>
      <None>1855</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CONSTRUCTION PARTNERS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>21044C107</cusip>
    <value>141006</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5386003</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5320010</Sole>
      <Shared>0</Shared>
      <None>65993</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COPART INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>217204106</cusip>
    <value>1066</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8494</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8144</Sole>
      <Shared>0</Shared>
      <None>350</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTAR GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>1120</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16810</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16810</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTCO WHSL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160K105</cusip>
    <value>1385</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2405</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1930</Sole>
      <Shared>0</Shared>
      <None>475</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COUPA SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22266L106</cusip>
    <value>274</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2693</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2693</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CRYOPORT INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.001</titleOfClass>
    <cusip>229050307</cusip>
    <value>1483</value>
    <shrsOrPrnAmt>
      <sshPrnamt>42485</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>42485</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DANAHER CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>408</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1390</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1150</Sole>
      <Shared>0</Shared>
      <None>240</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DEFINITIVE HEALTHCARE CORP</nameOfIssuer>
    <titleOfClass>CLASS A COM</titleOfClass>
    <cusip>24477E103</cusip>
    <value>87110</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3533860</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3477925</Sole>
      <Shared>0</Shared>
      <None>55935</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DESCARTES SYS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>249906108</cusip>
    <value>227084</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3099699</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3064439</Sole>
      <Shared>0</Shared>
      <None>35260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DIGI INTL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>253798102</cusip>
    <value>2128</value>
    <shrsOrPrnAmt>
      <sshPrnamt>98900</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>98900</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOLBY LABORATORIES INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>25659T107</cusip>
    <value>433</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5540</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3810</Sole>
      <Shared>0</Shared>
      <None>1730</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOUGLAS DYNAMICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25960R105</cusip>
    <value>101956</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2947554</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2907829</Sole>
      <Shared>0</Shared>
      <None>39725</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ECOLAB INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>218</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>775</Sole>
      <Shared>0</Shared>
      <None>460</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESCO TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>296315104</cusip>
    <value>69264</value>
    <shrsOrPrnAmt>
      <sshPrnamt>990613</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>988827</Sole>
      <Shared>0</Shared>
      <None>1786</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESSENTIAL UTILS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>29670G102</cusip>
    <value>319</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6237</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5537</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVI INDS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26929N102</cusip>
    <value>20887</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1123570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1093670</Sole>
      <Shared>0</Shared>
      <None>29900</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVOQUA WATER TECHNOLOGIES CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30057T105</cusip>
    <value>61313</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1305079</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1302944</Sole>
      <Shared>0</Shared>
      <None>2135</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXPONENT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30214U102</cusip>
    <value>259446</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2401166</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2370524</Sole>
      <Shared>0</Shared>
      <None>30642</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXXON MOBIL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30231G102</cusip>
    <value>626</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7579</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7429</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FACTSET RESH SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>808</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1861</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1861</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FAIR ISAAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303250104</cusip>
    <value>29247</value>
    <shrsOrPrnAmt>
      <sshPrnamt>62699</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>57699</Sole>
      <Shared>0</Shared>
      <None>5000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FASTENAL CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>1201</value>
    <shrsOrPrnAmt>
      <sshPrnamt>20225</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16925</Sole>
      <Shared>0</Shared>
      <None>3300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIRSTSERVICE CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>33767E202</cusip>
    <value>190541</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1315167</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1295938</Sole>
      <Shared>0</Shared>
      <None>19229</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIVE9 INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>338307101</cusip>
    <value>14235</value>
    <shrsOrPrnAmt>
      <sshPrnamt>128941</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>118256</Sole>
      <Shared>0</Shared>
      <None>10685</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FORTINET INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>1180</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3454</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3454</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FOX FACTORY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>35138V102</cusip>
    <value>149616</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1527471</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1524696</Sole>
      <Shared>0</Shared>
      <None>2775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARMIN LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>H2906T109</cusip>
    <value>459</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3870</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3870</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARTNER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>366651107</cusip>
    <value>17001</value>
    <shrsOrPrnAmt>
      <sshPrnamt>57155</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>52715</Sole>
      <Shared>0</Shared>
      <None>4440</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GENERAC HLDGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>368736104</cusip>
    <value>12914</value>
    <shrsOrPrnAmt>
      <sshPrnamt>43443</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>40013</Sole>
      <Shared>0</Shared>
      <None>3430</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRACO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384109104</cusip>
    <value>21621</value>
    <shrsOrPrnAmt>
      <sshPrnamt>310114</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>285189</Sole>
      <Shared>0</Shared>
      <None>24925</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GUIDEWIRE SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>17554</value>
    <shrsOrPrnAmt>
      <sshPrnamt>185525</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>170590</Sole>
      <Shared>0</Shared>
      <None>14935</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEALTH CATALYST INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42225T107</cusip>
    <value>1581</value>
    <shrsOrPrnAmt>
      <sshPrnamt>60500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>60500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO CORP NEW</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>422806208</cusip>
    <value>22666</value>
    <shrsOrPrnAmt>
      <sshPrnamt>178715</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>164675</Sole>
      <Shared>0</Shared>
      <None>14040</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HELIOS TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42328H109</cusip>
    <value>132027</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1645197</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1642438</Sole>
      <Shared>0</Shared>
      <None>2759</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HENRY JACK &amp; ASSOC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>29100</value>
    <shrsOrPrnAmt>
      <sshPrnamt>147680</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>135970</Sole>
      <Shared>0</Shared>
      <None>11710</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HILLMAN SOLUTIONS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>431636109</cusip>
    <value>94004</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7912777</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7821547</Sole>
      <Shared>0</Shared>
      <None>91230</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HOME DEPOT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>437076102</cusip>
    <value>364</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1215</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1215</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>I3 VERTICALS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>46571Y107</cusip>
    <value>1875</value>
    <shrsOrPrnAmt>
      <sshPrnamt>67295</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>67295</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>884</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1615</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1615</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ILLINOIS TOOL WKS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>452308109</cusip>
    <value>304</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1450</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1180</Sole>
      <Shared>0</Shared>
      <None>270</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTRICON CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46121H109</cusip>
    <value>1319</value>
    <shrsOrPrnAmt>
      <sshPrnamt>55295</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>55295</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUIT</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>461202103</cusip>
    <value>673</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1400</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1365</Sole>
      <Shared>0</Shared>
      <None>35</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>477839104</cusip>
    <value>130147</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1098567</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1087459</Sole>
      <Shared>0</Shared>
      <None>11108</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHNSON &amp; JOHNSON</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>478160104</cusip>
    <value>644</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3635</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2865</Sole>
      <Shared>0</Shared>
      <None>770</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JPMORGAN CHASE &amp; CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46625H100</cusip>
    <value>282</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2066</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1666</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LCI INDS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50189K103</cusip>
    <value>10628</value>
    <shrsOrPrnAmt>
      <sshPrnamt>102376</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>93596</Sole>
      <Shared>0</Shared>
      <None>8780</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LEMAITRE VASCULAR INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>525558201</cusip>
    <value>87357</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1879847</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1876344</Sole>
      <Shared>0</Shared>
      <None>3503</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LIGHTSPEED COMMERCE INC</nameOfIssuer>
    <titleOfClass>SUB VTG SHS</titleOfClass>
    <cusip>53229C107</cusip>
    <value>8338</value>
    <shrsOrPrnAmt>
      <sshPrnamt>273659</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>252999</Sole>
      <Shared>0</Shared>
      <None>20660</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LINDE PLC</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G5494J103</cusip>
    <value>854</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2675</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2175</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MARKEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>570535104</cusip>
    <value>841</value>
    <shrsOrPrnAmt>
      <sshPrnamt>570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>420</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MASTERCARD INCORPORATED</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>427</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1195</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1105</Sole>
      <Shared>0</Shared>
      <None>90</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCK &amp; CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58933Y105</cusip>
    <value>205</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2500</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2500</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCURY SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589378108</cusip>
    <value>172961</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2683639</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2650989</Sole>
      <Shared>0</Shared>
      <None>32650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERIT MED SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589889104</cusip>
    <value>168690</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2535932</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2504000</Sole>
      <Shared>0</Shared>
      <None>31932</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MESA LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>59064R109</cusip>
    <value>133448</value>
    <shrsOrPrnAmt>
      <sshPrnamt>523571</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>523217</Sole>
      <Shared>0</Shared>
      <None>354</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MICROSOFT CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>1193</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3869</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3629</Sole>
      <Shared>0</Shared>
      <None>240</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MODEL N INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>607525102</cusip>
    <value>127616</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4744101</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4740721</Sole>
      <Shared>0</Shared>
      <None>3380</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MONTROSE ENVIRONMENTAL GROUP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>615111101</cusip>
    <value>1489</value>
    <shrsOrPrnAmt>
      <sshPrnamt>28130</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>28130</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NANOSTRING TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>63009R109</cusip>
    <value>1433</value>
    <shrsOrPrnAmt>
      <sshPrnamt>41240</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>41240</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NATIONAL RESH CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>637372202</cusip>
    <value>28877</value>
    <shrsOrPrnAmt>
      <sshPrnamt>728297</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>726969</Sole>
      <Shared>0</Shared>
      <None>1328</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>640491106</cusip>
    <value>119530</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3875795</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3834147</Sole>
      <Shared>0</Shared>
      <None>41648</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NIKE INC</nameOfIssuer>
    <titleOfClass>CL B</titleOfClass>
    <cusip>654106103</cusip>
    <value>449</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3340</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2530</Sole>
      <Shared>0</Shared>
      <None>810</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NOVANTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67000B104</cusip>
    <value>199785</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1404067</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1390427</Sole>
      <Shared>0</Shared>
      <None>13640</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NV5 GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>62945V109</cusip>
    <value>1972</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14792</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>14792</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMEGA FLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>682095104</cusip>
    <value>72551</value>
    <shrsOrPrnAmt>
      <sshPrnamt>558642</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>557645</Sole>
      <Shared>0</Shared>
      <None>997</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMNICELL COM</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68213N109</cusip>
    <value>219011</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1691338</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1667398</Sole>
      <Shared>0</Shared>
      <None>23940</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ORTHOPEDIATRICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68752L100</cusip>
    <value>1738</value>
    <shrsOrPrnAmt>
      <sshPrnamt>32183</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>32183</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PALOMAR HLDGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>69753M105</cusip>
    <value>1591</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24865</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>24865</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PAYCOR HCM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70435P102</cusip>
    <value>118330</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4064917</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4058347</Sole>
      <Shared>0</Shared>
      <None>6570</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PEPSICO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>713448108</cusip>
    <value>243</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1450</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1050</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>POOL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>73278L105</cusip>
    <value>31743</value>
    <shrsOrPrnAmt>
      <sshPrnamt>75069</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>69244</Sole>
      <Shared>0</Shared>
      <None>5825</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROS HOLDINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74346Y103</cusip>
    <value>117279</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3520835</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3515060</Sole>
      <Shared>0</Shared>
      <None>5775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PUBLIC STORAGE</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74460D109</cusip>
    <value>261</value>
    <shrsOrPrnAmt>
      <sshPrnamt>670</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>670</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>Q2 HLDGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74736L109</cusip>
    <value>142798</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2316267</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2286507</Sole>
      <Shared>0</Shared>
      <None>29760</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>QUALTRICS INTL INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>747601201</cusip>
    <value>422</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14766</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>14766</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>RBC BEARINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75524B104</cusip>
    <value>156016</value>
    <shrsOrPrnAmt>
      <sshPrnamt>804703</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>794363</Sole>
      <Shared>0</Shared>
      <None>10340</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REPLIGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>145341</value>
    <shrsOrPrnAmt>
      <sshPrnamt>772719</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>759789</Sole>
      <Shared>0</Shared>
      <None>12930</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROGERS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775133101</cusip>
    <value>43147</value>
    <shrsOrPrnAmt>
      <sshPrnamt>158804</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>158489</Sole>
      <Shared>0</Shared>
      <None>315</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROLLINS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>28578</value>
    <shrsOrPrnAmt>
      <sshPrnamt>815338</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>753476</Sole>
      <Shared>0</Shared>
      <None>61862</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROPER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>937</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1985</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1755</Sole>
      <Shared>0</Shared>
      <None>230</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>S&amp;P GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78409V104</cusip>
    <value>1158</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2822</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2469</Sole>
      <Shared>0</Shared>
      <None>353</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SEMLER SCIENTIFIC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>81684M104</cusip>
    <value>1268</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25595</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>25595</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHOTSPOTTER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82536T107</cusip>
    <value>1324</value>
    <shrsOrPrnAmt>
      <sshPrnamt>47775</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>47775</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHUTTERSTOCK INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>825690100</cusip>
    <value>101237</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1087633</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1085875</Sole>
      <Shared>0</Shared>
      <None>1758</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMPSON MFG INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829073105</cusip>
    <value>151018</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1384978</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1372373</Sole>
      <Shared>0</Shared>
      <None>12605</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMULATIONS PLUS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829214105</cusip>
    <value>113494</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2226240</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2224814</Sole>
      <Shared>0</Shared>
      <None>1426</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82982L103</cusip>
    <value>171019</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1057696</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1046751</Sole>
      <Shared>0</Shared>
      <None>10945</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMUCKER J M CO</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>832696405</cusip>
    <value>494</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3645</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3005</Sole>
      <Shared>0</Shared>
      <None>640</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS COMM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463M107</cusip>
    <value>240482</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1832943</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1815548</Sole>
      <Shared>0</Shared>
      <None>17395</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>STERIS PLC</nameOfIssuer>
    <titleOfClass>SHS USD</titleOfClass>
    <cusip>G8473T100</cusip>
    <value>615</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2545</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2545</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TECSYS INC COM</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>878950104</cusip>
    <value>1170</value>
    <shrsOrPrnAmt>
      <sshPrnamt>45745</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>45745</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TELEFLEX INCORPORATED</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>879369106</cusip>
    <value>20960</value>
    <shrsOrPrnAmt>
      <sshPrnamt>59071</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>54521</Sole>
      <Shared>0</Shared>
      <None>4550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>THUNDERBIRD ENTERTAINMENT GROU</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>88605U107</cusip>
    <value>1976</value>
    <shrsOrPrnAmt>
      <sshPrnamt>588950</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>588950</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRACTOR SUPPLY CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892356106</cusip>
    <value>1281</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5488</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4838</Sole>
      <Shared>0</Shared>
      <None>650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRANSCAT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>893529107</cusip>
    <value>18733</value>
    <shrsOrPrnAmt>
      <sshPrnamt>230873</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>230438</Sole>
      <Shared>0</Shared>
      <None>435</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRANSUNION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89400J107</cusip>
    <value>609</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5895</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5245</Sole>
      <Shared>0</Shared>
      <None>650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TREX CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89531P105</cusip>
    <value>113464</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1736786</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1709501</Sole>
      <Shared>0</Shared>
      <None>27285</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TYLER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>25453</value>
    <shrsOrPrnAmt>
      <sshPrnamt>57212</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>52777</Sole>
      <Shared>0</Shared>
      <None>4435</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>U S PHYSICAL THERAPY</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90337L108</cusip>
    <value>1604</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16125</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16125</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>USERTESTING INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91734E101</cusip>
    <value>1254</value>
    <shrsOrPrnAmt>
      <sshPrnamt>117310</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>117310</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VAIL RESORTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91879Q109</cusip>
    <value>19822</value>
    <shrsOrPrnAmt>
      <sshPrnamt>76159</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>70184</Sole>
      <Shared>0</Shared>
      <None>5975</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VEEVA SYS INC</nameOfIssuer>
    <titleOfClass>CL A COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>768</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3613</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3613</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERICEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92346J108</cusip>
    <value>99250</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2596810</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2592640</Sole>
      <Shared>0</Shared>
      <None>4170</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERISK ANALYTICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92345Y106</cusip>
    <value>1298</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6047</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6047</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERTEX INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>92538J106</cusip>
    <value>51219</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3338909</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3333109</Sole>
      <Shared>0</Shared>
      <None>5800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WASTE CONNECTIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>94106B101</cusip>
    <value>959</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6865</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6415</Sole>
      <Shared>0</Shared>
      <None>450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WATSCO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>22408</value>
    <shrsOrPrnAmt>
      <sshPrnamt>73557</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>67732</Sole>
      <Shared>0</Shared>
      <None>5825</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WD 40 CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929236107</cusip>
    <value>56929</value>
    <shrsOrPrnAmt>
      <sshPrnamt>310695</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>310141</Sole>
      <Shared>0</Shared>
      <None>554</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>955306105</cusip>
    <value>29693</value>
    <shrsOrPrnAmt>
      <sshPrnamt>72296</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>66656</Sole>
      <Shared>0</Shared>
      <None>5640</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WILLDAN GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>96924N100</cusip>
    <value>1348</value>
    <shrsOrPrnAmt>
      <sshPrnamt>43915</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>43915</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WORKIVA INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>98139A105</cusip>
    <value>115367</value>
    <shrsOrPrnAmt>
      <sshPrnamt>977690</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>966150</Sole>
      <Shared>0</Shared>
      <None>11540</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WP CAREY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92936U109</cusip>
    <value>230</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2850</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2850</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>XYLEM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>451</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5290</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4930</Sole>
      <Shared>0</Shared>
      <None>360</None>
    </votingAuthority>
  </infoTable>
</informationTable>
