
    /I_
                     f    S SK r S SKrS SKJr   S SK7   " S S5      rg! \ a
  r SrCNSrCff = f)    N)deque)*c                   \    \ rS rSrSr\R                  " S5      r\S 5       r	\S 5       r
Srg)graph   z2graph functions to sort and print interface graph zifupdown.graphc                    / n[        5       n[        R                  " U5      n[        UR	                  5       5       H  u  pgUS:X  d  M  UR                  U5        M      [        U5      (       a  UR                  5       nUR                  U5      n	U	(       d  UR                  U5        MK  U	 HB  n
 UR                  U
5      S-
  XZ'   UR                  U
5      S:X  d  M1  UR                  U
5        MD     UR                  U5        [        U5      (       a  M  [        UR	                  5       5       H  u  pgUS:w  d  M  [        SU-  SU-  -   5      e   U$ ! [         a%    U R                  R                  SU
-  5        SXZ'    Nf = f)a  runs topological sort on interface list passed as dependency graph

Args:
    **dependency_graphs** (dict): dependency graph with dependency
                                  lists for interfaces

    **indegrees_arg** (dict): indegrees array for all interfaces
r      z,topological_sort_graphs_all: did not find %szcycle found involving iface %sz (indegree %d))r   copydeepcopylistitemsappendlenpopleftget	Exceptionloggerdebug)clsdependency_graphsindegrees_argSQ	indegreesifnameindegreexdlistys              &/usr/share/ifupdown2/ifupdown/graph.pytopological_sort_graphs_all!graph.topological_sort_graphs_all   sZ    GMM-0	#IOO$56OF1}   7 !ff		A &))!,E#,==#3a#7IL
 ==#q(HHQK  HHQK) !ff,  $IOO$56OF1} @& H 0( :!; < <  7
  ! JJ$$%SUV%VW#$ILs   /E,F Fc                 n   [        5       n0 n[        UR                  5       5       H  nUR                  U5      XE'   M     [        UR	                  5       5       HI  u  peUR                  U/ 5      nU(       d  M   U H#  nUR                  XTR                  U5      5        M%     MK     UR                  5         g)zspits out interface dependency graph in dot format

Args:
    **dependency_graphs** (dict): dependency graph with dependency
                                  lists for interfaces

    **indegrees_arg** (dict): indegrees array for all interfaces
N)GvGenr   keysnewItemr   r   newLinkdot)	r   dependency_graphr   gvgraph
graphnodesvir   ds	            r    generate_dotsgraph.generate_dotsI   s     '
&++-.A#OOA.JM / ))+,DA$((B/E>>!#45 	 - 	     N)__name__
__module____qualname____firstlineno____doc__logging	getLoggerr   classmethodr!   r/   __static_attributes__r2   r1   r    r   r      s=    =/0F, ,\  r1   r   )r
   r8   collectionsr   gvgenImportErrorer   r2   r1   r    <module>r@      s9      	
J J	  		s     00