§
    ¤”j°; ã                   ó¼   — d dl Z d dlZd dlmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZ d dlmZ d dlmZ d d	lmZ d d
lmZ d dlmZ d dlmZmZmZ  G d„ d¦  «        ZdS )é    N)Údefaultdict)ÚTopologicalSorter)Úchain)Úsettings)Úmodels)Ú
operations)Ú	Migration)ÚAlterModelOptions)ÚMigrationOptimizer)ÚMigrationQuestioner)ÚCOMPILED_REGEX_TYPEÚRegexObjectÚresolve_relationc                   ó€  — e Zd ZdZd7d„Zd8d„Zd„ Zd„ Zd9d„Zd„ Z	d	„ Z
ed
„ ¦   «         Zd7d„Zd„ Zd„ 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%ed%„ ¦   «         Z&d&„ Z'd'„ Z(d(„ Z)d)„ Z*d*„ Z+d+„ Z,d,„ Z-d-„ Z.d.„ Z/d/„ Z0d0„ Z1d1„ Z2d2„ Z3d3„ Z4d7d4„Z5d5„ Z6e7d6„ ¦   «         Z8dS );ÚMigrationAutodetectora  
    Take a pair of ProjectStates and compare them to see what the first would
    need doing to make it match the second (the second usually being the
    project's current state).

    Note that this naturally operates on entire projects at a time,
    as it's likely that changes interact (for example, you can't
    add a ForeignKey without having a migration to add the table it
    depends on first). A user interface may offer single-app usage
    if it wishes, with the caveat that it may not always be possible.
    Nc                 óx   — || _         || _        |pt          ¦   «         | _        d„ |j        D ¦   «         | _        d S )Nc                 ó   — h | ]\  }}|’ŒS © r   )Ú.0ÚappÚmodels      úp/var/www/finuniver-perm.ru/html/portfolio/venv/lib/python3.11/site-packages/django/db/migrations/autodetector.pyú	<setcomp>z1MigrationAutodetector.__init__.<locals>.<setcomp>&   s   € ÐFÐFÐF¡j c¨5˜cÐFÐFÐFó    )Ú
from_stateÚto_stater   Ú
questionerr   Úexisting_apps)Úselfr   r   r   s       r   Ú__init__zMigrationAutodetector.__init__"   sB   € Ø$ˆŒØ ˆŒØ$Ð=Õ(;Ñ(=Ô(=ˆŒØFÐF°JÔ4EÐFÑFÔFˆÔÐÐr   c                 ó�   — |                       ||¦  «        }|                      |||¦  «        }|r|                      ||¦  «        }|S )zÌ
        Main entry point to produce a list of applicable changes.
        Take a graph to base names on and an optional set of apps
        to try and restrict to (restriction is not guaranteed)
        )Ú_detect_changesÚarrange_for_graphÚ_trim_to_apps)r   ÚgraphÚtrim_to_appsÚconvert_appsÚmigration_nameÚchangess         r   r)   zMigrationAutodetector.changes(   sS   € ð ×&Ò& |°UÑ;Ô;ˆØ×(Ò(¨°%¸ÑHÔHˆØð 	@Ø×(Ò(¨°,Ñ?Ô?ˆGØˆr   c                 ó0  ‡ — t          |t          ¦  «        rˆ fd„|D ¦   «         S t          |t          ¦  «        rt          ˆ fd„|D ¦   «         ¦  «        S t          |t          ¦  «        r ˆ fd„|                     ¦   «         D ¦   «         S t          |t
          j        ¦  «        r:|j        ‰                      |j	        ¦  «        ‰                      |j
        ¦  «        fS t          |t          ¦  «        rt          |¦  «        S t          |t          ¦  «        r|S t          |d¦  «        rm|                     ¦   «         }t          |t           j        ¦  «        r
|dd…         }|\  }}}|ˆ fd„|D ¦   «         ˆ fd„|                     ¦   «         D ¦   «         fS |S )	zÈ
        Recursive deconstruction for a field and its arguments.
        Used for full comparison for rename/alter; sometimes a single-level
        deconstruction will not compare correctly.
        c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   ©Údeep_deconstruct©r   Úvaluer   s     €r   ú
<listcomp>z:MigrationAutodetector.deep_deconstruct.<locals>.<listcomp>;   s'   ø€ ÐBÐBÐB°U�D×)Ò)¨%Ñ0Ô0ÐBÐBÐBr   c              3   óB   •K  — | ]}‰                      |¦  «        V — Œd S ©Nr,   r.   s     €r   ú	<genexpr>z9MigrationAutodetector.deep_deconstruct.<locals>.<genexpr>=   s1   øè è € ÐGÐG¸%˜×.Ò.¨uÑ5Ô5ÐGÐGÐGÐGÐGÐGr   c                 óB   •— i | ]\  }}|‰                      |¦  «        “ŒS r   r,   ©r   Úkeyr/   r   s      €r   ú
<dictcomp>z:MigrationAutodetector.deep_deconstruct.<locals>.<dictcomp>?   s-   ø€ ÐTÐTÐT¹*¸#¸u�C˜×.Ò.¨uÑ5Ô5ÐTÐTÐTr   Údeconstructé   Nc                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r   r,   r.   s     €r   r0   z:MigrationAutodetector.deep_deconstruct.<locals>.<listcomp>T   s'   ø€ Ð@Ð@Ð@°%�×&Ò& uÑ-Ô-Ð@Ð@Ð@r   c                 óB   •— i | ]\  }}|‰                      |¦  «        “ŒS r   r,   r5   s      €r   r7   z:MigrationAutodetector.deep_deconstruct.<locals>.<dictcomp>U   s-   ø€ ÐTÐTÐT±z°s¸E��d×+Ò+¨EÑ2Ô2ÐTÐTÐTr   )Ú
isinstanceÚlistÚtupleÚdictÚitemsÚ	functoolsÚpartialÚfuncr-   ÚargsÚkeywordsr   r   ÚtypeÚhasattrr8   r   ÚField)r   ÚobjÚdeconstructedÚpathrD   Úkwargss   `     r   r-   z&MigrationAutodetector.deep_deconstruct4   s¹  ø€ õ �c�4Ñ Ô ð 	ØBÐBÐBÐB¸cÐBÑBÔBÐBÝ˜�UÑ#Ô#ð 	ÝÐGÐGÐGÐGÀ3ÐGÑGÔGÑGÔGÐGÝ˜�TÑ"Ô"ð 	ØTÐTÐTÐTÈÏ	Ê	ÉÌÐTÑTÔTÐTÝ˜�YÔ.Ñ/Ô/ð 	à”Ø×%Ò% c¤hÑ/Ô/Ø×%Ò% c¤lÑ3Ô3ðð õ
 ˜Õ0Ñ1Ô1ð 	Ý˜sÑ#Ô#Ð#Ý˜�TÑ"Ô"ð 	ð ˆJÝ�S˜-Ñ(Ô(ð 	ØŸOšOÑ-Ô-ˆMÝ˜#�vœ|Ñ,Ô,ð 2à -¨a¨b¨bÔ 1�Ø!.ÑˆD�$˜àØ@Ð@Ð@Ð@¸4Ð@Ñ@Ô@ØTÐTÐTÐTÀVÇ\Â\Á^Ä^ÐTÑTÔTðð ð ˆJr   c                 ó
  — g }t          |                     ¦   «         ¦  «        D ]^\  }}|                      |¦  «        }|j        r(|j        j        r|d                              dd¦  «         |                     |¦  «         Œ_|S )zÒ
        Return a definition of the fields that ignores field names and
        what related fields actually relate to. Used for detecting renames (as
        the related fields change during renames).
        é   ÚtoN)Úsortedr@   r-   Úremote_fieldr   ÚpopÚappend)r   ÚfieldsÚ
fields_defÚnameÚfieldÚdeconstructions         r   Úonly_relation_agnostic_fieldsz3MigrationAutodetector.only_relation_agnostic_fieldsZ   s�   € ð ˆ
Ý! &§,¢,¡.¤.Ñ1Ô1ð 	.ð 	.‰KˆD�%Ø!×2Ò2°5Ñ9Ô9ˆNØÔ!ð 2 eÔ&8Ô&>ð 2Ø˜qÔ!×%Ò% d¨DÑ1Ô1Ð1Ø×Ò˜nÑ-Ô-Ð-Ð-ØÐr   c                 óv	  — i | _         i | _        i | _        i | _        t	          ¦   «         | _        t	          ¦   «         | _        t	          ¦   «         | _        t	          ¦   «         | _        t	          ¦   «         | _	        t	          ¦   «         | _
        | j        j                             ¦   «         D ]¡\  \  }}}|j                             dd¦  «        s| j                             ||f¦  «         Œ@|| j        j        vrS|j                             d¦  «        r| j                             ||f¦  «         Œ…| j                             ||f¦  «         Œ¢| j        j                             ¦   «         D ]§\  \  }}}|j                             dd¦  «        s| j
                             ||f¦  «         Œ@|| j        j        vs|rW||v rS|j                             d¦  «        r| j	                             ||f¦  «         Œ‹| j                             ||f¦  «         Œ¨| j                             ¦   «          | j                             ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                      ¦   «          |                       ¦   «          |  !                    ¦   «          |  "                    ¦   «          |  #                    ¦   «          |  $                    ¦   «          |  %                    ¦   «          |  &                    ¦   «          |  '                    ¦   «          |  (                    ¦   «          |  )                    ¦   «          |  *                    ¦   «          |  +                    ¦   «          |  ,                    ¦   «          |  -                    ¦   «          |  .                    ¦   «          |  /                    ¦   «          |  0                    ¦   «          |  1                    |¦  «         |  2                    ¦   «          | j3        S )aX  
        Return a dict of migration plans which will achieve the
        change from from_state to to_state. The dict has app labels
        as keys and a list of migrations as values.

        The resulting migrations aren't specially named, but the names
        do matter for dependencies inside the set.

        convert_apps is the list of apps to convert to use migrations
        (i.e. to make initial migrations for, in the usual case)

        graph is an optional argument that, if provided, can help improve
        dependency generation and avoid potential circular dependencies.
        ÚmanagedTÚproxy)4Úgenerated_operationsÚaltered_indexesÚaltered_constraintsÚrenamed_fieldsÚsetÚold_model_keysÚold_proxy_keysÚold_unmanaged_keysÚnew_model_keysÚnew_proxy_keysÚnew_unmanaged_keysr   r   r@   ÚoptionsÚgetÚaddÚ	real_appsr   Úresolve_fields_and_relationsÚgenerate_renamed_modelsÚ_prepare_field_listsÚ_generate_through_model_mapÚgenerate_deleted_modelsÚgenerate_created_modelsÚgenerate_deleted_proxiesÚgenerate_created_proxiesÚgenerate_altered_optionsÚgenerate_altered_managersÚ!generate_altered_db_table_commentÚcreate_renamed_fieldsÚcreate_altered_indexesÚcreate_altered_constraintsÚgenerate_removed_constraintsÚgenerate_removed_indexesÚgenerate_renamed_fieldsÚgenerate_renamed_indexesÚ(generate_removed_altered_unique_togetherÚ'generate_removed_altered_index_togetherÚgenerate_removed_fieldsÚgenerate_added_fieldsÚgenerate_altered_fieldsÚ&generate_altered_order_with_respect_toÚ generate_altered_unique_togetherÚgenerate_altered_index_togetherÚgenerate_added_indexesÚgenerate_added_constraintsÚgenerate_altered_db_tableÚ_sort_migrationsÚ_build_migration_listÚ_optimize_migrationsÚ
migrations)r   r'   r%   Ú	app_labelÚ
model_nameÚmodel_states         r   r"   z%MigrationAutodetector._detect_changesh   s…  € ð& %'ˆÔ!Ø!ˆÔØ#%ˆÔ Ø ˆÔõ "™eœeˆÔÝ!™eœeˆÔÝ"%¡%¤%ˆÔÝ!™eœeˆÔÝ!™eœeˆÔÝ"%¡%¤%ˆÔØ48´OÔ4J×4PÒ4PÑ4RÔ4Rð 	Eð 	EÑ0Ñ#ˆY˜
 [ØÔ&×*Ò*¨9°dÑ;Ô;ð EØÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDÐDØ $¤/Ô";Ð;Ð;ØÔ&×*Ò*¨7Ñ3Ô3ð EØÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDÐDàÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDøà48´MÔ4H×4NÒ4NÑ4PÔ4Pð 		Eð 		EÑ0Ñ#ˆY˜
 [ØÔ&×*Ò*¨9°dÑ;Ô;ð EØÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDÐDØ $¤/Ô";Ð;Ð;Øð <Ø!*¨lÐ!:Ð!:àÔ&×*Ò*¨7Ñ3Ô3ð EØÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDÐDàÔ'×+Ò+¨Y¸
Ð,CÑDÔDÐDøàŒ×4Ò4Ñ6Ô6Ð6ØŒ×2Ò2Ñ4Ô4Ð4ð 	×$Ò$Ñ&Ô&Ð&ð 	×!Ò!Ñ#Ô#Ð#Ø×(Ò(Ñ*Ô*Ð*ð 	×$Ò$Ñ&Ô&Ð&Ø×$Ò$Ñ&Ô&Ð&Ø×%Ò%Ñ'Ô'Ð'Ø×%Ò%Ñ'Ô'Ð'Ø×%Ò%Ñ'Ô'Ð'Ø×&Ò&Ñ(Ô(Ð(Ø×.Ò.Ñ0Ô0Ð0ð 	×"Ò"Ñ$Ô$Ð$ð 	×#Ò#Ñ%Ô%Ð%Ø×'Ò'Ñ)Ô)Ð)à×)Ò)Ñ+Ô+Ð+Ø×%Ò%Ñ'Ô'Ð'à×$Ò$Ñ&Ô&Ð&Ø×%Ò%Ñ'Ô'Ð'à×5Ò5Ñ7Ô7Ð7Ø×4Ò4Ñ6Ô6Ð6à×$Ò$Ñ&Ô&Ð&Ø×"Ò"Ñ$Ô$Ð$Ø×$Ò$Ñ&Ô&Ð&Ø×3Ò3Ñ5Ô5Ð5Ø×-Ò-Ñ/Ô/Ð/Ø×,Ò,Ñ.Ô.Ð.Ø×#Ò#Ñ%Ô%Ð%Ø×'Ò'Ñ)Ô)Ð)Ø×&Ò&Ñ(Ô(Ð(à×ÒÑÔÐØ×"Ò" 5Ñ)Ô)Ð)Ø×!Ò!Ñ#Ô#Ð#àŒÐr   c                 óî   ‡ — ‰ j         ‰ j        z  ‰ _        ‰ j        ‰ j        z  ‰ _        ‰ j        ‰ j        z  ‰ _        i ‰ _	        ˆ fd„‰ j        D ¦   «         ‰ _
        ˆ fd„‰ j        D ¦   «         ‰ _        dS )zÏ
        Prepare field lists and a list of the fields that used through models
        in the old state so dependencies can be made from the through model
        deletion to the field that uses it.
        c                 óŽ   •— h | ]A\  }}‰j         j        |‰j                             ||f|¦  «        f         j        D ]}|||f’ŒŒBS r   )r   r   Úrenamed_modelsri   rT   ©r   r�   rŽ   Ú
field_namer   s       €r   r   z=MigrationAutodetector._prepare_field_lists.<locals>.<setcomp>Ý   sx   ø€ ð 
ð 
ð 
á%�	˜:Ø"œoÔ4Ø˜4Ô.×2Ò2°I¸zÐ3JÈJÑWÔWÐWôäð
ð 
ð ð ˜
 JÐ/ð
ð 
ð 
ð 
r   c                 óX   •— h | ]&\  }}‰j         j        ||f         j        D ]}|||f’ŒŒ'S r   )r   r   rT   r“   s       €r   r   z=MigrationAutodetector._prepare_field_lists.<locals>.<setcomp>ä   s]   ø€ ð 
ð 
ð 
á%�	˜:Ø"œmÔ2°9¸jÐ3HÔIÔPð
ð 
ð ð ˜
 JÐ/ð
ð 
ð 
ð 
r   N)rb   re   Úkept_model_keysrc   rf   Úkept_proxy_keysrd   rg   Úkept_unmanaged_keysÚthrough_usersÚold_field_keysÚnew_field_keys©r   s   `r   rn   z*MigrationAutodetector._prepare_field_listsÓ   s¨   ø€ ð  $Ô2°TÔ5HÑHˆÔØ#Ô2°TÔ5HÑHˆÔØ#'Ô#:¸TÔ=TÑ#TˆÔ ØˆÔð
ð 
ð 
ð 
à)-Ô)=ð
ñ 
ô 
ˆÔð
ð 
ð 
ð 
à)-Ô)=ð
ñ 
ô 
ˆÔÐÐr   c                 óv  — t          | j        ¦  «        D ]£\  }}| j                             ||f|¦  «        }| j        j        ||f         }|j                             ¦   «         D ]S\  }}t          |d¦  «        r>t          |j
        dd¦  «        r(t          |j
        j        ||¦  «        }|||f| j        |<   ŒTŒ¤dS )zThrough model map generation.rQ   ÚthroughN)rP   rb   r’   ri   r   r   rT   r@   rG   ÚgetattrrQ   r   rž   r™   )r   r�   rŽ   Úold_model_nameÚold_model_stater”   rW   Úthrough_keys           r   ro   z1MigrationAutodetector._generate_through_model_mapê   sñ   € å%+¨DÔ,?Ñ%@Ô%@ð 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ%4Ô%;×%AÒ%AÑ%CÔ%Cð ð Ñ!�
˜EÝ˜5 .Ñ1Ô1ð 
µgØÔ&¨	°4ñ7ô 7ð 
õ #3ØÔ*Ô2°I¸zñ#ô #�Kð "Ø&Ø"ð7�DÔ& {Ñ3øðð	ð 	r   c                 óÊ   — | d         dk    r| dfS t          t          | d         ¦  «                             d¦  «        \  }}||                     ¦   «         f| dd…         z   dfS )	zp
        Return the resolved dependency and a boolean denoting whether or not
        it was swappable.
        r   Ú__setting__Fr9   ú.rN   NT)rŸ   r   ÚsplitÚlower)Ú
dependencyÚresolved_app_labelÚresolved_object_names      r   Ú_resolve_dependencyz)MigrationAutodetector._resolve_dependencyþ   sw   € ð �aŒ=˜MÒ)Ð)Ø˜uÐ$Ð$Ý3:Ý�j ”mñ4
ô 4
ç
Š%�‰*Œ*ñ 	1ÐÐ0ð #Ð$8×$>Ò$>Ñ$@Ô$@ÐAÀJÈqÈrÈrÄNÑRÐTXÐXÐXr   c           
      óº  — i | _         t          d„ | j                             ¦   «         D ¦   «         ¦  «        }d}|�rt	          | j        ¦  «        D �]¯}g }t          ¦   «         }t          | j        |         ¦  «        D �]¨}d}t          ¦   «         }	|j        D �]Q}
|
}|                      |
¦  «        \  }
}|
d         |k    �r'| j         	                    |
d         g ¦  «        D ]}|  
                    ||
¦  «        rd} nŒ|s nç|r$|	                     |d         |d         f¦  «         Œ’|
d         | j         v r:|	                     |
d         | j         |
d                  d         j        f¦  «         ŒÛ|rr|rQ|                     |
d         ¦  «        r6|	                     |                     |
d         ¦  «        d         ¦  «         �Œ0|	                     |
d         df¦  «         �ŒOd}�ŒS|r:|                     |¦  «         |                     |	¦  «         | j        |         d= �Œ© |s|rÔ| j        |         r|r­t!          dt"          fg g d	œ¦  «        } |d
t%          | j          	                    |g ¦  «        ¦  «        dz   z  |¦  «        }t          |¦  «        |_        ||_        || j        v|_        | j                              |g ¦  «                             |¦  «         d}�Œ—|| j        |         z   | j        |<   �Œ±t          d„ | j                             ¦   «         D ¦   «         ¦  «        }||k    r|sd}nt1          d| j        z  ¦  «        ‚|}|�°dS dS )ag  
        Chop the lists of operations up into migrations with dependencies on
        each other. Do this by going through an app's list of operations until
        one is found that has an outgoing dependency that isn't in another
        app's migration yet (hasn't been chopped off its list). Then chop off
        the operations before it into a migration and move onto the next app.
        If the loops completes without doing anything, there's a circular
        dependency (which _should_ be impossible as the operations are
        all split at this point so they can't depend and be depended on).
        c              3   ó4   K  — | ]}t          |¦  «        V — Œd S r2   ©Úlen©r   Úxs     r   r3   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>  s(   è è € ÐIÐI •c˜!‘f”fÐIÐIÐIÐIÐIÐIr   FTr   r9   éÿÿÿÿÚ	__first__r	   )r   Údependencieszauto_%ic              3   ó4   K  — | ]}t          |¦  «        V — Œd S r2   r®   r°   s     r   r3   z>MigrationAutodetector._build_migration_list.<locals>.<genexpr>r  s(   è è € ÐQÐQ¨�c !™fœfÐQÐQÐQÐQÐQÐQr   z)Cannot resolve operation dependencies: %rN)rŒ   Úsumr]   ÚvaluesrP   ra   r=   Ú
_auto_depsr«   ri   Úcheck_dependencyrj   rV   Ú
leaf_nodesrS   ÚupdaterF   r	   r¯   r´   r   r   ÚinitialÚ
setdefaultÚ
ValueError)r   r%   Únum_opsÚ	chop_moder�   Úchoppedr´   Ú	operationÚdeps_satisfiedÚoperation_dependenciesÚdepÚoriginal_depÚis_swappable_depÚother_operationÚsubclassÚinstanceÚnew_num_opss                    r   rŠ   z+MigrationAutodetector._build_migration_list  s4  € ð ˆŒÝÐIÐI dÔ&?×&FÒ&FÑ&HÔ&HÐIÑIÔIÑIÔIˆØˆ	Øñ b	"õ $ DÔ$=Ñ>Ô>ð Qñ Q�	Ø�Ý"™uœu�Ý!% dÔ&?À	Ô&JÑ!KÔ!Kð 9ñ 9�IØ%)�NÝ-0©U¬UÐ*Ø(Ô3ð 0?ñ 0?˜ð
 (+˜Ø04×0HÒ0HÈÑ0MÔ0MÑ-˜Ð-Ø˜qœ6 YÒ.Ñ.ð 48Ô3L×3PÒ3PØ # A¤¨ñ4ô 4ð *ð * ð $(×#8Ò#8¸È#Ñ#NÔ#Nð !*Ø5: NØ$) Eð!*ð $2ð  ?Ø % à#3ð !?Ø$:×$>Ò$>Ø)5°a¬¸,Àq¼/Ð(Jñ%&ô %&ð %&ð %&ð &)¨¤V¨t¬Ð%>Ð%>Ø$:×$>Ò$>Ø),¨Q¬°´ÀÀQÄÔ1HÈÔ1LÔ1QÐ(Rñ%&ô %&ð %&ð %&ð (1ð %?ð ,1ð ).°U×5EÒ5EÀcÈ!ÄfÑ5MÔ5Mð ).Ø,B×,FÒ,FØ05×0@Ò0@ÀÀQÄÑ0HÔ0HÈÔ0Kñ-.ô -.ð -.ñ -.ð -C×,FÒ,FØ14°Q´¸Ð0Eñ-.ô -.ð -.ñ -.ð :?¨ùØ%ð ØŸš yÑ1Ô1Ð1Ø$×+Ò+Ð,BÑCÔCÐCØ Ô5°iÔ@ÀÐCÑCààð  7ð ØÔ4°YÔ?ð À9ð Ý#'Ø'Ý&˜LØ+-¸rÐBÐBñ$ô $˜ð
 $, 8Ø%­¨T¬_×-@Ò-@ÀÈBÑ-OÔ-OÑ)PÔ)PÐSTÑ)TÑUØ%ñ$ô $˜õ 15°\Ñ0BÔ0B˜Ô-Ø.5˜Ô+Ø+4¸DÔ<NÐ+N˜Ô(Øœ×2Ò2°9¸bÑAÔA×HÒHÈÑRÔRÐRØ$)˜	™	ð $ dÔ&?À	Ô&JÑJð Ô1°)Ñ<ùõ ÐQÐQ¨dÔ.G×.NÒ.NÑ.PÔ.PÐQÑQÔQÑQÔQˆKØ˜gÒ%Ð%Ø ð Ø $�I�Iå$ØCØÔ3ñ4ñô ð ð "ˆGðE ñ b	"ð b	"ð b	"ð b	"ð b	"r   c                 óž  ‡ ‡— t          ‰ j                             ¦   «         ¦  «        D ]£\  }}t          ¦   «         }|D ]d}|                     |¦  «         |j        D ]EŠ‰                      ‰¦  «        d         Š‰d         |k    rŒ* |j        |gˆˆ fd„|D ¦   «         ¢R Ž  ŒFŒet          |                     ¦   «         ¦  «        ‰ j        |<   Œ¤dS )z{
        Reorder to make things possible. Reordering may be needed so FKs work
        nicely inside the same app.
        r   c              3   óH   •K  — | ]}‰                      |‰¦  «        ¯|V — Œd S r2   )r¹   )r   r±   rÅ   r   s     €€r   r3   z9MigrationAutodetector._sort_migrations.<locals>.<genexpr>Œ  s8   øè è € Ð QÐ Q q°4×3HÒ3HÈÈCÑ3PÔ3PÐ Q Ð QÐ QÐ QÐ QÐ QÐ Qr   N)	rP   r]   r@   r   rj   r¸   r«   r=   Ústatic_order)r   r�   ÚopsÚtsÚoprÅ   s   `    @r   r‰   z&MigrationAutodetector._sort_migrations}  s  øø€ õ
 % TÔ%>×%DÒ%DÑ%FÔ%FÑGÔGð 	Kð 	K‰NˆI�sÝ"Ñ$Ô$ˆBØð Sð S�Ø—’�r‘
”
�
Øœ=ð Sð S�Cð ×2Ò2°3Ñ7Ô7¸Ô:�CØ˜1”v Ò*Ð*Ø Ø�B”F˜2ÐRÐ QÐ QÐ QÐ QÐ Q¨CÐ QÑ QÔ QÐRÐRÐRÐRÐRðSõ 48¸¿ºÑ8IÔ8IÑ3JÔ3JˆDÔ% iÑ0Ð0ð	Kð 	Kr   c                 óð  — | j                              ¦   «         D ]D\  }}t          ||dd …         ¦  «        D ]&\  }}|j                             ||j        f¦  «         Œ'ŒE| j                              ¦   «         D ]-}|D ](}t          t          |j        ¦  «        ¦  «        |_        Œ)Œ.| j                              ¦   «         D ]6\  }}|D ].}t          ¦   «          
                    |j        |¦  «        |_        Œ/Œ7d S )Nr9   )rŒ   r@   Úzipr´   rS   rV   r·   r=   ra   r   Úoptimizer   )r   r�   rŒ   Úm1Úm2Ú	migrations         r   r‹   z*MigrationAutodetector._optimize_migrations�  s/  € à%)¤_×%:Ò%:Ñ%<Ô%<ð 	=ð 	=Ñ!ˆI�zÝ˜j¨*°Q°R°R¬.Ñ9Ô9ð =ð =‘��BØ”×&Ò&¨	°2´7Ð';Ñ<Ô<Ð<Ð<ð=ð œ/×0Ò0Ñ2Ô2ð 	Kð 	KˆJØ'ð Kð K�	Ý)-­c°)Ô2HÑ.IÔ.IÑ)JÔ)J�	Ô&Ð&ðKð &*¤_×%:Ò%:Ñ%<Ô%<ð 	ð 	Ñ!ˆI�zØ'ð ð �	Ý'9Ñ';Ô';×'DÒ'DØÔ(¨)ñ(ô (�	Ô$Ð$ðð	ð 	r   c                 ó˜  ‡— ‰d         €G‰d         du r=t          |t          j        ¦  «        o"|j        ‰d                              ¦   «         k    S ‰d         �Ç‰d         du r½t          |t          j        ¦  «        oB|j        ‰d                              ¦   «         k    ot          ˆfd„|j        D ¦   «         ¦  «        p_t          |t          j        ¦  «        oE|j        ‰d                              ¦   «         k    o"|j        ‰d                              ¦   «         k    S ‰d         �j‰d         du r`t          |t          j	        ¦  «        oE|j        ‰d                              ¦   «         k    o"|j        ‰d                              ¦   «         k    S ‰d         €G‰d         du r=t          |t          j
        ¦  «        o"|j        ‰d                              ¦   «         k    S ‰d         �l‰d         dk    r`t          |t          j        ¦  «        oE|j        ‰d                              ¦   «         k    o"|j        ‰d                              ¦   «         k    S ‰d         �€‰d         d	k    rtt          |t          j        ¦  «        oY|j        ‰d                              ¦   «         k    o6|j        pd
                     ¦   «         ‰d                              ¦   «         k    S ‰d         �U‰d         dk    rIt          |t          j        t          j        f¦  «        o"|j        ‰d                              ¦   «         k    S t!          d‰›�¦  «        ‚)zn
        Return True if the given operation depends on the given dependency,
        False otherwise.
        rN   Né   Tr9   c              3   ó6   •K  — | ]\  }}‰d          |k    V — ŒdS )rN   Nr   )r   r±   Úyr¨   s      €r   r3   z9MigrationAutodetector.check_dependency.<locals>.<genexpr>±  s0   øè è € ÐHÐH©t¨q°!˜
 1œ¨Ò*ÐHÐHÐHÐHÐHÐHr   FÚalterÚorder_wrt_unsetÚ Úfoo_together_changezCan't handle dependency )r<   r   ÚCreateModelÚ
name_lowerr§   ÚanyrT   ÚAddFieldÚmodel_name_lowerÚRemoveFieldÚDeleteModelÚ
AlterFieldÚAlterOrderWithRespectToÚorder_with_respect_toÚAlterUniqueTogetherÚAlterIndexTogetherr¾   )r   rÂ   r¨   s     `r   r¹   z&MigrationAutodetector.check_dependency¡  sS  ø€ ð �aŒ=Ð  Z°¤]°dÐ%:Ð%:å˜9¥jÔ&<Ñ=Ô=ð BØÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðð
 ˜Œ]Ð&¨:°a¬=¸DÐ+@Ð+@å˜9¥jÔ&<Ñ=Ô=ð IØÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðIåÐHÐHÐHÐH°yÔ7GÐHÑHÔHÑHÔHðõ
 ˜9¥jÔ&9Ñ:Ô:ð BØÔ.°*¸Q´-×2EÒ2EÑ2GÔ2GÒGðBàÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðð ˜Œ]Ð&¨:°a¬=¸EÐ+AÐ+Aå˜9¥jÔ&<Ñ=Ô=ð BØÔ.°*¸Q´-×2EÒ2EÑ2GÔ2GÒGðBàÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðð ˜Œ]Ð" z°!¤}¸Ð'=Ð'=å˜9¥jÔ&<Ñ=Ô=ð BØÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðð
 ˜Œ]Ð&¨:°a¬=¸GÒ+CÐ+Cå˜9¥jÔ&;Ñ<Ô<ð BØÔ.°*¸Q´-×2EÒ2EÑ2GÔ2GÒGðBàÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðð ˜Œ]Ð&¨:°a¬=Ð<MÒ+MÐ+Må˜9¥jÔ&HÑIÔIð )ØÔ(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAð)àÔ4Ð:¸×AÒAÑCÔCØ˜a”=×&Ò&Ñ(Ô(ò)ðð ˜Œ]Ð&¨:°a¬=Ð<QÒ+QÐ+QåØÝÔ3µZÔ5RÐSñô ð Bð Ô(¨J°q¬M×,?Ò,?Ñ,AÔ,AÒAðõ �*¸Z¸ZÐIÑJÔJÐJr   Fc                 óÚ   — |pg |_         |r1| j                             |g ¦  «                             d|¦  «         d S | j                             |g ¦  «                             |¦  «         d S )Nr   )r¸   r]   r½   ÚinsertrS   )r   r�   rÂ   r´   Ú	beginnings        r   Úadd_operationz#MigrationAutodetector.add_operationà  sv   € ð  ,Ð1¨rˆ	ÔØð 	RØÔ%×0Ò0°¸BÑ?Ô?×FÒFÀqÈ)ÑTÔTÐTÐTÐTàÔ%×0Ò0°¸BÑ?Ô?×FÒFÀyÑQÔQÐQÐQÐQr   c                 ón  — 	 | j         j        |         }d„ |j        D ¦   «         }|d         ›d|d         ›�}|j                             d¦  «        s<d|v s8d|v s4t
          j                             ¦   «         |                     ¦   «         k    rd|d         z   d|d         z   fS n# t          $ r Y nw xY w|S )	z|
        Place potential swappable models first in lists of created models (only
        real way to solve #22783).
        c                 óJ   — h | ] }t          |t          ¦  «        r|n|j        ’Œ!S r   )r<   ÚstrÚ__name__)r   Úbases     r   r   z<MigrationAutodetector.swappable_first_key.<locals>.<setcomp>ð  s=   € ð ð ð àõ # 4­Ñ-Ô-Ð@��°4´=ðð ð r   r   r¥   r9   Ú	swappableÚAbstractUserÚAbstractBaseUserÚ___)	r   r   Úbasesrh   ri   r   ÚAUTH_USER_MODELr§   ÚLookupError)r   Úitemr�   Ú
base_namesÚstring_versions        r   Úswappable_first_keyz)MigrationAutodetector.swappable_first_keyé  sî   € ð
	Øœ-Ô.¨tÔ4ˆKðð à'Ô-ðñ ô ˆJð )-¨Q¬¨¨°°a´°Ð9ˆNàÔ#×'Ò'¨Ñ4Ô4ð:à! ZÐ/Ð/Ø%¨Ð3Ð3ÝÔ+×1Ò1Ñ3Ô3°~×7KÒ7KÑ7MÔ7MÒMÐMà  Q¤™¨°°a´©Ð9Ð9ð Nøõ ð 	ð 	ð 	ØˆDð	øøøàˆs   ‚B!B% Â%
B2Â1B2c                 ó"  — i | _         i | _        | j        | j        z
  }t	          |¦  «        D �]à\  }}| j        j        ||f         }|                      |j        ¦  «        }| j        | j        z
  }|D �]™\  }}||k    �rŒ| j	        j        ||f         }	|                      |	j        ¦  «        }
||
k    �rW| j
                             |	|¦  «        �r;g }t          |j                             ¦   «         ¦  «        d„ | j        j        ||f                              ¦   «         D ¦   «         z   }|D ]9}|j        r0|                     |                      |||| j        ¦  «        ¦  «         Œ:|                      |t'          j        |	j        |j        ¬¦  «        |¬¦  «         || j         ||f<   |	j        ›d|	j        ›�}|j        ›d|j        ›�| j        |<   | j                             ||f¦  «         | j                             ||f¦  «          n�Œ›�ŒâdS )z¼
        Find any renamed models, generate the operations for them, and remove
        the old entry from the model lists. Must be run before other
        model-level generation.
        c                 óJ   — g | ] }|                      ¦   «         D ]	}|j        ‘Œ
Œ!S r   )r·   rQ   )r   Ú	relationsrW   s      r   r0   zAMigrationAutodetector.generate_renamed_models.<locals>.<listcomp>  sY   € ð Jð Jð Jà$-ð .7×-=Ò-=Ñ-?Ô-?ðJð Jð
 %*ð	 !&Ô 2ðJð Jð Jð Jr   )Úold_nameÚnew_name©r´   r¥   N)r’   Úrenamed_models_relre   rb   rP   r   r   rY   rT   r   r   Úask_rename_modelr=   r·   r  Úis_relationÚextendÚ!_get_dependencies_for_foreign_keyrï   r   ÚRenameModelrV   r�   rá   Úremoverj   )r   Úadded_modelsr�   rŽ   r�   Úmodel_fields_defÚremoved_modelsÚrem_app_labelÚrem_model_nameÚrem_model_stateÚrem_model_fields_defr´   rT   rW   Úrenamed_models_rel_keys                  r   rm   z-MigrationAutodetector.generate_renamed_models   s§  € ð !ˆÔØ"$ˆÔØÔ*¨TÔ-@Ñ@ˆÝ%+¨LÑ%9Ô%9ð 9	"ñ 9	"Ñ!ˆI�zØœ-Ô.¨y¸*Ð/DÔEˆKØ#×AÒAÀ+ÔBTÑUÔUÐà!Ô0°4Ô3FÑFˆNØ1?ð 4"ñ 4"Ñ-�˜~Ø  IÒ-Ñ-Ø&*¤oÔ&<Ø% ~Ð5ô'�Oð ,0×+MÒ+MØ'Ô.ñ,ô ,Ð(ð (Ð+?Ò?Ñ?Øœ?×;Ò;Ø+¨[ñô ñ +"ð ,.˜LÝ%)¨+Ô*<×*CÒ*CÑ*EÔ*EÑ%FÔ%Fð Jð Jà15´Ô1HØ$-¨zÐ$9ô2"ç"(¢&¡(¤(ð	Jñ Jô Jñ &˜Fð *0ð 	&ð 	& Ø#(Ô#4ð !&Ø$0×$7Ò$7Ø(,×(NÒ(NØ,5Ø,6Ø,1Ø,0¬Mñ	)*ô )*ñ%&ô %&ð %&øð !×.Ò.Ø )Ý *Ô 6Ø-<Ô-AØ-8Ô-=ð!"ñ !"ô !"ð .:ð /ñ ô ð ð JX˜DÔ/°	¸:Ð0EÑFà /Ô 9Ð 9Ð 9Ø /Ô :Ð :ð6Ð2ð %0Ô$9Ð$9Ð$9Ø$/Ô$:Ð$:ð!"ð !Ô3Ð4JÑKð !Ô/×6Ò6¸À~Ð7VÑWÔWÐWØ Ô/×3Ò3°YÀ
Ð4KÑLÔLÐLØ!˜Eùùðs9	"ð 9	"r   c                 ó:  ‡‡ ‡!— | j         | j        z  }| j        |z
  }| j        |z
  }t	          t          || j        d¬¦  «        t          || j        d¬¦  «        ¦  «        }|D �]6\  ŠŠ | j        j        ‰‰ f         }i Š!d}|j	         
                    ¦   «         D ]X\  }}|j        rL|j        j        r%|j        r|j        j        }n|j        j        s|‰!|<   t          |j        dd¦  «        r|‰!|<   ŒY|j                             d¦  «        }	|j                             d¦  «        }
|j                             dd¦  «        }|j                             dd¦  «        }|j                             d	d¦  «        }‰‰ dd
fg}|j        D ]õ}t'          |t(          ¦  «        rÞd|v rÚ|                     dd¦  «        \  }}|                     ||ddf¦  «         | j        j                             ||f¦  «        }| j        j                             ||f¦  «        }|rd|rbt3          |j	        ¦  «                             |j	        ¦  «                             |j	        ¦  «        }|D ]}|                     |||d
f¦  «         ŒŒö|r'|                     t9          |‰‰ ¦  «        dz   ¦  «         |                      ‰t=          j        |j         ˆ!fd„|j	         
                    ¦   «         D ¦   «         |j        |j        |j!        ¬¦  «        |d¬¦  «         |j                             dd¦  «        s�ŒÆt          ‰! 
                    ¦   «         ¦  «        D ]‚\  }}|  "                    ‰‰ || j        ¦  «        }|                     ‰‰ ddf¦  «         |                      ‰t=          j#        ‰ ||¬¦  «        tI          t3          |¦  «        ¦  «        ¬¦  «         Œƒ|r6|                      ‰t=          j%        ‰ |¬¦  «        ‰‰ |df‰‰ ddfg¬¦  «         ˆˆ fd„t          ‰!¦  «        D ¦   «         }|                     ‰‰ ddf¦  «         |	D ].}|                      ‰t=          j&        ‰ |¬¦  «        |¬¦  «         Œ/|
D ].}|                      ‰t=          j'        ‰ |¬¦  «        |¬¦  «         Œ/|r,|                      ‰t=          j(        ‰ |¬¦  «        |¬¦  «         |r,|                      ‰t=          j)        ‰ |¬¦  «        |¬¦  «         | j        j*        }‰‰ f| j+        v rŠ|‰‰ f          
                    ¦   «         D ]m\  }Š!| j        j        |         }‰! 
                    ¦   «         D ]A\  }}|                      |j,        t=          j-        |j         ||¬¦  «        ‰‰ ddfg¬¦  «         ŒBŒn�Œ8dS )a‚  
        Find all new models (both managed and unmanaged) and make create
        operations for them as well as separate operations to create any
        foreign key or M2M relationships (these are optimized later, if
        possible).

        Defer any model options that refer to collections of fields that might
        be deferred (e.g. unique_together, index_together).
        T)r6   ÚreverseNrž   ÚindexesÚconstraintsÚunique_togetherÚindex_togetherré   Fr¥   r9   ©NTc                 ó(   •— g | ]}|d          ‰v¯|‘ŒS )r   r   )r   ÚdÚrelated_fieldss     €r   r0   zAMigrationAutodetector.generate_created_models.<locals>.<listcomp>™  s2   ø€ ð ð ð àØ˜Qœ4 ~Ð5Ð5ð à5Ð5Ð5r   ©rV   rT   rh   rù   Úmanagers)r´   rî   r[   ©rŽ   rV   rW   r  ©rV   ré   c                 ó   •— g | ]}‰‰|d f‘Œ	S )Tr   )r   rV   r�   rŽ   s     €€r   r0   zAMigrationAutodetector.generate_created_models.<locals>.<listcomp>Ë  s/   ø€ ð $ð $ð $Ø8<�˜J¨¨dÐ3ð$ð $ð $r   ©rŽ   Úindex©rŽ   Ú
constraint©rV   r  ©rV   r  ).rb   rd   re   rg   r   rP   rÿ   r   r   rT   r@   rQ   r   Úprimary_keyÚparent_linkrŸ   rh   rR   rù   r<   rò   r¦   rS   r   ri   ra   Ú
differenceÚintersectionr   rï   r   rà   rV   r   r
  rã   r=   rè   ÚAddIndexÚAddConstraintrê   rë   r  rc   r�   rç   )"r   Úold_keysr  Úadded_unmanaged_modelsÚall_added_modelsr�   Úprimary_key_relr”   rW   r  r  r  r  ré   r´   rô   Úbase_app_labelÚ	base_nameÚold_base_model_stateÚnew_base_model_stateÚremoved_base_fieldsÚremoved_base_fieldrV   Úrelated_dependenciesr%  r'  r  Úrelated_model_keyÚrelated_model_stateÚrelated_field_nameÚrelated_fieldr�   rŽ   r  s"                                  @@@r   rq   z-MigrationAutodetector.generate_created_modelsD  s”  øøø€ ð Ô&¨Ô)@Ñ@ˆØÔ*¨XÑ5ˆØ!%Ô!8¸8Ñ!CÐÝ Ý�< TÔ%=ÀtÐLÑLÔLÝÐ)¨tÔ/GÐQUÐVÑVÔVñ
ô 
Ðð &6ð p	ñ p	Ñ!ˆI�zØœ-Ô.¨y¸*Ð/DÔEˆKàˆNØ"ˆOØ%0Ô%7×%=Ò%=Ñ%?Ô%?ð ;ð ;Ñ!�
˜EØÔ%ð ;ØÔ)Ô/ð ?Ø Ô,ð ?Ø.3Ô.@Ô.F˜O˜OØ!&Ô!3Ô!?ð ?Ø9>˜N¨:Ñ6Ý˜uÔ1°9¸dÑCÔCð ;Ø5:˜ zÑ2øð "Ô)×-Ò-¨iÑ8Ô8ˆGØ%Ô-×1Ò1°-Ñ@Ô@ˆKØ)Ô1×5Ò5Ð6GÈÑNÔNˆOà(Ô0×4Ò4Ð5EÀtÑLÔLˆNØ$/Ô$7×$;Ò$;Ø'¨ñ%ô %Ð!ð
 ˜J¨¨eÐ4ðˆLð $Ô)ð ð �Ý˜d¥CÑ(Ô(ð ¨S°D¨[¨[Ø04·
²
¸3ÀÑ0BÔ0BÑ-�N IØ ×'Ò'¨¸ÀDÈ$Ð(OÑPÔPÐPð ,0¬?Ô+A×+EÒ+EØ'¨Ð3ñ,ô ,Ð(ð ,0¬=Ô+?×+CÒ+CØ'¨Ð3ñ,ô ,Ð(ð ,ð Ð0Dð åÐ 4Ô ;Ñ<Ô<ß'šZØ 4Ô ;ñô ÷ *š\¨+Ô*<Ñ=Ô=ð ,ð 3Fð ð Ð.Ø(×/Ò/Ø!/°Ð<NÐPUÐ Vñô ð ð øð ð Ø×#Ò#Ý$Ø'Ø!Ø"ñô ð
 #ñ#ñô ð ð ×ÒØÝÔ&Ø$Ô)ðð ð ð à!,Ô!3×!9Ò!9Ñ!;Ô!;ðñ ô ð
 (Ô/Ø%Ô+Ø(Ô1ð
ñ 
ô 
ð *Øð ñ ô ð ð$ Ô&×*Ò*¨9°dÑ;Ô;ð Ùõ  & n×&:Ò&:Ñ&<Ô&<Ñ=Ô=ð ð ‘��eØ#×EÒEØØØØ”Mñ	 ô  �ð ×#Ò# Y°
¸DÀ$Ð$GÑHÔHÐHà×"Ò"ØÝÔ'Ø#-Ø!Ø#ðñ ô õ
 "&¥c¨,Ñ&7Ô&7Ñ!8Ô!8ð #ñ ô ð ð ð %ð Ø×"Ò"ØÝÔ6Ø'Ø.Cðñ ô ð
 # JÐ0EÀtÐLØ" J°°dÐ;ð"ð #ñ 
ô 
ð 
ð$ð $ð $ð $ð $Ý@FÀ~Ñ@VÔ@Vð$ñ $ô $Ð ð !×'Ò'¨°JÀÀdÐ(KÑLÔLÐLØ ð ð �Ø×"Ò"ØÝÔ'Ø#-Ø#ðñ ô ð "6ð #ñ ô ð ð ð *ð ð �
Ø×"Ò"ØÝÔ,Ø#-Ø#-ðñ ô ð "6ð #ñ ô ð ð ð ð Ø×"Ò"ØÝÔ2Ø'Ø(7ðñ ô ð "6ð #ñ ô ð ð ð Ø×"Ò"ØÝÔ1Ø'Ø'5ðñ ô ð "6ð #ñ ô ð ð œÔ/ˆIØ˜:Ð&¨$Ô*=Ð=Ð=Ø9BØ˜zÐ)ô:ç’%‘'”'ðð Ñ5Ð% ~ð +/¬-Ô*>Ð?PÔ*QÐ'Ø=K×=QÒ=QÑ=SÔ=Sð 	ð 	Ñ9Ð*¨MØ×*Ò*Ø/Ô9Ý&Ô1Ø+>Ô+CØ%7Ø&3ðñ ô ð
 ,5°jÀ$ÈÐ*MÐ)Nð +ñ ô ð ð ð	ùðOp	ð p	r   c                 óì  — | j         | j        z
  }t          |¦  «        D ]Ô\  }}| j        j        ||f         }|j                             d¦  «        sJ ‚||ddfg}|j        D ]M}t          |t          ¦  «        r6d|v r2| 
                    dd¦  «        \  }}|                     ||ddf¦  «         ŒN|                      |t          j        |j        g |j        |j        |j        ¬¦  «        |¬¦  «         ŒÕdS )	zó
        Make CreateModel statements for proxy models. Use the same statements
        as that way there's less code duplication, but for proxy models it's
        safe to skip all the pointless field stuff and chuck out an operation.
        r\   NFr¥   r9   Tr  r  )rf   rc   rP   r   r   rh   ri   rù   r<   rò   r¦   rS   rï   r   rà   rV   r   )	r   Úaddedr�   rŽ   r�   r´   rô   r4  r5  s	            r   rs   z.MigrationAutodetector.generate_created_proxies  s?  € ð Ô# dÔ&9Ñ9ˆÝ%+¨E¡]¤]ð 	ð 	Ñ!ˆI�zØœ-Ô.¨y¸*Ð/DÔEˆKØÔ&×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3ð ˜J¨¨eÐ4ðˆLð $Ô)ð Qð Q�Ý˜d¥CÑ(Ô(ð Q¨S°D¨[¨[Ø04·
²
¸3ÀÑ0BÔ0BÑ-�N IØ ×'Ò'¨¸ÀDÈ$Ð(OÑPÔPÐPøà×ÒØÝÔ&Ø$Ô)ØØ'Ô/Ø%Ô+Ø(Ô1ðñ ô ð *ð ñ ô ð ð ð	ð 	r   c           
      óª  — | j         | j        z  }| j        |z
  }| j        |z
  }t	          t          |¦  «        t          |¦  «        ¦  «        }|D �]�\  }}| j        j        ||f         }i }|j         	                    ¦   «         D ]8\  }	}
|
j
        r,|
j
        j        r|
||	<   t          |
j
        dd¦  «        r|
||	<   Œ9|j                             dd¦  «        }|j                             dd¦  «        }|r*|                      |t!          j        |d¬¦  «        ¦  «         |r*|                      |t!          j        |d¬¦  «        ¦  «         t          |¦  «        D ],}|                      |t!          j        ||¬¦  «        ¦  «         Œ-g }| j        j        }|||f          	                    ¦   «         D ][\  \  }}}| 	                    ¦   «         D ]>\  }	}
|                     |||	df¦  «         |
j        s|                     |||	d	f¦  «         Œ?Œ\t          |¦  «        D ]}|                     |||df¦  «         Œ| j                             ||j        f¦  «        }|r+|                     |d
         |d         |d         df¦  «         |                      |t!          j        |j        ¬¦  «        t9          t;          |¦  «        ¦  «        ¬¦  «         �ŒƒdS )a†  
        Find all deleted models (managed and unmanaged) and make delete
        operations for them as well as separate operations to delete any
        foreign key or M2M relationships (these are optimized later, if
        possible).

        Also bring forward removal of any model options that refer to
        collections of fields - the inverse of generate_created_models().
        rž   Nr  r  r(  r)  ©rŽ   rV   FrÜ   r   r9   rN   ©rV   r  )re   rg   rb   rd   r   rP   r   r   rT   r@   rQ   r   rŸ   rh   rR   rï   r   rê   rë   rå   r  rS   Úmany_to_manyr™   ri   rá   ræ   rV   r=   ra   )r   Únew_keysÚdeleted_modelsÚdeleted_unmanaged_modelsÚall_deleted_modelsr�   rŽ   r�   r  r”   rW   r  r  rV   r´   r  Úrelated_object_app_labelÚobject_nameÚrelation_related_fieldsÚthrough_users                       r   rp   z-MigrationAutodetector.generate_deleted_models(  s°  € ð Ô&¨Ô)@Ñ@ˆØÔ,¨xÑ7ˆØ#'Ô#:¸XÑ#EÐ Ý"Ý�>Ñ"Ô"¥FÐ+CÑ$DÔ$Dñ
ô 
Ðð &8ð O	ñ O	Ñ!ˆI�zØœ/Ô0°¸JÐ1FÔGˆKàˆNØ%0Ô%7×%=Ò%=Ñ%?Ô%?ð ;ð ;Ñ!�
˜EØÔ%ð ;ØÔ)Ô/ð ;Ø5:˜ zÑ2Ý˜uÔ1°9¸dÑCÔCð ;Ø5:˜ zÑ2øà)Ô1×5Ò5Ð6GÈÑNÔNˆOà(Ô0×4Ò4Ð5EÀtÑLÔLˆNØð Ø×"Ò"ØÝÔ2Ø'Ø(,ðñ ô ñô ð ð ð Ø×"Ò"ØÝÔ1Ø'Ø'+ðñ ô ñô ð õ ˜~Ñ.Ô.ð ð �Ø×"Ò"ØÝÔ*Ø#-Ø!ðñ ô ñô ð ð ð ˆLØœÔ1ˆIð +4°I¸zÐ4IÔ*J×*PÒ*PÑ*RÔ*Rðð ñ 'ñ Ø(ØØ&Ø)@×)FÒ)FÑ)HÔ)Hð ð Ñ%�J Ø ×'Ò'Ø1°;À
ÈEÐRñô ð ð !Ô-ð Ø$×+Ò+à 8Ø +Ø *Ø 'ð	ñô ð øðõ ˜~Ñ.Ô.ð Jð J�Ø×#Ò# Y°
¸DÀ%Ð$HÑIÔIÐIÐIàÔ-×1Ò1°9¸kÔ>TÐ2UÑVÔVˆLØð Ø×#Ò#Ø! !”_ l°1¤o°|ÀA´ÈÐNñô ð ð ×ÒØÝÔ&Ø$Ô)ðñ ô õ "¥# lÑ"3Ô"3Ñ4Ô4ð ñ ô ð ñ ðSO	ð O	r   c                 ó
  — | j         | j        z
  }t          |¦  «        D ]c\  }}| j        j        ||f         }|j                             d¦  «        sJ ‚|                      |t          j	        |j
        ¬¦  «        ¦  «         ŒddS )z*Make DeleteModel options for proxy models.r\   rC  N)rc   rf   rP   r   r   rh   ri   rï   r   ræ   rV   )r   Údeletedr�   rŽ   r�   s        r   rr   z.MigrationAutodetector.generate_deleted_proxies‰  s¢   € àÔ%¨Ô(;Ñ;ˆÝ%+¨G¡_¤_ð 	ð 	Ñ!ˆI�zØœ/Ô0°¸JÐ1FÔGˆKØÔ&×*Ò*¨7Ñ3Ô3Ð3Ð3Ð3Ø×ÒØÝÔ&Ø$Ô)ðñ ô ñô ð ð ð	ð 	r   c                 ó†  — g | _         | j                             ¦   «         }t          | j        |z
  ¦  «        D �]\  }}}| j                             ||f|¦  «        }| j        j        ||f         }| j	        j        ||f         }| 
                    |¦  «        }|                      |¦  «        }	t          || j        z
  ¦  «        D �]x\  }
}}|
|k    �rj||k    �rc| 
                    |¦  «        }|                      |¦  «        }|j        rC|j        j        r7d|d         v r-|d         d         }|| j        v r| j        |         |d         d<   |                     |¦  «         |                     ¦   «         d         }||	k    s7|dd…         |	dd…         k    r¤t#          |d         |¬¦  «        |	d         k    rƒ| j                             ||||¦  «        rf| j                              |
||j        |||||f¦  «         |                     |
||f¦  «         |                     |||f¦  «         || j        |||f<    n�Œz�Œ	dS )zWork out renamed fields.rO   rN   r9   r   )Ú	db_columnN)Úrenamed_operationsrš   ÚcopyrP   r›   r’   ri   r   r   r   Ú	get_fieldr-   rQ   r   r  Úset_attributes_from_nameÚget_attname_columnr?   r   Ú
ask_renamerS   rP  r  rj   r`   )r   rš   r�   rŽ   r”   r    r¡   Únew_model_staterW   Ú	field_decr  r  Úrem_field_nameÚ	old_fieldÚold_field_decÚ
old_rel_toÚold_db_columns                    r   rw   z+MigrationAutodetector.create_renamed_fields–  sÏ  € à"$ˆÔØÔ,×1Ò1Ñ3Ô3ˆÝ17ØÔ .Ñ0ñ2
ô 2
ð 8	"ñ 8	"Ñ-ˆI�z :ð "Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOØ#×-Ò-¨jÑ9Ô9ˆEà×-Ò-¨eÑ4Ô4ˆIÝAGØ Ô!4Ñ4ñBô Bð -"ñ -"Ñ=�˜~¨~ð ! IÒ-Ñ-°.ÀJÒ2NÑ2NØ /× 9Ò 9¸.Ñ IÔ I�IØ$(×$9Ò$9¸)Ñ$DÔ$D�MàÔ*ðYà!Ô.Ô4ðYð ! M°!Ô$4Ð4Ð4à%2°1Ô%5°dÔ%;˜
Ø%¨Ô)@Ð@Ð@Ø59Ô5LÈZÔ5X˜M¨!Ô,¨TÑ2Ø×6Ò6°~ÑFÔFÐFØ$-×$@Ò$@Ñ$BÔ$BÀ1Ô$E�MØ$¨	Ò1Ð1ð & a¨ cÔ*¨i¸¸!¸¬nÒ<Ð<Ý  ¨qÔ!1¸]ÐKÑKÔKØ$ Qœ<ò(ð (ð  œ?×5Ò5Ø&¨¸
ÀEñô ð "ð !Ô3×:Ò:à$1Ø$2Ø$-Ô$7Ø$2Ø$-Ø$.Ø$)Ø$.ð	!"ñô ð ð +×1Ò1Ø!.°ÀÐ Oñô ð ð +×.Ò.°	¸:ÀzÐ/RÑSÔSÐSà .ð !Ô/°	¸:ÀzÐ0QÑRð "˜Eùùðq8	"ð 8	"r   c           	      ó˜  — | j         D ]Á\  }}}}}}}}||j        k    rF|                     ¦   «         }	||	_        |                      |t          j        |||	¬¦  «        ¦  «         |                      |t          j        |||¬¦  «        ¦  «         | j         	                    |||f¦  «         | j         
                    |||f¦  «         ŒÂdS )z Generate RenameField operations.r!  )rŽ   r  r  N)rQ  rP  ÚclonerV   rï   r   rç   ÚRenameFieldrš   r  rj   )
r   r  r  Úrem_db_columnrY  r�   rŽ   rW   r”   Úaltered_fields
             r   r|   z-MigrationAutodetector.generate_renamed_fieldsÔ  s  € ð Ô$ð!	Ið !	Iñ 	
ØØØØØØØØð
  ¤Ò/Ð/Ø %§¢¡¤�Ø%3�Ô"Ø×"Ò"ØÝÔ)Ø#-Ø+Ø+ðñ ô ñô ð ð ×ÒØÝÔ&Ø)Ø+Ø'ðñ ô ñô ð ð Ô×&Ò&¨°~À~Ð'VÑWÔWÐWØÔ×#Ò# Y°
¸JÐ$GÑHÔHÐHÐHðC!	Ið !	Ir   c                 óz   — t          | j        | j        z
  ¦  «        D ]\  }}}|                      |||¦  «         ŒdS )zMake AddField operations.N)rP   r›   rš   Ú_generate_added_field©r   r�   rŽ   r”   s       r   r�   z+MigrationAutodetector.generate_added_fieldsù  s[   € å17ØÔ $Ô"5Ñ5ñ2
ô 2
ð 	Jð 	JÑ-ˆI�z :ð ×&Ò& y°*¸jÑIÔIÐIÐIð	Jð 	Jr   c           	      ó
  — | j         j        ||f                              |¦  «        }|||dfg}|j        r<|j        j        r0|                     |                      |||| j         ¦  «        ¦  «         |j        r(|                     |                      |¦  «        ¦  «         t          j	        t          j
        t          j        f}|j        pR|                     ¦   «         p>|j        t          j        up+|j        p$|j        o|j        pt'          ||¦  «        o|j        }|sl|                     ¦   «         }t'          ||¦  «        r(|j        r!| j                             ||¦  «        |_        n | j                             ||¦  «        |_        |j        rB|j        t          j        ur/t9          |j        ¦  «        r| j                             ||¦  «         |                      |t?          j         ||||¬¦  «        |¬¦  «         d S )NF©rŽ   rV   rW   Úpreserve_defaultr  )!r   r   rS  rQ   r   r	  r
  Ú	generatedÚ%_get_dependencies_for_generated_fieldÚ	DateFieldÚDateTimeFieldÚ	TimeFieldÚnullÚhas_defaultÚ
db_defaultÚNOT_PROVIDEDrD  ÚblankÚempty_strings_allowedr<   Úauto_nowr_  Úauto_now_addr   Úask_auto_now_add_additionÚdefaultÚask_not_null_additionÚuniqueÚcallableÚ$ask_unique_callable_default_additionrï   r   rã   )r   r�   rŽ   r”   rW   r´   Útime_fieldsrh  s           r   rd  z+MigrationAutodetector._generate_added_field   sJ  € Ø”Ô$ Y°
Ð%:Ô;×EÒEÀjÑQÔQˆà" J°
¸EÐBÐCˆàÔð 	 %Ô"4Ô":ð 	Ø×ÒØ×6Ò6ØØØØ”Mñ	ô ñô ð ð Œ?ð 	SØ×Ò × JÒ JÈ5Ñ QÔ QÑRÔRÐRõ Ô'­Ô)=½vÔ?OÐPˆàŒJð CØ× Ò Ñ"Ô"ðCàÔ¥vÔ':Ð:ðCð Ô!ðCð ”Ð; Ô ;ð	Cõ
 ˜5 +Ñ.Ô.ÐA°5´>ð 	ð  ð 		Ø—K’K‘M”MˆEÝ˜% Ñ-Ô-ð °%Ô2Dð Ø $¤× IÒ IØ 
ñ!ô !�”�ð !%¤× EÒ EØ 
ñ!ô !�”ð ŒLð	Yà”¥VÔ%8Ð8Ð8Ý˜œÑ'Ô'ð 9ð ŒO×@Ò@ÀÈZÑXÔXÐXØ×ÒØÝÔØ%ØØØ!1ð	ñ ô ð &ð 	ñ 		
ô 		
ð 		
ð 		
ð 		
r   c                 óz   — t          | j        | j        z
  ¦  «        D ]\  }}}|                      |||¦  «         ŒdS )zMake RemoveField operations.N)rP   rš   r›   Ú_generate_removed_fieldre  s       r   r€   z-MigrationAutodetector.generate_removed_fields6  s[   € å17ØÔ $Ô"5Ñ5ñ2
ô 2
ð 	Lð 	LÑ-ˆI�z :ð ×(Ò(¨°JÀ
ÑKÔKÐKÐKð	Lð 	Lr   c           	      ór   — |                       |t          j        ||¬¦  «        |||df|||dfg¬¦  «         d S )NrB  rÝ   rß   r  )rï   r   rå   re  s       r   r~  z-MigrationAutodetector._generate_removed_field=  sh   € Ø×ÒØÝÔ"Ø%Øðñ ô ð ˜J¨
Ð4EÐFØ˜J¨
Ð4IÐJðð 	ñ 	
ô 	
ð 	
ð 	
ð 	
r   c           
      ó°  ‡ ‡‡— t          ‰ j        ‰ j        z  ¦  «        D �]´\  }}}‰ j                             ||f|¦  «        }‰ j                             |||f|¦  «        }‰ j        j        ||f                              |¦  «        }‰ j	        j        ||f                              |¦  «        }g }t          |d¦  «        �rrt          |j        dd¦  «        �r[t          |j        j        ||¦  «        Š‰‰ j        v r|j        j        |j        _        t          |j        dd¦  «        }	|	r;‰|	fz   }
|
‰ j        v r,|j        j        |j        _        |j        j        |j        _        t          |dd¦  «        }|r‹||fŠt!          ˆˆ fd„|D ¦   «         ¦  «        |_        t!          ˆˆ fd„|j        D ¦   «         ¦  «        |_        t          |dd¦  «        x}r-t!          |¦  «        |_        t!          |j        ¦  «        |_        |                     ‰                      |||‰ j	        ¦  «        ¦  «         t          |d¦  «        rPt          |j        dd¦  «        r:t          |j        j        ||¦  «        Š‰‰ j        v r|j        j        |j        _        ‰                      |¦  «        }‰                      |¦  «        }||k    �r||k    �r|j        o|j        }|j         o|j         }|s|r·d	}|j        r||j        su|                     ¦   «         sa|j        t          j        u rN|j        sG|                     ¦   «         }‰ j                             ||¦  «        }|t          j        ur	||_        d
}n|}‰                       |tC          j"        ||||¬¦  «        |¬¦  «         �Œ†‰  #                    |||¦  «         ‰  $                    |||¦  «         �Œ¶dS )zp
        Make AlterField operations, or possibly RemovedField/AddField if alter
        isn't possible.
        rQ   r   Nr”   Úfrom_fieldsc                 óN   •— g | ]!}‰j                              ‰|fz   |¦  «        ‘Œ"S r   ©r`   ri   )r   Ú
from_fieldÚfrom_rename_keyr   s     €€r   r0   zAMigrationAutodetector.generate_altered_fields.<locals>.<listcomp>~  sJ   ø€ ð ð ð ð !+ð !Ô/×3Ò3Ø /°:°-Ñ ?Àñô ðð ð r   c                 óN   •— g | ]!}‰j                              ‰|fz   |¦  «        ‘Œ"S r   rƒ  )r   Úto_fieldÚ
rename_keyr   s     €€r   r0   zAMigrationAutodetector.generate_altered_fields.<locals>.<listcomp>†  sC   ø€ ð ð ð à (ð !Ô/×3Ò3°JÀ(ÀÑ4LÈhÑWÔWðð ð r   rž   TFrg  r  )%rP   rš   r›   r’   ri   r`   r   r   rS  r   rG   rŸ   rQ   r   r   r”   r>   r�  Ú	to_fieldsr	  r
  rž   r-   rD  rn  ro  rp  rq  r_  r   Úask_not_null_alterationrw  rï   r   rç   r~  rd  )r   r�   rŽ   r”   r    Úold_field_namerZ  Ú	new_fieldr´   Úremote_field_nameÚto_field_rename_keyr�  Úold_from_fieldsr[  Únew_field_decÚboth_m2mÚneither_m2mrh  rW   Únew_defaultr…  rˆ  s   `                   @@r   r‚   z-MigrationAutodetector.generate_altered_fieldsM  sÜ  øøø€ õ
 28ØÔ $Ô"5Ñ5ñ2
ô 2
ð t	Rñ t	RÑ-ˆI�z :ð "Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð "Ô0×4Ò4Ø˜J¨
Ð3°Zñô ˆNð œÔ.¨y¸.Ð/HÔI×SÒSØñô ˆIð œÔ,¨Y¸
Ð-BÔC×MÒMØñô ˆIð ˆLõ �y .Ñ1Ô1ñ 0µgØÔ&¨°ñ7ô 7ñ 0õ .ØÔ*Ô0°)¸Zñô �
ð  Ô!4Ð4Ð4Ø3<Ô3IÔ3O�IÔ*Ô0å$+¨IÔ,BÀLÐRVÑ$WÔ$WÐ!Ø$ð 	Ø*4Ð8IÐ7KÑ*KÐ'Ø*¨dÔ.AÐAÐAð 8AÔ7MÔ7S˜	Ô.Ô4à%Ô2Ô=ð "Ô.Ô9õ & i°ÀÑEÔE�Øð IØ'0°*Ð&=�OÝ,1ðð ð ð ð ð /:ð	ñ ô ñ-ô -�IÔ)õ +0ðð ð ð ð à,5Ô,?ðñ ô ñ+ô +�IÔ'õ +2°)¸]ÈDÑ*QÔ*QÐQ�ð IÝ05°oÑ0FÔ0F˜	Ô-Ý.3°IÔ4GÑ.HÔ.H˜	Ô+Ø×#Ò#Ø×:Ò:Ø!Ø"Ø!Øœñ	ô ñô ð õ �y .Ñ1Ô1ð TµgØÔ&¨	°4ñ7ô 7ð Tõ .ØÔ*Ô2°I¸zñô �
ð  Ô!4Ð4Ð4Ø5>Ô5KÔ5S�IÔ*Ô2Ø ×1Ò1°)Ñ<Ô<ˆMØ ×1Ò1°)Ñ<Ô<ˆMð  Ò-Ñ-°.ÀJÒ2NÑ2NØ$Ô1ÐL°iÔ6L�Ø"+Ô"8Ð8ÐWÀÔAWÐ=W�Øð  R˜{ð  Rà'+Ð$à!œð*à )¤ð*ð !*× 5Ò 5Ñ 7Ô 7ð*ð &Ô0µFÔ4GÐGÐGØ )Ô 6ð Hð !*§¢Ñ 1Ô 1˜Ø&*¤o×&MÒ&MØ&¨
ñ'ô '˜ð '­fÔ.AÐAÐAØ,7˜EœMØ/4Ð,øà )˜Ø×&Ò&Ø!Ý"Ô-Ø'1Ø!+Ø"'Ø-=ð	ñ ô ð &2ð 'ñ 	ô 	ð 	ñ 	ð ×0Ò0°¸JÈ
ÑSÔSÐSØ×.Ò.¨y¸*ÀjÑQÔQÐQùðit	Rð t	Rr   c                 óÔ  ‡‡‡‡— t           j        j        }t          t          ¦  «        | _        t          | j        ¦  «        D �]£\  }}| j         	                    ||f|¦  «        }| j
        j        ||f         }| j        j        ||f         }|j        |         Š|j        |         Šˆfd„‰D ¦   «         }ˆfd„‰D ¦   «         }g }	g Šg Š|D ]³}
|
                     ¦   «         }|d                              d¦  «        }|D ]}|                     ¦   «         }|d                              d¦  «        }||k    rH||k    rB|	                     ||d f¦  «         ‰                     |
¦  «         ‰                     |¦  «         Œ€Œ´|                      t           j        j        ¦  «        D �]\  }}}}}||k    s||k    rŒ|                     |¦  «        }|D ]Ô}g }|D ]^}
|
                     ¦   «         \  }}}|sB|
j        t	          |¦  «        k    r*t+          |¦  «        ddhk    r|                     |
¦  «         Œ_t-          |¦  «        dk    r\|d         }‰                     |¦  «         |	                     d |j        |f¦  «         | j        ||f                              |¦  «         ŒÕ�Œˆfd„|D ¦   «         }ˆfd	„|D ¦   «         }| j                             ||f|||	d
œi¦  «         �Œ¥d S )Nc                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   ÚidxÚold_indexess     €r   r0   z@MigrationAutodetector.create_altered_indexes.<locals>.<listcomp>Õ  s#   ø€ ÐRÐRÐR S¸3ÀkÐ;QÐ;Q˜SÐ;QÐ;QÐ;Qr   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   r–  Únew_indexess     €r   r0   z@MigrationAutodetector.create_altered_indexes.<locals>.<listcomp>Ö  s#   ø€ ÐTÐTÐT s¸SÈÐ=SÐ=S˜sÐ=SÐ=SÐ=Sr   rN   rV   rT   r9   r   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   r–  Úremove_from_addeds     €r   r0   z@MigrationAutodetector.create_altered_indexes.<locals>.<listcomp>  s+   ø€ ð ð ð Ø°Ð;LÐ0LÐ0L�Ð0LÐ0LÐ0Lr   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   r–  Úremove_from_removeds     €r   r0   z@MigrationAutodetector.create_altered_indexes.<locals>.<listcomp>  s+   ø€ ð ð ð Ø°#Ð=PÐ2PÐ2P�Ð2PÐ2PÐ2Pr   )Úadded_indexesÚremoved_indexesÚrenamed_indexes)r   r.  Úoption_namer   r=   Úrenamed_index_together_valuesrP   r–   r’   ri   r   r   r   rh   r8   rR   rS   Ú$_get_altered_foo_together_operationsrë   r,  rT   ra   r¯   rV   r^   r»   ) r   r¡  r�   rŽ   r    r¡   rW  rž  rŸ  r   Ú	new_indexÚnew_index_decÚnew_index_nameÚ	old_indexÚold_index_decÚold_index_nameÚ	old_valueÚ	new_valueÚindex_together_app_labelÚindex_together_model_namer´   Úremoved_valuesÚremoved_index_togetherÚrenamed_index_together_indexesÚ_rD   rL   Úrenamed_indexr™  r—  r›  r�  s                                @@@@r   rx   z,MigrationAutodetector.create_altered_indexesÈ  sØ  øøøø€ Ý Ô)Ô5ˆÝ-8½Ñ->Ô->ˆÔ*å%+¨DÔ,@Ñ%AÔ%Að S	ñ S	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOà)Ô1°+Ô>ˆKØ)Ô1°+Ô>ˆKØRÐRÐRÐR¨KÐRÑRÔRˆMØTÐTÐTÐT¨kÐTÑTÔTˆOØ ˆOà "ÐØ"$ÐØ*ð >ð >�	Ø )× 5Ò 5Ñ 7Ô 7�Ø!.¨qÔ!1×!5Ò!5°fÑ!=Ô!=�Ø!0ð 
>ð 
>�IØ$-×$9Ò$9Ñ$;Ô$;�MØ%2°1Ô%5×%9Ò%9¸&Ñ%AÔ%A�Nð &¨Ò6Ð6Ø*¨nÒ<Ð<à'×.Ò.°ÀÐPTÐ/UÑVÔVÐVØ)×0Ò0°Ñ;Ô;Ð;Ø+×2Ò2°9Ñ=Ô=Ð=øð
>ð$ ×:Ò:ÝÔ-Ô9ñô ð#9ñ #9ñ ØØØ(Ø)Øð
 Ð!9Ò9Ð9Ø!Ð%>Ò>Ð>àØ!*×!5Ò!5°iÑ!@Ô!@�Ø.<ð 9ð 9Ð*Ø57Ð2Ø%2ð Mð M˜	Ø*3×*?Ò*?Ñ*AÔ*A™˜˜4 ð !%ðMà )Ô 0µDÐ9OÑ4PÔ4PÒ PÐ PÝ # F¡¤°¸Ð/AÒ AÐ Aà:×AÒAÀ)ÑLÔLÐLøåÐ9Ñ:Ô:¸aÒ?Ð?Ø(FÀqÔ(I˜Ø)×0Ò0°Ñ?Ô?Ð?Ø'×.Ò.Ø! =Ô#5Ð7MÐNñô ð ð Ô:Ø4Ð6OÐOôç š&Ð!7Ñ8Ô8Ð8øñ)9ð.ð ð ð Ø,ðñ ô ˆMðð ð ð Ø.ðñ ô ˆOð Ô ×'Ò'à 
Ð+Ø)6Ø+:Ø+:ð.ð .ðñô ð ñ ðWS	ð S	r   c           	      óä   — | j                              ¦   «         D ]U\  \  }}}|                      ||¦  «        }|d         D ].}|                      |t	          j        ||¬¦  «        |¬¦  «         Œ/ŒVd S )Nrž  r$  r  )r^   r@   Ú_get_dependencies_for_modelrï   r   r.  )r   r�   rŽ   Úalt_indexesr´   r%  s         r   r†   z,MigrationAutodetector.generate_added_indexes!  s§   € Ø48Ô4H×4NÒ4NÑ4PÔ4Pð 
	ð 
	Ñ0Ñ#ˆY˜
 [Ø×;Ò;¸IÀzÑRÔRˆLØ$ _Ô5ð ð �Ø×"Ò"ØÝÔ'Ø#-Ø#ðñ ô ð ".ð #ñ ô ð ð ðð
	ð 
	r   c           	      ó¾   — | j                              ¦   «         D ]B\  \  }}}|d         D ]1}|                      |t          j        ||j        ¬¦  «        ¦  «         Œ2ŒCd S )NrŸ  rB  )r^   r@   rï   r   ÚRemoveIndexrV   )r   r�   rŽ   rµ  r%  s        r   r{   z.MigrationAutodetector.generate_removed_indexes.  s‹   € Ø48Ô4H×4NÒ4NÑ4PÔ4Pð 	ð 	Ñ0Ñ#ˆY˜
 [Ø$Ð%6Ô7ð ð �Ø×"Ò"ØÝÔ*Ø#-Ø"œZðñ ô ñô ð ð ðð	ð 	r   c                 óÀ   — | j                              ¦   «         D ]C\  \  }}}|d         D ]2\  }}}|                      |t          j        ||||¬¦  «        ¦  «         Œ3ŒDd S )Nr   )rŽ   r  r  Ú
old_fields)r^   r@   rï   r   ÚRenameIndex)r   r�   rŽ   rµ  r©  r¦  r¹  s          r   r}   z.MigrationAutodetector.generate_renamed_indexes9  sš   € Ø48Ô4H×4NÒ4NÑ4PÔ4Pð 	ð 	Ñ0Ñ#ˆY˜
 [Ø>IØ!ô?ð ð Ñ:� °
ð ×"Ò"ØÝÔ*Ø#-Ø!/Ø!/Ø#-ð	ñ ô ñô ð ð ðð	ð 	r   c                 ó˜  ‡	‡
— t           j        j        }t          | j        ¦  «        D ]¡\  }}| j                             ||f|¦  «        }| j        j        ||f         }| j	        j        ||f         }|j
        |         Š
|j
        |         Š	ˆ
fd„‰	D ¦   «         }ˆ	fd„‰
D ¦   «         }| j                             ||f||dœi¦  «         Œ¢d S )Nc                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   ÚcÚold_constraintss     €r   r0   zDMigrationAutodetector.create_altered_constraints.<locals>.<listcomp>S  ó#   ø€ ÐVÐVÐV Q¸QÀoÐ=UÐ=U˜qÐ=UÐ=UÐ=Ur   c                 ó   •— g | ]}|‰v¯|‘Œ	S r   r   )r   r½  Únew_constraintss     €r   r0   zDMigrationAutodetector.create_altered_constraints.<locals>.<listcomp>T  r¿  r   )Úadded_constraintsÚremoved_constraints)r   r/  r¡  rP   r–   r’   ri   r   r   r   rh   r_   r»   )r   r¡  r�   rŽ   r    r¡   rW  Úadd_constraintsÚrem_constraintsrÁ  r¾  s            @@r   ry   z0MigrationAutodetector.create_altered_constraintsH  s  øø€ Ý Ô.Ô:ˆÝ%+¨DÔ,@Ñ%AÔ%Að 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOà-Ô5°kÔBˆOØ-Ô5°kÔBˆOØVÐVÐVÐV¨/ÐVÑVÔVˆOØVÐVÐVÐV¨/ÐVÑVÔVˆOàÔ$×+Ò+à 
Ð+Ø-<Ø/>ð.ð .ðñô ð ð ð	ð 	r   c           	      óä   — | j                              ¦   «         D ]U\  \  }}}|                      ||¦  «        }|d         D ].}|                      |t	          j        ||¬¦  «        |¬¦  «         Œ/ŒVd S )NrÂ  r&  r  )r_   r@   r´  rï   r   r/  )r   r�   rŽ   Úalt_constraintsr´   r'  s         r   r‡   z0MigrationAutodetector.generate_added_constraints_  s±   € ð #Ô6×<Ò<Ñ>Ô>ð	ð 	ñ ñ 
ØØØØ×;Ò;¸IÀzÑRÔRˆLØ-Ð.AÔBð ð �
Ø×"Ò"ØÝÔ,Ø#-Ø#-ðñ ô ð ".ð #ñ ô ð ð ðð	ð 	r   c           	      ó¾   — | j                              ¦   «         D ]B\  \  }}}|d         D ]1}|                      |t          j        ||j        ¬¦  «        ¦  «         Œ2ŒCd S )NrÃ  rB  )r_   r@   rï   r   ÚRemoveConstraintrV   )r   r�   rŽ   rÇ  r'  s        r   rz   z2MigrationAutodetector.generate_removed_constraintso  s”   € ð #Ô6×<Ò<Ñ>Ô>ð	ð 	ñ ñ 
ØØØØ-Ð.CÔDð ð �
Ø×"Ò"ØÝÔ/Ø#-Ø'œ_ðñ ô ñô ð ð ðð		ð 	r   c                 ó  ‡— d }t          ‰j        d¦  «        r‰j        j        }nb|j        | |f         }|                     ¦   «         D ]>\  \  }}}t          ˆfd„|                     ¦   «         D ¦   «         ¦  «        r	|› d|› �} nŒ?t          ‰dd ¦  «        }	|	�d}
|	}nt          || |¦  «        \  }
}|
|d dfg}t          ‰j        dd ¦  «        r7t          ‰j        j	        | |¦  «        \  }}| 
                    ||d df¦  «         |S )Nr   c              3   ó.   •K  — | ]}‰|j         k    V — Œd S r2   )rQ   )r   r>  rW   s     €r   r3   zJMigrationAutodetector._get_dependencies_for_foreign_key.<locals>.<genexpr>…  s?   øè è € ð ð à%ð ˜]Ô7Ò7ðð ð ð ð ð r   r¥   Úswappable_settingr¤   Trž   )rG   rQ   r   r  r@   râ   r·   rŸ   r   rž   rS   )r�   rŽ   rW   Úproject_stateÚremote_field_modelr  Úremote_app_labelÚremote_model_namerT   rÌ  Údep_app_labelÚdep_object_namer´   Úthrough_app_labelÚthrough_object_names     `            r   r
  z7MigrationAutodetector._get_dependencies_for_foreign_key}  s€  ø€ à!ÐÝ�5Ô% wÑ/Ô/ð 
	Ø!&Ô!3Ô!9ÐÐà%Ô/°	¸:Ð0EÔFˆIØAJÇÂÑARÔARð ð Ñ=Ñ5Ð!Ð#4°vÝð ð ð ð à)/¯ª©¬ðñ ô ñ ô ð ð -=Ð)RÐ)RÐ?PÐ)RÐ)RÐ&Ø�Eðõ $ EÐ+>ÀÑEÔEÐØÐ(Ø)ˆMØ/ˆOˆOå-=Ø"ØØñ.ô .Ñ*ˆM˜?ð
 '¨¸¸tÐDÐEˆÝ�5Ô% y°$Ñ7Ô7ð 	VÝ5EØÔ"Ô*ØØñ6ô 6Ñ2ÐÐ2ð
 ×ÒÐ!2Ð4GÈÈtÐ TÑUÔUÐUØÐr   c                 óR  — g }t          j        |j        ¦  «        j        }t	          | j        | j        z
  ¦  «        }|D ]g\  }}}| j        j         ||f                              |¦  «        }|j	        r|j	        j
        s	|j        |v r|                     |||j        df¦  «         Œh|S r  )r   ÚQÚ
expressionÚreferenced_base_fieldsrP   r›   rš   r   rS  rQ   r   rV   rS   )	r   rW   r´   rØ  Únewly_added_fieldsr�   rŽ   Úadded_field_nameÚadded_fields	            r   rj  z;MigrationAutodetector._get_dependencies_for_generated_field   sÉ   € ØˆÝ!'¤¨%Ô*:Ñ!;Ô!;Ô!RÐÝ# DÔ$7¸$Ô:MÑ$MÑNÔNÐØ7Ið 	Uð 	UÑ3ˆI�zÐ#3Øœ-Ô.¨y¸*Ð/DÔE×OÒOØ ñô ˆKð Ô(ðUØ-8Ô-EÔ-KðUàÔ!Ð%;Ð;Ð;Ø×#Ò# Y°
¸KÔ<LÈdÐ$SÑTÔTÐTøØÐr   c           	      óØ   — g }| j         j        ||f         }|j                             ¦   «         D ]9}|j        r0|                     |                      |||| j         ¦  «        ¦  «         Œ:|S )z3Return foreign key dependencies of the given model.)r   r   rT   r·   r  r	  r
  )r   r�   rŽ   r´   r�   rW   s         r   r´  z1MigrationAutodetector._get_dependencies_for_model®  s†   € àˆØ”mÔ*¨9°jÐ+@ÔAˆØ Ô'×.Ò.Ñ0Ô0ð 		ð 		ˆEØÔ ð Ø×#Ò#Ø×:Ò:Ø!Ø"ØØœñ	ô ñô ð øð Ðr   c              #   óž  ‡ ‡‡K  — t          ‰ j        ¦  «        D �]1\  ŠŠ‰ j                             ‰‰f‰¦  «        }‰ j        j        ‰|f         }‰ j        j        ‰‰f         }|j                             |¦  «        }|rˆˆˆ fd„|D ¦   «         nt          ¦   «         }|j                             |¦  «        }|rt          |¦  «        nt          ¦   «         }||k    rmg }|D ]_}|D ]Z}	| 	                    |	¦  «        }
|
j
        r<|
j
        j        r0|                     ‰                      ‰‰|
‰ j        ¦  «        ¦  «         Œ[Œ`||‰‰|fV — �Œ3d S )Nc                 óJ   •— h | ]}t          ˆˆˆfd „|D ¦   «         ¦  «        ’Œ S )c              3   óT   •K  — | ]"}‰j                              ‰‰|f|¦  «        V — Œ#d S r2   rƒ  )r   Únr�   rŽ   r   s     €€€r   r3   zWMigrationAutodetector._get_altered_foo_together_operations.<locals>.<setcomp>.<genexpr>Ê  sQ   øè è € ð ð àð Ô+×/Ò/°¸JÈÐ0JÈAÑNÔNðð ð ð ð ð r   )r>   )r   ry  r�   rŽ   r   s     €€€r   r   zMMigrationAutodetector._get_altered_foo_together_operations.<locals>.<setcomp>É  se   ø€ ð ð ð ð
 õ	 ð ð ð ð ð ð à!'ðñ ô ñ ô ðð ð r   )rP   r–   r’   ri   r   r   r   rh   ra   rS  rQ   r   r	  r
  )r   r¡  r    r¡   rW  rª  r«  r´   Úfoo_togethersr”   rW   r�   rŽ   s   `          @@r   r£  z:MigrationAutodetector._get_altered_foo_together_operations¾  sÔ  øøøè è € Ý%+¨DÔ,@Ñ%AÔ%Að ,	ñ ,	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOð (Ô/×3Ò3°KÑ@Ô@ˆIð ðð ð ð ð ð ð ð
 #,ðñ ô ð õ ‘U”Uð ð (Ô/×3Ò3°KÑ@Ô@ˆIØ*3Ð>�˜I™œ˜½¹¼ˆIà˜IÒ%Ð%Ø!�Ø%.ð ð �MØ&3ð 
ð 
˜
Ø /× 9Ò 9¸*Ñ EÔ E˜Ø Ô-ð °%Ô2DÔ2Jð Ø(×/Ò/Ø $× FÒ FØ$-Ø$.Ø$)Ø$(¤Mñ	!"ô !"ñô ð øð
ð ØØØØ ðð ð ð ùðM,	ð ,	r   c           
      ó  ‡ ‡‡— ‰                       |j        ¦  «        D ]h\  }}ŠŠ}|t          j        k    rˆˆˆ fd„|D ¦   «         }|                     |¦  «        }|s|r'‰                      ‰ |dd‰i|j        |i¤Ž|¬¦  «         Œid S )Nc                 ó6   •— h | ]}|‰j         ‰‰f         v¯|’ŒS r   )r¢  )r   r/   r�   rŽ   r   s     €€€r   r   zOMigrationAutodetector._generate_removed_altered_foo_together.<locals>.<setcomp>ö  sK   ø€ ð ð ð àØØÔ=¸iÈÐ>SÔTðUð Uð ðUð Uð Ur   rV   r  r   )r£  r¡  r   rë   r-  rï   )r   rÂ   rª  r«  r´   Úremoval_valuer�   rŽ   s   `     @@r   Ú&_generate_removed_altered_foo_togetherz<MigrationAutodetector._generate_removed_altered_foo_togetherí  sù   øøø€ ð ×6Ò6°yÔ7LÑMÔMð	ð 	ñ 
ØØØØØà�JÔ9Ò9Ð9ðð ð ð ð ð à!*ðñ ô �	ð &×2Ò2°9Ñ=Ô=ˆMØð  	ð Ø×"Ò"ØØ�Ið ð Ø'ðØ,5Ô,AÀ=Ð+Qðð ð ".ð #ñ ô ð øð!	ð 	r   c                 óD   — |                       t          j        ¦  «         d S r2   )rå  r   rê   rœ   s    r   r~   z>MigrationAutodetector.generate_removed_altered_unique_together  s   € Ø×3Ò3µJÔ4RÑSÔSÐSÐSÐSr   c                 óD   — |                       t          j        ¦  «         d S r2   )rå  r   rë   rœ   s    r   r   z=MigrationAutodetector.generate_removed_altered_index_together
  s   € Ø×3Ò3µJÔ4QÑRÔRÐRÐRÐRr   c           
      óÐ   — |                       |j        ¦  «        D ]J\  }}}}}|                     |¦  «        }||k    r'|                      | |dd|i|j        |i¤Ž|¬¦  «         ŒKd S )NrV   r  r   )r£  r¡  r-  rï   )r   rÂ   rª  r«  r�   rŽ   r´   rä  s           r   Ú_generate_altered_foo_togetherz4MigrationAutodetector._generate_altered_foo_together  s¢   € ð ×6Ò6°yÔ7LÑMÔMð	ð 	ñ 
ØØØØØà%×2Ò2°9Ñ=Ô=ˆMØ˜MÒ)Ð)Ø×"Ò"ØØ�IÐTÐT :ÐT°)Ô2GÈÐ1SÐTÐTØ!-ð #ñ ô ð øð	ð 	r   c                 óD   — |                       t          j        ¦  «         d S r2   )ré  r   rê   rœ   s    r   r„   z6MigrationAutodetector.generate_altered_unique_together  s   € Ø×+Ò+­JÔ,JÑKÔKÐKÐKÐKr   c                 óD   — |                       t          j        ¦  «         d S r2   )ré  r   rë   rœ   s    r   r…   z5MigrationAutodetector.generate_altered_index_together!  s   € Ø×+Ò+­JÔ,IÑJÔJÐJÐJÐJr   c                 óÌ  — | j                              | j        | j        ¦  «        }t	          |¦  «        D ]®\  }}| j                             ||f|¦  «        }| j        j        ||f         }| j	        j        ||f         }|j
                             d¦  «        }|j
                             d¦  «        }||k    r*|                      |t          j        ||¬¦  «        ¦  «         Œ¯d S )NÚdb_table)rV   Útable)r–   Úunionr—   r˜   rP   r’   ri   r   r   r   rh   rï   r   ÚAlterModelTable)	r   Úmodels_to_checkr�   rŽ   r    r¡   rW  Úold_db_table_nameÚnew_db_table_names	            r   rˆ   z/MigrationAutodetector.generate_altered_db_table$  s
  € ØÔ.×4Ò4ØÔ  $Ô":ñ
ô 
ˆõ &,¨OÑ%<Ô%<ð 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOØ /Ô 7× ;Ò ;¸JÑ GÔ GÐØ /Ô 7× ;Ò ;¸JÑ GÔ GÐØ Ð$5Ò5Ð5Ø×"Ò"ØÝÔ.Ø'Ø/ðñ ô ñô ð øð	ð 	r   c                 óÌ  — | j                              | j        | j        ¦  «        }t	          |¦  «        D ]®\  }}| j                             ||f|¦  «        }| j        j        ||f         }| j	        j        ||f         }|j
                             d¦  «        }|j
                             d¦  «        }||k    r*|                      |t          j        ||¬¦  «        ¦  «         Œ¯d S )NÚdb_table_comment)rV   Útable_comment)r–   rï  r—   r˜   rP   r’   ri   r   r   r   rh   rï   r   ÚAlterModelTableComment)	r   rñ  r�   rŽ   r    r¡   rW  Úold_db_table_commentÚnew_db_table_comments	            r   rv   z7MigrationAutodetector.generate_altered_db_table_comment9  s  € ØÔ.×4Ò4ØÔ  $Ô":ñ
ô 
ˆõ &,¨OÑ%<Ô%<ð 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOà#2Ô#:×#>Ò#>Ð?QÑ#RÔ#RÐ Ø#2Ô#:×#>Ò#>Ð?QÑ#RÔ#RÐ Ø#Ð';Ò;Ð;Ø×"Ò"ØÝÔ5Ø'Ø&:ðñ ô ñô ð øð	ð 	r   c                 ó(  — | j                              | j        | j        | j        | j        z  | j        | j        z  ¦  «        }t          |¦  «        D ]À\  }}| j	         
                    ||f|¦  «        }| j        j        ||f         }| j        j        ||f         }d„ |j                             ¦   «         D ¦   «         }d„ |j                             ¦   «         D ¦   «         }||k    r*|                      |t#          j        ||¬¦  «        ¦  «         ŒÁdS )zÄ
        Work out if any non-schema-affecting options have changed and make an
        operation to represent them in state changes (in case Python code in
        migrations needs them).
        c                 ó6   — i | ]\  }}|t           j        v ¯||“ŒS r   ©r
   ÚALTER_OPTION_KEYS©r   r6   r/   s      r   r7   zBMigrationAutodetector.generate_altered_options.<locals>.<dictcomp>d  ó7   € ð ð ð á�C˜ØÕ+Ô=Ð=Ð=ð �Uà=Ð=Ð=r   c                 ó6   — i | ]\  }}|t           j        v ¯||“ŒS r   rü  rþ  s      r   r7   zBMigrationAutodetector.generate_altered_options.<locals>.<dictcomp>i  rÿ  r   )rV   rh   N)r–   rï  r—   r˜   rd   re   rb   rg   rP   r’   ri   r   r   r   rh   r@   rï   r   r
   )	r   rñ  r�   rŽ   r    r¡   rW  Úold_optionsÚnew_optionss	            r   rt   z.MigrationAutodetector.generate_altered_optionsO  sV  € ð Ô.×4Ò4ØÔ ØÔ$àÔ# dÔ&9Ñ9àÔ $Ô"9Ñ9ñ
ô 
ˆõ &,¨OÑ%<Ô%<ð 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOðð à"1Ô"9×"?Ò"?Ñ"AÔ"Aðñ ô ˆKð
ð à"1Ô"9×"?Ò"?Ñ"AÔ"Aðñ ô ˆKð
 ˜kÒ)Ð)Ø×"Ò"ØÝÔ0Ø'Ø +ðñ ô ñô ð øð#	ð 	r   c           
      ó<  — t          | j        ¦  «        D �]\  }}| j                             ||f|¦  «        }| j        j        ||f         }| j        j        ||f         }|j                             d¦  «        |j                             d¦  «        k    r„g }|j                             d¦  «        r$|                     |||j        d         df¦  «         |  	                    |t          j        ||j                             d¦  «        ¬¦  «        |¬¦  «         �Œd S )Nré   Tr"  r  )rP   r–   r’   ri   r   r   r   rh   rS   rï   r   rè   )r   r�   rŽ   r    r¡   rW  r´   s          r   rƒ   z<MigrationAutodetector.generate_altered_order_with_respect_tow  s]  € Ý%+¨DÔ,@Ñ%AÔ%Að 	ñ 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOØÔ&×*Ò*Ø'ñô à Ô(×,Ò,Ð-DÑEÔEòFð Fð
  "�Ø"Ô*×.Ò.Ð/FÑGÔGð Ø ×'Ò'à%Ø&Ø+Ô3Ð4KÔLØ ð	ñô ð ð ×"Ò"ØÝÔ6Ø'Ø.=Ô.E×.IÒ.IØ3ñ/ô /ðñ ô ð ".ð #ñ 	ô 	ð 	ùð-	ð 	r   c                 óB  — t          | j        ¦  «        D ]‰\  }}| j                             ||f|¦  «        }| j        j        ||f         }| j        j        ||f         }|j        |j        k    r/|                      |t          j
        ||j        ¬¦  «        ¦  «         ŒŠd S )N)rV   r   )rP   r–   r’   ri   r   r   r   r   rï   r   ÚAlterModelManagers)r   r�   rŽ   r    r¡   rW  s         r   ru   z/MigrationAutodetector.generate_altered_managers™  sÂ   € Ý%+¨DÔ,@Ñ%AÔ%Að 	ð 	Ñ!ˆI�zØ!Ô0×4Ò4Ø˜JÐ'¨ñô ˆNð #œoÔ4°YÀÐ5NÔOˆOØ"œmÔ2°9¸jÐ3HÔIˆOØÔ'¨?Ô+CÒCÐCØ×"Ò"ØÝÔ1Ø'Ø!0Ô!9ðñ ô ñô ð øð	ð 	r   c                 ót  ‡— |                      ¦   «         }i Št          |                     ¦   «         ¦  «        D �]I\  }}|sŒ	d}|D ]}|d         |k    r|} nŒ|€1| j                             |¦  «        s|D ]}	|df‰||	j        f<   Œ||= ŒS|€d}
n |                      |d         ¦  «        pddz   }
t          |¦  «        D ]Á\  }}	|dk    r|r|	j         	                    |¦  «         d|
z  g}|r| 	                    |¦  «         nM|dk    r|s| 	                    d¦  «         n/| 	                    |	 
                    ¦   «         dd…         ¦  «         d                     |¦  «        }||f‰||	j        f<   |
dz  }
||	_        ŒÂ�ŒK|                     ¦   «         D ]}|D ]}	ˆfd	„|	j        D ¦   «         |	_        ŒŒ |S )
zÁ
        Take a result from changes() and a MigrationGraph, and fix the names
        and dependencies of the changes so they extend the graph from the leaf
        nodes for each app.
        Nr   r³   r9   z%04ir¼   éd   r±  c                 ó<   •— g | ]}‰                      ||¦  «        ‘ŒS r   ©ri   )r   r  Úname_maps     €r   r0   z;MigrationAutodetector.arrange_for_graph.<locals>.<listcomp>Ø  s4   ø€ ð *ð *ð *Ø+,�H—L’L  AÑ&Ô&ð*ð *ð *r   )rº   r=   r@   r   Úask_initialrV   Úparse_numberÚ	enumerater´   rS   Úsuggest_nameÚjoinr·   )r   r)   r%   r(   Úleavesr�   rŒ   Úapp_leafÚleafr×   Únext_numberÚiÚnew_name_partsr  r
  s                 @r   r#   z'MigrationAutodetector.arrange_for_graph©  s[  ø€ ð ×!Ò!Ñ#Ô#ˆØˆÝ%)¨'¯-ª-©/¬/Ñ%:Ô%:ð #	*ñ #	*Ñ!ˆI�zØð ØàˆHØð ð �Ø˜”7˜iÒ'Ð'Ø#�HØ�Eð (ð Ð¨¬×(CÒ(CÀIÑ(NÔ(NÐà!+ð Uð U�IØ=FÈÐ<T�H˜i¨¬Ð8Ñ9Ð9Ø˜IÐ&ØàÐØ��à#×0Ò0°¸!´Ñ=Ô=ÐBÀÀaÑG�å )¨*Ñ 5Ô 5ð *ð *‘��9Ø˜’6�6˜h�6ØÔ*×1Ò1°(Ñ;Ô;Ð;Ø"(¨;Ñ"6Ð!7�Ø!ð JØ"×)Ò)¨.Ñ9Ô9Ð9Ð9Ø˜!’V�V H�VØ"×)Ò)¨)Ñ4Ô4Ð4Ð4à"×)Ò)¨)×*@Ò*@Ñ*BÔ*BÀ4ÀCÀ4Ô*HÑIÔIÐIØŸ8š8 NÑ3Ô3�Ø9BÀHÐ8M�˜) Y¤^Ð4Ñ5Ø˜qÑ �Ø!)�	”�ñ*ð "Ÿ.š.Ñ*Ô*ð 	ð 	ˆJØ'ð ð �	ð*ð *ð *ð *Ø09Ô0Fð*ñ *ô *�	Ô&Ð&ðð ˆr   c                 ó„  ‡
— i Š
|                      ¦   «         D ]L\  }}|D ]D}|j        D ]:\  }}‰
                     |t          ¦   «         ¦  «                             |¦  «         Œ;ŒEŒMt          |¦  «        }d}	|	|k    r+t          |¦  «        }	 |j        ˆ
fd„|D ¦   «         Ž  |	|k    °+t          |¦  «        D ]	}||vr||= Œ
|S )a1  
        Take changes from arrange_for_graph() and set of app labels, and return
        a modified set of changes which trims out as many migrations that are
        not in app_labels as possible. Note that some other migrations may
        still be present as they may be required dependencies.
        Nc                 ó<   •— g | ]}‰                      |d ¦  «        ‘ŒS )r   r	  )r   r�   Úapp_dependenciess     €r   r0   z7MigrationAutodetector._trim_to_apps.<locals>.<listcomp>ð  s*   ø€ ÐUÐUÐU¸)Ð"×&Ò& y°"Ñ5Ô5ÐUÐUÐUr   )r@   r´   r½   ra   rj   r»   r=   )r   r)   Ú
app_labelsr�   rŒ   r×   rÑ  rV   Úrequired_appsÚold_required_appsr  s             @r   r$   z#MigrationAutodetector._trim_to_appsÝ  s  ø€ ð ÐØ%,§]¢]¡_¤_ð 	Uð 	UÑ!ˆI�zØ'ð Uð U�	Ø+4Ô+Að Uð UÑ'�M 4Ø$×/Ò/°	½3¹5¼5ÑAÔA×EÒEÀmÑTÔTÐTÐTðUðUõ ˜J™œˆà ÐØ =Ò0Ð0Ý # MÑ 2Ô 2ÐØ ˆMÔ ØUÐUÐUÐUÀ}ÐUÑUÔUðð ð   =Ò0Ð0õ ˜g™œð 	'ð 	'ˆIØ Ð-Ð-Ø˜IÐ&øØˆr   c                 ó¶   — t          j        d|¦  «        x}rt          |d         ¦  «        S t          j        d|¦  «        }|rt          |d         ¦  «        S dS )uã   
        Given a migration name, try to extract a number from the beginning of
        it. For a squashed migration such as '0001_squashed_0004â€¦', return the
        second number. If no number is found, return None.
        z.*_squashed_(\d+)r9   z^\d+r   N)ÚreÚsearchÚintÚmatch)ÚclsrV   Úsquashed_matchr   s       r   r  z"MigrationAutodetector.parse_numberø  s_   € õ  œYÐ';¸TÑBÔBÐBˆ>ð 	*Ý�~ aÔ(Ñ)Ô)Ð)Ý”˜ $Ñ'Ô'ˆØð 	!Ý�u˜Q”x‘=”=Ð Øˆtr   r2   )NNN)NN)NF)9ró   Ú
__module__Ú__qualname__Ú__doc__r    r)   r-   rY   r"   rn   ro   Ústaticmethodr«   rŠ   r‰   r‹   r¹   rï   rÿ   rm   rq   rs   rp   rr   rw   r|   r�   rd  r€   r~  r‚   rx   r†   r{   r}   ry   r‡   rz   r
  rj  r´  r£  rå  r~   r   ré  r„   r…   rˆ   rv   rt   rƒ   ru   r#   r$   Úclassmethodr  r   r   r   r   r      s¯  € € € € € ð
ð 
ðGð Gð Gð Gð
ð 
ð 
ð 
ð$ð $ð $ðLð ð ðið ið ið iðV
ð 
ð 
ð.ð ð ð( ð
Yð 
Yñ „\ð
Yðp"ð p"ð p"ð p"ðdKð Kð Kð$ð ð ð$=Kð =Kð =Kð~Rð Rð Rð Rðð ð ð.B"ð B"ð B"ðHAð Að AðFð ð ðB_ð _ð _ðBð ð ð<"ð <"ð <"ð|#Ið #Ið #IðJJð Jð Jð4
ð 4
ð 4
ðlLð Lð Lð
ð 
ð 
ð yRð yRð yRðvWð Wð Wðrð ð ð	ð 	ð 	ðð ð ðð ð ð.ð ð ð ð ð ð ð ð  ñ „\ð ðDð ð ðð ð ð -ð -ð -ð^ð ð ð2Tð Tð TðSð Sð Sðð ð ð Lð Lð LðKð Kð Kðð ð ð*ð ð ð,&ð &ð &ðP ð  ð  ðDð ð ð 2ð 2ð 2ð 2ðhð ð ð6 ðð ñ „[ðð ð r   r   )rA   r  Úcollectionsr   Úgraphlibr   Ú	itertoolsr   Údjango.confr   Ú	django.dbr   Údjango.db.migrationsr   Údjango.db.migrations.migrationr	   Ú&django.db.migrations.operations.modelsr
   Údjango.db.migrations.optimizerr   Údjango.db.migrations.questionerr   Údjango.db.migrations.utilsr   r   r   r   r   r   r   ú<module>r3     s<  ðØ Ð Ð Ð Ø 	€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð à  Ð  Ð  Ð  Ð  Ð  Ø Ð Ð Ð Ð Ð Ø +Ð +Ð +Ð +Ð +Ð +Ø 4Ð 4Ð 4Ð 4Ð 4Ð 4Ø DÐ DÐ DÐ DÐ DÐ DØ =Ð =Ð =Ð =Ð =Ð =Ø ?Ð ?Ð ?Ð ?Ð ?Ð ?ðð ð ð ð ð ð ð ð ð ðoð oð oð oð oñ oô oð oð oð or   