<?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>3M CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>88579Y101</cusip>
    <value>837</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4830</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4210</Sole>
      <Shared>0</Shared>
      <None>620</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AAON INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.004</titleOfClass>
    <cusip>000360206</cusip>
    <value>82061</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1635333</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1631776</Sole>
      <Shared>0</Shared>
      <None>3557</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBOTT LABS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>002824100</cusip>
    <value>756</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8990</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8990</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ABBVIE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00287Y109</cusip>
    <value>577</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7935</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>7935</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ACI WORLDWIDE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>004498101</cusip>
    <value>92651</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2698054</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2677129</Sole>
      <Shared>0</Shared>
      <None>20925</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ADOBE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>00724F101</cusip>
    <value>392</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1330</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1070</Sole>
      <Shared>0</Shared>
      <None>260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALBANY INTL CORP</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>012348108</cusip>
    <value>30265</value>
    <shrsOrPrnAmt>
      <sshPrnamt>365034</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>356974</Sole>
      <Shared>0</Shared>
      <None>8060</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALIGN TECHNOLOGY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>016255101</cusip>
    <value>570</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2082</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2082</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL C</titleOfClass>
    <cusip>02079K107</cusip>
    <value>243</value>
    <shrsOrPrnAmt>
      <sshPrnamt>225</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>145</Sole>
      <Shared>0</Shared>
      <None>80</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ALPHABET INC</nameOfIssuer>
    <titleOfClass>CAP STK CL A</titleOfClass>
    <cusip>02079K305</cusip>
    <value>238</value>
    <shrsOrPrnAmt>
      <sshPrnamt>220</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>140</Sole>
      <Shared>0</Shared>
      <None>80</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AMGEN INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>031162100</cusip>
    <value>245</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>5484</value>
    <shrsOrPrnAmt>
      <sshPrnamt>26777</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>21117</Sole>
      <Shared>0</Shared>
      <None>5660</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>APPLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>037833100</cusip>
    <value>550</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2780</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1580</Sole>
      <Shared>0</Shared>
      <None>1200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUA AMERICA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>03836W103</cusip>
    <value>252</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6087</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5387</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AQUAVENTURE HLDGS LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G0443N107</cusip>
    <value>314</value>
    <shrsOrPrnAmt>
      <sshPrnamt>15720</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>15720</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>AXON ENTERPRISE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>05464C101</cusip>
    <value>52982</value>
    <shrsOrPrnAmt>
      <sshPrnamt>825135</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>810805</Sole>
      <Shared>0</Shared>
      <None>14330</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BALCHEM CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>057665200</cusip>
    <value>82255</value>
    <shrsOrPrnAmt>
      <sshPrnamt>822800</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>813821</Sole>
      <Shared>0</Shared>
      <None>8979</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIO TECHNE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09073M104</cusip>
    <value>68506</value>
    <shrsOrPrnAmt>
      <sshPrnamt>328584</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>323858</Sole>
      <Shared>0</Shared>
      <None>4726</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BIOLIFE SOLUTIONS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>09062W204</cusip>
    <value>234</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13810</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13810</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKBAUD INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09227Q100</cusip>
    <value>86616</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1037322</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1024907</Sole>
      <Shared>0</Shared>
      <None>12415</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BLACKLINE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>09239B109</cusip>
    <value>61518</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1149659</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1147009</Sole>
      <Shared>0</Shared>
      <None>2650</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BOTTOMLINE TECH DEL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>101388106</cusip>
    <value>87416</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1975952</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1958667</Sole>
      <Shared>0</Shared>
      <None>17285</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>BRIGHT HORIZONS FAM SOL IN D</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>109194100</cusip>
    <value>7262</value>
    <shrsOrPrnAmt>
      <sshPrnamt>48137</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>37712</Sole>
      <Shared>0</Shared>
      <None>10425</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CANTEL MEDICAL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>138098108</cusip>
    <value>137273</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1702289</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1683330</Sole>
      <Shared>0</Shared>
      <None>18959</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CAREDX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>14167L103</cusip>
    <value>400</value>
    <shrsOrPrnAmt>
      <sshPrnamt>11105</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11105</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEFS WHSE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>163086101</cusip>
    <value>48213</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1374765</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1352107</Sole>
      <Shared>0</Shared>
      <None>22658</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CHEVRON CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>166764100</cusip>
    <value>376</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3024</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3024</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CODEXIS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192005106</cusip>
    <value>349</value>
    <shrsOrPrnAmt>
      <sshPrnamt>18910</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18910</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COGNEX CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>192422103</cusip>
    <value>2165</value>
    <shrsOrPrnAmt>
      <sshPrnamt>45124</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>34249</Sole>
      <Shared>0</Shared>
      <None>10875</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CONSTRUCTION PARTNERS INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>21044C107</cusip>
    <value>411</value>
    <shrsOrPrnAmt>
      <sshPrnamt>27360</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>27360</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COPART INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>217204106</cusip>
    <value>5676</value>
    <shrsOrPrnAmt>
      <sshPrnamt>75939</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>59849</Sole>
      <Shared>0</Shared>
      <None>16090</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CORE LABORATORIES N V</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>N22717107</cusip>
    <value>944</value>
    <shrsOrPrnAmt>
      <sshPrnamt>18050</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>14175</Sole>
      <Shared>0</Shared>
      <None>3875</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTAR GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160N109</cusip>
    <value>4400</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7942</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6527</Sole>
      <Shared>0</Shared>
      <None>1415</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>COSTCO WHSL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>22160K105</cusip>
    <value>637</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2410</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1785</Sole>
      <Shared>0</Shared>
      <None>625</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>CRYOPORT INC</nameOfIssuer>
    <titleOfClass>COM PAR $0.001</titleOfClass>
    <cusip>229050307</cusip>
    <value>397</value>
    <shrsOrPrnAmt>
      <sshPrnamt>21695</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>21695</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DANAHER CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>235851102</cusip>
    <value>291</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2035</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1345</Sole>
      <Shared>0</Shared>
      <None>690</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DESCARTES SYS GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>249906108</cusip>
    <value>130773</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3539198</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3507473</Sole>
      <Shared>0</Shared>
      <None>31725</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOLBY LABORATORIES INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>25659T107</cusip>
    <value>411</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6368</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5868</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DORMAN PRODUCTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>258278100</cusip>
    <value>71067</value>
    <shrsOrPrnAmt>
      <sshPrnamt>815548</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>813748</Sole>
      <Shared>0</Shared>
      <None>1800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>DOUGLAS DYNAMICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>25960R105</cusip>
    <value>79267</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1992143</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1962528</Sole>
      <Shared>0</Shared>
      <None>29615</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ECOLAB INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>278865100</cusip>
    <value>280</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1420</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>720</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ESCO TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>296315104</cusip>
    <value>97367</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1178487</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1175859</Sole>
      <Shared>0</Shared>
      <None>2628</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVI INDUSTRIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>26929N102</cusip>
    <value>22772</value>
    <shrsOrPrnAmt>
      <sshPrnamt>595037</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>578297</Sole>
      <Shared>0</Shared>
      <None>16740</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EVOLENT HEALTH INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>30050B101</cusip>
    <value>242</value>
    <shrsOrPrnAmt>
      <sshPrnamt>30390</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>30390</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXPONENT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30214U102</cusip>
    <value>141785</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2422012</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2399723</Sole>
      <Shared>0</Shared>
      <None>22289</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>EXXON MOBIL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>30231G102</cusip>
    <value>1464</value>
    <shrsOrPrnAmt>
      <sshPrnamt>19104</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>18954</Sole>
      <Shared>0</Shared>
      <None>150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FACTSET RESH SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303075105</cusip>
    <value>599</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2091</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2091</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FAIR ISAAC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>303250104</cusip>
    <value>4324</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13769</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10589</Sole>
      <Shared>0</Shared>
      <None>3180</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FASTENAL CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>311900104</cusip>
    <value>940</value>
    <shrsOrPrnAmt>
      <sshPrnamt>28837</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23757</Sole>
      <Shared>0</Shared>
      <None>5080</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIRSTSERVICE CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>33767E202</cusip>
    <value>65886</value>
    <shrsOrPrnAmt>
      <sshPrnamt>686889</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>680643</Sole>
      <Shared>0</Shared>
      <None>6246</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FIVE9 INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>338307101</cusip>
    <value>25849</value>
    <shrsOrPrnAmt>
      <sshPrnamt>503987</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>502862</Sole>
      <Shared>0</Shared>
      <None>1125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FORTINET INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>34959E109</cusip>
    <value>470</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6113</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6113</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>FOX FACTORY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>35138V102</cusip>
    <value>133236</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1614784</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1611259</Sole>
      <Shared>0</Shared>
      <None>3525</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARMIN LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>H2906T109</cusip>
    <value>365</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4570</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3870</Sole>
      <Shared>0</Shared>
      <None>700</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GARTNER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>366651107</cusip>
    <value>4096</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25451</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19876</Sole>
      <Shared>0</Shared>
      <None>5575</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRACO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>384109104</cusip>
    <value>3982</value>
    <shrsOrPrnAmt>
      <sshPrnamt>79356</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>63606</Sole>
      <Shared>0</Shared>
      <None>15750</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GRAND CANYON ED INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>38526M106</cusip>
    <value>92396</value>
    <shrsOrPrnAmt>
      <sshPrnamt>789573</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>787798</Sole>
      <Shared>0</Shared>
      <None>1775</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>GUIDEWIRE SOFTWARE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>40171V100</cusip>
    <value>4748</value>
    <shrsOrPrnAmt>
      <sshPrnamt>46834</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>36784</Sole>
      <Shared>0</Shared>
      <None>10050</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEICO CORP NEW</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>422806208</cusip>
    <value>7480</value>
    <shrsOrPrnAmt>
      <sshPrnamt>72358</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>56958</Sole>
      <Shared>0</Shared>
      <None>15400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HELIOS TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>42328H109</cusip>
    <value>71105</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1532099</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1528793</Sole>
      <Shared>0</Shared>
      <None>3306</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HENRY JACK &amp; ASSOC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>426281101</cusip>
    <value>4293</value>
    <shrsOrPrnAmt>
      <sshPrnamt>32055</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>24630</Sole>
      <Shared>0</Shared>
      <None>7425</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HESKA CORP</nameOfIssuer>
    <titleOfClass>COM RESTRC NEW</titleOfClass>
    <cusip>42805E306</cusip>
    <value>289</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3395</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3395</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HEXCEL CORP NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>428291108</cusip>
    <value>388</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4793</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4793</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>HOME DEPOT INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>437076102</cusip>
    <value>250</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1200</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1200</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IAA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>449253103</cusip>
    <value>1997</value>
    <shrsOrPrnAmt>
      <sshPrnamt>51505</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>39605</Sole>
      <Shared>0</Shared>
      <None>11900</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IDEXX LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>45168D104</cusip>
    <value>3396</value>
    <shrsOrPrnAmt>
      <sshPrnamt>12335</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9780</Sole>
      <Shared>0</Shared>
      <None>2555</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IHS MARKIT LTD</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G47567105</cusip>
    <value>1331</value>
    <shrsOrPrnAmt>
      <sshPrnamt>20896</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17928</Sole>
      <Shared>0</Shared>
      <None>2968</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEGRA LIFESCIENCES HLDGS C</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>457985208</cusip>
    <value>279</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5000</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5000</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>458140100</cusip>
    <value>330</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6900</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6400</Sole>
      <Shared>0</Shared>
      <None>500</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTERNATIONAL BUSINESS MACHS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>459200101</cusip>
    <value>308</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2235</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTRICON CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46121H109</cusip>
    <value>228</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9750</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9750</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>INTUIT</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>461202103</cusip>
    <value>553</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2115</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1735</Sole>
      <Shared>0</Shared>
      <None>380</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>IPG PHOTONICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>44980X109</cusip>
    <value>480</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3115</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3115</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHN BEAN TECHNOLOGIES CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>477839104</cusip>
    <value>91842</value>
    <shrsOrPrnAmt>
      <sshPrnamt>758210</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>747068</Sole>
      <Shared>0</Shared>
      <None>11142</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JOHNSON &amp; JOHNSON</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>478160104</cusip>
    <value>527</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3781</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2931</Sole>
      <Shared>0</Shared>
      <None>850</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>JPMORGAN CHASE &amp; CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>46625H100</cusip>
    <value>306</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2741</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2341</Sole>
      <Shared>0</Shared>
      <None>400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>KIMBERLY CLARK CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>494368103</cusip>
    <value>566</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4250</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4250</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LCI INDS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>50189K103</cusip>
    <value>2832</value>
    <shrsOrPrnAmt>
      <sshPrnamt>31465</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23935</Sole>
      <Shared>0</Shared>
      <None>7530</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LEMAITRE VASCULAR INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>525558201</cusip>
    <value>48719</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1741196</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1737361</Sole>
      <Shared>0</Shared>
      <None>3835</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LIGAND PHARMACEUTICALS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>53220K504</cusip>
    <value>72679</value>
    <shrsOrPrnAmt>
      <sshPrnamt>636699</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>629314</Sole>
      <Shared>0</Shared>
      <None>7385</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>LINDE PLC</nameOfIssuer>
    <titleOfClass>SHS</titleOfClass>
    <cusip>G5494J103</cusip>
    <value>577</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2875</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2155</Sole>
      <Shared>0</Shared>
      <None>720</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MARKEL CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>570535104</cusip>
    <value>941</value>
    <shrsOrPrnAmt>
      <sshPrnamt>864</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>694</Sole>
      <Shared>0</Shared>
      <None>170</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MASTERCARD INC</nameOfIssuer>
    <titleOfClass>CL A</titleOfClass>
    <cusip>57636Q104</cusip>
    <value>466</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1760</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1370</Sole>
      <Shared>0</Shared>
      <None>390</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MATADOR RES CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>576485205</cusip>
    <value>25781</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1296834</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1294006</Sole>
      <Shared>0</Shared>
      <None>2828</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCK &amp; CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>58933Y105</cusip>
    <value>558</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6650</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6650</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERCURY SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589378108</cusip>
    <value>89160</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1267378</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1250608</Sole>
      <Shared>0</Shared>
      <None>16770</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MERIT MED SYS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>589889104</cusip>
    <value>51321</value>
    <shrsOrPrnAmt>
      <sshPrnamt>861670</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>850520</Sole>
      <Shared>0</Shared>
      <None>11150</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MESA LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>59064R109</cusip>
    <value>111186</value>
    <shrsOrPrnAmt>
      <sshPrnamt>455048</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>454612</Sole>
      <Shared>0</Shared>
      <None>436</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MGP INGREDIENTS INC NEW</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>55303J106</cusip>
    <value>82295</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1241064</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1228168</Sole>
      <Shared>0</Shared>
      <None>12896</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>MICROSOFT CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>594918104</cusip>
    <value>667</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4979</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4049</Sole>
      <Shared>0</Shared>
      <None>930</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NANOSTRING TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>63009R109</cusip>
    <value>495</value>
    <shrsOrPrnAmt>
      <sshPrnamt>16320</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>16320</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NATIONAL RESH CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>637372202</cusip>
    <value>36102</value>
    <shrsOrPrnAmt>
      <sshPrnamt>626878</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>625381</Sole>
      <Shared>0</Shared>
      <None>1497</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>640491106</cusip>
    <value>98946</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1593083</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1573474</Sole>
      <Shared>0</Shared>
      <None>19609</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NEOGENOMICS INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>64049M209</cusip>
    <value>260</value>
    <shrsOrPrnAmt>
      <sshPrnamt>11840</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11840</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NIKE INC</nameOfIssuer>
    <titleOfClass>CL B</titleOfClass>
    <cusip>654106103</cusip>
    <value>260</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3100</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2240</Sole>
      <Shared>0</Shared>
      <None>860</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NOVANTA INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>67000B104</cusip>
    <value>65947</value>
    <shrsOrPrnAmt>
      <sshPrnamt>699333</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>697588</Sole>
      <Shared>0</Shared>
      <None>1745</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NV5 GLOBAL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>62945V109</cusip>
    <value>418</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5130</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5130</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>NVE CORP</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>629445206</cusip>
    <value>22585</value>
    <shrsOrPrnAmt>
      <sshPrnamt>324357</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>323800</Sole>
      <Shared>0</Shared>
      <None>557</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMEGA FLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>682095104</cusip>
    <value>322</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4195</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4195</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>OMNICELL INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68213N109</cusip>
    <value>135554</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1575661</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1557986</Sole>
      <Shared>0</Shared>
      <None>17675</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ORTHOPEDIATRICS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>68752L100</cusip>
    <value>405</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10395</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10395</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PAYLOCITY HLDG CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>70438V106</cusip>
    <value>56611</value>
    <shrsOrPrnAmt>
      <sshPrnamt>603401</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>602051</Sole>
      <Shared>0</Shared>
      <None>1350</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PFIZER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>717081103</cusip>
    <value>741</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17108</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>17108</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PLURALSIGHT INC</nameOfIssuer>
    <titleOfClass>COM CL A</titleOfClass>
    <cusip>72941B106</cusip>
    <value>2304</value>
    <shrsOrPrnAmt>
      <sshPrnamt>75979</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>58429</Sole>
      <Shared>0</Shared>
      <None>17550</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>POOL CORPORATION</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>73278L105</cusip>
    <value>5894</value>
    <shrsOrPrnAmt>
      <sshPrnamt>30859</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>24059</Sole>
      <Shared>0</Shared>
      <None>6800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROCTER AND GAMBLE CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>742718109</cusip>
    <value>432</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3940</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3740</Sole>
      <Shared>0</Shared>
      <None>200</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROS HOLDINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>74346Y103</cusip>
    <value>129224</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2042742</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2038267</Sole>
      <Shared>0</Shared>
      <None>4475</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>PROTO LABS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>743713109</cusip>
    <value>66613</value>
    <shrsOrPrnAmt>
      <sshPrnamt>574150</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>572975</Sole>
      <Shared>0</Shared>
      <None>1175</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>RBC BEARINGS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>75524B104</cusip>
    <value>28061</value>
    <shrsOrPrnAmt>
      <sshPrnamt>168222</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>164797</Sole>
      <Shared>0</Shared>
      <None>3425</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>REPLIGEN CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>759916109</cusip>
    <value>145971</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1698329</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1680149</Sole>
      <Shared>0</Shared>
      <None>18180</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROGERS CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775133101</cusip>
    <value>97502</value>
    <shrsOrPrnAmt>
      <sshPrnamt>564966</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>563706</Sole>
      <Shared>0</Shared>
      <None>1260</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROLLINS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>775711104</cusip>
    <value>6353</value>
    <shrsOrPrnAmt>
      <sshPrnamt>177105</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>142023</Sole>
      <Shared>0</Shared>
      <None>35082</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>ROPER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>776696106</cusip>
    <value>381</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1040</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>750</Sole>
      <Shared>0</Shared>
      <None>290</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SHOTSPOTTER INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82536T107</cusip>
    <value>375</value>
    <shrsOrPrnAmt>
      <sshPrnamt>8480</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>8480</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMPSON MANUFACTURING CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829073105</cusip>
    <value>112363</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1690682</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1677331</Sole>
      <Shared>0</Shared>
      <None>13351</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SIMULATIONS PLUS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>829214105</cusip>
    <value>380</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13305</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13305</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SITEONE LANDSCAPE SUPPLY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>82982L103</cusip>
    <value>70772</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1021235</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1006175</Sole>
      <Shared>0</Shared>
      <None>15060</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMITH A O CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>831865209</cusip>
    <value>2224</value>
    <shrsOrPrnAmt>
      <sshPrnamt>47153</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>36923</Sole>
      <Shared>0</Shared>
      <None>10230</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SMUCKER J M CO</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>832696405</cusip>
    <value>707</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6134</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5144</Sole>
      <Shared>0</Shared>
      <None>990</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SOTHEBYS</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>835898107</cusip>
    <value>59190</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1018238</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1016028</Sole>
      <Shared>0</Shared>
      <None>2210</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>SPS COMMERCE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>78463M107</cusip>
    <value>67278</value>
    <shrsOrPrnAmt>
      <sshPrnamt>658236</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>651264</Sole>
      <Shared>0</Shared>
      <None>6972</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TELEFLEX INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>879369106</cusip>
    <value>4812</value>
    <shrsOrPrnAmt>
      <sshPrnamt>14532</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>11407</Sole>
      <Shared>0</Shared>
      <None>3125</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRACTOR SUPPLY CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>892356106</cusip>
    <value>767</value>
    <shrsOrPrnAmt>
      <sshPrnamt>7045</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5745</Sole>
      <Shared>0</Shared>
      <None>1300</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TREX CO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>89531P105</cusip>
    <value>87953</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1226675</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1209735</Sole>
      <Shared>0</Shared>
      <None>16940</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TRIMBLE INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>896239100</cusip>
    <value>588</value>
    <shrsOrPrnAmt>
      <sshPrnamt>13029</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13029</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TWIST BIOSCIENCE CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90184D100</cusip>
    <value>276</value>
    <shrsOrPrnAmt>
      <sshPrnamt>9525</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>9525</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>TYLER TECHNOLOGIES INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>902252105</cusip>
    <value>67431</value>
    <shrsOrPrnAmt>
      <sshPrnamt>312153</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>306433</Sole>
      <Shared>0</Shared>
      <None>5720</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>U S PHYSICAL THERAPY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>90337L108</cusip>
    <value>338</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2755</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2755</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNIFI INC</nameOfIssuer>
    <titleOfClass>COM NEW</titleOfClass>
    <cusip>904677200</cusip>
    <value>448</value>
    <shrsOrPrnAmt>
      <sshPrnamt>24640</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>23240</Sole>
      <Shared>0</Shared>
      <None>1400</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>UNION PACIFIC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>907818108</cusip>
    <value>902</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5332</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>5332</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VAIL RESORTS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>91879Q109</cusip>
    <value>3847</value>
    <shrsOrPrnAmt>
      <sshPrnamt>17236</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>13541</Sole>
      <Shared>0</Shared>
      <None>3695</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VEEVA SYS INC</nameOfIssuer>
    <titleOfClass>CL A COM</titleOfClass>
    <cusip>922475108</cusip>
    <value>397</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2450</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2450</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERISK ANALYTICS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92345Y106</cusip>
    <value>1003</value>
    <shrsOrPrnAmt>
      <sshPrnamt>6847</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>6277</Sole>
      <Shared>0</Shared>
      <None>570</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VERIZON COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92343V104</cusip>
    <value>216</value>
    <shrsOrPrnAmt>
      <sshPrnamt>3773</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3773</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>VOCERA COMMUNICATIONS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92857F107</cusip>
    <value>75056</value>
    <shrsOrPrnAmt>
      <sshPrnamt>2351367</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>2346292</Sole>
      <Shared>0</Shared>
      <None>5075</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>W P CAREY INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>92936U109</cusip>
    <value>394</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4850</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3850</Sole>
      <Shared>0</Shared>
      <None>1000</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WABTEC CORP</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929740108</cusip>
    <value>344</value>
    <shrsOrPrnAmt>
      <sshPrnamt>4788</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>4338</Sole>
      <Shared>0</Shared>
      <None>450</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WAGEWORKS INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>930427109</cusip>
    <value>70611</value>
    <shrsOrPrnAmt>
      <sshPrnamt>1390262</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>1375082</Sole>
      <Shared>0</Shared>
      <None>15180</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WATSCO INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>942622200</cusip>
    <value>4127</value>
    <shrsOrPrnAmt>
      <sshPrnamt>25236</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>19436</Sole>
      <Shared>0</Shared>
      <None>5800</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WD-40 CO</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>929236107</cusip>
    <value>42059</value>
    <shrsOrPrnAmt>
      <sshPrnamt>264453</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>263911</Sole>
      <Shared>0</Shared>
      <None>542</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WEST PHARMACEUTICAL SVSC INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>955306105</cusip>
    <value>4981</value>
    <shrsOrPrnAmt>
      <sshPrnamt>39803</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>31433</Sole>
      <Shared>0</Shared>
      <None>8370</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>WILLDAN GROUP INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>96924N100</cusip>
    <value>398</value>
    <shrsOrPrnAmt>
      <sshPrnamt>10680</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>10680</Sole>
      <Shared>0</Shared>
      <None>0</None>
    </votingAuthority>
  </infoTable>
  <infoTable>
    <nameOfIssuer>XYLEM INC</nameOfIssuer>
    <titleOfClass>COM</titleOfClass>
    <cusip>98419M100</cusip>
    <value>448</value>
    <shrsOrPrnAmt>
      <sshPrnamt>5360</sshPrnamt>
      <sshPrnamtType>SH</sshPrnamtType>
    </shrsOrPrnAmt>
    <investmentDiscretion>SOLE</investmentDiscretion>
    <votingAuthority>
      <Sole>3930</Sole>
      <Shared>0</Shared>
      <None>1430</None>
    </votingAuthority>
  </infoTable>
</informationTable>
