+
     Gi.P  c                   s   ^ RI HtHt ^ RIHt ^ RIHtHtHt ^ RI	H
t
HtHtHt ^ RIHt ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt]P.                  ! 4       tRtR	tR
tRtRtRtRtRt R]R]R]/t! ! R R]4      t" ! R R]PF                  4      t$ ! R R]PF                  4      t% ! R R]&4      t' ! R R]&4      t( ! R R]PR                  PT                  4      t+R# )i    )exportslogs)commands)PPD_CONFIG_FILEPPD_BASE_PROFILE_FILEPPD_API_COMPATIBILITY)	PPDConfigPPD_PERFORMANCEPPD_BALANCEDPPD_POWER_SAVER)Enum)RandomNtunedz-/sys/devices/system/cpu/intel_pstate/no_turboz4/sys/bus/platform/devices/thinkpad_acpi/dytc_lapmodeZunknownzorg.freedesktop.UPowerz/org/freedesktop/UPowerz#/sys/firmware/acpi/platform_profilez	low-powerZbalancedZperformancec                   s&    ] tR t^!tRtRtRtRtRtR# )PerformanceDegradedz/
Possible reasons for performance degradation.
 zlap-detectedzhigh-operating-temperature N)	__name__
__module____qualname____firstlineno____doc__NONELAP_DETECTEDHIGH_OPERATING_TEMPERATURE__static_attributes__r       9/usr/lib/python3.14/site-packages/tuned/ppd/controller.pyr   r   !   s     D!L!=r   r   c                   s<   a a ] tR t^*t oRtV 3R ltR tRtVtV ;t	# )PerformanceDegradedEventHandlerz5
Event handler for checking performance degradation.
c                sD   < \         \        V `  4        Wn        W n        R # N)superr   __init___controller_path)self
controllerpath	__class__   &&&r   r   Z(PerformanceDegradedEventHandler.__init__.   s    -t=?%
r   c                st    VP                   V P                  8w  d   R # V P                  P                  4        R # r   )pathnamer    r   check_performance_degradedr!   Zevent   &&r   process_IN_MODIFYZ1PerformanceDegradedEventHandler.process_IN_MODIFY3   s'    >>TZZ'335r   )r   r    )
r   r   r   r   r   r   r*   r   __classdictcell____classcell__r$   __classdict__   @@r   r   r   *   s     
6 6r   r   c                   sR   a a ] tR t^9t oRtRtV 3R ltR tR tR t	R t
RtVtV ;t# )	PlatformProfileEventHandlera_  
Event handler for switching PPD profiles based on the
ACPI platform profile

This handler should only invoke a PPD profile change if the
change of the file at PLATFORM_PROFILE_PATH comes from within
the kernel (e.g., when the user presses Fn-L on a Thinkpad laptop).
This is currently detected as the file being modified without
being opened before.
g?c                sT   < \         \        V `  4        Wn        R V n        ^ V n        R# )FN)r   r0   r   r   
_file_open_last_close)r!   r"   r$   s   &&r   r   Z$PlatformProfileEventHandler.__init__F   s&    )49;%r   c                sP    VP                   \        8w  d   R # RV n        ^ V n        R # )NT)r&   PLATFORM_PROFILE_PATHr1   r2   r(   r)   r   process_IN_OPENZ+PlatformProfileEventHandler.process_IN_OPENL   s!    >>22r   c                sv    VP                   \        8w  d   R # RV n        \        P                  ! 4       V n        R # NF)r&   r3   r1   timer2   r(   r)   r   process_IN_CLOSE_WRITEZ2PlatformProfileEventHandler.process_IN_CLOSE_WRITER   s'    >>2299;r   c                sB    VP                   \        8w  d   R # RV n        R # r5   )r&   r3   r1   r(   r)   r   process_IN_CLOSE_NOWRITEZ4PlatformProfileEventHandler.process_IN_CLOSE_NOWRITEX   s    >>22r   c                s    VP                   \        8w  gH   V P                  '       g6   V P                  V P                  ,           \
        P
                  ! 4       8  d   R # V P                  P                  4        R # r   )r&   r3   r1   r2   CLOSE_MODIFY_BUFFERr6   r   check_platform_profiler(   r)   r   r*   Z-PlatformProfileEventHandler.process_IN_MODIFY]   sa    >>22doooIYIY\`\t\tItw{  xA  xA  xC  JC //1r   )r   r1   r2   )r   r   r   r   r   r9   r   r4   r7   r8   r*   r   r+   r,   r-   r/   r   r0   r0   9   s0     	 ' 
2 2r   r0   c                   s0   a  ] tR t^ft o RtR tR tRtV tR# )ProfileHoldzq
Class holding information about a single profile hold,
i.e., a temporary profile switch requested by a process.
c                sB    Wn         W n        W0n        W@n        WPn        R # r   )profilereasonapp_idcallerwatch)r!   r<   r=   r>   r?   r@   s   &&&&&&r   r   ZProfileHold.__init__k   s    
r   c                sN    RV P                   RV P                  RV P                  /# )z6
Returns the hold information as a Python dictionary.
ProfileZReasonZApplicationId)r<   r=   r>   r!      &r   as_dictZProfileHold.as_dictr   s)    
 t||dkkT[[
 	
r   )r>   r?   r<   r=   r@   N)	r   r   r   r   r   r   rD   r   r+   r.      @r   r;   r;   f   s     
 
r   r;   c                   s`   a  ] tR t^}t o RtR tR tR tR tR t	R t
R tR	 tR
 tR tRtV tR# )ProfileHoldManagerz
Manager of profile holds responsible for their creation/deletion
and for choosing the effective one. Holds are identified using
integer cookies which are distributed to the hold-requesting processes.
c                s>    / V n         \        4       V n        Wn        R # r   )_holdsr   _cookie_generatorr   )r!   r"   r)   r   r   ZProfileHoldManager.__init__   s    !'%r   c                s   a aa VVV 3R lpV# )z~
Returns the callback to invoke when the process with the given ID
(which requested a hold with the given cookie) disappears.
c                 sx   < V R 8X  d2   \         P                  RS: RS: R24       SP                  S4       R# R# )r   zApplication 'z' disappeared, releasing hold ''N)loginforemove)Znamer>   cookier!   s   &r   callbackZ6ProfileHoldManager._removal_callback.<locals>.callback   s.    rzPVX^_`F# r   r   )r!   rN   r>   rO   s   fff r   _removal_callbackZ$ProfileHoldManager._removal_callback   s    
	$
 r   c                s    \         ;QJ d4    R V P                  P                  4        4       F  '       g   K   RM)	  RM%! R V P                  P                  4        4       4      '       d   \        # \        # )z:
Returns the hold to use from the set of all active ones.
c              3   sF   "   T F  qP                   \        8H  x  K  	  R # 5ir   )r<   r	   )Z.0hold   & r   Z	<genexpr>Z=ProfileHoldManager._effective_hold_profile.<locals>.<genexpr>   s     P;O4||.;Os   !TF)ZanyrH   valuesr	   r   rB   rC   r   _effective_hold_profileZ*ProfileHoldManager._effective_hold_profile   sK     3P4;;;M;M;OP333P4;;;M;M;OPPP""r   c           	     sx   WP                   9  d   R# V P                   P                  V4      pVP                  P                  4        \        P
                  ! RV4       \        P                  ! RV P                  4       4       \        P                  RV: RVP                  : RVP                  : R24       R# )z3
Cancels the hold saved under the provided cookie.
NProfileReleasedActiveProfileHoldszReleasing hold '': profile '' by application 'rJ   )rH   Zpopr@   Zcancelr    Zsend_signalproperty_changedas_dbus_arrayrK   rL   r<   r>   )r!   rN   rQ      && r   _cancelZProfileHoldManager._cancel   s     ${{v&

-v6  !5t7I7I7KLFTXT`T`bfbmbmnor   c                s    \         P                  ! V P                  P                  4        Uu. uF  qP	                  4       NK  	  upRR7      # u upi )zI
Returns the information about current holds as a DBus-compatible array.
a{sv}Z	signature)dbusArrayrH   rS   rD   )r!   rQ   rR   r   rZ   Z ProfileHoldManager.as_dbus_array   s;     zzdkk6H6H6JK6Jd<<>6JKW^__Ks   Ac           	     s   ^ pV^ 8X  g   WPP                   9   d   V P                  P                  ^ R4      pK5  V P                  P                  P                  W@P                  WS4      4      p\        P                  RV: RV: RV: R24       \        WW4V4      V P                   V&   \        P                  ! RV P                  4       4       V P                  P                  V P                  4       4       V# )z
Adds a new profile hold.
zAdding hold 'rW   rX   rJ   rV   l    )rH   rI   Zrandintr   busZwatch_name_ownerrP   rK   rL   r;   r    rY   rZ   switch_profilerT   )r!   r<   r=   r>   r?   rN   r@   s   &&&&&  r   addZProfileHoldManager.add   s     kV{{2++33Aw?F  $$55f>T>TU[>deQXZ`ab)'65QF  !5t7I7I7KL''(D(D(FGr   c                s    WP                   9   # )z9
Returns True if there is a hold under the given cookie.
)rH   r!   rN   r)   r   hasZProfileHoldManager.has   s     $$r   c                s    V P                  V4       \        V P                  4      ^ 8w  d   V P                  4       pMV P                  P
                  pV P                  P                  V4       R# )zN
Releases the hold saved under the provided cookie and
sets the next profile.
N)r\   ZlenrH   rT   r   base_profilerb   )r!   rN   new_profiler[   r   rM   ZProfileHoldManager.remove   sT    
 	Vt{{q 668K**77K''4r   c                s|    \        V P                  P                  4       4       F  pV P                  V4       K  	  R# )z
Releases all profile holds.
N)listrH   keysr\   rd   rR   r   clearZProfileHoldManager.clear   s,     4;;++-.FLL  /r   c                sn    WP                   9   ;'       d!    V P                   V,          P                  V8H  # r   )rH   r?   r!   rN   r?      &&&r   check_callerZProfileHoldManager.check_caller   s+    $MMV)<)C)Cv)MMr   )r   rI   rH   N)r   r   r   r   r   r   rP   rT   r\   rZ   rc   re   rM   rj   rm   r   r+   rE   rF   r   rG   rG   }   sE     
&


p`%
5!N Nr   rG   c                   s  a a ] tR t^t oRtV 3R ltR tR tR tR t	R t
R tR	 tR
 tR tR tR tR t]R 4       t]R 4       tR tR t]P0                  ! RRR4      R 4       t]P0                  ! RRR4      R 4       t]P6                  ! R4      R 4       t]P:                  ! RR4      R 4       t]P>                  ! R4      R 4       t ]P>                  ! R4      R  4       t!]P>                  ! R!4      R" 4       t"]P>                  ! R#4      R$ 4       t#]P>                  ! R%4      R& 4       t$]P>                  ! R'4      R( 4       t%R)t&Vt'V ;t(# )*
Controllerz>
The main tuned-ppd controller, exporting its DBus interface.
c                s  < \         \        V `  4        Wn        W n        \        4       V n        \        P                  ! 4       V n	        R V n
        RV n        \        P                  ! 4       V n        \        P                  ! V P                  4      V n        / V n        . V n        \&        P(                  P+                  \,        4      V n        \&        P(                  P+                  \0        4      V n        \&        P(                  P+                  \4        4      V n        V P                  P9                  RV P:                  4       V P=                  4        R # )NFZprofile_changed)r   rn   r   _bus_tuned_interfacer   _cmd	threadingZEvent
_terminate_battery_handler_on_battery	pyinotifyZWatchManager_watch_managerZThreadedNotifier	_notifier_inotify_watches_pinned_virtual_filesosr#   Zisfiler3   _platform_profile_supportedNO_TURBO_PATH_no_turbo_supportedLAP_MODE_PATH_lap_mode_supportedconnect_to_signal_tuned_profile_changed
initialize)r!   ra   Ztuned_interfacer$   r%   r   r   ZController.__init__   s    j$(*	 /J	#//+ $ '446"33D4G4GH "%'"+-77>>:O+P(#%77>>-#@ #%77>>-#@ //0A4C^C^_r   c                s    \        V P                  P                  \        R4      4      V n        \
        P                  RV P                  '       d   RMR,           4       V P                  V P                  4       R# )z7
The callback to invoke when the power supply changes.
	OnBatteryzBattery status changed: zDC (battery)zAC (charging)N)	bool_upower_propertiesGetUPOWER_DBUS_INTERFACEru   rK   rL   rb   _active_profile)r!   Z	interfaceZchangedZinvalidateds   &&&&r   _upower_changedZController._upower_changed   sZ       7 7 ; ;<QS^ _`+AQAQAQ~WfghD001r   c                sr   V'       g   R# WP                   P                  4       8w  d   \        P                  R4       R#  V P                  P
                  P                  WP                  4      pV P                  V8w  d   \        P                  RV,          4       V P                  P                  4        W@n        \        P                   ! RV P                  4       V\        8w  d   W@n        V P%                  V4       R# R# R#   \         d&    \        p\        P                  RT,          4        Li ; i)z=
The callback to invoke when TuneD signals a profile change.
NzLReceived a profile change signal from TuneD, but it is not relevant anymore.z0TuneD profile changed to an unknown profile '%s'zProfile changed to '%s'ActiveProfile)rp   active_profilerK   debug_configtuned_to_ppdgetru   KeyErrorUNKNOWN_PROFILEwarningr   rL   _profile_holdsrj   r    rY   _base_profile_save_base_profile)r!   tuned_profileZresultZerrstrppd_profiles   &&&& r   r   Z!Controller._tuned_profile_changed   s     11@@BBIIde	\,,3377GWGWXK ;.HH.<=%%'#. $$_d6J6JKo-%0"''4 . /  	\)KKKJ]Z[	\s   /D -D65D6c                s   RV n         V P                  P                  '       g2   V P                  e"   V P                  P	                  4        RV n        R#  V P                  fp   V P
                  P                  \        \        4      p\        P                  ! V\        P                  4      V n        VP                  RV P                  4      V n        \        V P                  P!                  \"        R4      4      V n         R#   \        P$                  P&                   d!   p\(        P+                  T4        Rp?R# Rp?ii ; i)z+
Sets up handling of power supply changes.
FNZPropertiesChangedr   )ru   r   Zbattery_detectionrt   rM   ro   Z
get_objectUPOWER_DBUS_NAMEUPOWER_DBUS_PATHr_   Z	InterfaceZPROPERTIES_IFACEr   r   r   r   r   r   
exceptionsDBusExceptionrK   r   )r!   Zupower_proxyerror   &  r   _setup_battery_signalingZ#Controller._setup_battery_signaling  s     !||---$$0%%,,.(,%	$$,#yy334DFVW*...tG\G\*]'(4(F(FGZ\`\p\p(q%#D$;$;$?$?@UWb$cdD,, 	IIe	s   B+D E"D==Ec           
     s   V P                    F  pVP                  4        K  	  V P                   P                  4        V P                  P	                  \        V P                  P                  4       4      4       V P                  '       d   V P                   P                  \        \        R4      4       V ;P                  V P                  P                  \        P                  P                  \        4      \         P"                  \%        V \        4      R7      ,          un        V P&                  '       d   V P                   P                  \        \(        R4      4       V ;P                  V P                  P                  \        P                  P                  \(        4      \         P"                  \%        V \(        4      R7      ,          un        V P*                  '       d   V P,                  P.                  '       d   V P                   P                  \        \0        R4      4       V ;P                  V P                  P                  \        P                  P                  \0        4      \         P2                  \         P"                  ,          \         P4                  ,          \         P6                  ,          \9        V 4      R7      ,          un        R# R# R# )z
Sets up inotify file watches.
Zr)r#   ZmaskZproc_funN)rz   closerj   rw   rm_watchrh   ry   rS   r~   ZappendZopenr}   Z	add_watchr{   r#   Zdirnamerv   Z	IN_MODIFYr   r   r   r|   r   Zsysfs_acpi_monitorr3   ZIN_OPENZIN_CLOSE_WRITEZIN_CLOSE_NOWRITEr0   r!   ZfrR   r   _setup_inotifyZController._setup_inotify!  s!    ++AGGI ,""((*$$T$*?*?*F*F*H%IJ###&&--d=#.FG!!T%8%8%B%BXeHfHQH[H[Lklpr  MA &C &B B! ###&&--d=#.FG!!T%8%8%B%BXeHfHQH[H[Lklpr  MA &C &B B! +++0O0O0O&&--d3H#.NO!!T%8%8%B%BXmHnHQHYHY\e\o\oHor{  sK  sK  IK  NW  Nh  Nh  IhLghlLm &C &o o! 1P+r   c                s   \         P                  p\        P                  P	                  \
        4      '       dC   V P                  P                  \
        4      P                  4       R8X  d   \         P                  p\        P                  P	                  \        4      '       dC   V P                  P                  \        4      P                  4       R8X  d   \         P                  pWP                  8w  dP   \        P                  RVP                  ,          4       Wn        \         P"                  ! RVP                  4       R# R# )zU
Checks the current performance degradation status and sends a signal if it changed.
Z1zPerformance degraded: %sr   N)r   r   r{   r#   Zexistsr}   rq   	read_filestripr   r   r   _performance_degradedrK   rL   valuer    rY   )r!   Zperformance_degradedrR   r   r'   Z%Controller.check_performance_degraded9  s      37777>>-((TYY-@-@-O-U-U-W[^-^#6#Q#Q 77>>-((TYY-@-@-O-U-U-W[^-^#6#C#C #=#==HH/2F2L2LLM)=&$$%:<P<V<VW >r   c                sP   V P                   P                  \        4      P                  4       pV\        9  d   R# \
        P                  RV,          4       \        V,          pV P                  P                  4        V P                  V4       W n
        V P                  V4       R# )zP
Sets the active PPD profile based on the content of the ACPI platform profile.
NzPlatform profile changed: %s)rq   r   r3   r   PLATFORM_PROFILE_MAPPINGrK   r   r   rj   rb   r   r   )r!   Zplatform_profilerg   r   r   r:   Z!Controller.check_platform_profileG  s      99../DEKKM#;;		03CCD./?@!!#K((,r   c                st    V P                   P                  \        RR7      P                  4       ;'       g    R# )z/
Loads and returns the saved PPD base profile.
T)Zno_errorN)rq   r   r   r   rB   rC   r   _load_base_profileZController._load_base_profileU  s1     yy""#84"HNNPXXTXXr   c                s    V P                   P                  4       p V P                  P                  P	                  WP
                  4      pV#   \         d    \        P                  RT4        R# i ; i)z 
Get TuneD recommended profile.
z+TuneD recommends profile unknown to PPD: %sN)	rp   Zrecommend_profiler   r   r   ru   r   rK   r   )r!   r   r   r   r   _get_recommend_profileZ!Controller._get_recommend_profile[  sh     --??A	,,3377GWGWXK   	KKE}U	s   /A !A21A2c                sT    V P                   P                  \        VR,           4       R# )z9
Saves the given PPD profile into the base profile file.
Z
N)rq   Zwrite_to_filer   r!   r<   r)   r   r   ZController._save_base_profileg  s     			 5w~Fr   c                s   V P                   P                  4       pW!8X  d   R# \        P                  RV,          4       V P                   P	                  V4      w  r4V'       g   \        P                  \        V4      4       \        V4      # )z=
Sets the TuneD profile to the given one if not already set.
TzSetting TuneD profile to '%s')rp   r   rK   rL   rb   r   Zstrr   )r!   r   Zactive_tuned_profileZokZ	error_msgs   &&   r   _set_tuned_profileZController._set_tuned_profilem  sh      $44CCE00=@A--<<]KIIc)n%Bxr   c                s   RV n         \        V 4      V n        \        P                  V n        V P                  4        \        \        V P                  4      V n
        V P                  4        V P                  4       ;'       g/    V P                  4       ;'       g    V P                  P                  V n        V P!                  V P                  4       V P#                  V P                  4       V P%                  4        R# )z
Initializes the controller.
N)r   rG   r   r   r   r   r'   r   r   rp   r   r   r   r   Zdefault_profiler   rb   r   r   rB   rC   r   r   ZController.initializez  s      $06%8%=%="'') $2G2GH%%'"557 - -4;V;V;X - -,, 	D../ 2 23r   c                s   \         P                  ! 4        V P                  P                  4        V P                  P	                  V P
                  ^4      '       g   K.  V P                   F  pVP                  4        K  	  V P                  P                  4        V P                  P                  \        V P                  P                  4       4      4       V P                  P                  4        \         P                  ! 4        R# )z;
Exports the DBus interface and runs the main daemon loop.
N)r    Zstartrx   rq   Zwaitrs   rz   r   rj   rw   r   rh   ry   rS   Zstopr   rR   r   runZController.run  s     	))..!44++AGGI ,""((*$$T$*?*?*F*F*H%IJr   c                    V P                   # )z7
DBus interface for communication with other services.
)ro   rB   rC   r   ra   ZController.bus  s    
 yyr   c                r   )z
The base PPD profile. This is the profile to restore when
all profile holds are released or when tuned-ppd is restarted.
It may not be equal to the currently active profile.
)r   rB   rC   r   rf   ZController.base_profile  s     !!!r   c                s:    V P                   P                  4        R# )z$
Stops the main loop of the daemon.
N)rs   ZsetrB   rC   r   	terminateZController.terminate  s     	r   c                s    V P                  V P                  P                  P                  WP                  4      4      '       g   R# V P
                  V8w  d   \        P                  ! RV4       Wn        R# )zk
Sets the currently active profile to the given one, if not already set.
Does not change the base profile.
Fr   T)r   r   ppd_to_tunedr   ru   r   r    rY   r   r)   r   rb   ZController.switch_profile  sZ    
 &&t||'@'@'D'DWN^N^'_``7*$$_g>#* r   ZsssZuzhold-profilec                s    V\         8w  d<   V\        8w  d1   \        P                  P	                  R\         : R\        : R24      hV P
                  P                  WW44      # )zD
Initiates a profile hold and returns a cookie for referring to it.
zOnly 'z' and 'z' profiles may be held)r	   r   r_   r   r   r   rc   )r!   r<   r=   r>   r?   s   &&&&&r   HoldProfileZController.HoldProfile  sM    
 o%'_*D////=Lo^  ""&&wGGr   r   zrelease-profilec                sJ   V P                   P                  V4      '       g'   \        P                  P	                  RV,          4      hV P                   P                  W4      '       g    \        P                  P	                  R4      hV P                   P                  V4       R# )z0
Releases a held profile with the given cookie.
zNo active hold for cookie '%s'z<Cannot release a profile hold inititated by another process.N)r   re   r_   r   r   rm   rM   rk   rl   r   ReleaseProfileZController.ReleaseProfile  sx    
 ""&&v..////0PSY0YZZ""//??////0noo""6*r   c                s    R# )z7
The DBus signal sent when a held profile is released.
Nr   rd   r)   r   rU   ZController.ProfileReleased  s    
 	r   r   zswitch-profilec                s   WP                   P                  P                  V P                  4      9  d'   \        P
                  P                  RV,          4      h\        P                  RV,          4       V P                  P                  4        V P                  V4      '       g'   \        P
                  P                  RV,          4      hWn        V P                  V4       R# )z~
Sets the base profile to the given one and also makes it active.
If there are any active profile holds, these are cancelled.
zInvalid profile '%s'zSetting base profile to %szError setting profile %s'N)r   r   ri   ru   r_   r   r   rK   r   r   rj   rb   r   r   )r!   r<   r?   rl   r   set_active_profileZController.set_active_profile  s     ,,33889I9IJJ////0F0PQQ		.89!!#""7++////0Kg0UVV$(r   c                r   )z+
Returns the currently active PPD profile.
)r   r!   r?   r)   r   get_active_profileZController.get_active_profile  s    
 ###r   ZProfilesc           	     s    \         P                  ! V P                  P                  P	                  V P
                  4       Uu. uF  pRVR\        /NK  	  upRR7      # u upi )z5
Returns a DBus array of all available PPD profiles.
rA   ZDriverr]   r^   )r_   r`   r   r   ri   ru   DRIVER)r!   r?   r<   r[   r   get_profilesZController.get_profiles  sT    
 zzCG<<C\C\CaCabfbrbrCstCsi(F3Cst
 	
ts   AZActionsc                s2    \         P                  ! . RR7      # )zK
Returns a DBus array of all available actions (currently there are none).
Zsr^   )r_   r`   r   r)   r   get_actionsZController.get_actions  s    
 zz",,r   r   c                s.    V P                   P                  # )z5
Returns the current performance degradation status.
)r   r   r   r)   r   get_performance_degradedZ#Controller.get_performance_degraded  s    
 ))///r   rV   c                s6    V P                   P                  4       # )z/
Returns a DBus array of active profile holds.
)r   rZ   r   r)   r   get_active_profile_holdsZ#Controller.get_active_profile_holds  s    
 ""0022r   ZVersionc                s    \         # r   )r   r   r)   r   versionZController.version  s    $$r   )r   r   rt   ro   rq   r   ry   r   r~   rx   ru   r   rz   r|   r   rs   rp   r   rw   ))r   r   r   r   r   r   r   r   r   r   r'   r:   r   r   r   r   r   r   Zpropertyra   rf   r   rb   r    Zexportr   r   ZsignalrU   Zproperty_setterr   Zproperty_getterr   r   r   r   r   r   r   r+   r,   r-   r/   r   rn   rn      s    $25.&o0X-Y
G    " "
 ^^E3/H 0H ^^C./+ 0+ ^^C  _.>?) @) _-$ .$ Z(
 )
 Y'- (- 230 40 123 33 Y'% (% %r   rn   ),r   r    r   Ztuned.utils.commandsr   Ztuned.constsr   r   r   Ztuned.ppd.configr   r   r   r	   Zenumr
   Zrandomr   rv   rr   r_   r{   r6   r   rK   r   r}   r   r   r   r   r   r3   r   r   ZProcessEventr   r0   Zobjectr;   rG   Z
interfacesZExportableInterfacern   r   r   r   <module>r      s     ) V V V V      	 
hhj	?F+ , 0 = ? >$ >6i&<&< 6*2)"8"8 *2Z
& 
.YN YNxv%##77 v%r   