Warning: file_get_contents(https://raw.githubusercontent.com/Den1xxx/Filemanager/master/languages/ru.json): failed to open stream: HTTP request failed! HTTP/1.1 404 Not Found in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 88

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 215

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 216

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 217

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 218

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 219

Warning: Cannot modify header information - headers already sent by (output started at /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php:88) in /home/afelisqd/cppseducation.sc.tz/admin/images/photos/17587263121019776732_admin-dbb.php on line 220
PK! ?YUU6deep-copy/6cd2033a8224fe330c425e4a15202a6d42643dfc.zipnuIwPK  mQ myclabs-DeepCopy-776f831/UTT_PK  mQ! myclabs-DeepCopy-776f831/.github/UTT_PK  mQ7S 6, myclabs-DeepCopy-776f831/.github/FUNDING.ymlUTT_}Ko0+8p! PO"Bq6k*JUYoƫF ֲ X@MA ` % QQc!l1 ')-XQX,ghdS^lN>l|;aep_g#آ+Uow$7K8~3g%utTa+AVôi6SlہP4Ph3J+ ߻Ԥ4"+9k\nr>bMw=uBPt39T8_lFM>>4l4a>ډ_PK  mQʭ˄|5 myclabs-DeepCopy-776f831/LICENSEUTT_URK0W8Ju$f1K9W!F)w&v%$4oLLga# 䮱C#cGw"<4ﰹC"c.p:;Nc=D&pǓM z;\pb7eb4-[CZ\vu$mk]HKjD٨FtF^Ҥ*g&(0ؕn &錭홚z9=99aϏ_ߤG䛿O^wuet vBO^ VdoDC΂ h37spts; LYT}*) 84f9*D(knbC!)U mch>$L 3N;%H_d eWQt^*(9.L9xe!"5%\E*W*a2')ٲ]^FϊT3 -bɔ?Xc@ $:JJ| 1M<[',͕ W~dS&YBv5E5tPg׽lrL@dzT*ψv"DuD;۳&69 Hf C2S(O;Wjʈ>)v@G4氫jOg/yzѼ[UҪ-?$As[WwsG` 8's+bXyIj uH!`$aǪ7%PLf7#Ν<Ư'{6zn!Ju<>6bmxYoE6RbmQj60c<ؔv]52.d͗i6&YM[!1ݏqHžvW1?g}od{%cC|RhC4$\ntRmNl&n% >kW"bR Lse 5ϔKbLhzsT,%^J Qg$dm?=v#X-gΌ&Ehl 1l;bP搰ds8j\(5;3i5fugYoM闫F `FǖHց0۷ ^|u>v潋is<]Dت pS eJ+ƍ< cj¸Ԣ"jd*E{D=sCRg BgN̅٣oM]W]TMqmE6fŪ_E3HvS }(c f:=5;% 2|uʉr' be9\ɦc?m;xfx/{ %;4%OHxn8xXk[t0 ڈ=6u.!Ml4uPEH.襀 (sт.PyrK܇udަ"taVcW '_8"9T>؈y_}33ļ1v.`I!G^b]rmbRGJOUQnTv,8%g,S 4J^!:6ΒQu7 3tU[jM=˾ex]WgIs3Ң|V( XPK  mQg:ImT& myclabs-DeepCopy-776f831/composer.jsonUTT_OS0tq޸ 8!B$mb໻M(^mۈC+V}!ld :J74hoba99XnvBU߱怴XråUFՆpg;er{iLh#YWtv *SMdV;%Qzūښa yqXóNѹOBHهAe{mG^f`ǘID-į ،m.XluB*ߵ0p@)ݎ̟;:PuJ3+)qlG_e}ط`.;@Ad,匷W H7`l;3*rȰʸD3fK}PK  mQ myclabs-DeepCopy-776f831/src/UTT_PK  mQ& myclabs-DeepCopy-776f831/src/DeepCopy/UTT_PK  mQ8\.}2 myclabs-DeepCopy-776f831/src/DeepCopy/DeepCopy.phpUTT_Y[o6~8-Y. HA5H=,1\Fc$RRM(Nªxx.ϕYFHFiYmGFP8l\AP}xAjzVԔߒ}yyt?^a}njV5+Wd?9`5.`.sXJp/i^(m*jH|󢂽 o!E\W@عͽFh, ޻rf羞7{D-<'OF/YAr|e9`i(2 -P*3l\btߊ[+"VIGp9Cc RU2&,J5c Z>fPŀbK#:ԮncHC%,8UCrSd$_HkZEd{E8Y+!1-AZXp¸u5-Љ\LaʝS`5ܱzq8,.$^I4ģ<8PQ<φIO%kB"Rh+^Ih59pB29ڵP 8^h8:U'Ĩ=uuݰ[j#s5H048(8Mb Y{ǜf ϰcn(ոe Y&U(fVAT]O'[.iĖEb$WVZU7XetmIqCv0ܫK ëؚx VP}s6o)em/F)(SO|lh֘et ~yAEvtcbd \bjTU9vV,N񐐷 ߑPN _/EU{J9d!6q]2bqtB'\lQKND3=o;Y-Cv*Ut́P{J~ Un|l.kW68KlGĶDs= ҅UV86Rdo.F{zڧ:b8:: mR.̈́Jaӥ~{,r_vQuT ;l jF[N>Ƙ!kķG1ZGa-ͷFl@z9n2ݞ=JINu(Nu)SMqTXLUE/ɆUx66`a +%'֜ 5vwUB,>*dٺg謦P}'ciFm9;sv=~L9 B̈;/f'z`zl=k|1")NzV[Q"[a$K\1tҌ !o ?PB\6u@a?{Y 8LSՌO]`-9<~?Z9D-\P0aqLeF~ :o w\C}5=hj{e`xGGK e@A"uhe&hķ(A4H l@7jlMyA/Qf -5w^wkHnT sVr$\P nʻǖAndssk^4,7Ϭ1vڞ81vW撑T"iحC=5nN}G;%i )k"f6-L5ެVB̛bm=1J`LJ~7)TM_)CBX7Tq[q oV] kL-dx8?X\b/#TQ;{>!qlM3&֎ZVWtrgY& N[I E2pg gm,qwT} Řqbxb PN'!j1քwP%n#)?yڢ0Oܓ_6/殴Fc9wi%cS>PK  mQ; myclabs-DeepCopy-776f831/src/DeepCopy/Filter/KeepFilter.phpUTT_5 0 }v!/O2Wf{wG|᎕ F< RG/2Q%Lʤ OPE#U+ yU<hoĒ]6.ef >u ^$`VPK  mQa˲> myclabs-DeepCopy-776f831/src/DeepCopy/Filter/ReplaceFilter.phpUTT_}RMO0 WC;m1!h Mi@DIqv̗߳GJ^3\ gmW<)c;.0S(ʄ``L\7fBq`FyK 0 ,6¶ 1bXs +S]pjOUqQrK[^ }J D^7z9BXsU!dr7H4J8JUe,BJv0"K7zU: I ]]hX?4Ci]<,;k軮D_i;eV1oQHnh/ fp~S R$"=8O$M5`]K,mfx:h}[ ?ݜ ]IPK  mQ]]> myclabs-DeepCopy-776f831/src/DeepCopy/Filter/SetNullFilter.phpUTT_PN1 .[C DHT4ٜ &V;7&{.an16w|{$ΕJ}ƚЈ}@q, j4Tt&I-$„\#{b DW8 e`eM?rWLz5jQ3-Hj}Zvl(/&WVk 3?ƫnC>3WPK  mQ. myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/UTT_PK  mQ7 myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Doctrine/UTT_PK  mQ?3oO myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpUTT_mj0 z zXk)#BɻqWGrLOgsY&t?y-m9IJ)Ď5\,}vx<۱zpr͊>đfl#xd/VVGsxa_{nw8L cؼ~;bHIoH@Ֆev -PK  mQqe9 myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Matcher.phpUTT_]A @ E9E] t dB.xw f࿐A`hDrʲoa m"i%;kjVãx sw`X}''WDRwKfers2wc ,fƴ6wtPK  mQ?SbA myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/PropertyMatcher.phpUTT_Q_K0ϧ2hu0_?0x69`~w4e{ID5 adBxFۋdUs9l+mdnP^%t|JH-5آa%BEQ:H"Q2ByJ6𲋗!Ir'hUgkk`W~x=:|l"e\P>syrr?k *]fux&w9h'*!w#02V2_PK  mQYxE myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/PropertyNameMatcher.phpUTT_}MN0>,(@qjbU#{R)rw fckޛoٵNCI!r/ [dْ*K%`o:f<F(H O4f3CZ r[E}w*ztPK  mQ1 myclabs-DeepCopy-776f831/src/DeepCopy/Reflection/UTT_PK  mQ:̡~E myclabs-DeepCopy-776f831/src/DeepCopy/Reflection/ReflectionHelper.phpUTT_UKo0+FQ@,Qzj(raq fSwlC |MUA Xb {ꮬLsL4/&j5|`e{YV(u3l,ҩL)OÿIȍĘ>bNW В<5r#@]@*J0\ҥTxU=p/0}IԢ QR #,}6NQ޲Zg$.jt &n*)!ӺZ1v%PYથXΉib~A.yݶ&~yJ3M Ӝ-FVyN p{'%A1AYAؙcUFL'CjΖ\&ۉC//Dۨǡ0f.Ny^OS26%0y \]}Qlv ki<#PXxj,xoEiqG oEg|V0ۖ>`aEnƚx6[nQP-zlѽV7 y|uƔs] cIhV5#61Ij&FG[O36O'~Blξe,:?;Ӑ#suF|~DaamUVg3妐I}ͷSOKPK  mQ1 myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/UTT_PK  mQ6 myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Date/UTT_PK  mQGFXL myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpUTT_mQKK@ﯘC1Ez(ze4 Ͳi %i&F<{ /&5i3\ ,knͺ4&GYr1cg*?4 \BW-LL`HUuCcQREꥆiNVsPSKhh43oR;5 v~|< ʢPP1yJc7<3ud%… J sM*{ kLNH 51`wX0PSZM%{䞠qu XQaIJ_VqJ;%Z7$+ĻSx@7 4^:lm)9=k!ώ֧Il ™~3_PK  mQZٛF myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpUTT_E10 EwdD%%W:V UUNw;@.^ה p|$j#vFȄ  [xU̵O'-^85xXB{6g(qm'i?PK  mQJ霳R myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpUTT_mSn0+!P*+ZSOmlUmQ!~$!@|HN|k͘,whugCŊ1o*}"<@8msN@|VG4o$qFl`R݂qQZ;vZp`aiCCp)h!ܑ͕xNyW2M-n!OSqHFCn .FEZ`V%R. MmW)G^}l5 :od)ӳfBG@/Ş3ֈ&"<c@Fw"XڑIp5B=Jg! YTLn}|/]]\*8{y1ȽT0* -rN6:tΉtgko[ی<酘WtL7PK  mQ-h? myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/TypeFilter.phpUTT_EM 0sY.*(=K7i| m l>{(1+ (6 ZȆL5UUEȩp% 'Q #e elU0oWuЇPK  mQ2 myclabs-DeepCopy-776f831/src/DeepCopy/TypeMatcher/UTT_PK  mQswA myclabs-DeepCopy-776f831/src/DeepCopy/TypeMatcher/TypeMatcher.phpUTT_}=0 *7hPE  -!yqyNCIIv]WG_Ȳ&B64qֱ05BȨ!Mĭ7PYwodhZJV' l/a6>c 8QnPK  mQ"e3 myclabs-DeepCopy-776f831/src/DeepCopy/deep_copy.phpUTT_]P0+`BK||&xLLE@Ђ[#{Igvv4!7h4Έ:SJ.08Z@K^;Q!OZ8p7W8b+ЀG =;NYzҼ 4bV^Pwj;< JKkh3=|_.q:1ӯ&k*|$ fY?CPK  mQ myclabs-DeepCopy-776f831/UTT_PK  mQ! @myclabs-DeepCopy-776f831/.github/UTT_PK  mQ7S 6, myclabs-DeepCopy-776f831/.github/FUNDING.ymlUTT_PK  mQʭ˄|5 myclabs-DeepCopy-776f831/LICENSEUTT_PK  mQ]= &" myclabs-DeepCopy-776f831/README.mdUTT_PK  mQg:ImT& Zmyclabs-DeepCopy-776f831/composer.jsonUTT_PK  mQ myclabs-DeepCopy-776f831/src/UTT_PK  mQ& Xmyclabs-DeepCopy-776f831/src/DeepCopy/UTT_PK  mQ8\.}2 myclabs-DeepCopy-776f831/src/DeepCopy/DeepCopy.phpUTT_PK  mQ0 {myclabs-DeepCopy-776f831/src/DeepCopy/Exception/UTT_PK  mQLtWB myclabs-DeepCopy-776f831/src/DeepCopy/Exception/CloneException.phpUTT_PK  mQ4UxE myclabs-DeepCopy-776f831/src/DeepCopy/Exception/PropertyException.phpUTT_PK  mQ- Smyclabs-DeepCopy-776f831/src/DeepCopy/Filter/UTT_PK  mQ6 myclabs-DeepCopy-776f831/src/DeepCopy/Filter/Doctrine/UTT_PK  mQ:DAR myclabs-DeepCopy-776f831/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.phpUTT_PK  mQ71W myclabs-DeepCopy-776f831/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpUTT_PK  mQM m!myclabs-DeepCopy-776f831/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.phpUTT_PK  mQ6S\7 "myclabs-DeepCopy-776f831/src/DeepCopy/Filter/Filter.phpUTT_PK  mQ; #myclabs-DeepCopy-776f831/src/DeepCopy/Filter/KeepFilter.phpUTT_PK  mQa˲> %myclabs-DeepCopy-776f831/src/DeepCopy/Filter/ReplaceFilter.phpUTT_PK  mQ]]> &myclabs-DeepCopy-776f831/src/DeepCopy/Filter/SetNullFilter.phpUTT_PK  mQ. D(myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/UTT_PK  mQ7 (myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Doctrine/UTT_PK  mQ?3oO (myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpUTT_PK  mQqe9 A*myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/Matcher.phpUTT_PK  mQ?SbA -+myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/PropertyMatcher.phpUTT_PK  mQYxE ,myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/PropertyNameMatcher.phpUTT_PK  mQ3!*$E  .myclabs-DeepCopy-776f831/src/DeepCopy/Matcher/PropertyTypeMatcher.phpUTT_PK  mQ1 0myclabs-DeepCopy-776f831/src/DeepCopy/Reflection/UTT_PK  mQ:̡~E 0myclabs-DeepCopy-776f831/src/DeepCopy/Reflection/ReflectionHelper.phpUTT_PK  mQ1 3myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/UTT_PK  mQ6 T4myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Date/UTT_PK  mQGFXL 4myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpUTT_PK  mQ7  B |6myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/ReplaceFilter.phpUTT_PK  mQZٛF 7myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpUTT_PK  mQ5 8myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Spl/UTT_PK  mQ0)dJ R9myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpUTT_PK  mQyL ';myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.phpUTT_PK  mQJ霳R <myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpUTT_PK  mQ-h? ?>myclabs-DeepCopy-776f831/src/DeepCopy/TypeFilter/TypeFilter.phpUTT_PK  mQ2 /?myclabs-DeepCopy-776f831/src/DeepCopy/TypeMatcher/UTT_PK  mQswA ?myclabs-DeepCopy-776f831/src/DeepCopy/TypeMatcher/TypeMatcher.phpUTT_PK  mQ"e3 @myclabs-DeepCopy-776f831/src/DeepCopy/deep_copy.phpUTT_PK++A(776f831124e9c62e1a2c601ecc52e776d8bb7220PK!lپ6deep-copy/40a8bd3f3c402f58a58987434bf3ce25afbddfba.zipnuIwPK wi1P myclabs-DeepCopy-b2c2878/UT#"^PK wi1P! myclabs-DeepCopy-b2c2878/.github/UT#"^PK wi1P7S 6, myclabs-DeepCopy-b2c2878/.github/FUNDING.ymlUT#"^}Ko0+8p! PO"Bq6k*JUYoƫF ֲ X@MA ` % QQc!l1 ')-XQX,ghdS^lN>l|;aep_g#آ+Uow$7K8~3g%utTa+AVôi6SlہP4Ph3J+ ߻Ԥ4"+9k\nr>bMw=uBPt39T8_lFM>>4l4a>ډ_PK wi1Pʭ˄|5 myclabs-DeepCopy-b2c2878/LICENSEUT#"^URK0W8Ju$f1K9W!F)w&v%$4oLLga# 䮱C#cGw"<4ﰹC"c.p:;Nc=D&pǓM z;\pb7eb4-[CZ\vu$mk]HKjD٨FtF^Ҥ*g&(0ؕn &錭홚z9=99aϏ_ߤG䛿O^wuet vBO^ VdoDC΂ h37spts; LYT}*) 84f9*D(knbC!)U mch>$L 3N;%H_d eWQt^*(9.L9xe!"5%\E*W*a2')ٲ]^FϊT3 -bɔ?Xc@ $:JJ| 1M<[',͕ W~dS&YBv5E5tPg׽lrL@dzT*ψv"DuD;۳&69 Hf C2S(O;Wjʈ>)v@G4氫jOg/yzѼ[UҪ-?$As[WwsG` 8's+bXyIj uH!`$aǪ7%PLf7#Ν<Ư'{6zn!Ju<>6bmxYoE6RbmQj60c<ؔv]52.d͗i6&YM[!1ݏqHžvW1?g}od{%cC|RhC4$\ntRmNl&n% >kW"bR Lse 5ϔKbLhzsT,%^J Qg$dm?=v#X-gΌ&Ehl 1l;bP搰ds8j\(5;3i5fugYoM闫F `FǖHց0۷ ^|u>v潋is<]Dت pS eJ+ƍ< cj¸Ԣ"jd*E{D=sCRg BgN̅٣oM]W]TMqmE6fŪ_E3HvS }(c f:=5;% 2|uʉr' be9\ɦc?m;xfx/{ %;4%OHxn8xXk[t0 ڈ=6u.!Ml4uPEH.襀 (sт.PyrK܇udަ"taVcW '_8"9T>؈y_}33ļ1v.`I!G^b]rmbRGJOUQnTv,8%g,S 4J^!:6ΒQu7 3tU[jM=˾ex]WgIs3Ң|V( XPK wi1P LfL& myclabs-DeepCopy-b2c2878/composer.jsonUT#"^?O0| HiB, lh\Қ:9;wOR`!Kw?o0zx-*Wb-O;om4hD''QYLNU+pJjSfdi;H  G?)_dx(HE%n EO,`ܧgN4CΠ2Qf'=)樀?7.)8Y=\Cu>p !A #=riqq1nzFjq-txS+Zȋ?g;\120ޥK2A?Bn*^d|PK wi1P myclabs-DeepCopy-b2c2878/doc/UT#"^PK wi1P(\0& myclabs-DeepCopy-b2c2878/doc/clone.pngUT#"^zy/(>9ZEW1dCf)V.PO`d_`]Mw]墑A &(vb1d>}jnAe +Dϼ-Nk<{\ܻ7{ a{]w 7Nas:;{BWg%FOBozѼBuo =3 }<77W`/Z9i 2²:[1T1'>3jW=?_KꄝZ;bڻ>/.Wr/he鞬7Lfƺ箻0:aq[ɒe!L?`pg,dYqX^' a|2K4ͱ{szxI dkm[^ܰh umݖ7I@V8i)EgŤʐřGB}vCz9qDmWIVq퓣#vу/E i]˛;([qg1I_v5 k{3T`anR;u JT>)xW̖r~krmADOmV49z"`¼m!^-gҗ{۽9Gښ5>.2"/=WlpϜkzL*hd"ӆ?&4ш͙m +p0=($sX5^ f0v}>;m:1edx_dC=܎a}!|.f+6Q>湴g~jd77;1[@_[ >, h(jB+B'F} ^twx|[ O~"8$; )w }Q8`,簆J/ foC8zj{= d-̍dz$6sl"3ױ|T%zW`>;anb!wuy}MY }+br/+?E!لb.e ,S_5NTs("}nFByaꐕ!%:ڋ#<)k.JO˰V!#H jo8kH[lSV;)6e:iª:zUwiȿS6.?E.=m_fZI9/0; ³*;wW]o,bg B*,^_6~ۑlhYL,n0J8kܘ בܿodfgV;}*ƟG(V\zV951'tRkRAg;=:MUvt G@V9JI&[ٙ g20SV,OSƛ>'Ѵ]jK6W'v!Qf]T rĤB)kn_d`H]vێullJd%O迺t |&?kh%oҎ3[/⼓r^wF[c@q 5 ֛M2V︈Nr?8,x BdUMJUK]MWClM9{@ ^F#V=yb9 ]mG* *d0-4)t>]Jki6ۏ'e]e. cP9 ZiA ?O!NݚɮiI6!G24|Zgv #gPhw-l"EC^X7W:]U2Iّi,T@nēcd֐v.!D޷Yu`@x}ޏ6]E}2.Q7qlJ藚#?902*y"HY ƛ)XEQͮ;wD/{bŎCTxWf!wqRgGY6 E|V0[nL?)E(}gVD WNT~Ӂ<ӕ0t'X SN#߰ƭ;6sasL~NQΉ-#Vo$Tk'!aw9jTnd\yol]\tTֵTNu.5ԙ?$Y>l] Iؾ{29=#p,wʱ;Vz5F}YCzL_X;oAj?z^TbT̾x)a ܩgyU5̬;}kLT[k;'3cHzdJ -f >5.;jo !h'ro|:8`X7oV=簎p$FK[.uLg=8J$zIƆME\Q?őiáR헾}=qũ c.[y&j/'_T`&ڧyzq.8hn?Ta(C^xh*p.zB"x.ZjMZ |1vaS-RtG[ͮb|ҋ1Y7I`O ؄cu0Q+x!-IiE"Flj'$pS q]+xrbBo U5bl7_gqaW!R L,CmlV(νC5 Fk{;\u_fuCc-:X^?ߏ t{I3k|n6RTY^U5?pr]8PW4"w /؝~;5ſBjV=fAew詋^a vFyEK`YH{RWpE֞.u-:S冷UgE}S8RXz2w'gC@ ߮z顧kNǀeKMnZqQ/ἇ/jn1 z ߪLsԉ~ ( JgG|jPáHPjRN= !巘A|ekFgwxC;H>fq"̾+ũ[>' S\=#ÄWYb7y{;7xUL^(ZAtTAE^BPdpzȮ+*y'w0wҤ BKVbGNU]5=Ta֒ :Fpƀ6 Z9:r'v݈T9a1,}I>A琑 Qfc /⑺w--{I B`{:KפgE@t3ku$Y,;c;$+t3S_x5_|.;wT!!Q>LڲI >ǻ]ys[+|8xkbW܍%sjk6xICx6u:{ÊػE@A$^%Un3'"3r r{g6Ƹү2z>GhYNs7p9̀!x±W$Ot9缷jeRsP0ܐ9IMXM6>*RG> 1B@EW|髓Ĺ 5mmݩ6#_K@H1>5̀~HlJ@DUR JP~iIKH|!R G0^|tj˕~S(;utNh]G70C߼k-*j|xk1@TJ>Ugz0rCt1:/o"qLU}~e\an9> 30i*ļWM&I> ըZUZ77/eRђ"1r4  CNnq(eܳT+7tms@CwocE¼4,^B1@yVdHӶG{@$͹wPxē~/cs[xUν`p쌚<4-0-τL+>1 qK -ӔĀ|iW_7FA*T("u Y%=gI  q6,:_o8iX_B x$Of_Lpm'v^ql%T Y)LZMWydŒ7`:0r{B^v0Hե7b_g=%AAy[o36 G|4Nkag(9"39PB傋<?&@~!0 ~M{! dLu@dIdig2fRteD~*+-4~WoZ v!6[{S q9SjDmlM.X˖ɍ 川~MuQy7x0 7Z\}kuB}9< *p, ܉GpLק:ƒ ˶=fb6 j_>"JeLBӪ܌ҩ#52i|'/=`!\W]kd]BT )g;kĒcӋk3#[ ~4b R t9zSTVZx0%}AOHl_6&QׄmtYܿ2Zg63F ::Swf^J::k}FmPR(h"v05e*QB[!V]VL _Y㦴̮-p2+fTLYPv@g^LOL+cF.H)Bj|U%r}I'CVv>~GN)\˽؃lb,nsXz=rbEҘb=ZZ"m"?Ti=> uOCyi- Is{ѮΜH[ F/ƣ mնʩ (k ŧ;<ڵ+,4qvnt2}1ѪɳFYc &'w@}@OdrpW[ĎLUxXLcmU%h4gH "uwT5y c)+Ʈ6d}GN{K H*0[z leH)W1gTm, "D̪Egm3 Chk9j*oC7VDxkr"tƎ"ҩPW*&Sٱ9YV YRC@]OVHqF_ۅÄ9zWn/wra/k\TڷS~0'.SYXQk.?aU=XDՔ4QdKeasOۍ|b2ȫgdĵYn_ ta ɎƎ̑n>V1 S=eCfaɽ fTࣛ_FfIQQ>V_,55A\67d=EysڠҚ|yv >|VȠ_~\@LIӧ|usZe}^fnrVʁVCzNviNE,{ Z5aCul*lTӊl{oP 8?@ƹ@ꯪW9"Mt2*_W']hkWޚ(_"/[~XqGa1mųR7J&rP +;4' ti^J;KJ-_Ayko}M$ߪ|l;q%" -K>p,<C"*~M:zQ,J7Ǜe>9ġw_4_7@1 dY¡x'LVŢ) 6uzKrK{Y!QK(|MdǨ RoWraxJW'Y]+t7uS6_^O  @;0 t컂3.wPK wi1PJŨ)6+ myclabs-DeepCopy-b2c2878/doc/deep-clone.pngUT#"^{w\S8JłHSQ " )Uj`K HE4D)D)!X(*-䝃z7}y}~Xgg]k>Ǜ։@ZnpT=LO(F85> z |풾/7C8Z .SǏ_!9i'vHQ.`}Sz=uya:JwE}g|c^snE+gf~V$`0OFg FO'H˙o(տA6^D v 8`m;mr8 D~6`Scq[D Jv_ ߡNi׮ârxٗds "G3Aѳ~( mnJe0jǟ?۝>Fa7w7!oP_z 2i NJy?Prkv넠̿9i)͘VmuqŰ/",'ru$_&^&܀8\xKnGDk8άSY o u݇V ,ǃqbu .~]# ǻ?yd_9Xb;0'-I37!Ns,3Rꁳpz O5M<JɖA !՛ H%Kac${Un2MѰ{X{p,w݊OKX !O:b-jjVZIx{ʘ8^f&_x $i̷"͹kYè:I>;2:[?g4NyhR-9i޷ﬥǮ[*(=:PEW߷D,CJ,:yKgz<\,Fڰ~Q#\S^i]7DEYORvO*Jb=oɳt7xS䙯{ b'D|0ԹXZ4硶T̫޼)/W*"h UTDǬ!f %Rp;)4AhUCL0{(|R&^5ew3jMȗ:KC QܴgSyW]^02/dyzsT3x {.Ş?}>uw?O 7+*z $G{vɑ7 ;+B.L- a66b>e^Rg;fb9>K,AF_Uυl\L더̰et()feΦ4'j+˪Q/ {Tvlʇێ|%U!98=q3?V}@җ2rr#֐)=f}OdOW+.gOsf|qPQc2qbSý.{ Z\@z}v+S˺hƋ-M( c[wkȁEF7EkeTB7[_1 x)RRo5RsGˍP`OĮ.W,-b?uoQxXZ5ҌA ™Hs|j9"r졇x!2{C.|ޝm^5Ni}'D^];bMܕg, Emfպ'Ő5G!TZԐo/d~p-uk Rc+EjOGZtȗO嶺7u&ޫFMqδ>Q5<238oeIC3;wS^mrV; +Q֞zr!F<|^`hu8J `B`4b)+]'gWr^r)3$SCv77G*JhCo_TlUTHhP`U}ڑ:=TpcݢRUz`Vگ.R}yዃ՞Q:9H7%QQ! F먖}eRL3绨t^'P1LM!7`hQmRo).>mpNh7+-[l^UpbɛҬ1=N_K9p1@15, 541ow*ngͫ5tr|`ɒZOɽ%VuK86\cY݆ )zBxx]<\wƭ&3ȚمJJaaK}/+b IM`X#lW*sezU{0甞5GKRRnTR峷"Ch ;mu|E/.Ɓ4+|8gd^so"+l_$nz5~e/QPE-R^hd8 8}|̓E6tmkvFZ Y64 7GH򔉨dE Q6pB6kpNIvRm(@\ƾ5pxXhtA#had@q"x_PSB߾]Di[ iЏMnu.-2?vIn'oonCT5n?)&va&HY[J3t; s"3+g%5/dCօs=JzcjwPf'YA$*֠R}n.S*&ZAKğ=6?v'aV6u\>su!{Q]L;RHAu!Q4Qf;S{d~[.HumW_-=df\J;KBɜU|"Y W7# fm@PٗkQ-r1V-wkfL83-aH,9\eC]gtvl9ᓶA,y 5lQNJ1 чnr~)Ol7{z5"xf-J^aosuw>Β;!fS`g{X&  ~!YMYqkej\nS"=}&:z}Q a$)ɐŲ [&uKˣa~&˴c GH+>9C/Uo3 wwډ^;׷=8&Ng|Q[3z9!%a2}8Kl9E.{txɨյ 퐳MoZ4łosvݣWo8l32. SʉȠaJÄSޡY{a26];$c#Mzސ_櫮?:6i/*bt졛YRO0"/+s'C_lFH-ReKt˾FLFl֠J8ϡV͏8'$qt>NI2)f68 O*szQ+"6TM?WW*?N̖ cn}pW PFJq_(z*:Q*?AۑOâxCzz50IJD~مw>#<EwԤ)herwXO͹O+] ys[X\ C=oUL6v ]z+YQCUR>̷' 5#<W+ *"!}74׆tXɻ`nCY蓼emM默HV =8Xnl U, ij6Ԃr٨[wWy&TV6x;嬀=hPZD<6Ã،WCny4@F Iubh-Uq7Y#)%^^ ^jҕOA#rT 0&]ESg݋tL E.$^ӡ #xZvM&]Kl/{Dכ;"7q̀8qw޳<sї*Ԏ.VJ<^kv=X9ydZ[9{9 OEX+~@E/Kx?ظ8l(ҖslX }ES qܠ8[|ۧc0͈s}BD7#U1yA{Xz-6NTxdt3G[Pp{2hH KY琞Qnep/ج<>Fmҥ_bˊ.t%J( sߥ!ޚȍGVhXW@/s鱭Z~%~nH21 ͍k胗| ~)7Ow(l16YP7x5]jbȾEKMD %' j]2r oE"aP+H(ivDz{_)wY.8.(VT_x/ VU38D"ل2Aw_K#: +tpM/5$"s{JZSUX I{b)V$War{Wx ˯FHq6A+-Sd Sb]>"&eVֱdvnT-RǪLxWAsuVw97.UΛ" \Du7=?juo}͍ aj+ZnK}~U&5!CY RPIt C~pz^h7ZS?>̞cuf%uhNbJx&b^ސ{L)͜e H#tzgY\Zq,#매@_dO~o&<8l?=3ݷIGxh}̠Ί-0uK AaE*z4mPY>AgD0HaׇEdzmF9uԻ9ViiU[98*y)4tL2.-N{rM˵<aQ3Tfh?# qm']~E6:܌=dP̓YTS^êپ_[Y.Hm Σ:oD-Pbݪ$ۼ{EO}Kx5"Df/ 8~1\6&iFOfNPąU7P_nP)p8Jӌ7j08#=; žM%۫EGk0rk XeU R|p*->.kbn,7 hb5եp?˹-.J~n^9 B{H ^\@y5|4i#xk7+P6P1 }-6-y7qV+%X >fs7U(T._ruUK dEo?ضH V_3߸oO\x?NoDa?)$N}(5X9hڥ^T4MI]Zx5.=W O`fQAʩ١f6jRA9ƑWx:L+Xe_FaWVLr 14{4jF_N}JksDzYPXkS*C$+i+x@1wh=uM8*q}^!E"aD݀b=N1g[rIaO^>ezϘֹmkY9ꊼ/箼@req5ǪO e*WtMW@a}:?[U3Ɂ`wze~_ƻu-7zuζ՘_utŊ1v p#Цjb з5FTM$\s4+{4x?]q о u.p51,q#^ r&YU~J';fbjh᎝Т p!w;S5vrˬ~Y:WyWA*c@OH 9Yvѽ u"':iP:=CϺ.j4>\A2hy z3PknGkfVU$iB% 1^jFJ$S# i50ޏVJUlmp1D3 nnS+ĸ܋[sڪ!ɻ1w\r*sAEQ }Ei33zk*ɡH >>}? &CLk7_(^[j|)E y۲>h.h 'Ee6П~:m: ǢOz-̬`{>9ğ2.P ߍ4]3= `}-z;,?Jy,klAU;c-Im{nt#h1<Esi|W/c񼻺^6zW.8ˬ0-^w8{xPZ\elh ߳DK)~ܚ~"HEG\P,m|r >W;w!q^.:`ROu{W=P)5!ԘՑh_=椠~ݏQ!:k wZHaV F*۵(dbASm^Fu޽3 3r/c:er]xP,Y^[0\\lq{\OӼ\IwR<k^yrEvUڵ͎e%V!߀X[x2Fw{p-Id&v&*;9;JPƈ@Ucpѥ`æ>h҅;ۓߟ'N7pI۵B ~kq3 i v(qj#oW*vo2/0L`;zc#=5lRAzmb dYc yʣeɲl&A.}7 >o>eh{R+KEk+py+4c>Xsq6M0{c@2W}뇏b/-#t)ԼT?R} y+9h*4r T]nr oAmX@*JFN΃8 6JI~&s)"{r8v(sD!ThXe'DqBTDm:Q JV9΃q'H*()9+APt'ijh !Jރ\yW oqo[%P)+> 89;p43 xD-UͿ6]N]4 e&RSI1MV R8d@*Аh?ڡQG_0x Q[@ R _+A<D4,6-lN%W5QhTZRyD\aX>kgi]H#]i9Q_@f @c\PHQ#_%@H)]youVA  t4bgvgqAЇ{)tbM5@`9~0ĂЭӫ3]H}#|S^V, ?!MH ]05x!!} br $Y/4uz+C @ Mr=r>c@!lޫ&AY@eiuEf퇹 #n>,9bqecc8 [Rb2t?t=G <OO|\jf hGܐs]z @4 g8 +ګϻ4L>* =2*,jmjv8}S[OӌWL7j2`뗶@Fͯ޳{X2b>>}zsgqdd7`c,ޞlKK?MMMR3 hI;ļɉLIqm=z:=^!n텻_ip#obI>UzzAT,/K춋b3'?Lq5 F,QUwTegeS[j%Z|**unizW"蟪axtm3Cq9nHj{4ݽFtu;n(`S{oXAx- wL韱pe $SKuWPK wi1Pi90!** myclabs-DeepCopy-b2c2878/doc/deep-copy.pngUT#"^zyn uxջc 0Y00y gg/w1l[{==9{ja&%[,aeOz_3e^e&c/ϼu/LONdΟؿkSAL=J-:]qQK)G󂞿[U@A?pA@ͱ + MA|1+y/hy7\ hN u#k7ӫ1=$v?]R(܃Z:]o%VTB.I} :7cxꭕoƺw50߫6FH#H W:'s@';J!& KjP.NFD/$>;V"d؆NS0ehx^c빐//\,8 7w'#!ZL[Z ;Lfɳ\r`x!ыp!{@@7j90  ?8_14PFN uܡ~(rmx_*S[Rb'X4EvHIHybB[ fud- ʳbO׶tM%xFжǕ 兒^GezF\$GHAᜏ/RG2Ew a948W7bVMB<_JGkeo]qjJRM`T|Q=GAqkU )v ^N_ T&o ]ՏZjbՔa\Huܨ@&M.a&hK[Aq$)KN2~H2Ze].ЌWCMlž>7X&ȭv!5 vGR/xIE yxT*FVE{o_!ߩw?~2F}ẏ'$[K'DoÂb^9۠쮆I"zMgtk/3$sV<;(7mjt3pZch[V< ]&YYw?Ͽw:N"*F{j ffZ ̀α d 9Ia'ds5 A.׼Aяu}19b٬DGJ#׫nV6!CR X̑h 5 e 'ў~\h (nY~ax&uy O:?$\n*R$k[TDj;v0FiFjsȨ儦 ?C=^σ'D'6( ..y|jĉB\pnؒO*8#winimj'U|B&n]JnZڂ;o}~!:Q;Q03&]%uGx5<pS ;ϩE6->k&L2C Ї cb洔>`5@-I-)dp_KlBX[c t=fMLęfKZضZРo4l%othsB?ΩJ?Ș?+`c U?/'}cg|?:ne?VGXRf'yag6vHWt1Fa?b4@?9sӘğ@s* n#OXH~Z؁ikɅs7s=L=@2^ >T7}w6մ\sv>KۂWoQ+)Z0 bZmСc+:7,a/a4ݤ8.4pTVt< qo$׭cvYA[ 6Jϣ ^ 044 pIQ-`Pb,҂kN5:w^#pc/fj[ӚtecFN4~ZEb&Ֆjɼkob)6@&(ћWu$ܢ Dwi`"AZ}%kÕV/ =Z'b4k֩ };v6P_\BMVAЦ!ٛf9AYߐ p.KK\#VN%-j7̯XY3~ KA܄</}|z@B .{9lL!)4l: vEƕ,9*Fm1~dL Er)<P*DNS$8f^VIRІ:Popx(X~7L-7%ȏY Kmz4僗_?) v$`zvƟG/z27f?؎PFh҆5(&V~/bjd=|X3B'@cݣEƘeQ򛺪[ Shny˸ P/;{''j8+eQc=ޓ (1FEvoD܈?un/7JU[aDv~HÚۀDPNE_zA(jCVǧjZ}\ >_.>{'>P5-W%y N%Ec䧛-5UM3 H1KͱDqzi{~Bfxi{0/ Hbcʶ*/B%ռuWHRHqwf_b2T%JtbH=RG}BC!MfI~*JT~nЊLF,bRfi"b6>ly:xfE)*78Cw _+IrTS>bbXG8dB:-]1na4Z|&OFnQM\x֔,UZ"FYT6]すOO-kTy!5,^/3aMRYA$զ5kh$ tIWʿeO~nn[#0ե0jiV0B똳a!g+ؓSo7 7MDo_'݊lpHž <0UJɵw0`DM5Y3o~q8VRXKF2G,3 ɗ3*~jPRÇgΊ.'DLKۏ ';K G AX!"h;R` )\S{(*-OҬk+8-'OZ9}oڢڢד C3 8r,dJ܇+|\.}9#,m @CEl/im.K+VKua%Z{g{phf|h1{*A7gL Bz@eܪC1wp~ܰw.n(1&ror* cM|-9 uNYr|Kb[Jj Uk4V6έ=V<031\6S9!7B YC{2io j]ͱHvY &~ϼ(iѲR2,s'lSy`|+PK?5^N |)T-huM\fJ2 [5#t$H:oNG4!Dws#^U1^+j~ٺ@>]%W,J+쬠MLK~6^AAU6o^/NR='gy~ 5oK~80O4bG34~_Ch X[J7BZ%wē0{U B)fP@f8zq,}mN_/g;+\#1/*˱Kj+n dqZ` ﲧ0Hb[c-Rp&oT,+WP7}>kUQ-)>\t+c`U^[88-2QW{VUj I&1H(oc^.1W&h0}=񻣀4GDXiNX吙4#2Tm$67o.^VvVۧT[+8Sk^ "n.kƙ  )„/. TjI`r_4rH~ -̽qЀV(Z+`ݤx$ =J$a{-yq ȯ9MX'KdzZwu:'nkX|CߚV+3ՖX|GNW1+ʐ/)!V]*!{!j / Y{tՆ&ZLyni$~g&V^ yeҬm@+"u!qyU4F0uN+yAЂ3>pAP@[SYBU5ǯC6by)ʜKʴ$_M(Ukz͕3,|°֎mH۴td۔p|`XCB\ijA'; c~ع7oYZ Bhz| ?H4oLZ?<U_$lHcrh eSFC4]z;䮎gjCprxu3qB0k;NkAa5~`Z؁‘lc̴VLbBiVrI%3+7d@0AFI%c_M=wpÓBTa1NUٌ@uq;iMNZ5)ȽX1i0>5Oqϡx-.W`Hb@!ͻou+3K !h|S‹Aw!)]<.PDaPǝ.F ӳM-0IuN bO:"᠋ܹMѕRPLډ+6yD [+M?i-!^LLW;-4?+Jn3~ [KYՍlj}$l=7~(.m362{9>x\0JK*At0MrG1D30G3{x//R4 w| 'f5f3?O |(3f'|s,oJWR} UuI)=  Z'9VjQ'pӞ+τ'M+_TQU-JYknLyoE(h”wM Sl;RXbf=ҼMzV[z#kKjS3BNꆋwۖDxXh8P>_×\9C|% e܇kJ{ 1xest8Z 0*pEcL vnjJ[ B u,b{I 3B;%s,Y--c>v2 Km^fnkG1x#zt!ޒ!0')/jTs~?|va;ejQ9# +\m>ø$.$eib| Dk!)m0dg N~ L+EM35UlYo#<*gv#IyZJj,[!mS$y,x'fإF>y3o_|xG`-qMrps;&>B~d"\C/1Nan#y#;E«3&o1v 3#V[;c&6LJ2`.xy)5 0+:@!l&ܵ٤22F֤oM;|DO&}?Қ.Ȼk`}a&F;68҄>?oMFSP]D{bS+QPur/c0+_9t_adi/PFZyz/}<8./!_k.LcW>`|TX" O(͑U&߅&t?;2pҪ)Y;Q m>vxt̀=OR 2J:@k  1\G@zkڑm?jkKoܠv |Q$Kg@N6PK wi1PP$& myclabs-DeepCopy-b2c2878/doc/graph.pngUT#"^XgTSY׾! &U HWQH/bp,%""%ȨtfJy%ЛJ70Ό{Y+ɽs݄`1}mvPY< @i _6ѓG µ9^79*:}vմEڽ9EBT;2)ַ?,9@V Ba'ֹLTXܼu0ѥ}ʃՃ%Ÿ=T0 _ H.:6$܈t!R<Gb>WEbINYHm`hѼbP涞!)W';4Gq iD2҆h12<ͭo c2h.|_7 \q\O_NJ~У=/r{: ="eˁO7klK si-%L[N^[AltwXMA%e b6*O\[~:ʠD{2BD9N774=Oii/5֖`~3q5b&-Iσ|*Jx̷3:_'|>U!#6~Y2V'u11qMpnlk 7}NkE0{Qj:b֡$eSy`Nw]{<4x.64VJ{ĵ\rБpTxjfIUu߽ vvvsV 4VOޖ0+[XIzAT!q%)>5oL覭pgڕ/ I$(ۮ}d֍+; j x0A}azvCO9xǺΆ Bw@w3[mx~iRA|,YC\!3z"LjO_Xy.7&CK) 3ӳd>,Pe`oHTHKD}aXg743P`61iPerWiiCka0C?c݆ۮFoY;P}($Ca!KM8H&"C_ش]-|+,Nwm<vփ$R>^׌6&!G^gq 4Y\`wOVyyO%lO\qHnxB=.N54a0ÉRPqc 9]5V+.?!,?KOn-r=?eqASk=΃Q\1^-l7 FoB+UyuFXAc@qR\ ,IF\6fCzGIJa'/nmJUٷ Buca8_EA5ׯ LZ5p3s[`ݼ\a 7:7y u5ED L hc"$d]&$2$\IAm/bܰ; odsY\7} -eCT3=+cD +|&/W稽7 %Y (j*lF ,0b(qڐ'{1IlWX` .|= %nzI_D#3-ζ aPD/gPf{#cA$3n`~ l睝=&F$ގ[-N4܈r~Eˎ':wXZ,ES.ؐjTUoooWP K_G,DŁcȪXx0+x|_ǫ)յnlH[lk!To߾`czmH;?am3`- ĪG$f,8Pn5xۂKG6: $X\}XCVkWK44بRҙ<n/\"}E*a :`5cpĝ0G(Ov5>p7:fڰml eD\ 7z415$"aEc1x.JǬLgv pqr(zonnJNo^*?[2_Lu)իfELv],[7,7Vq!)ؕH$O AP$A,k,..jx}.P,37őAJ&n*2n7'e>k~y Aa W$_I$l bnDJ}rd}]T yD =.9% 6'ƿϡ?3/_C  70.s_>;t!yA/溉57Ae2,k%KA/w<6s-]?`4~ : !Ȼlg8eߒ|e\=}{祹1ڻ>03W:_mhLӦTLy껀\dB؁wN!5S뮕倯L'{F{ې-2xW1Up!N}y7p|jd7^IQ!wuܞއUy=v91I~uQ0[/#p~_%=]X ڳtmw~o^$*?`W: #7*CܝCX )][UxY<:D|P!DGR[ =x'2dgik/wT,(h,< Ǹ,ҩ\g;fN,Nl^dqܳxk9lQD1aN2 P)8qEbx] r7!tssuPX~,яƊϐ5!Y, :.O}eb֍&BOk{LUXn yˑ&%һ ]].!v8.Lxu"Z% K8J`6\l`NjnG[˹ j#uB+_M99l͕nbU f';]9V-Lgd"p׶GZ_tpmȽ*z(.^{[̝}뵲yz!(]] tTw*[1#=== #LGد(b]YMrT֡iAϕ\ݰ/t̚O:fb/cVw/Ψj-FAuX $ oN5" /x;_T%eR`=Yo_dŠuVI-U%)-rmV}bWJ \CH"$_!|5܅"?ڨPY_=7wFR7>eV6c-[~9?_?m hkɿ%mvVˍ_3ޱo`DY~#W|" qQ>1xVf&E)ONY4BNۙk<^1S7PK wi1P myclabs-DeepCopy-b2c2878/src/UT#"^PK wi1P& myclabs-DeepCopy-b2c2878/src/DeepCopy/UT#"^PK wi1P8\.}2 myclabs-DeepCopy-b2c2878/src/DeepCopy/DeepCopy.phpUT#"^Y[o6~8-Y. HA5H=,1\Fc$RRM(Nªxx.ϕYFHFiYmGFP8l\AP}xAjzVԔߒ}yyt?^a}njV5+Wd?9`5.`.sXJp/i^(m*jH|󢂽 o!E\W@عͽFh, ޻rf羞7{D-<'OF/YAr|e9`i(2 -P*3l\btߊ[+"VIGp9Cc RU2&,J5c Z>fPŀbK#:ԮncHC%,8UCrSd$_HkZEd{E8Y+!1-AZXp¸u5-Љ\LaʝS`5ܱzq8,.$^I4ģ<8PQ<φIO%kB"Rh+^Ih59pB29ڵP 8^h8:U'Ĩ=uuݰ[j#s5H048(8Mb Y{ǜf ϰcn(ոe Y&U(fVAT]O'[.iĖEb$WVZU7XetmIqCv0ܫK ëؚx VP}s6o)em/F)(SO|lh֘et ~yAEvtcbd \bjTU9vV,N񐐷 ߑPN _/EU{J9d!6q]2bqtB'\lQKND3=o;Y-Cv*Ut́P{J~ Un|l.kW68KlGĶDs= ҅UV86Rdo.F{zڧ:b8:: mR.̈́Jaӥ~{,r_vQuT ;l jF[N>Ƙ!kķG1ZGa-ͷFl@z9n2ݞ=JINu(Nu)SMqTXLUE/ɆUx66`a +%'֜ 5vwUB,>*dٺg謦P}'ciFm9;sv=~L9 B̈;/f'z`zl=k|1")NzV[Q"[a$K\1tҌ !o ?PB\6u@a?{Y 8LSՌO]`-9<~?Z9D-\P0aqLeF~ :o w\C}5=hj{e`xGGK e@A"uhe&hķ(A4H l@7jlMyA/Qf -5w^wkHnT sVr$\P nʻǖAndssk^4,7Ϭ1vڞ81vW撑T"iحC=5nN}G;%i )k"f6-L5ެVB̛bm=1J`LJ~7)TM_)CBX7Tq[q oV] kL-dx8?X\b/#TQ;{>!qlM3&֎ZVWtrgY& N[I E2pg gm,qwT} Řqbxb PN'!j1քwP%n#)?yڢ0Oܓ_6/殴Fc9wi%cS>PK wi1P; myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/KeepFilter.phpUT#"^5 0 }v!/O2Wf{wG|᎕ F< RG/2Q%Lʤ OPE#U+ yU<hoĒ]6.ef >u ^$`VPK wi1Pa˲> myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/ReplaceFilter.phpUT#"^}RMO0 WC;m1!h Mi@DIqv̗߳GJ^3\ gmW<)c;.0S(ʄ``L\7fBq`FyK 0 ,6¶ 1bXs +S]pjOUqQrK[^ }J D^7z9BXsU!dr7H4J8JUe,BJv0"K7zU: I ]]hX?4Ci]<,;k軮D_i;eV1oQHnh/ fp~S R$"=8O$M5`]K,mfx:h}[ ?ݜ ]IPK wi1P]]> myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/SetNullFilter.phpUT#"^PN1 .[C DHT4ٜ &V;7&{.an16w|{$ΕJ}ƚЈ}@q, j4Tt&I-$„\#{b DW8 e`eM?rWLz5jQ3-Hj}Zvl(/&WVk 3?ƫnC>3WPK wi1P. myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/UT#"^PK wi1P7 myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Doctrine/UT#"^PK wi1P?3oO myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpUT#"^mj0 z zXk)#BɻqWGrLOgsY&t?y-m9IJ)Ď5\,}vx<۱zpr͊>đfl#xd/VVGsxa_{nw8L cؼ~;bHIoH@Ֆev -PK wi1Pqe9 myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Matcher.phpUT#"^]A @ E9E] t dB.xw f࿐A`hDrʲoa m"i%;kjVãx sw`X}''WDRwKfers2wc ,fƴ6wtPK wi1P?SbA myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/PropertyMatcher.phpUT#"^Q_K0ϧ2hu0_?0x69`~w4e{ID5 adBxFۋdUs9l+mdnP^%t|JH-5آa%BEQ:H"Q2ByJ6𲋗!Ir'hUgkk`W~x=:|l"e\P>syrr?k *]fux&w9h'*!w#02V2_PK wi1PYxE myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/PropertyNameMatcher.phpUT#"^}MN0>,(@qjbU#{R)rw fckޛoٵNCI!r/ [dْ*K%`o:9RKJ5gɇdTJ_x70 5{^ni b6S04B^Bu p^\w eInC`}\%h-1_enIЀ!X#9U4oagZ #wLo Sƈ5%é U W/H2eơkŔgWs۵L:lל G@8oL0 4{0bϒ ʵÄi0*+FѺD3IwOWic8ͻj"M'/+z.#gy6}Po#h `J#)Բɬ-MeT,/!fmE}1ERP^<SԨPK wi1P1 myclabs-DeepCopy-b2c2878/src/DeepCopy/Reflection/UT#"^PK wi1P:̡~E myclabs-DeepCopy-b2c2878/src/DeepCopy/Reflection/ReflectionHelper.phpUT#"^UKo0+FQ@,Qzj(raq fSwlC |MUA Xb {ꮬLsL4/&j5|`e{YV(u3l,ҩL)OÿIȍĘ>bNW В<5r#@]@*J0\ҥTxU=p/0}IԢ QR #,}6NQ޲Zg$.jt &n*)!ӺZ1v%PYથXΉib~A.yݶ&~yJ3M Ӝ-FVyN p{'%A1AYAؙcUFL'CjΖ\&ۉC//Dۨǡ0f.Ny^OS26%0y \]}Qlv ki<#PXxj,xoEiqG oEg|V0ۖ>`aEnƚx6[nQP-zlѽV7 y|uƔs] cIhV5#61Ij&FG[O36O'~Blξe,:?;Ӑ#suF|~DaamUVg3妐I}ͷSOKPK wi1P1 myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/UT#"^PK wi1P6 myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Date/UT#"^PK wi1PGFXL myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpUT#"^mQKK@ﯘC1Ez(ze4 Ͳi %i&F<{ /&5i3\ ,knͺ4&GYr1cg*?4 \BW-LL`HUuCcQREꥆiNVsPSKhh43oR;5 v~|< ʢPP1yJc7<3ud%… J sM*{ kLNH 51`wX0PSZM%{䞠qu XQaIJ_VqJ;%Z7$+ĻSx@7 4^:lm)9=k!ώ֧Il ™~3_PK wi1PZٛF myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpUT#"^E10 EwdD%%W:V UUNw;@.^ה p|$j#vFȄ  [xU̵O'-^85xXB{6g(qm'i?PK wi1PJ霳R myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpUT#"^mSn0+!P*+ZSOmlUmQ!~$!@|HN|k͘,whugCŊ1o*}"<@8msN@|VG4o$qFl`R݂qQZ;vZp`aiCCp)h!ܑ͕xNyW2M-n!OSqHFCn .FEZ`V%R. MmW)G^}l5 :od)ӳfBG@/Ş3ֈ&"<c@Fw"XڑIp5B=Jg! YTLn}|/]]\*8{y1ȽT0* -rN6:tΉtgko[ی<酘WtL7PK wi1P-h? myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/TypeFilter.phpUT#"^EM 0sY.*(=K7i| m l>{(1+ (6 ZȆL5UUEȩp% 'Q #e elU0oWuЇPK wi1P2 myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeMatcher/UT#"^PK wi1PswA myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeMatcher/TypeMatcher.phpUT#"^}=0 *7hPE  -!yqyNCIIv]WG_Ȳ&B64qֱ05BȨ!Mĭ7PYwodhZJV' l/a6>c 8QnPK wi1P"e3 myclabs-DeepCopy-b2c2878/src/DeepCopy/deep_copy.phpUT#"^]P0+`BK||&xLLE@Ђ[#{Igvv4!7h4Έ:SJ.08Z@K^;Q!OZ8p7W8b+ЀG =;NYzҼ 4bV^Pwj;< JKkh3=|_.q:1ӯ&k*|$ fY?CPK wi1P myclabs-DeepCopy-b2c2878/UT#"^PK wi1P! @myclabs-DeepCopy-b2c2878/.github/UT#"^PK wi1P7S 6, myclabs-DeepCopy-b2c2878/.github/FUNDING.ymlUT#"^PK wi1Pʭ˄|5 myclabs-DeepCopy-b2c2878/LICENSEUT#"^PK wi1P]= &" myclabs-DeepCopy-b2c2878/README.mdUT#"^PK wi1P LfL& Zmyclabs-DeepCopy-b2c2878/composer.jsonUT#"^PK wi1P  myclabs-DeepCopy-b2c2878/doc/UT#"^PK wi1P(\0& Qmyclabs-DeepCopy-b2c2878/doc/clone.pngUT#"^PK wi1PJŨ)6+ ;myclabs-DeepCopy-b2c2878/doc/deep-clone.pngUT#"^PK wi1Pi90!** emyclabs-DeepCopy-b2c2878/doc/deep-copy.pngUT#"^PK wi1PP$& myclabs-DeepCopy-b2c2878/doc/graph.pngUT#"^PK wi1P ?myclabs-DeepCopy-b2c2878/src/UT#"^PK wi1P& myclabs-DeepCopy-b2c2878/src/DeepCopy/UT#"^PK wi1P8\.}2 Лmyclabs-DeepCopy-b2c2878/src/DeepCopy/DeepCopy.phpUT#"^PK wi1P0 myclabs-DeepCopy-b2c2878/src/DeepCopy/Exception/UT#"^PK wi1PLtWB myclabs-DeepCopy-b2c2878/src/DeepCopy/Exception/CloneException.phpUT#"^PK wi1P4UxE myclabs-DeepCopy-b2c2878/src/DeepCopy/Exception/PropertyException.phpUT#"^PK wi1P- ~myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/UT#"^PK wi1P6 ҥmyclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/Doctrine/UT#"^PK wi1P:DAR /myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.phpUT#"^PK wi1P71W myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpUT#"^PK wi1PM myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.phpUT#"^PK wi1P6S\7 myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/Filter.phpUT#"^PK wi1P; myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/KeepFilter.phpUT#"^PK wi1Pa˲> -myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/ReplaceFilter.phpUT#"^PK wi1P]]> myclabs-DeepCopy-b2c2878/src/DeepCopy/Filter/SetNullFilter.phpUT#"^PK wi1P. omyclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/UT#"^PK wi1P7 İmyclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Doctrine/UT#"^PK wi1P?3oO "myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpUT#"^PK wi1Pqe9 lmyclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/Matcher.phpUT#"^PK wi1P?SbA Xmyclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/PropertyMatcher.phpUT#"^PK wi1PYxE ٴmyclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/PropertyNameMatcher.phpUT#"^PK wi1P&E 8myclabs-DeepCopy-b2c2878/src/DeepCopy/Matcher/PropertyTypeMatcher.phpUT#"^PK wi1P1 rmyclabs-DeepCopy-b2c2878/src/DeepCopy/Reflection/UT#"^PK wi1P:̡~E ʸmyclabs-DeepCopy-b2c2878/src/DeepCopy/Reflection/ReflectionHelper.phpUT#"^PK wi1P1 ׻myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/UT#"^PK wi1P6 /myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Date/UT#"^PK wi1PGFXL myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpUT#"^PK wi1P7  B Wmyclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/ReplaceFilter.phpUT#"^PK wi1PZٛF ɿmyclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpUT#"^PK wi1P5 myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Spl/UT#"^PK wi1P!PWJ -myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpUT#"^PK wi1PyL myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.phpUT#"^PK wi1PJ霳R myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpUT#"^PK wi1P-h?  myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeFilter/TypeFilter.phpUT#"^PK wi1P2 myclabs-DeepCopy-b2c2878/src/DeepCopy/TypeMatcher/UT#"^PK wi1PswA Vmyclabs-DeepCopy-b2c2878/src/DeepCopy/TypeMatcher/TypeMatcher.phpUT#"^PK wi1P"e3 myclabs-DeepCopy-b2c2878/src/DeepCopy/deep_copy.phpUT#"^PK00(b2c28789e80a97badd14145fda39b545d83ca3efPK! 9@{deep-copy/composer.jsonnu[{ "name": "myclabs/deep-copy", "description": "Create deep copies (clones) of your objects", "license": "MIT", "type": "library", "keywords": [ "clone", "copy", "duplicate", "object", "object graph" ], "require": { "php": "^7.1 || ^8.0" }, "require-dev": { "doctrine/collections": "^1.6.8", "doctrine/common": "^2.13.3 || ^3.2.2", "phpspec/prophecy": "^1.10", "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" }, "conflict": { "doctrine/collections": "<1.6.8", "doctrine/common": "<2.13.3 || >=3 <3.2.2" }, "autoload": { "psr-4": { "DeepCopy\\": "src/DeepCopy/" }, "files": [ "src/DeepCopy/deep_copy.php" ] }, "autoload-dev": { "psr-4": { "DeepCopyTest\\": "tests/DeepCopyTest/", "DeepCopy\\": "fixtures/" } }, "config": { "sort-packages": true } } PK!|**deep-copy/README.mdnu[# DeepCopy DeepCopy helps you create deep copies (clones) of your objects. It is designed to handle cycles in the association graph. [![Total Downloads](https://poser.pugx.org/myclabs/deep-copy/downloads.svg)](https://packagist.org/packages/myclabs/deep-copy) [![Integrate](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml/badge.svg?branch=1.x)](https://github.com/myclabs/DeepCopy/actions/workflows/ci.yaml) ## Table of Contents 1. [How](#how) 1. [Why](#why) 1. [Using simply `clone`](#using-simply-clone) 1. [Overriding `__clone()`](#overriding-__clone) 1. [With `DeepCopy`](#with-deepcopy) 1. [How it works](#how-it-works) 1. [Going further](#going-further) 1. [Matchers](#matchers) 1. [Property name](#property-name) 1. [Specific property](#specific-property) 1. [Type](#type) 1. [Filters](#filters) 1. [`SetNullFilter`](#setnullfilter-filter) 1. [`KeepFilter`](#keepfilter-filter) 1. [`DoctrineCollectionFilter`](#doctrinecollectionfilter-filter) 1. [`DoctrineEmptyCollectionFilter`](#doctrineemptycollectionfilter-filter) 1. [`DoctrineProxyFilter`](#doctrineproxyfilter-filter) 1. [`ReplaceFilter`](#replacefilter-type-filter) 1. [`ShallowCopyFilter`](#shallowcopyfilter-type-filter) 1. [Edge cases](#edge-cases) 1. [Contributing](#contributing) 1. [Tests](#tests) ## How? Install with Composer: ``` composer require myclabs/deep-copy ``` Use it: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(); $myCopy = $copier->copy($myObject); ``` ## Why? - How do you create copies of your objects? ```php $myCopy = clone $myObject; ``` - How do you create **deep** copies of your objects (i.e. copying also all the objects referenced in the properties)? You use [`__clone()`](http://www.php.net/manual/en/language.oop5.cloning.php#object.clone) and implement the behavior yourself. - But how do you handle **cycles** in the association graph? Now you're in for a big mess :( ![association graph](doc/graph.png) ### Using simply `clone` ![Using clone](doc/clone.png) ### Overriding `__clone()` ![Overriding __clone](doc/deep-clone.png) ### With `DeepCopy` ![With DeepCopy](doc/deep-copy.png) ## How it works DeepCopy recursively traverses all the object's properties and clones them. To avoid cloning the same object twice it keeps a hash map of all instances and thus preserves the object graph. To use it: ```php use function DeepCopy\deep_copy; $copy = deep_copy($var); ``` Alternatively, you can create your own `DeepCopy` instance to configure it differently for example: ```php use DeepCopy\DeepCopy; $copier = new DeepCopy(true); $copy = $copier->copy($var); ``` You may want to roll your own deep copy function: ```php namespace Acme; use DeepCopy\DeepCopy; function deep_copy($var) { static $copier = null; if (null === $copier) { $copier = new DeepCopy(true); } return $copier->copy($var); } ``` ## Going further You can add filters to customize the copy process. The method to add a filter is `DeepCopy\DeepCopy::addFilter($filter, $matcher)`, with `$filter` implementing `DeepCopy\Filter\Filter` and `$matcher` implementing `DeepCopy\Matcher\Matcher`. We provide some generic filters and matchers. ### Matchers - `DeepCopy\Matcher` applies on a object attribute. - `DeepCopy\TypeMatcher` applies on any element found in graph, including array elements. #### Property name The `PropertyNameMatcher` will match a property by its name: ```php use DeepCopy\Matcher\PropertyNameMatcher; // Will apply a filter to any property of any objects named "id" $matcher = new PropertyNameMatcher('id'); ``` #### Specific property The `PropertyMatcher` will match a specific property of a specific class: ```php use DeepCopy\Matcher\PropertyMatcher; // Will apply a filter to the property "id" of any objects of the class "MyClass" $matcher = new PropertyMatcher('MyClass', 'id'); ``` #### Type The `TypeMatcher` will match any element by its type (instance of a class or any value that could be parameter of [gettype()](http://php.net/manual/en/function.gettype.php) function): ```php use DeepCopy\TypeMatcher\TypeMatcher; // Will apply a filter to any object that is an instance of Doctrine\Common\Collections\Collection $matcher = new TypeMatcher('Doctrine\Common\Collections\Collection'); ``` ### Filters - `DeepCopy\Filter` applies a transformation to the object attribute matched by `DeepCopy\Matcher` - `DeepCopy\TypeFilter` applies a transformation to any element matched by `DeepCopy\TypeMatcher` By design, matching a filter will stop the chain of filters (i.e. the next ones will not be applied). Using the ([`ChainableFilter`](#chainablefilter-filter)) won't stop the chain of filters. #### `SetNullFilter` (filter) Let's say for example that you are copying a database record (or a Doctrine entity), so you want the copy not to have any ID: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\SetNullFilter; use DeepCopy\Matcher\PropertyNameMatcher; $object = MyClass::load(123); echo $object->id; // 123 $copier = new DeepCopy(); $copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); $copy = $copier->copy($object); echo $copy->id; // null ``` #### `KeepFilter` (filter) If you want a property to remain untouched (for example, an association to an object): ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\KeepFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new KeepFilter(), new PropertyMatcher('MyClass', 'category')); $copy = $copier->copy($object); // $copy->category has not been touched ``` #### `ChainableFilter` (filter) If you use cloning on proxy classes, you might want to apply two filters for: 1. loading the data 2. applying a transformation You can use the `ChainableFilter` as a decorator of the proxy loader filter, which won't stop the chain of filters (i.e. the next ones may be applied). ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\ChainableFilter; use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; use DeepCopy\Filter\SetNullFilter; use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; use DeepCopy\Matcher\PropertyNameMatcher; $copier = new DeepCopy(); $copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); $copier->addFilter(new SetNullFilter(), new PropertyNameMatcher('id')); $copy = $copier->copy($object); echo $copy->id; // null ``` #### `DoctrineCollectionFilter` (filter) If you use Doctrine and want to copy an entity, you will need to use the `DoctrineCollectionFilter`: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineCollectionFilter; use DeepCopy\Matcher\PropertyTypeMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineCollectionFilter(), new PropertyTypeMatcher('Doctrine\Common\Collections\Collection')); $copy = $copier->copy($object); ``` #### `DoctrineEmptyCollectionFilter` (filter) If you use Doctrine and want to copy an entity who contains a `Collection` that you want to be reset, you can use the `DoctrineEmptyCollectionFilter` ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineEmptyCollectionFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $copier->addFilter(new DoctrineEmptyCollectionFilter(), new PropertyMatcher('MyClass', 'myProperty')); $copy = $copier->copy($object); // $copy->myProperty will return an empty collection ``` #### `DoctrineProxyFilter` (filter) If you use Doctrine and use cloning on lazy loaded entities, you might encounter errors mentioning missing fields on a Doctrine proxy class (...\\\_\_CG\_\_\Proxy). You can use the `DoctrineProxyFilter` to load the actual entity behind the Doctrine proxy class. **Make sure, though, to put this as one of your very first filters in the filter chain so that the entity is loaded before other filters are applied!** We recommend to decorate the `DoctrineProxyFilter` with the `ChainableFilter` to allow applying other filters to the cloned lazy loaded entities. ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\Doctrine\DoctrineProxyFilter; use DeepCopy\Matcher\Doctrine\DoctrineProxyMatcher; $copier = new DeepCopy(); $copier->addFilter(new ChainableFilter(new DoctrineProxyFilter()), new DoctrineProxyMatcher()); $copy = $copier->copy($object); // $copy should now contain a clone of all entities, including those that were not yet fully loaded. ``` #### `ReplaceFilter` (type filter) 1. If you want to replace the value of a property: ```php use DeepCopy\DeepCopy; use DeepCopy\Filter\ReplaceFilter; use DeepCopy\Matcher\PropertyMatcher; $copier = new DeepCopy(); $callback = function ($currentValue) { return $currentValue . ' (copy)' }; $copier->addFilter(new ReplaceFilter($callback), new PropertyMatcher('MyClass', 'title')); $copy = $copier->copy($object); // $copy->title will contain the data returned by the callback, e.g. 'The title (copy)' ``` 2. If you want to replace whole element: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ReplaceFilter; use DeepCopy\TypeMatcher\TypeMatcher; $copier = new DeepCopy(); $callback = function (MyClass $myClass) { return get_class($myClass); }; $copier->addTypeFilter(new ReplaceFilter($callback), new TypeMatcher('MyClass')); $copy = $copier->copy([new MyClass, 'some string', new MyClass]); // $copy will contain ['MyClass', 'some string', 'MyClass'] ``` The `$callback` parameter of the `ReplaceFilter` constructor accepts any PHP callable. #### `ShallowCopyFilter` (type filter) Stop *DeepCopy* from recursively copying element, using standard `clone` instead: ```php use DeepCopy\DeepCopy; use DeepCopy\TypeFilter\ShallowCopyFilter; use DeepCopy\TypeMatcher\TypeMatcher; use Mockery as m; $this->deepCopy = new DeepCopy(); $this->deepCopy->addTypeFilter( new ShallowCopyFilter, new TypeMatcher(m\MockInterface::class) ); $myServiceWithMocks = new MyService(m::mock(MyDependency1::class), m::mock(MyDependency2::class)); // All mocks will be just cloned, not deep copied ``` ## Edge cases The following structures cannot be deep-copied with PHP Reflection. As a result they are shallow cloned and filters are not applied. There is two ways for you to handle them: - Implement your own `__clone()` method - Use a filter with a type matcher ## Contributing DeepCopy is distributed under the MIT license. ### Tests Running the tests is simple: ```php vendor/bin/phpunit ``` ### Support Get professional support via [the Tidelift Subscription](https://tidelift.com/subscription/pkg/packagist-myclabs-deep-copy?utm_source=packagist-myclabs-deep-copy&utm_medium=referral&utm_campaign=readme). PK!6S\\(deep-copy/src/DeepCopy/Filter/Filter.phpnu[deep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.phpnu[__load(); } } PK!;Hdeep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpnu[setAccessible(true); } $reflectionProperty->setValue($object, new ArrayCollection()); } } PK!HHCdeep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.phpnu[setAccessible(true); } $oldCollection = $reflectionProperty->getValue($object); $newCollection = $oldCollection->map( function ($item) use ($objectCopier) { return $objectCopier($item); } ); $reflectionProperty->setValue($object, $newCollection); } } PK!DCe/deep-copy/src/DeepCopy/Filter/SetNullFilter.phpnu[setAccessible(true); } $reflectionProperty->setValue($object, null); } } PK!,>1deep-copy/src/DeepCopy/Filter/ChainableFilter.phpnu[filter = $filter; } public function apply($object, $property, $objectCopier) { $this->filter->apply($object, $property, $objectCopier); } } PK!] j;/deep-copy/src/DeepCopy/Filter/ReplaceFilter.phpnu[callback = $callable; } /** * Replaces the object property by the result of the callback called with the object property. * * {@inheritdoc} */ public function apply($object, $property, $objectCopier) { $reflectionProperty = ReflectionHelper::getProperty($object, $property); if (PHP_VERSION_ID < 80100) { $reflectionProperty->setAccessible(true); } $value = call_user_func($this->callback, $reflectionProperty->getValue($object)); $reflectionProperty->setValue($object, $value); } } PK!,deep-copy/src/DeepCopy/Filter/KeepFilter.phpnu[propertyType = $propertyType; } /** * {@inheritdoc} */ public function matches($object, $property) { try { $reflectionProperty = ReflectionHelper::getProperty($object, $property); } catch (ReflectionException $exception) { return false; } if (PHP_VERSION_ID < 80100) { $reflectionProperty->setAccessible(true); } // Uninitialized properties (for PHP >7.4) if (method_exists($reflectionProperty, 'isInitialized') && !$reflectionProperty->isInitialized($object)) { // null instanceof $this->propertyType return false; } return $reflectionProperty->getValue($object) instanceof $this->propertyType; } } PK!qe*deep-copy/src/DeepCopy/Matcher/Matcher.phpnu[class = $class; $this->property = $property; } /** * Matches a specific property of a specific class. * * {@inheritdoc} */ public function matches($object, $property) { return ($object instanceof $this->class) && $property == $this->property; } } PK!Yx6deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.phpnu[property = $property; } /** * Matches a property by its name. * * {@inheritdoc} */ public function matches($object, $property) { return $property == $this->property; } } PK!"e$deep-copy/src/DeepCopy/deep_copy.phpnu[copy($value); } } PK!Lt3deep-copy/src/DeepCopy/Exception/CloneException.phpnu[copier = $copier; } /** * {@inheritdoc} */ public function apply($arrayObject) { $clone = clone $arrayObject; foreach ($arrayObject->getArrayCopy() as $k => $v) { $clone->offsetSet($k, $this->copier->copy($v)); } return $clone; } } PK!JCdeep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpnu[copier = $copier; } /** * {@inheritdoc} */ public function apply($element) { $newElement = clone $element; $copy = $this->createCopyClosure(); return $copy($newElement); } private function createCopyClosure() { $copier = $this->copier; $copy = function (SplDoublyLinkedList $list) use ($copier) { // Replace each element in the list with a deep copy of itself for ($i = 1; $i <= $list->count(); $i++) { $copy = $copier->recursiveCopy($list->shift()); $list->push($copy); } return $list; }; return Closure::bind($copy, null, DeepCopy::class); } } PK!̰=deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.phpnu[callback = $callable; } /** * {@inheritdoc} */ public function apply($element) { return call_user_func($this->callback, $element); } } PK!GF=deep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpnu[ $propertyValue) { $copy->{$propertyName} = $propertyValue; } return $copy; } } PK!0PaJJ;deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.phpnu[= 80200 && $element->include_end_date) { $options |= DatePeriod::INCLUDE_END_DATE; } if (!$element->include_start_date) { $options |= DatePeriod::EXCLUDE_START_DATE; } if ($element->getEndDate()) { return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $element->getEndDate(), $options); } if (PHP_VERSION_ID >= 70217) { $recurrences = $element->getRecurrences(); } else { $recurrences = $element->recurrences - $element->include_start_date; } return new DatePeriod($element->getStartDate(), $element->getDateInterval(), $recurrences, $options); } } PK!sw2deep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.phpnu[type = $type; } /** * @param mixed $element * * @return boolean */ public function matches($element) { return is_object($element) ? is_a($element, $this->type) : gettype($element) === $this->type; } } PK!UK"K"#deep-copy/src/DeepCopy/DeepCopy.phpnu[ Filter, 'matcher' => Matcher] pairs. */ private $filters = []; /** * Type Filters to apply. * * @var array Array of ['filter' => Filter, 'matcher' => Matcher] pairs. */ private $typeFilters = []; /** * @var bool */ private $skipUncloneable = false; /** * @var bool */ private $useCloneMethod; /** * @param bool $useCloneMethod If set to true, when an object implements the __clone() function, it will be used * instead of the regular deep cloning. */ public function __construct($useCloneMethod = false) { $this->useCloneMethod = $useCloneMethod; $this->addTypeFilter(new ArrayObjectFilter($this), new TypeMatcher(ArrayObject::class)); $this->addTypeFilter(new DateIntervalFilter(), new TypeMatcher(DateInterval::class)); $this->addTypeFilter(new DatePeriodFilter(), new TypeMatcher(DatePeriod::class)); $this->addTypeFilter(new SplDoublyLinkedListFilter($this), new TypeMatcher(SplDoublyLinkedList::class)); } /** * If enabled, will not throw an exception when coming across an uncloneable property. * * @param $skipUncloneable * * @return $this */ public function skipUncloneable($skipUncloneable = true) { $this->skipUncloneable = $skipUncloneable; return $this; } /** * Deep copies the given object. * * @template TObject * * @param TObject $object * * @return TObject */ public function copy($object) { $this->hashMap = []; return $this->recursiveCopy($object); } public function addFilter(Filter $filter, Matcher $matcher) { $this->filters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependFilter(Filter $filter, Matcher $matcher) { array_unshift($this->filters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } public function addTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { $this->typeFilters[] = [ 'matcher' => $matcher, 'filter' => $filter, ]; } public function prependTypeFilter(TypeFilter $filter, TypeMatcher $matcher) { array_unshift($this->typeFilters, [ 'matcher' => $matcher, 'filter' => $filter, ]); } private function recursiveCopy($var) { // Matches Type Filter if ($filter = $this->getFirstMatchedTypeFilter($this->typeFilters, $var)) { return $filter->apply($var); } // Resource if (is_resource($var)) { return $var; } // Array if (is_array($var)) { return $this->copyArray($var); } // Scalar if (! is_object($var)) { return $var; } // Enum if (PHP_VERSION_ID >= 80100 && enum_exists(get_class($var))) { return $var; } // Object return $this->copyObject($var); } /** * Copy an array * @param array $array * @return array */ private function copyArray(array $array) { foreach ($array as $key => $value) { $array[$key] = $this->recursiveCopy($value); } return $array; } /** * Copies an object. * * @param object $object * * @throws CloneException * * @return object */ private function copyObject($object) { $objectHash = spl_object_hash($object); if (isset($this->hashMap[$objectHash])) { return $this->hashMap[$objectHash]; } $reflectedObject = new ReflectionObject($object); $isCloneable = $reflectedObject->isCloneable(); if (false === $isCloneable) { if ($this->skipUncloneable) { $this->hashMap[$objectHash] = $object; return $object; } throw new CloneException( sprintf( 'The class "%s" is not cloneable.', $reflectedObject->getName() ) ); } $newObject = clone $object; $this->hashMap[$objectHash] = $newObject; if ($this->useCloneMethod && $reflectedObject->hasMethod('__clone')) { return $newObject; } if ($newObject instanceof DateTimeInterface || $newObject instanceof DateTimeZone) { return $newObject; } foreach (ReflectionHelper::getProperties($reflectedObject) as $property) { $this->copyObjectProperty($newObject, $property); } return $newObject; } private function copyObjectProperty($object, ReflectionProperty $property) { // Ignore static properties if ($property->isStatic()) { return; } // Ignore readonly properties if (method_exists($property, 'isReadOnly') && $property->isReadOnly()) { return; } // Apply the filters foreach ($this->filters as $item) { /** @var Matcher $matcher */ $matcher = $item['matcher']; /** @var Filter $filter */ $filter = $item['filter']; if ($matcher->matches($object, $property->getName())) { $filter->apply( $object, $property->getName(), function ($object) { return $this->recursiveCopy($object); } ); if ($filter instanceof ChainableFilter) { continue; } // If a filter matches, we stop processing this property return; } } if (PHP_VERSION_ID < 80100) { $property->setAccessible(true); } // Ignore uninitialized properties (for PHP >7.4) if (method_exists($property, 'isInitialized') && !$property->isInitialized($object)) { return; } $propertyValue = $property->getValue($object); // Copy the property $property->setValue($object, $this->recursiveCopy($propertyValue)); } /** * Returns first filter that matches variable, `null` if no such filter found. * * @param array $filterRecords Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and * 'matcher' with value of type {@see TypeMatcher} * @param mixed $var * * @return TypeFilter|null */ private function getFirstMatchedTypeFilter(array $filterRecords, $var) { $matched = $this->first( $filterRecords, function (array $record) use ($var) { /* @var TypeMatcher $matcher */ $matcher = $record['matcher']; return $matcher->matches($var); } ); return isset($matched) ? $matched['filter'] : null; } /** * Returns first element that matches predicate, `null` if no such element found. * * @param array $elements Array of ['filter' => Filter, 'matcher' => Matcher] pairs. * @param callable $predicate Predicate arguments are: element. * * @return array|null Associative array with 2 members: 'filter' with value of type {@see TypeFilter} and 'matcher' * with value of type {@see TypeMatcher} or `null`. */ private function first(array $elements, callable $predicate) { foreach ($elements as $element) { if (call_user_func($predicate, $element)) { return $element; } } return null; } } PK!:~~6deep-copy/src/DeepCopy/Reflection/ReflectionHelper.phpnu[getProperties() does not return private properties from ancestor classes. * * @author muratyaman@gmail.com * @see http://php.net/manual/en/reflectionclass.getproperties.php * * @param ReflectionClass $ref * * @return ReflectionProperty[] */ public static function getProperties(ReflectionClass $ref) { $props = $ref->getProperties(); $propsArr = array(); foreach ($props as $prop) { $propertyName = $prop->getName(); $propsArr[$propertyName] = $prop; } if ($parentClass = $ref->getParentClass()) { $parentPropsArr = self::getProperties($parentClass); foreach ($propsArr as $key => $property) { $parentPropsArr[$key] = $property; } return $parentPropsArr; } return $propsArr; } /** * Retrieves property by name from object and all its ancestors. * * @param object|string $object * @param string $name * * @throws PropertyException * @throws ReflectionException * * @return ReflectionProperty */ public static function getProperty($object, $name) { $reflection = is_object($object) ? new ReflectionObject($object) : new ReflectionClass($object); if ($reflection->hasProperty($name)) { return $reflection->getProperty($name); } if ($parentClass = $reflection->getParentClass()) { return self::getProperty($parentClass->getName(), $name); } throw new PropertyException( sprintf( 'The class "%s" doesn\'t have a property with the given name: "%s".', is_object($object) ? get_class($object) : $object, $name ) ); } } PK!ʭ˄55deep-copy/LICENSEnu[The MIT License (MIT) Copyright (c) 2013 My C-Sense Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. PK! ?YUU6deep-copy/6cd2033a8224fe330c425e4a15202a6d42643dfc.zipnuIwPK!lپ6Udeep-copy/40a8bd3f3c402f58a58987434bf3ce25afbddfba.zipnuIwPK! 9@{4deep-copy/composer.jsonnu[PK!|**8deep-copy/README.mdnu[PK!6S\\(@cdeep-copy/src/DeepCopy/Filter/Filter.phpnu[PK!>ddeep-copy/src/DeepCopy/Filter/Doctrine/DoctrineProxyFilter.phpnu[PK!;Hfdeep-copy/src/DeepCopy/Filter/Doctrine/DoctrineEmptyCollectionFilter.phpnu[PK!HHCbjdeep-copy/src/DeepCopy/Filter/Doctrine/DoctrineCollectionFilter.phpnu[PK!DCe/ndeep-copy/src/DeepCopy/Filter/SetNullFilter.phpnu[PK!,>1pdeep-copy/src/DeepCopy/Filter/ChainableFilter.phpnu[PK!] j;/rdeep-copy/src/DeepCopy/Filter/ReplaceFilter.phpnu[PK!,vdeep-copy/src/DeepCopy/Filter/KeepFilter.phpnu[PK!Lbhh@:xdeep-copy/src/DeepCopy/Matcher/Doctrine/DoctrineProxyMatcher.phpnu[PK!!t-XX6zdeep-copy/src/DeepCopy/Matcher/PropertyTypeMatcher.phpnu[PK!qe*deep-copy/src/DeepCopy/Matcher/Matcher.phpnu[PK!?Sb2deep-copy/src/DeepCopy/Matcher/PropertyMatcher.phpnu[PK!Yx6deep-copy/src/DeepCopy/Matcher/PropertyNameMatcher.phpnu[PK!"e$rdeep-copy/src/DeepCopy/deep_copy.phpnu[PK!Lt3Rdeep-copy/src/DeepCopy/Exception/CloneException.phpnu[PK!4xx64deep-copy/src/DeepCopy/Exception/PropertyException.phpnu[PK!-h0deep-copy/src/DeepCopy/TypeFilter/TypeFilter.phpnu[PK!Z74deep-copy/src/DeepCopy/TypeFilter/ShallowCopyFilter.phpnu[PK!0);zdeep-copy/src/DeepCopy/TypeFilter/Spl/ArrayObjectFilter.phpnu[PK!JCdeep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedListFilter.phpnu[PK!̰=8deep-copy/src/DeepCopy/TypeFilter/Spl/SplDoublyLinkedList.phpnu[PK!7  3Udeep-copy/src/DeepCopy/TypeFilter/ReplaceFilter.phpnu[PK!GF=ėdeep-copy/src/DeepCopy/TypeFilter/Date/DateIntervalFilter.phpnu[PK!0PaJJ;deep-copy/src/DeepCopy/TypeFilter/Date/DatePeriodFilter.phpnu[PK!sw2edeep-copy/src/DeepCopy/TypeMatcher/TypeMatcher.phpnu[PK!UK"K"#deep-copy/src/DeepCopy/DeepCopy.phpnu[PK!:~~69deep-copy/src/DeepCopy/Reflection/ReflectionHelper.phpnu[PK!ʭ˄55deep-copy/LICENSEnu[PK @