ࡱ> prghijklq@= Sd#ݥ wdzK<x]}pՑ- elp8U$HN.$o>"cm wkS1ArRk.k](.y%\8HA'Ǒ:\웞ּy?km_!p. qS_B_.DGo"#ʿ7 19KFn'ok@,sp]a2sØSz޻xcw*[B{GI;We^w2=>W)E==n4 q5Y OΝ;'c|1,V ^\g0/m%n-&rqڦ;mSn&Up6Qxmb޸ 珃=,@,z|_ ޙu`z~\p~!cs2ⁿR`sm#<mbj.Ϲ{&({u_c8b]:9c}e}1%_&E݉Əa}Iat.`\[ fx}Yd}]7@4}oY埋K$ǸA18^>F9פּw=h<tݸ/{ɵj3qkyK.5^\064~t<&܏J9;]_}=t<ϛ`Iޮu1ށvTؽ#ƨ52٬߱B6KKdy'ԯ_k~nb!?FeQ.le1Hvy~l ycC Ra6N6I^8  G|cC?>h&ds ?;QA31?2$yqaﵓ هInt^(}|^ИK ΋ {6|^b'yA~v=LyAc~:džƦa)|^~Nr kry Ǧn:쬐d{K_1HO 55 In4vawRNԝ+$L;$P[Fc'?ک'a$7;!=)&+$:_ vޯ$Kأbp7zy@as}LIn@IH|9˿Lb\r }wbz38:}~oF8~ >|o&q-nw}{+OXh_1|(|ݑϢ16+<`T dq,scvb t|>U:w[Q#19E x*4t,*kmݝ- !`]z}~\=;¦pAw_"}_OD EM+Hۼkj6<2n.߉W>rNSq[ vQ&鼠1Z):Q=)!N|Tz*>j$G7 }dGT |JIցIB6sdGTg3 |JIցꩡփ8 z eNI!._mpM~ GS;$ɍ0N ة&ڪ$ɍN~ȵh 5X?$>MaȒ$7;!):PFc'?|5U3!򞂟8SB9=?]q[xb|eG2 ҇G> !. Ô{}Qs;~\gR 07׽xww]%č?ÿL[ 47C𢈜ys"g3IpZ1þL/*p3po[nq^7y9 vM[[v; e\ @wN|-[a_C_T:d6pcm8GqFRf+Z9r{x?ΛbcvOxk( ƻA10 S_НBvxy/>0a6$泟2~ߛ|tgb7e$tgp DvxnXKhrjYS 13ߠ;Y3c=uSZ72.g UT3\Θ$?,e+W;G&y0,/El 1INˉ =L!Nr A3178/23N6;ɍ CrF+{.gLK ΋ {^Lb'yA~\h}6|^ИIrZ\N43X3N6;ɍ CrF+AN:/;7lߕ6&ܟ6;ú;`wv'T@mIn4vCN.Fc'? i촶 In4vC^NOX;ɍN~jG=_oF1}/Z~~lP\f}ڷ |e}n߮MbY{۽BatcTUuܠ̈6%׍hwm~CasGL_s#>C<׀;4)%pdKC.Awaݜ4w cؐw)cOB6I^8  GbCܥ=B$]yfyAcw !YRƞFl!vu.e^;1ؐw)cO7I6sdK{sI>/hL.!6$]ثY~Nܥ}M5?} }Ţ}'їK/ _\?.0|R*yHO^6Ͱ+t.qU&;'ܑڅz,y,=qp̗埿xm93)c@1薚2Mܽ;Н6MLm*}Xa׭o-UeHߖ9BН39< ~t <*x3!ǐ|WCC]Y!MakuRMwo6>UuBN |Q6 3sܪ鞿UyIϠ;`ΩF 9T2]Xs$9s5YΩ/G&y0,/ElRJ9TJ7@6;:pN%9h|^И9TJoB6;:pN%9h}|^И9TJD6sd8JF>I>/hLF@ցs*ok,aqd8JF81auX3s Nha؝SM`'YiNIcuNNk d81&vuuq89m7Üsz}?/yxAyG=MPaY/= 3V8~͚79yc;gs3 "9}}U:>iqG"wsS9즙LǂXG>9XӃ @4-^ee`NΆt0V8Qig*ͷLM2':՛:֘@ց?d(}I50I :5248bw4 a`y(bt^И@lHցq_M6;:52fy^p|^И@lHցs }dj/hLk 6$ǐb'YFޜ) f  :52j{Uqt`_#c_+ 9鼠Z5Yf9)ԝ˱\;| '0Oo=nvQ?siEJe\ܥ,-*1<;lw1m.fꅶoSatqSR+gae ]t<xQ1_hwq+]/+~ _X/)>ωDn|}N) |+NoL6V-g]>p?p&Cj <c}+>OX_=D+S :~ԛ3*13u3*.W挊3YΨ+G&y0,/ElFR3YΨ=B$gT4fyAcgt d8b}هIց3*2ΨhF{:pFŔ{Bd3Iց3*2ΨhF볙:pFeq{E3YΨ8y$hkr_ YhܗXם#XwvGj!g4jӺ `'YhIc%=uF4v~:Iց3ajyƧ[0֊E+w+VK̾r !j? Mx_+p-b]ty-|5y-[[g|'vOЭs{3 ׿(eWN8:_dv|?_Ut뛈޴ñVq!oMsoǴB/ :e?p|Oܰv/_M<ɸX)Y>f}?.WsfQ&鼠1ۀؐ!cOl!vu6dA31ۀؐ!cOl!vu6d^;1ۀؐ!cOwA6sd {sI>/hL6 6$mثi~N܆}MpYdYߟDLVޭg욭Mϙ3D:O;`@ց+0`E뻰J+ w d8B9Ma'X^8 ;l\!^ B$WfyAcw d8B}$هIց+0`E{:pp{ld3Iց+0`E볙:ppq{Y8y8nkr_ YnwIםXwvGj;:ppìvJ;P?vuY}4vZ[`$ 50itu7̮`W'pkvw]sUbKX8I?1_l5¾L*;ۖ{8toZ|f/xy>9?U1@񦽧tt{zm:Y9}vuF1);;.^ͶwbMNM|ϼ,D*l.Di OKY:ꙗjx ȝ^E>슑;]-e{w(xq(zǪlFLx~@{޳s?c@1Cp^՛C@ցC?d(}WIs͸ClHցCq?C6I^8  GbC={=9IցC4bC=`هIցC{bC=!vud͙l&1Cؐ cw6;:p25z e^;uZX͝O{Y<zņ5)ܧ}^;uc[=ف=zݣh=SG=>;uGϳ| -xdx:`#}v ПȳDގփ?D@֡?g-؟kRyľdz3y֛zЛcof:fO7ӂv w=-uG@֡/g}yI$62N*m0LoCswUS1cVn Inc1_PNG  IHDROҿĥgAMA IDATx}\TUǿ30i?ˇR0QJ!35SJsHa+P"iBknRhJW uIy 7QR?.is ssss3eF uIKK3Lhs'=k  `0 K=o#h4I~;=Nq 0k$+&"!"G~)L.4W&(4 gGHG_7祥WI}c< (ҺݵzeKV7Wlj6foCKPO]Çv^ rlllii/ N_563l~emioGSKskkChѶOsw;W0UnR<~wп~(uۚt ~:ZZV'͋McTRțzx_zI积a?i_yvxG PD4ۡe'ǬC~i #@ªOo֪ܲ~Ŧ;%7H id 7ßY'gWQO^}r(eΜg|~F@CY>;Voc׳fktg喽U,`0^>9|⪇"F:o?}3G_ߥ ƩV -ϯn+2fMġQ?^\ƓʒGV_j5/<{`٢_,'.\/!,H*O*S GsL83m~58a<f/sC>]uvYh_¬?M/d3Dz:)u`k84D?=itp8Nmmmmm?~]̝@Ũ{"KJ uVM:y3l_pg@eI֠WZ=l⻌FLހ^|3N쑩p%_|r1ӳЋղ7{}z$>]9б[>>~;z{dg =L߼Cی'W' Ruso| <5İdo/,M/g̜F= eNp4vz*GsJomX>Dsìvظͺ45p:NҤv q-=|OÅ,rΘVݙ䶝oFeN.iM%v ۓymbrNsvwvڙ=;?xX_Z6cn wP+{XV.㞈.s?)7=yo>cc069ޥQ:jߔ?RO{ݭ8[Fs[{n|W=&h4!C.dqgʺ3n ~jMeI2ɟ=F>4ԓG{PO~ O]<:=AmxyԞyw>~* ?Q6\3EoGstW1}0m^0Θ0kz<_Y[fO_76kk]~7͓w!9wp%_bqo;RT0Yn&TYWbᰍz9ȑ}86v8h덦[nZuV;1.dUw*f9?8:SݮijZ{8P\:`+\EYw9AČx1o:SaP;^tP pc'/Ɠu0o1o'b.% -ISN#v*`ˍ;:k՟qƻ/JTGY M띴Pl晋NNgHӓWaqz!.( J|jx*|a0lɳ6LBY% 2\'?blNYKn!%-zr8/nwqS9j&1DO16r;׊!Lr)Ì1iv;P/U5J?vr6E\rʣhNbH-~KG #VڤEor;܉YPl6ѵâ3) Iz.$rJHӓ6ya$AIK?<^nrBɒ9O9 a?\`{l}u=. Y|NuxØ)򐏾l%dIH.>,. a -L!2ڠRƶs+zѠB'?k]V/Gl?m3g1o1ooW9$t{nd S3Wq)oMt`F@OMRѹpGW2:~wFz3 1saɻm8mO88PfZ5Ufs0%6I.b,hLƓ)eY\ (UY͂MBs*+om|'Z? s!n.)4iƇGS ԃo\vQ"a' ᰊѽvw*I g J ȕJ%l= >Հr!#tN8*w9꺴[f]Fd_$eJy-] bfS=ֲoW 1ܨ2[Fl퉧eBPMP v ׮` v [0n/(<);0LG;=%%Eqc0]rl)));YPgy*؞&QCdM<&{>UasCf% =cJ?"]`˗Vgy[joMN(-=bTMx۩yy& QCN_ty$^ǎ+---(<*=,ePˆSV+ڌ5GgϞGOOMMMMM#uʁ]ӦM?E]/]nX 55xQCU2Ko®^ ǎ+..VCyCfvbRvbRv^I<*1)`0Ț% w%%%r-7ǍNTiAHk>c'Nඝ^RS ɫRVVĉ5Q_u %%29dCf[dKX;@```HHHCCXVTVVVVV-mR ,X{#i tz߾}<ӓ KIIIKKCX,Vnb^:==رc(**)S w{.}sD &*rr0NLFH* ٩zJNNF{ǍEt"UVM|VB<jH;ƾ|#oիWԋ㋊>#;w.˔}6 ))F)f4z Թ*y{-$Q=F:p@xoKNZ @X&ԟzꩵk8qBAbbb_Tdn{UUU"#HƉIj && L.E"< KIW^`Zl6nǁ,Z%dZm&MX,B/yM#@RV???IX H11sR^?U~N@j5kh@a w*+B8y.ARX,@zmm)R' srrƏϧJGҲPRRrm:$4׮1ͨgdޡz* d2M0u{v2eܹs`ʔ)#oDd@uuuXXlE~;Fܫ;A111GZYYYYYI>- ` SDR0`@yy9еkZHOZƫJDNN8qzeޡ{}z+KT_^^^dᠰ{u.:$Fכ#4m{rrYϩ=~TFU_xlfTuV~ݷo_;v, #W;r)o7 Cdb&Q<"-->%%a|PX~ފ[,&WaԥWycN!99`0)Mr'lGDZ@:YSV{uuujgt$y&;W)L8qϞ=eDIAG>%mC:s媪{{`;*Ueqy߽ 7,-\ډ)މCts^rN(_YAj>}j-Tnς: MytᗡԶpqԃ`G<Őw=yu`1oAyJ!CPT;0pPV>ZMam>wb`Z>Z h ЀSNC(!QιАNf5ɜAtRlpǁ Fn)ꜫ`Ȱ/Q@1]fM݃ŋ>X`0 jݙ>Ms7Ymw:?^hiټeGBB A_bs'kÕĄD$or_D:5(L/hɄvRvvcHzCyp枏uXir)DUӖ!s( 6`0Pl Iz}Ch-^;~ ,^UO':~7gN9|4$[ז ?"i0/_Wk;z /Mm@#k7-KMMq2&o6DVMnlU7 w+U`41J;)J6oU$mԵۆ]_5+5ĕ\mQVUY10cΜ3gܙ9g;~3|몿dϭ#1PI&S%wx[7/?{!5W?,qtx}?w? fm8vm٠}]u[/Fd2 Ǟ|;wY>rϞ AŁΤ'O>>G>[ܟ. |d5eSl6'ȑt !6GVBWjG=_ӷ`5~ot_ !I< k~\?!jX=ͲΧ%}Gn`8>_G{~d`GxENe~)ێJI]X.so !>nl;o>wѲ_;劉>t!=3?I{ra' \ў{c6]wu,m˂Ӻ 1Hj6gCgN!:'YePw>ݤ~)zBG-פowGBw?=|}iG_͒q2NtYۉmb;Fp8LKw(̡ITOeW`*=.^߶㶲Ԟ]%#}!x7/''(~y~o}Λ-M\e5^1Nݸ,`0'RR? ^~zk~Lg׽츚DuRnϴm0'm~~gꅤ[^ |ޞ=g !~v|-7~ 6+ug,I.s M6,~|`.[,Rw"Y1I'|+Xp_9 c{7B<}'}Tz]*~K7/$NUPqc^bP>~U1PPʮW?wz5!~V֧|kB.ꔻ4v@|(qMIʉ #x&P;@_PsK%8Ѷwؑ$ ch5ښ|sk<+W{n}v]wuСd;iA=cF8,'e d[? 6$ׯ߶.$!=^-@mX{[nyb=ΗL+J˕&uɳIrg]=x;,Ji}Ʊo|ܗ#nL1!w׌Y rAδ5c;??կ~nBK7oNߺVB(O< 5nhO<}gϞW_}ꫯ~Wm6sfO\ C2hڳu֥RB$+&R6ˡguE>@8ؾ?!D*_~Yq$WRiU!\e*7 ГMa;U)u؞k*+l6q0WиP%W(m-96i 6TVNʾM~j CmW"!}%Vjx ͛ciY(R-?cf/Byc'u+r7]9ܱ+o}$(qLkB,..*3a v~ӆM);m IDAT3vM6}t{RӹeJu")R0fg3?d{&ωf "(Bx8҆,7oܜNtP{>nϦәn(tSv.s1<`YQ϶ՅBfb/>SAlbSlb<GbH>N\),ِnMb6φӁNéaZ* : p:t<Gh:\9ġ6^~ӆMb??B מz-t4z CkZCX:d ċÑ܇*+:C!d2_bt)o ө^:zk~yVn^tˍFԹ)@L틋M#!7*27[͊H*jZ=†2&}v)*:O?/~):&~C|3eqq/V{n-gOr۟͞kˡ|~㝔>,--O(Pu~'ߞzz NnVܛ􅅅hFIjaNhCoQCgWO'>p /pԩWz{yJB}JS-! C~ns; Bx`<~BǏ'^زe˲U Ir[>x2\ۘjdΝ[lNj/^\YYI4,*yA~Cep'jC+FbaaoxUW]5?? ~4!K7q}tB\xq׮] 7+_"#gO:uq!>dhT;I[ly;6q|;s ןcǎڂII}{w}xϽxaaԩSǎ[XXP&g%Ud,$0SÄ}*P;@_&U֚.X.$yB-B7K+++ٝW_}_W :M|~#V{"}ɞ_~駟^_c:V{p ɞ^znx~䃕\Yiact;y ssdC!ANm?>/瓝W]uUU.Di)\AW֝\dBg\oI-}o؆cZ$^:Oae _wn! O,= y@Fݣ55CM@G^9u5t[WV3/ rDU NؠS*9ىȡNIJbQnݺW^y%r>Pu)%:iSaZ dBW^y%5פi|j_xq4;wNd:.\%cǎzJ-rdYjolꋲωtJ`jfJۻ QڅI?Epr,8j ]V}#`G*W}tYwl新հ#Ԍ_ڝ fjG>yK/]X.X 0eRl/ ?%|PB6uY"Rae(mJD5dtn$"gArZvݪo6@JDt9KXV}3缢@WE+չ@'iAM*biցa8h: }P;@_ց``8*ׁRԌ_}biW\?]JnJXKVQYC&tm4Hs?7īvjA^|(=!]+&Y[ʐ4Fe+ɹHѵGmeHh8Js6sGQv#WZVY;G>-!Ȯ$ms\?enR/G]"mZexhAl^uKze*ꮷ9ʪkfCAئ$:U^(쥈Ef9+\@Nd,`Ư2ۣ늳ٶSxMǸ[1V*re ebQ{SquV j-woy[ӖrFzb-:p.P;Duhj /vB}KKK5_jU;VAhP;@_@}^6lruÇf<{ `qq^vStžN:B.r05FN8t}R}Ta.;aurBe4'ѝS(r6Ӥڕ #A_ۓ]-NK? e/;v-hu'xVWR*#jo7 >(Ӳbhy{k'VjzNrB6¬:GWzRy!TeixG~DF祒,*.51d(H5vkٺnVRʜDw('ECܐO~tSv|9hGN]8=rn$۴͊ !JQ6P5xծW$E'H˚|8U+0e;k!ԬyI Uu)>ul9Y%؞Us,sQC|hH&fEhH<p|Ģv0r=g}{c %IhR{oujuL5y[P;@_ݎb!ĽBPڷnZKA8jU{'&!j /vB,' 0/]Πv< j0,ki)0/"Vj6a3A >9砿26~٢v@MZwp +sqa6eӁڡM^Cd9&2tvh\"ڡ$s wT:\ײ&_a@P7!{ֲ|ݲ ,uP;JV\Y=ZfmtAr6muP 3ϖGa6l٣3 *=t:et @_@}P;@_@},Gט=BK< =+<077f> lZZZ9 DMл'?77Hx/x-sw,nSq-.;Vmy,h.m0_+9MpC/ɳ$qޱI9_n]$>V:v9DE_,6w =$:N公 ?t]P#w,T\͟C,nJ<46D%3|:{e83wpeݱRdE&ԞܾUU7gn(Ʌɖ3ݟnNYXΪkeN^JO9'YoN}:֌u9U5Pr9(99NW$.ԫcܱ}rM+osӮVA״+dUv ?t*Mjn+uh)Ne$xm\nT{O e9L]*ӝkO0_Ų$!{&eryZ Q[BJh,+ʣmag77 }>rʝJ[6/aMKh.!($璄cf,XdM^!mwZuoW̡}7h/GY>zi16XKi=N⬞LoB<Ç&+ؿ3Xt[neT_8W.@RJ6=R{͏퉶`"ɴȧٜc>JTr o6 x'ݨ<@ngjݴ9;dخ; =WTIޱ =Kӡ.n8?}-ܜs<`R6[ Uaam;=m-7e7{~L9[s;w-7,nvF:n[ko6QfLkg7 Dwbh8ZfoPA)›Kes<3|xTlW_IGAY$kEu;2R6RL^-MݴܡTwZvD^~ -XHUv|k@; ]^.9\Ej2$%qHn(g]ٛ;9Ő-Cÿ1'T\nʷo[m4Cr4\T>f!Jd?-u../[QWKjZwlV*b;@ hcAV|w=jh ݤ.P;@H 6/vvx:p` csϾÇ+ $wqne?j?fb{Ye %A}xUW/Kc5O* 9A^Ed^ԛ%"߼qsE)ˠ';ڑz4.*o~(ԎԛqUwk7v8ˠ'4.Bi\=y5|y 4ˠ'_? (ˠ'ʛ_7? ˠ';ڡ)AO^Q;ۛ58MeПf gBdЇƿsgWOW[x󋋋 =|-=t:5'>= B<@_@}j;ܱ:/+]xW\ZZ!?txa8'#Y\\D^<_;J/vj Mlpխ'{: n޸O.h&՞׬P >em]="yzv8&kfRY&Q7-n=6&E K_l{U\ls]]! fɟ]=Ccu1gXIYRU^lB9tzD'ѵApMj J康?nCD]Ϣ *^hz+ġ,+uiseǻO87܈Ew]W,{2AP''/vBݽt?+}ؕW\5@jV:Mm t:]𡃖g6ĉ\ ~J-}'2Rnڰ津R٢v R˞Mp4. @h>j#=ĉDŽt4 Z.5sss=kkk9Ni^BjL&dֻ{LrJi[9(nO*p8'hy@!XL5p8ԝ9&I͵}4!PZ0:s IR{:Dh0Ll&6 Ak;K{ Ģv&}6&(l6F0d6N&ڳ5l \)*Zd2ǢvKx<ں.!~pBk{&ymϾEjݍZ]1Nx,b6J'2w9."^jd2I}0L&9e{^@i^ʇfC]oNB̖4š4,I߻͙t<'ei3ݦOjtKR{8?O/\ Pjk)R}lw#ʄwT ۝c{J@t~b:@!qݹ+2P&@Kb;7q=\lOLod2saD-S\ĥp}2!nk4]O> Oĥ=jKb{%7:r;.{oγO:OCu]]5I1^^Pq3_CXR qw4;@\j=q R{ S٪2I6R{=SLoxgc*@8R;ډKvpĥvb;@8R;4K5Xx2'<Kɭv2Hy/'͏1sYA-hrMf,\~WЄt4Dv{*Q.'{ˤ{,x%CL42 ;%^:]Gw 4eerEEbQ{;_M)o]QӬ:IjۂF [>:L.,hdAV-!rP,h9LzF~Hh^,hWbiA!rbK=. u|lRv #ĥp@\j'#.ĥp0 hq=\lYz\a 7<ՃVCvLoĥp9W yPyL\jMo,z< !Lo[? M=c5%qWM޹nT!R{>7TI\j2I6R{=SLokxgc*@8R;ډKvpĥvb;@8R;4K5X`Xhq=r A[h~t!jAD9FWЄt@ 4:(nO%4ʕXeot12[{ȇRFb=`A-h}rX-}e5ymA-U'VChڅR2r1WeAҹv'O`P9qy^+1эtA,q3_Mot; sOCw11 R{؞czc@iwW6-^T6a!E :[KT6pĥv#.ډKvpĥv,hkAg_^3.C<‚ƌyG-y MHW `ALj \m4ٺz!'L1nмڝ9XA;lJbK=. JOx|lRv #ĥp@\j'#.ĥpfN2*'.하dhq=s^0ay6xCvLoĥp35^sst8!Kb鍌ΎRW31TN\t}JLotc-o44K\jW@+&nĥ}Lo 4'PݕMo%.3FXHlq#z,IDAT4upĥvb;@8R; qԎ @8R{ 4ufw^M`wC<‚NlnѼڅ&+p& oAȫA&.0 W/ -S{%4YɉF4n pzvgvt5ӑޫJq=:pډKb;7q=\l7hg6xiq=\lfM9]:C\Oׁ+Lc@K!c;7wR{ozc@ib`33H:CNՓK+PL\j۫2ɾ5;ausqgCrrh qy^2,O)\>ieBۉKힱM{xB&.j11LLsFBK5YC4TZhq=hlOjz#.Zƚ:S(\r9[9m!is R{=sMo䐘Q)3)*Lk86I fR{ =rFF9qۑ7}rKp6lηijst@RRRi&R;5v߄x8( 7a%55.Oh ecR;5v߄x(^s2v߄xؠ)i}>ykl(k>yz`n a 5:=۫IڻF 0P b{e }k dt` ۫LȻF>X@>P b>P b*!@lC% b{AlMw boJk2NBlMXwMnYe !`,o5X9007!5 z$,k 6[Kbo5:G]\>G8,C`}V C{݊ `v{4]`j]{G;| Ww|F WK5llml2@<@_O//X@!_߂\.b%*`.3sY!,hظd'{^c!]+ KoA[kU厱 4Bc=4uԕ3,e>y]Gw  u6>y-L4ߔRB`A <-h5yD @2-hoy ,hrmՄc.vyoZĜ%l~|s'vb{Al 67!7 Mo #j BlM K\a 7 X,!c{Ԧ7)v߄7r^WAlMizc^51 +7_}Lo<)=v{x@^ Φ7> WM\  J5;^钠p>y@<@_ b;@_ b%Cl's)tD{gs˞O&ԗ"䞜Nz(el˷yJ,?BݦcgʣeJQnIj(nn-\H2{Z)ޖ-p T!BbutQ[&WTyf9XԾv9j-h%˿)etEMBPgWOe5ymAWOsvt}.ڨvaATcU2HS"; wyeC6Jε?TE jwV5iK/]sڙkY­"UrR{uBIh@ 1>t0Pu u}|EHU?9:)u/^ 7p^:s qpvj /v b`qq1;'%ؾ-D5yj /vj /vj /vj /vj ұB;@T%5yp æuâ?*77IENDB`nG.48#FPNG  IHDROҿĥgAMA IDATx}\TUǿ30i?ˇR0QJ!35SJsHa+P"iBknRhJW uIy 7QR?.is ssss3eF uIKK3Lhs'=k  `0 K=o#h4I~;=Nq 0k$+&"!"G~)L.4W&(4 gGHG_7祥WI}c< (ҺݵzeKV7Wlj6foCKPO]Çv^ rlllii/ N_563l~emioGSKskkChѶOsw;W0UnR<~wп~(uۚt ~:ZZV'͋McTRțzx_zI积a?i_yvxG PD4ۡe'ǬC~i #@ªOo֪ܲ~Ŧ;%7H id 7ßY'gWQO^}r(eΜg|~F@CY>;Voc׳fktg喽U,`0^>9|⪇"F:o?}3G_ߥ ƩV -ϯn+2fMġQ?^\ƓʒGV_j5/<{`٢_,'.\/!,H*O*S GsL83m~58a<f/sC>]uvYh_¬?M/d3Dz:)u`k84D?=itp8Nmmmmm?~]̝@Ũ{"KJ uVM:y3l_pg@eI֠WZ=l⻌FLހ^|3N쑩p%_|r1ӳЋղ7{}z$>]9б[>>~;z{dg =L߼Cی'W' Ruso| <5İdo/,M/g̜F= eNp4vz*GsJomX>Dsìvظͺ45p:NҤv q-=|OÅ,rΘVݙ䶝oFeN.iM%v ۓymbrNsvwvڙ=;?xX_Z6cn wP+{XV.㞈.s?)7=yo>cc069ޥQ:jߔ?RO{ݭ8[Fs[{n|W=&h4!C.dqgʺ3n ~jMeI2ɟ=F>4ԓG{PO~ O]<:=AmxyԞyw>~* ?Q6\3EoGstW1}0m^0Θ0kz<_Y[fO_76kk]~7͓w!9wp%_bqo;RT0Yn&TYWbᰍz9ȑ}86v8h덦[nZuV;1.dUw*f9?8:SݮijZ{8P\:`+\EYw9AČx1o:SaP;^tP pc'/Ɠu0o1o'b.% -ISN#v*`ˍ;:k՟qƻ/JTGY M띴Pl晋NNgHӓWaqz!.( J|jx*|a0lɳ6LBY% 2\'?blNYKn!%-zr8/nwqS9j&1DO16r;׊!Lr)Ì1iv;P/U5J?vr6E\rʣhNbH-~KG #VڤEor;܉YPl6ѵâ3) Iz.$rJHӓ6ya$AIK?<^nrBɒ9O9 a?\`{l}u=. Y|NuxØ)򐏾l%dIH.>,. a -L!2ڠRƶs+zѠB'?k]V/Gl?m3g1o1ooW9$t{nd S3Wq)oMt`F@OMRѹpGW2:~wFz3 1saɻm8mO88PfZ5Ufs0%6I.b,hLƓ)eY\ (UY͂MBs*+om|'Z? s!n.)4iƇGS ԃo\vQ"a' ᰊѽvw*I g J ȕJ%l= >Հr!#tN8*w9꺴[f]Fd_$eJy-] bfS=ֲoW 1ܨ2[Fl퉧eBPMP v ׮` v [0n/(<);0LG;=%%Eqc0]rl)));YPgy*؞&QCdM<&{>UasCf% =cJ?"]`˗Vgy[joMN(-=bTMx۩yy& QCN_ty$^ǎ+---(<*=,ePˆSV+ڌ5GgϞGOOMMMMM#uʁ]ӦM?E]/]nX 55xQCU2Ko®^ ǎ+..VCyCfvbRvbRv^I<*1)`0Ț% w%%%r-7ǍNTiAHk>c'Nඝ^RS ɫRVVĉ5Q_u %%29dCf[dKX;@```HHHCCXVTVVVVV-mR ,X{#i tz߾}<ӓ KIIIKKCX,Vnb^:==رc(**)S w{.}sD &*rr0NLFH* ٩zJNNF{ǍEt"UVM|VB<jH;ƾ|#oիWԋ㋊>#;w.˔}6 ))F)f4z Թ*y{-$Q=F:p@xoKNZ @X&ԟzꩵk8qBAbbb_Tdn{UUU"#HƉIj && L.E"< KIW^`Zl6nǁ,Z%dZm&MX,B/yM#@RV???IX H11sR^?U~N@j5kh@a w*+B8y.ARX,@zmm)R' srrƏϧJGҲPRRrm:$4׮1ͨgdޡz* d2M0u{v2eܹs`ʔ)#oDd@uuuXXlE~;Fܫ;A111GZYYYYYI>- ` SDR0`@yy9еkZHOZƫJDNN8qzeޡ{}z+KT_^^^dᠰ{u.:$Fכ#4m{rrYϩ=~TFU_xlfTuV~ݷo_;v, #W;r)o7 Cdb&Q<"-->%%a|PX~ފ[,&WaԥWycN!99`0)Mr'lGDZ@:YSV{uuujgt$y&;W)L8qϞ=eDIAG>%mC:s媪{{`;*Ueqy߽ 7,-\ډ)މCts^rN(_YAj>}j-Tnς: MytᗡԶpqԃ`G<Őw=yu`1oAyJ!CPT;0pPV>ZMam>wb`Z>Z h ЀSNC(!QιАNf5ɜAtRlpǁ Fn)ꜫ`Ȱ/Q@1]fM݃ŋ>X`0 jݙ>Ms7Ymw:?^hiټeGBB A_bs'kÕĄD$or_D:5(L/hɄvRvvcHzCyp枏uXir)DUӖ!s( 6`0Pl Iz}Ch-^;~ ,^UO':~7gN9|4$[ז ?"i0/_Wk;z /Mm@#k7-KMMq2&s3!U?ء_?7O=9)kuɃ;o<-o_=}⚫o֘RSgsx}偷~-8jf[8vmFO~ܷwיo8&x<{ɇw}d={vv8b:+<cX|dpN3\6ṴfxdXN?mOB/ YM]hKŌn_9c!o;3Op!ߚ_WC;VO?qs1uӏ !p8|*WU?;?xûw] v7[_76Zoq[ ʹذ8[Bn}{Λt!9+gg~kʅNؾ%eOof뮻n6i$}gCgN!:ӗ2Xvr7M}pת':=_o&v-$xS'<|K~ÿYW8N񄡘$:m;Fp8LK>Jop0/'zҟz AkvVw>UڳD8c/dB%dxw~͏|7G>~͚KFWڍB g6nV~0dBŅnGy ^H^?+S3O옼+}׃Ǯ9isI| ݴ3?y'>Y!?o~vzO?_?wӗyK{jr-]:Jvs*$BSt:Ln#\đ(tpC'_|%ٷ#~`/eœ|g'-b[ꚏ~?<[Iɳ~_q䙟y>eo& |ܷjy/lԍY>d`\Va*7mTVg}?54aWᮘdo4#0دn\F{7B+wJޤmϝJ;lv۲ಗjujxL[zB然-2:*lpC7N~FP.\ Hi^ݼٗ:F|)orkt5@,U<rWcG=vWtn<'TjqqQ:o۩\F IDAT J~~ӆM_Lr~ӆM f_պ8*$m4Ɵw kzVѶg^{>y<B}؞Ӷj)PѶ !Fh$KDyXjo޸9!DIl::u2gO/XBD!f31~/>iۧŪ/>8x8AApzOiہM~޼IyMdzt p*pv'c !pFؓbL^1 \zu:'h<M'KOMVoڰI}pQBX城F[o7(Yswxq8)1jw8m/ h8BL&ӑE[<, 0sssVQnۇNS1ɯh8NшPhrޢ}<xO&QOČPq-]`AZ~ҽ.:t.9Nm; 5ob(t2@ Fn1y튯owrc͹ei_\\8` hei+^63 -}:rsg">X<xϽ_>P+;N,`Oq~}^qگ|3n-..*ǫӞ˹aŃSG4Ly~V/ %ҒzKo\~P7tJ\/=Mh4ZXXF$-aO#Z1/~$xO:= !WV}xϽ7oJS%҆]Ry.Z:|w Bx`<~BǏ'-?e˖e!4ϱ/ 6UO~2ܹs˖-xqqŋ+++I旗E9O)WRUH8$O?zn4 !n/^uUiGzZSw!ŋwڕ.{KT\9|ԩǏ !VVV><IWyy9๊H !l;vl~y lP}e'رch|2\/Ti_^^NFۻ{ N:vUڳ%]Y$]QRF״K_ qAҞvQtĉVs>iViNPyOGk9tBځXғދn)/[[[(_. Eho/Jky2EO &O{}3/SO=5??׽qNk}ee=yo䙗^znxꩧ~䃭츖li,;/ ˖I綦Ban9yٗ8GX:fy瓶_>|UW]֎+IKJJ'~(~-#dpܨ[mLjbCҩ)捑-S6ECY.FQ|{jmmMѓ-(s9^챧zcN=itQ2ᄰF]WPQ&ƍۙ{r6w|\UtF2t&ȭ^9tl(3&*z;w'>ǡN$mM8lNIBۓ&(iү֭{W}5Au׭['oQհL&y&͛J5\~MyG IZixh4:w &]p!{؎;:f\U.y.E:D!5gY+UGStZ:H; "{lcGt⬏(ìpY;o3[ט+IE#| LvB 1y ҵ8)_.ߞ|\d-K7QO>G:3(ѭ8e,ҮJgFq݀PyԓO^L'`LIgtS<@ʣg]u@zYtfh.';u٬ogtBK+gzs9 @,|9o)Cvs~!h/ @,H; ĂQ:s0\9ja88f/@,H; —v灋jZǵV|I`8'Oig:oHsn:?Pv'm+.[JYvs-UL9sc-tˊ^}( wgSEneoiM@iϦTgN.9L%E~rJؗe\Q_%ڊUL6o8(e>%B8_? s->T1 euK[HHrsMtQ1-mn#J_i (e&rWS;/|W*:ue|$+)vgce)-ZLqAv&i-Z0qSK[,]'Ɗ|mϵM/k pΖs]ֲlju#s$e+to {-]'ńpȉL ([̗=S6XuƥÊci4t03G`EXO{:="rqǫN8!*RہXv EiWLTw0ٖs^n`_s?1!Lt6=_'eʖAR@*[xwD =n: Tq '4/.xw0H;g#Q,MufY߁ [z XgߖͲ.,݈zb<핯Z2]e3dl-&]W( Lk3bE2E$6`}l$*s% zrQTt/nyMWtl_1滃cC,dnubmD]:Κk>7Ү{뫤ٓu8U^'/^kBY*ɷuܪ;ij~^%btKKTec]^A篆NNKڥȍ)*AuVT.u,k-XxQxwp̋<;f=.D=fv,V:| `Ӵoݺ`ӴW:ibAځXv /#:\.1Z1=PLkhՋw=^>@>e "OuG(z ѩwjYĂޔtVG/_`Ǚ>|}XXl-ݸO'^/ŗ޺j2^xQۧt1źVlk>䜬8-m*N\!,EwL۷IicosI@nŶ~=V4yl).-Лk}/4ż9 %tI7>h=Q(k?t=ݜKΝPEHl4:[Xng߄ū"F4wyފvi[jcgW\)V/.Xyq˽'<6SބOz7rzn.ɗ ~_-{~Rs]R+fplWkpQ=&?ZZ~{Xo?Ç&3Uo0kl\fZ_oݨ xVu^DvwVԯDn(7ʚ*.V2ꗤ}Nֺ7m;i=Q:*/=Yk:5{Ӳhn`z'ѶRPXӡHIk尬0-/IO[*/jw[px&=.]YYwna_J"MlDZ!ٚ76nDz ޥ^i6pvqM3ްQM˭4`{PmTnNAZKd_^i.Nz%(9ꮾVX2m4\]]i1Zin00I5{QT'{W,o/o,yOΠ̭R<#UG)VϭbhE}N)2۠X-e5 鷹߶ZߖTҗVTg%;{gV8u-FH THv-.eCGHu@J:W۷m;`/..jاH;/..$fQ$f“vg!@,H; >ot yN׺?vݴuڭ{4%1h~:Ż|y *:MfL-~]B:A$_y_N;y "*}]{vޭcײi'<|Uܤ]=!ĮDU#p.|:A$_g^]NuHJ|]tHyǿ]<|LA]X7׽MHtxvA޵]!1|7yv}nqqQg>Wwv ʲөӶ= N@-Xv ibt\wUk>{wǥ%>G>{Ombghnqq#/ލ/{v ibAځXt9 >ٽ,tB'L{qr#A=bϮf /ӌ#Z]X&n(i=Og!_*< 7˛eM[Ke TU yݓ?z,i[1+3YZ?lm{NYZɉqZAv)eAb߻91{YΰJ{2UnఁzֶK}i*ҁ&G%݈)`Ɨ=lpԛ}&aXܴabKKK6Wiہ)^>Nd26w~nDdzģp29;rJ}2!nk4X֭ۧw=p8G hlp ͭ/J nmp8eKfd2>i F~^>$h0LlV\l0 r om =3O)>{^pr#GJJj~^>h20fh4 fdRv4Ċ??=0]~Y5JpL^u< bֻnkJ.g4s}U?xgGRd=xk~aۮ:Nx?tl6m sKu4WO%qt4&`21-3 m) uGJ_ò8ͨR>.terd:wJ? se +6}AS,5ΖxbbŲՃvEjZ_iV67moUsˁwu[-=R+u/~m;.v Pmy 9%mkm%Y+0Tv׶wy=/j ո۶&]W4^m{-K({TD.EaV)NJ޶kM1j)*[ɮh7Z||Y%hZ'ngNYsFu υ?&_oK(49պM,MvɺiMʳYE˩ϫպM`[n}Kh*)d)Ιk|`8?<QZ SHɤR床u :W\/t K,0t߶gyr;Fi}+Wi{J7_i׶7/z\AGv{m{+Eo\8@ќ_Sբ7/+6v v~^޼͜iť{Wm)漲zLX^X Pkᘼk[Eo1E0JJ{ö]â7x4WOޔIŭj~V=Um`9nmOX-z(h'ml P+nnek^nKuV6Tԁ#0C¯ӶvvN S.MEJ{x%ht =/j >BغO(iҥ(A"QՇ^d^w[=K{+%htHfh z͗Q6Jh^/ifJ 3:z֓]i}3K\LR3HMJ;ᚡU}ڍ{k^%E9e.=p=~{Jv{+=~^Nkۛih@C׮Ikȉ˫M\6Ub[Jϵk5el*Ж'(kwQ,(ZW{W!<'s&6e[Jϵk*=U`9yJuٗOfMаÀ_iv(+Pg O 5J=p:(31}Ga_im+=~5=~=5:h6Vkרot!ͯOB]SYJ{k<+׮IK/h/џp{[fb5U* (kR<aXtȯ{[&7s~Q'siOТGJkZgvokהQY<9ޗ5: ek{{A%IDATJ;vvNWi{J;k{J{̵kt+֮I.c"WX5q֮.oǯG[pYnvjЍ=~E^*sv Q~~֮!pï[m~֮ɝ~W[ 7V6m=~ǯӶvvN Me vï)A!ky16J蔋Ѽd.Jt_JƼH%h*kшB2uY֟=2jn2JW6NnMY Z4D=K꺴[F/ l=ɋ%hh/A Gq#0^x47~>[F@4bar2J6"scyH5oRbhV 8HuD7پz=>NI{{ cu({vXZv3}G"SHiہJ5@@NR iv P)O]T $]t+v Э@NR t}]t(SHOknvk $׮90@y'v P)ƶ FѶ$Ԯ*vvR iv P){^!$׮1v95VY4Hک]T $jפegUkW&%r50r+^5@!;]#.ը)+eS(VZK5@-Q:7kr^[F->ψ|H׮y^\G@8R ivR im*vvR tc,UIN횭[Q wg-ʶ=]#6fU+\QtAki$:k҂n)Kz! QG6lYn?Sη_h}kn^ԮRHک]T ꚾԮjy?vj HgWOW>/kήN&QQ]tZ0aEliծizЈ^.]<`U t*v 1q;o?|蠍{0Ժii 4?9M{rݶxčW(X5@,H; Ă @,H; +1:=)V~m66 z@,H; Ă @,H; Ă @,H; Ă @,H; Ă @,H; Ģtgk\=y W ʿq]?OIENDB`Z(  r 8*Sef Word.Document.80"Microsoft Word efPwww.cs.ubc.ca/labs/spl/projects/asb.html^http://www.cs.ubc.ca/labs/spl/projects/asb.html/ 0DTimes New Roman<$0<z[ 04D-3 00000 Roman<$0<z[ 042 DArial00 Roman<$0<z[ 04"0D-3 0fg0 Roman<$0<z[ 04@DSymbol0 Roman<$0<z[ 04PDComic Sans MSn<$0<z[ 04B`DWingdings MSn<$0<z[ 04pD-3 fgngs MSn<$0<z[ 04DTimesngs MSn<$0<z[ 04DCourier NewSn<$0<z[ 041 C .  @n?" dd@  @@``  0 K   6#% AAB    8mf 57['# :  U-/@4   @" <:6)<   L=l'''@))%DD79UZJC@77E)#%;7$[9 tCn,  d #s E|HHH,:> tC     ?"$Sd#ݥ b$nc1_Ib$.48#FG(g 0e0e     A@ AjJ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| ̙ff!@ g4>d>dTz[ 0ppp@ <42d2d 0`v<4dddd 0`vg4QdQdTz[ 0p\p@ L,Q ʚ;߅.ʚ;<4dddd|- 0lB___PPT10"D-3 00000ؤ0ؤz[ 0Ф2DArial00ؤ0ؤz[ 0Ф" pp.(masuhara..:"Hidehiko Masuhara.___PPT9\? -O =43modeling crosscutting in aspect-oriented mechanisms44(jHidehiko Masuhara (University of Tokyo) joint work with Gregor Kiczales (University of British Columbia)8k!! hAOP supports modularization of crosscutting concerns [Kiczales et al.1997] e.g., a drawing editor & a concern: update display when figure moves w/o AOP vs. w/ AOP P"\ 4what s the essence of AOP?a nave model does not capture symmetric mechanism in Hyper/J dynamic mechanism in AspectJ more specialized mechanisms (e.g., Demeter) & we d like to find a model general enough to capture many mechanisms not too general so that we can see the nature of AOP  PjPPgP jV contributions & approach&1. provide a common modeling framework'' talk outlineimplementations of core AOP mechanisms PA: an AspectJ-like (dynamic) mechanism COMPOSITOR: a Hyper/J-like mechanism ( TRAV: a Demeter-like mechanism ) ( OC: an AspectJ-like (static) mechanism ) the modeling framework modular crosscutting in terms of the modeling framework<'R'Rv2PA  pointcuts and advicesimplified from (dynamic part of) AspectJ [Kiczales01] key elements: join point: point in execution i.e., a method call pointcut: specifies when advice: specifies what to do asymmetric: dominant / inferior modularityEl/  )  %,%PA: implementation $observations from PA implementationmethod and advice are treated similarly: lookup & execute symmetric model join points come from execution  weaving into components is not good weaving in the third space (i.e., execution)L=!%3>COMPOSITOR  class compositionsimplified from Hyper/J [Ossher01] class hierarchy for each concern (no dominant modularity) composition of class hierarchies to get an executable composition specification4$ COMPOSITOR: implementation(source-to-source translation computes all possible combinations * determines whether each should be merged merges bodies & adds to program (* very nave approach; just for explanation)Bq" /" COMPOSITOR: implementation( ,observations from COMPOSITOR implementation--(no dominant modularity symmetric model join points are not only from pgm-a (nor pgm-b)  weaving into components is not good weaving in the third space matching rule can be modified weaving parameters6,Jz TRAV & OCsimilarly implemented TRAV: Demeter/DemeterJ/DJ [Liberrherr97], etc. traversals through object graphs modular specification:  where to go &  what to do otherwise scattered over classes OC: AspectJ s introductions or ITD [Kiczales01] (also in Flavors, etc. [Cannon82]... ) can declare methods/fields outside of the class declarations/"U[>"U  #>,$ Dthe modeling framework: PA s case##Jmodeling framework: COMPOSITOR s case the modeling frameworkUmodels for 4 mechanisms8what s modular crosscutting?it is said:  AOP supports modular crosscutting but what is it? the modeling framework can explain: two modules in A&B crosscut when projections of the modules into X intersect and neither is subset of the otherT AAWS)an example of modular crosscutting in PA 8what s modular crosscutting?y two modules in A&B crosscut when projections of the modules into X intersect and neither is subset of the other4z%S!examples of modular crosscutting  related workcomparison two AOP mechanisms; e.g., Demeter vs. AspectJ [Lieberherr97] formal models for particular AOP mechanism [Wand+01], [Lmmel01], etc. Filman-Friedman s claim on non-invasiveness, or  quantified assertions over programs written by oblivious programmers not explicit in our framework; suggesting invasive AOP mechanisms is possibleZOZ +   "xO  summary3 part modeling framework elements from A&B meet at JP in X based on executable implementations www.cs.ubc.ca/labs/spl/projects/asb.html explanation of modular crosscutting in terms of projections of A&B modules into X future work: discuss more features in AOP on the framework e.g., non-invasiveness, remodularization, & unified implementation and formalization apply to foundational work: semantics[Wand01,02], compilation[Masuhara02,03], new feature designs& PqP$P.P PPq$.          ,b(U 0b  "TRAV  traversals(based on Demeter/DemeterJ/DJ [Liberrherr97], etc. traversals through object graphs specification:  where to go &  what to do otherwise scattered among classes e.g., counting FigureElements in a FigureVTPNP*P#N*, implementation of TRAVsemantics: visit all objects that can lead to goals nave implementation: a traversal engine walks over object graph locates current object in the spec. visits & continues walking if reachable in terms of class graph*_~_~implementation of TRAVweaver = traversal enginemodel for TRAV"OC  open classes(Zbased on AspectJ s introductions [Kiczales01] Flavors, etc. [Cannon82]... can declare methods/fields outside of the class declarations example: add drawing functionality6! b implementation of OCa special case of COMPOSITOR a source-to-source translator class decls oc decls programH@+  >B  model for OC0QB  query-based browsera customizable code exploration tool [Rajagopolan02] takes parameters: properties to extract order of properties can give different views of a program; e.g., group classes by method names NG*R%*R0QB  query-based browserimplementation of QBgextract metaobjects build envs. test query against each env add nodes to tree guided by the var. listh" h> +implementation of QB9 A to isomorphic X tuples of jps B IDB EFFB return B@:(   4 model for QB/+i3OSTZ[\_`abcdefghijklmnopqrstuvwxP  ` ̙33` ` ff3333f` 333MMM` f` f` 3` ` f` f` ff3` ffff3` f___f3` f___f` f___f!` f333f!>?" dd@,|?" dd@   " @ ` n?" dd;@ g @``@n?" dd@  @@``PR    @ ` ` p>> zx( L;PM;0a;e; x x 6} P  P0000 0000n0f_-[ p x 0   \0000 0000n0f_-[ ,{ 2 000 ,{ 3 000 ,{ 4 000 ,{ 5 000Z x 0 ``  Z* x 0 `   \* x 0,    ^*H x 0޽h ? ff! pado2.pptV 0 0 f(  8  C x|vEf"Ef" jJ?    x* B!!BBcc:  C xЈEf"Ef" jJ?   z* B!!BBccv  6 ?8   8  C x Ef"Ef" jJ?    x* B!!BBcc:  C xEf"Ef" jJ?   z* B!!BBcc  # lEf"Ef" jJ?@   \0000 0000n0f_-[ ,{ 2 000 ,{ 3 000 ,{ 4 000 ,{ 5 000ZH  0g ? ̙3380___PPT10.7 vx  (    Nelements  C  H   ` jJ?"`  =displayC"  H # lGH0DI)=jJ?+`5 B H  ZDjJ?]VVR H  T jJ?"` w B H  ZDjJ?; w; " H B  fHIjJ?%  T  $ ` x H #  I H  TljJ?"` $ ` x e/Line getP1() getP2() setP1(Point) setP2(Point) 00CB H  TDjJ?  @ , 'H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<   Zj ,$@ 0, (H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<  %  ,$@ 0, )H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<   2B ,$@ 0, *H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<   -= ,$@ 0, +H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<   v ,$D 0 1H 6 P Kaspect-oriented programming( 4H  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "<     z C9  6H   Fv,$@ 0 7H  TjJ?"`C9  RDisplayUpdating update(FigElm) after(e) : update(FigElm) { e.display.update(e) }SSCZ  B 8H  TDjJ?C   9H  `jJ? Q ( ,$@ 0 +B#style.visibility<*'H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*(H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*)H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<**H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+H %(D' =%(D|' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*'H %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*(H %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*)H %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<**H %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*+H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*@H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*AH %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*=H %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+B#style.visibility<*9H %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*FH %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*6H %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*EH %(+p+0+EH  ++0+FH  +  koK0     e (   r  S N 9    ZU jJ?< <NGG,  s ZG܄HIaJ@KWL@MN( jJ?Ig u ? crosscutting!AH  0޽h ?o        ff!___PPT10i.MG@~6+D=' = @B +$_ `0NK0 ++ <c @)(    ` 6Ț "` ,$ 0 vFcomponents & aspects are parallel weaving happens in the third spaceGG ] NjGH+jJ?C"?uF  BC b W # lGM*HEI)? 9 b X # lGS*HI)?  Dw b Y # lGT*HI:)?  - Ll  aS- J  S ,$@ 0    `DjJ?"` aS- >A  /   `fjJ?"`   >A r  S xP      6x"`mTy s    ZjJ?+?jW  ;AspectJA  ZjJ? J`  ;Hyper/JA  ZPjJ? $  ;DemeterA'   `jJ?C"?/ ,$@ 0 CAspect SandBoxA%   `ljJ?"`RQ ~,$@ 0 Simpl.A%   `djJ?"`Q  ,$@ 0 Simpl.A%   `jJ?"`x Q  ,$@ 0 Simpl.A%   `jJ?"` Q 8 ,$@ 0 Simpl.A  @ NjJ?w D ,$@ 0  @ NjJ?-  ,$@ 0   @ TjJ? K & ,$@ 0 & @ TjJ?{  K ,$@ 0 ' TjJ?Q K  ,$@ 0 ( TjJ? K ,$@ 0 + ZjJ?C"? Freal AOP languagesA  NjJ?9,$@ 0  @ NjJ?9{ ,$@ 0 C 6 "` T  R 2. explain modular crosscutting!! l q  Z q ,$@ 0T )  B # q @ p=  ? =) x2 8  HjJ?: x2 9  HjJ?p= x2 :  HjJ?*c J B ; TDjJ?% ? B < TDjJ?tS  B = TDjJ?: B > TDjJ?g 2 A  H jJ?C"?  ~ N  N}1jJ?Z 8 ~ O  NjJ?s J( x P  HjJ?WF  x Q  HjJ?-  x R  HjJ?x S  HjJ?& ~ U  N}1jJ? H ~ V  NjJ?R b l   L  ,$D 0 D  NjJ?C"?4&  E  NjJ?C"?p F  NjJ?C"?h E^  G  NjJ?C"?   K  HjJ?C"? b  [ 6< "` ,$ 0 Sthru simplified implementations   ^ T jJ? @C F _ TdjJ?C"?  0[Kiczales+01] [Ossher&Tarr01] [Lieberherr+96,97]V1 C K C K C B a @ ZDԔ?W0 p,$D 0B b @ TDԔ?=0 p,$@ 0B c TDԔ? w ,$@ 0H  0޽h ?p             A    A &   A '   A ( A  W A  X A  Y ]  ff!2: TIMING|22.3|39.7|27.82___PPT10{2.PG@?C+DW0' = @B D0' = @BA?%,( < +O%,( < +D ' =%(D ' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*Z %(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*] %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*` %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*c %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*b %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*a %(D4' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*L %(D"' =%(D"' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*Y %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*X %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*W %(D' =A@BBBB0B%(D' =1:Bhidden*o3>+B#style.visibility<*` %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*c %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*b %(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*a %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*J %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*  %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*& %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*' %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*( %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*[ %(++0+` < ++0+` < ++0+] < ++0+ < ++0+ < ++0+ < ++0+ < ++0+ < ++0+[ < + lK0  L $(  L r L S <xP  < r L S <x < H L 0޽h ? ff!___PPT10i.H`5+D=' = @B +aC 04K0 5,-,0#?*(  8 : T(<fjJ?C"?S  :an example advice: update display after moving any element;8Z;A)l  C ,<xP  <   C T1<x < &xstvw  TjJ?S @ R 3after( ): call(void Point.setX(int)) || call(void Point.setY(int)) || call(void Line.setP1(Point)) || call(void Line.setP2(Point)) { display.update(); }CP K#l TS < 9S T<,$@  0dT  % j 2# TS < *  `@<jJ?"` % j >A  T Z  )#    TC<jJ?"`Iq ] FigureElementC  [N  H   q  T\H<jJ?"` H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88C bB  TDjJ?  N  $ ` x  Y 0  TO<jJ?"` $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C /B  TDjJ?  @ "   `HIjJ?^9   fGSHISjJ?9^9   TT<jJ?"` ! <FigureC  ! TY<jJ?"`Z9 uDisplay update(FigureElement)C  " TjJ?'4C4 # T]< jJ?"`]cJ >elements  C  $ Ta< jJ?"`  =displayC " %  fGHIjJ??*w4B & TDjJ?)R ' N jJ?"`X 4  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "T  ?s   5  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "T  ? I 6  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "T  ?gww 7  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "T  ?7 GI 8  0e0e    B#C DEXF( @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||MM-Zq7]G'|Mssnz"@^ y#]@       "T  ?I <@ ZԔ?S R@ ,$@ 0 =@ ZԔ?S @ ,$@ 0 >@ ZԔ?S @ ,$@ 0 ?@ ZԔ?S @ ,$D 0H  0޽h ?'' "!%6<5= 7> 8? 0 TIMING|64.4|13.2|___PPT10\+ D@' = @B D' = @BA?%,( < +O%,( < +D ' =%(DF ' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*9%(D' =+4 8?\CB#ppt_xBCB#ppt_xB*Y3>B ppt_x<*9D' =+4 8?dCB1+#ppt_h/2BCB#ppt_yB*Y3>B ppt_y<*9D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*<%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*=%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*>%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*?%(D ' =%(D4 ' =%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*<%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*=%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*>%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*?%(D' =4@BBBB%(D ' =+4 8?XCB ppt_xBCB ppt_xB*Y3>B ppt_x<*9D' =+4 8?`CB ppt_yBCB1+ppt_h/2B*Y3>B ppt_y<*9D' =1:Bhidden*o3>+B#style.visibility<*9%(++ mJK0 *"0  (   r  S s<xP  < n  Tx<jJ?,6z (define eval-exp (lambda (exp env) (cond ((call-exp? exp) (call-method (call-exp-mname exp) (eval-exp (call-exp-obj exp) env) (eval-rands (call-exp-rands exp) env))) & ))) (define-struct call-jp (mname target args)) (define call-method (lambda (mname obj args) (let*((jp (make-call-jp mname obj args)) (method (lookup-method jp)) (advice (lookup-advice jp))) (execute-advice advice jp (lambda ( ) (execute-method method jp)))))) CC*CnC+CC CCCCC&C,   @  ')!) mmM<  Z<G'HwjJ?"`` , an interpreter ( la EOPL)LCc CC   Zԟ<jJ?C"?q&0  Ha method call is to:A  Zp<GHjJ?"`@ , [%a join point represents a method call&&Cw  N@<jJ?"`$ C, ecreate a join point identify a method identify advice decls. execute advice decls. execute methodffA,8p>`@2  H jJ?S"`? =V 2  H jJ?S"`? w   @  fjJ11ȜȜ? w) 2  H jJ?S"`? # 9 2  H jJ?S"`?z w   @  fjJ11ȜȜ? # w 2  H jJ?S"`? Q 2  H jJ?S"`? py   @  fjJ11ȜȜ?L Q p2  H jJ?S"`?f '2  H jJ?S"`?pP  @  fjJ11ȜȜ?# p2  H jJ?S"`? # 2  H jJ?S"`?Y p   @  fjJ11ȜȜ? # p H  0޽h ?                      ff!___PPT10i.H@@ +D=' = @B +  SK0 , $ Z  (  x  c $<xP  < r : S <x < 8   ,f  L p = H,< jJ?"`  ,f  C a nave model(2A2 > Z< jJ?"` F c  c compo- nent  C2 B Z< jJ?"`   <aspectC2 D H jJ?C"?gs   E TjJ?w g  FB TjJ? g  GB TjJ?d gC 2 H H jJ?C"?9~   I TjJ?y 9  K TjJ?>N 9  Y Z< jJ?]0= <NGG,H  0޽h ?_DEDF DG HI HK y___PPT10Y+D=' = @B +( Z@K0 '' "" &(   x  c $<xP  <  R P H  3 Kc    ZL<jJ?"`   ] FigureElementC  gT  H  # P Hw   Z<jJ?"` H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88C bB   TDjJ?  &T  $ ` x  #  H6    Z<jJ?"` $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C /B    TDjJ?  @ "    3 rG*HTIfjJ?p  "    # lG*H0bI}jJ?      Z(<jJ?"`  <FigureC    Z<jJ?"`pP uDisplay update(FigureElement)C    ZjJ?   Z< jJ?"` >elements  C    Z< jJ?"``   =displayC "   fGHIjJ? B   TDjJ?ppp L , 6   # $  D"   Z@jJ?"`, 6  ,Observable moved() { display.update(this); }--CB   TDjJ?n tn "  # lG*HPI,jJ? J L S s   #  P    Zx@jJ?"`S s  uDisplay update(FigureElement)CB   TDjJ? l    0e0e    BCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||m @ c"$`      0e0e    B CDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||Hr( @ c"$`  x    0e0e    By C&DEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||r&(y @ c"$` i h    0e0e    Bq CDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||Mr (q @ c"$` ) `    0e0e    Bq CADEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||rA (q @ c"$` y `     0e0e    B CDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||3@x @ c"$` Y@)  ! Z>XgfjJ?"`1 @   match Point.setX with Observable.moved match Point.setY with Observable.moved match Line.setP1 with Observable.moved match Line.setP2 with Observable.movedc >  Tx " c $< @x @ H  0޽h ?_                  y___PPT10Y+D=' = @B +3H [P$K0 BG:G rr$ jD(  $ rF @   $   @ B $  ZDjJ?@ @ B $  ZDjJ?  r $ Z@G fjJ?q p 0!   (compositor:weave "match Point.setX with Observable.moved match Point.setY with Observable.moved match Line.setP1 with Observable.moved match Line.setP2 with Observable.moved") c4 _ $ ux $ c $ @xP  @  $ c $+@x@  @ *eup R P H $ 3    $  Z/@jJ?   ] FigureElementC YT  H  $ # P Hi  $  Z4@jJ? H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88CbB  $  TDjJ?  T  $ ` x  $ #  H( $  ZDjJ? $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C/B $  TDjJ?  @ " $  3 rG*HTIfjJ?p  " $  # lG*H0bI}jJ?   $  Z@@jJ?  <FigureC $  ZC@jJ?pP uDisplay update(FigureElement)C $  ZjJ? $  Z I@ jJ? >elements  C $  Z`M@ jJ?`   =displayC" $  fGHIjJ? B $  TDjJ?pppL s  $ # 0  Z , 6  $ 3 s  $  ZPQ@jJ?, 6  ,Observable moved() { display.update(this); }--CB $  TDjJ?n tn  $  # lGMHIMjJ?  <  Z S s  $ 3 N    $  ZV@jJ?S s  uDisplay update(FigureElement)CB  $  TDjJ? l p2 !$ HjJ? p2 "$ HjJ?c p2 #$ HjJ? p2 $$ HjJ?, \p2 %$ HjJ?p p2 &$ HjJ?  Pp2 '$ HjJ?c p2 ($ HjJ? p2 )$ HjJ? p2 *$ HjJ?, \p2 +$ HjJ? ` @p2 ,$ HjJ? 0p2 -$ HjJ? 0p2 .$ HjJ?  Pp2 /$ HjJ?p p2 0$ HjJ?` p2 1$ HjJ?/p2 2$ HjJ? Lp2 3$ HjJ?` p2 4$ HjJ?` F  #  5$   `  \T `  6$ #  x2 7$  H jJ?` x2 8$  HjJ? p P \T    9$ # `  x2 :$  H jJ?  x2 ;$  HjJ? @P x2 <$  HjJ?@P  x2 =$  HjJ?p  T 0   >$ #   x2 ?$  H jJ?0  x2 @$  HjJ?p  x2 A$  HjJ? p  T    B$ #   x2 C$  H jJ?  x2 D$  HjJ? P x2 E$  HjJ? P  F$  N`@ jJ? #  7...Ab G$ @ # lZG*H@IEOjJ? b H$ @ # lZGJ*HyVI@jJ? b I$ # lZG"*HcIPjJ? b J$ # lZG *H&AIjJ? b K$ @ # lZG*HIjJ?  b L$ @ # lZG'*HyI1jJ?@0  b M$ @ # lZG*HIjJ?  b N$ @ # lZG"*HIPjJ?X F   Z  O$  A ` a nN +  Z  P$  +  Z ~B Q$  NDjJ?+  + ~B R$  NDjJ?  ~B S$  NDjJ?  ~B T$  NDjJ?Z Z B U$ ZDjJ? 0 B V$ ZDjJ?p    W$ 3 r$i@ydjJ?"    ] FigureElementC R  H X$ 3  9 4 Y$  3 rm@ydjJ?"  H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88CbB Z$  3 rDydjJ?"   hR  $ ` x [$ 3  4N \$  3 rLu@ydjJ?"  $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C/B ]$  3 rDydjJ?"   @ " ^$ 3 rG*HTIfjJ?" N" _$ # lG*H0bI}jJ?"BN `$ 3 r4{@ydjJ?"   <FigureC a$ ZjJ?  b$ Z@ jJ?  >elements  C c$ Zԃ@ jJ?1~ =displayC" d$  fG)H߈I-jJ?  AL pZ e$ #  :- f$  3 rX~@ydjJ?" pZ uDisplay update(FigureElement)CB g$  3 rDydjJ?" p}L 0   h$ #  ` x2 i$  H jJ?0  x2 j$  HjJ?p  x2 k$  HjJ? p  L    l$ #  ` x2 m$  H jJ?  x2 n$  HjJ? P x2 o$  HjJ? P R p$ # lZGjHiIjjJ?f H b q$ # lZG)H|I=jJ?f Pa r$ Ny@ jJ?0 P  7...AH $ 0޽h ??` $ $ $ $ $ $ $ $ $  $ $ $ $ $ $ "$ 8$ G$ #$ E$ H$ 3$ D$ I$  1$ =$ J$  /$ ;$ K$  +$ <$ L$  /$ @$ M$  3$ A$ N$ Y$ W$ ^$ \$ W$ _$ `$ W$ a$ W$ f$ d$ i$ p$ m$ q$  y___PPT10Y+D=' = @B +  np\K0   , (  , x , c $@xP  @ E , TН@jJ?; a(define compositor:weave (lambda (pgm-a pgm-b relationships) (let loop ((pgm (make-program '())) (seeds (compute-seeds pgm-a pgm-b))) (if (not (null? seeds)) (let ((signature (all-match (car seeds) relationships))) (if signature (let* ((jp (car seeds)) (decl (merge-decls jp relationships))) (loop (add-decl-to-pgm decl pgm signature) (remove-subsets jp (cdr seeds)))) (loop pgm (cdr seeds)))) pgm))))b#CACA!CA<CNAgCA CACACA CArC:$ E-- 2  , Z@GHjJ?"`Wp W!generate combinations of methods""C , Zн@G2H3jJ?"`F   Umerge method bodies and install  C , Z,@GkH'jJ?"`e  _)test all methods have matching signatures**CH , 0޽h ??0, , ,  ff!___PPT10i. p+D=' = @B +!  _K0 0 ( pd  (  d x d c $|@xP  @ x d c $P@x @ F   ,f  d  ` p d  H@ jJ?"`  ,f  C a nave model(2A2 d  Z@ jJ?"` F c  c compo- nent  C2 d  Z@ jJ?"`   <aspectC2 d  H jJ?C"?gs    d TjJ?w g   d B TjJ? g   d B TjJ?d gC 2  d  H jJ?C"?9~    d TjJ?y 9  d TjJ?>N 9  d ZX@ jJ?]i= <NGG,H d 0޽h ?_d d d d d d  d d  d d  y___PPT10Y+D=' = @B + ubK0 l 0(  l x l c $@xP  @ x l c $@x @ H l 0޽h ? ff!___PPT10i.4H+D=' = @B +J OBK0 //` 9:l.(  l" 7l TjJ?"`  Pmethod & advice are parallelAx l c $xP   2 l  `jJԔԔ8c8c?0 v l N1?@Wv l N1? *$v l N1? $|" l THnIt}1?WjZ |" l@ THtI1?WZB p2  l HjJ?p0p2  l HjJ?p2  l HjJ?p2  l HjJ?p2  l HjJ?@pp2 l HjJ?Pp2 l HjJ?P@pp2 l HjJ?0p2 l HjJ?P2 l  `jJԔԔ8c8c? `7 v l N1?wJv l N1?D Z[p2 l HjJ?0p2 l HjJ?0p2 l HjJ?p2 l HjJ?pp2 l HjJ?@p2 l HjJ?7g2 l  `jJԔԔ8c8c? p p2 l HjJ?@ @ p p p2 l HjJ?P J z p2 l HjJ? P 0 p2 l HjJ? 0 ` 0 p2  l HjJ? 0 p2 !l HjJ? P p2 "l HjJ? P p2 #l HjJ? p2 $l HjJ?  @  %l TD jJ?`L  uA method decls.(EA  &l Td jJ?@y  uB advice decls.(EA  'l T` jJ? p Q X computation(E Ar (l H jJ?p ,$D 0v )l@ NjJ?) 2  *l T jJ? P fXJP method calls:EMA +l NԔ?. ,$@ 0 ,l  0e0e    BAC>DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@,$@ 08 -l  0e0e    BOCDE4F   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| ]A|OqA' ] @    `"`b 5,$@ 0 .l@  `G/HgIԔ? ,$@ 0' /l Z^, jJ?l g\ ,$ 0 iIDA method lookup<PEMAC 0l 3 r jJ11ȜȜ? p) ,$ 0 mIDB pointcut matching<PEMA 1l  0e0e    BqCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||q-g@  3 ,$@ 0 2l  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0 P ,$@  0 3l  0e0e    BCbDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||xV4b@  I ,$@  0@ 4l 3 r^,t jJ1ԔȜ8c?ZO  ,$  0 jEFFA method exec.<PEMA( 5l Zv4 jJ?#I ,$  0 jEFFB advice exec.<PEMA" 6l T0jJ?   c/weaving happens at method calls in computation00Av 9l NjJ?  3 v :l@ NjJ?  H l 0޽h ?llllll*l)l,l(l+l-l.l*l9l*l:l . TIMING|77.3|25.Z___PPT10:+4D>' = @B D' = @BA?%,( < +O%,( < +D ' =%(D ' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*-l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*.l%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0l%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*/l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*,l%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*9l%(D' =4@BBBB%(D' =1:Bhidden*o3>+B#style.visibility<*:l%(D ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*2l%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*5l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*3l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*1l%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*(l%(++0+/l ++0+0l ++0+4l ++0+5l +|5 \jK0 44 DD0 2(  0 x 0 c $@@xP  @ 2 0  `jJԔԔ8c8c?0 v 0 N1?@Wv 0 N1? *$v 0 N1? $|" 0 THnIt}1?WjZ |" 0 @ THtI1?WZB p2  0 HjJ?p0p2  0 HjJ?p2  0 HjJ?p2  0 HjJ?p2  0 HjJ?@pp2 0 HjJ?Pp2 0 HjJ?P@pp2 0 HjJ?0p2 0 HjJ?P2 0  `jJԔԔ8c8c? `7 2 0  `jJԔԔ8c8c? p p2 0 HjJ?  @ @ p2 0 HjJ? J z P p2 0 HjJ? P 0 p2 0 HjJ? ` 0 p2 0 HjJ? 0 p2 0 HjJ? P p2 0 HjJ? P p2 0 HjJ? p2 0 HjJ?  @  0 TA jJ?  YA - methods &fields(EA 0 TA jJ? 5 YX - composed programs(EApr 0 H jJ?p v  0 @ NjJ?   !0 TxA jJ? & XJP - set of decls:EMAv "0 NԔ?.  #0  0e0e    BAC>DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@ $0 @  `G/HgIԔ? j  %0  f^,A jJ9? + b  qIDA - signature matching<PEMA &0 3 rA jJ11ȜȜ?   qIDB - signature matching<PEMA '0  0e0e    BqCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||q-g@  3  (0  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0 P  )0  0e0e    BCbDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||xV4b@  I 2 *0 3 r^,/A jJ1ԔȜ8c?   EFFA - provide decls.<PEMA +0 Zv5A jJ?R  EFFB - provide decls.<PEMA ,0 T<DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`  <0 TDEA̙ jJ?"` p0  a(compositor:weave "match Point.setX with Observable.moved match Point.setY with Observable.moved match Line.setP1 with Observable.moved match Line.setP2 with Observable.moved") c,Q  sv =0 N1? P p @ v >0 N1? 0 v ?0 N1?0 X w |" @0 THID1?@ |" A0 @ THI1?@ 0 |B B0 TDjJ?  |B C0 TDjJ?p p  D0 TA jJ? Q&  ]META - composition rules (EAH 0 0޽h ? 0 0 0 0 0 0 0 !0 0 #0 0 "0 ;0 0 $0 .0 -0 00 /0 -0 10 >0 =0 @0  ?0 =0 A0  y___PPT10Y+D=' = @B +D TpHK0 ..@ 68-(  x  c $VAxP  A 2   `jJԔԔ8c8c?0 v  N1?@Wv  N1? *$v  N1? $|"  THnIt}1?WjZ |" @ THtI1?WZB p2   HjJ?p0p2   HjJ?p2   HjJ?p2   HjJ?p2   HjJ?@pp2  HjJ?Pp2  HjJ?P@pp2  HjJ?0p2  HjJ?P2   `jJԔԔ8c8c? `7 v  N1?wJv  N1?D Z[p2  HjJ?0p2  HjJ?0p2  HjJ?p2  HjJ?pp2  HjJ?@p2  HjJ?7g2   `jJԔԔ8c8c? p p2  HjJ?@ @ p p p2  HjJ?P J z p2  HjJ? P 0 p2  HjJ? 0 ` 0 p2   HjJ? 0 p2 ! HjJ? P p2 " HjJ? P p2 # HjJ? p2 $ HjJ?  @  % TbA jJ? `  P A - program( E A & TdA jJ?<  N B - program& E A ' TDgA jJ?& ~ , jX - computation or program4EAAr ( H jJ?p ,$D  0 * TqA jJ?m  s tXJP- join pointHEMA A + NԔ?. ,$@ 0 ,  0e0e    BAC>DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@,$D 08 -  0e0e    BOCDE4F   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| ]A|OqA' ] @    `"`b 5,$@ 0 .@  `G/HgIԔ? j ,$@ 0> / Z^,yA jJ?  ,$ 0 IDA- means of identifyingJPEMAA5 0 3 rA jJ11ȜȜ?0 . ,$ 0 _IDB@PEME 1  0e0e    BqCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||q-g@  3 ,$@  0 2  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0 P ,$@ 0 3  0e0e    BCbDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||xV4b@  I ,$@  06 4 3 r^,܆A jJ1ԔȜ8c?P ,$  0 `EFFA@PEMEM 5 Zv\A jJ?R ,$  0 EFFB - means of effectingXPEMIAA" 7 TГAjJ?"`   Hweaving happens at XA" 8 T8AjJ?"` DA&B are parallelAH  0޽h ?O,(+-(. 0 TIMING|42.5|21.1F___PPT10&+)D*' = @B D' = @BA?%,( < +O%,( < +D ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*/%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*+%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*0%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*.%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*-%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*,%(D ' =%(D ' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*2%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*4%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*5%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*3%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*1%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*(%(++0+/A ++0+0A ++0+4A ++0+5A +a 3TK0 ph( @ x  c $hAx   A H   fA *? jJ??"`ep *H  0޽h ? y___PPT10Y+D=' = @B + tK0  t$(  tr t S AxP  A r t S ȶAx A H t 0޽h ? ff!___PPT10i. +D=' = @B +5 sZK0  *׀$  (  r  S ,AxP  A  ɀ T jJ? C"? ,r2  <7""7""jJ "`; o<   B7""7""Ԕ "`,$@ 0r2  <7""7""jJ "`m*e O   <A "`k  fLine setP1 getP1,aC,nx2  B7""7""jJ "`3x2  B7""7""jJ "` I  B7""7""Ԕ "`~ ,$D 0x2  B7""7""jJ "`)  ex2  B7""7""jJ "` p Z p  H7""7""3Ԕ 3  p  H7""7""3Ԕ Fx p @ H7""7""3Ԕ e&  p @ H7""7""3Ԕ c ; x2  B7""7""jJ "` o Y r2  <7""7""jJ "` ?  <lA "` y  call to l.setP1 call to l.getP1d a a aC,K  <A "`   call to p.setX call to p.getXda a aC,,   <xA "`  \after(& ):& ,  aC,  <A "` k  Point setX getX,aC,,x2  B7""7""jJ "`V 6x2  B7""7""jJ "`V M  B7""7""Ԕ "`t @  ,$@  0  B7""7""Ԕ "`  ,$D  0p € H7""7""3Ԕ  4  p À H7""7""3Ԕ <t ! p Ā H7""7""3Ԕ D %  p ŀ H7""7""3Ԕ K x2 ƀ B7""7""jJ "` , e G x2 ǀ B7""7""jJ "`  Y M J ̀ TA jJ?IYi h Line and DisplayUpdating crosscut in the execution 55A"   ̀ HA jJ?S"`?Mm,$ 0 9classAB ΀ ZDԔ?m,$@ 0  р HHU jJ?S"`?M.m,$ 0 :aspectAB Ҁ ZDԔ?@,$@ 0 Ӏ HU jJ?S"`?' ,$ 0 Eprojection of LineAB Ԁ ZDԔ? W0 ) ,$@  0F Հ HU jJ?S"`? ,$  0 tprojection of DisplayUpdatingAB ր ZDԔ? 6 ,$@  0 ׀ HU jJ?S"`?~ k _DisplayUpdatingAH  0޽h ?/01ǀ23ƀ€4À5ǀĀ6ŀ ff!. TIMING|29.7|9.6V___PPT106.Ѵh+׌D*' = @B D' = @BA?%,( < +O%,( < +D ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*̀%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*΀%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*р%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*Ҁ%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D ' =%(D ' =%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Ӏ%(D' =A@BBBB0B%(D' =1:Bvisible*o3>+B#style.visibility<*Հ%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*Ԁ%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*ր%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<*%(++0+̀U ++0+рU ++0+ӀU ++0+ՀU + oK0 #`"(P(  P %P <,/U x U l P C hYxP  U  "P H|0U jJ?S"`?H"N  ia module (eg class)A  #P H<6U jJ?S"`?`c#f  Mprojection of the moduleA 8   &P9 f P 6ԔQ f PB 6Ԕ y f  P 6ԔQ f  P 6ԔN f  PB 6Ԕ8  f  PB 6Ԕ- y2  P B@;Uoc(  @C  f2 P 6ԔEm%f2 P 6Ԕ*2 P B>Uo+S  @C  2 P BBUo c @C  r P BԔF 7r P BԔ r P BԔq - r P BԔ% (c   P HFUԔ73 5AC  P HJUԔ 3 5BC   P HdNUԔ  5XC f2 P 6Ԕ%Jf2 P 6Ԕ,Tf2 P 6Ԕ |! f2 P 6Ԕ ? f2 P 6Ԕ  f2 P 6Ԕ  f2 P 6ԔJsf2 P 6Ԕ s B 'P@ ZDjJ?PB (P@ ZDjJ?C3 H P 0޽h ?oPPPPPPPP PPP PPP PPP P y___PPT10Y+D=' = @B +3N rK0 2M*Mt G(  t x t c $ZUxP  U l t 67""7""jJ"`6 f2 t 07""7""jJ"`w- W t 6\Ut jJS"`?  LLine,cC l2 t 67""7""jJ"`gL s l t 67""7""jJ"`d t <7""7""3jJm _d  t <7""7""3jJm Ud  t @ <7""7""3jJ>d  t @ <7""7""3jJ>il2  t 67""7""jJ"`U|f2  t 07""7""jJ"`qC7tr t 6cUt jJS"`?   Harrive at l arrive at p arrive at p % cc cc ccC  t 6hlUt jJS"`? 9 arrive at l arrive at p` cc ccC  t 6sUt jJS"`?" v.traverse(& ) traverse(& ),cC  t 6hxUt jJS"`?  MPoint,cC l2 t 67""7""jJ"`_l t 67""7""jJ"`v8l t 67""7""jJ"`Pf2 t 07""7""jJ"`c$C d t <7""7""3jJtd t <7""7""3jJ ud t <7""7""3jJd t <7""7""3jJiHl2 t 67""7""jJ"`!l2 t 67""7""jJ"`Krl2 t 67""7""jJ"`l2 t 67""7""jJ"`l2 t 67""7""jJ"` d t @ <7""7""3jJ>l2  t 67""7""jJ"`>d !t <7""7""3jJ!ed "t <7""7""3jJd #t <7""7""3jJ^ $t 67""7""jJEd %t @ <7""7""3jJyd &t <7""7""3jJql 't 67""7""jJ"`W  f2 (t 07""7""jJ"`   )t 6U)t jJS"`? t?,  XLine setP1 getP1,cC l2 *t 67""7""jJ"`< -Rc l2 +t 67""7""jJ"` -R l ,t 67""7""jJ"` h [ l2 -t 67""7""jJ"` 0 l2 .t 67""7""jJ"`L 2qd /t <7""7""3jJc MFd 0t <7""7""3jJ Md 1t @ <7""7""3jJ0 &d 2t @ <7""7""3jJ6 8l2 3t 67""7""jJ"` 2f2 4t 07""7""jJ"` L  5t <U5t jJS"`? Z# XLine setP1 getP1,cC  6t 6U6t jJS"`? 6 Point setX getX,cC , 7t 64U7t jJS"`?   gObservable moved,cC  8t 6ԠU8t jJS"`? }2,  Point setX getX,cC ,l2 9t 67""7""jJ"`> !e l2 :t 67""7""jJ"` ! l ;t 67""7""jJ"`?mil t <7""7""3jJ.Vd ?t <7""7""3jJk V d @t <7""7""3jJ.d At <7""7""3jJ [8 l2 Bt 67""7""jJ"`V(O}l2 Ct 67""7""jJ"` GE Dt 6(UDt jJS"`? {  %DisplayMethods Point.draw Line.draw,&%cC 6  l Et 67""7""jJ"` U g f2 Ft 07""7""jJ"`   Gt 6UGt jJS"`?8 % |  LLine,cC l2 Ht 67""7""jJ"`  0 l It 67""7""jJ"`{  d Jt <7""7""3jJ1  kd Kt <7""7""3jJ1  uDd Lt @ <7""7""3jJ q f2 Mt 07""7""jJ"`   Nt 6̺UNt jJS"`? S eLine setP1 draw,cC 9 Ot 6UOt jJS"`? D yPoint setX draw,cC  Pt 6UPt jJS"`?8 .|  MPoint,cC l2 Qt 67""7""jJ"`, Q l Rt 67""7""jJ"`f l St 67""7""jJ"` I f2 Tt 07""7""jJ"` d Ut <7""7""3jJdDd Vt <7""7""3jJR  l2 Wt 67""7""jJ"`Jql2 Xt 67""7""jJ"`{l2 Yt 67""7""jJ"`i  d Zt @ <7""7""3jJ uDl2 [t 67""7""jJ"`  d \t <7""7""3jJR 5 d ]t @ <7""7""3jJDd ^t <7""7""3jJ'Kl2 _t 67""7""jJ"`fl2 `t 67""7""jJ"`JbqF /; p  at  /; p t bt  67""7""jJ"`@n2 ct  07""7""jJ"`!/ dt  0Udt "`Lc XLine setP1 getP1,cC t2 et  67""7""jJ"`Qxt2 ft  67""7""jJ"`Q<xct gt  67""7""jJ"` t2 ht  67""7""jJ"`Nut2 it  67""7""jJ"`/Vl jt  <7""7""3jJrC|l kt  <7""7""3jJrc5l lt B <7""7""3jJJul mt B <7""7""3jJ\ot2 nt  67""7""jJ"`/Vn2 ot  07""7""jJ"`D; J! pt  0xUpt "`Tp  call to l.setP1 call to l.getP1p cccccC S qt  0Uqt "` p  call to p.setX call to p.getXpcccccC ,  rt  0 Urt "`  \after(& ):& ,  cC  st  0Ust "`LV Point setX getX,cC ,t2 tt  67""7""jJ"`Et2 ut  67""7""jJ"`@Eet vt  67""7""jJ"`ot wt  67""7""jJ"`>n2 xt  07""7""jJ"`>J; l yt  <7""7""3jJSvl zt  <7""7""3jJ2zl {t  <7""7""3jJ MJl |t  <7""7""3jJ?ft2 }t  67""7""jJ"`Nvst2 ~t  67""7""jJ"`Dk t  0lUt "`4 LPA.cC  t 0Wt "`%  NTRAV.cC  t 0HWt "`M V = LOC.cC  t 0 Wt "` R} V COMPOS- ITOR.  cC  t H@ WjJ?"`xgj X lines are missing in proceedings!(2!CH t 0޽h ?et it jt ft nt kt ht ~t lt rt nt mt }t yt tt zt ~t {t ut |t  t t t  t t t  t t t  t t t  t t t t t t t t  t t t t !t t "t t #t t $t t %t t &t *t .t /t +t 3t 0t -t Ct 1t -t 3t 2t Bt >t 9t ?t Ct @t :t At  Ht _t Jt !Ht `t Kt "[t Lt #Wt Ut $Qt Vt %Yt `t Zt &Qt \t 'Wt ]t (Xt ^t  ff!___PPT10i.Ѵh+D=' = @B +y opNK0 8(  8l 8 C hWxP  W l 8 C  Wx W H 8 0޽h ? y___PPT10Y+D=' = @B +y pfK0 (  l  C (WxP  W l  C P)Wx W H  0޽h ? y___PPT10Y+D=' = @B + q@K0 | $(  | r | S 6WxP  W r | S 6Wx W H | 0޽h ? ff!___PPT10i. MmI+D=' = @B +W a ?7 G(   ~  s *  P{z &<%    Z,C,$D  0_T  % j  # &<%    Z,KWjJ?"` % j ? w/o aspects  A T Z   #     TOWjJ?"`Iq ] FigureElementC  [N  H    q   TTWjJ?"` H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88C bB   TDjJ?  N  $ ` x   Y 0   Td^WjJ?"` $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C /B   TDjJ?  @ "    `HIjJ?^9    fGSHISjJ?9^9   T`bWjJ?"` ! <FigureC    T0gWjJ?"`Z9 uDisplay update(FigureElement)C    TjJ?'4C4   T8kW jJ?"`]cJ >elements  C    TPW jJ?"`  =displayC "   fGHIjJ??*w4B   TDjJ?)R   N jJ?"`X~2   N!3jJ? ~2   N!3jJ?X~2   N!3jJ?H  0޽h ?O            ___PPT10+]mD|' = @B D7' = @BA?%,( < +O%,( < +Dn' =%(D' =%(D' =4@BBBB%(D' =1:Bvisible*o3>+B#style.visibility<* %(D' =+4 8?dCB1+#ppt_w/2BCB#ppt_xB*Y3>B ppt_x<* D' =+4 8?\CB#ppt_yBCB#ppt_yB*Y3>B ppt_y<* +" b "!++ (   ~  s *LWxP  W   s *xWx  W &xpqvw2  ZWjJ?(  H  :fig1C2  Z܋WjJ?( mH  ;list1C2  Z\WjJ?  8p1C|  TjJ? v  NjJ?[  2  Z`WjJ?   ;line1C2  Z8WjJ?c   8p2Cv  NjJ?  2  ZWjJ?   8p3C2  ZWjJ?   8p4Cv  NjJ?_ #2  ZWjJ?  ;line2C2  Z WjJ?g 8p5Cv  NjJ?#v  NjJ? s v  NjJ? s v  NjJ? s#   0e0e    BkCDEF   > 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||-k @  c"$`    L P H  # 5   ZLine getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C/B   TDjJ?  @ "   3 rG*HTIfjJ?p  "   # lG*H0bI}jJ?     ZWjJ?"`  <FigureC !  Zelements  C $  ZW jJ?"``   =displayC" %  fGHIjJ? B &  TDjJ?ppp ' TWjJ?m ^ +from Figure through Line to FigureElement,,C 2 ( T>?S"`?P Sv ) NjJ?5F62 * T>?S"`?" ,C2 + T>?C"?0  H  0޽h ?                             "   ! %   )  y___PPT10Y+D=' = @B + v  x(   ~  s *pWxP  W ~  s *DWx W C  TWjJ? 7(define trav:weave (lambda (trav-spec root visitor) (let arrive ((obj root) (path (make-path (object-cname root)))) (call-visitor visitor obj) (for-each (lambda (fname) (let* ((next-obj (get-field fname obj)) (next-cname (object-cname next-obj)) (next-path (extend-path path next-cname))) (if (match? next-path trav-spec) (arrive next-obj next-path)))) (object->fnames obj)))))88C:  &7&'  Q51.   HW jJ?,b q+visit object match path vs. spec and cont., 2,CuH  0޽h ? ___PPT10i.s ٗ+D=' = @B ++ c ++ 99 #)(   ~  s *WxP  W 2   `jJԔԔ8c8c?0 v  N1?@Wv  N1? *$v  N1? $|"  THnIt}1?WjZ |"  @ THtI1?WZB p2  HjJ?p0p2  HjJ?p2  HjJ?p2  HjJ?p2  HjJ?@pp2  HjJ?Pp2  HjJ?P@pp2  HjJ?0p2  HjJ?P2   `jJԔԔ8c8c? `7 2   `jJԔԔ8c8c? p p2  HjJ?@ @ p p p2  HjJ?P J z p2  HjJ? P 0 p2  HjJ? 0 ` 0 p2  HjJ? 0 p2  HjJ? P p2  HjJ? P p2  HjJ? p2  HjJ?  @   T8Y jJ?  iclass &field decls.A   T0 Y jJ?CI  straversal spec. & visitor desc. A  TY jJ?  = traversal  Apr  H jJ?p v ! @ NjJ?  P  " T\Y jJ?P q p Earrival at objectAv # NԔ?. t $  >0e0e    BAC>DEF @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@ %  0e0e    BCDE4F   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| kq|'4k @    `"`b 5 & @  `G/HgIԔ? j  ' Z^,Y jJ?&   vlook up class & field decls.PA ( 3 rY jJ11ȜȜ?x   Ftraversal spec.PA )  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0 P  *  0e0e    BCbDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||xV4b@ } CI  + 3 r^,$!Y jJ1ԔȜ8c? e  lprovide reachabilityPA  , ZvX%Y jJ? ^ P S  C visit & cont.PAv - NjJ?Ep . HjJ?"p / HjJ?3p 0 HjJ?mp 1 HjJ?-_}p 2 HjJ? p 3 HjJ?o#v 4 NjJ?sfv 5 @ NjJ?sf'v 6 @ NjJ?)fv 7 NjJ?fv 8 NjJ?UYv 9 @ NjJ?(@0|H  0޽h ?       " ! $ # % & . 0 - 0 3 4 0 1 5  3 / 6  1 / 7  2 1 8  . 2 9  y___PPT10Y+D=' = @B + d -%@ (   ~  s */YxP  Y ~  s *0Yx Y y  TL1YjJ?s -f yclass DisplayMethods { void Point.draw() { Graphics.drawOval(...); } void Line.draw() { Graphics.drawLine(...); } }zzc> H  0޽h ? y___PPT10Y+D=' = @B +  e ` (   ~  s *l=YxP  Y ~  s *@>Yx Y   T pgm (let ((pgm (remove-oc-mdecls pgm)) (oc-mdecls (gather-oc-mdecls pgm))) (make-pgm (map (lambda (cdecl) (let* ((cname (class-decl-cname cdecl)) (sname (class-decl-sname cdecl)) (per-class-oc-mdecls (lookup-oc-mdecls cname oc-mdecls))) (make-class-decl cname sname (append (class-decl-decls cdecl) (copy-oc-mdecls cname per-class-oc-mdecls))))) (pgm-class-decls pgm))))))C6     I>  & '  !% %    T4YY jJ? j= 9A B a new program in X cdecl is a jp IDB EFFA and EFFBf:*CKCKCK,pH  0޽h ? y___PPT10Y+D=' = @B +- f /,',== *(   ~  s *PGYxP  Y 2   `jJԔԔ8c8c?0 v  N1?@Wv  N1? *$v  N1? $|"  THnIt}1?WjZ |"  @ THtI1?WZB p2  HjJ?p0p2  HjJ?p2  HjJ?p2  HjJ?p2  HjJ?@pp2  HjJ?Pp2  HjJ?P@pp2  HjJ?0p2  HjJ?P2   `jJԔԔ8c8c? `7 2   `jJԔԔ8c8c? p p2  HjJ?  @ @ p2  HjJ? J z P p2  HjJ?)  2 Y p2  HjJ?) z Y p2  HjJ? 0 p2  HjJ? P p2  HjJ? P p2  HjJ? p2  HjJ?  @   TvY jJ?7O=  eA - OO decls.A   T{Y jJ? 5 IX - composed programsApr  H jJ?p  v  @ NjJ?n   ! T(Y jJ?  > JP - class  Av " NԔ?.n  #  0e0e    BAC>DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@ $ @  `G/HgIԔ? Q ?j  %  f5`Y jJ9?k5  iIDA - signature matching4PAIA  & 3 r?Y jJ11ȜȜ?   iIDB - signature matching4PAIA '  0e0e    BqCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||q-g@ 0  (  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0z s * ) 3 rmU3ԐY jJ1ԔȜ8c?%  EFFA - provide decls.4PAIA * Z`Y jJ?f C h EFFB - copy decls.4PAIA  + TDEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"` 'v 9 N1? P p @ v : N1? 0 v ; N1?0 X w |" < THID1?@ |" = @ THI1?@ 0 H  0޽h ?       ! #  " 8  $ : 9 < ; 9 =  y___PPT10Y+D=' = @B + gK0  P(   ~  s *YxP  Y ~  s *Yx  Y    s Y0e0e]~Ax  Y : H  0޽h ? y___PPT10Y+D=' = @B +* wK0 91 (    L MM*y"  # /T   c $]~AAM*y"T   c $]AMMy"~  s *YxP  Y   HԿYjJ?  Sclasses with defined methodsA  HYjJ? I  X"method names with defining classes##A2  T>?S"`?M 2  T>?S"`? H  0޽h ? y___PPT10Y+D=' = @B +N hK0 MMss J(   rF @      m B   ZDjJ?@ @ B   ZDjJ?  ~  s *(YxP  Y   s *Yx  Y &Pq5E8Xp R P H  3     ZYjJ?   ] FigureElementC YT  H  # P Hi   ZYjJ? H 7Point getX() getY() setX(int) setY(int) moveBy(int,int)88CbB   TDjJ?  T  $ ` x  #  H(   ZYjJ? $ ` x >Line getP1() getP2() setP1(Point) setP2(Point) moveBy(int,int)??C/B   TDjJ?  @ "   3 rG*HTIfjJ?p  "   # lG*H0bI}jJ?     ZYjJ?  <FigureC   ZYjJ?pP uDisplay update(FigureElement)C   ZjJ?   ZY jJ? >elements  C   Z4Y jJ?`   =displayC"   fGHIjJ? B   TDjJ?pppp2  HjJ? ; p2  HjJ? ; p2  HjJ? ; >p2  HjJ?Q ; p2  HjJ? ; p2  HjJ?E4up2  HjJ?4p2  HjJ?4p2  HjJ?4>p2 ! HjJ?Q4p2 " HjJ?5; ep2 # HjJ?% ; Up2 $ HjJ?%KUp2 % HjJ?E ; up2 & HjJ?4p2 ' HjJ? F  #  (    \T `  ) #  x2 *  H jJ?` x2 +  HjJ? p P \T    , # `  x2 -  H jJ?  x2 .  HjJ? @P x2 /  HjJ?@P  x2 0  HjJ?p  T 0   1 #   x2 2  H jJ?0  x2 3  HjJ?p  x2 4  HjJ? p  T    5 #   x2 6  H jJ?  x2 7  HjJ? P x2 8  HjJ? P  9  NH] jJ? #  7...Ab : # lZG*HIjJ? b ; @ # lZG0*HWWIjJ?7- b < # lZG*HTLIwjJ?N6=b = @ # lZG#+HooIjJ?7&nb > @ # lZG0*H]@IjJ?*b ? @ # lZG0*HIjJ?ek rb @ @ # lZG0*HPIjJ?b A @ # lZG*HIwjJ?N= B Z] jJ?6  Penv.Ap2 C HjJ? p2 D HjJ? d p2 E HjJ? )p2 F HjJ?$ G N8 ]jJ?"`u   $class(?C), method(?M), parent(?C,?M)%%C6   H Z|] jJ? I  7queryAF   Z  I   > nN +  Z  J  +  Z ~B K  NDjJ?+  + ~B L  NDjJ?  ~B M  NDjJ?  ~B N  NDjJ?Z Z B O ZDjJ? 0 B P ZDjJ?p  F   .  Q  . ! DN T 0   R # .  x2 S  H jJ?0  x2 T  HjJ?p  x2 U  HjJ? p  T    V #  . + x2 W  H jJ?  x2 X  HjJ? P x2 Y  HjJ? P  Z  N] jJ? .  7...Ap2 [ HjJ? 0 p2 \ HjJ? M0 J   45 ] 3 "fVY? RMRMVRM' q0RM>M@)RMTVZIMVPq" q02CM@)^    ]T ^  c $X99 ? 45~ _  NGHIo _s639071 *!j %~ `  NGHIo _s639072 *!j "~ a  NGHIo _s639073 k+j -~ b  NGH\Io _s639074 o2j #4~ c  NGHIo _s639075 : =1~ d  NGHIo _s639076 : 4*~ e  NGHvIo _s639077 : " f  l ]t^:t^:  _s6390783"      7 C " g  l%]t^:t^:  _s6390793"   : u *! VmoveByC " h  l#]t^:t^:  _s6390803"   : ( k+ TgetXC " i  l']t^:t^:  _s6390813"   : 0 o2 ;getP1C " j  l.]w;w;  _s639082#"  j d34 :LineC " k  l3]w;w;  _s639083#"  j [,- ;PointC " l  l1]w;w;  _s639084#"  j !L# ;PointC " m  l9]w;w;  _s639085#"  j A$% :LineC  n  ~0e0e    B^CXDELF& @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||$=0XQ^JZs/ g  s@      `S" F  o  ~0e0e    BCDELF& @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||,&a8fU`e8m@      `S" a 9b p  fGHIAjJ? Gb q @  fGHI/jJ? v r Z,] jJ?S NY > add nodes  A s TB]̙jJ? f  >?MN, ?CN CH  0޽h ?_             + :  8 ; $ 7 <  0 =  & . >  " / ?  & 3 @  $ 4 A  g f e h f d i f c j i b k h a l g ` m g _ W n p S o q  y___PPT10Y+D=' = @B +h xK0 g_ (   ~  s *J]xP  ]   c $R]x ] &xpQvw  T,jJ?b k(define qb:unweave (lambda (pgm query tree-vars);->tree (let* ((metaobjects (elaborate-program pgm)) (all-envs (possible-envs (query-vars query) metaobjects)) (tree (make-empty-tree))) (for-each (lambda (env) (if (match? env query) (let ((vals (map (lambda (var) (lookup-var var env)) tree-vars))) (add-to-tree! vals tree)))) all-envs) tree))) llC^     ? AG@5MH  0޽h ? ff!___PPT10i.p=+D=' = @B +1 iK0 00BB .(   ~  s *xu]xP  ] 2   `jJԔԔ8c8c?0 v  N1?@Wv  N1? *$v  N1? $|"  THnIt}1?WjZ |"  @ THtI1?WZB p2  HjJ?p0p2  HjJ?p2  HjJ?p2  HjJ?p2  HjJ?@pp2  HjJ?Pp2  HjJ?P@pp2  HjJ?0p2  HjJ?P2   `jJԔԔ8c8c? `7 2   `jJԔԔ8c8c? p p2  HjJ?  @ @ p2  HjJ? J z P p2  HjJ? P 0 p2  HjJ? ` 0 p2  HjJ? 0 p2  HjJ? P p2  HjJ? P p2  HjJ? p2  HjJ?  @   T] jJ?7  > A: programs A  Tl] jJ? (  ? X: programs  Apr  H jJ?p v  @ NjJ?   ! T] jJ? & |&JP: class,method,& A v " NԔ?.  #  0e0e    BAC>DEF   Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `"`R@ $ @  `G/HgIԔ? j  %  f^,] jJ9? + b  gIDA: signature matching4PAIA &  0e0e    BqCDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E||q-g@  c  '  0e0e    BCpDEF Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|||Fp@ 0 P + ( 3 r^,X] jJ1ԔȜ8c? |1  EFFA: provide metaobjs.4PAIA ) Zvl] jJ? C aEFFB: build tree4PAIA * TL] jJ?)  ;B: treeAv + N1? v , N1?P 0gv - N1?Pg|" . THI8"1?p`P|" / @ THAIgG1?`HPp2 0 HjJ?6p2 1 HjJ?p2 2 HjJ?#p2 3 HjJ?p2 4 HjJ?Fv#p2 5 HjJ?p2 6 HjJ?Fvp2 7 HjJ?Csp2 8 HjJ?V# 9  >%0e0e    BAC>DEF @  Ԕ 8c8c     ?1 d0u0@Ty2 NP'p<'pA)BCD|E|| A{9r?>  @  `S"   : TD]̙ jJ?"`   @?MN, ?CN  c |B ; TDjJ?3   < T] jJ?   GMETA: variable listApr = H jJ? 3 pr > H jJ?  ? @  `G/HgIԔ? R  @ @  `G/HgIԔ?  A 3 rر] jJ11ȜȜ? s  Z IDB: query4 PAIA B NL] jJ?9  qthis is unweaving process<C GCH  0޽h ?        ! #  " 9  $ , + . - + / 9 > ?  9 = @  y___PPT10Y+D=' = @B +v 0 6.(  X  C 8    .  S ȯ @    (30mins ECOOP) I m going to present a modeling framework that explains crosscutting concerns in different mechanisms of aspect-oriented languages BTW, this is a join work with Gregor Kiczales,H  0g ? ̙33v 0 PH(  X  C 8    oH  S o @   o the first mechanism I will show is called PA, which stands for pointcut and advice. it is from the dynamic part of AspectJ language there are three key language elements: join points, pointcuts, and advice join points are well defined points & pointcut is a description that specifies & advice is a declaration that specifies & let s see an example the language is asymmetric in practice: classes or packages in the component language is a dominant modularity, and the advice declarations are inferior modularity ^zcz2 X?,? 3H  0g ? ̙33P( 0 (('(  X  C 8    o'  S t;o @   o &>Our framework provides a basis for understanding and comparing how each of the mechanisms enables crosscutting modularity. To do so we first need to introduce a new model parameter, to capture the units of modularity of the A and B languages. Such a unit in A (and B) is called mA (and mB, respectively). Following are the values for each of the five models. Note that these are not the only possibilities for modular units of each of these models. In PA for example, we could do as AspectJ does, and mB could be an aspect declaration. In all the models we could use higher-level units of modularity like packages. For this reason we have not included the unit of modularity as part of the core framework, although one could certainly do so. The analysis of this section can easily be repeated for such alternative units of modularity. We say that the projection of a modular unit mA in a program pA onto X is all the join points in X identified by the AID elements within mA. The same is true for B. For example, in PA, the projection of a given advice declaration is all the join points matched by the pointcut of that advice declaration. We say that the modular structure of a particular pA and pB crosscut with respect to X if and only if there exists a pair of modules in pA and pB such that their projections onto join points in X intersect, and neither of the projections is a subset of the other. illustrates this situation. Below, we show how this framework extension accounts for crosscutting in the five examples from Section . In PA example (Section ) the Point class and the display updating advice crosscut each other with respect to X. The projection of the Point class on X includes all methods of the Point class. The projection of the aspect on X includes (calls to) the setter methods of the Point and Line classes. So the projections of the Point class and the advice intersect, and neither is subset of the other. In the TRAV example (Section ) the Point class and the traversal description crosscut with respect to X. The projection of the Point class includes all arrivals at Point objects initiated by any traversals. The projection of the traversal description includes arrivals at Point objects as well as arrivals at objects of other classes such as Line and LinkedList. In the COMPOSITOR example (Section ) the Point class and the Observable class crosscut with respect to X. The projection of the Point class on X includes all methods of the Point class in X. The projection of the Observable in B includes all set methods of Point and Line classes in X. In the OC example (Section ) the Point class in A and the DisplayMethods class in B crosscut with respect to X. The projection of Point in A contains all but the draw method of Point in X, and the projection of DisplayMethods contains draw methods of Point and Line classes. In the QB example (Section ) the Point class in A and a sub-tree in B that has label  moveBy as a method name crosscut with respect to X. The projection of the Point class includes all the methods of Point class. The projection of the sub-tree includes moveBy methods of Point, Line and FigureElement classes. Assuming the FigureElement class and its children all have a method moveBy, which moves the position of the element by the specified amount. Note that this analysis does not allow us to say that a given mechanism is crosscutting, only that it can support crosscutting. Or, in model terms, we cannot say a model is crosscutting, just that a particular pair of modules from particular pA and pB crosscut each other. This should not be surprising, an OO program does not have to have a hierarchical inheritance structure; it is simply that the language supports it. c c k c c k c c k ^c c c c k c c k 7c k c c k c c k c c k c c 4c c k c c k c c  dc c  (c c  Xc c  c c  $c c  hc c  Wc c  c c  gc c  Ac c  c c  +c c  c c  9c c  (c c  $c c  "c c  c c  0c c  c c  ;c c  c c  c c  c c  c c  c c  +c c  0c c  c k Dc c  #c c  0c c  c c  c c  c c  c  c c k c c k c    {JPM [  *5H  0g ? ̙33 0 P$(  $X $ C 8    o $ S  o @   o  H $ 0g ? ̙33 0 vnp p(  pd p c $8    ob p s *o @   o "we developed a modeling framework that covers all four mechanisms we have a general framework that abstracts differences of those mechanisms, and a concrete model for each mechanism; so let me present concrete ones first; this is the model for PA mechanism there are two programs: A-method declarations, and B-advice declarations there is the third space X, which represents computation of programs each join point in X represent a method call the model works in this way: when a method call is requested during execution, it looks up matching elements from A and B by using IDa-method lookup and IDb pointcut matching then the matching elements in A and B provides behavior onto the join point by using EFFa  method execution and EFFb  advice execution this is how the model works 6t@_*H p 0g ? ̙33D 0 0 (  d  c $8    o  s *o @   o ~from the implementation of PA mechanism, we observe the following requirements to the model first, methods and advice declarations are treated similarly, although they play different role from the viewpoint of the programmer. in the implementation, both methods and advice declarations are looked up in terms of current join point, and then executed this suggests the model can symmetrically treat those two spaces second, the join points come from the execution of a program, not from the elements in the component program. this suggests that the nave model which weaves aspects into A, is not good because that considers the join points statically exist in the component program rather, this suggests that the weaving should be into the third space; which is the execution of a programLnnH  0g ? ̙33 0 P 4(  d  c $8    q  s *q @   q  H  0g ? ̙33 0   4(   d  c $8    q  s *q @   q  H  0g ? ̙33 0  ( k(  ( d ( c $8    o  ( s * q @   o U  The weaver for COMPOSITOR is a source-to-source translator, which merges two BASE programs into one, under control of a composition description. The code of the weaver is shown in . It receives two programs, namely pgm-a and pgm-b, as well as the description of the matching and merging to use, namely relationships. The first step is to compute all possible compositions of declarations in the merged program. We call these seeds, and they are produced by compute-seeds. This is done by computing the power set of the union of the declarations in pgm-a and pgm-b. The list of seeds is sorted in set-inclusion order, with subsets following supersets. For each seed, there are up to three steps: 1. The procedure all-match determines whether this set should actually be merged according to the composition description, and returns the signature for the composed declaration when it should. In the simplest case, a seed of two method declarations (coming from pgm-a and pgm-b) having the same signature m matches, and returns m as the signature for the composed declaration. I.e. the set: {, } is merged as in the composed program. 2. The procedure merge-decls computes the body of the actual declaration. I.e. { this.x = x; display.update(this); } 3. The procedure add-decl-to-pgm adds the declaration to the resultant program with the computed signature. For any seed that is merged, all subsets of that seed are removed from the remaining seeds before proceeding. The procedure all-match first picks a signature from the declarations in the given seed, and then checks that all the declarations can contribute to the signature. In order to allow renaming, it takes a relationships parameter as an additional argument: (define all-match (lambda (decls relationships) (let ((sig (pick-signature decls relationships))) (and (every? (lambda (decl) (signature-match? sig decl relationships)) decls) sig)))) The merge-decls procedure also receives relationships as an argument. Richer merging mechanisms, such as overriding and bracketing (i.e., before/after/around-like merger), can be supported by extending the meta-language and this procedure.  c c  c c  Hc c  c c  Nc c  c c  c c  c c  c c  c c c c Ac c  c c  c c  *c c  7c )c  c c  c c  c c  c c  c c  c  ^?v(3y M<H ( 0g ? ̙33 0  4 4(  4 d 4 c $8    q 4 s *fq @   q  H 4 0g ? ̙33 0 h 4(  h d h c $8    q h s *8yq @   q  H h 0g ? ̙33 0 qip (  p X p C 8    qi p S }q @   q }there are two contributions in our work 1st, we provide a common modeling framework that covers several different AOP languages such as AspectJ, Hyper/J and Demeter the framework looks like this; one of the important point in the framework is that it parallels component programs and aspects, unlike nave models another important point is that it has the third space where weaving happens the 2nd contribution is we explain modular crosscutting in terms of this model. which is something like this; two modules intersect in the third space and the framework was obtained through simplified implementations called Aspect SandBox. because those real languages are too complicated to be modeled concisely, we excerpted core mechanisms, and build our own implementations in Scheme language implementations are different, but we can see similar structures if we have this framework in our mind6~)a,H p 0g ? ̙3380___PPT10.2L*  0    Q (   d  c $ 9    q   s *\q @   q ; The Demeter systems (Demeter, DemeterJ and DJ) provide a mechanism that enables programmers to implement traversals through object graphs in a succinct declarative fashion. The effect of this functionality is to allow the programmer to define, in a modular way, a traversal that would otherwise require code scattered among a number of classes. They work by defining the traversal as well as what actions to take at points along the traversal. In this section, we work with a simple traversal semantics, called TRAV. TRAV supports declarative description of the traversal, but not whether to call the visitor at each object in the traversal; the visitor is simply called at every object in the traversal. As with PA above, while this omits important functionality, that omission does not impact the suitability of the general framework. Section shows how the omitted functionality can be added. An example of a program fragment written using TRAV is: Visitor counter = new CountElementsVisitor(); traverse("from Figure to FigureElement", fig, counter); This code fragment implements the behavior of visiting all the FigureElements reachable from a Figure. The first argument to traverse is called a traversal specification, it describes the path to follow to each object to be visited. The second argument is a root object, where the traversal starts. The third argument is a visitor, which defines behavior at each traversed object. In this case the traversal mechanism is taking care of iterating through the elements of the figure, and following down through line objects to reach point objects. The visitor is called on every object in the traversal, including the Figure as well as the List that holds the FigureElements. The actual visitor must decide which objects to count, in particular not to count the List. We preserve the critical property of Demeter that the range of traversal is based on reachability information from the class graph, in addition to information about the dynamic class of the current object. Therefore, when the traversal comes to a Line object, for example, it goes on to the Point objects referenced by the Line, but not to the Display object because the class graph shows there are no ways to reach a FigureElement from a Display. aoa  ?aa  aa  aa  aa  aa  a a  Yaa  aa  (aa  aa  aa  Ca a  aa  a YE B H  0g ? ̙33 0  (   d  c $ 9    qt  s *s @   q The weaver implementation for TRAV is the procedure trav:weave. We modify eval-expression from the BASE interpreter to call trav:weave to implement the new traverse primtive. The code for trav:weave is shown in . The traversal process can be seen as a simple depth-first walk with a navigator that restricts the walk. When the walk arrives at an object, it calls the visitor with the object, and then recursively walks the objects referenced by the object. At each step along the way, it first checks with the navigator about whether or not to proceed. The navigator checks whether to traverse to an object in two steps. It first locates possible positions of the object in the traversal specification. The traversal specifications following those positions are then tested against the class graph. The test succeeds when there exists a path on the class graph that matches a remaining specification. We implement this in a simple way. We assume the root object is always a legal root of the traversal specification. In order to locate positions in the specification, the code manages a path that keeps track of a sequence of classes walked from the root. The match? procedure checks whether the whole path matches the traversal specification by using two sub-procedures that correspond to the two steps above. (define match? (lambda (path trav-spec) (let ((residual-spec (match-path path trav-spec))) (match-class-graph? residual-spec (path-last-cname path))))) The match-path procedure matches the path to the traversal specification by repeatedly matching each class in the path from the root. The matching algorithm is implemented by simple conditional cases on the kind of the directive at the head of the specification. The code returns either a remaining specification for partially matched cases, an empty specification for completely matched cases, or false for unmatched cases. When a class matches more than one position in the specification, an or-specification is returned as a result. A more sophisticated implementation would implement these steps with a state transition machine so that it could avoid complicated checks at each object. (define match-path (lambda (path spec);->spec (let loop ((cnames (path->cnames path)) (spec spec)) (if (null? cnames) spec (loop (cdr cnames) (match-cname (car cnames) spec)))))) (define match-cname (lambda (cname spec);->spec or #f (cond ((null? spec) #f) ; unmatched ((to-spec? spec) (if (subclass? cname (to-spec-cname spec)) (make-or-spec '() (list spec (spec-next spec))) spec)) ...))) The procedure match-class-graph? matches the remaining specification against the class graph, and returns true or false. For a to-specification, the matching is simply subsumed by the reachability to the specified class. Note that the reachability is decided by only looking into the class graph. In the implementation, the procedure reachable?, whose definition is not shown here, does this by using global variable *classes*. (define match-class-graph? (lambda (spec root-cname);->boolean (let loop ((spec spec) (cname root-cname)) (cond ((eq? spec #f) #f) ; already unmatched ((to-spec? spec) (reachable? cname (to-spec-cname spec))) ...)))) Calling the visitor at each object just involves calling the visit method with the object as its only argument. (define call-visitor (lambda (visitor obj) (call-method 'visit visitor (list obj)))) H4  .  ~=D58 T$8 ' , Y#(H  0g ? ̙33 0 0 4(   d  c $ 9    s  s *s @   s  H  0g ? ̙336  0   P  (   d  c $ 9    s  s *q @   s pOpen class mechanisms make it possible to locate method or field declarations for a class outside the textual body of the class declaration. Open classes first appeared in Flavors , where class declarations did not lexically contain any of their method declarations. Open classes are used in a variety of ways to modularize code; a common use is to solve versions of the visitor problem. In this section, we work with a simple version of open classes in which method declarations are contained within class declarations, but it is possible to mark certain method declarations as defining methods on another class. We call this simple semantics OC. Building on the running example, the following OC code defines draw methods for the different kinds of figure elements in a single DisplayMethods class  it modularizes the display aspect of the system. class DisplayMethods { void Point.draw() { Graphics.drawOval(...); } void Line.draw() { Graphics.drawLine(...); } } V cc  ;c{c  X A H  0g ? ̙33  0   p f (   d  c $ 9    s  s *[s @   s PWe implement OC as a pre-processor that operates on a program consisting of normal BASE code intermixed with open class method declarations to produce a BASE program. This pre-processor pass is the oc:weaver procedure shown in . The first step is to remove all open class method declarations from the input program. This is done by remove-oc-mdecls and gather-oc-mdecls. The open class method declarations are then each copied into their appropriate class. The lookup-oc-mdecls procedure finds, for a given class name, which open class method declarations should be copied into it. The copy-oc-mdecls procedure then copies those declarations, changing their signature from the open class form . to the normal BASE form . (define lookup-oc-mdecls (lambda (cname all-oc-mdecls) (collect-if (lambda (oc-mdecl) (eq? (oc-mdecl-cname oc-mdecl) cname)) all-oc-mdecls))) (define copy-oc-mdecls (lambda (cname per-class-oc-mdecls) (map (lambda (oc-mdecl) (make-method-decl cname (oc-mdecl-rtype oc-mdecl) (oc-mdecl-mname oc-mdecl) (oc-mdecl-params oc-mdecl) (oc-mdecl-body oc-mdecl))) per-class-oc-mdecls))) c c  }cc  cc  \cc  mcc  ]cc  cc  cc  H   c r ^   !       H  0g ? ̙33 0  4(   d  c $ 9    s  s *vs @   s  H  0g ? ̙33t 0 4, (   d  c $ 9    s   s *s @   s  QJBrowser is a code exploration tool that extracts certain properties from a program, and presents them in a hierarchical view. It can be seen as constructing customized structure browsers based on descriptions of the structure provided by the user. An ordinary class browser can be defined as a special case. The user specifies the properties to extract in terms of logic predicates over the structure of the code. An additional specification talks about how to group the results of the query into hierarchical form. shows two sample views generated by of QJBrowser. The following query appears in the middle pane in each view: class(?C), method(?M), parent(?C,?M), name(?C,?CN), name(?M,?MN) This query finds all tuples of a class, a method defined in the class, and the names of the class and method. Each tuple is represented as an environment that binds variables C, M, CN, and MN to the values in the tuple, respectively. The list of variables in the top pane determines how the collected tuples are viewed. The position of a variable in the list specifies at which level in the tree those values are displayed. In the left screenshot in the figure, the list  ?CN, ?MN specifies a familiar view where method names appear under class names. When the list is changed to  ?MN, ?CN as in the right screenshot in the figure, we get the same information in a reversed view. With this view, we can grasp groups of classes that define methods with the same name. In this paper, we focus on a simple mechanism of constructing the hierarchical structures based on queries and lists of variables. We call this simple functionality QB. Other features that make QJBrowser useful, such as a library of predicates and integration into IDE, are omitted. HZycIc  c ' X]S PH  0g ? ̙33 0  `(   d  c $ 9    s  s *s @   s J^Since QB is a tool to provide different views of input programs, it is implemented by an unweaving process, rather than a weaving process. The qb:unweave procedure at the bottom of as shows the process. The arguments to this procedure are a program, a query and a list of variables, the result is a tree structure. The first step of the procedure is to elaborate the program to produce class and method structures, and then collect a single flat list of all those class and method structures, or metaobjects. This is done as follows: (define gather-metaobjects (lambda (pgm) (set! *classes* (init-classes)) (elaborate-class-decls! (program-decls pgm)) (append *classes* (apply append (map class-methods *classes*))) Figure  Sample hierarchical views in QJBrowser From the collected metaobjects, qb:unweave generates a list of environments that bind variables in the given query to the collected metaobjects or other values, such as class and method names. For simplicity, this nave implementation generates environments for all combinations of the values, and lets the query interpreter filter valid ones. In practice, a real logic-programming engine would replace this inefficient approach. The procedure qb:weave then creates an empty tree, and incrementally adds nodes to the tree by looping over the environments. Each iteration of the loop computes a truth-value of the query for the environment. When it is true, values bound by the specified variables are taken out of the environment. The add-to-tree! procedure descends the tree from the root by finding (or creating if not found) a subtree that contains the value in the list. (define add-to-tree! (lambda (vals tree) (if (not (null? vals)) (let ((subtree (or (find (car vals) (tree-subtrees tree)) (tree-add-subtree! tree (car vals))))) (add-to-tree! (cdr vals) subtree))))) Yc c 4c c  c c  c 2c c c  c c  c c  c /c    Y +  ; t   Z -zF"% H  0g ? ̙33 0  4(   d  c $ 9    s  s *s @   s  H  0g ? ̙33  0   (   X  C 8    s  S s @   s  H  0g ? ̙3380___PPT10.M@z? 0 f^0 (   X  C 8    s^  S ts @   s |our interest is the essence of AOP, or a model that characterizes common features in AOP languages and systems you can think of a nave model which is abstracted from the previous slide, where elements in aspects are injecting some effects into the elements in component programs but this model is not sufficient as it does not capture several critical mechanisms: for example it does not capture symmetric mechanisms that can be found in Hyper/J & so what we would like to do is to find a model that is general enough to cover those mechanisms and at the same time, that is special enough so that it can illustrate the nature of AOP and the nature is, as I have talked in the last slide, crosscutting`yH0DyH0DH  0g ? ̙3380___PPT10.M   0 @ (   X  C 8    s  S Dq @   s  H  0g ? ̙3380___PPT10.M3^ 0 IAP (   X  C 8    qA  S q @   q it identifies a method matching to the join point, it also identifies advice declarations matching to the join point, then it interleaves executions of those matching method and advice declarations. H  0g ? ̙3380___PPT10.Mp  0 p (   X  C 8    q  S q @   q  H  0g ? ̙3380___PPT10.5PS 0  ,(   X  C 8    o  S t @   o .Filman and Friedman claimed that the essence of AOP is  &  . this property, which we would like to call non-invasiveness rather than obviliousness, is still implicit in our framework; so we would need to add extra parameters to discuss this property in our modeling framework this also suggests that some AOP like mechanisms that is invasive can be captured by our framework; $~ H  0g ? ̙3380___PPT10.ZP  0  (   X  C 8    t  S t @   t  H  0g ? ̙3380___PPT10.[Pf  0  (   X  C 8    t  S o @   o  H  0g ? ̙3380___PPT10.[P@C 0  S(   X  C 8    t  S t @   t UAwe are able to find crosscutting examples for all four mechanismsH  0g ? ̙3380___PPT10.[P  0  (   X  C 8    t  S t @   t  H  0g ? ̙3380___PPT10.[P`  0  (   X  C 8    t  S t @   t  H  0g ? ̙3380___PPT10.[P/  0  (   X  C 8    t  S @%t @   t  H  0g ? ̙3380___PPT10.[PP˶  0  (   X  C 8    t  S *t @   t  H  0g ? ̙3380___PPT10.\PP  0  (   X  C 8    t  S /t @   t  H  0g ? ̙3380___PPT10.\PU  0  (   X  C 8    t  S  5t @   t  H  0g ? ̙3380___PPT10.\Pp575x} |Uŵ<$Wkk5 @%ޠg\ؿ W#taB؏.M0Ɵ']zi8_| =yGLlV)_ ?F?+=;WMA]/_~pƑ'^G0?ϖ%r 7psgTI-d\9?zH34~G!s7QU5ZB5aߪPstZ BU‘BZ‹KiGh):it4>:C??tK{rKsE~^-?NC|ƅ׍hZ:f[86>W/rd;s f!?&2|y7r7]Dȸ*LM}D2+&F] } o`&Y?8̟xkcxdl$3tDA.K{rlbE%shw=^['ǬOn|z+3wY' 0k_41~f| r8O9a~vd]g'PVW8G-MB_.jLW2kJ_ytS1 A{qyZ0AOյEb6X@ Y3s_/-W:43op)q쿵<$ x)9[1o?OԦْ{xKp~d yPkshs j1 HEg?&8 hZ0ݗݽ=9Os |Gvg9ȑ sI7iΆ$g V!Z-[=Fx;_K.R:'-.`̖Q]^~~[~iR*b 4T\x,!r8C9d.o698/쳴"y2w|p+ms~#F} )(Uڹ16=dB-q-_"`-fs̕er0e8iyn٨O&~JkuFB#:qHp;;5My2[. .^psLq,~jwNxN^v˧"1U37^qCb[R+08TNٍڭ'M>X'(n"{ZL?rW9vX-\[?Y.u / %4IؙqѹV7syMM}TH'Fkyz4mf\K}+,qMҖ.$2VKGj͍M Rj>-St] k醳`P.-SmDKɒ Nٝ0.,i't1_YieҥB("aiEp-꺜 -#wFnSd 8:E+m2Th}<R/j}< },X2AG4^X?s},ecլIϫli'h)Ge=_?F˩Cwޱ55kS4 ŐNAaƩi5Kj/Z4K.eݯ\ I6$.Y/jPۀ"#:24yy#-M&X8&S4F+*sm7BRQƶeM,~~ý?g|}lKMYw[w;PQPJwy#~i[=yZЅ# ω|vЋ֒2[ew q饖t8n⼘Ƽm',N= d=~!gcDN"{Z.#}μU۬j(ћyfܡ 2zdn=W>:a89$tƅ|XRUlLm07Zj( UZp`]>PT-]5^k҆[,2b=QYL4=Mӳdo="Mz5IޠIOMO MO8y\{;;1t$f M.ì(8ވYO\omy띿.^aWZi夃fwe .jVLxG=n놩Q̦Q^`..nm{<˧>2..qa}]&|kӚ6N{dy5uSӆi w(V1?;"m׽aݛхYv#g{93ќp靏RvZ& {}O,=(=N4 &aw+8\ +ڊZ4g,\C,IYxqm6N.v)F 3&HSȋК芔EYEy^_QTKR-ZJj)RuFV,j):1RVKME(]łQ-˳*QJRTKR-ZJNWN{dNr"-+Ң.~ ,^tVګ.~_ZCڨcJk$iuC/-!mT%XZ2+#):TFIM:y oX GJSuVV~1Ubu51?};+51a>;6YmfOwgDug ;c~zWLIXI.֍]b~zDӕ9FF= Prj)RNVO,?~K\A!(h3[' p*4Ar=C#]H$r7_'^]W%pk.| 6p?k= <_  $ygQ_$6~8~xx 14 [U< 灟IQWq9:Qڣ'F4Ϣ,Egi}G9w4-{U)KVV},^*"l ^L]M-ir9EFs޷1k;CL74y߾'RHM$?ye .};k q^w59v?=}&ɛ\Clo">}r`K疟n[Ea0#;ǒdQeǤ[IM1_QFY+RH"E)RH"E7? 559x~99/Oy~kssYR^W$Wvy.ڳ(?Kkrn>G2M>X5k+5&M>?ؠ?'^\VY]uƐoq6X:9˰$/Xy$<+_+R~\.޻O\7nƢ|gcn˨H"E)RH"Eys48 g%[%3֮_O79&$k$^lbG^&m >Z:f[86>^Ƃ~t菨I~ x~FcysW3Q2 z_ܝ'zʳgWq_¶މi$4l40H<2 6|Ùnw?:")hM9xSrV-rk͕OS^˓|Xb"{rs*?6#2|8O9a~vd]g'PVW8G-MB_.jLW2kJ_ytS1 A{qyZ0AOյEb^Yܷ;<Xnt(!rӐ^^?=щyV3㻮kci{*۝#\V#oYH/'˽^>;r:1AMvu?t8A:^4Fަk2N^E\'j&׽hF>\`r7't-gp1 |@]<$bQG_&ͅBI\$#@ Pa`Φ?́eD-ΙGf5xS(sM.m}k_V=hwˀ p Ne?c:Mz\z:oGO?~< <^JV>?i)E^~/eƱ{}%2/g?qLǽw@O Vᣢ&6 howecwto{Γm|@Fi&e~JkuFqL&)oF#ߑY;f e,%kȱĒEw|BFL-w\@)euN,fS]]6ы3oˏ?MKElrƜ P"rŵ"3Dr2"g}6Su"CE$Wȱ6,&!&89SZQs 6{["[qK`3WXGp[`"nxn86e\l\,xœ2ɳ%S8y9ye.J?|TxY!/ J8R9f7kL!qK㎫uF(d(gZmKQpRʵR0 RRJ#sȹV7s#.-Nm(Q+*HfƵĈ߷|M7q$=@\:TLmn\mJTK!j&^)ttS0(i)S6"TZAuULݹB˒6!?!z9NJ-S!Q ՁOx7D"2K%9dV$l<.W]S_ecnmGhB -UEM¢eK&Kc'{Nll7}нՒ9YyuN;Vcx j5kSjre1ڑۓ9b(NHM[YR{kafDݫ(x jK'v]^/˪c(u ȈM^vB3m^g Ω؞{ZЅ#s+kJ h-9^2UV{7YwR-nBzoLjSm;p~֧Yo ;#^!#kf!>+Mmux޵yLo;3\Eӻ_m(k[S}C]`5Vȷ`)ЄΨrh1y1y3T _ƍ{hVa}Pk` hm .E7<{kW]ǹfy^RzeDx\ s@PZHB4YyBd\.KaVJ|7Obxf-*(K-nB`_k _|a:8w: Y1|NKP:.b]G| _#i}WZ1%or,Y\C5 \ʆM~ַ oWH[ r i"`n<v/r^ܻK,iNr3]ܟ\SɩTr*9>PIK44@8eE&|φs 9Ƶ XF^~~xgoNw[k ?d2^IUx w^QgWU73d2O\ani SLh ==q^LcO6p'`^E2ur3A\O["Ld=-LTP^g^\*KmXgtMtp]Є=NCi~0'_h{H"𚏓[Zj SB E`QKC9kq7ԞJbk}M^pQ<"]':IzizM'YI/r&=4I) '8`/;sr'ޝN1;=\YQjqxVG~ RT鋘 U~}%݂#yO}qݳy.q[WmFO.n j^]ܭ{*%}]Vĕy]W{.O{NFO;_:.ťmcӑƿ=5ړdoWv;lˣK7n7foylKawEGxpm~͡Y_;i}\J?WZS6no6q[n.λ5]vqme7 ҊO+'\7C/ G?L|̕vq=Vb/ō]?:wˈ^7Ld6zvywYvk5Y>avq [ۅhܴ{7[ִqwc'˫6,8lOKCFIl>$~хYv#g{93ќp^ڸ{ga/XqFYqY7 [peJ8\9Vբ9k5d dO‹cotrK0Ri\6i\FB^LcIWαI&%- ǒ>%1}MBHf3$!ϐ>/->_Z? Qqy37T\vzo}tzζXpEYpd!p !ESl7n=RDYEqʠ+>4"}(XtEӣ,;}ٝe; ,vg "ã,ڇEAWXx|J3_oH넼cLe&km%Yba\Ķ"ZcOjX=G´GզW X o9Dx_ID+DՇA j5e^,GM%qic{ ~\wم{Dm-ҰueދDjK8uJ5 N_9Q˩I#S2;'z%(v= 2sǙZW֔:2>-OQ(#k֠7i})NJ7/ޛ+Rt⎽_i/[N`F mW~L%I8s^8Bӥ;mGe1Xcv >:\yܺYr6!ҌQz۩3YzlHZ3zb |։x#/܈Xv0!mb:a&!85H涂12+;P2vw"ںAs_eaN!x5#_@ԳA|UiT?Z`dpb*5Kq$KwjŰ[Ӎj }KA2K4ngnm'mfuHs8pt'uZ/M|tGǷߦxƷH1l_H2ɻ}bcmƥqGz%l&٥JZ%VIkV"E':zO9Z?)#Sx+zO;YS9?zOz(]S+;;:PJZ%VH"E)RH`^_or@fZs6|'ӉTz+SUij:'9>@ʦ H@tn%Wz@Fq04 C$ uvQ4h/&$(;Վrѫiy=2AdGr.;MOZ5d!fvԤ3G[ov? Oh+'0 x$ @P p |  Modeling FrameworkHidehiko Masuhara-for presenting at TM-workshop on Dec. 2002 owe)U:\current\pado-2\presentation\pado2.ppt2 Hidehiko Masuharapr1560ikoMicrosoft PowerPointsen@и=@]Դ@eC@RPGPg  7  f-- @ !--'@Times New Roman-.  2 1 .System-@"Arial-. '2 ,modeling crosscutting/  .-@"Arial-. 2 ns in aspect .-@"Arial-.  2 nR-.-@"Arial-. $2 neoriented mechanismsn / /.-@"Arial-. !2 6Hidehiko Masuharam   &.-@"Arial-. '2 \(University of Tokyo)      .-@"Arial-. 72 f joint work with Gregor Kiczales           .-@"Arial-. 72  (University of British Columbia)         .-՜.+,D՜.+,    画面に合わせるaU-Tokyo & UBC'$$A 0Times New RomanMS PゴシックArialMS P明朝SymbolComic Sans MS WingdingsMS 明朝Times Courier New pado2.pptMicrosoft Word 文書4modeling crosscutting in aspect-oriented mechanismsスライド 2what’s the essence of AOP?contributions & approach talk outlinePA – pointcuts and advicePA: implementation%observations from PA implementation"COMPOSITOR – class compositionCOMPOSITOR: implementationCOMPOSITOR: implementation-observations from COMPOSITOR implementation TRAV & OC%the modeling framework: PA’s case(modeling framework: COMPOSITOR’s casethe modeling frameworkmodels for 4 mechanismswhat’s modular crosscutting?*an example of modular crosscutting in PAwhat’s modular crosscutting?"examples of modular crosscutting related worksummaryスライド 24TRAV – traversalsimplementation of TRAVimplementation of TRAVmodel for TRAVOC – open classesimplementation of OC model for OCQB – query-based browserQB – query-based browserimplementation of QBimplementation of QB model for QB "使用されているフォント  デザイン テンプレート$埋め込まれた OLE サーバースライド タイトル$ 8@ _PID_HLINKSA0http://www.cs.ubc.ca/labs/spl/projects/asb.html)_<Hidehiko MasuharaHidehiko Masuhara  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPQRSTUVXYZ[\]^`abcdefoRoot EntrydO)PicturesǮCurrent User_SummaryInformation(OPowerPoint Document(X`DocumentSummaryInformation8WRoot EntrydO)PWhs@PicturesǮCurrent User8SummaryInformation(O      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNPQRSTUVXYZ[\]^o _<masuharamasuhara