
    gR                        S SK r S SKrS SKJr  S SKJr  S SKJr  S SKJrJ	r	J
r
JrJr  SrSr0 SS_S	S
_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS _S!S"_S#S$_S%S&_S'S(_0 S)S*_S+S,_S-S._S/S0_S1S2_S3S4_S5S6_S7S8_S9S:_S;S<_S=S>_S?S@_SASB_SCSD_SESF_SGSH_SISJ_E0 SKSL_SMSN_SOSP_SQSR_SSST_SUSV_SWSX_SYSZ_S[S\_S]S^_S_S`_SaSb_ScSd_SeSf_SgSh_SiSj_SkSl_E0 SmSn_SoSp_SqSr_SsSt_SuSv_SwSx_SySz_S{S|_S}S~_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_E0 SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_SS_ESSSSSSSSSSSGS GS.Er\S\	S\
S\GS\S0r\GS\	GS\
S\S\S0rGS/r " GS GS\5      r " GS GS	\5      rg(
      N)sd_utils)security)
setup_path)DS_DOMAIN_FUNCTION_2008DS_DOMAIN_FUNCTION_2008_R2DS_DOMAIN_FUNCTION_2012DS_DOMAIN_FUNCTION_2012_R2DS_DOMAIN_FUNCTION_2016      z$27a03717-5963-48fc-ba6f-69faa33e70ed   z$3467dae5-dedd-4648-9066-f48ac186b20a   z$33b7ee33-1386-47cf-baa1-b03e06473253   z$e9ee8d55-c2fb-4723-a333-c80ff4dfbf45   z$ccfae63a-7fb5-454c-83ab-0e8e1214974e   z$ad3c7909-b154-4c16-8bf7-2c3a7870bb3d   z$26ad2ebf-f8f5-44a4-b97c-a616c8b9d09a   z$4444c516-f43a-4c12-9c4b-b5c064941d61   z$436a1a4b-f41a-46e6-ac86-427720ef29f3   z$b2b7fb45-f50d-41bc-a73b-8f580f3b636a   z$1bdf6366-c3db-4d0b-b8cb-f99ba9bce20f   z$63c0f51a-067c-4640-8a4f-044fb33f1049   z$dae441c0-366e-482e-98d9-60a99a1898cc   z$7dd09ca6-f0d6-43bf-b7f8-ef348f435617   z$6b800a81-affe-4a15-8e41-6ea0c7aa89e4   z$dd07182c-3174-4c95-902a-d64fee285bbf   z$ffa5ee3c-1405-476d-b344-7ad37d69cc25   z$099f1587-af70-49c6-ab6c-7b3e82be0fe2   z$1a3f6b15-55f2-4752-ba27-3d38a8232c4d   z$dee21a17-4e8e-4f40-a58c-c0c009b685a7   z$9bd98bb4-4047-4de5-bf4c-7bd1d0f6d21d    z$3fe80fbf-bf39-4773-b5bd-3e5767a30d2d!   z$f02915e2-9141-4f73-b8e7-2804662782da"   z$39902c52-ef24-4b4b-8033-2c9dfdd173a2#   z$20bf09b4-6d0b-4cd1-9c09-4231edf1209b$   z$94f238bb-831c-11d6-977b-00c04f613221%   z$94f238bc-831c-11d6-977b-00c04f613221&   z$94f238bd-831c-11d6-977b-00c04f613221'   z$94f238be-831c-11d6-977b-00c04f613221(   z$94f238bf-831c-11d6-977b-00c04f613221)   z$94f238c0-831c-11d6-977b-00c04f613221*   z$eda27b47-e610-11d6-9793-00c04f613221+   z$eda27b48-e610-11d6-9793-00c04f613221,   z$eda27b49-e610-11d6-9793-00c04f613221-   z$eda27b4a-e610-11d6-9793-00c04f613221.   z$26d9c510-e61a-11d6-9793-00c04f613221/   z$26d9c511-e61a-11d6-9793-00c04f6132210   z$ea08c04c-f474-4212-b19e-5e754f9210d41   z$4c0672a2-437c-4944-b953-5db8f111d6652   z$4c022fd1-adab-4d84-a7f1-9580f03da8563   z$c03b1f37-c240-4910-93c8-1544a452b4b54   z$560cf82d-9572-48a3-9024-6f2b56f1f8665   z$abd97102-88dd-4013-a009-0e2c2f967ff66   z$134428a8-0043-48a6-bcda-63310d9ec4dd7   z$d668ad1f-cedd-4565-ab02-9385926ce4f58   z$8f86b825-c322-4101-adc4-579f12d445db9   z$9fea28ff-387f-4d57-866d-3893c50f373f:   z$782370ce-3d38-438d-8b0c-464220a3039d;   z$002fb291-0d00-4b0c-8c00-fe7f50ce6f8d<   z$dcb3c95d-deb7-4c51-ad13-43a7d5d06fc7=   z$ef010a1e-bd88-48c8-a7af-2affd250d77d>   z$bd3413c0-9559-469b-9f3d-51d7faabd81a?   z$f814097b-3e3d-49ba-8a3a-092c25085f06@   z$6eb8eaf9-3403-4ba5-8b4b-ce349a4680adA   z$07e57d28-ad40-44fc-8334-8a0dc119b3f4B   z$6fd48655-1698-497a-ac8d-8267ce01c80bC   z$10338d31-2423-4dff-b4b5-ef025144b01fD   z$a96e2ed5-7a7c-4d5c-9d5d-965eca0051daE   z$613bd063-e8e9-4a62-8f4c-cda566f7eb6fF   z$2a858903-5696-4364-b4e5-4cac027ca7a6G   z$0fc5a978-0059-4b0a-9dc2-9896e8e389a1H   z$4d753a29-26ac-4d1a-bc80-311f947e4f0aI   z$3b3adbdb-4485-4559-aed8-9811c4bf90e4J   z$56040c71-fe93-4037-8fe9-1a4d1a283009K   z$caa2bfad-0cca-483b-8d00-347f943292a8L   z$2b9e0609-6d75-498a-9727-c9fcc93f0e42M   z$96541a16-910a-4b66-acde-720a0dff03c7N   z$429a6334-1a00-4515-bf48-676deb55954aO   z$21ae657c-6649-43c4-bbb3-7f184fdf58c1P   z$dca8f425-baae-47cd-b424-e3f6c76ed08bQ   z$a662b036-dbbe-4166-b4ba-21abea17f9ccR   z$9d17b863-18c3-497d-9bde-45ddb95fcb65S   z$11c39bed-4bee-45f5-b195-8da0e05b573aT   z$4664e973-cb20-4def-b3d5-559d6fe123e0U   z$2972d92d-a07a-44ac-9cb0-bf243356f345V   z$09a49cb3-6c54-4b83-ab20-8370838ba149W   z$77283e65-ce02-4dc3-8c1e-bf99b22527c2X   z$0afb7f53-96bd-404b-a659-89e65c269420Y   z$c7f717ef-fdbe-4b4b-8dfc-fa8b839fbcfaZ   z$00232167-f3a4-43c6-b503-9acb7a81b01c[   z$73a9515b-511c-44d2-822b-444a33d3bd33\   z$e0c60003-2ed7-4fd3-8659-7655a7e79397]   z$ed0c8cca-80ab-4b6b-ac5a-59b1d317e11f^   z$b6a6c19a-afc9-476b-8994-61f5b14b3f05_   z$defc28cd-6cb6-4479-8bcb-aabfb41e9713`   z$d6bd96d4-e66b-4a38-9c6b-e976ff58c56da   z$bb8efc40-3090-4fa2-8a3f-7cd1d380e695b   z$2d6abe1b-4326-489e-920c-76d5337d2dc5c   z$6b13dfb5-cecc-4fb8-b28d-0505cea24175d   z$92e73422-c68b-46c9-b0d5-b55f9c741410e   z$c0ad80b4-8e84-4cc4-9163-2f84649bcc42f   z$992fe1d0-6591-4f24-a163-c820fcb7f308g   z$ede85f96-7061-47bf-b11b-0c0d999595b5h   z$ee0f3271-eb51-414a-bdac-8f9ba6397a39i   z$587d52e0-507e-440e-9d67-e6129f33bb68j   z$ce24f0f6-237e-43d6-ac04-1e918ab04aack   z$7f77d431-dd6a-434f-ae4d-ce82928e498fl   z$ba14e1f6-7cd1-4739-804f-57d0ea74edf4m   z$156ffa2a-e07c-46fb-a5c4-fbd84a4e5ccen   z$7771d7dd-2231-4470-aa74-84a6f56fc3b6o   z$49b2ae86-839a-4ea0-81fe-9171c1b98e83p   z$1b1de989-57ec-4e96-b933-8279a8119da4q   z$281c63f0-2c9a-4cce-9256-a238c23c0db9r   z$4c47881a-f15a-4f6c-9f49-2742f7a11f4bs   z$2aea2dc6-d1d3-4f0c-9994-66c1da21de0ft   z$ae78240c-43b9-499e-ae65-2b6e0f0e202au   z$261b5bba-3438-4d5c-a3e9-7b871e5f57f0v   z$3fb79c05-8ea1-438c-8c7a-81f213aa61c2w   z$0b2be39a-d463-4c23-8290-32186759d3b1x   z$f0842b44-bc03-46a1-a860-006e8527fccdy   z$93efec15-4dd9-4850-bc86-a1f2c8e2ebb9z   z$9e108d96-672f-40f0-b6bd-69ee1f0b7ac4{   z$1e269508-f862-4c4a-b01f-420d26c4ff8c}   z$e1ab17ed-5efb-4691-ad2d-0424592c5755~   z$0e848bd4-7c70-48f2-b8fc-00fbaa82e360   z$016f23f7-077d-41fa-a356-de7cfdb01797   z$49c140db-2de3-44c2-a99a-bab2e6d2ba81   z$e0b11c80-62c5-47f7-ad0d-3734a71b8312   z$2ada1a2d-b02f-4731-b4fe-59f955e24f71z$b83818c1-01a6-4f39-91b7-a3bb581c3ae3z$bbbb9db0-4009-4368-8c40-6674e980d3c3z$f754861c-3692-4a7b-b2c2-d0fa28ed0b0bz$d32f499f-3026-4af0-a5bd-13fe5a331bd2z$38618886-98ee-4e42-8cf1-d9a2cd9edf8bz$328092fb-16e7-4453-9ab8-7592db56e9c4z$3a1c887f-df0a-489f-b3f2-2d0409095f6ez$232e831f-f988-4444-8e3e-8a352e2fd411z$ddddcf0c-bec9-4a5a-ae86-3cfe6cc6e110z$a0a45aac-5550-42df-bb6a-3cc5c46b52f2z$3e7645f3-3ea5-4567-b35a-87630449c70cz$e634067b-e2c4-4d79-b6e8-73c619324d5e)                                 r   r         |   c                       \ rS rSrSrg)ForestUpdateException    N)__name__
__module____qualname____firstlineno____static_attributes__r       5/usr/lib/python3/dist-packages/samba/forest_update.pyr   r      s    r   r   c                       \ rS rSrSr  SS jr  SS jrS rSS jrS r	S	 r
S
 rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rS rSrg)ForestUpdate   z2Check and update a SAM database for forest updatesc                 J   SSK Jn  Xl        X0l        X l        X@l        SU l        U R                  R                  5       U l        U R                  R                  5       U l	        U R                  R                  5       U l        [        R                  " U5      U l        [        R                  " UR!                  5       5      U l        U R                  R                  5       U l         U R$                  R'                  S5        U R                  R                  5       U l         U R.                  R'                  S5        0 U l        U" [3        S5      U R0                  S	9  g
! [(        R*                   a    [-        S5      ef = f! [(        R*                   a    [-        S5      ef = f)z
:param samdb: LDB database
:param verbose: Show the ldif changes
:param fix: Apply the update if the container is missing
:param add_update_container: Add the container at the end of the change
:raise ForestUpdateException:
r   )read_ms_markdownFzCN=Operations,CN=ForestUpdatesz+Failed to add forest update container childz)CN=ActiveDirectoryUpdate,CN=ForestUpdatesz#Failed to add revision object childz/adprep/WindowsServerDocs/Forest-Wide-Updates.md)out_dictN) samba.ms_forest_updates_markdownr   samdbfixverboseadd_update_containercheck_update_appliedget_config_basedn	config_dn	domain_dnget_schema_basedn	schema_dnr   SDUtilsr   dom_sidget_domain_sid
domain_sidforestupdate_container	add_childldbLdbErrorr   revision_objectstored_ldifr   )selfr   r   r   r   r   s         r   __init__ForestUpdate.__init__   sX    	F
$8!$)!557--/557 ((/"**5+?+?+AB&*jj&B&B&D#	W''112RS  $zz;;=	O  **+VW
 $UV"&"2"2	4 || 	W'(UVV	W || 	O'(MNN	Os   'E "F  E? F"Nc                    U R                   R                  U R                  S/[        R                  S9n[
        U   nU(       a  [
        U   nUS-  nO[        nU R                  Xe5        [        U   n[        US   S   S   5      nU(       a[  X:  aU  U R                  (       d  [        SUU4-  5      eU R                   R                  S[        U R                  5      U4-  5        ggg)z
Apply all updates for a given old and new functional level
:param functional_level: constant
:param old_functional_level: constant
:param update_revision: modify the stored version
:raise ForestUpdateException:
revision)baseattrsscope   r   zERevision is not high enough. Fix is set to False.
Expected: %dGot: %dz:dn: %s
changetype: modify
replace: revision
revision: %d
 N)r   searchr   r   
SCOPE_BASEfunctional_level_to_max_update
MIN_UPDATEcheck_updates_rangefunctional_level_to_versionintr   r   modify_ldifstr)	r   functional_levelold_functional_levelupdate_revisionresexpected_update
min_updateexpected_versionfound_versions	            r   check_updates_functional_level+ForestUpdate.check_updates_functional_level   s     jjT%9%9'1l#..   J 99IJ78LMJ!OJ#J  =67GHCF:.q12}?88+ -DGWGTGV-V W W JJ"" $ 	D  !#34	$5 6  @?r   c                    U H  nU[         :  d
  U[        :  a  [        S5      eSUs=::  a  S::  a  O  OU R                  U5        ME  SUs=::  a  S::  a  O  OU R                  U5        Mh  SUs=::  a  S::  a  O  OU R                  U5        M  SUs=::  a  S	::  a  O  OU R                  U5        M  [	        U S
U-  5      " U5        M     g)z
Apply a list of updates which must be within the valid range of updates
:param iterator: Iterable specifying integer update numbers to apply
:raise ForestUpdateException:
Update number invalid.rU   rX   r\   r~   r   r   r   r   operation_%dN)r   
MAX_UPDATEr   operation_ldifgetattr)r   iteratorops      r   check_updates_iterator#ForestUpdate.check_updates_iterator  s     BJ"z/+,DEER~2~##B'rS##B'!c!##B'!c!##B' nr1226 r   c                    UnU[         :  d  X:  d
  U[        :  a  [        S5      eX2::  a  U[        ;   a  OSUs=::  a  S::  a  O  OU R	                  U5        O{SUs=::  a  S::  a  O  OU R	                  U5        OYSUs=::  a  S::  a  O  OU R	                  U5        O7SUs=::  a  S	::  a  O  OU R	                  U5        O[        U S
U-  5      " U5        US-  nX2::  a  M  gg)z
Apply a range of updates which must be within the valid range of updates
:param start: integer update to begin
:param end: integer update to end (inclusive)
:raise ForestUpdateException:
r   rU   rX   r\   r~   r   r   r   r   r   r   N)r   r   r   missing_updatesr   r   )r   startendr   s       r   r    ForestUpdate.check_updates_range-  s     :j0@'(@AAi_$rR##B'rS##B'!c!##B'!c!##B' nr1226!GB ir   c                 f   S[         U   < SU R                  < 3n U R                  R                  U[        R
                  / S9n[        U5      S:X  d   e[        SU[         U   4-  5        g! [        R                   a-  nUR                  u  pVU[        R                  :w  a  e  SnAgSnAff = f)	zL
:param op: Integer update number
:return: True if update exists else False
zCN=,)r   r   r   NFr   zSkip Forest Update %u: %sT)
update_mapr   r   r   r   r   r   argsERR_NO_SUCH_OBJECTlenprint)r   r   	update_dnr   enummsgs          r   update_existsForestUpdate.update_existsH  s    
 #-R.$2M2MN		**##*-..*, $ .C 3x1}})RB,@@A || 	JSc,,,		s   )A/ /B0#B++B0c                     U R                   R                  S[        U   < S[        U R                  5      < S35        [        SU[        U   4-  5        g)zW
Add the corresponding container object for the given update
:param op: Integer update
zdn: CN=r   z
objectClass: container
zApplied Forest Update %u: %sN)r   add_ldifr   r   r   r   r   r   s     r   
update_addForestUpdate.update_add\  sH    
 	

"~s46679 	: 	,JrN/CCDr   c                    U R                  U5      (       a  g[        U   nX R                  ;   a  U R                  U   nOUR                  5       U R                  ;   a  U R                  UR                  5          nOKUR	                  5       U R                  ;   a  U R                  UR	                  5          nO[        SX4-  5      e[        R                  " U[        U R                  5      [        U R                  5      [        U R                  5      S.5      nU R                  (       a  [        SU-  5        [        U5         U R                  R                  U5        U R(                  (       a  U R+                  U5        g g ! [         R"                   a.  nUR$                  u  pgU[         R&                  :w  a  Ue S nANaS nAff = f)NTz#OPERATION %d: ldif for %s not found)	CONFIG_DNFOREST_ROOT_DOMAIN	SCHEMA_DNz!UPDATE (LDIF) ------ OPERATION %d)r   r   r   lowerupperr   sambasubstitute_varr   r   r   r   r   r   r   r   r   r   r   ERR_ATTRIBUTE_OR_VALUE_EXISTSr   r   )r   r   guidldifsub_ldifr   r   r   s           r   r   ForestUpdate.operation_ldiff  sp   b!!"~#####D)DZZ\T---##DJJL1DZZ\T---##DJJL1D'(M)+
)3 4 4 ''/24>>/B/24>>/B/24>>/B/D E <<5:;(O	JJ""8, $$OOB % || 	JSc777		s   F G$GGc                 B    U R                   (       d  [        SU-  5      eg)zc
Raises an exception if not set to fix.
:param op: Integer operation
:raise ForestUpdateException:
z3Missing operation %d. Fix is currently set to FalseN)r   r   r   s     r   raise_if_not_fixForestUpdate.raise_if_not_fix  s"     xx'(]`b(bcc r   c                 D   U R                  U5      (       a  g U R                  U5        Sn[        R                  " U R                  S[        U R                  5      -  5      nU R                  R                  USU/S9  U R                  (       a  U R                  U5        g g )NY(OA;CIIO;WP;ea1b7b93-5e48-46d5-bc6c-4df4fda78a35;bf967a86-0de6-11d0-a285-00aa003049e2;PS)CN=Sam-Domain,%sdefaultSecurityDescriptor	sddl_attradd_acesr   r  r   Dnr   r   r   r   update_aces_in_daclr   r   r   r   acer   s       r   operation_88ForestUpdate.operation_88      b!!b!iFF4::'9C<O'OP	)))4O475 	* 	: $$OOB %r   c                 D   U R                  U5      (       a  g U R                  U5        Sn[        R                  " U R                  S[        U R                  5      -  5      nU R                  R                  USU/S9  U R                  (       a  U R                  U5        g g )Nr  CN=Domain-DNS,%sr  r  r  r  s       r   operation_89ForestUpdate.operation_89  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g Nr   r   r   r   s     r   operation_90ForestUpdate.operation_90  0    $$T-?-?-C-COOB .D$r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_127ForestUpdate.operation_127  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_128ForestUpdate.operation_128  r  r   c                 D   U R                  U5      (       a  g U R                  U5        Sn[        R                  " U R                  S[        U R                  5      -  5      nU R                  R                  USU/S9  U R                  (       a  U R                  U5        g g )N7(OA;CIOI;RPWP;3f78c3e5-f79a-46bd-a0b8-9d18116ddc79;;PS)r  r  r  r  r  s       r   operation_129ForestUpdate.operation_129      b!!b!GFF4::'9C<O'OP	)))4O475 	* 	: $$OOB %r   c                 D   U R                  U5      (       a  g U R                  U5        Sn[        R                  " U R                  S[        U R                  5      -  5      nU R                  R                  USU/S9  U R                  (       a  U R                  U5        g g )Nr$  r  r  r  r  r  s       r   operation_130ForestUpdate.operation_130  r'  r   c                     U R                  U5      (       a  g U R                  U5        U R                  R                  SU R                  -  SS/S9  U R
                  (       a  U R                  U5        g g )Nzdn: CN=ad://ext/AuthenticationSilo,CN=Claim Types,CN=Claims Configuration,CN=Services,%s
changetype: modify
replace: msDS-ClaimIsValueSpaceRestricted
msDS-ClaimIsValueSpaceRestricted: FALSE
zrelax:0zprovision:0)controls)r   r  r   r   r   r   r   r   s     r   operation_135ForestUpdate.operation_135  su    b!!b!

   nn	 
 *3M(B 	 	D $$OOB %r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_11ForestUpdate.operation_11  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_54ForestUpdate.operation_54	  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_79ForestUpdate.operation_79  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_80ForestUpdate.operation_80  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_81ForestUpdate.operation_81  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_82ForestUpdate.operation_82  r  r   c                 x    U R                   (       a)  U R                  U5      (       d  U R                  U5        g g g r  r  r   s     r   operation_83ForestUpdate.operation_83  r  r   )r   r   r   r   r   r   r   r   r   r   r   r   r   )FFT)NF)r   r   )r   r   r   r   __doc__r   r   r   r   r   r   r   r  r  r  r  r  r!  r%  r)  r-  r0  r3  r6  r9  r<  r?  rB  r   r   r   r   r   r      s    <16&*(4V =A7<"6H7,6(E# Jd , " 
 
 
 " " &       r   r   )r   r   r   samba.dcerpcr   samba.provision.commonr   
samba.dsdbr   r   r   r	   r
   r   r   r   r   r   r   	Exceptionr   objectr   r   r   r   <module>rJ     s  &    ! -  

I.I .I .	I
 .I .I .I .I .I .I .I .I .I .I .I  .!I" .#I$ .%I& .'I( .)I* .+I, .-I. ./I0 .1I2 .3I4 .5I6 .7I8 .9I: .;I< .=I> .?I@ .AIB .CID .EIF .GIH .IIJ .KIL .MIN .OIP .QIR .SIT .UIV .WIX .YIZ .[I\ .]I^ ._I` .aIb .cId .eIf .gIh .iIj .kIl .mIn .oIp .qIr .sIt .uIv .wIx .yIz .{I| .}I~ .I@ .AIB .CID .EIF .GIH .IIJ .KIN .OIP .QIR .SIT .UIV .WIZ .[I\ .]I^ ._I` .aIb .cId .eIf .gIh .iIj .kIl .mIn .oIp .qIr .sIt .uIv .wIx .yIz 	/{I| 	/}I~ 	/I@ 	/AIB 	/CID 	/EIF 	/GIH 	/IIJ 	/KIL 	/MIN 	/OIP 	/QIR 	/SIT 	/UIV 	/WIX 	/YIZ 	/[I\ 	/]I^ 	/_I` 	/aIb 	/cId 	/eIf 	/gIh 	/iIj 	/kIl 	/mIn 	/oIp 	/qIr 	/sIt 	/uIx 
0	/	/	/	/	/	/	/	/	/	/	/QI
X RSS"  QRR  %	I 	Y 6 Y r   