PNG  IHDRX cHRMz&u0`:pQ<bKGD pHYsodtIME MeqIDATxw]Wug^Qd˶ 6`!N:!@xI~)%7%@Bh&`lnjVF29gΨ4E$|>cɚ{gk= %,a KX%,a KX%,a KX%,a KX%,a KX%,a KX%, b` ǟzeאfp]<!SJmɤY޲ڿ,%c ~ع9VH.!Ͳz&QynֺTkRR.BLHi٪:l;@(!MԴ=žI,:o&N'Kù\vRmJ雵֫AWic H@" !: Cé||]k-Ha oݜ:y F())u]aG7*JV@J415p=sZH!=!DRʯvɱh~V\}v/GKY$n]"X"}t@ xS76^[bw4dsce)2dU0 CkMa-U5tvLƀ~mlMwfGE/-]7XAƟ`׮g ewxwC4\[~7@O-Q( a*XGƒ{ ՟}$_y3tĐƤatgvێi|K=uVyrŲlLӪuܿzwk$m87k( `múcE)"@rK( z4$D; 2kW=Xb$V[Ru819קR~qloѱDyįݎ*mxw]y5e4K@ЃI0A D@"BDk_)N\8͜9dz"fK0zɿvM /.:2O{ Nb=M=7>??Zuo32 DLD@D| &+֎C #B8ַ`bOb $D#ͮҪtx]%`ES`Ru[=¾!@Od37LJ0!OIR4m]GZRJu$‡c=%~s@6SKy?CeIh:[vR@Lh | (BhAMy=݃  G"'wzn޺~8ԽSh ~T*A:xR[ܹ?X[uKL_=fDȊ؂p0}7=D$Ekq!/t.*2ʼnDbŞ}DijYaȲ(""6HA;:LzxQ‘(SQQ}*PL*fc\s `/d'QXW, e`#kPGZuŞuO{{wm[&NBTiiI0bukcA9<4@SӊH*؎4U/'2U5.(9JuDfrޱtycU%j(:RUbArLֺN)udA':uGQN"-"Is.*+k@ `Ojs@yU/ H:l;@yyTn}_yw!VkRJ4P)~y#)r,D =ě"Q]ci'%HI4ZL0"MJy 8A{ aN<8D"1#IJi >XjX֔#@>-{vN!8tRݻ^)N_╗FJEk]CT՟ YP:_|H1@ CBk]yKYp|og?*dGvzنzӴzjֺNkC~AbZƷ`.H)=!QͷVTT(| u78y֮}|[8-Vjp%2JPk[}ԉaH8Wpqhwr:vWª<}l77_~{s۴V+RCģ%WRZ\AqHifɤL36: #F:p]Bq/z{0CU6ݳEv_^k7'>sq*+kH%a`0ԣisqにtү04gVgW΂iJiS'3w.w}l6MC2uԯ|>JF5`fV5m`Y**Db1FKNttu]4ccsQNnex/87+}xaUW9y>ͯ骵G{䩓Գ3+vU}~jJ.NFRD7<aJDB1#ҳgSb,+CS?/ VG J?|?,2#M9}B)MiE+G`-wo߫V`fio(}S^4e~V4bHOYb"b#E)dda:'?}׮4繏`{7Z"uny-?ǹ;0MKx{:_pÚmFמ:F " .LFQLG)Q8qN q¯¯3wOvxDb\. BKD9_NN &L:4D{mm o^tֽ:q!ƥ}K+<"m78N< ywsard5+вz~mnG)=}lYݧNj'QJS{S :UYS-952?&O-:W}(!6Mk4+>A>j+i|<<|;ر^߉=HE|V#F)Emm#}/"y GII웻Jі94+v뾧xu~5C95~ūH>c@덉pʃ1/4-A2G%7>m;–Y,cyyaln" ?ƻ!ʪ<{~h~i y.zZB̃/,雋SiC/JFMmBH&&FAbϓO^tubbb_hZ{_QZ-sύodFgO(6]TJA˯#`۶ɟ( %$&+V'~hiYy>922 Wp74Zkq+Ovn錄c>8~GqܲcWꂎz@"1A.}T)uiW4="jJ2W7mU/N0gcqܗOO}?9/wìXžΏ0 >֩(V^Rh32!Hj5`;O28؇2#ݕf3 ?sJd8NJ@7O0 b־?lldщ̡&|9C.8RTWwxWy46ah嘦mh٤&l zCy!PY?: CJyв]dm4ǜҐR޻RլhX{FƯanшQI@x' ao(kUUuxW_Ñ줮[w8 FRJ(8˼)_mQ _!RJhm=!cVmm ?sFOnll6Qk}alY}; "baӌ~M0w,Ggw2W:G/k2%R,_=u`WU R.9T"v,<\Ik޽/2110Ӿxc0gyC&Ny޽JҢrV6N ``یeA16"J³+Rj*;BϜkZPJaÍ<Jyw:NP8/D$ 011z֊Ⱳ3ι֘k1V_"h!JPIΣ'ɜ* aEAd:ݺ>y<}Lp&PlRfTb1]o .2EW\ͮ]38؋rTJsǏP@芎sF\> P^+dYJLbJ C-xϐn> ι$nj,;Ǖa FU *择|h ~izť3ᤓ`K'-f tL7JK+vf2)V'-sFuB4i+m+@My=O҈0"|Yxoj,3]:cо3 $#uŘ%Y"y죯LebqtҢVzq¼X)~>4L׶m~[1_k?kxֺQ`\ |ٛY4Ѯr!)N9{56(iNq}O()Em]=F&u?$HypWUeB\k]JɩSع9 Zqg4ZĊo oMcjZBU]B\TUd34ݝ~:7ڶSUsB0Z3srx 7`:5xcx !qZA!;%͚7&P H<WL!džOb5kF)xor^aujƍ7 Ǡ8/p^(L>ὴ-B,{ۇWzֺ^k]3\EE@7>lYBȝR.oHnXO/}sB|.i@ɥDB4tcm,@ӣgdtJ!lH$_vN166L__'Z)y&kH;:,Y7=J 9cG) V\hjiE;gya~%ks_nC~Er er)muuMg2;֫R)Md) ,¶ 2-wr#F7<-BBn~_(o=KO㭇[Xv eN_SMgSҐ BS헃D%g_N:/pe -wkG*9yYSZS.9cREL !k}<4_Xs#FmҶ:7R$i,fi!~' # !6/S6y@kZkZcX)%5V4P]VGYq%H1!;e1MV<!ϐHO021Dp= HMs~~a)ަu7G^];git!Frl]H/L$=AeUvZE4P\.,xi {-~p?2b#amXAHq)MWǾI_r`S Hz&|{ +ʖ_= (YS(_g0a03M`I&'9vl?MM+m~}*xT۲(fY*V4x@29s{DaY"toGNTO+xCAO~4Ϳ;p`Ѫ:>Ҵ7K 3}+0 387x\)a"/E>qpWB=1 ¨"MP(\xp߫́A3+J] n[ʼnӼaTbZUWb={~2ooKױӰp(CS\S筐R*JغV&&"FA}J>G֐p1ٸbk7 ŘH$JoN <8s^yk_[;gy-;߉DV{c B yce% aJhDȶ 2IdйIB/^n0tNtџdcKj4϶v~- CBcgqx9= PJ) dMsjpYB] GD4RDWX +h{y`,3ꊕ$`zj*N^TP4L:Iz9~6s) Ga:?y*J~?OrMwP\](21sZUD ?ܟQ5Q%ggW6QdO+\@ ̪X'GxN @'4=ˋ+*VwN ne_|(/BDfj5(Dq<*tNt1х!MV.C0 32b#?n0pzj#!38}޴o1KovCJ`8ŗ_"]] rDUy޲@ Ȗ-;xџ'^Y`zEd?0„ DAL18IS]VGq\4o !swV7ˣι%4FѮ~}6)OgS[~Q vcYbL!wG3 7띸*E Pql8=jT\꘿I(z<[6OrR8ºC~ډ]=rNl[g|v TMTղb-o}OrP^Q]<98S¤!k)G(Vkwyqyr޽Nv`N/e p/~NAOk \I:G6]4+K;j$R:Mi #*[AȚT,ʰ,;N{HZTGMoּy) ]%dHء9Պ䠬|<45,\=[bƟ8QXeB3- &dҩ^{>/86bXmZ]]yޚN[(WAHL$YAgDKp=5GHjU&99v簪C0vygln*P)9^͞}lMuiH!̍#DoRBn9l@ xA/_v=ȺT{7Yt2N"4!YN`ae >Q<XMydEB`VU}u]嫇.%e^ánE87Mu\t`cP=AD/G)sI"@MP;)]%fH9'FNsj1pVhY&9=0pfuJ&gޤx+k:!r˭wkl03׼Ku C &ѓYt{.O.zҏ z}/tf_wEp2gvX)GN#I ݭ߽v/ .& и(ZF{e"=V!{zW`, ]+LGz"(UJp|j( #V4, 8B 0 9OkRrlɱl94)'VH9=9W|>PS['G(*I1==C<5"Pg+x'K5EMd؞Af8lG ?D FtoB[je?{k3zQ vZ;%Ɠ,]E>KZ+T/ EJxOZ1i #T<@ I}q9/t'zi(EMqw`mYkU6;[t4DPeckeM;H}_g pMww}k6#H㶏+b8雡Sxp)&C $@'b,fPߑt$RbJ'vznuS ~8='72_`{q纶|Q)Xk}cPz9p7O:'|G~8wx(a 0QCko|0ASD>Ip=4Q, d|F8RcU"/KM opKle M3#i0c%<7׿p&pZq[TR"BpqauIp$ 8~Ĩ!8Սx\ւdT>>Z40ks7 z2IQ}ItԀ<-%S⍤};zIb$I 5K}Q͙D8UguWE$Jh )cu4N tZl+[]M4k8֦Zeq֮M7uIqG 1==tLtR,ƜSrHYt&QP윯Lg' I,3@P'}'R˪e/%-Auv·ñ\> vDJzlӾNv5:|K/Jb6KI9)Zh*ZAi`?S {aiVDԲuy5W7pWeQJk֤#5&V<̺@/GH?^τZL|IJNvI:'P=Ϛt"¨=cud S Q.Ki0 !cJy;LJR;G{BJy޺[^8fK6)=yʊ+(k|&xQ2`L?Ȓ2@Mf 0C`6-%pKpm')c$׻K5[J*U[/#hH!6acB JA _|uMvDyk y)6OPYjœ50VT K}cǻP[ $:]4MEA.y)|B)cf-A?(e|lɉ#P9V)[9t.EiQPDѠ3ϴ;E:+Օ t ȥ~|_N2,ZJLt4! %ա]u {+=p.GhNcŞQI?Nd'yeh n7zi1DB)1S | S#ًZs2|Ɛy$F SxeX{7Vl.Src3E℃Q>b6G ўYCmtկ~=K0f(=LrAS GN'ɹ9<\!a`)֕y[uՍ[09` 9 +57ts6}b4{oqd+J5fa/,97J#6yν99mRWxJyѡyu_TJc`~W>l^q#Ts#2"nD1%fS)FU w{ܯ R{ ˎ󅃏џDsZSQS;LV;7 Od1&1n$ N /.q3~eNɪ]E#oM~}v֯FڦwyZ=<<>Xo稯lfMFV6p02|*=tV!c~]fa5Y^Q_WN|Vs 0ҘދU97OI'N2'8N֭fgg-}V%y]U4 峧p*91#9U kCac_AFңĪy뚇Y_AiuYyTTYЗ-(!JFLt›17uTozc. S;7A&&<ԋ5y;Ro+:' *eYJkWR[@F %SHWP 72k4 qLd'J "zB6{AC0ƁA6U.'F3:Ȅ(9ΜL;D]m8ڥ9}dU "v!;*13Rg^fJyShyy5auA?ɩGHRjo^]׽S)Fm\toy 4WQS@mE#%5ʈfFYDX ~D5Ϡ9tE9So_aU4?Ѽm%&c{n>.KW1Tlb}:j uGi(JgcYj0qn+>) %\!4{LaJso d||u//P_y7iRJ߬nHOy) l+@$($VFIQ9%EeKʈU. ia&FY̒mZ=)+qqoQn >L!qCiDB;Y<%} OgBxB!ØuG)WG9y(Ą{_yesuZmZZey'Wg#C~1Cev@0D $a@˲(.._GimA:uyw֬%;@!JkQVM_Ow:P.s\)ot- ˹"`B,e CRtaEUP<0'}r3[>?G8xU~Nqu;Wm8\RIkբ^5@k+5(By'L&'gBJ3ݶ!/㮻w҅ yqPWUg<e"Qy*167΃sJ\oz]T*UQ<\FԎ`HaNmڜ6DysCask8wP8y9``GJ9lF\G g's Nn͵MLN֪u$| /|7=]O)6s !ĴAKh]q_ap $HH'\1jB^s\|- W1:=6lJBqjY^LsPk""`]w)󭃈,(HC ?䔨Y$Sʣ{4Z+0NvQkhol6C.婧/u]FwiVjZka&%6\F*Ny#8O,22+|Db~d ~Çwc N:FuuCe&oZ(l;@ee-+Wn`44AMK➝2BRՈt7g*1gph9N) *"TF*R(#'88pm=}X]u[i7bEc|\~EMn}P瘊J)K.0i1M6=7'_\kaZ(Th{K*GJyytw"IO-PWJk)..axӝ47"89Cc7ĐBiZx 7m!fy|ϿF9CbȩV 9V-՛^pV̌ɄS#Bv4-@]Vxt-Z, &ֺ*diؠ2^VXbs֔Ìl.jQ]Y[47gj=幽ex)A0ip׳ W2[ᎇhuE^~q흙L} #-b۸oFJ_QP3r6jr+"nfzRJTUqoaۍ /$d8Mx'ݓ= OՃ| )$2mcM*cЙj}f };n YG w0Ia!1Q.oYfr]DyISaP}"dIӗթO67jqR ҊƐƈaɤGG|h;t]䗖oSv|iZqX)oalv;۩meEJ\!8=$4QU4Xo&VEĊ YS^E#d,yX_> ۘ-e\ "Wa6uLĜZi`aD9.% w~mB(02G[6y.773a7 /=o7D)$Z 66 $bY^\CuP. (x'"J60׿Y:Oi;F{w佩b+\Yi`TDWa~|VH)8q/=9!g߆2Y)?ND)%?Ǐ`k/sn:;O299yB=a[Ng 3˲N}vLNy;*?x?~L&=xyӴ~}q{qE*IQ^^ͧvü{Huu=R|>JyUlZV, B~/YF!Y\u_ݼF{_C)LD]m {H 0ihhadd nUkf3oٺCvE\)QJi+֥@tDJkB$1!Đr0XQ|q?d2) Ӣ_}qv-< FŊ߫%roppVBwü~JidY4:}L6M7f٬F "?71<2#?Jyy4뷢<_a7_=Q E=S1И/9{+93֮E{ǂw{))?maÆm(uLE#lïZ  ~d];+]h j?!|$F}*"4(v'8s<ŏUkm7^7no1w2ؗ}TrͿEk>p'8OB7d7R(A 9.*Mi^ͳ; eeUwS+C)uO@ =Sy]` }l8^ZzRXj[^iUɺ$tj))<sbDJfg=Pk_{xaKo1:-uyG0M ԃ\0Lvuy'ȱc2Ji AdyVgVh!{]/&}}ċJ#%d !+87<;qN޼Nفl|1N:8ya  8}k¾+-$4FiZYÔXk*I&'@iI99)HSh4+2G:tGhS^繿 Kتm0 вDk}֚+QT4;sC}rՅE,8CX-e~>G&'9xpW,%Fh,Ry56Y–hW-(v_,? ; qrBk4-V7HQ;ˇ^Gv1JVV%,ik;D_W!))+BoS4QsTM;gt+ndS-~:11Sgv!0qRVh!"Ȋ(̦Yl.]PQWgٳE'`%W1{ndΗBk|Ž7ʒR~,lnoa&:ü$ 3<a[CBݮwt"o\ePJ=Hz"_c^Z.#ˆ*x z̝grY]tdkP*:97YľXyBkD4N.C_[;F9`8& !AMO c `@BA& Ost\-\NX+Xp < !bj3C&QL+*&kAQ=04}cC!9~820G'PC9xa!w&bo_1 Sw"ܱ V )Yl3+ס2KoXOx]"`^WOy :3GO0g;%Yv㐫(R/r (s } u B &FeYZh0y> =2<Ϟc/ -u= c&׭,.0"g"7 6T!vl#sc>{u/Oh Bᾈ)۴74]x7 gMӒ"d]U)}" v4co[ ɡs 5Gg=XR14?5A}D "b{0$L .\4y{_fe:kVS\\O]c^W52LSBDM! C3Dhr̦RtArx4&agaN3Cf<Ԉp4~ B'"1@.b_/xQ} _߃҉/gٓ2Qkqp0շpZ2fԫYz< 4L.Cyυι1t@鎫Fe sYfsF}^ V}N<_`p)alٶ "(XEAVZ<)2},:Ir*#m_YӼ R%a||EƼIJ,,+f"96r/}0jE/)s)cjW#w'Sʯ5<66lj$a~3Kʛy 2:cZ:Yh))+a߭K::N,Q F'qB]={.]h85C9cr=}*rk?vwV렵ٸW Rs%}rNAkDv|uFLBkWY YkX מ|)1!$#3%y?pF<@<Rr0}: }\J [5FRxY<9"SQdE(Q*Qʻ)q1E0B_O24[U'],lOb ]~WjHޏTQ5Syu wq)xnw8~)c 쫬gٲߠ H% k5dƝk> kEj,0% b"vi2Wس_CuK)K{n|>t{P1򨾜j>'kEkƗBg*H%'_aY6Bn!TL&ɌOb{c`'d^{t\i^[uɐ[}q0lM˕G:‚4kb祔c^:?bpg… +37stH:0}en6x˟%/<]BL&* 5&fK9Mq)/iyqtA%kUe[ڛKN]Ě^,"`/ s[EQQm?|XJ߅92m]G.E΃ח U*Cn.j_)Tѧj̿30ڇ!A0=͜ar I3$C^-9#|pk!)?7.x9 @OO;WƝZBFU keZ75F6Tc6"ZȚs2y/1 ʵ:u4xa`C>6Rb/Yм)^=+~uRd`/|_8xbB0?Ft||Z\##|K 0>>zxv8۴吅q 8ĥ)"6>~\8:qM}#͚'ĉ#p\׶ l#bA?)|g g9|8jP(cr,BwV (WliVxxᡁ@0Okn;ɥh$_ckCgriv}>=wGzβ KkBɛ[˪ !J)h&k2%07δt}!d<9;I&0wV/ v 0<H}L&8ob%Hi|޶o&h1L|u֦y~󛱢8fٲUsւ)0oiFx2}X[zVYr_;N(w]_4B@OanC?gĦx>мgx>ΛToZoOMp>40>V Oy V9iq!4 LN,ˢu{jsz]|"R޻&'ƚ{53ўFu(<٪9:΋]B;)B>1::8;~)Yt|0(pw2N%&X,URBK)3\zz&}ax4;ǟ(tLNg{N|Ǽ\G#C9g$^\}p?556]/RP.90 k,U8/u776s ʪ_01چ|\N 0VV*3H鴃J7iI!wG_^ypl}r*jɤSR 5QN@ iZ#1ٰy;_\3\BQQ x:WJv츟ٯ$"@6 S#qe딇(/P( Dy~TOϻ<4:-+F`0||;Xl-"uw$Цi󼕝mKʩorz"mϺ$F:~E'ҐvD\y?Rr8_He@ e~O,T.(ފR*cY^m|cVR[8 JҡSm!ΆԨb)RHG{?MpqrmN>߶Y)\p,d#xۆWY*,l6]v0h15M˙MS8+EdI='LBJIH7_9{Caз*Lq,dt >+~ّeʏ?xԕ4bBAŚjﵫ!'\Ը$WNvKO}ӽmSşذqsOy?\[,d@'73'j%kOe`1.g2"e =YIzS2|zŐƄa\U,dP;jhhhaxǶ?КZ՚.q SE+XrbOu%\GتX(H,N^~]JyEZQKceTQ]VGYqnah;y$cQahT&QPZ*iZ8UQQM.qo/T\7X"u?Mttl2Xq(IoW{R^ ux*SYJ! 4S.Jy~ BROS[V|žKNɛP(L6V^|cR7i7nZW1Fd@ Ara{詑|(T*dN]Ko?s=@ |_EvF]׍kR)eBJc" MUUbY6`~V޴dJKß&~'d3i WWWWWW
Current Directory: /usr/share/emacs/24.3/lisp/mh-e
Viewing File: /usr/share/emacs/24.3/lisp/mh-e/mh-thread.elc
;ELC ;;; Compiled by mockbuild@buildfarm01-new.corp.cloudlinux.com on Tue Nov 11 12:58:36 2025 ;;; from file /builddir/build/BUILD/emacs-24.3/lisp/mh-e/mh-thread.el ;;; in Emacs version 24.3.1 ;;; with all optimizations. ;;; This file uses dynamic docstrings, first added in Emacs 19.29. ;;; This file does not contain utf-8 non-ASCII characters, ;;; and so can be loaded in Emacs versions earlier than 23. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (byte-code "\300\301!\210\300\302!\207" [require mh-e mh-scan] 2) #@71 (fn &key (ID nil) (REFERENCES nil) (SUBJECT "") (SUBJECT-RE-P nil)) (defalias 'mh-thread-make-message #[(&rest #1=#:--cl-rest--) "\306>A@\307>A@\310>\206\311A@\312>A@ \203H @\313>\2031 AA\211\202\314>A@\203?\315\211\202\316\317 @\"\210\202)\320 \n \f\257,\207" [#1# id references subject subject-re-p #2=#:--cl-keys-- :id :references :subject (nil "") :subject-re-p (:id :references :subject :subject-re-p :allow-other-keys) :allow-other-keys nil error "Keyword argument %s not one of (:id :references :subject :subject-re-p)" mh-thread-message] 6 (#$ . 623)]) (defalias 'mh-thread-message-p #[(arg) ":\205 @\301=\207" [arg mh-thread-message] 2]) (defalias 'mh-message-id '(macro . #[(z) "\301\302E\207" [z nth 1] 3])) (defalias 'mh-message-references '(macro . #[(z) "\301\302E\207" [z nth 2] 3])) (defalias 'mh-message-subject '(macro . #[(z) "\301\302E\207" [z nth 3] 3])) (defalias 'mh-message-subject-re-p '(macro . #[(z) "\301\302E\207" [z nth 4] 3])) #@72 (fn &key (MESSAGE nil) (PARENT nil) (CHILDREN nil) (REAL-CHILD-P t)) (defalias 'mh-thread-make-container #[(&rest #1=#:--cl-rest--) "\306>A@\307>A@\310>A@\311>\206\312A@ \203H @\313>\2031 AA\211\202\314>A@\203?\315\211\202\316\317 @\"\210\202)\320 \n \f\257,\207" [#1# message parent children real-child-p #2=#:--cl-keys-- :message :parent :children :real-child-p (nil t) (:message :parent :children :real-child-p :allow-other-keys) :allow-other-keys nil error "Keyword argument %s not one of (:message :parent :children :real-child-p)" mh-thread-container] 6 (#$ . 1621)]) (defalias 'mh-thread-container-p #[(arg) ":\205 @\301=\207" [arg mh-thread-container] 2]) (defalias 'mh-container-message '(macro . #[(z) "\301\302E\207" [z nth 1] 3])) (defalias 'mh-container-parent '(macro . #[(z) "\301\302E\207" [z nth 2] 3])) (defalias 'mh-container-children '(macro . #[(z) "\301\302E\207" [z nth 3] 3])) (defalias 'mh-container-real-child-p '(macro . #[(z) "\301\302E\207" [z nth 4] 3])) #@53 Hashtable used to canonicalize message identifiers. (defvar mh-thread-id-hash nil (#$ . 2646)) (make-variable-buffer-local 'mh-thread-id-hash) #@49 Hashtable used to canonicalize subject strings. (defvar mh-thread-subject-hash nil (#$ . 2795)) (make-variable-buffer-local 'mh-thread-subject-hash) #@70 Thread ID table maps from message identifiers to message containers. (defvar mh-thread-id-table nil (#$ . 2950)) (make-variable-buffer-local 'mh-thread-id-table) #@57 Table to look up message identifier from message index. (defvar mh-thread-index-id-map nil (#$ . 3118)) (make-variable-buffer-local 'mh-thread-index-id-map) #@64 Table to look up message index number from message identifier. (defvar mh-thread-id-index-map nil (#$ . 3281)) (make-variable-buffer-local 'mh-thread-id-index-map) #@46 Hashtable used to group messages by subject. (defvar mh-thread-subject-container-hash nil (#$ . 3451)) (make-variable-buffer-local 'mh-thread-subject-container-hash) #@72 Hashtable used to associate messages with the same message identifier. (defvar mh-thread-duplicates nil (#$ . 3623)) (make-variable-buffer-local 'mh-thread-duplicates) #@289 Variable to remember the transformations to the thread tree. When new messages are added, these transformations are rewound, then the links are added from the newly seen messages. Finally the transformations are redone to get the new thread tree. This makes incremental threading easier. (defvar mh-thread-history nil (#$ . 3798)) (make-variable-buffer-local 'mh-thread-history) #@68 Width of scan substring that contains subject and body of message. (defvar mh-thread-body-width nil (#$ . 4183)) #@269 Display ancestor of current message. If you do not care for the way a particular thread has turned, you can move up the chain of messages with this command. This command can also take a prefix argument THREAD-ROOT-FLAG to jump to the message that started everything. (defalias 'mh-thread-ancestor #[(&optional thread-root-flag) "\303 \210\304>\204\305\306!\210\202m\203\305\307!\210\310 \n\203)\311 \204\312 \202: \313\232\2035\314\315!\202:\311 \210\312 )\207" [mh-view-ops current-level thread-root-flag beginning-of-line unthread error "Folder isn't threaded" "No message at point" mh-thread-current-indentation-level mh-thread-immediate-ancestor mh-maybe-show 1 message "Message has no ancestor"] 2 (#$ . 4303) "P"]) #@16 Delete thread. (defalias 'mh-thread-delete #[nil "\304>\204\n\305\306!\207m\203\305\307!\207\310 \212 @b\210\311 \210` \211A@)X\203<m\204<\312 !\2036\313\314!\210\315y\210\202)\316 )\207" [mh-view-ops region x mh-scan-valid-regexp unthread error "Folder isn't threaded" "No message at point" mh-thread-find-children beginning-of-line looking-at mh-delete-a-msg nil 1 mh-next-msg] 3 (#$ . 5045) nil]) #@99 Display next sibling. With non-nil optional argument PREVIOUS-FLAG jump to the previous sibling. (defalias 'mh-thread-next-sibling #[(&optional previous-flag) "\306>\204 \307\310!\210\202m\203\307\311!\210\312 \210`\313\314 \n\204]\f\203+\315\202,\316y\317\232\203]m\204]\314 \211 \232\203D\320\202Y W\203Y\321\322\f\203T\323\202U\324\"\210\325)\202\n\320=\203h\326 \202\202\n\325=\203s b\202\202\321\322\f\203}\323\202~\324\"\210 b+\207" [mh-view-ops my-level done point previous-flag level unthread error "Folder isn't threaded" "No message at point" beginning-of-line nil mh-thread-current-indentation-level -1 1 0 success message "No %s sibling" "previous" "next" failure mh-maybe-show] 4 (#$ . 5462) nil]) #@27 Display previous sibling. (defalias 'mh-thread-previous-sibling #[nil "\300\301!\207" [mh-thread-next-sibling t] 2 (#$ . 6211) nil]) #@37 Refile (output) thread into FOLDER. (defalias 'mh-thread-refile #[(folder) "\305>\204\n\306\307!\207m\203\306\310!\207\311 \212 @b\210\312 \210` \211A@)X\203=m\204=\313 !\2037\314\315\f\"\210\316y\210\202)\317 )\207" [mh-view-ops region x mh-scan-valid-regexp folder unthread error "Folder isn't threaded" "No message at point" mh-thread-find-children beginning-of-line looking-at mh-refile-a-msg nil 1 mh-next-msg] 4 (#$ . 6350) (list (intern (mh-prompt-for-refile-folder)))]) #@33 Toggle threaded view of folder. (defalias 'mh-toggle-threads #[nil "\306\307!\310 \307\311 >\203P\312\311!\204\313\314!\210\307eb\210m\2045\306\307!\211\203. \fB)\307y\210\202\315\316\317\320\f!\"\321#\210)\203W\322 \210\323 \210\202W\324 \210\311 B\n\203a\325\n\321\211#\210\326 !\210\327\307!+\207" [buffer-read-only old-buffer-modified-flag msg-at-point mh-view-ops msg-list index mh-get-msg-num nil buffer-modified-p unthread mh-valid-view-change-operation-p error "Can't unthread folder" mh-scan-folder mapcar #[(x) "\301\302\"\207" [x format "%s"] 3] mh-coalesce-msg-list t mh-index-insert-folder-headers mh-notate-cur mh-thread-folder mh-goto-msg set-buffer-modified-p mh-recenter mh-current-folder mh-index-data] 7 (#$ . 6845) nil]) #@65 Find the number of spaces by which current message is indented. (defalias 'mh-thread-current-indentation-level #[nil "\212\305 \n\306$\307\310 \210\fu\210\311\312f\313\"\203! T\312u\210\202 +\207" [mh-cmd-note mh-scan-date-flag-width mh-scan-date-width level address-start-offset + 1 0 beginning-of-line char-equal nil 32] 5 (#$ . 7614)]) #@44 Jump to immediate ancestor in thread tree. (defalias 'mh-thread-immediate-ancestor #[nil "\303 \210`\304 \305Z\306 \307W?\2053\204+\310y\307\232\203+ \304 \232\203\311\211\203\2042\nb\210+\207" [done ancestor-level point beginning-of-line mh-thread-current-indentation-level 2 nil 0 -1 t] 4 (#$ . 7966)]) #@206 Return a region containing the current message and its children. The result is returned as a list of two elements. The first is the point at the start of the region and the second is the point at the end. (defalias 'mh-thread-find-children #[nil "\306 \210m?\205-\307 \n\310$\311 \312\211`\313\211\314 T\"\315\"\312y\210\316\317\215\210 `,D\207" [mh-cmd-note mh-scan-date-flag-width mh-scan-date-width begin spaces level beginning-of-line + 1 mh-thread-current-indentation-level nil format "%%%ss" "" --cl-block-nil-- (byte-code "m\204%u\210\302 \303`\304 \"\"\305\232\204\306 \210\307u\210\310\311\312\"\210\312y\210\202\312\207" [address-start-offset spaces string-match buffer-substring-no-properties mh-line-end-position 0 beginning-of-line -1 throw --cl-block-nil-- nil] 5) address-start-offset] 5 (#$ . 8293)]) #@33 Generate thread view of folder. (defalias 'mh-thread-folder #[nil "\306\307\310 \"\210\311 \210eb\210\312 \210\313edB\247\203:\314edB\315\211#\203,edB\211 \316\n\317 \f#\210* B)\202,edB:\203\221edB@\247\203\221edBA\247\203\221\212edB@b\210\320 \210`edBAX\203\215m\204\215\321 !\203\207\322\315!\211  \316\317  #\210* B)\323y\210\202[)\202,edB\203\246edB9\203\246\324edB!\202\272edB;\203\267\325!edB\"\202\272edB\326 \"\211#\313\211$\203\346$@\211%\"&\316%\315&#\210*$A\211$\204\311*\212eb\210\320 \210`dX\203+m\204+\321 !\203%\322\315!'\327'\"\"\203$'\211( )\316(\317 )#\210* B))\323y\210\202\356+\330!*\331\310 *\"+ed|\210\332+!\210\333 \210\334 \210\335 \210\306\336\310 \"+\207" [msg-list msg #1=#:v mh-thread-scan-line-map #2=#:v mh-scan-valid-regexp message "Threading %s..." buffer-name mh-thread-initialize mh-remove-all-notation nil mh-goto-msg t puthash mh-thread-parse-scan-line beginning-of-line looking-at mh-get-msg-num 1 mh-seq-to-msgs mh-translate-range make-hash-table gethash mh-coalesce-msg-list mh-thread-generate mh-thread-print-scan-lines mh-notate-user-sequences mh-notate-deleted-and-refiled mh-notate-cur "Threading %s...done" #3=#:v #4=#:v mh-current-folder #5=#:seq-hash-table #6=#:msgs --dolist-tail-- #7=#:v #8=#:v v #9=#:v #10=#:v range thread-tree] 5 (#$ . 9131)]) #@93 Update thread tree for FOLDER. All messages after START-POINT are added to the thread tree. (defalias 'mh-thread-inc #[(folder start-point) "\306 \210\307 \210b\210\310m\204/\311\310!\211\247\203(\n B\n\f\312 \313 #\210*\310y\210)\202 \314 \"\310\315 ed|\210\316!\210\317 \210\320 \210\321 \210\322!,\207" [start-point msg-list index #1=#:v mh-thread-scan-line-map #2=#:v mh-thread-rewind-pruning mh-remove-all-notation nil mh-get-msg-num puthash mh-thread-parse-scan-line mh-thread-generate buffer-modified-p mh-thread-print-scan-lines mh-notate-user-sequences mh-notate-deleted-and-refiled mh-notate-cur set-buffer-modified-p folder old-buffer-modified-flag buffer-read-only thread-tree] 5 (#$ . 10500)]) #@91 Initialize the hash table in VAR. TEST is the test to use when creating a new hash table. (defalias 'mh-thread-initialize-hash '(macro . #[(var test) "9\204\n\302\303\"\210\304\305D\306\307\310 EEF\207" [var test error "Expected a symbol: %s" if clrhash setq make-hash-table :test] 8 (#$ . 11235)])) #@57 Make new hash tables, or clear them if already present. (defalias 'mh-thread-initialize #[nil "\203 \306!\210\202\307\310\311\" \203\306 !\210\202 \307\310\311\"\n\203+\306\n!\210\2020\307\310\312\" \203;\306 !\210\202@\307\310\312\"\f\203K\306\f!\210\202P\307\310\313\" \203[\306 !\210\202`\307\310\313\" \203m\306 !\210\202s\307\310\312\" \203\200\306!\210\202\206\307\310\312\"\314\211\207" [mh-thread-id-hash mh-thread-subject-hash mh-thread-id-table mh-thread-id-index-map mh-thread-index-id-map mh-thread-scan-line-map clrhash make-hash-table :test equal eq eql nil mh-thread-subject-container-hash mh-thread-duplicates mh-thread-history] 3 (#$ . 11547)]) #@160 Given ID, return the corresponding container in `mh-thread-id-table'. If no container exists then a suitable container is created and the id-table is updated. (defalias 'mh-thread-id-container #[(id) "\204\305\306!\210\307 \"\206\" \310\n\311\312\"\313\314\f\") #*\207" [id mh-thread-id-table #1=#:v #2=#:v message error "1" gethash puthash mh-thread-make-message :id mh-thread-make-container :message] 5 (#$ . 12253)]) (put 'mh-thread-id-container 'byte-optimizer 'byte-compile-inline-expand) #@43 Remove parent link of CHILD if it exists. (defalias 'mh-thread-remove-parent-link #[(child) "\306!\203\n\202/\211\204\307\310!\210\311 \n\"\206. \n\312 \313\314 \"\315\316 \")\f#*)\3178\211\205\202\320\233\211\3208\321\211:\203q@=\204hBA\211\202P\237+\240\210)AA\211\321\240)*\207" [child id mh-thread-id-table #1=#:v #2=#:v message mh-thread-container-p error "1" gethash puthash mh-thread-make-message :id mh-thread-make-container :message 2 3 nil child-container parent-container #3=#:c #4=#:--cl-var-- elem #5=#:--cl-var-- #6=#:c] 6 (#$ . 12763)]) (put 'mh-thread-remove-parent-link 'byte-optimizer 'byte-compile-inline-expand) #@225 Add links so that PARENT becomes a parent of CHILD. Doesn't make any changes if CHILD is already an ancestor of PARENT. If optional argument AT-END-P is non-nil, the CHILD is added to the end of the children list of PARENT. (defalias 'mh-thread-add-link #[(parent child &optional at-end-p) "\204\306\2027\307!\203\2027\211\204\310\311!\210\312 \n\"\2066 \n\313 \314\315 \"\316\317 \")\f#*)\307!\203C\202i\211\204N\310\311!\210\312 \n\"\206h \n\313 \314\315 \"\316\317 \")\f#*)\211\203i\320\"\204i\320\"\204i\307!\203\223\202\271\211\204\236\310\311!\210\312 \n\"\206\270 \n\313 \314\315 \"\316\317 \")\f#*)\3218\211\205\f\322\233\211\3228\306\211:\203\373@=\204\362BA\211\202\332\237+\240\210)AA\211\306\240)+\210\204&\322\233\211@B\240\210)\202]\3228\204@\322\233\211@B\240\210)\202]\3228\211A\203TA\211\202G\306B\241\210)AA\211\240\210)?\205\371\307!\203\202\245\211\204\212\310\311!\210\312 \n\"\206\244 \n\313 \314\315 \"\316\317 \")\f#*)\3218\211\205\370\322\233\211\3228\306\211:\203\347@=\204\336BA\211\202\306\237+\240\210)AA\211\306\240)+*\207" [parent id mh-thread-id-table #1=#:v #2=#:v message nil mh-thread-container-p error "1" gethash puthash mh-thread-make-message :id mh-thread-make-container :message mh-thread-ancestor-p 2 3 child child-container parent-container #3=#:c #4=#:--cl-var-- elem #5=#:--cl-var-- #6=#:c at-end-p #7=#:c #8=#:c last-child #9=#:c] 7 (#$ . 13462)]) (put 'mh-thread-add-link 'byte-optimizer 'byte-compile-inline-expand) #@54 Restore the thread tree to its state before pruning. (defalias 'mh-thread-rewind-pruning #[nil "\205V\211A@\211@\306=\203\300 \211A@)\307 !\203\" \202M \211\204,\310\311!\210\312\f \"\206L\f \313\314\315\f\"\316\317\")#*)\3208\211\205\240\321\233\211\3218\322\211 :\203\217@=\204\206 B A\211\202n \237+\240\210)AA\211!\322\240)+\210 AA@ \211A@)\322\"\211#\204\272\322\202\362\307#!\203\306#\202\362#\211\204\321\310\311!\210\312\f \"\206\361\f \313\314\315\f\"\316\317\")#*)\307 !\203\374 \202' \211\204\310\311!\210\312\f \"\206&\f \313\314\315\f\"\316\317\")#*)\211\203)\323\"\204)\323\"\204)\307 !\203N \202y \211\204X\310\311!\210\312\f \"\206x\f \313\314\315\f\"\316\317\")#*)\3208\211\205\314\321\233\211\3218\322\211 :\203\273@=\204\262 B A\211\202\232 \237+\240\210)AA\211!\322\240)+\210\"\204\346\321\233\211$$@B\240\210)\202\3218\204\321\233\211%%@B\240\210)\202\3218\211&A\203&A\211&\202&\322B\241\210)AA\211'\240\210)?\205\273\307 !\203< \202g \211\204F\310\311!\210\312\f \"\206f\f \313\314\315\f\"\316\317\")#*)\3208\211\205\272\321\233\211\3218\322\211 :\203\251@=\204\240 B A\211\202\210 \237+\240\210)AA\211!\322\240)+-\210\202R @\324=\203\254 \211A@) AA@ AAA(#)(\322\211*\203\222*@\211\307 !\203\365 \202  \211\204\377\310\311!\210\312\f \"\206\f \313\314\315\f\"\316\317\")#*)\3208\211\205s\321\233\211\3218\322\211 :\203b@=\204Y B A\211\202A \237+\240\210)AA\211!\322\240)+\210) \322\"\211#\204\206\322\202\276\307#!\203\222#\202\276#\211\204\235\310\311!\210\312\f \"\206\275\f \313\314\315\f\"\316\317\")#*)\307 !\203\310 \202\363 \211\204\322\310\311!\210\312\f \"\206\362\f \313\314\315\f\"\316\317\")#*)\211\203\365\323\"\204\365\323\"\204\365\307 !\203 \202E \211\204$\310\311!\210\312\f \"\206D\f \313\314\315\f\"\316\317\")#*)\3208\211\205\230\321\233\211\3218\322\211 :\203\207@=\204~ B A\211\202f \237+\240\210)AA\211!\322\240)+\210\"\204\262\321\233\211$$@B\240\210)\202\351\3218\204\314\321\233\211%%@B\240\210)\202\351\3218\211&A\203\340&A\211&\202\323&\322B\241\210)AA\211'\240\210)?\205\207\307 !\203 \2023 \211\204\310\311!\210\312\f \"\2062\f \313\314\315\f\"\316\317\")#*)\3208\211\205\206\321\233\211\3218\322\211 :\203u@=\204l B A\211\202T \237+\240\210)AA\211!\322\240)+-\210*A\211*\204\345*#)\322\"\211#\204\245\322\202\335\307#!\203\261#\202\335#\211\204\274\310\311!\210\312\f \"\206\334\f \313\314\315\f\"\316\317\")#*)\307 !\203\347 \202 \211\204\361\310\311!\210\312\f \"\206\f \313\314\315\f\"\316\317\")#*)\211\203\323\"\204\323\"\204\307 !\2039 \202d \211\204C\310\311!\210\312\f \"\206c\f \313\314\315\f\"\316\317\")#*)\3208\211\205\267\321\233\211\3218\322\211 :\203\246@=\204\235 B A\211\202\205 \237+\240\210)AA\211!\322\240)+\210\"\204\321\321\233\211$$@B\240\210)\202\3218\204\353\321\233\211%%@B\240\210)\202\3218\211&A\203\377&A\211&\202\362&\322B\241\210)AA\211'\240\210)?\205\246\307 !\203' \202R \211\2041\310\311!\210\312\f \"\206Q\f \313\314\315\f\"\316\317\")#*)\3208\211\205\245\321\233\211\3218\322\211 :\203\224@=\204\213 B A\211\202s \237+\240\210)AA\211!\322\240)+-\210+\202R @\325=\203R \211A@)\211)\307 !\203\307 \202\362 \211\204\321\310\311!\210\312\f \"\206\361\f \313\314\315\f\"\316\317\")#*)\3208\211\205E\321\233\211\3218\322\211 :\2034@=\204+ B A\211\202 \237+\240\210)AA\211!\322\240)+\210\326)\233\211+\327\240\210*)\202\207" [mh-thread-history action x child id mh-thread-id-table DROP mh-thread-container-p error "1" gethash puthash mh-thread-make-message :id mh-thread-make-container :message 2 3 nil mh-thread-ancestor-p PROMOTE SUBJECT 4 t #1=#:v #2=#:v message child-container parent-container #3=#:c #4=#:--cl-var-- elem #5=#:--cl-var-- #6=#:c at-end-p parent #7=#:c #8=#:c last-child #9=#:c children node --dolist-tail-- #10=#:c] 7 (#$ . 15157)]) #@164 Return t if ANCESTOR is really an ancestor of SUCCESSOR and nil otherwise. In the limit, the function returns t if ANCESTOR and SUCCESSOR are the same containers. (defalias 'mh-thread-ancestor-p #[(ancestor successor) "\300\301\215\207" [--cl-block-nil-- (byte-code "\203 =\203\302\303\304\"\210\3058\211\204\306\207" [successor ancestor throw --cl-block-nil-- t 2 nil] 4)] 2 (#$ . 19795)]) #@159 Parse a scan line. If optional argument STRING is given then that is assumed to be the scan line. Otherwise uses the line at point as the scan line to parse. (defalias 'mh-thread-parse-scan-line #[(&optional string) "\206\n\306\307 \310 \" \n\\ \f\\\311 O\211\f \312ZO \313OF,\207" [string mh-cmd-note mh-scan-field-from-start-offset address-start mh-scan-field-from-end-offset body-start buffer-substring-no-properties mh-line-beginning-position mh-line-end-position 0 2 nil first-string] 6 (#$ . 20203)]) #@94 Produce canonical string representation for ID. This allows cheap string comparison with EQ. (defalias 'mh-thread-canonicalize-id #[(id) "\304\232\203\f\305\304!\206\306 \"\206 \307\n #*\207" [id mh-thread-id-hash #1=#:v #2=#:v "" copy-sequence gethash puthash] 4 (#$ . 20727)]) (put 'mh-thread-canonicalize-id 'byte-optimizer 'byte-compile-inline-expand) #@289 Prune leading Re:'s, Fwd:'s etc. and trailing (fwd)'s from SUBJECT. If the result after pruning is not the empty string then it is canonicalized so that subjects can be tested for equality with eq. This is done so that all the messages without a subject are not put into a single thread. (defalias 'mh-thread-prune-subject #[(subject) "\306\307\310\311\n\"\204\310\312\n\"\203\306\n\313\225\307O\202\310\314\n\"\204+\310\315\n\"\2036\306\n\313\211\224O\202\n\316\232\203B\nD\202U\317\n \"\206S\n \320\f\n #*D*\207" [subject-pruned-flag case-fold-search subject mh-thread-subject-hash #1=#:v #2=#:v t nil string-match "^[ ]*\\(re\\|fwd?\\)\\(\\[[0-9]*\\]\\)?:[ ]*" "^[ ]*\\[[^\\]][ ]*" 0 "(fwd)$" "[ ]+$" "" gethash puthash] 4 (#$ . 21101)]) (put 'mh-thread-prune-subject 'byte-optimizer 'byte-compile-inline-expand) #@177 Group the set of message containers, ROOTS based on subject. Bug: Check for and make sure that something without Re: is made the parent in preference to something that has it. (defalias 'mh-thread-group-by-subject #[(roots) "\306!\210\307\n\307\211\203\f@\310 !\311 \"\211\203 \312!\203.\202`\211\204:\313\314!\210\311\"\206_\315\316\317\"\320\321\")#*)\3228\211 \205\263\323 \233\211!\323 8\"\307\211#$\":\203\242\"@##=\204\231#$B$\"A\211\"\202\201$\237+\240\210)AA\211%\307\240)+\210 \324&\211\204\307\307\202\312!\203\323\202\211\204\337\313\314!\210\311\"\206\315\316\317\"\320\321\")#*)\312!\203\202C\211\204\313\314!\210\311\"\206B\315\316\317\"\320\321\")#*)\211 \203O\325 \"\204O\325 \"\204O\312!\203m\202\237\211\204y\313\314!\210\311\"\206\236\315\316\317\"\320\321\")#*)\3228\211 \205\362\323 \233\211!\323 8\"\307\211#$\":\203\341\"@##=\204\330#$B$\"A\211\"\202\300$\237+\240\210)AA\211%\307\240)+\210&\204\f\323 \233\211''@B\240\210)\202C\323 8\204&\323 \233\211((@B\240\210)\202C\323 8\211)A\203:)A\211)\202-)\307B\241\210)AA\211* \240\210) ?\205\353\312!\203e\202\227\211\204q\313\314!\210\311\"\206\226\315\316\317\"\320\321\")#*)\3228\211 \205\352\323 \233\211!\323 8\"\307\211#$\":\203\331\"@##=\204\320#$B$\"A\211\"\202\270$\237+\240\210)AA\211%\307\240)+-\210\326 \233\211+\307\240\210)\327 D,B,\202 -.\315- .#\210* B*\fA\211\204* \237)\207" [mh-thread-subject-container-hash results roots root --dolist-tail-- subject clrhash nil mh-thread-container-subject gethash mh-thread-container-p error "1" puthash mh-thread-make-message :id mh-thread-make-container :message 2 3 t mh-thread-ancestor-p 4 SUBJECT parent child id mh-thread-id-table #1=#:v #2=#:v message child-container parent-container #3=#:c #4=#:--cl-var-- elem #5=#:--cl-var-- #6=#:c at-end-p #7=#:c #8=#:c last-child #9=#:c #10=#:c mh-thread-history #11=#:v #12=#:v] 7 (#$ . 21952)]) (put 'mh-thread-group-by-subject 'byte-optimizer 'byte-compile-inline-expand) #@104 Return the subject of CONTAINER. If CONTAINER is empty return the subject info of one of its children. (defalias 'mh-thread-container-subject #[(container) "A@\203A@A@\203\301A@8\207\302\303\215\210\304\305!\207" [container 3 --cl-block-nil-- (byte-code "\3048\305\211\203.\n@\211A@\203' A@A@\203' A@\306\307\304 8\"\210)\nA\211\204\n*\305\207" [container kid --dolist-tail-- kid-message 3 nil throw --cl-block-nil--] 5) error "This can't happen"] 2 (#$ . 24259)]) #@205 Message with id, ID is the message in INDEX. The function also checks for duplicate messages (that is multiple messages with the same ID). These messages are put in the `mh-thread-duplicates' hash table. (defalias 'mh-thread-update-id-index-maps #[(id index) "\306 \"\211\203\f\307 \n\306 \"B #\210*  \307\n #\210*\n \f \307  #+\207" [id mh-thread-id-index-map old-index #1=#:v mh-thread-duplicates #2=#:v gethash puthash #3=#:v #4=#:v index #5=#:v mh-thread-index-id-map #6=#:v] 7 (#$ . 24748)]) (put 'mh-thread-update-id-index-maps 'byte-optimizer 'byte-compile-inline-expand) #@111 Return container which has MESSAGE in it. If there is no container present then a new container is allocated. (defalias 'mh-thread-get-message-container #[(message) "A@\306 \n\"\211\203 A\211\240\210) \202( \n\n\307 \310\311\"\n#**\207" [message id mh-thread-id-table container #1=#:c #2=#:v gethash puthash mh-thread-make-container :message #3=#:v] 6 (#$ . 25357)]) (put 'mh-thread-get-message-container 'byte-optimizer 'byte-compile-inline-expand) #@132 Return appropriate message. Otherwise update message already present to have the proper ID, SUBJECT-RE-P, SUBJECT and REFS fields. (defalias 'mh-thread-get-message #[(id subject-re-p subject refs) "\306 \"\211\205\f\nA@\211\203=\307 \233\211 \240\210)\310 \233\211\240\210) A\211\240\210) AA\211\240\210) \202\227\n\203X\nA\211\311\312\313\314\315 &\240)\202\227\311\312\313\315 \314&\211\211\211A@\306 \"\211\203\203\nA\211 \240\210)\n\202\224 \316\317\320 \"#*+\210)*\207" [id mh-thread-id-table container message #1=#:c subject-re-p gethash 4 3 mh-thread-make-message :id :references :subject :subject-re-p puthash mh-thread-make-container :message #2=#:c subject #3=#:c #4=#:c refs #5=#:c #6=#:c #7=#:v #8=#:v] 11 (#$ . 25826)]) (put 'mh-thread-get-message 'byte-optimizer 'byte-compile-inline-expand) #@63 Regexp to recognize whether a string is a message identifier. (defvar mh-message-id-regexp "^<.*@.*>$" (#$ . 26690)) #@107 Scan FOLDER to get info for threading. Only information about messages in MSG-LIST are added to the tree. (defalias 'mh-thread-generate #[(folder msg-list) "\306\307!rq\210\310\216\311 !\210\n\203'\312\313\314 \f\"\315\316\315\317\320\321\322 \323\324\n\"& \210eb\210\315\325+\326\327\215\210\330\331,\"\210\332+!\211++\333-!\210\315.+\315/\2110\203v0@/\334/!1\3351-\"\2112\203S/3\3363!\203|3\202\2563\2114\204\210\337\340!\210\3354,\"\206\25545,6\3415\342\3434\"7\344\3457\")6#*)8\34688\2119\205\3479\233\211:\34798;\315\211<=;:\203\360;@<8<=\204\347<=B=;A\211;\202\317=\237+\240\210)8AA\211>\315\240)+\2102/\325?3\2112\204\315\202T\3362!\203\"2\202T2\2114\204.\337\340!\210\3354,\"\206S45,6\3415\342\3434\"7\344\3457\")6#*)\3363!\203`3\202\2223\2114\204l\337\340!\210\3354,\"\206\22145,6\3415\342\3434\"7\344\3457\")6#*)8\2119\203\236\35089\"\204\236\35098\"\204\23683\3363!\203\2743\202\3563\2114\204\310\337\340!\210\3354,\"\206\35545,6\3415\342\3434\"7\344\3457\")6#*)8\34688\2119\205A\3479\233\211:\34798;\315\211<=;:\2030;@<8<=\204'<=B=;A\211;\202=\237+\240\210)8AA\211>\315\240)+\210?\204[\3479\233\211@8@@B\240\210)\202\222\34798\204u\3479\233\211A8A@B\240\210)\202\222\34798\211BA\203\211BA\211B\202|B8\315B\241\210)8AA\211C9\240\210)9?\205:83\3363!\203\2643\202\3463\2114\204\300\337\340!\210\3354,\"\206\34545,6\3415\342\3434\"7\344\3457\")6#*)8\34688\2119\2059\3479\233\211:\34798;\315\211<=;:\203(;@<8<=\204<=B=;A\211;\202=\237+\240\210)8AA\211>\315\240)+-\210\351/\233\211D\315\240\210)\352/DEBE\202l1F-G\341F/G#\210*/.B.*0A\2110\204U*.\237*\211+EH q\210HE.\207" [#1=#:temp-buffer folder msg-list mh-scan-prog mh-progs case-fold-search generate-new-buffer " *temp*" ((byte-code "\301!\203\n\302!\210\301\207" [#1# buffer-name kill-buffer] 2)) mh-thread-set-tables apply call-process expand-file-name nil (t nil) "-width" "10000" "-format" "%(msg)\n%{message-id}\n%{references}\n%{in-reply-to}\n%{subject}\n" mapcar #[(x) "\301\302\"\207" [x format "%s"] 3] t --cl-block-nil-- (byte-code "m\204 \300\301\215\210\202\300\207" [--cl-block-process-message-- (byte-code "`\306 {\307y\210\310!`\306 {\307y\210`\306 {\307y\210`\306 {\307y\210`\306 {\307y\210\307*\311 +\"\204<\312\313\307\"\210 \250\204F\312\314\307\"\210 \315\307,-\316\317 \"\204\\\316\320 \"\203h\315, \321\225\307O\202N\316\322 \"\204v\316\323 \"\203\202\315, \321\211\224O\202h \324\232\203\217 ,D\202\251\311 .\"\206\246 /.0\325/ 0#*,D+\2111@1A@*)\326\f!\327\330 !\f\"2\307\211342:\203\3542@3\31653\"\203\34334B42A\2112\202\3124\237+\n\211\324\232\203\377\331\324!\206\311\n6\"\206\n768\3257\n8#*)\211 \311\n9\"\211:\203?\n;<=\325;:\311;=\"B=#\210*\n>9?\325> ?#\210* @AB\325@\nB#-\210\332\333 \"\n* *\311\nC\"\211D\205}DA@\211E\203\264\334E\233\211F*\240\210)\335E\233\211G \240\210)EA\211H\n\240\210)EAA\211I \240\210)E\202D\203\320DA\211J\336\337\n\340 \341 \342*&\240)\202\336\337\n\340 \342*\341 &\211E\211E\211A@\311\nC\"\211D\203DA\211KE\240\210)D\202\nLCM\325L\343\344E\"M#*+\210).\210 \211NA\203[N@N\2113A@)\307OP\211Q\204<\307\202v\345Q!\203HQ\202vQ\211\204S\346\347!\210\311\nC\"\206u\nRCS\325R\336\337\n\"E\343\344E\")S#*)\345P!\203\202P\202\260P\211\204\215\346\347!\210\311\nC\"\206\257\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\211U\203\270\350TU\"\204\270\350UT\"\204\270TP\345P!\203\332P\202P\211\204\345\346\347!\210\311\nC\"\206\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\351T8\211U\205[\335U\233\211V\335U8W\307\211XYW:\203JW@XTX=\204AXYBYWA\211W\202)Y\237+\240\210)TAA\211Z\307\240)+\210O\204u\335U\233\211[T[@B\240\210)\202\254\335U8\204\217\335U\233\211\\T\\@B\240\210)\202\254\335U8\211]A\203\243]A\211]\202\226]T\307B\241\210)TAA\211^U\240\210)U?\205PTP\345P!\203\316P\202\374P\211\204\331\346\347!\210\311\nC\"\206\373\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\351T8\211U\205O\335U\233\211V\335U8W\307\211XYW:\203>W@XTX=\2045XYBYWA\211W\202Y\237+\240\210)TAA\211Z\307\240)+-\210NA\211N\202N@\203\nP\345P!\203pP\202\236P\211\204{\346\347!\210\311\nC\"\206\235\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\351T8\211U\205\361\335U\233\211V\335U8W\307\211XYW:\203\340W@XTX=\204\327XYBYWA\211W\202\277Y\237+\240\210)TAA\211Z\307\240)+\210N@\n\307OP\211Q\204\307\202@\345Q!\203Q\202@Q\211\204\346\347!\210\311\nC\"\206?\nRCS\325R\336\337\n\"E\343\344E\")S#*)\345P!\203LP\202zP\211\204W\346\347!\210\311\nC\"\206y\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\211U\203\202\350TU\"\204\202\350UT\"\204\202TP\345P!\203\244P\202\322P\211\204\257\346\347!\210\311\nC\"\206\321\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\351T8\211U\205%\335U\233\211V\335U8W\307\211XYW:\203W@XTX=\204 XYBYWA\211W\202\363Y\237+\240\210)TAA\211Z\307\240)+\210O\204?\335U\233\211[T[@B\240\210)\202v\335U8\204Y\335U\233\211\\T\\@B\240\210)\202v\335U8\211]A\203m]A\211]\202`]T\307B\241\210)TAA\211^U\240\210)U?\205TP\345P!\203\230P\202\306P\211\204\243\346\347!\210\311\nC\"\206\305\nRCS\325R\336\337\n\"E\343\344E\")S#*)T\351T8\211U\205\335U\233\211V\335U8W\307\211XYW:\203W@XTX=\204\377XYBYWA\211W\202\347Y\237+\240\210)TAA\211Z\307\240)+-\210.\307\207" [index-line index id refs in-reply-to subject mh-line-end-position nil string-to-number gethash throw --cl-block-process-message-- --cl-block-nil-- t string-match "^[ ]*\\(re\\|fwd?\\)\\(\\[[0-9]*\\]\\)?:[ ]*" "^[ ]*\\[[^\\]][ ]*" 0 "(fwd)$" "[ ]+$" "" puthash mh-thread-process-in-reply-to append split-string copy-sequence mapcar mh-thread-canonicalize-id 4 3 mh-thread-make-message :id :references :subject :subject-re-p mh-thread-make-container :message mh-thread-container-p error #32="1" mh-thread-ancestor-p 2 subject-re-p mh-thread-scan-line-map subject-pruned-flag case-fold-search mh-thread-subject-hash #2=#:v #3=#:v #4=#:--cl-var-- #5=#:--cl-var-- x #6=#:--cl-var-- mh-message-id-regexp mh-thread-id-hash #7=#:v #8=#:v mh-thread-id-index-map old-index #9=#:v mh-thread-duplicates #10=#:v #11=#:v #12=#:v #13=#:v mh-thread-index-id-map #14=#:v mh-thread-id-table container message #15=#:c #16=#:c #17=#:c #18=#:c #19=#:c #20=#:c #21=#:v #22=#:v ancestors at-end-p child parent #23=#:v #24=#:v child-container parent-container #25=#:c #26=#:--cl-var-- elem #27=#:--cl-var-- #28=#:c #29=#:c #30=#:c last-child #31=#:c] 11)] 2) maphash #[(k v) "\3028?\205\f B\211\207" [v roots 2] 2] mh-thread-prune-containers clrhash mh-thread-container-subject gethash mh-thread-container-p error #32# puthash mh-thread-make-message :id mh-thread-make-container :message 2 3 mh-thread-ancestor-p 4 SUBJECT roots mh-thread-id-table mh-thread-subject-container-hash results root --dolist-tail-- subject parent child id #23# #24# message child-container parent-container #25# #26# elem #27# #28# at-end-p #29# #30# last-child #31# #33=#:c mh-thread-history #34=#:v #35=#:v history] 15 (#$ . 26814)]) #@45 Use the tables of FOLDER in current buffer. (defalias 'mh-thread-set-tables #[(folder) "\306\307\310!\203 \310K\202\311\312\216\311=\203\313\310!\210\202\"\310M\210\310\302!\310\303!\310\304!\310\305!\310\314!\f\310\315! \310\316!\310\317!\310\320!\211+\207" [#1=#:vnew #2=#:old mh-thread-id-hash mh-thread-subject-hash mh-thread-id-table mh-thread-id-index-map #[(symbol) "rq\210 J)\207" [folder symbol] 1] fboundp mh-get-table cl--unbound ((byte-code "\301=\203 \302\303!\210\202\303M\210\301\207" [#2# cl--unbound fmakunbound mh-get-table] 2)) fmakunbound mh-thread-index-id-map mh-thread-scan-line-map mh-thread-subject-container-hash mh-thread-duplicates mh-thread-history] 2 (#$ . 34348)]) #@227 Extract message id's from REPLY-TO-HEADER. Ideally this should have some regexp which will try to guess if a string between < and > is a message id and not an email address. For now it will take the last string inside angles. (defalias 'mh-thread-process-in-reply-to #[(reply-to-header) "\303\304\"\211\247\205\303\305\306 O\"\211\247\205\n TOC))\207" [reply-to-header end begin mh-search-from-end 62 60 0] 6 (#$ . 35079)]) #@49 Prune empty containers in the containers ROOTS. (defalias 'mh-thread-prune-containers #[(roots) "\306 \203/ \211A@\307 8\306\211\203& @\211 B A\211\204* \nB)\202\n\203\312\n\211A@\310 A@A@\"\203V\307 \233\211\311\307 8!\240\210)\202\306\307 8\203\357\307 8A\203i\312 8\203\357\306\307 8\306\211\203I @\211\313\f!\203\207\f\202\270\f\211\204\222\314\315!\210\310\"\206\267 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205 \307$\233\211%\307$8&\306\211'(&:\203\372&@'#'=\204\361'(B(&A\211&\202\331(\237+\240\210)#AA\211)\306\240)+\210\312 8\306*\211+\204 \306\202^\313+!\203,+\202^+\211\2048\314\315!\210\310\"\206] !\316 \317\320\"\"\321\322\"\")!#*)\313\f!\203h\f\202\231\f\211\204s\314\315!\210\310\"\206\230 !\316 \317\320\"\"\321\322\"\")!#*)#\211$\203\241\323#$\"\204\241\323$#\"\204\241#\313\f!\203\300\f\202\361\f\211\204\313\314\315!\210\310\"\206\360 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205D\307$\233\211%\307$8&\306\211'(&:\2033&@'#'=\204*'(B(&A\211&\202(\237+\240\210)#AA\211)\306\240)+\210*\204^\307$\233\211,#,@B\240\210)\202\225\307$8\204x\307$\233\211-#-@B\240\210)\202\225\307$8\211.A\203\214.A\211.\202.#\306B\241\210)#AA\211/$\240\210)$?\2059#\313\f!\203\264\f\202\345\f\211\204\277\314\315!\210\310\"\206\344 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\2058\307$\233\211%\307$8&\306\211'(&:\203'&@'#'=\204'(B(&A\211&\202(\237+\240\210)#AA\211)\306\240)+-\210B A\211\204w*\324 \312 8BBB0B0 \313\f!\203e\f\202\226\f\211\204p\314\315!\210\310\"\206\225 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205\351\307$\233\211%\307$8&\306\211'(&:\203\330&@'#'=\204\317'(B(&A\211&\202\267(\237+\240\210)#AA\211)\306\240)+\210)\202\306\307 8\203)\307 \233\2111\311\307 8!\240\210)\307 8@\307 8A2\2113\313\f!\203\f\202L\f\211\204&\314\315!\210\310\"\206K !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205\237\307$\233\211%\307$8&\306\211'(&:\203\216&@'#'=\204\205'(B(&A\211&\202m(\237+\240\210)#AA\211)\306\240)+\2102\306\211\203\200 @\211\313\f!\203\273\f\202\354\f\211\204\306\314\315!\210\310\"\206\353 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205?\307$\233\211%\307$8&\306\211'(&:\203.&@'#'=\204%'(B(&A\211&\202 (\237+\240\210)#AA\211)\306\240)+\210\325\233\2114\306\240\210)3\326*\211+\204^\306\202\234\313+!\203j+\202\234+\211\204v\314\315!\210\310\"\206\233 !\316 \317\320\"\"\321\322\"\")!#*)\313\f!\203\246\f\202\327\f\211\204\261\314\315!\210\310\"\206\326 !\316 \317\320\"\"\321\322\"\")!#*)#\211$\203\337\323#$\"\204\337\323$#\"\204\337#\313\f!\203\376\f\202/\f\211\204 \314\315!\210\310\"\206. !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205\202\307$\233\211%\307$8&\306\211'(&:\203q&@'#'=\204h'(B(&A\211&\202P(\237+\240\210)#AA\211)\306\240)+\210*\204\234\307$\233\211,#,@B\240\210)\202\323\307$8\204\266\307$\233\211-#-@B\240\210)\202\323\307$8\211.A\203\312.A\211.\202\275.#\306B\241\210)#AA\211/$\240\210)$?\205w#\313\f!\203\362\f\202#\f\211\204\375\314\315!\210\310\"\206\" !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205v\307$\233\211%\307$8&\306\211'(&:\203e&@'#'=\204\\'(B(&A\211&\202D(\237+\240\210)#AA\211)\306\240)+-\210 A\211\204\253*\324 \312 832BBBB0B0 \313\f!\203\237\f\202\320\f\211\204\252\314\315!\210\310\"\206\317 !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205#\307$\233\211%\307$8&\306\211'(&:\203&@'#'=\204 '(B(&A\211&\202\361(\237+\240\210)#AA\211)\306\240)+\210*\202\306\327 \312 8E0B0 \313\f!\203@\f\202q\f\211\204K\314\315!\210\310\"\206p !\316 \317\320\"\"\321\322\"\")!#*)#\312#8\211$\205\304\307$\233\211%\307$8&\306\211'(&:\203\263&@'#'=\204\252'(B(&A\211&\202\222(\237+\240\210)#AA\211)\306\240)+\210)\202/\3065\330\331\"\210\3115!+\207" [roots work-list dfs-ordered-nodes node child --dolist-tail-- nil 3 gethash mh-thread-sort-containers 2 mh-thread-container-p error "1" puthash mh-thread-make-message :id mh-thread-make-container :message mh-thread-ancestor-p PROMOTE 4 t DROP maphash #[(k v) "\3038?\205\304A@A@ \"\205\nB\211\207" [v mh-thread-id-index-map results 2 gethash] 3] mh-thread-id-index-map #1=#:c children kid id mh-thread-id-table #2=#:v #3=#:v message child-container parent-container #4=#:c #5=#:--cl-var-- elem #6=#:--cl-var-- #7=#:c at-end-p parent #8=#:c #9=#:c last-child #10=#:c mh-thread-history #11=#:c other-kids new-parent #12=#:c results] 7 (#$ . 35518)]) #@71 Sort a list of message CONTAINERS to be in ascending order wrt index. (defalias 'mh-thread-sort-containers #[(containers) "\301\302\"\207" [containers sort #[(x y) "A@\2053 A@\2053A@A@ A@A@\306\n\f\"\306 \f\" \250\2052\250\2052 W,\207" [x y id-x id-y mh-thread-id-index-map index-x gethash index-y] 3]] 3 (#$ . 40569)]) #@51 Print scan lines in THREAD-TREE in threaded mode. (defalias 'mh-thread-print-scan-lines #[(thread-tree) "\306\307  S#\310\f\204\311 \312\"\202\230\313 \310:\203\225@\314 \310A\310:\203l@\315\"\211\203b\316#\210*)A\211\202;*\317!\320V\203\213o\203~\321\202\322@\322\261\210\311 \312\"\210*A\211\202*\323 *\207" [mh-cmd-note mh-scan-field-subject-start-offset mh-thread-last-ancestor mh-thread-body-width mh-index-data thread-tree - window-width nil mh-thread-generate-scan-lines -2 mh-index-group-by-folder make-hash-table gethash puthash hash-table-count 0 "" "\n" mh-index-create-imenu-index #1=#:--cl-var-- x mh-thread-scan-line-map old-map #2=#:--cl-var-- msg v #3=#:v #4=#:v] 5 (#$ . 40911)]) #@188 Generate scan lines. TREE is the hierarchical tree of messages, SCAN-LINE-MAP maps message indices to the corresponding scan lines and LEVEL used to determine indentation of the message. (defalias 'mh-thread-generate-scan-lines #[(tree level) "\204\306\207\307!\203 A@\211A@\310\n \"\310\n \"\311\\\312\306\211 !\313\314\315\fB!\"\306\"\211#\203\361#@\211\"\203\350\203l\316\232\203l\317$\"\203l\311\\\311\\\312 \316\232\203\206$\311$8\203\206\311$8$\202v\203\220\202\222%\3208\203\244 \204\244\206\250%\316\232&\"@\321\211\322%\"\323\"&\203\276\324\202\277\325\"\211'A@)&\203\320\326\202\321\327\330\"AA@(%Z\"\331\261\210*\312!\306#A\211#\204@*!\204\373\3328\306)\211#\205#@)\333)\"\210#A\211#\204\306.\n\207\311\\*\306+\211#\205F#@+\333+*\"\210#A\211#\2040\306+\207" [tree message id mh-thread-id-index-map index mh-thread-duplicates nil mh-thread-container-p gethash 2 t mapcar #[(x) "\302 \"\207" [x mh-thread-scan-line-map gethash] 3] reverse 0 mh-thread-ancestor-p 4 format "%%%ss" "" "[" "<" "]" ">" truncate-string-to-width "\n" 3 mh-thread-generate-scan-lines duplicates level new-level dupl-flag force-angle-flag increment-level-flag scan-line --dolist-tail-- mh-thread-last-ancestor lev square-flag x mh-thread-body-width child nlevel ch] 10 (#$ . 41693)]) #@110 In threaded view update `mh-thread-scan-line-map'. MSG is the message being notated with NOTATION at OFFSET. (defalias 'mh-thread-update-scan-line-map #[(msg notation offset) "\206\306\307! \205\310 \" \307\211 \f:\2034\f@\211\205(\310 \" B \fA\211\202 \237+\n\n\203O\n@ \f   I\210*\n\307\211\205@\211\203u@\fI\210*A\211\204Z\307-\207" [msg mh-thread-scan-line-map cur-scan-line mh-thread-scan-line-map-stack #1=#:--cl-var-- map mh-get-msg-num nil gethash #2=#:--cl-var-- old-scan-lines #3=#:v offset #4=#:v notation line --dolist-tail-- #5=#:v #6=#:v] 4 (#$ . 43096)]) #@91 Find canonicalized subject of MSG. This function can only be used the folder is threaded. (defalias 'mh-thread-find-msg-subject #[(msg) "\300\301\302\217\207" [nil (byte-code "\303\304\211 \"\n\"A@8\207" [msg mh-thread-index-id-map mh-thread-id-table 3 gethash] 5) ((error))] 3 (#$ . 43732)]) #@66 Add COUNT spaces to each scan line in `mh-thread-scan-line-map'. (defalias 'mh-thread-add-spaces #[(count) "\306\211\307\"\310\"m?\2057\311\312!\313\314\n \"8\n\247\2030\n \315 \316\306\317 \f#!#\210**\320y\210\202)\207" [count spaces msg-num mh-thread-scan-line-map old-line #1=#:v format "%%%ss" "" mh-get-msg-num nil 3 gethash puthash mh-thread-parse-scan-line "%s%s" 1 #2=#:v] 7 (#$ . 44032)]) #@53 Forget the message INDEX from the threading tables. (defalias 'mh-thread-forget-message #[(index) "\306 \"\306\n \"\306\n \" \307 \"\210\307\f\"\210\310\f\"\203. \204.\307\n \"\202|\310\f\"\203j\n \311  @#\210* @ \311\n#\210*\n \311 A#*\202|\n \311\312 \"#*+\207" [index mh-thread-index-id-map id mh-thread-id-index-map id-index mh-thread-duplicates gethash remhash eql puthash remove duplicates mh-thread-scan-line-map #1=#:v #2=#:v #3=#:v #4=#:v #5=#:v #6=#:v #7=#:v #8=#:v] 5 (#$ . 44449)]) (provide 'mh-thread)