Acquisitions - Additional Information (Details)
$ in Thousands
12 Months Ended
Dec. 31, 2020
USD ($)
Jul. 08, 2019
USD ($)
intangible_asset
Jan. 23, 2018
USD ($)
intangible_asset
Dec. 31, 2020
USD ($)
Dec. 31, 2019
USD ($)
Dec. 31, 2018
USD ($)
Acquired Finite-Lived Intangible Assets [Line Items]            
Purchase price, net of cash acquired       $ 133,609 $ 45,074 $ 36,855
Weighted average remaining useful life         7 years  
Goodwill $ 339,702     339,702 $ 261,983 233,619
Amortization of intangible assets       4,029 3,111 1,999
Zenetex            
Acquired Finite-Lived Intangible Assets [Line Items]            
Consideration transferred 118,100          
Purchase price, net of cash acquired 121,200          
Working capital shortfall $ 3,000          
Weighted average remaining useful life 8 years          
Goodwill $ 66,925     66,925    
Pro forma revenue       238,000 208,800  
Acquisition-related costs 4,200       $ 1,000 $ 800
HHB            
Acquired Finite-Lived Intangible Assets [Line Items]            
Consideration transferred 15,500          
Goodwill 10,600     $ 10,600    
Advantor            
Acquired Finite-Lived Intangible Assets [Line Items]            
Consideration transferred   $ 45,100        
Purchase price, net of cash acquired   44,000        
Weighted average remaining useful life       3 years 6 months    
Goodwill   28,511        
Working capital adjustment   $ 1,100        
Number of intangible assets acquired | intangible_asset   2        
Amortization of intangible assets       $ 1,700    
SENTEL            
Acquired Finite-Lived Intangible Assets [Line Items]            
Consideration transferred     $ 36,900      
Purchase price, net of cash acquired     36,000      
Goodwill     16,689      
Working capital adjustment     $ 900      
Number of intangible assets acquired | intangible_asset     2      
Percentage of outstanding common stock acquired     100.00%      
Trade names and other | Advantor            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets   $ 1,100        
Useful life   4 years 6 months        
Customer contracts | Zenetex            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets $ 33,200     33,200    
Useful life 8 years          
Customer contracts | HHB            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets $ 4,000     $ 4,000    
Useful life       8 years    
Weighted average remaining useful life       8 years    
Customer contracts | Advantor            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets   $ 7,200        
Useful life   5 years        
Order or Production Backlog | SENTEL            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets     $ 6,500      
Useful life     4 years      
Contract Re-competes | SENTEL            
Acquired Finite-Lived Intangible Assets [Line Items]            
Intangible assets     $ 4,000      
Useful life     8 years