
    |hI                    ,   d Z dj                  e D  cg c]
  }  e|        c}       ZddlZddlZddlZddlZddlZdZ	da
 G d de      Z G d de      Zd	 Zd;d
Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Zd Z d Z!d Z"d Z#i fdZ$ G d  d!e      Z% G d" d#e      Z&d$ Z'd% Z(d& Z)d' Z*d( Z+d) Z,d* Z-d+ Z.d, Z/d- Z0d. Z1d/ Z2d0 Z3d1 Z4d2 Z5d3 Z6d4 Z7d5 Z8d6 Z9d7 Z:d8 Z;e<d9k(  r e;        y ed:d:      a
 e        yc c} w )<)	       r   .r   NTc                   B    e Zd Zd Zd Zd Zd Zd Zd Zd Z	d Z
d	 Zy
)Tracec                    || _         | j                   sy ddlm} ddlm} |r |       | _        n?|j                         j                  d      }t        dj                  |      d      | _         |       | _	         |       | _
        d | _        y )Nr   )datetimeStringIOz%Y-%m-%d_%H-%M-%S-%fzcpuinfo_trace_{0}.tracew)
_is_activer   ior
   _outputnowstrftimeopenformat_stdout_stderr_err)self	is_activeis_stored_in_stringr   r
   dates         N/var/www/html/test/engine/venv/lib/python3.12/site-packages/cpuinfo/cpuinfo.py__init__zTrace.__init__+   so    $/		*4<
,,.
!
!"8
94077=sC4<$,$,$)    c                     | j                   sy ddlm}  |       d   }|d   }|d   }| j                  j	                  dj                  |||             | j                  j                          y )Nr   stack      z{0} ({1} {2})
r   inspectr   r   writer   flushr   msgr   framefilelines         r   headerzTrace.header=   s]    	&
'!*%	q$	q$,,&--c4>?,,r   c                     | j                   sy ddlm}  |       d   }|d   }|d   }| j                  j	                  dj                  ||             | j                  j                          y )Nr   r   r    r!   zSuccess ... ({0} {1})

r"   )r   r   r(   r)   r*   s        r   successzTrace.successG   s[    	&
'!*%	q$	q$,,077dCD,,r   c           
      (   | j                   sy ddlm}  |       d   }|d   }|d   }t        |t              rdj                  |j                  d      D cg c]  }d|z   	 c}      dz   }| j                  j                  |       | j                  j                  dj                  |             | j                  j                          y t        |t              rdd	lm}  |       }| j                  j                  d
j                  ||             | j                  j                  dj                  |j                  d      D cg c]  }dj                  |       c}      dz          | j                  j                          y y c c}w c c}w )Nr   r   r    r!    
	zFailed ... ({0} {1})


format_excz	Failed ... ({0} {1})
		{0}
)r   r#   r   
isinstancestrjoinsplitr   r$   r   r%   	Exception	tracebackr3   )	r   r'   r   r(   r)   r*   r3   
err_stringns	            r   failz
Trace.failR   s7   	&
'!*%	q$	q$S	#))D/:$$+:	;d	B3<<c<<077dCD<<#y!#:<<077dCD<<bggj>N>Nt>TU{11!4UVY]]^<< " ; Vs   F
Fc                     | j                   sy ddlm}  |       d   }|d   }|d   }| j                  j	                  dj                  |||             | j                  j                          y )Nr   r      r    r!   z	{0} ({1} {2})
r"   r&   s         r   command_headerzTrace.command_headerg   s]    	&
'!*%	q$	q$,,(//T4@A,,r   c           
      b   | j                   sy | j                  j                  dj                  |             | j                  j                  dj	                  |j                  d      D cg c]  }dj                  |       c}      dz          | j                  j                          y c c}w )Nr4   r/   r0   z			{0}
)r   r   r$   r   r7   r8   r%   )r   r'   outputr<   s       r   command_outputzTrace.command_outputq   s~    	&,,['',-,,RWWv||D?QR!m2215RSVZZ[,, Ss   +B,c           	      L   | j                   sy ddlm}  |       d   }|d   }|d   }| j                  j	                  dj                  ||             |D cg c]  }||v s||v s||   ||   k7  s| }	}|	r:|	D ]4  }| j                  j	                  dj                  |||   ||                6 n| j                  j	                  d       | j                  j	                  dj                  ||             |D cg c]  }||v s||vs| }
}|
r6|
D ]0  }| j                  j	                  d	j                  |||                2 n| j                  j	                  d       | j                  j	                  d
       | j                  j                          y c c}w c c}w )Nr   r   r!   r    z	Changed keys ({0} {1})
z		{0}: {1} to {2}
z		None
z	New keys ({0} {1})
z		{0}: {1}
r0   r"   )r   keysinfonew_infor   r(   r)   r*   keychanged_keysnew_keyss              r   rE   z
Trace.keysx   s   	&
'!*%	q$	q$ ,,188tDE!%h#TRUYZbcfZgMg#h,h VsLL.55c49hsmTUV <<l# ,,-44T4@A!IcSH_DcI(I DsLL'..sHSMBCD <<l#,,T,,# i Js*   	F!F&F2F>	F!F!F!c                     | j                   sy | j                  j                  |dz          | j                  j                          y )Nr0   )r   r   r$   r%   )r   r'   s     r   r$   zTrace.write   s1    	&,,S4Z ,,r   c                     | j                   j                         | j                  j                         | j                  j                         || j                  |dS )N)rB   stdoutstderrrF   erris_fail)r   getvaluer   r   r   )r   rF   rP   s      r   to_dictzTrace.to_dict   sI    \\""$\\""$\\""$
))
 r   N)__name__
__module____qualname__r   r+   r-   r=   r@   rC   rE   r$   rR    r   r   r   r   *   s/    $	*:r   r   c                      e Zd Z ej                         d   Z ej                         Z ej                         j                         dk(  Z
 ej                         Z ej                         d   ZdZed        Zed        Zed        Zed        Zed	        Zed
        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Zed        Z ed        Z!ed        Z"ed        Z#ed        Z$ed        Z%ed        Z&ed        Z'ed        Z(ed        Z)ed        Z*ed        Z+ed         Z,ed!        Z-y")#
DataSourcer   windows   Tc                  @    t         j                  j                  d      S )N/proc/cpuinfo)ospathexistsrV   r   r   has_proc_cpuinfozDataSource.has_proc_cpuinfo   s    		((r   c                  0    t        t        d            dkD  S )Ndmesgr   len_program_pathsrV   r   r   	has_dmesgzDataSource.has_dmesg       	^G$	%	))r   c                     t        j                         j                         j                  d      j                  d      j                         j                         } d| v xr t        j
                  j                  d      S )N"'linux/var/run/dmesg.boot)platformsystemstriplowerr]   r^   r_   )unames    r   has_var_run_dmesg_bootz!DataSource.has_var_run_dmesg_boot   s]    
//

!
!
#
)
)#
.
4
4S
9
?
?
A
G
G
I%	E		Cbggnn-BCCr   c                  0    t        t        d            dkD  S )Ncpufreq-infor   rc   rV   r   r   has_cpufreq_infozDataSource.has_cpufreq_info   s    	^N+	,q	00r   c                  0    t        t        d            dkD  S )Nsestatusr   rc   rV   r   r   has_sestatuszDataSource.has_sestatus   s    	^J'	(1	,,r   c                  0    t        t        d            dkD  S )Nsysctlr   rc   rV   r   r   
has_sysctlzDataSource.has_sysctl       	^H%	&	**r   c                  0    t        t        d            dkD  S )Nisainfor   rc   rV   r   r   has_isainfozDataSource.has_isainfo   s    	^I&	'!	++r   c                  0    t        t        d            dkD  S )Nkstatr   rc   rV   r   r   	has_kstatzDataSource.has_kstat   rg   r   c                     t        j                         j                         j                  d      j                  d      j                         j                         } d| v xs d| v }|xr t	        t        d            dkD  S )Nri   rj   beoshaikusysinfor   )rm   rn   ro   rp   rd   re   )rq   is_beoss     r   has_sysinfozDataSource.has_sysinfo   sl    
//

!
!
#
)
)#
.
4
4S
9
?
?
A
G
G
I%eO/w%/'		7S	23a77r   c                  0    t        t        d            dkD  S )Nlscpur   rc   rV   r   r   	has_lscpuzDataSource.has_lscpu   rg   r   c                  0    t        t        d            dkD  S )Nlspropr   rc   rV   r   r   has_ibm_pa_featureszDataSource.has_ibm_pa_features   r|   r   c                  L    t        g d      \  } }| dk(  xr t        |      dkD  S )N)wmicr]   getVersionr   )_run_and_get_stdoutrd   )
returncoderB   s     r   has_wmiczDataSource.has_wmic   s)    *+KL*f	q	,S[1_,r   c                      t        ddg      S )Ncatr\   r   rV   r   r   cat_proc_cpuinfozDataSource.cat_proc_cpuinfo   s    	e_5	66r   c                      t        dg      S )Nrt   r   rV   r   r   cpufreq_infozDataSource.cpufreq_info   s    	n-	..r   c                      t        ddg      S )Nrw   z-br   rV   r   r   
sestatus_bzDataSource.sestatus_b   s    	j$/	00r   c                      t        ddg      S )Nrb   z-ar   rV   r   r   dmesg_azDataSource.dmesg_a   s    	gt_	--r   c                      t        ddg      S )Nr   rl   r   rV   r   r   cat_var_run_dmesg_bootz!DataSource.cat_var_run_dmesg_boot   s    	e%:;	<<r   c                      t        g d      S )N)rz   zmachdep.cpuhw.cpufrequencyr   rV   r   r   "sysctl_machdep_cpu_hw_cpufrequencyz-DataSource.sysctl_machdep_cpu_hw_cpufrequency   s    	I	JJr   c                      t        ddg      S )Nr~   z-vbr   rV   r   r   
isainfo_vbzDataSource.isainfo_vb   s    	i/	00r   c                      t        g d      S )N)r   z-mcpu_infor   rV   r   r   kstat_m_cpu_infozDataSource.kstat_m_cpu_info   s    	8	99r   c                      t        ddg      S )Nr   z-cpur   rV   r   r   sysinfo_cpuzDataSource.sysinfo_cpu  s    	i0	11r   c                      t        dg      S )Nr   r   rV   r   r   r   zDataSource.lscpu  s    	gY	''r   c                  R    dd l } | j                  d      }|rt        d|d   g      S y )Nr   z(/proc/device-tree/cpus/*/ibm,pa-featuresr   )globr   )r   ibm_featuress     r   ibm_pa_featureszDataSource.ibm_pa_features	  s0    EF,
xa9
:: r   c                      t        g d      S )N)r   cpur   zOName,CurrentClockSpeed,L2CacheSize,L3CacheSize,Description,Caption,Manufacturerz/format:listr   rV   r   r   wmic_cpuzDataSource.wmic_cpu  s    	  W  
X  Xr   c                  :    t        dd      } | j                         S )N.Hardware\Description\System\CentralProcessor\0ProcessorNameString)_read_windows_registry_keyro   )processor_brands    r   winreg_processor_brandz!DataSource.winreg_processor_brand  s    ./`bwx/				  r   c                      t        dd      } | S )Nr   VendorIdentifierr   )vendor_id_raws    r   winreg_vendor_id_rawzDataSource.winreg_vendor_id_raw  s    ,-^`rs-	r   c                      t        dd      } | S )Nz<SYSTEM\CurrentControlSet\Control\Session Manager\EnvironmentPROCESSOR_ARCHITECTUREr   )arch_string_raws    r   winreg_arch_string_rawz!DataSource.winreg_arch_string_raw  s    ./n  qI  J/	r   c                  4    t        dd      } t        |       } | S )Nr   z~Mhz)r   _to_decimal_string)	hz_actuals    r   winreg_hz_actualzDataSource.winreg_hz_actual$  s     ()Z\bc) +)	r   c                      t        dd      } | S )Nr   
FeatureSetr   )feature_bitss    r   winreg_feature_bitszDataSource.winreg_feature_bits*  s    +,]_kl,	r   N).rS   rT   rU   rm   architecturebitsmultiprocessing	cpu_countrn   rp   
is_windowsmachiner   rq   uname_string_raw	can_cpuidstaticmethodr`   rf   rr   ru   rx   r{   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rV   r   r   rX   rX      s   "&_&&(hoo%%'94#8##%"HNN$Q') ) * * D D 1 1 - - + + , , * * 8 8
 * * + + - - 7 7 / / 1 1 . . = = K K 1 1 : : 2 2 ( ( ; ; X X ! !      
  r   rX   c                 0   g }t        d t        j                  j                  dd      j	                  t        j
                              }t        j                  d   j	                  t        j
                        D ]  }t        j                  j                  ||       }t        j                  |t        j                        r|j                  |       |D ]=  }||z   }t        j                  |t        j                        s-|j                  |       ?  |S )NPATHEXTr/   PATH)filterr]   environr   r8   pathsepr^   r7   accessX_OKappend)program_namepathsextspepexts         r   re   re   0  s    	tRZZ^^Ir288DE
**V

"
"2::
. Qggll1l#!YYq"''<<? a
a%4iibgg	LL	 	r   c                    ddl m}m} t        j	                  ddj                  |       z   dz          |s || |||      }n< || |||      } |||j                  ||      }|j                  j                          |j                         \  }}|j                  d	      }|j                  d	      }t        j                  d
t        |j                               t        j                  d|       |j                  |fS )Nr   PopenPIPEzRunning command " z" ...rM   rN   stdin)r   rM   rN   UTF-8encodingzreturn code:zstdout:)
subprocessr   r   g_tracer@   r7   rM   closecommunicatedecoderC   r6   r   )commandpipe_commandr   r   p1p2stdout_outputstderr_outputs           r   r   r   =  s    #+chhw.??'IJ 	WT$d;" WT$d;"\4E"))// !# 0%%w%7%%w%7 	BMM(:;	=1 	}$$r   c                    t         j                  dj                  | |             	 dd l}j                  |j                  |       }|j                  ||      d   }|j                  |       t         j                  dt        |             |S # t        $ r&}	 dd l}n# t        $ r
}Y d }~nd }~ww xY wY d }~d }~ww xY w)Nz*Reading Registry key "{0}" field "{1}" ...r   zvalue:)r   r@   r   _winregImportErrorwinregOpenKeyHKEY_LOCAL_MACHINEQueryValueExCloseKeyrC   r6   )key_name
field_namer   rO   rH   values         r   r   r   W  s    DKKHV`ab ~~f//:			S*	-a	0#e*- 	 	 s5   B 	B=BB8	B0&B8+B00B88B=c                  Z    t        t        j                        \  } }| dvrt        d      y )N)
X86_32X86_64ARM_7ARM_8PPC_64S390XMIPS_32MIPS_64RISCV_32RISCV_64zNpy-cpuinfo currently only works on X86 and some ARM/PPC/S390X/MIPS/RISCV CPUs.)_parse_archrX   r   r9   )archr   s     r   _check_archr  i  s<    *445t  	 	 < 	= =	r   c                     dd l }dd l}| }|j                  |      }|j                  |      }|j	                  d      }|S )Nr   utf8)picklebase64dumps	b64encoder   )thingr  r  abcds          r   _obj_to_b64r  q  s=    
\\!_aXXf	r   c                 ~    dd l }dd l}	 |j                  |       }|j                  |      }|S # t        $ r i cY S w xY wNr   )r  r  	b64decodeloadsr9   )r  r  r  r  r  s        r   _b64_to_objr!  {  sC    u!ll1o!	
( 	)s   #. <<c                     t        | t              r| D cg c]  }t        |       c}S t        | t              r6| j	                         D ci c]  \  }}t        |      t        |       c}}S | S c c}w c c}}w N)r5   list_utf_to_strdictitems)inputelementrH   r  s       r   r%  r%    sq    ud.3	47+g
	44[[]
$sE c
K.
. 
$ $ 
, 
5
$s   A2A7c                 D   g d}t         j                  || |       |D ]  }|j                  |d       r| j                  |d       s	||   | |<   0|dk(  s6|j                  d      sH|d   D ]  }|| d   vs| d   j                  |         | d   j	                           y )N)r   hardware_raw	brand_rawhz_advertised_friendlyhz_actual_friendlyhz_advertisedr   r  r   countr   r   l2_cache_sizel2_cache_line_sizel2_cache_associativitysteppingmodelfamilyprocessor_typeflagsl3_cache_sizel1_data_cache_sizel1_instruction_cache_sizer8  )r   rE   r   r   sort)rF   rG   rE   rH   fs        r   _copy_new_fieldsr>    s    	 	dD(#  S\\#tTXXc4%8}49
g~(,,w/W 7qWtG}33A67=r   c                 R   |j                         D ]  }|D ]  }|j                         }d|v s|j                  dd      \  }}|j                         j                         }|j                         }||k(  sat	        |      dkD  sp| r|j                         r|c c S |c c S   y )N:r    r   )
splitlinesrp   r8   ro   rd   isdigit)cant_be_number
raw_stringfield_namesr*   r  leftrights          r   _get_field_actualrH    s    ""$ T j  ":	Tk**S!$KD%::<DKKMEzc%j1n]]_|l 	r   c                 d    t        | ||      }|r|r		  ||      }||}|S # t        $ r |}Y w xY wr#  )rH  r9   )rC  rD  
convert_todefault_valuerE  retvals         r   
_get_fieldrM    sM    
NJ
D zv6
 N& 
 6s   ! //c                    	 dj                  |       } | j                  dd      } dj                  d | D              j                         } | dk(  rd} d| vrdj                  |       } | j	                  d      } | j                  d      rdj                  |       } t        |       } dj                  |       } | S # t        $ r Y y	w xY w)
N{0},r   r/   c              3   L   K   | ]  }|j                         s|d k(  s|  ywr   NrB  .0r<   s     r   	<genexpr>z%_to_decimal_string.<locals>.<genexpr>  s     <aiikQV!<   $$0z{0}.0z{0}00.0)r   replacer7   ro   rstripendswithfloatr9   )tickss    r   r   r     s    
,,u
%
--S
!% ''<U<
<
B
B
D%
b[5 	>>% 5 ,,s
% ^^C==5 ,%
,,u
%	, 	s   B5B8 8	CCc                    	 t        |       } dj                  |       } | j                  d      }|j                  d      }|j	                  dd      }|j                  ||z   dz   d      }||z   }dj                  |d | ||d        }|j                  d      \  }}t        |      t        |      }}||fS # t        $ r Y yw xY w)NrO  rX  r   r/   r    {0}.{1}r   r   )	r]  r   lstripindexrZ  ljustr8   intr9   )r^  scalehz	old_index	new_indexrF  rG  s          r   _hz_short_to_fullrj    s    
,%
,,u
% ||C"hhsm)	zz#r"	xx	!!#S)"%):I9:7"+$D	3u:$
 	   B2B5 5	C Cc                 b   	 | j                         j                         } d\  }}| j                  d      rd}n'| j                  d      rd}n| j                  d      rd}dj                  d	 | D              j                         }d
|vr|dz  }t	        ||      \  }}||fS # t
        $ r Y yw xY w)NNNghzr   mhz   rg  r   r/   c              3   L   K   | ]  }|j                         s|d k(  s|  ywrR  rS  rT  s     r   rV  z'_hz_friendly_to_full.<locals>.<genexpr>  s     =Qqyy{afq=rW  r   z.0ra  )ro   rp   r\  r7   rj  r9   )	hz_stringrg  rf  s      r   _hz_friendly_to_fullrs    s    oo%%'))"e5% 5$5	ww=)==CCE"	:2E*)"e
e 	s   BB" "	B.-B.c                    	 t        | |      \  }}dj                  ||      }|j                  d      }|j                  dd      }d}d}|dkD  rd}d}n|dkD  rd	}d}n	|d
kD  rd}d
}dj                  |d | dz
   || dz
  d        }dj                  t	        |      |      }|j                  d      }|S # t        $ r Y yw xY w)Nr`  r   r/   Hzr   r   GHzrp  MHzr?   KHzr    z{0:.4f} {1}rX  z	0.0000 Hz)rj  r   rc  rZ  r]  r[  r9   )r^  rf  rF  rG  result	dot_indexsymbols          r   _hz_short_to_friendlyr|    s    !%/+$D%(& ll3)>>#r"& &
%]651}651}65 F9UF1H-vufQhi/@A& fv6&==&	- 	rk  c                     dd l }| s| S dj                  |       } ddddd}|j                         D ]<  \  }}|j                  ||       sdj                  | d d	 j	                         |      c S  | S )
Nr   rO  BKBMBGB)z	^[0-9]+B$z	^[0-9]+K$z	^[0-9]+M$z	^[0-9]+G$z{0} {1})rer   r'  matchro   )r(  r  formatspatternfriendly_sizes        r   _to_friendly_bytesr  /  s    
	,	e	 	  '}} @WmXXgu


5$B<--/
??@ 	r   c                    | j                         }ddiddiddiddiddid	did
diddiddiddig
}	 |D ]{  }t        |j                               d   }t        |j                               d   }|j	                  |      sMt        |j                  |      d   j                               |z  c S  	 | S # t        $ r}Y d }~| S d }~ww xY w)Ngibi   @mibi   kib   gbmbkbgmkr  r    r   )	rp   r$  rE   valuesr\  re  r8   ro   r9   )friendly_bytesr(  r  entryr  
multiplierrO   s          r   _friendly_bytes_to_intr  C  s    				 	;4.
+$-	,) =e%**,"7U\\^$Q':nnWu{{7#A&,,./*<<	= 	 	 s   AB5 /B5 1B5 5	C	C	c                 p   d| j                         vry| j                         }d}|j                  d      rd}n|j                  d      rd}d|v r|j                  d      d	   }n|j                  d d	      d	   }|j	                  d      j	                  d      j                         }t        |      }||fS )
Nrg  rY  r   r   ro  rp  rn  r   @r    )rp   r\  r8   rsplitr[  ro   r   )
cpu_stringrg  rf  s      r   _parse_cpu_brand_stringr  a  s    
  ""		
KK
%kk%
%2I	xx}Q"	yyq!"iie$**,	Ur   c           	         dd l }|j                  d|       D cg c]  }|j                          }}|j                  d|       D cg c]  }|j                          }}t        ||      D ci c]  \  }}||
 }}}|j	                         D 	cg c]  \  }}	| |dz   |	  }}}	d\  }
}}}|D ]  }|j                  d      D ]  }|j                  d      D cg c]  }|j                          }}t        |      dkD  s>|d   |d   }}|dk(  r|j                  d	      }
_|d
k(  rt        |j                  d      d      }|dk(  rt        |j                  d      d      }|dv st        |j                  d      d      }  | j                         }d}|rNd}|D ]D  }dj                  |      }|j                  |      s&|d t        |        j                         }d}F |rNt        |      \  }}|dk(  rG|D ]B  }|}dD ]9  }||v sd|d |j                  |      t        |      z    z   }t        |      \  }} B D ||||
|||fS c c}w c c}w c c}}w c c}	}w c c}w )Nr   z\(z\)r    )NNNNrP  r@  originri   r4  0x   r5  famr6  TFz({0})rY  )rv  rw  ru  zCPU @ )r  finditerstartzipr'  r8   ro   rd   re  rb  r   r\  r  find)r  r  r  startsendsr  vinsidesr  end	vendor_idr4  r5  r6  insidepairr<   namer  brand
is_workingfullhz_brandrf  rg  r  s                             r   _parse_cpu_brand_string_dxr  w  s   
 !kk%<
=1779
=
=KKz:;q;; ./TQAqD//8?H*%JuQw%HH '?#HeV *Vll3 *d"jjo
.1779
.4
.	$i!mq'47%DxS!Y		ELL&+X	d#R(U	"	"%,,t$b)V**  
			* f
..
 4nnT;SYJ%%'EJ	  +515  f2$ u{
R62775>CJ67
7R.r2_Xu
	 
5%HeVDD] >;/H /s   II.III#c                    	 | j                  d      dd  | j                  d      dd  z   | j                  d      dd  z   | j                  d      dd  z   | j                  d      dd  z   | j                  d      dd  z   }|D cg c]$  }|j                  d      d	   j                         & }}|D cg c]  }t        |       }}d }d	}|D ]'  }t        |D cg c]  }|d u c}      }||kD  s$|}|}) |si S |\  }	}
}}}}}d
| v ri| | j	                  d
      d  j                  d      d	   }|j                         j                         }|D cg c]!  }|j                         j                  d      # }}|D cg c]6  }|d	   j                         j                         |d   j                         i8 }}|D ]  }t        |j                               d	   }t        |j                               d	   }|dk(  r|j                  d      }R|dk(  rt        |j                  d      d      }s|dk(  rt        |j                  d      d      }|dv st        |j                  d      d      } g }dD ]<  }|| v s|j                  | j                  |      d   j                  d      d	          > g }|D ]]  }|j                  d      d   j                  d      d	   j                         }|j                  d      D ]  }|j                  |        _ |j                          t        |      \  }}
|dk(  rd}
t        |	      }||||||d}|r#|dk7  rt        ||
      |d<   t        |	|
      |d<   |r#|dk7  rt!        ||
      |d<   t!        |	|
      |d<   |j#                         D ci c]  \  }}|s	|| c}}S c c}w c c}w c c}w c c}w c c}w c c}}w # t$        $ r }t&        j)                  |       Y d }~i S d }~ww xY w)Nz CPU0:r    z CPU1:z CPU:z
CPU0:z
CPU1:z
CPU:r0   r   z	  Origin==r  ri   r4  r  r  r5  r  )z  Features=z  Features2=z  AMD Features=z  AMD Features2=<>rP  rY  rp  )r   r,  r4  r5  r6  r8  r-  r.  r/  r   )r8   ro   r  sumr  rp   r$  rE   r  re  rb  r   r<  r  r   r|  rj  r'  r9   r   r=   )rB   lineslcpu_stringsbest_stringhighest_countr  r<   r0  r   rf  r   r  r4  r5  r6  fieldsfieldr  r  
flag_linescategoryr8  r*   flagr/  rF   r  r  rO   s                                 r   _parse_dmesg_outputr    sG   Y
,,x
 
$
LL12
LL!" LLAB  LLAB	 
 LL12% .3
31774=!!#
3%
3 9>>1+A.>+> +- jz2!235mMK	 

9JUG)UOY% F6;;{+-/55d;A>6LLN  "6+12aQWWY__S!262<BCqadjjl  "QqTZZ\2C6C *u

a D #ExS!Y		ELL&+X	d#R(U	"	"%,,t$b)V* *X @h&fll8,Q/55d;A>?@ % d
**S/!

"
"3
'
*
0
0
24zz# t	LL **, 1A- e5%i0= 
$ }-$9-$O4 ! 5i G4}-,]EB4(E:4::<	-41a1!Q$	--_ 4 ? 3 3Cl 
. 	,,s 		s   BO" )O,O" 2OO" O
#O" 0	O" :AO" &O7O" =;O8BO" (O" >D1O" /
O:O?O" O" "	P+PPc                    dd l }d\  }}| j                         } |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS |j                  d	|       rd
}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd
}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS | dk(  rd}d}||fS | dk(  rd}d}||fS |j                  d|       rd}d}||fS |j                  d|       rd}d}||fS ) Nr   rm  z4^i\d86$|^x86$|^x86_32$|^i86pc$|^ia32$|^ia-32$|^bepc$r      z9^x64$|^x86_64$|^x86_64t$|^i686-64$|^amd64$|^ia64$|^ia-64$r  @   z^armv8-a|aarch64|arm64$r  z/^armv7$|^armv7[a-z]$|^armv7-[a-z]$|^armv6[a-z]$r  z"^armv8$|^armv8[a-z]$|^armv8-[a-z]$z ^ppc32$|^prep$|^pmac$|^powermac$PPC_32z^powerpc$|^ppc64$|^ppc64le$r  z^sparc32$|^sparc$SPARC_32z^sparc64$|^sun4u$|^sun4v$SPARC_64z^s390x$r	  mipsr
  mips64r  z^riscv$|^riscv32$|^riscv32be$r  z^riscv64$|^riscv64be$r  )r  rp   r  )r   r  r  r   s       r   r  r  
  s6   
t"((* HHDoV	$	$\ 
t[ 	hhK_]	$	$V 
tS 	hh)?;	$	$N 
tM 	hhA?S	$	$H 
tG 	hh4oF	$	$B 
t? 	hh2OD	$	$: 
t9 	hh-?	$	$4 
t1 	hh#_5	$	$, 
t+ 	hh+_=	$	$& 
t# 	hhz?+	$	$ 
t 	$	$ 
t !	$	$ 
t 	hh/A	$	$
 
t	 	hh'9	$	$	tr   c                      d|z  }| |z  dkD  }|S )Nr    r   rV   )regbitmaskis_sets       r   _is_bit_setr  C  s    	S
*q.r   c                    t         j                         s| j                  d       yt         j                         \  }}|dk7  r| j                  d       y|j	                         D ]F  }|j                         j                         }|j                  d      s3|j                  d      r y y d}d}|j	                         D ]k  }|j                         j                         }|j                  d      r|j                  d	      rd}F|j                  d
      sX|j                  d	      sjd}m | j                  d|       | j                  d|       | xs | S )NzFailed to find sestatus.Fr   z$Failed to run sestatus. Skipping ...zcurrent mode:	enforcingTallow_execheaponallow_execmemzcan_selinux_exec_heap:zcan_selinux_exec_memory:)
rX   rx   r=   r   rA  ro   rp   
startswithr\  rC   )tracer   rB   r*   can_selinux_exec_heapcan_selinux_exec_memorys         r   _is_selinux_enforcingr  I  sC   !**'(	 !++-V!O**34	   T				$	___%
mmK     "T				$	__%&4==+>'DMM$,?!" .0EF02IJ"	"	A*A&ABr   c                     i }| D ]Q  }| |   }||v r||   |k(  r|||<   |s|dk(  r#|dk(  r)t        |      t        k(  r|j                  d      rM|||<   S |S )Nra  r  rY  )typer6   r  )rF   acceptable_valuesfiltered_inforH   r  s        r   #_filter_dict_keys_with_empty_valuesr  m  s     S
s)% 	%M# 
 f_ b[ 
%[CE,,U3-36 	r   c                   ,    e Zd Zddg fdZd Zd Zd Zy)ASMNrV   c                 t    || _         || _        || _        d | _        d | _        d | _        d | _        d| _        y r  )restypeargtypesmachine_code
prochandlemmfuncaddresssize)r   r  r  r  s       r   r   zASM.__init__  s;    $,$-"$$/$'$)$,$)r   c                    t         j                  d| j                        }t        j                  t        |            | _        t        j                  rt        |      }|dk  rd}t        j                  d      }t        j                  d      }t        j                  j                  j                  }t        j                  |_         |d t        j                  |      ||      | _        | j                  st!        d       t        j"                  t        j                  t        j                  t        j                  t        j                        t        j$                        } || j                  ||      dk  rt!        d      t        j                  d      }t        j                  d      }t        j                  j                  j&                  }	 |	t        j                  | j                        t        j                  |      |t        j(                  |            }
|
st!        d      | j*                  sXt        j                  j                  j,                  }t        j                  |_        t        j                   |             | _        t        j                  j                  j/                  | j*                  t        j                  | j                        t        j                  |            }
|
st!        d	      dd
lm}m}m}m}m}m} t         j                  d| j                        }t        |      | _         |d| j                  ||z  ||z  |z        | _        | j<                  j?                  |       t        j@                  t        jB                  jE                  | j<                              | _        t        j"                  | j                  g| jF                   } || j                        | _$        y )Nr   i      zFailed to VirtualAllocr   zFailed to memmover  zFailed VirtualProtectzFailed FlushInstructionCache)mmapMAP_PRIVATEMAP_ANONYMOUS
PROT_WRITE	PROT_READ	PROT_EXECr  )r8  prot)%bytesr7   r  ctypesc_size_trd   r  rX   r   c_ulongwindllkernel32VirtualAllocc_void_pr  r  r9   	CFUNCTYPE_memmove_addrVirtualProtectbyrefr  GetCurrentProcessFlushInstructionCacher  r  r  r  r  r  r  r$   	addressofc_intfrom_bufferr  r  )r   r  r  
MEM_COMMITPAGE_READWRITEpfnVirtualAllocmemmovePAGE_EXECUTEold_protectpfnVirtualProtectrespfnGetCurrentProcessr  r  r  r  r  r  functypes                      r   compilezASM.compile  s   C!2!23,ooc,/0$)
l
4
VmFTv&:NN3'>]]++88?#__?!$(=z>Z4<
,,
,
-- bVfoovQWQ`Q`abhbvbvw7dllL$/!3
'
(( ..&<";}}--<<	6??4<<8&//$:OQ]_e_k_klw_x	y3

+
,, //!==11CC#)?? oo&:&<=DO				5	5doovW[WcWcGdflfufuvzf{	|3

2
33VV **S$"3"34<< 49"dii{]'BV_I_bkIkl47 77==""6<<#;#;DGG#DE4< dll;T]];(t||$$)r   c                 &    | j                         }|S r#  )r  )r   rL  s     r   runzASM.run  s    99;&	-r   c                    t         j                  rqt        j                  d      }t        j                  j
                  j                  t        j                  | j                        t        j                  d      |       n| j                  j                          d | _        d | _
        d | _        d | _        d| _        y )Ni   r   )rX   r   r  r  r  r  VirtualFreer  r  r  r  r   r  r  r  )r   MEM_RELEASEs     r   freezASM.free  s}    ';	==%%foodll&CV__UVEWYde77==?$/$'$)$,$)r   )rS   rT   rU   r   r  r  r  rV   r   r   r  r    s     2B 6%pr   r  c                   X    e Zd ZddZddg fdZd Zd Zd Zd Zd	 Z	d
 Z
d Zd Zd Zy)CPUIDNc                 @    |t        dd      }t        |      | _        y )NF)r   r  is_selinux_enforcing)r   r  s     r   r   zCPUID.__init__  s"    
]5 4E:$r   rV   c                 @    t        |||      }|j                          |S r#  )r  r  )r   r  r  r  asms        r   	_asm_funczCPUID._asm_func  s    GX|,#++-	*r   c                     t        t        j                  d|      }|j                          |j	                         }|j                          |S )NrV   )r  r  c_uint32r  r  r  )r   r  r  rL  s       r   _run_asmzCPUID._run_asm  s6    FOOR.#++-779&((*	-r   c                     | j                  dd      }| j                  dd      }| j                  dd      }g }|||fD ])  }dD ]"  }|j                  t        ||z	  dz               $ + dj                  |      }|S )N   1         ér      r        r/   )r#  r   chrr7   )r   ebxecxedxr  r  r<   s          r   get_vendor_idzCPUID.get_vendor_id  s    	# 		# 		# )3_ -c -qS#(d*+,-- ggi )	r   c                     | j                  dd      }|dz	  dz  }|dz	  dz  }|dz	  dz  }|dz	  dz  }|d	z	  dz  }|d
z	  dz  }d}|dv r||z   }n|}|dv r|dz  |z   }||||dS )N      s   r      r  r*     r?   r     r,  )r4  )rp  r4  )r4  r5  r6  r7  r#  )	r   eaxstepping_idr5  	family_idr7  extended_model_idextended_family_idr6  s	            r   get_infozCPUID.get_info  s    	# S +!8s
%ax3)2I$.byC'r	T)&$*66'"e+5 $	
 r   c                 (    | j                  d      }|S )Ns      r7  )r   max_extension_supports     r   get_max_extension_supportzCPUID.get_max_extension_support=  s    -- 
r   c                    | j                  dd      }| j                  dd      }i dt        |d      dt        |d      dt        |d	      d
t        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      d t        |d!      d"t        |d#      d$t        |d%      i d&t        |d'      d(t        |d)      d*t        |d+      d,t        |d-      d.t        |d/      d0t        |d1      d2t        |d3      d4t        |d5      d6t        |d7      d8t        |d9      d:t        |d;      d<t        |d=      d>t        |d?      d@t        |d      dAt        |d      dBt        |d	      dCt        |d      i dDt        |d      dEt        |d      dFt        |d      dGt        |d      dHt        |d      dIt        |d      dJt        |dK      dLt        |d      dMt        |d      dNt        |d      dOt        |d!      dPt        |d%      dQt        |d'      dRt        |d)      dSt        |dT      dUt        |d+      dVt        |d-      t        |d/      t        |d1      t        |d3      t        |d5      t        |d7      t        |d9      t        |d;      t        |d=      t        |d?      dW	}|j                         D cg c]
  \  }}|s	| }}}|dk\  rg| j                  dXdY      }| j                  dXdZ      }i d[t        |d	      d\t        |d      d]t        |d      d^t        |d      d_t        |d      d`t        |d      dat        |d      dbt        |dK      dct        |d      ddt        |d      det        |d      dft        |d!      dgt        |d#      dht        |d%      dit        |d'      djt        |d)      dkt        |dT      i dlt        |d+      dmt        |d-      dnt        |d/      dot        |d1      dpt        |d3      dqt        |d5      drt        |d7      dst        |d9      dtt        |d;      dut        |d=      dvt        |d?      dwt        |d      dxt        |d      dyt        |d	      dzt        |d      d{t        |d      d|t        |d      t        |d      t        |d      t        |dK      t        |d      t        |d      t        |d      t        |d-      t        |d=      d}}|j                         D cg c]
  \  }}|s	| }}}||z  }|d~k\  r| j                  d      }| j                  d      }i dt        |d      dt        |d      dt        |d	      d
t        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      d t        |d!      d"t        |d#      d$t        |d%      i dt        |d)      dt        |dT      dt        |d-      d.t        |d/      d0t        |d1      dt        |d3      dt        |d5      dt        |d7      dt        |d;      dt        |d=      dt        |d?      dt        |d      dt        |d      dt        |d	      dt        |d      dt        |d      dt        |d      i dt        |d      dt        |d      dt        |d      dt        |d      dt        |dK      dt        |d      dt        |d      dt        |d      dt        |d!      dt        |d#      dt        |d%      dt        |d)      dt        |d+      dt        |d-      dt        |d/      dt        |d1      dt        |d5      t        |d7      t        |d9      d}|j                         D cg c]
  \  }}|s	| }}}||z  }|j                          |S c c}}w c c}}w c c}}w )Nr3  r(  r'  fpur   vmer    der!   pser?   tscr  msrrZ   paerp  mce   cx8r*  apicr   sep   mtrrr5  pge   mca   cmovr4  patr  pse36   pn   clflush   dts   acpi   mmx   fxsrr+  sse   sse2   ss   ht   tm   ia64   pbe   pni	pclmulqdqdtes64monitords_cplvmxsmxesttm2ssse3cid
   fmacx16xtprpdcmpciddcasse4_1sse4_2r6  x2apicmovbe)	popcnttscdeadlineaesxsaveosxsaveavxf16crdrnd
hypervisors   1s
      s
      sgxbmi1hleavx2smepbmi2ermsinvpcidrtmpqmmpxpqeavx512favx512dqrdseedadxsmap
avx512ifmapcommit
clflushoptclwbintel_ptavx512pfavx512eravx512cdshaavx512bwavx512vlprefetchwt1
avx512vbmiumippkuospkeavx512vbmi2)gfnivaes
vpclmulqdq
avx512vnniavx512bitalgavx512vpopcntdqrdpidsgx_lcl       s
     s
     syscallmpnxmmxextfxsr_optpdpe1gprdtscplm3dnowext3dnowlahf_lm
cmp_legacysvmextapic
cr8_legacyabmsse4amisalignsse3dnowprefetchosvwibsxopskinitwdtlwpfma4tce
nodeid_msrtbmtopoextperfctr_core
perfctr_nbdbx)perftscpci_l2i)r#  r  r'  r<  )	r   r?  r0  r/  r8  r  r  r.  extended_flagss	            r   	get_flagszCPUID.get_flagsH  s6   	# 		#B;sAB;sAB +c1
B 	;sA	B
 	;sAB 	;sAB 	;sAB 	;sAB 	;sAB 
KQB 	;sBB 
KR B 	;sBB 	;sBB  
KR !B" 	;sB#B$ [b!%B& +c2
'B( {3#)B, 	;sB-B. 
KR /B0 	;sB1B2 
KR 3B4 	;sB5B6 
KR 7B8 +c2
9B: +c2
;B< +c2
=B> 
KR ?B@ 	;sBABD 	;sAEBF S!$GBH k#q!IBJ {3"KBL k#q!MBN 	;sAOBP 	;sAQBR 	;sASBT 	;sAUBV [a WBX 	;sBYB\ 	;sB]B^ 
KR _B` 
KR aBb 
KR cBf 
KR gBh 	;sBiBj k#r"kBl k#r"mBn k#r"oBp [b!qBr #r"sB'sBb!3#sBR b!c2&CB%J 
,A!1
,%
, a	
3 

3B 
KQB [a 	B
 
KQB [a B [a B [a B [a B C$B 
KR B 
KR B 
KR B  
KR !B" C$#B$ S"%%B& {3#'B( 
KR )B* [b!+B, ;sB'-B. C$/B0 ;sB'1B2 [b!3B4 S"%5B6 S"%7B8 S"%9B: S"%;B< 
KR =B> S"%?B@ S"%ABD KQ'EBF ;sA&GBH [a IBJ 
KQKBL k#q!MBP KQ'QBT a a sB'sB' b)#C, #r" 3#AB>J $2#7#7#9?41aQQ?>?N5 j(	
3 

3B	KQB	KQB 	;sAB 
KQ	B
 
KQB 
KQB 
KQB 
KQB 
KQB [a B C$B [b!B 
KR B 
KR B  [b!!B" 
KR #B$ k#r"%B( 	;sB)B* 	;sB+B. {3#/B0 
KR 1B2 [b!3B4 S"%5B6 C$7B8 {3#9B< 	;sB=B> S"%?B@ k#r"ABD C#EBF ;sA&GBH 
KQIBJ C#KBL ;sA&MBN 
KQOBP k#q!QBR KQ'SBT k#q)UBV [a WBX 
KR YBZ 
KR [B\ {3#]B^ 
KR _Bb 
KR cBd [b!eBf 
KR gBj ;sB'kBn 
KR oBp C$qBr [b)sBt ;sB'uBx 
KR yBz C$C$}B>J $2#7#7#9?41aQQ?>?N5**,	,w -x @v @s$   ;
cc#
c.c+
c 6c c                 D   d}|dk\  ryg d}|D ]p  }| j                  |d      }| j                  |d      }| j                  |d      }| j                  |d      }||||fD ]  }	dD ]  }
|t        |	|
z	  d	z        z  }  r |j                  d
      j                         }|S )Nr/   l       )s     s     s     s   r&  r'  r(  r)  r,   )r#  r-  ro   )r   r?  r   instructionsinstructionr8  r.  r/  r0  r  r<   s              r   get_processor_brandzCPUID.get_processor_brand]  s    / j(<
 # $0{
--C --C --C --C S#s# 0 0cQh$.//o00E$0N $))$/557/	r   c                 j    i }|dk  r|S | j                  d      }|dz  dz  |dz	  dz  |dz	  dz  d	}|S )
Nl       s
     r,  r  r5  r4  r  i  )size_bassociativityline_size_br7  )r   r?  
cache_infor/  s       r   	get_cachezCPUID.get_cache  sa    * Z'
 		# TzT!Ri3&2I'* 
r   c                    d }t         j                  dk(  ryd }t        j                  t        j                        t        j                  t        j                        f}| j                  ||g d      }|j                  fd}||_        |}|S t         j                  dk(  r)t        j                  }d}| j                  ||g d      }|}|S )N32bit)   Us   r%        1s   ]s   Ms   s      ]   c                      t        j                  d      } t        j                  d      } t        j                  |       t        j                  |             | j                  dz  dz  |j                  z  }|S )Nr   r  l        )r  r"  r  r  )highlowrL  old_funcs      r   new_funcz&CPUID.get_ticks_func.<locals>.new_func  s_    ??1D
//!
CV\\$c!23 zzR#55BFMr   64bitrV   )	   Hr%  r  r  r  s    r  s   	r  )rX   r   r  POINTERc_uintr   r  c_uint64)r   rL  r  r  get_ticks_x86_32r  get_ticks_x86_64r  s          @r   get_ticks_funczCPUID.get_ticks_func  s    &__7~~fmm,fnnV]].KL8nnWh" ##8 $6( 
-' '!__78nnWh
 6	-r   c                     ddl m} | j                         }|j                         } |d       |j                         }||z
  }|j	                          |S )Nr   )sleepr    )timer  r  r  r  )r   r  ticks_fnr  r  r^  s         r   
get_raw_hzzCPUID.get_raw_hz  sG      "(
--/%(#;%
--/	,r   r#  )rS   rT   rU   r   r   r#  r1  r=  r@  r  r  r  r  r  rV   r   r   r  r    sH    ; "BR 
 FBRj3l.8tr   r  c                     ddl m}  t        dd      }i }|j                  t        _        |j                  t        _        	 t        t        j                        \  }}|dvr#|j                  d       |j                  |d      S t        |      }|j                  r#|j                  d       |j                  |d      S |j                         }|j!                  |      }|j#                         }|j%                  |      }|j'                         }	t)        |	      }	t+        |      \  }
}|j-                         d|t/        |
|      t/        |	d      t1        |
|      t1        |	d      |d   |d	   |d
   |d   |d   |d   |d   |j3                  |      d}t5        |      }|j7                          |j                  |d      S # t8        $ rt}ddlm}  |       }dj?                  |jA                  d      D cg c]  }djC                  |       nc c}w c}      dz   |_"        |j                  |d      cY d}~S d}~ww xY w)z
	Warning! This function has the potential to crash the Python runtime.
	Do not call it directly. Use the _get_cpu_info_from_cpuid function instead.
	It will safely call this function in another process.
	r   r	   Tr  r  -Not running on X86_32 or X86_64. Skipping ...z"SELinux is enforcing. Skipping ...r/   r  r  r  r4  r5  r6  r7  )r   r+  r,  r-  r.  r/  r   r1  r2  r3  r4  r5  r6  r7  r8  r2   r0   r4   NF)#r   r
   r   r   sysrM   r   rN   r  rX   r   r=   rR   r  r  r@  r  r=  r  r  r   r  r1  r|  rj  r  r  r-   r9   r:   r3   r7   r8   r   r   )r
   r  rF   r  r   cpuidr?  r  r   r   r/  rf  rO   r3   r;   r<   s                   r   _get_cpu_info_from_cpuid_actualr    s     	tT	
 mmmm7#:556*$ 
%	%::=>
--d
## ,%
::23
--d
##  99;45*		$--.CD/  ) +) 1A-'')2=%H.y!<%mU;!)Q/x(#M2'8JM(^*+OO12%
$* 
-T	2$--/ 	dE"" 	 #"|*wwz7G7G7MN!**1-NNORVV%*	tT	""	#s8    AG 9G =C2G 	H>
+H95H
&H93H>9H>c                     t         j                  }t         j                  }t               }|t         _        |t         _        | j	                  t        |             y r#  )r  rM   rN   r  putr  )queueorig_stdoutorig_stderrrB   s       r   +_get_cpu_info_from_cpuid_subprocess_wrapperr  =  s;    zzzz
)
+;vr   c                     t         j                  d       ddlm} m} t
        j                  st         j                  d       i S t        t
        j                        \  }}|dvrt         j                  d       i S 	 t        rR |       } | t        |f      }|j                          |j                         r"|j                  d       |j                         r"|j                  dk7  rt         j                  d       i S |j!                         rt         j                  d	       i S t#        |j%                               }dd
l}|j)                  d      }d|v r|d   rt         j+                  |d          d|v rT|d   rOt,        j.                  j+                  dj1                  |d                t,        j.                  j3                          d|v rT|d   rOt,        j4                  j+                  dj1                  |d                t,        j4                  j3                          d|vrt         j                  d       i S d|v rI|d   rDt         j                  d       t         j+                  |d          t         j+                  d       i S d|v r|d   rt         j+                  d       i S d|vs|d   st         j                  d       i S |d   S t,        j.                  }	t,        j4                  }
t7               }|	t,        _        |
t,        _        t         j9                          |d   S # t:        $ r }t         j                  |       Y d
}~i S d
}~ww xY w)z
	Returns the CPU info gathered by querying the X86 cpuid register in a new process.
	Returns {} on non X86 cpus.
	Returns {} if SELinux is in enforcing mode.
	z Tying to get info from CPUID ...r   )ProcessQueuezCan't CPUID. Skipping ...r  r  )targetargsz,Failed to run CPUID in process. Skipping ...z7Failed to get anything from CPUID process. Skipping ...Nr  )indentrB   rM   z{0}
rN   rP   z6Failed to get is_fail from CPUID process. Skipping ...rO   z
Failed ...rF   z:Failed to get return info from CPUID process. Skipping ...)r   r+   r   r  r  rX   r   r=   r  r   CAN_CALL_CPUID_IN_SUBPROCESSr  r  is_aliver7   exitcodeemptyr!  r   pprintPrettyPrinterr$   r  rM   r   r%   rN   r  r-   r9   )r  r  r  r   r  r   rB   r  ppr  r  rO   s               r   _get_cpu_info_from_cpuidr  H  s    	23+ 		,,+,	) *445t 	$$	,,>?	)G!75AQ1779 
FF1I 
 jjAoLL?@I kkmLLJKI %F			Q		'B 6fX.]]6(#$6fX.ZZgnnVH%567ZZ6fX.ZZgnnVH%567ZZ\\JKY 6%=\\@A]]6%=!]]< YFvi0]]< YV6&>\\NOY&> ;;+-63:3:
??
. 	,,s 		sL   =AL/ %L/ &L/ )DL/ AL/ L/ 1L/ L/ AL/ /	M8MMc                     t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }| dk7  rt         j	                  d       i S t        d|dddd	d
      }t        d|dddddd      }t        d|ddd      }t        d|t        dd      }t        d|t        dd      }t        d|t        dd      }t        d|ddd      }t        d|ddddd      }	|	r |	j                         }	|	j                          |s	 t        dd      D ]v  }
dj                  |
      }t        d|dd|      }|s&|j                  d      D cg c]  }|j                  d       }}t        |      }d|v sc|d   dk(  sld|v sq|d   } n t        d|ddd d!d"d#d$	      }|j                         j                  d%      j!                         }t#        |      }d&\  }}	 t%        |      \  }}||t'        |      |	||||d'}|r|d(k(  r|}d)}n	|r|d(k(  r|}t)        ||      d*kD  rt+        ||      |d+<   t)        ||      |d,<   t)        ||      d*kD  rt+        |d)      |d-<   t)        |d)      |d.<   t-        |dddd/      }t         j/                          |S c c}w # t        $ r Y w xY w# t        $ r Y w xY w# t        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)0z`
	Returns the CPU info gathered from /proc/cpuinfo.
	Returns {} if /proc/cpuinfo is not found.
	z(Tying to get info from /proc/cpuinfo ...z*Failed to find /proc/cpuinfo. Skipping ...r   z-Failed to run cat /proc/cpuinfo. Skipping ...FNr/   r  z	vendor idvendorTz
model namer   	processoruarchz
cache sizer  r4  r5  z
cpu familyHardwarer8  FeaturesASEs implementedr|  zcache{0}r   r  level3r  zcpu MHzz	cpu speedclockzcpu MHz dynamiczcpu MHz staticro  r  )r+  r,  r9  r8  r   r4  r5  r6  rY  rp  ra  r-  r/  r.  r   r4  r5  r6  )r   r+   rX   r`   r=   r   rM  re  r8   r<  ranger   r&  r9   rp   r[  ro   r   r  r  rj  r|  r  r-   )r   rB   r  r   
cache_sizer4  r5  r6  hardwarer8  ir  r  r  r   r/  rf  rF   rO   s                      r   _get_cpu_info_from_proc_cpuinfor,    s?    	:;V		$	$	&
<<<=
9!224*f1_
<<?@
9 b+{HU)tVT4uk[bc/%r<@*vsB
;(
UFCW
5%eVS"l;&vtR<( UFD$EW
X%
;;=5::< 
	1b\ a TvtT48U-2[[-=>Eu{{3>e>5ke	E	eGn3%&Mz b)['Sdfvw)oo&&u-335) +) #-1/B=%
 *:6

$ 
-50=5	U*9 }e,v5$9-$O4 !,]EB4y%(61 5i C4(A64	,Tq!VW3X	Y$	//	+c ?
  		 
 B 	 	,,s	)s   *K 2K 5B/K %1J7 J7 *J2J7 J7 J7 "J7 *AK ;K 	B(K 2J7 7	K K KK 	KK KK 	L K;5L ;L c                  r   t         j                  d       	 d\  } }t        j                         st         j	                  d       i S t        j                         \  }}|dk7  rt         j	                  d       i S |j                  d      d   j                  d      d   } | j                  d	      }|d
k7  sJ | d|dz    j                         j                         } | j                  d      rd}n| j                  d      rd}| j                  d      j                  d      j                         } t        |       } t        | |      t        | |      t        | |      t        | |      d}t        |      }t         j!                          |S # t"        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)z^
	Returns the CPU info gathered from cpufreq-info.
	Returns {} if cpufreq-info is not found.
	z'Tying to get info from cpufreq-info ...r  z)Failed to find cpufreq-info. Skipping ...r   z(Failed to run cpufreq-info. Skipping ...zcurrent CPU frequency isr    r0   ru  r  r!   ro  rp  rn  r   )r-  r.  r/  r   N)r   r+   rX   ru   r=   r   r8   r  ro   rp   r\  r[  r   r|  rj  r  r-   r9   )r  rf  r   rB   r+  rF   rO   s          r   _get_cpu_info_from_cpufreq_infor.    s    	9:%/(E		$	$	&
<<;<
9!..0*f1_
<<:;
9\\45a8>>tDQG(mmD!	
b/a!A#$$&,,.(u55__U#**51779()( 4HeD/%@&x7"8U3	
$ 
-T	2$	//	+ 	,,s	)s*   /F 2F :DF 	F6F1+F61F6c            	      :   t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }| dk7  rt         j	                  d       i S i }t        d|dddd      }|rIt        |      }d	}t        ||      |d
<   t        ||      |d<   t        ||      |d<   t        ||      |d<   t        d|dddd      }|rIt        |      }d	}t        ||      |d
<   t        ||      |d<   t        ||      |d<   t        ||      |d<   t        d|ddd      }|r||d<   t        d|ddd      }|r||d<   n&t        d|ddd      }|r|j                         s||d<   t        d|ddd      }|r|j                         rt        |      |d<   t        d|ddd      }|r|j                         rt        |      |d<   t        d|ddd      }	|	r|	j                         rt        |	      |d<   t        d|ddd      }
|
r0|
j                  d      d   j                         }
t        |
      |d<   t        d|ddd      }|r0|j                  d      d   j                         }t        |      |d<   t        d|dddd       }|r0|j                  d      d   j                         }t        |      |d!<   t        d|ddd"      }|r0|j                  d      d   j                         }t        |      |d#<   t        d|ddd$d%d&      }|r%|j                         }|j                          ||d$<   t!        |dddd'      }t         j#                          |S # t$        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)(zP
	Returns the CPU info gathered from lscpu.
	Returns {} if lscpu is not found.
	z Tying to get info from lscpu ...z"Failed to find lscpu. Skipping ...r   z!Failed to run lscpu. Skipping ...FNzCPU max MHzzCPU MHzrp  r-  r.  r/  r   zCPU dynamic MHzzCPU static MHzz	Vendor IDr   z
Model namer,  Modelz
CPU familyr6  Steppingr4  r5  z	L1d cache(r:  z	L1i cacher;  zL2 cachez	L2d cacher1  zL3 cacher9  r8  r"  r#  r'  )r   r+   rX   r   r=   r   rM  r   r|  rj  rB  re  r8   ro   r  r<  r  r-   r9   )r   rB   rF   new_hzrf  r  r  r6  r4  r5  r:  r;  r1  r9  r8  rO   s                   r   _get_cpu_info_from_lscpur4  ;  s    	23W				
<<45
9!'')*f1_
<<34
9	$eVT4	J&v&65$9&%$H4 ! 5fe D4,VU;4(74eVT41BDTU&v&65$9&%$H4 ! 5fe D4,VU;4(74dK@)$4
UFD$
=%
4eVT495EMMODeVT4>& K4>vtT:>((""$(m4

UFD$
8%
u}}u:4=!%t[I*005a8>>@ 67I J4(dKP8>>sCAFLLN'=>W'X4#$UFD$
KP- &&s+A.446=1-@4UFD$
C- &&s+A.446=1-@4 UFD$EW
X%
;;=5::<4=	,Tq!VW3X	Y$	//	+ 	,,s	)s*   *M0 2M0 5K:M0 0	N9NNNc                     t         j                  d       t        t        j                        \  } }| dv rt         j                  d       i S t        j                         st         j                  d       i S t        j                         \  }}||dk7  rt         j                  d       i S t        |      }t         j                          |S )zr
	Returns the CPU info gathered from dmesg.
	Returns {} if dmesg is not found or does not have the desired info.
	z$Tying to get info from the dmesg ...)r	  zRunning on S390X. Skipping ...z"Failed to find dmesg. Skipping ...r   z&Failed to run "dmesg -a". Skipping ...)
r   r+   r  rX   r   r=   rf   r   r  r-   )r  r   r   rB   rF   s        r   _get_cpu_info_from_dmesgr6    s     	67 *445tI	,,/0	) 		,,34	) !((*V
NjAo	,,9:	)F#r   c                     t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }|| dk7  rt         j	                  d       i S |j                  d      d   j                         }|D cg c]  }|t        d      v s| }}d	j                  |      }t        |dd
 d      }t        |d
d d      }i dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d      dt        |d
      dt        |d      dt        |d      dt        |d      dt        |d       d!t        |d"      d#t        |d$      d%t        |d&      d't        |d      d(t        |d)      t        |d*      t        |d+      t        |d,      t        |d-      t        |d.      t        |d/      t        |d      t        |d
      t        |d      t        |d      t        |d      t        |d      d0}|j                         D cg c]
  \  }}|s	| }}}|j                          d1|i}	t        |	      }	t         j                          |	S c c}w c c}}w # t         $ r!}
t         j	                  |
       i cY d}
~
S d}
~
ww xY w)2z
	Returns the CPU info gathered from lsprop /proc/device-tree/cpus/*/ibm,pa-features
	Returns {} if lsprop is not found or ibm,pa-features does not have the desired info.
	z!Tying to get info from lsprop ...z#Failed to find lsprop. Skipping ...Nr   zEFailed to glob /proc/device-tree/cpus/*/ibm,pa-features. Skipping ...zibm,pa-featuresr    0123456789abcfedr/   r*  r  mmurB  slbr!   r  r?   dabrrZ   nerp  wtrrJ  mcrdsisrr   lpr|  rirN  dabrxr5  sprg3rQ  rislbrS  r  r4  vpmzdss_2.05rW  r[  r]  r_  ra  r+  rd  )darpprzdss_2.02zdss_2.06lsd_in_dscrugr_in_dscrzsso_2.06lecfarebzlsq_2.07zdss_2.07r8  )r   r+   rX   r   r=   r   r8   rp   r$  r7   re  r  r'  r<  r  r-   r9   )r   rB   r  srF  rG  r8  r  r  rF   rO   s              r   "_get_cpu_info_from_ibm_pa_featuresrN    s?    	34t		'	'	)
<<56
9 "113*f^zQ
<<WX
9 ,,(
)!
,
2
2
4%
=qD);$<<1
=%
=
''%.% 
U1q\2	$
eAmR
 %P;tQP 	;tQP 	;tQ	P
 	;tQP 
Ka P +dA
P 	;tQP 	;tQP [q!P +dB
P +dB
P  [r"!P" [r"#P$ [r"%P& +dB
'P, 	;tR -P. D"%/P2 tR tR D"%D"% tR(tR( E1% eQ
q!
eR
 E2& E2&}P%f 
,A!1
,%
,**, U
$ 
-T	2$	//	+G >v - 	 	,,s	)sT   *J0 4J0 7&J0 J%0J%4F*J0 
J*)J*-7J0 %J0 0	K9KKKc                  .   t         j                  d       t        j                         st         j	                  d       i S t        j                         \  } }|| dk7  rt         j	                  d       i S t        |      }t         j                          |S )z
	Returns the CPU info gathered from /var/run/dmesg.boot.
	Returns {} if dmesg is not found or does not have the desired info.
	z6Tying to get info from the /var/run/dmesg.boot log ...z5Failed to find /var/run/dmesg.boot file. Skipping ...r   z5Failed to run "cat /var/run/dmesg.boot". Skipping ...)r   r+   rX   rr   r=   r   r  r-   )r   rB   rF   s      r   )_get_cpu_info_from_cat_var_run_dmesg_bootrP  ;  s|     	HI 	))+	,,FG	) !779V
NjAo	,,HI	)F#r   c                     t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }|| dk7  rt         j	                  d       i S t        d|ddd      }t        d|ddd	      }t        d|t        dd
      }t        d|t        dd      }t        d|t        dd      }t        d|t        dd      }t        d|ddd      j                         j                         }|j                  t        d|ddd      j                         j                                |j                  t        d|ddd      j                         j                                |j                          t        |      \  }	}
t        d|ddd      }t        |      }||t        |	|
      t        |d      t        |	|
      t        |d      t        |      dz  ||||d}t!        |      }t         j#                          |S # t$        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)zR
	Returns the CPU info gathered from sysctl.
	Returns {} if sysctl is not found.
	z!Tying to get info from sysctl ...z#Failed to find sysctl. Skipping ...Nr   z@Failed to run "sysctl machdep.cpu hw.cpufrequency". Skipping ...Fzmachdep.cpu.vendorTzmachdep.cpu.brand_stringzmachdep.cpu.cache.sizezmachdep.cpu.steppingzmachdep.cpu.modelzmachdep.cpu.familyr/   zmachdep.cpu.featureszmachdep.cpu.leaf7_featureszmachdep.cpu.extfeaturesr   r  r   r,  r-  r.  r/  r   r1  r4  r5  r6  r8  )r   r+   rX   r{   r=   r   rM  re  rp   r8   extendr<  r  r   r|  rj  r  r-   r9   )r   rB   r  r   r)  r4  r5  r6  r8  r/  rf  r   rF   rO   s                 r   _get_cpu_info_from_sysctlrT  S  s    	345				 
<<56
9 "DDF*f^zQ
<<TU
9 d4HI)tVT49ST/%a1IJ*vsA/EF(
UFC,?
@%eVS!-AB& UFD".D
E
K
K
M
S
S
U%,,z%r3OPVVX^^`a,,z%r3LMSSU[[]^**, 1A-d4EF) +) 2=%H.y!<%mU;!)Q/
Od*
$" 
-T	2$	//	+ 	,,s	)s*   *H 4H 7F#H 	I$I :I Ic                  L    t               } | j                  t                      | S )T
	Returns the CPU info gathered from sysinfo.
	Returns {} if sysinfo is not found.
	)_get_cpu_info_from_sysinfo_v1update_get_cpu_info_from_sysinfo_v2)rF   s    r   _get_cpu_info_from_sysinforZ    s!     	&'*,-r   c                     t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }|| dk7  rt         j	                  d       i S d}|j                  d      d   j                  d	      d   j                         }d}t        |j                  d
      d   j                  d      d   j                               }t        |j                  d      d   j                  d      d   j                               }t        |j                  d      d   j                  d      d   j                               }g }|j                  d      D ]V  }	|	j                  d      s|	j                         j                         j                         D ]  }
|j                  |
        X |j                          t        |      \  }}|}||t        ||      t        ||      t        ||      t        ||      t!        |      ||||d}t#        |      }t         j%                          |S # t&        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)rV  z,Tying to get info from sysinfo version 1 ...$Failed to find sysinfo. Skipping ...Nr   *Failed to run "sysinfo -cpu". Skipping ...r/   	CPU #0: "r    "
z, stepping rP  z, model z	, family r0   		rR  )r   r+   rX   r   r=   r   r8   ro   re  r  rp   r   r<  r  r|  rj  r  r  r-   r9   )r   rB   r  r   r)  r4  r5  r6  r8  r*   r  r/  rf  r   rF   rO   s                   r   rW  rW    s7    	>?7				!
<<67
9 "--/*f^zQ
<<>?
9 )LL-a066u=a@FFH/*m,Q/55c:1=CCEF(
fll:&q)//4Q7==?
@%v||K(+11#6q9??AB& %ll4  d
oof

""$**, 
\\$ **, 1A-) 2=%H.y%@%mU;!)U3&z2
$" 
-T	2$	//	+ 	,,s	)s1   *I 4I 7DI CI 	I<I71I<7I<c                     t         j                  d       	 t        j                         st         j	                  d       i S t        j                         \  } }|| dk7  rt         j	                  d       i S d}|j                  d      d   j                  d	      d   j                         }d}|j                  d
      d   j                  d      d   j                         }t        |j                  d      d   j                  d      d   j                               }t        |j                  d      d   j                  d      d   j                               }t        |j                  d      d   j                  d      d   j                               }d }	 |	|j                  d      d          |	|j                  d      d         z    |	|j                  d      d         z   }
|
j                          |j                  d      D cg c]  }|s|	 }}|d   j                  d      d   j                         j                         }|j                  d      j                  d      j                         }t        |      }|}d}|j                  d      rd}n|j                  d      rd}||t        ||      t        ||      t        ||      t        ||      t!        |      ||||
d}t#        |      }t         j%                          |S c c}w # t&        $ r!}t         j	                  |       i cY d}~S d}~ww xY w)rV  z,Tying to get info from sysinfo version 2 ...r\  Nr   r]  r/   r^  r    r_  z
Signature:r0   z	stepping rP  zmodel zfamily c                    g }| j                  d      dd  D ]j  }|j                  d      s|j                  d      s |S |j                         j                         j                  d      D ]  }|j	                  |        l |S )Nr0   r    z                r`  r   )r8   r  ro   rp   r   )rB   rL  r*   r  s       r   get_subsection_flagsz;_get_cpu_info_from_sysinfo_v2.<locals>.get_subsection_flags  s    6||D!!"% t??-.tt7Le = ##%++C0 ]]5 =r   z
Features: z Extended Features (0x00000001): z Extended Features (0x80000001): zrunning at ro  rn  rp  r   rR  )r   r+   rX   r   r=   r   r8   ro   re  r<  rp   r[  r   r\  r|  rj  r  r  r-   r9   )r   rB   r  r   r)  	signaturer4  r5  r6  rc  r8  r<   r  raw_hzr/  r   rf  rF   rO   s                      r   rY  rY    s    	>?H				!
<<67
9 "--/*f^zQ
<<>?
9 )LL-a066u=a@FFH/*ll<(+11$7:@@B)-a066s;A>DDFG(
iooh'*005a8>>@
A%yy)!,2237:@@BC& v||L9!<
=&HI!LMN&HI!LMN% **, ll4(
.A1
.%
.8>>-(+11399;&--&--e4::<-$]3-)
%__U5u5 2=%H.y%@%mU;!)U3&z2
$" 
-T	2$	//	+? /@ 	 	,,s	)sC   *L 4L 7FL LLC8L L 	M#L?9M?Mc                     t         j                  d       	 t        j                  rt        j	                         st         j                  d       i S t        j                         \  } }|| dk7  rt         j                  d       i S |j                  d      }|D cg c]&  }d|v s|j                         j                  d      ( }}|D ci c]  \  }}|s	|| }}}|j                  d      }t        |      \  }}|j                  d	      }	d
}
|	rt        |	      }	|j                  d      }|rt        |      dz  }|j                  d      }|rt        |      dz  }d\  }}}|j                  d      xs |j                  d      }|j                  d      }d|v rB|j                  d      t        |      dz
  k  r"|j                  d      }t        ||dz            }d|v rB|j                  d      t        |      dz
  k  r"|j                  d      }t        ||dz            }d|v rB|j                  d      t        |      dz
  k  r"|j                  d      }t        ||dz            }|j                  d      |t        ||      t        |	|
      t!        ||      t!        |	|
      |||||d}t#        |      }t         j%                          |S c c}w c c}}w # t&        $ r!}t         j                  |       i cY d}~S d}~ww xY w)zd
	Returns the CPU info gathered from WMI.
	Returns {} if not on Windows, or wmic is not installed.
	zTying to get info from wmic ...z4Failed to find WMIC, or not on Windows. Skipping ...Nr   z Failed to run wmic. Skipping ...r0   r  NameCurrentClockSpeedrp  L2CacheSizer  L3CacheSize)r/   r/   r/   DescriptionCaptionr   Familyr    r0  r1  Manufacturer)r   r,  r-  r.  r/  r   r1  r9  r4  r5  r6  )r   r+   rX   r   r   r=   r   r8   r[  r   r  r   re  rc  rd   r|  rj  r  r-   r9   )r   rB   r  rM  r  r  r   r/  scale_advertisedr   scale_actualr1  r9  r6  r5  r4  descriptionentriesr+  rF   rO   s                        r   _get_cpu_info_from_wmicrs  0	  s   
 	12K			j&9&9&;
<<FG
9!**,*f^zQ
<<23
9 ,,t
%*/
<Q3!8188:C 
<%
<!
'DAqQ1a4
'%
' IIf%/$;O$L!-! ii+,),!),9 ))M*-}%,=))M*-}%,= '&%		-(@EIIi,@+c"'W]]84s7|A~E}}X1A6GMM'2S\!^C}}W1wq1u~57w}}Z83w<>I}}Z 1'!a%.!8 YY~. 3MCST/	<H&}6FG"9l;""
$" 
-T	2$	//	+u =
't 	 	,,s	)sT   :K  4K  K  	K&!KK  
KKG6K  K   	L
)L?L
L
c                  F   t         j                  d       	 t        j                  st         j	                  d       i S t        j                         j                         } t        j                         }t        j                         }t        |      \  }}t        j                         }t        |      }t        |       \  }}|dk(  rd}t        |      }t        j                         fd}i d |d      d |d	      d
 |d      d |d      d |d      d |d      d |d      d |d      d |d      d |d      d |d      d |d      d |d      d |d       d! |d"      d# |d$      d% |d&       |d'       |d(       |d)       |d*       |d+       |d,       |d-       |d.       |d/       |d0       |d1       |d2       |d3      d4}	|	j                         D 
cg c]
  \  }
}|s	|
 }	}
}|	j                          || t!        ||      t!        |d      t#        ||      t#        |d      |	d5}t%        |      }t         j'                          |S c c}}
w # t(        $ r!}t         j	                  |       i cY d6}~S d6}~ww xY w)7z[
	Returns the CPU info gathered from the Windows Registry.
	Returns {} if not on Windows.
	z+Tying to get info from Windows registry ...z$Not running on Windows. Skipping ...rY  rp  c                 "    d| z	  }|z  dkD  }|S )Nl        r   rV   )r  r  rL  r   s      r   r  z+_get_cpu_info_from_registry.<locals>.is_set	  s!    

4<!#6
=r   rB  r   rC  r    rD  r!   rE  r?   rF  r  rG  rZ   rH  rI  rJ  rK  r*  rL  r   sepamdr|  rM  rN  rO  r5  rP  rQ  rR  rS  rT  r4  rU  r  rW  rY  r[  r]  r_  ra  r+  rd  rf  rh  rl  rn  rp  )rV  serialrZ  r\  r^  r`  rb  rc  re  rg  rk  rm  r  )r   r,  r-  r.  r/  r   r8  N)r   r+   rX   r   r=   r   ro   r   r   r  r   r   r  r   r'  r<  r|  rj  r  r-   r9   )r   r  r   r  r   r   r/  rf  r  r8  r  r  rF   rO   r   s                 @r   _get_cpu_info_from_registryrx  	  s    	=>_			
<<67
9 557==?/ --/) 557/?+*$ ))+) +) 1A- e5%i0= //1,!6!9!6!9! &)! 	6!9	!
 	6!9! 	6!9! 	6!9! 	6!9! 	6!9! 
F1I! fRj! 	6":! 
F2J! 	6":! 	6":!  
F2J!!" 	6":#!$ BZRjbz":2J":2J":2J
*
*2JBZA!%H 
,A!1
,%
,**, 2=%H.y!<%mU;!)Q/

$ 
-T	2$	//	+# -$ 	 	,,s	)s<   &I6 F<I6 ;
I0I0
A%I6 0I6 6	J ?JJ J c                  |   t         j                  d       	 t        j                         rt        j	                         st         j                  d       i S t        j                         \  } }|| dk7  rt         j                  d       i S t        j                         \  } }|| dk7  rt         j                  d       i S |j                  d      d   j                  d	      d   j                         }|j                  d
      d   j                  d	      d   j                         }t        |j                  d      d   j                  d	      d   j                               }t        |j                  d      d   j                  d	      d   j                               }t        |j                  d      d   j                  d	      d   j                               }|j                         j                  d	      d   j                         j                         j                         }|j                          d}	|j                  d      d   j                  d	      d   j                         }
t        |
      }
|j                  d      d   j                  d	      d   j                         }t        |      }||t        |
|	      t        |d      t        |
|	      t        |d      ||||d
}t!        |      }t         j#                          |S # t$        $ r!}t         j                  |       i cY d}~S d}~ww xY w)zh
	Returns the CPU info gathered from isainfo and kstat.
	Returns {} if isainfo or kstat are not found.
	z Tying to get info from kstat ...z,Failed to find isinfo or kstat. Skipping ...Nr   z)Failed to run "isainfo -vb". Skipping ...z/Failed to run "kstat -m cpu_info". Skipping ...z	vendor_id r    r0   z	brand z
	stepping z	model z	family r  rp  z	clock_MHz z	current_clock_Hz )
r   r,  r-  r.  r/  r   r4  r5  r6  r8  )r   r+   rX   r   r   r=   r   r   r8   ro   re  rp   r<  r   r|  rj  r  r-   r9   )r   flag_outputr   r  r   r4  r5  r6  r8  rf  r/  r   rF   rO   s                 r   _get_cpu_info_from_kstatr{  	  s    	23:				!)=)=)?
<<>?
9 '113*kJ!O
<<=>
9 !113*e
]jAo
<<CD
9 kk.)!,2248;AAC)KK
+A.44T:1=CCE/]+A.44T:1=CCEF(
ekk*%a(..t4Q7==?
@%u{{;'*006q9??AB& 



#
#D
)"
-
3
3
5
;
;
=
C
C
E%**, %++n-a066t<Q?EEG-$]3- kk/0399$?BHHJ) +) 2=%H.y!<%mU;!)Q/
$ 
-T	2$	//	+ 	,,s	)s0   >L 4L 4L  IL 	L;L60L;6L;c                     t         j                  d       	 t        j                  j	                  d      d   } d\  }}}| j	                  d      }d|v rB|j                  d      t        |      dz
  k  r"|j                  d      }t        ||dz            }d|v rB|j                  d      t        |      dz
  k  r"|j                  d      }t        ||dz            }d	|v rB|j                  d	      t        |      dz
  k  r"|j                  d	      }t        ||dz            }|||d
}t        |      }t         j                          |S # t        $ r!}t         j                  |       i cY d }~S d }~ww xY w)Nz)Tying to get info from platform.uname ...rP  r   )NNNr   rm  r    r0  r1  )r6  r5  r4  )r   r+   rX   r   r8   rc  rd   re  r  r-   r9   r=   )rq   r6  r5  r4  rr  r+  rF   rO   s           r   !_get_cpu_info_from_platform_unamer}  1
  sW   ;<

%
%
+
+C
0
3%.&%KK'W]]84s7|A~E}}X1A6GMM'2S\!^C}}W1wq1u~57w}}Z83w<>I}}Z 1'!a%.!8 
$
 
-T	2$	//	+ 	,,s	)s   D1E	 		E3E.(E3.E3c                  t   t         j                  d       t        t        j                        \  } }dddj                  t        j                        xs d} dj                  t        j                   }dj                  ||      }|t        t        | |t        j                  t        j                  d}t         j                  d	j                  |d
                t         j                  dj                  |d                t         j                  dj                  |d                t         j                  dj                  |d                t         j                  dj                  |d                t         j                  dj                  |d                t        |t                      t        |t                      t        |t!                      t        |t#                      t        |t%                      t        |t'                      t        |t)                      t        |t+                      t        |t-                      t        |t/                      t        |t1                      t        |t3                      t        |t5                      t         j                  d       |S )zo
	Returns the CPU info by using the best sources of information for your OS.
	Returns {} if nothing is found.
	zP!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!z32 bitz64 bit)il    zunknown bitsz{0}.{1}.{2}.{3}.{4}z	{0} ({1}))python_versioncpuinfo_versioncpuinfo_version_stringr  r   r0  r   zpython_version: {0}r  zcpuinfo_version: {0}r  z	arch: {0}r  z	bits: {0}r   z
count: {0}r0  zarch_string_raw: {0}r   )r   r$   r  rX   r   r   r  maxsizer   version_infoCPUINFO_VERSIONCPUINFO_VERSION_STRINGr   r>  rs  rx  r,  r.  r4  rT  r{  r6  rP  rN  rZ  r  r}  )r  r   friendly_maxsizefriendly_versionPYTHON_VERSIONrF   s         r   _get_cpu_info_internalr  S
  s,    	x *445t'(<@@M_Q_0)00#2B2BC$$%57GH $%3   00	 	$++D1A,BCD%,,T2C-DEF{!!$v,/0{!!$v,/0|""4=12%,,T2C-DEF $/12 $356 $79: $79: $023 $134 $023 $023 $ACD $:<= $245 $023 $9;<xr   c                  P   ddl } d}t        t        dd      r.t               }| j	                  |      }dj                  |      }|S ddlm}m} t        j                  t        dg} |||||      }|j                         d   }|j                  dk7  ry	|j                  d
      }|S )zs
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a json string
	r   NfrozenFrO  r   --jsonr   z{}r   r   )jsongetattrr  r  r  r   r   r   r   
executable__file__r   r   r   )r  rB   rF   r   r   r   r   s          r   get_cpu_info_jsonr  
  s     
 C5!		!$::d&<<&  	 %^^Xx0'WT$d;">>A&]]a
=='=*&r   c                  P    ddl } t               }| j                  |t              }|S )zl
	Returns the CPU info by using the best sources of information for your OS.
	Returns the result in a dict
	r   N)object_hook)r  r  r   r%  )r  rB   s     r   get_cpu_infor  
  s(     

 **V;*
7r   c            
      
   ddl m}  dd l} | d      }|j                  ddd       |j                  d	dd
       |j                  ddd       |j	                         }t        |j                  d      a	 t                t               }|s4t        j                  j                  d       t        j                  d       |j                  rt!        |j#                  |             y |j$                  rt!        t&               y t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        dj)                  |j+                  dd                   t!        d j)                  |j+                  d!d                   t!        d"j)                  |j+                  d#d                   t!        d$j)                  |j+                  d%d                   t!        d&j)                  |j+                  d'd                   t!        d(j)                  |j+                  d)d                   t!        d*j)                  |j+                  d+d                   t!        d,j)                  |j+                  d-d                   t!        d.j)                  |j+                  d/d                   t!        d0j)                  |j+                  d1d                   t!        d2j)                  |j+                  d3d                   t!        d4j)                  |j+                  d5d                   t!        d6j)                  |j+                  d7d                   t!        d8j)                  |j+                  d9d                   t!        d:j)                  |j+                  d;d                   t!        d<j)                  |j+                  d=d                   t!        d>j)                  |j+                  d?d                   t!        d@j)                  dAj-                  |j+                  dBd                         y # t        $ rK}t        j                  j                  t        |      dz          t        j                  d       Y d }~d }~ww xY w)CNr   )ArgumentParserzGets CPU info with pure Python)rq  r  
store_truezReturn the info in JSON format)actionhelpz	--versionz Return the version of py-cpuinfoz--tracez/Traces code paths used to find CPU info to fileFr0   r    zFailed to find cpu info
zPython Version: {0}r  r/   zCpuinfo Version: {0}r  zVendor ID Raw: {0}r   zHardware Raw: {0}r+  zBrand Raw: {0}r,  zHz Advertised Friendly: {0}r-  zHz Actual Friendly: {0}r.  zHz Advertised: {0}r/  zHz Actual: {0}r   z	Arch: {0}r  z	Bits: {0}r   z
Count: {0}r0  zArch String Raw: {0}r   zL1 Data Cache Size: {0}r:  zL1 Instruction Cache Size: {0}r;  zL2 Cache Size: {0}r1  zL2 Cache Line Size: {0}r2  zL2 Cache Associativity: {0}r3  zL3 Cache Size: {0}r9  zStepping: {0}r4  z
Model: {0}r5  zFamily: {0}r6  zProcessor Type: {0}r7  z
Flags: {0}z, r8  )argparser  r  add_argument
parse_argsr   r  r   r  r9   r  rN   r$   r6   exitr  printr  versionr  r   r   r7   )r  r  parserr  rO   rF   s         r   mainr  
  s   $ %E
FXl9YZ[<^_Y|:kl U#-
 	 **./((1+II

4
ll$$TXX.>%CDE%%dhh/G&LMN##DHH_b$ABC""488NB#?@Ab 9:;%,,TXX6NPR-STU!((2F)KLM##DHH_b$ABCb 9:;488FB/01488FB/01DHHWb123%%dhh/@"&EFG!((2F)KLM(//9TVX0YZ[##DHH_b$ABC!((2F)KLM%,,TXX6NPR-STU##DHH_b$ABCtxx
B789DHHWb123TXXh345$$TXX.>%CDEDIIdhhw&;<=>M 	 **3s8d?#((1++s   7
T 	UA UU__main__Fr#  )=r  r7   r6   r  r]   r  rm   r   r  r  r   objectr   rX   re   r   r   r  r  r!  r%  r>  rH  rM  r   rj  rs  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r,  r.  r4  r6  rN  rP  rT  rZ  rW  rY  rs  rx  r{  r}  r  r  r  r  rS   )r<   s   0r   <module>r     s  8 ?"Ca3q6"CD       $ 
yF yvH HV%4$=
	," <&, D(<,2Eh]~7r"CH CE >U& UpLF L\I#V	 bH^@-^_B@|~0=@?BPdRhgRBH DJX@6?r z]W #Ds   D