
    ĞiS{                         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mZmZmZmZmZmZmZmZmZmZmZmZmZ dd	lmZmZmZmZ  G d
 de          Z G d de          Z G d de          Z dS )    N   )InfoExtractor)VidsIoIE)VimeoIE   )	HTTPError)KNOWN_EXTENSIONSExtractorError
clean_htmldetermine_extextract_attributesfloat_or_noneint_or_nonemimetype2extparse_iso8601smuggle_urlstr_or_noneupdate_url_queryurl_or_noneurljoin)find_elementsrequiretraverse_objvaluec                   6    e Zd Zej        d             ZddZdS )PatreonBaseIEc                 Z    |                      d                              d          rdS dS )Nhttps://www.patreon.com/
session_idz1Patreon/72.2.28 (Android; Android 14; Scale/2.10)z0Patreon/7.6.28 (Android; Android 11; Scale/2.10))_get_cookiesget)selfs    ]C:\Users\betacode\Desktop\descargarYoutube\venv\Lib\site-packages\yt_dlp/extractor/patreon.pypatreon_user_agentz PatreonBaseIE.patreon_user_agent!   s6     788<<\JJ 	GFFAA    NTc                 "   |i }d|vr
| j         |d<   |r|                    ddi           	 |                     d| ||r|nd|||          S # t          $ r}t	          |j        t                    r5t          |j        j        j	        
                    d                    dk    r |                     |                     |j        j        d |          |d	
          }t          |dd	          }	|	rt          d|	 d           d }~ww xY w)N
User-Agentjson-api-version      ?zhttps://www.patreon.com/api/zDownloading API JSON)notequeryfatalheaderszContent-TypejsonFr,   )errors.detailget_allzPatreon said: T)expected)r$   update_download_jsonr
   
isinstancecauser   r   responser-   r!   _parse_json_webpage_read_contentr   )
r"   epitem_idr+   r-   r,   r*   eerr_jsonerr_messages
             r#   	_call_apizPatreonBaseIE._call_api)   s\   ?Gw&&$($;GL! 	4LL,c2333	&&3r33dFdd0F5' ' ; ; ;  	 	 	agy11 \!'BRBZB^B^_mBnBn5o5osy5y5y''(B(B17CSUY[b(c(celty'zzH&x1JTYZZZK T$%Ck%C%CdSSSS	s   !A 
DB0D		D)NNTN)__name__
__module____qualname__	functoolscached_propertyr$   rA    r%   r#   r   r       sH        B B B     r%   r   c                   v   e Zd ZdZdZddi ddddd	d
dddddddddddddddededdddddd ed!d"d#d$dd%ddeedd&d'd(d)i dd*dd+dd,dd-dddd.dd/dd0d1d2gd3d4d5ed6d7d8d9d:d-dd;d<d=ded>d?ed@dAed@dBdCdDdE
d@d@dFdGdHd@dIdJd@dIdKdLdMd+dNdOddPdQdRdSd'd(dTi ddUdd+deddVdeddWddXddddYddZdd[dd\d6d]dDgdd^ddYd ed_d`i ddadd+ddbddcdddddeddfddgdeddhddd ededdid6g djddcd'dkdli ddmdd+ddndeddoddpddqddd6drgddsded eddtdduddvddqd_dwdxd+dydzd{d|d}d~d}dddeeddddidgdddddddddddeddeeddd'dddd+ddededddddeddddd@idGddd+dddddddeeeddddd_gZdDZddiZd Z	d Z
d ZdS )	PatreonIEpatreonzPhttps?://(?:www\.)?patreon\.com/(?:creation\?hid=|posts/(?:[\w-]+-)?)(?P<id>\d+)z*http://www.patreon.com/creation?hid=743933 e25505eec1053a6e6813b8ed369875ccid743933extmp3	alt_titlez	cd166.mp3titlez*Episode 166: David Smalley of Dogma Debatedescriptionz$md5:34d207dd29aa90e24f1b3f58841b81c7uploaderCognitive Dissonance Podcast	thumbnailre:^https?://.*$	timestampiSupload_date20140727uploader_id87145
like_countcomment_countuploader_url%https://www.patreon.com/dissonancepod
channel_id80642channel_urlchannel_follower_count)urlmd5	info_dictz*http://www.patreon.com/creation?hid=754133 3eb09345bf44bf60451b8b0b81759d0a754133zCD 167 Extra)rL   rN   rQ   rS   rU   r\   r]   r^   zPatron-only content)rd   re   rf   skipz,https://www.patreon.com/creation?hid=1682498SU4fj_aEMVwmp4zI'm on Patreon!TraciJHines20150211z$md5:8af6425f50bd46fbf29f3db0fc3a8364z@TraciHinesMusic
categoriesEntertainmentdurationi  
view_counttagszcount:39	age_limitr   channelz8https://www.youtube.com/channel/UCGLim4T2loE5rwCMdpCIPVglive_statusnot_liveUCGLim4T2loE5rwCMdpCIPVgpublicTz(https://www.youtube.com/@TraciHinesMusiczcount:4iTvideo)
r`   availabilityrc   playable_in_embedr^   r]   channel_is_verifiedchaptersrW   
media_type)
noplaylistskip_download)rd   rf   paramsz3https://www.patreon.com/posts/episode-166-of-743933rd   only_matchingz$https://www.patreon.com/posts/743933z6https://www.patreon.com/posts/kitchen-as-seen-51706779 96656690071f6d64895866008484251b	555089736z&KITCHEN AS SEEN ON DEEZ NUTS EXTENDED!z	Cold Ones20210526z$md5:557a409bd79d3898689419094934ba7914936315)rL   rN   rQ   rS   rU   rX   rR   rZ   z7https://www.patreon.com/posts/video-sketchbook-32452882324528824301314i|]20191218zhttps://www.patreon.com/loishz$md5:e2693e97ee299c8ece47ffdb67e7d9d2zVIDEO // sketchbook flipthroughLoish
sketchbook1641751)rd   rf   z5https://www.patreon.com/posts/premium-access-7028293170282931zD[Premium Access + Uncut] The Office - 2x6 The Fight - Group Reactionz"https://www.patreon.com/thenormies5733972929435zThe Normiesz$md5:79c9fd8778e2cef84049a94c058a5e2320220809iTeb)z
The Officezearly accessuncut)rd   rf   ri   z6https://www.patreon.com/posts/hunter-x-hunter-3400791334007913z-Hunter x Hunter | Kurapika DESTROYS Uvogin!!!
YaBoyRoshiiE^z"https://www.patreon.com/yaboyroshizHunter x Hunter14264111z!Kurapika is a walking cheat code!202002132147162z6https://www.patreon.com/posts/4k-spiderman-4k-96414599	902250943uY   ❤️(4K) Spiderman Girl Yeonhwa’s Gift ❤️(4K) 스파이더맨걸 연화의 선물uZ   ❤️(4K) Spiderman Girl Yeonhwa’s Gift 
❤️(4K) 스파이더맨걸 연화의 선물Npickyeonhwa90574422z"https://www.patreon.com/Yeonhwa72610237902F   iɆe20240113zre:^https?://.+)rL   rN   rQ   rR   rS   rZ   r^   r`   rb   rp   rW   rX   r]   r\   rU   r   m3u8z$Failed to parse XML: not well-formed)rd   rf   r   expected_warningsz7https://www.patreon.com/posts/holy-wars-solos-100601977   	100601977z<"Holy Wars" (Megadeth) Solos Transcription & Lesson/Analysisz$md5:d099ab976edfce6de2a65c2b169a88d3zBradley Hall24401883z)https://www.patreon.com/bradleyhallguitar3193932iee20240318)rL   rQ   rR   rS   rZ   r^   r`   rb   rc   rW   rX   r\   r]   rU   )rd   playlist_countrf   ri   z'https://www.patreon.com/posts/114721679	11472167920241025JapanalysiszKarasawa Part 2z@Part 2 of this video https://www.youtube.com/watch?v=Azms2-VTASkz#https://www.patreon.com/japanalysis80504268i7"g9346307)rL   rN   rX   rS   r\   rU   r]   rQ   rR   r^   rZ   rb   rc   rW   r`   getcommentsz2https://www.patreon.com/posts/scottfalco-146966245	146966245zscottfalco 1080z$md5:a3f29bbd0a46b4821ec3400957c98aa2
Insanimate2828146z"https://www.patreon.com/Insanimate6260877gԵ>UU@i(9Si20251230)rL   rN   rQ   rR   rS   rZ   r^   r`   rb   rc   r]   r\   rp   rW   rX   refererr   c                 &   t          |                     d| |d          ddt          hf          }|sd S t          |dd hfdt          hfd	d
t          hfd          }||d<   t          |d	ddt
          ht          f          }t          |dt
          hf          }|rt          |                    d                    dk    r| 	                    ||dd| j
                  \  |d<   |d<   |d         D ]}| j
        |d<   t          |d	dt
          hf          x}r2|d                             dg                               |dd           n*|s|r&|p||                    d          dk    rdnd dg|d<   |                    d          sd S |S )Nzmedia/Fr/   data
attributes	file_namec                 8    |                      d          d         S )N.r   )
rpartition)xs    r#   <lambda>z3PatreonIE._extract_from_media_api.<locals>.<lambda>A  s    all3.?.?.B r%   
created_atdisplayrp   )rQ   rW   rp   rL   )Nviewer_playback_datard   download_urlmimetyper   rk   )r,   r-   formats	subtitleshttp_headerstranscript_urlenvtt)rd   rN   r~   ry   none)rd   vcodec)r   rA   dictr   r   r   anyr   r!   #_extract_m3u8_formats_and_subtitles_HTTP_HEADERS
setdefaultappend)r"   media_idr   rf   playback_urlr   fr   s           r#   _extract_from_media_apiz!PatreonIE._extract_from_media_api9  s'   !NN.H..NFF\D6*, ,
  	4 !$B$B#CD&8"J@.
 .
  	
 #	$#$BEK=Z]^` `#J+0OPP 	L
)C)CDDNN;?;c;chUDDV <d <X <X8Ii )K"8y) 7 7$($6.!!!-j9FVYdXe:f!g!gg~ +&11$;;BB) D D     	\ 	 $3|$.NN<$@$@G$K$K&&QU% % $Ii  }}Y'' 	4r%   c                 ~   |                      |          }|                     d| |dddddddd	
          }|d         d         }t          |dt          j        hfdt
          hfddt          ht          fdt          hfdt          hfdt          hfd          }t                      }g }d}t          |dd f          D ]}	|	d         }
|
dk    rt          |	dt          hf          pi }t          |                    d                    }t          |                    d                    }t          |                    d                    }|rF|t          v r=|;|dz  }|                    | d| |||t          |dt          hf          d            t          |	d!t          hf          x}r|                    |           
|
d"k    rC|                    t          |	dd#t          hfd!t$          hfdd$t          hfd%                     S|
d&k    rFt          |	ddt          hf          x}r)|                    d'g                               |           |
d(k    rK|                    t          |	ddt          hfd!t$          hfdd$t          hfdd)t          hfd*                     t          |d+d$t          hf          x}r|                     d,|d-d.d/0          \  }}|rt+          d1| d2|pg i          }t-          j        |          r<|                     t-          j        || j        d3                   t,          d45          }n(|                     t7          || j                            }|                     ||d6| j        d7d7d89          x}r4t;          j        |          s|j        d:k    r|                    |           t          |d;t          hf          }|r|                    d<          }t?          |          }|t          v r |                    |||d$         d=           nz|d>k    s&t?          |                    d$                    d?k    rN|                      |d$         || j        @          \  }}|D ]}| j        |dA<   |                    |||dB           t          |dCtB          ht$          hf          x}r|                    |           t          |dtE          dDdEd4d4F          hdGtF          hdDf          D ]H}||v r| $                    |          x}r*|                    |           |                    |           It          |dH          }d }|r*|                    d          r| %                    |          }|s|d7u r| &                    dI|d4J           nw|s| &                    dK|d4J           n\tO          |          dk    r|                    |d                    n-|D ]}|                    |            | j(        ||fi |dL|iS ||d!<   ||dL<   |S )MNposts/z*download_url,mimetype,size_bytes,file_namez_comment_count,content,embed,image,like_count,post_file,published_at,title,current_user_can_viewfull_name,urlr   zurl,name,patron_countfalsez7audio,user,user_defined_tags,campaign,attachments_media)zfields[media]fields[post]fields[user]zfields[post_tag]fields[campaign]json-api-use-default-includesinclude)r+   r   r   rQ   contentimage)	large_urlrd   published_atr\   r]   )rQ   rR   rU   rW   r\   r]   r   includedc                     |d         S )NtyperG   _vs     r#   r   z)PatreonIE._real_extract.<locals>.<lambda>z  s
    AfI r%   r   mediar   r   
size_bytesr   -r   )rL   rN   filesizerd   rP   rL   user	full_namerd   )rS   rZ   r^   post_tagrr   campaignpatron_count)rt   r`   rb   rc   embedz"//vimeo\.com/(\d+)(?:/([\da-f]+))?zvimeo id)r   r   )NN)groupdefaultzhttps://player.vimeo.com/video/hr   T)url_transparentzChecking embed URLF)  i  )r-   r,   errnoteexpected_statusr   	post_filename)rL   rN   rd   ry   r   r-   r   )rL   r   r   r   zdata-media-idz\d+)attrr   regexhtml.current_user_can_viewz#You do not have access to this post)video_idr4   z%No supported media found in this post__post_extractor))	_match_idrA   r   strstripr   r   r   r   r   setr   r!   r   r	   r   addr5   r   r   _search_regexr   r   suitable
url_result_smuggle_referrerr   r   _request_webpager   statusr   r   intr   r   r   extract_commentsraise_no_formatslenplaylist_result)r"   rd   r   postr   infoseen_media_idsentriesidxr   include_typemedia_attributesr   rN   r   r   r   	embed_urlvimeo_id
vimeo_hashentryurlhr   r   r   r   r   r   can_view_postcommentss                                 r#   _real_extractzPatreonIE._real_extracta  s   >>#&&~~X!M !B /$+$;18T2 2  	 	 &\,/
J	{+%
|4!#7+L(=/:'+7-}=)
 )
   #D:7M7M*NOO '	 '	G"6?Lw&&#/,9O#P#P#VTV *+;+?+?+O+OPP"#3#7#7
#C#CDD ))9)=)=l)K)KLL
 C+;$;$;
@V1HCNN!)11C11"$.+%12B[SVRWDX%Y%Y$ $     ,GdSE]CCC8 1"&&x000''L!-{SE B$(;-#8%15;-$H3 3       +++GlGcU5STTT8 AOOFB//66x@@@++L ,gu=#'+"7$0%+#G/;^k].[	3 3      %Z'5;-1PQQQ9 	*#'#5#55y&, $6 $@ $@ Hj  -,@h@@**+- -	 	** T-i9KI9VWWT ( 3 3 It?Q(R(RSS,,8%94CUUJ -   t *
 $Y// *4;#3E3ENN5))) kD6-BCC	 	-==((D%%C&&&"$U+       
 M)--2F2F$G$G6$Q$Q%)%M%Me$h8J &N &L &L"  ; ;A(,(:An%%"&!*      
 (	J}3UVVVx -""8,,,$Z?&PT[_```a$%2
   		- 		-H
 >))44X>>>u -u%%%""8,,,$Z1HII 	7TXXo66 	7,,X66H 		^=E11!!"GRZei!jjjj 	^!!"IT\gk!llll\\QKK
####  # #T""""'4']]T]]T\]]]]T
#+ r%   c              #     K   d }d}dddddddd	d
}t          j        d          D ]"}|                    |rd|ini            |                     d| d||d|           }d }t	          |dd f          D ]}|dz  }t	          |d          i t	          |dt
          hfddt          hfddt          hfddddt          d          hft          ht          fddt          hfd          t	          |dfddd t          hfd!t          hfd"fd#$          d%iV  |t	          |d&          k     rt	          |d'          }| d S $d S )(Nr   2   a`  parent.commenter.campaign,parent.post.user,parent.post.campaign.creator,parent.replies.parent,parent.replies.commenter.campaign,parent.replies.post.user,parent.replies.post.campaign.creator,commenter.campaign,post.user,post.campaign.creator,replies.parent,replies.commenter.campaign,replies.post.user,replies.post.campaign.creator,on_behalf_of_campaignzbody,created,is_by_creatorzimage_url,full_name,urlzimage_tiny_url,namez-createdr)   r   )zpage[count]r   zfields[comment]r   zfilter[flair]sortr(   r   r   page[cursor]r   z	/commentszDownloading comments page r+   r*   )r   r   c                 *    |d         dk    o|d         S )Nr   commentrL   rG   r   s     r#   r   z)PatreonIE._get_comments.<locals>.<lambda>  s    VWX^V_clVlVxqrswqx r%   )relationships	commenterr   rL   rL   r   bodycreatedr%  parentr   rootis_by_creator)rL   textrW   r)  author_is_uploaderr   c                 4    |d         k    o|d         dk    S )NrL   r   r   rG   )r   r   	author_ids     r#   r   z)PatreonIE._get_comments.<locals>.<lambda>  s    4I1E1]!F)W]J] r%   r   	image_url)authorauthor_thumbnailFr2   r/  )metacount)r   rL   )	itertoolsr4  r5   rA   r   r   r   r   r   r   boolr   )	r"   post_idcursorr4  r   pager9   r$  r/  s	           @r#   _get_commentszPatreonIE._get_comments  s"      z;52 #-4	
 	
 OA&& 	 	DMMfD>622"EEE~~++++WFIlfjIlIl & n nH F'3GIxIx2yzz  
(2^__	"7#k]3!-vu =&2I%O#2HfteTZmm_F]`c_dfi"j/;_tf.U- -   #8"$]$]$]$]_k'2SE&:1<{m0Ln n. %*	+ + +         |H.?@@@@%h0BCC~ =	 	r%   N)rB   rC   rD   IE_NAME
_VALID_URLr
  _TESTS_RETURN_TYPEr   r   r  r;  rG   r%   r#   rI   rI   @   s       GdJ;1
(
5
 
 A	

 A
 6
 +
 
 :
 7
 #
 S
 C
 '
 B
  %c!
 , <1#6+ C	
 	
 &  >
-
5
 '
 	

 +
 :
 A
 -
 ?+
 
 #
 J
 
 }
 U
  :!
" ##
$ 5$&)!%F #'!#!7
 
 
< !
 
?# #H E  6  H1=#+%A%	
 	
 &   I
*
5
 S
 9	

 #
 
 :
 ,
 ;
 A
 6
 
 \7+
 )
 :
  %c!
 . G
*
5
 [
 ?	

 (
 9
 
 A
 S
 :
 ,
 %c
 #
 
 ;;;
  @!
$ &+ 0 H
*
5
 D
 #	

 
 
 ?
 ,
 &'
 :
 S
 %c
 >
 :
 )
  @!
 . Hpx&%@$?#% +
 
" #F+DE+ 0 ISA&%G#F&)#% +
 
  &) . 9%%+ &]A%@&)##
 
" !$') . D&A$$@#?&)  #%
 
 unF^ L 	-M& & &PN N N`- - - - -r%   rI   c                      e Zd ZdZdZdddddddded	ddd
ddddddddddddddd
dddddedddddddddd
dddd d!d"d#d"d!d$d$d%d&d'edd(d)d*d+d,d-d.d/d0d1d2d.d-d2edd'd3d4dd5d6d7d8d6d7d9d6d7d:d6d7d;d6d7g
Zd< Zd= Zd>S )?PatreonCampaignIEzpatreon:campaignz(?x)
        https?://(?:www\.)?patreon\.com/(?:
            (?:m|api/campaigns)/(?P<campaign_id>\d+)|
            (?:cw?/)?(?P<vanity>(?!creation[?/]|posts/|rss[?/])[\w-]+)
        )(?:/posts)?/?(?:$|[?#])z&https://www.patreon.com/dissonancepod/rT   r_   ra   zfre:(?s).*We produce a weekly news podcast focusing on stories that deal with skepticism and religion.*r   r[   rV   )rQ   rb   rL   rR   r`   rt   rs   rc   rZ   r^   rS   rU   D   )rd   rf   playlist_mincountz'https://www.patreon.com/m/4767637/postszNot Just Bikes4767637z$https://www.patreon.com/notjustbikesz]re:(?s).*Not Just Bikes started as a way to explain why we chose to live in the Netherlands.*Jason37306634)rQ   rL   r`   rb   rR   rs   rt   r^   rS   rZ   rU   G   z3https://www.patreon.com/api/campaigns/4243769/postszSecond Thought4243769z%https://www.patreon.com/secondthoughtz;re:(?s).*Second Thought is an educational YouTube channel.*z
JT Chapman32718287)rQ   rc   rL   r`   rb   rR   rs   rt   r^   rS   rZ   rU      zhttps://www.patreon.com/c/OgSog8504388OGSoGzHre:(?s)Hello and welcome to our Patreon page. We are Mari, Lasercorn, .+zhttps://www.patreon.com/OgSog72323575z
David Mosszre:https?://.+/.+)rL   rQ   rR   rt   r`   rb   r^   rZ   rS   rU   rc   rs   iK  zChannel removed)rd   rf   rC  ri   z,https://www.patreon.com/c/anythingelse/posts9631148zAnything Else?z$md5:2ee1db4aed2f9460c2b295825a24aa08zdan 13852412z$https://www.patreon.com/anythingelse)rL   rQ   rR   rS   rZ   r^   rt   r`   rb   rc   rs   rU      z'https://www.patreon.com/cw/anythingelseTr   z%https://www.patreon.com/c/OgSog/postsz+https://www.patreon.com/dissonancepod/postsz!https://www.patreon.com/m/5932659z-https://www.patreon.com/api/campaigns/4243769c              #   `  K   d }d|dddd}t          j        d          D ]}|                    |rd|ini            |                     d||d| 	          }t	          |d
          }t	          |d          D ]-}|                     t          d|          t                    V  .| d S d S )Nzpatreon_url,urlr   z-published_at)r   zfilter[campaign_id]zfilter[is_draft]r   r   r   r!  postszDownloading posts page r"  )r3  
paginationcursorsnext)r   .r   patreon_urlr   )r6  r4  r5   rA   r   r  r   rI   )r"   campaign_idr9  r   r:  
posts_jsonpost_urls          r#   _entrieszPatreonCampaignIE._entries  s      -#. '#-4
 
 OA&& 
	 
	DMMfD>622"EEEFQqkoQqQqrrJ!*.WXXF(5_`` ` `oog.H(&S&SU^______~ 
	 
	r%   c                 $   |                      |                              dd          \  }}||                     ||d| j        i          }t	          |                     ||d           dddd	d
ddt          hf          }|sEt	          |                     ||          dd fdt          ht          t          d          hf          }ddddd}| 
                    d| |dd|          pi }|                    d          pi }t	          |d          }t	          |dd fi t          d          }	d|||                     |          t          t	          |d                    t	          |d          t          t	          |d                     ||t	          |	d          t!          |	                    d                    t	          |	d!          t	          |d"          t	          |d#          rd$nd%t#          t	          |d&                    d'S )(NrW  vanityr'   r   )r   props	pagePropsbootstrapEnvelopepageBootstrapr   r   rL   ).r   r   r   c                     |d         dk    S )Nr   r   rG   r   s     r#   r   z1PatreonCampaignIE._real_extract.<locals>.<lambda>  s    aiS]F] r%   zcampaign IDr   r   zEname,summary,url,patron_count,creation_count,is_nsfw,avatar_photo_urlcreator)r   r   r   r   z
campaigns/zDownloading campaign infoF)r*   r,   r+   )r   r   r   c                     |d         dk    S )Nr   r   rG   r   s     r#   r   z1PatreonCampaignIE._real_extract.<locals>.<lambda>  s    6f9L r%   )r   expected_typer3   playlist)r   summary)r   rd   )r   r   )r   r   )r   creation_count)r   is_nsfw   r   )r   avatar_photo_url)_typerL   rQ   r  rR   rb   rc   r`   rt   r^   rZ   rS   r   rs   rU   )_match_valid_urlr   _download_webpager$   r   _search_nextjs_datar   _search_nextjs_v13_datar   r   rA   r!   r   rZ  r   r   r   r   )
r"   rd   rW  r\  webpager   campaign_responsecampaign_infochannel_name	user_infos
             r#   r  zPatreonCampaignIE._real_extract  sr   "33C88>>}hWWV,,S&<QUQhBi,jjG&t'?'?Y]'?'^'^&9?JX^`dgjfkam n nK A*4+G+GQW+X+X79]9]^3%w}'='=&>[@ A A
 .5+ g 	
 
 !NN&&&,E +       	
 *--f55;#M3IJJ 
,L,LMdE; ; ;	
  !}}[11%l=B[&\&\]]'7LMM&1,}Nl2m2m&n&n%#(4IJJ&y}}T':':;;$Y0KLL*=:Z[[+M;TUU\[\$\-Ac%d%dee
 
 	
r%   N)	rB   rC   rD   r<  r=  r
  r>  rZ  r  rG   r%   r#   rA  rA  !  s        G$J 83B E!5&)"C6,
 
  ! $ 9%#A{'B%,
 
   " E%&)#BY'C$%,
 
 !! $ 1f#:;%$-&)
 
 !!# ( >%A%B'#A&)-
 
 !# & 9  7  =  3  ? EeFN  ,.
 .
 .
 .
 .
r%   rA  )!rE   r6  commonr   sproutvideor   vimeor   networking.exceptionsr   utilsr	   r
   r   r   r   r   r   r   r   r   r   r   r   r   utils.traversalr   r   r   r   r   rI   rA  rG   r%   r#   <module>r{     s           ! ! ! ! ! ! ! ! ! ! ! !       - - - - - -                                               M   @^ ^ ^ ^ ^ ^ ^ ^Br
 r
 r
 r
 r
 r
 r
 r
 r
 r
r%   