Ë
    ¸2Úi\‹  ã                   ón  — d Z ddlmZmZ ddlmZ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 ddlmZ ddlmZ ddlmZ ddlmZmZ d#d„Z d„ Z!d„ Z"d„ Z#d„ Z$ edg d¢«      Z% edg d¢«      Z& e&dddd¬«      Z' G d„ d«      Z( G d„ de(«      Z) G d„ d e(«      Z* G d!„ d"e(«      Z+y)$zk
Pagination serializers determine the structure of the output that should
be used for paginated responses.
é    )Ú	b64decodeÚ	b64encode)ÚOrderedDictÚ
namedtuple)Úparse)ÚInvalidPage)Ú	Paginator)Úloader)Ú	force_str)Úgettext_lazy)ÚcoreapiÚ
coreschema)ÚNotFound)ÚResponse)Úapi_settings)Úremove_query_paramÚreplace_query_paramFNc                 ód   — t        | «      }|dk  s|dk(  r|r
t        «       ‚|rt        ||«      S |S )z7
    Cast a string to a strictly positive integer.
    r   )ÚintÚ
ValueErrorÚmin)Úinteger_stringÚstrictÚcutoffÚrets       úP/var/www/html/acx/venv/lib/python3.12/site-packages/rest_framework/pagination.pyÚ_positive_intr      s:   € ô ˆnÓ
€CØ
ˆQ‚w�3˜!’8¡Ü‹lÐÙÜ�3˜ÓÐØ€Jó    c                 ó&   — | |z  r| |z  dz   S | |z  S )zD
    Returns 'a' divided by 'b', with any remainder rounded up.
    é   © )ÚaÚbs     r   Ú_divide_with_ceilr$   "   s"   € ð 	ˆ1‚uØ�Q‘˜!‰|Ðà�‰6€Mr   c                 óô  — | dk\  sJ ‚|| k\  sJ ‚|dk  rt        t        d|dz   «      «      S d| dz
  | | dz   |h}| dk  r"|j                  d«       |j                  d«       | |dz
  k\  r(|j                  |dz
  «       |j                  |dz
  «       t        |«      D �cg c]  }d|cxk  r|k  rn n|‘Œ }}| dkD  r|j	                  dd«       | |dz
  k  r|j	                  t        |«      dz
  d«       |S c c}w )aŒ  
    This utility function determines a list of page numbers to display.
    This gives us a nice contextually relevant set of page numbers.

    For example:
    current=14, final=16 -> [1, None, 13, 14, 15, 16]

    This implementation gives one page to each side of the cursor,
    or two pages to the side when the cursor is at the edge, then
    ensures that any breaks between non-continuous page numbers never
    remove only a single page.

    For an alternative implementation which gives two pages to each side of
    the cursor, eg. as in GitHub issue list pagination, see:

    https://gist.github.com/tomchristie/321140cebb1c4a558b15
    r    é   é   é   é   r   N)ÚlistÚrangeÚaddÚsortedÚinsertÚlen)ÚcurrentÚfinalÚincludedÚidxs       r   Ú_get_displayed_page_numbersr4   ,   s  € ð$ �aŠ<Ðˆ<Ø�GÒÐÐà�‚zÜ”E˜!˜U Q™YÓ'Ó(Ð(ð �7˜Q‘; ¨°1©°eÐ<€Hð �!‚|Ø�‰�QŒØ�‰�QŒØ�%˜!‘)ÒØ�‰�U˜Q‘YÔØ�‰�U˜Q‘YÔô ˜hÓ'öØØˆsÔ�eÕò 	ð€Hð ð �‚{Ø�‰˜˜4Ô Ø�˜‘ÒØ�‰œ˜H›¨Ñ)¨4Ô0Ø€Oùòs   ÂC5c                 ó|   — g }| D ]4  }|€t         }nt         ||«      |||k(  d¬«      }|j                  |«       Œ6 |S )zg
    Given a list of page numbers and `None` page breaks,
    return a list of `PageLink` objects.
    F©ÚurlÚnumberÚ	is_activeÚis_break)Ú
PAGE_BREAKÚPageLinkÚappend)Úpage_numbersr0   Úurl_funcÚ
page_linksÚpage_numberÚ	page_links         r   Ú_get_page_linksrC   _   s[   € ð
 €JØ#ò 
%ˆØÐÜ"‰Iä Ù˜[Ó)Ø"Ø&¨'Ñ1Øô	ˆIð 	×Ñ˜)Õ$ð
%ð Ðr   c                 óP   — d„ }t        | D �cg c]
  } ||«      ‘Œ c}«      S c c}w )z�
    Given an order_by tuple such as `('-created', 'uuid')` reverse the
    ordering and return a new tuple, eg. `('created', '-uuid')`.
    c                 ó8   — | j                  d«      r| dd  S d| z   S )Nú-r    )Ú
startswith)Úxs    r   Úinvertz!_reverse_ordering.<locals>.invertx   s"   € ØŸ™ SÔ)ˆq��ˆuÐ6¨s°Q©wÐ6r   )Útuple)Úordering_tuplerI   Úitems      r   Ú_reverse_orderingrM   s   s&   € ò
7ô ¨>Ö: 4‘&˜•,Ò:Ó;Ð;ùÒ:s   �#ÚCursor©ÚoffsetÚreverseÚpositionr<   r6   Tc                   ó<   — e Zd ZdZd
d„Zd„ Zd„ Zd„ Zd„ Zd„ Z	d	„ Z
y)ÚBasePaginationFNc                 ó   — t        d«      ‚)Nz(paginate_queryset() must be implemented.©ÚNotImplementedError©ÚselfÚquerysetÚrequestÚviews       r   Úpaginate_querysetz BasePagination.paginate_queryset‡   s   € Ü!Ð"LÓMÐMr   c                 ó   — t        d«      ‚)Nz-get_paginated_response() must be implemented.rV   ©rY   Údatas     r   Úget_paginated_responsez%BasePagination.get_paginated_responseŠ   s   € Ü!Ð"QÓRÐRr   c                 ó   — |S ©Nr!   ©rY   Úschemas     r   Úget_paginated_response_schemaz,BasePagination.get_paginated_response_schema�   s   € Øˆr   c                 ó   — t        d«      ‚)Nz7to_html() must be implemented to display page controls.rV   ©rY   s    r   Úto_htmlzBasePagination.to_html�   s   € Ü!Ð"[Ó\Ð\r   c                 ó   — |d   S )NÚresultsr!   r_   s     r   Úget_resultszBasePagination.get_results“   s   € Ø�I‰Ðr   c                 ó    — t         €J d«       ‚g S )Nú6coreapi must be installed to use `get_schema_fields()`)r   ©rY   r\   s     r   Úget_schema_fieldsz BasePagination.get_schema_fields–   s   € ÜÐ"Ð\Ð$\Ó\Ð"Øˆ	r   c                 ó   — g S rc   r!   ro   s     r   Úget_schema_operation_parametersz.BasePagination.get_schema_operation_parametersš   s   € Øˆ	r   rc   )Ú__name__Ú
__module__Ú__qualname__Údisplay_page_controlsr]   ra   rf   ri   rl   rp   rr   r!   r   r   rT   rT   „   s.   „ Ø!ÐóNòSòò]òòór   rT   c                   ó´   — e Zd ZdZej
                  ZeZdZ	 e
d«      ZdZ e
d«      ZdZdZdZ e
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y)ÚPageNumberPaginationzÒ
    A simple page number based style that supports page numbers as
    query parameters. For example:

    http://api.example.org/accounts/?page=4
    http://api.example.org/accounts/?page=4&page_size=100
    Úpagez.A page number within the paginated result set.Nú%Number of results to return per page.)Úlastú&rest_framework/pagination/numbers.htmlzInvalid page.c                 ó   — | j                  |«      }|sy| j                  ||«      }| j                  ||«      }	 |j                  |«      | _        |j                  dkD  r| j                  �d| _        || _        t        | j                  «      S # t        $ r6}| j
                  j                  |t        |«      ¬«      }t        |«      ‚d}~ww xY w)z“
        Paginate a queryset if required, either returning a
        page object, or `None` if pagination is not configured for this view.
        N)rA   Úmessager    T)Úget_page_sizeÚdjango_paginator_classÚget_page_numberry   r   Úinvalid_page_messageÚformatÚstrr   Ú	num_pagesÚtemplaterv   r[   r*   )	rY   rZ   r[   r\   Ú	page_sizeÚ	paginatorrA   ÚexcÚmsgs	            r   r]   z&PageNumberPagination.paginate_queryset¿   sË   € ð
 ×&Ñ& wÓ/ˆ	ÙØà×/Ñ/°¸)ÓDˆ	Ø×*Ñ*¨7°IÓ>ˆð	 Ø!Ÿ™ {Ó3ˆDŒIð ×Ñ Ò" t§}¡}Ð'@à)-ˆDÔ&àˆŒÜ�D—I‘I‹Ðøô ò 	 Ø×+Ñ+×2Ñ2Ø'´°S³ð 3ó ˆCô ˜3“-Ðûð		 ús   ºB Â	CÂ1CÃCc                 ó†   — |j                   j                  | j                  d«      }|| j                  v r|j                  }|S ©Nr    )Úquery_paramsÚgetÚpage_query_paramÚlast_page_stringsr…   )rY   r[   rˆ   rA   s       r   r�   z$PageNumberPagination.get_page_numberÚ   s?   € Ø×*Ñ*×.Ñ.¨t×/DÑ/DÀaÓHˆØ˜$×0Ñ0Ñ0Ø#×-Ñ-ˆKØÐr   c           	      ó¶   — t        t        d| j                  j                  j                  fd| j                  «       fd| j                  «       fd|fg«      «      S ©NÚcountÚnextÚpreviousrk   )r   r   ry   rˆ   r“   Úget_next_linkÚget_previous_linkr_   s     r   ra   z+PageNumberPagination.get_paginated_responseà   s]   € ÜœØ�d—i‘i×)Ñ)×/Ñ/Ð0Ø�T×'Ñ'Ó)Ð*Ø˜×/Ñ/Ó1Ð2Ø˜Ðð	%
ó ó ð 	r   c           	      ó˜   — ddddœddddj                  | j                  ¬	«      d
œddddj                  | j                  ¬	«      d
œ|dœdœS )NÚobjectÚintegeré{   ©ÚtypeÚexampleÚstringTÚuriz5http://api.example.org/accounts/?{page_query_param}=4)r�   ©r�   Únullablerƒ   rž   z5http://api.example.org/accounts/?{page_query_param}=2©r“   r”   r•   rk   ©r�   Ú
properties)rƒ   r�   rd   s     r   rf   z2PageNumberPagination.get_paginated_response_schemaè   s‚   € àð &Ø"ñð
 %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ó  @ñ	ð %Ø $Ø#ØV×]Ñ]Ø)-×)>Ñ)>ð  ^ó  @ñ	ð "ñ'ñ
ð 	
r   c                 óÒ   — | j                   r0	 t        |j                  | j                      d| j                  ¬«      S | j                  S # t        t
        f$ r Y | j                  S w xY w©NT)r   r   ©Úpage_size_query_paramr   r�   Úmax_page_sizeÚKeyErrorr   r‡   ©rY   r[   s     r   r   z"PageNumberPagination.get_page_size  ól   € Ø×%Ò%ðÜ$Ø×(Ñ(¨×)CÑ)CÑDØØ×-Ñ-ôð ð �~‰~Ðøô œjÐ)ò Øà�~‰~Ððúó   Ž.A	 Á	A&Á%A&c                 óÎ   — | j                   j                  «       sy | j                  j                  «       }| j                   j	                  «       }t        || j                  |«      S rc   )ry   Úhas_nextr[   Úbuild_absolute_uriÚnext_page_numberr   r�   ©rY   r7   rA   s      r   r–   z"PageNumberPagination.get_next_link  sN   € Ø�y‰y×!Ñ!Ô#ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×0Ñ0Ó2ˆÜ" 3¨×(=Ñ(=¸{ÓKÐKr   c                 ó  — | j                   j                  «       sy | j                  j                  «       }| j                   j	                  «       }|dk(  rt        || j                  «      S t        || j                  |«      S rŒ   )ry   Úhas_previousr[   r±   Úprevious_page_numberr   r�   r   r³   s      r   r—   z&PageNumberPagination.get_previous_link  si   € Ø�y‰y×%Ñ%Ô'ØØ�l‰l×-Ñ-Ó/ˆØ—i‘i×4Ñ4Ó6ˆØ˜!ÒÜ% c¨4×+@Ñ+@ÓAÐAÜ" 3¨×(=Ñ(=¸{ÓKÐKr   c                 ó(  ‡ ‡— ‰ j                   j                  «       Šˆˆ fd„}‰ j                  j                  }‰ j                  j                  j
                  }t        ||«      }t        |||«      }‰ j                  «       ‰ j                  «       |dœS )Nc                 óh   •— | dk(  rt        ‰‰j                  «      S t        ‰‰j                  | «      S rŒ   )r   r�   r   )rA   Úbase_urlrY   s    €€r   Úpage_number_to_urlzAPageNumberPagination.get_html_context.<locals>.page_number_to_url"  s3   ø€ Ø˜aÒÜ)¨(°D×4IÑ4IÓJÐJä*¨8°T×5JÑ5JÈKÓXÐXr   ©Úprevious_urlÚnext_urlr@   )
r[   r±   ry   r8   rˆ   r…   r4   rC   r—   r–   )rY   rº   r0   r1   r>   r@   r¹   s   `     @r   Úget_html_contextz%PageNumberPagination.get_html_context  sƒ   ù€ Ø—<‘<×2Ñ2Ó4ˆõ	Yð —)‘)×"Ñ"ˆØ—	‘	×#Ñ#×-Ñ-ˆÜ2°7¸EÓBˆÜ$ \°7Ð<NÓOˆ
ð !×2Ñ2Ó4Ø×*Ñ*Ó,Ø$ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rc   ©r
   Úget_templater†   r¾   Úrender©rY   r†   Úcontexts      r   ri   zPageNumberPagination.to_html3  ó3   € Ü×&Ñ& t§}¡}Ó5ˆØ×'Ñ'Ó)ˆØ�‰˜wÓ'Ð'r   c                 óž  — t         €J d«       ‚t        €J d«       ‚t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      g}| j                  �Z|j                  t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      «       |S )	Nrn   ú9coreschema must be installed to use `get_schema_fields()`FÚqueryÚPage©ÚtitleÚdescription©ÚnameÚrequiredÚlocationre   ú	Page size)
r   r   ÚFieldr�   ÚIntegerr   Úpage_query_descriptionr©   r=   Úpage_size_query_description©rY   r\   Úfieldss      r   rp   z&PageNumberPagination.get_schema_fields8  sÂ   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×*Ñ*ØØ Ü!×)Ñ)Ø Ü )¨$×*EÑ*EÓ Fôô	ð

ˆð ×%Ñ%Ð1Ø�M‰MÜ—‘Ø×3Ñ3Ø"Ø$Ü%×-Ñ-Ø)Ü$-¨d×.NÑ.NÓ$Oôô	ô
ð ˆr   c                 óÚ   — | j                   ddt        | j                  «      ddidœg}| j                  �6|j	                  | j                  ddt        | j
                  «      ddidœ«       |S ©NFrÈ   r�   rš   ©rÎ   rÏ   ÚinrÌ   re   )r�   r   rÔ   r©   r=   rÕ   ©rY   r\   Ú
parameterss      r   rr   z4PageNumberPagination.get_schema_operation_parametersT  s‡   € ð ×-Ñ-Ø!ØÜ(¨×)DÑ)DÓEà˜Iðñð

ˆ
ð ×%Ñ%Ð1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   rc   )rs   rt   ru   Ú__doc__r   Ú	PAGE_SIZEr‡   ÚDjangoPaginatorr€   r�   Ú_rÔ   r©   rÕ   rª   r�   r†   r‚   r]   r�   ra   rf   r   r–   r—   r¾   ri   rp   rr   r!   r   r   rx   rx   ž   s˜   „ ñð ×&Ñ&€Ià,Ðð ÐÙÐOÓPÐð !ÐÙ"#Ð$KÓ"LÐð €Mà!Ðà7€Há˜_Ó-Ðóò6òò
ò4òLòLò
ò((ò
ó8r   rx   c                   ó¢   — e Zd ZdZej
                  ZdZ ed«      Z	dZ
 e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y)ÚLimitOffsetPaginationzœ
    A limit/offset based style. For example:

    http://api.example.org/accounts/?limit=100
    http://api.example.org/accounts/?offset=400&limit=100
    Úlimitrz   rP   z3The initial index from which to return the results.Nr|   c                 ó¸  — | j                  |«      | _        | j                  €y | j                  |«      | _        | j	                  |«      | _        || _        | j                  | j                  kD  r| j                  �d| _        | j                  dk(  s| j
                  | j                  kD  rg S t        || j
                  | j
                  | j                  z    «      S )NTr   )
Ú	get_limiträ   Ú	get_countr“   Ú
get_offsetrP   r[   r†   rv   r*   rX   s       r   r]   z'LimitOffsetPagination.paginate_queryset~  s©   € Ø—^‘^ GÓ,ˆŒ
Ø�:‰:ÐØà—^‘^ HÓ-ˆŒ
Ø—o‘o gÓ.ˆŒØˆŒØ�:‰:˜Ÿ
™
Ò" t§}¡}Ð'@Ø)-ˆDÔ&à�:‰:˜Š?˜dŸk™k¨D¯J©JÒ6ØˆIÜ�H˜TŸ[™[¨¯©°t·z±zÑ)AÐBÓCÐCr   c           	      óŽ   — t        t        d| j                  fd| j                  «       fd| j	                  «       fd|fg«      «      S r’   )r   r   r“   r–   r—   r_   s     r   ra   z,LimitOffsetPagination.get_paginated_response�  sQ   € ÜœØ�d—j‘jÐ!Ø�T×'Ñ'Ó)Ð*Ø˜×/Ñ/Ó1Ð2Ø˜Ðð	%
ó ó ð 	r   c           
      óÄ   — ddddœddddj                  | j                  | j                  ¬	«      d
œddddj                  | j                  | j                  ¬	«      d
œ|dœdœS )Nr™   rš   r›   rœ   rŸ   Tr    zEhttp://api.example.org/accounts/?{offset_param}=400&{limit_param}=100)Úoffset_paramÚlimit_paramr¡   zEhttp://api.example.org/accounts/?{offset_param}=200&{limit_param}=100r£   r¤   )rƒ   Úoffset_query_paramÚlimit_query_paramrd   s     r   rf   z3LimitOffsetPagination.get_paginated_response_schema•  s’   € àð &Ø"ñð
 %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nó  bñ	ð %Ø $Ø#Øf×mÑmØ%)×%<Ñ%<È$×J`ÑJ`ð  nó  bñ	ð "ñ'ñ
ð 	
r   c                 óÒ   — | j                   r0	 t        |j                  | j                      d| j                  ¬«      S | j                  S # t        t
        f$ r Y | j                  S w xY wr§   )rî   r   r�   Ú	max_limitr«   r   Údefault_limitr¬   s     r   ræ   zLimitOffsetPagination.get_limit¯  sn   € Ø×!Ò!ðÜ$Ø×(Ñ(¨×)?Ñ)?Ñ@ØØŸ>™>ôð ð ×!Ñ!Ð!øô œjÐ)ò Øà×!Ñ!Ð!ðúr®   c                 ór   — 	 t        |j                  | j                     «      S # t        t        f$ r Y yw xY w©Nr   )r   r�   rí   r«   r   r¬   s     r   rè   z LimitOffsetPagination.get_offset¼  sA   € ð	Ü Ø×$Ñ$ T×%<Ñ%<Ñ=óð øô œ*Ð%ò 	Ùð	ús   ‚!$ ¤6µ6c                 ó&  — | j                   | j                  z   | j                  k\  ry | j                  j	                  «       }t        || j                  | j                  «      }| j                   | j                  z   }t        || j                  |«      S rc   )rP   rä   r“   r[   r±   r   rî   rí   ©rY   r7   rP   s      r   r–   z#LimitOffsetPagination.get_next_linkÄ  so   € Ø�;‰;˜Ÿ™Ñ# t§z¡zÒ1Øà�l‰l×-Ñ-Ó/ˆÜ! # t×'=Ñ'=¸t¿z¹zÓJˆà—‘˜tŸz™zÑ)ˆÜ" 3¨×(?Ñ(?ÀÓHÐHr   c                 ó\  — | j                   dk  ry | j                  j                  «       }t        || j                  | j
                  «      }| j                   | j
                  z
  dk  rt        || j                  «      S | j                   | j
                  z
  }t        || j                  |«      S ró   )rP   r[   r±   r   rî   rä   r   rí   rõ   s      r   r—   z'LimitOffsetPagination.get_previous_linkÎ  sŠ   € Ø�;‰;˜!ÒØà�l‰l×-Ñ-Ó/ˆÜ! # t×'=Ñ'=¸t¿z¹zÓJˆà�;‰;˜Ÿ™Ñ# qÒ(Ü% c¨4×+BÑ+BÓCÐCà—‘˜tŸz™zÑ)ˆÜ" 3¨×(?Ñ(?ÀÓHÐHr   c                 óê  ‡ ‡‡— ‰ j                   j                  «       Š‰ j                  r~t        ‰ j                  ‰ j                  «      dz   Št        ‰ j
                  ‰ j                  z
  ‰ j                  «      t        ‰ j                  ‰ j                  «      z   }t        |d«      }ndŠd}‰|kD  r|Šˆˆˆ fd„}t        ‰|«      }t        |‰|«      }‰ j                  «       ‰ j                  «       |dœS )Nr    c                 ó¦   •— | dk(  rt        ‰‰j                  «      S ‰j                  | ‰z
  ‰j                  z  z   }t	        ‰‰j                  |«      S rŒ   )r   rí   rP   rä   r   )rA   rP   r¹   r0   rY   s     €€€r   rº   zBLimitOffsetPagination.get_html_context.<locals>.page_number_to_urló  sO   ø€ Ø˜aÒÜ)¨(°D×4KÑ4KÓLÐLàŸ™¨°wÑ)>À$Ç*Á*Ñ(LÑM�Ü*¨8°T×5LÑ5LÈfÓUÐUr   r»   )r[   r±   rä   r$   rP   r“   Úmaxr4   rC   r—   r–   )rY   r1   rº   r>   r@   r¹   r0   s   `    @@r   r¾   z&LimitOffsetPagination.get_html_contextÛ  sÛ   ú€ Ø—<‘<×2Ñ2Ó4ˆà�:Š:Ü'¨¯©°T·Z±ZÓ@À1ÑDˆGô " $§*¡*¨t¯{©{Ñ":¸D¿J¹JÓGÜ! $§+¡+¨t¯z©zÓ:ñ;ð ô
 ˜˜q“M‰EàˆGØˆEà�UŠ?ØˆGö	Vô 3°7¸EÓBˆÜ$ \°7Ð<NÓOˆ
ð !×2Ñ2Ó4Ø×*Ñ*Ó,Ø$ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rc   rÀ   rÃ   s      r   ri   zLimitOffsetPagination.to_html  rÅ   r   c                 ód   — 	 |j                  «       S # t        t        f$ r t        |«      cY S w xY w)zZ
        Determine an object count, supporting either querysets or regular lists.
        )r“   ÚAttributeErrorÚ	TypeErrorr/   )rY   rZ   s     r   rç   zLimitOffsetPagination.get_count  s2   € ð	!Ø—>‘>Ó#Ð#øÜ¤	Ð*ò 	!Ü�x“=Ò ð	!ús   ‚ ’/®/c                 ób  — t         €J d«       ‚t        €J d«       ‚t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      gS )	Nrn   rÇ   FrÈ   ÚLimitrÊ   rÍ   ÚOffset)	r   r   rÒ   rî   rÓ   r   Úlimit_query_descriptionrí   Úoffset_query_descriptionro   s     r   rp   z'LimitOffsetPagination.get_schema_fields  s¦   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×+Ñ+ØØ Ü!×)Ñ)Ø!Ü )¨$×*FÑ*FÓ Gôô	ô �M‰MØ×,Ñ,ØØ Ü!×)Ñ)Ø"Ü )¨$×*GÑ*GÓ Hôô	ð
ð 	
r   c                 ó¢   — | j                   ddt        | j                  «      ddidœ| j                  ddt        | j                  «      ddidœg}|S rÙ   )rî   r   r  rí   r  rÜ   s      r   rr   z5LimitOffsetPagination.get_schema_operation_parameters)  sm   € ð ×.Ñ.Ø!ØÜ(¨×)EÑ)EÓFà˜Iðñð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Iðñð
ˆ
ð( Ðr   rc   )rs   rt   ru   rÞ   r   rß   rñ   rî   rá   r  rí   r  rð   r†   r]   ra   rf   ræ   rè   r–   r—   r¾   ri   rç   rp   rr   r!   r   r   rã   rã   o  s‚   „ ñð !×*Ñ*€MØÐÙÐ GÓHÐØ!ÐÙ Ð!VÓWÐØ€IØ7€HóDòò
ò4"òòIòIò&
òP(ò
!ò
ó0r   rã   c                   óÆ   — e Zd ZdZdZ ed«      Zej                  Z	 ed«      Z
dZdZdZ e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y)ÚCursorPaginationzÐ
    The cursor pagination implementation is necessarily complex.
    For an overview of the position/offset style we use, see this post:
    https://cra.mr/2011/03/08/building-cursors-for-the-disqus-api
    ÚcursorzThe pagination cursor value.zInvalid cursorz-createdz0rest_framework/pagination/previous_and_next.htmlNrz   iè  c                 ó  — | j                  |«      | _        | j                  sy |j                  «       | _        | j	                  |||«      | _        | j                  |«      | _        | j                  €d\  }}}n| j                  \  }}}|r# |j                  t        | j
                  «      Ž }n |j                  | j
                  Ž }|�k| j
                  d   }|j                  d«      }|j                  d«      }	| j                  j                  |k7  r|	dz   |i}
n|	dz   |i}
 |j                  d
i |
¤Ž}t        |||| j                  z   dz    «      }t        |d | j                   «      | _        t!        |«      t!        | j                  «      kD  r"d}| j#                  |d   | j
                  «      }nd	}d }|rat        t%        | j                  «      «      | _        |d uxs |dkD  | _        || _        | j&                  r|| _        | j(                  rE|| _        n=|| _        |d uxs |dkD  | _        | j&                  r|| _        | j(                  r|| _        | j(                  s| j&                  r| j.                  �d| _        | j                  S )N)r   FNr   rF   Ú__ltÚ__gtr    TéÿÿÿÿFr!   )r   r‡   r±   r¹   Úget_orderingÚorderingÚdecode_cursorr  Úorder_byrM   rG   ÚlstriprQ   Úfilterr*   ry   r/   Ú_get_position_from_instanceÚreversedr°   rµ   Únext_positionÚprevious_positionr†   rv   )rY   rZ   r[   r\   rP   rQ   Úcurrent_positionÚorderÚis_reversedÚ
order_attrÚkwargsrk   Úhas_following_positionÚfollowing_positions                 r   r]   z"CursorPagination.paginate_queryset]  so  € Ø×+Ñ+¨GÓ4ˆŒØ�~Š~Øà×2Ñ2Ó4ˆŒØ×)Ñ)¨'°8¸TÓBˆŒà×(Ñ(¨Ó1ˆŒØ�;‰;ÐØ2BÑ/ˆV�WÑ.à26·+±+Ñ/ˆV�WÐ.ñ Ø(�x×(Ñ(Ô*;¸D¿M¹MÓ*JÐK‰Hà(�x×(Ñ(¨$¯-©-Ð8ˆHð Ð'Ø—M‘M !Ñ$ˆEØ×*Ñ*¨3Ó/ˆKØŸ™ cÓ*ˆJð �{‰{×"Ñ" kÒ1Ø$ vÑ-Ð/?Ð@‘à$ vÑ-Ð/?Ð@�à&�x—‘Ñ0¨Ñ0ˆHô
 �x  v°·±Ñ'>ÀÑ'BÐCÓDˆÜ˜  $§.¡.Ð1Ó2ˆŒ	ô ˆw‹<œ#˜dŸi™i›.Ò(Ø%)Ð"Ø!%×!AÑ!AÀ'È"Á+ÈtÏ}É}Ó!]Ñà%*Ð"Ø!%Ðáô œX d§i¡iÓ0Ó1ˆDŒIð .°TÐ9ÒJ¸vÈ¹zˆDŒMØ 6ˆDÔØ�}Š}Ø%5�Ô"Ø× Ò Ø);�Õ&ð 3ˆDŒMØ!1¸Ð!=Ò NÀ6ÈAÁ:ˆDÔØ�}Š}Ø%7�Ô"Ø× Ò Ø)9�Ô&ð ×Ò §¢°D·M±MÐ4MØ)-ˆDÔ&à�y‰yÐr   c                 óÒ   — | j                   r0	 t        |j                  | j                      d| j                  ¬«      S | j                  S # t        t
        f$ r Y | j                  S w xY wr§   r¨   r¬   s     r   r   zCursorPagination.get_page_size©  r­   r®   c                 ó  — | j                   sy | j                  re| j                  rY| j                  j                  rC| j                  j                  dk7  r*| j                  | j                  d   | j                  «      }n| j                  }d}d}t        | j                  «      D ].  }| j                  || j                  «      }||k7  rd} n	|}|dz  }Œ0 | j                  rq|so| j                  s| j                  }d }nT| j                  j                  rd}| j                  }n/| j                  j                  | j                  z   }| j                  }| j                  s| j                  }t        |d¬«      }| j                  |«      S )Nr   r
  FTr    rO   )r°   ry   r  rQ   rP   r  r  r  r  rµ   r‡   r  rN   Úencode_cursor©rY   ÚcomparerP   Úhas_item_with_unique_positionrL   rR   r  s          r   r–   zCursorPagination.get_next_link¶  sX  € Ø�}Š}Øà�9Š9˜Ÿš¨¯©×)<Ò)<ÀÇÁ×ASÑASÐWXÒAXð ×6Ñ6°t·y±yÀ±}ÀdÇmÁmÓT‰Gà×(Ñ(ˆGØˆà(-Ð%Ü˜TŸY™YÓ'ò 	ˆDØ×7Ñ7¸¸d¿m¹mÓLˆHØ˜7Ò"ð 15Ð-Ùð
 ˆGØ�a‰K‰Fð	ð �9Š9Ñ:à×$Ò$ð Ÿ™�Ø‘Ø—‘×$Ò$ð �Ø×1Ñ1‘ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×1Ñ1�à�yŠyØ×)Ñ)ˆHä˜v¨u¸xÔHˆØ×!Ñ! &Ó)Ð)r   c                 ó   — | j                   sy | j                  re| j                  rY| j                  j                  sC| j                  j                  dk7  r*| j                  | j                  d   | j                  «      }n| j                  }d}d}| j                  D ].  }| j                  || j                  «      }||k7  rd} n	|}|dz  }Œ0 | j                  rq|so| j                  s| j                  }d }nT| j                  j                  r0| j                  j                  | j                  z   }| j                  }nd}| j                  }| j                  s| j                  }t        |d¬«      }| j                  |«      S )Nr   FTr    rO   )rµ   ry   r  rQ   rP   r  r  r  r°   r‡   r  rN   r  r  s          r   r—   z"CursorPagination.get_previous_linkë  sS  € Ø× Ò Øà�9Š9˜Ÿš¨T¯[©[×-@Ò-@ÀTÇ[Á[×EWÑEWÐ[\ÒE\ð ×6Ñ6°t·y±yÀ±|ÀTÇ]Á]ÓS‰Gà×,Ñ,ˆGØˆà(-Ð%Ø—I‘Iò 	ˆDØ×7Ñ7¸¸d¿m¹mÓLˆHØ˜7Ò"ð 15Ð-Ùð
 ˆGØ�a‰K‰Fð	ð �9Š9Ñ:à—=’=ð Ÿ™�Ø‘Ø—‘×$Ò$ð Ÿ™×+Ñ+¨d¯n©nÑ<�Ø×-Ñ-‘ð �Ø×-Ñ-�à�yŠyØ×-Ñ-ˆHä˜v¨t¸hÔGˆØ×!Ñ! &Ó)Ð)r   c                 óæ  — t        |dg «      D �cg c]  }t        |d«      r|‘Œ }}|rB|d   } |«       }|j                  |||«      }|€AJ dj                  |j                  ¬«      «       ‚| j
                  }|€J d«       ‚d|vsJ d«       ‚t        |t        t        t        f«      s*J d	j                  t        |«      j                  ¬
«      «       ‚t        |t        «      r|fS t        |«      S c c}w )zV
        Return a tuple of strings, that may be used in an `order_by` method.
        Úfilter_backendsr  r   zRUsing cursor pagination, but filter class {filter_cls} returned a `None` ordering.)Ú
filter_clszXUsing cursor pagination, but no ordering attribute was declared on the pagination class.Ú__z¶Cursor pagination does not support double underscore lookups for orderings. Orderings should be an unchanging, unique or nearly-unique field on the model, such as "-created" or "pk".z:Invalid ordering. Expected string or tuple, but got {type})r�   )ÚgetattrÚhasattrr  rƒ   rs   r  Ú
isinstancer„   r*   rJ   r�   )rY   r[   rZ   r\   r%  Úordering_filtersÚfilter_instancer  s           r   r  zCursorPagination.get_ordering   s7  € ô
 *1°Ð7HÈ"Ó)Mö
Ø%Ü�z >Ô2ò ð
Ðð 
ñ
 ð *¨!Ñ,ˆJÙ(›lˆOØ&×3Ñ3°G¸XÀtÓLˆHØÐ'ð ð.ß.4©fØ)×2Ñ2ð /5ó /óÐ'ð —}‘}ˆHØÐ'ð ð+óÐ'ð ˜xÑ'ð ðPóÐ'ô ˜(¤S¬$´Ð$6Ô7ð 	
ØH×OÑOÜ˜(“^×,Ñ,ð Pó ó	
Ð7ô �h¤Ô$Ø�;ÐÜ�X‹ÐùòO
s   �C.c                 ó  — |j                   j                  | j                  «      }|€y	 t        |j	                  d«      «      j                  d«      }t        j                  |d¬«      }|j                  ddg«      d   }t        || j                  ¬«      }|j                  d	dg«      d   }t        t        |«      «      }|j                  d
dg«      d   }t!        |||¬«      S # t        t        f$ r t        | j                  «      ‚w xY w)zL
        Given a request with a cursor, return a `Cursor` instance.
        NÚasciiT)Úkeep_blank_valuesÚoÚ0r   )r   ÚrÚprO   )r�   rŽ   Úcursor_query_paramr   ÚencodeÚdecoder   Úparse_qsr   Úoffset_cutoffÚboolr   rý   r   r   Úinvalid_cursor_messagerN   )rY   r[   ÚencodedÚquerystringÚtokensrP   rQ   rR   s           r   r  zCursorPagination.decode_cursorM  sø   € ð
 ×&Ñ&×*Ñ*¨4×+BÑ+BÓCˆØˆ?Øð	8Ü# G§N¡N°7Ó$;Ó<×CÑCÀGÓLˆKÜ—^‘^ KÀ4ÔHˆFà—Z‘Z  c UÓ+¨AÑ.ˆFÜ" 6°$×2DÑ2DÔEˆFà—j‘j  s eÓ,¨QÑ/ˆGÜœ3˜w›<Ó(ˆGà—z‘z #¨ vÓ.¨qÑ1ˆHô ˜V¨W¸xÔHÐHøô œ:Ð&ò 	8Ü˜4×6Ñ6Ó7Ð7ð	8ús   ªB-C% Ã%%D
c                 ón  — i }|j                   dk7  rt        |j                   «      |d<   |j                  rd|d<   |j                  �|j                  |d<   t	        j
                  |d¬«      }t        |j                  d«      «      j                  d«      }t        | j                  | j                  |«      S )	zM
        Given a Cursor instance, return an url with encoded cursor.
        r   r/  Ú1r1  r2  T)Údoseqr-  )rP   r„   rQ   rR   r   Ú	urlencoder   r4  r5  r   r¹   r3  )rY   r  r<  r;  r:  s        r   r  zCursorPagination.encode_cursorf  s—   € ð ˆØ�=‰=˜AÒÜ˜fŸm™mÓ,ˆF�3‰KØ�>Š>ØˆF�3‰KØ�?‰?Ð&Ø Ÿ/™/ˆF�3‰Kä—o‘o f°DÔ9ˆÜ˜K×.Ñ.¨wÓ7Ó8×?Ñ?ÀÓHˆÜ" 4§=¡=°$×2IÑ2IÈ7ÓSÐSr   c                 ó˜   — |d   j                  d«      }t        |t        «      r||   }t	        |«      S t        ||«      }t	        |«      S )Nr   rF   )r  r)  Údictr'  r„   )rY   Úinstancer  Ú
field_nameÚattrs        r   r  z,CursorPagination._get_position_from_instancev  sN   € Ø˜a‘[×'Ñ'¨Ó,ˆ
Ü�h¤Ô%Ø˜JÑ'ˆDô �4‹yÐô ˜8 ZÓ0ˆDÜ�4‹yÐr   c                 ót   — t        t        d| j                  «       fd| j                  «       fd|fg«      «      S )Nr”   r•   rk   )r   r   r–   r—   r_   s     r   ra   z'CursorPagination.get_paginated_response~  sE   € ÜœØ�T×'Ñ'Ó)Ð*Ø˜×/Ñ/Ó1Ð2Ø˜Ðð%
ó ó ð 	r   c                 ó    — ddddœdddœ|dœdœS )Nr™   rŸ   T)r�   r¢   )r”   r•   rk   r¤   r!   rd   s     r   rf   z.CursorPagination.get_paginated_response_schema…  s3   € àð %Ø $ñð
 %Ø $ñð "ñ
ñ
ð 	
r   c                 óD   — | j                  «       | j                  «       dœS )N)r¼   r½   )r—   r–   rh   s    r   r¾   z!CursorPagination.get_html_context•  s$   € à ×2Ñ2Ó4Ø×*Ñ*Ó,ñ
ð 	
r   c                 ó‚   — t        j                  | j                  «      }| j                  «       }|j	                  |«      S rc   rÀ   rÃ   s      r   ri   zCursorPagination.to_html›  rÅ   r   c                 óž  — t         €J d«       ‚t        €J d«       ‚t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      g}| j                  �Z|j                  t        j                  | j                  ddt        j                  dt        | j                  «      ¬«      ¬«      «       |S )	Nrn   rÇ   FrÈ   rN   rÊ   rÍ   rÑ   )r   r   rÒ   r3  ÚStringr   Úcursor_query_descriptionr©   r=   rÓ   rÕ   rÖ   s      r   rp   z"CursorPagination.get_schema_fields   sÂ   € ÜÐ"Ð\Ð$\Ó\Ð"ÜÐ%ÐbÐ'bÓbÐ%ä�M‰MØ×,Ñ,ØØ Ü!×(Ñ(Ø"Ü )¨$×*GÑ*GÓ Hôô	ð

ˆð ×%Ñ%Ð1Ø�M‰MÜ—‘Ø×3Ñ3Ø"Ø$Ü%×-Ñ-Ø)Ü$-¨d×.NÑ.NÓ$Oôô	ô
ð ˆr   c                 óÚ   — | j                   ddt        | j                  «      ddidœg}| j                  �6|j	                  | j                  ddt        | j
                  «      ddidœ«       |S )NFrÈ   r�   rŸ   rÚ   rš   )r3  r   rL  r©   r=   rÕ   rÜ   s      r   rr   z0CursorPagination.get_schema_operation_parameters¼  s‡   € ð ×/Ñ/Ø!ØÜ(¨×)FÑ)FÓGà˜Hðñð

ˆ
ð ×%Ñ%Ð1Ø×Ñà ×6Ñ6Ø %Ø!Ü#,¨T×-MÑ-MÓ#Nà 	ðñô
ð Ðr   rc   )rs   rt   ru   rÞ   r3  rá   rL  r   rß   r‡   r9  r  r†   r©   rÕ   rª   r7  r]   r   r–   r—   r  r  r  r  ra   rf   r¾   ri   rp   rr   r!   r   r   r  r  A  s«   „ ñð
 "ÐÙ Ð!?Ó@ÐØ×&Ñ&€IÙÐ/Ó0ÐØ€HØA€Hð !ÐÙ"#Ð$KÓ"LÐð €Mð €MóJòXò3*òj3*òj+òZIò2Tò òò
ò 
ò(ò
ó8r   r  )FN),rÞ   Úbase64r   r   Úcollectionsr   r   Úurllibr   Údjango.core.paginatorr   r	   rà   Údjango.templater
   Údjango.utils.encodingr   Údjango.utils.translationr   rá   Úrest_framework.compatr   r   Úrest_framework.exceptionsr   Úrest_framework.responser   Úrest_framework.settingsr   Úrest_framework.utils.urlsr   r   r   r$   r4   rC   rM   rN   r<   r;   rT   rx   rã   r  r!   r   r   ú<module>rZ     s¯   ðñ÷ (ß /Ý å -Ý >Ý "Ý +Ý 6ç 5Ý .Ý ,Ý 0ß Mó	òò0òfò(<ñ 
�HÒ?Ó	@€Ù�jÒ"LÓM€á˜$ t°uÀtÔL€
÷ñ ô4N˜>ô NôbO˜Nô OôdS�~õ Sr   