[Webfunds-commits] html/guide params_classes.png payment_classes.png token_classes.png Makefile token.html token_money.sda token_classes.jpg
Ian Grigg
iang@cypherpunks.ai
Mon, 2 Apr 2001 00:24:02 -0400 (AST)
iang 01/04/02 00:24:02
Modified: guide Makefile token.html token_money.sda
Added: guide params_classes.png payment_classes.png
token_classes.png
Removed: guide token_classes.jpg
Log:
updated status of token project
Revision Changes Path
1.9 +3 -1 html/guide/Makefile
Index: Makefile
===================================================================
RCS file: /home/webfunds/cvsroot/html/guide/Makefile,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- Makefile 2000/12/05 20:50:09 1.8
+++ Makefile 2001/04/02 04:24:00 1.9
@@ -7,7 +7,9 @@
cvs.a \
design.a \
token.a \
- token_classes.a \
+ payment_classes.o \
+ token_classes.o \
+ params_classes.o \
joincvs.a \
wfwin32.a \
access.a \
1.4 +116 -25 html/guide/token.html
Index: token.html
===================================================================
RCS file: /home/webfunds/cvsroot/html/guide/token.html,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- token.html 2000/12/05 20:50:10 1.3
+++ token.html 2001/04/02 04:24:00 1.4
@@ -11,7 +11,7 @@
to WebFunds.
</p>
-<h2> Choices </h2>
+<h2> Conceptual Choices </h2>
There are fundamentally two choices:
@@ -23,7 +23,7 @@
Each is discussed below.
-<h2> Separate Wallet within WebFunds </h2>
+<h2> 1. Separate Wallet within WebFunds </h2>
<p>
The most obvious way to add token money
@@ -95,8 +95,10 @@
And, of course, all the associated server side code.
-<h2> SOX Request </h2>
+<h2> 2. SOX Request </h2>
+<h3> Introduction </h3>
+
<p>
A more subtle way to add tokens is to expand SOX. The most
important reason for this is that it already provides 99% of
@@ -108,8 +110,9 @@
<p>
Components required include
</p>
+
<ul><li>
- Withdrawal Request (this is implemented currently as
+ Withdrawal Request (this is implemented currently as DepositRequest)
</li><li>
wallet storage method for coins (not implemented)
</li><li>
@@ -232,32 +235,115 @@
desirable to impose idempotency on the protocol, in that
each request can be repeated as an expected event.
-<h3> Structure of Token Money within SOX </h3>
+<h2> 3. Structure of Token Money within SOX </h2>
+<h3> Payments </h3>
<p>
To facilitate the addition of other close forms of
payment such as Token money to SOX, payments now have
the following structure:
</p>
-<img alt="Token Clases UML" SRC="token_classes.jpg" width=500 height=500>
+<img alt="Payment Clases UML" SRC="payment_classes.png" width=500>
<p align="center">
-<b>Figure 1. Token Classes (UML)</b>
+<b>Figure 1. Payment Classes (UML)</b>
<p>
In order to add a token money method,
-an extended version of <code>Token.java</code>
-needs to be written. The only one implemented at the time
-of writing is <code>RandomToken.java</code>
-so simply copy that and start hacking.
+an extended version of <code>webfunds.token.BaseToken</code>
+needs to be written within the token package.
+(At the time of writing, only
+<code>webfunds.token.chaum</code>
+and
+<code>webfunds.token.random</code>
+have been partially written.)
</p>
<p>
-Additionally, <code>PaymentFactory.java</code>
+Additionally, <code>webfunds.sox.PaymentFactory</code>
specifies various factory methods for converting
and processing. Read and modify that to suit.
</p>
+<h3> Tokens </h3>
+
+<p>
+Now let us turn our attention to the
+<code>webfunds.token</code>
+package.
+The
+<code>webfunds.sox.TokenPayment</code>
+class
+is basically a container for
+<code>BaseTokens</code>,
+which is the core class in the tokens package.
+That latter class is an abstract class, further refined with
+these four abstract class:
+</p>
+
+<ul><li>
+ <code>TokenBuilder</code>
+ is the class used for the client to initially create
+ a <i>proto-token</i>.
+ </li><li>
+ <code>TokenSigner</code>
+ is received by the Mint and is signed according to the
+ protocol expressed within.
+ </li><li>
+ <code>TokenSpender</code>
+ is sent back to the client as a fully signed token, ready
+ for valuable exchange.
+ </li><li>
+ <code>TokenDead</code>
+ is that which results when the token is spent and is
+ recorded as a spent token, for the purposes of closure
+ of the state machine.
+</li></ul>
+
+<img alt="Token Clases UML" SRC="token_classes.png" width=500>
+<p align="center">
+<b>Figure 2. Token Classes (UML)</b>
+
+<p>
+Alongside the above set is a separate set of paramaters classes:
+</p>
+
+<ul><li>
+ <code>AbstractParams</code>
+ is a superclass for an encodable Paramaters class
+ (not extended by a concrete token implementation).
+ </li><li>
+ <code>AbstractPrivateParams</code>
+ is extended from the above <code>AbstractParams</code> in order
+ to sign tokens.
+ </li><li>
+ <code>AbstractPublicParams</code>
+ is extended from <code>AbstractParams</code> and
+ is made available to the client somehow so that the each
+ phase can be conducted.
+ </li><li>
+ <code>ParamsPair</code>
+ is the class used by the server-side Mint to create
+ the necessary keys or mathematical entities for one
+ token series (that is, one contract, value, series intersection).
+ It has methods to extract the private and public parts that
+ are the concrete <code>AbstractPrivateParams</code> and
+ <code>AbstractPublicParams</code> objects.
+</li></ul>
+
+<img alt="Paramater Clases UML" SRC="params_classes.png" width=500>
+<p align="center">
+<b>Figure 3. Paramater Classes (UML)</b>
+
+
+<p>
+A concrete token implementation will extend from each of the above
+Token Classes and the Paramater Classes,
+thus resulting in seven classes.
+It in envisaged that each implementation
+will be packaged as <code>webfunds.token.<i>name</i></code>.
+</p>
+
<h3> WebFunds Withdrawal </h3>
<p>
@@ -268,33 +354,35 @@
<h3> Depositing User Coins </h3>
<p>
-Once the withdrawal is done, a payment is returned that
-carries the coins in an array of <code>Token</code> objects.
+Once the withdrawal is done, a <code>TokenPayment</code> is returned that
+carries the tokens in an array of <code>BaseToken</code> objects.
That payment can now be treated like any other payment,
and sent or deposited.
</p>
<p>
-At the moment, that's all you can do as there is not
-coin database.
+At the moment, that's all you can do as there is no
+client-side token database.
</p>
-<h2> Server-Side </h2>
+<h2> 4. Server-Side </h2>
For any method there will be the following server side
components, all of which combined make up a Mint.
<ul><li>
A double-spending database. This is currently
- implemented using existing DBs and indexing off
- the applicable <code>webfunds.sox.Token.getUniqueId</code>
+ implemented using existing DBs. The unique identifier
+ of each token is acquired from
+ the applicable <code>webfunds.token.TokenSigner.getUniqueId</code>
method.
</li><li>
The coin production unit. This is the module that
signs the accepted proto-token, and handles the various
state aspects of the blinded withdrawal protocol.
This is all implemented with calls into the
- <code>Token</code> class.
+ <code>webfunds.token.TokenSigner</code>
+ class.
</li></ul>
<p>
@@ -302,10 +390,10 @@
up of accounts and permitting token money to be accessed.
</p>
-<h2> Project Status </h2>
+<h2> 5. Project Status </h2>
<p>
-As of 05 December 2000, status is:
+As of 01 April 2001, status is:
</p>
<blockquote>
@@ -314,16 +402,19 @@
<dd>Written, evolving to suite other parts.
Lacks coin DB.
<dt><b>Frontend</b>
- <dd>Written, untested.
+ <dd>Written and tested for earlier generations.
<dt><b>Backend</b>
- <dd>Not touched as yet.
+ <dd>written and tested for earlier generations.
<dt><b>Tokens</b>
- <dd>Only Random
+ <dd>Currently in 3rd generation model,
+ with most of Chaum done, params for Random done.
</dl>
</blockquote>
<p>
This project advances on an any-idle-sunday basis.
+We are currently importing our 3rd generation model
+of token layout.
</p>
</body></html>
1.1 html/guide/params_classes.png
Index: params_classes.png
===================================================================
PNG
^#&8q 0ߟ~}'+.0ALЁ'WJf'.V|?_mNʼXZ3X-||^Mm~/%#՚&!}0ALЁG&hI=a¯Q~erg'(*s$<>Az~!=~fz<l=@"zj
zn;,G&JS.VD'-YDMsT2OP]L9_A/eh9'|y2WPEmmTEg*<6O
?Z<s[(U/ϓ}c
jc'P>h*d/[NL(o>]Et}.o{A3nUЩ
5#c]g)o]v^} j|
j|&h'/+wY]~ZׇTuޟEtbOFf!JUЅ:"Jkrѵ5Ośk R>7ݜo
:;'Ï'?ܙkETAtOx>`<<G踂*ٝ::\lTPWp4x858bU~b6zT*(}zdȠUT|xBOVe?mW'iꄯ_~% :`\;O[+][O8AZZ}'OǼ`=ljok%}
d=Lm0h:}Cgw[ͻBn7#1f'ĘW3~B;g5XHS=\zNp]Փw.zϯy=~~z){OC#z>:>;視s+Õ~~ƁP=ԢzNp:uTT(w32:6nʨKo؋Z=h|#Pf,Kg2߀qzz)wtz:-ɨGt]:!t&P3LL+gҙT@Vϐ3Kg2ƹgҙ~.w*z/Vt&PCҙtZ@TOJRhD9u+գt*գt:*գtr.Z<W:___ӿWeU.Ne%- N~|ß^B)#E0L\@@,7u4[@E]x,rգtnj
Uɢ*Q=J'
Q:ٵs.[:)TG/{4{z
O=4c-G=<S2vjb寞Jg~^럮{U@<V`K-PY=,Y*_@٪̬Y7Kukp婞br,U3TO9j?r6խVOnjPحyzF:MUj^=JgY*_Cy9
stz2_;%iҙ-kh:]=Oc֟1
ZKg=yb.?|YZ6X賴L7덨{w_?9WM5ύ*/?ׯw`_Tש~ZM䴒?DwZ?鼆;X,7SCSr'yQ-74b0jZ>Xú1 \r?=||l]>6z%6זM9*XS2F9s-gv,LCb\{;$֛gG<pL#?|QM'm=d{H#TשS=\z.xGu1t<[MEJ).R:\tHpᢾK'r6r5t.\6/%Lzç
.t\:ػ:6~>[~xͧ҉oo$zÇOtֿ7_ֿC_Y~2zQt⿻s;ߺ{ށZ:TtHp"EJ).R:\t!s^Өߵ>JP:vFR@ߥ}wS=Nu3yIZ:d?t
yěƮOCuNV3ßM-^Kg2i\~t&o.W:G
_LFtYLzcWOOQAO3;ptS:"5ݔΤ7G鈜Q:~߲CO#rALz<H3X^:&z<MH3)x.IS<vKgș<Τ[3jLFKg﴾A3vLKg鄦z+7D+IJGtҙtitDN_*I_,:
VJGtҙDsOɑdu%=O#r>VO3b/3+xΤ"PtDNi"u#6,:-JGDt<SyS:EbSiʹV
SYn R]jsRymȣ
MStJX!fQydݪ:Ͻc{[fh83
[mO9w4X=S}JGZM^0(KSS.uTztDN^O9ytD WR[ytDO]CSS>rg|z<KMbS\lN|*#S nTT`ꔌ皓)X~uS='-'t&6g<n-TO-ON kq"gozjO)98H{s<:F)/g锏FP='wZ²Nhn&իpdN2`LWOIyJd4UVOə:e>zlK'C٢Ͷ8*VOɖ:e>~)2zħ.P=wKXU74z'u^Z=U@*gϐٓ!u1fRzSf?2FL˞tp<<K:Ү*0LJ^u3)Y=ϕ)+n&T5u!_7y_~0.3d/|iD\L,O?ͼZRT]3pt
w<\Ilyh;]s7ڃWQi{3Ѕ6u3w:ڳYZ:tJp"EJ).R:w}}
b7+yXƱ9)gԵYO?[30}g^9Iss/65mσjG|}t9<7c)ŬW ZSbs{G03H6WzSF[:Q7z DQ`3`~W%wios\'ݫx6Y8c?F7ۻugo#b\^'x]2v{mS^:l.Ƈz6gtR~8?<{d禆8uHp"EJ).R:\tHpᢿֿ$Z#5NWM~C;4&wPJ;@ir(M
"w:rsiI%t zZ w13S9 tF%z*;1BglK輁
;ۄΫ0A輐cNH輖)F!KWBYB!w'Wc8kU
#0Չ;^;Äwm<^lLAM95ˤ=qf*l)tA\lf0>g5sU3<캼6SQe8:k#t.
XdͯGR9\CD)CGDO1sGPI4`*=)FCuP#th'wMqUa #th
7;B9Z>w=sGѳq"zfNˡ봳DϤi9t N|z̝7xi><rGK,rgYKj]Ǥk*&w:#}6;tۜϟGU"XSVrY{at;/ ^~Wܛ4'Kۢ8tN9C6c%Xf6/zҫyCzEz"=+9;Dgi7wF
Q?&IL^=y'yG;CI'}/t.?#}8tz!<}F=j(wmNFoN!5t~ym=MHyR`S?w~_BG%3RTΝaBGS˫g詙;N{g詖;ciKg
9I~*;iҧcҹ#t(i4zN#q:5v=r1
̝C'[~䲹eC/~Cy=;`}gz YΤr-q^y9y*!OE.Z
I]چ
e"gv/?<g!z=o*>-pkY5SaO|[.#"x̎ϟ oN_WτZv9 V 61j#D-(bs7*S_BSio^[l.i)<8 z鲬γ_VBNeg?>CHe`NQg߇gO}־ylw/ƫrOdJp% tdU{{Ϙluzx[/<1r"'eSSjO=3
(%tP:@QB(J
55Yu cHf8
NlU+\+X\e=@٥Aӄi͞4;:@1Bg}m%tBfL4;y{hsp:14;:t8 +WN@%A
m4;y7tjxihs8EKC'z764;1tDuhHsB'b8A}
mT ާ?
}=!,V}عhvnzQQۈi2LpߋB'ﮩa/ٹ-cCzK)mlY.Xp|l)֖e;v8iv.{EoͼXDde@3T$6~aq5@]Έ>ivR:D8<}4	Ⱥ` Sak빧
ۜYbOqH9s)9k tW
x}X~i1{lñ%Fڜ;v{H)N|x4;:E
}hv" mMqqB'`Bk4;AB.94HlWh͡YB'-
>t94N>toޖЅCGC4;K}N[VpqtNǡx#&NmkN5ttA4tmsC]Nm;
/t9еB'0.b
a^^t:ohs8F!N/gגћ,t{ur'=Sj0L-wy_xAVOo%ilXK݄mN\/ȝMlv `橜.fC0#tؙ_qpvx|B?7qY{aGF$k/ebܙLSKڜ,yy58YbBt:6ƅ<] j:^ǛpdH{BVxK??ZjNsz_T#9<LL, imѩS9,sM!w^ Srgf9t^&w^ W㽢;9w4:÷9Q.[nwFC'0FIrgfE=D4x]UF-N`s,i#qxy|\er.{yi+tϯS9Y9wPxi(tϬS9y6wJH'3wkvZ @s:X6e;$`
6:#MKO/ ;VE0wF:Ȫ:#90N)=٩:üQ]Xrgmu:
H_-+:9SNNN /i\k^"+8wjN˓jN_YB6GdHN\:w"[ZQS"t
/~ۏk?e[_:6ab 65fHЧy<tZnsZMi۩ҝN;[T⨹tQ]4;φND
n<2Zof7kv:-ix05hmnajYnSq3)4a`;Ȯ<:k=[iױ<Ny`
N's-a#I|]_ s#o7f($
6s͔D;TY~8<lIy];Ky͗a#΅NjZX26PߢSղ>JT|A /SrOw:Nm2܉?
{"'6G|lm,cwd{v{])~svKG
+I<dKdʘ߳/~FכﴳϘ՞X >$$ÅI&Al^XOvNj>_Gc<E{*D
˔8eG'.N>=>P:@QB(J
C_:`4=&MtAhqN-"u4=MTa4Zա %ZZŁ:nxB-0>{#Pv0F=\xٸ*0w`W??7'xceh^itBm0iwAzѡ:F84:4BM0MIav0m:<݁:tOCRڝ'uF|1@Ezzѡ/EC4:HUuF~iw<;ס'NP^nht;
BzaH4uF|סu݁GuhFs:Këhw!zᅴ;-ZNCs4:;
B^zڢс;
B.zс%w,:Bk.߁:4A{;p^4:݁;:TсLCMH݁k:Tс;p^:4:p;
Yz*M4:с,iu(J|Ru(Giw^B4:u(A@^it
vu^GdNL.94H:/N4H+ht;4E3>Pvvuj4:@]ZFQ___)}?=ƕL{S;TFi4NԦF?y\eNԢF)˽8&%i*:C&^(rZbZxZ`_>0ږ];1e!e|:fW%l^β^RZ[x8lR䚨C
P^gN9ه][#ȏւv!壨Ulm\ݡ$4:-H߉j҅-Ls[<ך(ZݡN4:={HO^䉎ą5cP^om*X~znzǹP^c-/.^_{vwmgtįWyiN<M+N]=zy_nZ^tYյ}v:*<QsH#iuѩro&>Kڮ2^S;
N4:\:
kwz9M]Hh^N_4:\yLy'w^NGt9ܧauRit:!#N:I4:ڝ~uitzQ;tJvGzNΡ
kiw٥i9Ty'w^gF}N;`/:4:s:6x^ȝ itZˡ}:qN:LCG"GG8htˡS|{hwZ/N4:ΟO N:I`\3<N:FrFvAou4:
r:7̝[^G sxiu4:q:ʝ^Gs@3$F)Ng<ڝ^httlFSzN;C:hw*zQi.NCS[zN#|hxƠݩFN}:`y:8xN%
hts:u<qbFu4:9OG;ehtr:
tJSF.sO;OTt@ΣFu4:9MEzNFrY:];ܔ22{w2КxǓxNO\s!7вMi0z53s9q.˝3\\Ph|n&.ɥ^Gs֝-+9v'{C&mlƃ~E}:'$Θ_Qy۶ݱu4:
2x3 Tqv@=-rk ars
oǜFqczr-sf]+ڔq9\`=â?59{/9x펫z?%)j~g|@KR
`9
c
1.1 html/guide/payment_classes.png
Index: payment_classes.png
===================================================================
PNG
jV
/.|VgiFO<ƼZ}n/-:wr\Y>U]U-En{WU;վf=~>4ԨZܲyXv5}U\Mbekug{KV>|YVw(Wf_xݥ^x_+;b>=?/Y^c3lzfGK4+0ϵnV>&T[/-h;PkWnyrO1-{L+&z7ȠWKSW`tsrO5Oizp>z@QfrTG+bLGޖjqS2?槽酟l^yx
MŅ_|[kn-.m,XTW?oqޞ~%QEn/o YV~*nͪyVoEz&;6~6U~^h~)$_tik=;ߍ1{~A,|#·לk-Ovxs+uWzr,>%,ЩMg]z~dGeGo0[
Nݏu_xP]8G^vu{"foԸprykOK+5-vv7;rn/{;DrͽpkbݧY9pDXO*3-֬\֫M7ŭoo_VRRRj98=m
]Z٥|S7i룧>|7L.7h?ˑ7=κ/,rk
Vy<ٷxE>w1uyj.jN,ǥϔ;i|?a
'9>>Lex("[_|k7߯\Ps3u?.u?.u?~b8xq[jG+LaoxkGQο*V}XCaj.8渏uo͇GݏݺkFp`-v
5Zxaxo4f:s3!-}Zε8r#Qّ>·\ftYe-,ܿi뼦'Ӊt
tc̠EǥǥǥǥǥǥPלkz|ꞛ|Ex8ћE^SW|G݇zoGGt)ZxGϞ]㟹ow#u_֢q <aՆ/K7[
|@݇_a/VykwO_z
`[kYto_^\uf`}oKwM}M=jN\U_͕
đzt *5s)u?.u?mu!(?8Z7VG,\D7H5oі9~myzuQom)}SoYW?ݱޙVX]'}!:6*G_ qBNN,؆q)Ntg5r}W.cIc e7
YVޫL/aco6!y>#ѷS93_>%};GC
e"/ioL|Zd+qqqqqqqT\%ث\U܍L7~>oYRϏ͍.PD^zUz~k~s@Z͍{>õw-~
pknoxՋ}9{"vo^վum=wRRgzQޒ'u?2u;wi_]jѺs[Qgj.@.;KthF~u
q}9?_ǥǥǥz?d/-~u?.u/)Vd?^W3u?.u˟'ǥǥǥǥO]?<[*cw5>{CN|G٢kO'FU>mO3܃,ʏ9Rp~$Mj(5qqZ\0GqwuM}?<G-
߳V_Ti )
Bįz*)m |^/0=MQx'u_+
ŞBwM9/tFǥǥǥǥǥǥǥǥs[/qgiwSR%{|&><>@uHx!9-8;wTX筎o7a3sw?>u_Rv[o}u#_|oRU}y7We}YA Wh!o~uAE??\7T?$rJ_sL\ۀzUF-mzҸuڋn抌[Qhкc5܂ܦkcĺc
܃{fcЈu/?{9(u(/5Jݓ!ECԽp_4Dݳi7rѕlst5:{
lju?K
Zjk.Wy+LWv6Ac߾VhonZ?Vcк,R97vsFa2h_ZPRRRRRRRRRR=hˇ{{oB?nk\wH3G?jC#p`Tv7XK+yx8buHmB̧,ܿO
S#a8~ή]$l`Co \CCX9u۬R`lYׄt4rzD55O|1Is)a~7ؿ?4p¦<hYe2{0#;,!k+74W+<l/{R8/D#OI/<\Cnv'N;=cU7kl
k.YUͤj&cՙV.t=a;a0a0a0a {֏?F>v|%/{ş#/֙ a\{H?N؟CV?G)/nc&"'F؟,pW˘{m6m6n4JgG9~SF ټ[gH~f_şLA/P/1DϛW,ϑoa
$HG قWE l;8?mw7'aTC HVIIV _C؟ƺOm~6SXzϟOlt M$p=}64~wSdq:@O `a #\ڟ!B80IT*wG_K+yx8bua?P!qG}XU'"G|[r=~m{cY!\8\5j4`gMf_ְ:զ7y\PQWy,zݞZy
OGDiKiZ:"UӟTC5xV
dاGGC!jzLAF>6~rS{dJ^0UҰUۚn(-5JOc@˘,FSh
X`yRYOKGf]`un
q'UJgq̕OI#1<B:'4K;kx#b盶#lfZvuF#L#ƋQ3s,ҾFZ=]Zm|-~lU6
s=]0`77Ř?\,g`4WrOqanG*Wr;(̴F\K9~acW?=w\!\-WOKw=iR=/ ՟K."I0aOr啯¤M\];ꀰEWr~0!} y\y9洐i;IÀ=mq
=-qH4G =OZNM)g|÷@(1a3;^rraϓ#=Gp=.Bj{{{]c"#ݥN|iLp*ϟO;m:rr#Dcs] {4Gb!4cQ(_-
羸&U9}
/Y9j'aOӟ prO~kbDpr|Bz`'7pZD^# mYnw_8W}&.a8#9Y~bxz. mvp7)ĭ'Dػ^83?%j>ηiՎ>{.<0=cH͍b@s(Ç_-fQ@Ya+þd1Syzs͌*g< {{{{{?|jMX {gp ]݄=r|/_S?\x*[{=+>R3=1T? {jg[ꐈܖĄM9k{V7n5{JGf=H{w_?_سv\i_س nzi =Ei~aT_?-|S~?-|2̺9,{|>=xYS(_`k't] ѵ픤R%Ckۜ q5uot'a?scԾ87hG,GT~~8
{)a?c R(ڌI?A~:aQE-o\Awo}ϚY¾[ba'1OLF̳JwESCCSIwBSOw"z@wESCpIHp=Gp=Gp=\
{D˗N {{ΧOwu^=}ʄp OcH@F?Mm,KS&]AUyNg鿋?)DQx]ȉvB/r#iEϟ?uX>aoP&I4ZH0,m[8a0a0a0a0a0Z~SҗFsmd߶}}Gp=Gp=Gp=Gp=Gp}~W
~cpq"0 ÜHp>I{Nч0ϷDIy x}ҩa9-hsUNv\hWBO4>3M#?7 Hn 5Ϸi[}
G.qtC7aq_6oPwg1
a0a0ar>"=BhfE/rP,O]6DщqZHz]$7H/MG?GW-r?
VyTyi1һӋSKADaIs,a_k놛ki+Kx5~zceXU ڸ+CT*sv^tHWI+C0mV;nY~][u}u)GcFkfQ3
;<Kدm'>`!5_!P֬";a?:$T?a?:? a0a0a0a0a0a0a0a<p ~y=0a\ǏKm||%/{
W3a 1Mba=Csa2 [ $k ӈz"Y嘷ay_ M. {6H_kcy#_7GlߴI؟- 7DMmRG.w{
f
iT68ybiF?Crۨ
((MpPNJ
)9$G̷GXe!>b,;eBtqi~hدrC=<qSl9!O`S]=Oraϭ@؟L}( q=G؟* qz
{y,aqz; 8A#is^wpamNPO!!RIYA}ۮw!ϝ?t0a0ai"쿾?ËRM}Ju
{:׆'iϩ;
(~;/R:5~Ctr#?/ ڕ@Ǯ
08 .
L
tض[!OSk{oӶ\nGE=98.x^y"0Mg m\σlZ}#txO7ʧo?c;vxpx")7w^)gY7)muѷa/
5Z8saOVhw0w&W$i_{?+iڎR[®B⽗{=.ͮڑlKNQo+g}_ا9_My !蕶1>: I>#wL.Zm/Ӵ+5<$yF5k$OFk؈rEr d_}z[';l6v+5?}QܩK
ٹ~JVp#?mw_[=gw6[YHS
pwݴv~NEC
_G8w-֫jZ-թΚ,;/w&?s
G>]6mM;Ŏhv~*gs>
7)T\!wOr/a?
#y]0aO4/"a8i؟Np=Ұ{aaIܔ {Z?Rvy\)t'|W /sO%y粭~^Xy%iΑ4~OF\3ҹvFp=N5?Kp=-0Y#a8ϻ9W0aB6h@N'M-<&EՄ=-<CcA#a8#a8ƿ7O {s2ȥ=0a0aϏ?.E~t a8#a8#a8#a8#a8}}}ks!iqx@V&yw䔾fχ=xH4,kqGK{=Icr tx4}|X99<>0<11ÁW瑣Szi̗'R3flEnnZOӬ~ӝLᗶ0ѐY
VzxG{vsL.yw(9 GⷅBa
5s+q9L'¿#a8#a8#9Sx&,駗gqz1Ns(ϚLWKubNs.wMDDp=]kǬcW\ϦAgGnM~/^]_LXt|++uaH
,>rc|\![Q 3O7ޥ\"\ṣ{1aF幛sҟʓ{]L3*{)iO~x?e(]^(a3q. {T~Ɣi>fF>&uÝ=Gp=Gp=Gp=Gp=Gp=Gp=Gp=Gp=Gp=EZ:{{g?~L|u cFgGb3{y*o8/ԁd ~aO>5Fh{=oӾgE#1Cؓ쁽'k#C#_سn#
=ngԺ߹{6EyOEgE./::UmP _SHOtfleHؓN _Sέ=/YT,'!}Tiw{y8=rOͽ/I^#_سR}˄/)np_{͐{d Yg _S}Sz|ayAeKm[ǡg;up/i4տ'O~t[#KGw] 5깔ޛD؏TTa'iK AUCp=8#?:w}ES#j"tNأU?a?S=7$`O-n >=G؏Taaϓ!B)~
A~DR}ʩށEZÉR}[{5~BwN2'%a8¾gm^=GwK'Gp}z
=GA'$;ʄ}z"¾7R==Gwy;j{TO%a'a8¾R=AZjH0a0aVz.2kެXEp=Gp=Gp=Gp=Gp=Gp=\=4E%Z~ґ{{{{>\X<9a?4§?}C8a?OxCNt"M#rxt~5^<=X֩Y{j8=v/;J̗ PNaƙ2B1ҁG\.WDZncZ
㚯N'=Q4ZMi>2_3Z)a?¾6AC
o[TaRjiW˰۴:DEJ*cEaadUҧoMM^89
9س]
)#oگP
.;#
XY{N_7ɞvO/п|gD5/:pGǬ/mjlkY${NVyEnw=
.ӣwu|H4f1sJ
{^z 3,ɾ7it%(ל?c#/gǕ+̇E}'SiڸYm!7ڧ3@̇dߧ>Y6lLaq".F}v
O({}*g4u?6]\đ)XO\0`§V\³9x`C8Sg?1iȋ?|SJ%
˦iD@x BVNs>7J(G8G
zKcfG.#773tn,[ݿ-t:V@FLөWƠɾү
rNz;7XBar#W:
?O$wR+K2¶+|0,WKXoLO7wr[{B81~ѕCszݐw]
C%{&?;;e1kfH[lWv.]͒΅k-kܭ=ѭo۴ȅREg%Ǽ-ް#WM/7M].W&uziOY;Ԟ8UMI/"p4>=s=
={أdf=o!@${h2`MOgI
iQdgmu^{IX@/R=0ʑy#
2ܦrs:2paNl,q^Cf͚:ξɦ?HbswIT(F9~U*\Z̋Zsޅ~XUaF-Ͽ=Ю99}>g~쭧ӣM\{EMRB=5Y,䎳ȟ-/ad.::Vp#lxe!O/snJa+4˽ɖ1J'R>S8d@LI
5~zm}.|4m/%Z
oL~k PWԥF=pHg: dWفߓe;#;
WȺ{"{3&~${`13^Zdl#HI#g#%FY& kE${^>ץX7x_5X!k/ҥ"=!'3] %ҥ>Ȓ'}ut7N5.fIC~+M6I@Ld=4;Idf"#׳*VodGi֟E~${2&&'Z\nK_d\$m⏶i=EVG#GH04SGq;X'di%F$cR=GH0@>a -gW$WXQ?WygG;V7I0M҃dz^My 7ՠdӬ${L_CI04~f=[_~C>3:$ӟE>}72&a:ʧW=tE?B;^II 9=@
${x#o9QH1hחdMX%Ë@
z&dzd$${xD<`+=L#;n=L!Cdz &I.8d/&5${hgE2=p"へ${hId
$Bʗ${hN/H:98HI
1.1 html/guide/token_classes.png
Index: token_classes.png
===================================================================
PNG
nFE՝USCx"{^SOix*:tåv֣eGߧS>Zş?/Jk[TzJ=]^R7nµțqN_Ly=b.Q1zS]xpцEtZDފMt]w'cI%+ޭ^]sE7;ܪYa[SS7cNwzzJV0J
RY'{j7O
2$B7Եq{=KFt@ViQtw.B7M"t$M<ܸ&OAv|b{^'l9>FYv4*GSzco}:?wnOn/sy=6P?wԦ~x?YcУ==W2
O%
7R*pW;?&o^t{/L?߅߶
Uᗸe_GWswEVԀm`K}F̓~&zjPGy1@S 74e6IwnߢQ]]ξxu.lTc7M4O4ߙ`2G~ZgysfA<AM4OD<AM4mO<uFZ4$6#}wb]wvgCƐYmx
L+Uhv't$o0
9.GbR䟫^ֈ'h"x& 'h"x& 'h"ix}LOdgPdx[{0A<GR$䱿yxys0M+X'_vܶγO3ӵOX.m?U.|lg:I(~;zOhZJ^K!e4f(Bb<5
&#e2OJKΦ)st1er;~HيʦS$!e(:Sb[)+4&k0R&i}fHK~O˦ɯǺBjp<-sAtg
I0u`'SШ^v'OnʬhBH
v8rxH
edžTxLvNv
!/ܻCBj@9cDHu5sG:TxbտFRil0RmiT
nd22'ttt=.M0]Ej^?
&8iH?ˑdmBjx3OPӤ~Bx^_|}kvoit<a:4OD<AM4OD<A?z翇`\̛z{KpK(Ium|wd2l⮹q}QذIFF3M*jaE]mh[9:39(IZ;_acܮ:*@Y)>/7Y-)- vD#kkj^o 4dKOC'uf9(愧-lbi3r~wf!|2!RAX%S=n>'.;y8M.07CHf.0c
LD[=Joa=:n
fKkh˜*vғ`8{ozooLZNSs[thM7X#N4OD<AM4OD<AM???'30S-|}VF)kyy
O
s%ʳ3TcAzz*,2aׇg݊8
0~h.SCuR6iGԐ_,w6"sͩF"G%Y0}"I"=ՐT'Y<k
/CY(B$)u'YSDM͘"C$)U{s妅ę%C$)%ӱe]u#=EBj߲6L.AFzh:Mw֙E@zˤ)jޖߚ4C$B~5I2Q:HRbT4fo<$[ً7d{"Iel(f/"X#C$M)j
Z&C$viΥS I9JOM6GhaI'=-V4;&t<ILLQKnܪ8I-f"+ec$lzZh.*VIjvbZ{,9L$IvM;~O,<Y>IvHLQ;lc}2ԱtZ$=-<tv:MRӧm>[ZjA(bIjabf"[]⹖IR8Wחڰxnu,&NOfnEnr31y;==Sm'Q&>,Ge),#={hHA_F}~G7ôg跔[ْIEcx
+
q_>L#͋bZBfƨt$Rv@27*ޮiFVfs )sՓ$D
-ZKae;,z>^nﺑ$YfSi)̪
"
ԱN\w߮T~O&B$T2'<x
*RqvRoUh=x\i)-*mLLwĺL
uZ:[z$bJry%|t\!S|oGtd%C%-]H>owՍ)Uu^3¾Q1ފ-ܭ*GhiyCZiG(
&iᤧR䦿pY4F/"ͤnHOrt57o%fMZ)18ғ'&.;IOM;#S) =e잛BŤ&=IO)[هN_T[Dz77BklEygShܴ˔NG:=ovM+/sdH=sSh̆T0&=]M3mk˺Wn"1`ctl;+nQJOnZi;eiankwEnZri';mMK&&lexnZ\Z8F2[sniܴvbڧ|bvln
.oZG/5sX&iܴs
|biܴ0pY>=-LLoCR)BF/ur&uZ5=-=bnf?Jo-VM{3!c˺ziܴUbxS4!*Xz;7mPdX+=͝B'X-&Mtg5Ӭië9rq=/NYsSݶWDGsYswOo<=Mz7=͝*&3Z&MOM15l}i&f8pbOMF&te8r 7Sk[?F
cE(uNܘEcޣn[^M"M
˼ 47E/ 2OvëEX@St${A <a'_o=YKxsW<LLe^=yMׅqf!:%<3!ZN2at9it_6Z{Z
~o}vzx8_\ӇzN_oa³H7{{$n$44XrrxW7f^Tcx$Ga;KS~~ؿꢧqr^˙+Dܴ̎#R'3FQM
9*'`Vț,8^t9a
]BEv mIQ9r?<Vk 3p]NmXls
rW.HT a"TN̏E$Ű@;Oa%h5h %Dxڭ0)*'Wd7̰Ly
XF%>3eni.¼0[.)IT4C쨟`S7on{'1jO0 ]LwP]BX8ccQ9'e盌NQZlЖ%S?*'@
Nf44;w1IP9-j&-a
-'L
Q6uC7u9)œ@&tq'}OZ` $;Etܡ fQ9ACM-p2w~ATNA7/Lr&
OP?*'<BN↧v0*q'perB
:`bmOQ?a*'f2N~BgTN㹞pZS7O "5č+nn0<Q?)*'$Q3
ӆ(Z~B#TN9Iq(OPGCMqC(~"*'&qXOPA14ppOx L&pc8NO}P?x~B*}1dN'SPiGLsaG,~v(aQOCP?FfX7<UZ?;rwĀ(,OCP;rZCMfqc87 *Q3SnqprZeq8A'TNKf
O~RfB4mQ9imqt6Dj0jO6Q?mins0G|N<nx&&P$Q?-iJLb B->;꧅Q9͇ w/iITN3fNE4P9́;ǎCVB* 0Դ
So|G{~i|ⳣ2O~i0 6G4`bq:r9'"mCOP9ji
TN
#KPTnoȐgRh3iNĞW$ҡ(`~KuaK)oGYI;nNתrZ9 3F~\\FB%#Y%Vfd(l7BX]+\Qymې[䁊l]m,IONʤ|'[դrZd^uR:織U$.KfwgvzVJbUx6n[[~WT7Y,u8~ ,.E@#o!qw$2^eft7aX۪Iy^z|[o퍰.qlQ&L#'RP4%kMIe<
&o{̶淊efMKZa;+Zxia#1*!^X `l16Lb=P:cӔK~|jg{