From 575f8880bf8498ee05a8e197fc2ed85db6880361 Mon Sep 17 00:00:00 2001 From: Mark Shannon Date: Tue, 23 Aug 2022 13:55:43 +0100 Subject: [PATCH] GH-96068: Document object layout (GH-96069) --- Objects/object_layout.md | 82 +++++++++++++++++++++++++++++ Objects/object_layout_312.gv | 50 ++++++++++++++++++ Objects/object_layout_312.png | Bin 0 -> 30688 bytes Objects/object_layout_full_312.gv | 25 +++++++++ Objects/object_layout_full_312.png | Bin 0 -> 17092 bytes 5 files changed, 157 insertions(+) create mode 100644 Objects/object_layout.md create mode 100644 Objects/object_layout_312.gv create mode 100644 Objects/object_layout_312.png create mode 100644 Objects/object_layout_full_312.gv create mode 100644 Objects/object_layout_full_312.png diff --git a/Objects/object_layout.md b/Objects/object_layout.md new file mode 100644 index 000000000000..9380b57938c8 --- /dev/null +++ b/Objects/object_layout.md @@ -0,0 +1,82 @@ +# Object layout + +## Common header + +Each Python object starts with two fields: + +* ob_refcnt +* ob_type + +which the form the header common to all Python objects, for all versions, +and hold the reference count and class of the object, respectively. + +## Pre-header + +Since the introduction of the cycle GC, there has also been a pre-header. +Before 3.11, this pre-header was two words in size. +It should be considered opaque to all code except the cycle GC. + +## 3.11 pre-header + +In 3.11 the pre-header was extended to include pointers to the VM managed ``__dict__``. +The reason for moving the ``__dict__`` to the pre-header is that it allows +faster access, as it is at a fixed offset, and it also allows object's +dictionaries to be lazily created when the ``__dict__`` attribute is +specifically asked for. + +In the 3.11 the non-GC part of the pre-header consists of two pointers: + +* dict +* values + +The values pointer refers to the ``PyDictValues`` array which holds the +values of the objects's attributes. +Should the dictionary be needed, then ``values`` is set to ``NULL`` +and the ``dict`` field points to the dictionary. + +## 3.12 pre-header + +In 3.12 the the pointer to the list of weak references is added to the +pre-header. In order to make space for it, the ``dict`` and ``values`` +pointers are combined into a single tagged pointer: + +* weakreflist +* dict_or_values + +If the object has no physical dictionary, then the ``dict_or_values`` +has its low bit set to one, and points to the values array. +If the object has a physical dictioanry, then the ``dict_or_values`` +has its low bit set to zero, and points to the dictionary. + +The untagged form is chosen for the dictionary pointer, rather than +the values pointer, to enable the (legacy) C-API function +`_PyObject_GetDictPtr(PyObject *obj)` to work. + + +## Layout of a "normal" Python object in 3.12: + +* weakreflist +* dict_or_values +* GC 1 +* GC 2 +* ob_refcnt +* ob_type + +For a "normal" Python object, that is one that doesn't inherit from a builtin +class or have slots, the header and pre-header form the entire object. + +![Layout of "normal" object in 3.12](./object_layout_312.png) + +There are several advantages to this layout: + +* It allows lazy `__dict__`s, as described above. +* The regular layout allows us to create tailored traversal and deallocation + functions based on layout, rather than inheritance. +* Multiple inheritance works properly, + as the weakrefs and dict are always at the same offset. + +The full layout object, with an opaque part defined by a C extension, +and `__slots__` looks like this: + +![Layout of "full" object in 3.12](./object_layout_full_312.png) + diff --git a/Objects/object_layout_312.gv b/Objects/object_layout_312.gv new file mode 100644 index 000000000000..c0068d785685 --- /dev/null +++ b/Objects/object_layout_312.gv @@ -0,0 +1,50 @@ +digraph ideal { + + rankdir = "LR" + + + object [ + shape = none + label = < + + + + + + + +
object
weakrefs
dict or values
GC info 0
GC info 1
refcount
__class__
> + ] + + values [ + shape = none + label = < + + + + +
values
values[0]
values[1]
...
> + + ] + + class [ + shape = none + label = < + + + + + +
class
...
dict_offset
...
cached_keys
> + ] + + keys [label = "dictionary keys"; fillcolor="lightgreen"; style="filled"] + NULL [ label = " NULL"; shape="plain"] + object:w -> NULL + object:h -> class:head + object:dv -> values:0 + class:k -> keys + + oop [ label = "pointer"; shape="plain"] + oop -> object:r +} diff --git a/Objects/object_layout_312.png b/Objects/object_layout_312.png new file mode 100644 index 0000000000000000000000000000000000000000..396dab183b3e9b2f39edb49b033a612e66d3a09a GIT binary patch literal 30688 zc-p+Y2{@K*yZ3#fM9Dl088QzcWS*{&c_xXF%#k5;RAh{h5GiDyWi0bNl+07cWXPPz zkm23Wp7pG?zV}_vde^sY-}d#~_jdPmxvuLtk7M8e|KI;Sjb`vLRATaoS^@ETbmV&AQzGA7&$%9NJ{j9!HJ@d~ z5gB}0iDI6|##G0rPc5&6?R(!{C(AdhXOKDGvn==i@#DwnM-ToF?ki98^Lh02^kzm& zERlc*YvW8(QuKL-MKA4RlMMaQJMQNc>6&D0)mRrky1Dj7ou1>Rm?jZI&A zPHnjwhmOipKi|0gtYuq-oV+}?;xpQytu2>p!7bF5MSs^KPo9<3d}X+R`tofgl2Im7 z%ynVVxTx?5zVTxVx<*F|v25za{wELJR))_vHa70f1~cXkY3u6ZARTu~jsI|RaXqf6 zcu?EgNo^_ocQNhWrl&ud_CKL7FfMl*)p7pB&SrD?THQDL2gNhWQN5t~jBDbzwo*y4-%`?6k+~D9O*CKZlm-#oh2E zJl0!MqhVb@4ruyDol+0~AyRiFnZK-~LekWYLpJsB4f`TGDH`k*3B`>w;z2wKtcOwK^ z=d!G5EYJ6>eXT5UUomi){6LYIn7H({l7C`y^5>ZK8##6L^YFgQqN43{?NL~g_4OJ& zlyeP_aF&Mh;vc75M+gLc%d#5#DBw7LB?QAfyThE3kx^V(85|i&`1r|_l}j(PG~d+i zJRD1k?z{t9bLPT@3%!N6BruAK7Qa`=Jhzuf(9VlyQIc0*+i%5%?@~*?N@8bcr=_c_ zkR;+rOhwfWlNs@7quO$#<6vh+z@jC@&`ts4?#;EOf8nY#!oyN}s4LH;7EDEuB6))gL{Ll0LvQHa2czTsb^E zq+MYUb2-KMaF401yu7c-OlIPP`#D6*z<|wTfB5rf^}@*?16k(Q)@Rh!)yo{eQj(C6 zxU_#s7Q^xJ@v*VDZw9@*ckfl4+wMAnao*x1?6 zfCx#Am)SlsZ+^x&E)(%09AzBD*ExH;2^qs&Sg`1EO0clWu%!oma@ z|GHj7MMc~YJjd~}och?NQza!O3F7WtpFV&7Iel_Wg@a2V>+36-mYzPpo&mo2djTZh zDZi%X!h7p4xFqJI#pahqMB1wE&!H}7Qtfg&H8pi;{L?GpbEKiC(4RrxWo23ZTKJ3v z3>VxSsk&Ye9DJs$tLrjU>(cUa)7TgdCNPfM5F4qfsnIevJ}W9Js+^(Y>FFt}s(LOn zGjnHe{e~mFftZ0Ia((h+b6XoO6`zSLOb(bL2`TC0NO}n_aSRx?O7cXB=6W*I$J_XGNWr>G4J39v`vp#f;N%?K1sQ%$(Wt-^}HMZuqXLNngH4*d@lm#~{74`JUzkT~Qv%cO# zcMj@TY7Q2$q^#`9tUVOX>`Iqv9vFRjMS*v{-u3I(3wF46g>X{Lu-TYr<6>eS`|Pgc zx7&aG5;aux_%Sx>ki0i5T57z0ZFaK1xyZzX1tkY9Z0P0*I%fmUGL@jmMN!Ac%}rKU zs5Wf6{ldZAJay9@oO9)h;(Rle{*R?4JhS$;wmMde-y(7G@#vHnmzFjy59Q4+EIfVp zj`eV}nW(s|Oz-b!E}@@kRC#YQ@Xt7x=ovmv&PG@)1cCL=9#&+F#R`}h$mQeXD~~j{ zwdIt&UhVhi0kBF3{l-M~duK@=9yPvB9zH%?4HMV9WFBCuWaf9`;rSOsbm!t zjQQa9Lmueh&Ye3LGIou3?3yWf?ez!C+{SPf^kOc7(g#Z{{lmkVB97y|mD3MZ=jZ2L z{A_J(h>=&4UZo~pva(3I-B8%z&`^$gl1SOz&$QJQ01R0Gb@=V|`wMhjyu6o~(_&&s zUtPV=Y-?|?`{(!CkJYjFJDwshbYX%|pFSN8a$WBD^(AO=A&O5ConLvGnRVPAcaF;Z zSXr3^Ekqmh;o(oEYr)N%hdE0nmhIorsV=i2S@`mX$lcxjT5u~|l__e~=i5NgQU3wR zq^6<4LZtU*a84_=c6E1`c<X&7N%pSar+F$%lZUs7iKGgLuxq}d;UkTA^ntW#UMpyTn~ci}Osy8s`L(%qi! zC4k2xlAd_*#mC#*ZdD&XFpG=R${cRuz-m*_lft(eqHsunI3H}=`tHxi_xANQ2A!ko zt#-Bk3zw_Ho9C}Y2)kecDYy;Z`kx#_qsxNn|KpqIzH5X=To5B=jt()~=;Rg@)ald3 z9UB{?miE2+lHV+{p+Odd!N?jK8upn3=J??F-Z1DK9UC(TaStPWQri+Pt+ab9G(7wX z2uE00nDg==r|;p<_AtUw;MSWBov&j`ii;bvwbRMzaeeTwv3r=CnFVkRwKc;i*Jis*BZQd+6A9MW*QsS5O8y(QyI259sysDZr?zKBRc3iPY;aI-b-JGM z&BKG7GzE(Y0Rtk>`AC6FhNh;G0RadMuCb#7&;MwL3cbY4mcK7jQc<1p@bEa?88I`e zaGNBYdqio4?8*s17c-oANhI}C=#U~H+OdcVQeQSCqUStubvw! z8XAO9V^JW$3JMB1u(Ux%Mf~Vj4da25(6VZ3YUbbiNU513nNul%w%p7N0)Hmyy^RNs z+z!$o9TTJDWH~IFsD=wvYGiC|0X=|6NZ1C2{jQ*0gIoEsugiv-g?|Cnr8+o*i*TKP~`z z7!0%(VPJ5u0uLox)UJy?^K0r;Owe6rc0($C=9k+N0u0wjRm&a5bgI5@13{xr=n|jG zMHZSnZ)$3a1ax#L8{NE#P81;U9w=haLq=)e5R|aE;^cWK)1eotymxY)58rTWgj4aq zr1LmAKHB{G^HEL?Cxf&v9y>cbq?K>qTEqD-{Amd#gV2VDk1u!kZf38Ui;EyB8ChSR zAwO98-rnBruN97-hkN&HQ>G1nZvW6lc??MTacC(1!SA*3s;aAK_5^2Z0_Exsy+!Z7 zJb3+{G?Y6Q@{;!^+Y9hQBBa=LQDgM$R|O@dGaw5m`(OM`ukr&u&L3!~sN{9=SXk5QdCID5=_<= zh&W--o?S{*QY=$?*|PE$+pOUP#h`rTzUn%*^86+Z;JLInjA}+;Bk=b$j1{tuSuu z6JlMTKVJ&P$V+)|zlD+aLmE{!Gka5LQl0kP6?BV#bpe!a(9lH*LrzAffN+3qb9}A3 z&w}-~JD&fX6$ma|0|w&49R~+BfC17-kof?lm&(jn4ugS?Nk2~~g4Yf+rm2&ow^wK9 zQVATewYm8=EbMG`6?A2gOikRfposR)_rl_0ScMGL_`p(F%^`c2T_}8AsO!$g#z&}u z+Km*_!;0eLBZ%OYEAJlRoay&J`D2E*x0K((c0v1q(b3O##wM@h^^Y4NA=y<`32bT! z7Y7AIMA(or@GNHLSD>L-7hy$Hdt_oInA7IFtg}g;QgfU7y3Lh2?+_K8#l~hoYX>h36P5- zB9yqexFHb{ElP}jfzYUO(6XrH6`II-dy9jcX%!SfF2!5JnrR9;XH@@C>f!OewT+#f zL0-Mrue+#7gR2%j_yl^4pgAjbb-di3pZ+5ofV|Ck8Rx8S<&o&{EIQQXYq}HBuHdJQqq%<=SfNDX7;6`fK;5yYCl1b2dU;mTe-A@pY*0G zoPp59A|*u+1=RuyT5QwDoSpNt=w6%A+Fpu;f%RP5v*x~ZC2b?45UAI;pv!w(-TWmU z8>UDDl-cHdycsqkC@6>^ot>Q*nX5+t?GVZ7use`3P)xxkVj!TRq9WEVzmH1a-kzt! zR894G$*Yu81>K|Np%D>*80JQ3`Mz9zZXV+@JcxHi&M!?r!x|9-)I$lG?<@}))p!cr z?McQ5L3CRkjVAl((J(MT*6>S;h~KO(0+!dj<2h5)Pl$3@Us9yd+X>RgdzP%Mta$Bq zuZoJ&mi>GnSmjNas9(SS$cU#6q987q-HVqmEyhZ%mIktjwzjsWY)sk`TmayQ#-O*E zVmqC;m$X+Ws>#4TT0v0mpB(#{d~m~uUw?0%$(orlHvGDi!v-yl28g;kX$wos+2v*9 zxm^0qLtKwDXU=?jEm5f<8dLAEN>x%>sbpcnjE#e1ZetVTRJV^SCnr}lLFD5PU~`tc z0p%KyvbSkl^=8jNK8s6A8k5Cbi``cY4*yJ_6zbON|H*!a;(s0d(KB}kM@JGyM*e&@ zMJ1)VB&WI@U4n>`w$NBuwa-bSN^hk7HX-++ya-WR7P|VjqvJE+hU@E`pZRWmKu2F! zR|oc~WM{|a;_7<;_v#H#FE1u8uCu!v)9nyTzw_Da-@@nQg`+LwG0SO5Sm2S8<6yD|J-~)UhUkr7W zA}?@WU}3&0CN>Kzo*-nc@htwpKE0rT*Y}o~W_Ne@{4(%B)95HQQtbEVw_RQfe78}# z9RY>wEALXV2QUcjzskB{zMEd?*1yg`DDa}{nSZmAu)4Zh-T?w`VetC~YF*lm zLmEN@r{!O^V=7RfS3t0;OHp?Kc`&s+f_xI4k#Wh^)>a$L>IckUlK^mD|G+>xTu~p` zD<=<6M2m&M=hqU3_rlL2WkBb~Wj4_!H-_T%xH3@iw_WXG_s^^2;pM%~7OU;-d>Otc zx}-!PF)3+aYrZ>AD)o=Z%%z*D#U2~s{B_y)!=phzqK$Ym(QkkX;DpHaPKWb)hR!P~ z9})Ew$?9?6u8xk2%*AM#Eb82=?oksUw@&speh2vLwRn>C}!G!v59IKZeKYo1M$|_^& z@(V@as5Avn{+5=OiyR!vC|@qquzRSq^!5@zefkuSfI#n`Z?Lh+hBx3A1q{=}I5=hM z7XK$Br%eU6F$YY(EF`3$qeF^Z}%(7V*+T>}FH zv){g9OG!zU+4N!4i8v5PiiwHgJF;n}9BRzLS4pB@6->nVw5X`aB=ONBEJzl`w;Lae z@9Ju4ZJOTuDCoUy)6&|?DNbO}3eIkR?_Ok`-yaJ=VqhtK8_DyIk>BU%8>gliT3cI{ zRaE5f++l?}c?>>a(3dLEMtcz^h||(?PITR}ErO=XV`J)O$ik!$L_#;bRYoo@F6V_$ zG*#8rKmislAta-fPK1K)1I)$IHtL$>QwFZ~+cd_3@)+ zdn7#)KqS3~K+!^Dl}Gx+5Uz@gLvUyw93%&nrs7+is`I0hmX^LOEZo{0Of>ub`zgRy zlN!$wV;S)J_>YxK8}%o+$f;AO@T?$bHNy`HxO`Vu&d`Ac*j^nYg9t})u)jEOEi5dY z>Zfk0@8=X99bH^e0Y!(KpP!F<$hr3aBWavpcCl12goFcSzGJE>VPnjARmB%*G5a8u#)0qU1VfrOugmlc~#hP{6$ZSlq$&f71sqd zY}wh_S%5veAueoLNHhEqE8yPm^72&A5HY-~sgVo|3AtEeq$VOFqGxQZ@~@&m(Xb(4 z-Ol=C64KlF!yu8ouP1mVI-`ugbW*?02ymKl5zzl=I zz*i3fPvstHG7AaCLK)yA09_;`eUN!k^o1$pWMO%t7(p!u_%`K$rbTHi+xr%!KW z7?I0R4Tpf+kSnne^rj{lFU)LEZ)Q~$bxKN#QHjOr3l}aR$UvsL0?a=6;IgC$iTT2( zMD#{Qa&j^vd6J!-ByoJ2xTe;(Fq@6R8IVhkuLL6kMJ^w-HDUl}QChseWG zIj&vp@@-)OcV^$N-TI9m%3=wxUZt7UKSb~C+dtD~jz;g+RJpIb)Vh27b^zGX98fkA z09lI1s2H*CNtR0zaYQ8ji6Ktn7`?xH9`a%sq?vT9?w7rTgMsPkEHC+P9W?!FW=zr- zwX(88Ql@<>z)_*^Qo)9b%gYN4496Cf=Y94T3&?>GkWH8^stW4}VQKU}&(Y3^*&bXH zdMCCc&f`b_wRN8yJ+9rO)^IB5kVjF{2g)2PgE?e^LPBOgY-=Eyva+!?jgK1_PE1bH zH~b2g2soLX9xS}|G5+^hjxPK5$_SCn@m{*tgZVCs>NQ4SMFGn;0(AQW-4?}QT2%Re zlpt(Rsiv-O zc91gqHABty9k2uf>4DeK6n@#O0TMnlTz_FQ&($mwTj{T(9sT7O=q(lkB;s`C7;phW zV7Xo9@7}%JJ3OoiEEur7D_Z*rQ0TJ5=wMdmG^7GDw*1&6&MH!m?O|eKqRTuqmrFa1 zWj<-q1ZQ>E$58>D7SY2B~cc>Z~WYJqLz|(SCTD^2p zlhir6x$@9+%gf8ukm4WySrff;_pSw~^U`$vi7J`ARU!+$#Dl<;6b5MV`L2zLY8+%~ zC~t(W{WG;LADF(_&6_u~v$JmlXTg86AJn*Hq;9$B&DW|=e)I@7;!%XQf?5rOfOV0d zp9uB2H*XjNP6{e|&xv@gjhAzSMm+`L>X1@TNKTG`FxuGKdKw8F+Psj0d8 zwUWqwq_8y*pDfT4(l2^ToK5}JDKsP3*d?F%)+6Y~4Dvkuy$fArLu3bah{)(`$fOXFWNKtQrS3*KVa|V1Yz8F5&*V98ki-2C7 z9AK)Wv$GMr7Oj<8YdxwiL8ZZ=A#{5gqomaBNd0hiRKUj87CkQDF3k?r_$XH5k~R1< z^x!P4H?`=!3k*`;fdD77@n#RP5Z|p%_PyUnmaJaP7IVj>N4d!+Cd@IvcUtjY>*N=-o1C#;eXVNb>8~sTmnN<9=M-7j9HI z&_G`cc&wWMy37KgG_ZgbdH!$Qzc2MANi-^wLCUyb;_KI>?d|Ps zNJ(Y>ClAk_JI4ZE>$=#J0i@AgYv$_e%FN8g!}IQo%t9vHjKmVTMIt3cb&W9{}C#3($dn5eP;@^zWbgW?F!$c`6cK+ zHa_R~ibdElNaqJE-4&bOi|8iJ@3pT3@UMM-`_0tL!%J(FBtL`gxx%};h2RVHomp3{ zFw7*(%*>wLFaF8u8T%14Z{J?zF|FAPqI+B)k(5ODZEo)V@gdmMi#1Ej{d;7IV!+1#J^sL@55K)*W!2c!gq>$l;9cfh;p)v zBP=DlL*+1DhL6U1Qc}|AuU>@#s530~yna$%E)2eJPe0JmfS~t3An0(n(@|1B-P&>? zpuK_zsB(OK?0K-w332>qm*4!q2sXdt{#b0h=}T8);p5ZjGw=Ahv(p+Sa~uM#`qS=; z}eb)Rfj{DVRuLZf@@E<`!5~#Q*oc$kf!-WdQ*>V`ExM zep3P#7M6s>M3f_t05WzBSyoaeR@PI15>0+eot>RX0Q6x)UmuA@33X;>CTb5ZE-rR{ z8x#~2Xq5uJ&x_D9T(KcmQB^Gg$)ZXY%e46$s7_Y@`#`0;F2itABP^?~u5M#CU1`AyghA$^N!D&=Zthui_0J>X{1GLJ zf&ad9BD&5lA&~^~dEL-3zN@Qid2r#!Ko+`-^6J$qJw3f`{_yb8&Sv zH$M?^no@(AyklvpaP((4tE}wG2fsfeH;jy)zkdB%%Zx3S1cA~eA(1-qK=HQvCm=M$ zl$VGWjDdv2aq>eP=mdv=K(wHspbf-r2$Aw7B_$Zlo&Rc!hJ`r|sEstdmEZRZAk7u` zbB7{fLb?kgLNLr~iGrsgAzT&} z4SxEx&HfqWRil>n_UgsAaR?<|UfH!`> zQLpc-aJ-481W>brayz%kr(K1`I@iJQ+sBiR+A51bDeSnbo z%<3Xu^4^r!)g_CJj5PY-_T#2B4$xL)tb~C&fCn-&_TE~UVRv&=7Fxu(+zxO?fm}CJ z4GRH*t?e7t$tg3wVHKml9v|4~G zE<&m7;ki$HLf+@0YwZPY&W$*^|g z6^`c+Wep8Q^dzD?%oTbg7l^FC3&Sraw*RamQcF8W`jS0YUN}@Df&hrjcYXf!36jt= zNCmWC^^a5G|Gwb<($n)&qKCFZ%yj|X;{m-w0ya0DtNrG{Ezm;_YOlp9pdFruhj-IC z`RMF#WNb~#4gF(Zqn=TdIr{d_@{r9?E(O>|AfS;bZM;BR?ziue`U8cxBt}O^(c=#xMUc=5KX%4n|+5{AuiJ`H-$eV5hJ#YHeh$_JNaVJlhvue|!?eqv11cZEUoDEqu0}Z3=Q9FP#5B`QB`Ubr`9k=(?#L zUmyjttE3dgP++jWwx;gw?LC;I%RXN3FB23Lgzh_3yDs*_RnITP!Yq)GP*75$yCE82 zqJt%tO5*OzR~TM;*!hpp%*JVy8L1eE59fQ$CSbOW|Gdn2_pYI_ z5evu)Ju=-E#TW(R0hTo%_Xj(mJ&MtCuI(9mY+F)N(ln0K!MwVU(plSsGS)WnHIz+#Ky$DEi619KKT0YG(TqPrp6KL!BQbhCcF{RdKu4_U$BXt6ccjfBCF(Jf#Isk7g|Z#R9I_WgAp zxhNz=c82gmKxQTzz^;zHU$pWm8JT+8DD+$uEcR8O-#j6B$jrjR(~Y`6gaE$i{mtWF zZ%$^`CqJU+%_b%%wG9lO!t6Z>`FkFnmiBRoET*`)xZ&qqyMV*!W%Q0afNA3g_Z9RB z1}q%h%?tyyuF+ll&pRt4s70X|r>|c={&QyLwz+%$matV9Ii%>uiHQrKrA5L(`j+U% zzab?B#UA^6 ztcppUFHMrD)5C(RH0Y_#i2pZ$m{?LGfOOnq7#beNMP9soIXrF%d<)27?&!#CxW2wl zhzv2{nxid?1;FtNL;@R$iH(hpj@GuMM{n{cCSoC=v#hM%5W|`-4UMFx>G-J(>lsiH zF-Rf^IVELRTvB4992j3tPEOGfKQ#OB^ZPFCxwa#P^x$S_r9XfET)fMb@JIX9E!*rIauVZs+xhYVq=%iDb{={2S$_ z{hzzLn_;MSYw25p_Cvw+Kn4i9c_V)VFs0o4(xpore0-F38~<@9_M(i88Hc8ZM%#Pq zFEii1>16G;f-Kc){(lc2GeOsfI%CQa)6z6tA z@!)+S|9&3fG}7DKD=RCDK&btgp6R zYHeIF20}=qRD33$^MY;EdHg`##yc>6bhK~YFrvr-=Br?6h(6DQhlkgYAYi$}>(}Kc9LLMBkO*4gvuM-?D)0T^Za+FU zmJ0ZK)p@2tRpy(+@!>uMH>K;>@d+6u@pyT8TUuLd`^2oeGPaKUb6s-^q3;dMFxzY% z_3v@5zIQ|;7g?qAXGudb=re+U&*pad@Cpi&^6~LGZ4+x+HZ6viC^97*{&(K8ODO3VwQokKFzR_x= zw#-l2WY@d=*B{CLwLj`?blx&Bpyc7i_T3=2DZ76Y?I*z=eeY>3F7-rnE((v{Gdi*B*KctL(Gm~BQ3 zE_l_?aHI3}f9%E^+8JtT1vE4?c!%ZAg8RyAYe%OwXH$W)bMW)GzmQ%Hy)cl?xuw2z757fTe;m&ZBTP4V z=H7!&F`qD-hhd?~qu}5(uSA_9VO&?m#N>D=(^cd7AZ|sNO#bipcs@AaP-Tl{;^83x zn*d`xjj*z^Hhld`2Rxvxs@nXmHQfBpol`N+cPawvq%0D=CO2X=Ry$CnME9Up8=Jp*TM937>GsMYkw{}}(;hUihL ztI5|d3;+2@FB_yJ_y^Py3sH)^@Tj1G7cw~dxF#fhje8SRp9Rn@`g#@cBdRWd(`iq1 z9xOK~a^(P0@ev^9-k3|OFkeb;zZTRFM(U5Rfnm6<4D&KGi$7SU{;|B=-}vMVCqI7_ zRF^UjW$d$O=i^?!?2n|EP-c!MMz((bWMXFa@$u2o*S~~(|MBBGOmHd)tc$br#ZZiV zMn=Ye+Gv+IfgpPcDnvz1?Oj9!0eZ$YCp%jU9ARg5Om}Jb<3?S2I2FGRT=&x6&pF}R zR$Ojo=Eq1!?cmT5K9ZP_@H{Jv9VB*Wba-qm5#(Zpw}R^R9MzEnmwJk1BJjuj0Ra(F zR;GGVKe$s)aq;uJJ;~P*4oS)65L4;)()aIkpnde*xvcNrje!Zng6v%*`pOlS7Co~2 z=PGLXuP32WFc?q|Hc$sHZf>$J2y@pF8_+|P+8w`ETp}VOs(t{4a|tQCKc~pdtfHau zQguBf1kDo&I-~MqTCx|3e}^I{dB3|-oC=Phk*lIs~dXYuh#x(dze zHE?lp%dEOzihn7&@&0ZndYly)jxi+)_#;pkK@C+2^AcrGgb z#R~)h?|c%+ZP@hX3(@2U_htzFT6%h{9vUkO>gbgvy)vosB%z_9*;`7F3M>UTVgj&2 zoFO8Ke=d2oKKEzQ%kwoV9}%@tcIxYTdUg+oQN0J3_1v7nLf#e^Ypqu$CeoCZmq)*P zWo$1~zH`J3ABY5e|9&SSDQUzgt76Rn)bl9-Q~g%L`CIeNlqDr4Ro**X5fKsS(PMA= z_nEFH@o&`C`v(T*$4_)`EgIdb=}AV#a!QH+FkDG^qTx+k9D1e}&%ecK@`HXsB;;7* z%6msI<$X2&9_&o|Z8ij;CX3ls%)g{axoA?b zv9qH`G@b9?$J(q{HPx@&&Yoy5sHrjG$ji=to@ZDsua|iH!N1p*}ya1nl!E zNtDR{sa1Oeudsks^!N6@1q~T!3Oa{A(-0E!aDSevnq8`( zprEs_PrK0J^DE(|3W~TQC}mx^V86qk?W}PswlKdHP0l^~b~3x^#;e$ANyyH!9a zYcM%!Q1H(!*K9Sq3;jAt)py-%=N-7jzU$qEL0!FUqrv%v<07%(7w6k2#}~gm!^oW` zn)&0!z;M5)cKD&_+Zy||^5K+xG@o+v@f8-|b1!;Xuw?I>wW03pyy=+tFiF@xGjDNY zqv(pms8*lN6%|O5FCg{^u1&33t7(&85*0P1k@l^ELP#sSH))JdK%j>{hL&MJQrOiM z#~lX-B;EVP#9h{)`z%vnHUr&x@{B`kEvPhep!U+}6@}jrZAxqh*xDlLyU8>qQ+>W0 z(Xc2*p6Ye{#BIligM)*Ojg21btWzM7$J4HK_%LTT_U+p@!C$d0%>vFdvbcm7vNtXV z62ptCaT1GsEG$oYd$qtt@z0)(!C#QaV+tfLZ*lCr(^a2^;a!fZyu_Ec;K8NyaS%>Fjcc3>5iV0gSA-fc|8Y1HK~92 z8hyfHATEkd6g@f;osiI>t0~o*f8#xuJ{ycr@+@mL*-+-&w*l~K$?Zn$4;~wlFifbS z#^K?Y$;rtQ!`z&l=!43@iG48r@Kp+WdgNLknnYMx(Z8GFwuQxGNIJh3zZ4a#h2&m_ z+)Y40;KsPWzkfh@9gpcA%f?HJp@qR5^dY%{RE0B>0-Bnd0Ke2m3PGcz** zDjEGAHfiWRVHPH)N4Gvc_#r{g6j;SV1DCb%MdswxMKQ7cl;zg;cA?u1h^f~+1ug+~ z1F%WAL)=y~k<4vJ$Il??w&P`-8+Cv9z)mS%4q>2u(#`50q7O}gm_kQ9uC5kKNlAfB z6}JCt@jZ+c>|}>N7m0ZG4Bnel*9;~4G3L959^K8GH<95YGqWG!KznW*Q}o>2+@Odw zG7oF+4X#s~nVA7b?tKgAFMj{t^5?f!s8d5D12PJ7a)=J{Ftt!jvoJtdqo=6~!8#@; zpFj&~gzgd$5)w)t@6Dl4w*&?S{g7A{-vCwLJ2XY7 z`uTyT7~Q-nWYH2L8199QgY$E1tEsCi%wx(c7_K!EboFd^An~^p&a@uSg+%KY)+t_! z)8JWeG8yoM9fZ`QZ<^+KfUduJ^A z**^xdxC5{`yu7?%FkRph6tZYn#=Lm(uFQ5o5sMrq`I@$hKP4DO93Tg`sMFNn@f+Q^ z!3nv_gO^M`YBDul{1ruhK7-`vEaRlt0`U!G;iHnurG3OgaFDj z_^b*bbtlI@f`WphrB>(KBk5U0MdN|fU6y*8fQMSbD7ZU1Ixe!X;9S#25vSo+w;ea& z1uhZ8CwQ&u;gL9KncMPUsF>?QZ?U-oz>NN^q@uQ$Q{6rr;C#(?zv^I-*&C>O3p=~8 z*w_L374*5@fOMs(Z&2yzqYUr~h)K0e(Dt?)GYd;-WaQnMhDZ7TxcUC^B|cM&U!Us( z&Ri{Zy6TUu)6-_?%%=6(ym)wY@I#UH_xfZW9Tpb3wYBv%ZSwho$|)Umv7j5#J^8MK zofQfguoXZHfP7@B@4k!GY*SF!lP6EUt*++t7?&w?a&l^KZEdX^84NfRv3PjIBq!(p zeRMZHJ>3FgIFD(K5wJu~8XlwiNRipdktD-a=eHBCU3Aq+f>vP`_wE(uo7J159|M+@ zC!v%##06b~eg!rMSDea?;@gjO^z`0wgt?3eLK_p&U8>Ggu(NYvzh_9%Imrvv-SznN zIr3+U=~pErxIquHV;(SG3nrxRzhouhvCgxbycHt>6$1EUwKiU^GE#Ue4oY*Sr#deC z_0{|G_g!52>34T_^aX{4P)!Z-VU4m1%3ixddmaRgT~IKl&hO9G_JHQE3D+;3XTSb= z+h^nUW_mm(OAxwtX|#kz=x&k)A1=23!hjy_hR}9~h+)vfs5~q_o(g(d_6L_!fk7TOHwOntWn>x$0qvC#Fo3(C z5+I$oJ1(}gx4*yBNeWAgKCK4di>NGqn=DYnV_FYp^+=0APsM&BJS5t>Z{HVKH`MC$ zA?Xp$8JF3n(;(tKVE2uXYr9s-IM&rNbV}fpkV4a1w1uv#tIzLF`!CK#$z(z}%rh)n z?x}Z~M=9_FhDSu?WkN!NVA2KaJ9psf6GWXDP<3TtQK(e!4Zy-#HwNR_RhZIZ>aqbR zd#!qE`J0q}3)oda0CISA

zdDUx+6+N}w)C5*M9kWdI*z6_Whpq;L$ z|EC<}1VD!zrX79$r>d$-?~ia0vHa3!HZLA-4E;#0kB7Xx{N>A+-?}dLY&|^(?mh?B z_>E*{b@dba$lm7WTf-vL3*v6d(@gmADqGCNkO1V9g3?x;Ep0!>1Jp^TYJI%6I@xJ1 z-$u~CSw!^$n09XbC#d1aPo9K6dp6`jofgC3e|W$4lRq~f-@=fgnH3b1@9v~W4Ojw^ z6fV%l(B0VlmjwzCq72p-a^w$Rr=~J-8{{{%wLJwgib+W+{CZOzP-Bg~^EGkQMW8tJ z`A`Q($3!t#w$RW}o?9RErp?hYVgsN2#7mO$5rOPm^LyN$oRV_uN7fsiq7=1O3i*(6 zwHOH|hWjVG{wKi&1-w8`%=q~D=x(#6yYg?wY0bIFXN=44t*@;nIxe!YE=2n@hZC14^JEjtzgQl7 z&#n~3VAT+S1*TQ%u`v}~_p0)Kdz+e(&}^!y?!=9~NM{SSwj~JyrWUD~PGNaGdJrd# zuq~wBnoQ(?8;=-{U^|O z%S2i*&(%-|@)JYoUpVvd@G3M3c+AtH`s0JbJod_alPa-n>PB_GVnIPcL;^aneiva` z(n!b4?Uj_3@dmOqtpS;~SI1(XKY#A>rPl2SsjaQ8+8b$lQBhG5$8px1ws=e}3asdx zbO!B&8GSdg*fmoyc|-lxuGWfC4C)vRCh-@z7<#i7_ylA@=;5KKq@?5>789mGPvyVE zi-pB-T^$vuaGLI^c3niDhqY{rKqIQ`kB&)R^k#e*dde+b@mU(=hYJ!9)XY-PF}1MB zK?$_@c^&-767yKUz-?H_%EtCIMarkY)Jhc?$4O#$Smi4~KdLDqBrNynegcVV3;+F6 zQ3VBs6rXi5bcKwJsCkXcs#f-m3n;H?qsI!t(81jk0|Ntt$qN8AY0>xSg@Ws&n>x!w zd3*J75cI>s!*A4j3!`8RT}@6wAr;6GM4YxB>j9}I_fv*y{AEGG+(An4hqKqTK`Unf z+gjS%aDyudiI`MiEx-Q#;6yOvDG_Yz+qVNsN(5jvIKoiihNzehSm?IY`-qTUytl&f zCYxGJ4NGr@azo|DC-qakWn87c+yY-W8uQjQGAOX1pi(mIypgiwJ4 zLIu40QFnSEr9rpQLjd}hzd_~0T}4IhEW1eZ%=caP#1bdmif0a;>fQ4!(@{&uIvxi- zt9cv5?xcK|itUg2(w?MiC*~|kW(qx7AY|rb&Y76oiFhZ&7nq%Js0s6^Tk(0St#STL zr&<@!&9?~d?yx~`rQCO`@A@|!{NtmaH0FpGmtty-Vue*WTZCg}RfwFd{Fs76-*>eLmw+;QV0&`uH{YacQ_v}%3%pDFcADNb{Z9gDu#%^IX#*;g>drSP zl`y7?7#eb=bXZ2O-YShB-834c6*hhHzk2)1u&APNT@)25Q9wFWx?_M5hESwI8bMN| zTN-JD77&n*p*utvX@(w=AqS*}?ijlB?9qGfz31NZ|vittJlRqUX9EZb&zkzbgvijP3(+DF_1F||9 znqy}nz=Ml>&0r&G${ZV)cAd~@wku!p^ezuhS9D#ZYckw!^LJls1A|BUX6m@mfny=$ zPfN~?h#U$jb#Z5_d4(vY{Qhc5izrW@ELynl0U@P-Q((Ug)W=rKBD-y9Fm~xh0_t*U z%PpV|BEfph-ZVY_^haFP>miG7heOgUh1zS{2hzi~*aT%;mdmBsg6W==q8{dIz*G9u z%Z>9x>qm)D#&E56;H2DjX<8}2h%hTipsLaKp||s4M5&Jr{rTlF*@@1hCX zUHZ9az+})l@ix;fiso6)Q6#?zh}GVJ$|rG)g-bNzcmt#l#1TF+_2$WN995i07VGiSl2#*LKq_B3fTYw@W2*OVeQ6?HiIwwu* z2uQ(9>)=#ONkREMx{I1jne2!g-TuJ>@0SAdkrW78xS+9_*0A5a{o<}hgQ5#C&tauB zdUK%GkPa!*@tyTMLklRyFvU4^hAWOQ=z{j%#W~Ic`6oD`qVz8`{2$o53SU|s%4?7x z`87t@@hl5A4BG!`YP`3dHI0*`pIFWv386)V9kTsW_*KZyzyy2nf|8hpk16^vZZs|? z>A9sQtHJb`bk8);E`#QThn(~sjaCivMe_R($g@fU3Kq^Krx3fsi0*zQn-qwV+&g0B#SY!<`+w0$M84LC|6c%VtH@Z<8Q&*ylf}!3 zU-rGM7x7+OWf0SxR4@v2>PVGJUA1d+Jt@^Uj!J$lZ+YY0iBt&w1?N{l=Q?QK;iLKz zkw}PBXH(}3IWmaNiKA{de~OW>u5eSa@`Nsps`;~UJi(7Rqi~}eiMgseGs_iu!peN- zn(d+|&1q&h!%A1&U~6|AVdd&_spvA~a`%k)?hB?DzN{w$+mZhD8g;Yot#l{HHv~xq zt!D=VpYPw9+giD5Ieq|O7L084cOmpXtcMjFLBeg9te)9t3NCCiWz~udSS$6u^zdWs z1o(UK*M8J~gax0-kJsHk-@#;mew$f5{_Kw(*!vIP*>8mg6bE#&0Stlo5uhfqShs#3 z+w^}u7+(SAGn1E(k1NMKsilbJ**)0{+0+6SHXiw-Ix;N2W5ZfFxGqvO5+d@)lWLxi z8Z7t=zZ+{U0zwr_KIGncdLlBzJ~U=!-@%`Gpo;9E!aAU}^8b(i=Kq(2E!6+TcjV6Q zJp)jKOI8C1&{(xAX41ptqN1X?`T5gFF|o1I-ri!sDLFa$*NhBRM`Pair|)y~3Syv% zYQPB&^%`|Obl>2I;16~V4h~lpv!d34f$y6Fgv4@ka)sKQfO=1$NGKe!E#)Z_0D-VO zOxoGmA$xl(VKAQK_O7mcZ@2>N%ZI)G?O;IjwE`+JjQz`-wiJBq7_j)tKeb~kZ^9)0 zETkVop~4~}n0R@kIyz*gpq0**9c&$BjErjQz1jqX1WqM(juuf}uRayUb8vzl%Gojv zC)jGUasnR}?w3l@$t5?`Q%i~pIM4aj9rC*dYVDsSre^p|!uE#taRw-?Ignh;Qe4pa zwzqp#dxOh19K77Dd=k-ZXlWpZf2sE5>lqm4M|vNwo7y=kU!EP>pbG_5qf~|L$L`C^ z%NrURzH@PD>+B3dF!*e0teQK-#z3(BPQl5`%L?%J)m7{4oSZuELr#rB4H-FkQdi;N zgJHL+I$MyiNc8xdxi=q{%o6n6sxvnR%9AEj%pA?4lFMGNLH}4LjVGC^S6H$=JAHk+ zn7rp-!;M8r?+vEUZ-fl z75z$S4a`P+qn6E5%|<)!*;(0@GFEkUw8`{)YQR*uRro9UTYttl1g%g!B#%k{stDvW zu$g153s2BulKB(qCko>!()w>{)Wyz53vHMh#ha|BiiI;WGO*hMkdTlJ+q%2YXvW9> z4bj5KClIB{p&wa-Rm5Trxz zA>I4lJk65tc5g#~FAN*%re7Iw2k%mf9_OF2o#(%ofic*VG z6@9Uu$`_sz^K3^TLX4Zd=QcM>5e@9hf5%|{F(6szPIeb=-MQnkGw@tmHAKCXr>iax z#7l3udTks)19ST9YPT{;!4w+Oqi#{Cd^RC5b&s9?brZE;+{WB!7;&^kz?lE5a$`k} z=MTzzjn+_AB-n+?x)sJk)&tL+DwY4t#$Sr#fPDs}j4zjbhlT8NbxPF}QoMMk62Vx_{(Pd8sTSqcN)STGnx|y?-GU9`yP14j`+3*!A=FUHdbDltKDOHr=ZhInKwfh@nBv znaAOr*+9>2twaH25htiFNCx_4dB`d8(soZzdAE9NG$qOm zGISR9hpNb;E3R-1Ankx`NZE0iW0xf$V^c9-Mkd$RPd6L&NW_A*v57oBJ|Urt4eHxA zdVQMm@#9S~snKN0g2qsz1x{M`2hpKj^faj27iIv8BfE*&#xHs;o3EDbnwl;pYEF0lEMegorvB#5qiIZIvZSjRrVF-^{?&8!*jq|*QzpLH zN;}%4eL?{Aj@1lKr`*zqlOpUC42Mf~c6I`4P`HyF3*xrGS>y4v&jDsK(Yx<3$7Ro2@!YphVmVa?1eEIReXSm=%}T`V;B;2Z1p;hARI z??-alfmv9CppqwH?-}+Lnlki@#K0BP=74}fItU~l(5~rFMAS-Q7wlc)9jwIlOPa3Y zy?AefQXY1CWin$LCLcOs*xTZXCx}V3G5k^&T9C*FzdSO?TUP=mk(c>xB+;Xtjb{KO zFR7k#sH$;(clul~juXo72(3zQskqs#)K@&D*U=Oa8k%Vo;$gVc8S)JWhte6l7NFMq z!x~%_;S>%vo@cL!`Vz5R&OKWj{sf{*dIy1(J30nxOci-SF zWdfMRe2lRBsJ6H2+Uq5Z>OU#GRj0ab(^Mi(;p{ZOu&}$a6f&XMdoYu~uvr98Y@Ml$ z%fvaZ-FEmVxFy~}gnM&_I5h2s#jmIKu^jnx7};2z>xxl-B9MA_6+kuMiUbegqZFTV zGe-l7N^zxobWgF%A%TBlyM6oiv9@l>h@gE3|3C|ufl2G|@9LE7(zHD>e1Ix72JHHs z^{pDLdHfGSj^|jw>OCwb`-0+L)}-qc)%B(quSv5nV&9yL{IN`==YJ=caRaMsg*+N- zJ^=!me2HQX-Ie@+F}kI*Cr|T`cs>4}(Kl=5leJIKr$5iA06vWU&F*VrdE^fL+{Mwj z6SFL{>Eu8HmPtyC8R+^S4(oXI&d8$2pJD~`bo*t-Hfol!on6ZBgbeO?1Q!*litf$- zApZ%{B?v$C1&FBIN&waF<7JQKvmx6a$jix&NJ8+=`$4>r<$Hi^ zZ5hfsf^Q4)@kIv);$WZIwHCsb9(NZIs4A;|0u%Js_ICexmDT%&0oo+JKVM|Yj!}vy z1w2lUk6Bpr2(pWk8DOe|JJG>po~%)dd}{NnF*!>aOn(_9;Uq&>l&9y;d@-fXSovef z3da0=a&mBZbim)s=T*~p0xe}NOUBff&tKgzA-)VRb8@ukssM57Tqk@oVaV;NK_mrN2@02jFC|(QyCZc1KF{b&PC!n&CX-m{#%RS9IyF! zxw%&{S`D%NP>Rk#EL*c=i>7A-&v@lr7ryd)j;qmmmKcdq3RrWenGD;9ry+bo!I+Sm zm3@CG%G29K|In!u_SLS`-&B|ZTV7~u(YS6-CeItic0EXU~#pFBT?zF~} z)Vj@T)?s8ABFwjAn>vCK*?$UmX%;&(-+$tV2`=^jk`k@Fx>XL zP`CKClhj?m5SHO#(2%Jj}q5XM|*^R;sG=){5(wb6YyzY2L!& zVgj>DmmhC86U~Z%RQr|ZasAId!M$H9zjNC`^aB*OVgHA*asAg^6B~Kz>Tg|Z2k_F@ zYCA#_NsN{!D`$qzVbk38KSJjiiC5fOY?>Lagjps?MbsvdSrsHP>1ns;fSbC6{a$I0{E1XcFEjj+4bex zTYSquFKkl^!fO1f(Q6CdKWO2bsN_eVdM;9cN>Xj4K4FD2`%2?R-$}c;VtzhzM*x@> z6vld?T7+zWRPNVewK-t)joA=fAUaEDF7*is*8v?A3 zD#tCNbjb+=BO{108IJNh^=~q~_VEGoi;sUd3$;3Q0_YoVdY;#k=Au(3TdK#24Jfl8 zSEMN+MTLcT18KpIJH6l;?CLo*8jW4@40c3kW?8)uI%K>MSiL;+VY`uu8Tg5HAQ$YS za0hJM*w8+;ARsFmr5n&E6-@gPj5_9RGan|;z8L%YeNv3S=G$mgHoJW~EWXbSf~pU& z!vQ#HRBn&r#oi#_tqMZRiGI|Ws3+S8liS$g)|0X%4jg^Pm;EUR0LZrD4?4;BDDTZ~ zt@L%y@ZRM2+jheu_y-F-Yjm?f?WGgW5iG4i<7^_{`>Tc(>hqXw&mC3?utmQT7S*aaA7Dt;>*)5*4^ zAMWAh7o8(~KeqDRH;-p3&Sfu$A!=*Oj8~`x9s??2TkVHaM!oO21|zI+`O}d$W)*&h;eiMU4&e@!GK+t0Cx8!e5)K5?QKj zvQ18U|D!x~a^>^GMe^^PMHWJ~GoguKxQax(x6EyMoqB%@bc!BhGgDed#ZhA!T0!S* z##-NS!VhMW!Dc1Z-CF`a-A!k7-gibhWEg00*VKB|0b{8OFpXM?t>8}$FOqNHEH^TG z4?Zx8su1h@5WqNF(;v`|{*#t*t?QpURqwtK!suW4%AJS5jPC0rFGYHUKXcm~xl=#iTpyPwrT6GrN6^P9ar?f9#8f0(TP)C!;P@l8h0 z>!icDQ4kR7M3KZ?Uo2L$v+B>9@{itj{(4xNTpgU)9H8jgSeO~w!iW2QzL#ysXC#`p z-(xPq-{jrl@Cby}lb4tG3!Uf>&Erg`{QP{+ms?*VBRROaJI2S8t)PAh_++dD*|LP# zN4Iv)N=G?(IlI&?PVO`Dy2H~y7q7P9)aS0eiaqr_{IYI3I##ZU(H@>FR*f^8Uo#n(c!0Hb4T=7gvO@rL==Z~MDQcf4^}I#~b|Z0OqaWbhNW9w@#+aYP}6 zL07AcH>({x`}R8Tf%d!mk$AULJe{uI%#_j~$7)|0GDBHNw2+w&|0al#gTM(`27}+@K6- z`qdnLd}DPv_v%a zRTxWL7$3Hep_6d0C7;Pj-ys&K;kTZClp--r#Gan!U~8cS;8x$YF9Sf1YTZ4VHY_Qo zGPdOqG4x!G{c4wz0B0LI1<_u^Vh&E+!U@9FmB>{c#5;>33s%qUb-TD}T}Sn<$^n8~ z<8XR|fAf>6Ig8cq^8ylnA;AtHcqGaEwzg@tUrc!~+S=H3*E%myK|Hvdo0~n+8-1Of zL6v5Ry`ESTYk+$Jxqw7?+93UN4p%fb;D|E7N%PtBg6W@|L1#lPIX7?w3e4Dl^9{KN zdcfhSevI2F7B^N3)_P2!N|`d)EDAy^zkaAKe&&5YfVWu%!b$e<1tqZsrUO{)NteXr)uP3p0{&t{`3pleXC`7HQV#EFlat6QE$k37$5IyJ~ z?(cgnkHyZd+YKLv9&`s_PIU7snzm7X)|<*T>c9JkoC;P~NCLVhey6NJ1Deq;xJ%nb zjrXNjyZ?8SHLp)k!1i|k)ynw!^rG-Tzco+fGG(mFiX=xq+H&l>=@(jXl>g;fmSz!W z`CVpK)}bFd%K8URt+f>h9oO6%E)HH(fQJLnpU+-#7Z~BEKi@H5Al}tW%n+M_%tWs2 za<+V})T}J&lW(`oUDGv};kw!}ZKJCVo9WMax(B<7Oa$rT!@}eH%eZTRxa!~AV1vh! z$9$IcBNU5TSGazCDWFLkzee&37~8u#gKs#IWb)U1 zWi-D2fH3h&TO}JbB!S=i<~V@1aVro+;X8^R96lx@BHHme+}b`gLcgyp*SfU>K(mIn zy0#^>!5}>wK=vB=;=~gkN{5Qg13JqWd<6kS zwT9g=QcPTV=COpEh=>S@_H{QK)O_T(j!K$P4A6u=k zs87cgHd800)P16hDUH2uC@U*x1nj<_@9)@07q4(O>1(4I{XA4`y$ci!GA$4d5Ud&p zSt4iS)FfL6cDA_cSpZ5LYP&dwesHaQ9pX~fMNhMDx)?&Tr0+iU-L(DgKG8z5M*og% z1s_$t7dySYr|;^13B$v)&7|Q)RSkfB`zP(<+6dU#Pu0iIwTI{yXZ&3tAtRascIxY% zjYFmgM>rXu2QQRFf!uc0Q{3#cw+Ghguov~VfPKGT#ozb<#0E~!wW}$oBa%?4vaG2H zg_Di{Ex^>`l97=$U+gKjwY6E>4<-d1UxR5`o!C9AOdd06J9_h;OO7LAqm)Al!_5|s zX+eU;la2UlS84Kj7hx*Sm93uL$Z*IB;+w%7z`hcsf2QM7~@?c>0^0rUucS zFHc+@gShPHs-mCf=by0!ICLE z2Z!nL)|BtX8iG#BJ1w6+W$z>xu}iZVG+|h_y(7bu^^F}+x{Dq4WPmijQ*cMMQF6iE z*#Fdmo12><*XD2O3gmlrx^fE-Zv#T45yfNha~1NLhU@9mq<+ckFGdX>riFsJy|W^2 z3@B=_3Am|A-FVo(TcbPe-qV+>%j%l*nyUjvxS;%A?4zsk)9)H?{;RN&aI&xjy-XFU zw49=mRttH%@-}2toljqCoMyDV++wDRlR*^Q%K0hX%5fUonVS%C8to4HWW{SPh|+qb zSVzZ1^`FzoiQSeKYXD#n4u+=-1Qb6hsy9bT0raoloFawEF--k&2e7;&Eou(nRE8Hz zPr@FAjg5`-ThBh~il$YYY4+nnmu%fo_-AG(uC7{R&FpfChNmtkcf+%1=hr@_LTSs5 z3~iQCL}Y|yejyyi&y-XM5=l&0=il9mk$=*y)SDeB}sX?K6Wq!>~D@LzGv zi%L^d^W<>U1fPg#aW?CdjI4~QxxEbP=%q7eODX3l(i$L<6o-t~f=ym`0lE`*EsE z?RkL8_%!&MyutYM&3#ORGo^JHX!kwVgpd>rw z?%q+hR*33j|68l>#4NY0^ilj{wbq(HM>37|om-UD5Koa?kSix+RI0jY* zo2g@FsE#`gT^?h?9GBmn?4$FWnfTLpR?P3t&x-1l0s*HBwURsUXc zSh6{@`PbxwQ7CZ4Y8jjU?d3$Ikl+<^V8q#eHngOK%dyN4$8>NK44^2Gc=^b55qT%Zs>z52E?X)Gt7^w3=^O+Ahr~- zOnRMa`qu1YGK_lp=W^0`QkI~GsrlQ_Me!VRU2=uJBZb1Y05x{w@{1gnD^%$zzonB} zBA^{VwZ#OMs6oyshbyuF;=svdhlgfgJlPZ68=$b|K=R~1YQS;GO1MD!61WijdfCGQ z=1FX<7I)E7mg-mRc?>SGZ&;>Se%kPKVR2Q4DNzplc7pkN>~2)f?(Ur6~VR8&khqoAOmqNZNEa(we95C#**v4zoqK%mmn zQuUG%Yav0a9m#)ny1N=7_Qel-B>z_KWtJ5F^UMEva3SS_NIi~Ct`Wuo{uE_ZWy+=B GeEbh{N2Wjk literal 0 Hc-jL100001 diff --git a/Objects/object_layout_full_312.gv b/Objects/object_layout_full_312.gv new file mode 100644 index 000000000000..522fa32b0665 --- /dev/null +++ b/Objects/object_layout_full_312.gv @@ -0,0 +1,25 @@ +digraph ideal { + + rankdir = "LR" + + + object [ + shape = none + label = < + + + + + + + + + + + +
object
weakrefs
dict or values
GC info 0
GC info 1
refcount
__class__
opaque (extension) data
...
__slot__ 0
...
> + ] + + oop [ label = "pointer"; shape="plain"] + oop -> object:r +} diff --git a/Objects/object_layout_full_312.png b/Objects/object_layout_full_312.png new file mode 100644 index 0000000000000000000000000000000000000000..4f46ca86091d452c52f53dcb102b72e7c0954e41 GIT binary patch literal 17092 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 literal 0 Hc-jL100001 -- 2.47.3